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