]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGHF/hfe/AliHFEcuts.cxx
Aplly cut for centrality outliers also in the MC
[u/mrichter/AliRoot.git] / PWGHF / hfe / AliHFEcuts.cxx
CommitLineData
809a4336 1/**************************************************************************
2* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3* *
4* Author: The ALICE Off-line Project. *
5* Contributors are mentioned in the code where appropriate. *
6* *
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**************************************************************************/
50685501 15//
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
20//
21// Authors:
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>
26//
70da6c5a 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
48// 17. Rec Primary
49// 18. HFE ITS
50// 19. HFE TRD
51// 20. PID
52//
809a4336 53#include <TClass.h>
54#include <TList.h>
55#include <TObjArray.h>
56#include <TString.h>
57
58#include "AliCFAcceptanceCuts.h"
59#include "AliCFCutBase.h"
0792aa82 60#include "AliCFEventGenCuts.h"
61#include "AliCFEventRecCuts.h"
809a4336 62#include "AliCFManager.h"
63#include "AliCFParticleGenCuts.h"
64#include "AliCFTrackIsPrimaryCuts.h"
65#include "AliCFTrackKineCuts.h"
66#include "AliCFTrackQualityCuts.h"
67#include "AliESDtrack.h"
c2690925 68#include "AliHFEextraEventCuts.h"
e17c1f86 69#include "AliMCEvent.h"
70#include "AliVEvent.h"
809a4336 71
72#include "AliHFEcuts.h"
73
74ClassImp(AliHFEcuts)
75
3a72645a 76const Char_t *AliHFEcuts::fgkMCCutName[AliHFEcuts::kNcutStepsMCTrack] = {
77 "MCGenerated",
c2690925 78 "MCGeneratedZOutNoPileUpCentralityFine",
3a72645a 79 "MCGeneratedEventCut",
80 "MCInAcceptance"
81};
82
83const Char_t * AliHFEcuts::fgkRecoCutName[AliHFEcuts::kNcutStepsRecTrack] = {
84 "NoCuts",
85 "RecKineITSTPC",
86 "Primary",
87 "HFEITS",
9250ffbf 88 "HFETOF",
8c1c76e9 89 "HFETPC",
3a72645a 90 "HFETRD"
91};
92
93const Char_t * AliHFEcuts::fgkDECutName[AliHFEcuts::kNcutStepsDETrack] = {
94 "HFEDCA"
95};
96
c2690925 97const Char_t * AliHFEcuts::fgkSecvtxCutName[AliHFEcuts::kNcutStepsSecvtxTrack] = {
98 "HFESecvtx"
99};
100
3a72645a 101const Char_t * AliHFEcuts::fgkEventCutName[AliHFEcuts::kNcutStepsEvent] = {
102 "EventStepGenerated",
103 "EventStepRecNoCut",
104 "EventStepRecNoPileUp",
8c1c76e9 105 "EventStepRecCentralityOK",
3a72645a 106 "EventStepZRange",
107 "EventStepReconstructed"
108};
109
110const Char_t * AliHFEcuts::fgkUndefined = "Undefined";
111
809a4336 112//__________________________________________________________________
113AliHFEcuts::AliHFEcuts():
e3fc062d 114 TNamed(),
115 fRequirements(0),
e3ae862b 116 fTPCclusterDef(AliHFEextraCuts::kFound),
117 fTPCratioDef(AliHFEextraCuts::kFoundOverFindable),
e3fc062d 118 fMinClustersTPC(0),
e17c1f86 119 fMinClustersTPCPID(0),
3a72645a 120 fMinClustersITS(0),
e3fc062d 121 fMinTrackletsTRD(0),
122 fCutITSPixel(0),
123 fCheckITSLayerStatus(kTRUE),
5cd679b7 124 fCutITSDrift(0),
8c1c76e9 125 fMaxChi2clusterITS(-1.),
e3fc062d 126 fMaxChi2clusterTPC(0.),
127 fMinClusterRatioTPC(0.),
3a72645a 128 fVertexRangeZ(20.),
e17c1f86 129 fTRDtrackletsExact(kFALSE),
e3ae862b 130 fTOFPIDStep(kFALSE),
c2690925 131 fTOFMISMATCHStep(kFALSE),
8c1c76e9 132 fTPCPIDCLEANUPStep(kFALSE),
c2690925 133 fUseMixedVertex(kTRUE),
134 fIsIPSigmacut(kFALSE),
11ff28c5 135 fIsIPAbs(kTRUE),
9250ffbf 136 fFractionOfSharedTPCClusters(-1.0),
137 fMaxImpactParameterRpar(kFALSE),
11ff28c5 138 fAdditionalStatusRequirement(0),
e3fc062d 139 fHistQA(0x0),
140 fCutList(0x0),
141 fDebugLevel(0)
142{
143 //
144 // Dummy Constructor
145 //
8c1c76e9 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);
151
e3fc062d 152}
153
154//__________________________________________________________________
155AliHFEcuts::AliHFEcuts(const Char_t *name, const Char_t *title):
156 TNamed(name, title),
809a4336 157 fRequirements(0),
e3ae862b 158 fTPCclusterDef(AliHFEextraCuts::kFound),
159 fTPCratioDef(AliHFEextraCuts::kFoundOverFindable),
809a4336 160 fMinClustersTPC(0),
e17c1f86 161 fMinClustersTPCPID(0),
3a72645a 162 fMinClustersITS(0),
809a4336 163 fMinTrackletsTRD(0),
164 fCutITSPixel(0),
0792aa82 165 fCheckITSLayerStatus(kTRUE),
5cd679b7 166 fCutITSDrift(0),
8c1c76e9 167 fMaxChi2clusterITS(-1.),
809a4336 168 fMaxChi2clusterTPC(0.),
169 fMinClusterRatioTPC(0.),
3a72645a 170 fVertexRangeZ(20.),
e17c1f86 171 fTRDtrackletsExact(kFALSE),
e3ae862b 172 fTOFPIDStep(kFALSE),
c2690925 173 fTOFMISMATCHStep(kFALSE),
8c1c76e9 174 fTPCPIDCLEANUPStep(kFALSE),
c2690925 175 fUseMixedVertex(kTRUE),
176 fIsIPSigmacut(kFALSE),
11ff28c5 177 fIsIPAbs(kTRUE),
9250ffbf 178 fFractionOfSharedTPCClusters(-1.0),
179 fMaxImpactParameterRpar(kFALSE),
11ff28c5 180 fAdditionalStatusRequirement(0),
809a4336 181 fHistQA(0x0),
dbe3abbe 182 fCutList(0x0),
183 fDebugLevel(0)
809a4336 184{
185 //
186 // Default Constructor
187 //
188 memset(fProdVtx, 0, sizeof(Double_t) * 4);
189 memset(fDCAtoVtx, 0, sizeof(Double_t) * 2);
190 memset(fPtRange, 0, sizeof(Double_t) * 2);
c2690925 191 memset(fIPCutParams, 0, sizeof(Float_t) * 4);
8c1c76e9 192 memset(fSigmaToVtx, 0, sizeof(Double_t) * 3);
809a4336 193}
194
195//__________________________________________________________________
196AliHFEcuts::AliHFEcuts(const AliHFEcuts &c):
e3fc062d 197 TNamed(c),
809a4336 198 fRequirements(c.fRequirements),
e3ae862b 199 fTPCclusterDef(c.fTPCclusterDef),
200 fTPCratioDef(c.fTPCratioDef),
e3fc062d 201 fMinClustersTPC(0),
e17c1f86 202 fMinClustersTPCPID(0),
3a72645a 203 fMinClustersITS(0),
e3fc062d 204 fMinTrackletsTRD(0),
205 fCutITSPixel(0),
206 fCheckITSLayerStatus(0),
5cd679b7 207 fCutITSDrift(0),
8c1c76e9 208 fMaxChi2clusterITS(-1.),
e3fc062d 209 fMaxChi2clusterTPC(0),
210 fMinClusterRatioTPC(0),
3a72645a 211 fVertexRangeZ(20.),
e17c1f86 212 fTRDtrackletsExact(kFALSE),
e3ae862b 213 fTOFPIDStep(kFALSE),
c2690925 214 fTOFMISMATCHStep(kFALSE),
8c1c76e9 215 fTPCPIDCLEANUPStep(kFALSE),
c2690925 216 fUseMixedVertex(kTRUE),
217 fIsIPSigmacut(kFALSE),
11ff28c5 218 fIsIPAbs(kTRUE),
9250ffbf 219 fFractionOfSharedTPCClusters(-1.0),
220 fMaxImpactParameterRpar(kFALSE),
11ff28c5 221 fAdditionalStatusRequirement(0),
809a4336 222 fHistQA(0x0),
dbe3abbe 223 fCutList(0x0),
224 fDebugLevel(0)
809a4336 225{
226 //
227 // Copy Constructor
228 //
e3fc062d 229 c.Copy(*this);
230}
231
232//__________________________________________________________________
233AliHFEcuts &AliHFEcuts::operator=(const AliHFEcuts &c){
234 //
235 // Make assignment
236 //
237 if(&c != this) c.Copy(*this);
238 return *this;
239}
240
241//__________________________________________________________________
242void AliHFEcuts::Copy(TObject &c) const {
243 //
244 // Performing copy
245 //
246 AliHFEcuts &target = dynamic_cast<AliHFEcuts &>(c);
247
248 target.fRequirements = fRequirements;
e3ae862b 249 target.fTPCclusterDef = fTPCclusterDef;
250 target.fTPCratioDef = fTPCratioDef;
e3fc062d 251 target.fMinClustersTPC = fMinClustersTPC;
e17c1f86 252 target.fMinClustersTPCPID = fMinClustersTPCPID;
3a72645a 253 target.fMinClustersITS = fMinClustersITS;
e3fc062d 254 target.fMinTrackletsTRD = fMinTrackletsTRD;
255 target.fCutITSPixel = fCutITSPixel;
256 target.fCheckITSLayerStatus = fCheckITSLayerStatus;
5cd679b7 257 target.fCutITSDrift = fCutITSDrift;
8c1c76e9 258 target.fMaxChi2clusterITS = fMaxChi2clusterITS;
e3fc062d 259 target.fMaxChi2clusterTPC = fMaxChi2clusterTPC;
260 target.fMinClusterRatioTPC = fMinClusterRatioTPC;
3a72645a 261 target.fVertexRangeZ = fVertexRangeZ;
e17c1f86 262 target.fTRDtrackletsExact = fTRDtrackletsExact;
e3ae862b 263 target.fTOFPIDStep = fTOFPIDStep;
c2690925 264 target.fTOFMISMATCHStep = fTOFMISMATCHStep;
8c1c76e9 265 target.fTPCPIDCLEANUPStep = fTPCPIDCLEANUPStep;
c2690925 266 target.fUseMixedVertex = fUseMixedVertex;
267 target.fIsIPSigmacut = fIsIPSigmacut;
11ff28c5 268 target.fIsIPAbs = fIsIPAbs;
9250ffbf 269 target.fFractionOfSharedTPCClusters = fFractionOfSharedTPCClusters;
270 target.fMaxImpactParameterRpar = fMaxImpactParameterRpar;
11ff28c5 271 target.fAdditionalStatusRequirement = fAdditionalStatusRequirement;
e3fc062d 272 target.fDebugLevel = 0;
273
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);
c2690925 277 memcpy(target.fIPCutParams, fIPCutParams, sizeof(Float_t) * 4);
8c1c76e9 278 memcpy(target.fSigmaToVtx, fSigmaToVtx, sizeof(Double_t) * 3);
e3fc062d 279
280 // Copy cut List
281 if(target.fCutList){
282 target.fCutList->Clear();
283 delete target.fCutList;
284 }
285 if(fCutList){
286 target.fCutList = dynamic_cast<TObjArray *>(fCutList->Clone());
bf892a6a 287 if(target.fCutList) target.fCutList->SetOwner(); // Coverity
e3fc062d 288 }
289 if(target.fHistQA){
e3fc062d 290 delete target.fHistQA;
e3fc062d 291 }
292 if(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()));
c2690925 296 fHistQA->SetOwner(kTRUE);
e3fc062d 297 TIter cit(target.fCutList);
298 TObjArray *clist = NULL;
299 AliCFCutBase *co = NULL;
300 while((clist = dynamic_cast<TObjArray *>(cit()))){
301 TIter cit1(clist);
302 while((co = dynamic_cast<AliCFCutBase *>(cit1()))) co->SetQAOn(target.fHistQA);
303 }
304 }
809a4336 305}
306
307//__________________________________________________________________
308AliHFEcuts::~AliHFEcuts(){
309 //
310 // Destruktor
311 //
312 if(fCutList){
313 fCutList->Delete();
314 delete fCutList;
315 }
316 fCutList = 0x0;
c2690925 317 if(fHistQA) delete fHistQA;
809a4336 318}
319
8c1c76e9 320//__________________________________________________________________
321Long64_t AliHFEcuts::Merge(const TCollection *list){
322 //
323 // Merge function doing nothing, just writing the object to file
324 //
325 if(!list) return 0;
326 if(list->IsEmpty()) return 1;
327 Long64_t counts = 0;
328 // just count the number of objects to merge
329 TIter iter(list);
330 while(iter()){ counts++; }
331 return counts+1;
332}
333
809a4336 334//__________________________________________________________________
335void AliHFEcuts::Initialize(AliCFManager *cfm){
50685501 336 //
337 // Initializes the cut objects from the correction framework
338 // Publishes the cuts to the correction framework manager
339 //
faee3b18 340 AliDebug(2, "Called");
3a72645a 341 const Int_t kMCOffset = kNcutStepsMCTrack;
342 const Int_t kRecOffset = kNcutStepsRecTrack;
e3fc062d 343 if(fCutList)
344 fCutList->Delete();
345 else{
346 fCutList = new TObjArray;
347 fCutList->SetOwner();
348 }
349 if(IsQAOn()){
350 fHistQA = new TList;
351 fHistQA->SetName(Form("%s_CutQAhistograms", GetName()));
c2690925 352 fHistQA->SetOwner(kTRUE);
722347d8 353 }
354
809a4336 355 // Call all the setters for the cuts
356 SetParticleGenCutList();
357 SetAcceptanceCutList();
722347d8 358 SetRecKineITSTPCCutList();
809a4336 359 SetRecPrimaryCutList();
dbe3abbe 360 SetHFElectronITSCuts();
9250ffbf 361 SetHFElectronTOFCuts();
8c1c76e9 362 SetHFElectronTPCCuts();
dbe3abbe 363 SetHFElectronTRDCuts();
3a72645a 364 SetHFElectronDcaCuts();
dbe3abbe 365
9bcfd1ab 366 // Publish to the cuts which analysis type they are (ESD Analysis by default)
367 if(IsAOD()){
368 AliInfo("Setting AOD Analysis");
369 TObjArray *genCuts = dynamic_cast<TObjArray *>(fCutList->FindObject("fPartGenCuts"));
370 if(genCuts){
371 AliCFParticleGenCuts *myGenCut = dynamic_cast<AliCFParticleGenCuts *>(genCuts->FindObject("fCutsGenMC"));
372 if(myGenCut) myGenCut->SetAODMC(kTRUE);
373 }
374 }
375
0792aa82 376 // Connect the event cuts
70da6c5a 377 SetEventCutList(kEventStepGenerated);
0792aa82 378 SetEventCutList(kEventStepReconstructed);
379 cfm->SetEventCutsList(kEventStepGenerated, dynamic_cast<TObjArray *>(fCutList->FindObject("fEvGenCuts")));
70da6c5a 380 cfm->SetEventCutsList(kEventStepReconstructed, dynamic_cast<TObjArray *>(fCutList->FindObject("fEvRecCuts")));
809a4336 381
0792aa82 382 // Connect the particle cuts
3a72645a 383 // 1st MC
809a4336 384 cfm->SetParticleCutsList(kStepMCGenerated, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartGenCuts")));
385 cfm->SetParticleCutsList(kStepMCInAcceptance, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartAccCuts")));
3a72645a 386 // 2nd Reco
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")));
9250ffbf 390 cfm->SetParticleCutsList(kStepHFEcutsTOF+ kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsTOF")));
8c1c76e9 391 cfm->SetParticleCutsList(kStepHFEcutsTPC+ kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsTPC")));
3a72645a 392 cfm->SetParticleCutsList(kStepHFEcutsTRD + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsTRD")));
393 cfm->SetParticleCutsList(kStepHFEcutsDca + kRecOffset + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsDca")));
dbe3abbe 394
809a4336 395}
396
397//__________________________________________________________________
398void AliHFEcuts::Initialize(){
399 // Call all the setters for the cuts
faee3b18 400 AliDebug(2, "Called\n");
e3fc062d 401 if(fCutList)
402 fCutList->Delete();
403 else{
404 fCutList = new TObjArray;
405 fCutList->SetOwner();
406 }
407 if(IsQAOn()){
408 fHistQA = new TList;
409 fHistQA->SetName(Form("%s_CutQAhistograms", GetName()));
410 fHistQA->SetOwner(kFALSE);
411 }
809a4336 412 SetParticleGenCutList();
413 SetAcceptanceCutList();
722347d8 414 SetRecKineITSTPCCutList();
809a4336 415 SetRecPrimaryCutList();
dbe3abbe 416 SetHFElectronITSCuts();
9250ffbf 417 SetHFElectronTOFCuts();
8c1c76e9 418 SetHFElectronTPCCuts();
dbe3abbe 419 SetHFElectronTRDCuts();
3a72645a 420 SetHFElectronDcaCuts();
dbe3abbe 421
e156c3bb 422 // Connect the event cuts
423 SetEventCutList(kEventStepGenerated);
424 SetEventCutList(kEventStepReconstructed);
425
426
809a4336 427}
428
0792aa82 429//__________________________________________________________________
430void AliHFEcuts::SetEventCutList(Int_t istep){
431 //
432 // Cuts for Event Selection
433 //
faee3b18 434 AliDebug(2, "Called\n");
0792aa82 435 TObjArray *arr = new TObjArray;
436 if(istep == kEventStepGenerated){
faee3b18 437 AliCFEventGenCuts *evGenCuts = new AliCFEventGenCuts((Char_t *)"fCutsEvGen", (Char_t *)"Event Generated cuts");
3a72645a 438 //evGenCuts->SetNTracksCut(1);
0792aa82 439 evGenCuts->SetRequireVtxCuts(kTRUE);
3a72645a 440 //evGenCuts->SetVertexXCut(-1, 1);
441 //evGenCuts->SetVertexYCut(-1, 1);
442 evGenCuts->SetVertexZCut(-fVertexRangeZ, fVertexRangeZ);
69ac0e6f 443 if(IsQAOn()) evGenCuts->SetQAOn(fHistQA);
0792aa82 444
445 arr->SetName("fEvGenCuts");
446 arr->AddLast(evGenCuts);
447 } else {
c2690925 448
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);
461 } else {
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);
470 }
0792aa82 471 }
472 fCutList->AddLast(arr);
473}
474
809a4336 475//__________________________________________________________________
476void AliHFEcuts::SetParticleGenCutList(){
477 //
478 // Initialize Particle Cuts for Monte Carlo Tracks
e156c3bb 479 // Production Vertex Radius: < 3cm
809a4336 480 // Particle Species: Electrons
e156c3bb 481 // Eta: < 0.8
809a4336 482 //
faee3b18 483
484 TObjArray *mcCuts = new TObjArray;
485 mcCuts->SetName("fPartGenCuts");
486
487 //
488 AliDebug(2, "Called\n");
809a4336 489 AliCFParticleGenCuts *genCuts = new AliCFParticleGenCuts("fCutsGenMC", "Particle Generation Cuts");
490 genCuts->SetRequireIsCharged();
faee3b18 491 if(IsRequirePrimary()) {
492 genCuts->SetRequireIsPrimary();
493 }
809a4336 494 if(IsRequireProdVertex()){
faee3b18 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]));
809a4336 496 genCuts->SetProdVtxRangeX(fProdVtx[0], fProdVtx[1]);
497 genCuts->SetProdVtxRangeY(fProdVtx[2], fProdVtx[3]);
70da6c5a 498 genCuts->SetProdVtxRange2D(kTRUE); // Use ellipse
809a4336 499 }
722347d8 500 genCuts->SetRequirePdgCode(11, kTRUE);
e3fc062d 501 if(IsQAOn()) genCuts->SetQAOn(fHistQA);
809a4336 502
faee3b18 503 // Add
809a4336 504 mcCuts->AddLast(genCuts);
faee3b18 505
506 //
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);
e3fc062d 511 if(IsQAOn()) kineMCcuts->SetQAOn(fHistQA);
faee3b18 512 mcCuts->AddLast(kineMCcuts);
513 }
514
809a4336 515 fCutList->AddLast(mcCuts);
516}
517
518//__________________________________________________________________
519void AliHFEcuts::SetAcceptanceCutList(){
520 //
521 // Initialize Particle (Monte Carlo) acceptance cuts
522 // Min. Required Hist for Detectors:
523 // ITS [3]
524 // TPC [2]
722347d8 525 // TRD [2*nTracklets]
809a4336 526 // TOF [0]
527 //
faee3b18 528 AliDebug(2, "Called\n");
809a4336 529 AliCFAcceptanceCuts *accCuts = new AliCFAcceptanceCuts("fCutsAccMC", "MC Acceptance Cuts");
530 accCuts->SetMinNHitITS(3);
531 accCuts->SetMinNHitTPC(2);
722347d8 532 accCuts->SetMinNHitTRD(2*fMinTrackletsTRD);
e3fc062d 533 if(IsQAOn()) accCuts->SetQAOn(fHistQA);
809a4336 534
75d81601 535 TObjArray *partAccCuts = new TObjArray();
536 partAccCuts->SetName("fPartAccCuts");
537 partAccCuts->AddLast(accCuts);
538 fCutList->AddLast(partAccCuts);
809a4336 539}
540
541//__________________________________________________________________
722347d8 542void AliHFEcuts::SetRecKineITSTPCCutList(){
809a4336 543 //
544 // Track Kinematics and Quality cuts (Based on the Standard cuts from PWG0)
545 //
722347d8 546 // ITS refit
809a4336 547 // Variances:
548 // y: 2
549 // z: 2
550 // sin(phi): 0.5
551 // tan(theta): 0.5
552 // 1/pt: 2
553 // Min. Number of Clusters:
554 // TPC: 50
555 // RefitRequired:
809a4336 556 // TPC
557 // Chi2 per TPC cluster: 3.5
558 //
559 // Kinematics:
560 // Momentum Range: 100MeV - 20GeV
561 // Eta: < 0.9 (TRD-TOF acceptance)
562 //
11ff28c5 563 const Long_t kStatusSelectionDefault(AliESDtrack::kTPCrefit | AliESDtrack::kITSrefit);
faee3b18 564 AliDebug(2, "Called\n");
565 AliCFTrackQualityCuts *trackQuality = new AliCFTrackQualityCuts((Char_t *)"fCutsQualityRec", (Char_t *)"REC Track Quality Cuts");
11ff28c5 566 //trackQuality->SetMinNClusterITS(fMinClustersITS);
809a4336 567 trackQuality->SetMaxChi2PerClusterTPC(fMaxChi2clusterTPC);
8c1c76e9 568 if(fMaxChi2clusterITS >= 0.) trackQuality->SetMaxChi2PerClusterITS(fMaxChi2clusterITS);
11ff28c5 569 Long_t statusRequirement;
570 if(fAdditionalStatusRequirement)
571 statusRequirement = kStatusSelectionDefault | fAdditionalStatusRequirement;
572 else
573 statusRequirement = kStatusSelectionDefault;
574 trackQuality->SetStatus(statusRequirement);
3a72645a 575 //trackQuality->SetMaxCovDiagonalElements(2., 2., 0.5, 0.5, 2);
809a4336 576
e17c1f86 577 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTPCRec","Extra cuts from the HFE group");
722347d8 578 hfecuts->SetDebugLevel(fDebugLevel);
11ff28c5 579 hfecuts->SetMinNbITScls(fMinClustersITS);
3a72645a 580 // Set the cut in the TPC number of clusters
e3ae862b 581 hfecuts->SetMinNClustersTPC(fMinClustersTPC, fTPCclusterDef);
e17c1f86 582 hfecuts->SetMinNClustersTPCPID(fMinClustersTPCPID);
e3ae862b 583 hfecuts->SetClusterRatioTPC(fMinClusterRatioTPC, fTPCratioDef);
9250ffbf 584 if(fFractionOfSharedTPCClusters > 0.0) hfecuts->SetFractionOfTPCSharedClusters(fFractionOfSharedTPCClusters);
722347d8 585
faee3b18 586 AliCFTrackKineCuts *kineCuts = new AliCFTrackKineCuts((Char_t *)"fCutsKineRec", (Char_t *)"REC Kine Cuts");
809a4336 587 kineCuts->SetPtRange(fPtRange[0], fPtRange[1]);
70da6c5a 588 kineCuts->SetEtaRange(-0.8, 0.8);
809a4336 589
e3fc062d 590 if(IsQAOn()){
809a4336 591 trackQuality->SetQAOn(fHistQA);
722347d8 592 hfecuts->SetQAOn(fHistQA);
809a4336 593 kineCuts->SetQAOn(fHistQA);
594 }
595
596 TObjArray *recCuts = new TObjArray;
722347d8 597 recCuts->SetName("fPartRecKineITSTPCCuts");
809a4336 598 recCuts->AddLast(trackQuality);
722347d8 599 recCuts->AddLast(hfecuts);
809a4336 600 recCuts->AddLast(kineCuts);
601 fCutList->AddLast(recCuts);
602}
603
604//__________________________________________________________________
605void AliHFEcuts::SetRecPrimaryCutList(){
606 //
607 // Primary cuts (based on standard cuts from PWG0):
608 // DCA to Vertex:
609 // XY: 3. cm
610 // Z: 10. cm
611 // No Kink daughters
612 //
faee3b18 613 AliDebug(2, "Called\n");
614 AliCFTrackIsPrimaryCuts *primaryCut = new AliCFTrackIsPrimaryCuts((Char_t *)"fCutsPrimaryCuts", (Char_t *)"REC Primary Cuts");
6400afdd 615 //if(IsRequireDCAToVertex()){
78ea5ef4 616 //primaryCut->SetDCAToVertex2D(kTRUE);
6400afdd 617 //primaryCut->SetMaxDCAToVertexXY(fDCAtoVtx[0]);
618 //primaryCut->SetMaxDCAToVertexZ(fDCAtoVtx[1]);
619 //}
809a4336 620 if(IsRequireSigmaToVertex()){
621 primaryCut->SetRequireSigmaToVertex(kTRUE);
8c1c76e9 622 if(fSigmaToVtx[0]) primaryCut->SetMaxNSigmaToVertex(fSigmaToVtx[0]);
623 if(fSigmaToVtx[1]) primaryCut->SetMaxSigmaDCAxy(fSigmaToVtx[1]);
624 if(fSigmaToVtx[2]) primaryCut->SetMaxSigmaDCAz(fSigmaToVtx[2]);
809a4336 625 }
6400afdd 626 //primaryCut->SetAcceptKinkDaughters(kFALSE);
e3fc062d 627 if(IsQAOn()) primaryCut->SetQAOn(fHistQA);
809a4336 628
9250ffbf 629 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsPrimaryCutsextra","Extra cuts from the HFE group");
630 hfecuts->SetMaxImpactParameterRpar(fMaxImpactParameterRpar);
11ff28c5 631 hfecuts->SetRejectKinkDaughter();
632 hfecuts->SetRejectKinkMother();
6400afdd 633 if(IsRequireDCAToVertex()){
634 hfecuts->SetMaxImpactParamR(fDCAtoVtx[0]);
635 hfecuts->SetMaxImpactParamZ(fDCAtoVtx[1]);
636 }
9250ffbf 637
809a4336 638 TObjArray *primCuts = new TObjArray;
639 primCuts->SetName("fPartPrimCuts");
6400afdd 640 // needed for AOD...
5cd679b7 641 if(IsRequireSigmaToVertex()) primCuts->AddLast(primaryCut);
11ff28c5 642 //if(fMaxImpactParameterRpar){
643 primCuts->AddLast(hfecuts);
644 //}
809a4336 645 fCutList->AddLast(primCuts);
646}
647
648//__________________________________________________________________
dbe3abbe 649void AliHFEcuts::SetHFElectronITSCuts(){
809a4336 650 //
dbe3abbe 651 // Special Cuts introduced by the HFElectron Group: ITS
809a4336 652 //
faee3b18 653 AliDebug(2, "Called\n");
dbe3abbe 654 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupPixels","Extra cuts from the HFE group");
809a4336 655 if(IsRequireITSpixel()){
656 hfecuts->SetRequireITSpixel(AliHFEextraCuts::ITSPixel_t(fCutITSPixel));
0792aa82 657 hfecuts->SetCheckITSstatus(fCheckITSLayerStatus);
809a4336 658 }
5cd679b7 659 if(IsRequireITSdrift()){
660 hfecuts->SetRequireITSdrift(AliHFEextraCuts::ITSDrift_t(fCutITSDrift));
661 }
dbe3abbe 662
e3fc062d 663 if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
78ea5ef4 664 hfecuts->SetDebugLevel(fDebugLevel);
665
dbe3abbe 666 TObjArray *hfeCuts = new TObjArray;
667 hfeCuts->SetName("fPartHFECutsITS");
668 hfeCuts->AddLast(hfecuts);
669 fCutList->AddLast(hfeCuts);
670}
671
dbe3abbe 672//__________________________________________________________________
9250ffbf 673void AliHFEcuts::SetHFElectronTOFCuts(){
dbe3abbe 674 //
675 // Special Cuts introduced by the HFElectron Group: TRD
676 //
faee3b18 677 AliDebug(2, "Called\n");
9250ffbf 678 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTOF","Extra cuts from the HFE group on TOF PID");
e3ae862b 679 if(fTOFPIDStep) hfecuts->SetTOFPID(kTRUE);
c2690925 680 if(fTOFMISMATCHStep) hfecuts->SetTOFMISMATCH(kTRUE);
e3fc062d 681 if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
78ea5ef4 682 hfecuts->SetDebugLevel(fDebugLevel);
dbe3abbe 683
9250ffbf 684 TObjArray *hfeCuts = new TObjArray;
685 hfeCuts->SetName("fPartHFECutsTOF");
686 hfeCuts->AddLast(hfecuts);
687 fCutList->AddLast(hfeCuts);
688}
689
8c1c76e9 690//__________________________________________________________________
691void AliHFEcuts::SetHFElectronTPCCuts(){
692 //
693 // Special Cuts introduced by the HFElectron Group: TPC
694 //
695 AliDebug(2, "Called\n");
e17c1f86 696 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTPCPID","Extra cuts from the HFE group on TPC PID");
8c1c76e9 697 if(fTPCPIDCLEANUPStep) hfecuts->SetTPCPIDCleanUp(kTRUE);
698 if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
699 hfecuts->SetDebugLevel(fDebugLevel);
700
701 TObjArray *hfeCuts = new TObjArray;
702 hfeCuts->SetName("fPartHFECutsTPC");
703 hfeCuts->AddLast(hfecuts);
704 fCutList->AddLast(hfeCuts);
705}
706
707
9250ffbf 708//__________________________________________________________________
709void AliHFEcuts::SetHFElectronTRDCuts(){
710 //
711 // Special Cuts introduced by the HFElectron Group: TRD
712 //
713 AliDebug(2, "Called\n");
714 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTRD","Extra cuts from the HFE group on TRD PID");
e17c1f86 715 if(fMinTrackletsTRD > 0.) hfecuts->SetMinTrackletsTRD(fMinTrackletsTRD, fTRDtrackletsExact);
9250ffbf 716 if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
717 hfecuts->SetDebugLevel(fDebugLevel);
718
dbe3abbe 719 TObjArray *hfeCuts = new TObjArray;
720 hfeCuts->SetName("fPartHFECutsTRD");
809a4336 721 hfeCuts->AddLast(hfecuts);
722 fCutList->AddLast(hfeCuts);
723}
724
809a4336 725//__________________________________________________________________
3a72645a 726void AliHFEcuts::SetHFElectronDcaCuts(){
727 //
728 // Special Cuts introduced by the HFElectron Group: minimum of impact parameter
729 //
730 AliDebug(2, "Called\n");
731 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupDCA","Extra cuts from the HFE group");
11ff28c5 732 hfecuts->SetMinHFEImpactParamR(fIPCutParams,fIsIPSigmacut,fIsIPAbs);
3a72645a 733 if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
734 hfecuts->SetDebugLevel(fDebugLevel);
735
736 TObjArray *hfeCuts = new TObjArray;
737 hfeCuts->SetName("fPartHFECutsDca");
738 hfeCuts->AddLast(hfecuts);
739 fCutList->AddLast(hfeCuts);
740}
741
742//__________________________________________________________________
743Bool_t AliHFEcuts::CheckParticleCuts(UInt_t step, TObject *o){
809a4336 744 //
745 // Checks the cuts without using the correction framework manager
746 //
faee3b18 747 AliDebug(2, "Called\n");
8c1c76e9 748 TString stepnames[kNcutStepsMCTrack + kNcutStepsRecTrack + kNcutStepsDETrack + kNcutStepsSecvtxTrack + 1] = {"fPartGenCuts","fPartEvCutPileupZ","fPartEvCut","fPartAccCuts","fPartRecNoCuts","fPartRecKineITSTPCCuts", "fPartPrimCuts", "fPartHFECutsITS","fPartHFECutsTOF","fPartHFECutsTPC","fPartHFECutsTRD","fPartHFECutsDca", "fPartHFECutsSecvtx"};
3a72645a 749 AliDebug(2, Form("Doing cut %s", stepnames[step].Data()));
e3fc062d 750 TObjArray *cuts = dynamic_cast<TObjArray *>(fCutList->FindObject(stepnames[step].Data()));
809a4336 751 if(!cuts) return kTRUE;
3a72645a 752 TIter it(cuts);
809a4336 753 AliCFCutBase *mycut;
754 Bool_t status = kTRUE;
3a72645a 755 while((mycut = dynamic_cast<AliCFCutBase *>(it()))){
809a4336 756 status &= mycut->IsSelected(o);
757 }
809a4336 758 return status;
759}
e156c3bb 760
761
762//__________________________________________________________________
763Bool_t AliHFEcuts::CheckEventCuts(const char*namestep, TObject *o){
764 //
765 // Checks the cuts without using the correction framework manager
766 //
767 AliDebug(2, "Called\n");
768 TObjArray *cuts = dynamic_cast<TObjArray *>(fCutList->FindObject(namestep));
769 if(!cuts) return kTRUE;
770 TIter it(cuts);
771 AliCFCutBase *mycut;
772 Bool_t status = kTRUE;
773 while((mycut = dynamic_cast<AliCFCutBase *>(it()))){
774 status &= mycut->IsSelected(o);
775 }
776 return status;
777}
e17c1f86 778
779//__________________________________________________________________
780void AliHFEcuts::SetRecEvent(const AliVEvent *ev){
781 //
782 // Publish reconstructed event to the cuts
783 //
784 TIter cutsteps(fCutList);
785 TObjArray *cutstep;
786 AliCFCutBase *cut;
787 while((cutstep = dynamic_cast<TObjArray *>(cutsteps()))){
788 TIter cutIter(cutstep);
789 while((cut = dynamic_cast<AliCFCutBase *>(cutIter()))){
790 cut->SetRecEventInfo(ev);
791 }
792 }
793}
794
795//__________________________________________________________________
796void AliHFEcuts::SetMCEvent(const AliMCEvent *ev){
797 //
798 // Publish reconstructed event to the cuts
799 //
800 TIter cutsteps(fCutList);
801 TObjArray *cutstep;
802 AliCFCutBase *cut;
803 while((cutstep = dynamic_cast<TObjArray *>(cutsteps()))){
804 TIter cutIter(cutstep);
805 while((cut = dynamic_cast<AliCFCutBase *>(cutIter()))){
806 cut->SetMCEventInfo(ev);
807 }
808 }
809}