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 fMatchTOFLabel(kFALSE),
132 fTOFMISMATCHStep(kFALSE),
133 fTPCPIDCLEANUPStep(kFALSE),
134 fITSpatternCut(kFALSE),
135 fUseMixedVertex(kTRUE),
136 fUseSPDVertex(kFALSE),
137 fUseCorrelationVertex(kFALSE),
138 fSPDVtxResolution(kFALSE),
139 fPApileupCut(kFALSE),
140 fIsIPSigmacut(kFALSE),
143 fFractionOfSharedTPCClusters(-1.0),
144 fMaxImpactParameterRpar(kFALSE),
145 fAdditionalStatusRequirement(0),
149 fRejectKinkDaughters(kTRUE),
150 fRejectKinkMothers(kTRUE),
158 memset(fProdVtx, 0, sizeof(Double_t) * 4);
159 memset(fProdVtxZ, 0, sizeof(Double_t) * 2);
160 memset(fDCAtoVtx, 0, sizeof(Double_t) * 2);
161 memset(fPtRange, 0, sizeof(Double_t) * 2);
162 memset(fIPCutParams, 0, sizeof(Float_t) * 4);
163 memset(fSigmaToVtx, 0, sizeof(Double_t) * 3);
164 fEtaRange[0] = -0.8; fEtaRange[1] = 0.8;
165 fPhiRange[0] = -1.; fPhiRange[1] = -1.;
168 //__________________________________________________________________
169 AliHFEcuts::AliHFEcuts(const Char_t *name, const Char_t *title):
175 fMinClustersTPCPID(0),
180 fCheckITSLayerStatus(kTRUE),
182 fMaxChi2clusterITS(-1.),
183 fMaxChi2clusterTPC(0.),
184 fMinClusterRatioTPC(0.),
186 fTRDtrackletsExact(kFALSE),
188 fMatchTOFLabel(kFALSE),
189 fTOFMISMATCHStep(kFALSE),
190 fTPCPIDCLEANUPStep(kFALSE),
191 fITSpatternCut(kFALSE),
192 fUseMixedVertex(kTRUE),
193 fUseSPDVertex(kFALSE),
194 fUseCorrelationVertex(kFALSE),
195 fSPDVtxResolution(kFALSE),
196 fPApileupCut(kFALSE),
197 fIsIPSigmacut(kFALSE),
200 fFractionOfSharedTPCClusters(-1.0),
201 fMaxImpactParameterRpar(kFALSE),
202 fAdditionalStatusRequirement(0),
206 fRejectKinkDaughters(kTRUE),
207 fRejectKinkMothers(kTRUE),
213 // Default Constructor
215 memset(fProdVtx, 0, sizeof(Double_t) * 4);
216 memset(fProdVtxZ, 0, sizeof(Double_t) * 2);
217 memset(fDCAtoVtx, 0, sizeof(Double_t) * 2);
218 memset(fPtRange, 0, sizeof(Double_t) * 2);
219 memset(fIPCutParams, 0, sizeof(Float_t) * 4);
220 memset(fSigmaToVtx, 0, sizeof(Double_t) * 3);
221 fEtaRange[0] = -0.8; fEtaRange[1] = 0.8;
222 fPhiRange[0] = -1.; fPhiRange[1] = -1.;
225 //__________________________________________________________________
226 AliHFEcuts::AliHFEcuts(const AliHFEcuts &c):
228 fRequirements(c.fRequirements),
229 fTPCclusterDef(c.fTPCclusterDef),
230 fTPCratioDef(c.fTPCratioDef),
232 fMinClustersTPCPID(0),
237 fCheckITSLayerStatus(0),
239 fMaxChi2clusterITS(-1.),
240 fMaxChi2clusterTPC(0),
241 fMinClusterRatioTPC(0),
243 fTRDtrackletsExact(kFALSE),
245 fMatchTOFLabel(kFALSE),
246 fTOFMISMATCHStep(kFALSE),
247 fTPCPIDCLEANUPStep(kFALSE),
248 fITSpatternCut(c.fITSpatternCut),
249 fUseMixedVertex(kTRUE),
250 fUseSPDVertex(kFALSE),
251 fUseCorrelationVertex(c.fUseCorrelationVertex),
252 fSPDVtxResolution(c.fSPDVtxResolution),
253 fPApileupCut(c.fPApileupCut),
254 fIsIPSigmacut(kFALSE),
257 fFractionOfSharedTPCClusters(-1.0),
258 fMaxImpactParameterRpar(kFALSE),
259 fAdditionalStatusRequirement(0),
263 fRejectKinkDaughters(c.fRejectKinkDaughters),
264 fRejectKinkMothers(c.fRejectKinkMothers),
275 //__________________________________________________________________
276 AliHFEcuts &AliHFEcuts::operator=(const AliHFEcuts &c){
280 if(&c != this) c.Copy(*this);
284 //__________________________________________________________________
285 void AliHFEcuts::Copy(TObject &c) const {
289 AliHFEcuts &target = dynamic_cast<AliHFEcuts &>(c);
291 target.fRequirements = fRequirements;
292 target.fTPCclusterDef = fTPCclusterDef;
293 target.fTPCratioDef = fTPCratioDef;
294 target.fMinClustersTPC = fMinClustersTPC;
295 target.fMinClustersTPCPID = fMinClustersTPCPID;
296 target.fMinClustersITS = fMinClustersITS;
297 target.fMinTrackletsTRD = fMinTrackletsTRD;
298 target.fMaxChi2TRD = fMaxChi2TRD;
299 target.fCutITSPixel = fCutITSPixel;
300 target.fCheckITSLayerStatus = fCheckITSLayerStatus;
301 target.fCutITSDrift = fCutITSDrift;
302 target.fMaxChi2clusterITS = fMaxChi2clusterITS;
303 target.fMaxChi2clusterTPC = fMaxChi2clusterTPC;
304 target.fMinClusterRatioTPC = fMinClusterRatioTPC;
305 target.fVertexRangeZ = fVertexRangeZ;
306 target.fTRDtrackletsExact = fTRDtrackletsExact;
307 target.fTOFPIDStep = fTOFPIDStep;
308 target.fMatchTOFLabel = fMatchTOFLabel;
309 target.fTOFMISMATCHStep = fTOFMISMATCHStep;
310 target.fTPCPIDCLEANUPStep = fTPCPIDCLEANUPStep;
311 target.fUseMixedVertex = fUseMixedVertex;
312 target.fUseSPDVertex = fUseSPDVertex;
313 target.fUseCorrelationVertex = fUseCorrelationVertex;
314 target.fSPDVtxResolution = fSPDVtxResolution;
315 target.fPApileupCut = fPApileupCut;
316 target.fIsIPSigmacut = fIsIPSigmacut;
317 target.fIsIPcharge = fIsIPcharge;
318 target.fIsIPOpp = fIsIPOpp;
319 target.fFractionOfSharedTPCClusters = fFractionOfSharedTPCClusters;
320 target.fMaxImpactParameterRpar = fMaxImpactParameterRpar;
321 target.fAdditionalStatusRequirement = fAdditionalStatusRequirement;
322 target.fTOFsignaldx = fTOFsignaldx;
323 target.fTOFsignaldz = fTOFsignaldz;
324 target.fAODFilterBit = fAODFilterBit;
325 target.fRejectKinkDaughters = fRejectKinkDaughters;
326 target.fRejectKinkMothers = fRejectKinkMothers;
327 target.fDebugLevel = 0;
329 memcpy(target.fProdVtx, fProdVtx, sizeof(Double_t) * 4);
330 memcpy(target.fProdVtxZ, fProdVtxZ, sizeof(Double_t) * 2);
331 memcpy(target.fDCAtoVtx, fDCAtoVtx, sizeof(Double_t) * 2);
332 memcpy(target.fPtRange, fPtRange, sizeof(Double_t) *2);
333 memcpy(target.fIPCutParams, fIPCutParams, sizeof(Float_t) * 4);
334 memcpy(target.fSigmaToVtx, fSigmaToVtx, sizeof(Double_t) * 3);
335 memcpy(target.fEtaRange, fEtaRange, sizeof(Double_t) * 2);
336 memcpy(target.fPhiRange, fPhiRange, sizeof(Double_t) * 2);
340 target.fCutList->Clear();
341 delete target.fCutList;
344 target.fCutList = dynamic_cast<TObjArray *>(fCutList->Clone());
345 if(target.fCutList) target.fCutList->SetOwner(); // Coverity
348 delete target.fHistQA;
351 // If the QA list was already produced, then we create it new, loop over the cuts and connect all the histos with this list
352 target.fHistQA = new TList;
353 target.fHistQA->SetName(Form("%s_CutQAhistograms", GetName()));
354 fHistQA->SetOwner(kTRUE);
355 TIter cit(target.fCutList);
356 TObjArray *clist = NULL;
357 AliCFCutBase *co = NULL;
358 while((clist = dynamic_cast<TObjArray *>(cit()))){
360 while((co = dynamic_cast<AliCFCutBase *>(cit1()))) co->SetQAOn(target.fHistQA);
365 //__________________________________________________________________
366 AliHFEcuts::~AliHFEcuts(){
375 if(fHistQA) delete fHistQA;
378 //__________________________________________________________________
379 Long64_t AliHFEcuts::Merge(const TCollection *list){
381 // Merge function doing nothing, just writing the object to file
384 if(list->IsEmpty()) return 1;
386 // just count the number of objects to merge
388 while(iter()){ counts++; }
392 //__________________________________________________________________
393 void AliHFEcuts::Initialize(AliCFManager *cfm){
395 // Initializes the cut objects from the correction framework
396 // Publishes the cuts to the correction framework manager
398 AliDebug(2, "Called");
399 const Int_t kMCOffset = kNcutStepsMCTrack;
400 const Int_t kRecOffset = kNcutStepsRecTrack;
404 fCutList = new TObjArray;
405 fCutList->SetOwner();
409 fHistQA->SetName(Form("%s_CutQAhistograms", GetName()));
410 fHistQA->SetOwner(kTRUE);
413 // Call all the setters for the cuts
414 SetParticleGenCutList();
415 SetAcceptanceCutList();
416 SetRecKineITSTPCCutList();
417 SetRecPrimaryCutList();
418 SetHFElectronITSCuts();
419 SetHFElectronTOFCuts();
420 SetHFElectronTPCCuts();
421 SetHFElectronTRDCuts();
422 SetHFElectronDcaCuts();
424 // Publish to the cuts which analysis type they are (ESD Analysis by default)
426 AliInfo("Setting AOD Analysis");
427 TObjArray *genCuts = dynamic_cast<TObjArray *>(fCutList->FindObject("fPartGenCuts"));
429 AliCFParticleGenCuts *myGenCut = dynamic_cast<AliCFParticleGenCuts *>(genCuts->FindObject("fCutsGenMC"));
431 myGenCut->SetAODMC(kTRUE);
436 // Connect the event cuts
437 SetEventCutList(kEventStepGenerated);
438 SetEventCutList(kEventStepReconstructed);
439 cfm->SetEventCutsList(kEventStepGenerated, dynamic_cast<TObjArray *>(fCutList->FindObject("fEvGenCuts")));
440 cfm->SetEventCutsList(kEventStepReconstructed, dynamic_cast<TObjArray *>(fCutList->FindObject("fEvRecCuts")));
442 // Connect the particle cuts
444 cfm->SetParticleCutsList(kStepMCGenerated, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartGenCuts")));
445 cfm->SetParticleCutsList(kStepMCInAcceptance, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartAccCuts")));
447 cfm->SetParticleCutsList(kStepRecKineITSTPC + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartRecKineITSTPCCuts")));
448 cfm->SetParticleCutsList(kStepRecPrim + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartPrimCuts")));
449 cfm->SetParticleCutsList(kStepHFEcutsITS + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsITS")));
450 cfm->SetParticleCutsList(kStepHFEcutsTOF+ kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsTOF")));
451 cfm->SetParticleCutsList(kStepHFEcutsTPC+ kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsTPC")));
452 cfm->SetParticleCutsList(kStepHFEcutsTRD + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsTRD")));
453 cfm->SetParticleCutsList(kStepHFEcutsDca + kRecOffset + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsDca")));
457 //__________________________________________________________________
458 void AliHFEcuts::Initialize(){
459 // Call all the setters for the cuts
460 AliDebug(2, "Called\n");
464 fCutList = new TObjArray;
465 fCutList->SetOwner();
469 fHistQA->SetName(Form("%s_CutQAhistograms", GetName()));
470 fHistQA->SetOwner(kFALSE);
472 SetParticleGenCutList();
473 SetAcceptanceCutList();
474 SetRecKineITSTPCCutList();
475 SetRecPrimaryCutList();
476 SetHFElectronITSCuts();
477 SetHFElectronTOFCuts();
478 SetHFElectronTPCCuts();
479 SetHFElectronTRDCuts();
480 SetHFElectronDcaCuts();
482 // Publish to the cuts which analysis type they are (ESD Analysis by default)
484 //printf("Initialize AOD\n");
485 //AliInfo("Setting AOD Analysis");
486 TObjArray *genCuts = dynamic_cast<TObjArray *>(fCutList->FindObject("fPartGenCuts"));
488 AliCFParticleGenCuts *myGenCut = dynamic_cast<AliCFParticleGenCuts *>(genCuts->FindObject("fCutsGenMC"));
490 myGenCut->SetAODMC(kTRUE);
491 //printf("Set AOD MC\n");
496 // Connect the event cuts
497 SetEventCutList(kEventStepGenerated);
498 SetEventCutList(kEventStepReconstructed);
503 //__________________________________________________________________
504 void AliHFEcuts::SetEventCutList(Int_t istep){
506 // Cuts for Event Selection
508 AliDebug(2, "Called\n");
509 TObjArray *arr = new TObjArray;
510 if(istep == kEventStepGenerated){
511 AliCFEventGenCuts *evGenCuts = new AliCFEventGenCuts((Char_t *)"fCutsEvGen", (Char_t *)"Event Generated cuts");
512 //evGenCuts->SetNTracksCut(1);
513 evGenCuts->SetRequireVtxCuts(kTRUE);
514 //evGenCuts->SetVertexXCut(-1, 1);
515 //evGenCuts->SetVertexYCut(-1, 1);
516 evGenCuts->SetVertexZCut(-fVertexRangeZ, fVertexRangeZ);
517 if(IsQAOn()) evGenCuts->SetQAOn(fHistQA);
519 arr->SetName("fEvGenCuts");
520 arr->AddLast(evGenCuts);
523 AliHFEextraEventCuts *evRecCuts = new AliHFEextraEventCuts((Char_t *)"fCutsEvRec", (Char_t *)"Event Reconstructed cuts");
524 evRecCuts->SetRequireVtxCuts(kTRUE);
525 if(fUseSPDVertex) evRecCuts->SetUseSPDVertex();
526 if(fUseMixedVertex) evRecCuts->SetUseMixedVertex();
527 if(fUseCorrelationVertex) evRecCuts->SetCheckCorrelationSPDVtx();
528 if(fSPDVtxResolution) evRecCuts->SetCheckSPDResolution();
529 if(fPApileupCut) evRecCuts->SetpAPileupCut();
530 evRecCuts->SetVertexZCut(-fVertexRangeZ, fVertexRangeZ);
531 //evRecCuts->SetVertexNContributors(1,(Int_t)1.e9);
532 if(IsQAOn()) evRecCuts->SetQAOn(fHistQA);
533 arr->SetName("fEvRecCuts");
534 arr->AddLast(evRecCuts);
537 fCutList->AddLast(arr);
540 //__________________________________________________________________
541 void AliHFEcuts::SetParticleGenCutList(){
543 // Initialize Particle Cuts for Monte Carlo Tracks
544 // Production Vertex Radius: < 3cm
545 // Particle Species: Electrons
546 // Eta: < 0.8 (fEtaRange)
549 TObjArray *mcCuts = new TObjArray;
550 mcCuts->SetName("fPartGenCuts");
553 AliDebug(2, "Called\n");
554 AliCFParticleGenCuts *genCuts = new AliCFParticleGenCuts("fCutsGenMC", "Particle Generation Cuts");
555 genCuts->SetRequireIsCharged();
556 if(IsRequirePrimary()) {
557 genCuts->SetRequireIsPrimary();
559 if(IsRequireProdVertex()){
560 AliDebug(3, Form("Vertex Range: fProdVtx[0] %f, fProdVtx[1] %f, fProdVtx[2] %f, fProdVtx[3] %f, fProdVtxZ[0] %f, fProdVtx[1] %f", fProdVtx[0], fProdVtx[1], fProdVtx[2], fProdVtx[3], fProdVtxZ[0], fProdVtxZ[1]));
562 genCuts->SetProdVtxRangeX(fProdVtx[0], fProdVtx[1]);
563 genCuts->SetProdVtxRangeY(fProdVtx[2], fProdVtx[3]);
564 genCuts->SetProdVtxRangeZ(fProdVtxZ[0], fProdVtxZ[1]);
565 genCuts->SetProdVtxRange2D(kTRUE); // Use ellipse
568 // (ONLY PROVISOIRE FOR MC AOD)
569 // genCuts->SetProdVtxRangeX(-TMath::Abs(fProdVtx[1]), TMath::Abs(fProdVtx[1]));
570 // genCuts->SetProdVtxRangeY(-TMath::Abs(fProdVtx[3]), TMath::Abs(fProdVtx[3]));
573 genCuts->SetRequirePdgCode(11, kTRUE);
574 if(IsQAOn()) genCuts->SetQAOn(fHistQA);
577 mcCuts->AddLast(genCuts);
580 if(IsRequireKineMCCuts()) {
581 AliCFTrackKineCuts *kineMCcuts = new AliCFTrackKineCuts((Char_t *)"fCutsKineMC", (Char_t *)"MC Kine Cuts");
582 kineMCcuts->SetPtRange(fPtRange[0], fPtRange[1]);
583 //kineMCcuts->SetEtaRange(-0.8, 0.8);
584 kineMCcuts->SetEtaRange(fEtaRange[0],fEtaRange[1]);
585 if(fPhiRange[0] >= 0. && fPhiRange[1] >= 0.) kineMCcuts->SetPhiRange(fPhiRange[0], fPhiRange[1]);
586 if(IsQAOn()) kineMCcuts->SetQAOn(fHistQA);
587 mcCuts->AddLast(kineMCcuts);
590 fCutList->AddLast(mcCuts);
593 //__________________________________________________________________
594 void AliHFEcuts::SetAcceptanceCutList(){
596 // Initialize Particle (Monte Carlo) acceptance cuts
597 // Min. Required Hist for Detectors:
600 // TRD [2*nTracklets]
603 AliDebug(2, "Called\n");
604 AliCFAcceptanceCuts *accCuts = new AliCFAcceptanceCuts("fCutsAccMC", "MC Acceptance Cuts");
605 accCuts->SetMinNHitITS(3);
606 accCuts->SetMinNHitTPC(2);
607 accCuts->SetMinNHitTRD(2*fMinTrackletsTRD);
608 if(IsQAOn()) accCuts->SetQAOn(fHistQA);
610 TObjArray *partAccCuts = new TObjArray();
611 partAccCuts->SetName("fPartAccCuts");
612 partAccCuts->AddLast(accCuts);
613 fCutList->AddLast(partAccCuts);
616 //__________________________________________________________________
617 void AliHFEcuts::SetRecKineITSTPCCutList(){
619 // Track Kinematics and Quality cuts (Based on the Standard cuts from PWG0)
628 // Min. Number of Clusters:
632 // Chi2 per TPC cluster: 3.5
635 // Momentum Range: 100MeV - 20GeV
636 // Eta: < 0.9 (TRD-TOF acceptance)
638 const Long_t kStatusSelectionDefault(AliESDtrack::kTPCrefit | AliESDtrack::kITSrefit);
639 AliDebug(2, "Called\n");
640 AliCFTrackQualityCuts *trackQuality = new AliCFTrackQualityCuts((Char_t *)"fCutsQualityRec", (Char_t *)"REC Track Quality Cuts");
641 //trackQuality->SetMinNClusterITS(fMinClustersITS);
642 trackQuality->SetMaxChi2PerClusterTPC(fMaxChi2clusterTPC);
643 if(fMaxChi2clusterITS >= 0.) trackQuality->SetMaxChi2PerClusterITS(fMaxChi2clusterITS);
644 Long_t statusRequirement;
645 if(fAdditionalStatusRequirement)
646 statusRequirement = kStatusSelectionDefault | fAdditionalStatusRequirement;
648 statusRequirement = kStatusSelectionDefault;
649 trackQuality->SetStatus(statusRequirement);
650 //trackQuality->SetMaxCovDiagonalElements(2., 2., 0.5, 0.5, 2);
652 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTPCRec","Extra cuts from the HFE group");
653 hfecuts->SetDebugLevel(fDebugLevel);
654 hfecuts->SetMinNbITScls(fMinClustersITS);
655 // Set the cut in the TPC number of clusters
656 hfecuts->SetMinNClustersTPC(fMinClustersTPC,AliHFEextraCuts::ETPCclusterDef_t(fTPCclusterDef));
657 hfecuts->SetMinNClustersTPCPID(fMinClustersTPCPID);
658 hfecuts->SetClusterRatioTPC(fMinClusterRatioTPC,AliHFEextraCuts::ETPCclrDef_t(fTPCratioDef));
659 if(fFractionOfSharedTPCClusters > 0.0) hfecuts->SetFractionOfTPCSharedClusters(fFractionOfSharedTPCClusters);
660 if(fITSpatternCut) hfecuts->SetITSpatternCut();
661 if(fAODFilterBit > -1) hfecuts->SetAODFilterBit(fAODFilterBit);
663 AliCFTrackKineCuts *kineCuts = new AliCFTrackKineCuts((Char_t *)"fCutsKineRec", (Char_t *)"REC Kine Cuts");
664 //printf("Setting max. pt to %f\n", fPtRange[1]);
665 kineCuts->SetPtRange(fPtRange[0], fPtRange[1]);
666 //kineCuts->SetEtaRange(-0.8, 0.8);
667 kineCuts->SetEtaRange(fEtaRange[0],fEtaRange[1]);
668 if(fPhiRange[0] >= 0. && fPhiRange[1] >= 0.) kineCuts->SetPhiRange(fPhiRange[0], fPhiRange[1]);
671 trackQuality->SetQAOn(fHistQA);
672 hfecuts->SetQAOn(fHistQA);
673 kineCuts->SetQAOn(fHistQA);
676 TObjArray *recCuts = new TObjArray;
677 recCuts->SetName("fPartRecKineITSTPCCuts");
678 recCuts->AddLast(trackQuality);
679 recCuts->AddLast(hfecuts);
680 recCuts->AddLast(kineCuts);
681 fCutList->AddLast(recCuts);
684 //__________________________________________________________________
685 void AliHFEcuts::SetRecPrimaryCutList(){
687 // Primary cuts (based on standard cuts from PWG0):
693 AliDebug(2, "Called\n");
694 AliCFTrackIsPrimaryCuts *primaryCut = new AliCFTrackIsPrimaryCuts((Char_t *)"fCutsPrimaryCuts", (Char_t *)"REC Primary Cuts");
695 //if(IsRequireDCAToVertex()){
696 //primaryCut->SetDCAToVertex2D(kTRUE);
697 //primaryCut->SetMaxDCAToVertexXY(fDCAtoVtx[0]);
698 //primaryCut->SetMaxDCAToVertexZ(fDCAtoVtx[1]);
700 if(IsRequireSigmaToVertex()){
701 primaryCut->SetRequireSigmaToVertex(kTRUE);
702 if(fSigmaToVtx[0]) primaryCut->SetMaxNSigmaToVertex(fSigmaToVtx[0]);
703 if(fSigmaToVtx[1]) primaryCut->SetMaxSigmaDCAxy(fSigmaToVtx[1]);
704 if(fSigmaToVtx[2]) primaryCut->SetMaxSigmaDCAz(fSigmaToVtx[2]);
706 //primaryCut->SetAcceptKinkDaughters(kFALSE);
707 if(IsQAOn()) primaryCut->SetQAOn(fHistQA);
709 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsPrimaryCutsextra","Extra cuts from the HFE group");
710 hfecuts->SetMaxImpactParameterRpar(fMaxImpactParameterRpar);
711 if(fRejectKinkDaughters) hfecuts->SetRejectKinkDaughter();
712 if(fRejectKinkMothers) hfecuts->SetRejectKinkMother();
713 if(IsRequireDCAToVertex()){
714 hfecuts->SetMaxImpactParamR(fDCAtoVtx[0]);
715 hfecuts->SetMaxImpactParamZ(fDCAtoVtx[1]);
718 TObjArray *primCuts = new TObjArray;
719 primCuts->SetName("fPartPrimCuts");
721 if(IsRequireSigmaToVertex()) primCuts->AddLast(primaryCut);
722 //if(fMaxImpactParameterRpar){
723 primCuts->AddLast(hfecuts);
725 fCutList->AddLast(primCuts);
728 //__________________________________________________________________
729 void AliHFEcuts::SetHFElectronITSCuts(){
731 // Special Cuts introduced by the HFElectron Group: ITS
733 AliDebug(2, "Called\n");
734 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupPixels","Extra cuts from the HFE group");
735 if(IsRequireITSpixel()){
736 hfecuts->SetRequireITSpixel(AliHFEextraCuts::ITSPixel_t(fCutITSPixel));
737 hfecuts->SetCheckITSstatus(fCheckITSLayerStatus);
739 if(IsRequireITSdrift()){
740 hfecuts->SetRequireITSdrift(AliHFEextraCuts::ITSDrift_t(fCutITSDrift));
743 if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
744 hfecuts->SetDebugLevel(fDebugLevel);
746 TObjArray *hfeCuts = new TObjArray;
747 hfeCuts->SetName("fPartHFECutsITS");
748 hfeCuts->AddLast(hfecuts);
749 fCutList->AddLast(hfeCuts);
752 //__________________________________________________________________
753 void AliHFEcuts::SetHFElectronTOFCuts(){
755 // Special Cuts introduced by the HFElectron Group: TRD
757 AliDebug(2, "Called\n");
758 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTOF","Extra cuts from the HFE group on TOF PID");
759 if(fTOFPIDStep) hfecuts->SetTOFPID(kTRUE);
760 if(fTOFMISMATCHStep) hfecuts->SetTOFMISMATCH(kTRUE);
761 if(fMatchTOFLabel) hfecuts->SetMatchTOFLabel(kTRUE);
762 if((fTOFsignaldx > 0.0) && (fTOFsignaldz > 0.0)) hfecuts->SetTOFsignalDxz(fTOFsignaldx,fTOFsignaldz);
763 if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
764 hfecuts->SetDebugLevel(fDebugLevel);
766 TObjArray *hfeCuts = new TObjArray;
767 hfeCuts->SetName("fPartHFECutsTOF");
768 hfeCuts->AddLast(hfecuts);
769 fCutList->AddLast(hfeCuts);
772 //__________________________________________________________________
773 void AliHFEcuts::SetHFElectronTPCCuts(){
775 // Special Cuts introduced by the HFElectron Group: TPC
777 AliDebug(2, "Called\n");
778 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTPCPID","Extra cuts from the HFE group on TPC PID");
779 if(fTPCPIDCLEANUPStep) hfecuts->SetTPCPIDCleanUp(kTRUE);
780 if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
781 hfecuts->SetDebugLevel(fDebugLevel);
783 TObjArray *hfeCuts = new TObjArray;
784 hfeCuts->SetName("fPartHFECutsTPC");
785 hfeCuts->AddLast(hfecuts);
786 fCutList->AddLast(hfeCuts);
790 //__________________________________________________________________
791 void AliHFEcuts::SetHFElectronTRDCuts(){
793 // Special Cuts introduced by the HFElectron Group: TRD
795 AliDebug(2, "Called\n");
796 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTRD","Extra cuts from the HFE group on TRD PID");
797 if(fMinTrackletsTRD > 0.) hfecuts->SetMinTrackletsTRD(fMinTrackletsTRD, fTRDtrackletsExact);
799 hfecuts->SetMaxChi2TRD(fMaxChi2TRD);
801 if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
802 hfecuts->SetDebugLevel(fDebugLevel);
804 TObjArray *hfeCuts = new TObjArray;
805 hfeCuts->SetName("fPartHFECutsTRD");
806 hfeCuts->AddLast(hfecuts);
807 fCutList->AddLast(hfeCuts);
810 //__________________________________________________________________
811 void AliHFEcuts::SetHFElectronDcaCuts(){
813 // Special Cuts introduced by the HFElectron Group: minimum of impact parameter
815 AliDebug(2, "Called\n");
816 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupDCA","Extra cuts from the HFE group");
817 hfecuts->SetMinHFEImpactParamR(fIPCutParams,fIsIPSigmacut,fIsIPcharge,fIsIPOpp);
818 if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
819 hfecuts->SetDebugLevel(fDebugLevel);
821 TObjArray *hfeCuts = new TObjArray;
822 hfeCuts->SetName("fPartHFECutsDca");
823 hfeCuts->AddLast(hfecuts);
824 fCutList->AddLast(hfeCuts);
827 //__________________________________________________________________
828 Bool_t AliHFEcuts::CheckParticleCuts(UInt_t step, TObject *o){
830 // Checks the cuts without using the correction framework manager
832 AliDebug(2, "Called\n");
833 TString stepnames[kNcutStepsMCTrack + kNcutStepsRecTrack + kNcutStepsDETrack + kNcutStepsSecvtxTrack + 1] = {"fPartGenCuts","fPartEvCutPileupZ","fPartEvCut","fPartAccCuts","fPartRecNoCuts","fPartRecKineITSTPCCuts", "fPartPrimCuts", "fPartHFECutsITS","fPartHFECutsTOF","fPartHFECutsTPC","fPartHFECutsTRD","fPartHFECutsDca", "fPartHFECutsSecvtx"};
834 AliDebug(2, Form("Doing cut %s", stepnames[step].Data()));
835 TObjArray *cuts = dynamic_cast<TObjArray *>(fCutList->FindObject(stepnames[step].Data()));
836 if(!cuts) return kTRUE;
839 Bool_t status = kTRUE;
840 while((mycut = dynamic_cast<AliCFCutBase *>(it()))){
841 status &= mycut->IsSelected(o);
847 //__________________________________________________________________
848 Bool_t AliHFEcuts::CheckEventCuts(const char*namestep, TObject *o){
850 // Checks the cuts without using the correction framework manager
852 AliDebug(2, "Called\n");
853 TObjArray *cuts = dynamic_cast<TObjArray *>(fCutList->FindObject(namestep));
854 if(!cuts) return kTRUE;
857 Bool_t status = kTRUE;
858 while((mycut = dynamic_cast<AliCFCutBase *>(it()))){
859 status &= mycut->IsSelected(o);
864 //__________________________________________________________________
865 void AliHFEcuts::SetRecEvent(const AliVEvent *ev){
867 // Publish reconstructed event to the cuts
869 TIter cutsteps(fCutList);
872 while((cutstep = dynamic_cast<TObjArray *>(cutsteps()))){
873 TIter cutIter(cutstep);
874 while((cut = dynamic_cast<AliCFCutBase *>(cutIter()))){
875 cut->SetRecEventInfo(ev);
880 //__________________________________________________________________
881 void AliHFEcuts::SetMCEvent(const AliVEvent *ev){
883 // Publish reconstructed event to the cuts
885 TIter cutsteps(fCutList);
888 while((cutstep = dynamic_cast<TObjArray *>(cutsteps()))){
889 TIter cutIter(cutstep);
890 while((cut = dynamic_cast<AliCFCutBase *>(cutIter()))){
891 cut->SetMCEventInfo(ev);