1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
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
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>
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
55 #include <TObjArray.h>
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"
72 #include "AliHFEcuts.h"
76 const Char_t *AliHFEcuts::fgkMCCutName[AliHFEcuts::kNcutStepsMCTrack] = {
78 "MCGeneratedZOutNoPileUpCentralityFine",
79 "MCGeneratedEventCut",
83 const Char_t * AliHFEcuts::fgkRecoCutName[AliHFEcuts::kNcutStepsRecTrack] = {
93 const Char_t * AliHFEcuts::fgkDECutName[AliHFEcuts::kNcutStepsDETrack] = {
97 const Char_t * AliHFEcuts::fgkSecvtxCutName[AliHFEcuts::kNcutStepsSecvtxTrack] = {
101 const Char_t * AliHFEcuts::fgkEventCutName[AliHFEcuts::kNcutStepsEvent] = {
102 "EventStepGenerated",
104 "EventStepRecNoPileUp",
105 "EventStepRecCentralityOK",
107 "EventStepReconstructed"
110 const Char_t * AliHFEcuts::fgkUndefined = "Undefined";
112 //__________________________________________________________________
113 AliHFEcuts::AliHFEcuts():
116 fTPCclusterDef(AliHFEextraCuts::kFound),
117 fTPCratioDef(AliHFEextraCuts::kFoundOverFindable),
119 fMinClustersTPCPID(0),
123 fCheckITSLayerStatus(kTRUE),
124 fMaxChi2clusterITS(-1.),
125 fMaxChi2clusterTPC(0.),
126 fMinClusterRatioTPC(0.),
128 fTRDtrackletsExact(kFALSE),
130 fTOFMISMATCHStep(kFALSE),
131 fTPCPIDCLEANUPStep(kFALSE),
132 fUseMixedVertex(kTRUE),
133 fIsIPSigmacut(kFALSE),
135 fFractionOfSharedTPCClusters(-1.0),
136 fMaxImpactParameterRpar(kFALSE),
137 fAdditionalStatusRequirement(0),
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);
153 //__________________________________________________________________
154 AliHFEcuts::AliHFEcuts(const Char_t *name, const Char_t *title):
157 fTPCclusterDef(AliHFEextraCuts::kFound),
158 fTPCratioDef(AliHFEextraCuts::kFoundOverFindable),
160 fMinClustersTPCPID(0),
164 fCheckITSLayerStatus(kTRUE),
165 fMaxChi2clusterITS(-1.),
166 fMaxChi2clusterTPC(0.),
167 fMinClusterRatioTPC(0.),
169 fTRDtrackletsExact(kFALSE),
171 fTOFMISMATCHStep(kFALSE),
172 fTPCPIDCLEANUPStep(kFALSE),
173 fUseMixedVertex(kTRUE),
174 fIsIPSigmacut(kFALSE),
176 fFractionOfSharedTPCClusters(-1.0),
177 fMaxImpactParameterRpar(kFALSE),
178 fAdditionalStatusRequirement(0),
184 // Default Constructor
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);
193 //__________________________________________________________________
194 AliHFEcuts::AliHFEcuts(const AliHFEcuts &c):
196 fRequirements(c.fRequirements),
197 fTPCclusterDef(c.fTPCclusterDef),
198 fTPCratioDef(c.fTPCratioDef),
200 fMinClustersTPCPID(0),
204 fCheckITSLayerStatus(0),
205 fMaxChi2clusterITS(-1.),
206 fMaxChi2clusterTPC(0),
207 fMinClusterRatioTPC(0),
209 fTRDtrackletsExact(kFALSE),
211 fTOFMISMATCHStep(kFALSE),
212 fTPCPIDCLEANUPStep(kFALSE),
213 fUseMixedVertex(kTRUE),
214 fIsIPSigmacut(kFALSE),
216 fFractionOfSharedTPCClusters(-1.0),
217 fMaxImpactParameterRpar(kFALSE),
218 fAdditionalStatusRequirement(0),
229 //__________________________________________________________________
230 AliHFEcuts &AliHFEcuts::operator=(const AliHFEcuts &c){
234 if(&c != this) c.Copy(*this);
238 //__________________________________________________________________
239 void AliHFEcuts::Copy(TObject &c) const {
243 AliHFEcuts &target = dynamic_cast<AliHFEcuts &>(c);
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;
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);
278 target.fCutList->Clear();
279 delete target.fCutList;
282 target.fCutList = dynamic_cast<TObjArray *>(fCutList->Clone());
283 if(target.fCutList) target.fCutList->SetOwner(); // Coverity
286 delete target.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()))){
298 while((co = dynamic_cast<AliCFCutBase *>(cit1()))) co->SetQAOn(target.fHistQA);
303 //__________________________________________________________________
304 AliHFEcuts::~AliHFEcuts(){
313 if(fHistQA) delete fHistQA;
316 //__________________________________________________________________
317 Long64_t AliHFEcuts::Merge(const TCollection *list){
319 // Merge function doing nothing, just writing the object to file
322 if(list->IsEmpty()) return 1;
324 // just count the number of objects to merge
326 while(iter()){ counts++; }
330 //__________________________________________________________________
331 void AliHFEcuts::Initialize(AliCFManager *cfm){
333 // Initializes the cut objects from the correction framework
334 // Publishes the cuts to the correction framework manager
336 AliDebug(2, "Called");
337 const Int_t kMCOffset = kNcutStepsMCTrack;
338 const Int_t kRecOffset = kNcutStepsRecTrack;
342 fCutList = new TObjArray;
343 fCutList->SetOwner();
347 fHistQA->SetName(Form("%s_CutQAhistograms", GetName()));
348 fHistQA->SetOwner(kTRUE);
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();
362 // Publish to the cuts which analysis type they are (ESD Analysis by default)
364 AliInfo("Setting AOD Analysis");
365 TObjArray *genCuts = dynamic_cast<TObjArray *>(fCutList->FindObject("fPartGenCuts"));
367 AliCFParticleGenCuts *myGenCut = dynamic_cast<AliCFParticleGenCuts *>(genCuts->FindObject("fCutsGenMC"));
368 if(myGenCut) myGenCut->SetAODMC(kTRUE);
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")));
378 // Connect the particle cuts
380 cfm->SetParticleCutsList(kStepMCGenerated, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartGenCuts")));
381 cfm->SetParticleCutsList(kStepMCInAcceptance, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartAccCuts")));
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")));
393 //__________________________________________________________________
394 void AliHFEcuts::Initialize(){
395 // Call all the setters for the cuts
396 AliDebug(2, "Called\n");
400 fCutList = new TObjArray;
401 fCutList->SetOwner();
405 fHistQA->SetName(Form("%s_CutQAhistograms", GetName()));
406 fHistQA->SetOwner(kFALSE);
408 SetParticleGenCutList();
409 SetAcceptanceCutList();
410 SetRecKineITSTPCCutList();
411 SetRecPrimaryCutList();
412 SetHFElectronITSCuts();
413 SetHFElectronTOFCuts();
414 SetHFElectronTPCCuts();
415 SetHFElectronTRDCuts();
416 SetHFElectronDcaCuts();
418 // Connect the event cuts
419 SetEventCutList(kEventStepGenerated);
420 SetEventCutList(kEventStepReconstructed);
425 //__________________________________________________________________
426 void AliHFEcuts::SetEventCutList(Int_t istep){
428 // Cuts for Event Selection
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);
441 arr->SetName("fEvGenCuts");
442 arr->AddLast(evGenCuts);
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);
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);
468 fCutList->AddLast(arr);
471 //__________________________________________________________________
472 void AliHFEcuts::SetParticleGenCutList(){
474 // Initialize Particle Cuts for Monte Carlo Tracks
475 // Production Vertex Radius: < 3cm
476 // Particle Species: Electrons
480 TObjArray *mcCuts = new TObjArray;
481 mcCuts->SetName("fPartGenCuts");
484 AliDebug(2, "Called\n");
485 AliCFParticleGenCuts *genCuts = new AliCFParticleGenCuts("fCutsGenMC", "Particle Generation Cuts");
486 genCuts->SetRequireIsCharged();
487 if(IsRequirePrimary()) {
488 genCuts->SetRequireIsPrimary();
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
496 genCuts->SetRequirePdgCode(11, kTRUE);
497 if(IsQAOn()) genCuts->SetQAOn(fHistQA);
500 mcCuts->AddLast(genCuts);
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);
511 fCutList->AddLast(mcCuts);
514 //__________________________________________________________________
515 void AliHFEcuts::SetAcceptanceCutList(){
517 // Initialize Particle (Monte Carlo) acceptance cuts
518 // Min. Required Hist for Detectors:
521 // TRD [2*nTracklets]
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);
531 TObjArray *partAccCuts = new TObjArray();
532 partAccCuts->SetName("fPartAccCuts");
533 partAccCuts->AddLast(accCuts);
534 fCutList->AddLast(partAccCuts);
537 //__________________________________________________________________
538 void AliHFEcuts::SetRecKineITSTPCCutList(){
540 // Track Kinematics and Quality cuts (Based on the Standard cuts from PWG0)
549 // Min. Number of Clusters:
553 // Chi2 per TPC cluster: 3.5
556 // Momentum Range: 100MeV - 20GeV
557 // Eta: < 0.9 (TRD-TOF acceptance)
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;
569 statusRequirement = kStatusSelectionDefault;
570 trackQuality->SetStatus(statusRequirement);
571 //trackQuality->SetMaxCovDiagonalElements(2., 2., 0.5, 0.5, 2);
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);
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);
587 trackQuality->SetQAOn(fHistQA);
588 hfecuts->SetQAOn(fHistQA);
589 kineCuts->SetQAOn(fHistQA);
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);
600 //__________________________________________________________________
601 void AliHFEcuts::SetRecPrimaryCutList(){
603 // Primary cuts (based on standard cuts from PWG0):
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]);
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]);
622 primaryCut->SetAcceptKinkDaughters(kFALSE);
623 if(IsQAOn()) primaryCut->SetQAOn(fHistQA);
625 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsPrimaryCutsextra","Extra cuts from the HFE group");
626 hfecuts->SetMaxImpactParameterRpar(fMaxImpactParameterRpar);
627 hfecuts->SetRejectKinkDaughter();
628 hfecuts->SetRejectKinkMother();
630 TObjArray *primCuts = new TObjArray;
631 primCuts->SetName("fPartPrimCuts");
632 primCuts->AddLast(primaryCut);
633 //if(fMaxImpactParameterRpar){
634 primCuts->AddLast(hfecuts);
636 fCutList->AddLast(primCuts);
639 //__________________________________________________________________
640 void AliHFEcuts::SetHFElectronITSCuts(){
642 // Special Cuts introduced by the HFElectron Group: ITS
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);
651 if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
652 hfecuts->SetDebugLevel(fDebugLevel);
654 TObjArray *hfeCuts = new TObjArray;
655 hfeCuts->SetName("fPartHFECutsITS");
656 hfeCuts->AddLast(hfecuts);
657 fCutList->AddLast(hfeCuts);
660 //__________________________________________________________________
661 void AliHFEcuts::SetHFElectronTOFCuts(){
663 // Special Cuts introduced by the HFElectron Group: TRD
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);
672 TObjArray *hfeCuts = new TObjArray;
673 hfeCuts->SetName("fPartHFECutsTOF");
674 hfeCuts->AddLast(hfecuts);
675 fCutList->AddLast(hfeCuts);
678 //__________________________________________________________________
679 void AliHFEcuts::SetHFElectronTPCCuts(){
681 // Special Cuts introduced by the HFElectron Group: TPC
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);
689 TObjArray *hfeCuts = new TObjArray;
690 hfeCuts->SetName("fPartHFECutsTPC");
691 hfeCuts->AddLast(hfecuts);
692 fCutList->AddLast(hfeCuts);
696 //__________________________________________________________________
697 void AliHFEcuts::SetHFElectronTRDCuts(){
699 // Special Cuts introduced by the HFElectron Group: TRD
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);
707 TObjArray *hfeCuts = new TObjArray;
708 hfeCuts->SetName("fPartHFECutsTRD");
709 hfeCuts->AddLast(hfecuts);
710 fCutList->AddLast(hfeCuts);
713 //__________________________________________________________________
714 void AliHFEcuts::SetHFElectronDcaCuts(){
716 // Special Cuts introduced by the HFElectron Group: minimum of impact parameter
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);
724 TObjArray *hfeCuts = new TObjArray;
725 hfeCuts->SetName("fPartHFECutsDca");
726 hfeCuts->AddLast(hfecuts);
727 fCutList->AddLast(hfeCuts);
730 //__________________________________________________________________
731 Bool_t AliHFEcuts::CheckParticleCuts(UInt_t step, TObject *o){
733 // Checks the cuts without using the correction framework manager
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;
742 Bool_t status = kTRUE;
743 while((mycut = dynamic_cast<AliCFCutBase *>(it()))){
744 status &= mycut->IsSelected(o);
750 //__________________________________________________________________
751 Bool_t AliHFEcuts::CheckEventCuts(const char*namestep, TObject *o){
753 // Checks the cuts without using the correction framework manager
755 AliDebug(2, "Called\n");
756 TObjArray *cuts = dynamic_cast<TObjArray *>(fCutList->FindObject(namestep));
757 if(!cuts) return kTRUE;
760 Bool_t status = kTRUE;
761 while((mycut = dynamic_cast<AliCFCutBase *>(it()))){
762 status &= mycut->IsSelected(o);
767 //__________________________________________________________________
768 void AliHFEcuts::SetRecEvent(const AliVEvent *ev){
770 // Publish reconstructed event to the cuts
772 TIter cutsteps(fCutList);
775 while((cutstep = dynamic_cast<TObjArray *>(cutsteps()))){
776 TIter cutIter(cutstep);
777 while((cut = dynamic_cast<AliCFCutBase *>(cutIter()))){
778 cut->SetRecEventInfo(ev);
783 //__________________________________________________________________
784 void AliHFEcuts::SetMCEvent(const AliMCEvent *ev){
786 // Publish reconstructed event to the cuts
788 TIter cutsteps(fCutList);
791 while((cutstep = dynamic_cast<TObjArray *>(cutsteps()))){
792 TIter cutIter(cutstep);
793 while((cut = dynamic_cast<AliCFCutBase *>(cutIter()))){
794 cut->SetMCEventInfo(ev);