hooks for PMD flow analysis
[u/mrichter/AliRoot.git] / PWG2 / FLOW / AliFlowTasks / AliFlowTrackCuts.h
1 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. */
2 /* See cxx source for full Copyright notice */
3 /* $Id$ */
4
5 // AliFlowTrackESDCuts:
6 // A cut class for ESD, AOD and MC particles for the flow framework
7 // author: Mikolaj Krzewicki (mikolaj.krzewicki@cern.ch)
8
9 #ifndef ALIFLOWTRACKCUTS_H
10 #define ALIFLOWTRACKCUTS_H
11
12 #include <TMatrix.h>
13 #include "AliFlowTrackSimpleCuts.h"
14 #include "AliESDtrackCuts.h"
15 #include "TMCProcess.h"
16 #include "AliESDtrack.h"
17 #include "AliPID.h"
18 #include "AliESDpid.h"
19
20 class TObjArray;
21 class AliVParticle;
22 class AliMCParticle;
23 class AliFlowTrack;
24 class AliMCEvent;
25 class AliVEvent;
26 class AliMultiplicity; 
27 class AliAODTrack;
28 class AliESDtrack;
29 class AliESDPmdTrack;
30
31 class AliFlowTrackCuts : public AliFlowTrackSimpleCuts {
32
33  public:
34   AliFlowTrackCuts();
35   AliFlowTrackCuts(const char* name);
36   AliFlowTrackCuts(const AliFlowTrackCuts& someCuts);
37   AliFlowTrackCuts& operator=(const AliFlowTrackCuts& someCuts);
38   virtual ~AliFlowTrackCuts();
39
40   static AliFlowTrackCuts* GetStandardTPCOnlyTrackCuts();
41   static AliFlowTrackCuts* GetStandardTPCOnlyTrackCuts2010();
42   static AliFlowTrackCuts* GetStandardGlobalTrackCuts2010();
43   static AliFlowTrackCuts* GetStandardITSTPCTrackCuts2009(Bool_t selPrimaries=kTRUE);
44
45   Int_t Count(AliVEvent* event=NULL);
46
47   enum trackParameterType { kMC, 
48                             kGlobal, 
49                             kESD_TPConly, 
50                             kESD_SPDtracklet,
51                             kPMD
52                           };
53   enum trackParameterMix  { kPure, 
54                             kTrackWithMCkine, 
55                             kTrackWithMCPID, 
56                             kTrackWithMCpt, 
57                             kTrackWithPtFromFirstMother
58                           };
59   enum PIDsource {
60                    kTPCpid,      // default TPC pid (via GetTPCpid)
61                    kTOFpid,      // default TOF pid (via GetTOFpid)
62                    kTOFbayesian, // TOF bayesian pid (F.Noferini)
63                    kTOFbeta,     // asymmetric cuts of TOF beta signal
64                    kTPCdedx      // asymmetric cuts of TPC dedx signal
65                  };
66
67   //setters (interface to AliESDtrackCuts)
68   void SetMinNClustersTPC( Int_t a ) {fCutNClustersTPC=kTRUE; fNClustersTPCMin=a;}
69   void SetMinNClustersITS( Int_t a ) {fCutNClustersITS=kTRUE; fNClustersITSMin=a;}
70   void SetClusterRequirementITS( AliESDtrackCuts::Detector det,
71                                  AliESDtrackCuts::ITSClusterRequirement req = AliESDtrackCuts::kOff )
72                                  { InitESDcuts(); fAliESDtrackCuts->SetClusterRequirementITS(det,req); } 
73   void SetMaxChi2PerClusterTPC( Float_t a ) {fMaxChi2PerClusterTPC=a;fCutChi2PerClusterTPC=kTRUE;}
74   void SetMinChi2PerClusterTPC( Float_t a ) {fMinChi2PerClusterTPC=a;fCutChi2PerClusterTPC=kTRUE;}
75   void SetMaxChi2PerClusterITS( Float_t a ) {InitESDcuts(); fAliESDtrackCuts->SetMaxChi2PerClusterITS(a);}
76   void SetRequireTPCRefit( Bool_t a ) {InitESDcuts(); fAliESDtrackCuts->SetRequireTPCRefit(a);}
77   void SetRequireTPCStandAlone( Bool_t a) {InitESDcuts(); fAliESDtrackCuts->SetRequireTPCStandAlone(a);}
78   void SetRequireITSRefit( Bool_t a ) {InitESDcuts(); fAliESDtrackCuts->SetRequireITSRefit(a);}
79   void SetRequireITSStandAlone( Bool_t a) {InitESDcuts(); fAliESDtrackCuts->SetRequireITSStandAlone(a);}
80   void SetAcceptKinkDaughters( Bool_t a ) {InitESDcuts(); fAliESDtrackCuts->SetAcceptKinkDaughters(a);}
81   void SetMaxDCAToVertexZ( Float_t a ) {InitESDcuts(); fAliESDtrackCuts->SetMaxDCAToVertexZ(a);fCutDCAToVertexZ=kTRUE;}
82   void SetMaxDCAToVertexXY( Float_t a ) {InitESDcuts(); fAliESDtrackCuts->SetMaxDCAToVertexXY(a);fCutDCAToVertexXY=kTRUE;}
83   void SetMaxDCAToVertexXYPtDep( const char* a ) {InitESDcuts(); fAliESDtrackCuts->SetMaxDCAToVertexXYPtDep(a);}
84   void SetRequireSigmaToVertex(Bool_t a) {InitESDcuts(); fAliESDtrackCuts->SetRequireSigmaToVertex(a);}
85   void SetMaxNsigmaToVertex(Float_t sigma=1e10) {InitESDcuts(); fAliESDtrackCuts->SetMaxNsigmaToVertex(sigma); }
86   void SetDCAToVertex2D( Bool_t a ) {InitESDcuts(); fAliESDtrackCuts->SetDCAToVertex2D(a);}
87   void SetEtaRange( Float_t r1, Float_t r2 ) { SetEtaMin(r1); SetEtaMax(r2); }
88   void SetPtRange( Float_t r1, Float_t r2 ) { SetPtMin(r1); SetPtMax(r2); }
89   void SetRequireCharge( Bool_t r ) {fRequireCharge=r;}
90   void SetFakesAreOK( Bool_t b ) {fFakesAreOK=b;}
91   void SetSPDtrackletDeltaPhiMax( Double_t m ) {fSPDtrackletDeltaPhiMax=m; fCutSPDtrackletDeltaPhi=kTRUE;}
92   void SetSPDtrackletDeltaPhiMin( Double_t m ) {fSPDtrackletDeltaPhiMin=m; fCutSPDtrackletDeltaPhi=kTRUE;}
93   void SetIgnoreSignInPID( Bool_t b ) {fIgnoreSignInPID=b;}
94   void SetIgnoreTPCzRange( Double_t min, Double_t max ) 
95                          { fIgnoreTPCzRange=kTRUE; fIgnoreTPCzRangeMin=min; fIgnoreTPCzRangeMax=max; }
96   void SetAODfilterBit( UInt_t a ) {fAODFilterBit = a; fUseAODFilterBit = kTRUE;}                                                
97   void SetMinimalTPCdedx(Double_t d=10.) {fMinimalTPCdedx=d; fCutMinimalTPCdedx=kTRUE;}
98                                                  
99
100   Int_t GetMinNClustersTPC() const {if (!fAliESDtrackCuts) return 0; return fAliESDtrackCuts->GetMinNClusterTPC();}
101   Int_t GetMinNClustersITS() const {if (!fAliESDtrackCuts) return 0; return fAliESDtrackCuts->GetMinNClustersITS();}
102   AliESDtrackCuts::ITSClusterRequirement GetClusterRequirementITS( AliESDtrackCuts::Detector det ) const
103                                  {if (!fAliESDtrackCuts) return AliESDtrackCuts::kOff;  return fAliESDtrackCuts->GetClusterRequirementITS(det); } 
104   Float_t GetMaxChi2PerClusterTPC() const {if (!fAliESDtrackCuts) return 0; return fAliESDtrackCuts->GetMaxChi2PerClusterTPC();}
105   Float_t GetMaxChi2PerClusterITS() const {if (!fAliESDtrackCuts) return 0; return fAliESDtrackCuts->GetMaxChi2PerClusterITS();}
106   Bool_t GetRequireTPCRefit() const {if (!fAliESDtrackCuts) return 0; return fAliESDtrackCuts->GetRequireTPCRefit();}
107   Bool_t GetRequireTPCStandAlone() const {if (!fAliESDtrackCuts) return 0; return fAliESDtrackCuts->GetRequireTPCStandAlone();}
108   Bool_t GetRequireITSRefit() const {if (!fAliESDtrackCuts) return 0; return fAliESDtrackCuts->GetRequireITSRefit();}
109   Bool_t GetRequireITSStandAlone() const {if (!fAliESDtrackCuts) return 0; return fAliESDtrackCuts->GetRequireITSStandAlone();}
110   Bool_t GetAcceptKinkDaughters() const {if (!fAliESDtrackCuts) return 0; return fAliESDtrackCuts->GetAcceptKinkDaughters();}
111   Float_t GetMaxDCAToVertexZ() const {if (!fAliESDtrackCuts) return 0; return fAliESDtrackCuts->GetMaxDCAToVertexZ();}
112   Float_t GetMaxDCAToVertexXY() const {if (!fAliESDtrackCuts) return 0; return fAliESDtrackCuts->GetMaxDCAToVertexXY();}
113   const char* GetMaxDCAToVertexXYPtDep() const {if (!fAliESDtrackCuts) return 0; return fAliESDtrackCuts->GetMaxDCAToVertexXYPtDep();}
114   Bool_t GetRequireSigmaToVertex() const {if (!fAliESDtrackCuts) return 0; return fAliESDtrackCuts->GetRequireSigmaToVertex();}
115   Float_t GetMaxNsigmaToVertex() const {if (!fAliESDtrackCuts) return 0; return fAliESDtrackCuts->GetMaxNsigmaToVertex(); }
116   Bool_t GetDCAToVertex2D() const {if (!fAliESDtrackCuts) return 0; return fAliESDtrackCuts->GetDCAToVertex2D();}
117   void GetEtaRange( Float_t& r1, Float_t& r2 ) const { r1=GetEtaMin(); r2=GetEtaMax(); }
118   void GetPtRange( Float_t& r1, Float_t& r2 ) const { r1=GetPtMin(); r2=GetPtMax(); }
119   Bool_t GetRequireCharge() const {return fRequireCharge;}
120   Bool_t GetFakesAreOK() const {return fFakesAreOK;}
121   Double_t GetSPDtrackletDeltaPhiMax() const {return fSPDtrackletDeltaPhiMax;}
122   Double_t GetSPDtrackletDeltaPhiMin() const {return fSPDtrackletDeltaPhiMin;}
123   UInt_t GetAODFilterBit() const {if (!fUseAODFilterBit) return 0; return fAODFilterBit;}
124   Double_t GetMinimalTPCdedx() const {return fMinimalTPCdedx;}
125  
126   void SetQA(const char* dirname);
127   TObjArray* GetQA() const {return fQA;}
128
129   //MC stuff
130   void SetCutMC( Bool_t b=kTRUE );
131   void SetMCprocessType( TMCProcess t ) { fMCprocessType = t; fCutMCprocessType=kTRUE; SetCutMC();}
132   void SetMCisPrimary( Bool_t b ) { fMCisPrimary=b; fCutMCisPrimary=kTRUE; SetCutMC();}
133   void SetMCPID( Int_t pid ) { fMCPID=pid; fCutMCPID=kTRUE; SetCutMC(); }
134   TMCProcess GetMCprocessType() const { return fMCprocessType; }
135   Bool_t GetMCisPrimary() const {return fMCisPrimary;}
136   Int_t GetMCPID() const {return fMCPID;}
137
138   void SetParamType(trackParameterType paramType) {fParamType=paramType;}
139   trackParameterType GetParamType() const {return fParamType;}
140   static const char* GetParamTypeName(trackParameterType type);
141   void SetParamMix(trackParameterMix paramMix) {fParamMix=paramMix;}
142   trackParameterMix GetParamMix() const {return fParamMix;}
143
144   virtual Bool_t IsSelected(TObject* obj, Int_t id=-666);
145   virtual Bool_t IsSelectedMCtruth(TObject* obj, Int_t id=-666);
146   AliVParticle* GetTrack() const {return fTrack;}
147   AliMCParticle* GetMCparticle() const {return fMCparticle;}
148   AliFlowTrack* MakeFlowTrack() const;
149   Bool_t IsPhysicalPrimary() const; 
150   static Bool_t IsPhysicalPrimary(AliMCEvent* p, Int_t label, Bool_t requiretransported=kTRUE); 
151   
152   void SetMCevent(AliMCEvent* mcEvent) {fMCevent=mcEvent;}
153   AliMCEvent* GetMCevent() const {return fMCevent;}
154   void SetEvent(AliVEvent* event, AliMCEvent* mcEvent=NULL);
155   AliVEvent* GetEvent() const {return fEvent;}
156   Int_t GetNumberOfInputObjects() const;
157   TObject* GetInputObject(Int_t i);
158   void Clear(Option_t* option="");
159
160   //PID
161   void SetPID(AliPID::EParticleType pid, PIDsource s=kTOFpid, Double_t prob=0.9)
162              {fParticleID=pid; fPIDsource=s; fParticleProbability=prob; fCutPID=kTRUE; InitPIDcuts();}
163   void SetTPCpidCuts(TMatrixF* mat) {fTPCpidCuts=new TMatrixF(*mat);}
164   void SetTOFpidCuts(TMatrixF* mat) {fTOFpidCuts=new TMatrixF(*mat);}
165   static const char* PIDsourceName(PIDsource s);
166   AliESDpid& GetESDpid() {return fESDpid;}
167
168  protected:
169   Bool_t PassesCuts(AliVParticle* track);
170   Bool_t PassesESDcuts(AliESDtrack* track);
171   Bool_t PassesAODcuts(AliAODTrack* track);
172   Bool_t PassesPMDcuts(AliESDPmdTrack* track);
173   Bool_t PassesCuts(AliFlowTrackSimple* track);
174   Bool_t PassesCuts(AliMultiplicity* track, Int_t id);
175   Bool_t PassesMCcuts();
176   Bool_t PassesMCcuts(AliMCEvent* mcevent, Int_t label);
177   Bool_t PassesTPCdedxCut(AliESDtrack* track);
178   Bool_t PassesTPCpidCut(AliESDtrack* track);
179   Bool_t PassesTOFbetaCut(AliESDtrack* track);  
180   Bool_t PassesTOFpidCut(AliESDtrack* track);  
181   AliFlowTrack* MakeFlowTrackSPDtracklet() const;
182   AliFlowTrack* MakeFlowTrackPMDtrack() const;
183   AliFlowTrack* MakeFlowTrackVParticle() const;
184   void HandleESDtrack(AliESDtrack* track);
185   void HandleVParticle(AliVParticle* track);
186   void DefineHistograms();
187   void InitPIDcuts();
188   void InitESDcuts() {if (!fAliESDtrackCuts) fAliESDtrackCuts=new AliESDtrackCuts();}
189   // part added by F. Noferini
190   Bool_t PassesTOFbayesianCut(AliESDtrack* track); 
191   void SetPriors(); // set my favourite priors
192   Int_t GetESDPdg(AliESDtrack *track,Option_t *option="bayesianTOF",Int_t ipart=2,Float_t cPi=-1.0,Float_t cKa=0.0,Float_t cPr=0.0); // 3sigma cut ipart=0(el),1(mu),2(pi),3(K),4(p)
193   // end part added by F. Noferini
194
195   //the cuts
196   AliESDtrackCuts* fAliESDtrackCuts; //alianalysis cuts
197   TObjArray* fQA;                   //qa histograms go here
198   Bool_t fCutMC;                     //do we cut on MC?
199   Bool_t fCutMCprocessType;          //do we cut on mc process type?
200   TMCProcess fMCprocessType;         //mc process type
201   Bool_t fCutMCPID;                  //cut on MC pid?
202   Int_t fMCPID;                      //MC PID
203   Bool_t fIgnoreSignInPID;           //when PID cut is set, pass also the antiparticle
204   Bool_t fCutMCisPrimary;            //do we cut on primaryness?
205   Bool_t fRequireTransportBitForPrimaries; //require the transport bit to be set for primaries
206   Bool_t fMCisPrimary;               //is MC primary
207   Bool_t fRequireCharge;          //is charged?
208   Bool_t fFakesAreOK;             //are fakes (negative labels) ok?
209   Bool_t fCutSPDtrackletDeltaPhi; //are we cutting on the trcklet deltaphi?
210   Double_t fSPDtrackletDeltaPhiMax; //maximal deltaphi for tracklets
211   Double_t fSPDtrackletDeltaPhiMin; //minimal deltaphi for tracklets
212   Bool_t fIgnoreTPCzRange;   //ignore tracks going close to central membrane
213   Double_t fIgnoreTPCzRangeMax; //max z to ignore
214   Double_t fIgnoreTPCzRangeMin; //min z to ignore
215   Bool_t fCutChi2PerClusterTPC; //cut on tpc chi2
216   Float_t fMaxChi2PerClusterTPC; //max chi2 tpc/cluster
217   Float_t fMinChi2PerClusterTPC; //min chi2 tpc/cluster
218   Bool_t fCutNClustersTPC;       //cut on clusters?
219   Int_t fNClustersTPCMax;        //max tpc ncls
220   Int_t fNClustersTPCMin;        //min tpc clusters  
221   Bool_t fCutNClustersITS;       //cut on clusters?
222   Int_t fNClustersITSMax;        //max tpc ncls
223   Int_t fNClustersITSMin;        //min tpc clusters  
224   Bool_t fUseAODFilterBit;       //use AOD filter bit selection?
225   UInt_t fAODFilterBit;          //AOD filter bit to select
226   Bool_t fCutDCAToVertexXY;      //dca xy cut
227   Bool_t fCutDCAToVertexZ;       //dca z cut
228   Bool_t fCutMinimalTPCdedx;    //cut on minimal dedx in TPC to reject noise tracks
229   Double_t fMinimalTPCdedx;       //value for minimal TPC dedx
230
231   trackParameterType fParamType;     //parameter type tu cut on
232   trackParameterMix fParamMix;       //parameter mixing
233   AliVParticle* fTrack;              //!the track to apply cuts on
234   Double_t fTrackPhi;                //!track phi
235   Double_t fTrackEta;                //!track eta
236   Double_t fTrackWeight;             //!track weight
237   Int_t fTrackLabel;                 //!track label, or its absolute value if FakesAreOK
238   AliMCEvent* fMCevent;              //!mc event
239   AliMCParticle* fMCparticle;        //!mc particle
240   AliVEvent* fEvent;                 //!placeholder for current event
241   AliESDtrack fTPCtrack;             //!placeholder for TPC only track to avoid new/delete on every track
242
243   //PID
244   AliESDpid fESDpid; //pid obj
245   PIDsource fPIDsource; //pid source
246   TMatrixF* fTPCpidCuts; //tpc pid cuts
247   TMatrixF* fTOFpidCuts; //tof pid cuts
248   AliPID::EParticleType fParticleID; //alipid
249   Double_t fParticleProbability; //desired prob for a particle type
250
251   // part added by F. Noferini
252   static const Int_t fnPIDptBin = 20; // pT bins for priors
253   Float_t fC[fnPIDptBin][5],fBinLimitPID[fnPIDptBin]; // pt bin limit and priors
254   Float_t fProbBayes[5]; // bayesian probability
255   // end part added by F. Noferini
256
257   ClassDef(AliFlowTrackCuts,6)
258 };
259
260 #endif
261