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