hsumTimer problem ?

From: Marc Hemberger (hemberg@clri6a.gsi.de)
Date: Tue Sep 07 1999 - 11:45:48 MEST


Dear Rene,

we encountered the following problem with the hsumTimer.C example, which
seems also to be connected to our SMP machines (Debian 2.1, glibc2.0
kernel 2.0.36). On our single processor machines everything works fine.
It stops also on a 2-CPU-machine with a new kernel version 2.2.*.

Starting the attached hsumTimer example, without the canvas-update calls
in the hsumupdate()-module, everything works fine. When we uncomment the
canvas operations, the timer stops after an unpredictable number of calls! 
The macro continues and still fills the histograms. After the end of the
loop, the last canvas-update is done 'by hand'. We don't know the reason
for this behaviour, but we assume it is connected with SMP and/or X.

root [0] .x hsumTimer.C(10000000)
1 40866
2 79536
3 122316
4 208440
5 300195
6 392577
7 408762   <<======= here it stopped this time!
8 30000000 <<======= last update 'by hand'
root [1]

Another time it looked like this:
...
365 8222982
366 30000000
root [1]

On our single CPU machine (otherwise identical setup), it works till the
end:
...
1195 29986761
1196 30000000
root [1]

Is there any experience with this kind of behaviour? Is there a way out of
this problem? We use ROOT v2.22/10.

Greetings,

Marc


----------------------------------------
Dr. Marc Hemberger

GSI, Abteilung DV&EE
Planckstr. 1
64291 Darmstadt

M.Hemberger@gsi.de



Int_t i;
Float_t ratio;
TSlider *slider;
TCanvas *c1;

void hsumTimer(Int_t nfill=100000)
{
//
// Simple example illustrating how to use the C++ interpreter	
// to fill histograms in a loop and show the graphics results
// This program is a variant of the tutorial "hsum".
// It illustrates the use of Timers.

  c1 = new TCanvas("c1","The HSUM example",200,10,600,400);
  c1->SetGrid();


// Create some histograms.
  total  = new TH1F("total","This is the total distribution",100,-4,4);
  main   = new TH1F("main","Main contributor",100,-4,4);
  s1     = new TH1F("s1","This is the first signal",100,-4,4);
  s2     = new TH1F("s2","This is the second signal",100,-4,4);
  total->Sumw2();   // this makes sure that the sum of squares of weights will be stored
  total->SetMarkerStyle(21);
  total->SetMarkerSize(0.7);
  main->SetFillColor(16);
  s1->SetFillColor(42);
  s2->SetFillColor(46);
  total->SetMaximum(nfill/20.);
  total->Draw("e1p");
  main->Draw("same");
  s1->Draw("same");
  s2->Draw("same");
  c1->Update();slider = new TSlider("slider","test",4.2,0,4.6,0.8*total->GetMaximum(),38);
  slider->SetFillColor(46);

  // Create a ProcessEventTimer and a TTimer
  TProcessEventTimer ptimer(300);   // main loop will check events every 300 msec
  TTimer timer("hsumUpdate(total->GetEntries())",200); // hsumUpdate will be called every xxx msec
  timer.TurnOn();

 // Fill histograms randomly
  Float_t xs1, xs2, xmain;
  gRandom->SetSeed();
  for (Int_t i=0; i<nfill; i++) {
     ratio = Float_t(i)/Float_t(nfill);
     if (ptimer.ProcessEvents()) break;
     xmain = gRandom->Gaus(-1,1.5);
     xs1   = gRandom->Gaus(-0.5,0.5);
     xs2   = gRandom->Landau(1,0.15);
     main->Fill(xmain);
     s1->Fill(xs1,0.3);
     s2->Fill(xs2,0.2);
     total->Fill(xmain);
     total->Fill(xs1,0.3);
     total->Fill(xs2,0.2);
  }
  timer.TurnOff();
  hsumUpdate(total->GetEntries());
  
}

void hsumUpdate(Int_t e)
{
// called when Timer times out
   static Int_t iCount = 0;
   Int_t kUPDATE = 10000;
   //if (slider) slider->SetRange(0,ratio);
   //c1->Modified();
   //c1->Update();
   iCount ++;
   
   if(iCount % kUPDATE)
     {
       cout << iCount << " " << e << endl;
     }
}



This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:39 MET