68429e64d4f52ee69db17fe9f5c30956190aab6e
[u/mrichter/AliRoot.git] / PWG / CaloTrackCorrBase / AliAnaCaloTrackCorrBaseClass.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 //_________________________________________________________________________
17 // Base class for CaloTrackCorr analysis algorithms
18 //-- Author: Gustavo Conesa (LNF-INFN, LPSC-Grenoble) 
19 //
20 //
21 //_________________________________________________________________________
22
23
24 // --- ROOT system ---
25 #include <TClonesArray.h>
26 //#include <Riostream.h>
27
28 //---- AliRoot system ----
29 #include "AliAnaCaloTrackCorrBaseClass.h"
30 #include "AliCaloTrackReader.h"
31 #include "AliCalorimeterUtils.h"
32 #include "AliCaloPID.h"
33 #include "AliFiducialCut.h"
34 #include "AliIsolationCut.h"
35 #include "AliMCAnalysisUtils.h"
36 #include "AliNeutralMesonSelection.h"
37 #include "AliVCaloCells.h" 
38 #include "AliAODEvent.h"
39 #include "AliAODHandler.h"
40 #include "AliAnalysisManager.h"
41 #include "AliAODPWG4Particle.h"
42
43 ClassImp(AliAnaCaloTrackCorrBaseClass)
44
45
46 //__________________________________________________________
47 AliAnaCaloTrackCorrBaseClass::AliAnaCaloTrackCorrBaseClass() : 
48 TObject(), 
49 fDataMC(0),                   fDebug(0),                   fCheckFidCut(0),
50 fCheckCaloPID(0),             fRecalculateCaloPID(0), 
51 fMinPt(0),                    fMaxPt(0),                   fPairTimeCut(200), 
52 fMultiBin(0),                 fNZvertBin(0),
53 fNrpBin(0),                   fNCentrBin(0),
54 fNmaxMixEv(0),                fMaxMulti(0),                fMinMulti(0),
55 fUseSelectEvent(kFALSE),      fMakePlots(kFALSE),
56 fInputAODBranch(0x0),         fInputAODName(""),
57 fOutputAODBranch(0x0),        fNewAOD(kFALSE),
58 fOutputAODName(""),           fOutputAODClassName(""),
59 fAODObjArrayName(""),         fAddToHistogramsName(""),
60 fCaloPID(0x0),                fCaloUtils(0x0),
61 fFidCut(0x0),                 fHisto(0x0),
62 fIC(0x0),                     fMCUtils(0x0),                
63 fNMS(0x0),                    fReader(0x0)
64 {
65   //Default Ctor
66   
67   //Initialize parameters
68   InitParameters();
69 }
70
71 //___________________________________________________________
72 AliAnaCaloTrackCorrBaseClass::~AliAnaCaloTrackCorrBaseClass() 
73 {
74   // Remove all pointers except analysis output pointers.
75   
76   //delete fCaloUtils ; //Already deleted in maker
77   //delete fReader ;    //Already deleted in maker
78         
79   delete fCaloPID ; fCaloPID = 0;
80   delete fFidCut ;  fFidCut  = 0;
81   delete fIC ;      fIC      = 0;
82   delete fMCUtils ; fMCUtils = 0;
83   delete fNMS ;     fNMS     = 0;
84   delete fHisto;    fHisto   = 0;
85 }
86
87 //______________________________________________________________________
88 void AliAnaCaloTrackCorrBaseClass::AddAODParticle(AliAODPWG4Particle pc)
89 {
90   //Put AOD calo cluster in the AODParticleCorrelation array
91   
92   if(fOutputAODBranch){
93     
94     Int_t i = fOutputAODBranch->GetEntriesFast();
95     //new((*fOutputAODBranch)[i])  AliAODPWG4Particle(pc);
96     if(strcmp(fOutputAODBranch->GetClass()->GetName(),"AliAODPWG4Particle")==0)
97       new((*fOutputAODBranch)[i])  AliAODPWG4Particle(pc);
98     else   if(strcmp(fOutputAODBranch->GetClass()->GetName(),"AliAODPWG4ParticleCorrelation")==0)
99       new((*fOutputAODBranch)[i])  AliAODPWG4ParticleCorrelation(pc);
100     else {
101       printf("AliAnaCaloTrackCorrBaseClass::AddAODParticle() - Cannot add an object of type < %s >, to the AOD TClonesArray \n",  
102              fOutputAODBranch->GetClass()->GetName());
103       abort();    
104     }
105   }
106   else {
107     printf(" AliAnaCaloTrackCorrBaseClass::AddAODParticle() - No AOD branch available!!!\n");
108     abort();
109   }
110   
111 }       
112
113 //_______________________________________________________________________________
114 Int_t AliAnaCaloTrackCorrBaseClass::CheckMixedEventVertex(const Int_t caloLabel, 
115                                                           const Int_t trackLabel)
116 {
117   // Check vertex in mixed events
118   
119   if (!GetMixedEvent()) return 1; // Not mixed event continue normal processing
120   
121   Int_t evt = -1;
122   
123   if     (caloLabel  >= 0 )
124   {
125     evt = GetMixedEvent()->EventIndexForCaloCluster(caloLabel) ;
126   }
127   else if(trackLabel >= 0 )
128   {
129     evt = GetMixedEvent()->EventIndex(trackLabel) ;
130   }
131   else  
132     return 0; // go to next entry in the particle list
133   
134   if(evt == -1) 
135     return 0 ; // to content coverity
136   
137   if (TMath::Abs(GetVertex(evt)[2]) > GetZvertexCut())  return -1; // Vertex out of range process next event
138   
139   return 1 ; // continue processing normally
140   
141 }
142
143 //________________________________________________________________
144 void AliAnaCaloTrackCorrBaseClass::ConnectInputOutputAODBranches() 
145 {
146   //Recover ouput and input AOD pointers for each event in the maker
147         
148   //Delta AODs
149   if(fDebug > 3) printf("AliAnaCaloTrackCorrBaseClass::ConnectInputOutputAODBranches() - Connect Input with name: <%s>; Connect output with name <%s>\n",fInputAODName.Data(),fOutputAODName.Data());
150   
151   //Get the AOD handler, if output AOD is created use it, if not get the branches from the input which should be deltaAODs
152   AliAODHandler* aodHandler = 0x0;
153   Bool_t outAOD = kFALSE;
154   if((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler()) outAOD = kTRUE;
155   if(outAOD) aodHandler = (AliAODHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler()); 
156   else       aodHandler = (AliAODHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
157   
158   if(!GetReader()->WriteDeltaAODToFile())
159   {
160     fOutputAODBranch =  (TClonesArray *) (fReader->GetAODBranchList())->FindObject(fOutputAODName);
161     fInputAODBranch  =  (TClonesArray *) (fReader->GetAODBranchList())->FindObject(fInputAODName);      
162   }
163   else if (aodHandler->GetExtensions()) { 
164     
165     AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject(GetReader()->GetDeltaAODFileName()); 
166     if(ext){
167       AliAODEvent *aodEvent = ext->GetAOD(); 
168       if(fNewAOD)fOutputAODBranch = (TClonesArray*) aodEvent->FindListObject(fOutputAODName);
169       fInputAODBranch = (TClonesArray*) aodEvent->FindListObject(fInputAODName);          
170       if(!fOutputAODBranch && fNewAOD) fOutputAODBranch =  (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fOutputAODName);
171       if(!fInputAODBranch)  fInputAODBranch  =  (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fInputAODName);
172     }
173     else{//If no Delta AODs, kept in standard branch, to revise. 
174       if(fNewAOD && fReader->GetOutputEvent()) {
175         fOutputAODBranch =  (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fOutputAODName);
176         fInputAODBranch  =  (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fInputAODName);  
177       }
178       else {
179         fInputAODBranch  =  (TClonesArray *) fReader->GetInputEvent()->FindListObject(fInputAODName);   
180         if(!fInputAODBranch && fReader->GetOutputEvent() ) 
181           fInputAODBranch  =  (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fInputAODName);//Try the output event.
182       }
183     }
184   }
185   else{ //If no Delta AODs, kept in standard branch
186     if(fNewAOD && fReader->GetOutputEvent()) {
187       fOutputAODBranch =  (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fOutputAODName);
188       fInputAODBranch  =  (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fInputAODName);    
189     }
190     else{ 
191       fInputAODBranch  =  (TClonesArray *) fReader->GetInputEvent()->FindListObject(fInputAODName);
192       if(!fInputAODBranch && fReader->GetOutputEvent())  
193         fInputAODBranch  =  (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fInputAODName);//Try the output event.
194     }
195   }
196   
197   if(GetDebug() > 1){
198     if(fNewAOD && !fOutputAODBranch) 
199       printf(" AliAnaCaloTrackCorrBaseClass::ConnectInputOutputAODBranches() - Output Branch <%s>, not found!\n",fOutputAODName.Data());
200     if(!fNewAOD && !fInputAODBranch) 
201       printf(" AliAnaCaloTrackCorrBaseClass::ConnectInputOutputAODBranches() - Input Branch  <%s>, not found!\n",fInputAODName.Data());
202   }
203 }
204
205 //__________________________________________________________________________________________
206 AliVCluster * AliAnaCaloTrackCorrBaseClass::FindCluster(TObjArray* clusters, const Int_t id, 
207                                                         Int_t & iclus, const Int_t first) 
208 {
209   // Given the cluster ID stored in AliAODPWG4Particle, get the originator cluster and its index in the array
210   
211   if(!clusters) return 0x0;
212   
213   for(iclus = first; iclus < clusters->GetEntriesFast(); iclus++){
214     AliVCluster *cluster= dynamic_cast<AliVCluster*> (clusters->At(iclus));
215     if(cluster){
216       if     (cluster->GetID()==id) {
217         return cluster;
218       }
219     }      
220   }// calorimeter clusters loop
221   
222   return 0x0;
223   
224 }
225
226 //______________________________________________________________________________
227 TClonesArray * AliAnaCaloTrackCorrBaseClass::GetAODBranch(TString aodName) const 
228 {
229         //Recover ouput and input AOD pointers for each event in the maker
230         
231         //Delta AODs
232         if(fDebug > 3) printf("AliAnaCaloTrackCorrBaseClass::GetAODBranch() - Get Input Branch with name: <%s>; \n",aodName.Data());
233         
234   //Get the AOD handler, if output AOD is created use it, if not get the branches from the input which should be deltaAODs
235   AliAODHandler* aodHandler = 0x0;
236   Bool_t outAOD = kFALSE;
237   if((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler()) outAOD = kTRUE;
238   if(outAOD) aodHandler = (AliAODHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler()); 
239   else       aodHandler = (AliAODHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
240   
241   if(!GetReader()->WriteDeltaAODToFile())
242   {
243     return  (TClonesArray *) (fReader->GetAODBranchList())->FindObject(aodName);
244   }
245   else if (aodHandler->GetExtensions())
246   { 
247     AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject(GetReader()->GetDeltaAODFileName()); 
248     if(ext){
249       AliAODEvent *aodEvent = ext->GetAOD(); 
250       TClonesArray * aodbranch =  (TClonesArray*) aodEvent->FindListObject(aodName);
251       if(aodbranch) return aodbranch;
252       else {
253         if(outAOD) return  (TClonesArray *) fReader->GetOutputEvent()->FindListObject(aodName);
254         else       return  (TClonesArray *) fReader->GetInputEvent() ->FindListObject(aodName);
255       }
256     }
257     else{//If no Delta AODs, kept in standard branch, to revise. 
258       if(outAOD) return (TClonesArray *) fReader->GetOutputEvent()->FindListObject(aodName);
259       else       return (TClonesArray *) fReader->GetInputEvent() ->FindListObject(aodName);
260     }
261   }
262   else{ //If no Delta AODs, kept in standard branch, to revise. 
263     if(outAOD) return (TClonesArray *)  fReader->GetOutputEvent()->FindListObject(aodName);
264     else       return  (TClonesArray *) fReader->GetInputEvent() ->FindListObject(aodName);
265   }
266   
267 }
268
269 //_____________________________________________________________
270 TObjArray *  AliAnaCaloTrackCorrBaseClass::GetCTSTracks() const 
271 {
272   //Get list of referenced tracks from reader
273   
274   return fReader->GetCTSTracks(); 
275   
276 }
277
278 //________________________________________________________________
279 TObjArray *  AliAnaCaloTrackCorrBaseClass::GetPHOSClusters() const 
280 {
281   //Get list of PHOS reference caloclusters from reader
282   
283   return fReader->GetPHOSClusters(); 
284   
285 }
286
287 //_________________________________________________________________
288 TObjArray *  AliAnaCaloTrackCorrBaseClass::GetEMCALClusters() const 
289 {
290   //Get list of emcal referenced caloclusters from reader
291   
292   return fReader->GetEMCALClusters(); 
293   
294 }
295
296 //______________________________________________________________________
297 TClonesArray *  AliAnaCaloTrackCorrBaseClass::GetAODCaloClusters() const 
298 {
299   //Get list of all caloclusters in AOD output file 
300   
301   return fReader->GetOutputEvent()->GetCaloClusters(); 
302   
303 }
304
305 //________________________________________________________________
306 TClonesArray *  AliAnaCaloTrackCorrBaseClass::GetAODTracks() const 
307 {
308   //Get list of all tracks in AOD output file 
309   
310   return fReader->GetOutputEvent()->GetTracks(); 
311   
312 }
313
314 //____________________________________________________________
315 TString  AliAnaCaloTrackCorrBaseClass::GetBaseParametersList()  
316 {
317   //Put data member values in string to keep in output container
318   
319   TString parList ; //this will be list of parameters used for this analysis.
320   const Int_t buffersize = 255;
321   char onePar[buffersize] ;
322   snprintf(onePar,buffersize,"--- AliAnaCaloTrackCorrBaseClass ---\n") ;
323   parList+=onePar ;     
324   snprintf(onePar,buffersize,"Minimal P_t: %2.2f ; Max\n", fMinPt) ;
325   parList+=onePar ;
326   snprintf(onePar,buffersize,"Minimal P_t: %2.2f ; Max\n", fMaxPt) ;
327   parList+=onePar ;
328   snprintf(onePar,buffersize,"|t_{1}-t_{2}| < %2.2f ; Max\n", fPairTimeCut) ;
329   parList+=onePar ;
330   snprintf(onePar,buffersize,"fDataMC =%d (Check MC information, on/off) \n",fDataMC) ;
331   parList+=onePar ;
332   snprintf(onePar,buffersize,"fCheckFidCut=%d (Check Fiducial cut selection on/off) \n",fCheckFidCut) ;
333   parList+=onePar ;
334   snprintf(onePar,buffersize,"fCheckCaloPID =%d (Use Bayesian PID in calorimetes, on/off) \n",fCheckCaloPID) ;
335   parList+=onePar ;
336   snprintf(onePar,buffersize,"fRecalculateCaloPID  =%d (Calculate PID from shower/tof/tracking parameters, on/off) \n",fRecalculateCaloPID) ;
337   parList+=onePar ;
338   snprintf(onePar,buffersize,"fInputAODName  =%s Input AOD name \n",fInputAODName.Data()) ;
339   parList+=onePar ;     
340   if(fNewAOD){
341     snprintf(onePar,buffersize,"fOutputAODName  =%s Output AOD name \n",fOutputAODName.Data()) ;
342     parList+=onePar ;   
343     snprintf(onePar,buffersize,"fOutputAODClassName  =%s Output AOD class name \n",fOutputAODClassName.Data()) ;
344     parList+=onePar ;   
345   }
346   snprintf(onePar,buffersize,"fAODObjArrayName  =%s Reference arrays in AOD name \n",fAODObjArrayName.Data()) ;
347   parList+=onePar ;     
348   snprintf(onePar,buffersize,"fAddToHistogramsName  =%s String added to beginning of histograms name \n",fAddToHistogramsName.Data()) ;
349   parList+=onePar ;     
350         
351   return parList; 
352   
353 }
354
355 //_____________________________________________________________________
356 TClonesArray * AliAnaCaloTrackCorrBaseClass::GetCreateOutputAODBranch() 
357 {
358   //Create AOD branch filled in the analysis
359   
360   printf("Create AOD branch of %s objects and with name < %s >\n",
361          fOutputAODClassName.Data(),fOutputAODName.Data()) ;
362   
363   TClonesArray * aodBranch = new TClonesArray(fOutputAODClassName, 0);
364   aodBranch->SetName(fOutputAODName);
365   return aodBranch ;
366   
367 }
368
369 //________________________________________________________
370 Int_t AliAnaCaloTrackCorrBaseClass::GetEventNumber() const 
371 {
372   //Get current event number
373   
374   return fReader->GetEventNumber() ; 
375   
376 }
377
378
379 //__________________________________________________________
380 AliStack *  AliAnaCaloTrackCorrBaseClass::GetMCStack() const 
381 {
382   //Get stack pointer from reader
383   
384   return fReader->GetStack(); 
385   
386 }
387 //____________________________________________________________
388 AliHeader *  AliAnaCaloTrackCorrBaseClass::GetMCHeader() const
389 {
390   //Get header pointer from reader
391   
392   return fReader->GetHeader(); 
393   
394 }
395
396 //____________________________________________________________________________
397 AliGenEventHeader *  AliAnaCaloTrackCorrBaseClass::GetMCGenEventHeader() const
398 {
399   //Get GenEventHeader pointer from reader
400   
401   return fReader->GetGenEventHeader(); 
402   
403 }
404
405 //_________________________________________________
406 void AliAnaCaloTrackCorrBaseClass::InitParameters()
407
408   //Initialize the parameters of the analysis.
409   fDataMC              = kFALSE;
410   fDebug               = -1;
411   fCheckCaloPID        = kTRUE ;
412   fCheckFidCut         = kFALSE ;
413   fRecalculateCaloPID  = kFALSE ;
414   fMinPt               = 0.1  ; //Min pt in particle analysis
415   fMaxPt               = 300. ; //Max pt in particle analysis
416   fMultiBin            = 1;
417   fNZvertBin           = 1;
418   fNrpBin              = 1;
419   fMaxMulti            = 1000;
420   fMinMulti            = 0;
421   fUseSelectEvent      = kFALSE ;
422   
423   //fReader    = new AliCaloTrackReader(); //Initialized in maker
424   //fCaloUtils = new AliCalorimeterUtils();//Initialized in maker
425   
426   fNewAOD              = kFALSE ;
427   fOutputAODName       = "CaloTrackCorr";
428   fOutputAODClassName  = "AliAODPWG4Particle";
429   fInputAODName        = "CaloTrackCorr";
430   fAddToHistogramsName = "";
431   fAODObjArrayName     = "Ref";
432   
433 }
434
435 //__________________________________________________________________
436 void AliAnaCaloTrackCorrBaseClass::Print(const Option_t * opt) const
437 {
438   //Print some relevant parameters set for the analysis
439   
440   if(! opt)
441     return;
442         
443   printf("New AOD:            =     %d\n",fNewAOD);
444   printf("Input AOD name:     =     %s\n",fInputAODName.Data());
445   printf("Output AOD name:    =     %s\n",fOutputAODName.Data());
446   printf("Output AOD Class name: =  %s\n",fOutputAODClassName.Data());
447   printf("Min Photon pT       =     %2.2f\n",  fMinPt) ;
448   printf("Max Photon pT       =     %3.2f\n",  fMaxPt) ;
449   printf("Check PID           =     %d\n",     fCheckCaloPID) ;
450   printf("Recalculate PID     =     %d\n",     fRecalculateCaloPID) ;
451   printf("Check Fiducial cut  =     %d\n",     fCheckFidCut) ;
452   printf("Check MC labels     =     %d\n",     fDataMC);
453   printf("Make plots?         =     %d \n",    fMakePlots);     
454   printf("Debug Level         =     %d\n",     fDebug);
455   
456   printf("Name of reference array      : %s\n", fAODObjArrayName.Data());       
457   printf("String added histograms name : %s\n", fAddToHistogramsName.Data());
458         
459   printf("    \n") ;
460   
461
462
463
464