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"
54 fD.SetPtEtaPhiE(0,0,0,0);
57 for (std::map<std::string, AliJetInfo>::iterator it =
fJets.begin(); it !=
fJets.end(); it++) {
58 (*it).second.fMomentum.SetPtEtaPhiE(0,0,0,0);
59 (*it).second.fNConstituents = 0;
60 (*it).second.fNEF = 0;
61 (*it).second.fMaxChargedPt = 0;
62 (*it).second.fMaxNeutralPt = 0;
69 Printf(
"Printing D Meson Jet object.");
70 Printf(
"D Meson: pT = %.3f, eta = %.3f, phi = %.3f, inv. mass = %.3f", fD.Pt(), fD.Eta(), fD.Phi_0_2pi(), fD.M());
71 Printf(
"Soft pion pT: %.3f. 2-Prong Invariant mass = %.3f", fSoftPionPt, fInvMass2Prong);
72 for (std::map<std::string, AliJetInfo>::const_iterator it = fJets.begin(); it != fJets.end(); it++) {
73 Printf(
"Jet %s: pT = %.3f, eta = %.3f, phi = %.3f", (*it).first.c_str(), (*it).second.Pt(), (*it).second.Eta(), (*it).second.Phi_0_2pi());
74 Printf(
"Jet N Consituents = %d", (*it).second.fNConstituents);
83 std::map<std::string, AliJetInfo>::const_iterator it = fJets.find(n);
84 if (it == fJets.end())
return 0;
88 if ((*it).second.Pt() > 0) {
89 TVector3 dvect = fD.Vect();
90 TVector3 jvect = (*it).second.fMomentum.Vect();
92 Double_t jetMom = jvect * jvect;
95 ::Error(
"AliAnalysisTaskDmesonJets::AliDmesonJetInfo::GetZ",
"Zero jet momentum!");
99 z = (dvect * jvect) / jetMom;
102 if (z == 1 || (z > 1 && z - 1 < 1e-3)) z = 0.999;
115 std::map<std::string, AliJetInfo>::const_iterator it = fJets.find(n);
116 if (it == fJets.end())
return 0;
118 dphi = TVector2::Phi_mpi_pi(fD.Phi() - (*it).second.Phi());;
119 deta = fD.Eta() - (*it).second.Eta();
120 return TMath::Sqrt(dphi*dphi + deta*deta);
130 return GetDistance(n, deta, dphi);
135 std::map<std::string, AliJetInfo>::const_iterator it = fJets.find(n);
136 if (it == fJets.end()) {
137 ::Error(
"AliAnalysisTaskDmesonJets::AliDmesonJetInfo::GetJet",
"Could not find jet info for the jet definition '%s'!", n.c_str());
140 return &((*it).second);
145 std::map<std::string, AliJetInfo>::iterator it = fJets.find(n);
146 if (it == fJets.end()) {
147 ::Error(
"AliAnalysisTaskDmesonJets::AliDmesonJetInfo::GetJet",
"Could not find jet info for the jet definition '%s'!", n.c_str());
150 return &((*it).second);
189 std::map<std::string, AliJetInfo>::const_iterator it = source.
fJets.find(n);
190 if (it == source.
fJets.end())
return;
192 fPt = (*it).second.Pt();
193 fEta = (*it).second.Eta();
194 fPhi = (*it).second.Phi_0_2pi();
221 fPt = source.
fD.Pt();
222 fEta = source.
fD.Eta();
237 fInvMass(source.fD.M())
243 fInvMass = source.
fD.M();
258 f2ProngInvMass(source.fInvMass2Prong),
259 fDeltaInvMass(source.fD.M() - source.fInvMass2Prong)
336 fJetType(source.fJetType),
337 fRadius(source.fRadius),
338 fJetAlgo(source.fJetAlgo),
339 fRecoScheme(source.fRecoScheme),
340 fAcceptance(source.fAcceptance),
341 fMinJetPt(source.fMinJetPt),
342 fMinJetPhi(source.fMinJetPhi),
343 fMaxJetPhi(source.fMaxJetPhi),
344 fMinJetEta(source.fMinJetEta),
345 fMaxJetEta(source.fMaxJetEta),
346 fMinChargedPt(source.fMinChargedPt),
347 fMaxChargedPt(source.fMaxChargedPt),
348 fMinNeutralPt(source.fMinNeutralPt),
349 fMaxNeutralPt(source.fMaxNeutralPt)
378 if (fMinJetEta < fMaxJetEta && (jet.
Eta() < fMinJetEta || jet.
Eta() > fMaxJetEta))
return kFALSE;
379 if (fMinJetPhi < fMaxJetPhi && (jet.
Phi() < fMinJetPhi || jet.
Phi() > fMaxJetPhi))
return kFALSE;
380 if (jet.
Pt() < fMinJetPt)
return kFALSE;
394 if (!jet)
return kFALSE;
395 return IsJetInAcceptance((*jet));
405 switch (fAcceptance) {
411 SetJetEtaRange(-0.9 + r, 0.9 - r);
412 SetJetPhiRange(0, 0);
421 SetJetEtaRange(geom->GetArm1EtaMin() + r, geom->GetArm1EtaMax() - r);
423 if(run>=177295 && run<=197470) {
424 SetJetPhiRange(1.405 + r,3.135 - r);
427 SetJetPhiRange(geom->GetArm1PhiMin() * TMath::DegToRad() + r, geom->GetEMCALPhiMax() * TMath::DegToRad() - r);
431 AliWarning(
"Could not get instance of AliEMCALGeometry. Using manual settings for EMCAL year 2011!!");
432 SetJetEtaRange(-0.7 + r, 0.7 - r);
433 SetJetPhiRange(1.405 + r, 3.135 - r);
443 SetJetEtaRange(geom->GetArm1EtaMin() + r, geom->GetArm1EtaMax() - r);
444 SetJetPhiRange(geom->GetDCALPhiMin() * TMath::DegToRad() + r, geom->GetDCALPhiMax() * TMath::DegToRad() - r);
447 AliWarning(
"Could not get instance of AliEMCALGeometry. Using manual settings for DCAL year 2015!!");
448 SetJetEtaRange(-0.7 + r, 0.7 - r);
449 SetJetPhiRange(4.538 + r, 5.727 - r);
522 fCurrentDmesonJetInfo(0),
527 fClusterContainer(0),
543 fCandidateType(type),
549 fNMassBins(nMassBins),
560 fCurrentDmesonJetInfo(0),
565 fClusterContainer(0),
578 fCandidateType(source.fCandidateType),
579 fCandidateName(source.fCandidateName),
580 fCandidatePDG(source.fCandidatePDG),
581 fNDaughters(source.fNDaughters),
582 fBranchName(source.fBranchName),
583 fMCMode(source.fMCMode),
584 fNMassBins(source.fNMassBins),
585 fMinMass(source.fMinMass),
586 fMaxMass(source.fMaxMass),
588 fRejectedOrigin(source.fRejectedOrigin),
589 fAcceptedDecay(source.fAcceptedDecay),
590 fInhibit(source.fInhibit),
591 fJetDefinitions(source.fJetDefinitions),
592 fPtBinWidth(source.fPtBinWidth),
593 fMaxPt(source.fMaxPt),
595 fCurrentDmesonJetInfo(0),
597 fCandidateArray(source.fCandidateArray),
598 fMCContainer(source.fMCContainer),
599 fTrackContainer(source.fTrackContainer),
600 fClusterContainer(source.fClusterContainer),
628 for (UInt_t i = 0; i < fJetDefinitions.size(); i++) {
629 if (fJetDefinitions[i].IsJetInAcceptance(dMesonJet, fJetDefinitions[i].GetName()))
return kTRUE;
638 for (Int_t i = 0; i < fJetDefinitions.size(); i++) {
639 fJetDefinitions[i].SetDetectorJetEtaPhiRange(geom, runNumber);
648 switch (fCandidateType) {
651 fCandidateName =
"D0";
653 fPDGdaughters.Set(fNDaughters);
654 fPDGdaughters.Reset();
655 fPDGdaughters[0] = 211;
656 fPDGdaughters[1] = 321;
657 fBranchName =
"D0toKpi";
661 fRDHFCuts->SetStandardCutsPP2010();
662 fRDHFCuts->SetUsePhysicsSelection(kFALSE);
663 fRDHFCuts->SetTriggerClass(
"",
"");
668 fCandidateName =
"DStar";
670 fPDGdaughters.Set(fNDaughters);
671 fPDGdaughters.Reset();
672 fPDGdaughters[0] = 211;
673 fPDGdaughters[1] = 211;
674 fPDGdaughters[2] = 321;
675 fBranchName =
"Dstar";
679 fRDHFCuts->SetStandardCutsPP2010();
680 fRDHFCuts->SetUsePhysicsSelection(kFALSE);
681 fRDHFCuts->SetTriggerClass(
"",
"");
685 ::Error(
"AliAnalysisTaskDmesonJets::AnalysisEngine::SetCandidateProperties",
"Candidate %d unknown!", fCandidateType);
696 if (fRDHFCuts)
delete fRDHFCuts;
706 if (fRDHFCuts)
delete fRDHFCuts;
707 fRDHFCuts =
static_cast<AliRDHFCuts*
>(cuts->Clone());
717 name = TString::Format(
"%s_%s", GetName(), jetDef.
GetName());
729 name = fCandidateName;
732 name +=
"_kBackgroundOnly";
735 name +=
"_kSignalOnly";
755 std::vector<AliHFJetDefinition>::iterator it = FindJetDefinition(def);
757 if (it == fJetDefinitions.end() || *it != def) {
758 fJetDefinitions.push_back(def);
759 ::Info(
"AliAnalysisTaskDmesonJets::AnalysisEngine::AddJetDefinition",
"Jet definition '%s' has been added to analysis engine '%s'."
760 "Total number of jet definitions is now %lu.",
761 def.
GetName(), GetName(), fJetDefinitions.size());
763 if (fMCMode !=
kMCTruth) fJetDefinitions[fJetDefinitions.size()-1].SetChargedPtRange(0., 100.);
766 ::Warning(
"AliAnalysisTaskDmesonJets::AnalysisEngine::AddJetDefinition",
"The same jet definition '%s' was already added in analysis engine '%s'.", def.
GetName(), GetName());
786 return AddJetDefinition(def);
796 std::vector<AliHFJetDefinition>::iterator it = fJetDefinitions.begin();
797 while (it != fJetDefinitions.end() && (*it) != def) it++;
837 DmesonJet.
fD.SetPtEtaPhiM(part->Pt(), part->Eta(), part->Phi(), part->M());
851 return ExtractD0Attributes(Dcand, DmesonJet, i);
854 return ExtractDstarAttributes(static_cast<const AliAODRecoCascadeHF*>(Dcand), DmesonJet, i);
870 Int_t MCtruthPdgCode = 0;
872 Double_t invMassD = 0;
875 Int_t mcLab = Dcand->MatchToMC(fCandidatePDG, fMCContainer->GetArray(), fNDaughters, fPDGdaughters.GetArray());
877 AliAODMCParticle* aodMcPart =
static_cast<AliAODMCParticle*
>(fMCContainer->GetArray()->At(mcLab));
881 EMesonOrigin_t origin = CheckOrigin(aodMcPart, fMCContainer->GetArray());
883 if ((origin & fRejectedOrigin) == origin)
return kFALSE;
885 MCtruthPdgCode = aodMcPart->PdgCode();
892 if (isSelected == 1) {
893 if (i > 0)
return kFALSE;
895 if (fMCMode ==
kNoMC ||
896 (MCtruthPdgCode == fCandidatePDG && fMCMode ==
kSignalOnly) ||
906 else if (isSelected == 2) {
907 if (i > 0)
return kFALSE;
909 if (fMCMode ==
kNoMC ||
910 (MCtruthPdgCode == -fCandidatePDG && fMCMode ==
kSignalOnly) ||
920 else if (isSelected == 3) {
924 if ((MCtruthPdgCode == fCandidatePDG && fMCMode ==
kSignalOnly) ||
926 if (i > 0)
return kFALSE;
930 else if ((MCtruthPdgCode == -fCandidatePDG && fMCMode ==
kSignalOnly) ||
932 if (i > 0)
return kFALSE;
958 DmesonJet.
fD.SetPtEtaPhiM(Dcand->Pt(), Dcand->Eta(), Dcand->Phi(), invMassD);
971 if (i > 0)
return kFALSE;
973 Int_t MCtruthPdgCode = 0;
975 Double_t invMassD = 0;
978 Int_t pdgDgDStartoD0pi[2] = { 421, 211 };
979 Int_t pdgDgD0toKpi[2] = { 321, 211 };
981 Int_t mcLab = DstarCand->
MatchToMC(fCandidatePDG, 421, pdgDgDStartoD0pi, pdgDgD0toKpi, fMCContainer->GetArray());
984 AliAODMCParticle* aodMcPart =
static_cast<AliAODMCParticle*
>(fMCContainer->GetArray()->At(mcLab));
988 EMesonOrigin_t origin = CheckOrigin(aodMcPart, fMCContainer->GetArray());
990 if ((origin & fRejectedOrigin) == origin)
return kFALSE;
993 MCtruthPdgCode = aodMcPart->PdgCode();
999 Int_t absMCtruthPdgCode = TMath::Abs(MCtruthPdgCode);
1000 if (fMCMode ==
kNoMC ||
1001 (absMCtruthPdgCode == 413 && fMCMode ==
kSignalOnly) ||
1007 DmesonJet.
fD.SetPtEtaPhiM(DstarCand->Pt(), DstarCand->Eta(), DstarCand->Phi(), invMassD);
1028 Int_t absPdgPart = TMath::Abs(part->GetPdgCode());
1030 if (part->GetNDaughters() == 2) {
1032 AliAODMCParticle* d1 =
static_cast<AliAODMCParticle*
>(mcArray->At(part->GetDaughter(0)));
1033 AliAODMCParticle* d2 =
static_cast<AliAODMCParticle*
>(mcArray->At(part->GetDaughter(1)));
1039 Int_t absPdg1 = TMath::Abs(d1->GetPdgCode());
1040 Int_t absPdg2 = TMath::Abs(d2->GetPdgCode());
1042 if (absPdgPart == 421) {
1044 if ((absPdg1 == 211 && absPdg2 == 321) ||
1045 (absPdg1 == 321 && absPdg2 == 211)) {
1050 if (absPdgPart == 413) {
1052 if (absPdg1 == 421 && absPdg2 == 211) {
1053 Int_t D0decay = CheckDecayChannel(d1, mcArray);
1059 if (absPdg1 == 211 && absPdg2 == 421) {
1060 Int_t D0decay = CheckDecayChannel(d2, mcArray);
1084 Int_t pdgGranma = 0;
1085 Int_t mother = part->GetMother();
1087 Int_t abspdgGranma = 0;
1088 Bool_t isFromB = kFALSE;
1089 Bool_t isQuarkFound = kFALSE;
1091 while (mother >= 0) {
1093 AliAODMCParticle* mcGranma =
static_cast<AliAODMCParticle*
>(mcArray->At(mother));
1094 if (mcGranma >= 0) {
1095 pdgGranma = mcGranma->GetPdgCode();
1096 abspdgGranma = TMath::Abs(pdgGranma);
1097 if ((abspdgGranma > 500 && abspdgGranma < 600) || (abspdgGranma > 5000 && abspdgGranma < 6000)) {
1101 if (abspdgGranma == 4 || abspdgGranma == 5) isQuarkFound = kTRUE;
1102 mother = mcGranma->GetMother();
1105 ::Error(
"AliAnalysisTaskDmesonJets::AnalysisParams::CheckOrigin",
"Could not retrieve mother particle %d!", mother);
1126 fDmesonJets.clear();
1129 RunParticleLevelAnalysis();
1132 RunDetectorLevelAnalysis();
1139 const Int_t nD = fCandidateArray->GetEntriesFast();
1143 Int_t nAccCharm = 0;
1144 for (Int_t icharm = 0; icharm < nD; icharm++) {
1145 Int_t isSelected = 0;
1148 if (!charmCand)
continue;
1150 Int_t nprongs = charmCand->GetNProngs();
1153 if (!charmCand->InheritsFrom(
"AliAODRecoCascadeHF")) {
1154 ::Error(
"AliAnalysisTaskDmesonJets::AnalysisParams::RunDetectorLevelAnalysis",
"Candidate type is D* but object type is wrong (should be AliAODRecoCascadeHF)");
1160 if (!fRDHFCuts->IsInFiducialAcceptance(charmCand->Pt(), charmCand->Y(fCandidatePDG)))
continue;
1165 if (!isSelected)
continue;
1167 for (Int_t im = 0; im < 2; im++) {
1169 if (ExtractRecoDecayAttributes(charmCand, DmesonJet, im)) {
1170 for (std::vector<AliHFJetDefinition>::iterator itdef = fJetDefinitions.begin(); itdef != fJetDefinitions.end(); itdef++) {
1171 if (!FindJet(charmCand, DmesonJet, *itdef)) {
1172 AliWarning(Form(
"Could not find jet '%s' for D meson '%s': pT = %.3f, eta = %.3f, phi = %.3f",
1173 (*itdef).GetName(), GetName(), DmesonJet.
fD.Pt(), DmesonJet.
fD.Eta(), DmesonJet.
fD.
Phi_0_2pi()));
1176 fDmesonJets.push_back(DmesonJet);
1184 hname = TString::Format(
"%s/fHistNAcceptedDmesons", GetName());
1187 hname = TString::Format(
"%s/fHistNDmesons", GetName());
1212 fTrackContainer->SetDMesonCandidate(Dcand);
1213 hname = TString::Format(
"%s/%s/fHistTrackRejectionReason", GetName(), jetDef.
GetName());
1216 hname = TString::Format(
"%s/%s/fHistDMesonDaughterNotInJet", GetName(), jetDef.
GetName());
1218 const TObjArray daughterNotInJet = fTrackContainer->GetDaughterList();
1219 for (Int_t i = 0; i < daughterNotInJet.GetEntriesFast(); i++) {
1220 AliVParticle* daughter =
static_cast<AliVParticle*
>(daughterNotInJet.At(i));
1221 if (!daughter)
continue;
1222 histDaughterNotInJet->Fill(daughter->Pt());
1227 hname = TString::Format(
"%s/%s/fHistClusterRejectionReason", GetName(), jetDef.
GetName());
1236 for (UInt_t ijet = 0; ijet < jets_incl.size(); ++ijet) {
1239 Bool_t isDmesonJet = kFALSE;
1241 Double_t maxChPt = 0;
1242 Double_t maxNePt = 0;
1243 Double_t totalNeutralPt = 0;
1245 for (UInt_t ic = 0; ic < constituents.size(); ++ic) {
1246 if (constituents[ic].user_index() == 0) {
1247 isDmesonJet = kTRUE;
1249 else if (constituents[ic].user_index() >= 100) {
1250 if (constituents[ic].pt() > maxChPt) maxChPt = constituents[ic].pt();
1252 else if (constituents[ic].user_index() <= -100) {
1253 totalNeutralPt += constituents[ic].pt();
1254 if (constituents[ic].pt() > maxNePt) maxChPt = constituents[ic].pt();
1259 DmesonJet.
fJets[jetDef.
GetName()].fMomentum.SetPxPyPzE(jets_incl[ijet].px(), jets_incl[ijet].py(), jets_incl[ijet].pz(), jets_incl[ijet].E());
1260 DmesonJet.
fJets[jetDef.
GetName()].fNConstituents = constituents.size();
1261 DmesonJet.
fJets[jetDef.
GetName()].fMaxChargedPt = maxChPt;
1262 DmesonJet.
fJets[jetDef.
GetName()].fMaxNeutralPt = maxNePt;
1263 DmesonJet.
fJets[jetDef.
GetName()].fNEF = totalNeutralPt / jets_incl[ijet].pt();
1278 for (Int_t i = 0; i < cont->GetNEntries(); i++) {
1279 cont->GetMomentum(part, i);
1280 UInt_t rejectionReason = 0;
1281 if (!cont->AcceptObject(i, rejectionReason)) {
1282 rejectHist->Fill(cont->GetRejectionReasonBitPosition(rejectionReason), part.Pt());
1285 Int_t uid = offset >= 0 ? i : -i;
1296 fMCContainer->SetSpecialPDG(fCandidatePDG);
1297 fMCContainer->SetRejectedOriginMap(fRejectedOrigin);
1298 fMCContainer->SetAcceptedDecayMap(fAcceptedDecay);
1300 std::map<int, AliDmesonJetInfo> dMesonJets;
1302 for (std::vector<AliHFJetDefinition>::iterator itdef = fJetDefinitions.begin(); itdef != fJetDefinitions.end(); itdef++) {
1310 hname = TString::Format(
"%s/%s/fHistClusterRejectionReason", GetName(), jetDef->
GetName());
1317 for (UInt_t ijet = 0; ijet < jets_incl.size(); ++ijet) {
1320 Bool_t isDmesonJet = kFALSE;
1322 for (UInt_t ic = 0; ic < constituents.size(); ++ic) {
1323 Int_t iPart = constituents[ic].user_index() - 100;
1324 AliVParticle* part = fMCContainer->GetParticle(iPart);
1326 ::Error(
"AliAnalysisTaskDmesonJets::AnalysisEngine::RunParticleLevelAnalysis",
"Could not find jet constituent %d!", iPart);
1329 if (part->PdgCode() == fCandidatePDG) {
1330 std::map<int, AliDmesonJetInfo>::iterator dMesonJetIt = dMesonJets.find(iPart);
1331 if (dMesonJetIt == dMesonJets.end()) {
1332 std::pair<int, AliDmesonJetInfo> element;
1333 element.first = iPart;
1335 dMesonJetIt = dMesonJets.insert(element).first;
1336 (*dMesonJetIt).second.fD.SetPxPyPzE(part->Px(), part->Py(), part->Pz(), part->E());
1339 (*dMesonJetIt).second.fJets[jetDef->
GetName()].fMomentum.SetPxPyPzE(jets_incl[ijet].px(), jets_incl[ijet].py(), jets_incl[ijet].pz(), jets_incl[ijet].E());
1346 for (std::map<int, AliDmesonJetInfo>::iterator dMesonJetIt = dMesonJets.begin();
1347 dMesonJetIt != dMesonJets.end();
1349 fDmesonJets.push_back((*dMesonJetIt).second);
1359 switch (fCandidateType) {
1361 classname =
"AliAnalysisTaskDmesonJets::AliD0InfoSummary";
1365 classname =
"AliAnalysisTaskDmesonJets::AliDStarInfoSummary";
1369 fTree =
new TTree(GetName(), GetName());
1370 fTree->Branch(
"DmesonJet", classname, &fCurrentDmesonJetInfo, 32000, 0);
1372 for (Int_t i = 0; i < fJetDefinitions.size(); i++) {
1374 fTree->Branch(fJetDefinitions[i].GetName(),
"AliAnalysisTaskDmesonJets::AliJetInfoSummary", &fCurrentJetInfo[i]);
1387 Int_t
nPtBins = TMath::CeilNint(fMaxPt / fPtBinWidth);
1389 for (std::vector<AliHFJetDefinition>::const_iterator it = fJetDefinitions.begin(); it != fJetDefinitions.end(); it++) {
1392 AliDebug(2,Form(
"Now working on '%s'", jetDef->
GetName()));
1394 Double_t radius = jetDef->
fRadius;
1396 TString
title[30] = {
""};
1397 Int_t
nbins[30] = {0 };
1398 Double_t min [30] = {0.};
1399 Double_t max [30] = {0.};
1402 title[dim] =
"#it{p}_{T,D} (GeV/#it{c})";
1409 title[dim] =
"#eta_{D}";
1415 title[dim] =
"#phi_{D} (rad)";
1418 max[dim] = TMath::TwoPi();
1423 title[dim] =
"#it{M}_{K#pi#pi} (GeV/#it{c}^{2})";
1424 nbins[dim] = fNMassBins;
1425 min[dim] = fMinMass;
1426 max[dim] = fMaxMass;
1431 title[dim] =
"#it{M}_{K#pi} (GeV/#it{c}^{2})";
1432 nbins[dim] = fNMassBins;
1433 min[dim] = fMinMass;
1434 max[dim] = fMaxMass;
1439 title[dim] =
"#it{M}_{K#pi} (GeV/#it{c}^{2})";
1440 nbins[dim] = fNMassBins;
1446 title[dim] =
"#it{M}_{K#pi#pi} - #it{M}_{K#pi} (GeV/#it{c}^{2})";
1447 nbins[dim] = fNMassBins*6;
1451 Double_t D0mass = TDatabasePDG::Instance()->GetParticle(421)->Mass();
1459 title[dim] =
"#it{p}_{T,#pi} (GeV/#it{c})";
1466 title[dim] =
"#it{z}_{D}";
1472 if ((enabledAxis &
kDeltaR) != 0) {
1473 title[dim] =
"#Delta R_{D-jet}";
1476 max[dim] = radius * 1.5;
1481 title[dim] =
"#eta_{D} - #eta_{jet}";
1483 min[dim] = -radius * 1.2;
1484 max[dim] = radius * 1.2;
1489 title[dim] =
"#phi_{D} - #phi_{jet} (rad)";
1491 min[dim] = -radius * 1.2;
1492 max[dim] = radius * 1.2;
1496 title[dim] =
"#it{p}_{T,jet} (GeV/#it{c})";
1503 title[dim] =
"#eta_{jet}";
1509 title[dim] =
"#phi_{jet} (rad)";
1512 max[dim] = TMath::TwoPi();
1517 title[dim] =
"No. of constituents";
1524 hname = TString::Format(
"%s/%s/fDmesonJets", GetName(), jetDef->
GetName());
1526 for (Int_t j = 0; j < dim; j++) {
1527 h->GetAxis(j)->SetTitle(title[j]);
1539 for (Int_t
id = 0;
id < fDmesonJets.size();
id++) {
1540 fCurrentDmesonJetInfo->Set(fDmesonJets[
id]);
1542 for (UInt_t ij = 0; ij < fJetDefinitions.size(); ij++) {
1543 fCurrentJetInfo[ij]->Reset();
1544 AliJetInfo* jet = fDmesonJets[id].GetJet(fJetDefinitions[ij].GetName());
1546 if (applyKinCuts && !fJetDefinitions[ij].IsJetInAcceptance(*jet)) {
1547 hname = TString::Format(
"%s/%s/fHistRejectedJetPt", GetName(), fJetDefinitions[ij].GetName());
1549 hname = TString::Format(
"%s/%s/fHistRejectedJetPhi", GetName(), fJetDefinitions[ij].GetName());
1551 hname = TString::Format(
"%s/%s/fHistRejectedJetEta", GetName(), fJetDefinitions[ij].GetName());
1555 fCurrentJetInfo[ij]->Set(fDmesonJets[
id], fJetDefinitions[ij].GetName());
1562 hname = TString::Format(
"%s/fHistRejectedDMesonPt", GetName());
1564 hname = TString::Format(
"%s/fHistRejectedDMesonPhi", GetName());
1566 hname = TString::Format(
"%s/fHistRejectedDMesonEta", GetName());
1569 hname = TString::Format(
"%s/fHistRejectedDMesonInvMass", GetName());
1573 hname = TString::Format(
"%s/fHistRejectedDMeson2ProngInvMass", GetName());
1576 hname = TString::Format(
"%s/fHistRejectedDMesonDeltaInvMass", GetName());
1591 for (Int_t
id = 0;
id < fDmesonJets.size();
id++) {
1592 if (!IsAnyJetInAcceptance(fDmesonJets[
id])) {
1593 hname = TString::Format(
"%s/fHistRejectedDMesonPt", GetName());
1595 hname = TString::Format(
"%s/fHistRejectedDMesonPhi", GetName());
1597 hname = TString::Format(
"%s/fHistRejectedDMesonEta", GetName());
1602 for (std::vector<AliHFJetDefinition>::iterator itdef = fJetDefinitions.begin(); itdef != fJetDefinitions.end(); itdef++) {
1606 hname = TString::Format(
"%s/%s/fDmesonJets", GetName(), jetDef->
GetName());
1609 for (Int_t
id = 0;
id < fDmesonJets.size();
id++) {
1613 hname = TString::Format(
"%s/%s/fHistRejectedJetPt", GetName(), jetDef->
GetName());
1615 hname = TString::Format(
"%s/%s/fHistRejectedJetPhi", GetName(), jetDef->
GetName());
1617 hname = TString::Format(
"%s/%s/fHistRejectedJetEta", GetName(), jetDef->
GetName());
1621 FillHnSparse(h, fDmesonJets[
id], (*itdef).GetName());
1637 Double_t contents[30] = {0.};
1639 Double_t z = DmesonJet.
GetZ(n);
1640 Double_t deltaPhi = 0;
1641 Double_t deltaEta = 0;
1642 Double_t deltaR = DmesonJet.
GetDistance(n, deltaEta, deltaPhi);
1644 std::map<std::string, AliJetInfo>::const_iterator it = DmesonJet.
fJets.find(n);
1645 if (it == DmesonJet.
fJets.end())
return kFALSE;
1647 for (Int_t i = 0; i < h->GetNdimensions(); i++) {
1648 TString
title(h->GetAxis(i)->GetTitle());
1649 if (
title==
"#it{p}_{T,D} (GeV/#it{c})") contents[i] = DmesonJet.
fD.Pt();
1650 else if (
title==
"#eta_{D}") contents[i] = DmesonJet.
fD.Eta();
1653 else if (
title==
"#it{M}_{K#pi#pi} (GeV/#it{c}^{2})") contents[i] = DmesonJet.
fD.M();
1654 else if (
title==
"#it{M}_{K#pi#pi} - #it{M}_{K#pi} (GeV/#it{c}^{2})") contents[i] = DmesonJet.
fD.M() - DmesonJet.
fInvMass2Prong;
1655 else if (
title==
"#it{p}_{T,#pi} (GeV/#it{c})") contents[i] = DmesonJet.
fSoftPionPt;
1656 else if (
title==
"#it{z}_{D}") contents[i] = z;
1657 else if (
title==
"#Delta R_{D-jet}") contents[i] = deltaR;
1658 else if (
title==
"#eta_{D} - #eta_{jet}") contents[i] = deltaEta;
1659 else if (
title==
"#phi_{D} - #phi_{jet} (rad)") contents[i] = deltaPhi;
1660 else if (
title==
"#it{p}_{T,jet} (GeV/#it{c})") contents[i] = (*it).second.Pt();
1661 else if (
title==
"#eta_{jet}") contents[i] = (*it).second.Eta();
1662 else if (
title==
"#phi_{jet} (rad)") contents[i] = (*it).second.Phi_0_2pi();
1663 else if (
title==
"No. of constituents") contents[i] = (*it).second.fNConstituents;
1664 else AliWarning(Form(
"Unable to fill dimension '%s'!",
title.Data()));
1698 fEnabledAxis(k2ProngInvMass),
1699 fTreeOutput(kFALSE),
1701 fApplyKinematicCuts(kTRUE),
1723 TFile* filecuts = TFile::Open(cutfname);
1724 if (!filecuts || filecuts->IsZombie()) {
1725 ::Warning(
"AddTaskDmesonJets",
"Input file not found: will use std cuts.");
1730 analysiscuts =
dynamic_cast<AliRDHFCuts*
>(filecuts->Get(cutsname));
1731 if (!analysiscuts) {
1732 ::Warning(
"AddTaskDmesonJetCorr",
"Could not find analysis cuts '%s' in '%s'. Using std cuts.", cutsname.Data(), cutfname.Data());
1736 return analysiscuts;
1765 if (!cutfname.IsNull()) {
1770 cutsname =
"D0toKpiCuts";
1773 cutsname =
"DStartoKpipiCuts";
1789 ::Info(
"AliAnalysisTaskDmesonJets::AddAnalysisEngine",
"A new analysis engine '%s' has been added. The total number of analysis engines is %lu.", eng.
GetName(jetDef),
fAnalysisEngines.size());
1793 ::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());
1796 if (cuts && found_eng->
fRDHFCuts != 0) {
1797 ::Warning(
"AliAnalysisTaskDmesonJets::AddAnalysisEngine",
"D meson cuts were already defined for this D meson type. They will be overwritten.");
1815 ::Info(
"UserCreateOutputObjects",
"CreateOutputObjects of task %s", GetName());
1826 ::Info(
"AliAnalysisTaskDmesonJets::UserCreateOutputObjects",
"Allocating histograms for task '%s' (%lu analysis engines)", GetName(),
fAnalysisEngines.size());
1829 ::Info(
"AliAnalysisTaskDmesonJets::UserCreateOutputObjects",
"Allocating histograms for analysis engine '%s' (%lu jet definitions)", param->
GetName(), param->
fJetDefinitions.size());
1835 hname = TString::Format(
"%s/fHistNAcceptedDmesons", param->
GetName());
1836 htitle = hname +
";Number of D accepted meson candidates;counts";
1839 hname = TString::Format(
"%s/fHistNDmesons", param->
GetName());
1840 htitle = hname +
";Number of D meson candidates;counts";
1843 hname = TString::Format(
"%s/fHistNEvents", param->
GetName());
1844 htitle = hname +
";Event status;counts";
1846 h->GetXaxis()->SetBinLabel(1,
"Accepted");
1847 h->GetXaxis()->SetBinLabel(2,
"Rejected");
1849 hname = TString::Format(
"%s/fHistEventRejectionReasons", param->
GetName());
1850 htitle = hname +
";Rejection reason;counts";
1853 hname = TString::Format(
"%s/fHistRejectedDMesonPt", param->
GetName());
1854 htitle = hname +
";#it{p}_{T,D} (GeV/#it{c});counts";
1857 hname = TString::Format(
"%s/fHistRejectedDMesonEta", param->
GetName());
1858 htitle = hname +
";#it{#eta}_{D};counts";
1861 hname = TString::Format(
"%s/fHistRejectedDMesonPhi", param->
GetName());
1862 htitle = hname +
";#it{#phi}_{D};counts";
1866 hname = TString::Format(
"%s/fHistRejectedDMesonInvMass", param->
GetName());
1867 htitle = hname +
";#it{M}_{K#pi} (GeV/#it{c}^{2});counts";
1874 hname = TString::Format(
"%s/fHistRejectedDMeson2ProngInvMass", param->
GetName());
1875 htitle = hname +
";#it{M}_{K#pi} (GeV/#it{c}^{2});counts";
1879 Double_t D0mass = TDatabasePDG::Instance()->GetParticle(421)->Mass();
1880 hname = TString::Format(
"%s/fHistRejectedDMesonDeltaInvMass", param->
GetName());
1881 htitle = hname +
";#it{M}_{K#pi#pi} - #it{M}_{K#pi} (GeV/#it{c}^{2});counts";
1888 ::Info(
"AliAnalysisTaskDmesonJets::UserCreateOutputObjects",
"Allocating histograms for jet definition '%s'", jetDef->
GetName());
1892 hname = TString::Format(
"%s/%s/fHistMCParticleRejectionReason", param->
GetName(), jetDef->
GetName());
1893 htitle = hname +
";Track rejection reason;#it{p}_{T,track} (GeV/#it{c});counts";
1897 hname = TString::Format(
"%s/%s/fHistTrackRejectionReason", param->
GetName(), jetDef->
GetName());
1898 htitle = hname +
";Track rejection reason;#it{p}_{T,track} (GeV/#it{c});counts";
1902 hname = TString::Format(
"%s/%s/fHistClusterRejectionReason", param->
GetName(), jetDef->
GetName());
1903 htitle = hname +
";Cluster rejection reason;#it{p}_{T,cluster} (GeV/#it{c});counts";
1907 hname = TString::Format(
"%s/%s/fHistDMesonDaughterNotInJet", param->
GetName(), jetDef->
GetName());
1908 htitle = hname +
";#it{p}_{T,track} (GeV/#it{c});counts";
1911 hname = TString::Format(
"%s/%s/fHistRejectedJetPt", param->
GetName(), jetDef->
GetName());
1912 htitle = hname +
";#it{p}_{T,jet} (GeV/#it{c});counts";
1915 hname = TString::Format(
"%s/%s/fHistRejectedJetEta", param->
GetName(), jetDef->
GetName());
1916 htitle = hname +
";#it{#eta}_{jet};counts";
1919 hname = TString::Format(
"%s/%s/fHistRejectedJetPhi", param->
GetName(), jetDef->
GetName());
1920 htitle = hname +
";#it{#phi}_{jet};counts";
1944 fAodEvent =
dynamic_cast<AliAODEvent*
>(fInputEvent);
1952 AliError(Form(
"This task need an AOD event! Task '%s' will be disabled!", GetName()));
1967 if (!params->
fCandidateArray->GetClass()->InheritsFrom(
"AliAODRecoDecayHF2Prong")) {
1968 ::Error(
"AliAnalysisTaskDmesonJets::ExecOnce",
1969 "%s: Objects of type %s in %s are not inherited from AliAODRecoDecayHF2Prong! Task will be disabled!",
1976 ::Error(
"AliAnalysisTaskDmesonJets::ExecOnce",
1977 "Could not find candidate array '%s', skipping the event. Analysis engine '%s' will be disabled!",
1989 ::Error(
"AliAnalysisTaskDmesonJets::ExecOnce",
1990 "No MC particle container was provided. Analysis engine '%s' will be disabled!",
2003 ::Error(
"AliAnalysisTaskDmesonJets::ExecOnce",
2004 "No track container and no cluster container were provided. Analysis engine '%s' will be disabled!",
2023 if (!
fAodEvent->GetPrimaryVertex() || TMath::Abs(
fAodEvent->GetMagneticField()) < 0.001)
return kFALSE;
2031 hname = TString::Format(
"%s/fHistNEvents", eng->
GetName());
2033 if (!iseventselected) {
2035 hname = TString::Format(
"%s/fHistEventRejectionReasons", eng->
GetName());
2040 if (label.IsNull())
break;
2049 AliDebug(2,
"Event selected");
2086 TParticlePDG* part = TDatabasePDG::Instance()->GetParticle(TMath::Abs(pdg));
2088 Double_t
mass = part->Mass();
2091 if (nbins % 2 == 0) {
2092 minMass = mass - range / 2 - range / nbins / 2;
2093 maxMass = mass + range / 2 - range / nbins / 2;
2096 minMass = mass - range / 2;
2097 maxMass = mass + range / 2;
2108 static TString label;
2112 label =
"NotSelTrigger";
2114 return label.Data();
2119 return label.Data();
2122 label =
"TooFewVtxContrib";
2124 return label.Data();
2127 label =
"ZVtxOutFid";
2129 return label.Data();
2134 return label.Data();
2137 label =
"OutsideCentrality";
2139 return label.Data();
2142 label =
"PhysicsSelection";
2144 return label.Data();
2147 label =
"BadSPDVertex";
2149 return label.Data();
2152 label =
"ZVtxSPDOutFid";
2154 return label.Data();
2157 label =
"CentralityFlattening";
2159 return label.Data();
2162 label =
"BadTrackV0Correl";
2164 return label.Data();
2167 return label.Data();
void SetRejectionReasonLabels(TAxis *axis)
void Print() const
Prints the content of this object in the standard output.
void UserCreateOutputObjects()
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.
TList * fOutput
!output list
Bool_t IsJetInAcceptance(const AliJetInfo &jet) const
Double_t fSoftPionPt
! Transverse momentum of the soft pion of the D* candidate
AliRDHFCuts * fRDHFCuts
D meson candidates cuts.
THistManager * fHistManager
! Histograms
void RunAnalysis()
Run the analysis.
Lightweight class that encapsulates D meson jets.
Bool_t FillHnSparse(Bool_t applyKinCuts)
Bool_t fTreeOutput
If true, output will be posted in a TTree rather than a THnSparse.
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.
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
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)
static TString GenerateJetName(EJetType_t jetType, EJetAlgo_t jetAlgo, ERecoScheme_t recoScheme, Double_t radius, AliParticleContainer *partCont, AliClusterContainer *clusCont, TString tag)
AliAODEvent * fAodEvent
! AOD event
Select tracks based on specific prescriptions of HF analysis.
ECandidateType_t fCandidateType
Candidate type.
static EMesonOrigin_t CheckOrigin(AliAODMCParticle *part, TClonesArray *mcArray)
Double_t GetDistance(std::string n, Double_t &deta, Double_t &dphi) const
THashList * CreateHistoGroup(const char *groupname, const char *parent="/")
virtual void Set(const AliDmesonJetInfo &source)
const std::vector< fastjet::PseudoJet > & GetInclusiveJets() const
EJetType_t fJetType
Jet type (charged, full, neutral)
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
TObject * FindObject(const char *name) const
THashList * GetListOfHistograms() const
AliAnalysisTaskDmesonJets()
This is the default constructor, used for ROOT I/O purposes.
AliClusterContainer * fClusterContainer
! Cluster container
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
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)
static EMesonDecayChannel_t CheckDecayChannel(AliAODMCParticle *part, TClonesArray *mcArray)
Int_t fNMassBins
Mass number of bins.
EJetAcceptanceType_t fAcceptance
Jet acceptance.
Double_t fMaxMass
Max mass in histogram axis.
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)
virtual void Clear(const Option_t *="")
Bool_t fInhibit
Inhibit the task.
UInt_t GetEventRejectionBitMap() const
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
TClonesArray * fCandidateArray
! D meson candidate array
vector< AliHFJetDefinition > fJetDefinitions
Jet definitions.
virtual ~AliAnalysisTaskDmesonJets()
This is the standard destructor.
void SetCandidateProperties(Double_t range)
Bool_t ExtractD0Attributes(const AliAODRecoDecayHF2Prong *Dcand, AliDmesonJetInfo &DmesonJet, UInt_t i)
Bool_t ExtractParticleLevelHFAttributes(const AliAODMCParticle *part, AliDmesonJetInfo &DmesonJet)
Double_t Phi_0_2pi() const
Select MC particles based on specific prescriptions of HF analysis.
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)
Bool_t IsEventSelected(AliVEvent *event)
Class that encapsulates jets.
std::map< std::string, AliJetInfo > fJets
! list of jets
ClassImp(AliAnalysisTaskCRC) AliAnalysisTaskCRC
AliParticleContainer * GetParticleContainer(Int_t i=0) const
virtual ~AnalysisEngine()
void RunParticleLevelAnalysis()
Run a particle level analysis.
Bool_t fApplyKinematicCuts
Apply jet kinematic cuts.
const char * GetName() const
Generate a name for this jet definition.
void SetDetectorJetEtaPhiRange(const AliEMCALGeometry *const geom, Int_t run)
Bool_t ExtractRecoDecayAttributes(const AliAODRecoDecayHF2Prong *Dcand, AliDmesonJetInfo &DmesonJet, UInt_t i)
Double_t InvMassD0() const
list< AnalysisEngine > fAnalysisEngines
Array of analysis parameters.
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="")
TString fBranchName
AOD branch where the D meson candidate are found.
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)
THnSparse * CreateTHnSparse(const char *name, const char *title, int ndim, const int *nbins, const double *min, const double *max, Option_t *opt="")
AliHFAODMCParticleContainer * fMCContainer
! MC particle container
AliFJWrapper * fFastJetWrapper
! Fastjet wrapper
AliHFJetDefinition * AddJetDefinition(EJetType_t type, Double_t r, EJetAlgo_t algo, ERecoScheme_t reco)
void AddInputVectors(AliEmcalContainer *cont, Int_t offset, TH2 *rejectHist)
Lightweight class that encapsulates D0.
AliHFTrackContainer * fTrackContainer
! Track container
void SetMakeGeneralHistograms(Bool_t g)
Bool_t IsAnyJetInAcceptance(const AliDmesonJetInfo &dMesonJet) const
Container for jet within the EMCAL jet framework.
AliFJWrapper * fFastJetWrapper
! Fastjet wrapper
THistManager fHistManager
Histogram manager.
void Reset()
Reset all fields to their default values.
virtual void Set(const AliDmesonJetInfo &source, std::string n)
Double_t fMinMass
Min mass in histogram axis.