]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PHOS/AliPHOSReconstructioner.cxx
First commit
[u/mrichter/AliRoot.git] / PHOS / AliPHOSReconstructioner.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 /* $Id$ */
17
18 //_________________________________________________________________________
19 //*--
20 //*-- Author: Gines Martinez & Yves Schutz (SUBATECH) 
21 //*-- Compleetely redesigned by Dmitri Peressounko (SUBATECH & RRC KI) March 2001
22 /////////////////////////////////////////////////////////////////////////////////////
23 //  Wrapping class for reconstruction. Allows to produce reconstruction from 
24 //  different steps: from previously produced hits,sdigits, etc. Each new reconstruction
25 //  flow (e.g. digits, made from them RecPoints, subsequently made TrackSegments, 
26 //  subsequently made RecParticles) are distinguished by the title of created branches. One can 
27 //  use this title as a comment, see use case below. 
28 //  Thanks to getters, one can set 
29 //  parameters to reconstruction briks. The full set of parameters is saved in the 
30 //  corresponding branch: e.g. parameters of clusterizer are stored in branch 
31 //  TreeR::AliPHOSClusterizer with the same title as the branch containing the RecPoints. 
32 //  TTree does not support overwriting, therefore one can not produce several 
33 //  branches with the same names and titles - use different titles.
34 //
35 //  Use case: 
36 //
37 //  root [0] AliPHOSReconstructioner * r = new AliPHOSReconstructioner("galice.root")
38 //              //  Set the header file
39 //  root [1] r->ExecuteTask() 
40 //              //  Make full chain of reconstruction
41 //
42 //              // One can specify the title for each branch 
43 //  root [2] r->SetBranchFileName("RecPoints","RecPoints1") ;
44 //      
45 //             // One can change parameters of reconstruction algorithms
46 //  root [3] r->GetClusterizer()->SetEmcLocalMaxCut(0.02)
47 //
48 //             // One can specify the starting point of the reconstruction and title of all 
49 //             // branches produced in this pass
50 //  root [4] r->StartFrom("AliPHOSClusterizer","Local max cut 0.02") 
51 //             // means that will use already generated Digits and produce only RecPoints, 
52 //             // TS and RecParticles 
53 //
54 //             // And finally one can call ExecuteTask() with the following options
55 //  root [5] r->ExecuteTask("debug all timing")
56 //             // deb     - prints the numbers of produced SDigits, Digits etc.
57 //             // deb all - prints in addition list of made SDigits, digits etc.
58 //             // timing  - prints benchmarking results
59 ///////////////////////////////////////////////////////////////////////////////////////////////////
60
61 // --- ROOT system ---
62
63 #include "TClonesArray.h"
64 #include "TROOT.h"
65 #include "TTree.h"
66 #include "TFile.h"
67
68 // --- Standard library ---
69 #include <iostream.h>   
70
71 // --- AliRoot header files ---
72 #include "AliRun.h"
73 #include "AliPHOSReconstructioner.h"
74 #include "AliPHOSClusterizerv1.h"
75 #include "AliPHOSDigitizer.h"
76 #include "AliPHOSSDigitizer.h"
77 #include "AliPHOSTrackSegmentMakerv1.h"
78 #include "AliPHOSPIDv1.h"
79 #include "AliPHOSFastRecParticle.h"
80 #include "AliPHOSCpvRecPoint.h"
81
82 ClassImp(AliPHOSReconstructioner)
83
84 //____________________________________________________________________________
85   AliPHOSReconstructioner::AliPHOSReconstructioner():TTask("AliPHOSReconstructioner","")
86 {
87   // ctor
88   fDigitizer   = 0 ;
89   fClusterizer = 0 ;
90   fTSMaker     = 0 ;
91   fPID         = 0 ; 
92   fSDigitizer  = 0 ;
93   fHeaderFileName = "galice.root" ;
94
95   fIsInitialized = kFALSE ;
96
97
98
99 //____________________________________________________________________________
100 AliPHOSReconstructioner::AliPHOSReconstructioner(const char* headerFile,const char * branchName):
101 TTask("AliPHOSReconstructioner","")
102 {
103   // ctor
104   
105   fHeaderFileName = headerFile ;
106
107   fSDigitsBranch= branchName; 
108   fSDigitizer  = new AliPHOSSDigitizer(fHeaderFileName.Data(),fSDigitsBranch.Data()) ; 
109   Add(fSDigitizer) ;
110
111   fDigitsBranch=branchName ; 
112   fDigitizer   = new AliPHOSDigitizer(fHeaderFileName.Data(),fDigitsBranch.Data()) ; 
113   Add(fDigitizer) ;
114
115
116   fRecPointBranch=branchName ; 
117   fClusterizer = new AliPHOSClusterizerv1(fHeaderFileName.Data(),fRecPointBranch.Data()) ; 
118   Add(fClusterizer) ;
119   
120
121   fTSBranch=branchName ; 
122   fTSMaker     = new AliPHOSTrackSegmentMakerv1(fHeaderFileName.Data(),fTSBranch.Data()) ;
123   Add(fTSMaker) ;
124   
125   
126   fRecPartBranch=branchName ; 
127   fPID         = new AliPHOSPIDv1(fHeaderFileName.Data(),fRecPartBranch.Data()) ;
128   Add(fPID) ;
129   
130   fIsInitialized = kTRUE ;
131   
132
133 //____________________________________________________________________________
134 void AliPHOSReconstructioner::Exec(Option_t *option)
135 {
136   //chesk, if the names of branches, which should be made conicide with already
137   //existing
138   if(!fIsInitialized)
139     Init() ;
140
141   gAlice->GetEvent(0) ;
142
143   if(fSDigitizer->IsActive()&& gAlice->TreeS()){ //Will produce SDigits
144     TBranch * sdigitsBranch = 0;
145     TBranch * sdigitizerBranch = 0;
146
147     TObjArray * branches = gAlice->TreeS()->GetListOfBranches() ;
148     Int_t ibranch;
149     Bool_t phosNotFound = kTRUE ;
150     Bool_t sdigitizerNotFound = kTRUE ;
151
152     for(ibranch = 0;ibranch <branches->GetEntries();ibranch++){            
153       if(phosNotFound){
154         sdigitsBranch=(TBranch *) branches->At(ibranch) ;
155         if(( strcmp("PHOS",sdigitsBranch->GetName())==0 ) &&
156            (fSDigitsBranch.CompareTo(sdigitsBranch->GetTitle())== 0 ))
157           phosNotFound = kFALSE ;
158       }
159       if(sdigitizerNotFound){
160         sdigitizerBranch = (TBranch *) branches->At(ibranch) ;
161         if(( strcmp(sdigitizerBranch->GetName(),"AliPHOSSDigitizer") == 0) &&
162            (fSDigitsBranch.CompareTo(sdigitizerBranch->GetTitle())== 0 ) )
163           sdigitizerNotFound = kFALSE ;
164       }
165     }
166     
167     if(!(sdigitizerNotFound && phosNotFound)){
168       cout << "AliPHOSReconstructioner error: "<< endl ;
169       cout << "       Branches ''PHOS'' or ''AliPHOSSDigitizer'' with title ``" << fSDigitsBranch.Data() << "''" << endl ;
170       cout << "       already exist in TreeS. ROOT does not allow updating/overwriting." << endl ;
171       cout << "       Specify another title for branches or use ''StartFrom()'' method" << endl ;
172       
173       //mark all tasks as inactive
174       TIter next(fTasks);
175       TTask *task;
176       while((task=(TTask*)next()))
177         task->SetActive(kFALSE) ;
178       
179       return ;
180     }
181   }
182
183   if(fDigitizer->IsActive() && gAlice->TreeD()){ //Will produce Digits
184     TBranch * digitsBranch = 0;
185     TBranch * digitizerBranch = 0;
186     
187     TObjArray * branches = gAlice->TreeD()->GetListOfBranches() ;
188     Int_t ibranch;
189     Bool_t phosNotFound = kTRUE ;
190     Bool_t digitizerNotFound = kTRUE ;
191     
192     for(ibranch = 0;ibranch <branches->GetEntries();ibranch++){            
193       if(phosNotFound){
194         digitsBranch=(TBranch *) branches->At(ibranch) ;
195         if(( strcmp("PHOS",digitsBranch->GetName())==0 ) &&
196            (fDigitsBranch.CompareTo(digitsBranch->GetTitle())== 0 ))
197           phosNotFound = kFALSE ;
198       }
199       if(digitizerNotFound){
200         digitizerBranch = (TBranch *) branches->At(ibranch) ;
201         if(( strcmp(digitizerBranch->GetName(),"AliPHOSDigitizer") == 0) &&
202            (fDigitsBranch.CompareTo(digitizerBranch->GetTitle())== 0 ) )
203           digitizerNotFound = kFALSE ;
204       }
205     }
206     
207     if(!(digitizerNotFound && phosNotFound)){
208       cout << "AliPHOSReconstructioner error: "<< endl ;
209       cout << "       Branches ''PHOS'' or ''AliPHOSDigitizer'' with title ``" << fDigitsBranch.Data() << "''" << endl ;
210       cout << "       already exist in TreeD. ROOT does not allow updating/overwriting." << endl ;
211       cout << "       Specify another title for branches or use ''StartFrom()'' method" << endl ;
212       
213       //mark all tasks as inactive
214       TIter next(fTasks);
215       TTask *task;
216       while((task=(TTask*)next()))
217         task->SetActive(kFALSE) ;
218       
219       return ;
220     }
221   }
222
223   if(fClusterizer->IsActive() && gAlice->TreeR()){ //Will produce RecPoints
224     TBranch * emcBranch = 0;
225     TBranch * cpvBranch = 0;
226     TBranch * clusterizerBranch = 0;
227     
228     TObjArray * branches = gAlice->TreeR()->GetListOfBranches() ;
229     Int_t ibranch;
230     Bool_t emcNotFound = kTRUE ;
231     Bool_t cpvNotFound = kTRUE ;  
232     Bool_t clusterizerNotFound = kTRUE ;
233     
234     for(ibranch = 0;ibranch <branches->GetEntries();ibranch++){
235       
236       if(emcNotFound){
237         emcBranch=(TBranch *) branches->At(ibranch) ;
238         if(fRecPointBranch.CompareTo(emcBranch->GetTitle())==0 )
239           if( strcmp(emcBranch->GetName(),"PHOSEmcRP") == 0) 
240             emcNotFound = kFALSE ;
241       }
242       if(cpvNotFound){
243         cpvBranch=(TBranch *) branches->At(ibranch) ;
244         if(fRecPointBranch.CompareTo(cpvBranch->GetTitle())==0 )
245           if( strcmp(cpvBranch->GetName(),"PHOSCpvRP") == 0) 
246             cpvNotFound = kFALSE ;
247       }
248       if(clusterizerNotFound){
249         clusterizerBranch = (TBranch *) branches->At(ibranch) ;
250         if( fRecPointBranch.CompareTo(clusterizerBranch->GetTitle()) == 0)
251           if( strcmp(clusterizerBranch->GetName(),"AliPHOSClusterizer") == 0) 
252             clusterizerNotFound = kFALSE ;
253       }
254     }
255
256     if(!(clusterizerNotFound && emcNotFound && cpvNotFound)){
257       cout << "AliPHOSReconstructioner error: "<< endl ;
258       cout << "       Branches ''PHOSEmcRP'', ''PHOSCpvRP'' or ''AliPHOSClusterizer'' with title ``" 
259            << fRecPointBranch.Data() << "''" << endl ;
260       cout << "       already exist in TreeR. ROOT does not allow updating/overwriting." << endl ;
261       cout << "       Specify another title for branches or use ''StartFrom()'' method" << endl ;
262       
263       //mark all tasks as inactive
264       TIter next(fTasks);
265       TTask *task;
266       while((task=(TTask*)next()))
267         task->SetActive(kFALSE) ;
268       return ;
269     }
270   }
271   
272   if(fTSMaker->IsActive() && gAlice->TreeR()){ //Produce TrackSegments
273     TBranch * tsMakerBranch = 0;
274     TBranch * tsBranch = 0;
275     
276     TObjArray * branches = gAlice->TreeR()->GetListOfBranches() ;
277     Int_t ibranch;
278     Bool_t tsMakerNotFound = kTRUE ;
279     Bool_t tsNotFound = kTRUE ;
280     
281     for(ibranch = 0;(ibranch <branches->GetEntries())&&(tsMakerNotFound||tsNotFound);ibranch++){
282       if(tsMakerNotFound){
283         tsMakerBranch=(TBranch *) branches->At(ibranch) ;
284         if( fTSBranch.CompareTo(tsMakerBranch->GetTitle())==0 )
285           if( strcmp(tsMakerBranch->GetName(),"AliPHOSTrackSegmentMaker") == 0) 
286             tsMakerNotFound = kFALSE ;
287       }
288       if(tsNotFound){
289         tsBranch=(TBranch *) branches->At(ibranch) ;
290         if( fTSBranch.CompareTo(tsBranch->GetTitle())==0 )
291           if( strcmp(tsBranch->GetName(),"PHOSTS") == 0) 
292             tsNotFound = kFALSE ;
293       }
294     }
295     
296     if(!(tsMakerNotFound &&tsNotFound) ){
297       cout << "AliPHOSReconstructioner error: "<< endl ;
298       cout << "       Branches ''PHOSTS'' or ''AliPHOSTrackSegmentMaker'' with title ``" 
299            << fTSBranch.Data() << "''" << endl ;
300       cout << "       already exist in TreeR. ROOT does not allow updating/overwriting." << endl ;
301       cout << "       Specify another title for branches or use ''StartFrom()'' method" << endl ;
302       
303       //mark all tasks as inactive
304       TIter next(fTasks);
305       TTask *task;
306       while((task=(TTask*)next()))
307         task->SetActive(kFALSE) ;
308       return ;
309       
310     }
311     
312   }
313
314   if(fPID->IsActive() && gAlice->TreeR()){ //Produce RecParticles
315     TBranch * pidBranch = 0;
316     TBranch * rpBranch = 0;
317     
318     TObjArray * branches = gAlice->TreeR()->GetListOfBranches() ;
319     Int_t ibranch;
320     Bool_t pidNotFound = kTRUE ;
321     Bool_t rpNotFound = kTRUE ;
322     
323     for(ibranch = 0;(ibranch <branches->GetEntries()) && pidNotFound && rpNotFound ;ibranch++){
324       if(pidNotFound){
325         pidBranch=(TBranch *) branches->At(ibranch) ;
326         if( (strcmp(fRecPartBranch,pidBranch->GetTitle())==0 ) &&
327             (strcmp(pidBranch->GetName(),"AliPHOSPID") == 0) )
328           pidNotFound = kFALSE ;
329       }
330       if(rpNotFound){
331         rpBranch=(TBranch *) branches->At(ibranch) ;
332         if( (strcmp(fRecPartBranch,rpBranch->GetTitle())==0 ) &&
333             (strcmp(rpBranch->GetName(),"PHOSRP") == 0) )
334           rpNotFound = kFALSE ;
335       }
336     }
337     
338     if(!pidNotFound  || !rpNotFound ){
339       cout << "AliPHOSReconstructioner error: "<< endl ;
340       cout << "       Branches ''PHOSRP'' or ''AliPHOSPID'' with title ``" 
341            << fRecPartBranch.Data() << "''" << endl ;
342       cout << "       already exist in TreeR. ROOT does not allow updating/overwriting." << endl ;
343       cout << "       Specify another title for branches." << endl ;
344       
345       //mark all tasks as inactive
346       TIter next(fTasks);
347       TTask *task;
348       while((task=(TTask*)next()))
349         task->SetActive(kFALSE) ;
350       return ;
351     }
352     
353   }
354 }
355 //____________________________________________________________________________
356  void AliPHOSReconstructioner::Init()
357 {
358   // initiliaze Reconstructioner if necessary: we can not do this in default constructor
359
360   if(!fIsInitialized){
361     // Initialisation
362
363     fSDigitsBranch="Default" ; 
364     fSDigitizer  = new AliPHOSSDigitizer(fHeaderFileName.Data(),fSDigitsBranch.Data()) ; 
365     Add(fSDigitizer) ;
366
367     fDigitsBranch="Default" ; 
368     fDigitizer   = new AliPHOSDigitizer(fHeaderFileName.Data(),fDigitsBranch.Data()) ; 
369     Add(fDigitizer) ;
370
371     fRecPointBranch="Default" ; 
372     fClusterizer = new AliPHOSClusterizerv1(fHeaderFileName.Data(),fRecPointBranch.Data()) ; 
373     Add(fClusterizer) ;
374
375     fTSBranch="Default" ; 
376     fTSMaker     = new AliPHOSTrackSegmentMakerv1(fHeaderFileName.Data(),fTSBranch.Data()) ;
377     Add(fTSMaker) ;
378
379
380     fRecPartBranch="Default" ; 
381     fPID         = new AliPHOSPIDv1(fHeaderFileName.Data(),fRecPartBranch.Data()) ;
382     Add(fPID) ;
383     
384     fIsInitialized = kTRUE ;
385   }
386
387 //____________________________________________________________________________
388 AliPHOSReconstructioner::~AliPHOSReconstructioner()
389 {
390   // Delete data members if any
391
392 //   if(fSDigitizer)
393 //     delete fSDigitizer ;
394   
395 //   if(fDigitizer)
396 //     delete fDigitizer ;
397   
398 //   if(fClusterizer)
399 //     delete fClusterizer ;
400   
401 //   if(fTSMaker)
402 //     delete fTSMaker ;
403   
404 //   if(fPID)
405 //     delete fPID ;
406
407 //    TFile * file = (TFile*) gROOT->GetFile(fHeaderFileName.Data()) ;
408     
409 //    if(file != 0) {
410 //      file->Close();
411 //      delete file;
412 //      printf("File %s is closed\n",fHeaderFileName.Data());
413 //    }
414
415
416 //____________________________________________________________________________
417 void AliPHOSReconstructioner::SetBranchTitle(const char* branch, const char * title)
418 {
419   //Diverge correcpoinding branch to the file "title"
420
421   if(strcmp(branch,"SDigits") == 0){ 
422     fSDigitizer->SetSDigitsBranch(title) ;
423     fDigitizer->SetSDigitsBranch(title) ;
424     fSDigitsBranch = title ;
425     return ;
426   }
427   
428   if(strcmp(branch,"Digits") == 0){ 
429     fDigitizer->SetName(title) ;
430     fClusterizer->SetName(title) ;
431     fDigitsBranch = title ;
432     return ;
433   }
434
435   if(strcmp(branch,"RecPoints") == 0){ 
436     fClusterizer->SetRecPointsBranch(title) ;
437     fTSMaker->SetRecPointsBranch(title) ;
438     fRecPointBranch = title ;
439     return ;
440   }
441
442   if(strcmp(branch,"TrackSegments") == 0){
443     fTSMaker->SetTrackSegmentsBranch(title) ;
444     fPID->SetTrackSegmentsBranch(title) ;
445     fTSBranch = title ;
446     return ;
447   }
448
449   if(strcmp(branch,"RecParticles") == 0){ 
450     fPID->SetRecParticlesBranch(title) ;
451     fRecPartBranch = title ;
452     return ;
453   }
454
455   cout << "There is no branch " << branch << "!"<< endl ;
456   cout << "Available branches `SDigits', `Digits', `RecPoints', `TrackSegments' and `RecParticles' " << endl ;
457   
458 }
459 //____________________________________________________________________________
460 void AliPHOSReconstructioner::StartFrom(char * module,char* title)
461 {
462   // in the next pass of reconstruction (call ExecuteTask()) reconstruction will 
463   // start from the module "module", and in the case of non zero title all 
464   // pruduced branches will have title "title". The following "modules" are recognized
465   // "SD" - AliPHOSSDigitizer,
466   // "D"  - AliPHOSDigitizer
467   // "C"  - AliPHOSClusterizer
468   // "TS" - AliPHOSTrackSegmentMaker
469   // "RP" - AliPHOSPID
470
471   if(!fIsInitialized)
472     Init() ;
473
474   char * moduleName = new char[30];
475   if(strstr(module,"SD"))
476     sprintf(moduleName,"AliPHOSSDigitizer") ;
477   else
478     if(strstr(module,"D") )
479       sprintf(moduleName,"AliPHOSDigitizer") ;
480     else
481       if(strstr(module,"C") || strstr(module,"RecPoint") )
482         sprintf(moduleName,"AliPHOSClusterizer") ;
483       else
484         if(strstr(module,"TS") || strstr(module,"Track") )
485           sprintf(moduleName,"AliPHOSTrackSegmentMaker") ;
486         else
487           if(strstr(module,"PID") || strstr(module,"Particle") || strstr(module,"RP") )
488             sprintf(moduleName,"AliPHOSPID") ;
489           else{
490             cout << "Do not know such a module / Rec Object " << endl;
491             return ;
492           }
493   
494   TIter next(fTasks);
495   TTask *task;
496   Bool_t active = kFALSE ;
497   while((task=(TTask*)next())){ 
498     if (strcmp(moduleName,task->GetName())==0)  
499       active = kTRUE;
500     task->SetActive(active) ;
501     if(active && title){ // set title to branches
502       switch(strlen(task->GetName()) ) {
503       case 17:   // "AliPHOSSDigitizer"
504         fSDigitizer->SetSDigitsBranch(title) ;
505         fDigitizer->SetSDigitsBranch(title) ;
506         fSDigitsBranch = title ;
507         break ;
508       case 16:   //"AliPHOSDigitizer"
509         fDigitizer->SetName(title) ;
510         fClusterizer->SetName(title) ;
511         fDigitsBranch = title ;
512         break ;
513       case 18:   //"AliPHOSClusterizer"
514         fClusterizer->SetRecPointsBranch(title) ;
515         fTSMaker->SetRecPointsBranch(title) ;
516         fRecPointBranch = title ;
517         break ;
518       case 24:   //"AliPHOSTrackSegmentMaker"
519         fTSMaker->SetTrackSegmentsBranch(title) ;
520         fPID->SetTrackSegmentsBranch(title) ;
521         fTSBranch = title ;
522         break ;
523       case 10:   // "AliPHOSPID"
524         fPID->SetRecParticlesBranch(title) ;
525         fRecPartBranch = title ;
526         break ;
527       }
528       
529     }
530   }
531   
532   delete moduleName;
533 }
534 //____________________________________________________________________________
535
536 void AliPHOSReconstructioner::Print(Option_t * option)const {
537   // Print reconstructioner data  
538
539   cout << "-----------------AliPHOSReconstructioner---------------" << endl ;
540   cout << " Reconstruction of the header file " <<fHeaderFileName.Data() << endl ;
541   cout << " with the following modules: " << endl ;
542
543   if(fSDigitizer->IsActive()){
544     cout << "   (+)   " << fSDigitizer->GetName() << " to branch : " << fSDigitsBranch.Data() << endl ; 
545     cout << endl ;
546   }
547   if(fDigitizer->IsActive()){
548     cout << "   (+)   " << fDigitizer->GetName() << " to branch : " << fDigitsBranch.Data() << endl ;  
549     cout <<  endl ;
550   }
551   
552   if(fClusterizer->IsActive()){
553     cout << "   (+)   " <<fClusterizer->GetName() << " to branch : " <<fRecPointBranch.Data()  << endl ;  
554     cout <<  endl ;
555   }
556
557   if(fTSMaker->IsActive()){
558     cout << "   (+)   " << fTSMaker->GetName() << " to branch : " << fTSBranch.Data() << endl ;  
559     cout <<  endl ;
560   }
561
562
563   if(fPID->IsActive()){
564     cout << "   (+)   " << fPID->GetName() << " to branch : " <<fRecPartBranch.Data()  << endl ;  
565     cout <<  endl ;
566   }
567
568
569 }