Update of the HFE package
[u/mrichter/AliRoot.git] / PWG3 / 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 AliMCParticle;
34
35 class TObjArray;
36 class TList;
37
38 class AliHFEcuts : public TNamed{
39   public:
40     typedef enum{
41       kStepRecNoCut = 0,
42       kStepRecKineITSTPC = 1,
43       kStepRecPrim = 2,
44       kStepHFEcutsITS = 3,
45       kStepHFEcutsTOF = 4,
46       kStepHFEcutsTRD = 5,
47       kNcutStepsRecTrack = 6
48     } RecoCutStep_t;
49     typedef enum{
50       kStepHFEcutsDca = 0, 
51       kNcutStepsDETrack = 1
52     } DECutStep_t;
53     typedef enum{
54       kStepHFEcutsSecvtx = 0, 
55       kNcutStepsSecvtxTrack = 1
56     } SecvtxCutStep_t;
57     typedef enum{
58       kStepMCGenerated = 0,
59       kStepMCGeneratedZOutNoPileUpCentralityFine = 1,
60       kStepMCGeneratedEventCut = 2,
61       kStepMCInAcceptance = 3,
62       kNcutStepsMCTrack =  4
63     } MCCutStep_t;
64     typedef enum{
65       kEventStepGenerated = 0,
66       kEventStepRecNoCut = 1,
67       kEventStepRecNoPileUp = 2,
68       kEventStepRecCentralityOk = 3,
69       kEventStepZRange = 4,
70       kEventStepReconstructed = 5,
71       kNcutStepsEvent = 6
72     } EventCutStep_t;
73
74     AliHFEcuts();
75     AliHFEcuts(const Char_t *name, const Char_t *title);
76     AliHFEcuts(const AliHFEcuts &c);
77     AliHFEcuts &operator=(const AliHFEcuts &c);
78     void Copy(TObject &o) const;
79     ~AliHFEcuts();
80     
81     void Initialize(AliCFManager *cfm);
82     void Initialize();
83
84     Bool_t CheckParticleCuts(UInt_t step, TObject *o);
85     Bool_t CheckEventCuts(const char*namestep, TObject *o);
86   
87     TList *GetQAhistograms() const { return fHistQA; }
88     
89     void SetQAOn() {SetBit(kDebugMode, kTRUE); };
90     void UnsetQA() {SetBit(kDebugMode, kFALSE); };
91     Bool_t IsQAOn() const { return TestBit(kDebugMode); };
92     void SetAOD() { SetBit(kAOD, kTRUE); }
93     void SetESD() { SetBit(kAOD, kFALSE); }
94     Bool_t IsAOD() const { return TestBit(kAOD); }
95     Bool_t IsESD() const { return !TestBit(kAOD); }
96
97     // Cut Names
98     static const Char_t *MCCutName(UInt_t step){
99       if(step >= kNcutStepsMCTrack) return fgkUndefined;
100       return fgkMCCutName[step];
101     };
102     static const Char_t *RecoCutName(UInt_t step){
103       if(step >= kNcutStepsRecTrack) return fgkUndefined;
104       return fgkRecoCutName[step];
105     }
106     static const Char_t *DECutName(UInt_t step){
107       if(step >= kNcutStepsDETrack) return fgkUndefined;
108       return fgkDECutName[step];
109     }
110     static const Char_t *SecvtxCutName(UInt_t step){
111       if(step >= kNcutStepsSecvtxTrack) return fgkUndefined;
112       return fgkSecvtxCutName[step];
113     }
114     static const Char_t *EventCutName(UInt_t step){
115       if(step >= kNcutStepsEvent) return fgkUndefined;
116       return fgkEventCutName[step];
117     }
118    
119     // Getters
120     Bool_t IsRequireITSpixel() const { return TESTBIT(fRequirements, kITSPixel); };
121     Bool_t IsRequireMaxImpactParam() const { return TESTBIT(fRequirements, kMaxImpactParam); };
122     Bool_t IsRequirePrimary() const { return TESTBIT(fRequirements, kPrimary); };
123     Bool_t IsRequireProdVertex() const { return TESTBIT(fRequirements, kProductionVertex); };
124     Bool_t IsRequireSigmaToVertex() const { return TESTBIT(fRequirements, kSigmaToVertex); };
125     Bool_t IsRequireDCAToVertex() const {return TESTBIT(fRequirements, kDCAToVertex); };
126     Bool_t IsRequireKineMCCuts() const {return TESTBIT(fRequirements, kKineMCCuts); };
127     Double_t GetVertexRange() const {return fVertexRangeZ; };
128     Int_t GetMinTrackletsTRD() const { return fMinTrackletsTRD; }
129     
130     // Setters
131     inline void SetCutITSpixel(UChar_t cut);
132     void SetCheckITSLayerStatus(Bool_t checkITSLayerStatus) { fCheckITSLayerStatus = checkITSLayerStatus; }
133     void SetMinNClustersTPC(UChar_t minClustersTPC) { fMinClustersTPC = minClustersTPC; }
134     void SetMinNClustersITS(UChar_t minClustersITS) { fMinClustersITS = minClustersITS; }
135     void SetMinNTrackletsTRD(UChar_t minNtrackletsTRD) { fMinTrackletsTRD = minNtrackletsTRD; }
136     void SetMaxChi2perClusterTPC(Double_t chi2) { fMaxChi2clusterTPC = chi2; };
137     inline void SetMaxImpactParam(Double_t radial, Double_t z);
138     inline void SetIPcutParam(Float_t p0, Float_t p1, Float_t p2, Float_t p3, Bool_t isipsigma);
139     void SetMinRatioTPCclusters(Double_t minRatioTPC) { fMinClusterRatioTPC = minRatioTPC; };
140     void SetPtRange(Double_t ptmin, Double_t ptmax){fPtRange[0] = ptmin; fPtRange[1] = ptmax;};
141     inline void SetProductionVertex(Double_t xmin, Double_t xmax, Double_t ymin, Double_t ymax);
142     inline void SetSigmaToVertex(Double_t sig);
143     void SetTPCmodes(AliHFEextraCuts::ETPCclusterDef_t clusterDef, AliHFEextraCuts::ETPCclrDef_t ratioDef) {
144       fTPCclusterDef= clusterDef;
145       fTPCratioDef = ratioDef;
146     }
147     void SetVertexRange(Double_t zrange){fVertexRangeZ = zrange;};
148     void SetTOFPIDStep(Bool_t tofPidStep) {fTOFPIDStep = tofPidStep;};
149     void SetTOFMISMATCHStep(Bool_t tofMismatchStep) {fTOFMISMATCHStep = tofMismatchStep;};
150     void SetUseMixedVertex(Bool_t useMixedVertex) {fUseMixedVertex = useMixedVertex;};    
151     void SetFractionOfSharedTPCClusters( Bool_t fractionOfSharedTPCClusters) {fFractionOfSharedTPCClusters = fractionOfSharedTPCClusters;};
152     void SetMaxImpactParameterRpar(Bool_t maxImpactParameterRpar) { fMaxImpactParameterRpar = maxImpactParameterRpar; };
153     
154     inline void CreateStandardCuts();
155     
156     // Requirements
157     void SetRequireDCAToVertex() { SETBIT(fRequirements, kDCAToVertex); CLRBIT(fRequirements, kSigmaToVertex); };
158     void SetRequireIsPrimary() { SETBIT(fRequirements, kPrimary); };
159     void SetRequireITSPixel() { SETBIT(fRequirements, kITSPixel); }
160     void SetRequireProdVertex() { SETBIT(fRequirements, kProductionVertex); };
161     void SetRequireSigmaToVertex() { SETBIT(fRequirements, kSigmaToVertex); CLRBIT(fRequirements, kDCAToVertex); };
162     void UnsetVertexRequirement() { CLRBIT(fRequirements, kDCAToVertex); CLRBIT(fRequirements, kSigmaToVertex); }
163     void SetRequireKineMCCuts() { SETBIT(fRequirements, kKineMCCuts); };
164
165     void SetDebugLevel(Int_t level) { fDebugLevel = level; };
166     Int_t GetDebugLevel() const { return fDebugLevel; };
167
168   private:
169     enum{
170       kDebugMode = BIT(14),
171       kAOD = BIT(15)
172     };
173     typedef enum{
174       kPrimary = 0,
175       kProductionVertex = 1,
176       kSigmaToVertex = 2,
177       kDCAToVertex = 3,
178       kITSPixel = 4,
179       kMaxImpactParam = 5,
180       kKineMCCuts = 6
181     } Require_t;
182     void SetParticleGenCutList();
183     void SetAcceptanceCutList();
184     void SetRecKineITSTPCCutList();
185     void SetRecPrimaryCutList();
186     void SetHFElectronITSCuts();
187     void SetHFElectronTOFCuts();
188     void SetHFElectronTRDCuts();
189     void SetHFElectronDcaCuts();
190     void SetEventCutList(Int_t istep);
191
192     static const Char_t* fgkMCCutName[kNcutStepsMCTrack];     // Cut step names for MC single Track cuts
193     static const Char_t* fgkRecoCutName[kNcutStepsRecTrack];  // Cut step names for Rec single Track cuts
194     static const Char_t* fgkDECutName[kNcutStepsDETrack];     // Cut step names for impact parameter cuts
195     static const Char_t* fgkSecvtxCutName[kNcutStepsSecvtxTrack];     // Cut step names for secondary vertexing cuts
196     static const Char_t* fgkEventCutName[kNcutStepsEvent];    // Cut step names for Event cuts
197     static const Char_t* fgkUndefined;                        // Name for undefined (overflow)
198   
199     ULong64_t fRequirements;      // Bitmap for requirements
200     AliHFEextraCuts::ETPCclusterDef_t fTPCclusterDef;       // TPC cluster definition
201     AliHFEextraCuts::ETPCclrDef_t fTPCratioDef;             // TPC cluster ratio Definition
202     Double_t fDCAtoVtx[2];            // DCA to Vertex
203     Double_t fProdVtx[4];               // Production Vertex
204     Double_t fPtRange[2];               // pt range
205     UChar_t fMinClustersTPC;        // Min.Number of TPC clusters
206     UChar_t fMinClustersITS;        // Min.Number of TPC clusters
207     UChar_t fMinTrackletsTRD;       // Min. Number of TRD tracklets
208     UChar_t fCutITSPixel;               // Cut on ITS pixel
209     Bool_t  fCheckITSLayerStatus;       // Check ITS layer status
210     Double_t fMaxChi2clusterTPC;        // Max Chi2 per TPC cluster
211     Double_t fMinClusterRatioTPC;       // Min. Ratio findable / found TPC clusters
212     Double_t fSigmaToVtx;               // Sigma To Vertex
213     Double_t fVertexRangeZ;             // Vertex Range reconstructed
214     Bool_t   fTOFPIDStep;               // TOF matching step efficiency
215     Bool_t   fTOFMISMATCHStep;        // TOF mismatch step
216     Bool_t   fUseMixedVertex;         // Use primary vertex from track only as before
217     Float_t  fIPCutParams[4];         // Parameters of impact parameter cut parametrization
218     Bool_t   fIsIPSigmacut;           // if abs IP cut or IP sigma cut 
219     Double_t fFractionOfSharedTPCClusters; // Fraction of shared TPC clusters
220     Bool_t   fMaxImpactParameterRpar;      // Max impact parameter
221
222
223     
224     TList *fHistQA;                         //! QA Histograms
225     TObjArray *fCutList;                //! List of cut objects(Correction Framework Manager)
226
227     Int_t fDebugLevel;            // Debug Level
228     
229   ClassDef(AliHFEcuts, 2)         // Container for HFE cuts
230 };
231
232 //__________________________________________________________________
233 void AliHFEcuts::SetProductionVertex(Double_t xmin, Double_t xmax, Double_t ymin, Double_t ymax){
234   // Set the production vertex constraint
235   SetRequireProdVertex();
236   fProdVtx[0] = xmin;
237   fProdVtx[1] = xmax;
238   fProdVtx[2] = ymin;
239   fProdVtx[3] = ymax;
240 }
241
242 //__________________________________________________________________
243 void AliHFEcuts::SetSigmaToVertex(Double_t sig){
244   SetRequireSigmaToVertex();
245   fSigmaToVtx = sig;
246 }
247
248 //__________________________________________________________________
249 void AliHFEcuts::SetMaxImpactParam(Double_t radial, Double_t z){
250   SetRequireDCAToVertex();
251   fDCAtoVtx[0] = radial;
252   fDCAtoVtx[1] = z;
253 }
254
255 //__________________________________________________________________
256 void AliHFEcuts::SetIPcutParam(Float_t p0, Float_t p1, Float_t p2, Float_t p3, Bool_t isipsigma){
257   // Set parameters for impact parameter cut parametrization
258   fIPCutParams[0] = p0;
259   fIPCutParams[1] = p1;
260   fIPCutParams[2] = p2;
261   fIPCutParams[3] = p3;
262   fIsIPSigmacut = isipsigma;
263 }
264
265 //__________________________________________________________________
266 void AliHFEcuts::SetCutITSpixel(UChar_t cut){
267   SetRequireITSPixel();
268   fCutITSPixel = cut;
269 }
270
271 //__________________________________________________________________
272 void AliHFEcuts::CreateStandardCuts(){
273   //
274   // Standard Cuts defined by the HFE Group
275   //
276   SetRequireProdVertex();
277   fProdVtx[0] = 0;
278   fProdVtx[1] = 3;
279   fProdVtx[2] = 0;
280   fProdVtx[3] = 3;
281   //SetRequireDCAToVertex();
282   //fDCAtoVtx[0] = 0.5;
283   //fDCAtoVtx[1] = 1.5;
284   fMinClustersTPC = 80;
285   fMinClustersITS = 4;
286   fMinTrackletsTRD = 0;
287   SetRequireITSPixel();
288   fCutITSPixel = AliHFEextraCuts::kFirst;
289   fMaxChi2clusterTPC = 4.;
290   fMinClusterRatioTPC = 0.6;
291   fPtRange[0] = 0.1;
292   fPtRange[1] = 20.;
293   SetRequireKineMCCuts();
294 }
295 #endif