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 **************************************************************************/
17 // study displaced electrons from beauty and charm
18 // with cut on impact parameters in various pT bins
22 // Hongyan Yang <hongyan@physi.uni-heidelberg.de>
23 // Carlo Bombonati <Carlo.Bombonati@cern.ch>
34 #include <TObjArray.h>
35 #include <TParticle.h>
39 #include "AliAODEvent.h"
40 #include "AliCFManager.h"
41 #include "AliMCEvent.h"
42 #include "AliMCEventHandler.h"
43 #include "AliMCParticle.h"
44 #include "AliPIDResponse.h"
47 #include "AliESDEvent.h"
48 #include "AliESDInputHandler.h"
49 #include "AliESDtrack.h"
51 #include "AliAnalysisManager.h"
53 #include "AliHFEpid.h"
54 #include "AliHFEcuts.h"
55 #include "AliHFEtools.h"
56 #include "AliHFEdisplacedElectrons.h"
57 #include "AliAnalysisTaskDisplacedElectrons.h"
60 //____________________________________________________________
61 AliAnalysisTaskDisplacedElectrons::AliAnalysisTaskDisplacedElectrons():
62 AliAnalysisTaskSE("Task for displaced electron study")
65 , fNminPrimVtxContrib(0)
72 , fDisplacedElectrons(0x0)
75 , fElectronsEsdPt(0x0)
76 , fElectronsDataPt(0x0)
79 , fHistDisplacedElectrons(0x0)
86 //____________________________________________________________
87 AliAnalysisTaskDisplacedElectrons::AliAnalysisTaskDisplacedElectrons(const char * name):
88 AliAnalysisTaskSE(name)
91 , fNminPrimVtxContrib(0)
98 , fDisplacedElectrons(0x0)
100 , fElectronsMcPt(0x0)
101 , fElectronsEsdPt(0x0)
102 , fElectronsDataPt(0x0)
105 , fHistDisplacedElectrons(0x0)
108 // Default constructor
110 DefineInput(0, TChain::Class());
111 DefineOutput(1, TList::Class());
112 DefineOutput(2, TList::Class());
113 DefineOutput(3, TList::Class());
116 fDePID = new AliHFEpid("DEPID");
120 //____________________________________________________________
121 AliAnalysisTaskDisplacedElectrons::AliAnalysisTaskDisplacedElectrons(const AliAnalysisTaskDisplacedElectrons &ref):
122 AliAnalysisTaskSE(ref)
123 , fDeDebugLevel(ref.fDeDebugLevel)
124 , fNminITSCluster(ref.fNminITSCluster)
125 , fNminPrimVtxContrib(ref.fNminPrimVtxContrib)
126 , fDePIDdetectors(ref.fDePIDdetectors)
127 , fDePIDstrategy(ref.fDePIDstrategy)
128 , fDePlugins(ref.fDePlugins)
129 , fDeCuts(ref.fDeCuts)
132 , fDisplacedElectrons(ref.fDisplacedElectrons)
133 , fDeNEvents(ref.fDeNEvents)
134 , fElectronsMcPt(ref.fElectronsMcPt)
135 , fElectronsEsdPt(ref.fElectronsEsdPt)
136 , fElectronsDataPt(ref.fElectronsDataPt)
137 , fDeCorrection(ref.fDeCorrection)
139 , fHistDisplacedElectrons(ref.fHistDisplacedElectrons)
146 //____________________________________________________________
147 AliAnalysisTaskDisplacedElectrons &AliAnalysisTaskDisplacedElectrons::operator=(const AliAnalysisTaskDisplacedElectrons &ref){
149 // Assignment operator
151 if(this == &ref) return *this;
152 AliAnalysisTask::operator=(ref);
153 fDeDebugLevel = ref.fDeDebugLevel;
154 fNminITSCluster = ref.fNminITSCluster;
155 fNminPrimVtxContrib = ref.fNminPrimVtxContrib;
156 fDePIDdetectors = ref.fDePIDdetectors;
157 fDePIDstrategy = ref.fDePIDstrategy;
158 fDePlugins = ref.fDePlugins;
160 fDeCuts = ref.fDeCuts;
162 fDisplacedElectrons = ref.fDisplacedElectrons;
163 fDeNEvents = ref.fDeNEvents;
164 fElectronsMcPt = ref.fElectronsMcPt;
165 fElectronsEsdPt = ref.fElectronsEsdPt;
166 fElectronsDataPt = ref.fElectronsDataPt;
167 fDeCorrection = ref.fDeCorrection;
169 fHistDisplacedElectrons = ref.fHistDisplacedElectrons;
174 //____________________________________________________________
175 AliAnalysisTaskDisplacedElectrons::~AliAnalysisTaskDisplacedElectrons(){
180 if(fDePID) delete fDePID;
181 if(fDeCFM) delete fDeCFM;
182 if(fDisplacedElectrons) delete fDisplacedElectrons;
183 if(fDeNEvents) delete fDeNEvents;
184 if(fElectronsMcPt) delete fElectronsMcPt;
185 if(fElectronsEsdPt) delete fElectronsEsdPt;
186 if(fElectronsDataPt) delete fElectronsDataPt;
188 fDeCorrection->Clear();
189 delete fDeCorrection;
195 if(fHistDisplacedElectrons){
196 fHistDisplacedElectrons->Clear();
197 delete fHistDisplacedElectrons;
201 //____________________________________________________________
202 void AliAnalysisTaskDisplacedElectrons::UserCreateOutputObjects(){
203 // create output objects
205 // MC and Data containers
208 if(!fDeQA) fDeQA = new TList;
209 fDeQA->SetName("variousQAhistograms");
211 fDeNEvents = new TH1I("nDeEvents", "Number of Events in the DE Analysis", 2, 0, 2);
212 const Int_t nBins = 14;
213 const Float_t ptBins[nBins] = {0.0,0.5,1.0,1.5,2.0,2.5,3.0,4.0,5.0,7.0,9.0,12.0,16.0,20.0};
214 fElectronsMcPt = new TH1F("mcElectronPt", "MC: p_{T} distribution of identified electrons (mcpid);p_{T} (GeV/c);Counts;", nBins-1, ptBins);
215 fElectronsEsdPt = new TH1F("esdElectronPt", "ESD: p_{T} distribution of identified electrons (hfepid);p_{T} (GeV/c);Counts;", nBins-1, ptBins);
216 fElectronsDataPt = new TH1F("dataElectronPt", "DATA: p_{T} distribution of identified electrons (hfepid);p_{T} (GeV/c);Counts;", nBins-1, ptBins);
218 fDeQA->AddAt(fDeNEvents,0);
220 fDeQA->AddAt(fElectronsMcPt, 1);
221 fDeQA->AddAt(fElectronsEsdPt, 2);
224 fDeQA->AddAt(fElectronsDataPt, 1);
226 // Initialize correction Framework and Cuts
227 fDeCFM = new AliCFManager;
228 MakeEventContainer();
229 MakeParticleContainer();
231 if(!fDeCorrection) fDeCorrection = new TList();
232 fDeCorrection->SetName("deCorrections");
233 fDeCorrection->AddAt(fDeCFM->GetEventContainer(), 0);
234 fDeCorrection->AddAt(fDeCFM->GetParticleContainer(), 1);
235 fDeCorrection->Print();
237 for(Int_t istep = 0; istep < fDeCFM->GetEventContainer()->GetNStep(); istep++)
238 fDeCFM->SetEventCutsList(istep, 0x0);
239 for(Int_t istep = 0; istep < fDeCFM->GetParticleContainer()->GetNStep(); istep++)
240 fDeCFM->SetParticleCutsList(istep, 0x0);
243 AliWarning("Cuts not available. Default cuts will be used");
244 fDeCuts = new AliHFEcuts;
245 fDeCuts->CreateStandardCuts();
248 fDeCuts->Initialize(fDeCFM);
250 fDePID->SetHasMCData(HasMCData());
251 fDePID->AddDetector("TPC", 0);
252 fDePID->AddDetector("TOF", 1);
253 fDePID->ConfigureTOF();
254 fDePID->ConfigureTPCdefaultCut();
255 fDePID->InitializePID(); // Only restrictions to TPC allowed
258 // displaced electron study----------------------------------
259 if(GetPlugin(kDisplacedElectrons)){
261 fDisplacedElectrons = new AliHFEdisplacedElectrons;
262 fDisplacedElectrons->SetDebugLevel(fDeDebugLevel);
263 fDisplacedElectrons->SetHasMCData(HasMCData());
264 fDisplacedElectrons->SetMinPrimVtxContrib(fNminPrimVtxContrib);
265 fDisplacedElectrons->SetNitsCluster(fNminITSCluster);
267 if(!fHistDisplacedElectrons) fHistDisplacedElectrons = new TList();
268 fDisplacedElectrons->CreateOutputs(fHistDisplacedElectrons);
275 //____________________________________________________________
276 void AliAnalysisTaskDisplacedElectrons::UserExec(Option_t *){
281 if(fDeDebugLevel>=10) AliInfo("analyse single event");
284 AliError("Reconstructed Event not available");
289 AliESDInputHandler *inH = dynamic_cast<AliESDInputHandler *>(fInputHandler);
292 AliError("AliESDInputHandler dynamic cast failed!");
296 // from now on, only ESD are analyzed
297 // using HFE pid, using HFE cuts
299 AliPIDResponse *pidResponse = fInputHandler->GetPIDResponse();
301 AliDebug(1, "Using default PID Response");
302 pidResponse = AliHFEtools::GetDefaultPID(HasMCData(), fInputEvent->IsA() == AliAODEvent::Class());
304 fDePID->SetPIDResponse(pidResponse);
307 AliError("HFE cuts not available");
311 // ---- CHOICE OF ANALYSIS ----
313 // Protect against missing MC trees
314 AliMCEventHandler *mcH = dynamic_cast<AliMCEventHandler *>(AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
316 AliError("MC handler cuts not available");
320 if(!mcH->InitOk()) return;
321 if(!mcH->TreeK()) return;
322 if(!mcH->TreeTR()) return;
324 AliDebug(4, Form("MC Event: %p", fMCEvent));
326 AliError("No MC Event, but MC Data required");
330 ProcessMC(); // PURE MC
332 if(IsESDanalysis()) ProcessESD(); // ESD WITH MC
334 }else if(IsESDanalysis()) ProcessData(); // PURE ESD
338 PostData(1, fHistDisplacedElectrons);
339 PostData(2, fDeCorrection);
344 //____________________________________________________________
345 void AliAnalysisTaskDisplacedElectrons::ProcessMC(){
347 // handle pure MC analysis
350 Int_t nMCelectrons = 0;
351 AliESDEvent *fESD = dynamic_cast<AliESDEvent *>(fInputEvent);
353 AliError("ESD event not available");
357 Double_t mcContainer[4]; // container for the output in THnSparse
358 memset(mcContainer, 0, sizeof(Double_t) * 4);
360 fDeCFM->SetMCEventInfo(fMCEvent);
362 Double_t nContributor[1] = {0};
363 const AliVVertex *mcPrimVtx = fMCEvent->GetPrimaryVertex();
364 if(mcPrimVtx) nContributor[0] = mcPrimVtx->GetNContributors();
367 // cut at MC event level
370 if(!fDeCFM->CheckEventCuts(AliHFEcuts::kEventStepGenerated, fMCEvent)) return;
371 if(GetPlugin(kCorrection)) fDeCFM->GetEventContainer()->Fill(nContributor,AliHFEcuts::kEventStepGenerated);
373 AliStack *stack = 0x0;
375 if(!fMCEvent->Stack())return;
376 stack = fMCEvent->Stack();
377 Int_t nTracks = stack->GetNtrack();
379 AliMCParticle *mcTrack = 0x0;
381 for(Int_t itrack = 0; itrack<nTracks; itrack++){
382 if(!(stack->Particle(itrack))) continue;
383 if(mcTrack) mcTrack = 0x0;
384 mcTrack = dynamic_cast<AliMCParticle*>(fMCEvent->GetTrack(itrack));
385 if(!mcTrack) continue;
386 //TParticle *mcPart = stack->Particle(itrack);
388 mcContainer[0] = mcTrack->Pt();
389 mcContainer[1] = mcTrack->Eta();
390 mcContainer[2] = mcTrack->Phi();
391 mcContainer[3] = mcTrack->Charge();
395 if (!stack->IsPhysicalPrimary(mcTrack->GetLabel())) continue;
396 // no cut but require primary
397 if(GetPlugin(kCorrection))fDeCFM->GetParticleContainer()->Fill(mcContainer, 0);
399 // all pions for reference
400 if(TMath::Abs(mcTrack->Particle()->GetPdgCode())==AliHFEdisplacedElectrons::kPDGpion && GetPlugin(kCorrection))
401 fDeCFM->GetParticleContainer()->Fill(mcContainer, 1);
403 // cut for signal: all MC electrons
404 if(TMath::Abs(mcTrack->Particle()->GetPdgCode())==AliHFEdisplacedElectrons::kPDGelectron && GetPlugin(kCorrection))
405 fDeCFM->GetParticleContainer()->Fill(mcContainer, 2);
407 // cut at track level kinematics: pt and eta
408 if(TMath::Abs(mcContainer[1])>=0.8 || mcContainer[0]>20 || mcContainer[0]<0.1) continue;
410 if(TMath::Abs(mcTrack->Particle()->GetPdgCode())==AliHFEdisplacedElectrons::kPDGelectron){
412 fElectronsMcPt->Fill(mcContainer[0]);
415 if(GetPlugin(kCorrection))fDeCFM->GetParticleContainer()->Fill(mcContainer, 3);
419 fDisplacedElectrons->FillMcOutput(fESD, fMCEvent, mcTrack);
423 if(fDeDebugLevel>=10) printf("there are %d electrons in this MC event", nMCelectrons);
427 //____________________________________________________________
428 void AliAnalysisTaskDisplacedElectrons::ProcessESD(){
430 // this is to handle ESD tracks with MC information
431 // MC pid is only used when HFE pid is implemented, for comparison
432 // corrections are taken into account
434 // process data: ESD tracks with MC information
436 const Int_t kStepPID = AliHFEcuts::kStepHFEcutsTRD + 1;
438 Double_t esdContainer[4]; // container for the output in THnSparse
439 memset(esdContainer, 0, sizeof(Double_t) * 4);
440 AliESDEvent *fESD = dynamic_cast<AliESDEvent *>(fInputEvent);
442 AliError("No ESD event available");
446 fDeCFM->SetRecEventInfo(fESD);
447 Double_t nContrib[1] = {fESD->GetPrimaryVertex()->GetNContributors()};
449 Bool_t alreadyseen = kFALSE;
450 AliLabelContainer cont(fESD->GetNumberOfTracks());
452 Int_t nHFEelectrons = 0;
453 AliESDtrack *track = 0x0;
454 AliStack *stack = 0x0;
456 if(!(stack = fMCEvent->Stack())) return;
459 // cut at ESD event level
461 if(!fDeCFM->CheckEventCuts(AliHFEcuts::kEventStepReconstructed, fESD)) return;
462 if(GetPlugin(kCorrection)) fDeCFM->GetEventContainer()->Fill(nContrib, AliHFEcuts::kEventStepReconstructed);
464 for(Int_t itrack = 0; itrack < fESD->GetNumberOfTracks(); itrack++){
465 track = fESD->GetTrack(itrack);
467 if(GetPlugin(kDisplacedElectrons)) {
469 esdContainer[0] = track->Pt();
470 esdContainer[1] = track->Eta();
471 esdContainer[2] = track->Phi();
472 esdContainer[3] = track->Charge();
475 alreadyseen = cont.Find(TMath::Abs(track->GetLabel()));
476 cont.Append(TMath::Abs(track->GetLabel())); // check double counting
477 if(alreadyseen) continue; // avoid double counting
478 if(GetPlugin(kCorrection)) fDeCFM->GetParticleContainer()->Fill(esdContainer, 1+AliHFEcuts::kStepRecNoCut + AliHFEcuts::kNcutStepsMCTrack);
481 // RecKine: ITSTPC cuts : ITS & TPC refit, covmatrix: (2, 2, 0.5, 0.5, 2); min_tpccls: 50, chi2_tpccls: 3.5
482 if(!fDeCFM->CheckParticleCuts(AliHFEcuts::kStepRecKineITSTPC + AliHFEcuts::kNcutStepsMCTrack, track)) continue;
483 if(GetPlugin(kCorrection)) fDeCFM->GetParticleContainer()->Fill(esdContainer, 1+AliHFEcuts::kStepRecKineITSTPC + AliHFEcuts::kNcutStepsMCTrack);
486 // RecPrim: cut on track quality : DCA to vertex max: 3cm and 10cm; reject kink daughters
487 if(!fDeCFM->CheckParticleCuts(AliHFEcuts::kStepRecPrim + AliHFEcuts::kNcutStepsMCTrack, track)) continue;
488 if(GetPlugin(kCorrection)) fDeCFM->GetParticleContainer()->Fill(esdContainer, 1+AliHFEcuts::kStepRecPrim + AliHFEcuts::kNcutStepsMCTrack);
491 // HFEcuts: ITS layers cuts: ITS pixel layer: kFirst, kSecond, kBoth, kNone or kAny
492 if(!fDeCFM->CheckParticleCuts(AliHFEcuts::kStepHFEcutsITS + AliHFEcuts::kNcutStepsMCTrack, track)) continue;
493 if(GetPlugin(kCorrection))fDeCFM->GetParticleContainer()->Fill(esdContainer, 1+AliHFEcuts::kStepHFEcutsITS + AliHFEcuts::kNcutStepsMCTrack);
497 // TRD: number of tracklets in TRD
498 if(!fDeCFM->CheckParticleCuts(AliHFEcuts::kStepHFEcutsTRD + AliHFEcuts::kNcutStepsMCTrack, track)) continue;
499 if(GetPlugin(kCorrection)) fDeCFM->GetParticleContainer()->Fill(esdContainer, 1+AliHFEcuts::kStepHFEcutsTRD + AliHFEcuts::kNcutStepsMCTrack);
503 // track accepted, do PID
504 // --> only electron candidate will be processed
505 AliHFEpidObject hfetrack;
506 hfetrack.SetAnalysisType(AliHFEpidObject::kESDanalysis);
507 hfetrack.SetRecTrack(track);
508 //if(HasMCData())hfetrack.SetMCTrack(mctrack);
510 if(!fDePID->IsSelected(&hfetrack)) continue;
511 else if(fDeDebugLevel>=10)
512 AliInfo("ESD info: this particle is identified as electron by HFEpid method \n");
513 if(GetPlugin(kCorrection)) fDeCFM->GetParticleContainer()->Fill(esdContainer, 1+kStepPID + AliHFEcuts::kNcutStepsMCTrack);
517 fElectronsEsdPt->Fill(esdContainer[0]);
518 fDisplacedElectrons->FillEsdOutput(fESD, track, stack);
520 } // displaced electron analysis on ESD with MC plugin
523 if(fDeDebugLevel>=10) printf("there are %d HFE electrons in this ESD event", nHFEelectrons);
529 //____________________________________________________________
530 void AliAnalysisTaskDisplacedElectrons::ProcessData(){
532 // this is a track loop over real data
533 // no MC information at all
536 const Int_t kNcutStepsESDtrack = AliHFEcuts::kNcutStepsRecTrack + 1;
537 //const Int_t kNcutStepsTrack = AliHFEcuts::kNcutStepsMCTrack + kNcutStepsESDtrack;
538 const Int_t kStepPID = AliHFEcuts::kStepHFEcutsTRD + 1;
540 AliESDEvent *fESD = dynamic_cast<AliESDEvent *>(fInputEvent);
542 AliError("No ESD event available");
546 Double_t dataContainer[4]; // container for the output in THnSparse
547 memset(dataContainer, 0, sizeof(Double_t) * 4);
549 Bool_t alreadyseen = kFALSE;
550 AliLabelContainer cont(fESD->GetNumberOfTracks());
553 AliESDtrack *track = 0x0;
554 Int_t nHFEelectrons= 0;
556 fDeCFM->SetRecEventInfo(fESD);
557 Double_t nContrib[1] = {fESD->GetPrimaryVertex()->GetNContributors()};
558 if(!fDeCFM->CheckEventCuts(AliHFEcuts::kEventStepReconstructed, fESD)) return;
559 if(GetPlugin(kCorrection)) fDeCFM->GetEventContainer()->Fill(nContrib, AliHFEcuts::kEventStepReconstructed);
562 for(Int_t itrack = 0; itrack < fESD->GetNumberOfTracks(); itrack++){
563 track = fESD->GetTrack(itrack);
565 if(GetPlugin(kDisplacedElectrons)) {
567 dataContainer[0] = track->Pt();
568 dataContainer[1] = track->Eta();
569 dataContainer[2] = track->Phi();
570 dataContainer[3] = track->Charge();
572 alreadyseen = cont.Find(TMath::Abs(track->GetLabel())); // double counted track
573 cont.Append(TMath::Abs(track->GetLabel()));
574 if(alreadyseen) continue; // avoid double counting
575 if(GetPlugin(kCorrection))fDeCFM->GetParticleContainer()->Fill(&dataContainer[4],
576 1+AliHFEcuts::kStepRecNoCut + AliHFEcuts::kNcutStepsMCTrack + kNcutStepsESDtrack);
579 // RecKine: ITSTPC cuts : ITS & TPC refit, covmatrix: (2, 2, 0.5, 0.5, 2); min_tpccls: 50, chi2_tpccls: 3.5
580 if(!fDeCFM->CheckParticleCuts(AliHFEcuts::kStepRecKineITSTPC + AliHFEcuts::kNcutStepsMCTrack, track)) continue;
581 if(GetPlugin(kCorrection)) fDeCFM->GetParticleContainer()->Fill(&dataContainer[4],
582 1+AliHFEcuts::kStepRecKineITSTPC + AliHFEcuts::kNcutStepsMCTrack + kNcutStepsESDtrack);
585 // RecPrim: cut on track quality : DCA to vertex max: 3cm and 10cm; reject kink daughters
586 if(!fDeCFM->CheckParticleCuts(AliHFEcuts::kStepRecPrim + AliHFEcuts::kNcutStepsMCTrack, track)) continue;
587 if(GetPlugin(kCorrection)) fDeCFM->GetParticleContainer()->Fill(&dataContainer[4],
588 1+AliHFEcuts::kStepRecPrim + AliHFEcuts::kNcutStepsMCTrack + kNcutStepsESDtrack);
591 // HFEcuts: ITS layers cuts: ITS pixel layer: kFirst, kSecond, kBoth, kNone or kAny
592 if(!fDeCFM->CheckParticleCuts(AliHFEcuts::kStepHFEcutsITS, track)) continue;
593 if(GetPlugin(kCorrection)) fDeCFM->GetParticleContainer()->Fill(&dataContainer[4],
594 1+AliHFEcuts::kStepHFEcutsITS + AliHFEcuts::kNcutStepsMCTrack + kNcutStepsESDtrack);
598 // TRD: number of tracklets in TRD0
599 if(!fDeCFM->CheckParticleCuts(AliHFEcuts::kStepHFEcutsTRD + AliHFEcuts::kNcutStepsMCTrack, track)) continue;
600 if(GetPlugin(kCorrection)) if(HasMCData())fDeCFM->GetParticleContainer()->Fill(&dataContainer[4],
601 1+AliHFEcuts::kStepHFEcutsTRD + AliHFEcuts::kNcutStepsMCTrack + kNcutStepsESDtrack);
606 // track accepted, do PID --> only electron candidate will be processed
608 AliHFEpidObject hfetrack;
609 hfetrack.SetAnalysisType(AliHFEpidObject::kESDanalysis);
610 hfetrack.SetRecTrack(track);
612 if(!fDePID->IsSelected(&hfetrack)) continue;
613 else if(fDeDebugLevel>=10)
614 AliInfo("ESD info: this particle is identified as electron by HFEpid method \n");
615 if(GetPlugin(kCorrection)) fDeCFM->GetParticleContainer()->Fill(dataContainer, 1+kStepPID + AliHFEcuts::kNcutStepsMCTrack + kNcutStepsESDtrack);
618 fElectronsDataPt->Fill(dataContainer[0]);
619 fDisplacedElectrons->FillDataOutput(fESD, track);
620 } // analyze displaced electrons plugin switched on
623 if(fDeDebugLevel>=10) printf("there are %d HFE electrons in this DATA event", nHFEelectrons);
627 //____________________________________________________________
628 void AliAnalysisTaskDisplacedElectrons::Terminate(Option_t *){
630 // Terminate not implemented at the moment
633 fHistDisplacedElectrons = dynamic_cast<TList *>(GetOutputData(1));
634 fDeCorrection = dynamic_cast<TList *>(GetOutputData(2));
635 fDeQA = dynamic_cast<TList *>(GetOutputData(3));
636 if(!fDeCorrection) AliError("correction list not available\n");
637 if(!fHistDisplacedElectrons) AliError("de list not available\n");
638 if(!fDeQA) AliError("qa list is not available\n");
640 fHistDisplacedElectrons->Print();
641 fDeCorrection->Print();
644 AliInfo("analysis done!\n");
648 //____________________________________________________________
649 void AliAnalysisTaskDisplacedElectrons::PrintStatus() const {
652 // Print Analysis status
655 printf("\t Analysis Settings\n\t========================================\n");
656 printf("\t running over %s\n", HasMCData()?"MC data":"pp collision data");
657 printf("\t displaced electrons' analysis is %s\n", GetPlugin(kDisplacedElectrons)?"ON":"OFF");
658 printf("\t correction container is %s\n", GetPlugin(kCorrection)?"ON":"OFF");
659 printf("\t hfe pid qa is %s\n", GetPlugin(kDePidQA)?"ON":"OFF");
660 printf("\t post processing is %s\n", GetPlugin(kPostProcess)?"ON":"OFF");
661 printf("\t cuts: %s\n", (fDeCuts != NULL) ? "YES" : "NO");
666 //__________________________________________
667 void AliAnalysisTaskDisplacedElectrons::SwitchOnPlugin(Int_t plug){
671 // - analyze impact parameter
676 case kDisplacedElectrons:
677 SETBIT(fDePlugins, plug);
680 SETBIT(fDePlugins, plug);
683 SETBIT(fDePlugins, plug);
686 SETBIT(fDePlugins, plug);
689 AliError("Unknown Plugin");
693 //____________________________________________________________
694 void AliAnalysisTaskDisplacedElectrons::MakeParticleContainer(){
696 // Create the particle container for the correction framework manager and
699 const Int_t kNcutStepsESDtrack = AliHFEcuts::kNcutStepsRecTrack + 1;
700 const Int_t kNcutStepsTrack = AliHFEcuts::kNcutStepsMCTrack + kNcutStepsESDtrack;
702 const Int_t kNvar = 4;
703 //number of variables on the grid:pt,eta, phi, charge
704 const Double_t kPtbound[2] = {0.1, 10.};
705 const Double_t kEtabound[2] = {-0.8, 0.8};
706 const Double_t kPhibound[2] = {0., 2. * TMath::Pi()};
708 //arrays for the number of bins in each dimension
710 iBin[0] = 40; // bins in pt
711 iBin[1] = 8; // bins in eta
712 iBin[2] = 18; // bins in phi
713 iBin[3] = 2; // bins in charge
715 //arrays for lower bounds :
716 Double_t* binEdges[kNvar];
717 binEdges[0] = AliHFEtools::MakeLogarithmicBinning(iBin[0], kPtbound[0], kPtbound[1]);
718 binEdges[1] = AliHFEtools::MakeLinearBinning(iBin[1], kEtabound[0], kEtabound[1]);
719 binEdges[2] = AliHFEtools::MakeLinearBinning(iBin[2], kPhibound[0], kPhibound[1]);
720 binEdges[3] = AliHFEtools::MakeLinearBinning(iBin[3], -1.1, 1.1); // Numeric precision
722 //------------------------------------------------
723 // one "container" for MC+ESD+Data
724 //----------pure MC track-------------------------
726 // 1: MC pion total ---- be careful!!!!
727 // 2: MC electrons total
728 // 3: MC electrons in acceptance
729 //-------ESD track with MC info-------------------
730 // 4: ESD track with MC: no cut
731 // 5: ESD track with MC: cut on kine its tpc
732 // 6: ESD track with MC: rec prim
733 // 7: ESD track with MC: hfe cuts its
734 // 8: ESD track with MC: hfe cuts trd
735 // 9: ESD track with MC: hfe pid
736 //-----------data track---------------------------
737 // 10: DATA track wo MC: no cut
738 // 11: DATA track wo MC: cut on kine its tpc
739 // 12: DATA track wo MC: rec prim
740 // 13: DATA track wo MC: hfe cuts its
741 // 14: DATA track wo MC: hfe cuts trd
742 // 15: DATA track wo MC: hfe pid
743 //------------------------------------------------
745 AliCFContainer* container = new AliCFContainer("deTrackContainer", "Container for tracks",
746 (1 + kNcutStepsTrack + kNcutStepsESDtrack), kNvar, iBin);
748 //setting the bin limits
749 for(Int_t ivar = 0; ivar < kNvar; ivar++){
750 container -> SetBinLimits(ivar, binEdges[ivar]);
752 fDeCFM->SetParticleContainer(container);
756 //____________________________________________________________
757 void AliAnalysisTaskDisplacedElectrons::MakeEventContainer(){
759 // Create the event container for the correction framework and link it
766 const Int_t kNvar = 1; // number of variables on the grid: number of tracks per event
767 const Double_t kNTrackBound[2] = {-0.5, 200.5};
768 const Int_t kNBins = 201;
770 AliCFContainer *evCont = new AliCFContainer("deEventContainer", "Container for DE events", AliHFEcuts::kNcutStepsEvent, kNvar, &kNBins);
772 Double_t trackBins[kNBins];
773 for(Int_t ibin = 0; ibin < kNBins; ibin++) trackBins[ibin] = kNTrackBound[0] + static_cast<Double_t>(ibin);
774 evCont->SetBinLimits(0,trackBins);
776 fDeCFM->SetEventContainer(evCont);
782 //__________________________________________________________
783 void AliAnalysisTaskDisplacedElectrons::AddPIDdetector(TString detector){
785 // Adding PID detector to the task
787 if(!fDePIDdetectors.Length())
788 fDePIDdetectors = detector;
790 fDePIDdetectors += ":" + detector;
795 //____________________________________________________________
796 AliAnalysisTaskDisplacedElectrons::AliLabelContainer::AliLabelContainer(Int_t capacity):
804 // Default constructor
806 fContainer = new Int_t[capacity];
807 fBegin = &fContainer[0];
808 fEnd = &fContainer[capacity - 1];
809 fLast = fCurrent = fBegin;
812 //____________________________________________________________
813 Bool_t AliAnalysisTaskDisplacedElectrons::AliLabelContainer::Append(Int_t label){
815 // Add Label to the container
817 if(fLast > fEnd) return kFALSE;
822 //____________________________________________________________
823 Bool_t AliAnalysisTaskDisplacedElectrons::AliLabelContainer::Find(Int_t label) const {
825 // Find track in the list of labels
827 for(Int_t *entry = fBegin; entry <= fLast; entry++)
828 if(*entry == label) return kTRUE;
832 //____________________________________________________________
833 Int_t AliAnalysisTaskDisplacedElectrons::AliLabelContainer::Next() {
837 if(fCurrent > fLast) return -1;