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