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),
125 fMaxChi2clusterITS(-1.),
126 fMaxChi2clusterTPC(0.),
127 fMinClusterRatioTPC(0.),
129 fTRDtrackletsExact(kFALSE),
131 fTOFMISMATCHStep(kFALSE),
132 fTPCPIDCLEANUPStep(kFALSE),
133 fUseMixedVertex(kTRUE),
134 fIsIPSigmacut(kFALSE),
136 fFractionOfSharedTPCClusters(-1.0),
137 fMaxImpactParameterRpar(kFALSE),
138 fAdditionalStatusRequirement(0),
146 memset(fProdVtx, 0, sizeof(Double_t) * 4);
147 memset(fDCAtoVtx, 0, sizeof(Double_t) * 2);
148 memset(fPtRange, 0, sizeof(Double_t) * 2);
149 memset(fIPCutParams, 0, sizeof(Float_t) * 4);
150 memset(fSigmaToVtx, 0, sizeof(Double_t) * 3);
154 //__________________________________________________________________
155 AliHFEcuts::AliHFEcuts(const Char_t *name, const Char_t *title):
158 fTPCclusterDef(AliHFEextraCuts::kFound),
159 fTPCratioDef(AliHFEextraCuts::kFoundOverFindable),
161 fMinClustersTPCPID(0),
165 fCheckITSLayerStatus(kTRUE),
167 fMaxChi2clusterITS(-1.),
168 fMaxChi2clusterTPC(0.),
169 fMinClusterRatioTPC(0.),
171 fTRDtrackletsExact(kFALSE),
173 fTOFMISMATCHStep(kFALSE),
174 fTPCPIDCLEANUPStep(kFALSE),
175 fUseMixedVertex(kTRUE),
176 fIsIPSigmacut(kFALSE),
178 fFractionOfSharedTPCClusters(-1.0),
179 fMaxImpactParameterRpar(kFALSE),
180 fAdditionalStatusRequirement(0),
186 // Default Constructor
188 memset(fProdVtx, 0, sizeof(Double_t) * 4);
189 memset(fDCAtoVtx, 0, sizeof(Double_t) * 2);
190 memset(fPtRange, 0, sizeof(Double_t) * 2);
191 memset(fIPCutParams, 0, sizeof(Float_t) * 4);
192 memset(fSigmaToVtx, 0, sizeof(Double_t) * 3);
195 //__________________________________________________________________
196 AliHFEcuts::AliHFEcuts(const AliHFEcuts &c):
198 fRequirements(c.fRequirements),
199 fTPCclusterDef(c.fTPCclusterDef),
200 fTPCratioDef(c.fTPCratioDef),
202 fMinClustersTPCPID(0),
206 fCheckITSLayerStatus(0),
208 fMaxChi2clusterITS(-1.),
209 fMaxChi2clusterTPC(0),
210 fMinClusterRatioTPC(0),
212 fTRDtrackletsExact(kFALSE),
214 fTOFMISMATCHStep(kFALSE),
215 fTPCPIDCLEANUPStep(kFALSE),
216 fUseMixedVertex(kTRUE),
217 fIsIPSigmacut(kFALSE),
219 fFractionOfSharedTPCClusters(-1.0),
220 fMaxImpactParameterRpar(kFALSE),
221 fAdditionalStatusRequirement(0),
232 //__________________________________________________________________
233 AliHFEcuts &AliHFEcuts::operator=(const AliHFEcuts &c){
237 if(&c != this) c.Copy(*this);
241 //__________________________________________________________________
242 void AliHFEcuts::Copy(TObject &c) const {
246 AliHFEcuts &target = dynamic_cast<AliHFEcuts &>(c);
248 target.fRequirements = fRequirements;
249 target.fTPCclusterDef = fTPCclusterDef;
250 target.fTPCratioDef = fTPCratioDef;
251 target.fMinClustersTPC = fMinClustersTPC;
252 target.fMinClustersTPCPID = fMinClustersTPCPID;
253 target.fMinClustersITS = fMinClustersITS;
254 target.fMinTrackletsTRD = fMinTrackletsTRD;
255 target.fCutITSPixel = fCutITSPixel;
256 target.fCheckITSLayerStatus = fCheckITSLayerStatus;
257 target.fCutITSDrift = fCutITSDrift;
258 target.fMaxChi2clusterITS = fMaxChi2clusterITS;
259 target.fMaxChi2clusterTPC = fMaxChi2clusterTPC;
260 target.fMinClusterRatioTPC = fMinClusterRatioTPC;
261 target.fVertexRangeZ = fVertexRangeZ;
262 target.fTRDtrackletsExact = fTRDtrackletsExact;
263 target.fTOFPIDStep = fTOFPIDStep;
264 target.fTOFMISMATCHStep = fTOFMISMATCHStep;
265 target.fTPCPIDCLEANUPStep = fTPCPIDCLEANUPStep;
266 target.fUseMixedVertex = fUseMixedVertex;
267 target.fIsIPSigmacut = fIsIPSigmacut;
268 target.fIsIPAbs = fIsIPAbs;
269 target.fFractionOfSharedTPCClusters = fFractionOfSharedTPCClusters;
270 target.fMaxImpactParameterRpar = fMaxImpactParameterRpar;
271 target.fAdditionalStatusRequirement = fAdditionalStatusRequirement;
272 target.fDebugLevel = 0;
274 memcpy(target.fProdVtx, fProdVtx, sizeof(Double_t) * 4);
275 memcpy(target.fDCAtoVtx, fDCAtoVtx, sizeof(Double_t) * 2);
276 memcpy(target.fPtRange, fPtRange, sizeof(Double_t) *2);
277 memcpy(target.fIPCutParams, fIPCutParams, sizeof(Float_t) * 4);
278 memcpy(target.fSigmaToVtx, fSigmaToVtx, sizeof(Double_t) * 3);
282 target.fCutList->Clear();
283 delete target.fCutList;
286 target.fCutList = dynamic_cast<TObjArray *>(fCutList->Clone());
287 if(target.fCutList) target.fCutList->SetOwner(); // Coverity
290 delete target.fHistQA;
293 // If the QA list was already produced, then we create it new, loop over the cuts and connect all the histos with this list
294 target.fHistQA = new TList;
295 target.fHistQA->SetName(Form("%s_CutQAhistograms", GetName()));
296 fHistQA->SetOwner(kTRUE);
297 TIter cit(target.fCutList);
298 TObjArray *clist = NULL;
299 AliCFCutBase *co = NULL;
300 while((clist = dynamic_cast<TObjArray *>(cit()))){
302 while((co = dynamic_cast<AliCFCutBase *>(cit1()))) co->SetQAOn(target.fHistQA);
307 //__________________________________________________________________
308 AliHFEcuts::~AliHFEcuts(){
317 if(fHistQA) delete fHistQA;
320 //__________________________________________________________________
321 Long64_t AliHFEcuts::Merge(const TCollection *list){
323 // Merge function doing nothing, just writing the object to file
326 if(list->IsEmpty()) return 1;
328 // just count the number of objects to merge
330 while(iter()){ counts++; }
334 //__________________________________________________________________
335 void AliHFEcuts::Initialize(AliCFManager *cfm){
337 // Initializes the cut objects from the correction framework
338 // Publishes the cuts to the correction framework manager
340 AliDebug(2, "Called");
341 const Int_t kMCOffset = kNcutStepsMCTrack;
342 const Int_t kRecOffset = kNcutStepsRecTrack;
346 fCutList = new TObjArray;
347 fCutList->SetOwner();
351 fHistQA->SetName(Form("%s_CutQAhistograms", GetName()));
352 fHistQA->SetOwner(kTRUE);
355 // Call all the setters for the cuts
356 SetParticleGenCutList();
357 SetAcceptanceCutList();
358 SetRecKineITSTPCCutList();
359 SetRecPrimaryCutList();
360 SetHFElectronITSCuts();
361 SetHFElectronTOFCuts();
362 SetHFElectronTPCCuts();
363 SetHFElectronTRDCuts();
364 SetHFElectronDcaCuts();
366 // Publish to the cuts which analysis type they are (ESD Analysis by default)
368 AliInfo("Setting AOD Analysis");
369 TObjArray *genCuts = dynamic_cast<TObjArray *>(fCutList->FindObject("fPartGenCuts"));
371 AliCFParticleGenCuts *myGenCut = dynamic_cast<AliCFParticleGenCuts *>(genCuts->FindObject("fCutsGenMC"));
372 if(myGenCut) myGenCut->SetAODMC(kTRUE);
376 // Connect the event cuts
377 SetEventCutList(kEventStepGenerated);
378 SetEventCutList(kEventStepReconstructed);
379 cfm->SetEventCutsList(kEventStepGenerated, dynamic_cast<TObjArray *>(fCutList->FindObject("fEvGenCuts")));
380 cfm->SetEventCutsList(kEventStepReconstructed, dynamic_cast<TObjArray *>(fCutList->FindObject("fEvRecCuts")));
382 // Connect the particle cuts
384 cfm->SetParticleCutsList(kStepMCGenerated, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartGenCuts")));
385 cfm->SetParticleCutsList(kStepMCInAcceptance, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartAccCuts")));
387 cfm->SetParticleCutsList(kStepRecKineITSTPC + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartRecKineITSTPCCuts")));
388 cfm->SetParticleCutsList(kStepRecPrim + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartPrimCuts")));
389 cfm->SetParticleCutsList(kStepHFEcutsITS + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsITS")));
390 cfm->SetParticleCutsList(kStepHFEcutsTOF+ kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsTOF")));
391 cfm->SetParticleCutsList(kStepHFEcutsTPC+ kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsTPC")));
392 cfm->SetParticleCutsList(kStepHFEcutsTRD + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsTRD")));
393 cfm->SetParticleCutsList(kStepHFEcutsDca + kRecOffset + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsDca")));
397 //__________________________________________________________________
398 void AliHFEcuts::Initialize(){
399 // Call all the setters for the cuts
400 AliDebug(2, "Called\n");
404 fCutList = new TObjArray;
405 fCutList->SetOwner();
409 fHistQA->SetName(Form("%s_CutQAhistograms", GetName()));
410 fHistQA->SetOwner(kFALSE);
412 SetParticleGenCutList();
413 SetAcceptanceCutList();
414 SetRecKineITSTPCCutList();
415 SetRecPrimaryCutList();
416 SetHFElectronITSCuts();
417 SetHFElectronTOFCuts();
418 SetHFElectronTPCCuts();
419 SetHFElectronTRDCuts();
420 SetHFElectronDcaCuts();
422 // Connect the event cuts
423 SetEventCutList(kEventStepGenerated);
424 SetEventCutList(kEventStepReconstructed);
429 //__________________________________________________________________
430 void AliHFEcuts::SetEventCutList(Int_t istep){
432 // Cuts for Event Selection
434 AliDebug(2, "Called\n");
435 TObjArray *arr = new TObjArray;
436 if(istep == kEventStepGenerated){
437 AliCFEventGenCuts *evGenCuts = new AliCFEventGenCuts((Char_t *)"fCutsEvGen", (Char_t *)"Event Generated cuts");
438 //evGenCuts->SetNTracksCut(1);
439 evGenCuts->SetRequireVtxCuts(kTRUE);
440 //evGenCuts->SetVertexXCut(-1, 1);
441 //evGenCuts->SetVertexYCut(-1, 1);
442 evGenCuts->SetVertexZCut(-fVertexRangeZ, fVertexRangeZ);
443 if(IsQAOn()) evGenCuts->SetQAOn(fHistQA);
445 arr->SetName("fEvGenCuts");
446 arr->AddLast(evGenCuts);
449 if(!fUseMixedVertex) {
450 AliCFEventRecCuts *evRecCuts = new AliCFEventRecCuts((Char_t *)"fCutsEvRec", (Char_t *)"Event Reconstructed cuts");
451 //evRecCuts->SetNTracksCut(1);
452 evRecCuts->SetRequireVtxCuts(kTRUE);
453 //evRecCuts->SetVertexXCut(-1, 1);
454 //evRecCuts->SetVertexYCut(-1, 1);
455 //evRecCuts->SetVertexZCut(-30, 30);
456 evRecCuts->SetVertexZCut(-fVertexRangeZ, fVertexRangeZ);
457 evRecCuts->SetVertexNContributors(1,(Int_t)1.e9);
458 if(IsQAOn()) evRecCuts->SetQAOn(fHistQA);
459 arr->SetName("fEvRecCuts");
460 arr->AddLast(evRecCuts);
462 AliHFEextraEventCuts *evRecCuts = new AliHFEextraEventCuts((Char_t *)"fCutsEvRec", (Char_t *)"Event Reconstructed cuts");
463 evRecCuts->SetRequireVtxCuts(kTRUE);
464 evRecCuts->SetUseMixedVertex();
465 evRecCuts->SetVertexZCut(-fVertexRangeZ, fVertexRangeZ);
466 //evRecCuts->SetVertexNContributors(1,(Int_t)1.e9);
467 if(IsQAOn()) evRecCuts->SetQAOn(fHistQA);
468 arr->SetName("fEvRecCuts");
469 arr->AddLast(evRecCuts);
472 fCutList->AddLast(arr);
475 //__________________________________________________________________
476 void AliHFEcuts::SetParticleGenCutList(){
478 // Initialize Particle Cuts for Monte Carlo Tracks
479 // Production Vertex Radius: < 3cm
480 // Particle Species: Electrons
484 TObjArray *mcCuts = new TObjArray;
485 mcCuts->SetName("fPartGenCuts");
488 AliDebug(2, "Called\n");
489 AliCFParticleGenCuts *genCuts = new AliCFParticleGenCuts("fCutsGenMC", "Particle Generation Cuts");
490 genCuts->SetRequireIsCharged();
491 if(IsRequirePrimary()) {
492 genCuts->SetRequireIsPrimary();
494 if(IsRequireProdVertex()){
495 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]));
496 genCuts->SetProdVtxRangeX(fProdVtx[0], fProdVtx[1]);
497 genCuts->SetProdVtxRangeY(fProdVtx[2], fProdVtx[3]);
498 genCuts->SetProdVtxRange2D(kTRUE); // Use ellipse
500 genCuts->SetRequirePdgCode(11, kTRUE);
501 if(IsQAOn()) genCuts->SetQAOn(fHistQA);
504 mcCuts->AddLast(genCuts);
507 if(IsRequireKineMCCuts()) {
508 AliCFTrackKineCuts *kineMCcuts = new AliCFTrackKineCuts((Char_t *)"fCutsKineMC", (Char_t *)"MC Kine Cuts");
509 kineMCcuts->SetPtRange(fPtRange[0], fPtRange[1]);
510 kineMCcuts->SetEtaRange(-0.8, 0.8);
511 if(IsQAOn()) kineMCcuts->SetQAOn(fHistQA);
512 mcCuts->AddLast(kineMCcuts);
515 fCutList->AddLast(mcCuts);
518 //__________________________________________________________________
519 void AliHFEcuts::SetAcceptanceCutList(){
521 // Initialize Particle (Monte Carlo) acceptance cuts
522 // Min. Required Hist for Detectors:
525 // TRD [2*nTracklets]
528 AliDebug(2, "Called\n");
529 AliCFAcceptanceCuts *accCuts = new AliCFAcceptanceCuts("fCutsAccMC", "MC Acceptance Cuts");
530 accCuts->SetMinNHitITS(3);
531 accCuts->SetMinNHitTPC(2);
532 accCuts->SetMinNHitTRD(2*fMinTrackletsTRD);
533 if(IsQAOn()) accCuts->SetQAOn(fHistQA);
535 TObjArray *partAccCuts = new TObjArray();
536 partAccCuts->SetName("fPartAccCuts");
537 partAccCuts->AddLast(accCuts);
538 fCutList->AddLast(partAccCuts);
541 //__________________________________________________________________
542 void AliHFEcuts::SetRecKineITSTPCCutList(){
544 // Track Kinematics and Quality cuts (Based on the Standard cuts from PWG0)
553 // Min. Number of Clusters:
557 // Chi2 per TPC cluster: 3.5
560 // Momentum Range: 100MeV - 20GeV
561 // Eta: < 0.9 (TRD-TOF acceptance)
563 const Long_t kStatusSelectionDefault(AliESDtrack::kTPCrefit | AliESDtrack::kITSrefit);
564 AliDebug(2, "Called\n");
565 AliCFTrackQualityCuts *trackQuality = new AliCFTrackQualityCuts((Char_t *)"fCutsQualityRec", (Char_t *)"REC Track Quality Cuts");
566 //trackQuality->SetMinNClusterITS(fMinClustersITS);
567 trackQuality->SetMaxChi2PerClusterTPC(fMaxChi2clusterTPC);
568 if(fMaxChi2clusterITS >= 0.) trackQuality->SetMaxChi2PerClusterITS(fMaxChi2clusterITS);
569 Long_t statusRequirement;
570 if(fAdditionalStatusRequirement)
571 statusRequirement = kStatusSelectionDefault | fAdditionalStatusRequirement;
573 statusRequirement = kStatusSelectionDefault;
574 trackQuality->SetStatus(statusRequirement);
575 //trackQuality->SetMaxCovDiagonalElements(2., 2., 0.5, 0.5, 2);
577 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTPCRec","Extra cuts from the HFE group");
578 hfecuts->SetDebugLevel(fDebugLevel);
579 hfecuts->SetMinNbITScls(fMinClustersITS);
580 // Set the cut in the TPC number of clusters
581 hfecuts->SetMinNClustersTPC(fMinClustersTPC, fTPCclusterDef);
582 hfecuts->SetMinNClustersTPCPID(fMinClustersTPCPID);
583 hfecuts->SetClusterRatioTPC(fMinClusterRatioTPC, fTPCratioDef);
584 if(fFractionOfSharedTPCClusters > 0.0) hfecuts->SetFractionOfTPCSharedClusters(fFractionOfSharedTPCClusters);
586 AliCFTrackKineCuts *kineCuts = new AliCFTrackKineCuts((Char_t *)"fCutsKineRec", (Char_t *)"REC Kine Cuts");
587 kineCuts->SetPtRange(fPtRange[0], fPtRange[1]);
588 kineCuts->SetEtaRange(-0.8, 0.8);
591 trackQuality->SetQAOn(fHistQA);
592 hfecuts->SetQAOn(fHistQA);
593 kineCuts->SetQAOn(fHistQA);
596 TObjArray *recCuts = new TObjArray;
597 recCuts->SetName("fPartRecKineITSTPCCuts");
598 recCuts->AddLast(trackQuality);
599 recCuts->AddLast(hfecuts);
600 recCuts->AddLast(kineCuts);
601 fCutList->AddLast(recCuts);
604 //__________________________________________________________________
605 void AliHFEcuts::SetRecPrimaryCutList(){
607 // Primary cuts (based on standard cuts from PWG0):
613 AliDebug(2, "Called\n");
614 AliCFTrackIsPrimaryCuts *primaryCut = new AliCFTrackIsPrimaryCuts((Char_t *)"fCutsPrimaryCuts", (Char_t *)"REC Primary Cuts");
615 //if(IsRequireDCAToVertex()){
616 //primaryCut->SetDCAToVertex2D(kTRUE);
617 //primaryCut->SetMaxDCAToVertexXY(fDCAtoVtx[0]);
618 //primaryCut->SetMaxDCAToVertexZ(fDCAtoVtx[1]);
620 if(IsRequireSigmaToVertex()){
621 primaryCut->SetRequireSigmaToVertex(kTRUE);
622 if(fSigmaToVtx[0]) primaryCut->SetMaxNSigmaToVertex(fSigmaToVtx[0]);
623 if(fSigmaToVtx[1]) primaryCut->SetMaxSigmaDCAxy(fSigmaToVtx[1]);
624 if(fSigmaToVtx[2]) primaryCut->SetMaxSigmaDCAz(fSigmaToVtx[2]);
626 //primaryCut->SetAcceptKinkDaughters(kFALSE);
627 if(IsQAOn()) primaryCut->SetQAOn(fHistQA);
629 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsPrimaryCutsextra","Extra cuts from the HFE group");
630 hfecuts->SetMaxImpactParameterRpar(fMaxImpactParameterRpar);
631 hfecuts->SetRejectKinkDaughter();
632 hfecuts->SetRejectKinkMother();
633 if(IsRequireDCAToVertex()){
634 hfecuts->SetMaxImpactParamR(fDCAtoVtx[0]);
635 hfecuts->SetMaxImpactParamZ(fDCAtoVtx[1]);
638 TObjArray *primCuts = new TObjArray;
639 primCuts->SetName("fPartPrimCuts");
641 if(IsRequireSigmaToVertex()) primCuts->AddLast(primaryCut);
642 //if(fMaxImpactParameterRpar){
643 primCuts->AddLast(hfecuts);
645 fCutList->AddLast(primCuts);
648 //__________________________________________________________________
649 void AliHFEcuts::SetHFElectronITSCuts(){
651 // Special Cuts introduced by the HFElectron Group: ITS
653 AliDebug(2, "Called\n");
654 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupPixels","Extra cuts from the HFE group");
655 if(IsRequireITSpixel()){
656 hfecuts->SetRequireITSpixel(AliHFEextraCuts::ITSPixel_t(fCutITSPixel));
657 hfecuts->SetCheckITSstatus(fCheckITSLayerStatus);
659 if(IsRequireITSdrift()){
660 hfecuts->SetRequireITSdrift(AliHFEextraCuts::ITSDrift_t(fCutITSDrift));
663 if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
664 hfecuts->SetDebugLevel(fDebugLevel);
666 TObjArray *hfeCuts = new TObjArray;
667 hfeCuts->SetName("fPartHFECutsITS");
668 hfeCuts->AddLast(hfecuts);
669 fCutList->AddLast(hfeCuts);
672 //__________________________________________________________________
673 void AliHFEcuts::SetHFElectronTOFCuts(){
675 // Special Cuts introduced by the HFElectron Group: TRD
677 AliDebug(2, "Called\n");
678 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTOF","Extra cuts from the HFE group on TOF PID");
679 if(fTOFPIDStep) hfecuts->SetTOFPID(kTRUE);
680 if(fTOFMISMATCHStep) hfecuts->SetTOFMISMATCH(kTRUE);
681 if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
682 hfecuts->SetDebugLevel(fDebugLevel);
684 TObjArray *hfeCuts = new TObjArray;
685 hfeCuts->SetName("fPartHFECutsTOF");
686 hfeCuts->AddLast(hfecuts);
687 fCutList->AddLast(hfeCuts);
690 //__________________________________________________________________
691 void AliHFEcuts::SetHFElectronTPCCuts(){
693 // Special Cuts introduced by the HFElectron Group: TPC
695 AliDebug(2, "Called\n");
696 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTPCPID","Extra cuts from the HFE group on TPC PID");
697 if(fTPCPIDCLEANUPStep) hfecuts->SetTPCPIDCleanUp(kTRUE);
698 if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
699 hfecuts->SetDebugLevel(fDebugLevel);
701 TObjArray *hfeCuts = new TObjArray;
702 hfeCuts->SetName("fPartHFECutsTPC");
703 hfeCuts->AddLast(hfecuts);
704 fCutList->AddLast(hfeCuts);
708 //__________________________________________________________________
709 void AliHFEcuts::SetHFElectronTRDCuts(){
711 // Special Cuts introduced by the HFElectron Group: TRD
713 AliDebug(2, "Called\n");
714 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTRD","Extra cuts from the HFE group on TRD PID");
715 if(fMinTrackletsTRD > 0.) hfecuts->SetMinTrackletsTRD(fMinTrackletsTRD, fTRDtrackletsExact);
716 if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
717 hfecuts->SetDebugLevel(fDebugLevel);
719 TObjArray *hfeCuts = new TObjArray;
720 hfeCuts->SetName("fPartHFECutsTRD");
721 hfeCuts->AddLast(hfecuts);
722 fCutList->AddLast(hfeCuts);
725 //__________________________________________________________________
726 void AliHFEcuts::SetHFElectronDcaCuts(){
728 // Special Cuts introduced by the HFElectron Group: minimum of impact parameter
730 AliDebug(2, "Called\n");
731 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupDCA","Extra cuts from the HFE group");
732 hfecuts->SetMinHFEImpactParamR(fIPCutParams,fIsIPSigmacut,fIsIPAbs);
733 if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
734 hfecuts->SetDebugLevel(fDebugLevel);
736 TObjArray *hfeCuts = new TObjArray;
737 hfeCuts->SetName("fPartHFECutsDca");
738 hfeCuts->AddLast(hfecuts);
739 fCutList->AddLast(hfeCuts);
742 //__________________________________________________________________
743 Bool_t AliHFEcuts::CheckParticleCuts(UInt_t step, TObject *o){
745 // Checks the cuts without using the correction framework manager
747 AliDebug(2, "Called\n");
748 TString stepnames[kNcutStepsMCTrack + kNcutStepsRecTrack + kNcutStepsDETrack + kNcutStepsSecvtxTrack + 1] = {"fPartGenCuts","fPartEvCutPileupZ","fPartEvCut","fPartAccCuts","fPartRecNoCuts","fPartRecKineITSTPCCuts", "fPartPrimCuts", "fPartHFECutsITS","fPartHFECutsTOF","fPartHFECutsTPC","fPartHFECutsTRD","fPartHFECutsDca", "fPartHFECutsSecvtx"};
749 AliDebug(2, Form("Doing cut %s", stepnames[step].Data()));
750 TObjArray *cuts = dynamic_cast<TObjArray *>(fCutList->FindObject(stepnames[step].Data()));
751 if(!cuts) return kTRUE;
754 Bool_t status = kTRUE;
755 while((mycut = dynamic_cast<AliCFCutBase *>(it()))){
756 status &= mycut->IsSelected(o);
762 //__________________________________________________________________
763 Bool_t AliHFEcuts::CheckEventCuts(const char*namestep, TObject *o){
765 // Checks the cuts without using the correction framework manager
767 AliDebug(2, "Called\n");
768 TObjArray *cuts = dynamic_cast<TObjArray *>(fCutList->FindObject(namestep));
769 if(!cuts) return kTRUE;
772 Bool_t status = kTRUE;
773 while((mycut = dynamic_cast<AliCFCutBase *>(it()))){
774 status &= mycut->IsSelected(o);
779 //__________________________________________________________________
780 void AliHFEcuts::SetRecEvent(const AliVEvent *ev){
782 // Publish reconstructed event to the cuts
784 TIter cutsteps(fCutList);
787 while((cutstep = dynamic_cast<TObjArray *>(cutsteps()))){
788 TIter cutIter(cutstep);
789 while((cut = dynamic_cast<AliCFCutBase *>(cutIter()))){
790 cut->SetRecEventInfo(ev);
795 //__________________________________________________________________
796 void AliHFEcuts::SetMCEvent(const AliMCEvent *ev){
798 // Publish reconstructed event to the cuts
800 TIter cutsteps(fCutList);
803 while((cutstep = dynamic_cast<TObjArray *>(cutsteps()))){
804 TIter cutIter(cutstep);
805 while((cut = dynamic_cast<AliCFCutBase *>(cutIter()))){
806 cut->SetMCEventInfo(ev);