7 #include "TClonesArray.h"
14 #include "TStopwatch.h"
15 #include "TObjArray.h"
18 #include "AliPHOSHit.h"
19 #include "AliPHOSGetter.h"
20 #include "AliPHOSGeometry.h"
21 #include "AliPHOSDigit.h"
22 #include "AliPHOSSDigitizer.h"
23 #include "AliPHOSDigitizer.h"
24 #include "AliPHOSClusterizer.h"
25 #include "AliPHOSClusterizerv1.h"
26 #include "AliPHOSTrackSegmentMaker.h"
27 #include "AliPHOSTrackSegmentMakerv1.h"
28 #include "AliPHOSPID.h"
29 #include "AliPHOSPIDv1.h"
37 void write_info(TString) ;
40 //____________________________________________________________________________
44 gSystem->SetIncludePath("-I$ROOTSYS/include -I$ALICE_ROOT/include -I.");
45 Bool_t error = kFALSE ;
49 mess = "Examination ended successfully." ;
56 mess = "Beginning of the PHOS reconstruction." ;
59 mess = "SDigits process ended successfully." ;
68 mess = "Digits process ended successfully." ;
77 mess = "Cluster process ended successfully." ;
86 mess = "TrackSegments process ended successfully." ;
95 mess = "RecParticles process ended successfully." ;
103 mess = "reconstruction ended successfully." ;
107 gSystem->Exec("uuencode $ALICE_ROOT/PHOS/testPHOS.root testPHOS.root | mail -s 'PHOS INSTALLATION ERROR' schutz@in2p3.fr") ;
108 mess = "Error message to PHOS director has been sent, please wait for his answer before launching the whole simulation again." ;
114 //____________________________________________________________________________
118 // Definition of the alarm bounds for the examination
119 const Float_t maxAlaHitsM = 12.79 ; // total multiplicity
120 const Float_t maxAlaTotEn = 19.34 ; // total energy
121 const Float_t maxAlaTotEnB = 18.35 ; // per block multiplicity
122 const Float_t maxAlaHitsMB = 11.1 ; // per block energy
126 mess = "Beginning of the simulation examination." ;
129 // define the array in which the events that have not reach th EMCA will be put.
130 Bool_t error = kFALSE ;
135 // Get the number of events generated in the simulation
136 AliPHOSGetter * gime = AliPHOSGetter::GetInstance("testPHOS.root") ;
137 Int_t maxevent = gime->MaxEvent() ;
140 // Examine the alarms
141 TObjArray * alahm = dynamic_cast<TObjArray*>(dynamic_cast<TFolder*>(gime->Alarms())->FindObject("HitsM")) ;
142 Float_t ratiohm = 100.0*static_cast<Float_t>(alahm->GetEntries())/static_cast<Float_t>(maxevent) ;
144 TObjArray * alaet = dynamic_cast<TObjArray*>(gime->Alarms()->FindObject("TotEn")) ;
145 Float_t ratioet = 100.0*static_cast<Float_t>(alaet->GetEntries())/static_cast<Float_t>(maxevent) ;
147 // Define the alarms per block and examine them
148 char namemul[80], namen[80] ;
149 TObjArray* alahmb[5] ;
150 TObjArray* alaenb[5] ;
151 Float_t ratiohmb[5], ratioenb[5] ;
154 for (i = 0 ; i < 5 ; i++){
155 sprintf(namemul,"HitsMB%d",i+1) ;
156 sprintf(namen,"TotEnB%d",i+1) ;
157 alahmb[i] = (TObjArray*) (gime->Alarms()->FindObject(namemul)) ;
158 ratiohmb[i] = 100.0*(Float_t)alahmb[i]->GetEntries()/(Float_t)maxevent ;
159 alaenb[i] = (TObjArray*)(gime->Alarms()->FindObject(namen)) ;
160 ratioenb[i] = 100.0*(Float_t)alaenb[i]->GetEntries()/(Float_t)maxevent ;
162 if (ratiohmb[i] > maxAlaHitsMB){
164 mess = "Examination detected an error in " + TString(namemul) ;
168 if (ratioenb[i] > maxAlaTotEnB) {
170 mess = "Examination detected an error in " + TString(namen) ;
180 if (ratiohm > maxAlaHitsM){
182 mess = "Examination detected an error in HitsM: ";
185 mess += maxAlaHitsM ;
189 if (ratioet>maxAlaTotEn){
191 mess = "Examination detected an error in TotEn: ";
198 // Condition that will launch the general loop that builds the histograms in order to allow a further analysis.
203 mess = "Examination sets up the file that will be sent to PHOS director (30s)." ;
209 TH1F * his = new TH1F("Total Multiplicity", "Total Multiplicity in PHOS", 200, 0., 200.) ;
210 TH1F * hisnrg = new TH1F("Total Energy", "Total energy in PHOS", 200, 0., 12.) ;
212 // name and define the different histograms per block involved in the analysis
214 TClonesArray hisba("TH1F") ;
215 TClonesArray hisbanrg("TH1F") ;
218 char name[80], title[80] ;
219 for (i = 0 ; i < 6 ; i++) {
220 sprintf(name,"multiplicity for block %d",i) ;
221 sprintf(title,"multiplicity per blocks, block %d",i) ;
222 new(hisba[i]) TH1F(name, title, 100, 0., 100.) ;
224 sprintf(name,"total energy for block %d",i) ;
225 sprintf(title,"total energy per block, block %d",i) ;
226 new(hisbanrg[i]) TH1F(name, title, 200, 0., 12.) ;
229 // define the global histograms, the hit pointer and give the means to get the actual block reached by the photon
234 TH2F * hbiz = new TH2F ("hbiz","hbiz", 200, 0., 200., 200, 0., 12.) ;
235 const AliPHOSGeometry * geom = gime->PHOSGeometry() ;
237 // the very general loop
239 for (index = 0 ; index < maxevent ; index++) {
240 //get the number of the event
242 // get the number of cells reached during this event and fill the total multiplicity histogram
243 Int_t n = gime->Hits()->GetEntries() ;
246 // Get the data per block
247 const TClonesArray * hita = static_cast<const TClonesArray *>(gime -> Hits()) ;
250 Int_t id = 0, block = 0 ;
251 Int_t nhit[6], rid[4] ;
255 for ( i = 0; i < 6 ; i++) {
260 while ( (hit = static_cast<AliPHOSHit *>(next())) ) {
262 if (geom->IsInEMC(id) ) {
263 Et += ( hit -> GetEnergy()) ;
264 geom->AbsToRelNumbering(id,rid) ;
267 etblock[block] += ( hit -> GetEnergy()) ;
271 //Fill all the histograms but total multiplicity, already done
272 hist = static_cast<TH1F*>(hisba.At(block)) ;
273 hist->Fill(nhit[block]) ;
274 histnrg = static_cast<TH1F*>(hisbanrg.At(block)) ;
275 histnrg->Fill(etblock[block]) ;
280 TFile * file = gROOT -> GetFile("testPHOS.root") ;
288 //____________________________________________________________________________
292 AliPHOSGetter * gime = AliPHOSGetter::GetInstance("testPHOS.root") ;
293 const Float_t maxSDigits = 62.89 ;
294 const Float_t widSDigits = TMath::Sqrt(maxSDigits) ;
297 TString reconame = "test suite" ;
299 AliPHOSSDigitizer *sd = new AliPHOSSDigitizer("testPHOS.root",reconame.Data()) ;
301 sd->ExecuteTask("deb") ;
303 Float_t nSDigits = static_cast<Float_t>((dynamic_cast<const AliPHOSSDigitizer*>(gime->SDigitizer()))->GetSDigitsInRun()) / static_cast<Float_t>(gime->MaxEvent()) ;
304 if ( nSDigits < maxSDigits-widSDigits ||
305 nSDigits > maxSDigits+widSDigits ) {
306 mess = "Error detected in the SDigits process. Sending error file to PHOS director." ;
307 cout << "sdigit() : nsDigits = " << nSDigits
308 << " maxSDigits,widSDigits= " << maxSDigits << "," << widSDigits << endl ;
317 //____________________________________________________________________________
322 AliPHOSGetter * gime = AliPHOSGetter::GetInstance("testPHOS.root") ;
323 TString reconame = "test suite" ;
324 const Float_t maxDigits = 40. ;
325 const Float_t widDigits = TMath::Sqrt(maxDigits) ;
329 AliPHOSDigitizer *d = new AliPHOSDigitizer("testPHOS.root",reconame.Data()) ;
331 d->ExecuteTask("deb") ;
333 Float_t nDigits = static_cast<Float_t>((dynamic_cast<const AliPHOSDigitizer*>(gime->Digitizer()))->GetDigitsInRun()) / static_cast<Float_t>(gime->MaxEvent()) ;
335 if ( nDigits < maxDigits-widDigits || nDigits > maxDigits+widDigits ) {
336 cout << "digit() : nDigits = " << nDigits
337 << " maxDigits,widDigits= " << maxDigits << "," << widDigits << endl ;
338 mess = "Error detected in the Digits process. Sending error file to PHOS director." ;
347 //____________________________________________________________________________
352 AliPHOSGetter * gime = AliPHOSGetter::GetInstance("testPHOS.root") ;
353 TString reconame = "test suite" ;
355 const Float_t maxRecPoints = 1.0 ;
356 const Float_t widRecPoints = TMath::Sqrt(maxRecPoints) ;
360 AliPHOSClusterizer * cluster = new AliPHOSClusterizerv1("testPHOS.root", reconame.Data()) ;
362 cluster->ExecuteTask("deb") ;
364 Float_t nRecPoints = static_cast<Float_t>(gime->Clusterizer(reconame.Data())->GetRecPointsInRun()) /
365 static_cast<Float_t>(gime->MaxEvent()) ;
367 if ( nRecPoints < maxRecPoints-widRecPoints
368 || nRecPoints > maxRecPoints+widRecPoints ) {
369 cout << "recpoint() : nRecPoints = " << nRecPoints
370 << " maxRecPoints,widRecPoints= " << maxRecPoints << "," << widRecPoints << endl ;
371 mess = "Error detected in the Clusterizing process. Sending error file to PHOS director." ;
380 //____________________________________________________________________________
384 //TrackSegments process
385 AliPHOSGetter * gime = AliPHOSGetter::GetInstance("testPHOS.root") ;
386 const Float_t maxTrackSegments = 1 ;
389 TString reconame = "test suite" ;
391 AliPHOSTrackSegmentMaker * tracks = new AliPHOSTrackSegmentMakerv1("testPHOS.root",reconame.Data()) ;
393 tracks->ExecuteTask("deb") ;
395 Float_t nTrackSegments = static_cast<Float_t> (gime->TrackSegmentMaker(reconame.Data())->GetTrackSegmentsInRun()) /
396 static_cast<Float_t>(gime->MaxEvent()) ;
398 if ( nTrackSegments < maxTrackSegments-0.25 ||
399 nTrackSegments > maxTrackSegments+0.25 ) {
400 cout << "track() : nTrackSegments = " << nTrackSegments
401 << " maxTrackSegments,widTrackSegments= " << maxTrackSegments << "," << "0.25" << endl ;
402 mess = "Error detected in the TrackSegments process. Sending error file to PHOS director." ;
411 //____________________________________________________________________________
415 //RecParticles process
416 AliPHOSGetter * gime = AliPHOSGetter::GetInstance("testPHOS.root") ;
417 const Float_t maxRecParticles = 1 ;
420 TString reconame = "test suite" ;
422 AliPHOSPID * pid = new AliPHOSPIDv1("testPHOS.root",reconame.Data()) ;
424 pid->ExecuteTask("deb") ;
426 Float_t nRecParticles = static_cast<Float_t> (gime->PID(reconame.Data())->GetRecParticlesInRun()) /
427 static_cast<Float_t>(gime->MaxEvent()) ;
430 if ( nRecParticles < maxRecParticles-0.25 ||
431 nRecParticles > maxRecParticles+0.25 ) {
432 cout << "particle() : nRecParticles = " << nRecParticles
433 << " maxRecParticles,widRecParticles= " << maxRecParticles << "," << "0.25" << endl ;
434 mess = "Error detected in the RecParticles process. Sending error file to PHOS director.Stop reconstruction." ;
443 //____________________________________________________________________________
444 void write_info(TString mess)
446 cerr << " _____________________________________________________________ " << endl
448 << "MESS ==> " << mess <<endl
449 << " _____________________________________________________________ " <<endl ;