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