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