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>
29 #include <TObjArray.h>
32 #include "AliCFAcceptanceCuts.h"
33 #include "AliCFCutBase.h"
34 #include "AliCFEventGenCuts.h"
35 #include "AliCFEventRecCuts.h"
36 #include "AliCFManager.h"
37 #include "AliCFParticleGenCuts.h"
38 #include "AliCFTrackIsPrimaryCuts.h"
39 #include "AliCFTrackKineCuts.h"
40 #include "AliCFTrackQualityCuts.h"
41 #include "AliESDtrack.h"
43 #include "AliHFEcuts.h"
47 //__________________________________________________________________
48 AliHFEcuts::AliHFEcuts():
53 fCheckITSLayerStatus(kTRUE),
54 fMaxChi2clusterTPC(0.),
55 fMinClusterRatioTPC(0.),
62 // Default Constructor
64 memset(fProdVtx, 0, sizeof(Double_t) * 4);
65 memset(fDCAtoVtx, 0, sizeof(Double_t) * 2);
66 memset(fPtRange, 0, sizeof(Double_t) * 2);
67 fCutList = new TObjArray();
71 //__________________________________________________________________
72 AliHFEcuts::AliHFEcuts(const AliHFEcuts &c):
74 fRequirements(c.fRequirements),
75 fMinClustersTPC(c.fMinClustersTPC),
76 fMinTrackletsTRD(c.fMinTrackletsTRD),
77 fCutITSPixel(c.fCutITSPixel),
78 fCheckITSLayerStatus(c.fCheckITSLayerStatus),
79 fMaxChi2clusterTPC(c.fMaxChi2clusterTPC),
80 fMinClusterRatioTPC(c.fMinClusterRatioTPC),
81 fSigmaToVtx(c.fSigmaToVtx),
89 memcpy(fProdVtx, c.fProdVtx, sizeof(Double_t) * 4);
90 memcpy(fDCAtoVtx, c.fDCAtoVtx, sizeof(Double_t) * 4);
91 memcpy(fPtRange, c.fPtRange, sizeof(Double_t) *2);
92 fCutList = dynamic_cast<TObjArray *>(c.fCutList->Clone());
96 //__________________________________________________________________
97 AliHFEcuts::~AliHFEcuts(){
106 if(fHistQA) fHistQA->Clear();
110 //__________________________________________________________________
111 void AliHFEcuts::Initialize(AliCFManager *cfm){
113 // Initializes the cut objects from the correction framework
114 // Publishes the cuts to the correction framework manager
118 fHistQA->SetName("CutQAhistograms");
119 fHistQA->SetOwner(kFALSE);
122 // Call all the setters for the cuts
123 SetParticleGenCutList();
124 SetAcceptanceCutList();
125 SetRecKineITSTPCCutList();
126 SetRecPrimaryCutList();
127 SetHFElectronITSCuts();
128 SetHFElectronTRDCuts();
130 // Connect the event cuts
131 SetEventCutList(kEventStepGenerated);
132 SetEventCutList(kEventStepReconstructed);
133 cfm->SetEventCutsList(kEventStepGenerated, dynamic_cast<TObjArray *>(fCutList->FindObject("fEvGenCuts")));
134 cfm->SetEventCutsList(kEventStepReconstructed, dynamic_cast<TObjArray *>(fCutList->FindObject("fEvRecCuts")));
136 // Connect the particle cuts
137 cfm->SetParticleCutsList(kStepMCGenerated, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartGenCuts")));
138 cfm->SetParticleCutsList(kStepMCInAcceptance, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartAccCuts")));
139 cfm->SetParticleCutsList(kStepRecKineITSTPC, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartRecKineITSTPCCuts")));
140 cfm->SetParticleCutsList(kStepRecPrim, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartPrimCuts")));
141 cfm->SetParticleCutsList(kStepHFEcutsITS, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsITS")));
142 cfm->SetParticleCutsList(kStepHFEcutsTRD, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsTRD")));
146 //__________________________________________________________________
147 void AliHFEcuts::Initialize(){
148 // Call all the setters for the cuts
149 SetParticleGenCutList();
150 SetAcceptanceCutList();
151 SetRecKineITSTPCCutList();
152 SetRecPrimaryCutList();
153 SetHFElectronITSCuts();
154 SetHFElectronTRDCuts();
158 //__________________________________________________________________
159 void AliHFEcuts::SetEventCutList(Int_t istep){
161 // Cuts for Event Selection
163 TObjArray *arr = new TObjArray;
164 if(istep == kEventStepGenerated){
165 AliCFEventGenCuts *evGenCuts = new AliCFEventGenCuts("fCutsEvGen", "Event Generated cuts");
166 evGenCuts->SetNTracksCut(1);
167 evGenCuts->SetRequireVtxCuts(kTRUE);
168 evGenCuts->SetVertexXCut(-1, 1);
169 evGenCuts->SetVertexYCut(-1, 1);
170 evGenCuts->SetVertexZCut(-30, 30);
172 arr->SetName("fEvGenCuts");
173 arr->AddLast(evGenCuts);
175 AliCFEventRecCuts *evRecCuts = new AliCFEventRecCuts("fCutsEvRec", "Event Reconstructed cuts");
176 evRecCuts->SetUseSPDVertex();
177 evRecCuts->SetNTracksCut(1);
178 evRecCuts->SetRequireVtxCuts(kTRUE);
179 evRecCuts->SetVertexXCut(-1, 1);
180 evRecCuts->SetVertexYCut(-1, 1);
181 evRecCuts->SetVertexZCut(-30, 30);
184 arr->SetName("fEvRecCuts");
185 arr->AddLast(evRecCuts);
187 fCutList->AddLast(arr);
190 //__________________________________________________________________
191 void AliHFEcuts::SetParticleGenCutList(){
193 // Initialize Particle Cuts for Monte Carlo Tracks
194 // Production Vertex: < 1cm (Beampipe)
195 // Particle Species: Electrons
196 // Eta: < 0.9 (TRD-TOF acceptance)
198 AliCFParticleGenCuts *genCuts = new AliCFParticleGenCuts("fCutsGenMC", "Particle Generation Cuts");
199 genCuts->SetRequireIsCharged();
200 if(IsRequirePrimary()) genCuts->SetRequireIsPrimary();
201 if(IsRequireProdVertex()){
202 genCuts->SetProdVtxRangeX(fProdVtx[0], fProdVtx[1]);
203 genCuts->SetProdVtxRangeY(fProdVtx[2], fProdVtx[3]);
205 genCuts->SetRequirePdgCode(11, kTRUE);
207 AliCFTrackKineCuts *kineMCcuts = new AliCFTrackKineCuts("fCutsKineMC","MC Kine Cuts");
208 kineMCcuts->SetPtRange(fPtRange[0], fPtRange[1]);
209 kineMCcuts->SetEtaRange(-0.9, 0.9);
212 genCuts->SetQAOn(fHistQA);
213 kineMCcuts->SetQAOn(fHistQA);
216 TObjArray *mcCuts = new TObjArray;
217 mcCuts->SetName("fPartGenCuts");
218 mcCuts->AddLast(genCuts);
219 mcCuts->AddLast(kineMCcuts);
220 fCutList->AddLast(mcCuts);
223 //__________________________________________________________________
224 void AliHFEcuts::SetAcceptanceCutList(){
226 // Initialize Particle (Monte Carlo) acceptance cuts
227 // Min. Required Hist for Detectors:
230 // TRD [2*nTracklets]
233 AliCFAcceptanceCuts *accCuts = new AliCFAcceptanceCuts("fCutsAccMC", "MC Acceptance Cuts");
234 accCuts->SetMinNHitITS(3);
235 accCuts->SetMinNHitTPC(2);
236 accCuts->SetMinNHitTRD(2*fMinTrackletsTRD);
237 if(IsInDebugMode()) accCuts->SetQAOn(fHistQA);
239 TObjArray *partAccCuts = new TObjArray();
240 partAccCuts->SetName("fPartAccCuts");
241 partAccCuts->AddLast(accCuts);
242 fCutList->AddLast(partAccCuts);
245 //__________________________________________________________________
246 void AliHFEcuts::SetRecKineITSTPCCutList(){
248 // Track Kinematics and Quality cuts (Based on the Standard cuts from PWG0)
257 // Min. Number of Clusters:
261 // Chi2 per TPC cluster: 3.5
264 // Momentum Range: 100MeV - 20GeV
265 // Eta: < 0.9 (TRD-TOF acceptance)
267 AliCFTrackQualityCuts *trackQuality = new AliCFTrackQualityCuts("fCutsQualityRec","REC Track Quality Cuts");
268 trackQuality->SetMinNClusterTPC(fMinClustersTPC);
269 trackQuality->SetMaxChi2PerClusterTPC(fMaxChi2clusterTPC);
270 trackQuality->SetStatus(AliESDtrack::kTPCrefit | AliESDtrack::kITSrefit);
271 trackQuality->SetMaxCovDiagonalElements(2., 2., 0.5, 0.5, 2);
273 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTPC","Extra cuts from the HFE group");
274 if(fMinClusterRatioTPC > 0.) hfecuts->SetClusterRatioTPC(fMinClusterRatioTPC);
275 hfecuts->SetDebugLevel(fDebugLevel);
277 AliCFTrackKineCuts *kineCuts = new AliCFTrackKineCuts("fCutsKineRec", "REC Kine Cuts");
278 kineCuts->SetPtRange(fPtRange[0], fPtRange[1]);
279 kineCuts->SetEtaRange(-0.9, 0.9);
282 trackQuality->SetQAOn(fHistQA);
283 hfecuts->SetQAOn(fHistQA);
284 kineCuts->SetQAOn(fHistQA);
287 TObjArray *recCuts = new TObjArray;
288 recCuts->SetName("fPartRecKineITSTPCCuts");
289 recCuts->AddLast(trackQuality);
290 recCuts->AddLast(hfecuts);
291 recCuts->AddLast(kineCuts);
292 fCutList->AddLast(recCuts);
295 //__________________________________________________________________
296 void AliHFEcuts::SetRecPrimaryCutList(){
298 // Primary cuts (based on standard cuts from PWG0):
304 AliCFTrackIsPrimaryCuts *primaryCut = new AliCFTrackIsPrimaryCuts("fCutsPrimaryCuts", "REC Primary Cuts");
305 if(IsRequireDCAToVertex()){
306 //primaryCut->SetDCAToVertex2D(kTRUE);
307 primaryCut->SetMaxDCAToVertexXY(fDCAtoVtx[0]);
308 primaryCut->SetMaxDCAToVertexZ(fDCAtoVtx[1]);
310 if(IsRequireSigmaToVertex()){
311 primaryCut->SetRequireSigmaToVertex(kTRUE);
312 primaryCut->SetMaxNSigmaToVertex(fSigmaToVtx);
314 primaryCut->SetAcceptKinkDaughters(kFALSE);
315 if(IsInDebugMode()) primaryCut->SetQAOn(fHistQA);
317 TObjArray *primCuts = new TObjArray;
318 primCuts->SetName("fPartPrimCuts");
319 primCuts->AddLast(primaryCut);
320 fCutList->AddLast(primCuts);
323 //__________________________________________________________________
324 void AliHFEcuts::SetHFElectronITSCuts(){
326 // Special Cuts introduced by the HFElectron Group: ITS
328 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupPixels","Extra cuts from the HFE group");
329 if(IsRequireITSpixel()){
330 hfecuts->SetRequireITSpixel(AliHFEextraCuts::ITSPixel_t(fCutITSPixel));
331 hfecuts->SetCheckITSstatus(fCheckITSLayerStatus);
334 if(IsInDebugMode()) hfecuts->SetQAOn(fHistQA);
335 hfecuts->SetDebugLevel(fDebugLevel);
337 TObjArray *hfeCuts = new TObjArray;
338 hfeCuts->SetName("fPartHFECutsITS");
339 hfeCuts->AddLast(hfecuts);
340 fCutList->AddLast(hfeCuts);
343 //__________________________________________________________________
344 void AliHFEcuts::SetHFElectronTRDCuts(){
346 // Special Cuts introduced by the HFElectron Group: TRD
348 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTRD","Extra cuts from the HFE group");
349 if(fMinTrackletsTRD > 0.) hfecuts->SetMinTrackletsTRD(fMinTrackletsTRD);
350 if(IsInDebugMode()) hfecuts->SetQAOn(fHistQA);
351 hfecuts->SetDebugLevel(fDebugLevel);
353 TObjArray *hfeCuts = new TObjArray;
354 hfeCuts->SetName("fPartHFECutsTRD");
355 hfeCuts->AddLast(hfecuts);
356 fCutList->AddLast(hfeCuts);
359 //__________________________________________________________________
360 void AliHFEcuts::SetDebugMode(){
364 SetBit(kDebugMode, kTRUE);
367 //__________________________________________________________________
368 Bool_t AliHFEcuts::CheckParticleCuts(CutStep_t step, TObject *o){
370 // Checks the cuts without using the correction framework manager
372 TString stepnames[kNcutSteps] = {"fPartGenCuts", "fPartAccCuts", "fPartRecCuts", "fPartPrimCuts", "fPartHFECuts"};
373 TObjArray *cuts = dynamic_cast<TObjArray *>(fCutList->FindObject(stepnames[step].Data()));
374 if(!cuts) return kTRUE;
375 TIterator *it = cuts->MakeIterator();
377 Bool_t status = kTRUE;
378 while((mycut = dynamic_cast<AliCFCutBase *>(it->Next()))){
379 status &= mycut->IsSelected(o);