Update from Prabhat and Debojit
[u/mrichter/AliRoot.git] / PWGCF / Correlations / DPhi / TriggerPID / AliTwoParticlePIDCorr.h
1 #ifndef ALITWOPARTICLEPIDCORR_H
2 #define ALITWOPARTICLEPIDCORR_H
3
4 #include "THn.h" // in cxx file causes .../THn.h:257: error: conflicting declaration ‘typedef class THnT<float> THnF’
5
6
7 class TH1F;
8 class TH2F;
9 class TH3F;
10 class THnSparse;
11 class TString;
12 class TList;
13 //class AliESDtrackCuts;
14 class TSeqCollection;
15 class AliPIDResponse;
16 class AliAODEvent;
17 class AliAODTrack;
18 class AliAODVertex;
19 class AliEventPoolManager;
20 class TFormula;
21 class AliAnalysisUtils;
22 class LRCParticlePID;
23 class AliVParticle;
24 class AliCFContainer;
25 class AliCFGridSparse;
26 class THnBase;
27 class AliTHn;
28
29
30 #include <TObject.h> //LRCParticlePID is a derived class from"TObject"
31 #include "TMath.h"
32 #include "TNamed.h"
33 #include "AliUEHist.h"
34 #include "AliPID.h"
35 #include "AliAnalysisTask.h"
36 #include "AliUEHist.h"
37 #include "TString.h"
38 #include "AliVParticle.h"
39 #include "TParticle.h"
40 #include "AliLog.h"
41 #include "AliTHn.h"
42
43
44
45 #ifndef ALIANALYSISTASKSE_H
46 #include "AliAnalysisTaskSE.h"
47 #endif
48
49 namespace AliPIDNameSpace {
50   
51   enum PIDType
52   {
53     NSigmaTPC = 0,
54     NSigmaTOF,
55     NSigmaTPCTOF,  // squared sum
56     NSigmaPIDType=NSigmaTPCTOF
57   };
58     
59   enum AliDetectorType
60   {
61     fITS = 0,
62     fTPC,
63     fTOF,
64     fNDetectors
65   };
66   
67   
68   enum AliParticleSpecies
69   {
70     SpPion = 0,
71     SpKaon,
72     SpProton,
73     unidentified,
74     NSpecies=unidentified,
75     SpUndefined=999
76   }; // Particle species used in plotting
77   
78   
79   enum AliCharge
80   {
81     Posch = 0,
82     Negch,
83     NCharge
84   };
85 }
86
87
88 using namespace AliPIDNameSpace;
89
90 class AliTwoParticlePIDCorr : public AliAnalysisTaskSE {
91  public:
92     AliTwoParticlePIDCorr();
93     AliTwoParticlePIDCorr(const char *name);
94     virtual ~AliTwoParticlePIDCorr();
95     
96     virtual void     UserCreateOutputObjects();
97     virtual void     UserExec(Option_t *option);
98     virtual void    doAODevent();
99     virtual void    doMCAODevent();
100     virtual void     Terminate(Option_t *);
101   void     SetSharedClusterCut(Double_t value) { fSharedClusterCut = value; }
102
103   void SettwoTrackEfficiencyCutDataReco(Bool_t twoTrackEfficiencyCutDataReco,Float_t twoTrackEfficiencyCutValue1)
104   {
105     ftwoTrackEfficiencyCutDataReco=twoTrackEfficiencyCutDataReco;
106     twoTrackEfficiencyCutValue=twoTrackEfficiencyCutValue1;
107   }
108   void SetVertextype(Int_t Vertextype){fVertextype=Vertextype;}                                                 //Check it every time
109     void SetZvtxcut(Double_t zvtxcut) {fzvtxcut=zvtxcut;}
110     void SetCustomBinning(TString receivedCustomBinning) { fCustomBinning = receivedCustomBinning; }
111     void SetMaxNofMixingTracks(Int_t MaxNofMixingTracks) {fMaxNofMixingTracks=MaxNofMixingTracks;}               //Check it every time
112   void SetCentralityEstimator(TString CentralityMethod) { fCentralityMethod = CentralityMethod;}
113   void SetSampleType(TString SampleType) {fSampleType=SampleType;}
114   void SetAnalysisType(TString AnalysisType){fAnalysisType=AnalysisType;}
115   void SetFilterBit(Int_t FilterBit) {fFilterBit=FilterBit;}
116   void SetTrackStatus(UInt_t status) { fTrackStatus = status; }
117   void SetfilltrigassoUNID(Bool_t filltrigassoUNID){ffilltrigassoUNID=filltrigassoUNID;}
118   void SetfilltrigUNIDassoID(Bool_t filltrigUNIDassoID){ffilltrigUNIDassoID=filltrigUNIDassoID;}
119   void SetfilltrigIDassoUNID(Bool_t filltrigIDassoUNID){ffilltrigIDassoUNID=filltrigIDassoUNID;}
120   void SetfilltrigIDassoID(Bool_t filltrigIDassoID){ ffilltrigIDassoID=filltrigIDassoID;}
121   void SetfilltrigIDassoIDMCTRUTH(Bool_t filltrigIDassoIDMCTRUTH){ffilltrigIDassoIDMCTRUTH=filltrigIDassoIDMCTRUTH;}
122   void SetSelectHighestPtTrig(Bool_t SelectHighestPtTrig){fSelectHighestPtTrig=SelectHighestPtTrig;}
123   void SetTriggerSpeciesSelection(Bool_t TriggerSpeciesSelection,Int_t TriggerSpecies,Bool_t containPIDtrig){
124     fTriggerSpeciesSelection=TriggerSpeciesSelection;//if it is KTRUE then Set containPIDtrig=kFALSE
125     fTriggerSpecies=TriggerSpecies;
126     fcontainPIDtrig=containPIDtrig;
127   }
128   void SetAssociatedSpeciesSelection(Bool_t AssociatedSpeciesSelection,Int_t AssociatedSpecies, Bool_t containPIDasso)
129   {
130     fAssociatedSpeciesSelection=AssociatedSpeciesSelection;//if it is KTRUE then Set containPIDasso=kFALSE
131     fAssociatedSpecies=AssociatedSpecies;
132     fcontainPIDasso=containPIDasso;
133   }
134
135  void SetFIllPIDQAHistos(Bool_t FIllPIDQAHistos){fFIllPIDQAHistos=FIllPIDQAHistos;}
136   void SetRejectPileUp(Bool_t rejectPileUp) {frejectPileUp=rejectPileUp;}
137   void SetKinematicCuts(Float_t minPt, Float_t maxPt,Float_t mineta,Float_t maxeta)
138   {
139     fminPt=minPt;
140     fmaxPt=maxPt;
141     fmineta=mineta;
142     fmaxeta=maxeta;
143   }
144   void SetAsymmetricnSigmaCut( Float_t minprotonsigmacut,Float_t maxprotonsigmacut,Float_t minpionsigmacut,Float_t maxpionsigmacut)
145   {
146     fminprotonsigmacut=minprotonsigmacut;
147     fmaxprotonsigmacut=maxprotonsigmacut;
148     fminpionsigmacut=minpionsigmacut;
149     fmaxpionsigmacut=maxpionsigmacut;
150   }
151   void SetDcaCut(Bool_t dcacut,Double_t dcacutvalue)
152   {
153     fdcacut=dcacut;
154     fdcacutvalue=dcacutvalue;
155   }
156   void SetfillHistQA(Bool_t fillhistQAReco,Bool_t fillhistQATruth)
157   {
158     ffillhistQAReco=fillhistQAReco;
159     ffillhistQATruth=fillhistQATruth;
160   }
161   void SetPtordering(Bool_t PtOrderDataReco,Bool_t PtOrderMCTruth)
162   {
163     fPtOrderDataReco=PtOrderDataReco;
164     fPtOrderMCTruth=PtOrderMCTruth;
165   }
166   void SetWeightPerEvent(Bool_t flag) {  fWeightPerEvent = flag;}
167   void Setselectprimarydatareco(Bool_t onlyprimarydatareco) {fonlyprimarydatareco=onlyprimarydatareco;}
168   void SetselectprimaryTruth(Bool_t selectprimaryTruth) {fselectprimaryTruth=selectprimaryTruth;}
169   void SetCombinedNSigmaCut(Double_t NSigmaPID) {fNSigmaPID=NSigmaPID;}
170   void SetHighPtKaonNSigmaPID(Float_t HighPtKaonSigma,Float_t HighPtKaonNSigmaPID)
171   {
172     fHighPtKaonSigma=HighPtKaonSigma;
173     fHighPtKaonNSigmaPID=HighPtKaonNSigmaPID;
174   }
175   void IgnoreoverlappedTracks(Bool_t UseExclusiveNSigma){fUseExclusiveNSigma=UseExclusiveNSigma;}
176   void SetRemoveTracksT0Fill( Bool_t RemoveTracksT0Fill){fRemoveTracksT0Fill=RemoveTracksT0Fill;}
177   void SetPairSelectCharge(Int_t SelectCharge){fSelectCharge=SelectCharge;}
178   void SetTrigAssoSelectcharge( Int_t TriggerSelectCharge,Int_t AssociatedSelectCharge)
179   {
180     fTriggerSelectCharge=TriggerSelectCharge;
181     fAssociatedSelectCharge=AssociatedSelectCharge;
182   }
183   void SetEtaOrdering(Bool_t EtaOrdering){fEtaOrdering=EtaOrdering;}
184   void SetCutConversionsResonances( Bool_t CutConversions,Bool_t CutResonances)
185   {
186      fCutConversions=CutConversions;
187      fCutResonances=CutResonances;
188   }
189   void SetCleanUp(Bool_t InjectedSignals,Bool_t RemoveWeakDecays,Bool_t RemoveDuplicates)
190   {
191     fInjectedSignals=InjectedSignals;
192     fRemoveWeakDecays=RemoveWeakDecays;
193     fRemoveDuplicates=RemoveDuplicates;
194   }
195   void SetEfficiency(Bool_t fillefficiency,Bool_t applyTrigefficiency,Bool_t applyAssoefficiency)
196     {
197       ffillefficiency=fillefficiency;
198       fapplyTrigefficiency=applyTrigefficiency;
199       fapplyAssoefficiency=applyAssoefficiency;
200
201     }
202   void SetComboeffPtRange(Double_t minPtComboeff,Double_t maxPtComboeff) {
203     fminPtComboeff=minPtComboeff;
204     fmaxPtComboeff=maxPtComboeff;}
205   //only one can be kTRUE at a time(for the next two Setters)
206   void Setmesoneffrequired(Bool_t mesoneffrequired) {fmesoneffrequired=mesoneffrequired;}
207   void Setkaonprotoneffrequired(Bool_t kaonprotoneffrequired){fkaonprotoneffrequired=kaonprotoneffrequired;}
208    void SetOnlyOneEtaSide(Int_t OnlyOneEtaSide){fOnlyOneEtaSide=OnlyOneEtaSide;}
209    void SetRejectResonanceDaughters(Int_t RejectResonanceDaughters){fRejectResonanceDaughters=RejectResonanceDaughters;}
210
211 void SetTOFPIDVal(Bool_t RequestTOFPID,Float_t PtTOFPIDmin,Float_t PtTOFPIDmax)
212    {
213 fRequestTOFPID=RequestTOFPID;
214 fPtTOFPIDmin=PtTOFPIDmin;
215 fPtTOFPIDmax=PtTOFPIDmax;
216 }
217
218  void SetEffcorectionfilePathName(TString efffilename) {fefffilename=efffilename;}
219  
220  private:
221  //histograms
222     TList *fOutput;        //! Output list
223     TList *fOutputList;        //! Output list
224
225     TString    fCentralityMethod;     // Method to determine centrality
226     TString    fSampleType;     // pp,p-Pb,Pb-Pb
227     Int_t    fnTracksVertex;        // QA tracks pointing to principal vertex
228     AliAODVertex* trkVtx;//!
229     Float_t zvtx;
230     Int_t    fFilterBit;         // track selection cuts
231      UInt_t         fTrackStatus;       // if non-0, the bits set in this variable are required for each track
232     Double_t       fSharedClusterCut;  // cut on shared clusters (only for AOD)
233     Int_t fVertextype;
234     Double_t fzvtxcut;
235     Bool_t ffilltrigassoUNID;
236     Bool_t ffilltrigUNIDassoID;
237     Bool_t ffilltrigIDassoUNID;
238     Bool_t ffilltrigIDassoID;
239     Bool_t ffilltrigIDassoIDMCTRUTH;
240     Int_t fMaxNofMixingTracks;
241     Bool_t fPtOrderMCTruth;
242     Bool_t fPtOrderDataReco;
243     Bool_t fWeightPerEvent;
244     Bool_t fTriggerSpeciesSelection;
245     Bool_t fAssociatedSpeciesSelection;
246     Int_t fTriggerSpecies;
247     Int_t fAssociatedSpecies;
248     TString fCustomBinning;//for setting customized binning
249     TString fBinningString;//final binning string
250     Bool_t fSelectHighestPtTrig;
251     Bool_t fcontainPIDtrig;
252     Bool_t fcontainPIDasso;
253      Bool_t frejectPileUp;
254     Float_t fminPt;
255     Float_t fmaxPt;
256     Float_t fmineta;
257     Float_t fmaxeta;
258     Float_t fminprotonsigmacut;
259     Float_t fmaxprotonsigmacut;
260     Float_t fminpionsigmacut;
261     Float_t fmaxpionsigmacut;
262     Bool_t fselectprimaryTruth;
263     Bool_t fonlyprimarydatareco;
264     Bool_t fdcacut;
265     Double_t fdcacutvalue;
266     Bool_t ffillhistQAReco;
267     Bool_t ffillhistQATruth;
268     Int_t kTrackVariablesPair ;
269     Double_t fminPtTrig;
270     Double_t fmaxPtTrig;
271     Double_t fminPtComboeff;
272     Double_t fmaxPtComboeff;
273     Double_t fminPtAsso;
274     Double_t fmaxPtAsso;
275     TH1F *fhistcentrality;//!
276     TH1F *fEventCounter; //!
277     TH2F *fEtaSpectrasso;//!
278     TH2F *fphiSpectraasso;//!
279     TH1F *MCtruthpt;//! 
280     TH1F *MCtrutheta;//! 
281     TH1F *MCtruthphi;//!
282     TH1F *MCtruthpionpt;//!
283     TH1F *MCtruthpioneta;//!
284     TH1F *MCtruthpionphi;//!
285     TH1F *MCtruthkaonpt;//!
286     TH1F *MCtruthkaoneta;//!
287     TH1F *MCtruthkaonphi;//!
288     TH1F *MCtruthprotonpt;//!
289     TH1F *MCtruthprotoneta;//!
290     TH1F *MCtruthprotonphi;//! 
291     TH2F *fPioncont;//!
292     TH2F *fKaoncont;//!
293     TH2F *fProtoncont;//!
294     TH2F *fEventno;//!
295     TH2F *fEventnobaryon;//!
296     TH2F *fEventnomeson;//!
297     TH2F *fhistJetTrigestimate;//!
298
299     TH2D* fCentralityCorrelation;  //! centrality vs multiplicity
300     TH2F* fControlConvResoncances; //! control histograms for cuts on conversions and resonances
301
302     TH2F *fHistoTPCdEdx;//!
303     TH2F *fHistoTOFbeta;//!
304     TH3F *fTPCTOFPion3d;//!
305     TH3F *fTPCTOFKaon3d;//!
306     TH3F *fTPCTOFProton3d;//!
307     TH1F *fPionPt;//!
308     TH1F *fPionEta;//!
309     TH1F *fPionPhi;//!
310     TH1F *fKaonPt;//!
311     TH1F *fKaonEta;//!
312     TH1F *fKaonPhi;//!
313     TH1F *fProtonPt;//!
314     TH1F *fProtonEta;//!
315     TH1F *fProtonPhi;//!
316     // TH3F *fHistocentNSigmaTPC;//! nsigma TPC
317     // TH3F *fHistocentNSigmaTOF;//! nsigma TOF 
318     
319     AliTHn *fCorrelatonTruthPrimary;//!
320     AliTHn *fCorrelatonTruthPrimarymix;//!
321     AliTHn *fTHnCorrUNID;//!
322     AliTHn *fTHnCorrUNIDmix;//!
323     AliTHn *fTHnCorrID;//!
324     AliTHn *fTHnCorrIDmix;//!
325     AliTHn *fTHnCorrIDUNID;//!
326     AliTHn *fTHnCorrIDUNIDmix;//!
327     AliTHn *fTHnTrigcount;//!
328     AliTHn *fTHnTrigcountMCTruthPrim;//!
329     AliTHn* fTrackHistEfficiency[6]; //! container for tracking efficiency and contamination (all particles filled including leading one): axes: eta, pT, particle species:::::::::0 pion, 1 kaon,2 proton,3 mesons,4 kaons+protons,5 all
330
331     
332     TH1F *fHistQA[16]; //!
333      
334    
335     THnSparse *effcorection[6];//!
336     // THnF *effmap[6];  
337
338     Int_t ClassifyTrack(AliAODTrack* track,AliAODVertex* vertex,Float_t magfield);
339   Double_t* GetBinning(const char* configuration, const char* tag, Int_t& nBins);
340
341
342   void Fillcorrelation(TObjArray *trackstrig,TObjArray *tracksasso,Double_t cent,Float_t vtx,Float_t weight,Bool_t firstTime,Float_t bSign,Bool_t fPtOrder,Bool_t twoTrackEfficiencyCut,Bool_t mixcase,TString fillup);//mixcase=kTRUE in case of mixing; 
343  Float_t GetTrackbyTrackeffvalue(AliAODTrack* track,Double_t cent,Float_t evzvtx, Int_t parpid);
344
345 //Mixing functions
346   void DefineEventPool();
347   AliEventPoolManager    *fPoolMgr;//! 
348   TClonesArray          *fArrayMC;//!
349   TString          fAnalysisType;          // "MC", "ESD", "AOD"
350   TString fefffilename;
351
352     //PID part histograms
353
354   //PID functions
355     Bool_t HasTPCPID(AliAODTrack *track) const; // has TPC PID
356     Bool_t HasTOFPID(AliAODTrack *track) const; // has TOF PID
357     Double_t GetBeta(AliAODTrack *track);
358     void CalculateNSigmas(AliAODTrack *track, Bool_t FIllQAHistos);
359     Int_t FindMinNSigma(AliAODTrack *track, Bool_t FIllQAHistos);
360     Bool_t* GetDoubleCounting(AliAODTrack * trk, Bool_t FIllQAHistos);
361     Int_t GetParticle(AliAODTrack * trk, Bool_t FIllQAHistos);  
362  
363      TH2F* GetHistogram2D(const char * name);//return histogram "name" from fOutputList
364
365      Bool_t ftwoTrackEfficiencyCutDataReco;        
366    Float_t twoTrackEfficiencyCutValue;
367   //Pid objects
368   AliPIDResponse *fPID; //! PID
369   Int_t eventno;
370   Float_t fPtTOFPIDmin; //lower pt bound for the TOCTOF combined circular pid
371   Float_t fPtTOFPIDmax; //uper pt bound for the TOCTOF combined circular pid
372   Bool_t fRequestTOFPID;//if true returns kSpUndefined if the TOF signal is missing
373   PIDType fPIDType; // PID type  Double_t fNSigmaPID; // number of sigma for PID cut
374   Bool_t fFIllPIDQAHistos; //Switch for filling the nSigma histos
375   Double_t fNSigmaPID; // number of sigma for PID cut
376   Float_t fHighPtKaonNSigmaPID;// number of sigma for PID cut for Kaons above fHighPtKaonSigma(-1 default, no cut applied)
377   Float_t fHighPtKaonSigma;//lower pt bound for the fHighPtKaonNSigmaPID to be set >0(i.e. to make it applicable)
378   Bool_t fUseExclusiveNSigma;//if true returns the identity only if no double counting(i.e not in the overlap area)
379   Bool_t fRemoveTracksT0Fill;//if true remove tracks for which only StartTime from To-Fill is available (worst resolution)
380  Int_t fSelectCharge;           // (un)like sign selection when building correlations: 0: no selection; 1: unlike sign; 2: like sign
381     Int_t fTriggerSelectCharge;    // select charge of trigger particle: 1: positive; -1 negative
382     Int_t fAssociatedSelectCharge; // select charge of associated particle: 1: positive; -1 negative
383     Float_t fTriggerRestrictEta;   // restrict eta range for trigger particle (default: -1 [off])
384     Bool_t fEtaOrdering;           // eta ordering, see AliUEHistograms.h for documentation
385     Bool_t fCutConversions;        // cut on conversions (inv mass)
386     Bool_t fCutResonances;         // cut on resonances (inv mass)
387     Int_t fRejectResonanceDaughters; // reject all daughters of all resonance candidates (1: test method (cut at m_inv=0.9); 2: k0; 3: lambda)
388     Int_t fOnlyOneEtaSide;       // decides that only trigger particle from one eta side are considered (0 = all; -1 = negative, 1 = positive)
389     Bool_t fInjectedSignals;      // check header to skip injected signals in MC
390     Bool_t fRemoveWeakDecays;      // remove secondaries from weak decays from tracks and particles
391     Bool_t fRemoveDuplicates;// remove particles with the same label (double reconstruction)
392     Bool_t fapplyTrigefficiency;//if kTRUE then eff correction calculation starts
393     Bool_t fapplyAssoefficiency;//if kTRUE then eff correction calculation starts
394     Bool_t ffillefficiency;  //if kTRUE then THNsparses used for eff. calculation are filled up
395     Bool_t fmesoneffrequired;
396     Bool_t fkaonprotoneffrequired;
397    AliAnalysisUtils*     fAnalysisUtils;      // points to class with common analysis utilities
398   TFormula*      fDCAXYCut;          // additional pt dependent cut on DCA XY (only for AOD)
399
400
401   Float_t fnsigmas[NSpecies][NSigmaPIDType+1]; //nsigma values
402   Bool_t fHasDoubleCounting[NSpecies];//array with compatible identities
403
404   //Int_t fPIDMethod; // PID method
405
406  //functions
407   Bool_t CheckTrack(AliAODTrack * part);
408   Float_t PhiRange(Float_t DPhi);
409   Float_t GetInvMassSquared(Float_t pt1, Float_t eta1, Float_t phi1, Float_t pt2, Float_t eta2, Float_t phi2, Float_t m0_1, Float_t m0_2);
410 Float_t GetInvMassSquaredCheap(Float_t pt1, Float_t eta1, Float_t phi1, Float_t pt2, Float_t eta2, Float_t phi2, Float_t m0_1, Float_t m0_2);
411   Float_t GetDPhiStar(Float_t phi1, Float_t pt1, Float_t charge1, Float_t phi2, Float_t pt2, Float_t charge2, Float_t radius, Float_t bSign);
412   TObjArray* CloneAndReduceTrackList(TObjArray* tracks);
413            
414     
415     AliTwoParticlePIDCorr(const AliTwoParticlePIDCorr&); // not implemented
416     AliTwoParticlePIDCorr& operator=(const AliTwoParticlePIDCorr&); // not implemented
417     
418     ClassDef(AliTwoParticlePIDCorr, 1); // example of analysis
419 };
420 class LRCParticlePID : public TObject {
421 public:
422  LRCParticlePID(Int_t par,Short_t icharge,Float_t pt,Float_t eta, Float_t phi,Float_t effcorrectionval)
423    :fparticle(par),fcharge(icharge),fPt(pt), fEta(eta), fPhi(phi),feffcorrectionval(effcorrectionval)  {}
424   virtual ~LRCParticlePID() {}
425
426   
427     virtual Float_t Eta()        const { return fEta; }
428     virtual Float_t Phi()        const { return fPhi; }
429     virtual Float_t Pt() const { return fPt; }
430     Int_t getparticle() const {return fparticle;}
431     virtual Short_t Charge()      const { return fcharge; }
432     Float_t geteffcorrectionval() const {return feffcorrectionval;}
433     virtual Bool_t IsEqual(const TObject* obj) const { return (obj->GetUniqueID() == GetUniqueID()); }
434
435
436 private:
437   LRCParticlePID(const LRCParticlePID&);  // not implemented
438    LRCParticlePID& operator=(const LRCParticlePID&);  // not implemented
439   
440   Int_t fparticle;
441   Short_t fcharge;
442   Float_t fPt;
443   Float_t fEta;
444   Float_t fPhi;
445   Float_t feffcorrectionval;
446   ClassDef(LRCParticlePID, 1);
447 } ;
448
449 #endif
450