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),
29 fGeneratorLevel(
nullptr),
30 fDetectorLevel(
nullptr),
37 f1OverPtResHistBins(),
40 fParticlesPhysPrim(
nullptr),
41 fParticlesMatched(
nullptr)
43 SetMakeGeneralHistograms(kTRUE);
53 fDoSigma1OverPt(kFALSE),
54 fDoSigmaPtOverPtGen(kFALSE),
65 f1OverPtResHistBins(),
133 AliErrorStream() <<
"This task needs at least one particle container! The task won't run." << std::endl;
138 AliDebugStream(3) <<
"Loading the detector track container" << std::endl;
142 AliErrorStream() <<
"This task needs at least one particle container named 'detector'! The task won't run." << std::endl;
151 AliDebugStream(3) <<
"Loading the generator particle container" << std::endl;
155 AliInfoStream() <<
"No particle container named 'generator' was found. Assuming this is not a MC production." << std::endl;
162 AliDebugStream(3) <<
"Allocating histograms" << std::endl;
175 AliErrorStream() <<
"Could not load track array! The task won't run." << std::endl;
190 std::vector<int>
nbins;
191 for (
auto a : axis) nbins.push_back(
int(std::get<2>(a) - std::get<1>(a) - 1));
193 THnSparse* h =
new THnSparseF(name, name, nbins.size(), &nbins[0]);
195 for (
auto a : axis) {
196 h->GetAxis(i)->SetTitle(std::get<0>(a).c_str());
197 h->SetBinEdges(i, &(*(std::get<1>(a))));
209 typedef std::vector<Double_t>::iterator my_iterator;
211 std::vector<std::tuple<std::string, my_iterator, my_iterator>> axis;
240 typedef std::vector<Double_t>::iterator my_iterator;
242 std::vector<std::tuple<std::string, my_iterator, my_iterator>> axis;
264 typedef std::vector<Double_t>::iterator my_iterator;
266 std::vector<std::tuple<std::string, my_iterator, my_iterator>> axis;
298 std::vector<Double_t> contents(
fTracks->GetNdimensions());
302 if (
title==
"Centrality %")
304 else if (
title==
"#it{p}_{T} (GeV/#it{c})")
305 contents[i] = trackPt;
306 else if (
title==
"#eta")
307 contents[i] = trackEta;
308 else if (
title==
"#phi")
309 contents[i] = trackPhi;
310 else if (
title==
"#sigma(1/#it{p}_{T}) (GeV/#it{c})^{-1}")
311 contents[i] = sigma1OverPt;
312 else if (
title==
"#sigma(#it{p}_{T}) / #it{p}_{T}")
313 contents[i] = sigma1OverPt*trackPt;
314 else if (
title==
"MC Generator")
316 else if (
title==
"track type")
317 contents[i] = trackType;
319 AliWarning(Form(
"Unable to fill dimension %s of histogram %s!",
title.Data(),
fTracks->GetName()));
334 if (
title==
"Centrality %")
336 else if (
title==
"#it{p}_{T} (GeV/#it{c})")
337 contents[i] = partPt;
338 else if (
title==
"#eta")
339 contents[i] = partEta;
340 else if (
title==
"#phi")
341 contents[i] = partPhi;
342 else if (
title==
"MC Generator")
344 else if (
title==
"Findable")
345 contents[i] = findable;
363 if (
title==
"Centrality %")
365 else if (
title==
"#it{p}_{T}^{gen} (GeV/#it{c})")
366 contents[i] = partPt;
367 else if (
title==
"#eta^{gen}")
368 contents[i] = partEta;
369 else if (
title==
"#phi^{gen}")
370 contents[i] = partPhi;
371 else if (
title==
"#it{p}_{T}^{det} (GeV/#it{c})")
372 contents[i] = trackPt;
373 else if (
title==
"#eta^{det}")
374 contents[i] = trackEta;
375 else if (
title==
"#phi^{det}")
376 contents[i] = trackPhi;
377 else if (
title==
"(#it{p}_{T}^{gen} - #it{p}_{T}^{det}) / #it{p}_{T}^{gen}")
378 contents[i] = (partPt - trackPt) / partPt;
379 else if (
title==
"(#it{p}_{T}^{gen} - #it{p}_{T}^{det}) / #it{p}_{T}^{det}")
380 contents[i] = (partPt - trackPt) / trackPt;
381 else if (
title==
"track type")
384 AliWarning(Form(
"Unable to fill dimension %s of histogram %s!",
title.Data(),
fParticlesMatched->GetName()));
398 for (
auto trackIterator = iterable.begin(); trackIterator != iterable.end(); trackIterator++) {
399 auto track = trackIterator->second;
405 AliESDtrack *esdTrack =
dynamic_cast<AliESDtrack*
>(track);
406 if (esdTrack) sigma = TMath::Sqrt(esdTrack->GetSigma1Pt2());
409 AliAODTrack *aodtrack =
dynamic_cast<AliAODTrack*
>(track);
410 if(!aodtrack) AliFatal(
"Not a standard AOD");
412 AliExternalTrackParam exParam;
416 aodtrack->GetCovMatrix(cov);
418 aodtrack->PxPyPz(pxpypz);
420 aodtrack->GetXYZ(xyz);
421 Short_t sign = aodtrack->Charge();
422 exParam.Set(xyz,pxpypz,cov,sign);
424 sigma = TMath::Sqrt(exParam.GetSigma1Pt2());
427 Int_t label = TMath::Abs(track->GetLabel());
428 AliDebugStream(10) <<
"Track " << trackIterator.current_index() <<
" with type " << int(type) <<
" and label " << label <<
429 ", pt = " << track->Pt() << std::endl;
432 if (label == 0 || track->GetGeneratorIndex() <= 0) mcGen = 0;
439 if (part->GetGeneratorIndex() <= 0) {
440 Int_t pdg = TMath::Abs(part->PdgCode());
442 if (pdg == 211 || pdg == 2212 || pdg == 321 || pdg == 11 || pdg == 13) {
450 AliErrorStream() <<
"Track " << trackIterator.current_index() <<
" has type " << type <<
" not recognized!" << std::endl;
456 for (
auto partIterator = iterable.begin(); partIterator != iterable.end(); partIterator++) {
457 auto part = partIterator->second;
462 if (
part->GetGeneratorIndex() <= 0) mcGen = 0;
466 if (pdg == 211 || pdg == 2212 || pdg == 321 || pdg == 11 || pdg == 13) findable = 1;
484 AliErrorClassStream() <<
"No analysis manager to connect to." << std::endl;
489 AliVEventHandler* handler = mgr->GetInputEventHandler();
491 AliErrorClassStream() <<
"This task requires an input event handler" << std::endl;
495 AliInfoClassStream() <<
"Event handler ok!" << std::endl;
500 if (handler->InheritsFrom(
"AliESDInputHandler")) {
502 AliInfoClassStream() <<
"Data type is ESD." << std::endl;
504 else if (handler->InheritsFrom(
"AliAODInputHandler")) {
506 AliInfoClassStream() <<
"Data type is AOD." << std::endl;
510 if (dataType ==
kESD) track_name =
"Tracks";
513 TString name(
"AliEmcalTrackingQATask");
514 AliInfoClassStream() <<
"Allocating task." << std::endl;
517 AliInfoClassStream() <<
"Task allocated, setting containers." << std::endl;
521 AliInfoClassStream() <<
"Containers ok, adding task to the analysis manager." << std::endl;
523 mgr->AddTask(qaTask);
525 AliInfoClassStream() <<
"Task added, setting input/output." << std::endl;
527 AliAnalysisDataContainer *cinput1 = mgr->GetCommonInputContainer() ;
530 contName +=
"_histos";
531 AliAnalysisDataContainer *coutput1 = mgr->CreateContainer(contName.Data(),
532 TList::Class(),AliAnalysisManager::kOutputContainer,
533 Form(
"%s", AliAnalysisManager::GetCommonFileName()));
534 mgr->ConnectInput (qaTask, 0, cinput1 );
535 mgr->ConnectOutput (qaTask, 1, coutput1 );
538 AliInfoClassStream() <<
"Task configuration done." << std::endl;
void UserCreateOutputObjects()
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
Bool_t fInhibit
! Inhibit execution of task
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