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