]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PHOS/AliPHOSGetter.cxx
Energy correction for default absorber configuration.
[u/mrichter/AliRoot.git] / PHOS / AliPHOSGetter.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 /* $Log:
19    29.05.2001 Yuri Kharlov:
20               Everywhere reading the treese TTree->GetEvent(i)
21               is replaced by reading the branches TBranch->GetEntry(0)
22 */
23
24 //_________________________________________________________________________
25 //  A singleton. This class should be used in the analysis stage to get 
26 //  reconstructed objects: Digits, RecPoints, TrackSegments and RecParticles,
27 //  instead of directly reading them from galice.root file. This container 
28 //  ensures, that one reads Digits, made of these particular digits, RecPoints, 
29 //  made of these particular RecPoints, TrackSegments and RecParticles. 
30 //  This becomes non trivial if there are several identical branches, produced with
31 //  different set of parameters. 
32 //
33 //  An example of how to use (see also class AliPHOSAnalyser):
34 //  AliPHOSGetter * gime = AliPHOSGetter::GetInstance("galice.root","test") ;
35 //  for(Int_t irecp = 0; irecp < gime->NRecParticles() ; irecp++)
36 //     AliPHOSRecParticle * part = gime->RecParticle(1) ;
37 //     ................
38 //  please->GetEvent(event) ;    // reads new event from galice.root
39 //                  
40 //*-- Author: Yves Schutz (SUBATECH) & Dmitri Peressounko (RRC KI & SUBATECH)
41 //*--         Completely redesigned by Dmitri Peressounko March 2001  
42 //
43 //*-- YS June 2001 : renamed the original AliPHOSIndexToObject and make
44 //*--         systematic usage of TFolders without changing the interface        
45 //////////////////////////////////////////////////////////////////////////////
46
47
48 // --- ROOT system ---
49
50 #include "TFile.h"
51 #include "TTree.h"
52 #include "TROOT.h"
53 #include "TObjString.h"
54 #include "TFolder.h"
55 #include "TParticle.h"
56
57 // --- Standard library ---
58 #include <iostream.h>
59
60 // --- AliRoot header files ---
61
62 #include "AliRun.h"
63 #include "AliConfig.h"
64 #include "AliPHOSGetter.h"
65 #include "AliPHOS.h"
66 #include "AliPHOSDigitizer.h"
67 #include "AliPHOSSDigitizer.h"
68 #include "AliPHOSClusterizer.h"
69 #include "AliPHOSClusterizer.h"
70 #include "AliPHOSTrackSegmentMaker.h"
71 #include "AliPHOSTrackSegmentMaker.h"
72 #include "AliPHOSTrackSegment.h"
73 #include "AliPHOSPID.h" 
74 #include "AliPHOSPID.h" 
75 #include "AliPHOSGeometry.h"
76
77 ClassImp(AliPHOSGetter)
78   
79   AliPHOSGetter * AliPHOSGetter::fgObjGetter = 0 ; 
80
81 //____________________________________________________________________________ 
82 AliPHOSGetter::AliPHOSGetter(const char* headerFile, const char* branchTitle )
83 {
84   //Initialize  all lists
85
86   fDebug = 0 ; 
87   
88   fHeaderFile         = headerFile ; 
89   fBranchTitle        = branchTitle ;
90   fSDigitsTitle       = branchTitle ; 
91   fDigitsTitle        = branchTitle ; 
92   fRecPointsTitle     = branchTitle ; 
93   fRecParticlesTitle  = branchTitle ; 
94   fTrackSegmentsTitle = branchTitle ; 
95
96   fPrimaries = new TObjArray(1) ;
97
98   fModuleFolder    = dynamic_cast<TFolder*>(gROOT->FindObjectAny("Folders/Run/Configuration/Modules")); 
99   fPrimariesFolder = dynamic_cast<TFolder*>(gROOT->FindObjectAny("Folders/RunMC/Event/Data")); 
100   fHitsFolder      = dynamic_cast<TFolder*>(gROOT->FindObjectAny("Folders/RunMC/Event/Data/Hits")); 
101   fSDigitsFolder   = dynamic_cast<TFolder*>(gROOT->FindObjectAny("Folders/RunMC/Event/Data/SDigits")); 
102   fDigitsFolder    = dynamic_cast<TFolder*>(gROOT->FindObjectAny("Folders/Run/Event/Data")); 
103   fRecoFolder      = dynamic_cast<TFolder*>(gROOT->FindObjectAny("Folders/Run/Event/RecData")); 
104   fQAFolder        = dynamic_cast<TFolder*>(gROOT->FindObjectAny("Folders/Run/Conditions/QA")); 
105   fTasksFolder     = dynamic_cast<TFolder*>(gROOT->FindObjectAny("Folders/Tasks")) ; 
106
107   fFailed = kFALSE ; 
108
109   if ( fHeaderFile != "aliroot"  ) { // to call the getter without a file
110
111     //open headers file
112     fFile = static_cast<TFile*>(gROOT->GetFile(fHeaderFile.Data() ) ) ;
113     if(!fFile) {    //if file was not opened yet, read gAlice
114       fFile = TFile::Open(fHeaderFile.Data(),"update") ;
115       
116       if (!fFile->IsOpen()) {
117         cerr << "ERROR : AliPHOSGetter::AliPHOSGetter -> Cannot open " << fHeaderFile.Data() << endl ; 
118         fFailed = kTRUE ;
119         return ;  
120       }
121       gAlice = static_cast<AliRun *>(fFile->Get("gAlice")) ;
122     } 
123   }
124
125   if (!gAlice) {
126     cerr << "ERROR : AliPHOSGetter::AliPHOSGetter -> Cannot find gAlice in " << fHeaderFile.Data() << endl ; 
127     fFailed = kTRUE ;
128     return ; 
129   }
130   if (!PHOS()) {
131     if (fDebug)
132       cout << "INFO: AliPHOSGetter -> Posting PHOS to Folders" << endl ; 
133     if (gAlice->GetDetector("PHOS")) {
134       AliConfig * conf = AliConfig::Instance() ; 
135       conf->Add(static_cast<AliDetector*>(gAlice->GetDetector("PHOS"))) ; 
136       conf->Add(static_cast<AliModule*>(gAlice->GetDetector("PHOS"))) ; 
137     }
138     else 
139       cerr << "ERROR: AliPHOSGetter -> detector PHOS not found" << endl ;  
140   }
141   
142   fDebug=0;
143 }
144 //____________________________________________________________________________ 
145 AliPHOSGetter::~AliPHOSGetter(){
146
147   if (fPrimaries) {
148     fPrimaries->Delete() ; 
149     delete fPrimaries ; 
150   }
151
152   TFolder * phosF = dynamic_cast<TFolder *>(fSDigitsFolder->FindObject("PHOS")) ;
153   TCollection * folderslist = phosF->GetListOfFolders() ; 
154   TIter next(folderslist) ; 
155   TFolder * folder = 0 ; 
156   while ( (folder = static_cast<TFolder*>(next())) ) 
157     phosF->Remove(folder) ; 
158
159   fFile->Close() ;  
160   delete fFile ;
161   fFile = 0 ;
162     
163 }
164
165 //____________________________________________________________________________ 
166 void AliPHOSGetter::CreateWhiteBoard() const
167 {
168
169 }
170
171 //____________________________________________________________________________ 
172 AliPHOSGetter * AliPHOSGetter::GetInstance()
173 {
174   // Returns the pointer of the unique instance already defined
175   
176   AliPHOSGetter * rv = 0 ;
177   if ( fgObjGetter )
178     rv = fgObjGetter ;
179   else
180     cout << "AliPHOSGetter::GetInstance ERROR: not yet initialized" << endl ;
181
182   return rv ;
183 }
184
185 //____________________________________________________________________________ 
186 AliPHOSGetter * AliPHOSGetter::GetInstance(const char* headerFile,
187                                            const char* branchTitle)
188 {
189   // Creates and returns the pointer of the unique instance
190   // Must be called only when the environment has changed 
191
192   if ( fgObjGetter )    
193     if((fgObjGetter->fBranchTitle.CompareTo(branchTitle) == 0) && 
194        (fgObjGetter->fHeaderFile.CompareTo(headerFile)==0))
195       return fgObjGetter ;
196     else 
197       fgObjGetter->~AliPHOSGetter() ;  // delete it already exists another version
198  
199   fgObjGetter = new AliPHOSGetter(headerFile,branchTitle) ; 
200
201   if (fgObjGetter->HasFailed() ) 
202     fgObjGetter = 0 ; 
203   
204   
205   // Posts a few item to the white board (folders)
206   // fgObjGetter->CreateWhiteBoard() ;
207   
208   return fgObjGetter ; 
209   
210 }
211
212 //____________________________________________________________________________ 
213 const AliPHOS * AliPHOSGetter::PHOS() 
214 {
215   // returns the PHOS object 
216   AliPHOS * phos = dynamic_cast<AliPHOS*>(fModuleFolder->FindObject("PHOS")) ;  
217   if (!phos) 
218     if (fDebug)
219       cout << "WARNING: AliPHOSGetter::PHOS -> PHOS module not found in Folders" << endl ; 
220   return phos ; 
221 }  
222
223 //____________________________________________________________________________ 
224 const AliPHOSGeometry * AliPHOSGetter::PHOSGeometry() 
225 {
226   AliPHOSGeometry * rv = 0 ; 
227   if (PHOS() )
228     rv =  PHOS()->GetGeometry() ;
229   return rv ; 
230
231
232 //____________________________________________________________________________ 
233 Bool_t AliPHOSGetter::PostPrimaries(void) const 
234 {  //------- Primaries ----------------------
235
236   // the hierarchy is //Folders/RunMC/Event/Data/Primaries
237   
238   TFolder * primariesFolder = dynamic_cast<TFolder*>(fPrimariesFolder->FindObject("Primaries")) ; 
239   if ( !primariesFolder ) {
240     if (fDebug) {
241       cout << "WARNING: AliPHOSGetter::Post Primaries -> Folder //" << fPrimariesFolder << "/Primaries/ not found!" << endl;
242       cout << "INFO:    AliPHOSGetter::Post Primaries -> Adding Folder //" << fPrimariesFolder << "/Primaries/"  << endl;
243     }
244     primariesFolder = fPrimariesFolder->AddFolder("Primaries", "Primaries particles from TreeK") ; 
245   }    
246   TClonesArray *primaries=  new TClonesArray("TParticle",1000) ;
247   primaries->SetName("Primaries") ;
248   primariesFolder->Add(primaries) ; 
249   
250   return kTRUE;
251
252
253 //____________________________________________________________________________ 
254 TObject** AliPHOSGetter::PrimariesRef(void) const 
255 {  //------- Primaries ----------------------
256
257   
258   // the hierarchy is //Folders/RunMC/Event/Data/Primaries
259   if ( !fPrimariesFolder ) {
260     cerr << "ERROR: AliPHOSGetter::Post PrimariesRef -> Folder //" << fPrimariesFolder << " not found!" << endl;
261     return 0;
262   }    
263  
264   TFolder * primariesFolder = dynamic_cast<TFolder *>(fPrimariesFolder->FindObject("Primaries")) ;
265   if ( !primariesFolder ) {
266     cerr << "ERROR: AliPHOSGetter::Post PrimariesRef -> Folder //" << fPrimariesFolder << "/Primaries/ not found!" << endl;  
267     return 0;
268   }
269  
270   TObject * p = primariesFolder->FindObject("Primaries") ;
271   if(!p) {
272     cerr << "ERROR: AliPHOSGetter::PrimariesRef -> " << primariesFolder->GetName() << "/Primaries not found !" << endl ; 
273     return 0 ;
274   }
275   else
276     return primariesFolder->GetListOfFolders()->GetObjectRef(p) ;
277 }
278
279 //____________________________________________________________________________ 
280 Bool_t AliPHOSGetter::PostHits(void) const 
281 {  //------- Hits ----------------------
282
283   // the hierarchy is //Folders/RunMC/Event/Data/PHOS/Hits
284   
285   TFolder * phosFolder = dynamic_cast<TFolder*>(fHitsFolder->FindObject("PHOS")) ; 
286   if ( !phosFolder ) {
287     if (fDebug) {
288       cout << "WARNING: AliPHOSGetter::Post H -> Folder //" << fHitsFolder << "/PHOS/ not found!" << endl;
289       cout << "INFO:    AliPHOSGetter::Post H -> Adding Folder //" << fHitsFolder << "/PHOS/"  << endl;
290     }
291     phosFolder = fHitsFolder->AddFolder("PHOS", "Hits from PHOS") ; 
292   }    
293   TClonesArray *hits=  new TClonesArray("AliPHOSHit",1000) ;
294   hits->SetName("Hits") ;
295   phosFolder->Add(hits) ; 
296   
297   return kTRUE;
298
299
300 //____________________________________________________________________________ 
301 TObject** AliPHOSGetter::HitsRef(void) const 
302 {  //------- Hits ----------------------
303
304   
305   // the hierarchy is //Folders/RunMC/Event/Data/PHOS/Hits
306   if ( !fHitsFolder ) {
307     cerr << "ERROR: AliPHOSGetter::Post H -> Folder //" << fHitsFolder << " not found!" << endl;
308     return 0;
309   }    
310  
311   TFolder * phosFolder = dynamic_cast<TFolder *>(fHitsFolder->FindObject("PHOS")) ;
312   if ( !phosFolder ) {
313     cerr << "ERROR: AliPHOSGetter::Post HRef -> Folder //" << fHitsFolder << "/PHOS/ not found!" << endl;  
314     return 0;
315   }
316  
317   TObject * h = phosFolder->FindObject("Hits") ;
318   if(!h) {
319     cerr << "ERROR: AliPHOSGetter::HRef -> " << phosFolder->GetName() << "/Hits not found !" << endl ; 
320     return 0 ;
321   }
322   else
323     return phosFolder->GetListOfFolders()->GetObjectRef(h) ;
324 }
325
326 //____________________________________________________________________________ 
327 Bool_t AliPHOSGetter::PostSDigits(const char * name, const char * headerFile) const 
328 {  //---------- SDigits -------------------------
329
330   
331   // the hierarchy is //Folders/RunMC/Event/Data/PHOS/SDigits/headerFile/sdigitsname
332   // because you can have sdigits from several hit files for mixing
333   
334   TFolder * phosFolder = dynamic_cast<TFolder*>(fSDigitsFolder->FindObject("PHOS")) ;
335   if ( !phosFolder ) {
336     if (fDebug) {
337       cout << "WARNING: AliPHOSGetter::Post S -> Folder //" << fSDigitsFolder << "/PHOS/ not found!" << endl;
338       cout << "INFO:    AliPHOSGetter::Post S -> Adding Folder //" << fHitsFolder << "/PHOS/" << endl;
339     }
340     phosFolder = fSDigitsFolder->AddFolder("PHOS", "SDigits from PHOS") ; 
341   }    
342   TString subdir(headerFile) ;
343   subdir.ReplaceAll("/","_") ; 
344   TFolder * phosSubFolder = dynamic_cast<TFolder*>(phosFolder->FindObject(subdir)) ; 
345   if ( !phosSubFolder ) 
346     phosSubFolder = phosFolder->AddFolder(subdir, ""); 
347   
348   TObject * sd  = phosSubFolder->FindObject(name); 
349   if ( sd ) {
350     if (fDebug)
351       cerr <<"INFO: AliPHOSGetter::Post S -> Folder " << subdir 
352            << " already exists!" << endl ;  
353   }else{
354     TClonesArray * sdigits = new TClonesArray("AliPHOSDigit",1) ;
355     sdigits->SetName(name) ;
356     phosSubFolder->Add(sdigits) ;
357   }
358   
359   return kTRUE;
360
361 //____________________________________________________________________________ 
362 TObject** AliPHOSGetter::SDigitsRef(const char * name, const char * file) const 
363 {  //------- SDigits ----------------------
364   
365   // the hierarchy is //Folders/RunMC/Event/Data/PHOS/SDigits/filename/SDigits
366
367   if ( !fSDigitsFolder ) {
368     cerr << "ERROR: AliPHOSGetter::Post SRef -> Folder //" << fSDigitsFolder << " not found!" << endl;
369     return 0;
370   }    
371  
372   TFolder * phosFolder = dynamic_cast<TFolder *>(fSDigitsFolder->FindObject("PHOS")) ;
373   if ( !phosFolder ) {
374     cerr << "ERROR: AliPHOSGetter::Post SRef -> Folder //" << fSDigitsFolder << "/PHOS/ not found!" << endl;
375     return 0;
376   }
377
378   TFolder * phosSubFolder = 0 ;
379   if(file)
380     phosSubFolder = dynamic_cast<TFolder *>(phosFolder->FindObject(file)) ;
381   else
382     phosSubFolder = dynamic_cast<TFolder *>(phosFolder->FindObject(fHeaderFile)) ;
383   
384   if(!phosSubFolder) {
385     cerr << "ERROR: AliPHOSGetter::Post SRef -> Folder //Folders/RunMC/Event/Data/PHOS/" << file << "not found!" << endl;
386     return 0;
387   }
388
389   TObject * dis = phosSubFolder->FindObject(name) ;
390   if(!dis)
391     return 0 ;
392   else
393     return phosSubFolder->GetListOfFolders()->GetObjectRef(dis) ;
394
395 }
396
397 //____________________________________________________________________________ 
398 Bool_t AliPHOSGetter::PostSDigitizer(AliPHOSSDigitizer * sdigitizer) const 
399 {  //---------- SDigitizer -------------------------
400     
401   // the hierarchy is //Folders/Tasks/SDigitizer/PHOS/sdigitsname
402
403
404   TTask * sd  = dynamic_cast<TTask*>(fTasksFolder->FindObject("SDigitizer")) ; 
405
406   if ( !sd ) {
407     cerr << "ERROR: AliPHOSGetter::Post Ser -> Task //" << fTasksFolder << "/SDigitizer not found!" << endl;
408     return kFALSE ;
409   }        
410   TTask * phos = dynamic_cast<TTask*>(sd->GetListOfTasks()->FindObject("PHOS")) ; 
411   if ( !phos )  {
412     if (fDebug) {
413       cout <<"WARNING: AliPHOSGetter::Post Ser ->//" << fTasksFolder << "/SDigitizer/PHOS/ not found!" << endl;  
414       cout <<"INFO: AliPHOSGetter::Post Ser -> Adding //" << fTasksFolder << "/SDigitizer/PHOS/" << endl;
415     }
416     phos = new TTask("PHOS", "") ; 
417     sd->Add(phos) ; 
418   } 
419   AliPHOSSDigitizer * phossd  = dynamic_cast<AliPHOSSDigitizer *>(phos->GetListOfTasks()->FindObject( sdigitizer->GetName() )); 
420   if (phossd) { 
421     if (fDebug)
422       cout << "INFO: AliPHOSGetter::Post Ser -> Task " << sdigitizer->GetName() << " already exists" << endl ; 
423     phos->GetListOfTasks()->Remove(phossd) ;
424   }
425   phos->Add(sdigitizer) ;       
426   return kTRUE; 
427   
428 }
429
430 //____________________________________________________________________________ 
431 TObject** AliPHOSGetter::SDigitizerRef(const char * name) const 
432 {  
433
434   TTask * sd  = dynamic_cast<TTask*>(fTasksFolder->FindObject("SDigitizer")) ; 
435   if ( !sd ) {
436     cerr << "ERROR: AliPHOSGetter::Post SerRef -> Task //" << fTasksFolder << "/SDigitizer not found!" << endl;
437     abort();
438   }        
439
440   TTask * phos = dynamic_cast<TTask*>(sd->GetListOfTasks()->FindObject("PHOS")) ; 
441   if ( !phos )  {
442     cerr <<"ERROR: AliPHOSGetter::Post SerRef ->  //" << fTasksFolder << "/SDigitizer/PHOS not found!" << endl;
443     abort();
444   }        
445
446   TTask * task = dynamic_cast<TTask*>(phos->GetListOfTasks()->FindObject(name)) ; 
447
448   return phos->GetListOfTasks()->GetObjectRef(task) ;
449
450 }
451
452 //____________________________________________________________________________ 
453 Bool_t AliPHOSGetter::PostSDigitizer(const char * name, const char * file) const 
454 {  //---------- SDigitizer -------------------------
455   
456  // the hierarchy is //Folders/Tasks/SDigitizer/PHOS/sdigitsname
457
458
459   TTask * sd  = dynamic_cast<TTask*>(fTasksFolder->FindObject("SDigitizer")) ; 
460   if ( !sd ) {
461     cerr << "ERROR: AliPHOSGetter::Post Ser -> Task //" << fTasksFolder << "/SDigitizer not found!" << endl;
462     return kFALSE ;
463   }        
464
465   TTask * phos = dynamic_cast<TTask*>(sd->GetListOfTasks()->FindObject("PHOS")) ; 
466   if ( !phos )  {
467     if (fDebug) {
468       cout <<"WARNING: AliPHOSGetter::Post Ser ->  //" << fTasksFolder << "/SDigitizer/PHOS/ not found!" << endl;
469       cout <<"INFO: AliPHOSGetter::Post Ser -> Adding  //" << fTasksFolder << "/SDigitizer/PHOS" << endl;
470     }
471     phos = new TTask("PHOS", "") ; 
472     sd->Add(phos) ; 
473   } 
474
475   TString sdname(name) ;
476   sdname.Append(":") ;
477   sdname.Append(file);
478   sdname.ReplaceAll("/","_") ; 
479   AliPHOSSDigitizer * phossd  = dynamic_cast<AliPHOSSDigitizer *>(phos->GetListOfTasks()->FindObject( sdname )); 
480   if (!phossd) {
481     phossd = new AliPHOSSDigitizer() ;  
482     //Note, we can not call constructor with parameters: it will call Getter and scrud up everething
483     phossd->SetName(sdname) ;
484     phossd->SetTitle(file) ;
485     phos->Add(phossd) ; 
486   }
487   return kTRUE; 
488   
489 }
490
491 //____________________________________________________________________________ 
492 Bool_t AliPHOSGetter::PostDigits(const char * name) const 
493 {  //---------- Digits -------------------------
494
495   // the hierarchy is //Folders/Run/Event/Data/PHOS/SDigits/name
496
497   TFolder * phosFolder  = dynamic_cast<TFolder*>(fDigitsFolder->FindObject("PHOS")) ;
498
499   if ( !phosFolder ) {
500     if (fDebug) {
501       cout << "WARNING: AliPHOSGetter::Post D -> Folder //" << fDigitsFolder << "/PHOS/ not found!" << endl;
502       cout << "INFO:    AliPHOSGetter::Post D -> Adding Folder //" << fDigitsFolder << "/PHOS/" << endl;
503     }
504     phosFolder = fDigitsFolder->AddFolder("PHOS", "Digits from PHOS") ;  
505   }    
506  
507   TObject*  dig = phosFolder->FindObject( name ) ;
508   if ( !dig ) {
509     TClonesArray * digits = new TClonesArray("AliPHOSDigit",1000) ;
510     digits->SetName(name) ;
511     phosFolder->Add(digits) ;  
512   }
513   return kTRUE; 
514 }
515
516 //____________________________________________________________________________ 
517 TObject** AliPHOSGetter::DigitsRef(const char * name) const 
518 { //------- Digits ----------------------
519   
520   // the hierarchy is //Folders/Run/Event/Data/PHOS/Digits/name
521
522   if ( !fDigitsFolder ) {
523     cerr << "ERROR: AliPHOSGetter::Post DRef -> Folder //" << fDigitsFolder << " not found!" << endl;
524     return 0;
525   }    
526   
527   TFolder * phosFolder  = dynamic_cast<TFolder*>(fDigitsFolder->FindObject("PHOS")) ; 
528   if ( !phosFolder ) {
529     cerr << "ERROR: AliPHOSGetter::DRef -> Folder //" << fDigitsFolder << "/PHOS/ not found!" << endl;
530     return 0;
531   }    
532
533   TObject * d = phosFolder->FindObject(name) ;
534   if(!d)
535     return 0 ;
536   else
537     return phosFolder->GetListOfFolders()->GetObjectRef(d) ;
538
539 }
540
541 //____________________________________________________________________________ 
542 Bool_t AliPHOSGetter::PostDigitizer(AliPHOSDigitizer * digitizer) const 
543 {  //---------- Digitizer -------------------------
544   
545   TTask * sd  = dynamic_cast<TTask*>(fTasksFolder->FindObject("Digitizer")) ; 
546
547   if ( !sd ) {
548     cerr << "ERROR: AliPHOSGetter::Post Der -> Task //" << fTasksFolder << "/Digitizer not found!" << endl;
549     return kFALSE ;
550   }        
551   TTask * phos = dynamic_cast<TTask*>(sd->GetListOfTasks()->FindObject("PHOS")) ; 
552   if ( !phos )  {
553     if (fDebug) {
554       cout <<"WARNING: AliPHOSGetter::Post Der ->  //" << fTasksFolder << "/Digitizer/PHOS not found!" << endl;
555       cout <<"INFO: AliPHOSGetter::Post Der -> Adding //" << fTasksFolder << "/Digitizer/PHOS" << endl; 
556     }
557     phos = new TTask("PHOS", "") ; 
558     sd->Add(phos) ; 
559   } 
560
561     AliPHOSDigitizer * phosd = dynamic_cast<AliPHOSDigitizer*>(phos->GetListOfTasks()->FindObject(digitizer->GetName())) ; 
562     if (phosd) { 
563       phosd->Delete() ;
564       phos->GetListOfTasks()->Remove(phosd) ;
565     }
566     phos->Add(digitizer) ; 
567     return kTRUE; 
568 }  
569
570 //____________________________________________________________________________ 
571 Bool_t AliPHOSGetter::PostDigitizer(const char * name) const 
572 {  //---------- Digitizer -------------------------
573   
574  // the hierarchy is //Folders/Tasks/SDigitizer/PHOS/sdigitsname
575
576   TTask * d  = dynamic_cast<TTask*>(fTasksFolder->FindObject("Digitizer")) ; 
577   if ( !d ) {
578     cerr << "ERROR: AliPHOSGetter::Post Der -> Task //" << fTasksFolder << "/Digitizer not found!" << endl;
579     return kFALSE ;
580   }        
581
582   TTask * phos = dynamic_cast<TTask*>(d->GetListOfTasks()->FindObject("PHOS")) ; 
583   if ( !phos )  {
584     if (fDebug) {
585       cout <<"WARNING: AliPHOSGetter::Post Der -> //" << fTasksFolder << "/Digitizer/PHOS not found!" << endl; 
586       cout <<"INFO: AliPHOSGetter::Post Der -> Adding //" << fTasksFolder << "/Digitizer/PHOS" << endl;
587     }
588     phos = new TTask("PHOS", "") ; 
589     d->Add(phos) ; 
590
591
592   AliPHOSDigitizer * phosd = dynamic_cast<AliPHOSDigitizer*>(phos->GetListOfTasks()->FindObject(name)) ; 
593   if (!phosd) { 
594     phosd = new AliPHOSDigitizer() ;
595     phosd->SetName(fDigitsTitle) ;
596     phosd->SetTitle(fHeaderFile) ;
597     phos->Add(phosd) ;
598   }
599   return kTRUE;  
600 }
601
602 //____________________________________________________________________________ 
603 TObject** AliPHOSGetter::DigitizerRef(const char * name) const 
604 {  
605   TTask * sd  = dynamic_cast<TTask*>(fTasksFolder->FindObject("Digitizer")) ; 
606   if ( !sd ) {
607     cerr << "ERROR: AliPHOSGetter::Post DerRef -> Task //" << fTasksFolder << "/Digitizer not found!" << endl;
608     abort();
609   }        
610
611   TTask * phos = dynamic_cast<TTask*>(sd->GetListOfTasks()->FindObject("PHOS")) ; 
612   if ( !phos )  {
613     cerr <<"ERROR: AliPHOSGetter::Post DerRef ->  //" << fTasksFolder << "/Digitizer/PHOS" << endl;
614     abort();
615   }        
616
617   TTask * task = dynamic_cast<TTask*>(phos->GetListOfTasks()->FindObject(name)) ; 
618
619   return phos->GetListOfTasks()->GetObjectRef(task) ;
620
621 }
622  
623 //____________________________________________________________________________ 
624 Bool_t AliPHOSGetter::PostRecPoints(const char * name) const 
625 { // -------------- RecPoints -------------------------------------------
626   
627   // the hierarchy is //Folders/Run/Event/RecData/PHOS/EMCARecPoints/name
628   // the hierarchy is //Folders/Run/Event/RecData/PHOS/CPVRecPoints/name
629
630   TFolder * phosFolder  = dynamic_cast<TFolder*>(fRecoFolder->FindObject("PHOS")) ; 
631   
632   if ( !phosFolder ) {
633     if (fDebug) {
634       cout << "WARNING: AliPHOSGetter::Post RPo -> Folder //" << fRecoFolder->GetName() << "/PHOS/ not found!" << endl;
635       cout << "INFO:    AliPHOSGetter::Post Rpo -> Adding Folder //" << fRecoFolder->GetName() << "/PHOS/" << endl;
636     }
637     phosFolder = fRecoFolder->AddFolder("PHOS", "Reconstructed data from PHOS") ;  
638   }    
639   
640   // EMCA RecPoints 
641   TFolder * phosRPoEMCAFolder  = dynamic_cast<TFolder*>(phosFolder->FindObject("EMCARecPoints")) ;
642   if ( !phosRPoEMCAFolder ) {
643     if (fDebug) {
644       cout << "WARNING: AliPHOSGetter::Post RPo -> Folder //" << fRecoFolder->GetName() << "/PHOS/EMCARecPoints/ not found!" << endl;
645       cout << "INFO:    AliPHOSGetter::Post Rpo -> Adding Folder //" << fRecoFolder->GetName() << "/PHOS/EMCARecPoints" << endl;
646     }
647     phosRPoEMCAFolder = phosFolder->AddFolder("EMCARecPoints", "EMCA RecPoints from PHOS") ;  
648   }    
649   
650   TObject * erp = phosFolder->FindObject( name ) ;
651   if ( !erp )   {
652     TObjArray * emcrp = new TObjArray(100) ;
653     emcrp->SetName(name) ;
654     phosRPoEMCAFolder->Add(emcrp) ;  
655   }
656
657   // CPV RecPoints 
658   TFolder * phosRPoCPVFolder  = dynamic_cast<TFolder*>(phosFolder->FindObject("CPVRecPoints")) ;
659   if ( !phosRPoCPVFolder ) {
660     if (fDebug) {
661       cout << "WARNING: AliPHOSGetter::Post RPo -> Folder //" << fRecoFolder->GetName() << "/PHOS/CPVRecPoints/ not found!" << endl;
662       cout << "INFO:    AliPHOSGetter::Post Rpo -> Adding Folder //" << fRecoFolder->GetName() << "/PHOS/CPVRecPoints/" << endl;
663     }
664     phosRPoCPVFolder = phosFolder->AddFolder("CPVRecPoints", "CPV RecPoints from PHOS") ;  
665   }    
666   
667   TObject * crp =  phosRPoCPVFolder->FindObject( name ) ;
668   if ( !crp )   {
669     TObjArray * cpvrp = new TObjArray(100) ;
670     cpvrp->SetName(name) ;
671     phosRPoCPVFolder->Add(cpvrp) ;  
672   }
673   return kTRUE; 
674 }
675
676 //____________________________________________________________________________ 
677 TObject** AliPHOSGetter::EmcRecPointsRef(const char * name) const 
678 { // -------------- RecPoints -------------------------------------------
679   
680   // the hierarchy is //Folders/Run/Event/RecData/PHOS/EMCARecPoints/name
681    
682   if ( !fRecoFolder ) {
683     cerr << "ERROR: AliPHOSGetter::EmcRecPointsRef -> Folder //" << fRecoFolder->GetName() << " not found!" << endl;
684     return 0 ; 
685   }    
686
687   TFolder * phosFolder  = dynamic_cast<TFolder*>(fRecoFolder->FindObject("PHOS/EMCARecPoints")) ; 
688   if ( !phosFolder ) {
689     cerr << "ERROR: AliPHOSGetter::EmcRecPointsRef -> Folder //" << fRecoFolder->GetName() << "/PHOS/EMCARecPoints/ not found!" << endl;
690     return 0;
691   }    
692
693
694   TObject * erp = phosFolder->FindObject(name ) ;
695   if ( !erp )   {
696     return 0 ;
697   }
698   return phosFolder->GetListOfFolders()->GetObjectRef(erp) ;
699
700
701
702 //____________________________________________________________________________ 
703 TObject** AliPHOSGetter::CpvRecPointsRef(const char * name) const 
704 { // -------------- RecPoints -------------------------------------------
705   
706   // the hierarchy is //Folders/Run/Event/RecData/PHOS/CPVRecPoints/name
707    
708   if ( !fRecoFolder ) {
709     cerr << "ERROR: AliPHOSGetter::EmcRecPointsRef -> Folder //" << fRecoFolder->GetName() << " not found!" << endl;
710     return 0 ; 
711   }    
712
713   TFolder * phosFolder  = dynamic_cast<TFolder*>(fRecoFolder->FindObject("PHOS/CPVRecPoints")) ; 
714   if ( !phosFolder ) {
715     cerr << "ERROR: AliPHOSGetter::CpvRecPointsRef -> Folder //" << fRecoFolder->GetName() << "/PHOS/CPVRecPoints/" << endl;
716     return 0;
717   }    
718
719   TObject * crp = phosFolder->FindObject(name ) ;
720   if ( !crp )   {
721     return 0 ;
722   }
723   return phosFolder->GetListOfFolders()->GetObjectRef(crp) ;
724
725
726
727 //____________________________________________________________________________ 
728 Bool_t AliPHOSGetter::PostClusterizer(AliPHOSClusterizer * clu) const 
729 { // ------------------ AliPHOSClusterizer ------------------------
730   
731   // the hierarchy is //Folders/Tasks/Reconstructioner/PHOS/sdigitsname
732
733   TTask * tasks  = dynamic_cast<TTask*>(fTasksFolder->FindObject("Reconstructioner")) ; 
734
735   if ( !tasks ) {
736     cerr << "ERROR: AliPHOSGetter::Post Rer -> Task //" << fTasksFolder << "/Reconstructioner not found!" << endl;
737     return kFALSE ;
738   }        
739         
740   TTask * phos = dynamic_cast<TTask*>(tasks->GetListOfTasks()->FindObject("PHOS")) ; 
741   if ( !phos )  {
742     if (fDebug) {
743       cout <<"WARNING: AliPHOSGetter::Post Rer -> //" << fTasksFolder << "/ReconstructionerPHOS not found!" << endl; 
744       cout <<"INFO: AliPHOSGetter::Post Rer -> Adding //" << fTasksFolder << "/Reconstructioner/PHOS" << endl; 
745     }
746     phos = new TTask("PHOS", "") ; 
747     tasks->Add(phos) ; 
748   } 
749
750   AliPHOSClusterizer * phoscl = dynamic_cast<AliPHOSClusterizer*>(phos->GetListOfTasks()->FindObject(clu->GetName())) ; 
751   if (phoscl) { 
752     if (fDebug)
753       cout << "INFO: AliPHOSGetter::Post Rer -> Task " << clu->GetName() << " already exists" << endl ; 
754     phoscl->Delete() ; 
755     phos->GetListOfTasks()->Remove(phoscl) ;
756   }
757   phos->Add(clu) ;      
758   return kTRUE; 
759
760
761 //____________________________________________________________________________ 
762 TObject** AliPHOSGetter::ClusterizerRef(const char * name) const 
763 { // ------------------ AliPHOSClusterizer ------------------------
764   
765   TTask * tasks  = dynamic_cast<TTask*>(fTasksFolder->FindObject("Reconstructioner")) ; 
766
767   if ( !tasks ) {
768     cerr << "ERROR: AliPHOSGetter::Post RerRef -> Task //" << fTasksFolder << "/Reconstructioner not found!" << endl;
769     return 0 ;
770   }        
771         
772   TTask * phos = dynamic_cast<TTask*>(tasks->GetListOfTasks()->FindObject("PHOS")) ; 
773   if ( !phos )  {
774     cerr <<"WARNING: AliPHOSGetter::Post RerRef -> //" << fTasksFolder << "/Reconstructioner/PHOS" << endl; 
775     return 0 ; 
776   }   
777
778   TList * l = phos->GetListOfTasks() ; 
779   TIter it(l) ;
780   TTask * task ;
781   TTask * clu = 0 ;
782   TString cluname(name) ;
783   cluname+=":clu-" ;
784   while((task = static_cast<TTask *>(it.Next()) )){
785     TString taskname(task->GetName()) ;
786     if(taskname.BeginsWith(cluname)){
787       clu = task ;
788       break ;
789     }
790   }
791
792   if(clu) 
793     return l->GetObjectRef(clu) ;
794   else
795     return 0 ;
796 }
797
798 //____________________________________________________________________________ 
799 Bool_t AliPHOSGetter::PostClusterizer(const char * name) const 
800 { // ------------------ AliPHOSClusterizer ------------------------
801
802   // the hierarchy is //Folders/Tasks/Reconstructioner/PHOS/sdigitsname
803   
804   TTask * tasks  = dynamic_cast<TTask*>(fTasksFolder->FindObject("Reconstructioner")) ; 
805
806   if ( !tasks ) {
807     cerr << "ERROR: AliPHOSGetter::Post Rer -> Task//" << fTasksFolder << "/Reconstructioner not found!" << endl; 
808     return kFALSE ;
809   }        
810   
811   TTask * phos = dynamic_cast<TTask*>(tasks->GetListOfTasks()->FindObject("PHOS")) ; 
812   if ( !phos )  {
813     if (fDebug) {
814       cout <<"WARNING: AliPHOSGetter::Post Rer -> //" << fTasksFolder << "/Reconstructioner/PHOS not found!" << endl;
815       cout <<"INFO: AliPHOSGetter::Post Rer -> Adding //" << fTasksFolder << "/Reconstructioner/PHOS" << endl;
816     }
817     phos = new TTask("PHOS", "") ; 
818     tasks->Add(phos) ; 
819   } 
820
821   AliPHOSClusterizer * phoscl = new AliPHOSClusterizer() ;
822   TString clun(name) ;
823   clun+=":clusterizer" ; 
824   phoscl->SetName(clun) ;
825   phos->Add(phoscl) ;
826   return kTRUE; 
827   
828 }
829
830 //____________________________________________________________________________ 
831 Bool_t AliPHOSGetter::PostTrackSegments(const char * name) const 
832 { // ---------------TrackSegments -----------------------------------
833   
834   // the hierarchy is //Folders/Run/Event/RecData/PHOS/TrackSegments/name
835
836   TFolder * phosFolder  = dynamic_cast<TFolder*>(fRecoFolder->FindObject("PHOS")) ; 
837   
838   if ( !phosFolder ) {
839     if (fDebug) {
840       cout << "WARNING: AliPHOSGetter::Post TS -> Folder //" << fRecoFolder << "/PHOS/ not found!" << endl;
841       cout << "INFO:    AliPHOSGetter::Post TS -> Adding Folder //" << fRecoFolder->GetName() << "/PHOS" << endl;
842     }
843     phosFolder = fRecoFolder->AddFolder("PHOS", "Reconstructed data from PHOS") ;  
844   }    
845
846   TFolder * phosTSFolder  = dynamic_cast<TFolder*>(phosFolder->FindObject("TrackSegments")) ;
847   if ( !phosTSFolder ) {
848     if (fDebug) {
849       cout << "WARNING: AliPHOSGetter::Post TS -> Folder//" << fRecoFolder->GetName() << "/PHOS/TrackSegments/ not found!" << endl; 
850       cout << "INFO:    AliPHOSGetter::Post TS -> Adding Folder //" << fRecoFolder->GetName() << "/PHOS/TrackSegments/" << endl; 
851     }
852     phosTSFolder = phosFolder->AddFolder("TrackSegments", "TrackSegments from PHOS") ;  
853   }    
854   
855   TObject * tss =  phosTSFolder->FindObject( name ) ;
856   if (!tss) {
857     TClonesArray * ts = new TClonesArray("AliPHOSTrackSegment",100) ;
858     ts->SetName(name) ;
859     phosTSFolder->Add(ts) ;  
860   }
861   return kTRUE; 
862
863
864 //____________________________________________________________________________ 
865 TObject** AliPHOSGetter::TrackSegmentsRef(const char * name) const 
866 { // ---------------TrackSegments -----------------------------------
867   
868   // the hierarchy is //Folders/Run/Event/RecData/PHOS/TrackSegments/name
869
870  if ( !fRecoFolder ) {
871     cerr << "ERROR: AliPHOSGetter::TrackSegmentsRef -> Folder //" << fRecoFolder->GetName() << "not found!" << endl;
872     return 0 ; 
873   }    
874
875   TFolder * phosFolder  = dynamic_cast<TFolder*>(fRecoFolder->FindObject("PHOS/TrackSegments")) ; 
876   if ( !phosFolder ) {
877     cerr << "ERROR: AliPHOSGetter::TrackSegmentsRef -> Folder //" << fRecoFolder->GetName() << "/PHOS/TrackSegments/ not found!" << endl;
878     return 0;
879   }    
880   
881   TObject * tss =  phosFolder->FindObject(name) ;
882   if (!tss) {
883     return 0 ;  
884   }
885   return phosFolder->GetListOfFolders()->GetObjectRef(tss) ;
886
887
888 //____________________________________________________________________________ 
889 Bool_t AliPHOSGetter::PostTrackSegmentMaker(AliPHOSTrackSegmentMaker * tsmaker) const 
890 { //------------Track Segment Maker ------------------------------
891   
892   // the hierarchy is //Folders/Tasks/Reconstructioner/PHOS/sdigitsname
893
894   TTask * tasks  = dynamic_cast<TTask*>(fTasksFolder->FindObject("Reconstructioner")) ; 
895
896   if ( !tasks ) {
897     cerr << "ERROR: AliPHOSGetter::Post Ter -> Task //" << fTasksFolder << "/Reconstructioner not found!" << endl;
898     return kFALSE ;
899   }        
900         
901   TTask * phos = dynamic_cast<TTask*>(tasks->GetListOfTasks()->FindObject("PHOS")) ; 
902   if ( !phos )  {
903     if (fDebug) {
904       cout <<"WARNING: AliPHOSGetter::Post Rer -> //" << fTasksFolder << "/Reconstructioner/PHOS not found!" << endl; 
905       cout <<"INFO: AliPHOSGetter::Post Rer -> Adding //" << fTasksFolder << "/Reconstructioner/PHOS" << endl;
906     }
907     phos = new TTask("PHOS", "") ; 
908     tasks->Add(phos) ; 
909   } 
910
911   AliPHOSTrackSegmentMaker * phosts = 
912     dynamic_cast<AliPHOSTrackSegmentMaker*>(phos->GetListOfTasks()->FindObject(tsmaker->GetName())) ; 
913   if (phosts) { 
914     phosts->Delete() ;
915     phos->GetListOfTasks()->Remove(phosts) ;
916   }
917   phos->Add(tsmaker) ;      
918   return kTRUE; 
919   
920
921 //____________________________________________________________________________ 
922 Bool_t AliPHOSGetter::PostTrackSegmentMaker(const char * name) const 
923 { //------------Track Segment Maker ------------------------------
924   
925   // the hierarchy is //Folders/Tasks/Reconstructioner/PHOS/sdigitsname
926   
927   
928   TTask * tasks  = dynamic_cast<TTask*>(fTasksFolder->FindObject("Reconstructioner")) ; 
929   
930   if ( !tasks ) {
931     cerr << "ERROR: AliPHOSGetter::Post Ter -> Task //" << fTasksFolder << "/Reconstructioner not found!" << endl;
932     return kFALSE ;
933   }        
934   
935   TTask * phos = dynamic_cast<TTask*>(tasks->GetListOfTasks()->FindObject("PHOS")) ; 
936   if ( !phos )  {
937     if (fDebug) {
938       cout <<"WARNING: AliPHOSGetter::Post Rer -> //" << fTasksFolder << "/Reconstructioner/PHOS not found!" << endl; 
939       cout <<"INFO: AliPHOSGetter::Post Rer -> Adding //" << fTasksFolder << "/Reconstructioner/PHOS" << endl;
940     }
941     phos = new TTask("PHOS", "") ; 
942     tasks->Add(phos) ; 
943   } 
944
945   AliPHOSTrackSegmentMaker * phosts = 
946     dynamic_cast<AliPHOSTrackSegmentMaker*>(phos->GetListOfTasks()->FindObject(name)) ; 
947   if (!phosts) { 
948     phosts = new AliPHOSTrackSegmentMaker() ;
949     TString tsn(name);
950     tsn+=":tracksegmentmaker" ; 
951     phosts->SetName(tsn) ;
952     phos->Add(phosts) ;      
953   }
954   return kTRUE; 
955   
956
957
958 //____________________________________________________________________________ 
959 TObject** AliPHOSGetter::TSMakerRef(const char * name) const 
960 { //------------Track Segment Maker ------------------------------
961   
962   TTask * tasks  = dynamic_cast<TTask*>(fTasksFolder->FindObject("Reconstructioner")) ; 
963
964   if ( !tasks ) {
965     cerr << "ERROR: AliPHOSGetter::Post TerRef -> Task //" << fTasksFolder << "/Reconstructioner not found!" << endl;
966     return 0 ;
967   }        
968         
969   TTask * phos = dynamic_cast<TTask*>(tasks->GetListOfTasks()->FindObject("PHOS")) ; 
970   if ( !phos )  {
971     cerr <<"WARNING: AliPHOSGetter::Post TerRef -> //" << fTasksFolder << "/Reconstructioner/PHOS not found!" << endl; 
972     return 0 ; 
973   }   
974
975   TList * l = phos->GetListOfTasks() ; 
976   TIter it(l) ;
977   TTask * task ;
978   TTask * tsm = 0 ;
979   TString tsmname(name) ;
980   tsmname+=":tsm-" ;
981   while((task = static_cast<TTask *>(it.Next()) )){
982     TString taskname(task->GetName()) ;
983     if(taskname.BeginsWith(tsmname)){
984       tsm = task ;
985       break ;
986     }
987   }
988   
989   if(tsm) 
990     return l->GetObjectRef(tsm) ;
991   else
992     return 0 ;
993   
994
995
996 //____________________________________________________________________________ 
997 Bool_t AliPHOSGetter::PostRecParticles(const char * name) const 
998 {  // -------------------- RecParticles ------------------------
999   
1000   // the hierarchy is //Folders/Run/Event/RecData/PHOS/TrackSegments/name
1001
1002   TFolder * phosFolder  = dynamic_cast<TFolder*>(fRecoFolder->FindObject("PHOS")) ; 
1003   
1004   if ( !phosFolder ) {
1005     if (fDebug) {
1006       cout << "WARNING: AliPHOSGetter::Post RPa -> Folder //" << fRecoFolder->GetName() << "/PHOS/ not found!" << endl;
1007       cout << "INFO:    AliPHOSGetter::Post Rpa -> Adding Folder //" << fRecoFolder->GetName() << "/PHOS/" << endl;
1008     }
1009     phosFolder = fRecoFolder->AddFolder("PHOS", "Reconstructed data from PHOS") ;  
1010   }    
1011
1012  TFolder * phosRPaFolder  = dynamic_cast<TFolder*>(phosFolder->FindObject("RecParticles")) ;
1013   if ( !phosRPaFolder ) {
1014     if (fDebug) {
1015       cout << "WARNING: AliPHOSGetter::Post RPa -> Folder //" << fRecoFolder->GetName() << "/PHOS/RecParticles/ not found!" << endl;
1016       cout << "INFO:    AliPHOSGetter::Post RPa -> Adding Folder //" << fRecoFolder->GetName() << "/PHOS/RecParticles/" << endl;
1017     }
1018     phosRPaFolder = phosFolder->AddFolder("RecParticles", "RecParticles from PHOS") ;  
1019   } 
1020
1021   TObject * rps = phosRPaFolder->FindObject( name )  ;
1022   if ( !rps ) {
1023     TClonesArray * rp = new TClonesArray("AliPHOSRecParticle",100) ;
1024     rp->SetName(name) ;    
1025     phosRPaFolder->Add(rp) ;  
1026   }
1027   return kTRUE; 
1028
1029
1030 //____________________________________________________________________________ 
1031 TObject** AliPHOSGetter::RecParticlesRef(const char * name) const 
1032 { // ---------------TrackSegments -----------------------------------
1033   
1034   // the hierarchy is //Folders/Run/Event/RecData/PHOS/TrackSegments/name
1035
1036  if ( !fRecoFolder ) {
1037     cerr << "ERROR: AliPHOSGetter::RecParticlesRef -> Folder//" << fRecoFolder->GetName() << " not found!" << endl; 
1038     return 0 ; 
1039   }    
1040
1041   TFolder * phosFolder  = dynamic_cast<TFolder*>(fRecoFolder->FindObject("PHOS/RecParticles")) ; 
1042   if ( !phosFolder ) {
1043     cerr << "ERROR: AliPHOSGetter::RecParticlesRef -> Folder //" << fRecoFolder->GetName() << "/PHOS/RecParticles/ not found!" << endl;
1044     return 0;
1045   }    
1046
1047   TObject * tss =  phosFolder->FindObject(name  ) ;
1048   if (!tss) {
1049     return 0 ;  
1050   }
1051   return phosFolder->GetListOfFolders()->GetObjectRef(tss) ;
1052 }
1053
1054 //____________________________________________________________________________ 
1055 Bool_t AliPHOSGetter::PostPID(AliPHOSPID * pid) const 
1056 {      // ------------AliPHOS PID -----------------------------
1057
1058   TTask * tasks  = dynamic_cast<TTask*>(fTasksFolder->FindObject("Reconstructioner")) ; 
1059
1060   if ( !tasks ) {
1061     cerr << "ERROR: AliPHOSGetter::Post Per -> Task //" << fTasksFolder << "/Reconstructioner not found!" << endl;
1062     return kFALSE ;
1063   }        
1064   
1065   TTask * phos = dynamic_cast<TTask*>(tasks->GetListOfTasks()->FindObject("PHOS")) ; 
1066   if ( !phos )  {
1067     if (fDebug) {
1068       cout <<"WARNING: AliPHOSGetter::Post Per -> //" << fTasksFolder << "/Reconstructioner/PHOS not found!" << endl; 
1069       cout <<"INFO: AliPHOSGetter::Post Per -> Adding //" << fTasksFolder << "/Reconstructioner/PHOS" << endl;
1070     }
1071     phos = new TTask("PHOS", "") ; 
1072     tasks->Add(phos) ; 
1073   } 
1074
1075   AliPHOSPID * phospid = dynamic_cast<AliPHOSPID*>(phos->GetListOfTasks()->FindObject(pid->GetName())) ; 
1076   if (phospid) { 
1077     if (fDebug)
1078       cout << "INFO: AliPHOSGetter::Post Per -> Task " << pid->GetName()
1079            << " already exists" << endl ; 
1080     phos->GetListOfTasks()->Remove(phospid) ;
1081   }
1082   
1083   phos->Add(pid) ;      
1084   return kTRUE; 
1085
1086
1087 //____________________________________________________________________________ 
1088 Bool_t AliPHOSGetter::PostPID(const char * name) const 
1089 {     
1090   // the hierarchy is //Folders/Tasks/Reconstructioner/PHOS/sdigitsname
1091   
1092   TTask * tasks  = dynamic_cast<TTask*>(fTasksFolder->FindObject("Reconstructioner")) ; 
1093
1094   if ( !tasks ) {
1095     cerr << "ERROR: AliPHOSGetter::Post Per -> Task //" << fTasksFolder << "/Reconstructioner not found!" << endl;
1096     return kFALSE ;
1097   }        
1098   
1099   TTask * phos = dynamic_cast<TTask*>(tasks->GetListOfTasks()->FindObject("PHOS")) ; 
1100   if ( !phos )  {
1101     if (fDebug) {
1102       cout <<"WARNING: AliPHOSGetter::Post Per -> //" << fTasksFolder << "/Reconstructioner/PHOS not found!" << endl; 
1103       cout <<"INFO: AliPHOSGetter::Post Per -> Adding //" << fTasksFolder << "/Reconstructioner/PHOS" << endl;
1104     }
1105     phos = new TTask("PHOS", "") ; 
1106     tasks->Add(phos) ; 
1107   } 
1108
1109   TList * l = phos->GetListOfTasks() ;   
1110   TIter it(l) ;
1111   TString pidname(name) ;
1112   pidname+=":pid" ; 
1113   TTask * task ;
1114   while((task = static_cast<TTask *>(it.Next()) )){
1115     TString taskname(task->GetName()) ;
1116     if(taskname.BeginsWith(pidname))
1117       return kTRUE ;
1118   }
1119  
1120   AliPHOSPID * phospid = new AliPHOSPID() ;
1121   phospid->SetName(pidname) ; 
1122   phos->Add(phospid) ;      
1123   
1124   return kTRUE; 
1125
1126
1127 //____________________________________________________________________________ 
1128 TObject** AliPHOSGetter::PIDRef(const char * name) const 
1129 { //------------PID ------------------------------
1130
1131   TTask * tasks  = dynamic_cast<TTask*>(fTasksFolder->FindObject("Reconstructioner")) ; 
1132
1133   if ( !tasks ) {
1134     cerr << "ERROR: AliPHOSGetter::Post PerRef -> Task //" << fTasksFolder << "/Reconstructioner not found!" << endl;
1135     return 0 ;
1136   }        
1137         
1138   TTask * phos = dynamic_cast<TTask*>(tasks->GetListOfTasks()->FindObject("PHOS")) ; 
1139   if ( !phos )  {
1140     cerr <<"WARNING: AliPHOSGetter::Post PerRef -> //" << fTasksFolder << "/ReconstructionerPHOS not found!" << endl; 
1141     return 0 ; 
1142   }   
1143   
1144   TList * l = phos->GetListOfTasks() ; 
1145   TIter it(l) ;
1146   TTask * task ;
1147   TTask * pid = 0 ;
1148   TString pidname(name) ;
1149   pidname+=":pid-" ;
1150   while((task = static_cast<TTask *>(it.Next()) )){
1151     TString taskname(task->GetName()) ;
1152     if(taskname.BeginsWith(pidname)){
1153       pid = task ;
1154       break ;
1155     }
1156   }
1157   
1158   if(pid) 
1159     return l->GetObjectRef(pid) ;
1160   else
1161     return 0 ;
1162   
1163
1164
1165 //____________________________________________________________________________ 
1166 Bool_t AliPHOSGetter::PostQA(void) const 
1167 { // ------------------ QA ---------------------------------
1168
1169   // the hierarchy is //Folders/Run/Conditions/QA/PHOS/alarmsName
1170
1171   TFolder * phosFolder = dynamic_cast<TFolder*>(fQAFolder->FindObject("PHOS")) ; 
1172   if ( !phosFolder ) {
1173     if (fDebug) {
1174       cout << "WARNING: AliPHOSGetter::Post Q -> Folder //" << fQAFolder << "/PHOS/ not found!" << endl;
1175       cout << "INFO:    AliPHOSGetter::Post Q -> Adding Folder //" << fQAFolder << "/PHOS/" << endl;
1176     }
1177     phosFolder = fQAFolder->AddFolder("PHOS", "QA from PHOS") ; 
1178   }      
1179
1180   return kTRUE;
1181 }
1182
1183 //____________________________________________________________________________ 
1184 TObject** AliPHOSGetter::AlarmsRef(void) const 
1185 {  //------- Alarms ----------------------
1186
1187   
1188   // the hierarchy is //Folders/Run/Conditions/QA/PHOS
1189   if ( !fQAFolder ) {
1190     cerr << "ERROR: AliPHOSGetter::Post QRef -> Folder //" << fQAFolder << " not found!" << endl;
1191     return 0;
1192   }    
1193  
1194   TFolder * phosFolder = dynamic_cast<TFolder *>(fQAFolder->FindObject("PHOS")) ;
1195   if ( !phosFolder ) {
1196     cerr << "ERROR: AliPHOSGetter::Post QRef -> Folder //" << fQAFolder << "/PHOS/ not found!" << endl;
1197     return 0;
1198   }
1199    
1200   return fQAFolder->GetListOfFolders()->GetObjectRef(phosFolder) ;
1201 }
1202
1203 //____________________________________________________________________________ 
1204 const TParticle * AliPHOSGetter::Primary(Int_t index) const
1205 {
1206   // Return primary particle numbered by <index>
1207
1208   if(index < 0) 
1209     return 0 ;
1210   TParticle *  p = gAlice->Particle(index) ; 
1211   if (p->GetFirstMother() != -1 ) {
1212     cout << "AliPHOSGetter::Primary : Not a primary " << endl ; 
1213   }
1214   return p ; 
1215   
1216   
1217 //   Int_t primaryIndex = index % 10000000 ; 
1218 //   Int_t primaryList = (Int_t ) ((index-primaryIndex)/10000000.)  ;
1219   
1220 //   if ( primaryList > 0  ) {
1221 //     if (fDebug) {
1222 //       cout << " Getter does not support currently Mixing of primary " << endl ;
1223 //       cout << "   can not return primary: " << index<< " (list "<< primaryList<< " primary # " << primaryIndex << " )"<<endl ;
1224 //     }
1225 //     return 0;
1226 //   }
1227   
1228 //   return gAlice->Particle(primaryIndex) ;
1229   
1230 }
1231
1232 //____________________________________________________________________________ 
1233 const TParticle * AliPHOSGetter::Secondary(TParticle* p, Int_t index) const
1234 {
1235   // Return first (index=1) or second (index=2) secondary particle of primary particle p 
1236
1237   if(index <= 0) 
1238     return 0 ;
1239   if(index > 2)
1240     return 0 ;
1241
1242   if(p) {
1243   Int_t daughterIndex = p->GetDaughter(index-1) ; 
1244   return  gAlice->Particle(daughterIndex) ; 
1245   }
1246   else
1247     return 0 ;
1248 }
1249
1250 //____________________________________________________________________________ 
1251 Int_t AliPHOSGetter::ReadTreeD()
1252 {
1253   // Read the digit tree gAlice->TreeD()  
1254   if(gAlice->TreeD()== 0){
1255     cerr <<   "WARNING: AliPHOSGetter::ReadTreeD: can not read TreeD " << endl ;
1256   return 1;
1257   }
1258   
1259   TObjArray * lob = static_cast<TObjArray*>(gAlice->TreeD()->GetListOfBranches()) ;
1260   TIter next(lob) ; 
1261   TBranch * branch = 0 ; 
1262   TBranch * digitsbranch = 0 ; 
1263   TBranch * digitizerbranch = 0 ; 
1264   Bool_t phosfound = kFALSE, digitizerfound = kFALSE ; 
1265   
1266   while ( (branch = static_cast<TBranch*>(next())) && (!phosfound || !digitizerfound) ) {
1267     if ( (strcmp(branch->GetName(), "PHOS")==0) && (strcmp(branch->GetTitle(), fDigitsTitle)==0) ) {
1268       digitsbranch = branch ; 
1269       phosfound = kTRUE ;
1270     }
1271     else if ( (strcmp(branch->GetName(), "AliPHOSDigitizer")==0) && (strcmp(branch->GetTitle(), fDigitsTitle)==0) ) {
1272       digitizerbranch = branch ; 
1273       digitizerfound = kTRUE ; 
1274     }
1275   }
1276
1277   if ( !phosfound || !digitizerfound ) {
1278     if (fDebug)
1279       cout << "WARNING: AliPHOSGetter::ReadTreeD -> Cannot find Digits and/or Digitizer with name " 
1280            << fDigitsTitle << endl ;
1281     return 2; 
1282   }   
1283  
1284   //read digits
1285   if(!Digits(fDigitsTitle) ) 
1286     PostDigits(fDigitsTitle);
1287   digitsbranch->SetAddress(DigitsRef(fDigitsTitle)) ;
1288   digitsbranch->GetEntry(0) ;
1289   
1290   
1291   // read  the Digitizer
1292   if(!Digitizer(fDigitsTitle))
1293     PostDigitizer(fDigitsTitle) ;
1294   digitizerbranch->SetAddress(DigitizerRef(fDigitsTitle)) ;
1295   digitizerbranch->GetEntry(0) ;
1296  
1297   return 0 ; 
1298 }
1299
1300 //____________________________________________________________________________ 
1301 Int_t AliPHOSGetter::ReadTreeH()
1302 {
1303   // Read the first entry of PHOS branch in hit tree gAlice->TreeH()
1304
1305   if(gAlice->TreeH()== 0){
1306     cerr <<   "WARNING: AliPHOSGetter::ReadTreeH: -> Cannot read TreeH " << endl ;
1307     return 1;
1308   }
1309   
1310   TBranch * hitsbranch = static_cast<TBranch*>(gAlice->TreeH()->GetBranch("PHOS")) ;
1311   if ( !hitsbranch ) {
1312     if (fDebug)
1313       cout << "WARNING:  AliPHOSGetter::ReadTreeH -> Cannot find branch PHOS" << endl ; 
1314     return 2;
1315   }
1316   if(!Hits())
1317     PostHits() ;
1318
1319   if (hitsbranch->GetEntries() > 1 ) {
1320     TClonesArray * tempo =  new TClonesArray("AliPHOSHit",1000) ;
1321     TClonesArray * hits = dynamic_cast<TClonesArray*>(*HitsRef()) ; 
1322     hitsbranch->SetAddress(&tempo) ;
1323     Int_t index = 0 ; 
1324     Int_t i = 0 ;
1325     for (i = 0 ; i < hitsbranch->GetEntries() ; i++) {
1326       hitsbranch->GetEntry(i) ;
1327       Int_t j = 0 ; 
1328       for ( j = 0 ; j < tempo->GetEntries() ; j++) { 
1329         const AliPHOSHit * hit = static_cast<const AliPHOSHit *>(tempo->At(j)) ; 
1330         new((*hits)[index]) AliPHOSHit( *hit ) ;
1331         index++ ; 
1332       }
1333     }
1334     delete tempo ; 
1335   }
1336   else {
1337     hitsbranch->SetAddress(HitsRef()) ;
1338     hitsbranch->GetEntry(0) ;
1339   }
1340   return 0 ; 
1341 }
1342
1343 //____________________________________________________________________________ 
1344 void AliPHOSGetter::Track(Int_t itrack)
1345 {
1346   // Read the first entry of PHOS branch in hit tree gAlice->TreeH()
1347
1348   if(gAlice->TreeH()== 0){
1349     cerr <<   "ERROR: AliPHOSGetter::ReadTreeH: -> Cannot read TreeH " << endl ;
1350     return ;
1351   }
1352   
1353   TBranch * hitsbranch = dynamic_cast<TBranch*>(gAlice->TreeH()->GetListOfBranches()->FindObject("PHOS")) ;
1354   if ( !hitsbranch ) {
1355     if (fDebug)
1356       cout << "WARNING:  AliPHOSGetter::ReadTreeH -> Cannot find branch PHOS" << endl ; 
1357     return ;
1358   }  
1359   if(!Hits())
1360     PostHits() ;
1361
1362   hitsbranch->SetAddress(HitsRef()) ;
1363   hitsbranch->GetEntry(itrack) ;
1364
1365
1366 }
1367 //____________________________________________________________________________ 
1368 void AliPHOSGetter::ReadTreeQA()
1369 {
1370   // Read the digit tree gAlice->TreeQA()
1371   // so far only PHOS knows about this Tree  
1372
1373   if(PHOS()->TreeQA()== 0){
1374     cerr <<   "ERROR: AliPHOSGetter::ReadTreeQA: can not read TreeQA " << endl ;
1375     return ;
1376   }
1377   
1378   TBranch * qabranch = PHOS()->TreeQA()->GetBranch("PHOS") ; 
1379   if (!qabranch) { 
1380     if (fDebug)
1381       cout << "WARNING: AliPHOSGetter::ReadTreeQA -> Cannot find QA Alarms for PHOS" << endl ;
1382     return ; 
1383   }   
1384   
1385   if(!Alarms())
1386     PostQA() ; 
1387
1388   qabranch->SetAddress(AlarmsRef()) ;
1389
1390   qabranch->GetEntry(0) ;
1391  
1392 //   PostQA("PHOS") ; 
1393 //   TFolder * alarmsF = Alarms() ; 
1394 //   alarmsF->Clear() ; 
1395 //   qabranch->SetAddress(&alarmsF) ;
1396 //   qabranch->GetEntry(0) ;
1397   
1398 }
1399
1400 //____________________________________________________________________________ 
1401 Int_t AliPHOSGetter::ReadTreeR(Bool_t any)
1402 {
1403   // Read the reconstrunction tree gAlice->TreeR()
1404   // A particularity has been introduced here :
1405   //  if gime->Event(ievent,"R") is called branches with the current title are read, the current title
1406   //   being for example give in AliPHOSPID(fileName, title)
1407   //  if gime(Event(ievent, "RA") is called the title of the branches is not checked anymore, "A" stands for any
1408   // This is a feature needed by PID to be able to reconstruct several times particles (each time a ther title is given)
1409   // from a given set of TrackSegments (with a given name)
1410   // This is why any is NOT used to read the branch of RecParticles
1411   // See AliPHOSPIDv2    
1412
1413   if(gAlice->TreeR()== 0){
1414     cerr <<   "WARNING: AliPHOSGetter::ReadTreeR: can not read TreeR " << endl ;
1415     return 1;
1416   }
1417   
1418   // RecPoints 
1419   TObjArray * lob = static_cast<TObjArray*>(gAlice->TreeR()->GetListOfBranches()) ;
1420   TIter next(lob) ; 
1421   TBranch * branch = 0 ; 
1422   TBranch * emcbranch = 0 ; 
1423   TBranch * cpvbranch = 0 ; 
1424   TBranch * clusterizerbranch = 0 ; 
1425   Bool_t phosemcrpfound = kFALSE, phoscpvrpfound = kFALSE, clusterizerfound = kFALSE ; 
1426   
1427   while ( (branch = static_cast<TBranch*>(next())) && (!phosemcrpfound || !phoscpvrpfound || !clusterizerfound) ) 
1428     if(strcmp(branch->GetTitle(), fRecPointsTitle)==0 || any) {
1429       if ( strcmp(branch->GetName(), "PHOSEmcRP")==0) {
1430         emcbranch = branch ; 
1431         phosemcrpfound = kTRUE ;
1432       }
1433       else if ( strcmp(branch->GetName(), "PHOSCpvRP")==0) {
1434         cpvbranch = branch ; 
1435         phoscpvrpfound = kTRUE ;
1436       }
1437       else if(strcmp(branch->GetName(), "AliPHOSClusterizer")==0){
1438         clusterizerbranch = branch ; 
1439         clusterizerfound = kTRUE ; 
1440       }
1441     }
1442
1443   if ( !phosemcrpfound ) {
1444     if (fDebug)
1445       cout << "WARNING: AliPHOSGetter::ReadTreeR -> Cannot find EmcRecPoints with title " 
1446            << fRecPointsTitle << endl ;
1447     return 2 ; 
1448   }   
1449   if ( !phoscpvrpfound ) {
1450     if (fDebug)
1451       cout << "WARNING: AliPHOSGetter::ReadTreeR -> Cannot find CpvRecPoints with title " 
1452            << fRecPointsTitle << endl ;
1453     return 3; 
1454   }   
1455   if ( !clusterizerfound ) {
1456     if (fDebug)
1457       cout << "WARNING: AliPHOSGetter::ReadTreeR -> Can not find Clusterizer with title " 
1458            << fRecPointsTitle << endl ;
1459     return 4; 
1460   }   
1461   
1462   // Read and Post the RecPoints
1463   if(!EmcRecPoints(fRecPointsTitle) ) 
1464     PostRecPoints(fRecPointsTitle) ;
1465
1466   emcbranch->SetAddress(EmcRecPointsRef(fRecPointsTitle)) ;
1467   emcbranch->GetEntry(0) ;
1468
1469   cpvbranch->SetAddress(CpvRecPointsRef(fRecPointsTitle)) ; 
1470   cpvbranch->GetEntry(0) ;
1471   
1472   if(!Clusterizer(fRecPointsTitle) )
1473     PostClusterizer(fRecPointsTitle) ;
1474
1475   clusterizerbranch->SetAddress(ClusterizerRef(fRecPointsTitle)) ;
1476   clusterizerbranch->GetEntry(0) ;
1477  
1478   
1479   //------------------- TrackSegments ---------------------
1480   next.Reset() ; 
1481   TBranch * tsbranch = 0 ; 
1482   TBranch * tsmakerbranch = 0 ; 
1483   Bool_t phostsfound = kFALSE, tsmakerfound = kFALSE ; 
1484     
1485   while ( (branch = static_cast<TBranch*>(next())) && (!phostsfound || !tsmakerfound) ) 
1486     if(strcmp(branch->GetTitle(), fTrackSegmentsTitle)==0 || any)  {
1487       if ( strcmp(branch->GetName(), "PHOSTS")==0){
1488         tsbranch = branch ; 
1489         phostsfound = kTRUE ;
1490       }
1491       else if(strcmp(branch->GetName(), "AliPHOSTrackSegmentMaker")==0) {
1492         tsmakerbranch = branch ; 
1493         tsmakerfound  = kTRUE ; 
1494       }
1495     }
1496   
1497   if ( !phostsfound || !tsmakerfound ) {
1498     if (fDebug)
1499       cout << "WARNING: AliPHOSGetter::ReadTreeR -> Cannot find TrackSegments and/or TrackSegmentMaker with name "
1500            << fTrackSegmentsTitle << endl ;
1501     return 5; 
1502   } 
1503   
1504   // Read and Post the TrackSegments
1505   if(!TrackSegments(fTrackSegmentsTitle))
1506     PostTrackSegments(fTrackSegmentsTitle) ;
1507
1508   tsbranch->SetAddress(TrackSegmentsRef(fTrackSegmentsTitle)) ;
1509   tsbranch->GetEntry(0) ;
1510   
1511   // Read and Post the TrackSegment Maker
1512   if(!TrackSegmentMaker(fTrackSegmentsTitle))
1513     PostTrackSegmentMaker(fTrackSegmentsTitle) ;
1514  
1515   tsmakerbranch->SetAddress(TSMakerRef(fTrackSegmentsTitle)) ;
1516   tsmakerbranch->GetEntry(0) ;
1517   
1518   
1519   //------------ RecParticles ----------------------------
1520   next.Reset() ; 
1521   TBranch * rpabranch = 0 ; 
1522   TBranch * pidbranch = 0 ; 
1523   Bool_t phosrpafound = kFALSE, pidfound = kFALSE ; 
1524   
1525   while ( (branch = static_cast<TBranch*>(next())) && (!phosrpafound || !pidfound) ) 
1526     if(strcmp(branch->GetTitle(), fRecParticlesTitle)==0) {   
1527       if ( strcmp(branch->GetName(), "PHOSRP")==0) {   
1528         rpabranch = branch ; 
1529         phosrpafound = kTRUE ;
1530       }
1531       else if (strcmp(branch->GetName(), "AliPHOSPID")==0) {
1532         pidbranch = branch ; 
1533         pidfound  = kTRUE ; 
1534       }
1535     }
1536   
1537   if ( !phosrpafound || !pidfound ) {
1538     if (fDebug)
1539       cout << "WARNING: AliPHOSGetter::ReadTreeR -> Cannot find RecParticles and/or PID with name " 
1540            << fRecParticlesTitle << endl ;
1541     return 6; 
1542   } 
1543   
1544   // Read and Post the RecParticles
1545   if(!RecParticles(fRecParticlesTitle))
1546     PostRecParticles(fRecParticlesTitle) ;
1547
1548   rpabranch->SetAddress(RecParticlesRef(fRecParticlesTitle)) ;
1549   rpabranch->GetEntry(0) ;
1550   
1551   // Read and Post the PID
1552   if(!PID(fRecParticlesTitle))
1553     PostPID(fRecParticlesTitle) ;
1554
1555   pidbranch->SetAddress(PIDRef(fRecParticlesTitle)) ;
1556   pidbranch->GetEntry(0) ;
1557   
1558   return 0 ; 
1559 }
1560
1561 //____________________________________________________________________________ 
1562 Int_t AliPHOSGetter::ReadTreeS(Int_t event)
1563 {
1564   // Read the summable digits tree gAlice->TreeS()  
1565   
1566   // loop over all opened files and read their SDigits to the White Board
1567   TFolder * phosF = dynamic_cast<TFolder *>(fSDigitsFolder->FindObject("PHOS")) ;
1568   if (!phosF) 
1569     phosF = fSDigitsFolder->AddFolder("PHOS", "SDigits from PHOS") ; 
1570   TCollection * folderslist = phosF->GetListOfFolders() ; 
1571   
1572   //Add current file to list if it is not there yet
1573   
1574   TString subdir(fHeaderFile) ;
1575   subdir.ReplaceAll("/","_") ; 
1576
1577   if ( (subdir != "aliroot") && ( !folderslist->Contains(subdir) ) ){
1578     phosF->AddFolder(subdir, ""); 
1579   }
1580     
1581   TIter next(folderslist) ; 
1582   TFolder * folder = 0 ; 
1583   TFile * file; 
1584   TTree * treeS = 0;
1585   while ( (folder = static_cast<TFolder*>(next())) ) {
1586     TString fileName(folder->GetName()) ; 
1587     fileName.ReplaceAll("_","/") ; 
1588     if(fHeaderFile.CompareTo(fileName) == 0 ) 
1589       treeS=gAlice->TreeS() ;
1590     else{
1591       file = static_cast<TFile*>(gROOT->GetFile(fileName)); 
1592       file->cd() ;
1593       
1594       // Get SDigits Tree header from file
1595       TString treeName("TreeS") ;
1596       treeName += event ; 
1597       treeS = dynamic_cast<TTree*>(gDirectory->Get(treeName.Data()));
1598     }
1599     if(treeS==0){
1600       cerr << "WARNING: AliPHOSGetter::ReadTreeS There is no SDigit Tree" << endl;
1601       return 1;
1602     }
1603     
1604     //set address of the SDigits and SDigitizer
1605     TBranch   * sdigitsBranch    = 0;
1606     TBranch   * sdigitizerBranch = 0;
1607     TBranch   * branch           = 0 ;  
1608     TObjArray * lob = static_cast<TObjArray*>(treeS->GetListOfBranches()) ;
1609     TIter next(lob) ; 
1610     Bool_t phosfound = kFALSE, sdigitizerfound = kFALSE ; 
1611     
1612     while ( (branch = static_cast<TBranch*>(next())) && (!phosfound || !sdigitizerfound) ) {
1613       if ( (strcmp(branch->GetName(), "PHOS")==0) && (strcmp(branch->GetTitle(), fSDigitsTitle)==0) ) {
1614         phosfound = kTRUE ;
1615         sdigitsBranch = branch ; 
1616       }
1617       
1618       else if ( (strcmp(branch->GetName(), "AliPHOSSDigitizer")==0) && (strcmp(branch->GetTitle(), fSDigitsTitle)==0) ) {
1619         sdigitizerfound = kTRUE ; 
1620         sdigitizerBranch = branch ;
1621       }
1622     }
1623     if ( !phosfound || !sdigitizerfound ) {
1624       if (fDebug)
1625         cout << "WARNING: AliPHOSDigitizer::ReadSDigits -> Digits and/or Digitizer branch with name " << GetName() 
1626              << " not found" << endl ;
1627       return 2; 
1628     }   
1629     
1630     if ( !folder->FindObject(fSDigitsTitle) )  
1631       PostSDigits(fSDigitsTitle,folder->GetName()) ;
1632
1633     sdigitsBranch->SetAddress(SDigitsRef(fSDigitsTitle,folder->GetName())) ;
1634     sdigitsBranch->GetEntry(0) ;
1635     
1636     TString sdname(fSDigitsTitle) ;
1637     sdname+=":" ;
1638     sdname+=folder->GetName() ;
1639     if(!SDigitizer(sdname) ) 
1640       PostSDigitizer(fSDigitsTitle,folder->GetName()) ;
1641
1642     sdigitizerBranch->SetAddress(SDigitizerRef(sdname)) ;
1643     sdigitizerBranch->GetEntry(0) ;
1644     
1645   }    
1646   
1647   // After SDigits have been read from all files, return to the first one
1648   
1649   next.Reset();
1650   folder = static_cast<TFolder*>(next());
1651   if(folder){
1652     TString fileName(folder->GetName()) ; 
1653     fileName.ReplaceAll("_","/") ; 
1654     file   = static_cast<TFile*>(gROOT->GetFile(fileName)); 
1655     file   ->cd() ;
1656   }
1657   return 0 ; 
1658 }
1659 //____________________________________________________________________________ 
1660 void AliPHOSGetter::ReadTreeS(TTree * treeS, Int_t input)
1661 {  // Read the summable digits fron treeS()  
1662
1663
1664   TString filename("mergefile") ;
1665   filename+= input ;
1666
1667   TFolder * phosFolder = dynamic_cast<TFolder*>(fSDigitsFolder->FindObject("PHOS")) ; 
1668   if ( !phosFolder ) { 
1669    phosFolder = fSDigitsFolder->AddFolder("PHOS", "SDigits from PHOS") ; 
1670   } 
1671   TFolder * folder=(TFolder*)phosFolder->FindObject(filename) ;
1672   //set address of the SDigits and SDigitizer
1673   TBranch   * sdigitsBranch    = 0;
1674   TBranch   * sdigitizerBranch = 0;
1675   TBranch   * branch           = 0 ;  
1676   TObjArray * lob = (TObjArray*)treeS->GetListOfBranches() ;
1677   TIter next(lob) ; 
1678   Bool_t phosfound = kFALSE, sdigitizerfound = kFALSE ; 
1679   
1680   while ( (branch = (TBranch*)next()) && (!phosfound || !sdigitizerfound) ) {
1681     if ( strcmp(branch->GetName(), "PHOS")==0) {
1682       phosfound = kTRUE ;
1683       sdigitsBranch = branch ; 
1684     }
1685     
1686     else if ( strcmp(branch->GetName(), "AliPHOSSDigitizer")==0) {
1687       sdigitizerfound = kTRUE ; 
1688       sdigitizerBranch = branch ;
1689     }
1690   }
1691   if ( !phosfound || !sdigitizerfound ) {
1692     if (fDebug)
1693       cout << "WARNING: AliPHOSGetter::ReadTreeS -> Digits and/or Digitizer branch not found" << endl ;
1694     return ; 
1695   }   
1696   
1697   if (!folder || !(folder->FindObject(sdigitsBranch->GetTitle()) ) )
1698     PostSDigits(sdigitsBranch->GetTitle(),filename) ;
1699
1700   sdigitsBranch->SetAddress(SDigitsRef(sdigitsBranch->GetTitle(),filename)) ;
1701   sdigitsBranch->GetEntry(0) ;
1702   
1703   TString sdname(sdigitsBranch->GetTitle()) ;
1704   sdname+=":" ;
1705   sdname+=filename ;
1706   if(!SDigitizer(sdigitsBranch->GetTitle()) )
1707     PostSDigitizer(sdigitsBranch->GetTitle(),filename) ;
1708
1709   sdigitizerBranch->SetAddress(SDigitizerRef(sdname)) ;
1710   sdigitizerBranch->GetEntry(0) ;
1711   
1712 }    
1713
1714
1715 //____________________________________________________________________________ 
1716 void AliPHOSGetter::ReadPrimaries()
1717 {
1718   // a lot simplified.... if 2 files are opened then we have a problem
1719
1720   TClonesArray * ar = 0  ; 
1721   if(! (ar = Primaries()) ) { 
1722     PostPrimaries() ;
1723     ar = Primaries() ; 
1724   }
1725   ar->Delete() ; 
1726   
1727   fNPrimaries = gAlice->GetNtrack() ; 
1728   Int_t index = 0 ; 
1729   for (index = 0 ; index < fNPrimaries; index++) { 
1730     new ((*ar)[index]) TParticle(*(Primary(index)));
1731   }
1732 }
1733 //____________________________________________________________________________ 
1734 void AliPHOSGetter::Event(const Int_t event, const char* opt)
1735 {
1736   // Reads the content of all Tree's S, D and R
1737  
1738   if (event >= gAlice->TreeE()->GetEntries() ) {
1739     cerr << "ERROR: AliPHOSGetter::Event -> " << event << " not found in TreeE!" << endl ; 
1740     return ; 
1741   }
1742
1743   Bool_t any = kFALSE ; 
1744   if (strstr(opt,"A") ) // do not check the title of the branches
1745     any = kTRUE; 
1746
1747   gAlice->GetEvent(event) ; 
1748
1749   Int_t rvRH = 0 ;
1750   Int_t rvRS = 0 ;
1751   Int_t rvRD = 0 ;
1752   Int_t rvRR = 0 ;
1753
1754   if(strstr(opt,"H") )
1755     rvRH = ReadTreeH() ;
1756   
1757   if(strstr(opt,"S") )
1758     rvRS = ReadTreeS(event) ;
1759
1760   if( strstr(opt,"D") )
1761     rvRD = ReadTreeD() ;
1762
1763   if( strstr(opt,"R") )
1764     rvRR = ReadTreeR(any) ;
1765
1766   if( strstr(opt,"Q") )
1767     ReadTreeQA() ;
1768
1769   if( strstr(opt,"P") || (strcmp(opt,"")==0) )
1770     if ( gAlice->Stack() ) 
1771       ReadPrimaries() ;
1772
1773 }
1774
1775 //____________________________________________________________________________ 
1776 TObject * AliPHOSGetter::ReturnO(TString what, TString name, TString file) const 
1777 {
1778   // get the object named "what" from the folder
1779   // folders are named like //Folders
1780
1781   if ( file.IsNull() ) 
1782     file = fHeaderFile ; 
1783
1784   TFolder * folder = 0 ;
1785   TObject * phosO  = 0 ; 
1786
1787   //  if ( name.IsNull() ) {
1788   if ( what.CompareTo("Primaries") == 0 ) {
1789     folder = dynamic_cast<TFolder *>(fPrimariesFolder->FindObject("Primaries")) ; 
1790     if (folder) 
1791       phosO  = dynamic_cast<TObject *>(folder->FindObject("Primaries")) ;  
1792   }
1793   else if ( what.CompareTo("Hits") == 0 ) {
1794     folder = dynamic_cast<TFolder *>(fHitsFolder->FindObject("PHOS")) ; 
1795     if (folder) 
1796       phosO  = dynamic_cast<TObject *>(folder->FindObject("Hits")) ;  
1797   }
1798   else if ( what.CompareTo("SDigits") == 0 ) {
1799     file.ReplaceAll("/","_") ; 
1800     TString path = "PHOS/" + file  ;
1801     folder = dynamic_cast<TFolder *>(fSDigitsFolder->FindObject(path.Data())) ; 
1802     if (folder) { 
1803       if (name.IsNull())
1804         name = fSDigitsTitle ; 
1805       phosO  = dynamic_cast<TObject *>(folder->FindObject(name)) ; 
1806     }
1807   }
1808   else if ( what.CompareTo("Digits") == 0 ){
1809     folder = dynamic_cast<TFolder *>(fDigitsFolder->FindObject("PHOS")) ; 
1810     if (folder) { 
1811       if (name.IsNull())
1812         name = fDigitsTitle ; 
1813       phosO  = dynamic_cast<TObject *>(folder->FindObject(name)) ; 
1814     } 
1815   }
1816   else if ( what.CompareTo("EmcRecPoints") == 0 ) {
1817     folder = dynamic_cast<TFolder *>(fRecoFolder->FindObject("PHOS/EMCARecPoints")) ; 
1818     if (folder) { 
1819       if (name.IsNull())
1820         name = fRecPointsTitle ; 
1821       phosO  = dynamic_cast<TObject *>(folder->FindObject(name)) ;
1822     } 
1823   }
1824   else if ( what.CompareTo("CpvRecPoints") == 0 ) {
1825     folder = dynamic_cast<TFolder *>(fRecoFolder->FindObject("PHOS/CPVRecPoints")) ; 
1826     if (folder) { 
1827       if (name.IsNull())
1828         name = fRecPointsTitle ; 
1829       phosO  = dynamic_cast<TObject *>(folder->FindObject(name)) ; 
1830     }   
1831   }
1832   else if ( what.CompareTo("TrackSegments") == 0 ) {
1833     folder = dynamic_cast<TFolder *>(fRecoFolder->FindObject("PHOS/TrackSegments")) ; 
1834     if (folder) { 
1835       if (name.IsNull())
1836         name = fTrackSegmentsTitle ; 
1837       phosO  = dynamic_cast<TObject *>(folder->FindObject(name)) ; 
1838     }   
1839   }
1840   else if ( what.CompareTo("RecParticles") == 0 ) {
1841     folder = dynamic_cast<TFolder *>(fRecoFolder->FindObject("PHOS/RecParticles")) ; 
1842    if (folder) { 
1843       if (name.IsNull())
1844         name = fRecParticlesTitle ; 
1845       phosO  = dynamic_cast<TObject *>(folder->FindObject(name)) ; 
1846     }   
1847  }
1848   else if ( what.CompareTo("Alarms") == 0 ){ 
1849     if (name.IsNull() ) 
1850       phosO = dynamic_cast<TObject *>(fQAFolder->FindObject("PHOS")) ;  
1851     else {
1852       folder = dynamic_cast<TFolder *>(fQAFolder->FindObject("PHOS")) ; 
1853       if (!folder) 
1854         phosO = 0 ; 
1855       else 
1856         phosO = dynamic_cast<TObject *>(folder->FindObject(name)) ;  
1857     }
1858   }
1859   if (!phosO) {
1860     if(fDebug)
1861       cerr << "ERROR : AliPHOSGetter::ReturnO -> Object " << what << " not found in " << fQAFolder->GetName() << endl ; 
1862     return 0 ;
1863   }
1864
1865   return phosO ;
1866 }
1867   
1868 //____________________________________________________________________________ 
1869 const TTask * AliPHOSGetter::ReturnT(TString what, TString name) const 
1870 {
1871   // get the TTask named "what" from the folder
1872   // folders are named like //Folders/Tasks/what/PHOS/name
1873
1874   TString search(what) ; 
1875   if ( what.CompareTo("Clusterizer") == 0 ) 
1876     search = "Reconstructioner" ; 
1877   else if ( what.CompareTo("TrackSegmentMaker") == 0 ) 
1878     search = "Reconstructioner" ; 
1879   else if ( what.CompareTo("PID") == 0 ) 
1880     search = "Reconstructioner" ; 
1881   else if ( what.CompareTo("QATasks") == 0 ) 
1882     search = "QA" ; 
1883
1884   TTask * tasks = dynamic_cast<TTask*>(fTasksFolder->FindObject(search)) ; 
1885
1886   if (!tasks) {
1887     cerr << "ERROR: AliPHOSGetter::ReturnT -> Task " << what << " not found!" << endl ;  
1888     return 0 ; 
1889   }
1890
1891   TTask * phosT = dynamic_cast<TTask*>(tasks->GetListOfTasks()->FindObject("PHOS")) ; 
1892   if (!phosT) { 
1893     cerr << "ERROR: AliPHOSGetter::ReturnT -> Task " << what << "/PHOS not found!" << endl ;  
1894     return 0 ; 
1895   }
1896   
1897   TList * list = phosT->GetListOfTasks() ; 
1898  
1899   if (what.CompareTo("SDigitizer") == 0) {  
1900     if ( name.IsNull() )
1901       name =  fSDigitsTitle ; 
1902   } else  if (what.CompareTo("Digitizer") == 0){ 
1903     if ( name.IsNull() )
1904       name =  fDigitsTitle ;
1905   } else  if (what.CompareTo("Clusterizer") == 0){ 
1906     if ( name.IsNull() )
1907       name =  fRecPointsTitle ;
1908     name.Append(":clu") ;
1909   }
1910   else  if (what.CompareTo("TrackSegmentMaker") == 0){ 
1911     if ( name.IsNull() )
1912       name =  fTrackSegmentsTitle ;
1913     name.Append(":tsm") ;
1914   }
1915   else  if (what.CompareTo("PID") == 0){ 
1916     if ( name.IsNull() )
1917       name =  fRecParticlesTitle ;
1918     name.Append(":pid") ;
1919   }
1920   else  if (what.CompareTo("QATasks") == 0){ 
1921     if ( name.IsNull() )
1922       return phosT ;
1923   }
1924   
1925   TIter it(list) ;
1926   TTask * task = 0 ; 
1927   while((task = static_cast<TTask *>(it.Next()) )){
1928     TString taskname(task->GetName()) ;
1929     if(taskname.BeginsWith(name))
1930       return task ;
1931   }
1932   
1933   if(fDebug)
1934     cout << "WARNING: AliPHOSGetter::ReturnT -> Task " << search << "/" << name << " not found!" << endl ; 
1935   return 0 ;
1936 }