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