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