]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGHF/vertexingHF/AliRDHFCuts.h
Transition PWG3 --> PWGHF
[u/mrichter/AliRoot.git] / PWGHF / vertexingHF / AliRDHFCuts.h
1 #ifndef ALIRDHFCUTS_H\r
2 #define ALIRDHFCUTS_H\r
3 /* Copyright(c) 1998-2010, ALICE Experiment at CERN, All rights reserved. *\r
4  * See cxx source for full Copyright notice                               */\r
5 \r
6 //***********************************************************\r
7 // Class AliRDHFCuts\r
8 // base class for cuts on AOD reconstructed heavy-flavour decays\r
9 // Author: A.Dainese, andrea.dainese@pd.infn.it\r
10 //***********************************************************\r
11 \r
12 #include <TString.h>\r
13 \r
14 #include "AliAnalysisCuts.h"\r
15 #include "AliESDtrackCuts.h"\r
16 #include "AliAODPidHF.h"\r
17 #include "AliAODEvent.h"\r
18 #include "AliVEvent.h"\r
19 \r
20 class AliAODTrack;\r
21 class AliAODRecoDecayHF;\r
22 class AliESDVertex;\r
23 \r
24 class AliRDHFCuts : public AliAnalysisCuts \r
25 {\r
26  public:\r
27 \r
28   enum ECentrality {kCentOff,kCentV0M,kCentTRK,kCentTKL,kCentCL1,kCentInvalid};\r
29   enum ESelLevel {kAll,kTracks,kPID,kCandidate};\r
30   enum EPileup {kNoPileupSelection,kRejectPileupEvent,kRejectTracksFromPileupVertex};\r
31   enum ESele {kD0toKpiCuts,kD0toKpiPID,kD0fromDstarCuts,kD0fromDstarPID,kDplusCuts,kDplusPID,kDsCuts,kDsPID,kLcCuts,kLcPID,kDstarCuts,kDstarPID};\r
32   enum ERejBits {kNotSelTrigger,kNoVertex,kTooFewVtxContrib,kZVtxOutFid,kPileupSPD,kOutsideCentrality,kPhysicsSelection};\r
33   AliRDHFCuts(const Char_t* name="RDHFCuts", const Char_t* title="");\r
34   \r
35   virtual ~AliRDHFCuts();\r
36   \r
37   AliRDHFCuts(const AliRDHFCuts& source);\r
38   AliRDHFCuts& operator=(const AliRDHFCuts& source); \r
39 \r
40   virtual void SetStandardCutsPP2010() {return;}  \r
41   virtual void SetStandardCutsPbPb2010() {return;}  \r
42 \r
43 \r
44   void SetMinCentrality(Float_t minCentrality=0.) {fMinCentrality=minCentrality;} \r
45   void SetMaxCentrality(Float_t maxCentrality=100.) {fMaxCentrality=maxCentrality;} \r
46   void SetMinVtxType(Int_t type=3) {fMinVtxType=type;}  \r
47   void SetMinVtxContr(Int_t contr=1) {fMinVtxContr=contr;}  \r
48   void SetMaxVtxRdChi2(Float_t chi2=1e6) {fMaxVtxRedChi2=chi2;}  \r
49   void SetMaxVtxZ(Float_t z=1e6) {fMaxVtxZ=z;}  \r
50   void SetMinSPDMultiplicity(Int_t mult=0) {fMinSPDMultiplicity=mult;}  \r
51 \r
52   void SetTriggerMask(ULong64_t mask=0) {fTriggerMask=mask;}\r
53   void SetUseAnyTrigger(){fTriggerMask=AliVEvent::kAny;}\r
54   void EnableMBTrigger(){\r
55     fTriggerMask|=AliVEvent::kMB;\r
56     fUseOnlyOneTrigger=kFALSE;\r
57   }\r
58   void ResetMaskAndEnableMBTrigger(){\r
59     fTriggerMask=AliVEvent::kMB;\r
60     fUseOnlyOneTrigger=kFALSE;\r
61   }\r
62   void SetUseMBTriggerExclusively(){\r
63     fTriggerMask=AliVEvent::kMB;\r
64     fUseOnlyOneTrigger=kTRUE;\r
65   }\r
66   void EnableCentralTrigger(){\r
67     fTriggerMask|=AliVEvent::kCentral;\r
68     fUseOnlyOneTrigger=kFALSE;\r
69   }\r
70   void ResetMaskAndEnableCentralTrigger(){\r
71     fTriggerMask=AliVEvent::kCentral;\r
72     fUseOnlyOneTrigger=kFALSE;\r
73   }\r
74   void SetUseCentralTriggerExclusively(){\r
75     fTriggerMask=AliVEvent::kCentral;\r
76     fUseOnlyOneTrigger=kTRUE;\r
77   }\r
78   void EnableSemiCentralTrigger(){\r
79     fTriggerMask|=AliVEvent::kSemiCentral;\r
80     fUseOnlyOneTrigger=kFALSE;\r
81   }\r
82   void ResetMaskAndEnableSemiCentralTrigger(){\r
83     fTriggerMask=AliVEvent::kSemiCentral;\r
84     fUseOnlyOneTrigger=kFALSE;\r
85   }\r
86   void SetUseSemiCentralTriggerExclusively(){\r
87     fTriggerMask=AliVEvent::kSemiCentral;\r
88     fUseOnlyOneTrigger=kTRUE;\r
89   }\r
90   void EnableEMCALTrigger(){\r
91     fTriggerMask|=(AliVEvent::kEMCEJE|AliVEvent::kEMCEGA);\r
92     fUseOnlyOneTrigger=kFALSE;\r
93   }\r
94   void ResetMaskAndnableEMCALTrigger(){\r
95     fTriggerMask=(AliVEvent::kEMCEJE|AliVEvent::kEMCEGA);\r
96     fUseOnlyOneTrigger=kFALSE;\r
97   } \r
98   void SetUseEMCALTriggerExclusively(){\r
99     fTriggerMask=(AliVEvent::kEMCEJE|AliVEvent::kEMCEGA);\r
100     fUseOnlyOneTrigger=kTRUE;\r
101   }\r
102 \r
103   void SetTriggerClass(TString trclass) {fTriggerClass=trclass;} \r
104   void SetVarsForOpt(Int_t nVars,Bool_t *forOpt);\r
105   void SetGlobalIndex(){fGlobalIndex=fnVars*fnPtBins;}\r
106   void SetGlobalIndex(Int_t nVars,Int_t nptBins){fnVars=nVars; fnPtBins=nptBins; SetGlobalIndex();}\r
107   void SetVarNames(Int_t nVars,TString *varNames,Bool_t *isUpperCut);  \r
108   void SetPtBins(Int_t nPtBinLimits,Float_t *ptBinLimits);\r
109   void SetCuts(Int_t nVars,Int_t nPtBins,Float_t** cutsRD);\r
110   void SetCuts(Int_t glIndex, Float_t* cutsRDGlob);\r
111   void AddTrackCuts(const AliESDtrackCuts *cuts) \r
112           {delete fTrackCuts; fTrackCuts=new AliESDtrackCuts(*cuts); return;}\r
113   void SetUsePID(Bool_t flag=kTRUE) {fUsePID=flag; return;}\r
114   void SetUseAOD049(Bool_t flag=kTRUE) {fUseAOD049=flag; return;}\r
115   void SetUseCentrality(Int_t flag=1);    // see enum below\r
116   void SetPidHF(AliAODPidHF* pidObj) {\r
117     if(fPidHF) delete fPidHF;\r
118     fPidHF=new AliAODPidHF(*pidObj);\r
119   }\r
120   void SetRemoveDaughtersFromPrim(Bool_t removeDaughtersPrim) {fRemoveDaughtersFromPrimary=removeDaughtersPrim;}\r
121   void SetMinPtCandidate(Double_t ptCand=-1.) {fMinPtCand=ptCand; return;}\r
122   void SetMaxPtCandidate(Double_t ptCand=1000.) {fMaxPtCand=ptCand; return;}\r
123   void SetOptPileup(Int_t opt=0){\r
124     // see enum below\r
125     fOptPileup=opt;\r
126   }\r
127   void ConfigurePileupCuts(Int_t minContrib=3, Float_t minDz=0.6){\r
128     fMinContrPileup=minContrib;\r
129     fMinDzPileup=minDz;\r
130   }\r
131 \r
132 \r
133   AliAODPidHF* GetPidHF() const {return fPidHF;}\r
134   Float_t *GetPtBinLimits() const {return fPtBinLimits;}\r
135   Int_t   GetNPtBins() const {return fnPtBins;}\r
136   Int_t   GetNVars() const {return fnVars;} \r
137   TString *GetVarNames() const {return fVarNames;} \r
138   Bool_t  *GetVarsForOpt() const {return fVarsForOpt;} \r
139   Int_t   GetNVarsForOpt() const {return fnVarsForOpt;}\r
140   const Float_t *GetCuts() const {return fCutsRD;} \r
141   void    GetCuts(Float_t**& cutsRD) const;\r
142   Float_t GetCutValue(Int_t iVar,Int_t iPtBin) const;\r
143   Double_t GetMaxVtxZ() const {return fMaxVtxZ;}  \r
144   Float_t GetCentrality(AliAODEvent* aodEvent){return GetCentrality(aodEvent,(AliRDHFCuts::ECentrality)fUseCentrality);}\r
145   Float_t GetCentrality(AliAODEvent* aodEvent, AliRDHFCuts::ECentrality estimator);\r
146   Bool_t  *GetIsUpperCut() const {return fIsUpperCut;}\r
147   AliESDtrackCuts *GetTrackCuts() const {return fTrackCuts;}\r
148   virtual AliESDtrackCuts *GetTrackCutsSoftPi() const {return 0;}\r
149   virtual void GetCutVarsForOpt(AliAODRecoDecayHF *d,Float_t *vars,Int_t nvars,Int_t *pdgdaughters) = 0;\r
150   virtual void GetCutVarsForOpt(AliAODRecoDecayHF *d,Float_t *vars,Int_t nvars,Int_t *pdgdaughters,AliAODEvent * /*aod*/)\r
151             {return GetCutVarsForOpt(d,vars,nvars,pdgdaughters);}\r
152   Int_t   GetGlobalIndex(Int_t iVar,Int_t iPtBin) const;\r
153   void    GetVarPtIndex(Int_t iGlob, Int_t& iVar, Int_t& iPtBin) const;\r
154   Bool_t  GetIsUsePID() const {return fUsePID;}\r
155   Bool_t  GetUseAOD049() const {return fUseAOD049;}\r
156   Bool_t  GetIsPrimaryWithoutDaughters() const {return fRemoveDaughtersFromPrimary;}\r
157   Bool_t GetOptPileUp() const {return fOptPileup;}\r
158   Int_t GetUseCentrality() const {return fUseCentrality;}\r
159   Float_t GetMinCentrality() const {return fMinCentrality;}\r
160   Float_t GetMaxCentrality() const {return fMaxCentrality;}\r
161   Double_t GetMinPtCandidate() const {return fMinPtCand;}\r
162   Double_t GetMaxPtCandidate() const {return fMaxPtCand;}\r
163   Bool_t IsSelected(TObject *obj) {return IsSelected(obj,AliRDHFCuts::kAll);}\r
164   Bool_t IsSelected(TList *list) {if(!list) return kTRUE; return kFALSE;}\r
165   Int_t  IsEventSelectedInCentrality(AliVEvent *event);\r
166   Bool_t IsEventSelected(AliVEvent *event);\r
167   Bool_t AreDaughtersSelected(AliAODRecoDecayHF *rd) const;\r
168   Bool_t IsDaughterSelected(AliAODTrack *track,const AliESDVertex *primary,AliESDtrackCuts *cuts) const;\r
169   virtual Int_t IsSelectedPID(AliAODRecoDecayHF * /*rd*/) {return 1;}\r
170 \r
171   virtual Int_t IsSelected(TObject* obj,Int_t selectionLevel) = 0;\r
172   virtual Int_t IsSelected(TObject* obj,Int_t selectionLevel,AliAODEvent* /*aod*/)\r
173                 {return IsSelected(obj,selectionLevel);}\r
174   Int_t PtBin(Double_t pt) const;\r
175   void PrintAll()const;\r
176 \r
177   virtual Bool_t IsInFiducialAcceptance(Double_t /*pt*/,Double_t /*y*/) const {return kTRUE;}\r
178 \r
179   void SetWhyRejection(Int_t why) {fWhyRejection=why; return;}\r
180   Int_t GetWhyRejection() const {return fWhyRejection;}\r
181   UInt_t GetEventRejectionBitMap() const {return fEvRejectionBits;}\r
182   Bool_t IsEventRejectedDueToTrigger() const {\r
183     return fEvRejectionBits&(1<<kNotSelTrigger);\r
184   }\r
185   Bool_t IsEventRejectedDueToNotRecoVertex() const {\r
186     return fEvRejectionBits&(1<<kNoVertex);\r
187   }\r
188   Bool_t IsEventRejectedDueToVertexContributors() const {\r
189     return fEvRejectionBits&(1<<kTooFewVtxContrib);\r
190   }\r
191   Bool_t IsEventRejectedDueToZVertexOutsideFiducialRegion() const {\r
192     return fEvRejectionBits&(1<<kZVtxOutFid);\r
193   }\r
194   Bool_t IsEventRejectedDueToPileupSPD() const {\r
195     return fEvRejectionBits&(1<<kPileupSPD);\r
196   }\r
197   Bool_t IsEventRejectedDueToCentrality() const {\r
198     return fEvRejectionBits&(1<<kOutsideCentrality);\r
199   }\r
200   Bool_t IsEventRejectedDuePhysicsSelection() const {\r
201     return fEvRejectionBits&(1<<kPhysicsSelection);\r
202   }\r
203 \r
204 \r
205   void SetFixRefs(Bool_t fix=kTRUE) {fFixRefs=fix; return;}\r
206   void SetUsePhysicsSelection(Bool_t use=kTRUE){fUsePhysicsSelection=use; return;}\r
207   Bool_t GetUsePhysicsSelection() const { return fUsePhysicsSelection; }\r
208 \r
209 \r
210 \r
211   Bool_t CompareCuts(const AliRDHFCuts *obj) const;\r
212   void MakeTable()const;\r
213 \r
214   Int_t GetIsSelectedCuts() const {return fIsSelectedCuts;}\r
215   Int_t GetIsSelectedPID() const  {return fIsSelectedPID;}\r
216 \r
217   void SetUseMCVertex() { fUseMCVertex=kTRUE; }\r
218   Bool_t GetUseMCVertex() const { return fUseMCVertex; }\r
219 \r
220   Bool_t RecalcOwnPrimaryVtx(AliAODRecoDecayHF *d,AliAODEvent *aod) const;\r
221   Bool_t SetMCPrimaryVtx(AliAODRecoDecayHF *d,AliAODEvent *aod) const;\r
222   void   CleanOwnPrimaryVtx(AliAODRecoDecayHF *d,AliAODEvent *aod,AliAODVertex *origownvtx) const;\r
223 \r
224   Bool_t CountEventForNormalization() const \r
225   { if(fWhyRejection==0) {return kTRUE;} else {return kFALSE;} }\r
226 \r
227   void SetKeepSignalMC() {fKeepSignalMC=kTRUE; return;}\r
228 \r
229   // Flag and pt-maximum to check if the candidate daughters fulfill the kFirst criteria\r
230   void SetSelectCandTrackSPDFirst( Bool_t flag, Double_t ptmax )\r
231   { fIsCandTrackSPDFirst=flag; fMaxPtCandTrackSPDFirst=ptmax; }\r
232   Bool_t IsSelectCandTrackSPDFirst() const { return fIsCandTrackSPDFirst; }\r
233   Double_t IsMaxCandTrackSPDFirst() const { return fMaxPtCandTrackSPDFirst; }\r
234 \r
235 \r
236  protected:\r
237 \r
238   void SetNPtBins(Int_t nptBins){fnPtBins=nptBins;}\r
239   void SetNVars(Int_t nVars){fnVars=nVars;}\r
240 \r
241   Bool_t IsSignalMC(AliAODRecoDecay *d,AliAODEvent *aod,Int_t pdg) const;\r
242 \r
243   // cuts on the event\r
244   Int_t fMinVtxType; // 0: not cut; 1: SPDZ; 2: SPD3D; 3: Tracks\r
245   Int_t fMinVtxContr;   // minimum vertex contributors\r
246   Float_t fMaxVtxRedChi2; // maximum chi2/ndf\r
247   Float_t fMaxVtxZ; // maximum |z| of primary vertex\r
248   Int_t fMinSPDMultiplicity; // SPD multiplicity\r
249   ULong64_t fTriggerMask; // trigger mask\r
250   Bool_t fUseOnlyOneTrigger; // flag to select one trigger only\r
251   TString  fTriggerClass; // trigger class\r
252   // quality cuts on the daughter tracks\r
253   AliESDtrackCuts *fTrackCuts; // tracks for daughter tracks (AOD converted to ESD on the flight!)\r
254   // cuts on the candidate\r
255   Int_t fnPtBins;  // number of pt bins for cuts\r
256   Int_t fnPtBinLimits; // "number of limits", that is fnPtBins+1\r
257   Float_t* fPtBinLimits; //[fnPtBinLimits]  pt bins\r
258   Int_t fnVars;    // number of cut vars for candidates\r
259   TString *fVarNames; //[fnVars] names of the variables\r
260   Int_t fnVarsForOpt;    // number of cut vars to be optimized for candidates\r
261   Bool_t *fVarsForOpt; //[fnVars] kTRUE for vars to be used in optimization\r
262   Int_t fGlobalIndex; // fnVars*fnPtBins\r
263   Float_t *fCutsRD; //[fGlobalIndex] the cuts values\r
264   Bool_t  *fIsUpperCut; //[fnVars] use > or < to select\r
265   Bool_t fUsePID; // enable PID usage (off by default)\r
266   Bool_t fUseAOD049; // enable AOD049 centrality cleanup\r
267   AliAODPidHF *fPidHF; // PID for heavy flavours manager\r
268   Int_t fWhyRejection; // used to code the step at which candidate was rejected\r
269   UInt_t fEvRejectionBits; //bit map storing the full info about event rejection\r
270   Bool_t fRemoveDaughtersFromPrimary; // flag to switch on the removal of duaghters from the primary vertex computation\r
271   Bool_t fUseMCVertex; // use MC primary vertex \r
272   Bool_t fUsePhysicsSelection; // use Physics selection criteria\r
273   Int_t  fOptPileup;      // option for pielup selection\r
274   Int_t  fMinContrPileup; // min. n. of tracklets in pileup vertex\r
275   Float_t fMinDzPileup;   // min deltaz between main and pileup vertices\r
276   Int_t   fUseCentrality; // off =0 (default)\r
277                           // 1 = V0 \r
278                           // 2 = Tracks\r
279                           // 3 = Tracklets\r
280                           // 4 = SPD clusters outer \r
281   Float_t fMinCentrality; // minimum centrality for selected events\r
282   Float_t fMaxCentrality; // maximum centrality for selected events\r
283   Bool_t  fFixRefs;       // fix the daughter track references \r
284   Int_t  fIsSelectedCuts; // outcome of cuts selection\r
285   Int_t  fIsSelectedPID;  // outcome of PID selection\r
286   Double_t fMinPtCand; // minimum pt of the candidate\r
287   Double_t fMaxPtCand; // minimum pt of the candidate\r
288   Bool_t  fKeepSignalMC; // IsSelected returns always kTRUE for MC signal\r
289   Bool_t fIsCandTrackSPDFirst; // flag to select the track kFirst criteria for pt < ptlimit\r
290   Double_t fMaxPtCandTrackSPDFirst; // maximum pt of the candidate for which to check if the daughters fulfill kFirst criteria\r
291 \r
292   ClassDef(AliRDHFCuts,21);  // base class for cuts on AOD reconstructed heavy-flavour decays\r
293 };\r
294 \r
295 #endif\r