]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG3/hfe/AliHFEcuts.cxx
c420738eba22597e5177b39a7ecac65312bacda7
[u/mrichter/AliRoot.git] / PWG3 / hfe / AliHFEcuts.cxx
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 menagement class implemented by the
17 // ALICE Heavy Flavour Electron Group
18 // Interface to the correction framework
19 // Provides a set of standard cuts 
20 // 
21 // Authors:
22 //   Raphaelle Bailhache <R.Bailhache@gsi.de>
23 //   Markus Fasel <M.Fasel@gsi.de>
24 //   Markus Heide <mheide@uni-muenster.de>
25 //   Matus Kalisky <m.kalisky@uni-muenster.de>
26 //
27 #include <TClass.h>
28 #include <TList.h>
29 #include <TObjArray.h>
30 #include <TString.h>
31
32 #include "AliCFAcceptanceCuts.h"
33 #include "AliCFCutBase.h"
34 #include "AliCFEventGenCuts.h"
35 #include "AliCFEventRecCuts.h"
36 #include "AliCFManager.h"
37 #include "AliCFParticleGenCuts.h"
38 #include "AliCFTrackIsPrimaryCuts.h"
39 #include "AliCFTrackKineCuts.h"
40 #include "AliCFTrackQualityCuts.h"
41 #include "AliESDtrack.h"
42
43 #include "AliHFEcuts.h"
44
45 ClassImp(AliHFEcuts)
46
47 //__________________________________________________________________
48 AliHFEcuts::AliHFEcuts():
49   fRequirements(0),
50   fMinClustersTPC(0),
51   fMinTrackletsTRD(0),
52   fCutITSPixel(0),
53   fCheckITSLayerStatus(kTRUE),
54   fMaxChi2clusterTPC(0.),
55   fMinClusterRatioTPC(0.),
56   fSigmaToVtx(0.),
57   fHistQA(0x0),
58   fCutList(0x0),
59   fDebugLevel(0)
60 {
61   //
62   // Default Constructor
63   //
64   memset(fProdVtx, 0, sizeof(Double_t) * 4);
65   memset(fDCAtoVtx, 0, sizeof(Double_t) * 2);
66   memset(fPtRange, 0, sizeof(Double_t) * 2);
67   fCutList = new TObjArray();
68   fCutList->SetOwner();
69 }
70
71 //__________________________________________________________________
72 AliHFEcuts::AliHFEcuts(const AliHFEcuts &c):
73   TObject(c),
74   fRequirements(c.fRequirements),
75   fMinClustersTPC(c.fMinClustersTPC),
76   fMinTrackletsTRD(c.fMinTrackletsTRD),
77   fCutITSPixel(c.fCutITSPixel),
78   fCheckITSLayerStatus(c.fCheckITSLayerStatus),
79   fMaxChi2clusterTPC(c.fMaxChi2clusterTPC),
80   fMinClusterRatioTPC(c.fMinClusterRatioTPC),
81   fSigmaToVtx(c.fSigmaToVtx),
82   fHistQA(0x0),
83   fCutList(0x0),
84   fDebugLevel(0)
85 {
86   //
87   // Copy Constructor
88   //
89   memcpy(fProdVtx, c.fProdVtx, sizeof(Double_t) * 4);
90   memcpy(fDCAtoVtx, c.fDCAtoVtx, sizeof(Double_t) * 4);
91   memcpy(fPtRange, c.fPtRange, sizeof(Double_t) *2);
92   fCutList = dynamic_cast<TObjArray *>(c.fCutList->Clone());
93   fCutList->SetOwner();
94 }
95
96 //__________________________________________________________________
97 AliHFEcuts::~AliHFEcuts(){
98   //
99   // Destruktor
100   //
101   if(fCutList){
102     fCutList->Delete();
103     delete fCutList;
104   }
105   fCutList = 0x0;
106   if(fHistQA) fHistQA->Clear();
107   delete fHistQA;
108 }
109
110 //__________________________________________________________________
111 void AliHFEcuts::Initialize(AliCFManager *cfm){
112   //
113   // Initializes the cut objects from the correction framework
114   // Publishes the cuts to the correction framework manager
115   //
116   if(IsInDebugMode()){
117      fHistQA = new TList;
118     fHistQA->SetName("CutQAhistograms");
119     fHistQA->SetOwner(kFALSE);
120   }
121  
122   // Call all the setters for the cuts
123   SetParticleGenCutList();
124   SetAcceptanceCutList();
125   SetRecKineITSTPCCutList();
126   SetRecPrimaryCutList();
127   SetHFElectronITSCuts();
128   SetHFElectronTRDCuts();
129
130   // Connect the event cuts
131   SetEventCutList(kEventStepGenerated);
132   SetEventCutList(kEventStepReconstructed);
133   cfm->SetEventCutsList(kEventStepGenerated, dynamic_cast<TObjArray *>(fCutList->FindObject("fEvGenCuts")));
134   cfm->SetEventCutsList(kEventStepReconstructed, dynamic_cast<TObjArray *>(fCutList->FindObject("fEvRecCuts")));
135   
136   // Connect the particle cuts
137   cfm->SetParticleCutsList(kStepMCGenerated, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartGenCuts")));
138   cfm->SetParticleCutsList(kStepMCInAcceptance, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartAccCuts")));
139   cfm->SetParticleCutsList(kStepRecKineITSTPC, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartRecKineITSTPCCuts")));
140   cfm->SetParticleCutsList(kStepRecPrim, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartPrimCuts")));
141   cfm->SetParticleCutsList(kStepHFEcutsITS, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsITS")));
142   cfm->SetParticleCutsList(kStepHFEcutsTRD, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsTRD")));
143
144 }
145
146 //__________________________________________________________________
147 void AliHFEcuts::Initialize(){
148   // Call all the setters for the cuts
149   SetParticleGenCutList();
150   SetAcceptanceCutList();
151   SetRecKineITSTPCCutList();
152   SetRecPrimaryCutList();
153   SetHFElectronITSCuts();
154   SetHFElectronTRDCuts();
155
156 }
157
158 //__________________________________________________________________
159 void AliHFEcuts::SetEventCutList(Int_t istep){
160   // 
161   // Cuts for Event Selection
162   //
163   TObjArray *arr = new TObjArray;
164   if(istep == kEventStepGenerated){
165     AliCFEventGenCuts *evGenCuts = new AliCFEventGenCuts("fCutsEvGen", "Event Generated cuts");
166     evGenCuts->SetNTracksCut(1);
167     evGenCuts->SetRequireVtxCuts(kTRUE);
168     evGenCuts->SetVertexXCut(-1, 1);
169     evGenCuts->SetVertexYCut(-1, 1);
170     evGenCuts->SetVertexZCut(-30, 30);
171
172     arr->SetName("fEvGenCuts");
173     arr->AddLast(evGenCuts);
174   } else {
175     AliCFEventRecCuts *evRecCuts = new AliCFEventRecCuts("fCutsEvRec", "Event Reconstructed cuts");
176     evRecCuts->SetUseSPDVertex();
177     evRecCuts->SetNTracksCut(1);
178     evRecCuts->SetRequireVtxCuts(kTRUE);
179     evRecCuts->SetVertexXCut(-1, 1);
180     evRecCuts->SetVertexYCut(-1, 1);
181     evRecCuts->SetVertexZCut(-30, 30);
182
183
184     arr->SetName("fEvRecCuts");
185     arr->AddLast(evRecCuts);
186   }
187   fCutList->AddLast(arr);
188 }
189
190 //__________________________________________________________________
191 void AliHFEcuts::SetParticleGenCutList(){
192   //
193   // Initialize Particle Cuts for Monte Carlo Tracks
194   // Production Vertex: < 1cm (Beampipe)
195   // Particle Species: Electrons
196   // Eta: < 0.9 (TRD-TOF acceptance)
197   //
198   AliCFParticleGenCuts *genCuts = new AliCFParticleGenCuts("fCutsGenMC", "Particle Generation Cuts");
199   genCuts->SetRequireIsCharged();
200   if(IsRequirePrimary()) genCuts->SetRequireIsPrimary();
201   if(IsRequireProdVertex()){
202     genCuts->SetProdVtxRangeX(fProdVtx[0], fProdVtx[1]);
203     genCuts->SetProdVtxRangeY(fProdVtx[2], fProdVtx[3]);
204   }
205   genCuts->SetRequirePdgCode(11, kTRUE);
206   
207   AliCFTrackKineCuts *kineMCcuts = new AliCFTrackKineCuts("fCutsKineMC","MC Kine Cuts");
208   kineMCcuts->SetPtRange(fPtRange[0], fPtRange[1]);
209   kineMCcuts->SetEtaRange(-0.9, 0.9);
210
211   if(IsInDebugMode()){
212     genCuts->SetQAOn(fHistQA);
213     kineMCcuts->SetQAOn(fHistQA);
214   }
215
216   TObjArray *mcCuts = new TObjArray;
217   mcCuts->SetName("fPartGenCuts");
218   mcCuts->AddLast(genCuts);
219   mcCuts->AddLast(kineMCcuts);
220   fCutList->AddLast(mcCuts);
221 }
222
223 //__________________________________________________________________
224 void AliHFEcuts::SetAcceptanceCutList(){
225   //
226   // Initialize Particle (Monte Carlo) acceptance cuts
227   // Min. Required Hist for Detectors:
228   //          ITS [3]
229   //          TPC [2]
230   //          TRD [2*nTracklets]
231   //          TOF [0]
232   //
233   AliCFAcceptanceCuts *accCuts = new AliCFAcceptanceCuts("fCutsAccMC", "MC Acceptance Cuts");
234   accCuts->SetMinNHitITS(3);
235   accCuts->SetMinNHitTPC(2);
236   accCuts->SetMinNHitTRD(2*fMinTrackletsTRD);
237   if(IsInDebugMode()) accCuts->SetQAOn(fHistQA);
238   
239   TObjArray *partAccCuts = new TObjArray();
240   partAccCuts->SetName("fPartAccCuts");
241   partAccCuts->AddLast(accCuts);
242   fCutList->AddLast(partAccCuts);
243 }
244
245 //__________________________________________________________________
246 void AliHFEcuts::SetRecKineITSTPCCutList(){
247   //
248   // Track Kinematics and Quality cuts (Based on the Standard cuts from PWG0)
249   //
250   // ITS refit
251   // Variances:
252   //  y: 2
253   //  z: 2
254   //  sin(phi): 0.5
255   //  tan(theta): 0.5
256   //  1/pt: 2
257   // Min. Number of Clusters:
258   //  TPC: 50
259   // RefitRequired:
260   //  TPC
261   // Chi2 per TPC cluster: 3.5
262   //
263   // Kinematics:
264   //  Momentum Range: 100MeV - 20GeV
265   //  Eta: < 0.9 (TRD-TOF acceptance)
266   //
267   AliCFTrackQualityCuts *trackQuality = new AliCFTrackQualityCuts("fCutsQualityRec","REC Track Quality Cuts");
268   trackQuality->SetMinNClusterTPC(fMinClustersTPC);
269   trackQuality->SetMaxChi2PerClusterTPC(fMaxChi2clusterTPC);
270   trackQuality->SetStatus(AliESDtrack::kTPCrefit | AliESDtrack::kITSrefit);
271   trackQuality->SetMaxCovDiagonalElements(2., 2., 0.5, 0.5, 2); 
272
273   AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTPC","Extra cuts from the HFE group");
274   if(fMinClusterRatioTPC > 0.) hfecuts->SetClusterRatioTPC(fMinClusterRatioTPC);
275   hfecuts->SetDebugLevel(fDebugLevel);
276   
277   AliCFTrackKineCuts *kineCuts = new AliCFTrackKineCuts("fCutsKineRec", "REC Kine Cuts");
278   kineCuts->SetPtRange(fPtRange[0], fPtRange[1]);
279   kineCuts->SetEtaRange(-0.9, 0.9);
280   
281   if(IsInDebugMode()){
282     trackQuality->SetQAOn(fHistQA);
283     hfecuts->SetQAOn(fHistQA);
284     kineCuts->SetQAOn(fHistQA);
285   }
286   
287   TObjArray *recCuts = new TObjArray;
288   recCuts->SetName("fPartRecKineITSTPCCuts");
289   recCuts->AddLast(trackQuality);
290   recCuts->AddLast(hfecuts);
291   recCuts->AddLast(kineCuts);
292   fCutList->AddLast(recCuts);
293 }
294
295 //__________________________________________________________________
296 void AliHFEcuts::SetRecPrimaryCutList(){
297   //
298   // Primary cuts (based on standard cuts from PWG0):
299   //  DCA to Vertex: 
300   //    XY: 3. cm
301   //    Z:  10. cm
302   //  No Kink daughters
303   //
304   AliCFTrackIsPrimaryCuts *primaryCut = new AliCFTrackIsPrimaryCuts("fCutsPrimaryCuts", "REC Primary Cuts");
305   if(IsRequireDCAToVertex()){
306     //primaryCut->SetDCAToVertex2D(kTRUE);
307     primaryCut->SetMaxDCAToVertexXY(fDCAtoVtx[0]);
308     primaryCut->SetMaxDCAToVertexZ(fDCAtoVtx[1]);
309   }
310   if(IsRequireSigmaToVertex()){
311     primaryCut->SetRequireSigmaToVertex(kTRUE);
312     primaryCut->SetMaxNSigmaToVertex(fSigmaToVtx);
313   }
314   primaryCut->SetAcceptKinkDaughters(kFALSE);
315   if(IsInDebugMode()) primaryCut->SetQAOn(fHistQA);
316   
317   TObjArray *primCuts = new TObjArray;
318   primCuts->SetName("fPartPrimCuts");
319   primCuts->AddLast(primaryCut);
320   fCutList->AddLast(primCuts);
321 }
322
323 //__________________________________________________________________
324 void AliHFEcuts::SetHFElectronITSCuts(){
325   //
326   // Special Cuts introduced by the HFElectron Group: ITS
327   //
328   AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupPixels","Extra cuts from the HFE group");
329   if(IsRequireITSpixel()){
330     hfecuts->SetRequireITSpixel(AliHFEextraCuts::ITSPixel_t(fCutITSPixel));
331     hfecuts->SetCheckITSstatus(fCheckITSLayerStatus);
332   }
333   
334   if(IsInDebugMode()) hfecuts->SetQAOn(fHistQA);
335   hfecuts->SetDebugLevel(fDebugLevel);
336
337   TObjArray *hfeCuts = new TObjArray;
338   hfeCuts->SetName("fPartHFECutsITS");
339   hfeCuts->AddLast(hfecuts);
340   fCutList->AddLast(hfeCuts);
341 }
342
343 //__________________________________________________________________
344 void AliHFEcuts::SetHFElectronTRDCuts(){
345   //
346   // Special Cuts introduced by the HFElectron Group: TRD
347   //
348   AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTRD","Extra cuts from the HFE group");
349   if(fMinTrackletsTRD > 0.) hfecuts->SetMinTrackletsTRD(fMinTrackletsTRD);
350   if(IsInDebugMode()) hfecuts->SetQAOn(fHistQA);
351   hfecuts->SetDebugLevel(fDebugLevel);
352   
353   TObjArray *hfeCuts = new TObjArray;
354   hfeCuts->SetName("fPartHFECutsTRD");
355   hfeCuts->AddLast(hfecuts);
356   fCutList->AddLast(hfeCuts);
357 }
358
359 //__________________________________________________________________
360 void AliHFEcuts::SetDebugMode(){ 
361   //
362   // Switch on QA
363   //
364   SetBit(kDebugMode, kTRUE); 
365 }
366
367 //__________________________________________________________________
368 Bool_t AliHFEcuts::CheckParticleCuts(CutStep_t step, TObject *o){
369   //
370   // Checks the cuts without using the correction framework manager
371   // 
372   TString stepnames[kNcutSteps] = {"fPartGenCuts", "fPartAccCuts", "fPartRecCuts", "fPartPrimCuts", "fPartHFECuts"};
373   TObjArray *cuts = dynamic_cast<TObjArray *>(fCutList->FindObject(stepnames[step].Data()));
374   if(!cuts) return kTRUE;
375   TIterator *it = cuts->MakeIterator();
376   AliCFCutBase *mycut;
377   Bool_t status = kTRUE;
378   while((mycut = dynamic_cast<AliCFCutBase *>(it->Next()))){
379     status &= mycut->IsSelected(o);
380   }
381   delete it;
382   return status;
383 }