]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGHF/hfe/AliHFEcuts.h
Update to run on AOD
[u/mrichter/AliRoot.git] / PWGHF / hfe / AliHFEcuts.h
1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 *                                                                        *
4 * Author: The ALICE Off-line Project.                                    *
5 * Contributors are mentioned in the code where appropriate.              *
6 *                                                                        *
7 * Permission to use, copy, modify and distribute this software and its   *
8 * documentation strictly for non-commercial purposes is hereby granted   *
9 * without fee, provided that the above copyright notice appears in all   *
10 * copies and that both the copyright notice and this permission notice   *
11 * appear in the supporting documentation. The authors make no claims     *
12 * about the suitability of this software for any purpose. It is          *
13 * provided "as is" without express or implied warranty.                  *
14 **************************************************************************/
15 //
16 // Cut container class for the ALICE HFE group
17 // Serves also as interface to the correction Framework
18 // Provides a set of standard cuts
19 //
20 #ifndef ALIHFECUTS_H
21 #define ALIHFECUTS_H
22
23 #ifndef ROOT_TNamed
24 #include <TNamed.h>
25 #endif
26
27 #ifndef ALIHFEEXTRACUTS_H
28 #include "AliHFEextraCuts.h"
29 #endif
30
31 class AliCFManager;
32 class AliESDtrack;
33 class AliMCEvent;
34 class AliMCParticle;
35 class AliVEvent;
36
37 class TObjArray;
38 class TList;
39
40 class AliHFEcuts : public TNamed{
41   public:
42     typedef enum{
43       kStepRecNoCut = 0,
44       kStepRecKineITSTPC = 1,
45       kStepRecPrim = 2,
46       kStepHFEcutsITS = 3,
47       kStepHFEcutsTOF = 4,
48       kStepHFEcutsTPC = 5,
49       kStepHFEcutsTRD = 6,
50       kNcutStepsRecTrack = 7
51     } RecoCutStep_t;
52     typedef enum{
53       kStepHFEcutsDca = 0, 
54       kNcutStepsDETrack = 1
55     } DECutStep_t;
56     typedef enum{
57       kStepHFEcutsSecvtx = 0, 
58       kNcutStepsSecvtxTrack = 1
59     } SecvtxCutStep_t;
60     typedef enum{
61       kStepMCGenerated = 0,
62       kStepMCGeneratedZOutNoPileUpCentralityFine = 1,
63       kStepMCGeneratedEventCut = 2,
64       kStepMCInAcceptance = 3,
65       kNcutStepsMCTrack =  4
66     } MCCutStep_t;
67     typedef enum{
68       kEventStepGenerated = 0,
69       kEventStepRecNoCut = 1,
70       kEventStepRecNoPileUp = 2,
71       kEventStepRecCentralityOk = 3,
72       kEventStepZRange = 4,
73       kEventStepReconstructed = 5,
74       kNcutStepsEvent = 6
75     } EventCutStep_t;
76
77     AliHFEcuts();
78     AliHFEcuts(const Char_t *name, const Char_t *title);
79     AliHFEcuts(const AliHFEcuts &c);
80     AliHFEcuts &operator=(const AliHFEcuts &c);
81     void Copy(TObject &o) const;
82     Long64_t Merge(const TCollection *list);
83     ~AliHFEcuts();
84     
85     void Initialize(AliCFManager *cfm);
86     void Initialize();
87
88     Bool_t CheckParticleCuts(UInt_t step, TObject *o);
89     Bool_t CheckEventCuts(const char*namestep, TObject *o);
90     void SetRecEvent(const AliVEvent *ev);
91     void SetMCEvent(const AliMCEvent *ev);
92   
93     TList *GetQAhistograms() const { return fHistQA; }
94     
95     void SetQAOn() {SetBit(kDebugMode, kTRUE); };
96     void UnsetQA() {SetBit(kDebugMode, kFALSE); };
97     Bool_t IsQAOn() const { return TestBit(kDebugMode); };
98     void SetAOD() { SetBit(kAOD, kTRUE); }
99     void SetESD() { SetBit(kAOD, kFALSE); }
100     Bool_t IsAOD() const { return TestBit(kAOD); }
101     Bool_t IsESD() const { return !TestBit(kAOD); }
102
103     // Cut Names
104     static const Char_t *MCCutName(UInt_t step){
105       if(step >= kNcutStepsMCTrack) return fgkUndefined;
106       return fgkMCCutName[step];
107     };
108     static const Char_t *RecoCutName(UInt_t step){
109       if(step >= kNcutStepsRecTrack) return fgkUndefined;
110       return fgkRecoCutName[step];
111     }
112     static const Char_t *DECutName(UInt_t step){
113       if(step >= kNcutStepsDETrack) return fgkUndefined;
114       return fgkDECutName[step];
115     }
116     static const Char_t *SecvtxCutName(UInt_t step){
117       if(step >= kNcutStepsSecvtxTrack) return fgkUndefined;
118       return fgkSecvtxCutName[step];
119     }
120     static const Char_t *EventCutName(UInt_t step){
121       if(step >= kNcutStepsEvent) return fgkUndefined;
122       return fgkEventCutName[step];
123     }
124    
125     // Getters
126     Bool_t IsRequireITSpixel() const { return TESTBIT(fRequirements, kITSPixel); };
127     Bool_t IsRequireMaxImpactParam() const { return TESTBIT(fRequirements, kMaxImpactParam); };
128     Bool_t IsRequirePrimary() const { return TESTBIT(fRequirements, kPrimary); };
129     Bool_t IsRequireProdVertex() const { return TESTBIT(fRequirements, kProductionVertex); };
130     Bool_t IsRequireSigmaToVertex() const { return TESTBIT(fRequirements, kSigmaToVertex); };
131     Bool_t IsRequireDCAToVertex() const {return TESTBIT(fRequirements, kDCAToVertex); };
132     Bool_t IsRequireKineMCCuts() const {return TESTBIT(fRequirements, kKineMCCuts); };
133     Double_t GetVertexRange() const {return fVertexRangeZ; };
134     Int_t GetMinTrackletsTRD() const { return fMinTrackletsTRD; }
135     
136     // Setters
137     inline void SetCutITSpixel(UChar_t cut);
138     void SetCheckITSLayerStatus(Bool_t checkITSLayerStatus) { fCheckITSLayerStatus = checkITSLayerStatus; }
139     void SetMinNClustersTPC(UChar_t minClustersTPC) { fMinClustersTPC = minClustersTPC; }
140     void SetMinNClustersTPCPID(UChar_t minClustersTPC) { fMinClustersTPCPID = minClustersTPC; }
141     void SetMinNClustersITS(UChar_t minClustersITS) { fMinClustersITS = minClustersITS; }
142     void SetMinNTrackletsTRD(UChar_t minNtrackletsTRD, Bool_t exact = kFALSE) { fMinTrackletsTRD = minNtrackletsTRD; fTRDtrackletsExact = exact; }
143     void SetMaxChi2perClusterITS(Double_t chi2) { fMaxChi2clusterITS = chi2; };
144     void SetMaxChi2perClusterTPC(Double_t chi2) { fMaxChi2clusterTPC = chi2; };
145     inline void SetMaxImpactParam(Double_t radial, Double_t z);
146     inline void SetIPcutParam(Float_t p0, Float_t p1, Float_t p2, Float_t p3, Bool_t isipsigma, Bool_t isabs);
147     void SetMinRatioTPCclusters(Double_t minRatioTPC) { fMinClusterRatioTPC = minRatioTPC; };
148     void SetPtRange(Double_t ptmin, Double_t ptmax){fPtRange[0] = ptmin; fPtRange[1] = ptmax;};
149     inline void SetProductionVertex(Double_t xmin, Double_t xmax, Double_t ymin, Double_t ymax);
150     inline void SetSigmaToVertex(Double_t sig);
151     inline void SetSigmaToVertexXY(Double_t sig);
152     inline void SetSigmaToVertexZ(Double_t sig);
153     void SetTPCmodes(AliHFEextraCuts::ETPCclusterDef_t clusterDef, AliHFEextraCuts::ETPCclrDef_t ratioDef) {
154       fTPCclusterDef= clusterDef;
155       fTPCratioDef = ratioDef;
156     }
157     void SetVertexRange(Double_t zrange){fVertexRangeZ = zrange;};
158     void SetTOFPIDStep(Bool_t tofPidStep) {fTOFPIDStep = tofPidStep;};
159     void SetTOFMISMATCHStep(Bool_t tofMismatchStep) {fTOFMISMATCHStep = tofMismatchStep;};
160     void SetTPCPIDCleanUpStep(Bool_t tpcPIDCleanUpStep) {fTPCPIDCLEANUPStep = tpcPIDCleanUpStep;};
161     void SetUseMixedVertex(Bool_t useMixedVertex) {fUseMixedVertex = useMixedVertex;};    
162     void SetFractionOfSharedTPCClusters(Double_t fractionOfSharedTPCClusters) {fFractionOfSharedTPCClusters = fractionOfSharedTPCClusters;};
163     void SetMaxImpactParameterRpar(Bool_t maxImpactParameterRpar) { fMaxImpactParameterRpar = maxImpactParameterRpar; };
164     
165     inline void CreateStandardCuts();
166     
167     // Requirements
168     void SetAdditionalStatusRequirement(Long_t requirement) {fAdditionalStatusRequirement = requirement;}
169     void SetRequireDCAToVertex() { SETBIT(fRequirements, kDCAToVertex); CLRBIT(fRequirements, kSigmaToVertex); };
170     void SetRequireIsPrimary() { SETBIT(fRequirements, kPrimary); };
171     void SetRequireITSPixel() { SETBIT(fRequirements, kITSPixel); }
172     void UnsetRequireITSPixel() { CLRBIT(fRequirements, kITSPixel); }
173     void SetRequireProdVertex() { SETBIT(fRequirements, kProductionVertex); };
174     void SetRequireSigmaToVertex() { SETBIT(fRequirements, kSigmaToVertex); CLRBIT(fRequirements, kDCAToVertex); };
175     void UnsetVertexRequirement() { CLRBIT(fRequirements, kDCAToVertex); CLRBIT(fRequirements, kSigmaToVertex); }
176     void SetRequireKineMCCuts() { SETBIT(fRequirements, kKineMCCuts); };
177
178     void SetDebugLevel(Int_t level) { fDebugLevel = level; };
179     Int_t GetDebugLevel() const { return fDebugLevel; };
180
181   private:
182     enum{
183       kDebugMode = BIT(14),
184       kAOD = BIT(15)
185     };
186     typedef enum{
187       kPrimary = 0,
188       kProductionVertex = 1,
189       kSigmaToVertex = 2,
190       kDCAToVertex = 3,
191       kITSPixel = 4,
192       kMaxImpactParam = 5,
193       kKineMCCuts = 6
194     } Require_t;
195     void SetParticleGenCutList();
196     void SetAcceptanceCutList();
197     void SetRecKineITSTPCCutList();
198     void SetRecPrimaryCutList();
199     void SetHFElectronITSCuts();
200     void SetHFElectronTOFCuts();
201     void SetHFElectronTPCCuts();
202     void SetHFElectronTRDCuts();
203     void SetHFElectronDcaCuts();
204     void SetEventCutList(Int_t istep);
205
206     static const Char_t* fgkMCCutName[kNcutStepsMCTrack];     // Cut step names for MC single Track cuts
207     static const Char_t* fgkRecoCutName[kNcutStepsRecTrack];  // Cut step names for Rec single Track cuts
208     static const Char_t* fgkDECutName[kNcutStepsDETrack];     // Cut step names for impact parameter cuts
209     static const Char_t* fgkSecvtxCutName[kNcutStepsSecvtxTrack];     // Cut step names for secondary vertexing cuts
210     static const Char_t* fgkEventCutName[kNcutStepsEvent];    // Cut step names for Event cuts
211     static const Char_t* fgkUndefined;                        // Name for undefined (overflow)
212   
213     ULong64_t fRequirements;      // Bitmap for requirements
214     AliHFEextraCuts::ETPCclusterDef_t fTPCclusterDef;       // TPC cluster definition
215     AliHFEextraCuts::ETPCclrDef_t fTPCratioDef;             // TPC cluster ratio Definition
216     Double_t fDCAtoVtx[2];            // DCA to Vertex
217     Double_t fProdVtx[4];               // Production Vertex
218     Double_t fPtRange[2];               // pt range
219     UChar_t fMinClustersTPC;        // Min.Number of TPC clusters
220     UChar_t fMinClustersTPCPID;   // Min.Number of TPC clusters
221     UChar_t fMinClustersITS;        // Min.Number of TPC clusters
222     UChar_t fMinTrackletsTRD;       // Min. Number of TRD tracklets
223     UChar_t fCutITSPixel;               // Cut on ITS pixel
224     Bool_t  fCheckITSLayerStatus;       // Check ITS layer status
225     Double_t fMaxChi2clusterITS;        // Max Chi2 per ITS cluster
226     Double_t fMaxChi2clusterTPC;        // Max Chi2 per TPC cluster
227     Double_t fMinClusterRatioTPC;       // Min. Ratio findable / found TPC clusters
228     Double_t fSigmaToVtx[3];        // Sigma To Vertex
229     Double_t fVertexRangeZ;             // Vertex Range reconstructed
230     Bool_t   fTRDtrackletsExact;        // Require exact number of tracklets
231     Bool_t   fTOFPIDStep;               // TOF matching step efficiency
232     Bool_t   fTOFMISMATCHStep;        // TOF mismatch step
233     Bool_t   fTPCPIDCLEANUPStep;      // TPC PIC cleanup step
234     Bool_t   fUseMixedVertex;         // Use primary vertex from track only as before
235     Float_t  fIPCutParams[4];         // Parameters of impact parameter cut parametrization
236     Bool_t   fIsIPSigmacut;           // if IP cut or IP sigma cut 
237     Bool_t   fIsIPAbs;                // if abs IP sigma cut
238     Double_t fFractionOfSharedTPCClusters; // Fraction of shared TPC clusters
239     Bool_t   fMaxImpactParameterRpar;      // Max impact parameter
240     Long_t   fAdditionalStatusRequirement; // Additional status bit requirement 
241
242     
243     TList *fHistQA;                         //! QA Histograms
244     TObjArray *fCutList;                //! List of cut objects(Correction Framework Manager)
245
246     Int_t fDebugLevel;            // Debug Level
247     
248   ClassDef(AliHFEcuts, 2)         // Container for HFE cuts
249 };
250
251 //__________________________________________________________________
252 void AliHFEcuts::SetProductionVertex(Double_t xmin, Double_t xmax, Double_t ymin, Double_t ymax){
253   // Set the production vertex constraint
254   SetRequireProdVertex();
255   fProdVtx[0] = xmin;
256   fProdVtx[1] = xmax;
257   fProdVtx[2] = ymin;
258   fProdVtx[3] = ymax;
259 }
260
261 //__________________________________________________________________
262 void AliHFEcuts::SetSigmaToVertex(Double_t sig){
263   SetRequireSigmaToVertex();
264   fSigmaToVtx[0] = sig;
265 }
266
267 //__________________________________________________________________
268 void AliHFEcuts::SetSigmaToVertexXY(Double_t sig){
269   SetRequireSigmaToVertex();
270   fSigmaToVtx[1] = sig;
271 }
272
273 //__________________________________________________________________
274 void AliHFEcuts::SetSigmaToVertexZ(Double_t sig){
275   SetRequireSigmaToVertex();
276   fSigmaToVtx[2] = sig;
277 }
278
279 //__________________________________________________________________
280 void AliHFEcuts::SetMaxImpactParam(Double_t radial, Double_t z){
281   SetRequireDCAToVertex();
282   fDCAtoVtx[0] = radial;
283   fDCAtoVtx[1] = z;
284 }
285
286 //__________________________________________________________________
287 void AliHFEcuts::SetIPcutParam(Float_t p0, Float_t p1, Float_t p2, Float_t p3, Bool_t isipsigma, Bool_t isabs){
288   // Set parameters for impact parameter cut parametrization
289   fIPCutParams[0] = p0;
290   fIPCutParams[1] = p1;
291   fIPCutParams[2] = p2;
292   fIPCutParams[3] = p3;
293   fIsIPSigmacut = isipsigma;
294   fIsIPAbs = isabs;
295 }
296
297 //__________________________________________________________________
298 void AliHFEcuts::SetCutITSpixel(UChar_t cut){
299   SetRequireITSPixel();
300   fCutITSPixel = cut;
301 }
302
303 //__________________________________________________________________
304 void AliHFEcuts::CreateStandardCuts(){
305   //
306   // Standard Cuts defined by the HFE Group
307   //
308   SetRequireProdVertex();
309   fProdVtx[0] = 0;
310   fProdVtx[1] = 3;
311   fProdVtx[2] = 0;
312   fProdVtx[3] = 3;
313   //SetRequireDCAToVertex();
314   //fDCAtoVtx[0] = 0.5;
315   //fDCAtoVtx[1] = 1.5;
316   fMinClustersTPC = 80;
317   fMinClustersITS = 4;
318   fMinTrackletsTRD = 0;
319   SetRequireITSPixel();
320   fCutITSPixel = AliHFEextraCuts::kFirst;
321   fMaxChi2clusterITS = -1.;
322   fMaxChi2clusterTPC = 4.;
323   fMinClusterRatioTPC = 0.6;
324   fPtRange[0] = 0.1;
325   fPtRange[1] = 20.;
326   SetRequireKineMCCuts();
327 }
328 #endif