17 #include <TClonesArray.h>
18 #include <TDatabasePDG.h>
19 #include <TParticlePDG.h>
21 #include <THnSparse.h>
22 #include <TParticle.h>
24 #include <THashList.h>
29 #include "AliEMCALGeometry.h"
30 #include "AliAnalysisManager.h"
31 #include "AliVEventHandler.h"
65 dphi = TVector2::Phi_mpi_pi(
fMomentum.Phi() - jet.
Phi());;
67 return TMath::Sqrt(dphi*dphi + deta*deta);
78 return GetDistance(jet, deta, dphi);
90 fD.SetPtEtaPhiE(0,0,0,0);
95 fReconstructed = kFALSE;
96 for (
auto &jet : fJets) {
97 jet.second.fMomentum.SetPtEtaPhiE(0,0,0,0);
98 jet.second.fNConstituents = 0;
100 jet.second.fMaxChargedPt = 0;
101 jet.second.fMaxNeutralPt = 0;
108 Printf(
"Printing D Meson Jet object.");
109 Printf(
"D Meson: pT = %.3f, eta = %.3f, phi = %.3f, inv. mass = %.3f", fD.Pt(), fD.Eta(), fD.Phi_0_2pi(), fD.M());
110 Printf(
"Soft pion pT: %.3f. 2-Prong Invariant mass = %.3f", fSoftPionPt, fInvMass2Prong);
111 for (
auto &jet : fJets) {
112 Printf(
"Jet %s: pT = %.3f, eta = %.3f, phi = %.3f", jet.first.c_str(), jet.second.Pt(), jet.second.Eta(), jet.second.Phi_0_2pi());
113 Printf(
"Jet N Consituents = %d", jet.second.fNConstituents);
122 std::map<std::string, AliJetInfo>::const_iterator it = fJets.find(n);
123 if (it == fJets.end())
return 0;
127 if ((*it).second.Pt() > 0) {
128 TVector3 dvect = fD.Vect();
129 TVector3 jvect = (*it).second.fMomentum.Vect();
134 ::Error(
"AliAnalysisTaskDmesonJets::AliDmesonJetInfo::GetZ",
"Zero jet momentum!");
138 z = (dvect * jvect) / jetMom;
141 if (z == 1 || (z > 1 && z - 1 < 1e-3)) z = 0.999;
155 std::map<std::string, AliJetInfo>::const_iterator it = fJets.find(n);
156 if (it == fJets.end())
return 0;
158 return GetDistance((*it).second, deta, dphi);
169 return GetDistance(n, deta, dphi);
180 dphi = TVector2::Phi_mpi_pi(fD.Phi() - jet.
Phi());;
181 deta = fD.Eta() - jet.
Eta();
182 return TMath::Sqrt(dphi*dphi + deta*deta);
193 return GetDistance(jet, deta, dphi);
202 std::map<std::string, AliJetInfo>::const_iterator it = fJets.find(n);
203 if (it == fJets.end()) {
204 ::Error(
"AliAnalysisTaskDmesonJets::AliDmesonJetInfo::GetJet",
"Could not find jet info for the jet definition '%s'!",
208 return &((*it).second);
217 std::map<std::string, AliJetInfo>::iterator it = fJets.find(n);
218 if (it == fJets.end()) {
219 ::Error(
"AliAnalysisTaskDmesonJets::AliDmesonJetInfo::GetJet",
"Could not find jet info for the jet definition '%s'!",
223 return &((*it).second);
262 std::map<std::string, AliJetInfo>::const_iterator it = source.
fJets.find(n);
263 if (it == source.
fJets.end())
return;
265 fPt = (*it).second.Pt();
266 fEta = (*it).second.Eta();
267 fPhi = (*it).second.Phi_0_2pi();
306 fPt = source.
fD.Pt();
307 fEta = source.
fD.Eta();
330 fInvMass(source.fD.M())
339 fInvMass = source.
fD.M();
362 f2ProngInvMass(source.fInvMass2Prong),
363 fDeltaInvMass(source.fD.M() - source.fInvMass2Prong)
442 fJetType(source.fJetType),
443 fRadius(source.fRadius),
444 fJetAlgo(source.fJetAlgo),
445 fRecoScheme(source.fRecoScheme),
446 fMinJetPt(source.fMinJetPt),
447 fMaxJetPt(source.fMaxJetPt),
448 fMinJetPhi(source.fMinJetPhi),
449 fMaxJetPhi(source.fMaxJetPhi),
450 fMinJetEta(source.fMinJetEta),
451 fMaxJetEta(source.fMaxJetEta),
452 fMinChargedPt(source.fMinChargedPt),
453 fMaxChargedPt(source.fMaxChargedPt),
454 fMinNeutralPt(source.fMinNeutralPt),
455 fMaxNeutralPt(source.fMaxNeutralPt)
484 if (fMinJetEta < fMaxJetEta && (jet.
Eta() < fMinJetEta || jet.
Eta() > fMaxJetEta))
return kFALSE;
485 if (fMinJetPhi < fMaxJetPhi && (jet.
Phi() < fMinJetPhi || jet.
Phi() > fMaxJetPhi))
return kFALSE;
486 if (jet.
Pt() > fMaxJetPt || jet.
Pt() < fMinJetPt)
return kFALSE;
500 if (!jet)
return kFALSE;
501 return IsJetInAcceptance((*jet));
569 fCurrentDmesonJetInfo(0),
574 fClusterContainer(0),
590 fCandidateType(type),
597 fNMassBins(nMassBins),
609 fCurrentDmesonJetInfo(0),
614 fClusterContainer(0),
627 fCandidateType(source.fCandidateType),
628 fCandidateName(source.fCandidateName),
629 fCandidatePDG(source.fCandidatePDG),
630 fNDaughters(source.fNDaughters),
631 fPDGdaughters(source.fPDGdaughters),
632 fBranchName(source.fBranchName),
633 fMCMode(source.fMCMode),
634 fNMassBins(source.fNMassBins),
635 fMinMass(source.fMinMass),
636 fMaxMass(source.fMaxMass),
638 fRejectedOrigin(source.fRejectedOrigin),
639 fAcceptedDecay(source.fAcceptedDecay),
640 fInhibit(source.fInhibit),
641 fJetDefinitions(source.fJetDefinitions),
642 fPtBinWidth(source.fPtBinWidth),
643 fMaxPt(source.fMaxPt),
646 fCurrentDmesonJetInfo(0),
648 fCandidateArray(source.fCandidateArray),
649 fMCContainer(source.fMCContainer),
650 fTrackContainer(source.fTrackContainer),
651 fClusterContainer(source.fClusterContainer),
679 for (
UInt_t i = 0; i < fJetDefinitions.size(); i++) {
680 if (fJetDefinitions[i].IsJetInAcceptance(dMesonJet, fJetDefinitions[i].GetName()))
return kTRUE;
696 switch (fCandidateType) {
699 fCandidateName =
"D0";
701 fPDGdaughters.Set(fNDaughters);
702 fPDGdaughters.Reset();
703 fPDGdaughters[0] = 211;
704 fPDGdaughters[1] = 321;
705 fBranchName =
"D0toKpi";
709 fRDHFCuts->SetStandardCutsPP2010();
710 fRDHFCuts->SetUsePhysicsSelection(kFALSE);
711 fRDHFCuts->SetTriggerClass(
"",
"");
716 fCandidateName =
"2ProngLikeSign";
718 fPDGdaughters.Set(fNDaughters);
719 fPDGdaughters.Reset();
720 fPDGdaughters[0] = 211;
721 fPDGdaughters[1] = 321;
722 fBranchName =
"LikeSign2Prong";
726 fRDHFCuts->SetStandardCutsPP2010();
727 fRDHFCuts->SetUsePhysicsSelection(kFALSE);
728 fRDHFCuts->SetTriggerClass(
"",
"");
733 fCandidateName =
"DStar";
735 fPDGdaughters.Set(fNDaughters);
736 fPDGdaughters.Reset();
737 fPDGdaughters[0] = 211;
738 fPDGdaughters[1] = 211;
739 fPDGdaughters[2] = 321;
740 fBranchName =
"Dstar";
744 fRDHFCuts->SetStandardCutsPP2010();
745 fRDHFCuts->SetUsePhysicsSelection(kFALSE);
746 fRDHFCuts->SetTriggerClass(
"",
"");
750 ::Error(
"AliAnalysisTaskDmesonJets::AnalysisEngine::SetCandidateProperties",
"Candidate %d unknown!", fCandidateType);
761 if (fRDHFCuts)
delete fRDHFCuts;
771 if (fRDHFCuts)
delete fRDHFCuts;
772 fRDHFCuts =
static_cast<AliRDHFCuts*
>(cuts->Clone());
782 name = TString::Format(
"%s_%s", GetName(), jetDef.
GetName());
794 name = fCandidateName;
797 name +=
"_kBackgroundOnly";
800 name +=
"_kSignalOnly";
820 std::vector<AliHFJetDefinition>::iterator it = FindJetDefinition(def);
822 if (it == fJetDefinitions.end() || *it != def) {
823 fJetDefinitions.push_back(def);
824 ::Info(
"AliAnalysisTaskDmesonJets::AnalysisEngine::AddJetDefinition",
"Jet definition '%s' has been added to analysis engine '%s'."
825 "Total number of jet definitions is now %lu.",
826 def.
GetName(), GetName(), fJetDefinitions.size());
828 if (fMCMode !=
kMCTruth) fJetDefinitions[fJetDefinitions.size()-1].SetChargedPtRange(0., 100.);
831 ::Warning(
"AliAnalysisTaskDmesonJets::AnalysisEngine::AddJetDefinition",
"The same jet definition '%s' was already added in analysis engine '%s'.", def.
GetName(), GetName());
851 return AddJetDefinition(def);
861 std::vector<AliHFJetDefinition>::iterator it = fJetDefinitions.begin();
862 while (it != fJetDefinitions.end() && (*it) != def) it++;
903 return ExtractD0Attributes(Dcand, DmesonJet, i);
906 return ExtractDstarAttributes(static_cast<const AliAODRecoCascadeHF*>(Dcand), DmesonJet, i);
924 if (isSelected == 0)
return kFALSE;
926 Int_t MCtruthPdgCode = 0;
933 Int_t mcLab = Dcand->MatchToMC(fCandidatePDG, fMCContainer->GetArray(), fNDaughters, fPDGdaughters.GetArray());
938 AliAODMCParticle* aodMcPart =
static_cast<AliAODMCParticle*
>(fMCContainer->GetArray()->At(mcLab));
942 if (fRejectedOrigin) {
943 EMesonOrigin_t origin = CheckOrigin(aodMcPart, fMCContainer->GetArray());
947 while (rs >>= 1) { p++; }
948 TString hname = TString::Format(
"%s/fHistDmesonOrigin", GetName());
951 if ((origin & fRejectedOrigin) == origin)
return kFALSE;
953 MCtruthPdgCode = aodMcPart->PdgCode();
958 if (isSelected == 1) {
959 if (i > 0)
return kFALSE;
961 if (fMCMode ==
kNoMC ||
962 (MCtruthPdgCode == fCandidatePDG && fMCMode ==
kSignalOnly) ||
972 else if (isSelected == 2) {
973 if (i > 0)
return kFALSE;
975 if (fMCMode ==
kNoMC ||
976 (MCtruthPdgCode == -fCandidatePDG && fMCMode ==
kSignalOnly) ||
986 else if (isSelected == 3) {
990 if ((MCtruthPdgCode == fCandidatePDG && fMCMode ==
kSignalOnly) ||
992 if (i > 0)
return kFALSE;
996 else if ((MCtruthPdgCode == -fCandidatePDG && fMCMode ==
kSignalOnly) ||
998 if (i > 0)
return kFALSE;
1024 DmesonJet.
fD.SetPtEtaPhiM(Dcand->Pt(), Dcand->Eta(), Dcand->Phi(), invMassD);
1039 if (isSelected == 0)
return kFALSE;
1041 if (i > 0)
return kFALSE;
1043 Int_t MCtruthPdgCode = 0;
1048 Int_t pdgDgDStartoD0pi[2] = { 421, 211 };
1049 Int_t pdgDgD0toKpi[2] = { 321, 211 };
1051 Int_t mcLab = DstarCand->
MatchToMC(fCandidatePDG, 421, pdgDgDStartoD0pi, pdgDgD0toKpi, fMCContainer->GetArray());
1055 AliAODMCParticle* aodMcPart =
static_cast<AliAODMCParticle*
>(fMCContainer->GetArray()->At(mcLab));
1058 if (fRejectedOrigin) {
1059 EMesonOrigin_t origin = CheckOrigin(aodMcPart, fMCContainer->GetArray());
1063 while (rs >>= 1) { p++; }
1064 TString hname = TString::Format(
"%s/fHistDmesonOrigin", GetName());
1067 if ((origin & fRejectedOrigin) == origin)
return kFALSE;
1070 MCtruthPdgCode = aodMcPart->PdgCode();
1076 Int_t absMCtruthPdgCode = TMath::Abs(MCtruthPdgCode);
1077 if (fMCMode ==
kNoMC ||
1078 (absMCtruthPdgCode == 413 && fMCMode ==
kSignalOnly) ||
1084 DmesonJet.
fD.SetPtEtaPhiM(DstarCand->Pt(), DstarCand->Eta(), DstarCand->Phi(), invMassD);
1105 Int_t absPdgPart = TMath::Abs(part->GetPdgCode());
1107 if (part->GetNDaughters() == 2) {
1109 AliAODMCParticle* d1 =
static_cast<AliAODMCParticle*
>(mcArray->At(part->GetDaughter(0)));
1110 AliAODMCParticle* d2 =
static_cast<AliAODMCParticle*
>(mcArray->At(part->GetDaughter(1)));
1116 Int_t absPdg1 = TMath::Abs(d1->GetPdgCode());
1117 Int_t absPdg2 = TMath::Abs(d2->GetPdgCode());
1119 if (absPdgPart == 421) {
1120 if ((absPdg1 == 211 && absPdg2 == 321) ||
1121 (absPdg1 == 321 && absPdg2 == 211)) {
1126 if (absPdgPart == 413) {
1127 if (absPdg1 == 421 && absPdg2 == 211) {
1128 Int_t D0decay = CheckDecayChannel(d1, mcArray);
1133 else if (absPdg1 == 211 && absPdg2 == 421) {
1134 Int_t D0decay = CheckDecayChannel(d2, mcArray);
1158 Int_t mother = part->GetMother();
1159 while (mother >= 0) {
1160 AliAODMCParticle* mcGranma =
static_cast<AliAODMCParticle*
>(mcArray->At(mother));
1162 Int_t abspdgGranma = TMath::Abs(mcGranma->GetPdgCode());
1164 if (abspdgGranma == 1)
return kFromDown;
1165 if (abspdgGranma == 2)
return kFromUp;
1169 if (abspdgGranma == 6)
return kFromTop;
1171 mother = mcGranma->GetMother();
1174 ::Error(
"AliAnalysisTaskDmesonJets::AnalysisParams::CheckOrigin",
"Could not retrieve mother particle %d!", mother);
1185 fDmesonJets.clear();
1187 for (
auto& jetDef : fJetDefinitions) {
1188 jetDef.fJets.clear();
1192 RunParticleLevelAnalysis();
1195 RunDetectorLevelAnalysis();
1211 fTrackContainer->SetDMesonCandidate(0);
1212 AddInputVectors(fTrackContainer, 100);
1216 AddInputVectors(fClusterContainer, -100);
1224 for (
UInt_t ijet = 0; ijet < jets_incl.size(); ++ijet) {
1231 for (
UInt_t ic = 0; ic < constituents.size(); ++ic) {
1232 if (constituents[ic].user_index() >= 100) {
1233 if (constituents[ic].pt() > maxChPt) maxChPt = constituents[ic].pt();
1235 else if (constituents[ic].user_index() <= -100) {
1236 totalNeutralPt += constituents[ic].pt();
1237 if (constituents[ic].pt() > maxNePt) maxChPt = constituents[ic].pt();
1241 jetDef.
fJets.push_back(
1242 AliJetInfo(jets_incl[ijet].px(), jets_incl[ijet].py(), jets_incl[ijet].pz(), jets_incl[ijet].E(),
1243 constituents.size(), totalNeutralPt / jets_incl[ijet].pt(), maxChPt, maxNePt)
1257 if (jetDef.
fJets.size() == 0) FindJets(jetDef);
1269 for (
auto& jet : jetDef.
fJets) {
1272 if (d > dMax)
continue;
1273 if (d < d_closest) {
1279 if (jet_closest && applyKinCuts) {
1284 AliDebug(2, Form(
"Found closest jet (pt=%.3f, eta=%.3f, phi=%.3f) to d meson (pt=%.3f, eta=%.3f, phi=%.3f) with d = %.3f",
1296 const Int_t nD = fCandidateArray->GetEntriesFast();
1300 Int_t nAccCharm = 0;
1301 for (
Int_t icharm = 0; icharm < nD; icharm++) {
1303 if (!charmCand)
continue;
1306 if (!fRDHFCuts->IsInFiducialAcceptance(charmCand->Pt(), charmCand->Y(fCandidatePDG)))
continue;
1308 for (
Int_t im = 0; im < 2; im++) {
1311 if (ExtractRecoDecayAttributes(charmCand, DmesonJet, im)) {
1312 for (std::vector<AliHFJetDefinition>::iterator itdef = fJetDefinitions.begin(); itdef != fJetDefinitions.end(); itdef++) {
1313 if (!FindJet(charmCand, DmesonJet, *itdef)) {
1314 AliWarning(Form(
"Could not find jet '%s' for D meson '%s': pT = %.3f, eta = %.3f, phi = %.3f",
1315 (*itdef).GetName(), GetName(), DmesonJet.
fD.Pt(), DmesonJet.
fD.Eta(), DmesonJet.
fD.
Phi_0_2pi()));
1318 fDmesonJets[icharm] = DmesonJet;
1326 hname = TString::Format(
"%s/fHistNAcceptedDmesons", GetName());
1329 hname = TString::Format(
"%s/fHistNDmesons", GetName());
1354 fTrackContainer->SetDMesonCandidate(Dcand);
1355 hname = TString::Format(
"%s/%s/fHistTrackRejectionReason", GetName(), jetDef.
GetName());
1358 hname = TString::Format(
"%s/%s/fHistDMesonDaughterNotInJet", GetName(), jetDef.
GetName());
1360 const TObjArray& daughters = fTrackContainer->GetDaughterList();
1361 for (
Int_t i = 0; i < daughters.GetEntriesFast(); i++) {
1362 AliVParticle* daughter =
static_cast<AliVParticle*
>(daughters.At(i));
1363 if (!fTrackContainer->GetArray()->FindObject(daughter)) histDaughterNotInJet->Fill(daughter->Pt());
1368 hname = TString::Format(
"%s/%s/fHistClusterRejectionReason", GetName(), jetDef.
GetName());
1377 for (
UInt_t ijet = 0; ijet < jets_incl.size(); ++ijet) {
1380 Bool_t isDmesonJet = kFALSE;
1386 for (
UInt_t ic = 0; ic < constituents.size(); ++ic) {
1387 if (constituents[ic].user_index() == 0) {
1388 isDmesonJet = kTRUE;
1390 else if (constituents[ic].user_index() >= 100) {
1391 if (constituents[ic].pt() > maxChPt) maxChPt = constituents[ic].pt();
1393 else if (constituents[ic].user_index() <= -100) {
1394 totalNeutralPt += constituents[ic].pt();
1395 if (constituents[ic].pt() > maxNePt) maxChPt = constituents[ic].pt();
1400 DmesonJet.
fJets[jetDef.
GetName()].fMomentum.SetPxPyPzE(jets_incl[ijet].px(), jets_incl[ijet].py(), jets_incl[ijet].pz(), jets_incl[ijet].E());
1401 DmesonJet.
fJets[jetDef.
GetName()].fNConstituents = constituents.size();
1402 DmesonJet.
fJets[jetDef.
GetName()].fMaxChargedPt = maxChPt;
1403 DmesonJet.
fJets[jetDef.
GetName()].fMaxNeutralPt = maxNePt;
1404 DmesonJet.
fJets[jetDef.
GetName()].fNEF = totalNeutralPt / jets_incl[ijet].pt();
1418 AliEmcalIterableMomentumContainer itcont = cont->all_momentum();
1419 for (AliEmcalIterableMomentumContainer::iterator it = itcont.begin(); it != itcont.end(); it++) {
1420 UInt_t rejectionReason = 0;
1421 if (!cont->AcceptObject(it.current_index(), rejectionReason)) {
1422 if (rejectHist) rejectHist->Fill(AliEmcalContainer::GetRejectionReasonBitPosition(rejectionReason), it->first.Pt());
1425 Int_t uid = offset >= 0 ? it.current_index() + offset: -it.current_index() - offset;
1435 fMCContainer->SetSpecialPDG(fCandidatePDG);
1436 fMCContainer->SetRejectedOriginMap(fRejectedOrigin);
1437 fMCContainer->SetAcceptedDecayMap(fAcceptedDecay);
1439 if (!fMCContainer->IsSpecialPDGFound())
return;
1441 for (
auto &jetDef : fJetDefinitions) {
1442 switch (jetDef.fJetType) {
1444 fMCContainer->SetCharge(AliParticleContainer::EChargeCut_t::kNoChargeCut);
1447 fMCContainer->SetCharge(AliParticleContainer::EChargeCut_t::kCharged);
1450 fMCContainer->SetCharge(AliParticleContainer::EChargeCut_t::kNeutral);
1459 hname = TString::Format(
"%s/fHistDmesonOrigin", GetName());
1461 hname = TString::Format(
"%s/%s/fHistMCParticleRejectionReason", GetName(), jetDef.GetName());
1463 fMCContainer->SetHistOrigin(0);
1469 for (
UInt_t ijet = 0; ijet < jets_incl.size(); ++ijet) {
1472 Bool_t isDmesonJet = kFALSE;
1474 for (
UInt_t ic = 0; ic < constituents.size(); ++ic) {
1475 Int_t iPart = constituents[ic].user_index() - 100;
1476 AliVParticle* part = fMCContainer->GetParticle(iPart);
1478 ::Error(
"AliAnalysisTaskDmesonJets::AnalysisEngine::RunParticleLevelAnalysis",
"Could not find jet constituent %d!", iPart);
1481 if (TMath::Abs(part->PdgCode()) == fCandidatePDG) {
1482 std::map<int, AliDmesonJetInfo>::iterator dMesonJetIt = fDmesonJets.find(iPart);
1483 if (dMesonJetIt == fDmesonJets.end()) {
1484 std::pair<int, AliDmesonJetInfo> element;
1485 element.first = iPart;
1487 dMesonJetIt = fDmesonJets.insert(element).first;
1488 (*dMesonJetIt).second.fD.SetPxPyPzE(part->Px(), part->Py(), part->Pz(), part->E());
1489 (*dMesonJetIt).second.fDmesonParticle = part;
1492 (*dMesonJetIt).second.fJets[jetDef.GetName()].fMomentum.SetPxPyPzE(jets_incl[ijet].px(), jets_incl[ijet].py(), jets_incl[ijet].pz(), jets_incl[ijet].E());
1493 (*dMesonJetIt).second.fJets[jetDef.GetName()].fNConstituents = constituents.size();
1506 switch (fCandidateType) {
1509 classname =
"AliAnalysisTaskDmesonJets::AliD0InfoSummary";
1513 classname =
"AliAnalysisTaskDmesonJets::AliDStarInfoSummary";
1517 TString treeName = TString::Format(
"%s_%s", taskName, GetName());
1518 fTree =
new TTree(treeName, treeName);
1519 fTree->Branch(
"DmesonJet", classname, &fCurrentDmesonJetInfo);
1521 for (
Int_t i = 0; i < fJetDefinitions.size(); i++) {
1523 fTree->Branch(fJetDefinitions[i].GetName(),
"AliAnalysisTaskDmesonJets::AliJetInfoSummary", &fCurrentJetInfo[i]);
1538 for (
auto &jetDef : fJetDefinitions) {
1540 AliDebug(2,Form(
"Now working on '%s'", jetDef.GetName()));
1550 title[dim] =
"#it{p}_{T,D} (GeV/#it{c})";
1557 title[dim] =
"#eta_{D}";
1563 title[dim] =
"#phi_{D} (rad)";
1566 max[dim] = TMath::TwoPi();
1571 title[dim] =
"#it{M}_{K#pi#pi} (GeV/#it{c}^{2})";
1572 nbins[dim] = fNMassBins;
1573 min[dim] = fMinMass;
1574 max[dim] = fMaxMass;
1579 title[dim] =
"#it{M}_{K#pi} (GeV/#it{c}^{2})";
1580 nbins[dim] = fNMassBins;
1581 min[dim] = fMinMass;
1582 max[dim] = fMaxMass;
1587 title[dim] =
"#it{M}_{K#pi} (GeV/#it{c}^{2})";
1588 nbins[dim] = fNMassBins;
1594 title[dim] =
"#it{M}_{K#pi#pi} - #it{M}_{K#pi} (GeV/#it{c}^{2})";
1595 nbins[dim] = fNMassBins*6;
1599 Double_t D0mass = TDatabasePDG::Instance()->GetParticle(421)->Mass();
1607 title[dim] =
"#it{p}_{T,#pi} (GeV/#it{c})";
1614 title[dim] =
"#it{z}_{D}";
1620 if ((enabledAxis &
kDeltaR) != 0) {
1621 title[dim] =
"#Delta R_{D-jet}";
1624 max[dim] = radius * 1.5;
1629 title[dim] =
"#eta_{D} - #eta_{jet}";
1631 min[dim] = -radius * 1.2;
1632 max[dim] = radius * 1.2;
1637 title[dim] =
"#phi_{D} - #phi_{jet} (rad)";
1639 min[dim] = -radius * 1.2;
1640 max[dim] = radius * 1.2;
1644 title[dim] =
"#it{p}_{T,jet} (GeV/#it{c})";
1651 title[dim] =
"#eta_{jet}";
1657 title[dim] =
"#phi_{jet} (rad)";
1660 max[dim] = TMath::TwoPi();
1665 title[dim] =
"No. of constituents";
1672 hname = TString::Format(
"%s/%s/fDmesonJets", GetName(), jetDef.GetName());
1674 for (
Int_t j = 0; j < dim; j++) {
1675 h->GetAxis(j)->SetTitle(title[j]);
1687 for (
auto& dmeson_pair : fDmesonJets) {
1688 fCurrentDmesonJetInfo->Set(dmeson_pair.second);
1690 for (
UInt_t ij = 0; ij < fJetDefinitions.size(); ij++) {
1691 fCurrentJetInfo[ij]->Reset();
1692 AliJetInfo* jet = dmeson_pair.second.GetJet(fJetDefinitions[ij].GetName());
1694 if (applyKinCuts && !fJetDefinitions[ij].IsJetInAcceptance(*jet)) {
1695 hname = TString::Format(
"%s/%s/fHistRejectedJetPt", GetName(), fJetDefinitions[ij].GetName());
1697 hname = TString::Format(
"%s/%s/fHistRejectedJetPhi", GetName(), fJetDefinitions[ij].GetName());
1699 hname = TString::Format(
"%s/%s/fHistRejectedJetEta", GetName(), fJetDefinitions[ij].GetName());
1703 fCurrentJetInfo[ij]->Set(dmeson_pair.second, fJetDefinitions[ij].GetName());
1710 hname = TString::Format(
"%s/fHistRejectedDMesonPt", GetName());
1712 hname = TString::Format(
"%s/fHistRejectedDMesonPhi", GetName());
1714 hname = TString::Format(
"%s/fHistRejectedDMesonEta", GetName());
1717 hname = TString::Format(
"%s/fHistRejectedDMesonInvMass", GetName());
1721 hname = TString::Format(
"%s/fHistRejectedDMeson2ProngInvMass", GetName());
1724 hname = TString::Format(
"%s/fHistRejectedDMesonDeltaInvMass", GetName());
1725 fHistManager->
FillTH1(hname, dmeson_pair.second.fD.M() - dmeson_pair.second.fInvMass2Prong);
1740 for (
auto& dmeson_pair : fDmesonJets) {
1742 for (
UInt_t ij = 0; ij < fJetDefinitions.size(); ij++) {
1743 AliJetInfo* jet = dmeson_pair.second.GetJet(fJetDefinitions[ij].GetName());
1745 if (applyKinCuts && !fJetDefinitions[ij].IsJetInAcceptance(*jet)) {
1746 hname = TString::Format(
"%s/%s/fHistRejectedJetPt", GetName(), fJetDefinitions[ij].GetName());
1748 hname = TString::Format(
"%s/%s/fHistRejectedJetPhi", GetName(), fJetDefinitions[ij].GetName());
1750 hname = TString::Format(
"%s/%s/fHistRejectedJetEta", GetName(), fJetDefinitions[ij].GetName());
1757 hname = TString::Format(
"%s/fHistRejectedDMesonPt", GetName());
1759 hname = TString::Format(
"%s/fHistRejectedDMesonPhi", GetName());
1761 hname = TString::Format(
"%s/fHistRejectedDMesonEta", GetName());
1764 hname = TString::Format(
"%s/fHistRejectedDMesonInvMass", GetName());
1768 hname = TString::Format(
"%s/fHistRejectedDMeson2ProngInvMass", GetName());
1771 hname = TString::Format(
"%s/fHistRejectedDMesonDeltaInvMass", GetName());
1772 fHistManager->
FillTH1(hname, dmeson_pair.second.fD.M() - dmeson_pair.second.fInvMass2Prong);
1786 for (
auto& dmeson_pair : fDmesonJets) {
1787 if (!IsAnyJetInAcceptance(dmeson_pair.second)) {
1788 hname = TString::Format(
"%s/fHistRejectedDMesonPt", GetName());
1790 hname = TString::Format(
"%s/fHistRejectedDMesonPhi", GetName());
1792 hname = TString::Format(
"%s/fHistRejectedDMesonEta", GetName());
1797 for (
auto &jetDef : fJetDefinitions) {
1799 hname = TString::Format(
"%s/%s/fDmesonJets", GetName(), jetDef.GetName());
1802 for (
auto& dmeson_pair : fDmesonJets) {
1803 const AliJetInfo* jet = dmeson_pair.second.GetJet(jetDef.GetName());
1805 if (!jetDef.IsJetInAcceptance(*jet)) {
1806 hname = TString::Format(
"%s/%s/fHistRejectedJetPt", GetName(), jetDef.GetName());
1808 hname = TString::Format(
"%s/%s/fHistRejectedJetPhi", GetName(), jetDef.GetName());
1810 hname = TString::Format(
"%s/%s/fHistRejectedJetEta", GetName(), jetDef.GetName());
1814 FillHnSparse(h, dmeson_pair.second, jetDef.GetName());
1837 std::map<std::string, AliJetInfo>::const_iterator it = DmesonJet.
fJets.find(n);
1838 if (it == DmesonJet.
fJets.end())
return kFALSE;
1840 for (
Int_t i = 0; i < h->GetNdimensions(); i++) {
1842 if (
title==
"#it{p}_{T,D} (GeV/#it{c})") contents[i] = DmesonJet.
fD.Pt();
1843 else if (
title==
"#eta_{D}") contents[i] = DmesonJet.
fD.Eta();
1846 else if (
title==
"#it{M}_{K#pi#pi} (GeV/#it{c}^{2})") contents[i] = DmesonJet.
fD.M();
1847 else if (
title==
"#it{M}_{K#pi#pi} - #it{M}_{K#pi} (GeV/#it{c}^{2})") contents[i] = DmesonJet.
fD.M() - DmesonJet.
fInvMass2Prong;
1848 else if (
title==
"#it{p}_{T,#pi} (GeV/#it{c})") contents[i] = DmesonJet.
fSoftPionPt;
1849 else if (
title==
"#it{z}_{D}") contents[i] = z;
1850 else if (
title==
"#Delta R_{D-jet}") contents[i] = deltaR;
1851 else if (
title==
"#eta_{D} - #eta_{jet}") contents[i] = deltaEta;
1852 else if (
title==
"#phi_{D} - #phi_{jet} (rad)") contents[i] = deltaPhi;
1853 else if (
title==
"#it{p}_{T,jet} (GeV/#it{c})") contents[i] = (*it).second.Pt();
1854 else if (
title==
"#eta_{jet}") contents[i] = (*it).second.Eta();
1855 else if (
title==
"#phi_{jet} (rad)") contents[i] = (*it).second.Phi_0_2pi();
1856 else if (
title==
"No. of constituents") contents[i] = (*it).second.fNConstituents;
1857 else AliWarning(Form(
"Unable to fill dimension '%s'!",
title.Data()));
1892 fEnabledAxis(k2ProngInvMass),
1893 fOutputType(kTreeOutput),
1895 fApplyKinematicCuts(kTRUE),
1896 fNOutputTrees(nOutputTrees),
1901 for (
Int_t i = 0; i < nOutputTrees; i++){
1902 DefineOutput(2+i, TTree::Class());
1921 TFile* filecuts = TFile::Open(cutfname);
1922 if (!filecuts || filecuts->IsZombie()) {
1923 ::Warning(
"AddTaskDmesonJets",
"Input file not found: will use std cuts.");
1928 analysiscuts =
dynamic_cast<AliRDHFCuts*
>(filecuts->Get(cutsname));
1929 if (!analysiscuts) {
1930 ::Warning(
"AddTaskDmesonJetCorr",
"Could not find analysis cuts '%s' in '%s'. Using std cuts.", cutsname.Data(), cutfname.Data());
1934 return analysiscuts;
1963 if (!cutfname.IsNull()) {
1969 cutsname =
"D0toKpiCuts";
1972 cutsname =
"DStartoKpipiCuts";
1988 ::Info(
"AliAnalysisTaskDmesonJets::AddAnalysisEngine",
"A new analysis engine '%s' has been added. The total number of analysis engines is %lu.", eng.
GetName(),
fAnalysisEngines.size());
1992 ::Info(
"AliAnalysisTaskDmesonJets::AddAnalysisEngine",
"An analysis engine '%s' with %lu jet definitions has been found. The total number of analysis engines is %lu. A new jet definition '%s' is being added.", found_eng->
GetName(), found_eng->
fJetDefinitions.size(),
fAnalysisEngines.size(), jetDef.
GetName());
1995 if (cuts && found_eng->
fRDHFCuts != 0) {
1996 ::Warning(
"AliAnalysisTaskDmesonJets::AddAnalysisEngine",
"D meson cuts were already defined for this D meson type. They will be overwritten.");
2014 ::Info(
"UserCreateOutputObjects",
"CreateOutputObjects of task %s", GetName());
2026 ::Info(
"AliAnalysisTaskDmesonJets::UserCreateOutputObjects",
"Allocating histograms for task '%s' (%lu analysis engines)", GetName(),
fAnalysisEngines.size());
2028 ::Info(
"AliAnalysisTaskDmesonJets::UserCreateOutputObjects",
"Allocating histograms for analysis engine '%s' (%lu jet definitions)", param.GetName(), param.fJetDefinitions.size());
2034 hname = TString::Format(
"%s/fHistNAcceptedDmesons", param.GetName());
2035 htitle = hname +
";Number of D accepted meson candidates;counts";
2038 hname = TString::Format(
"%s/fHistNDmesons", param.GetName());
2039 htitle = hname +
";Number of D meson candidates;counts";
2042 hname = TString::Format(
"%s/fHistNEvents", param.GetName());
2043 htitle = hname +
";Event status;counts";
2045 h->GetXaxis()->SetBinLabel(1,
"Accepted");
2046 h->GetXaxis()->SetBinLabel(2,
"Rejected");
2048 hname = TString::Format(
"%s/fHistEventRejectionReasons", param.GetName());
2049 htitle = hname +
";Rejection reason;counts";
2052 hname = TString::Format(
"%s/fHistRejectedDMesonPt", param.GetName());
2053 htitle = hname +
";#it{p}_{T,D} (GeV/#it{c});counts";
2056 hname = TString::Format(
"%s/fHistRejectedDMesonEta", param.GetName());
2057 htitle = hname +
";#it{#eta}_{D};counts";
2060 hname = TString::Format(
"%s/fHistRejectedDMesonPhi", param.GetName());
2061 htitle = hname +
";#it{#phi}_{D};counts";
2065 hname = TString::Format(
"%s/fHistRejectedDMesonInvMass", param.GetName());
2066 htitle = hname +
";#it{M}_{K#pi} (GeV/#it{c}^{2});counts";
2073 hname = TString::Format(
"%s/fHistRejectedDMeson2ProngInvMass", param.GetName());
2074 htitle = hname +
";#it{M}_{K#pi} (GeV/#it{c}^{2});counts";
2078 Double_t D0mass = TDatabasePDG::Instance()->GetParticle(421)->Mass();
2079 hname = TString::Format(
"%s/fHistRejectedDMesonDeltaInvMass", param.GetName());
2080 htitle = hname +
";#it{M}_{K#pi#pi} - #it{M}_{K#pi} (GeV/#it{c}^{2});counts";
2086 hname = TString::Format(
"%s/fHistDmesonOrigin", param.GetName());
2087 htitle = hname +
";origin;counts";
2091 for (std::vector<AliHFJetDefinition>::iterator itdef = param.fJetDefinitions.begin(); itdef != param.fJetDefinitions.end(); itdef++) {
2093 ::Info(
"AliAnalysisTaskDmesonJets::UserCreateOutputObjects",
"Allocating histograms for jet definition '%s'", jetDef->
GetName());
2097 hname = TString::Format(
"%s/%s/fHistMCParticleRejectionReason", param.GetName(), jetDef->
GetName());
2098 htitle = hname +
";Track rejection reason;#it{p}_{T,track} (GeV/#it{c});counts";
2102 hname = TString::Format(
"%s/%s/fHistTrackRejectionReason", param.GetName(), jetDef->
GetName());
2103 htitle = hname +
";Track rejection reason;#it{p}_{T,track} (GeV/#it{c});counts";
2107 hname = TString::Format(
"%s/%s/fHistClusterRejectionReason", param.GetName(), jetDef->
GetName());
2108 htitle = hname +
";Cluster rejection reason;#it{p}_{T,cluster} (GeV/#it{c});counts";
2112 hname = TString::Format(
"%s/%s/fHistDMesonDaughterNotInJet", param.GetName(), jetDef->
GetName());
2113 htitle = hname +
";#it{p}_{T,track} (GeV/#it{c});counts";
2116 hname = TString::Format(
"%s/%s/fHistRejectedJetPt", param.GetName(), jetDef->
GetName());
2117 htitle = hname +
";#it{p}_{T,jet} (GeV/#it{c});counts";
2120 hname = TString::Format(
"%s/%s/fHistRejectedJetEta", param.GetName(), jetDef->
GetName());
2121 htitle = hname +
";#it{#eta}_{jet};counts";
2124 hname = TString::Format(
"%s/%s/fHistRejectedJetPhi", param.GetName(), jetDef->
GetName());
2125 htitle = hname +
";#it{#phi}_{jet};counts";
2130 param.BuildTree(GetName());
2132 param.AssignDataSlot(treeSlot+2);
2137 AliError(Form(
"Number of data output slots %d not sufficient. Tree of analysis engine %s will not be posted!",
fNOutputTrees, param.GetName()));
2168 AliError(Form(
"This task need an AOD event (Task '%s'). Expect troubles...", GetName()));
2179 params.fCandidateArray =
dynamic_cast<TClonesArray*
>(
fAodEvent->GetList()->FindObject(params.fBranchName.Data()));
2181 if (params.fCandidateArray) {
2184 className =
"AliAODRecoDecayHF2Prong";
2187 className =
"AliAODRecoCascadeHF";
2189 if (!params.fCandidateArray->GetClass()->InheritsFrom(className)) {
2190 ::Error(
"AliAnalysisTaskDmesonJets::ExecOnce",
2191 "%s: Objects of type %s in %s are not inherited from %s! Task will be disabled!",
2192 GetName(), params.fCandidateArray->GetClass()->GetName(), params.fCandidateArray->GetName(), className.Data());
2193 params.fCandidateArray = 0;
2194 params.fInhibit = kTRUE;
2198 ::Error(
"AliAnalysisTaskDmesonJets::ExecOnce",
2199 "Could not find candidate array '%s', skipping the event. Analysis engine '%s' will be disabled!",
2200 params.fBranchName.Data(), params.GetName());
2201 params.fInhibit = kTRUE;
2205 if (params.fMCMode !=
kNoMC) {
2210 if (!params.fMCContainer) {
2211 ::Error(
"AliAnalysisTaskDmesonJets::ExecOnce",
2212 "No MC particle container was provided. Analysis engine '%s' will be disabled!",
2214 params.fInhibit = kTRUE;
2224 if (!params.fTrackContainer && !params.fClusterContainer) {
2225 ::Error(
"AliAnalysisTaskDmesonJets::ExecOnce",
2226 "No track container and no cluster container were provided. Analysis engine '%s' will be disabled!",
2228 params.fInhibit = kTRUE;
2248 if (eng.fInhibit)
continue;
2249 hname = TString::Format(
"%s/fHistEventRejectionReasons", eng.GetName());
2257 if (eng.fInhibit)
continue;
2260 hname = TString::Format(
"%s/fHistNEvents", eng.GetName());
2263 if (!iseventselected) {
2265 hname = TString::Format(
"%s/fHistEventRejectionReasons", eng.GetName());
2266 UInt_t bitmap = eng.fRDHFCuts->GetEventRejectionBitMap();
2270 if (label.IsNull())
break;
2280 AliDebug(2,
"Event selected");
2295 if (param.fInhibit)
continue;
2317 TParticlePDG* part = TDatabasePDG::Instance()->GetParticle(TMath::Abs(pdg));
2322 if (nbins % 2 == 0) {
2323 minMass = mass - range / 2 - range / nbins / 2;
2324 maxMass = mass + range / 2 - range / nbins / 2;
2327 minMass = mass - range / 2;
2328 maxMass = mass + range / 2;
2343 label =
"NotSelTrigger";
2345 return label.Data();
2350 return label.Data();
2353 label =
"TooFewVtxContrib";
2355 return label.Data();
2358 label =
"ZVtxOutFid";
2360 return label.Data();
2365 return label.Data();
2368 label =
"OutsideCentrality";
2370 return label.Data();
2373 label =
"PhysicsSelection";
2375 return label.Data();
2378 label =
"BadSPDVertex";
2380 return label.Data();
2383 label =
"ZVtxSPDOutFid";
2385 return label.Data();
2388 label =
"CentralityFlattening";
2390 return label.Data();
2393 label =
"BadTrackV0Correl";
2395 return label.Data();
2398 return label.Data();
2430 ::Error(
"AddTaskDmesonJets",
"No analysis manager to connect to.");
2435 AliVEventHandler* handler = mgr->GetInputEventHandler();
2437 ::Error(
"AddTaskEmcalJetSpectraQA",
"This task requires an input event handler");
2443 if (handler->InheritsFrom(
"AliESDInputHandler")) {
2446 else if (handler->InheritsFrom(
"AliAODInputHandler")) {
2451 if (ntracks ==
"usedefault") {
2452 if (dataType ==
kESD) {
2455 else if (dataType ==
kAOD) {
2463 if (nclusters ==
"usedefault") {
2464 if (dataType ==
kESD) {
2465 nclusters =
"CaloClusters";
2467 else if (dataType ==
kAOD) {
2468 nclusters =
"caloClusters";
2475 if (nMCpart ==
"usedefault") {
2476 nMCpart =
"mcparticles";
2479 TString name(
"AliAnalysisTaskDmesonJets");
2480 if (strcmp(suffix,
"") != 0) {
2481 name += TString::Format(
"_%s", suffix.Data());
2487 if (!ntracks.IsNull()) {
2492 if (!nMCpart.IsNull()) {
2494 partCont->SetEtaLimits(-1.5, 1.5);
2501 mgr->AddTask(jetTask);
2504 AliAnalysisDataContainer* cinput1 = mgr->GetCommonInputContainer();
2506 contname1 +=
"_histos";
2507 AliAnalysisDataContainer* coutput1 = mgr->CreateContainer(contname1.Data(),
2508 TList::Class(), AliAnalysisManager::kOutputContainer,
2509 Form(
"%s", AliAnalysisManager::GetCommonFileName()));
2511 mgr->ConnectInput(jetTask, 0, cinput1);
2512 mgr->ConnectOutput(jetTask, 1, coutput1);
2514 for (
Int_t i = 0; i < nMaxTrees; i++) {
2515 TString contname = TString::Format(
"%s_tree_%d", name.Data(), i);
2516 AliAnalysisDataContainer *coutput = mgr->CreateContainer(contname.Data(),
2517 TTree::Class(),AliAnalysisManager::kOutputContainer,
2518 Form(
"%s", AliAnalysisManager::GetCommonFileName()));
2519 mgr->ConnectOutput(jetTask, 2+i, coutput);
void SetRejectionReasonLabels(TAxis *axis)
void Print() const
Prints the content of this object in the standard output.
void UserCreateOutputObjects()
std::list< AnalysisEngine > fAnalysisEngines
Array of analysis parameters.
Bool_t FillTree(Bool_t applyKinCuts)
AliEMCALGeometry * fGeom
!emcal geometry
Analysis task for D meson jets.
virtual void Set(const AliDmesonJetInfo &source)
Invariant mass of the D0 meson candidate in GeV/c2.
virtual void Reset()
Reset the object.
TList * fOutput
!output list
Bool_t IsJetInAcceptance(const AliJetInfo &jet) const
Double_t fSoftPionPt
! Transverse momentum of the soft pion of the D* candidate
EDataType_t
Switch for the data type.
AliRDHFCuts * fRDHFCuts
D meson candidates cuts.
void RunAnalysis()
Run the analysis.
Lightweight class that encapsulates D meson jets.
Bool_t FillHnSparse(Bool_t applyKinCuts)
Int_t MatchToMC(Int_t pdgabs, Int_t pdgabs2prong, Int_t *pdgDg, Int_t *pdgDg2prong, TClonesArray *mcArray, Bool_t isV0=kFALSE) const
ERecoScheme_t fRecoScheme
Jet recombination scheme (pt scheme, E scheme, ...)
void SetRDHFCuts(AliRDHFCuts *cuts)
Double_t fMaxNeutralPt
Transverse momentum of the leading neutral particle (or cluster)
void RunDetectorLevelAnalysis()
Run a detector level analysis.
jet_distance_pair FindJetMacthedToGeneratedDMeson(const AliDmesonJetInfo &dmeson, AliHFJetDefinition &jetDef, Double_t dMax, Bool_t applyKinCuts)
virtual void UserCreateOutputObjects()
Creates the output containers.
Lightweight class that encapsulates D meson jets.
Double_t fInvMass2Prong
! 2-prong mass of the D* candidate (w/o the soft pion)
static void CalculateMassLimits(Double_t range, Int_t pdg, Int_t nbins, Double_t &minMass, Double_t &maxMass)
AliAODEvent * fAodEvent
! AOD event
virtual void Reset()
Reset the object.
Bool_t FindJet(AliAODRecoDecayHF2Prong *Dcand, AliDmesonJetInfo &DmesonJet, AliHFJetDefinition &jetDef)
UInt_t fEnabledAxis
Use bit defined in EAxis_t to enable axis in the THnSparse.
EMCMode_t fMCMode
MC mode: No MC (data and MC detector level), background-only (MC), signal-only (MC), MC truth (particle level)
Double_t InvMassD0() const
void BuildHnSparse(UInt_t enabledAxis)
void SetRecombScheme(const fastjet::RecombinationScheme &scheme)
const char * GetName() const
AnalysisEngine()
This is the default constructor, used for ROOT I/O purposes.
void Init(const AliEMCALGeometry *const geom, Int_t runNumber)
Initialize the analysis engine.
static FJRecoScheme ConvertToFJRecoScheme(ERecoScheme_t reco)
AliVParticle * fDmesonParticle
! pointer to the particle object
static TString GenerateJetName(EJetType_t jetType, EJetAlgo_t jetAlgo, ERecoScheme_t recoScheme, Double_t radius, AliParticleContainer *partCont, AliClusterContainer *clusCont, TString tag)
Select tracks based on specific prescriptions of HF analysis.
ECandidateType_t fCandidateType
Candidate type.
Double_t GetDistance(std::string n, Double_t &deta, Double_t &dphi) const
Int_t fMCLabel
! MC label, i.e. index of the generator level D meson (only for detector level D meson candidates) ...
THashList * CreateHistoGroup(const char *groupname, const char *parent="/")
virtual void Set(const AliDmesonJetInfo &source)
const std::vector< fastjet::PseudoJet > & GetInclusiveJets() const
AliClusterContainer * AddClusterContainer(const char *n)
EJetType_t fJetType
Jet type (charged, full, neutral)
std::pair< AliJetInfo *, Double_t > jet_distance_pair
TH2 * CreateTH2(const char *name, const char *title, int nbinsx, double xmin, double xmax, int nbinsy, double ymin, double ymax, Option_t *opt="")
virtual void Set(const AliDmesonJetInfo &source)
AliTLorentzVector fD
! 4-momentum of the D meson candidate
Double_t GetDistance(const AliJetInfo &jet, Double_t &deta, Double_t &dphi) const
TObject * FindObject(const char *name) const
THashList * GetListOfHistograms() const
AliAnalysisTaskDmesonJets()
This is the default constructor, used for ROOT I/O purposes.
virtual void Reset()
Reset the current object.
AnalysisEngine & operator=(const AnalysisEngine &source)
Struct that encapsulates analysis parameters.
std::vector< AliHFJetDefinition >::iterator FindJetDefinition(const AliHFJetDefinition &eng)
Base task in the EMCAL framework (lighter version of AliAnalysisTaskEmcal)
Double_t Phi_0_2pi() const
Int_t GetDataSlotNumber() const
Double_t fRadius
Jet radius.
void SetAlgorithm(const fastjet::JetAlgorithm &algor)
TH1 * CreateTH1(const char *name, const char *title, int nbins, double xmin, double xmax, Option_t *opt="")
AliClusterContainer * GetClusterContainer(Int_t i=0) const
AliAODTrack * GetBachelor() const
AliRDHFCuts * LoadDMesonCutsFromFile(TString cutfname, TString cutsname)
bool operator<(const AliAnalysisTaskDmesonJets::AliHFJetDefinition &lhs, const AliAnalysisTaskDmesonJets::AliHFJetDefinition &rhs)
std::list< AnalysisEngine >::iterator FindAnalysisEngine(const AnalysisEngine &eng)
std::vector< AliHFJetDefinition > fJetDefinitions
Jet definitions.
Double_t InvMassD0bar() const
EJetAlgo_t fJetAlgo
Jet algorithm (kt, anti-kt,...)
Double_t GetZ(std::string n) const
static const char * GetHFEventRejectionReasonLabel(UInt_t &bitmap)
Lightweight class that encapsulates D*.
virtual void Clear(const Option_t *="")
virtual void Reset()
Reset the object.
Bool_t ExtractDstarAttributes(const AliAODRecoCascadeHF *DstarCand, AliDmesonJetInfo &DmesonJet, UInt_t i)
void FillTH1(const char *hname, double x, double weight=1., Option_t *opt="")
const AliJetInfo * GetJet(std::string n) const
virtual ~AliAnalysisTaskDmesonJets()
This is the standard destructor.
void SetCandidateProperties(Double_t range)
Bool_t ExtractD0Attributes(const AliAODRecoDecayHF2Prong *Dcand, AliDmesonJetInfo &DmesonJet, UInt_t i)
std::vector< AliJetInfo > fJets
! Inclusive jets reconstructed in the current event (includes D meson candidate daughters, if any)
Double_t Phi_0_2pi() const
Select MC particles based on specific prescriptions of HF analysis.
static EMesonDecayChannel_t CheckDecayChannel(const AliAODMCParticle *part, TClonesArray *mcArray)
void SetGhostArea(Double_t gharea)
Double_t fMaxChargedPt
Transverse momentum of the leading charged particle (or track)
std::vector< fastjet::PseudoJet > GetJetConstituents(UInt_t idx) const
static FJJetAlgo ConvertToFJAlgo(EJetAlgo_t algo)
void AdoptRDHFCuts(AliRDHFCuts *cuts)
Class that encapsulates jets.
std::map< std::string, AliJetInfo > fJets
! list of jets
void AddInputVectors(AliEmcalContainer *cont, Int_t offset, TH2 *rejectHist=0)
ClassImp(AliAnalysisTaskCRC) AliAnalysisTaskCRC
AliParticleContainer * GetParticleContainer(Int_t i=0) const
virtual ~AnalysisEngine()
void RunParticleLevelAnalysis()
Run a particle level analysis.
void FindJets(AliHFJetDefinition &jetDef)
Bool_t fApplyKinematicCuts
Apply jet kinematic cuts.
void SetVzRange(Double_t min, Double_t max)
const char * GetName() const
Generate a name for this jet definition.
Bool_t ExtractRecoDecayAttributes(const AliAODRecoDecayHF2Prong *Dcand, AliDmesonJetInfo &DmesonJet, UInt_t i)
Double_t InvMassD0() const
EOutputType_t fOutputType
Output type: none, TTree or THnSparse.
virtual void AddInputVector(Double_t px, Double_t py, Double_t pz, Double_t E, Int_t index=-99999)
bool operator==(const AliAnalysisTaskDmesonJets::AliHFJetDefinition &lhs, const AliAnalysisTaskDmesonJets::AliHFJetDefinition &rhs)
Double_t InvMassDstarKpipi() const
AnalysisEngine * AddAnalysisEngine(ECandidateType_t type, EMCMode_t bkgMode, EJetType_t jettype, Double_t jetradius, TString cutfname="")
Int_t fNOutputTrees
Maximum number of output trees.
virtual Bool_t FillHistograms()
AliHFJetDefinition()
This is the default constructor, used for ROOT I/O purposes.
AliHFJetDefinition & operator=(const AliHFJetDefinition &source)
void SetAreaType(const fastjet::AreaType &atype)
AliTLorentzVector fMomentum
4-momentum of the jet
THnSparse * CreateTHnSparse(const char *name, const char *title, int ndim, const int *nbins, const double *min, const double *max, Option_t *opt="")
AliHFJetDefinition * AddJetDefinition(EJetType_t type, Double_t r, EJetAlgo_t algo, ERecoScheme_t reco)
Container for MC-true particles within the EMCAL framework.
Lightweight class that encapsulates D0.
void SetMakeGeneralHistograms(Bool_t g)
Bool_t IsAnyJetInAcceptance(const AliDmesonJetInfo &dMesonJet) const
void AdoptParticleContainer(AliParticleContainer *cont)
Container for jet within the EMCAL jet framework.
Int_t PostDataFromAnalysisEngine(const AnalysisEngine &eng)
static EMesonOrigin_t CheckOrigin(const AliAODMCParticle *part, TClonesArray *mcArray)
AliFJWrapper * fFastJetWrapper
! Fastjet wrapper
THistManager fHistManager
Histogram manager.
void Reset()
Reset all fields to their default values.
static AliAnalysisTaskDmesonJets * AddTaskDmesonJets(TString ntracks="usedefault", TString nclusters="usedefault", TString nMCpart="", Int_t nMaxTrees=2, TString suffix="")
TTree * BuildTree(const char *taskName)
virtual void Set(const AliDmesonJetInfo &source, std::string n)
Bool_t FillQA(Bool_t applyKinCuts)