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"
63 dphi = TVector2::Phi_mpi_pi(
fMomentum.Phi() - jet.
Phi());;
65 return TMath::Sqrt(dphi*dphi + deta*deta);
76 return GetDistance(jet, deta, dphi);
88 fD.SetPtEtaPhiE(0,0,0,0);
93 fReconstructed = kFALSE;
94 for (
auto &jet : fJets) {
95 jet.second.fMomentum.SetPtEtaPhiE(0,0,0,0);
96 jet.second.fNConstituents = 0;
98 jet.second.fMaxChargedPt = 0;
99 jet.second.fMaxNeutralPt = 0;
106 Printf(
"Printing D Meson Jet object.");
107 Printf(
"D Meson: pT = %.3f, eta = %.3f, phi = %.3f, inv. mass = %.3f", fD.Pt(), fD.Eta(), fD.Phi_0_2pi(), fD.M());
108 Printf(
"Soft pion pT: %.3f. 2-Prong Invariant mass = %.3f", fSoftPionPt, fInvMass2Prong);
109 for (
auto &jet : fJets) {
110 Printf(
"Jet %s: pT = %.3f, eta = %.3f, phi = %.3f", jet.first.c_str(), jet.second.Pt(), jet.second.Eta(), jet.second.Phi_0_2pi());
111 Printf(
"Jet N Consituents = %d", jet.second.fNConstituents);
120 std::map<std::string, AliJetInfo>::const_iterator it = fJets.find(n);
121 if (it == fJets.end())
return 0;
125 if ((*it).second.Pt() > 0) {
126 TVector3 dvect = fD.Vect();
127 TVector3 jvect = (*it).second.fMomentum.Vect();
129 Double_t jetMom = jvect * jvect;
132 ::Error(
"AliAnalysisTaskDmesonJets::AliDmesonJetInfo::GetZ",
"Zero jet momentum!");
136 z = (dvect * jvect) / jetMom;
139 if (z == 1 || (z > 1 && z - 1 < 1e-3)) z = 0.999;
153 std::map<std::string, AliJetInfo>::const_iterator it = fJets.find(n);
154 if (it == fJets.end())
return 0;
156 return GetDistance((*it).second, deta, dphi);
167 return GetDistance(n, deta, dphi);
178 dphi = TVector2::Phi_mpi_pi(fD.Phi() - jet.
Phi());;
179 deta = fD.Eta() - jet.
Eta();
180 return TMath::Sqrt(dphi*dphi + deta*deta);
191 return GetDistance(jet, deta, dphi);
200 std::map<std::string, AliJetInfo>::const_iterator it = fJets.find(n);
201 if (it == fJets.end()) {
202 ::Error(
"AliAnalysisTaskDmesonJets::AliDmesonJetInfo::GetJet",
"Could not find jet info for the jet definition '%s'!",
206 return &((*it).second);
215 std::map<std::string, AliJetInfo>::iterator it = fJets.find(n);
216 if (it == fJets.end()) {
217 ::Error(
"AliAnalysisTaskDmesonJets::AliDmesonJetInfo::GetJet",
"Could not find jet info for the jet definition '%s'!",
221 return &((*it).second);
260 std::map<std::string, AliJetInfo>::const_iterator it = source.
fJets.find(n);
261 if (it == source.
fJets.end())
return;
263 fPt = (*it).second.Pt();
264 fEta = (*it).second.Eta();
265 fPhi = (*it).second.Phi_0_2pi();
304 fPt = source.
fD.Pt();
305 fEta = source.
fD.Eta();
328 fInvMass(source.fD.M())
337 fInvMass = source.
fD.M();
360 f2ProngInvMass(source.fInvMass2Prong),
361 fDeltaInvMass(source.fD.M() - source.fInvMass2Prong)
440 fJetType(source.fJetType),
441 fRadius(source.fRadius),
442 fJetAlgo(source.fJetAlgo),
443 fRecoScheme(source.fRecoScheme),
444 fMinJetPt(source.fMinJetPt),
445 fMaxJetPt(source.fMaxJetPt),
446 fMinJetPhi(source.fMinJetPhi),
447 fMaxJetPhi(source.fMaxJetPhi),
448 fMinJetEta(source.fMinJetEta),
449 fMaxJetEta(source.fMaxJetEta),
450 fMinChargedPt(source.fMinChargedPt),
451 fMaxChargedPt(source.fMaxChargedPt),
452 fMinNeutralPt(source.fMinNeutralPt),
453 fMaxNeutralPt(source.fMaxNeutralPt)
482 if (fMinJetEta < fMaxJetEta && (jet.
Eta() < fMinJetEta || jet.
Eta() > fMaxJetEta))
return kFALSE;
483 if (fMinJetPhi < fMaxJetPhi && (jet.
Phi() < fMinJetPhi || jet.
Phi() > fMaxJetPhi))
return kFALSE;
484 if (jet.
Pt() > fMaxJetPt || jet.
Pt() < fMinJetPt)
return kFALSE;
498 if (!jet)
return kFALSE;
499 return IsJetInAcceptance((*jet));
567 fCurrentDmesonJetInfo(0),
572 fClusterContainer(0),
588 fCandidateType(type),
595 fNMassBins(nMassBins),
607 fCurrentDmesonJetInfo(0),
612 fClusterContainer(0),
625 fCandidateType(source.fCandidateType),
626 fCandidateName(source.fCandidateName),
627 fCandidatePDG(source.fCandidatePDG),
628 fNDaughters(source.fNDaughters),
629 fPDGdaughters(source.fPDGdaughters),
630 fBranchName(source.fBranchName),
631 fMCMode(source.fMCMode),
632 fNMassBins(source.fNMassBins),
633 fMinMass(source.fMinMass),
634 fMaxMass(source.fMaxMass),
636 fRejectedOrigin(source.fRejectedOrigin),
637 fAcceptedDecay(source.fAcceptedDecay),
638 fInhibit(source.fInhibit),
639 fJetDefinitions(source.fJetDefinitions),
640 fPtBinWidth(source.fPtBinWidth),
641 fMaxPt(source.fMaxPt),
644 fCurrentDmesonJetInfo(0),
646 fCandidateArray(source.fCandidateArray),
647 fMCContainer(source.fMCContainer),
648 fTrackContainer(source.fTrackContainer),
649 fClusterContainer(source.fClusterContainer),
677 for (UInt_t i = 0; i < fJetDefinitions.size(); i++) {
678 if (fJetDefinitions[i].IsJetInAcceptance(dMesonJet, fJetDefinitions[i].GetName()))
return kTRUE;
694 switch (fCandidateType) {
697 fCandidateName =
"D0";
699 fPDGdaughters.Set(fNDaughters);
700 fPDGdaughters.Reset();
701 fPDGdaughters[0] = 211;
702 fPDGdaughters[1] = 321;
703 fBranchName =
"D0toKpi";
707 fRDHFCuts->SetStandardCutsPP2010();
708 fRDHFCuts->SetUsePhysicsSelection(kFALSE);
709 fRDHFCuts->SetTriggerClass(
"",
"");
714 fCandidateName =
"DStar";
716 fPDGdaughters.Set(fNDaughters);
717 fPDGdaughters.Reset();
718 fPDGdaughters[0] = 211;
719 fPDGdaughters[1] = 211;
720 fPDGdaughters[2] = 321;
721 fBranchName =
"Dstar";
725 fRDHFCuts->SetStandardCutsPP2010();
726 fRDHFCuts->SetUsePhysicsSelection(kFALSE);
727 fRDHFCuts->SetTriggerClass(
"",
"");
731 ::Error(
"AliAnalysisTaskDmesonJets::AnalysisEngine::SetCandidateProperties",
"Candidate %d unknown!", fCandidateType);
742 if (fRDHFCuts)
delete fRDHFCuts;
752 if (fRDHFCuts)
delete fRDHFCuts;
753 fRDHFCuts =
static_cast<AliRDHFCuts*
>(cuts->Clone());
763 name = TString::Format(
"%s_%s", GetName(), jetDef.
GetName());
775 name = fCandidateName;
778 name +=
"_kBackgroundOnly";
781 name +=
"_kSignalOnly";
801 std::vector<AliHFJetDefinition>::iterator it = FindJetDefinition(def);
803 if (it == fJetDefinitions.end() || *it != def) {
804 fJetDefinitions.push_back(def);
805 ::Info(
"AliAnalysisTaskDmesonJets::AnalysisEngine::AddJetDefinition",
"Jet definition '%s' has been added to analysis engine '%s'."
806 "Total number of jet definitions is now %lu.",
807 def.
GetName(), GetName(), fJetDefinitions.size());
809 if (fMCMode !=
kMCTruth) fJetDefinitions[fJetDefinitions.size()-1].SetChargedPtRange(0., 100.);
812 ::Warning(
"AliAnalysisTaskDmesonJets::AnalysisEngine::AddJetDefinition",
"The same jet definition '%s' was already added in analysis engine '%s'.", def.
GetName(), GetName());
832 return AddJetDefinition(def);
842 std::vector<AliHFJetDefinition>::iterator it = fJetDefinitions.begin();
843 while (it != fJetDefinitions.end() && (*it) != def) it++;
884 return ExtractD0Attributes(Dcand, DmesonJet, i);
887 return ExtractDstarAttributes(static_cast<const AliAODRecoCascadeHF*>(Dcand), DmesonJet, i);
903 Int_t MCtruthPdgCode = 0;
905 Double_t invMassD = 0;
910 Int_t mcLab = Dcand->MatchToMC(fCandidatePDG, fMCContainer->GetArray(), fNDaughters, fPDGdaughters.GetArray());
915 AliAODMCParticle* aodMcPart =
static_cast<AliAODMCParticle*
>(fMCContainer->GetArray()->At(mcLab));
919 if (fRejectedOrigin) {
920 EMesonOrigin_t origin = CheckOrigin(aodMcPart, fMCContainer->GetArray());
924 while (rs >>= 1) { p++; }
925 TString hname = TString::Format(
"%s/fHistDmesonOrigin", GetName());
928 if ((origin & fRejectedOrigin) == origin)
return kFALSE;
930 MCtruthPdgCode = aodMcPart->PdgCode();
937 if (isSelected == 1) {
938 if (i > 0)
return kFALSE;
940 if (fMCMode ==
kNoMC ||
941 (MCtruthPdgCode == fCandidatePDG && fMCMode ==
kSignalOnly) ||
951 else if (isSelected == 2) {
952 if (i > 0)
return kFALSE;
954 if (fMCMode ==
kNoMC ||
955 (MCtruthPdgCode == -fCandidatePDG && fMCMode ==
kSignalOnly) ||
965 else if (isSelected == 3) {
969 if ((MCtruthPdgCode == fCandidatePDG && fMCMode ==
kSignalOnly) ||
971 if (i > 0)
return kFALSE;
975 else if ((MCtruthPdgCode == -fCandidatePDG && fMCMode ==
kSignalOnly) ||
977 if (i > 0)
return kFALSE;
1003 DmesonJet.
fD.SetPtEtaPhiM(Dcand->Pt(), Dcand->Eta(), Dcand->Phi(), invMassD);
1016 if (i > 0)
return kFALSE;
1018 Int_t MCtruthPdgCode = 0;
1020 Double_t invMassD = 0;
1023 Int_t pdgDgDStartoD0pi[2] = { 421, 211 };
1024 Int_t pdgDgD0toKpi[2] = { 321, 211 };
1026 Int_t mcLab = DstarCand->
MatchToMC(fCandidatePDG, 421, pdgDgDStartoD0pi, pdgDgD0toKpi, fMCContainer->GetArray());
1030 AliAODMCParticle* aodMcPart =
static_cast<AliAODMCParticle*
>(fMCContainer->GetArray()->At(mcLab));
1033 if (fRejectedOrigin) {
1034 EMesonOrigin_t origin = CheckOrigin(aodMcPart, fMCContainer->GetArray());
1038 while (rs >>= 1) { p++; }
1039 TString hname = TString::Format(
"%s/fHistDmesonOrigin", GetName());
1042 if ((origin & fRejectedOrigin) == origin)
return kFALSE;
1045 MCtruthPdgCode = aodMcPart->PdgCode();
1051 Int_t absMCtruthPdgCode = TMath::Abs(MCtruthPdgCode);
1052 if (fMCMode ==
kNoMC ||
1053 (absMCtruthPdgCode == 413 && fMCMode ==
kSignalOnly) ||
1059 DmesonJet.
fD.SetPtEtaPhiM(DstarCand->Pt(), DstarCand->Eta(), DstarCand->Phi(), invMassD);
1080 Int_t absPdgPart = TMath::Abs(part->GetPdgCode());
1082 if (part->GetNDaughters() == 2) {
1084 AliAODMCParticle* d1 =
static_cast<AliAODMCParticle*
>(mcArray->At(part->GetDaughter(0)));
1085 AliAODMCParticle* d2 =
static_cast<AliAODMCParticle*
>(mcArray->At(part->GetDaughter(1)));
1091 Int_t absPdg1 = TMath::Abs(d1->GetPdgCode());
1092 Int_t absPdg2 = TMath::Abs(d2->GetPdgCode());
1094 if (absPdgPart == 421) {
1095 if ((absPdg1 == 211 && absPdg2 == 321) ||
1096 (absPdg1 == 321 && absPdg2 == 211)) {
1101 if (absPdgPart == 413) {
1102 if (absPdg1 == 421 && absPdg2 == 211) {
1103 Int_t D0decay = CheckDecayChannel(d1, mcArray);
1108 else if (absPdg1 == 211 && absPdg2 == 421) {
1109 Int_t D0decay = CheckDecayChannel(d2, mcArray);
1133 Int_t mother = part->GetMother();
1134 while (mother >= 0) {
1135 AliAODMCParticle* mcGranma =
static_cast<AliAODMCParticle*
>(mcArray->At(mother));
1137 Int_t abspdgGranma = TMath::Abs(mcGranma->GetPdgCode());
1139 if (abspdgGranma == 1)
return kFromDown;
1140 if (abspdgGranma == 2)
return kFromUp;
1144 if (abspdgGranma == 6)
return kFromTop;
1146 mother = mcGranma->GetMother();
1149 ::Error(
"AliAnalysisTaskDmesonJets::AnalysisParams::CheckOrigin",
"Could not retrieve mother particle %d!", mother);
1160 fDmesonJets.clear();
1162 for (
auto& jetDef : fJetDefinitions) {
1163 jetDef.fJets.clear();
1167 RunParticleLevelAnalysis();
1170 RunDetectorLevelAnalysis();
1186 fTrackContainer->SetDMesonCandidate(0);
1187 AddInputVectors(fTrackContainer, 100);
1191 AddInputVectors(fClusterContainer, -100);
1199 for (UInt_t ijet = 0; ijet < jets_incl.size(); ++ijet) {
1202 Double_t maxChPt = 0;
1203 Double_t maxNePt = 0;
1204 Double_t totalNeutralPt = 0;
1206 for (UInt_t ic = 0; ic < constituents.size(); ++ic) {
1207 if (constituents[ic].user_index() >= 100) {
1208 if (constituents[ic].pt() > maxChPt) maxChPt = constituents[ic].pt();
1210 else if (constituents[ic].user_index() <= -100) {
1211 totalNeutralPt += constituents[ic].pt();
1212 if (constituents[ic].pt() > maxNePt) maxChPt = constituents[ic].pt();
1216 jetDef.
fJets.push_back(
1217 AliJetInfo(jets_incl[ijet].px(), jets_incl[ijet].py(), jets_incl[ijet].pz(), jets_incl[ijet].E(),
1218 constituents.size(), totalNeutralPt / jets_incl[ijet].pt(), maxChPt, maxNePt)
1232 if (jetDef.
fJets.size() == 0) FindJets(jetDef);
1234 Double_t d_closest = 999;
1244 for (
auto& jet : jetDef.
fJets) {
1247 if (d > dMax)
continue;
1248 if (d < d_closest) {
1254 if (jet_closest && applyKinCuts) {
1259 AliDebug(2, Form(
"Found closest jet (pt=%.3f, eta=%.3f, phi=%.3f) to d meson (pt=%.3f, eta=%.3f, phi=%.3f) with d = %.3f",
1271 const Int_t nD = fCandidateArray->GetEntriesFast();
1275 Int_t nAccCharm = 0;
1276 for (Int_t icharm = 0; icharm < nD; icharm++) {
1277 Int_t isSelected = 0;
1280 if (!charmCand)
continue;
1282 Int_t nprongs = charmCand->GetNProngs();
1285 if (!charmCand->InheritsFrom(
"AliAODRecoCascadeHF")) {
1286 ::Error(
"AliAnalysisTaskDmesonJets::AnalysisParams::RunDetectorLevelAnalysis",
"Candidate type is D* but object type is wrong (should be AliAODRecoCascadeHF)");
1292 if (!fRDHFCuts->IsInFiducialAcceptance(charmCand->Pt(), charmCand->Y(fCandidatePDG)))
continue;
1297 if (!isSelected)
continue;
1299 for (Int_t im = 0; im < 2; im++) {
1302 if (ExtractRecoDecayAttributes(charmCand, DmesonJet, im)) {
1303 for (std::vector<AliHFJetDefinition>::iterator itdef = fJetDefinitions.begin(); itdef != fJetDefinitions.end(); itdef++) {
1304 if (!FindJet(charmCand, DmesonJet, *itdef)) {
1305 AliWarning(Form(
"Could not find jet '%s' for D meson '%s': pT = %.3f, eta = %.3f, phi = %.3f",
1306 (*itdef).GetName(), GetName(), DmesonJet.
fD.Pt(), DmesonJet.
fD.Eta(), DmesonJet.
fD.
Phi_0_2pi()));
1309 fDmesonJets[icharm] = DmesonJet;
1317 hname = TString::Format(
"%s/fHistNAcceptedDmesons", GetName());
1320 hname = TString::Format(
"%s/fHistNDmesons", GetName());
1345 fTrackContainer->SetDMesonCandidate(Dcand);
1346 hname = TString::Format(
"%s/%s/fHistTrackRejectionReason", GetName(), jetDef.
GetName());
1349 hname = TString::Format(
"%s/%s/fHistDMesonDaughterNotInJet", GetName(), jetDef.
GetName());
1351 const TObjArray& daughters = fTrackContainer->GetDaughterList();
1352 for (Int_t i = 0; i < daughters.GetEntriesFast(); i++) {
1353 AliVParticle* daughter =
static_cast<AliVParticle*
>(daughters.At(i));
1354 if (!fTrackContainer->GetArray()->FindObject(daughter)) histDaughterNotInJet->Fill(daughter->Pt());
1359 hname = TString::Format(
"%s/%s/fHistClusterRejectionReason", GetName(), jetDef.
GetName());
1368 for (UInt_t ijet = 0; ijet < jets_incl.size(); ++ijet) {
1371 Bool_t isDmesonJet = kFALSE;
1373 Double_t maxChPt = 0;
1374 Double_t maxNePt = 0;
1375 Double_t totalNeutralPt = 0;
1377 for (UInt_t ic = 0; ic < constituents.size(); ++ic) {
1378 if (constituents[ic].user_index() == 0) {
1379 isDmesonJet = kTRUE;
1381 else if (constituents[ic].user_index() >= 100) {
1382 if (constituents[ic].pt() > maxChPt) maxChPt = constituents[ic].pt();
1384 else if (constituents[ic].user_index() <= -100) {
1385 totalNeutralPt += constituents[ic].pt();
1386 if (constituents[ic].pt() > maxNePt) maxChPt = constituents[ic].pt();
1391 DmesonJet.
fJets[jetDef.
GetName()].fMomentum.SetPxPyPzE(jets_incl[ijet].px(), jets_incl[ijet].py(), jets_incl[ijet].pz(), jets_incl[ijet].E());
1392 DmesonJet.
fJets[jetDef.
GetName()].fNConstituents = constituents.size();
1393 DmesonJet.
fJets[jetDef.
GetName()].fMaxChargedPt = maxChPt;
1394 DmesonJet.
fJets[jetDef.
GetName()].fMaxNeutralPt = maxNePt;
1395 DmesonJet.
fJets[jetDef.
GetName()].fNEF = totalNeutralPt / jets_incl[ijet].pt();
1409 AliEmcalIterableMomentumContainer itcont = cont->all_momentum();
1410 for (AliEmcalIterableMomentumContainer::iterator it = itcont.begin(); it != itcont.end(); it++) {
1411 UInt_t rejectionReason = 0;
1412 if (!cont->AcceptObject(it.current_index(), rejectionReason)) {
1413 if (rejectHist) rejectHist->Fill(AliEmcalContainer::GetRejectionReasonBitPosition(rejectionReason), it->first.Pt());
1416 Int_t uid = offset >= 0 ? it.current_index() + offset: -it.current_index() - offset;
1426 fMCContainer->SetSpecialPDG(fCandidatePDG);
1427 fMCContainer->SetRejectedOriginMap(fRejectedOrigin);
1428 fMCContainer->SetAcceptedDecayMap(fAcceptedDecay);
1430 if (!fMCContainer->IsSpecialPDGFound())
return;
1432 for (
auto &jetDef : fJetDefinitions) {
1433 switch (jetDef.fJetType) {
1435 fMCContainer->SetCharge(AliParticleContainer::EChargeCut_t::kNoChargeCut);
1438 fMCContainer->SetCharge(AliParticleContainer::EChargeCut_t::kCharged);
1441 fMCContainer->SetCharge(AliParticleContainer::EChargeCut_t::kNeutral);
1450 hname = TString::Format(
"%s/fHistDmesonOrigin", GetName());
1452 hname = TString::Format(
"%s/%s/fHistMCParticleRejectionReason", GetName(), jetDef.GetName());
1454 fMCContainer->SetHistOrigin(0);
1460 for (UInt_t ijet = 0; ijet < jets_incl.size(); ++ijet) {
1463 Bool_t isDmesonJet = kFALSE;
1465 for (UInt_t ic = 0; ic < constituents.size(); ++ic) {
1466 Int_t iPart = constituents[ic].user_index() - 100;
1467 AliVParticle* part = fMCContainer->GetParticle(iPart);
1469 ::Error(
"AliAnalysisTaskDmesonJets::AnalysisEngine::RunParticleLevelAnalysis",
"Could not find jet constituent %d!", iPart);
1472 if (TMath::Abs(part->PdgCode()) == fCandidatePDG) {
1473 std::map<int, AliDmesonJetInfo>::iterator dMesonJetIt = fDmesonJets.find(iPart);
1474 if (dMesonJetIt == fDmesonJets.end()) {
1475 std::pair<int, AliDmesonJetInfo> element;
1476 element.first = iPart;
1478 dMesonJetIt = fDmesonJets.insert(element).first;
1479 (*dMesonJetIt).second.fD.SetPxPyPzE(part->Px(), part->Py(), part->Pz(), part->E());
1480 (*dMesonJetIt).second.fDmesonParticle = part;
1483 (*dMesonJetIt).second.fJets[jetDef.GetName()].fMomentum.SetPxPyPzE(jets_incl[ijet].px(), jets_incl[ijet].py(), jets_incl[ijet].pz(), jets_incl[ijet].E());
1484 (*dMesonJetIt).second.fJets[jetDef.GetName()].fNConstituents = constituents.size();
1497 switch (fCandidateType) {
1499 classname =
"AliAnalysisTaskDmesonJets::AliD0InfoSummary";
1503 classname =
"AliAnalysisTaskDmesonJets::AliDStarInfoSummary";
1507 TString treeName = TString::Format(
"%s_%s", taskName, GetName());
1508 fTree =
new TTree(treeName, treeName);
1509 fTree->Branch(
"DmesonJet", classname, &fCurrentDmesonJetInfo);
1511 for (Int_t i = 0; i < fJetDefinitions.size(); i++) {
1513 fTree->Branch(fJetDefinitions[i].GetName(),
"AliAnalysisTaskDmesonJets::AliJetInfoSummary", &fCurrentJetInfo[i]);
1526 Int_t
nPtBins = TMath::CeilNint(fMaxPt / fPtBinWidth);
1528 for (
auto &jetDef : fJetDefinitions) {
1530 AliDebug(2,Form(
"Now working on '%s'", jetDef.GetName()));
1532 Double_t radius = jetDef.fRadius;
1534 TString
title[30] = {
""};
1535 Int_t
nbins[30] = {0 };
1536 Double_t min [30] = {0.};
1537 Double_t max [30] = {0.};
1540 title[dim] =
"#it{p}_{T,D} (GeV/#it{c})";
1547 title[dim] =
"#eta_{D}";
1553 title[dim] =
"#phi_{D} (rad)";
1556 max[dim] = TMath::TwoPi();
1561 title[dim] =
"#it{M}_{K#pi#pi} (GeV/#it{c}^{2})";
1562 nbins[dim] = fNMassBins;
1563 min[dim] = fMinMass;
1564 max[dim] = fMaxMass;
1569 title[dim] =
"#it{M}_{K#pi} (GeV/#it{c}^{2})";
1570 nbins[dim] = fNMassBins;
1571 min[dim] = fMinMass;
1572 max[dim] = fMaxMass;
1577 title[dim] =
"#it{M}_{K#pi} (GeV/#it{c}^{2})";
1578 nbins[dim] = fNMassBins;
1584 title[dim] =
"#it{M}_{K#pi#pi} - #it{M}_{K#pi} (GeV/#it{c}^{2})";
1585 nbins[dim] = fNMassBins*6;
1589 Double_t D0mass = TDatabasePDG::Instance()->GetParticle(421)->Mass();
1597 title[dim] =
"#it{p}_{T,#pi} (GeV/#it{c})";
1604 title[dim] =
"#it{z}_{D}";
1610 if ((enabledAxis &
kDeltaR) != 0) {
1611 title[dim] =
"#Delta R_{D-jet}";
1614 max[dim] = radius * 1.5;
1619 title[dim] =
"#eta_{D} - #eta_{jet}";
1621 min[dim] = -radius * 1.2;
1622 max[dim] = radius * 1.2;
1627 title[dim] =
"#phi_{D} - #phi_{jet} (rad)";
1629 min[dim] = -radius * 1.2;
1630 max[dim] = radius * 1.2;
1634 title[dim] =
"#it{p}_{T,jet} (GeV/#it{c})";
1641 title[dim] =
"#eta_{jet}";
1647 title[dim] =
"#phi_{jet} (rad)";
1650 max[dim] = TMath::TwoPi();
1655 title[dim] =
"No. of constituents";
1662 hname = TString::Format(
"%s/%s/fDmesonJets", GetName(), jetDef.GetName());
1664 for (Int_t j = 0; j < dim; j++) {
1665 h->GetAxis(j)->SetTitle(title[j]);
1677 for (
auto& dmeson_pair : fDmesonJets) {
1678 fCurrentDmesonJetInfo->Set(dmeson_pair.second);
1680 for (UInt_t ij = 0; ij < fJetDefinitions.size(); ij++) {
1681 fCurrentJetInfo[ij]->Reset();
1682 AliJetInfo* jet = dmeson_pair.second.GetJet(fJetDefinitions[ij].GetName());
1684 if (applyKinCuts && !fJetDefinitions[ij].IsJetInAcceptance(*jet)) {
1685 hname = TString::Format(
"%s/%s/fHistRejectedJetPt", GetName(), fJetDefinitions[ij].GetName());
1687 hname = TString::Format(
"%s/%s/fHistRejectedJetPhi", GetName(), fJetDefinitions[ij].GetName());
1689 hname = TString::Format(
"%s/%s/fHistRejectedJetEta", GetName(), fJetDefinitions[ij].GetName());
1693 fCurrentJetInfo[ij]->Set(dmeson_pair.second, fJetDefinitions[ij].GetName());
1700 hname = TString::Format(
"%s/fHistRejectedDMesonPt", GetName());
1702 hname = TString::Format(
"%s/fHistRejectedDMesonPhi", GetName());
1704 hname = TString::Format(
"%s/fHistRejectedDMesonEta", GetName());
1707 hname = TString::Format(
"%s/fHistRejectedDMesonInvMass", GetName());
1711 hname = TString::Format(
"%s/fHistRejectedDMeson2ProngInvMass", GetName());
1714 hname = TString::Format(
"%s/fHistRejectedDMesonDeltaInvMass", GetName());
1715 fHistManager->
FillTH1(hname, dmeson_pair.second.fD.M() - dmeson_pair.second.fInvMass2Prong);
1730 for (
auto& dmeson_pair : fDmesonJets) {
1732 for (UInt_t ij = 0; ij < fJetDefinitions.size(); ij++) {
1733 AliJetInfo* jet = dmeson_pair.second.GetJet(fJetDefinitions[ij].GetName());
1735 if (applyKinCuts && !fJetDefinitions[ij].IsJetInAcceptance(*jet)) {
1736 hname = TString::Format(
"%s/%s/fHistRejectedJetPt", GetName(), fJetDefinitions[ij].GetName());
1738 hname = TString::Format(
"%s/%s/fHistRejectedJetPhi", GetName(), fJetDefinitions[ij].GetName());
1740 hname = TString::Format(
"%s/%s/fHistRejectedJetEta", GetName(), fJetDefinitions[ij].GetName());
1747 hname = TString::Format(
"%s/fHistRejectedDMesonPt", GetName());
1749 hname = TString::Format(
"%s/fHistRejectedDMesonPhi", GetName());
1751 hname = TString::Format(
"%s/fHistRejectedDMesonEta", GetName());
1754 hname = TString::Format(
"%s/fHistRejectedDMesonInvMass", GetName());
1758 hname = TString::Format(
"%s/fHistRejectedDMeson2ProngInvMass", GetName());
1761 hname = TString::Format(
"%s/fHistRejectedDMesonDeltaInvMass", GetName());
1762 fHistManager->
FillTH1(hname, dmeson_pair.second.fD.M() - dmeson_pair.second.fInvMass2Prong);
1776 for (
auto& dmeson_pair : fDmesonJets) {
1777 if (!IsAnyJetInAcceptance(dmeson_pair.second)) {
1778 hname = TString::Format(
"%s/fHistRejectedDMesonPt", GetName());
1780 hname = TString::Format(
"%s/fHistRejectedDMesonPhi", GetName());
1782 hname = TString::Format(
"%s/fHistRejectedDMesonEta", GetName());
1787 for (
auto &jetDef : fJetDefinitions) {
1789 hname = TString::Format(
"%s/%s/fDmesonJets", GetName(), jetDef.GetName());
1792 for (
auto& dmeson_pair : fDmesonJets) {
1793 const AliJetInfo* jet = dmeson_pair.second.GetJet(jetDef.GetName());
1795 if (!jetDef.IsJetInAcceptance(*jet)) {
1796 hname = TString::Format(
"%s/%s/fHistRejectedJetPt", GetName(), jetDef.GetName());
1798 hname = TString::Format(
"%s/%s/fHistRejectedJetPhi", GetName(), jetDef.GetName());
1800 hname = TString::Format(
"%s/%s/fHistRejectedJetEta", GetName(), jetDef.GetName());
1804 FillHnSparse(h, dmeson_pair.second, jetDef.GetName());
1820 Double_t contents[30] = {0.};
1822 Double_t z = DmesonJet.
GetZ(n);
1823 Double_t deltaPhi = 0;
1824 Double_t deltaEta = 0;
1825 Double_t deltaR = DmesonJet.
GetDistance(n, deltaEta, deltaPhi);
1827 std::map<std::string, AliJetInfo>::const_iterator it = DmesonJet.
fJets.find(n);
1828 if (it == DmesonJet.
fJets.end())
return kFALSE;
1830 for (Int_t i = 0; i < h->GetNdimensions(); i++) {
1831 TString
title(h->GetAxis(i)->GetTitle());
1832 if (
title==
"#it{p}_{T,D} (GeV/#it{c})") contents[i] = DmesonJet.
fD.Pt();
1833 else if (
title==
"#eta_{D}") contents[i] = DmesonJet.
fD.Eta();
1836 else if (
title==
"#it{M}_{K#pi#pi} (GeV/#it{c}^{2})") contents[i] = DmesonJet.
fD.M();
1837 else if (
title==
"#it{M}_{K#pi#pi} - #it{M}_{K#pi} (GeV/#it{c}^{2})") contents[i] = DmesonJet.
fD.M() - DmesonJet.
fInvMass2Prong;
1838 else if (
title==
"#it{p}_{T,#pi} (GeV/#it{c})") contents[i] = DmesonJet.
fSoftPionPt;
1839 else if (
title==
"#it{z}_{D}") contents[i] = z;
1840 else if (
title==
"#Delta R_{D-jet}") contents[i] = deltaR;
1841 else if (
title==
"#eta_{D} - #eta_{jet}") contents[i] = deltaEta;
1842 else if (
title==
"#phi_{D} - #phi_{jet} (rad)") contents[i] = deltaPhi;
1843 else if (
title==
"#it{p}_{T,jet} (GeV/#it{c})") contents[i] = (*it).second.Pt();
1844 else if (
title==
"#eta_{jet}") contents[i] = (*it).second.Eta();
1845 else if (
title==
"#phi_{jet} (rad)") contents[i] = (*it).second.Phi_0_2pi();
1846 else if (
title==
"No. of constituents") contents[i] = (*it).second.fNConstituents;
1847 else AliWarning(Form(
"Unable to fill dimension '%s'!",
title.Data()));
1882 fEnabledAxis(k2ProngInvMass),
1883 fOutputType(kTreeOutput),
1885 fApplyKinematicCuts(kTRUE),
1886 fNOutputTrees(nOutputTrees),
1891 for (Int_t i = 0; i < nOutputTrees; i++){
1892 DefineOutput(2+i, TTree::Class());
1911 TFile* filecuts = TFile::Open(cutfname);
1912 if (!filecuts || filecuts->IsZombie()) {
1913 ::Warning(
"AddTaskDmesonJets",
"Input file not found: will use std cuts.");
1918 analysiscuts =
dynamic_cast<AliRDHFCuts*
>(filecuts->Get(cutsname));
1919 if (!analysiscuts) {
1920 ::Warning(
"AddTaskDmesonJetCorr",
"Could not find analysis cuts '%s' in '%s'. Using std cuts.", cutsname.Data(), cutfname.Data());
1924 return analysiscuts;
1953 if (!cutfname.IsNull()) {
1958 cutsname =
"D0toKpiCuts";
1961 cutsname =
"DStartoKpipiCuts";
1977 ::Info(
"AliAnalysisTaskDmesonJets::AddAnalysisEngine",
"A new analysis engine '%s' has been added. The total number of analysis engines is %lu.", eng.
GetName(jetDef),
fAnalysisEngines.size());
1981 ::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());
1984 if (cuts && found_eng->
fRDHFCuts != 0) {
1985 ::Warning(
"AliAnalysisTaskDmesonJets::AddAnalysisEngine",
"D meson cuts were already defined for this D meson type. They will be overwritten.");
2003 ::Info(
"UserCreateOutputObjects",
"CreateOutputObjects of task %s", GetName());
2015 ::Info(
"AliAnalysisTaskDmesonJets::UserCreateOutputObjects",
"Allocating histograms for task '%s' (%lu analysis engines)", GetName(),
fAnalysisEngines.size());
2017 ::Info(
"AliAnalysisTaskDmesonJets::UserCreateOutputObjects",
"Allocating histograms for analysis engine '%s' (%lu jet definitions)", param.GetName(), param.fJetDefinitions.size());
2023 hname = TString::Format(
"%s/fHistNAcceptedDmesons", param.GetName());
2024 htitle = hname +
";Number of D accepted meson candidates;counts";
2027 hname = TString::Format(
"%s/fHistNDmesons", param.GetName());
2028 htitle = hname +
";Number of D meson candidates;counts";
2031 hname = TString::Format(
"%s/fHistNEvents", param.GetName());
2032 htitle = hname +
";Event status;counts";
2034 h->GetXaxis()->SetBinLabel(1,
"Accepted");
2035 h->GetXaxis()->SetBinLabel(2,
"Rejected");
2037 hname = TString::Format(
"%s/fHistEventRejectionReasons", param.GetName());
2038 htitle = hname +
";Rejection reason;counts";
2041 hname = TString::Format(
"%s/fHistRejectedDMesonPt", param.GetName());
2042 htitle = hname +
";#it{p}_{T,D} (GeV/#it{c});counts";
2045 hname = TString::Format(
"%s/fHistRejectedDMesonEta", param.GetName());
2046 htitle = hname +
";#it{#eta}_{D};counts";
2049 hname = TString::Format(
"%s/fHistRejectedDMesonPhi", param.GetName());
2050 htitle = hname +
";#it{#phi}_{D};counts";
2053 if (param.fCandidateType ==
kD0toKpi) {
2054 hname = TString::Format(
"%s/fHistRejectedDMesonInvMass", param.GetName());
2055 htitle = hname +
";#it{M}_{K#pi} (GeV/#it{c}^{2});counts";
2062 hname = TString::Format(
"%s/fHistRejectedDMeson2ProngInvMass", param.GetName());
2063 htitle = hname +
";#it{M}_{K#pi} (GeV/#it{c}^{2});counts";
2067 Double_t D0mass = TDatabasePDG::Instance()->GetParticle(421)->Mass();
2068 hname = TString::Format(
"%s/fHistRejectedDMesonDeltaInvMass", param.GetName());
2069 htitle = hname +
";#it{M}_{K#pi#pi} - #it{M}_{K#pi} (GeV/#it{c}^{2});counts";
2075 hname = TString::Format(
"%s/fHistDmesonOrigin", param.GetName());
2076 htitle = hname +
";origin;counts";
2080 for (std::vector<AliHFJetDefinition>::iterator itdef = param.fJetDefinitions.begin(); itdef != param.fJetDefinitions.end(); itdef++) {
2082 ::Info(
"AliAnalysisTaskDmesonJets::UserCreateOutputObjects",
"Allocating histograms for jet definition '%s'", jetDef->
GetName());
2086 hname = TString::Format(
"%s/%s/fHistMCParticleRejectionReason", param.GetName(), jetDef->
GetName());
2087 htitle = hname +
";Track rejection reason;#it{p}_{T,track} (GeV/#it{c});counts";
2091 hname = TString::Format(
"%s/%s/fHistTrackRejectionReason", param.GetName(), jetDef->
GetName());
2092 htitle = hname +
";Track rejection reason;#it{p}_{T,track} (GeV/#it{c});counts";
2096 hname = TString::Format(
"%s/%s/fHistClusterRejectionReason", param.GetName(), jetDef->
GetName());
2097 htitle = hname +
";Cluster rejection reason;#it{p}_{T,cluster} (GeV/#it{c});counts";
2101 hname = TString::Format(
"%s/%s/fHistDMesonDaughterNotInJet", param.GetName(), jetDef->
GetName());
2102 htitle = hname +
";#it{p}_{T,track} (GeV/#it{c});counts";
2105 hname = TString::Format(
"%s/%s/fHistRejectedJetPt", param.GetName(), jetDef->
GetName());
2106 htitle = hname +
";#it{p}_{T,jet} (GeV/#it{c});counts";
2109 hname = TString::Format(
"%s/%s/fHistRejectedJetEta", param.GetName(), jetDef->
GetName());
2110 htitle = hname +
";#it{#eta}_{jet};counts";
2113 hname = TString::Format(
"%s/%s/fHistRejectedJetPhi", param.GetName(), jetDef->
GetName());
2114 htitle = hname +
";#it{#phi}_{jet};counts";
2119 param.BuildTree(GetName());
2121 param.AssignDataSlot(treeSlot+2);
2126 AliError(Form(
"Number of data output slots %d not sufficient. Tree of analysis engine %s will not be posted!",
fNOutputTrees, param.GetName()));
2149 fAodEvent =
dynamic_cast<AliAODEvent*
>(fInputEvent);
2157 AliError(Form(
"This task need an AOD event! Task '%s' will be disabled!", GetName()));
2168 params.fCandidateArray =
dynamic_cast<TClonesArray*
>(
fAodEvent->GetList()->FindObject(params.fBranchName.Data()));
2170 if (params.fCandidateArray) {
2171 if (!params.fCandidateArray->GetClass()->InheritsFrom(
"AliAODRecoDecayHF2Prong")) {
2172 ::Error(
"AliAnalysisTaskDmesonJets::ExecOnce",
2173 "%s: Objects of type %s in %s are not inherited from AliAODRecoDecayHF2Prong! Task will be disabled!",
2174 GetName(), params.fCandidateArray->GetClass()->GetName(), params.fCandidateArray->GetName());
2175 params.fCandidateArray = 0;
2176 params.fInhibit = kTRUE;
2180 ::Error(
"AliAnalysisTaskDmesonJets::ExecOnce",
2181 "Could not find candidate array '%s', skipping the event. Analysis engine '%s' will be disabled!",
2182 params.fBranchName.Data(), params.GetName());
2183 params.fInhibit = kTRUE;
2187 if (params.fMCMode !=
kNoMC) {
2192 if (!params.fMCContainer) {
2193 ::Error(
"AliAnalysisTaskDmesonJets::ExecOnce",
2194 "No MC particle container was provided. Analysis engine '%s' will be disabled!",
2196 params.fInhibit = kTRUE;
2206 if (!params.fTrackContainer && !params.fClusterContainer) {
2207 ::Error(
"AliAnalysisTaskDmesonJets::ExecOnce",
2208 "No track container and no cluster container were provided. Analysis engine '%s' will be disabled!",
2210 params.fInhibit = kTRUE;
2228 if (!
fAodEvent->GetPrimaryVertex() || TMath::Abs(
fAodEvent->GetMagneticField()) < 0.001) {
2230 if (eng.fInhibit)
continue;
2231 hname = TString::Format(
"%s/fHistEventRejectionReasons", eng.GetName());
2239 if (eng.fInhibit)
continue;
2242 hname = TString::Format(
"%s/fHistNEvents", eng.GetName());
2243 Bool_t iseventselected = eng.fRDHFCuts->IsEventSelected(
fAodEvent);
2244 if (!iseventselected) {
2246 hname = TString::Format(
"%s/fHistEventRejectionReasons", eng.GetName());
2247 UInt_t bitmap = eng.fRDHFCuts->GetEventRejectionBitMap();
2251 if (label.IsNull())
break;
2260 AliDebug(2,
"Event selected");
2275 if (param.fInhibit)
continue;
2297 TParticlePDG* part = TDatabasePDG::Instance()->GetParticle(TMath::Abs(pdg));
2299 Double_t
mass = part->Mass();
2302 if (nbins % 2 == 0) {
2303 minMass = mass - range / 2 - range / nbins / 2;
2304 maxMass = mass + range / 2 - range / nbins / 2;
2307 minMass = mass - range / 2;
2308 maxMass = mass + range / 2;
2319 static TString label;
2323 label =
"NotSelTrigger";
2325 return label.Data();
2330 return label.Data();
2333 label =
"TooFewVtxContrib";
2335 return label.Data();
2338 label =
"ZVtxOutFid";
2340 return label.Data();
2345 return label.Data();
2348 label =
"OutsideCentrality";
2350 return label.Data();
2353 label =
"PhysicsSelection";
2355 return label.Data();
2358 label =
"BadSPDVertex";
2360 return label.Data();
2363 label =
"ZVtxSPDOutFid";
2365 return label.Data();
2368 label =
"CentralityFlattening";
2370 return label.Data();
2373 label =
"BadTrackV0Correl";
2375 return label.Data();
2378 return label.Data();
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
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
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.
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)
Lightweight class that encapsulates D0.
void SetMakeGeneralHistograms(Bool_t g)
Bool_t IsAnyJetInAcceptance(const AliDmesonJetInfo &dMesonJet) const
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.
TTree * BuildTree(const char *taskName)
virtual void Set(const AliDmesonJetInfo &source, std::string n)
Bool_t FillQA(Bool_t applyKinCuts)