]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGHF/hfe/AliHFEcuts.cxx
ea5fe0d1a4d1935284837e9d6b59ad74bdfffe27
[u/mrichter/AliRoot.git] / PWGHF / 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 #include "AliHFEextraEventCuts.h"
69 #include "AliMCEvent.h"
70 #include "AliVEvent.h"
71
72 #include "AliHFEcuts.h"
73
74 ClassImp(AliHFEcuts)
75
76 const Char_t *AliHFEcuts::fgkMCCutName[AliHFEcuts::kNcutStepsMCTrack] = {
77   "MCGenerated",
78   "MCGeneratedZOutNoPileUpCentralityFine",
79   "MCGeneratedEventCut",
80   "MCInAcceptance"
81 };
82
83 const Char_t * AliHFEcuts::fgkRecoCutName[AliHFEcuts::kNcutStepsRecTrack] = {
84   "NoCuts",
85   "RecKineITSTPC",
86   "Primary",
87   "HFEITS",
88   "HFETOF",
89   "HFETPC",
90   "HFETRD"
91 };
92
93 const Char_t * AliHFEcuts::fgkDECutName[AliHFEcuts::kNcutStepsDETrack] = {
94   "HFEDCA"
95 };
96
97 const Char_t * AliHFEcuts::fgkSecvtxCutName[AliHFEcuts::kNcutStepsSecvtxTrack] = {
98   "HFESecvtx"
99 };
100
101 const Char_t * AliHFEcuts::fgkEventCutName[AliHFEcuts::kNcutStepsEvent] = {
102   "EventStepGenerated",
103   "EventStepRecNoCut",
104   "EventStepRecNoPileUp",
105   "EventStepRecCentralityOK",
106   "EventStepZRange",
107   "EventStepReconstructed"
108 };
109
110 const Char_t * AliHFEcuts::fgkUndefined = "Undefined";
111
112 //__________________________________________________________________
113 AliHFEcuts::AliHFEcuts():
114   TNamed(),
115   fRequirements(0),
116   fTPCclusterDef(0),
117   fTPCratioDef(0),
118   fEtaRange(0.8),
119   fMinClustersTPC(0),
120   fMinClustersTPCPID(0),
121   fMinClustersITS(0),
122   fMinTrackletsTRD(0),
123   fMaxChi2TRD(-1.),
124   fCutITSPixel(0),
125   fCheckITSLayerStatus(kTRUE),
126   fCutITSDrift(0),
127   fMaxChi2clusterITS(-1.),
128   fMaxChi2clusterTPC(0.),
129   fMinClusterRatioTPC(0.),
130   fVertexRangeZ(20.),
131   fTRDtrackletsExact(kFALSE),
132   fTOFPIDStep(kFALSE),
133   fTOFMISMATCHStep(kFALSE),
134   fTPCPIDCLEANUPStep(kFALSE),
135   fITSpatternCut(kFALSE),
136   fUseMixedVertex(kTRUE),
137   fIsIPSigmacut(kFALSE),
138   fIsIPAbs(kTRUE),
139   fFractionOfSharedTPCClusters(-1.0),
140   fMaxImpactParameterRpar(kFALSE),
141   fAdditionalStatusRequirement(0),
142   fTOFsignaldx(-1.0),
143   fTOFsignaldz(-1.0),
144   fHistQA(0x0),
145   fCutList(0x0),
146   fDebugLevel(0)
147 {
148   //
149   // Dummy Constructor
150   //
151   memset(fProdVtx, 0, sizeof(Double_t) * 4);
152   memset(fDCAtoVtx, 0, sizeof(Double_t) * 2);
153   memset(fPtRange, 0, sizeof(Double_t) * 2);
154   memset(fIPCutParams, 0, sizeof(Float_t) * 4);
155   memset(fSigmaToVtx, 0, sizeof(Double_t) * 3);
156
157 }
158
159 //__________________________________________________________________
160 AliHFEcuts::AliHFEcuts(const Char_t *name, const Char_t *title):
161   TNamed(name, title),
162   fRequirements(0),
163   fTPCclusterDef(0),
164   fTPCratioDef(0),
165   fEtaRange(0.8),
166   fMinClustersTPC(0),
167   fMinClustersTPCPID(0),
168   fMinClustersITS(0),
169   fMinTrackletsTRD(0),
170   fMaxChi2TRD(-1.),
171   fCutITSPixel(0),
172   fCheckITSLayerStatus(kTRUE),
173   fCutITSDrift(0),
174   fMaxChi2clusterITS(-1.),
175   fMaxChi2clusterTPC(0.),
176   fMinClusterRatioTPC(0.),
177   fVertexRangeZ(20.),
178   fTRDtrackletsExact(kFALSE),
179   fTOFPIDStep(kFALSE),
180   fTOFMISMATCHStep(kFALSE),
181   fTPCPIDCLEANUPStep(kFALSE),
182   fITSpatternCut(kFALSE),
183   fUseMixedVertex(kTRUE),
184   fIsIPSigmacut(kFALSE),
185   fIsIPAbs(kTRUE),
186   fFractionOfSharedTPCClusters(-1.0),
187   fMaxImpactParameterRpar(kFALSE),
188   fAdditionalStatusRequirement(0),
189   fTOFsignaldx(-1.0),
190   fTOFsignaldz(-1.0),
191   fHistQA(0x0),
192   fCutList(0x0),
193   fDebugLevel(0)
194 {
195   //
196   // Default Constructor
197   //
198   memset(fProdVtx, 0, sizeof(Double_t) * 4);
199   memset(fDCAtoVtx, 0, sizeof(Double_t) * 2);
200   memset(fPtRange, 0, sizeof(Double_t) * 2);
201   memset(fIPCutParams, 0, sizeof(Float_t) * 4);
202   memset(fSigmaToVtx, 0, sizeof(Double_t) * 3);
203 }
204
205 //__________________________________________________________________
206 AliHFEcuts::AliHFEcuts(const AliHFEcuts &c):
207   TNamed(c),
208   fRequirements(c.fRequirements),
209   fTPCclusterDef(c.fTPCclusterDef),
210   fTPCratioDef(c.fTPCratioDef),
211   fEtaRange(c.fEtaRange),
212   fMinClustersTPC(0),
213   fMinClustersTPCPID(0),
214   fMinClustersITS(0),
215   fMinTrackletsTRD(0),
216   fMaxChi2TRD(-1.),
217   fCutITSPixel(0),
218   fCheckITSLayerStatus(0),
219   fCutITSDrift(0),
220   fMaxChi2clusterITS(-1.),
221   fMaxChi2clusterTPC(0),
222   fMinClusterRatioTPC(0),
223   fVertexRangeZ(20.),
224   fTRDtrackletsExact(kFALSE),
225   fTOFPIDStep(kFALSE),
226   fTOFMISMATCHStep(kFALSE),
227   fTPCPIDCLEANUPStep(kFALSE),
228   fITSpatternCut(c.fITSpatternCut),
229   fUseMixedVertex(kTRUE),
230   fIsIPSigmacut(kFALSE),
231   fIsIPAbs(kTRUE),
232   fFractionOfSharedTPCClusters(-1.0),
233   fMaxImpactParameterRpar(kFALSE),
234   fAdditionalStatusRequirement(0),
235   fTOFsignaldx(-1.0),
236   fTOFsignaldz(-1.0),
237   fHistQA(0x0),
238   fCutList(0x0),
239   fDebugLevel(0)
240 {
241   //
242   // Copy Constructor
243   //
244   c.Copy(*this);
245 }
246
247 //__________________________________________________________________
248 AliHFEcuts &AliHFEcuts::operator=(const AliHFEcuts &c){
249   //
250   // Make assignment
251   //
252   if(&c != this) c.Copy(*this);
253   return *this;
254 }
255
256 //__________________________________________________________________
257 void AliHFEcuts::Copy(TObject &c) const {
258   //
259   // Performing copy
260   //
261   AliHFEcuts &target = dynamic_cast<AliHFEcuts &>(c);
262
263   target.fRequirements = fRequirements;
264   target.fTPCclusterDef = fTPCclusterDef;
265   target.fTPCratioDef = fTPCratioDef;
266   target.fEtaRange = fEtaRange;
267   target.fMinClustersTPC = fMinClustersTPC;
268   target.fMinClustersTPCPID = fMinClustersTPCPID;
269   target.fMinClustersITS = fMinClustersITS;
270   target.fMinTrackletsTRD = fMinTrackletsTRD;
271   target.fMaxChi2TRD  = fMaxChi2TRD;
272   target.fCutITSPixel = fCutITSPixel;
273   target.fCheckITSLayerStatus = fCheckITSLayerStatus;
274   target.fCutITSDrift = fCutITSDrift;
275   target.fMaxChi2clusterITS = fMaxChi2clusterITS;
276   target.fMaxChi2clusterTPC = fMaxChi2clusterTPC;
277   target.fMinClusterRatioTPC = fMinClusterRatioTPC;
278   target.fVertexRangeZ = fVertexRangeZ;
279   target.fTRDtrackletsExact = fTRDtrackletsExact;
280   target.fTOFPIDStep = fTOFPIDStep;
281   target.fTOFMISMATCHStep = fTOFMISMATCHStep;
282   target.fTPCPIDCLEANUPStep = fTPCPIDCLEANUPStep;
283   target.fUseMixedVertex = fUseMixedVertex;
284   target.fIsIPSigmacut = fIsIPSigmacut;
285   target.fIsIPAbs = fIsIPAbs;
286   target.fFractionOfSharedTPCClusters = fFractionOfSharedTPCClusters;
287   target.fMaxImpactParameterRpar = fMaxImpactParameterRpar;
288   target.fAdditionalStatusRequirement = fAdditionalStatusRequirement;
289   target.fTOFsignaldx = fTOFsignaldx;
290   target.fTOFsignaldz = fTOFsignaldz;
291   target.fDebugLevel = 0;
292
293   memcpy(target.fProdVtx, fProdVtx, sizeof(Double_t) * 4);
294   memcpy(target.fDCAtoVtx, fDCAtoVtx, sizeof(Double_t) * 2);
295   memcpy(target.fPtRange, fPtRange, sizeof(Double_t) *2);
296   memcpy(target.fIPCutParams, fIPCutParams, sizeof(Float_t) * 4);
297   memcpy(target.fSigmaToVtx, fSigmaToVtx, sizeof(Double_t) * 3);
298
299   // Copy cut List
300   if(target.fCutList){
301     target.fCutList->Clear();
302     delete target.fCutList;
303   }
304   if(fCutList){
305     target.fCutList = dynamic_cast<TObjArray *>(fCutList->Clone());
306     if(target.fCutList) target.fCutList->SetOwner(); // Coverity
307   }
308   if(target.fHistQA){
309     delete target.fHistQA;
310   }
311   if(fHistQA){
312     // If the QA list was already produced, then we create it new, loop over the cuts and connect all the histos with this list
313     target.fHistQA = new TList;
314     target.fHistQA->SetName(Form("%s_CutQAhistograms", GetName()));
315     fHistQA->SetOwner(kTRUE);
316     TIter cit(target.fCutList);
317     TObjArray *clist = NULL;
318     AliCFCutBase *co = NULL;
319     while((clist = dynamic_cast<TObjArray *>(cit()))){
320       TIter cit1(clist);
321       while((co = dynamic_cast<AliCFCutBase *>(cit1()))) co->SetQAOn(target.fHistQA);
322     }
323   }
324 }
325
326 //__________________________________________________________________
327 AliHFEcuts::~AliHFEcuts(){
328   //
329   // Destruktor
330   //
331   if(fCutList){
332     fCutList->Delete();
333     delete fCutList;
334   }
335   fCutList = 0x0;
336   if(fHistQA) delete fHistQA;
337 }
338
339 //__________________________________________________________________
340 Long64_t AliHFEcuts::Merge(const TCollection *list){
341   //
342   // Merge function doing nothing, just writing the object to file
343   //
344   if(!list) return 0;
345   if(list->IsEmpty()) return 1;
346   Long64_t counts = 0;
347   // just count the number of objects to merge
348   TIter iter(list);
349   while(iter()){ counts++; }
350   return counts+1;
351 }
352
353 //__________________________________________________________________
354 void AliHFEcuts::Initialize(AliCFManager *cfm){
355   //
356   // Initializes the cut objects from the correction framework
357   // Publishes the cuts to the correction framework manager
358   //
359   AliDebug(2, "Called");
360   const Int_t kMCOffset = kNcutStepsMCTrack;
361   const Int_t kRecOffset = kNcutStepsRecTrack;
362   if(fCutList)
363     fCutList->Delete();
364   else{
365     fCutList = new TObjArray;
366     fCutList->SetOwner();
367   }
368   if(IsQAOn()){
369     fHistQA = new TList;
370     fHistQA->SetName(Form("%s_CutQAhistograms", GetName()));
371     fHistQA->SetOwner(kTRUE);
372   }
373  
374   // Call all the setters for the cuts
375   SetParticleGenCutList();
376   SetAcceptanceCutList();
377   SetRecKineITSTPCCutList();
378   SetRecPrimaryCutList();
379   SetHFElectronITSCuts();
380   SetHFElectronTOFCuts();
381   SetHFElectronTPCCuts();
382   SetHFElectronTRDCuts();
383   SetHFElectronDcaCuts();
384
385   // Publish to the cuts which analysis type they are (ESD Analysis by default)
386   if(IsAOD()){
387     AliInfo("Setting AOD Analysis");
388     TObjArray *genCuts = dynamic_cast<TObjArray *>(fCutList->FindObject("fPartGenCuts"));
389     if(genCuts){
390       AliCFParticleGenCuts *myGenCut = dynamic_cast<AliCFParticleGenCuts *>(genCuts->FindObject("fCutsGenMC"));
391       if(myGenCut) {
392         myGenCut->SetAODMC(kTRUE);
393       }
394     }
395   }
396
397   // Connect the event cuts
398   SetEventCutList(kEventStepGenerated);
399   SetEventCutList(kEventStepReconstructed);
400   cfm->SetEventCutsList(kEventStepGenerated, dynamic_cast<TObjArray *>(fCutList->FindObject("fEvGenCuts")));
401   cfm->SetEventCutsList(kEventStepReconstructed, dynamic_cast<TObjArray *>(fCutList->FindObject("fEvRecCuts")));
402   
403   // Connect the particle cuts
404   // 1st MC
405   cfm->SetParticleCutsList(kStepMCGenerated, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartGenCuts")));
406   cfm->SetParticleCutsList(kStepMCInAcceptance, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartAccCuts")));
407   // 2nd Reco
408   cfm->SetParticleCutsList(kStepRecKineITSTPC + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartRecKineITSTPCCuts")));
409   cfm->SetParticleCutsList(kStepRecPrim + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartPrimCuts")));
410   cfm->SetParticleCutsList(kStepHFEcutsITS + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsITS")));
411   cfm->SetParticleCutsList(kStepHFEcutsTOF+ kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsTOF")));
412   cfm->SetParticleCutsList(kStepHFEcutsTPC+ kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsTPC")));
413   cfm->SetParticleCutsList(kStepHFEcutsTRD + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsTRD")));
414   cfm->SetParticleCutsList(kStepHFEcutsDca + kRecOffset + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsDca")));
415
416 }
417
418 //__________________________________________________________________
419 void AliHFEcuts::Initialize(){
420   // Call all the setters for the cuts
421   AliDebug(2, "Called\n");
422    if(fCutList)
423     fCutList->Delete();
424   else{
425     fCutList = new TObjArray;
426     fCutList->SetOwner();
427   }
428   if(IsQAOn()){
429     fHistQA = new TList;
430     fHistQA->SetName(Form("%s_CutQAhistograms", GetName()));
431     fHistQA->SetOwner(kFALSE);
432   }
433   SetParticleGenCutList();
434   SetAcceptanceCutList();
435   SetRecKineITSTPCCutList();
436   SetRecPrimaryCutList();
437   SetHFElectronITSCuts();
438   SetHFElectronTOFCuts();
439   SetHFElectronTPCCuts();
440   SetHFElectronTRDCuts();
441   SetHFElectronDcaCuts();
442
443   // Publish to the cuts which analysis type they are (ESD Analysis by default)
444   if(IsAOD()){
445     //printf("Initialize AOD\n");
446     //AliInfo("Setting AOD Analysis");
447     TObjArray *genCuts = dynamic_cast<TObjArray *>(fCutList->FindObject("fPartGenCuts"));
448     if(genCuts){
449       AliCFParticleGenCuts *myGenCut = dynamic_cast<AliCFParticleGenCuts *>(genCuts->FindObject("fCutsGenMC"));
450       if(myGenCut) {
451         myGenCut->SetAODMC(kTRUE);
452         //printf("Set AOD MC\n");
453       }
454     }
455   }
456
457   // Connect the event cuts
458   SetEventCutList(kEventStepGenerated);
459   SetEventCutList(kEventStepReconstructed);
460
461
462 }
463
464 //__________________________________________________________________
465 void AliHFEcuts::SetEventCutList(Int_t istep){
466   // 
467   // Cuts for Event Selection
468   //
469   AliDebug(2, "Called\n");
470   TObjArray *arr = new TObjArray;
471   if(istep == kEventStepGenerated){
472     AliCFEventGenCuts *evGenCuts = new AliCFEventGenCuts((Char_t *)"fCutsEvGen", (Char_t *)"Event Generated cuts");
473     //evGenCuts->SetNTracksCut(1);
474     evGenCuts->SetRequireVtxCuts(kTRUE);
475     //evGenCuts->SetVertexXCut(-1, 1);
476     //evGenCuts->SetVertexYCut(-1, 1);
477     evGenCuts->SetVertexZCut(-fVertexRangeZ, fVertexRangeZ);
478     if(IsQAOn()) evGenCuts->SetQAOn(fHistQA);
479
480     arr->SetName("fEvGenCuts");
481     arr->AddLast(evGenCuts);
482   } else {
483
484     if(!fUseMixedVertex) {
485       AliCFEventRecCuts *evRecCuts = new AliCFEventRecCuts((Char_t *)"fCutsEvRec", (Char_t *)"Event Reconstructed cuts");
486       //evRecCuts->SetNTracksCut(1);
487       evRecCuts->SetRequireVtxCuts(kTRUE);
488       //evRecCuts->SetVertexXCut(-1, 1);
489       //evRecCuts->SetVertexYCut(-1, 1);
490       //evRecCuts->SetVertexZCut(-30, 30);
491       evRecCuts->SetVertexZCut(-fVertexRangeZ, fVertexRangeZ);
492       evRecCuts->SetVertexNContributors(1,(Int_t)1.e9);
493       if(IsQAOn()) evRecCuts->SetQAOn(fHistQA);
494       arr->SetName("fEvRecCuts");
495       arr->AddLast(evRecCuts);
496     } else {
497       AliHFEextraEventCuts *evRecCuts = new AliHFEextraEventCuts((Char_t *)"fCutsEvRec", (Char_t *)"Event Reconstructed cuts");
498       evRecCuts->SetRequireVtxCuts(kTRUE);
499       evRecCuts->SetUseMixedVertex();
500       evRecCuts->SetVertexZCut(-fVertexRangeZ, fVertexRangeZ);
501       //evRecCuts->SetVertexNContributors(1,(Int_t)1.e9);
502       if(IsQAOn()) evRecCuts->SetQAOn(fHistQA);
503       arr->SetName("fEvRecCuts");
504       arr->AddLast(evRecCuts);
505     }
506   }
507   fCutList->AddLast(arr);
508 }
509
510 //__________________________________________________________________
511 void AliHFEcuts::SetParticleGenCutList(){
512   //
513   // Initialize Particle Cuts for Monte Carlo Tracks
514   // Production Vertex Radius: < 3cm
515   // Particle Species: Electrons
516   // Eta: < 0.8 (fEtaRange)
517   //
518   
519   TObjArray *mcCuts = new TObjArray;
520   mcCuts->SetName("fPartGenCuts");
521
522   // 
523   AliDebug(2, "Called\n");
524   AliCFParticleGenCuts *genCuts = new AliCFParticleGenCuts("fCutsGenMC", "Particle Generation Cuts");
525   genCuts->SetRequireIsCharged();
526   if(IsRequirePrimary()) { 
527     genCuts->SetRequireIsPrimary();
528   }
529   if(IsRequireProdVertex()){
530     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]));
531     //if(!IsAOD()) {
532     genCuts->SetProdVtxRangeX(fProdVtx[0], fProdVtx[1]);
533     genCuts->SetProdVtxRangeY(fProdVtx[2], fProdVtx[3]);
534     genCuts->SetProdVtxRange2D(kTRUE);  // Use ellipse
535     //}
536     //else {
537       // (ONLY PROVISOIRE FOR MC AOD)
538     // genCuts->SetProdVtxRangeX(-TMath::Abs(fProdVtx[1]), TMath::Abs(fProdVtx[1]));
539     // genCuts->SetProdVtxRangeY(-TMath::Abs(fProdVtx[3]), TMath::Abs(fProdVtx[3]));
540     //}
541   }
542   genCuts->SetRequirePdgCode(11, kTRUE);
543   if(IsQAOn()) genCuts->SetQAOn(fHistQA);
544
545   // Add
546   mcCuts->AddLast(genCuts);
547   
548   //
549   if(IsRequireKineMCCuts()) {  
550     AliCFTrackKineCuts *kineMCcuts = new AliCFTrackKineCuts((Char_t *)"fCutsKineMC", (Char_t *)"MC Kine Cuts");
551     kineMCcuts->SetPtRange(fPtRange[0], fPtRange[1]);
552     //kineMCcuts->SetEtaRange(-0.8, 0.8);
553     kineMCcuts->SetEtaRange(-TMath::Abs(fEtaRange),TMath::Abs(fEtaRange));
554     if(IsQAOn()) kineMCcuts->SetQAOn(fHistQA);
555     mcCuts->AddLast(kineMCcuts);
556   }
557    
558   fCutList->AddLast(mcCuts);
559 }
560
561 //__________________________________________________________________
562 void AliHFEcuts::SetAcceptanceCutList(){
563   //
564   // Initialize Particle (Monte Carlo) acceptance cuts
565   // Min. Required Hist for Detectors:
566   //          ITS [3]
567   //          TPC [2]
568   //          TRD [2*nTracklets]
569   //          TOF [0]
570   //
571   AliDebug(2, "Called\n");
572   AliCFAcceptanceCuts *accCuts = new AliCFAcceptanceCuts("fCutsAccMC", "MC Acceptance Cuts");
573   accCuts->SetMinNHitITS(3);
574   accCuts->SetMinNHitTPC(2);
575   accCuts->SetMinNHitTRD(2*fMinTrackletsTRD);
576   if(IsQAOn()) accCuts->SetQAOn(fHistQA);
577   
578   TObjArray *partAccCuts = new TObjArray();
579   partAccCuts->SetName("fPartAccCuts");
580   partAccCuts->AddLast(accCuts);
581   fCutList->AddLast(partAccCuts);
582 }
583
584 //__________________________________________________________________
585 void AliHFEcuts::SetRecKineITSTPCCutList(){
586   //
587   // Track Kinematics and Quality cuts (Based on the Standard cuts from PWG0)
588   //
589   // ITS refit
590   // Variances:
591   //  y: 2
592   //  z: 2
593   //  sin(phi): 0.5
594   //  tan(theta): 0.5
595   //  1/pt: 2
596   // Min. Number of Clusters:
597   //  TPC: 50
598   // RefitRequired:
599   //  TPC
600   // Chi2 per TPC cluster: 3.5
601   //
602   // Kinematics:
603   //  Momentum Range: 100MeV - 20GeV
604   //  Eta: < 0.9 (TRD-TOF acceptance)
605   //
606   const Long_t kStatusSelectionDefault(AliESDtrack::kTPCrefit | AliESDtrack::kITSrefit);
607   AliDebug(2, "Called\n");
608   AliCFTrackQualityCuts *trackQuality = new AliCFTrackQualityCuts((Char_t *)"fCutsQualityRec", (Char_t *)"REC Track Quality Cuts");
609   //trackQuality->SetMinNClusterITS(fMinClustersITS);
610   trackQuality->SetMaxChi2PerClusterTPC(fMaxChi2clusterTPC);
611   if(fMaxChi2clusterITS >= 0.) trackQuality->SetMaxChi2PerClusterITS(fMaxChi2clusterITS);
612   Long_t statusRequirement;
613   if(fAdditionalStatusRequirement)
614     statusRequirement = kStatusSelectionDefault | fAdditionalStatusRequirement;
615   else
616     statusRequirement = kStatusSelectionDefault;
617   trackQuality->SetStatus(statusRequirement);
618   //trackQuality->SetMaxCovDiagonalElements(2., 2., 0.5, 0.5, 2); 
619
620   AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTPCRec","Extra cuts from the HFE group");
621   hfecuts->SetDebugLevel(fDebugLevel);
622   hfecuts->SetMinNbITScls(fMinClustersITS);
623   // Set the cut in the TPC number of clusters
624   hfecuts->SetMinNClustersTPC(fMinClustersTPC,AliHFEextraCuts::ETPCclusterDef_t(fTPCclusterDef));
625   hfecuts->SetMinNClustersTPCPID(fMinClustersTPCPID);
626   hfecuts->SetClusterRatioTPC(fMinClusterRatioTPC,AliHFEextraCuts::ETPCclrDef_t(fTPCratioDef));
627   if(fFractionOfSharedTPCClusters > 0.0) hfecuts->SetFractionOfTPCSharedClusters(fFractionOfSharedTPCClusters); 
628   if(fITSpatternCut) hfecuts->SetITSpatternCut();
629   
630   AliCFTrackKineCuts *kineCuts = new AliCFTrackKineCuts((Char_t *)"fCutsKineRec", (Char_t *)"REC Kine Cuts");
631   kineCuts->SetPtRange(fPtRange[0], fPtRange[1]);
632   //kineCuts->SetEtaRange(-0.8, 0.8);
633   kineCuts->SetEtaRange(-TMath::Abs(fEtaRange),TMath::Abs(fEtaRange));
634   
635   if(IsQAOn()){
636     trackQuality->SetQAOn(fHistQA);
637     hfecuts->SetQAOn(fHistQA);
638     kineCuts->SetQAOn(fHistQA);
639   }
640   
641   TObjArray *recCuts = new TObjArray;
642   recCuts->SetName("fPartRecKineITSTPCCuts");
643   recCuts->AddLast(trackQuality);
644   recCuts->AddLast(hfecuts);
645   recCuts->AddLast(kineCuts);
646   fCutList->AddLast(recCuts);
647 }
648
649 //__________________________________________________________________
650 void AliHFEcuts::SetRecPrimaryCutList(){
651   //
652   // Primary cuts (based on standard cuts from PWG0):
653   //  DCA to Vertex: 
654   //    XY: 3. cm
655   //    Z:  10. cm
656   //  No Kink daughters
657   //
658   AliDebug(2, "Called\n");
659   AliCFTrackIsPrimaryCuts *primaryCut = new AliCFTrackIsPrimaryCuts((Char_t *)"fCutsPrimaryCuts", (Char_t *)"REC Primary Cuts");
660   //if(IsRequireDCAToVertex()){
661     //primaryCut->SetDCAToVertex2D(kTRUE);
662     //primaryCut->SetMaxDCAToVertexXY(fDCAtoVtx[0]);
663     //primaryCut->SetMaxDCAToVertexZ(fDCAtoVtx[1]);
664   //}
665   if(IsRequireSigmaToVertex()){
666     primaryCut->SetRequireSigmaToVertex(kTRUE);
667     if(fSigmaToVtx[0]) primaryCut->SetMaxNSigmaToVertex(fSigmaToVtx[0]);
668     if(fSigmaToVtx[1]) primaryCut->SetMaxSigmaDCAxy(fSigmaToVtx[1]);
669     if(fSigmaToVtx[2]) primaryCut->SetMaxSigmaDCAz(fSigmaToVtx[2]);
670   }
671   //primaryCut->SetAcceptKinkDaughters(kFALSE);
672   if(IsQAOn()) primaryCut->SetQAOn(fHistQA);
673   
674   AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsPrimaryCutsextra","Extra cuts from the HFE group");
675   hfecuts->SetMaxImpactParameterRpar(fMaxImpactParameterRpar);
676   hfecuts->SetRejectKinkDaughter();
677   //hfecuts->SetRejectKinkMother();
678   if(IsRequireDCAToVertex()){
679     hfecuts->SetMaxImpactParamR(fDCAtoVtx[0]);
680     hfecuts->SetMaxImpactParamZ(fDCAtoVtx[1]);
681   }
682
683   TObjArray *primCuts = new TObjArray;
684   primCuts->SetName("fPartPrimCuts");
685   // needed for AOD...
686   if(IsRequireSigmaToVertex()) primCuts->AddLast(primaryCut);
687   //if(fMaxImpactParameterRpar){
688   primCuts->AddLast(hfecuts);
689   //}
690   fCutList->AddLast(primCuts);
691 }
692
693 //__________________________________________________________________
694 void AliHFEcuts::SetHFElectronITSCuts(){
695   //
696   // Special Cuts introduced by the HFElectron Group: ITS
697   //
698   AliDebug(2, "Called\n");
699   AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupPixels","Extra cuts from the HFE group");
700   if(IsRequireITSpixel()){
701     hfecuts->SetRequireITSpixel(AliHFEextraCuts::ITSPixel_t(fCutITSPixel));
702     hfecuts->SetCheckITSstatus(fCheckITSLayerStatus);
703   }
704   if(IsRequireITSdrift()){
705     hfecuts->SetRequireITSdrift(AliHFEextraCuts::ITSDrift_t(fCutITSDrift));
706   }
707   
708   if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
709   hfecuts->SetDebugLevel(fDebugLevel);
710
711   TObjArray *hfeCuts = new TObjArray;
712   hfeCuts->SetName("fPartHFECutsITS");
713   hfeCuts->AddLast(hfecuts);
714   fCutList->AddLast(hfeCuts);
715 }
716
717 //__________________________________________________________________
718 void AliHFEcuts::SetHFElectronTOFCuts(){
719   //
720   // Special Cuts introduced by the HFElectron Group: TRD
721   //
722   AliDebug(2, "Called\n");
723   AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTOF","Extra cuts from the HFE group on TOF PID");
724   if(fTOFPIDStep) hfecuts->SetTOFPID(kTRUE);
725   if(fTOFMISMATCHStep) hfecuts->SetTOFMISMATCH(kTRUE);
726   if((fTOFsignaldx > 0.0) && (fTOFsignaldz > 0.0)) hfecuts->SetTOFsignalDxz(fTOFsignaldx,fTOFsignaldz);
727   if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
728   hfecuts->SetDebugLevel(fDebugLevel);
729   
730   TObjArray *hfeCuts = new TObjArray;
731   hfeCuts->SetName("fPartHFECutsTOF");
732   hfeCuts->AddLast(hfecuts);
733   fCutList->AddLast(hfeCuts);
734 }
735
736 //__________________________________________________________________
737 void AliHFEcuts::SetHFElectronTPCCuts(){
738   //
739   // Special Cuts introduced by the HFElectron Group: TPC
740   //
741   AliDebug(2, "Called\n");
742   AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTPCPID","Extra cuts from the HFE group on TPC PID");
743   if(fTPCPIDCLEANUPStep) hfecuts->SetTPCPIDCleanUp(kTRUE);
744   if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
745   hfecuts->SetDebugLevel(fDebugLevel);
746   
747   TObjArray *hfeCuts = new TObjArray;
748   hfeCuts->SetName("fPartHFECutsTPC");
749   hfeCuts->AddLast(hfecuts);
750   fCutList->AddLast(hfeCuts);
751 }
752
753
754 //__________________________________________________________________
755 void AliHFEcuts::SetHFElectronTRDCuts(){
756   //
757   // Special Cuts introduced by the HFElectron Group: TRD
758   //
759   AliDebug(2, "Called\n");
760   AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTRD","Extra cuts from the HFE group on TRD PID");
761   if(fMinTrackletsTRD > 0.) hfecuts->SetMinTrackletsTRD(fMinTrackletsTRD, fTRDtrackletsExact);
762   if(fMaxChi2TRD >= 0)
763     hfecuts->SetMaxChi2TRD(fMaxChi2TRD);
764   
765   if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
766   hfecuts->SetDebugLevel(fDebugLevel);
767   
768   TObjArray *hfeCuts = new TObjArray;
769   hfeCuts->SetName("fPartHFECutsTRD");
770   hfeCuts->AddLast(hfecuts);
771   fCutList->AddLast(hfeCuts);
772 }
773
774 //__________________________________________________________________
775 void AliHFEcuts::SetHFElectronDcaCuts(){
776   //
777   // Special Cuts introduced by the HFElectron Group: minimum of impact parameter
778   //
779   AliDebug(2, "Called\n");
780   AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupDCA","Extra cuts from the HFE group");
781   hfecuts->SetMinHFEImpactParamR(fIPCutParams,fIsIPSigmacut,fIsIPAbs);
782   if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
783   hfecuts->SetDebugLevel(fDebugLevel);
784
785   TObjArray *hfeCuts = new TObjArray;
786   hfeCuts->SetName("fPartHFECutsDca");
787   hfeCuts->AddLast(hfecuts);
788   fCutList->AddLast(hfeCuts);
789 }
790
791 //__________________________________________________________________
792 Bool_t AliHFEcuts::CheckParticleCuts(UInt_t step, TObject *o){
793   //
794   // Checks the cuts without using the correction framework manager
795   // 
796   AliDebug(2, "Called\n");
797   TString stepnames[kNcutStepsMCTrack + kNcutStepsRecTrack + kNcutStepsDETrack + kNcutStepsSecvtxTrack + 1] = {"fPartGenCuts","fPartEvCutPileupZ","fPartEvCut","fPartAccCuts","fPartRecNoCuts","fPartRecKineITSTPCCuts", "fPartPrimCuts", "fPartHFECutsITS","fPartHFECutsTOF","fPartHFECutsTPC","fPartHFECutsTRD","fPartHFECutsDca", "fPartHFECutsSecvtx"};
798   AliDebug(2, Form("Doing cut %s", stepnames[step].Data()));
799  TObjArray *cuts = dynamic_cast<TObjArray *>(fCutList->FindObject(stepnames[step].Data()));
800   if(!cuts) return kTRUE;
801   TIter it(cuts);
802   AliCFCutBase *mycut;
803   Bool_t status = kTRUE;
804   while((mycut = dynamic_cast<AliCFCutBase *>(it()))){
805     status &= mycut->IsSelected(o);
806   }
807   return status;
808 }
809
810
811 //__________________________________________________________________
812 Bool_t AliHFEcuts::CheckEventCuts(const char*namestep, TObject *o){
813   //
814   // Checks the cuts without using the correction framework manager
815   // 
816   AliDebug(2, "Called\n");
817   TObjArray *cuts = dynamic_cast<TObjArray *>(fCutList->FindObject(namestep));
818   if(!cuts) return kTRUE;
819   TIter it(cuts);
820   AliCFCutBase *mycut;
821   Bool_t status = kTRUE;
822   while((mycut = dynamic_cast<AliCFCutBase *>(it()))){
823     status &= mycut->IsSelected(o);
824   }
825   return status;
826 }
827
828 //__________________________________________________________________
829 void AliHFEcuts::SetRecEvent(const AliVEvent *ev){
830   //
831   // Publish reconstructed event to the cuts
832   //
833   TIter cutsteps(fCutList);
834   TObjArray *cutstep;
835   AliCFCutBase *cut;
836   while((cutstep = dynamic_cast<TObjArray *>(cutsteps()))){
837     TIter cutIter(cutstep);
838     while((cut = dynamic_cast<AliCFCutBase *>(cutIter()))){
839       cut->SetRecEventInfo(ev);
840     }
841   }
842 }
843
844 //__________________________________________________________________
845 void AliHFEcuts::SetMCEvent(const AliVEvent *ev){
846   //
847   // Publish reconstructed event to the cuts
848   //
849   TIter cutsteps(fCutList);
850   TObjArray *cutstep;
851   AliCFCutBase *cut;
852   while((cutstep = dynamic_cast<TObjArray *>(cutsteps()))){
853     TIter cutIter(cutstep);
854     while((cut = dynamic_cast<AliCFCutBase *>(cutIter()))){
855       cut->SetMCEventInfo(ev);
856     }
857   }
858 }