8 #include <AliESDtrack.h> 9 #include <AliAODTrack.h> 10 #include <AliAODMCParticle.h> 12 #include <AliAnalysisManager.h> 13 #include <AliVEventHandler.h> 26 fDoSigma1OverPt(kFALSE),
27 fDoSigmaPtOverPtGen(kFALSE),
28 fDoSeparateTRDrefit(kFALSE),
29 fUseTRDUpdateFlag(kTRUE),
31 fGeneratorLevel(
nullptr),
32 fDetectorLevel(
nullptr),
39 f1OverPtResHistBins(),
42 fParticlesPhysPrim(
nullptr),
43 fParticlesMatched(
nullptr)
45 SetMakeGeneralHistograms(kTRUE);
55 fDoSigma1OverPt(kFALSE),
56 fDoSigmaPtOverPtGen(kFALSE),
57 fDoSeparateTRDrefit(kFALSE),
58 fUseTRDUpdateFlag(kTRUE),
68 f1OverPtResHistBins(),
136 AliErrorStream() <<
"This task needs at least one particle container! The task won't run." << std::endl;
141 AliDebugStream(3) <<
"Loading the detector track container" << std::endl;
145 AliErrorStream() <<
"This task needs at least one particle container named 'detector'! The task won't run." << std::endl;
154 AliDebugStream(3) <<
"Loading the generator particle container" << std::endl;
158 AliInfoStream() <<
"No particle container named 'generator' was found. Assuming this is not a MC production." << std::endl;
165 AliDebugStream(3) <<
"Allocating histograms" << std::endl;
178 AliErrorStream() <<
"Could not load track array! The task won't run." << std::endl;
193 std::vector<int>
nbins;
194 for (
auto a : axis) nbins.push_back(
int(std::get<2>(a) - std::get<1>(a) - 1));
196 THnSparse* h =
new THnSparseF(name, name, nbins.size(), &nbins[0]);
198 for (
auto a : axis) {
199 h->GetAxis(i)->SetTitle(std::get<0>(a).c_str());
200 h->SetBinEdges(i, &(*(std::get<1>(a))));
212 typedef std::vector<Double_t>::iterator my_iterator;
214 std::vector<std::tuple<std::string, my_iterator, my_iterator>> axis;
243 typedef std::vector<Double_t>::iterator my_iterator;
245 std::vector<std::tuple<std::string, my_iterator, my_iterator>> axis;
267 typedef std::vector<Double_t>::iterator my_iterator;
269 std::vector<std::tuple<std::string, my_iterator, my_iterator>> axis;
301 AliDebugStream(10) <<
"Filling detector level THnSparse" << std::endl;
302 std::vector<Double_t> contents(
fTracks->GetNdimensions());
306 if (
title==
"Centrality %")
308 else if (
title==
"#it{p}_{T} (GeV/#it{c})")
309 contents[i] = trackPt;
310 else if (
title==
"#eta")
311 contents[i] = trackEta;
312 else if (
title==
"#phi")
313 contents[i] = trackPhi;
314 else if (
title==
"#sigma(1/#it{p}_{T}) (GeV/#it{c})^{-1}")
315 contents[i] = sigma1OverPt;
316 else if (
title==
"#sigma(#it{p}_{T}) / #it{p}_{T}")
317 contents[i] = sigma1OverPt*trackPt;
318 else if (
title==
"MC Generator")
320 else if (
title==
"track type")
321 contents[i] = trackType;
323 AliWarning(Form(
"Unable to fill dimension %s of histogram %s!",
title.Data(),
fTracks->GetName()));
338 if (
title==
"Centrality %")
340 else if (
title==
"#it{p}_{T} (GeV/#it{c})")
341 contents[i] = partPt;
342 else if (
title==
"#eta")
343 contents[i] = partEta;
344 else if (
title==
"#phi")
345 contents[i] = partPhi;
346 else if (
title==
"MC Generator")
348 else if (
title==
"Findable")
349 contents[i] = findable;
367 if (
title==
"Centrality %")
369 else if (
title==
"#it{p}_{T}^{gen} (GeV/#it{c})")
370 contents[i] = partPt;
371 else if (
title==
"#eta^{gen}")
372 contents[i] = partEta;
373 else if (
title==
"#phi^{gen}")
374 contents[i] = partPhi;
375 else if (
title==
"#it{p}_{T}^{det} (GeV/#it{c})")
376 contents[i] = trackPt;
377 else if (
title==
"#eta^{det}")
378 contents[i] = trackEta;
379 else if (
title==
"#phi^{det}")
380 contents[i] = trackPhi;
381 else if (
title==
"(#it{p}_{T}^{gen} - #it{p}_{T}^{det}) / #it{p}_{T}^{gen}")
382 contents[i] = (partPt - trackPt) / partPt;
383 else if (
title==
"(#it{p}_{T}^{gen} - #it{p}_{T}^{det}) / #it{p}_{T}^{det}")
384 contents[i] = (partPt - trackPt) / trackPt;
385 else if (
title==
"track type")
388 AliWarning(Form(
"Unable to fill dimension %s of histogram %s!",
title.Data(),
fParticlesMatched->GetName()));
401 for (
auto trackIterator = iterable.begin(); trackIterator != iterable.end(); trackIterator++) {
402 auto track = trackIterator->second;
404 AliDebugStream(2) <<
"Next track of type " <<
static_cast<Int_t>(type) << std::endl;
405 Byte_t ntracklets = 0;
410 AliESDtrack *esdTrack =
dynamic_cast<AliESDtrack*
>(track);
412 sigma = TMath::Sqrt(esdTrack->GetSigma1Pt2());
413 ntracklets = esdTrack->GetTRDntracklets();
417 AliAODTrack *aodtrack =
dynamic_cast<AliAODTrack*
>(track);
418 if(!aodtrack) AliFatal(
"Not a standard AOD");
420 AliExternalTrackParam exParam;
424 aodtrack->GetCovMatrix(cov);
426 aodtrack->PxPyPz(pxpypz);
428 aodtrack->GetXYZ(xyz);
429 Short_t sign = aodtrack->Charge();
430 exParam.Set(xyz,pxpypz,cov,sign);
432 sigma = TMath::Sqrt(exParam.GetSigma1Pt2());
433 ntracklets = track->GetTRDntrackletsPID();
440 if(!(track->GetStatus() & AliVTrack::kTRDupdate)) type += 4;
442 if(ntracklets < 3) type += 4;
446 Int_t label = TMath::Abs(track->GetLabel());
447 AliDebugStream(10) <<
"Track " << trackIterator.current_index() <<
" with type " << int(type) <<
" and label " << label <<
448 ", pt = " << track->Pt() << std::endl;
451 if (label == 0 || track->GetGeneratorIndex() <= 0) mcGen = 0;
458 if (part->GetGeneratorIndex() <= 0) {
459 Int_t pdg = TMath::Abs(part->PdgCode());
461 if (pdg == 211 || pdg == 2212 || pdg == 321 || pdg == 11 || pdg == 13) {
469 AliErrorStream() <<
"Track " << trackIterator.current_index() <<
" has type " << type <<
" not recognized!" << std::endl;
475 for (
auto partIterator = iterable.begin(); partIterator != iterable.end(); partIterator++) {
476 auto part = partIterator->second;
481 if (part->GetGeneratorIndex() <= 0) mcGen = 0;
483 Int_t pdg = TMath::Abs(part->PdgCode());
485 if (pdg == 211 || pdg == 2212 || pdg == 321 || pdg == 11 || pdg == 13) findable = 1;
503 AliErrorClassStream() <<
"No analysis manager to connect to." << std::endl;
508 AliVEventHandler* handler = mgr->GetInputEventHandler();
510 AliErrorClassStream() <<
"This task requires an input event handler" << std::endl;
514 AliInfoClassStream() <<
"Event handler ok!" << std::endl;
519 if (handler->InheritsFrom(
"AliESDInputHandler")) {
521 AliInfoClassStream() <<
"Data type is ESD." << std::endl;
523 else if (handler->InheritsFrom(
"AliAODInputHandler")) {
525 AliInfoClassStream() <<
"Data type is AOD." << std::endl;
529 if (dataType ==
kESD) track_name =
"Tracks";
532 TString name(
"AliEmcalTrackingQATask");
533 if(strlen(suffix)) name += TString::Format(
"_%s", suffix);
534 AliInfoClassStream() <<
"Allocating task." << std::endl;
537 AliInfoClassStream() <<
"Task allocated, setting containers." << std::endl;
541 AliInfoClassStream() <<
"Containers ok, adding task to the analysis manager." << std::endl;
543 mgr->AddTask(qaTask);
545 AliInfoClassStream() <<
"Task added, setting input/output." << std::endl;
547 AliAnalysisDataContainer *cinput1 = mgr->GetCommonInputContainer() ;
550 contName +=
"_histos";
551 AliAnalysisDataContainer *coutput1 = mgr->CreateContainer(contName.Data(),
552 TList::Class(),AliAnalysisManager::kOutputContainer,
553 Form(
"%s", AliAnalysisManager::GetCommonFileName()));
554 mgr->ConnectInput (qaTask, 0, cinput1 );
555 mgr->ConnectOutput (qaTask, 1, coutput1 );
558 AliInfoClassStream() <<
"Task configuration done." << std::endl;
void UserCreateOutputObjects()
Bool_t fInhibit
!inhibit execution of the task
TList * fOutput
!output list
std::vector< Double_t > fEtaHistBins
! eta bins
EDataType_t
Switch for the data type.
static AliEmcalTrackingQATask * AddTaskTrackingQA(Bool_t isMC, const char *suffix="")
AliTrackContainer * fDetectorLevel
! detector level container
void AllocateMatchedParticlesTHnSparse()
std::vector< Double_t > fIntegerHistBins
! integer bins
const AliMCParticleIterableMomentumContainer accepted_momentum() const
virtual ~AliEmcalTrackingQATask()
std::vector< Double_t > f1OverPtResHistBins
! 1/pt res bins
Container with name, TClonesArray and cuts for particles.
Bool_t fUseTRDUpdateFlag
Use TRD update flag to separate tracks into gold and semi-gold.
static std::vector< double > GenerateFixedBinArray(int n, double min, double max, bool last=true)
THnSparse * GenerateTHnSparse(const char *name, const std::vector< std::tuple< std::string, std::vector< Double_t >::iterator, std::vector< Double_t >::iterator >> &axis)
std::vector< Double_t > fPtHistBins
! pt bins
EBeamType_t fForceBeamType
forced beam type
void FillMatchedParticlesTHnSparse(Double_t cent, Double_t partEta, Double_t partPhi, Double_t partPt, Double_t trackEta, Double_t trackPhi, Double_t trackPt, Byte_t trackType)
void FillDetectorLevelTHnSparse(Double_t cent, Double_t trackEta, Double_t trackPhi, Double_t trackPt, Double_t sigma1OverPt, Int_t mcGen, Byte_t trackType)
Bool_t fIsEsd
! whether it is ESD data
std::vector< Double_t > fPtResHistBins
! pt res bins
Base task in the EMCAL framework (lighter version of AliAnalysisTaskEmcal)
void AllocateDetectorLevelTHnSparse()
virtual AliAODMCParticle * GetAcceptMCParticleWithLabel(Int_t lab)
std::vector< Double_t > fCentHistBins
! cent bins
Int_t GetNAcceptedTracks()
std::vector< Double_t > fPtRelDiffHistBins
! pt relative difference bins
void FillGeneratorLevelTHnSparse(Double_t cent, Double_t partEta, Double_t partPhi, Double_t partPt, Int_t mcGen, Byte_t findable)
AliParticleContainer * AddParticleContainer(std::string branchName, std::string contName="")
AliMCParticleContainer * fGeneratorLevel
! generator level container
Char_t GetTrackType(const AliVTrack *track) const
std::map< std::string, AliParticleContainer * > fParticleCollArray
particle/track collection array
void SetVzRange(Double_t min, Double_t max)
const AliTrackIterableMomentumContainer accepted_momentum() const
Bool_t fDoSigma1OverPt
add sigma(1/pt), if false add sigma(pt)/pt instead
std::vector< Double_t > fPhiHistBins
! phi bins
THnSparse * fParticlesPhysPrim
all tracks
Bool_t fDoSeparateTRDrefit
Separate tracks into tracks with TRD refit and 4 tracklets (gold) or not (sub-gold) ...
Container for MC-true particles within the EMCAL framework.
void AllocateGeneratorLevelTHnSparse()
void UserCreateOutputObjects()
void SetMakeGeneralHistograms(Bool_t g)
Double_t fCent
!event centrality
THnSparse * fParticlesMatched
all physical primary particles