1 #ifndef ALIDIELECTRON_H
2 #define ALIDIELECTRON_H
3 /* Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
4 * See cxx source for full Copyright notice */
6 //#####################################################
8 //# Class AliDielectron #
9 //# Main Class for e+e- analysis #
11 //# by WooJin J. Park, GSI / W.J.Park@gsi.de #
12 //# Ionut C. Arsene, GSI / I.C.Arsene@gsi.de #
13 //# Magnus Mager, CERN / Magnus.Mager@cern.ch #
14 //# Jens Wiechula, Uni HD / Jens.Wiechula@cern.ch #
16 //#####################################################
20 #include <TObjArray.h>
23 #include <AliAnalysisFilter.h>
24 #include <AliKFParticle.h>
26 #include "AliDielectronHistos.h"
27 #include "AliDielectronHF.h"
28 #include "AliDielectronCutQA.h"
34 class AliDielectronCF;
35 class AliDielectronDebugTree;
36 class AliDielectronTrackRotator;
37 class AliDielectronPair;
38 class AliDielectronSignalMC;
39 class AliDielectronMixingHandler;
41 //________________________________________________________________
42 class AliDielectron : public TNamed {
44 friend class AliDielectronMixingHandler; //mixing as friend class
47 enum EPairType { kEv1PP=0, kEv1PM, kEv1MM,
48 kEv1PEv2P, kEv1MEv2P, kEv2PP,
49 kEv1PEv2M, kEv1MEv2M, kEv2PM,
51 enum ELegType { kEv1P, kEv1M, kEv2P, kEv2M };
54 AliDielectron(const char* name, const char* title);
55 virtual ~AliDielectron();
59 void Process(AliVEvent *ev1, AliVEvent *ev2=0);
61 const AliAnalysisFilter& GetEventFilter() const { return fEventFilter; }
62 const AliAnalysisFilter& GetTrackFilter() const { return fTrackFilter; }
63 const AliAnalysisFilter& GetPairFilter() const { return fPairFilter; }
65 AliAnalysisFilter& GetEventFilter() { return fEventFilter; }
66 AliAnalysisFilter& GetTrackFilter() { return fTrackFilter; }
67 AliAnalysisFilter& GetPairFilter() { return fPairFilter; }
68 AliAnalysisFilter& GetPairPreFilter() { return fPairPreFilter; }
69 AliAnalysisFilter& GetPairPreFilterLegs() { return fPairPreFilterLegs; }
70 AliAnalysisFilter& GetEventPlanePreFilter(){ return fEventPlanePreFilter; }
71 AliAnalysisFilter& GetEventPlanePOIPreFilter(){ return fEventPlanePOIPreFilter; }
73 void SetMotherPdg( Int_t pdgMother ) { fPdgMother=pdgMother; }
74 void SetLegPdg(Int_t pdgLeg1, Int_t pdgLeg2) { fPdgLeg1=pdgLeg1; fPdgLeg2=pdgLeg2; }
75 Int_t GetMotherPdg() const { return fPdgMother; }
76 Int_t GetLeg1Pdg() const { return fPdgLeg1; }
77 Int_t GetLeg2Pdg() const { return fPdgLeg2; }
79 void SetCutQA(Bool_t qa=kTRUE) { fCutQA=qa; }
80 void SetNoPairing(Bool_t noPairing=kTRUE) { fNoPairing=noPairing; }
81 void SetProcessLS(Bool_t doLS=kTRUE) { fProcessLS=doLS; }
82 void SetUseKF(Bool_t useKF=kTRUE) { fUseKF=useKF; }
83 const TObjArray* GetTrackArray(Int_t i) const {return (i>=0&&i<4)?&fTracks[i]:0;}
84 const TObjArray* GetPairArray(Int_t i) const {return (i>=0&&i<11)?
85 static_cast<TObjArray*>(fPairCandidates->UncheckedAt(i)):0;}
87 TObjArray** GetPairArraysPointer() { return &fPairCandidates; }
88 void SetHistogramArray(AliDielectronHF * const histoarray) { fHistoArray=histoarray; }
89 const TObjArray * GetHistogramArray() const { return fHistoArray?fHistoArray->GetHistArray():0x0; }
90 const TObjArray * GetQAHistArray() const { return fQAmonitor?fQAmonitor->GetQAHistArray():0x0; }
92 void SetHistogramManager(AliDielectronHistos * const histos) { fHistos=histos; }
93 AliDielectronHistos* GetHistoManager() const { return fHistos; }
94 const THashList * GetHistogramList() const { return fHistos?fHistos->GetHistogramList():0x0; }
96 Bool_t HasCandidates() const { return GetPairArray(1)?GetPairArray(1)->GetEntriesFast()>0:0; }
97 Bool_t HasCandidatesLikeSign() const {
98 return (GetPairArray(0)&&GetPairArray(2)) ? (GetPairArray(0)->GetEntriesFast()>0 || GetPairArray(2)->GetEntriesFast()>0) : 0;
101 Bool_t HasCandidatesTR() const {return GetPairArray(10)?GetPairArray(10)->GetEntriesFast()>0:0;}
102 void SetCFManagerPair(AliDielectronCF * const cf) { fCfManagerPair=cf; }
103 AliDielectronCF* GetCFManagerPair() const { return fCfManagerPair; }
105 void SetPreFilterEventPlane(Bool_t setValue=kTRUE){fPreFilterEventPlane=setValue;};
106 void SetLikeSignSubEvents(Bool_t setValue=kTRUE){fLikeSignSubEvents=setValue;};
107 void SetPreFilterUnlikeOnly(Bool_t setValue=kTRUE){fPreFilterUnlikeOnly=setValue;};
108 void SetPreFilterAllSigns(Bool_t setValue=kTRUE){fPreFilterAllSigns=setValue;};
110 void SetTrackRotator(AliDielectronTrackRotator * const rot) { fTrackRotator=rot; }
111 AliDielectronTrackRotator* GetTrackRotator() const { return fTrackRotator; }
113 void SetMixingHandler(AliDielectronMixingHandler *mix) { fMixing=mix; }
114 AliDielectronMixingHandler* GetMixingHandler() const { return fMixing; }
116 void SetHasMC(Bool_t hasMC) { fHasMC = hasMC; }
117 Bool_t GetHasMC() const { return fHasMC; }
119 void SetStoreRotatedPairs(Bool_t storeTR) {fStoreRotatedPairs = storeTR;}
120 void SetDontClearArrays(Bool_t dontClearArrays=kTRUE) { fDontClearArrays=dontClearArrays; }
122 void AddSignalMC(AliDielectronSignalMC* signal);
124 void SetDebugTree(AliDielectronDebugTree * const tree) { fDebugTree=tree; }
126 const TObjArray* GetMCSignals() const { return fSignalsMC; }
127 static const char* TrackClassName(Int_t i) { return (i>=0&&i<4)?fgkTrackClassNames[i]:""; }
128 static const char* PairClassName(Int_t i) { return (i>=0&&i<11)?fgkPairClassNames[i]:""; }
130 void SetEstimatorFilename(const Char_t* filename) {fEstimatorFilename = filename;}
131 void SetTRDcorrectionFilename(const Char_t* filename) {fTRDpidCorrectionFilename = filename;}
132 void SetVZEROCalibrationFilename(const Char_t* filename) {fVZEROCalibrationFilename = filename;}
133 void SetVZERORecenteringFilename(const Char_t* filename) {fVZERORecenteringFilename = filename;}
134 void SetZDCRecenteringFilename(const Char_t* filename) {fZDCRecenteringFilename = filename;}
135 void InitLegEffMap(TString filename) { fLegEffMap=InitEffMap(filename) ;}
136 void InitPairEffMap(TString filename) { fPairEffMap=InitEffMap(filename) ;}
138 void SetCentroidCorrFunction(TF1 *fun, UInt_t varx, UInt_t vary=0, UInt_t varz=0);
139 void SetWidthCorrFunction(TF1 *fun, UInt_t varx, UInt_t vary=0, UInt_t varz=0);
141 void SaveDebugTree();
145 Bool_t fCutQA; // monitor cuts
146 AliDielectronCutQA *fQAmonitor; // monitoring of cuts
147 TH1 *fPostPIDCntrdCorr; // post pid correction object for centroids
148 TH1 *fPostPIDWdthCorr; // post pid correction object for widths
149 THnBase *fLegEffMap; // single electron efficiency map
150 THnBase *fPairEffMap; // pair efficiency map
151 AliAnalysisFilter fEventFilter; // Event cuts
152 AliAnalysisFilter fTrackFilter; // leg cuts
153 AliAnalysisFilter fPairPreFilter; // pair prefilter cuts
154 AliAnalysisFilter fPairPreFilterLegs; // Leg filter after the pair prefilter cuts
155 AliAnalysisFilter fPairFilter; // pair cuts
156 AliAnalysisFilter fEventPlanePreFilter; // event plane prefilter cuts
157 AliAnalysisFilter fEventPlanePOIPreFilter; // PoI cuts in the event plane prefilter
159 Int_t fPdgMother; // pdg code of mother tracks
160 Int_t fPdgLeg1; // pdg code leg1
161 Int_t fPdgLeg2; // pdg code leg2
163 TObjArray* fSignalsMC; // array of AliDielectronSignalMC
165 Bool_t fNoPairing; // if to skip pairing, can be used for track QA only
166 Bool_t fProcessLS; // do the like-sign pairing (default kTRUE)
167 Bool_t fUseKF; // if to skip pairing, can be used for track QA only
169 AliDielectronHF *fHistoArray; // Histogram framework
170 AliDielectronHistos *fHistos; // Histogram manager
171 // Streaming and merging should be handled
172 // by the analysis framework
174 TObjArray fTracks[4]; //! Selected track candidates
175 // 0: Event1, positive particles
176 // 1: Event1, negative particles
177 // 2: Event2, positive particles
178 // 3: Event2, negative particles
180 TObjArray *fPairCandidates; //! Pair candidate arrays
181 //TODO: better way to store it? TClonesArray?
183 AliDielectronCF *fCfManagerPair;//Correction Framework Manager for the Pair
184 AliDielectronTrackRotator *fTrackRotator; //Track rotator
185 AliDielectronDebugTree *fDebugTree; // Debug tree output
186 AliDielectronMixingHandler *fMixing; // handler for event mixing
188 Bool_t fPreFilterEventPlane; //Filter for the Eventplane determination in TPC
189 Bool_t fLikeSignSubEvents; //Option for dividing into subevents, sub1 ++ sub2 --
190 Bool_t fPreFilterUnlikeOnly; //Apply PreFilter either in +- or to ++/--/+- individually
191 Bool_t fPreFilterAllSigns; //Apply PreFilter find in ++/--/+- and remove from all
192 Bool_t fHasMC; //If we run with MC, at the moment only needed in AOD
193 Bool_t fStoreRotatedPairs; //It the rotated pairs should be stored in the pair array
194 Bool_t fDontClearArrays; //Don't clear the arrays at the end of the Process function, needed for external use of pair and tracks
196 void FillTrackArrays(AliVEvent * const ev, Int_t eventNr=0);
197 void EventPlanePreFilter(Int_t arr1, Int_t arr2, TObjArray arrTracks1, TObjArray arrTracks2, const AliVEvent *ev);
198 void PairPreFilter(Int_t arr1, Int_t arr2, TObjArray &arrTracks1, TObjArray &arrTracks2);
199 void FillPairArrays(Int_t arr1, Int_t arr2);
200 void FillPairArrayTR();
202 Int_t GetPairIndex(Int_t arr1, Int_t arr2) const {return arr1>=arr2?arr1*(arr1+1)/2+arr2:arr2*(arr2+1)/2+arr1;}
204 void InitPairCandidateArrays();
207 TObjArray* PairArray(Int_t i);
208 THnBase* InitEffMap(TString filename);
210 static const char* fgkTrackClassNames[4]; //Names for track arrays
211 static const char* fgkPairClassNames[11]; //Names for pair arrays
213 TString fEstimatorFilename; // name for the pp multiplicity estimators filename
214 TString fTRDpidCorrectionFilename; // name for the file containing the single particle TRD pid corrections
215 TString fVZEROCalibrationFilename; // file containing VZERO channel-by-channel calibration
216 TString fVZERORecenteringFilename; // file containing VZERO Q-vector recentering averages
217 TString fZDCRecenteringFilename; // file containing ZDCQ-vector recentering averages
219 void ProcessMC(AliVEvent *ev1);
221 void FillHistograms(const AliVEvent *ev, Bool_t pairInfoOnly=kFALSE);
222 void FillMCHistograms(const AliVEvent *ev);
223 void FillMCHistograms(Int_t label1, Int_t label2, Int_t nSignal);
224 void FillHistogramsMC(const AliMCEvent *ev, AliVEvent *ev1);
225 void FillHistogramsPair(AliDielectronPair *pair,Bool_t fromPreFilter=kFALSE);
226 void FillHistogramsTracks(TObjArray **tracks);
228 void FillDebugTree();
230 AliDielectron(const AliDielectron &c);
231 AliDielectron &operator=(const AliDielectron &c);
233 ClassDef(AliDielectron,11);
236 inline void AliDielectron::InitPairCandidateArrays()
239 // initialise all pair candidate arrays
241 fPairCandidates->SetOwner();
242 for (Int_t i=0;i<11;++i){
243 TObjArray *arr=new TObjArray;
244 fPairCandidates->AddAt(arr,i);
249 inline TObjArray* AliDielectron::PairArray(Int_t i)
252 // for internal use only: unchecked return of track array for fast access
254 return static_cast<TObjArray*>(fPairCandidates->UncheckedAt(i));
257 inline void AliDielectron::ClearArrays()
262 for (Int_t i=0;i<4;++i){
265 for (Int_t i=0;i<11;++i){
266 if (PairArray(i)) PairArray(i)->Delete();