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),
120 fMinClustersTPCPID(0),
124 fCheckITSLayerStatus(kTRUE),
126 fMaxChi2clusterITS(-1.),
127 fMaxChi2clusterTPC(0.),
128 fMinClusterRatioTPC(0.),
130 fTRDtrackletsExact(kFALSE),
132 fTOFMISMATCHStep(kFALSE),
133 fTPCPIDCLEANUPStep(kFALSE),
134 fUseMixedVertex(kTRUE),
135 fIsIPSigmacut(kFALSE),
137 fFractionOfSharedTPCClusters(-1.0),
138 fMaxImpactParameterRpar(kFALSE),
139 fAdditionalStatusRequirement(0),
149 memset(fProdVtx, 0, sizeof(Double_t) * 4);
150 memset(fDCAtoVtx, 0, sizeof(Double_t) * 2);
151 memset(fPtRange, 0, sizeof(Double_t) * 2);
152 memset(fIPCutParams, 0, sizeof(Float_t) * 4);
153 memset(fSigmaToVtx, 0, sizeof(Double_t) * 3);
157 //__________________________________________________________________
158 AliHFEcuts::AliHFEcuts(const Char_t *name, const Char_t *title):
161 fTPCclusterDef(AliHFEextraCuts::kFound),
162 fTPCratioDef(AliHFEextraCuts::kFoundOverFindable),
165 fMinClustersTPCPID(0),
169 fCheckITSLayerStatus(kTRUE),
171 fMaxChi2clusterITS(-1.),
172 fMaxChi2clusterTPC(0.),
173 fMinClusterRatioTPC(0.),
175 fTRDtrackletsExact(kFALSE),
177 fTOFMISMATCHStep(kFALSE),
178 fTPCPIDCLEANUPStep(kFALSE),
179 fUseMixedVertex(kTRUE),
180 fIsIPSigmacut(kFALSE),
182 fFractionOfSharedTPCClusters(-1.0),
183 fMaxImpactParameterRpar(kFALSE),
184 fAdditionalStatusRequirement(0),
192 // Default Constructor
194 memset(fProdVtx, 0, sizeof(Double_t) * 4);
195 memset(fDCAtoVtx, 0, sizeof(Double_t) * 2);
196 memset(fPtRange, 0, sizeof(Double_t) * 2);
197 memset(fIPCutParams, 0, sizeof(Float_t) * 4);
198 memset(fSigmaToVtx, 0, sizeof(Double_t) * 3);
201 //__________________________________________________________________
202 AliHFEcuts::AliHFEcuts(const AliHFEcuts &c):
204 fRequirements(c.fRequirements),
205 fTPCclusterDef(c.fTPCclusterDef),
206 fTPCratioDef(c.fTPCratioDef),
207 fEtaRange(c.fEtaRange),
209 fMinClustersTPCPID(0),
213 fCheckITSLayerStatus(0),
215 fMaxChi2clusterITS(-1.),
216 fMaxChi2clusterTPC(0),
217 fMinClusterRatioTPC(0),
219 fTRDtrackletsExact(kFALSE),
221 fTOFMISMATCHStep(kFALSE),
222 fTPCPIDCLEANUPStep(kFALSE),
223 fUseMixedVertex(kTRUE),
224 fIsIPSigmacut(kFALSE),
226 fFractionOfSharedTPCClusters(-1.0),
227 fMaxImpactParameterRpar(kFALSE),
228 fAdditionalStatusRequirement(0),
241 //__________________________________________________________________
242 AliHFEcuts &AliHFEcuts::operator=(const AliHFEcuts &c){
246 if(&c != this) c.Copy(*this);
250 //__________________________________________________________________
251 void AliHFEcuts::Copy(TObject &c) const {
255 AliHFEcuts &target = dynamic_cast<AliHFEcuts &>(c);
257 target.fRequirements = fRequirements;
258 target.fTPCclusterDef = fTPCclusterDef;
259 target.fTPCratioDef = fTPCratioDef;
260 target.fEtaRange = fEtaRange;
261 target.fMinClustersTPC = fMinClustersTPC;
262 target.fMinClustersTPCPID = fMinClustersTPCPID;
263 target.fMinClustersITS = fMinClustersITS;
264 target.fMinTrackletsTRD = fMinTrackletsTRD;
265 target.fCutITSPixel = fCutITSPixel;
266 target.fCheckITSLayerStatus = fCheckITSLayerStatus;
267 target.fCutITSDrift = fCutITSDrift;
268 target.fMaxChi2clusterITS = fMaxChi2clusterITS;
269 target.fMaxChi2clusterTPC = fMaxChi2clusterTPC;
270 target.fMinClusterRatioTPC = fMinClusterRatioTPC;
271 target.fVertexRangeZ = fVertexRangeZ;
272 target.fTRDtrackletsExact = fTRDtrackletsExact;
273 target.fTOFPIDStep = fTOFPIDStep;
274 target.fTOFMISMATCHStep = fTOFMISMATCHStep;
275 target.fTPCPIDCLEANUPStep = fTPCPIDCLEANUPStep;
276 target.fUseMixedVertex = fUseMixedVertex;
277 target.fIsIPSigmacut = fIsIPSigmacut;
278 target.fIsIPAbs = fIsIPAbs;
279 target.fFractionOfSharedTPCClusters = fFractionOfSharedTPCClusters;
280 target.fMaxImpactParameterRpar = fMaxImpactParameterRpar;
281 target.fAdditionalStatusRequirement = fAdditionalStatusRequirement;
282 target.fTOFsignaldx = fTOFsignaldx;
283 target.fTOFsignaldz = fTOFsignaldz;
284 target.fDebugLevel = 0;
286 memcpy(target.fProdVtx, fProdVtx, sizeof(Double_t) * 4);
287 memcpy(target.fDCAtoVtx, fDCAtoVtx, sizeof(Double_t) * 2);
288 memcpy(target.fPtRange, fPtRange, sizeof(Double_t) *2);
289 memcpy(target.fIPCutParams, fIPCutParams, sizeof(Float_t) * 4);
290 memcpy(target.fSigmaToVtx, fSigmaToVtx, sizeof(Double_t) * 3);
294 target.fCutList->Clear();
295 delete target.fCutList;
298 target.fCutList = dynamic_cast<TObjArray *>(fCutList->Clone());
299 if(target.fCutList) target.fCutList->SetOwner(); // Coverity
302 delete target.fHistQA;
305 // If the QA list was already produced, then we create it new, loop over the cuts and connect all the histos with this list
306 target.fHistQA = new TList;
307 target.fHistQA->SetName(Form("%s_CutQAhistograms", GetName()));
308 fHistQA->SetOwner(kTRUE);
309 TIter cit(target.fCutList);
310 TObjArray *clist = NULL;
311 AliCFCutBase *co = NULL;
312 while((clist = dynamic_cast<TObjArray *>(cit()))){
314 while((co = dynamic_cast<AliCFCutBase *>(cit1()))) co->SetQAOn(target.fHistQA);
319 //__________________________________________________________________
320 AliHFEcuts::~AliHFEcuts(){
329 if(fHistQA) delete fHistQA;
332 //__________________________________________________________________
333 Long64_t AliHFEcuts::Merge(const TCollection *list){
335 // Merge function doing nothing, just writing the object to file
338 if(list->IsEmpty()) return 1;
340 // just count the number of objects to merge
342 while(iter()){ counts++; }
346 //__________________________________________________________________
347 void AliHFEcuts::Initialize(AliCFManager *cfm){
349 // Initializes the cut objects from the correction framework
350 // Publishes the cuts to the correction framework manager
352 AliDebug(2, "Called");
353 const Int_t kMCOffset = kNcutStepsMCTrack;
354 const Int_t kRecOffset = kNcutStepsRecTrack;
358 fCutList = new TObjArray;
359 fCutList->SetOwner();
363 fHistQA->SetName(Form("%s_CutQAhistograms", GetName()));
364 fHistQA->SetOwner(kTRUE);
367 // Call all the setters for the cuts
368 SetParticleGenCutList();
369 SetAcceptanceCutList();
370 SetRecKineITSTPCCutList();
371 SetRecPrimaryCutList();
372 SetHFElectronITSCuts();
373 SetHFElectronTOFCuts();
374 SetHFElectronTPCCuts();
375 SetHFElectronTRDCuts();
376 SetHFElectronDcaCuts();
378 // Publish to the cuts which analysis type they are (ESD Analysis by default)
380 AliInfo("Setting AOD Analysis");
381 TObjArray *genCuts = dynamic_cast<TObjArray *>(fCutList->FindObject("fPartGenCuts"));
383 AliCFParticleGenCuts *myGenCut = dynamic_cast<AliCFParticleGenCuts *>(genCuts->FindObject("fCutsGenMC"));
384 if(myGenCut) myGenCut->SetAODMC(kTRUE);
388 // Connect the event cuts
389 SetEventCutList(kEventStepGenerated);
390 SetEventCutList(kEventStepReconstructed);
391 cfm->SetEventCutsList(kEventStepGenerated, dynamic_cast<TObjArray *>(fCutList->FindObject("fEvGenCuts")));
392 cfm->SetEventCutsList(kEventStepReconstructed, dynamic_cast<TObjArray *>(fCutList->FindObject("fEvRecCuts")));
394 // Connect the particle cuts
396 cfm->SetParticleCutsList(kStepMCGenerated, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartGenCuts")));
397 cfm->SetParticleCutsList(kStepMCInAcceptance, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartAccCuts")));
399 cfm->SetParticleCutsList(kStepRecKineITSTPC + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartRecKineITSTPCCuts")));
400 cfm->SetParticleCutsList(kStepRecPrim + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartPrimCuts")));
401 cfm->SetParticleCutsList(kStepHFEcutsITS + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsITS")));
402 cfm->SetParticleCutsList(kStepHFEcutsTOF+ kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsTOF")));
403 cfm->SetParticleCutsList(kStepHFEcutsTPC+ kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsTPC")));
404 cfm->SetParticleCutsList(kStepHFEcutsTRD + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsTRD")));
405 cfm->SetParticleCutsList(kStepHFEcutsDca + kRecOffset + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsDca")));
409 //__________________________________________________________________
410 void AliHFEcuts::Initialize(){
411 // Call all the setters for the cuts
412 AliDebug(2, "Called\n");
416 fCutList = new TObjArray;
417 fCutList->SetOwner();
421 fHistQA->SetName(Form("%s_CutQAhistograms", GetName()));
422 fHistQA->SetOwner(kFALSE);
424 SetParticleGenCutList();
425 SetAcceptanceCutList();
426 SetRecKineITSTPCCutList();
427 SetRecPrimaryCutList();
428 SetHFElectronITSCuts();
429 SetHFElectronTOFCuts();
430 SetHFElectronTPCCuts();
431 SetHFElectronTRDCuts();
432 SetHFElectronDcaCuts();
434 // Connect the event cuts
435 SetEventCutList(kEventStepGenerated);
436 SetEventCutList(kEventStepReconstructed);
441 //__________________________________________________________________
442 void AliHFEcuts::SetEventCutList(Int_t istep){
444 // Cuts for Event Selection
446 AliDebug(2, "Called\n");
447 TObjArray *arr = new TObjArray;
448 if(istep == kEventStepGenerated){
449 AliCFEventGenCuts *evGenCuts = new AliCFEventGenCuts((Char_t *)"fCutsEvGen", (Char_t *)"Event Generated cuts");
450 //evGenCuts->SetNTracksCut(1);
451 evGenCuts->SetRequireVtxCuts(kTRUE);
452 //evGenCuts->SetVertexXCut(-1, 1);
453 //evGenCuts->SetVertexYCut(-1, 1);
454 evGenCuts->SetVertexZCut(-fVertexRangeZ, fVertexRangeZ);
455 if(IsQAOn()) evGenCuts->SetQAOn(fHistQA);
457 arr->SetName("fEvGenCuts");
458 arr->AddLast(evGenCuts);
461 if(!fUseMixedVertex) {
462 AliCFEventRecCuts *evRecCuts = new AliCFEventRecCuts((Char_t *)"fCutsEvRec", (Char_t *)"Event Reconstructed cuts");
463 //evRecCuts->SetNTracksCut(1);
464 evRecCuts->SetRequireVtxCuts(kTRUE);
465 //evRecCuts->SetVertexXCut(-1, 1);
466 //evRecCuts->SetVertexYCut(-1, 1);
467 //evRecCuts->SetVertexZCut(-30, 30);
468 evRecCuts->SetVertexZCut(-fVertexRangeZ, fVertexRangeZ);
469 evRecCuts->SetVertexNContributors(1,(Int_t)1.e9);
470 if(IsQAOn()) evRecCuts->SetQAOn(fHistQA);
471 arr->SetName("fEvRecCuts");
472 arr->AddLast(evRecCuts);
474 AliHFEextraEventCuts *evRecCuts = new AliHFEextraEventCuts((Char_t *)"fCutsEvRec", (Char_t *)"Event Reconstructed cuts");
475 evRecCuts->SetRequireVtxCuts(kTRUE);
476 evRecCuts->SetUseMixedVertex();
477 evRecCuts->SetVertexZCut(-fVertexRangeZ, fVertexRangeZ);
478 //evRecCuts->SetVertexNContributors(1,(Int_t)1.e9);
479 if(IsQAOn()) evRecCuts->SetQAOn(fHistQA);
480 arr->SetName("fEvRecCuts");
481 arr->AddLast(evRecCuts);
484 fCutList->AddLast(arr);
487 //__________________________________________________________________
488 void AliHFEcuts::SetParticleGenCutList(){
490 // Initialize Particle Cuts for Monte Carlo Tracks
491 // Production Vertex Radius: < 3cm
492 // Particle Species: Electrons
493 // Eta: < 0.8 (fEtaRange)
496 TObjArray *mcCuts = new TObjArray;
497 mcCuts->SetName("fPartGenCuts");
500 AliDebug(2, "Called\n");
501 AliCFParticleGenCuts *genCuts = new AliCFParticleGenCuts("fCutsGenMC", "Particle Generation Cuts");
502 genCuts->SetRequireIsCharged();
503 if(IsRequirePrimary()) {
504 genCuts->SetRequireIsPrimary();
506 if(IsRequireProdVertex()){
507 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]));
508 genCuts->SetProdVtxRangeX(fProdVtx[0], fProdVtx[1]);
509 genCuts->SetProdVtxRangeY(fProdVtx[2], fProdVtx[3]);
510 genCuts->SetProdVtxRange2D(kTRUE); // Use ellipse
512 genCuts->SetRequirePdgCode(11, kTRUE);
513 if(IsQAOn()) genCuts->SetQAOn(fHistQA);
516 mcCuts->AddLast(genCuts);
519 if(IsRequireKineMCCuts()) {
520 AliCFTrackKineCuts *kineMCcuts = new AliCFTrackKineCuts((Char_t *)"fCutsKineMC", (Char_t *)"MC Kine Cuts");
521 kineMCcuts->SetPtRange(fPtRange[0], fPtRange[1]);
522 //kineMCcuts->SetEtaRange(-0.8, 0.8);
523 kineMCcuts->SetEtaRange(-TMath::Abs(fEtaRange),TMath::Abs(fEtaRange));
524 if(IsQAOn()) kineMCcuts->SetQAOn(fHistQA);
525 mcCuts->AddLast(kineMCcuts);
528 fCutList->AddLast(mcCuts);
531 //__________________________________________________________________
532 void AliHFEcuts::SetAcceptanceCutList(){
534 // Initialize Particle (Monte Carlo) acceptance cuts
535 // Min. Required Hist for Detectors:
538 // TRD [2*nTracklets]
541 AliDebug(2, "Called\n");
542 AliCFAcceptanceCuts *accCuts = new AliCFAcceptanceCuts("fCutsAccMC", "MC Acceptance Cuts");
543 accCuts->SetMinNHitITS(3);
544 accCuts->SetMinNHitTPC(2);
545 accCuts->SetMinNHitTRD(2*fMinTrackletsTRD);
546 if(IsQAOn()) accCuts->SetQAOn(fHistQA);
548 TObjArray *partAccCuts = new TObjArray();
549 partAccCuts->SetName("fPartAccCuts");
550 partAccCuts->AddLast(accCuts);
551 fCutList->AddLast(partAccCuts);
554 //__________________________________________________________________
555 void AliHFEcuts::SetRecKineITSTPCCutList(){
557 // Track Kinematics and Quality cuts (Based on the Standard cuts from PWG0)
566 // Min. Number of Clusters:
570 // Chi2 per TPC cluster: 3.5
573 // Momentum Range: 100MeV - 20GeV
574 // Eta: < 0.9 (TRD-TOF acceptance)
576 const Long_t kStatusSelectionDefault(AliESDtrack::kTPCrefit | AliESDtrack::kITSrefit);
577 AliDebug(2, "Called\n");
578 AliCFTrackQualityCuts *trackQuality = new AliCFTrackQualityCuts((Char_t *)"fCutsQualityRec", (Char_t *)"REC Track Quality Cuts");
579 //trackQuality->SetMinNClusterITS(fMinClustersITS);
580 trackQuality->SetMaxChi2PerClusterTPC(fMaxChi2clusterTPC);
581 if(fMaxChi2clusterITS >= 0.) trackQuality->SetMaxChi2PerClusterITS(fMaxChi2clusterITS);
582 Long_t statusRequirement;
583 if(fAdditionalStatusRequirement)
584 statusRequirement = kStatusSelectionDefault | fAdditionalStatusRequirement;
586 statusRequirement = kStatusSelectionDefault;
587 trackQuality->SetStatus(statusRequirement);
588 //trackQuality->SetMaxCovDiagonalElements(2., 2., 0.5, 0.5, 2);
590 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTPCRec","Extra cuts from the HFE group");
591 hfecuts->SetDebugLevel(fDebugLevel);
592 hfecuts->SetMinNbITScls(fMinClustersITS);
593 // Set the cut in the TPC number of clusters
594 hfecuts->SetMinNClustersTPC(fMinClustersTPC, fTPCclusterDef);
595 hfecuts->SetMinNClustersTPCPID(fMinClustersTPCPID);
596 hfecuts->SetClusterRatioTPC(fMinClusterRatioTPC, fTPCratioDef);
597 if(fFractionOfSharedTPCClusters > 0.0) hfecuts->SetFractionOfTPCSharedClusters(fFractionOfSharedTPCClusters);
599 AliCFTrackKineCuts *kineCuts = new AliCFTrackKineCuts((Char_t *)"fCutsKineRec", (Char_t *)"REC Kine Cuts");
600 kineCuts->SetPtRange(fPtRange[0], fPtRange[1]);
601 //kineCuts->SetEtaRange(-0.8, 0.8);
602 kineCuts->SetEtaRange(-TMath::Abs(fEtaRange),TMath::Abs(fEtaRange));
605 trackQuality->SetQAOn(fHistQA);
606 hfecuts->SetQAOn(fHistQA);
607 kineCuts->SetQAOn(fHistQA);
610 TObjArray *recCuts = new TObjArray;
611 recCuts->SetName("fPartRecKineITSTPCCuts");
612 recCuts->AddLast(trackQuality);
613 recCuts->AddLast(hfecuts);
614 recCuts->AddLast(kineCuts);
615 fCutList->AddLast(recCuts);
618 //__________________________________________________________________
619 void AliHFEcuts::SetRecPrimaryCutList(){
621 // Primary cuts (based on standard cuts from PWG0):
627 AliDebug(2, "Called\n");
628 AliCFTrackIsPrimaryCuts *primaryCut = new AliCFTrackIsPrimaryCuts((Char_t *)"fCutsPrimaryCuts", (Char_t *)"REC Primary Cuts");
629 //if(IsRequireDCAToVertex()){
630 //primaryCut->SetDCAToVertex2D(kTRUE);
631 //primaryCut->SetMaxDCAToVertexXY(fDCAtoVtx[0]);
632 //primaryCut->SetMaxDCAToVertexZ(fDCAtoVtx[1]);
634 if(IsRequireSigmaToVertex()){
635 primaryCut->SetRequireSigmaToVertex(kTRUE);
636 if(fSigmaToVtx[0]) primaryCut->SetMaxNSigmaToVertex(fSigmaToVtx[0]);
637 if(fSigmaToVtx[1]) primaryCut->SetMaxSigmaDCAxy(fSigmaToVtx[1]);
638 if(fSigmaToVtx[2]) primaryCut->SetMaxSigmaDCAz(fSigmaToVtx[2]);
640 //primaryCut->SetAcceptKinkDaughters(kFALSE);
641 if(IsQAOn()) primaryCut->SetQAOn(fHistQA);
643 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsPrimaryCutsextra","Extra cuts from the HFE group");
644 hfecuts->SetMaxImpactParameterRpar(fMaxImpactParameterRpar);
645 hfecuts->SetRejectKinkDaughter();
646 hfecuts->SetRejectKinkMother();
647 if(IsRequireDCAToVertex()){
648 hfecuts->SetMaxImpactParamR(fDCAtoVtx[0]);
649 hfecuts->SetMaxImpactParamZ(fDCAtoVtx[1]);
652 TObjArray *primCuts = new TObjArray;
653 primCuts->SetName("fPartPrimCuts");
655 if(IsRequireSigmaToVertex()) primCuts->AddLast(primaryCut);
656 //if(fMaxImpactParameterRpar){
657 primCuts->AddLast(hfecuts);
659 fCutList->AddLast(primCuts);
662 //__________________________________________________________________
663 void AliHFEcuts::SetHFElectronITSCuts(){
665 // Special Cuts introduced by the HFElectron Group: ITS
667 AliDebug(2, "Called\n");
668 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupPixels","Extra cuts from the HFE group");
669 if(IsRequireITSpixel()){
670 hfecuts->SetRequireITSpixel(AliHFEextraCuts::ITSPixel_t(fCutITSPixel));
671 hfecuts->SetCheckITSstatus(fCheckITSLayerStatus);
673 if(IsRequireITSdrift()){
674 hfecuts->SetRequireITSdrift(AliHFEextraCuts::ITSDrift_t(fCutITSDrift));
677 if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
678 hfecuts->SetDebugLevel(fDebugLevel);
680 TObjArray *hfeCuts = new TObjArray;
681 hfeCuts->SetName("fPartHFECutsITS");
682 hfeCuts->AddLast(hfecuts);
683 fCutList->AddLast(hfeCuts);
686 //__________________________________________________________________
687 void AliHFEcuts::SetHFElectronTOFCuts(){
689 // Special Cuts introduced by the HFElectron Group: TRD
691 AliDebug(2, "Called\n");
692 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTOF","Extra cuts from the HFE group on TOF PID");
693 if(fTOFPIDStep) hfecuts->SetTOFPID(kTRUE);
694 if(fTOFMISMATCHStep) hfecuts->SetTOFMISMATCH(kTRUE);
695 if((fTOFsignaldx > 0.0) && (fTOFsignaldz > 0.0)) hfecuts->SetTOFsignalDxz(fTOFsignaldx,fTOFsignaldz);
696 if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
697 hfecuts->SetDebugLevel(fDebugLevel);
699 TObjArray *hfeCuts = new TObjArray;
700 hfeCuts->SetName("fPartHFECutsTOF");
701 hfeCuts->AddLast(hfecuts);
702 fCutList->AddLast(hfeCuts);
705 //__________________________________________________________________
706 void AliHFEcuts::SetHFElectronTPCCuts(){
708 // Special Cuts introduced by the HFElectron Group: TPC
710 AliDebug(2, "Called\n");
711 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTPCPID","Extra cuts from the HFE group on TPC PID");
712 if(fTPCPIDCLEANUPStep) hfecuts->SetTPCPIDCleanUp(kTRUE);
713 if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
714 hfecuts->SetDebugLevel(fDebugLevel);
716 TObjArray *hfeCuts = new TObjArray;
717 hfeCuts->SetName("fPartHFECutsTPC");
718 hfeCuts->AddLast(hfecuts);
719 fCutList->AddLast(hfeCuts);
723 //__________________________________________________________________
724 void AliHFEcuts::SetHFElectronTRDCuts(){
726 // Special Cuts introduced by the HFElectron Group: TRD
728 AliDebug(2, "Called\n");
729 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTRD","Extra cuts from the HFE group on TRD PID");
730 if(fMinTrackletsTRD > 0.) hfecuts->SetMinTrackletsTRD(fMinTrackletsTRD, fTRDtrackletsExact);
731 if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
732 hfecuts->SetDebugLevel(fDebugLevel);
734 TObjArray *hfeCuts = new TObjArray;
735 hfeCuts->SetName("fPartHFECutsTRD");
736 hfeCuts->AddLast(hfecuts);
737 fCutList->AddLast(hfeCuts);
740 //__________________________________________________________________
741 void AliHFEcuts::SetHFElectronDcaCuts(){
743 // Special Cuts introduced by the HFElectron Group: minimum of impact parameter
745 AliDebug(2, "Called\n");
746 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupDCA","Extra cuts from the HFE group");
747 hfecuts->SetMinHFEImpactParamR(fIPCutParams,fIsIPSigmacut,fIsIPAbs);
748 if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
749 hfecuts->SetDebugLevel(fDebugLevel);
751 TObjArray *hfeCuts = new TObjArray;
752 hfeCuts->SetName("fPartHFECutsDca");
753 hfeCuts->AddLast(hfecuts);
754 fCutList->AddLast(hfeCuts);
757 //__________________________________________________________________
758 Bool_t AliHFEcuts::CheckParticleCuts(UInt_t step, TObject *o){
760 // Checks the cuts without using the correction framework manager
762 AliDebug(2, "Called\n");
763 TString stepnames[kNcutStepsMCTrack + kNcutStepsRecTrack + kNcutStepsDETrack + kNcutStepsSecvtxTrack + 1] = {"fPartGenCuts","fPartEvCutPileupZ","fPartEvCut","fPartAccCuts","fPartRecNoCuts","fPartRecKineITSTPCCuts", "fPartPrimCuts", "fPartHFECutsITS","fPartHFECutsTOF","fPartHFECutsTPC","fPartHFECutsTRD","fPartHFECutsDca", "fPartHFECutsSecvtx"};
764 AliDebug(2, Form("Doing cut %s", stepnames[step].Data()));
765 TObjArray *cuts = dynamic_cast<TObjArray *>(fCutList->FindObject(stepnames[step].Data()));
766 if(!cuts) return kTRUE;
769 Bool_t status = kTRUE;
770 while((mycut = dynamic_cast<AliCFCutBase *>(it()))){
771 status &= mycut->IsSelected(o);
777 //__________________________________________________________________
778 Bool_t AliHFEcuts::CheckEventCuts(const char*namestep, TObject *o){
780 // Checks the cuts without using the correction framework manager
782 AliDebug(2, "Called\n");
783 TObjArray *cuts = dynamic_cast<TObjArray *>(fCutList->FindObject(namestep));
784 if(!cuts) return kTRUE;
787 Bool_t status = kTRUE;
788 while((mycut = dynamic_cast<AliCFCutBase *>(it()))){
789 status &= mycut->IsSelected(o);
794 //__________________________________________________________________
795 void AliHFEcuts::SetRecEvent(const AliVEvent *ev){
797 // Publish reconstructed event to the cuts
799 TIter cutsteps(fCutList);
802 while((cutstep = dynamic_cast<TObjArray *>(cutsteps()))){
803 TIter cutIter(cutstep);
804 while((cut = dynamic_cast<AliCFCutBase *>(cutIter()))){
805 cut->SetRecEventInfo(ev);
810 //__________________________________________________________________
811 void AliHFEcuts::SetMCEvent(const AliMCEvent *ev){
813 // Publish reconstructed event to the cuts
815 TIter cutsteps(fCutList);
818 while((cutstep = dynamic_cast<TObjArray *>(cutsteps()))){
819 TIter cutIter(cutstep);
820 while((cut = dynamic_cast<AliCFCutBase *>(cutIter()))){
821 cut->SetMCEventInfo(ev);