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():
120 fMinClustersTPCPID(0),
125 fCheckITSLayerStatus(kTRUE),
127 fMaxChi2clusterITS(-1.),
128 fMaxChi2clusterTPC(0.),
129 fMinClusterRatioTPC(0.),
131 fTRDtrackletsExact(kFALSE),
133 fTOFMISMATCHStep(kFALSE),
134 fTPCPIDCLEANUPStep(kFALSE),
135 fITSpatternCut(kFALSE),
136 fUseMixedVertex(kTRUE),
137 fIsIPSigmacut(kFALSE),
139 fFractionOfSharedTPCClusters(-1.0),
140 fMaxImpactParameterRpar(kFALSE),
141 fAdditionalStatusRequirement(0),
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);
159 //__________________________________________________________________
160 AliHFEcuts::AliHFEcuts(const Char_t *name, const Char_t *title):
167 fMinClustersTPCPID(0),
172 fCheckITSLayerStatus(kTRUE),
174 fMaxChi2clusterITS(-1.),
175 fMaxChi2clusterTPC(0.),
176 fMinClusterRatioTPC(0.),
178 fTRDtrackletsExact(kFALSE),
180 fTOFMISMATCHStep(kFALSE),
181 fTPCPIDCLEANUPStep(kFALSE),
182 fITSpatternCut(kFALSE),
183 fUseMixedVertex(kTRUE),
184 fIsIPSigmacut(kFALSE),
186 fFractionOfSharedTPCClusters(-1.0),
187 fMaxImpactParameterRpar(kFALSE),
188 fAdditionalStatusRequirement(0),
196 // Default Constructor
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);
205 //__________________________________________________________________
206 AliHFEcuts::AliHFEcuts(const AliHFEcuts &c):
208 fRequirements(c.fRequirements),
209 fTPCclusterDef(c.fTPCclusterDef),
210 fTPCratioDef(c.fTPCratioDef),
211 fEtaRange(c.fEtaRange),
213 fMinClustersTPCPID(0),
218 fCheckITSLayerStatus(0),
220 fMaxChi2clusterITS(-1.),
221 fMaxChi2clusterTPC(0),
222 fMinClusterRatioTPC(0),
224 fTRDtrackletsExact(kFALSE),
226 fTOFMISMATCHStep(kFALSE),
227 fTPCPIDCLEANUPStep(kFALSE),
228 fITSpatternCut(c.fITSpatternCut),
229 fUseMixedVertex(kTRUE),
230 fIsIPSigmacut(kFALSE),
232 fFractionOfSharedTPCClusters(-1.0),
233 fMaxImpactParameterRpar(kFALSE),
234 fAdditionalStatusRequirement(0),
247 //__________________________________________________________________
248 AliHFEcuts &AliHFEcuts::operator=(const AliHFEcuts &c){
252 if(&c != this) c.Copy(*this);
256 //__________________________________________________________________
257 void AliHFEcuts::Copy(TObject &c) const {
261 AliHFEcuts &target = dynamic_cast<AliHFEcuts &>(c);
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;
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);
301 target.fCutList->Clear();
302 delete target.fCutList;
305 target.fCutList = dynamic_cast<TObjArray *>(fCutList->Clone());
306 if(target.fCutList) target.fCutList->SetOwner(); // Coverity
309 delete target.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()))){
321 while((co = dynamic_cast<AliCFCutBase *>(cit1()))) co->SetQAOn(target.fHistQA);
326 //__________________________________________________________________
327 AliHFEcuts::~AliHFEcuts(){
336 if(fHistQA) delete fHistQA;
339 //__________________________________________________________________
340 Long64_t AliHFEcuts::Merge(const TCollection *list){
342 // Merge function doing nothing, just writing the object to file
345 if(list->IsEmpty()) return 1;
347 // just count the number of objects to merge
349 while(iter()){ counts++; }
353 //__________________________________________________________________
354 void AliHFEcuts::Initialize(AliCFManager *cfm){
356 // Initializes the cut objects from the correction framework
357 // Publishes the cuts to the correction framework manager
359 AliDebug(2, "Called");
360 const Int_t kMCOffset = kNcutStepsMCTrack;
361 const Int_t kRecOffset = kNcutStepsRecTrack;
365 fCutList = new TObjArray;
366 fCutList->SetOwner();
370 fHistQA->SetName(Form("%s_CutQAhistograms", GetName()));
371 fHistQA->SetOwner(kTRUE);
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();
385 // Publish to the cuts which analysis type they are (ESD Analysis by default)
387 AliInfo("Setting AOD Analysis");
388 TObjArray *genCuts = dynamic_cast<TObjArray *>(fCutList->FindObject("fPartGenCuts"));
390 AliCFParticleGenCuts *myGenCut = dynamic_cast<AliCFParticleGenCuts *>(genCuts->FindObject("fCutsGenMC"));
392 myGenCut->SetAODMC(kTRUE);
397 // Connect the event cuts
398 SetEventCutList(kEventStepGenerated);
399 SetEventCutList(kEventStepReconstructed);
400 cfm->SetEventCutsList(kEventStepGenerated, dynamic_cast<TObjArray *>(fCutList->FindObject("fEvGenCuts")));
401 cfm->SetEventCutsList(kEventStepReconstructed, dynamic_cast<TObjArray *>(fCutList->FindObject("fEvRecCuts")));
403 // Connect the particle cuts
405 cfm->SetParticleCutsList(kStepMCGenerated, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartGenCuts")));
406 cfm->SetParticleCutsList(kStepMCInAcceptance, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartAccCuts")));
408 cfm->SetParticleCutsList(kStepRecKineITSTPC + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartRecKineITSTPCCuts")));
409 cfm->SetParticleCutsList(kStepRecPrim + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartPrimCuts")));
410 cfm->SetParticleCutsList(kStepHFEcutsITS + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsITS")));
411 cfm->SetParticleCutsList(kStepHFEcutsTOF+ kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsTOF")));
412 cfm->SetParticleCutsList(kStepHFEcutsTPC+ kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsTPC")));
413 cfm->SetParticleCutsList(kStepHFEcutsTRD + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsTRD")));
414 cfm->SetParticleCutsList(kStepHFEcutsDca + kRecOffset + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsDca")));
418 //__________________________________________________________________
419 void AliHFEcuts::Initialize(){
420 // Call all the setters for the cuts
421 AliDebug(2, "Called\n");
425 fCutList = new TObjArray;
426 fCutList->SetOwner();
430 fHistQA->SetName(Form("%s_CutQAhistograms", GetName()));
431 fHistQA->SetOwner(kFALSE);
433 SetParticleGenCutList();
434 SetAcceptanceCutList();
435 SetRecKineITSTPCCutList();
436 SetRecPrimaryCutList();
437 SetHFElectronITSCuts();
438 SetHFElectronTOFCuts();
439 SetHFElectronTPCCuts();
440 SetHFElectronTRDCuts();
441 SetHFElectronDcaCuts();
443 // Publish to the cuts which analysis type they are (ESD Analysis by default)
445 //printf("Initialize AOD\n");
446 //AliInfo("Setting AOD Analysis");
447 TObjArray *genCuts = dynamic_cast<TObjArray *>(fCutList->FindObject("fPartGenCuts"));
449 AliCFParticleGenCuts *myGenCut = dynamic_cast<AliCFParticleGenCuts *>(genCuts->FindObject("fCutsGenMC"));
451 myGenCut->SetAODMC(kTRUE);
452 //printf("Set AOD MC\n");
457 // Connect the event cuts
458 SetEventCutList(kEventStepGenerated);
459 SetEventCutList(kEventStepReconstructed);
464 //__________________________________________________________________
465 void AliHFEcuts::SetEventCutList(Int_t istep){
467 // Cuts for Event Selection
469 AliDebug(2, "Called\n");
470 TObjArray *arr = new TObjArray;
471 if(istep == kEventStepGenerated){
472 AliCFEventGenCuts *evGenCuts = new AliCFEventGenCuts((Char_t *)"fCutsEvGen", (Char_t *)"Event Generated cuts");
473 //evGenCuts->SetNTracksCut(1);
474 evGenCuts->SetRequireVtxCuts(kTRUE);
475 //evGenCuts->SetVertexXCut(-1, 1);
476 //evGenCuts->SetVertexYCut(-1, 1);
477 evGenCuts->SetVertexZCut(-fVertexRangeZ, fVertexRangeZ);
478 if(IsQAOn()) evGenCuts->SetQAOn(fHistQA);
480 arr->SetName("fEvGenCuts");
481 arr->AddLast(evGenCuts);
484 if(!fUseMixedVertex) {
485 AliCFEventRecCuts *evRecCuts = new AliCFEventRecCuts((Char_t *)"fCutsEvRec", (Char_t *)"Event Reconstructed cuts");
486 //evRecCuts->SetNTracksCut(1);
487 evRecCuts->SetRequireVtxCuts(kTRUE);
488 //evRecCuts->SetVertexXCut(-1, 1);
489 //evRecCuts->SetVertexYCut(-1, 1);
490 //evRecCuts->SetVertexZCut(-30, 30);
491 evRecCuts->SetVertexZCut(-fVertexRangeZ, fVertexRangeZ);
492 evRecCuts->SetVertexNContributors(1,(Int_t)1.e9);
493 if(IsQAOn()) evRecCuts->SetQAOn(fHistQA);
494 arr->SetName("fEvRecCuts");
495 arr->AddLast(evRecCuts);
497 AliHFEextraEventCuts *evRecCuts = new AliHFEextraEventCuts((Char_t *)"fCutsEvRec", (Char_t *)"Event Reconstructed cuts");
498 evRecCuts->SetRequireVtxCuts(kTRUE);
499 evRecCuts->SetUseMixedVertex();
500 evRecCuts->SetVertexZCut(-fVertexRangeZ, fVertexRangeZ);
501 //evRecCuts->SetVertexNContributors(1,(Int_t)1.e9);
502 if(IsQAOn()) evRecCuts->SetQAOn(fHistQA);
503 arr->SetName("fEvRecCuts");
504 arr->AddLast(evRecCuts);
507 fCutList->AddLast(arr);
510 //__________________________________________________________________
511 void AliHFEcuts::SetParticleGenCutList(){
513 // Initialize Particle Cuts for Monte Carlo Tracks
514 // Production Vertex Radius: < 3cm
515 // Particle Species: Electrons
516 // Eta: < 0.8 (fEtaRange)
519 TObjArray *mcCuts = new TObjArray;
520 mcCuts->SetName("fPartGenCuts");
523 AliDebug(2, "Called\n");
524 AliCFParticleGenCuts *genCuts = new AliCFParticleGenCuts("fCutsGenMC", "Particle Generation Cuts");
525 genCuts->SetRequireIsCharged();
526 if(IsRequirePrimary()) {
527 genCuts->SetRequireIsPrimary();
529 if(IsRequireProdVertex()){
530 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]));
532 genCuts->SetProdVtxRangeX(fProdVtx[0], fProdVtx[1]);
533 genCuts->SetProdVtxRangeY(fProdVtx[2], fProdVtx[3]);
534 genCuts->SetProdVtxRange2D(kTRUE); // Use ellipse
537 // (ONLY PROVISOIRE FOR MC AOD)
538 // genCuts->SetProdVtxRangeX(-TMath::Abs(fProdVtx[1]), TMath::Abs(fProdVtx[1]));
539 // genCuts->SetProdVtxRangeY(-TMath::Abs(fProdVtx[3]), TMath::Abs(fProdVtx[3]));
542 genCuts->SetRequirePdgCode(11, kTRUE);
543 if(IsQAOn()) genCuts->SetQAOn(fHistQA);
546 mcCuts->AddLast(genCuts);
549 if(IsRequireKineMCCuts()) {
550 AliCFTrackKineCuts *kineMCcuts = new AliCFTrackKineCuts((Char_t *)"fCutsKineMC", (Char_t *)"MC Kine Cuts");
551 kineMCcuts->SetPtRange(fPtRange[0], fPtRange[1]);
552 //kineMCcuts->SetEtaRange(-0.8, 0.8);
553 kineMCcuts->SetEtaRange(-TMath::Abs(fEtaRange),TMath::Abs(fEtaRange));
554 if(IsQAOn()) kineMCcuts->SetQAOn(fHistQA);
555 mcCuts->AddLast(kineMCcuts);
558 fCutList->AddLast(mcCuts);
561 //__________________________________________________________________
562 void AliHFEcuts::SetAcceptanceCutList(){
564 // Initialize Particle (Monte Carlo) acceptance cuts
565 // Min. Required Hist for Detectors:
568 // TRD [2*nTracklets]
571 AliDebug(2, "Called\n");
572 AliCFAcceptanceCuts *accCuts = new AliCFAcceptanceCuts("fCutsAccMC", "MC Acceptance Cuts");
573 accCuts->SetMinNHitITS(3);
574 accCuts->SetMinNHitTPC(2);
575 accCuts->SetMinNHitTRD(2*fMinTrackletsTRD);
576 if(IsQAOn()) accCuts->SetQAOn(fHistQA);
578 TObjArray *partAccCuts = new TObjArray();
579 partAccCuts->SetName("fPartAccCuts");
580 partAccCuts->AddLast(accCuts);
581 fCutList->AddLast(partAccCuts);
584 //__________________________________________________________________
585 void AliHFEcuts::SetRecKineITSTPCCutList(){
587 // Track Kinematics and Quality cuts (Based on the Standard cuts from PWG0)
596 // Min. Number of Clusters:
600 // Chi2 per TPC cluster: 3.5
603 // Momentum Range: 100MeV - 20GeV
604 // Eta: < 0.9 (TRD-TOF acceptance)
606 const Long_t kStatusSelectionDefault(AliESDtrack::kTPCrefit | AliESDtrack::kITSrefit);
607 AliDebug(2, "Called\n");
608 AliCFTrackQualityCuts *trackQuality = new AliCFTrackQualityCuts((Char_t *)"fCutsQualityRec", (Char_t *)"REC Track Quality Cuts");
609 //trackQuality->SetMinNClusterITS(fMinClustersITS);
610 trackQuality->SetMaxChi2PerClusterTPC(fMaxChi2clusterTPC);
611 if(fMaxChi2clusterITS >= 0.) trackQuality->SetMaxChi2PerClusterITS(fMaxChi2clusterITS);
612 Long_t statusRequirement;
613 if(fAdditionalStatusRequirement)
614 statusRequirement = kStatusSelectionDefault | fAdditionalStatusRequirement;
616 statusRequirement = kStatusSelectionDefault;
617 trackQuality->SetStatus(statusRequirement);
618 //trackQuality->SetMaxCovDiagonalElements(2., 2., 0.5, 0.5, 2);
620 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTPCRec","Extra cuts from the HFE group");
621 hfecuts->SetDebugLevel(fDebugLevel);
622 hfecuts->SetMinNbITScls(fMinClustersITS);
623 // Set the cut in the TPC number of clusters
624 hfecuts->SetMinNClustersTPC(fMinClustersTPC,AliHFEextraCuts::ETPCclusterDef_t(fTPCclusterDef));
625 hfecuts->SetMinNClustersTPCPID(fMinClustersTPCPID);
626 hfecuts->SetClusterRatioTPC(fMinClusterRatioTPC,AliHFEextraCuts::ETPCclrDef_t(fTPCratioDef));
627 if(fFractionOfSharedTPCClusters > 0.0) hfecuts->SetFractionOfTPCSharedClusters(fFractionOfSharedTPCClusters);
628 if(fITSpatternCut) hfecuts->SetITSpatternCut();
630 AliCFTrackKineCuts *kineCuts = new AliCFTrackKineCuts((Char_t *)"fCutsKineRec", (Char_t *)"REC Kine Cuts");
631 kineCuts->SetPtRange(fPtRange[0], fPtRange[1]);
632 //kineCuts->SetEtaRange(-0.8, 0.8);
633 kineCuts->SetEtaRange(-TMath::Abs(fEtaRange),TMath::Abs(fEtaRange));
636 trackQuality->SetQAOn(fHistQA);
637 hfecuts->SetQAOn(fHistQA);
638 kineCuts->SetQAOn(fHistQA);
641 TObjArray *recCuts = new TObjArray;
642 recCuts->SetName("fPartRecKineITSTPCCuts");
643 recCuts->AddLast(trackQuality);
644 recCuts->AddLast(hfecuts);
645 recCuts->AddLast(kineCuts);
646 fCutList->AddLast(recCuts);
649 //__________________________________________________________________
650 void AliHFEcuts::SetRecPrimaryCutList(){
652 // Primary cuts (based on standard cuts from PWG0):
658 AliDebug(2, "Called\n");
659 AliCFTrackIsPrimaryCuts *primaryCut = new AliCFTrackIsPrimaryCuts((Char_t *)"fCutsPrimaryCuts", (Char_t *)"REC Primary Cuts");
660 //if(IsRequireDCAToVertex()){
661 //primaryCut->SetDCAToVertex2D(kTRUE);
662 //primaryCut->SetMaxDCAToVertexXY(fDCAtoVtx[0]);
663 //primaryCut->SetMaxDCAToVertexZ(fDCAtoVtx[1]);
665 if(IsRequireSigmaToVertex()){
666 primaryCut->SetRequireSigmaToVertex(kTRUE);
667 if(fSigmaToVtx[0]) primaryCut->SetMaxNSigmaToVertex(fSigmaToVtx[0]);
668 if(fSigmaToVtx[1]) primaryCut->SetMaxSigmaDCAxy(fSigmaToVtx[1]);
669 if(fSigmaToVtx[2]) primaryCut->SetMaxSigmaDCAz(fSigmaToVtx[2]);
671 //primaryCut->SetAcceptKinkDaughters(kFALSE);
672 if(IsQAOn()) primaryCut->SetQAOn(fHistQA);
674 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsPrimaryCutsextra","Extra cuts from the HFE group");
675 hfecuts->SetMaxImpactParameterRpar(fMaxImpactParameterRpar);
676 hfecuts->SetRejectKinkDaughter();
677 //hfecuts->SetRejectKinkMother();
678 if(IsRequireDCAToVertex()){
679 hfecuts->SetMaxImpactParamR(fDCAtoVtx[0]);
680 hfecuts->SetMaxImpactParamZ(fDCAtoVtx[1]);
683 TObjArray *primCuts = new TObjArray;
684 primCuts->SetName("fPartPrimCuts");
686 if(IsRequireSigmaToVertex()) primCuts->AddLast(primaryCut);
687 //if(fMaxImpactParameterRpar){
688 primCuts->AddLast(hfecuts);
690 fCutList->AddLast(primCuts);
693 //__________________________________________________________________
694 void AliHFEcuts::SetHFElectronITSCuts(){
696 // Special Cuts introduced by the HFElectron Group: ITS
698 AliDebug(2, "Called\n");
699 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupPixels","Extra cuts from the HFE group");
700 if(IsRequireITSpixel()){
701 hfecuts->SetRequireITSpixel(AliHFEextraCuts::ITSPixel_t(fCutITSPixel));
702 hfecuts->SetCheckITSstatus(fCheckITSLayerStatus);
704 if(IsRequireITSdrift()){
705 hfecuts->SetRequireITSdrift(AliHFEextraCuts::ITSDrift_t(fCutITSDrift));
708 if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
709 hfecuts->SetDebugLevel(fDebugLevel);
711 TObjArray *hfeCuts = new TObjArray;
712 hfeCuts->SetName("fPartHFECutsITS");
713 hfeCuts->AddLast(hfecuts);
714 fCutList->AddLast(hfeCuts);
717 //__________________________________________________________________
718 void AliHFEcuts::SetHFElectronTOFCuts(){
720 // Special Cuts introduced by the HFElectron Group: TRD
722 AliDebug(2, "Called\n");
723 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTOF","Extra cuts from the HFE group on TOF PID");
724 if(fTOFPIDStep) hfecuts->SetTOFPID(kTRUE);
725 if(fTOFMISMATCHStep) hfecuts->SetTOFMISMATCH(kTRUE);
726 if((fTOFsignaldx > 0.0) && (fTOFsignaldz > 0.0)) hfecuts->SetTOFsignalDxz(fTOFsignaldx,fTOFsignaldz);
727 if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
728 hfecuts->SetDebugLevel(fDebugLevel);
730 TObjArray *hfeCuts = new TObjArray;
731 hfeCuts->SetName("fPartHFECutsTOF");
732 hfeCuts->AddLast(hfecuts);
733 fCutList->AddLast(hfeCuts);
736 //__________________________________________________________________
737 void AliHFEcuts::SetHFElectronTPCCuts(){
739 // Special Cuts introduced by the HFElectron Group: TPC
741 AliDebug(2, "Called\n");
742 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTPCPID","Extra cuts from the HFE group on TPC PID");
743 if(fTPCPIDCLEANUPStep) hfecuts->SetTPCPIDCleanUp(kTRUE);
744 if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
745 hfecuts->SetDebugLevel(fDebugLevel);
747 TObjArray *hfeCuts = new TObjArray;
748 hfeCuts->SetName("fPartHFECutsTPC");
749 hfeCuts->AddLast(hfecuts);
750 fCutList->AddLast(hfeCuts);
754 //__________________________________________________________________
755 void AliHFEcuts::SetHFElectronTRDCuts(){
757 // Special Cuts introduced by the HFElectron Group: TRD
759 AliDebug(2, "Called\n");
760 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTRD","Extra cuts from the HFE group on TRD PID");
761 if(fMinTrackletsTRD > 0.) hfecuts->SetMinTrackletsTRD(fMinTrackletsTRD, fTRDtrackletsExact);
763 hfecuts->SetMaxChi2TRD(fMaxChi2TRD);
765 if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
766 hfecuts->SetDebugLevel(fDebugLevel);
768 TObjArray *hfeCuts = new TObjArray;
769 hfeCuts->SetName("fPartHFECutsTRD");
770 hfeCuts->AddLast(hfecuts);
771 fCutList->AddLast(hfeCuts);
774 //__________________________________________________________________
775 void AliHFEcuts::SetHFElectronDcaCuts(){
777 // Special Cuts introduced by the HFElectron Group: minimum of impact parameter
779 AliDebug(2, "Called\n");
780 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupDCA","Extra cuts from the HFE group");
781 hfecuts->SetMinHFEImpactParamR(fIPCutParams,fIsIPSigmacut,fIsIPAbs);
782 if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
783 hfecuts->SetDebugLevel(fDebugLevel);
785 TObjArray *hfeCuts = new TObjArray;
786 hfeCuts->SetName("fPartHFECutsDca");
787 hfeCuts->AddLast(hfecuts);
788 fCutList->AddLast(hfeCuts);
791 //__________________________________________________________________
792 Bool_t AliHFEcuts::CheckParticleCuts(UInt_t step, TObject *o){
794 // Checks the cuts without using the correction framework manager
796 AliDebug(2, "Called\n");
797 TString stepnames[kNcutStepsMCTrack + kNcutStepsRecTrack + kNcutStepsDETrack + kNcutStepsSecvtxTrack + 1] = {"fPartGenCuts","fPartEvCutPileupZ","fPartEvCut","fPartAccCuts","fPartRecNoCuts","fPartRecKineITSTPCCuts", "fPartPrimCuts", "fPartHFECutsITS","fPartHFECutsTOF","fPartHFECutsTPC","fPartHFECutsTRD","fPartHFECutsDca", "fPartHFECutsSecvtx"};
798 AliDebug(2, Form("Doing cut %s", stepnames[step].Data()));
799 TObjArray *cuts = dynamic_cast<TObjArray *>(fCutList->FindObject(stepnames[step].Data()));
800 if(!cuts) return kTRUE;
803 Bool_t status = kTRUE;
804 while((mycut = dynamic_cast<AliCFCutBase *>(it()))){
805 status &= mycut->IsSelected(o);
811 //__________________________________________________________________
812 Bool_t AliHFEcuts::CheckEventCuts(const char*namestep, TObject *o){
814 // Checks the cuts without using the correction framework manager
816 AliDebug(2, "Called\n");
817 TObjArray *cuts = dynamic_cast<TObjArray *>(fCutList->FindObject(namestep));
818 if(!cuts) return kTRUE;
821 Bool_t status = kTRUE;
822 while((mycut = dynamic_cast<AliCFCutBase *>(it()))){
823 status &= mycut->IsSelected(o);
828 //__________________________________________________________________
829 void AliHFEcuts::SetRecEvent(const AliVEvent *ev){
831 // Publish reconstructed event to the cuts
833 TIter cutsteps(fCutList);
836 while((cutstep = dynamic_cast<TObjArray *>(cutsteps()))){
837 TIter cutIter(cutstep);
838 while((cut = dynamic_cast<AliCFCutBase *>(cutIter()))){
839 cut->SetRecEventInfo(ev);
844 //__________________________________________________________________
845 void AliHFEcuts::SetMCEvent(const AliVEvent *ev){
847 // Publish reconstructed event to the cuts
849 TIter cutsteps(fCutList);
852 while((cutstep = dynamic_cast<TObjArray *>(cutsteps()))){
853 TIter cutIter(cutstep);
854 while((cut = dynamic_cast<AliCFCutBase *>(cutIter()))){
855 cut->SetMCEventInfo(ev);