]> git.uio.no Git - u/mrichter/AliRoot.git/blame_incremental - PWGHF/hfe/AliHFEcuts.cxx
Added new library (libPWGLFthermalfits)
[u/mrichter/AliRoot.git] / PWGHF / hfe / AliHFEcuts.cxx
... / ...
CommitLineData
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**************************************************************************/
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//
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//
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"
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"
70
71#include "AliHFEcuts.h"
72
73ClassImp(AliHFEcuts)
74
75const Char_t *AliHFEcuts::fgkMCCutName[AliHFEcuts::kNcutStepsMCTrack] = {
76 "MCGenerated",
77 "MCGeneratedZOutNoPileUpCentralityFine",
78 "MCGeneratedEventCut",
79 "MCInAcceptance"
80};
81
82const Char_t * AliHFEcuts::fgkRecoCutName[AliHFEcuts::kNcutStepsRecTrack] = {
83 "NoCuts",
84 "RecKineITSTPC",
85 "Primary",
86 "HFEITS",
87 "HFETOF",
88 "HFETPC",
89 "HFETRD"
90};
91
92const Char_t * AliHFEcuts::fgkDECutName[AliHFEcuts::kNcutStepsDETrack] = {
93 "HFEDCA"
94};
95
96const Char_t * AliHFEcuts::fgkSecvtxCutName[AliHFEcuts::kNcutStepsSecvtxTrack] = {
97 "HFESecvtx"
98};
99
100const Char_t * AliHFEcuts::fgkEventCutName[AliHFEcuts::kNcutStepsEvent] = {
101 "EventStepGenerated",
102 "EventStepRecNoCut",
103 "EventStepRecNoPileUp",
104 "EventStepRecCentralityOK",
105 "EventStepZRange",
106 "EventStepReconstructed"
107};
108
109const Char_t * AliHFEcuts::fgkUndefined = "Undefined";
110
111//__________________________________________________________________
112AliHFEcuts::AliHFEcuts():
113 TNamed(),
114 fRequirements(0),
115 fTPCclusterDef(0),
116 fTPCratioDef(0),
117 fMinClustersTPC(0),
118 fMinClustersTPCPID(0),
119 fMinClustersITS(0),
120 fMinTrackletsTRD(0),
121 fMaxChi2TRD(-1.),
122 fCutITSPixel(0),
123 fCheckITSLayerStatus(kTRUE),
124 fCutITSDrift(0),
125 fMaxChi2clusterITS(-1.),
126 fMaxChi2clusterTPC(0.),
127 fMinClusterRatioTPC(0.),
128 fVertexRangeZ(20.),
129 fTRDtrackletsExact(kFALSE),
130 fTOFPIDStep(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),
141 fIsIPcharge(kFALSE),
142 fIsIPOpp(kFALSE),
143 fFractionOfSharedTPCClusters(-1.0),
144 fMaxImpactParameterRpar(kFALSE),
145 fAdditionalStatusRequirement(0),
146 fTOFsignaldx(-1.0),
147 fTOFsignaldz(-1.0),
148 fAODFilterBit(-1),
149 fRejectKinkDaughters(kTRUE),
150 fRejectKinkMothers(kTRUE),
151 fHistQA(0x0),
152 fCutList(0x0),
153 fDebugLevel(0)
154{
155 //
156 // Dummy Constructor
157 //
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.;
166}
167
168//__________________________________________________________________
169AliHFEcuts::AliHFEcuts(const Char_t *name, const Char_t *title):
170 TNamed(name, title),
171 fRequirements(0),
172 fTPCclusterDef(0),
173 fTPCratioDef(0),
174 fMinClustersTPC(0),
175 fMinClustersTPCPID(0),
176 fMinClustersITS(0),
177 fMinTrackletsTRD(0),
178 fMaxChi2TRD(-1.),
179 fCutITSPixel(0),
180 fCheckITSLayerStatus(kTRUE),
181 fCutITSDrift(0),
182 fMaxChi2clusterITS(-1.),
183 fMaxChi2clusterTPC(0.),
184 fMinClusterRatioTPC(0.),
185 fVertexRangeZ(20.),
186 fTRDtrackletsExact(kFALSE),
187 fTOFPIDStep(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),
198 fIsIPcharge(kFALSE),
199 fIsIPOpp(kFALSE),
200 fFractionOfSharedTPCClusters(-1.0),
201 fMaxImpactParameterRpar(kFALSE),
202 fAdditionalStatusRequirement(0),
203 fTOFsignaldx(-1.0),
204 fTOFsignaldz(-1.0),
205 fAODFilterBit(-1),
206 fRejectKinkDaughters(kTRUE),
207 fRejectKinkMothers(kTRUE),
208 fHistQA(0x0),
209 fCutList(0x0),
210 fDebugLevel(0)
211{
212 //
213 // Default Constructor
214 //
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.;
223}
224
225//__________________________________________________________________
226AliHFEcuts::AliHFEcuts(const AliHFEcuts &c):
227 TNamed(c),
228 fRequirements(c.fRequirements),
229 fTPCclusterDef(c.fTPCclusterDef),
230 fTPCratioDef(c.fTPCratioDef),
231 fMinClustersTPC(0),
232 fMinClustersTPCPID(0),
233 fMinClustersITS(0),
234 fMinTrackletsTRD(0),
235 fMaxChi2TRD(-1.),
236 fCutITSPixel(0),
237 fCheckITSLayerStatus(0),
238 fCutITSDrift(0),
239 fMaxChi2clusterITS(-1.),
240 fMaxChi2clusterTPC(0),
241 fMinClusterRatioTPC(0),
242 fVertexRangeZ(20.),
243 fTRDtrackletsExact(kFALSE),
244 fTOFPIDStep(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),
255 fIsIPcharge(kFALSE),
256 fIsIPOpp(kFALSE),
257 fFractionOfSharedTPCClusters(-1.0),
258 fMaxImpactParameterRpar(kFALSE),
259 fAdditionalStatusRequirement(0),
260 fTOFsignaldx(-1.0),
261 fTOFsignaldz(-1.0),
262 fAODFilterBit(-1),
263 fRejectKinkDaughters(c.fRejectKinkDaughters),
264 fRejectKinkMothers(c.fRejectKinkMothers),
265 fHistQA(0x0),
266 fCutList(0x0),
267 fDebugLevel(0)
268{
269 //
270 // Copy Constructor
271 //
272 c.Copy(*this);
273}
274
275//__________________________________________________________________
276AliHFEcuts &AliHFEcuts::operator=(const AliHFEcuts &c){
277 //
278 // Make assignment
279 //
280 if(&c != this) c.Copy(*this);
281 return *this;
282}
283
284//__________________________________________________________________
285void AliHFEcuts::Copy(TObject &c) const {
286 //
287 // Performing copy
288 //
289 AliHFEcuts &target = dynamic_cast<AliHFEcuts &>(c);
290
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;
328
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);
337
338 // Copy cut List
339 if(target.fCutList){
340 target.fCutList->Clear();
341 delete target.fCutList;
342 }
343 if(fCutList){
344 target.fCutList = dynamic_cast<TObjArray *>(fCutList->Clone());
345 if(target.fCutList) target.fCutList->SetOwner(); // Coverity
346 }
347 if(target.fHistQA){
348 delete target.fHistQA;
349 }
350 if(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()))){
359 TIter cit1(clist);
360 while((co = dynamic_cast<AliCFCutBase *>(cit1()))) co->SetQAOn(target.fHistQA);
361 }
362 }
363}
364
365//__________________________________________________________________
366AliHFEcuts::~AliHFEcuts(){
367 //
368 // Destruktor
369 //
370 if(fCutList){
371 fCutList->Delete();
372 delete fCutList;
373 }
374 fCutList = 0x0;
375 if(fHistQA) delete fHistQA;
376}
377
378//__________________________________________________________________
379Long64_t AliHFEcuts::Merge(const TCollection *list){
380 //
381 // Merge function doing nothing, just writing the object to file
382 //
383 if(!list) return 0;
384 if(list->IsEmpty()) return 1;
385 Long64_t counts = 0;
386 // just count the number of objects to merge
387 TIter iter(list);
388 while(iter()){ counts++; }
389 return counts+1;
390}
391
392//__________________________________________________________________
393void AliHFEcuts::Initialize(AliCFManager *cfm){
394 //
395 // Initializes the cut objects from the correction framework
396 // Publishes the cuts to the correction framework manager
397 //
398 AliDebug(2, "Called");
399 const Int_t kMCOffset = kNcutStepsMCTrack;
400 const Int_t kRecOffset = kNcutStepsRecTrack;
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(kTRUE);
411 }
412
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();
423
424 // Publish to the cuts which analysis type they are (ESD Analysis by default)
425 if(IsAOD()){
426 AliInfo("Setting AOD Analysis");
427 TObjArray *genCuts = dynamic_cast<TObjArray *>(fCutList->FindObject("fPartGenCuts"));
428 if(genCuts){
429 AliCFParticleGenCuts *myGenCut = dynamic_cast<AliCFParticleGenCuts *>(genCuts->FindObject("fCutsGenMC"));
430 if(myGenCut) {
431 myGenCut->SetAODMC(kTRUE);
432 }
433 }
434 }
435
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")));
441
442 // Connect the particle cuts
443 // 1st MC
444 cfm->SetParticleCutsList(kStepMCGenerated, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartGenCuts")));
445 cfm->SetParticleCutsList(kStepMCInAcceptance, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartAccCuts")));
446 // 2nd Reco
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")));
454
455}
456
457//__________________________________________________________________
458void AliHFEcuts::Initialize(){
459 // Call all the setters for the cuts
460 AliDebug(2, "Called\n");
461 if(fCutList)
462 fCutList->Delete();
463 else{
464 fCutList = new TObjArray;
465 fCutList->SetOwner();
466 }
467 if(IsQAOn()){
468 fHistQA = new TList;
469 fHistQA->SetName(Form("%s_CutQAhistograms", GetName()));
470 fHistQA->SetOwner(kFALSE);
471 }
472 SetParticleGenCutList();
473 SetAcceptanceCutList();
474 SetRecKineITSTPCCutList();
475 SetRecPrimaryCutList();
476 SetHFElectronITSCuts();
477 SetHFElectronTOFCuts();
478 SetHFElectronTPCCuts();
479 SetHFElectronTRDCuts();
480 SetHFElectronDcaCuts();
481
482 // Publish to the cuts which analysis type they are (ESD Analysis by default)
483 if(IsAOD()){
484 //printf("Initialize AOD\n");
485 //AliInfo("Setting AOD Analysis");
486 TObjArray *genCuts = dynamic_cast<TObjArray *>(fCutList->FindObject("fPartGenCuts"));
487 if(genCuts){
488 AliCFParticleGenCuts *myGenCut = dynamic_cast<AliCFParticleGenCuts *>(genCuts->FindObject("fCutsGenMC"));
489 if(myGenCut) {
490 myGenCut->SetAODMC(kTRUE);
491 //printf("Set AOD MC\n");
492 }
493 }
494 }
495
496 // Connect the event cuts
497 SetEventCutList(kEventStepGenerated);
498 SetEventCutList(kEventStepReconstructed);
499
500
501}
502
503//__________________________________________________________________
504void AliHFEcuts::SetEventCutList(Int_t istep){
505 //
506 // Cuts for Event Selection
507 //
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);
518
519 arr->SetName("fEvGenCuts");
520 arr->AddLast(evGenCuts);
521 } else {
522
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);
535
536 }
537 fCutList->AddLast(arr);
538}
539
540//__________________________________________________________________
541void AliHFEcuts::SetParticleGenCutList(){
542 //
543 // Initialize Particle Cuts for Monte Carlo Tracks
544 // Production Vertex Radius: < 3cm
545 // Particle Species: Electrons
546 // Eta: < 0.8 (fEtaRange)
547 //
548
549 TObjArray *mcCuts = new TObjArray;
550 mcCuts->SetName("fPartGenCuts");
551
552 //
553 AliDebug(2, "Called\n");
554 AliCFParticleGenCuts *genCuts = new AliCFParticleGenCuts("fCutsGenMC", "Particle Generation Cuts");
555 genCuts->SetRequireIsCharged();
556 if(IsRequirePrimary()) {
557 genCuts->SetRequireIsPrimary();
558 }
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]));
561 //if(!IsAOD()) {
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
566 //}
567 //else {
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]));
571 //}
572 }
573 genCuts->SetRequirePdgCode(11, kTRUE);
574 if(IsQAOn()) genCuts->SetQAOn(fHistQA);
575
576 // Add
577 mcCuts->AddLast(genCuts);
578
579 //
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);
588 }
589
590 fCutList->AddLast(mcCuts);
591}
592
593//__________________________________________________________________
594void AliHFEcuts::SetAcceptanceCutList(){
595 //
596 // Initialize Particle (Monte Carlo) acceptance cuts
597 // Min. Required Hist for Detectors:
598 // ITS [3]
599 // TPC [2]
600 // TRD [2*nTracklets]
601 // TOF [0]
602 //
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);
609
610 TObjArray *partAccCuts = new TObjArray();
611 partAccCuts->SetName("fPartAccCuts");
612 partAccCuts->AddLast(accCuts);
613 fCutList->AddLast(partAccCuts);
614}
615
616//__________________________________________________________________
617void AliHFEcuts::SetRecKineITSTPCCutList(){
618 //
619 // Track Kinematics and Quality cuts (Based on the Standard cuts from PWG0)
620 //
621 // ITS refit
622 // Variances:
623 // y: 2
624 // z: 2
625 // sin(phi): 0.5
626 // tan(theta): 0.5
627 // 1/pt: 2
628 // Min. Number of Clusters:
629 // TPC: 50
630 // RefitRequired:
631 // TPC
632 // Chi2 per TPC cluster: 3.5
633 //
634 // Kinematics:
635 // Momentum Range: 100MeV - 20GeV
636 // Eta: < 0.9 (TRD-TOF acceptance)
637 //
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;
647 else
648 statusRequirement = kStatusSelectionDefault;
649 trackQuality->SetStatus(statusRequirement);
650 //trackQuality->SetMaxCovDiagonalElements(2., 2., 0.5, 0.5, 2);
651
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);
662
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]);
669
670 if(IsQAOn()){
671 trackQuality->SetQAOn(fHistQA);
672 hfecuts->SetQAOn(fHistQA);
673 kineCuts->SetQAOn(fHistQA);
674 }
675
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);
682}
683
684//__________________________________________________________________
685void AliHFEcuts::SetRecPrimaryCutList(){
686 //
687 // Primary cuts (based on standard cuts from PWG0):
688 // DCA to Vertex:
689 // XY: 3. cm
690 // Z: 10. cm
691 // No Kink daughters
692 //
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]);
699 //}
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]);
705 }
706 //primaryCut->SetAcceptKinkDaughters(kFALSE);
707 if(IsQAOn()) primaryCut->SetQAOn(fHistQA);
708
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]);
716 }
717
718 TObjArray *primCuts = new TObjArray;
719 primCuts->SetName("fPartPrimCuts");
720 // needed for AOD...
721 if(IsRequireSigmaToVertex()) primCuts->AddLast(primaryCut);
722 //if(fMaxImpactParameterRpar){
723 primCuts->AddLast(hfecuts);
724 //}
725 fCutList->AddLast(primCuts);
726}
727
728//__________________________________________________________________
729void AliHFEcuts::SetHFElectronITSCuts(){
730 //
731 // Special Cuts introduced by the HFElectron Group: ITS
732 //
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);
738 }
739 if(IsRequireITSdrift()){
740 hfecuts->SetRequireITSdrift(AliHFEextraCuts::ITSDrift_t(fCutITSDrift));
741 }
742
743 if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
744 hfecuts->SetDebugLevel(fDebugLevel);
745
746 TObjArray *hfeCuts = new TObjArray;
747 hfeCuts->SetName("fPartHFECutsITS");
748 hfeCuts->AddLast(hfecuts);
749 fCutList->AddLast(hfeCuts);
750}
751
752//__________________________________________________________________
753void AliHFEcuts::SetHFElectronTOFCuts(){
754 //
755 // Special Cuts introduced by the HFElectron Group: TRD
756 //
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);
765
766 TObjArray *hfeCuts = new TObjArray;
767 hfeCuts->SetName("fPartHFECutsTOF");
768 hfeCuts->AddLast(hfecuts);
769 fCutList->AddLast(hfeCuts);
770}
771
772//__________________________________________________________________
773void AliHFEcuts::SetHFElectronTPCCuts(){
774 //
775 // Special Cuts introduced by the HFElectron Group: TPC
776 //
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);
782
783 TObjArray *hfeCuts = new TObjArray;
784 hfeCuts->SetName("fPartHFECutsTPC");
785 hfeCuts->AddLast(hfecuts);
786 fCutList->AddLast(hfeCuts);
787}
788
789
790//__________________________________________________________________
791void AliHFEcuts::SetHFElectronTRDCuts(){
792 //
793 // Special Cuts introduced by the HFElectron Group: TRD
794 //
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);
798 if(fMaxChi2TRD >= 0)
799 hfecuts->SetMaxChi2TRD(fMaxChi2TRD);
800
801 if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
802 hfecuts->SetDebugLevel(fDebugLevel);
803
804 TObjArray *hfeCuts = new TObjArray;
805 hfeCuts->SetName("fPartHFECutsTRD");
806 hfeCuts->AddLast(hfecuts);
807 fCutList->AddLast(hfeCuts);
808}
809
810//__________________________________________________________________
811void AliHFEcuts::SetHFElectronDcaCuts(){
812 //
813 // Special Cuts introduced by the HFElectron Group: minimum of impact parameter
814 //
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);
820
821 TObjArray *hfeCuts = new TObjArray;
822 hfeCuts->SetName("fPartHFECutsDca");
823 hfeCuts->AddLast(hfecuts);
824 fCutList->AddLast(hfeCuts);
825}
826
827//__________________________________________________________________
828Bool_t AliHFEcuts::CheckParticleCuts(UInt_t step, TObject *o){
829 //
830 // Checks the cuts without using the correction framework manager
831 //
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;
837 TIter it(cuts);
838 AliCFCutBase *mycut;
839 Bool_t status = kTRUE;
840 while((mycut = dynamic_cast<AliCFCutBase *>(it()))){
841 status &= mycut->IsSelected(o);
842 }
843 return status;
844}
845
846
847//__________________________________________________________________
848Bool_t AliHFEcuts::CheckEventCuts(const char*namestep, TObject *o){
849 //
850 // Checks the cuts without using the correction framework manager
851 //
852 AliDebug(2, "Called\n");
853 TObjArray *cuts = dynamic_cast<TObjArray *>(fCutList->FindObject(namestep));
854 if(!cuts) return kTRUE;
855 TIter it(cuts);
856 AliCFCutBase *mycut;
857 Bool_t status = kTRUE;
858 while((mycut = dynamic_cast<AliCFCutBase *>(it()))){
859 status &= mycut->IsSelected(o);
860 }
861 return status;
862}
863
864//__________________________________________________________________
865void AliHFEcuts::SetRecEvent(const AliVEvent *ev){
866 //
867 // Publish reconstructed event to the cuts
868 //
869 TIter cutsteps(fCutList);
870 TObjArray *cutstep;
871 AliCFCutBase *cut;
872 while((cutstep = dynamic_cast<TObjArray *>(cutsteps()))){
873 TIter cutIter(cutstep);
874 while((cut = dynamic_cast<AliCFCutBase *>(cutIter()))){
875 cut->SetRecEventInfo(ev);
876 }
877 }
878}
879
880//__________________________________________________________________
881void AliHFEcuts::SetMCEvent(const AliVEvent *ev){
882 //
883 // Publish reconstructed event to the cuts
884 //
885 TIter cutsteps(fCutList);
886 TObjArray *cutstep;
887 AliCFCutBase *cut;
888 while((cutstep = dynamic_cast<TObjArray *>(cutsteps()))){
889 TIter cutIter(cutstep);
890 while((cut = dynamic_cast<AliCFCutBase *>(cutIter()))){
891 cut->SetMCEventInfo(ev);
892 }
893 }
894}