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 **************************************************************************/
16 //_________________________________________________________________________
17 // Base class for CaloTrackCorr analysis algorithms
18 //-- Author: Gustavo Conesa (LNF-INFN, LPSC-Grenoble)
21 //_________________________________________________________________________
24 // --- ROOT system ---
25 #include <TClonesArray.h>
26 //#include <Riostream.h>
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"
43 ClassImp(AliAnaCaloTrackCorrBaseClass)
46 //__________________________________________________________
47 AliAnaCaloTrackCorrBaseClass::AliAnaCaloTrackCorrBaseClass() :
49 fDataMC(0), fDebug(0),
50 fCheckFidCut(0), fCheckRealCaloAcc(0),
51 fCheckCaloPID(0), fRecalculateCaloPID(0),
52 fMinPt(0), fMaxPt(0), fPairTimeCut(200),
53 fMultiBin(0), fNZvertBin(0),
54 fNrpBin(0), fNCentrBin(0),
55 fNmaxMixEv(0), fDoOwnMix(0),
57 fMaxMulti(0), fMinMulti(0),
58 fUseSelectEvent(kFALSE), fMakePlots(kFALSE),
59 fInputAODBranch(0x0), fInputAODName(""),
60 fOutputAODBranch(0x0), fNewAOD(kFALSE),
61 fOutputAODName(""), fOutputAODClassName(""),
62 fAODObjArrayName(""), fAddToHistogramsName(""),
63 fCaloPID(0x0), fCaloUtils(0x0),
64 fFidCut(0x0), fHisto(0x0),
65 fIC(0x0), fMCUtils(0x0),
66 fNMS(0x0), fReader(0x0)
70 //Initialize parameters
74 //___________________________________________________________
75 AliAnaCaloTrackCorrBaseClass::~AliAnaCaloTrackCorrBaseClass()
77 // Remove all pointers except analysis output pointers.
79 //delete fCaloUtils ; //Already deleted in maker
80 //delete fReader ; //Already deleted in maker
90 //______________________________________________________________________
91 void AliAnaCaloTrackCorrBaseClass::AddAODParticle(AliAODPWG4Particle pc)
93 //Put AOD calo cluster in the AODParticleCorrelation array
97 Int_t i = fOutputAODBranch->GetEntriesFast();
98 //new((*fOutputAODBranch)[i]) AliAODPWG4Particle(pc);
99 if(strcmp(fOutputAODBranch->GetClass()->GetName(),"AliAODPWG4Particle")==0)
100 new((*fOutputAODBranch)[i]) AliAODPWG4Particle(pc);
101 else if(strcmp(fOutputAODBranch->GetClass()->GetName(),"AliAODPWG4ParticleCorrelation")==0)
102 new((*fOutputAODBranch)[i]) AliAODPWG4ParticleCorrelation(pc);
104 printf("AliAnaCaloTrackCorrBaseClass::AddAODParticle() - Cannot add an object of type < %s >, to the AOD TClonesArray \n",
105 fOutputAODBranch->GetClass()->GetName());
110 printf(" AliAnaCaloTrackCorrBaseClass::AddAODParticle() - No AOD branch available!!!\n");
116 //__________________________________________________________________________________________
117 Int_t AliAnaCaloTrackCorrBaseClass::CheckMixedEventVertex(Int_t caloLabel, Int_t trackLabel)
119 // Check vertex in mixed events
121 if (!GetMixedEvent()) return 1; // Not mixed event continue normal processing
127 evt = GetMixedEvent()->EventIndexForCaloCluster(caloLabel) ;
129 else if(trackLabel >= 0 )
131 evt = GetMixedEvent()->EventIndex(trackLabel) ;
134 return 0; // go to next entry in the particle list
137 return 0 ; // to content coverity
139 if (TMath::Abs(GetVertex(evt)[2]) > GetZvertexCut()) return -1; // Vertex out of range process next event
141 return 1 ; // continue processing normally
145 //________________________________________________________________
146 void AliAnaCaloTrackCorrBaseClass::ConnectInputOutputAODBranches()
148 //Recover ouput and input AOD pointers for each event in the maker
151 if(fDebug > 3) printf("AliAnaCaloTrackCorrBaseClass::ConnectInputOutputAODBranches() - Connect Input with name: <%s>; Connect output with name <%s>\n",fInputAODName.Data(),fOutputAODName.Data());
153 //Get the AOD handler, if output AOD is created use it, if not get the branches from the input which should be deltaAODs
154 AliAODHandler* aodHandler = 0x0;
155 Bool_t outAOD = kFALSE;
156 if((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler()) outAOD = kTRUE;
157 if(outAOD) aodHandler = (AliAODHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
158 else aodHandler = (AliAODHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
160 if(!GetReader()->WriteDeltaAODToFile())
162 fOutputAODBranch = (TClonesArray *) (fReader->GetAODBranchList())->FindObject(fOutputAODName);
163 fInputAODBranch = (TClonesArray *) (fReader->GetAODBranchList())->FindObject(fInputAODName);
165 else if (aodHandler->GetExtensions()) {
167 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject(GetReader()->GetDeltaAODFileName());
169 AliAODEvent *aodEvent = ext->GetAOD();
170 if(fNewAOD)fOutputAODBranch = (TClonesArray*) aodEvent->FindListObject(fOutputAODName);
171 fInputAODBranch = (TClonesArray*) aodEvent->FindListObject(fInputAODName);
172 if(!fOutputAODBranch && fNewAOD) fOutputAODBranch = (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fOutputAODName);
173 if(!fInputAODBranch) fInputAODBranch = (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fInputAODName);
175 else{//If no Delta AODs, kept in standard branch, to revise.
176 if(fNewAOD && fReader->GetOutputEvent()) {
177 fOutputAODBranch = (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fOutputAODName);
178 fInputAODBranch = (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fInputAODName);
181 fInputAODBranch = (TClonesArray *) fReader->GetInputEvent()->FindListObject(fInputAODName);
182 if(!fInputAODBranch && fReader->GetOutputEvent() )
183 fInputAODBranch = (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fInputAODName);//Try the output event.
187 else{ //If no Delta AODs, kept in standard branch
188 if(fNewAOD && fReader->GetOutputEvent()) {
189 fOutputAODBranch = (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fOutputAODName);
190 fInputAODBranch = (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fInputAODName);
193 fInputAODBranch = (TClonesArray *) fReader->GetInputEvent()->FindListObject(fInputAODName);
194 if(!fInputAODBranch && fReader->GetOutputEvent())
195 fInputAODBranch = (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fInputAODName);//Try the output event.
200 if(fNewAOD && !fOutputAODBranch)
201 printf(" AliAnaCaloTrackCorrBaseClass::ConnectInputOutputAODBranches() - Output Branch <%s>, not found!\n",fOutputAODName.Data());
202 if(!fNewAOD && !fInputAODBranch)
203 printf(" AliAnaCaloTrackCorrBaseClass::ConnectInputOutputAODBranches() - Input Branch <%s>, not found!\n",fInputAODName.Data());
207 //_____________________________________________________________________________________
208 AliVCluster * AliAnaCaloTrackCorrBaseClass::FindCluster(TObjArray* clusters, Int_t id,
209 Int_t & iclus, Int_t first)
211 // Given the cluster ID stored in AliAODPWG4Particle, get the originator cluster and its index in the array
213 if(!clusters) return 0x0;
215 for(iclus = first; iclus < clusters->GetEntriesFast(); iclus++){
216 AliVCluster *cluster= dynamic_cast<AliVCluster*> (clusters->At(iclus));
218 if (cluster->GetID()==id) {
222 }// calorimeter clusters loop
228 //______________________________________________________________________________
229 TClonesArray * AliAnaCaloTrackCorrBaseClass::GetAODBranch(TString aodName) const
231 //Recover ouput and input AOD pointers for each event in the maker
234 if(fDebug > 3) printf("AliAnaCaloTrackCorrBaseClass::GetAODBranch() - Get Input Branch with name: <%s>; \n",aodName.Data());
236 //Get the AOD handler, if output AOD is created use it, if not get the branches from the input which should be deltaAODs
237 AliAODHandler* aodHandler = 0x0;
238 Bool_t outAOD = kFALSE;
239 if((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler()) outAOD = kTRUE;
240 if(outAOD) aodHandler = (AliAODHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
241 else aodHandler = (AliAODHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
243 if(!GetReader()->WriteDeltaAODToFile())
245 return (TClonesArray *) (fReader->GetAODBranchList())->FindObject(aodName);
247 else if (aodHandler->GetExtensions())
249 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject(GetReader()->GetDeltaAODFileName());
251 AliAODEvent *aodEvent = ext->GetAOD();
252 TClonesArray * aodbranch = (TClonesArray*) aodEvent->FindListObject(aodName);
253 if(aodbranch) return aodbranch;
255 if(outAOD) return (TClonesArray *) fReader->GetOutputEvent()->FindListObject(aodName);
256 else return (TClonesArray *) fReader->GetInputEvent() ->FindListObject(aodName);
259 else{//If no Delta AODs, kept in standard branch, to revise.
260 if(outAOD) return (TClonesArray *) fReader->GetOutputEvent()->FindListObject(aodName);
261 else return (TClonesArray *) fReader->GetInputEvent() ->FindListObject(aodName);
264 else{ //If no Delta AODs, kept in standard branch, to revise.
265 if(outAOD) return (TClonesArray *) fReader->GetOutputEvent()->FindListObject(aodName);
266 else return (TClonesArray *) fReader->GetInputEvent() ->FindListObject(aodName);
271 //_____________________________________________________________
272 TObjArray * AliAnaCaloTrackCorrBaseClass::GetCTSTracks() const
274 //Get list of referenced tracks from reader
276 return fReader->GetCTSTracks();
280 //________________________________________________________________
281 TObjArray * AliAnaCaloTrackCorrBaseClass::GetPHOSClusters() const
283 //Get list of PHOS reference caloclusters from reader
285 return fReader->GetPHOSClusters();
289 //_________________________________________________________________
290 TObjArray * AliAnaCaloTrackCorrBaseClass::GetEMCALClusters() const
292 //Get list of emcal referenced caloclusters from reader
294 return fReader->GetEMCALClusters();
298 //______________________________________________________________________
299 TClonesArray * AliAnaCaloTrackCorrBaseClass::GetAODCaloClusters() const
301 //Get list of all caloclusters in AOD output file
303 return fReader->GetOutputEvent()->GetCaloClusters();
307 //________________________________________________________________
308 TClonesArray * AliAnaCaloTrackCorrBaseClass::GetAODTracks() const
310 //Get list of all tracks in AOD output file
312 return fReader->GetOutputEvent()->GetTracks();
316 //____________________________________________________________
317 TString AliAnaCaloTrackCorrBaseClass::GetBaseParametersList()
319 //Put data member values in string to keep in output container
321 TString parList ; //this will be list of parameters used for this analysis.
322 const Int_t buffersize = 255;
323 char onePar[buffersize] ;
324 snprintf(onePar,buffersize,"--- AliAnaCaloTrackCorrBaseClass ---\n") ;
326 snprintf(onePar,buffersize,"Minimal P_t: %2.2f ; Max\n", fMinPt) ;
328 snprintf(onePar,buffersize,"Minimal P_t: %2.2f ; Max\n", fMaxPt) ;
330 snprintf(onePar,buffersize,"|t_{1}-t_{2}| < %2.2f ; Max\n", fPairTimeCut) ;
332 snprintf(onePar,buffersize,"fDataMC =%d (Check MC information, on/off) \n",fDataMC) ;
334 snprintf(onePar,buffersize,"fCheckFidCut=%d (Check Fiducial cut selection on/off) \n",fCheckFidCut) ;
336 snprintf(onePar,buffersize,"fCheckRealCaloAcc=%d (Check Real Calo Acceptance on/off) \n",fCheckRealCaloAcc) ;
338 snprintf(onePar,buffersize,"fCheckCaloPID =%d (Use Bayesian PID in calorimetes, on/off) \n",fCheckCaloPID) ;
340 snprintf(onePar,buffersize,"fRecalculateCaloPID =%d (Calculate PID from shower/tof/tracking parameters, on/off) \n",fRecalculateCaloPID) ;
342 snprintf(onePar,buffersize,"fInputAODName =%s Input AOD name \n",fInputAODName.Data()) ;
345 snprintf(onePar,buffersize,"fOutputAODName =%s Output AOD name \n",fOutputAODName.Data()) ;
347 snprintf(onePar,buffersize,"fOutputAODClassName =%s Output AOD class name \n",fOutputAODClassName.Data()) ;
350 snprintf(onePar,buffersize,"fAODObjArrayName =%s Reference arrays in AOD name \n",fAODObjArrayName.Data()) ;
352 snprintf(onePar,buffersize,"fAddToHistogramsName =%s String added to beginning of histograms name \n",fAddToHistogramsName.Data()) ;
359 //_____________________________________________________________________
360 TClonesArray * AliAnaCaloTrackCorrBaseClass::GetCreateOutputAODBranch()
362 //Create AOD branch filled in the analysis
364 printf("Create AOD branch of %s objects and with name < %s >\n",
365 fOutputAODClassName.Data(),fOutputAODName.Data()) ;
367 TClonesArray * aodBranch = new TClonesArray(fOutputAODClassName, 0);
368 aodBranch->SetName(fOutputAODName);
373 //________________________________________________________
374 Int_t AliAnaCaloTrackCorrBaseClass::GetEventNumber() const
376 //Get current event number
378 return fReader->GetEventNumber() ;
383 //__________________________________________________________
384 AliStack * AliAnaCaloTrackCorrBaseClass::GetMCStack() const
386 //Get stack pointer from reader
388 return fReader->GetStack();
391 //____________________________________________________________
392 AliHeader * AliAnaCaloTrackCorrBaseClass::GetMCHeader() const
394 //Get header pointer from reader
396 return fReader->GetHeader();
400 //____________________________________________________________________________
401 AliGenEventHeader * AliAnaCaloTrackCorrBaseClass::GetMCGenEventHeader() const
403 //Get GenEventHeader pointer from reader
405 return fReader->GetGenEventHeader();
410 //________________________________________________________________
411 Int_t AliAnaCaloTrackCorrBaseClass::GetEventCentralityBin() const
413 // Define the centrality bin for mixing
414 // In pp collisions analysis hardcoded track multiplicities
416 Int_t curCentrBin = 0;
418 if(fUseTrackMultBins) // pp collisions
419 { // Track multiplicity bins
420 //curCentrBin = (GetTrackMultiplicity()-1)/5;
421 //if(curCentrBin > GetNCentrBin()-1) curCentrBin=GetNCentrBin()-1;
422 Int_t trackMult = GetReader()->GetTrackMultiplicity();
425 else if(trackMult<=10)
427 else if(trackMult<=15)
429 else if(trackMult<=20)
431 else if(trackMult<=30)
433 else if(trackMult<=40)
435 else if(trackMult<=55)
437 else if(trackMult<=70)
441 else // Set centrality based on centrality task, PbPb collisions
443 Float_t minCent = GetReader()->GetCentralityBin(0);
444 Float_t maxCent = GetReader()->GetCentralityBin(1);
446 if((minCent< 0 && maxCent< 0) || minCent>=maxCent)
448 curCentrBin = GetEventCentrality() * GetNCentrBin() / GetReader()->GetCentralityOpt();
449 if(curCentrBin==GetNCentrBin())
451 curCentrBin = GetNCentrBin()-1;
452 printf("AliAnaCaloTrackCorrBaseClass::GetEventCentralityBin() - Centrality = %d, put it in last bin \n",GetEventCentrality());
457 curCentrBin = (Int_t)((GetEventCentrality()-minCent) * GetNCentrBin() / (maxCent-minCent));
458 if(curCentrBin==GetNCentrBin()) curCentrBin = GetNCentrBin()-1;
462 printf("AliAnaCaloTrackCorrBaseClass::GetEventCentralityBin() - %d, centrality %d, n bins %d, max bin from centrality %d\n",
463 curCentrBin, GetEventCentrality(), GetNCentrBin(), GetReader()->GetCentralityOpt());
470 //_______________________________________________________
471 Int_t AliAnaCaloTrackCorrBaseClass::GetEventRPBin() const
477 if(GetNRPBin() > 1 && GetEventPlane())
479 Float_t epAngle = GetEventPlaneAngle();//->GetEventplane(GetEventPlaneMethod(),fReader->GetInputEvent());
481 if(epAngle < 0 || epAngle >TMath::Pi())
483 printf("AliAnaCaloTrackCorrBaseClass::GetEventRPBin() - Wrong event plane angle : %f \n",epAngle);
487 curRPBin = TMath::Nint(epAngle*(GetNRPBin()-1)/TMath::Pi());
488 if(curRPBin >= GetNRPBin()) printf("RP Bin %d out of range %d\n",curRPBin,GetNRPBin());
491 printf("AliAnaCaloTrackCorrBaseClass::GetEventRPBin() - %d, bin float %f, angle %f, n bins %d\n",
492 curRPBin,epAngle*(GetNRPBin()-1)/TMath::Pi(),epAngle,GetNRPBin());
499 //_______________________________________________________
500 Int_t AliAnaCaloTrackCorrBaseClass::GetEventVzBin() const
502 // Return Vz bin, divide vertex in GetNZvertBin() bins,
503 // depending on the vertex cut
505 Double_t v[3] = {0,0,0}; //vertex
506 GetReader()->GetVertex(v);
508 Int_t curZvertBin = (Int_t)(0.5*GetNZvertBin()*(v[2]+GetZvertexCut())/GetZvertexCut());
511 printf("AliAnaCaloTrackCorrBaseClass::GetEventVzBin() - %d, vz %2.2f, n bins %d \n",
512 curZvertBin, v[2], GetNZvertBin());
517 //________________________________________________________________________________________
518 Int_t AliAnaCaloTrackCorrBaseClass::GetEventMixBin(Int_t iCen, Int_t iVz, Int_t iRP) const
520 // Event mixing bin, combination of vz, centrality and reaction plane bins
522 if(iCen<0 || iVz < 0 || iRP < 0)
525 return iCen*GetNZvertBin()*GetNRPBin()+iVz*GetNRPBin()+iRP;
528 //________________________________________________________
529 Int_t AliAnaCaloTrackCorrBaseClass::GetEventMixBin() const
531 // Event mixing bin, combination of vz, centrality and reaction plane bins
534 Int_t iVz = GetEventVzBin();
536 // centrality (PbPb) or tracks multiplicity (pp) bin
537 Int_t iCen = GetEventCentralityBin();
539 // reaction plane bin (PbPb)
540 Int_t iRP = GetEventRPBin();
542 Int_t eventBin = GetEventMixBin(iCen, iVz, iRP);
545 printf("AliAnaCaloTrackCorrBaseClass::GetEventMixBin() - Bins : cent %d, vz %d, RP %d, event %d/%d\n",
546 iCen,iVz, iRP, eventBin, GetNZvertBin()*GetNRPBin()*GetNCentrBin());
552 //_________________________________________________
553 void AliAnaCaloTrackCorrBaseClass::InitParameters()
555 //Initialize the parameters of the analysis.
558 fCheckCaloPID = kTRUE ;
559 fCheckFidCut = kFALSE ;
560 fCheckRealCaloAcc = kFALSE ;
561 fRecalculateCaloPID = kFALSE ;
562 fMinPt = 0.2 ; //Min pt in particle analysis
563 fMaxPt = 300. ; //Max pt in particle analysis
569 fUseSelectEvent = kFALSE ;
571 //fReader = new AliCaloTrackReader(); //Initialized in maker
572 //fCaloUtils = new AliCalorimeterUtils();//Initialized in maker
575 fOutputAODName = "CaloTrackCorr";
576 fOutputAODClassName = "AliAODPWG4Particle";
577 fInputAODName = "CaloTrackCorr";
578 fAddToHistogramsName = "";
579 fAODObjArrayName = "Ref";
583 //__________________________________________________________________
584 void AliAnaCaloTrackCorrBaseClass::Print(const Option_t * opt) const
586 //Print some relevant parameters set for the analysis
591 printf("New AOD: = %d\n", fNewAOD);
592 printf("Input AOD name: = %s\n", fInputAODName.Data());
593 printf("Output AOD name: = %s\n", fOutputAODName.Data());
594 printf("Output AOD Class name: = %s\n", fOutputAODClassName.Data());
595 printf("Name of reference array : %s\n", fAODObjArrayName.Data());
596 printf("String added histograms name : %s\n", fAddToHistogramsName.Data());
598 printf("Min Photon pT = %2.2f\n", fMinPt) ;
599 printf("Max Photon pT = %3.2f\n", fMaxPt) ;
600 printf("Check PID = %d\n", fCheckCaloPID) ;
601 printf("Recalculate PID = %d\n", fRecalculateCaloPID) ;
602 printf("Check Fiducial cut = %d\n", fCheckFidCut) ;
603 printf("Check Real Calo Acc = %d\n", fCheckRealCaloAcc) ;
604 printf("Check MC labels = %d\n", fDataMC);
605 printf("Make plots? = %d\n", fMakePlots);
606 printf("Debug Level = %d\n", fDebug);