1 #ifndef ALIDNDPTANALYSISPPB_H
2 #define ALIDNDPTANALYSISPPB_H
4 //------------------------------------------------------------------------------
5 // AlidNdPtAnalysispPb class used for dNdPt analysis in p-Pb collisions
6 // based on AlidNdPtAnalysis class
8 // Author: J.Otwinowski 04/11/2008
9 // last change: 2013-02-05 by M.Knichel
10 //------------------------------------------------------------------------------
22 class AliESDtrackCuts;
23 class AliVertexerTracks;
26 class AliESDfriendTrack;
30 #include "TObjString.h"
32 class AlidNdPtAnalysispPb : public AlidNdPt {
34 AlidNdPtAnalysispPb();
35 AlidNdPtAnalysispPb(Char_t* name, Char_t* title);
36 ~AlidNdPtAnalysispPb();
42 virtual void Process(AliESDEvent *const esdEvent=0, AliMCEvent *const mcEvent=0);
44 // Merge output objects (needed by PROOF)
45 virtual Long64_t Merge(TCollection* const list);
47 // Analyse output histograms
48 virtual void Analyse();
50 // Export objects to folder
51 virtual TFolder *ExportToFolder(TObjArray * const array=0);
53 // Get analysis folder
54 TFolder* GetAnalysisFolder() const {return fAnalysisFolder;}
56 // Fill control histograms
57 void SetHistogramsOn(const Bool_t histOn=kTRUE) {fHistogramsOn = histOn;}
58 Bool_t IsHistogramsOn() const {return fHistogramsOn;}
60 // Define 0-multiplicity bin for LHC
61 // background calculation
62 static Bool_t IsBinZeroSPDvtx(const AliESDEvent* esdEvent);
63 static Bool_t IsBinZeroTrackSPDvtx(const AliESDEvent* esdEvent);
65 // Create folder for analysed histograms
66 TFolder *CreateFolder(TString folder = "folderdNdPtAnalysis",TString title = "Analysed dNdPt histograms");
68 // Set binning for Histograms (if not set default binning is used)
69 void SetBinsMult(Int_t nbins, Double_t* edges) { if (CanChangeBins()) { fMultNbins = nbins; fBinsMult = CloneArray(fMultNedges = nbins+1,edges); } }
70 void SetBinsPt(Int_t nbins, Double_t* edges) { if (CanChangeBins()) { fPtNbins = nbins; fBinsPt = CloneArray(fPtNedges = nbins+1,edges); } }
71 void SetBinsPtCorr(Int_t nbins, Double_t* edges) { if (CanChangeBins()) { fPtCorrNbins = nbins; fBinsPtCorr = CloneArray(fPtCorrNedges = nbins+1,edges); } }
72 void SetBinsEta(Int_t nbins, Double_t* edges) { if (CanChangeBins()) { fEtaNbins = nbins; fBinsEta = CloneArray(fEtaNedges = nbins+1,edges); } }
73 void SetBinsZv(Int_t nbins, Double_t* edges) { if (CanChangeBins()) { fZvNbins = nbins; fBinsZv = CloneArray(fZvNedges = nbins+1,edges); } }
76 void FillHistograms(AliESDtrack *const esdTrack, AliStack *const stack, const Double_t zv, AlidNdPtHelper::TrackObject trackObj, Int_t multMB);
77 void FillHistograms(AliStack *const stack, Int_t label, AlidNdPtHelper::TrackObject trackObj);
78 void FillHistograms(TObjArray *const allChargedTracks,Int_t *const labelsAll,Int_t multAll,Int_t *const labelsAcc,Int_t multAcc,Int_t *const labelsRec,Int_t multRec);
81 THnSparseF *GetEventMultCorrelationMatrix() const {return fEventMultCorrelationMatrix;}
82 THnSparseF *GetTrackPtCorrelationMatrix() const {return fTrackPtCorrelationMatrix;}
84 //NOTE: for now in p-Pb ND and NSD are the same, DD is empty!
85 //kNSD would have to be added to PWG0Helper, now kND is used to signal NSD!
86 THnSparseF *GetGenEventMatrix() const {return fGenEventMatrix;}
87 THnSparseF *GetGenSDEventMatrix() const {return fGenSDEventMatrix;}
88 THnSparseF *GetGenDDEventMatrix() const {return fGenDDEventMatrix;}
89 THnSparseF *GetGenNDEventMatrix() const {return fGenNDEventMatrix;}
90 THnSparseF *GetGenNSDEventMatrix() const {return fGenNSDEventMatrix;}
92 //NOTE: for now in p-Pb ND and NSD are the same, DD is empty!
93 THnSparseF *GetTriggerEventMatrix() const {return fTriggerEventMatrix;}
94 THnSparseF *GetTriggerSDEventMatrix() const {return fTriggerSDEventMatrix;}
95 THnSparseF *GetTriggerDDEventMatrix() const {return fTriggerDDEventMatrix;}
96 THnSparseF *GetTriggerNDEventMatrix() const {return fTriggerNDEventMatrix;}
97 THnSparseF *GetTriggerNSDEventMatrix() const {return fTriggerNSDEventMatrix;}
99 //NOTE: for now in p-Pb ND and NSD are the same, DD is empty!
100 THnSparseF *GetRecEventMatrix() const {return fRecEventMatrix;}
101 THnSparseF *GetRecSDEventMatrix() const {return fRecSDEventMatrix;}
102 THnSparseF *GetRecDDEventMatrix() const {return fRecDDEventMatrix;}
103 THnSparseF *GetRecNDEventMatrix() const {return fRecNDEventMatrix;}
104 THnSparseF *GetRecNSDEventMatrix() const {return fRecNSDEventMatrix;}
107 THnSparseF *GetRecCandleEventMatrix() const {return fRecCandleEventMatrix;}
109 //NOTE: for now in p-Pb ND and NSD are the same, DD is empty!
110 THnSparseF *GetGenTrackEventMatrix() const {return fGenTrackEventMatrix;}
111 THnSparseF *GetGenTrackSDEventMatrix() const {return fGenTrackSDEventMatrix;}
112 THnSparseF *GetGenTrackDDEventMatrix() const {return fGenTrackDDEventMatrix;}
113 THnSparseF *GetGenTrackNDEventMatrix() const {return fGenTrackNDEventMatrix;}
114 THnSparseF *GetGenTrackNSDEventMatrix() const {return fGenTrackNSDEventMatrix;}
116 //NOTE: for now in p-Pb ND and NSD are the same, DD is empty!
117 THnSparseF *GetTriggerTrackEventMatrix() const {return fTriggerTrackEventMatrix;}
118 THnSparseF *GetTriggerTrackSDEventMatrix() const {return fTriggerTrackSDEventMatrix;}
119 THnSparseF *GetTriggerTrackDDEventMatrix() const {return fTriggerTrackDDEventMatrix;}
120 THnSparseF *GetTriggerTrackNDEventMatrix() const {return fTriggerTrackNDEventMatrix;}
121 THnSparseF *GetTriggerTrackNSDEventMatrix() const {return fTriggerTrackNSDEventMatrix;}
123 //NOTE: for now in p-Pb ND and NSD are the same, DD is empty!
124 THnSparseF *GetRecTrackEventMatrix() const {return fRecTrackEventMatrix;}
125 THnSparseF *GetRecTrackSDEventMatrix() const {return fRecTrackSDEventMatrix;}
126 THnSparseF *GetRecTrackDDEventMatrix() const {return fRecTrackDDEventMatrix;}
127 THnSparseF *GetRecTrackNDEventMatrix() const {return fRecTrackNDEventMatrix;}
128 THnSparseF *GetRecTrackNSDEventMatrix() const {return fRecTrackNSDEventMatrix;}
131 THnSparseF *GetGenTrackMatrix() const {return fGenTrackMatrix;}
132 THnSparseF *GetGenPrimTrackMatrix() const {return fGenPrimTrackMatrix;}
133 THnSparseF *GetRecPrimTrackMatrix() const {return fRecPrimTrackMatrix;}
135 THnSparseF *GetRecTrackMatrix() const {return fRecTrackMatrix;}
136 THnSparseF *GetRecSecTrackMatrix() const {return fRecSecTrackMatrix;}
137 THnSparseF *GetRecMultTrackMatrix() const {return fRecMultTrackMatrix;}
140 // control histograms
142 THnSparseF *GetMCEventHist1() const {return fMCEventHist1;}
143 THnSparseF *GetRecEventHist1() const {return fRecEventHist1;}
144 THnSparseF *GetRecEventHist2() const {return fRecEventHist2;}
145 THnSparseF *GetRecMCEventHist1() const {return fRecMCEventHist1;}
146 THnSparseF *GetRecMCEventHist2() const {return fRecMCEventHist2;}
147 THnSparseF *GetRecMCEventHist3() const {return fRecMCEventHist3;}
149 THnSparseF *GetMCTrackHist1(Int_t i) const {return fMCTrackHist1[i];}
150 THnSparseF *GetMCPrimTrackHist1(Int_t i) const {return fMCPrimTrackHist1[i];}
151 THnSparseF *GetMCPrimTrackHist2(Int_t i) const {return fMCPrimTrackHist2[i];}
152 THnSparseF *GetMCSecTrackHist1(Int_t i) const {return fMCSecTrackHist1[i];}
154 THnSparseF *GetRecTrackHist1(Int_t i) const {return fRecTrackHist1[i];}
155 THnSparseF *GetRecTrackMultHist1(Int_t i) const {return fRecTrackMultHist1[i];}
157 THnSparseF *GetRecMCTrackHist1() const {return fRecMCTrackHist1;}
158 THnSparseF *GetMCMultRecTrackHist1() const {return fMCMultRecTrackHist1;}
160 THnSparseF *GetRecTrackHist2() const {return fRecTrackHist2;}
161 THnSparseF *GetEventCount() const {return fEventCount;}
164 // Generic histograms to be corrected
166 THnSparseF* GetRecEventHist() const {return fRecEventHist;}
167 THnSparseF* GetRecTrackHist() const {return fRecTrackHist;}
168 THnSparseF* GetEventMultHist() const {return fEventMultHist;}
171 // centrality histograms etc. getter+setter
173 THnSparseF* GetCentralityEventHist() const {return fCentralityEventHist;}
174 THnSparseF* GetCentralityTrackHist() const {return fCentralityTrackHist;}
175 const char* GetCentralityEstimator(Int_t i) {return ((i > 0) && (i <= fDimensionsCentralityEstimators)) ? ((TObjString*)fCentralityEstimatorsList->At(i-1))->GetName() : 0; }
176 Int_t GetNCentralityEstimators() {return fDimensionsCentralityEstimators;}
177 void SetBinsCentrality(Int_t nbins, Double_t* edges) { if (CanChangeBins()) { fCentralityNbins = nbins; fBinsCentrality = CloneArray(fCentralityNedges = nbins+1,edges); } }
178 void SetCentralityEstimators(const char* estimators);
183 TFolder *fAnalysisFolder; // folder for analysed histograms
184 Bool_t fHistogramsOn; // switch on/off filling of control histograms
187 // correlation matrices (histograms)
190 // event rec. track vs true track multiplicity correlation matrix
191 THnSparseF *fEventMultCorrelationMatrix; //-> mult:mult_true_tracks:multMB
193 // rec. track pt vs true track pt correlation matrix for given eta
194 THnSparseF *fTrackPtCorrelationMatrix; //-> Pt:mcPt:mcEta
197 // event level correction
201 THnSparseF *fGenEventMatrix; //-> mcZv:multMB (inelastic)
202 THnSparseF *fGenSDEventMatrix; //-> mcZv:multMB (single diffractive)
203 THnSparseF *fGenDDEventMatrix; //-> mcZv:multMB (single diffractive)
204 THnSparseF *fGenNDEventMatrix; //-> mcZv:multMB (non diffractive)
205 THnSparseF *fGenNSDEventMatrix; //-> mcZv:multMB (non single diffractive)
207 // trigger bias corrections (fTriggerEventMatrix / fGenEventMatrix)
208 THnSparseF *fTriggerEventMatrix; //-> mcZv:multMB
209 THnSparseF *fTriggerSDEventMatrix; //-> mcZv:multMB
210 THnSparseF *fTriggerDDEventMatrix; //-> mcZv:multMB
211 THnSparseF *fTriggerNDEventMatrix; //-> mcZv:multMB
212 THnSparseF *fTriggerNSDEventMatrix; //-> mcZv:multMB
214 // event vertex rec. eff correction (fRecEventMatrix / fTriggerEventMatrix)
215 THnSparseF *fRecEventMatrix; //-> mcZv:multMB
216 THnSparseF *fRecSDEventMatrix; //-> mcZv:multMB
217 THnSparseF *fRecDDEventMatrix; //-> mcZv:multMB
218 THnSparseF *fRecNDEventMatrix; //-> mcZv:multMB
219 THnSparseF *fRecNSDEventMatrix; //-> mcZv:multMB
223 // track-event level correction
226 THnSparseF *fGenTrackEventMatrix; //-> mcZv:mcPt:mcEta
227 THnSparseF *fGenTrackSDEventMatrix; //-> mcZv:mcPt:mcEta
228 THnSparseF *fGenTrackDDEventMatrix; //-> mcZv:mcPt:mcEta
229 THnSparseF *fGenTrackNDEventMatrix; //-> mcZv:mcPt:mcEta
230 THnSparseF *fGenTrackNSDEventMatrix; //-> mcZv:mcPt:mcEta
232 // trigger bias corrections (fTriggerTrackEventMatrix / fGenTrackEventMatrix)
233 THnSparseF *fTriggerTrackEventMatrix; //-> mcZv:mcPt:mcEta
234 THnSparseF *fTriggerTrackSDEventMatrix; //-> mcZv:mcPt:mcEta
235 THnSparseF *fTriggerTrackDDEventMatrix; //-> mcZv:mcPt:mcEta
236 THnSparseF *fTriggerTrackNDEventMatrix; //-> mcZv:mcPt:mcEta
237 THnSparseF *fTriggerTrackNSDEventMatrix; //-> mcZv:mcPt:mcEta
239 // event vertex rec. corrections (fRecTrackEventMatrix / fTriggerTrackEventMatrix)
240 THnSparseF *fRecTrackEventMatrix; //-> mcZv:Pt:mcEta
241 THnSparseF *fRecTrackSDEventMatrix; //-> mcZv:Pt:mcEta
242 THnSparseF *fRecTrackDDEventMatrix; //-> mcZv:Pt:mcEta
243 THnSparseF *fRecTrackNDEventMatrix; //-> mcZv:Pt:mcEta
244 THnSparseF *fRecTrackNSDEventMatrix; //-> mcZv:Pt:mcEta
247 // track level correction
250 // track rec. efficiency correction (fRecPrimTrackMatrix / fGenPrimTrackMatrix)
251 THnSparseF *fGenTrackMatrix; //-> mcZv:mcPt:mcEta
252 THnSparseF *fGenPrimTrackMatrix; //-> mcZv:mcPt:mcEta
253 THnSparseF *fRecPrimTrackMatrix; //-> mcZv:mcPt:mcEta
255 // secondary track contamination correction (fRecSecTrackMatrix / fRecTrackMatrix)
256 THnSparseF *fRecTrackMatrix; //-> mcZv:mcPt:mcEta
257 THnSparseF *fRecSecTrackMatrix; //-> mcZv:mcPt:mcEta
259 // multiple rec. track corrections (fRecMultTrackMatrix / fRecTrackMatrix)
260 THnSparseF *fRecMultTrackMatrix; //-> mcZv:Pt:mcEta
263 // ESD and MC control analysis histograms
266 // THnSparse event histograms
267 THnSparseF *fMCEventHist1; //-> mcXv:mcYv:mcZv
268 THnSparseF *fRecEventHist1; //-> Xv:Yv:Zv
269 THnSparseF *fRecEventHist2; //-> Zv:multMB:mult
270 THnSparseF *fRecMCEventHist1; //-> Xv-mcXv:Yv-mcYv:Zv-mcZv
271 THnSparseF *fRecMCEventHist2; //-> Xv-mcXv:Zv-mcZv:mult
272 THnSparseF *fRecMCEventHist3; //-> mult:EventType (ND, DD, SD)
274 // THnSparse track histograms
275 // [0] - after charged track selection, [1] - after acceptance cuts, [2] - after esd track cuts
277 THnSparseF *fMCTrackHist1[AlidNdPtHelper::kCutSteps]; //-> mcPt:mcEta:mcPhi
278 THnSparseF *fMCPrimTrackHist1[AlidNdPtHelper::kCutSteps]; //-> mcPt:mcEta:pid:mech:mother
279 THnSparseF *fMCPrimTrackHist2[AlidNdPtHelper::kCutSteps]; //-> pdg:mech:mother
280 THnSparseF *fMCSecTrackHist1[AlidNdPtHelper::kCutSteps]; //-> mcPt:mcEta:pid:mech:mother
282 THnSparseF *fRecTrackHist1[AlidNdPtHelper::kCutSteps]; //-> Pt:Eta:Phi
283 THnSparseF *fRecTrackMultHist1[AlidNdPtHelper::kCutSteps]; //-> Pt:mult
285 THnSparseF *fRecMCTrackHist1; //-> mcPt:mcEta:(Pt-mcPt)/mcPt:(Eta-mcEta)
287 //multple reconstructed tracks
288 THnSparseF *fMCMultRecTrackHist1; //-> mcPt:mcEta:pid
290 // track control histograms
291 THnSparseF *fRecTrackHist2; //-> nclust:chi2:Pt:Eta:Phi
294 // Generic histograms to be corrected
296 THnSparseF *fRecEventHist; //-> Zv:multMB
297 THnSparseF *fRecTrackHist; //-> Zv:pT:eta:multRec
298 THnSparseF *fEventCount; //-> trig, trig + vertex, selected event
299 THnSparseF *fEventMultHist; // event multiplicities multMB:multRecTemp:multRec
302 // candle events track corrections
304 THnSparseF *fRecCandleEventMatrix; // Zv:multMB
306 // centrality test histograms
307 THnSparseF *fCentralityEventHist; // rec event hist with centrality zv:multRec:multMB:cent:...
308 THnSparseF *fCentralityTrackHist; // rec track hist with centrality zv:pt:eta:multRec:multMB:cent:...
309 TObjArray *fCentralityEstimatorsList; // TObjArray with TObjStrings containing cent. estimators
310 Int_t fDimensionsCentralityEstimators; // number of centrality estimators: if 0 hists are not filled
311 Int_t fCentralityNbins; // number of centrality bins (common for all estimators)
312 Int_t fCentralityNedges; // fCentralityNbins+1 uses for streaming dynamic array
313 Double_t *fBinsCentrality; //[fCentralityNedges]
315 Int_t fNVCentralityEvent; //
316 Int_t fNVCentralityTrack; //
317 Double_t *fVCentralityEvent; //[fNVCentralityEvent]
318 Double_t *fVCentralityTrack; //[fNVCentralityTrack]
320 //binning for THNsparse
326 Int_t fMultNedges; // fMultNbins+1 uses for streaming dynamic array
327 Int_t fPtNedges; // fPtNbins+1 uses for streaming dynamic array
328 Int_t fPtCorrNedges; // fCentralityNbins+1 uses for streaming dynamic array
329 Int_t fEtaNedges; // fEtaNbins+1 uses for streaming dynamic array
330 Int_t fZvNedges; // fZvNbins+1 uses for streaming dynamic array
331 Double_t *fBinsMult; //[fMultNedges]
332 Double_t *fBinsPt; //[fPtNedges]
333 Double_t *fBinsPtCorr; //[fPtCorrNedges]
334 Double_t *fBinsEta; //[fEtaNedges]
335 Double_t *fBinsZv; //[fZvNedges]
339 // generic function to change binning
340 Bool_t CanChangeBins();
342 AlidNdPtAnalysispPb(const AlidNdPtAnalysispPb&); // not implemented
343 AlidNdPtAnalysispPb& operator=(const AlidNdPtAnalysispPb&); // not implemented
345 ClassDef(AlidNdPtAnalysispPb,2);