Cleanup the code. Fix memory leak. Now inherit from AliAnalysisTaskSE (Antoine, Phili...
[u/mrichter/AliRoot.git] / PWG3 / hfe / AliHFEcuts.h
1 #ifndef ALIHFECUTS_H
2 #define ALIHFECUTS_H
3
4 /**************************************************************************
5 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
6 *                                                                        *
7 * Author: The ALICE Off-line Project.                                    *
8 * Contributors are mentioned in the code where appropriate.              *
9 *                                                                        *
10 * Permission to use, copy, modify and distribute this software and its   *
11 * documentation strictly for non-commercial purposes is hereby granted   *
12 * without fee, provided that the above copyright notice appears in all   *
13 * copies and that both the copyright notice and this permission notice   *
14 * appear in the supporting documentation. The authors make no claims     *
15 * about the suitability of this software for any purpose. It is          *
16 * provided "as is" without express or implied warranty.                  *
17 **************************************************************************/
18
19 /* $Id$ */ 
20
21 //
22 // Cut container class for the ALICE HFE group
23 // Serves also as interface to the correction Framework
24 // Provides a set of standard cuts
25 //
26 #ifndef ROOT_TNamed
27 #include <TNamed.h>
28 #endif
29
30 #ifndef ALIHFEEXTRACUTS_H
31 #include "AliHFEextraCuts.h"
32 #endif
33
34 class AliCFManager;
35 class AliESDtrack;
36 class AliMCParticle;
37
38 class TObjArray;
39 class TList;
40
41 class AliHFEcuts : public TNamed{
42   public:
43     typedef enum{
44       kStepRecNoCut = 0,
45       kStepRecKineITSTPC = 1,
46       kStepRecPrim = 2,
47       kStepHFEcutsITS = 3,
48       kStepHFEcutsTRD = 4,
49       kNcutStepsRecTrack = 5
50     } RecoCutStep_t;
51     typedef enum{
52       kStepHFEcutsDca = 0, 
53       kNcutStepsDETrack = 1
54     } DECutStep_t;
55     typedef enum{
56       kStepMCGenerated = 0,
57       kStepMCGeneratedZOutNoPileUp = 1,
58       kStepMCGeneratedEventCut = 2,
59       kStepMCInAcceptance = 3,
60       kNcutStepsMCTrack =  4
61     } MCCutStep_t;
62     typedef enum{
63       kEventStepGenerated = 0,
64       kEventStepRecNoCut = 1,
65       kEventStepRecNoPileUp = 2,
66       kEventStepZRange = 3,
67       kEventStepReconstructed = 4,
68       kNcutStepsEvent = 5
69     } EventCutStep_t;
70
71     AliHFEcuts();
72     AliHFEcuts(const Char_t *name, const Char_t *title);
73     AliHFEcuts(const AliHFEcuts &c);
74     AliHFEcuts &operator=(const AliHFEcuts &c);
75     void Copy(TObject &o) const;
76     ~AliHFEcuts();
77     
78     void Initialize(AliCFManager *cfm);
79     void Initialize();
80
81     Bool_t CheckParticleCuts(UInt_t step, TObject *o);
82   
83     TList *GetQAhistograms() const { return fHistQA; }
84     
85     void SetQAOn() {SetBit(kDebugMode, kTRUE); };
86     void UnsetQA() {SetBit(kDebugMode, kFALSE); };
87     Bool_t IsQAOn() const { return TestBit(kDebugMode); };
88     void SetAOD() { SetBit(kAOD, kTRUE); }
89     void SetESD() { SetBit(kAOD, kFALSE); }
90     Bool_t IsAOD() const { return TestBit(kAOD); }
91     Bool_t IsESD() const { return !TestBit(kAOD); }
92
93     // Cut Names
94     static const Char_t *MCCutName(UInt_t step){
95       if(step >= kNcutStepsMCTrack) return fgkUndefined;
96       return fgkMCCutName[step];
97     };
98     static const Char_t *RecoCutName(UInt_t step){
99       if(step >= kNcutStepsRecTrack) return fgkUndefined;
100       return fgkRecoCutName[step];
101     }
102     static const Char_t *DECutName(UInt_t step){
103       if(step >= kNcutStepsDETrack) return fgkUndefined;
104       return fgkDECutName[step];
105     }
106     static const Char_t *EventCutName(UInt_t step){
107       if(step >= kNcutStepsEvent) return fgkUndefined;
108       return fgkEventCutName[step];
109     }
110    
111     // Getters
112     Bool_t IsRequireITSpixel() const { return TESTBIT(fRequirements, kITSPixel); };
113     Bool_t IsRequireMaxImpactParam() const { return TESTBIT(fRequirements, kMaxImpactParam); };
114     Bool_t IsRequirePrimary() const { return TESTBIT(fRequirements, kPrimary); };
115     Bool_t IsRequireProdVertex() const { return TESTBIT(fRequirements, kProductionVertex); };
116     Bool_t IsRequireSigmaToVertex() const { return TESTBIT(fRequirements, kSigmaToVertex); };
117     Bool_t IsRequireDCAToVertex() const {return TESTBIT(fRequirements, kDCAToVertex); };
118     Bool_t IsRequireKineMCCuts() const {return TESTBIT(fRequirements, kKineMCCuts); };
119     Double_t GetVertexRange() const {return fVertexRangeZ; };
120     
121     // Setters
122     inline void SetCutITSpixel(UChar_t cut);
123     void SetCheckITSLayerStatus(Bool_t checkITSLayerStatus) { fCheckITSLayerStatus = checkITSLayerStatus; }
124     void SetMinNClustersTPC(UChar_t minClustersTPC) { fMinClustersTPC = minClustersTPC; }
125     void SetMinNClustersITS(UChar_t minClustersITS) { fMinClustersITS = minClustersITS; }
126     void SetMinNTrackletsTRD(UChar_t minNtrackletsTRD) { fMinTrackletsTRD = minNtrackletsTRD; }
127     void SetMaxChi2perClusterTPC(Double_t chi2) { fMaxChi2clusterTPC = chi2; };
128     inline void SetMaxImpactParam(Double_t radial, Double_t z);
129     void SetMinRatioTPCclusters(Double_t minRatioTPC) { fMinClusterRatioTPC = minRatioTPC; };
130     void SetPtRange(Double_t ptmin, Double_t ptmax){fPtRange[0] = ptmin; fPtRange[1] = ptmax;};
131     inline void SetProductionVertex(Double_t xmin, Double_t xmax, Double_t ymin, Double_t ymax);
132     inline void SetSigmaToVertex(Double_t sig);
133     void SetTPCmodes(AliHFEextraCuts::ETPCclusterDef_t clusterDef, AliHFEextraCuts::ETPCclrDef_t ratioDef) {
134       fTPCclusterDef= clusterDef;
135       fTPCratioDef = ratioDef;
136     }
137     void SetVertexRange(Double_t zrange){fVertexRangeZ = zrange;};
138     void SetTOFPIDStep(Bool_t tofPidStep) {fTOFPIDStep = tofPidStep;};    
139     
140     inline void CreateStandardCuts();
141     
142     // Requirements
143     void SetRequireDCAToVertex() { SETBIT(fRequirements, kDCAToVertex); CLRBIT(fRequirements, kSigmaToVertex); };
144     void SetRequireIsPrimary() { SETBIT(fRequirements, kPrimary); };
145     void SetRequireITSPixel() { SETBIT(fRequirements, kITSPixel); }
146     void SetRequireProdVertex() { SETBIT(fRequirements, kProductionVertex); };
147     void SetRequireSigmaToVertex() { SETBIT(fRequirements, kSigmaToVertex); CLRBIT(fRequirements, kDCAToVertex); };
148     void UnsetVertexRequirement() { CLRBIT(fRequirements, kDCAToVertex); CLRBIT(fRequirements, kSigmaToVertex); }
149     void SetRequireKineMCCuts() { SETBIT(fRequirements, kKineMCCuts); };
150
151     void SetDebugLevel(Int_t level) { fDebugLevel = level; };
152     Int_t GetDebugLevel() const { return fDebugLevel; };
153
154   private:
155     enum{
156       kDebugMode = BIT(14),
157       kAOD = BIT(15)
158     };
159     typedef enum{
160       kPrimary = 0,
161       kProductionVertex = 1,
162       kSigmaToVertex = 2,
163       kDCAToVertex = 3,
164       kITSPixel = 4,
165       kMaxImpactParam = 5,
166       kKineMCCuts = 6
167     } Require_t;
168     void SetParticleGenCutList();
169     void SetAcceptanceCutList();
170     void SetRecKineITSTPCCutList();
171     void SetRecPrimaryCutList();
172     void SetHFElectronITSCuts();
173     void SetHFElectronTRDCuts();
174     void SetHFElectronDcaCuts();
175     void SetEventCutList(Int_t istep);
176
177     static const Char_t* fgkMCCutName[kNcutStepsMCTrack];     // Cut step names for MC single Track cuts
178     static const Char_t* fgkRecoCutName[kNcutStepsRecTrack];  // Cut step names for Rec single Track cuts
179     static const Char_t* fgkDECutName[kNcutStepsDETrack];     // Cut step names for impact parameter cuts
180     static const Char_t* fgkEventCutName[kNcutStepsEvent];    // Cut step names for Event cuts
181     static const Char_t* fgkUndefined;                        // Name for undefined (overflow)
182   
183     ULong64_t fRequirements;      // Bitmap for requirements
184     AliHFEextraCuts::ETPCclusterDef_t fTPCclusterDef;       // TPC cluster definition
185     AliHFEextraCuts::ETPCclrDef_t fTPCratioDef;             // TPC cluster ratio Definition
186     Double_t fDCAtoVtx[2];            // DCA to Vertex
187     Double_t fProdVtx[4];               // Production Vertex
188     Double_t fPtRange[2];               // pt range
189     UChar_t fMinClustersTPC;        // Min.Number of TPC clusters
190     UChar_t fMinClustersITS;        // Min.Number of TPC clusters
191     UChar_t fMinTrackletsTRD;       // Min. Number of TRD tracklets
192     UChar_t fCutITSPixel;               // Cut on ITS pixel
193     Bool_t  fCheckITSLayerStatus;       // Check ITS layer status
194     Double_t fMaxChi2clusterTPC;        // Max Chi2 per TPC cluster
195     Double_t fMinClusterRatioTPC;       // Min. Ratio findable / found TPC clusters
196     Double_t fSigmaToVtx;               // Sigma To Vertex
197     Double_t fVertexRangeZ;             // Vertex Range reconstructed
198     Bool_t   fTOFPIDStep;               // TOF matching step efficiency
199
200     
201     TList *fHistQA;                         //! QA Histograms
202     TObjArray *fCutList;                //! List of cut objects(Correction Framework Manager)
203
204     Int_t fDebugLevel;            // Debug Level
205     
206   ClassDef(AliHFEcuts, 2)         // Container for HFE cuts
207 };
208
209 //__________________________________________________________________
210 void AliHFEcuts::SetProductionVertex(Double_t xmin, Double_t xmax, Double_t ymin, Double_t ymax){
211   // Set the production vertex constraint
212   SetRequireProdVertex();
213   fProdVtx[0] = xmin;
214   fProdVtx[1] = xmax;
215   fProdVtx[2] = ymin;
216   fProdVtx[3] = ymax;
217 }
218
219 //__________________________________________________________________
220 void AliHFEcuts::SetSigmaToVertex(Double_t sig){
221   SetRequireSigmaToVertex();
222   fSigmaToVtx = sig;
223 }
224
225 //__________________________________________________________________
226 void AliHFEcuts::SetMaxImpactParam(Double_t radial, Double_t z){
227   SetRequireDCAToVertex();
228   fDCAtoVtx[0] = radial;
229   fDCAtoVtx[1] = z;
230 }
231
232 //__________________________________________________________________
233 void AliHFEcuts::SetCutITSpixel(UChar_t cut){
234   SetRequireITSPixel();
235   fCutITSPixel = cut;
236 }
237
238 //__________________________________________________________________
239 void AliHFEcuts::CreateStandardCuts(){
240   //
241   // Standard Cuts defined by the HFE Group
242   //
243   SetRequireProdVertex();
244   fProdVtx[0] = 0;
245   fProdVtx[1] = 3;
246   fProdVtx[2] = 0;
247   fProdVtx[3] = 3;
248   //SetRequireDCAToVertex();
249   //fDCAtoVtx[0] = 0.5;
250   //fDCAtoVtx[1] = 1.5;
251   fMinClustersTPC = 80;
252   fMinClustersITS = 4;
253   fMinTrackletsTRD = 0;
254   SetRequireITSPixel();
255   fCutITSPixel = AliHFEextraCuts::kFirst;
256   fMaxChi2clusterTPC = 4.;
257   fMinClusterRatioTPC = 0.6;
258   fPtRange[0] = 0.1;
259   fPtRange[1] = 20.;
260   SetRequireKineMCCuts();
261 }
262 #endif