1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
16 // Cut menagement class implemented by the
17 // ALICE Heavy Flavour Electron Group
18 // Interface to the correction framework
19 // Provides a set of standard cuts
22 // Raphaelle Bailhache <R.Bailhache@gsi.de>
23 // Markus Fasel <M.Fasel@gsi.de>
24 // Markus Heide <mheide@uni-muenster.de>
25 // Matus Kalisky <m.kalisky@uni-muenster.de>
27 // Overview over the 18 steps in the correction Framework
28 // 0. Generated Electrons
29 // 1. Signal Electrons
30 // 2. Electron in Acceptance
31 // ------------------------------------------------------------
32 // 3. Rec without cuts (MC information)
33 // 4. Rec Kine ITS/TPC (MC Information)
34 // 5. Rec Primary (MC Information)
35 // 6. HFE ITS (MC Information)
36 // 7. HFE TRD (MC Information)
37 // 8. PID (MC Information)
38 // ............................................................
39 // 9. Rec without cuts(MC Information for tracks which are already registered)
40 // 10. Rec Kine ITS/TPC (MC Information for tracks which are already registered)
41 // 11. RecPrimary (MC Information for tracks which are already registered)
42 // 12. HFE ITS (MC Information for tracks which are already registered)
43 // 13. HFE TPC (MC Information for tracks which are already registered)
44 // 14. PID (MC Information for tracks which are already registered)
45 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
46 // 15. Rec without cuts
47 // 16. Rec Kine ITS/TPC
55 #include <TObjArray.h>
58 #include "AliCFAcceptanceCuts.h"
59 #include "AliCFCutBase.h"
60 #include "AliCFEventGenCuts.h"
61 #include "AliCFEventRecCuts.h"
62 #include "AliCFManager.h"
63 #include "AliCFParticleGenCuts.h"
64 #include "AliCFTrackIsPrimaryCuts.h"
65 #include "AliCFTrackKineCuts.h"
66 #include "AliCFTrackQualityCuts.h"
67 #include "AliESDtrack.h"
69 #include "AliHFEcuts.h"
73 //__________________________________________________________________
74 AliHFEcuts::AliHFEcuts():
79 fCheckITSLayerStatus(kTRUE),
80 fMaxChi2clusterTPC(0.),
81 fMinClusterRatioTPC(0.),
88 // Default Constructor
90 memset(fProdVtx, 0, sizeof(Double_t) * 4);
91 memset(fDCAtoVtx, 0, sizeof(Double_t) * 2);
92 memset(fPtRange, 0, sizeof(Double_t) * 2);
93 fCutList = new TObjArray();
97 //__________________________________________________________________
98 AliHFEcuts::AliHFEcuts(const AliHFEcuts &c):
100 fRequirements(c.fRequirements),
101 fMinClustersTPC(c.fMinClustersTPC),
102 fMinTrackletsTRD(c.fMinTrackletsTRD),
103 fCutITSPixel(c.fCutITSPixel),
104 fCheckITSLayerStatus(c.fCheckITSLayerStatus),
105 fMaxChi2clusterTPC(c.fMaxChi2clusterTPC),
106 fMinClusterRatioTPC(c.fMinClusterRatioTPC),
107 fSigmaToVtx(c.fSigmaToVtx),
115 memcpy(fProdVtx, c.fProdVtx, sizeof(Double_t) * 4);
116 memcpy(fDCAtoVtx, c.fDCAtoVtx, sizeof(Double_t) * 4);
117 memcpy(fPtRange, c.fPtRange, sizeof(Double_t) *2);
118 fCutList = dynamic_cast<TObjArray *>(c.fCutList->Clone());
119 fCutList->SetOwner();
122 //__________________________________________________________________
123 AliHFEcuts::~AliHFEcuts(){
132 if(fHistQA) fHistQA->Clear();
136 //__________________________________________________________________
137 void AliHFEcuts::Initialize(AliCFManager *cfm){
139 // Initializes the cut objects from the correction framework
140 // Publishes the cuts to the correction framework manager
142 AliDebug(2, "Called");
145 fHistQA->SetName("CutQAhistograms");
146 fHistQA->SetOwner(kFALSE);
149 // Call all the setters for the cuts
150 SetParticleGenCutList();
151 SetAcceptanceCutList();
152 SetRecKineITSTPCCutList();
153 SetRecPrimaryCutList();
154 SetHFElectronITSCuts();
155 SetHFElectronTRDCuts();
157 // Publish to the cuts which analysis type they are (ESD Analysis by default)
159 AliInfo("Setting AOD Analysis");
160 TObjArray *genCuts = dynamic_cast<TObjArray *>(fCutList->FindObject("fPartGenCuts"));
162 AliCFParticleGenCuts *myGenCut = dynamic_cast<AliCFParticleGenCuts *>(genCuts->FindObject("fCutsGenMC"));
163 if(myGenCut) myGenCut->SetAODMC(kTRUE);
167 // Connect the event cuts
168 SetEventCutList(kEventStepGenerated);
169 SetEventCutList(kEventStepReconstructed);
170 cfm->SetEventCutsList(kEventStepGenerated, dynamic_cast<TObjArray *>(fCutList->FindObject("fEvGenCuts")));
171 cfm->SetEventCutsList(kEventStepReconstructed, dynamic_cast<TObjArray *>(fCutList->FindObject("fEvRecCuts")));
173 // Connect the particle cuts
174 cfm->SetParticleCutsList(kStepMCGenerated, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartGenCuts")));
175 cfm->SetParticleCutsList(kStepMCInAcceptance, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartAccCuts")));
176 cfm->SetParticleCutsList(kStepRecKineITSTPC, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartRecKineITSTPCCuts")));
177 cfm->SetParticleCutsList(kStepRecPrim, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartPrimCuts")));
178 cfm->SetParticleCutsList(kStepHFEcutsITS, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsITS")));
179 cfm->SetParticleCutsList(kStepHFEcutsTRD, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsTRD")));
183 //__________________________________________________________________
184 void AliHFEcuts::Initialize(){
185 // Call all the setters for the cuts
186 AliDebug(2, "Called\n");
187 SetParticleGenCutList();
188 SetAcceptanceCutList();
189 SetRecKineITSTPCCutList();
190 SetRecPrimaryCutList();
191 SetHFElectronITSCuts();
192 SetHFElectronTRDCuts();
196 //__________________________________________________________________
197 void AliHFEcuts::SetEventCutList(Int_t istep){
199 // Cuts for Event Selection
201 AliDebug(2, "Called\n");
202 TObjArray *arr = new TObjArray;
203 if(istep == kEventStepGenerated){
204 AliCFEventGenCuts *evGenCuts = new AliCFEventGenCuts((Char_t *)"fCutsEvGen", (Char_t *)"Event Generated cuts");
205 evGenCuts->SetNTracksCut(1);
206 evGenCuts->SetRequireVtxCuts(kTRUE);
207 evGenCuts->SetVertexXCut(-1, 1);
208 evGenCuts->SetVertexYCut(-1, 1);
209 evGenCuts->SetVertexZCut(-10, 10);
211 arr->SetName("fEvGenCuts");
212 arr->AddLast(evGenCuts);
214 AliCFEventRecCuts *evRecCuts = new AliCFEventRecCuts((Char_t *)"fCutsEvRec", (Char_t *)"Event Reconstructed cuts");
215 evRecCuts->SetNTracksCut(1);
216 evRecCuts->SetRequireVtxCuts(kTRUE);
217 evRecCuts->SetVertexXCut(-1, 1);
218 evRecCuts->SetVertexYCut(-1, 1);
219 evRecCuts->SetVertexZCut(-30, 30);
222 arr->SetName("fEvRecCuts");
223 arr->AddLast(evRecCuts);
225 fCutList->AddLast(arr);
228 //__________________________________________________________________
229 void AliHFEcuts::SetParticleGenCutList(){
231 // Initialize Particle Cuts for Monte Carlo Tracks
232 // Production Vertex: < 1cm (Beampipe)
233 // Particle Species: Electrons
234 // Eta: < 0.9 (TRD-TOF acceptance)
237 TObjArray *mcCuts = new TObjArray;
238 mcCuts->SetName("fPartGenCuts");
241 AliDebug(2, "Called\n");
242 AliCFParticleGenCuts *genCuts = new AliCFParticleGenCuts("fCutsGenMC", "Particle Generation Cuts");
243 genCuts->SetRequireIsCharged();
244 if(IsRequirePrimary()) {
245 genCuts->SetRequireIsPrimary();
247 if(IsRequireProdVertex()){
248 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]));
249 genCuts->SetProdVtxRangeX(fProdVtx[0], fProdVtx[1]);
250 genCuts->SetProdVtxRangeY(fProdVtx[2], fProdVtx[3]);
251 genCuts->SetProdVtxRange2D(kTRUE); // Use ellipse
253 genCuts->SetRequirePdgCode(11, kTRUE);
254 if(IsInDebugMode()) genCuts->SetQAOn(fHistQA);
257 mcCuts->AddLast(genCuts);
260 if(IsRequireKineMCCuts()) {
261 AliCFTrackKineCuts *kineMCcuts = new AliCFTrackKineCuts((Char_t *)"fCutsKineMC", (Char_t *)"MC Kine Cuts");
262 kineMCcuts->SetPtRange(fPtRange[0], fPtRange[1]);
263 kineMCcuts->SetEtaRange(-0.8, 0.8);
264 if(IsInDebugMode()) kineMCcuts->SetQAOn(fHistQA);
265 mcCuts->AddLast(kineMCcuts);
268 fCutList->AddLast(mcCuts);
271 //__________________________________________________________________
272 void AliHFEcuts::SetAcceptanceCutList(){
274 // Initialize Particle (Monte Carlo) acceptance cuts
275 // Min. Required Hist for Detectors:
278 // TRD [2*nTracklets]
281 AliDebug(2, "Called\n");
282 AliCFAcceptanceCuts *accCuts = new AliCFAcceptanceCuts("fCutsAccMC", "MC Acceptance Cuts");
283 accCuts->SetMinNHitITS(3);
284 accCuts->SetMinNHitTPC(2);
285 accCuts->SetMinNHitTRD(2*fMinTrackletsTRD);
286 if(IsInDebugMode()) accCuts->SetQAOn(fHistQA);
288 TObjArray *partAccCuts = new TObjArray();
289 partAccCuts->SetName("fPartAccCuts");
290 partAccCuts->AddLast(accCuts);
291 fCutList->AddLast(partAccCuts);
294 //__________________________________________________________________
295 void AliHFEcuts::SetRecKineITSTPCCutList(){
297 // Track Kinematics and Quality cuts (Based on the Standard cuts from PWG0)
306 // Min. Number of Clusters:
310 // Chi2 per TPC cluster: 3.5
313 // Momentum Range: 100MeV - 20GeV
314 // Eta: < 0.9 (TRD-TOF acceptance)
316 AliDebug(2, "Called\n");
317 AliCFTrackQualityCuts *trackQuality = new AliCFTrackQualityCuts((Char_t *)"fCutsQualityRec", (Char_t *)"REC Track Quality Cuts");
318 trackQuality->SetMinNClusterITS(4);
319 trackQuality->SetMinNClusterTPC(fMinClustersTPC);
320 trackQuality->SetMaxChi2PerClusterTPC(fMaxChi2clusterTPC);
321 trackQuality->SetStatus(AliESDtrack::kTPCrefit | AliESDtrack::kITSrefit);
322 trackQuality->SetMaxCovDiagonalElements(2., 2., 0.5, 0.5, 2);
324 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTPC","Extra cuts from the HFE group");
325 if(fMinClusterRatioTPC > 0.) hfecuts->SetClusterRatioTPC(fMinClusterRatioTPC);
326 hfecuts->SetDebugLevel(fDebugLevel);
328 AliCFTrackKineCuts *kineCuts = new AliCFTrackKineCuts((Char_t *)"fCutsKineRec", (Char_t *)"REC Kine Cuts");
329 kineCuts->SetPtRange(fPtRange[0], fPtRange[1]);
330 kineCuts->SetEtaRange(-0.8, 0.8);
333 trackQuality->SetQAOn(fHistQA);
334 hfecuts->SetQAOn(fHistQA);
335 kineCuts->SetQAOn(fHistQA);
338 TObjArray *recCuts = new TObjArray;
339 recCuts->SetName("fPartRecKineITSTPCCuts");
340 recCuts->AddLast(trackQuality);
341 recCuts->AddLast(hfecuts);
342 recCuts->AddLast(kineCuts);
343 fCutList->AddLast(recCuts);
346 //__________________________________________________________________
347 void AliHFEcuts::SetRecPrimaryCutList(){
349 // Primary cuts (based on standard cuts from PWG0):
355 AliDebug(2, "Called\n");
356 AliCFTrackIsPrimaryCuts *primaryCut = new AliCFTrackIsPrimaryCuts((Char_t *)"fCutsPrimaryCuts", (Char_t *)"REC Primary Cuts");
357 if(IsRequireDCAToVertex()){
358 //primaryCut->SetDCAToVertex2D(kTRUE);
359 primaryCut->SetMaxDCAToVertexXY(fDCAtoVtx[0]);
360 primaryCut->SetMaxDCAToVertexZ(fDCAtoVtx[1]);
362 if(IsRequireSigmaToVertex()){
363 primaryCut->SetRequireSigmaToVertex(kTRUE);
364 primaryCut->SetMaxNSigmaToVertex(fSigmaToVtx);
366 primaryCut->SetAcceptKinkDaughters(kFALSE);
367 if(IsInDebugMode()) primaryCut->SetQAOn(fHistQA);
369 TObjArray *primCuts = new TObjArray;
370 primCuts->SetName("fPartPrimCuts");
371 primCuts->AddLast(primaryCut);
372 fCutList->AddLast(primCuts);
375 //__________________________________________________________________
376 void AliHFEcuts::SetHFElectronITSCuts(){
378 // Special Cuts introduced by the HFElectron Group: ITS
380 AliDebug(2, "Called\n");
381 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupPixels","Extra cuts from the HFE group");
382 if(IsRequireITSpixel()){
383 hfecuts->SetRequireITSpixel(AliHFEextraCuts::ITSPixel_t(fCutITSPixel));
384 hfecuts->SetCheckITSstatus(fCheckITSLayerStatus);
387 if(IsInDebugMode()) hfecuts->SetQAOn(fHistQA);
388 hfecuts->SetDebugLevel(fDebugLevel);
390 TObjArray *hfeCuts = new TObjArray;
391 hfeCuts->SetName("fPartHFECutsITS");
392 hfeCuts->AddLast(hfecuts);
393 fCutList->AddLast(hfeCuts);
396 //__________________________________________________________________
397 void AliHFEcuts::SetHFElectronTRDCuts(){
399 // Special Cuts introduced by the HFElectron Group: TRD
401 AliDebug(2, "Called\n");
402 AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTRD","Extra cuts from the HFE group");
403 if(fMinTrackletsTRD > 0.) hfecuts->SetMinTrackletsTRD(fMinTrackletsTRD);
404 if(IsInDebugMode()) hfecuts->SetQAOn(fHistQA);
405 hfecuts->SetDebugLevel(fDebugLevel);
407 TObjArray *hfeCuts = new TObjArray;
408 hfeCuts->SetName("fPartHFECutsTRD");
409 hfeCuts->AddLast(hfecuts);
410 fCutList->AddLast(hfeCuts);
413 //__________________________________________________________________
414 void AliHFEcuts::SetDebugMode(){
418 SetBit(kDebugMode, kTRUE);
421 //__________________________________________________________________
422 Bool_t AliHFEcuts::CheckParticleCuts(CutStep_t step, TObject *o){
424 // Checks the cuts without using the correction framework manager
426 AliDebug(2, "Called\n");
427 TString stepnames[kNcutStepsTrack] = {"fPartGenCuts", "fPartAccCuts", "fPartRecCuts", "fPartPrimCuts", "fPartHFECuts"};
428 TObjArray *cuts = dynamic_cast<TObjArray *>(fCutList->FindObject(stepnames[step].Data()));
429 if(!cuts) return kTRUE;
430 TIterator *it = cuts->MakeIterator();
432 Bool_t status = kTRUE;
433 while((mycut = dynamic_cast<AliCFCutBase *>(it->Next()))){
434 status &= mycut->IsSelected(o);