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