1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
17 //_________________________________________________________________________
18 // Base class for analysis algorithms
19 //-- Author: Gustavo Conesa (LNF-INFN)
20 //_________________________________________________________________________
23 // --- ROOT system ---
24 #include <TClonesArray.h>
25 //#include <Riostream.h>
27 //---- AliRoot system ----
28 #include "AliAnaPartCorrBaseClass.h"
29 #include "AliCaloTrackReader.h"
30 #include "AliCalorimeterUtils.h"
31 #include "AliCaloPID.h"
32 #include "AliFiducialCut.h"
33 #include "AliIsolationCut.h"
34 #include "AliMCAnalysisUtils.h"
35 #include "AliNeutralMesonSelection.h"
36 #include "AliAODCaloCells.h"
37 #include "AliAODEvent.h"
38 #include "AliAODHandler.h"
39 #include "AliAnalysisManager.h"
41 ClassImp(AliAnaPartCorrBaseClass)
44 //_______________________________________________
45 AliAnaPartCorrBaseClass::AliAnaPartCorrBaseClass() :
46 TObject(), fDataMC(0), fDebug(0), fCheckFidCut(0),
47 fCheckCaloPID(0), fRecalculateCaloPID(0), fMinPt(0), fMaxPt(0),
48 fReader(0x0), fInputAODBranch(0x0), fInputAODName(""),
49 fOutputAODBranch(0x0), fNewAOD(kFALSE),
50 fOutputAODName(""), fOutputAODClassName(""),
51 fAODObjArrayName(""), fAddToHistogramsName(""),
52 fAODCaloCells(0x0),//fAODCaloClusters(0x0),
53 fCaloPID(0x0), fFidCut(0x0), fIC(0x0),fMCUtils(0x0), fNMS(0x0),
55 //fAnaOutContainer(0x0),
56 fHistoPtBins(0), fHistoPtMax(0.), fHistoPtMin(0.),
57 fHistoPhiBins(0), fHistoPhiMax(0.), fHistoPhiMin(0.),
58 fHistoEtaBins(0), fHistoEtaMax(0.), fHistoEtaMin(0.),
59 fHistoMassBins(0), fHistoMassMax(0.), fHistoMassMin(0.),
60 fHistoAsymBins(0), fHistoAsymMax(0.), fHistoAsymMin(0.)
64 //Initialize parameters
68 //___________________________________________________________
69 AliAnaPartCorrBaseClass::AliAnaPartCorrBaseClass(const AliAnaPartCorrBaseClass & abc) :
70 TObject(), fDataMC(abc.fDataMC), fDebug(abc.fDebug),
71 fCheckFidCut(abc.fCheckFidCut), fCheckCaloPID(abc. fCheckCaloPID),
72 fRecalculateCaloPID(abc.fRecalculateCaloPID),
73 fMinPt(abc.fMinPt), fMaxPt(abc.fMaxPt), fReader(new AliCaloTrackReader(*abc.fReader)),
74 fInputAODBranch(new TClonesArray(*abc.fInputAODBranch)), fInputAODName(abc.fInputAODName),
75 fOutputAODBranch(new TClonesArray(*abc.fOutputAODBranch)),fNewAOD(abc.fNewAOD),
76 fOutputAODName(abc.fOutputAODName), fOutputAODClassName(abc.fOutputAODClassName),
77 fAODObjArrayName(abc.fAODObjArrayName),
78 fAddToHistogramsName(abc.fAddToHistogramsName),
79 //fAODCaloClusters(new TClonesArray(*abc.fAODCaloClusters)),
80 fAODCaloCells(new AliAODCaloCells(*abc.fAODCaloCells)),
81 fCaloPID(new AliCaloPID(*abc.fCaloPID)), fFidCut(new AliFiducialCut(*abc.fFidCut)), fIC(new AliIsolationCut(*abc.fIC)),
82 fMCUtils(new AliMCAnalysisUtils(*abc.fMCUtils)), fNMS(new AliNeutralMesonSelection(*abc.fNMS)),
83 fCaloUtils(new AliCalorimeterUtils(*abc.fCaloUtils)),
84 //fAnaOutContainer(abc.fAnaOutContainer),
85 fHistoPtBins(abc.fHistoPtBins), fHistoPtMax(abc.fHistoPtMax), fHistoPtMin(abc.fHistoPtMin),
86 fHistoPhiBins(abc.fHistoPhiBins), fHistoPhiMax(abc.fHistoPhiMax), fHistoPhiMin(abc.fHistoPhiMin),
87 fHistoEtaBins(abc.fHistoEtaBins), fHistoEtaMax(abc.fHistoEtaMax), fHistoEtaMin(abc.fHistoEtaMin),
88 fHistoMassBins(abc.fHistoMassBins), fHistoMassMax(abc.fHistoMassMax), fHistoMassMin(abc.fHistoMassMin),
89 fHistoAsymBins(abc.fHistoAsymBins), fHistoAsymMax(abc.fHistoAsymMax), fHistoAsymMin(abc.fHistoAsymMin)
95 //_________________________________________________________________________
96 AliAnaPartCorrBaseClass & AliAnaPartCorrBaseClass::operator = (const AliAnaPartCorrBaseClass & abc)
98 // assignment operator
100 if(this == &abc) return *this;
101 ((TObject *)this)->operator=(abc);
103 fDataMC = abc.fDataMC;
104 fDebug = abc.fDebug ;
105 fRecalculateCaloPID = abc.fRecalculateCaloPID ;
106 fCheckCaloPID = abc.fCheckCaloPID ;
107 fCheckFidCut = abc.fCheckFidCut ;
109 //delete fAODCaloClusters; fAODCaloClusters = new TClonesArray(*abc.fAODCaloClusters) ;
110 delete fAODCaloCells ; fAODCaloCells = new AliAODCaloCells(*abc.fAODCaloCells) ;
115 delete fCaloPID; fCaloPID = new AliCaloPID (*abc.fCaloPID);
116 delete fFidCut; fFidCut = new AliFiducialCut (*abc.fFidCut);
117 delete fMCUtils; fMCUtils = new AliMCAnalysisUtils(*abc.fMCUtils);
118 delete fIC; fIC = new AliIsolationCut (*abc.fIC);
119 delete fNMS; fNMS = new AliNeutralMesonSelection(*abc.fNMS);
120 delete fCaloUtils; fCaloUtils = new AliCalorimeterUtils(*abc.fCaloUtils);
121 delete fReader; fReader = new AliCaloTrackReader(*abc.fReader) ;
123 //fAnaOutContainer = abc.fAnaOutContainer;
125 delete fInputAODBranch; fInputAODBranch = new TClonesArray(*abc.fInputAODBranch) ;
126 fInputAODName = abc.fInputAODName;
127 delete fOutputAODBranch; fOutputAODBranch = new TClonesArray(*abc.fOutputAODBranch) ;
128 fNewAOD = abc.fNewAOD ;
129 fOutputAODName = abc.fOutputAODName;
130 fOutputAODClassName = abc.fOutputAODClassName;
131 fAddToHistogramsName = abc.fAddToHistogramsName;
132 fAODObjArrayName = abc.fAODObjArrayName;
134 fHistoPtBins = abc.fHistoPtBins; fHistoPtMax = abc.fHistoPtMax; fHistoPtMin = abc.fHistoPtMin;
135 fHistoPhiBins = abc.fHistoPhiBins; fHistoPhiMax = abc.fHistoPhiMax; fHistoPhiMin = abc.fHistoPhiMin;
136 fHistoEtaBins = abc.fHistoEtaBins; fHistoEtaMax = abc.fHistoEtaMax; fHistoEtaMin = abc.fHistoEtaMin;
142 //____________________________________________________________________________
143 AliAnaPartCorrBaseClass::~AliAnaPartCorrBaseClass()
145 // Remove all pointers except analysis output pointers.
146 //printf("---Delete analysis %s\n", fAODObjArrayName.Data());
147 // Not sure if it should be me who deletes the delta AOD branches.
148 // if(fOutputAODBranch){
149 // fOutputAODBranch->Clear() ;
150 // delete fOutputAODBranch ;
153 // if(fInputAODBranch){
154 // fInputAODBranch->Clear() ;
155 // delete fInputAODBranch ;
158 // if(fAODCaloClusters){
159 // fAODCaloClusters->Clear() ;
160 // delete fAODCaloClusters ;
164 fAODCaloCells->Clear() ;
165 delete fAODCaloCells ;
168 //Already deleted in maker
169 // if(fAnaOutContainer){
170 // fAnaOutContainer->Clear() ;
171 // delete fAnaOutContainer ;
174 //if(fCaloUtils) delete fCaloUtils ; //Already deleted in maker
175 //if(fReader) delete fReader ; //Already deleted in maker
177 if(fCaloPID) delete fCaloPID ;
178 if(fFidCut) delete fFidCut ;
180 if(fMCUtils) delete fMCUtils ;
181 if(fNMS) delete fNMS ;
182 // printf("--- analysis deleted \n");
185 ////____________________________________________________________________________
186 //void AliAnaPartCorrBaseClass::AddAODCaloCluster(AliAODCaloCluster calo) {
187 // //Put AOD calo cluster in the CaloClusters array
189 // Int_t i = fAODCaloClusters->GetEntriesFast();
190 // new((*fAODCaloClusters)[i]) AliAODCaloCluster(calo);
195 //____________________________________________________________________________
196 void AliAnaPartCorrBaseClass::AddAODParticle(AliAODPWG4Particle pc) {
197 //Put AOD calo cluster in the AODParticleCorrelation array
199 if(fOutputAODBranch){
201 Int_t i = fOutputAODBranch->GetEntriesFast();
202 //new((*fOutputAODBranch)[i]) AliAODPWG4Particle(pc);
203 if(strcmp(fOutputAODBranch->GetClass()->GetName(),"AliAODPWG4Particle")==0)
204 new((*fOutputAODBranch)[i]) AliAODPWG4Particle(pc);
205 else if(strcmp(fOutputAODBranch->GetClass()->GetName(),"AliAODPWG4ParticleCorrelation")==0)
206 new((*fOutputAODBranch)[i]) AliAODPWG4ParticleCorrelation(pc);
208 printf("AliAnaPartCorrBaseClass::AddAODParticle() - Cannot add an object of type < %s >, to the AOD TClonesArray \n",
209 fOutputAODBranch->GetClass()->GetName());
214 printf(" AliAnaPartCorrBaseClass::AddAODParticle() - No AOD branch available!!!\n");
221 //___________________________________________________
222 //void AliAnaPartCorrBaseClass::ConnectAODCaloClusters() {
223 // //Recover the list of AODCaloClusters
225 // fAODCaloClusters = fReader->GetOutputEvent()->GetCaloClusters();
229 //___________________________________________________
230 void AliAnaPartCorrBaseClass::ConnectAODPHOSCells() {
231 //Recover the list of PHOS AODCaloCells
233 fAODCaloCells = fReader->GetOutputEvent()->GetPHOSCells();
237 //___________________________________________________
238 void AliAnaPartCorrBaseClass::ConnectAODEMCALCells() {
239 //Recover the list of EMCAL AODCaloCells
241 fAODCaloCells = fReader->GetOutputEvent()->GetEMCALCells();
245 //___________________________________________________
246 TClonesArray * AliAnaPartCorrBaseClass::GetAODBranch(TString aodName) const {
247 //Recover ouput and input AOD pointers for each event in the maker
250 if(fDebug > 3) printf("AliAnaPartCorrBaseClass::GetAODBranch() - Get Input Branch with name: <%s>; \n",aodName.Data());
252 //Get the AOD handler, if output AOD is created use it, if not get the branches from the input which should be deltaAODs
253 AliAODHandler* aodHandler = 0x0;
254 Bool_t outAOD = kFALSE;
255 if((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler()) outAOD = kTRUE;
256 if(outAOD) aodHandler = (AliAODHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
257 else aodHandler = (AliAODHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
259 if (aodHandler->GetExtensions()) {
260 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject(GetReader()->GetDeltaAODFileName());
262 AliAODEvent *aodEvent = ext->GetAOD();
263 TClonesArray * aodbranch = (TClonesArray*) aodEvent->FindListObject(aodName);
264 if(aodbranch) return aodbranch;
266 if(outAOD) return (TClonesArray *) fReader->GetOutputEvent()->FindListObject(aodName);
267 else return (TClonesArray *) fReader->GetInputEvent() ->FindListObject(aodName);
270 else{//If no Delta AODs, kept in standard branch, to revise.
271 if(outAOD) return (TClonesArray *) fReader->GetOutputEvent()->FindListObject(aodName);
272 else return (TClonesArray *) fReader->GetInputEvent() ->FindListObject(aodName);
275 else{ //If no Delta AODs, kept in standard branch, to revise.
276 if(outAOD) return (TClonesArray *) fReader->GetOutputEvent()->FindListObject(aodName);
277 else return (TClonesArray *) fReader->GetInputEvent() ->FindListObject(aodName);
282 //___________________________________________________
283 void AliAnaPartCorrBaseClass::ConnectInputOutputAODBranches() {
284 //Recover ouput and input AOD pointers for each event in the maker
287 if(fDebug > 3) printf("AliAnaPartCorrBaseClass::ConnectInputOutputAODBranches() - Connect Input with name: <%s>; Connect output with name <%s>\n",fInputAODName.Data(),fOutputAODName.Data());
289 //Get the AOD handler, if output AOD is created use it, if not get the branches from the input which should be deltaAODs
290 AliAODHandler* aodHandler = 0x0;
291 Bool_t outAOD = kFALSE;
292 if((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler()) outAOD = kTRUE;
293 if(outAOD) aodHandler = (AliAODHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
294 else aodHandler = (AliAODHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
296 if (aodHandler->GetExtensions()) {
298 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject(GetReader()->GetDeltaAODFileName());
300 AliAODEvent *aodEvent = ext->GetAOD();
301 if(fNewAOD)fOutputAODBranch = (TClonesArray*) aodEvent->FindListObject(fOutputAODName);
302 fInputAODBranch = (TClonesArray*) aodEvent->FindListObject(fInputAODName);
303 if(!fOutputAODBranch && fNewAOD) fOutputAODBranch = (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fOutputAODName);
304 if(!fInputAODBranch) fInputAODBranch = (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fInputAODName);
306 else{//If no Delta AODs, kept in standard branch, to revise.
307 if(fNewAOD && fReader->GetOutputEvent()) {
308 fOutputAODBranch = (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fOutputAODName);
309 fInputAODBranch = (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fInputAODName);
312 fInputAODBranch = (TClonesArray *) fReader->GetInputEvent()->FindListObject(fInputAODName);
313 if(!fInputAODBranch && fReader->GetOutputEvent() )
314 fInputAODBranch = (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fInputAODName);//Try the output event.
318 else{ //If no Delta AODs, kept in standard branch
319 if(fNewAOD && fReader->GetOutputEvent()) {
320 fOutputAODBranch = (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fOutputAODName);
321 fInputAODBranch = (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fInputAODName);
324 fInputAODBranch = (TClonesArray *) fReader->GetInputEvent()->FindListObject(fInputAODName);
325 if(!fInputAODBranch && fReader->GetOutputEvent())
326 fInputAODBranch = (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fInputAODName);//Try the output event.
331 if(fNewAOD && !fOutputAODBranch)
332 printf(" AliAnaPartCorrBaseClass::ConnectInputOutputAODBranches() - Output Branch <%s>, not found!\n",fOutputAODName.Data());
333 if(!fNewAOD && !fInputAODBranch)
334 printf(" AliAnaPartCorrBaseClass::ConnectInputOutputAODBranches() - Input Branch <%s>, not found!\n",fInputAODName.Data());
338 //__________________________________________________
339 TObjArray * AliAnaPartCorrBaseClass::GetAODCTS() const {
340 //Get list of referenced tracks from reader
342 return fReader->GetAODCTS();
346 //__________________________________________________
347 TObjArray * AliAnaPartCorrBaseClass::GetAODPHOS() const {
348 //Get list of PHOS reference caloclusters from reader
350 return fReader->GetAODPHOS();
354 //__________________________________________________
355 TObjArray * AliAnaPartCorrBaseClass::GetAODEMCAL() const {
356 //Get list of emcal referenced caloclusters from reader
358 return fReader->GetAODEMCAL();
362 //__________________________________________________
363 TClonesArray * AliAnaPartCorrBaseClass::GetAODCaloClusters() const {
364 //Get list of all caloclusters in AOD output file
366 return fReader->GetOutputEvent()->GetCaloClusters();
370 //__________________________________________________
371 TClonesArray * AliAnaPartCorrBaseClass::GetAODTracks() const {
372 //Get list of all tracks in AOD output file
374 return fReader->GetOutputEvent()->GetTracks();
378 //__________________________________________________
379 TString AliAnaPartCorrBaseClass::GetBaseParametersList() {
380 //Put data member values in string to keep in output container
382 TString parList ; //this will be list of parameters used for this analysis.
384 sprintf(onePar,"--- AliAnaPartCorrBaseClass ---\n") ;
386 sprintf(onePar,"Minimal P_t: %2.2f ; Max\n", fMinPt) ;
388 sprintf(onePar,"Minimal P_t: %2.2f ; Max\n", fMaxPt) ;
390 sprintf(onePar,"fDataMC =%d (Check MC information, on/off) \n",fDataMC) ;
392 sprintf(onePar,"fCheckFidCut=%d (Check Fiducial cut selection on/off) \n",fCheckFidCut) ;
394 sprintf(onePar,"fCheckCaloPID =%d (Use Bayesian PID in calorimetes, on/off) \n",fCheckCaloPID) ;
396 sprintf(onePar,"fRecalculateCaloPID =%d (Calculate PID from shower/tof/tracking parameters, on/off) \n",fRecalculateCaloPID) ;
398 sprintf(onePar,"fInputAODName =%s Input AOD name \n",fInputAODName.Data()) ;
401 sprintf(onePar,"fOutputAODName =%s Output AOD name \n",fOutputAODName.Data()) ;
403 sprintf(onePar,"fOutputAODClassName =%s Output AOD class name \n",fOutputAODClassName.Data()) ;
406 sprintf(onePar,"fAODObjArrayName =%s Reference arrays in AOD name \n",fAODObjArrayName.Data()) ;
408 sprintf(onePar,"fAddToHistogramsName =%s String added to beginning of histograms name \n",fAddToHistogramsName.Data()) ;
415 //__________________________________________________
416 TClonesArray * AliAnaPartCorrBaseClass::GetCreateOutputAODBranch() {
417 //Create AOD branch filled in the analysis
419 printf("Create AOD branch of %s objects and with name < %s >\n",
420 fOutputAODClassName.Data(),fOutputAODName.Data()) ;
422 TClonesArray * aodBranch = new TClonesArray(fOutputAODClassName, 0);
423 aodBranch->SetName(fOutputAODName);
428 //__________________________________________________
429 TNamed * AliAnaPartCorrBaseClass::GetPHOSCells() const {
430 //Get list of PHOS calo cells (ESD or AOD) from reader
432 return fReader->GetPHOSCells();
437 //__________________________________________________
438 TNamed * AliAnaPartCorrBaseClass::GetEMCALCells() const {
439 //Get list of emcal calo cells (ESD or AOD) from reader
441 return fReader->GetEMCALCells();
445 //__________________________________________________
446 Int_t AliAnaPartCorrBaseClass::GetEventNumber() const {
447 //Get current event number
449 return fReader->GetEventNumber() ;
452 //__________________________________________________
453 AliStack * AliAnaPartCorrBaseClass::GetMCStack() const {
454 //Get stack pointer from reader
456 return fReader->GetStack();
459 //__________________________________________________
460 AliHeader * AliAnaPartCorrBaseClass::GetMCHeader() const {
461 //Get header pointer from reader
463 return fReader->GetHeader();
467 //__________________________________________________
468 AliGenEventHeader * AliAnaPartCorrBaseClass::GetMCGenEventHeader() const {
469 //Get GenEventHeader pointer from reader
471 return fReader->GetGenEventHeader();
475 //__________________________________________________
476 void AliAnaPartCorrBaseClass::InitParameters()
478 //Initialize the parameters of the analysis.
481 fCheckCaloPID = kTRUE ;
482 fCheckFidCut = kFALSE ;
483 fRecalculateCaloPID = kFALSE ;
484 fMinPt = 0.1 ; //Min pt in particle analysis
485 fMaxPt = 300. ; //Max pt in particle analysis
487 fReader = new AliCaloTrackReader();
488 fCaloUtils = new AliCalorimeterUtils();
489 fCaloPID = new AliCaloPID();
490 fFidCut = new AliFiducialCut();
491 fIC = new AliIsolationCut();
492 fMCUtils = new AliMCAnalysisUtils();
493 fNMS = new AliNeutralMesonSelection;
495 //fAnaOutContainer = new TList();
498 fOutputAODName = "PartCorr";
499 fOutputAODClassName = "AliAODPWG4Particle";
500 fInputAODName = "PartCorr";
501 fAddToHistogramsName = "";
502 fAODObjArrayName = "Ref";
509 fHistoPhiBins = 120 ;
510 fHistoPhiMax = TMath::TwoPi();
513 fHistoEtaBins = 100 ;
517 fHistoMassBins = 200;
521 fHistoAsymBins = 10 ;
527 //__________________________________________________________________
528 void AliAnaPartCorrBaseClass::Print(const Option_t * opt) const
530 //Print some relevant parameters set for the analysis
535 printf("New AOD: = %d\n",fNewAOD);
536 printf("Input AOD name: = %s\n",fInputAODName.Data());
537 printf("Output AOD name: = %s\n",fOutputAODName.Data());
538 printf("Output AOD Class name: = %s\n",fOutputAODClassName.Data());
539 printf("Min Photon pT = %2.2f\n", fMinPt) ;
540 printf("Max Photon pT = %3.2f\n", fMaxPt) ;
541 printf("Check PID = %d\n", fCheckCaloPID) ;
542 printf("Recalculate PID = %d\n", fRecalculateCaloPID) ;
543 printf("Check Fiducial cut = %d\n", fCheckFidCut) ;
544 printf("Check MC labels = %d\n", fDataMC);
545 printf("Debug Level = %d\n", fDebug);
546 printf("Histograms: %3.1f < pT < %3.1f, Nbin = %d\n", fHistoPtMin, fHistoPtMax, fHistoPtBins);
547 printf("Histograms: %3.1f < phi < %3.1f, Nbin = %d\n", fHistoPhiMin, fHistoPhiMax, fHistoPhiBins);
548 printf("Histograms: %3.1f < eta < %3.1f, Nbin = %d\n", fHistoEtaMin, fHistoEtaMax, fHistoEtaBins);
549 printf("Histograms: %3.1f < mass < %3.1f, Nbin = %d\n", fHistoMassMin, fHistoMassMax, fHistoMassBins);
550 printf("Histograms: %3.1f < asymmetry < %3.1f, Nbin = %d\n", fHistoAsymMin, fHistoAsymMax, fHistoAsymBins);
551 printf("Name of reference array : %s\n", fAODObjArrayName.Data());
552 printf("String added histograms name : %s\n",fAddToHistogramsName.Data());