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 "AliCFManager.h"
62 #include "AliCFParticleGenCuts.h"
63 #include "AliCFTrackIsPrimaryCuts.h"
64 #include "AliCFTrackKineCuts.h"
65 #include "AliCFTrackQualityCuts.h"
66 #include "AliESDtrack.h"
67 #include "AliHFEextraEventCuts.h"
68 #include "AliMCEvent.h"
69 #include "AliVEvent.h"
71 #include "AliHFEcuts.h"
75 const Char_t *AliHFEcuts::fgkMCCutName[AliHFEcuts::kNcutStepsMCTrack] = {
77 "MCGeneratedZOutNoPileUpCentralityFine",
78 "MCGeneratedEventCut",
82 const Char_t * AliHFEcuts::fgkRecoCutName[AliHFEcuts::kNcutStepsRecTrack] = {
92 const Char_t * AliHFEcuts::fgkDECutName[AliHFEcuts::kNcutStepsDETrack] = {
96 const Char_t * AliHFEcuts::fgkSecvtxCutName[AliHFEcuts::kNcutStepsSecvtxTrack] = {
100 const Char_t * AliHFEcuts::fgkEventCutName[AliHFEcuts::kNcutStepsEvent] = {
101 "EventStepGenerated",
103 "EventStepRecNoPileUp",
104 "EventStepRecCentralityOK",
106 "EventStepReconstructed"
109 const Char_t * AliHFEcuts::fgkUndefined = "Undefined";
111 //__________________________________________________________________
112 AliHFEcuts::AliHFEcuts():
118 fMinClustersTPCPID(0),
123 fCheckITSLayerStatus(kTRUE),
125 fMaxChi2clusterITS(-1.),
126 fMaxChi2clusterTPC(0.),
127 fMinClusterRatioTPC(0.),
129 fTRDtrackletsExact(kFALSE),
131 fTOFMISMATCHStep(kFALSE),
132 fTPCPIDCLEANUPStep(kFALSE),
133 fITSpatternCut(kFALSE),
134 fUseMixedVertex(kTRUE),
135 fUseSPDVertex(kFALSE),
136 fUseCorrelationVertex(kFALSE),
137 fSPDVtxResolution(kFALSE),
138 fPApileupCut(kFALSE),
139 fIsIPSigmacut(kFALSE),
142 fFractionOfSharedTPCClusters(-1.0),
143 fMaxImpactParameterRpar(kFALSE),
144 fAdditionalStatusRequirement(0),
155 memset(fProdVtx, 0, sizeof(Double_t) * 4);
156 memset(fDCAtoVtx, 0, sizeof(Double_t) * 2);
157 memset(fPtRange, 0, sizeof(Double_t) * 2);
158 memset(fIPCutParams, 0, sizeof(Float_t) * 4);
159 memset(fSigmaToVtx, 0, sizeof(Double_t) * 3);
160 fEtaRange[0] = -0.8; fEtaRange[1] = 0.8;
163 //__________________________________________________________________
164 AliHFEcuts::AliHFEcuts(const Char_t *name, const Char_t *title):
170 fMinClustersTPCPID(0),
175 fCheckITSLayerStatus(kTRUE),
177 fMaxChi2clusterITS(-1.),
178 fMaxChi2clusterTPC(0.),
179 fMinClusterRatioTPC(0.),
181 fTRDtrackletsExact(kFALSE),
183 fTOFMISMATCHStep(kFALSE),
184 fTPCPIDCLEANUPStep(kFALSE),
185 fITSpatternCut(kFALSE),
186 fUseMixedVertex(kTRUE),
187 fUseSPDVertex(kFALSE),
188 fUseCorrelationVertex(kFALSE),
189 fSPDVtxResolution(kFALSE),
190 fPApileupCut(kFALSE),
191 fIsIPSigmacut(kFALSE),
194 fFractionOfSharedTPCClusters(-1.0),
195 fMaxImpactParameterRpar(kFALSE),
196 fAdditionalStatusRequirement(0),
205 // Default Constructor
207 memset(fProdVtx, 0, sizeof(Double_t) * 4);
208 memset(fDCAtoVtx, 0, sizeof(Double_t) * 2);
209 memset(fPtRange, 0, sizeof(Double_t) * 2);
210 memset(fIPCutParams, 0, sizeof(Float_t) * 4);
211 memset(fSigmaToVtx, 0, sizeof(Double_t) * 3);
212 fEtaRange[0] = -0.8; fEtaRange[1] = 0.8;
215 //__________________________________________________________________
216 AliHFEcuts::AliHFEcuts(const AliHFEcuts &c):
218 fRequirements(c.fRequirements),
219 fTPCclusterDef(c.fTPCclusterDef),
220 fTPCratioDef(c.fTPCratioDef),
222 fMinClustersTPCPID(0),
227 fCheckITSLayerStatus(0),
229 fMaxChi2clusterITS(-1.),
230 fMaxChi2clusterTPC(0),
231 fMinClusterRatioTPC(0),
233 fTRDtrackletsExact(kFALSE),
235 fTOFMISMATCHStep(kFALSE),
236 fTPCPIDCLEANUPStep(kFALSE),
237 fITSpatternCut(c.fITSpatternCut),
238 fUseMixedVertex(kTRUE),
239 fUseSPDVertex(kFALSE),
240 fUseCorrelationVertex(c.fUseCorrelationVertex),
241 fSPDVtxResolution(c.fSPDVtxResolution),
242 fPApileupCut(c.fPApileupCut),
243 fIsIPSigmacut(kFALSE),
246 fFractionOfSharedTPCClusters(-1.0),
247 fMaxImpactParameterRpar(kFALSE),
248 fAdditionalStatusRequirement(0),
262 //__________________________________________________________________
263 AliHFEcuts &AliHFEcuts::operator=(const AliHFEcuts &c){
267 if(&c != this) c.Copy(*this);
271 //__________________________________________________________________
272 void AliHFEcuts::Copy(TObject &c) const {
276 AliHFEcuts &target = dynamic_cast<AliHFEcuts &>(c);
278 target.fRequirements = fRequirements;
279 target.fTPCclusterDef = fTPCclusterDef;
280 target.fTPCratioDef = fTPCratioDef;
281 target.fMinClustersTPC = fMinClustersTPC;
282 target.fMinClustersTPCPID = fMinClustersTPCPID;
283 target.fMinClustersITS = fMinClustersITS;
284 target.fMinTrackletsTRD = fMinTrackletsTRD;
285 target.fMaxChi2TRD = fMaxChi2TRD;
286 target.fCutITSPixel = fCutITSPixel;
287 target.fCheckITSLayerStatus = fCheckITSLayerStatus;
288 target.fCutITSDrift = fCutITSDrift;
289 target.fMaxChi2clusterITS = fMaxChi2clusterITS;
290 target.fMaxChi2clusterTPC = fMaxChi2clusterTPC;
291 target.fMinClusterRatioTPC = fMinClusterRatioTPC;
292 target.fVertexRangeZ = fVertexRangeZ;
293 target.fTRDtrackletsExact = fTRDtrackletsExact;
294 target.fTOFPIDStep = fTOFPIDStep;
295 target.fTOFMISMATCHStep = fTOFMISMATCHStep;
296 target.fTPCPIDCLEANUPStep = fTPCPIDCLEANUPStep;
297 target.fUseMixedVertex = fUseMixedVertex;
298 target.fUseSPDVertex = fUseSPDVertex;
299 target.fUseCorrelationVertex = fUseCorrelationVertex;
300 target.fSPDVtxResolution = fSPDVtxResolution;
301 target.fPApileupCut = fPApileupCut;
302 target.fIsIPSigmacut = fIsIPSigmacut;
303 target.fIsIPcharge = fIsIPcharge;
304 target.fIsIPOpp = fIsIPOpp;
305 target.fFractionOfSharedTPCClusters = fFractionOfSharedTPCClusters;
306 target.fMaxImpactParameterRpar = fMaxImpactParameterRpar;
307 target.fAdditionalStatusRequirement = fAdditionalStatusRequirement;
308 target.fTOFsignaldx = fTOFsignaldx;
309 target.fTOFsignaldz = fTOFsignaldz;
310 target.fAODFilterBit = fAODFilterBit;
311 target.fDebugLevel = 0;
313 memcpy(target.fProdVtx, fProdVtx, sizeof(Double_t) * 4);
314 memcpy(target.fDCAtoVtx, fDCAtoVtx, sizeof(Double_t) * 2);
315 memcpy(target.fPtRange, fPtRange, sizeof(Double_t) *2);
316 memcpy(target.fIPCutParams, fIPCutParams, sizeof(Float_t) * 4);
317 memcpy(target.fSigmaToVtx, fSigmaToVtx, sizeof(Double_t) * 3);
318 memcpy(target.fEtaRange, fEtaRange, sizeof(Double_t) * 2);
322 target.fCutList->Clear();
323 delete target.fCutList;
326 target.fCutList = dynamic_cast<TObjArray *>(fCutList->Clone());
327 if(target.fCutList) target.fCutList->SetOwner(); // Coverity
330 delete target.fHistQA;
333 // If the QA list was already produced, then we create it new, loop over the cuts and connect all the histos with this list
334 target.fHistQA = new TList;
335 target.fHistQA->SetName(Form("%s_CutQAhistograms", GetName()));
336 fHistQA->SetOwner(kTRUE);
337 TIter cit(target.fCutList);
338 TObjArray *clist = NULL;
339 AliCFCutBase *co = NULL;
340 while((clist = dynamic_cast<TObjArray *>(cit()))){
342 while((co = dynamic_cast<AliCFCutBase *>(cit1()))) co->SetQAOn(target.fHistQA);
347 //__________________________________________________________________
348 AliHFEcuts::~AliHFEcuts(){
357 if(fHistQA) delete fHistQA;
360 //__________________________________________________________________
361 Long64_t AliHFEcuts::Merge(const TCollection *list){
363 // Merge function doing nothing, just writing the object to file
366 if(list->IsEmpty()) return 1;
368 // just count the number of objects to merge
370 while(iter()){ counts++; }
374 //__________________________________________________________________
375 void AliHFEcuts::Initialize(AliCFManager *cfm){
377 // Initializes the cut objects from the correction framework
378 // Publishes the cuts to the correction framework manager
380 AliDebug(2, "Called");
381 const Int_t kMCOffset = kNcutStepsMCTrack;
382 const Int_t kRecOffset = kNcutStepsRecTrack;
386 fCutList = new TObjArray;
387 fCutList->SetOwner();
391 fHistQA->SetName(Form("%s_CutQAhistograms", GetName()));
392 fHistQA->SetOwner(kTRUE);
395 // Call all the setters for the cuts
396 SetParticleGenCutList();
397 SetAcceptanceCutList();
398 SetRecKineITSTPCCutList();
399 SetRecPrimaryCutList();
400 SetHFElectronITSCuts();
401 SetHFElectronTOFCuts();
402 SetHFElectronTPCCuts();
403 SetHFElectronTRDCuts();
404 SetHFElectronDcaCuts();
406 // Publish to the cuts which analysis type they are (ESD Analysis by default)
408 AliInfo("Setting AOD Analysis");
409 TObjArray *genCuts = dynamic_cast<TObjArray *>(fCutList->FindObject("fPartGenCuts"));
411 AliCFParticleGenCuts *myGenCut = dynamic_cast<AliCFParticleGenCuts *>(genCuts->FindObject("fCutsGenMC"));
413 myGenCut->SetAODMC(kTRUE);
418 // Connect the event cuts
419 SetEventCutList(kEventStepGenerated);
420 SetEventCutList(kEventStepReconstructed);
421 cfm->SetEventCutsList(kEventStepGenerated, dynamic_cast<TObjArray *>(fCutList->FindObject("fEvGenCuts")));
422 cfm->SetEventCutsList(kEventStepReconstructed, dynamic_cast<TObjArray *>(fCutList->FindObject("fEvRecCuts")));
424 // Connect the particle cuts
426 cfm->SetParticleCutsList(kStepMCGenerated, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartGenCuts")));
427 cfm->SetParticleCutsList(kStepMCInAcceptance, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartAccCuts")));
429 cfm->SetParticleCutsList(kStepRecKineITSTPC + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartRecKineITSTPCCuts")));
430 cfm->SetParticleCutsList(kStepRecPrim + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartPrimCuts")));
431 cfm->SetParticleCutsList(kStepHFEcutsITS + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsITS")));
432 cfm->SetParticleCutsList(kStepHFEcutsTOF+ kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsTOF")));
433 cfm->SetParticleCutsList(kStepHFEcutsTPC+ kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsTPC")));
434 cfm->SetParticleCutsList(kStepHFEcutsTRD + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsTRD")));
435 cfm->SetParticleCutsList(kStepHFEcutsDca + kRecOffset + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsDca")));
439 //__________________________________________________________________
440 void AliHFEcuts::Initialize(){
441 // Call all the setters for the cuts
442 AliDebug(2, "Called\n");
446 fCutList = new TObjArray;
447 fCutList->SetOwner();
451 fHistQA->SetName(Form("%s_CutQAhistograms", GetName()));
452 fHistQA->SetOwner(kFALSE);
454 SetParticleGenCutList();
455 SetAcceptanceCutList();
456 SetRecKineITSTPCCutList();
457 SetRecPrimaryCutList();
458 SetHFElectronITSCuts();
459 SetHFElectronTOFCuts();
460 SetHFElectronTPCCuts();
461 SetHFElectronTRDCuts();
462 SetHFElectronDcaCuts();
464 // Publish to the cuts which analysis type they are (ESD Analysis by default)
466 //printf("Initialize AOD\n");
467 //AliInfo("Setting AOD Analysis");
468 TObjArray *genCuts = dynamic_cast<TObjArray *>(fCutList->FindObject("fPartGenCuts"));
470 AliCFParticleGenCuts *myGenCut = dynamic_cast<AliCFParticleGenCuts *>(genCuts->FindObject("fCutsGenMC"));
472 myGenCut->SetAODMC(kTRUE);
473 //printf("Set AOD MC\n");
478 // Connect the event cuts
479 SetEventCutList(kEventStepGenerated);
480 SetEventCutList(kEventStepReconstructed);
485 //__________________________________________________________________
486 void AliHFEcuts::SetEventCutList(Int_t istep){
488 // Cuts for Event Selection
490 AliDebug(2, "Called\n");
491 TObjArray *arr = new TObjArray;
492 if(istep == kEventStepGenerated){
493 AliCFEventGenCuts *evGenCuts = new AliCFEventGenCuts((Char_t *)"fCutsEvGen", (Char_t *)"Event Generated cuts");
494 //evGenCuts->SetNTracksCut(1);
495 evGenCuts->SetRequireVtxCuts(kTRUE);
496 //evGenCuts->SetVertexXCut(-1, 1);
497 //evGenCuts->SetVertexYCut(-1, 1);
498 evGenCuts->SetVertexZCut(-fVertexRangeZ, fVertexRangeZ);
499 if(IsQAOn()) evGenCuts->SetQAOn(fHistQA);
501 arr->SetName("fEvGenCuts");
502 arr->AddLast(evGenCuts);
505 AliHFEextraEventCuts *evRecCuts = new AliHFEextraEventCuts((Char_t *)"fCutsEvRec", (Char_t *)"Event Reconstructed cuts");
506 evRecCuts->SetRequireVtxCuts(kTRUE);
507 if(fUseSPDVertex) evRecCuts->SetUseSPDVertex();
508 if(fUseMixedVertex) evRecCuts->SetUseMixedVertex();
509 if(fUseCorrelationVertex) evRecCuts->SetCheckCorrelationSPDVtx();
510 if(fSPDVtxResolution) evRecCuts->SetCheckSPDResolution();
511 if(fPApileupCut) evRecCuts->SetpAPileupCut();
512 evRecCuts->SetVertexZCut(-fVertexRangeZ, fVertexRangeZ);
513 //evRecCuts->SetVertexNContributors(1,(Int_t)1.e9);
514 if(IsQAOn()) evRecCuts->SetQAOn(fHistQA);
515 arr->SetName("fEvRecCuts");
516 arr->AddLast(evRecCuts);
519 fCutList->AddLast(arr);
522 //__________________________________________________________________
523 void AliHFEcuts::SetParticleGenCutList(){
525 // Initialize Particle Cuts for Monte Carlo Tracks
526 // Production Vertex Radius: < 3cm
527 // Particle Species: Electrons
528 // Eta: < 0.8 (fEtaRange)
531 TObjArray *mcCuts = new TObjArray;
532 mcCuts->SetName("fPartGenCuts");
535 AliDebug(2, "Called\n");
536 AliCFParticleGenCuts *genCuts = new AliCFParticleGenCuts("fCutsGenMC", "Particle Generation Cuts");
537 genCuts->SetRequireIsCharged();
538 if(IsRequirePrimary()) {
539 genCuts->SetRequireIsPrimary();
541 if(IsRequireProdVertex()){
542 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]));
544 genCuts->SetProdVtxRangeX(fProdVtx[0], fProdVtx[1]);
545 genCuts->SetProdVtxRangeY(fProdVtx[2], fProdVtx[3]);
546 genCuts->SetProdVtxRange2D(kTRUE); // Use ellipse
549 // (ONLY PROVISOIRE FOR MC AOD)
550 // genCuts->SetProdVtxRangeX(-TMath::Abs(fProdVtx[1]), TMath::Abs(fProdVtx[1]));
551 // genCuts->SetProdVtxRangeY(-TMath::Abs(fProdVtx[3]), TMath::Abs(fProdVtx[3]));
554 genCuts->SetRequirePdgCode(11, kTRUE);
555 if(IsQAOn()) genCuts->SetQAOn(fHistQA);
558 mcCuts->AddLast(genCuts);
561 if(IsRequireKineMCCuts()) {
562 AliCFTrackKineCuts *kineMCcuts = new AliCFTrackKineCuts((Char_t *)"fCutsKineMC", (Char_t *)"MC Kine Cuts");
563 kineMCcuts->SetPtRange(fPtRange[0], fPtRange[1]);
564 //kineMCcuts->SetEtaRange(-0.8, 0.8);
565 kineMCcuts->SetEtaRange(fEtaRange[0],fEtaRange[1]);
566 if(IsQAOn()) kineMCcuts->SetQAOn(fHistQA);
567 mcCuts->AddLast(kineMCcuts);
570 fCutList->AddLast(mcCuts);
573 //__________________________________________________________________
574 void AliHFEcuts::SetAcceptanceCutList(){
576 // Initialize Particle (Monte Carlo) acceptance cuts
577 // Min. Required Hist for Detectors:
580 // TRD [2*nTracklets]
583 AliDebug(2, "Called\n");
584 AliCFAcceptanceCuts *accCuts = new AliCFAcceptanceCuts("fCutsAccMC", "MC Acceptance Cuts");
585 accCuts->SetMinNHitITS(3);
586 accCuts->SetMinNHitTPC(2);
587 accCuts->SetMinNHitTRD(2*fMinTrackletsTRD);
588 if(IsQAOn()) accCuts->SetQAOn(fHistQA);
590 TObjArray *partAccCuts = new TObjArray();
591 partAccCuts->SetName("fPartAccCuts");
592 partAccCuts->AddLast(accCuts);
593 fCutList->AddLast(partAccCuts);
596 //__________________________________________________________________
597 void AliHFEcuts::SetRecKineITSTPCCutList(){
599 // Track Kinematics and Quality cuts (Based on the Standard cuts from PWG0)
608 // Min. Number of Clusters:
612 // Chi2 per TPC cluster: 3.5
615 // Momentum Range: 100MeV - 20GeV
616 // Eta: < 0.9 (TRD-TOF acceptance)
618 const Long_t kStatusSelectionDefault(AliESDtrack::kTPCrefit | AliESDtrack::kITSrefit);
619 AliDebug(2, "Called\n");
620 AliCFTrackQualityCuts *trackQuality = new AliCFTrackQualityCuts((Char_t *)"fCutsQualityRec", (Char_t *)"REC Track Quality Cuts");
621 //trackQuality->SetMinNClusterITS(fMinClustersITS);
622 trackQuality->SetMaxChi2PerClusterTPC(fMaxChi2clusterTPC);
623 if(fMaxChi2clusterITS >= 0.) trackQuality->SetMaxChi2PerClusterITS(fMaxChi2clusterITS);
624 Long_t statusRequirement;
625 if(fAdditionalStatusRequirement)
626 statusRequirement = kStatusSelectionDefault | fAdditionalStatusRequirement;
628 statusRequirement = kStatusSelectionDefault;
629 trackQuality->SetStatus(statusRequirement);
630 //trackQuality->SetMaxCovDiagonalElements(2., 2., 0.5, 0.5, 2);
632 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTPCRec","Extra cuts from the HFE group");
633 hfecuts->SetDebugLevel(fDebugLevel);
634 hfecuts->SetMinNbITScls(fMinClustersITS);
635 // Set the cut in the TPC number of clusters
636 hfecuts->SetMinNClustersTPC(fMinClustersTPC,AliHFEextraCuts::ETPCclusterDef_t(fTPCclusterDef));
637 hfecuts->SetMinNClustersTPCPID(fMinClustersTPCPID);
638 hfecuts->SetClusterRatioTPC(fMinClusterRatioTPC,AliHFEextraCuts::ETPCclrDef_t(fTPCratioDef));
639 if(fFractionOfSharedTPCClusters > 0.0) hfecuts->SetFractionOfTPCSharedClusters(fFractionOfSharedTPCClusters);
640 if(fITSpatternCut) hfecuts->SetITSpatternCut();
641 if(fAODFilterBit > -1) hfecuts->SetAODFilterBit(fAODFilterBit);
643 AliCFTrackKineCuts *kineCuts = new AliCFTrackKineCuts((Char_t *)"fCutsKineRec", (Char_t *)"REC Kine Cuts");
644 kineCuts->SetPtRange(fPtRange[0], fPtRange[1]);
645 //kineCuts->SetEtaRange(-0.8, 0.8);
646 kineCuts->SetEtaRange(fEtaRange[0],fEtaRange[1]);
649 trackQuality->SetQAOn(fHistQA);
650 hfecuts->SetQAOn(fHistQA);
651 kineCuts->SetQAOn(fHistQA);
654 TObjArray *recCuts = new TObjArray;
655 recCuts->SetName("fPartRecKineITSTPCCuts");
656 recCuts->AddLast(trackQuality);
657 recCuts->AddLast(hfecuts);
658 recCuts->AddLast(kineCuts);
659 fCutList->AddLast(recCuts);
662 //__________________________________________________________________
663 void AliHFEcuts::SetRecPrimaryCutList(){
665 // Primary cuts (based on standard cuts from PWG0):
671 AliDebug(2, "Called\n");
672 AliCFTrackIsPrimaryCuts *primaryCut = new AliCFTrackIsPrimaryCuts((Char_t *)"fCutsPrimaryCuts", (Char_t *)"REC Primary Cuts");
673 //if(IsRequireDCAToVertex()){
674 //primaryCut->SetDCAToVertex2D(kTRUE);
675 //primaryCut->SetMaxDCAToVertexXY(fDCAtoVtx[0]);
676 //primaryCut->SetMaxDCAToVertexZ(fDCAtoVtx[1]);
678 if(IsRequireSigmaToVertex()){
679 primaryCut->SetRequireSigmaToVertex(kTRUE);
680 if(fSigmaToVtx[0]) primaryCut->SetMaxNSigmaToVertex(fSigmaToVtx[0]);
681 if(fSigmaToVtx[1]) primaryCut->SetMaxSigmaDCAxy(fSigmaToVtx[1]);
682 if(fSigmaToVtx[2]) primaryCut->SetMaxSigmaDCAz(fSigmaToVtx[2]);
684 //primaryCut->SetAcceptKinkDaughters(kFALSE);
685 if(IsQAOn()) primaryCut->SetQAOn(fHistQA);
687 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsPrimaryCutsextra","Extra cuts from the HFE group");
688 hfecuts->SetMaxImpactParameterRpar(fMaxImpactParameterRpar);
689 hfecuts->SetRejectKinkDaughter();
690 //hfecuts->SetRejectKinkMother();
691 if(IsRequireDCAToVertex()){
692 hfecuts->SetMaxImpactParamR(fDCAtoVtx[0]);
693 hfecuts->SetMaxImpactParamZ(fDCAtoVtx[1]);
696 TObjArray *primCuts = new TObjArray;
697 primCuts->SetName("fPartPrimCuts");
699 if(IsRequireSigmaToVertex()) primCuts->AddLast(primaryCut);
700 //if(fMaxImpactParameterRpar){
701 primCuts->AddLast(hfecuts);
703 fCutList->AddLast(primCuts);
706 //__________________________________________________________________
707 void AliHFEcuts::SetHFElectronITSCuts(){
709 // Special Cuts introduced by the HFElectron Group: ITS
711 AliDebug(2, "Called\n");
712 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupPixels","Extra cuts from the HFE group");
713 if(IsRequireITSpixel()){
714 hfecuts->SetRequireITSpixel(AliHFEextraCuts::ITSPixel_t(fCutITSPixel));
715 hfecuts->SetCheckITSstatus(fCheckITSLayerStatus);
717 if(IsRequireITSdrift()){
718 hfecuts->SetRequireITSdrift(AliHFEextraCuts::ITSDrift_t(fCutITSDrift));
721 if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
722 hfecuts->SetDebugLevel(fDebugLevel);
724 TObjArray *hfeCuts = new TObjArray;
725 hfeCuts->SetName("fPartHFECutsITS");
726 hfeCuts->AddLast(hfecuts);
727 fCutList->AddLast(hfeCuts);
730 //__________________________________________________________________
731 void AliHFEcuts::SetHFElectronTOFCuts(){
733 // Special Cuts introduced by the HFElectron Group: TRD
735 AliDebug(2, "Called\n");
736 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTOF","Extra cuts from the HFE group on TOF PID");
737 if(fTOFPIDStep) hfecuts->SetTOFPID(kTRUE);
738 if(fTOFMISMATCHStep) hfecuts->SetTOFMISMATCH(kTRUE);
739 if((fTOFsignaldx > 0.0) && (fTOFsignaldz > 0.0)) hfecuts->SetTOFsignalDxz(fTOFsignaldx,fTOFsignaldz);
740 if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
741 hfecuts->SetDebugLevel(fDebugLevel);
743 TObjArray *hfeCuts = new TObjArray;
744 hfeCuts->SetName("fPartHFECutsTOF");
745 hfeCuts->AddLast(hfecuts);
746 fCutList->AddLast(hfeCuts);
749 //__________________________________________________________________
750 void AliHFEcuts::SetHFElectronTPCCuts(){
752 // Special Cuts introduced by the HFElectron Group: TPC
754 AliDebug(2, "Called\n");
755 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTPCPID","Extra cuts from the HFE group on TPC PID");
756 if(fTPCPIDCLEANUPStep) hfecuts->SetTPCPIDCleanUp(kTRUE);
757 if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
758 hfecuts->SetDebugLevel(fDebugLevel);
760 TObjArray *hfeCuts = new TObjArray;
761 hfeCuts->SetName("fPartHFECutsTPC");
762 hfeCuts->AddLast(hfecuts);
763 fCutList->AddLast(hfeCuts);
767 //__________________________________________________________________
768 void AliHFEcuts::SetHFElectronTRDCuts(){
770 // Special Cuts introduced by the HFElectron Group: TRD
772 AliDebug(2, "Called\n");
773 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTRD","Extra cuts from the HFE group on TRD PID");
774 if(fMinTrackletsTRD > 0.) hfecuts->SetMinTrackletsTRD(fMinTrackletsTRD, fTRDtrackletsExact);
776 hfecuts->SetMaxChi2TRD(fMaxChi2TRD);
778 if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
779 hfecuts->SetDebugLevel(fDebugLevel);
781 TObjArray *hfeCuts = new TObjArray;
782 hfeCuts->SetName("fPartHFECutsTRD");
783 hfeCuts->AddLast(hfecuts);
784 fCutList->AddLast(hfeCuts);
787 //__________________________________________________________________
788 void AliHFEcuts::SetHFElectronDcaCuts(){
790 // Special Cuts introduced by the HFElectron Group: minimum of impact parameter
792 AliDebug(2, "Called\n");
793 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupDCA","Extra cuts from the HFE group");
794 hfecuts->SetMinHFEImpactParamR(fIPCutParams,fIsIPSigmacut,fIsIPcharge,fIsIPOpp);
795 if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
796 hfecuts->SetDebugLevel(fDebugLevel);
798 TObjArray *hfeCuts = new TObjArray;
799 hfeCuts->SetName("fPartHFECutsDca");
800 hfeCuts->AddLast(hfecuts);
801 fCutList->AddLast(hfeCuts);
804 //__________________________________________________________________
805 Bool_t AliHFEcuts::CheckParticleCuts(UInt_t step, TObject *o){
807 // Checks the cuts without using the correction framework manager
809 AliDebug(2, "Called\n");
810 TString stepnames[kNcutStepsMCTrack + kNcutStepsRecTrack + kNcutStepsDETrack + kNcutStepsSecvtxTrack + 1] = {"fPartGenCuts","fPartEvCutPileupZ","fPartEvCut","fPartAccCuts","fPartRecNoCuts","fPartRecKineITSTPCCuts", "fPartPrimCuts", "fPartHFECutsITS","fPartHFECutsTOF","fPartHFECutsTPC","fPartHFECutsTRD","fPartHFECutsDca", "fPartHFECutsSecvtx"};
811 AliDebug(2, Form("Doing cut %s", stepnames[step].Data()));
812 TObjArray *cuts = dynamic_cast<TObjArray *>(fCutList->FindObject(stepnames[step].Data()));
813 if(!cuts) return kTRUE;
816 Bool_t status = kTRUE;
817 while((mycut = dynamic_cast<AliCFCutBase *>(it()))){
818 status &= mycut->IsSelected(o);
824 //__________________________________________________________________
825 Bool_t AliHFEcuts::CheckEventCuts(const char*namestep, TObject *o){
827 // Checks the cuts without using the correction framework manager
829 AliDebug(2, "Called\n");
830 TObjArray *cuts = dynamic_cast<TObjArray *>(fCutList->FindObject(namestep));
831 if(!cuts) return kTRUE;
834 Bool_t status = kTRUE;
835 while((mycut = dynamic_cast<AliCFCutBase *>(it()))){
836 status &= mycut->IsSelected(o);
841 //__________________________________________________________________
842 void AliHFEcuts::SetRecEvent(const AliVEvent *ev){
844 // Publish reconstructed event to the cuts
846 TIter cutsteps(fCutList);
849 while((cutstep = dynamic_cast<TObjArray *>(cutsteps()))){
850 TIter cutIter(cutstep);
851 while((cut = dynamic_cast<AliCFCutBase *>(cutIter()))){
852 cut->SetRecEventInfo(ev);
857 //__________________________________________________________________
858 void AliHFEcuts::SetMCEvent(const AliVEvent *ev){
860 // Publish reconstructed event to the cuts
862 TIter cutsteps(fCutList);
865 while((cutstep = dynamic_cast<TObjArray *>(cutsteps()))){
866 TIter cutIter(cutstep);
867 while((cut = dynamic_cast<AliCFCutBase *>(cutIter()))){
868 cut->SetMCEventInfo(ev);