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