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