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