]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGLF/SPECTRA/ChargedHadrons/dNdPt/AlidNdPtAnalysispPb.h
added bug fixes by M. Knichel
[u/mrichter/AliRoot.git] / PWGLF / SPECTRA / ChargedHadrons / dNdPt / AlidNdPtAnalysispPb.h
1 #ifndef ALIDNDPTANALYSISPPB_H
2 #define ALIDNDPTANALYSISPPB_H
3
4 //------------------------------------------------------------------------------
5 // AlidNdPtAnalysispPb class used for dNdPt analysis in p-Pb collisions 
6 // based on AlidNdPtAnalysis class
7 // 
8 // Author: J.Otwinowski 04/11/2008 
9 // last change: 2013-02-05 by M.Knichel
10 //------------------------------------------------------------------------------
11
12 class iostream;
13
14 class TFile;
15 class TCint;
16 class TProfile;
17 class TFolder;
18 class TObjArray;
19 class TString;
20 class THnSparse;
21
22 class AliESDtrackCuts;
23 class AliVertexerTracks;
24 class AliESD;
25 class AliESDfriend;
26 class AliESDfriendTrack;
27 class AlidNdPtHelper;
28
29 #include "AlidNdPt.h"
30 #include "TObjString.h"
31
32 class AlidNdPtAnalysispPb : public AlidNdPt {
33 public :
34   AlidNdPtAnalysispPb(); 
35   AlidNdPtAnalysispPb(Char_t* name, Char_t* title);
36   ~AlidNdPtAnalysispPb();
37
38   // Init data members
39   virtual void Init();
40
41   // Process events
42   virtual void Process(AliESDEvent *const esdEvent=0, AliMCEvent *const mcEvent=0);
43
44   // Merge output objects (needed by PROOF) 
45   virtual Long64_t Merge(TCollection* const list);
46
47   // Analyse output histograms 
48   virtual void Analyse();
49
50   // Export objects to folder
51   virtual TFolder *ExportToFolder(TObjArray * const array=0);
52
53   // Get analysis folder
54   TFolder* GetAnalysisFolder() const {return fAnalysisFolder;}
55
56   // Fill control histograms
57   void SetHistogramsOn(const Bool_t histOn=kTRUE) {fHistogramsOn = histOn;}
58   Bool_t IsHistogramsOn() const {return fHistogramsOn;}
59
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);
64     
65   // Create folder for analysed histograms
66   TFolder *CreateFolder(TString folder = "folderdNdPtAnalysis",TString title = "Analysed dNdPt histograms");
67   
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); } }
74
75   // Fill histograms
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);
79
80   // Getters
81   THnSparseF *GetEventMultCorrelationMatrix() const {return fEventMultCorrelationMatrix;}
82   THnSparseF *GetTrackPtCorrelationMatrix()   const {return fTrackPtCorrelationMatrix;}
83
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;}
91
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;}
98
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;}
105
106   //
107   THnSparseF *GetRecCandleEventMatrix() const {return fRecCandleEventMatrix;}
108
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;}
115
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;}
122
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;}
129
130   //
131   THnSparseF *GetGenTrackMatrix() const {return fGenTrackMatrix;}
132   THnSparseF *GetGenPrimTrackMatrix() const {return fGenPrimTrackMatrix;}
133   THnSparseF *GetRecPrimTrackMatrix() const {return fRecPrimTrackMatrix;}
134
135   THnSparseF *GetRecTrackMatrix() const {return fRecTrackMatrix;}
136   THnSparseF *GetRecSecTrackMatrix() const {return fRecSecTrackMatrix;}
137   THnSparseF *GetRecMultTrackMatrix() const {return fRecMultTrackMatrix;}
138
139   //
140   // control histograms
141   //
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;}
148
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];}
153
154   THnSparseF *GetRecTrackHist1(Int_t i) const {return fRecTrackHist1[i];}
155   THnSparseF *GetRecTrackMultHist1(Int_t i) const {return fRecTrackMultHist1[i];}
156
157   THnSparseF *GetRecMCTrackHist1() const {return fRecMCTrackHist1;}
158   THnSparseF *GetMCMultRecTrackHist1() const {return fMCMultRecTrackHist1;}
159
160   THnSparseF *GetRecTrackHist2() const {return fRecTrackHist2;}
161   THnSparseF *GetEventCount() const {return fEventCount;}  
162
163   //
164   // Generic histograms to be corrected
165   //
166   THnSparseF* GetRecEventHist() const {return fRecEventHist;} 
167   THnSparseF* GetRecTrackHist() const {return fRecTrackHist;}
168   THnSparseF* GetEventMultHist() const {return fEventMultHist;} 
169   
170   //
171   // centrality histograms etc. getter+setter
172   //
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);
179
180 private:
181
182   // analysis folder 
183   TFolder *fAnalysisFolder; // folder for analysed histograms
184   Bool_t fHistogramsOn; // switch on/off filling of control histograms 
185
186   // 
187   // correlation matrices (histograms)
188   //
189
190   // event rec. track vs true track multiplicity correlation matrix 
191   THnSparseF *fEventMultCorrelationMatrix; //-> mult:mult_true_tracks:multMB
192
193   // rec. track pt vs true track pt correlation matrix for given eta
194   THnSparseF *fTrackPtCorrelationMatrix; //-> Pt:mcPt:mcEta
195
196   //
197   // event level correction 
198   //
199
200   // all genertated
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)
206
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
213
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
220
221
222   //
223   // track-event level correction 
224   //
225
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
231
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
238
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
245
246   //
247   // track level correction 
248   //
249
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
254
255   // secondary track contamination correction (fRecSecTrackMatrix / fRecTrackMatrix)
256   THnSparseF *fRecTrackMatrix;    //-> mcZv:mcPt:mcEta
257   THnSparseF *fRecSecTrackMatrix; //-> mcZv:mcPt:mcEta
258
259   // multiple rec. track corrections (fRecMultTrackMatrix / fRecTrackMatrix)
260   THnSparseF *fRecMultTrackMatrix; //-> mcZv:Pt:mcEta
261
262   //
263   // ESD and MC control analysis histograms
264   //
265
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)
273
274   // THnSparse track histograms
275   // [0] - after charged track selection, [1] - after acceptance cuts, [2] - after esd track cuts
276
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
281
282   THnSparseF *fRecTrackHist1[AlidNdPtHelper::kCutSteps];     //-> Pt:Eta:Phi
283   THnSparseF *fRecTrackMultHist1[AlidNdPtHelper::kCutSteps]; //-> Pt:mult
284
285   THnSparseF *fRecMCTrackHist1; //-> mcPt:mcEta:(Pt-mcPt)/mcPt:(Eta-mcEta)
286
287   //multple reconstructed tracks
288   THnSparseF *fMCMultRecTrackHist1; //-> mcPt:mcEta:pid
289
290   // track control histograms
291   THnSparseF *fRecTrackHist2;  //-> nclust:chi2:Pt:Eta:Phi
292
293   //
294   // Generic histograms to be corrected
295   //
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
300
301   //
302   // candle events track corrections
303   //
304   THnSparseF *fRecCandleEventMatrix; // Zv:multMB
305
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]
314
315   Int_t fNVCentralityEvent; //
316   Int_t fNVCentralityTrack; //
317   Double_t *fVCentralityEvent; //[fNVCentralityEvent]
318   Double_t *fVCentralityTrack; //[fNVCentralityTrack]
319
320   //binning for THNsparse
321   Int_t fMultNbins;
322   Int_t fPtNbins;
323   Int_t fPtCorrNbins; 
324   Int_t fEtaNbins;
325   Int_t fZvNbins;
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]
336   
337   Bool_t fIsInit;
338   
339   // generic function to change binning
340   Bool_t CanChangeBins();
341
342   AlidNdPtAnalysispPb(const AlidNdPtAnalysispPb&); // not implemented
343   AlidNdPtAnalysispPb& operator=(const AlidNdPtAnalysispPb&); // not implemented
344
345   ClassDef(AlidNdPtAnalysispPb,2);
346 };
347
348 #endif