7 #include <AliESDtrack.h> 8 #include <AliAODTrack.h> 9 #include <AliAODMCParticle.h> 11 #include <AliAnalysisManager.h> 12 #include <AliVEventHandler.h> 25 fDoSigma1OverPt(kFALSE),
26 fDoSigmaPtOverPtGen(kFALSE),
28 fGeneratorLevel(
nullptr),
29 fDetectorLevel(
nullptr),
36 f1OverPtResHistBins(),
39 fParticlesPhysPrim(
nullptr),
40 fParticlesMatched(
nullptr)
42 SetMakeGeneralHistograms(kTRUE);
52 fDoSigma1OverPt(kFALSE),
53 fDoSigmaPtOverPtGen(kFALSE),
63 f1OverPtResHistBins(),
131 AliErrorStream() <<
"This task needs at least one particle container! The task won't run." << std::endl;
136 AliDebugStream(3) <<
"Loading the detector track container" << std::endl;
140 AliErrorStream() <<
"This task needs at least one particle container named 'detector'! The task won't run." << std::endl;
149 AliDebugStream(3) <<
"Loading the generator particle container" << std::endl;
153 AliInfoStream() <<
"No particle container named 'generator' was found. Assuming this is not a MC production." << std::endl;
160 AliDebugStream(3) <<
"Allocating histograms" << std::endl;
173 AliErrorStream() <<
"Could not load track array! The task won't run." << std::endl;
188 std::vector<int>
nbins;
189 for (
auto a : axis) nbins.push_back(
int(std::get<2>(a) - std::get<1>(a) - 1));
191 THnSparse* h =
new THnSparseF(name, name, nbins.size(), &nbins[0]);
193 for (
auto a : axis) {
194 h->GetAxis(i)->SetTitle(std::get<0>(a).c_str());
195 h->SetBinEdges(i, &(*(std::get<1>(a))));
207 typedef std::vector<Double_t>::iterator my_iterator;
209 std::vector<std::tuple<std::string, my_iterator, my_iterator>> axis;
238 typedef std::vector<Double_t>::iterator my_iterator;
240 std::vector<std::tuple<std::string, my_iterator, my_iterator>> axis;
262 typedef std::vector<Double_t>::iterator my_iterator;
264 std::vector<std::tuple<std::string, my_iterator, my_iterator>> axis;
296 std::vector<Double_t> contents(
fTracks->GetNdimensions());
300 if (
title==
"Centrality %")
302 else if (
title==
"#it{p}_{T} (GeV/#it{c})")
303 contents[i] = trackPt;
304 else if (
title==
"#eta")
305 contents[i] = trackEta;
306 else if (
title==
"#phi")
307 contents[i] = trackPhi;
308 else if (
title==
"#sigma(1/#it{p}_{T}) (GeV/#it{c})^{-1}")
309 contents[i] = sigma1OverPt;
310 else if (
title==
"#sigma(#it{p}_{T}) / #it{p}_{T}")
311 contents[i] = sigma1OverPt*trackPt;
312 else if (
title==
"MC Generator")
314 else if (
title==
"track type")
315 contents[i] = trackType;
317 AliWarning(Form(
"Unable to fill dimension %s of histogram %s!",
title.Data(),
fTracks->GetName()));
332 if (
title==
"Centrality %")
334 else if (
title==
"#it{p}_{T} (GeV/#it{c})")
335 contents[i] = partPt;
336 else if (
title==
"#eta")
337 contents[i] = partEta;
338 else if (
title==
"#phi")
339 contents[i] = partPhi;
340 else if (
title==
"MC Generator")
342 else if (
title==
"Findable")
343 contents[i] = findable;
361 if (
title==
"Centrality %")
363 else if (
title==
"#it{p}_{T}^{gen} (GeV/#it{c})")
364 contents[i] = partPt;
365 else if (
title==
"#eta^{gen}")
366 contents[i] = partEta;
367 else if (
title==
"#phi^{gen}")
368 contents[i] = partPhi;
369 else if (
title==
"#it{p}_{T}^{det} (GeV/#it{c})")
370 contents[i] = trackPt;
371 else if (
title==
"#eta^{det}")
372 contents[i] = trackEta;
373 else if (
title==
"#phi^{det}")
374 contents[i] = trackPhi;
375 else if (
title==
"(#it{p}_{T}^{gen} - #it{p}_{T}^{det}) / #it{p}_{T}^{gen}")
376 contents[i] = (partPt - trackPt) / partPt;
377 else if (
title==
"(#it{p}_{T}^{gen} - #it{p}_{T}^{det}) / #it{p}_{T}^{det}")
378 contents[i] = (partPt - trackPt) / trackPt;
379 else if (
title==
"track type")
382 AliWarning(Form(
"Unable to fill dimension %s of histogram %s!",
title.Data(),
fParticlesMatched->GetName()));
394 for (
auto trackIterator = iterable.begin(); trackIterator != iterable.end(); trackIterator++) {
395 auto track = trackIterator->second;
401 AliESDtrack *esdTrack =
dynamic_cast<AliESDtrack*
>(track);
402 if (esdTrack) sigma = TMath::Sqrt(esdTrack->GetSigma1Pt2());
405 AliAODTrack *aodtrack =
dynamic_cast<AliAODTrack*
>(track);
406 if(!aodtrack) AliFatal(
"Not a standard AOD");
408 AliExternalTrackParam exParam;
412 aodtrack->GetCovMatrix(cov);
414 aodtrack->PxPyPz(pxpypz);
416 aodtrack->GetXYZ(xyz);
417 Short_t sign = aodtrack->Charge();
418 exParam.Set(xyz,pxpypz,cov,sign);
420 sigma = TMath::Sqrt(exParam.GetSigma1Pt2());
423 Int_t label = TMath::Abs(track->GetLabel());
424 AliDebugStream(10) <<
"Track " << trackIterator.current_index() <<
" with type " << int(type) <<
" and label " << label <<
425 ", pt = " << track->Pt() << std::endl;
428 if (label == 0 || track->GetGeneratorIndex() <= 0) mcGen = 0;
435 if (part->GetGeneratorIndex() <= 0) {
436 Int_t pdg = TMath::Abs(part->PdgCode());
438 if (pdg == 211 || pdg == 2212 || pdg == 321 || pdg == 11 || pdg == 13) {
446 AliErrorStream() <<
"Track " << trackIterator.current_index() <<
" has type " << type <<
" not recognized!" << std::endl;
452 for (
auto partIterator = iterable.begin(); partIterator != iterable.end(); partIterator++) {
453 auto part = partIterator->second;
458 if (
part->GetGeneratorIndex() <= 0) mcGen = 0;
462 if (pdg == 211 || pdg == 2212 || pdg == 321 || pdg == 11 || pdg == 13) findable = 1;
480 AliErrorClassStream() <<
"No analysis manager to connect to." << std::endl;
485 AliVEventHandler* handler = mgr->GetInputEventHandler();
487 AliErrorClassStream() <<
"This task requires an input event handler" << std::endl;
491 AliInfoClassStream() <<
"Event handler ok!" << std::endl;
496 if (handler->InheritsFrom(
"AliESDInputHandler")) {
498 AliInfoClassStream() <<
"Data type is ESD." << std::endl;
500 else if (handler->InheritsFrom(
"AliAODInputHandler")) {
502 AliInfoClassStream() <<
"Data type is AOD." << std::endl;
506 if (dataType ==
kESD) track_name =
"Tracks";
509 TString name(
"AliEmcalTrackingQATask");
510 AliInfoClassStream() <<
"Allocating task." << std::endl;
513 AliInfoClassStream() <<
"Task allocated, setting containers." << std::endl;
517 AliInfoClassStream() <<
"Containers ok, adding task to the analysis manager." << std::endl;
519 mgr->AddTask(qaTask);
521 AliInfoClassStream() <<
"Task added, setting input/output." << std::endl;
523 AliAnalysisDataContainer *cinput1 = mgr->GetCommonInputContainer() ;
526 contName +=
"_histos";
527 AliAnalysisDataContainer *coutput1 = mgr->CreateContainer(contName.Data(),
528 TList::Class(),AliAnalysisManager::kOutputContainer,
529 Form(
"%s", AliAnalysisManager::GetCommonFileName()));
530 mgr->ConnectInput (qaTask, 0, cinput1 );
531 mgr->ConnectOutput (qaTask, 1, coutput1 );
534 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.
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.
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
TString part
use mixed event to constrain combinatorial background
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
std::vector< Double_t > fPtRelDiffHistBins
! pt relative difference bins
static AliEmcalTrackingQATask * AddTaskTrackingQA(Bool_t isMC)
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
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