Skip to content

Commit cfbfcca

Browse files
committed
PWGEM/Dilepton: add gen. histos in taggingHFE.cxx
1 parent 9a4ff63 commit cfbfcca

File tree

1 file changed

+101
-15
lines changed

1 file changed

+101
-15
lines changed

PWGEM/Dilepton/Tasks/taggingHFE.cxx

Lines changed: 101 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,9 @@ struct taggingHFE {
128128
Configurable<float> cfg_max_mass_k0s{"cfg_max_mass_k0s", 0.510, "max mass for K0S"};
129129
Configurable<float> cfg_min_mass_lambda{"cfg_min_mass_lambda", 1.11, "min mass for Lambda rejection"};
130130
Configurable<float> cfg_max_mass_lambda{"cfg_max_mass_lambda", 1.12, "max mass for Lambda rejection"};
131-
Configurable<float> cfg_min_cospa_v0hadron{"cfg_min_cospa_v0hadron", 0.95, "min cospa for v0hadron"};
132-
Configurable<float> cfg_max_pca_v0hadron{"cfg_max_pca_v0hadron", 0.2, "max distance between 2 legs for v0hadron"};
133-
// Configurable<float> cfg_min_radius_v0hadron{"cfg_min_radius_v0hadron", 0.1, "min rxy for v0hadron"};
131+
Configurable<float> cfg_min_cospa{"cfg_min_cospa", 0.95, "min cospa for v0hadron"};
132+
Configurable<float> cfg_max_dca2legs{"cfg_max_dca2legs", 0.2, "max distance between 2 legs for v0hadron"};
133+
// Configurable<float> cfg_min_radius{"cfg_min_radius", 0.1, "min rxy for v0hadron"};
134134
Configurable<float> cfg_min_cr2findable_ratio_tpc{"cfg_min_cr2findable_ratio_tpc", 0.8, "min. TPC Ncr/Nf ratio"};
135135
Configurable<float> cfg_max_frac_shared_clusters_tpc{"cfg_max_frac_shared_clusters_tpc", 999.f, "max fraction of shared clusters in TPC"};
136136
Configurable<int> cfg_min_ncrossedrows_tpc{"cfg_min_ncrossedrows_tpc", 40, "min ncrossed rows"};
@@ -276,15 +276,17 @@ struct taggingHFE {
276276
fRegistry.add("Event/hMultFT0CvsMultNTracksPV", "hMultFT0CvsMultNTracksPV;mult. FT0C;N_{track} to PV", kTH2F, {{60, 0, 60000}, {600, 0, 6000}}, false);
277277

278278
// for charm hadrons
279-
fRegistry.add("e_Kpm/all/hLxy", "decay length XY from PV;L_{xy} (cm)", kTH1F, {{100, 0, 1}}, false);
280-
fRegistry.add("e_Kpm/all/hLz", "decay length Z from PV;L_{z} (cm)", kTH1F, {{100, 0, 1}}, false);
281-
fRegistry.add("e_Kpm/all/hCosPA", "cosPA;cosine of pointing angle", kTH1F, {{100, 0, 1}}, false);
282-
fRegistry.add("e_Kpm/all/hCosPAXY", "cosPA in XY;cosine of pointing angle in XY", kTH1F, {{100, 0, 1}}, false);
283-
fRegistry.add("e_Kpm/all/hDCA2Legs", "distance between 2 legs;distance between 2 legs (cm)", kTH1F, {{100, 0, 1}}, false);
279+
fRegistry.add("e_Kpm/all/hLxy", "decay length XY from PV;L_{xy} (cm)", kTH1F, {{500, 0, 0.5}}, false);
280+
fRegistry.add("e_Kpm/all/hLz", "decay length Z from PV;L_{z} (cm)", kTH1F, {{500, 0, 0.5}}, false);
281+
fRegistry.add("e_Kpm/all/hCosPA", "cosPA;cosine of pointing angle", kTH1F, {{200, 0.8, 1}}, false);
282+
fRegistry.add("e_Kpm/all/hCosPAXY", "cosPA in XY;cosine of pointing angle in XY", kTH1F, {{200, 0.8, 1}}, false);
283+
fRegistry.add("e_Kpm/all/hDCA2Legs", "distance between 2 legs;distance between 2 legs (cm)", kTH1F, {{500, 0, 0.5}}, false);
284284
fRegistry.add("e_Kpm/all/hMass", "mass;mass (GeV/c^{2});p_{T} (GeV/c)", kTH2F, {{40, 0.5, 2.5}, {100, 0, 10}}, false);
285285
fRegistry.add("e_Kpm/all/hDeltaEtaDeltaPhi", "#Delta#varphi vs. #Delta#eta;#Delta#varphi = #varphi_{h} - #varphi_{e} (rad.);#Delta#eta = #eta_{h} - #eta_{e}", kTH2F, {{180, -M_PI, M_PI}, {200, -2, +2}}, false);
286286
fRegistry.add("e_Kpm/all/hRelDeltaPt", "rel delta pT;(p_{T,h} - p_{T,e})/p_{T,e}", kTH1F, {{80, -2, +2}}, false);
287-
fRegistry.add("e_Kpm/all/hProdDCAxy", "product of DCAxy;d_{xy}^{e} #times d_{xy}^{h} (cm)^{2}", kTH1F, {{100, -0.05, +0.05}}, false);
287+
fRegistry.add("e_Kpm/all/hProdDCAxy", "product of DCAxy;d_{xy}^{e} #times d_{xy}^{h} (#sigma)^{2}", kTH1F, {{200, -100, +100}}, false);
288+
fRegistry.add("e_Kpm/all/hCorrelationDCAxy", "correlation of DCAxy;DCA^{xy}_{e} (#sigma);DCA^{xy}_{h} (#sigma)", kTH2F, {{200, -10, +10}, {200, -10, +10}}, false);
289+
fRegistry.add("e_Kpm/all/hCorrelationDCAz", "correlation of DCAz;DCA^{z}_{e} (#sigma);DCA^{z}_{h} (#sigma)", kTH2F, {{200, -10, +10}, {200, -10, +10}}, false);
288290

289291
fRegistry.addClone("e_Kpm/all/", "e_Kpm/D0/");
290292
fRegistry.addClone("e_Kpm/all/", "e_Kpm/Dpm/");
@@ -335,6 +337,9 @@ struct taggingHFE {
335337
fRegistry.addClone("D0/electron/", "D0/kaon/"); // D0 -> K- e+ nu, Br = 0.03549 | D0 -> K- e+ pi0 nu, Br = 0.016 | D0 -> K*(892)- e+ nu, Br = 0.0215 // D0 -> anti-K0S e+ pi- nu, Br = 0.0144
336338
fRegistry.addClone("Dpm/electron/", "Dpm/kaon/"); // D+ -> K- pi+ e+ nu, Br = 0.0402 | D+ -> anti-K*(892)0 e+ nu, Br = 0.0540 // D+ -> anti-K0S e+ nu, Br = 0.0872
337339
fRegistry.addClone("Ds/electron/", "Ds/kaon/"); // Ds+ -> K0S e+ nu, Br = 0.0034 // Ds+ -> phi e+ nu, Br = 0.0239
340+
341+
fRegistry.add("Generated/D0/prompt/hs", "#eta correlation from charm hadron;p_{T,e} (GeV/c);p_{T,K} (GeV/c);#eta_{e};#eta_{K};", kTHnSparseF, {{100, 0, 10}, {100, 0, 10}, {100, -5, +5}, {100, -5, 5}}, false);
342+
fRegistry.addClone("Generated/D0/prompt/", "Generated/D0/nonprompt/");
338343
}
339344

340345
template <typename TTrack>
@@ -593,6 +598,10 @@ struct taggingHFE {
593598
float dcaZ = mDcaInfoCov.getZ();
594599

595600
for (const auto& trackId : trackIds) {
601+
if (trackId == ele.globalIndex()) {
602+
continue;
603+
}
604+
596605
const auto& track = tracks.rawIteratorAt(trackId);
597606
const auto& mctrack = track.template mcParticle_as<aod::McParticles>();
598607
const auto& mcCollision2 = mctrack.template mcCollision_as<aod::McCollisions>();
@@ -601,6 +610,7 @@ struct taggingHFE {
601610
trackParCov.setPID(o2::track::PID::Kaon);
602611
o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, trackParCov, 2.f, matCorr, &mDcaInfoCov);
603612
float dcaXY_h = mDcaInfoCov.getY();
613+
float dcaZ_h = mDcaInfoCov.getZ();
604614
std::array<float, 3> svpos = {0.}; // secondary vertex position
605615
std::array<float, 3> pvec0 = {0.};
606616
std::array<float, 3> pvec1 = {0.};
@@ -650,7 +660,9 @@ struct taggingHFE {
650660
fRegistry.fill(HIST("e_Kpm/all/hMass"), mEK, ptEK);
651661
fRegistry.fill(HIST("e_Kpm/all/hDeltaEtaDeltaPhi"), dphi, deta);
652662
fRegistry.fill(HIST("e_Kpm/all/hRelDeltaPt"), reldpt);
653-
fRegistry.fill(HIST("e_Kpm/all/hProdDCAxy"), dcaXY * dcaXY_h);
663+
fRegistry.fill(HIST("e_Kpm/all/hProdDCAxy"), dcaXY / std::sqrt(eleParCov.getSigmaY2()) * dcaXY_h / std::sqrt(trackParCov.getSigmaY2()));
664+
fRegistry.fill(HIST("e_Kpm/all/hCorrelationDCAxy"), dcaXY / std::sqrt(eleParCov.getSigmaY2()), dcaXY_h / std::sqrt(trackParCov.getSigmaY2()));
665+
fRegistry.fill(HIST("e_Kpm/all/hCorrelationDCAz"), dcaZ / std::sqrt(eleParCov.getSigmaZ2()), dcaZ_h / std::sqrt(trackParCov.getSigmaZ2()));
654666

655667
int commonMotherId = o2::aod::pwgem::dilepton::utils::mcutil::FindCommonMotherFrom2ProngsWithoutPDG(mcele, mctrack); // e and K+/-
656668
if (commonMotherId < 0 && mctrack.has_mothers()) {
@@ -677,7 +689,9 @@ struct taggingHFE {
677689
fRegistry.fill(HIST("e_Kpm/D0/hMass"), mEK, ptEK);
678690
fRegistry.fill(HIST("e_Kpm/D0/hDeltaEtaDeltaPhi"), dphi, deta);
679691
fRegistry.fill(HIST("e_Kpm/D0/hRelDeltaPt"), reldpt);
680-
fRegistry.fill(HIST("e_Kpm/D0/hProdDCAxy"), dcaXY * dcaXY_h);
692+
fRegistry.fill(HIST("e_Kpm/D0/hProdDCAxy"), dcaXY / std::sqrt(eleParCov.getSigmaY2()) * dcaXY_h / std::sqrt(trackParCov.getSigmaY2()));
693+
fRegistry.fill(HIST("e_Kpm/D0/hCorrelationDCAxy"), dcaXY / std::sqrt(eleParCov.getSigmaY2()), dcaXY_h / std::sqrt(trackParCov.getSigmaY2()));
694+
fRegistry.fill(HIST("e_Kpm/D0/hCorrelationDCAz"), dcaZ / std::sqrt(eleParCov.getSigmaZ2()), dcaZ_h / std::sqrt(trackParCov.getSigmaZ2()));
681695
} else if (std::abs(cmp.pdgCode()) == 411) { // Dpm
682696
if (o2::aod::pwgem::dilepton::utils::mcutil::IsFromBeauty(cmp, mcParticles) < 0) {
683697
fillElectronHistograms<3, 1, 0>(ele, eleParCov, dcaXY, dcaZ); // prompt charm
@@ -692,7 +706,9 @@ struct taggingHFE {
692706
fRegistry.fill(HIST("e_Kpm/Dpm/hMass"), mEK, ptEK);
693707
fRegistry.fill(HIST("e_Kpm/Dpm/hDeltaEtaDeltaPhi"), dphi, deta);
694708
fRegistry.fill(HIST("e_Kpm/Dpm/hRelDeltaPt"), reldpt);
695-
fRegistry.fill(HIST("e_Kpm/Dpm/hProdDCAxy"), dcaXY * dcaXY_h);
709+
fRegistry.fill(HIST("e_Kpm/Dpm/hProdDCAxy"), dcaXY / std::sqrt(eleParCov.getSigmaY2()) * dcaXY_h / std::sqrt(trackParCov.getSigmaY2()));
710+
fRegistry.fill(HIST("e_Kpm/Dpm/hCorrelationDCAxy"), dcaXY / std::sqrt(eleParCov.getSigmaY2()), dcaXY_h / std::sqrt(trackParCov.getSigmaY2()));
711+
fRegistry.fill(HIST("e_Kpm/Dpm/hCorrelationDCAz"), dcaZ / std::sqrt(eleParCov.getSigmaZ2()), dcaZ_h / std::sqrt(trackParCov.getSigmaZ2()));
696712
} else if (std::abs(cmp.pdgCode()) == 431) { // Ds
697713
if (o2::aod::pwgem::dilepton::utils::mcutil::IsFromBeauty(cmp, mcParticles) < 0) {
698714
fillElectronHistograms<4, 1, 0>(ele, eleParCov, dcaXY, dcaZ); // prompt charm
@@ -707,7 +723,9 @@ struct taggingHFE {
707723
fRegistry.fill(HIST("e_Kpm/Ds/hMass"), mEK, ptEK);
708724
fRegistry.fill(HIST("e_Kpm/Ds/hDeltaEtaDeltaPhi"), dphi, deta);
709725
fRegistry.fill(HIST("e_Kpm/Ds/hRelDeltaPt"), reldpt);
710-
fRegistry.fill(HIST("e_Kpm/Ds/hProdDCAxy"), dcaXY * dcaXY_h);
726+
fRegistry.fill(HIST("e_Kpm/Ds/hProdDCAxy"), dcaXY / std::sqrt(eleParCov.getSigmaY2()) * dcaXY_h / std::sqrt(trackParCov.getSigmaY2()));
727+
fRegistry.fill(HIST("e_Kpm/Ds/hCorrelationDCAxy"), dcaXY / std::sqrt(eleParCov.getSigmaY2()), dcaXY_h / std::sqrt(trackParCov.getSigmaY2()));
728+
fRegistry.fill(HIST("e_Kpm/Ds/hCorrelationDCAz"), dcaZ / std::sqrt(eleParCov.getSigmaZ2()), dcaZ_h / std::sqrt(trackParCov.getSigmaZ2()));
711729
}
712730
}
713731
} else { // common mother does not exist, but DCAFitterN found something. i.e. fake
@@ -727,7 +745,9 @@ struct taggingHFE {
727745
fRegistry.fill(HIST("e_Kpm/fake/hMass"), mEK, ptEK);
728746
fRegistry.fill(HIST("e_Kpm/fake/hDeltaEtaDeltaPhi"), dphi, deta);
729747
fRegistry.fill(HIST("e_Kpm/fake/hRelDeltaPt"), reldpt);
730-
fRegistry.fill(HIST("e_Kpm/fake/hProdDCAxy"), dcaXY * dcaXY_h);
748+
fRegistry.fill(HIST("e_Kpm/fake/hProdDCAxy"), dcaXY / std::sqrt(eleParCov.getSigmaY2()) * dcaXY_h / std::sqrt(trackParCov.getSigmaY2()));
749+
fRegistry.fill(HIST("e_Kpm/fake/hCorrelationDCAxy"), dcaXY / std::sqrt(eleParCov.getSigmaY2()), dcaXY_h / std::sqrt(trackParCov.getSigmaY2()));
750+
fRegistry.fill(HIST("e_Kpm/fake/hCorrelationDCAz"), dcaZ / std::sqrt(eleParCov.getSigmaZ2()), dcaZ_h / std::sqrt(trackParCov.getSigmaZ2()));
731751
}
732752
} // end of kaon loop
733753
}
@@ -952,7 +972,7 @@ struct taggingHFE {
952972
Partition<MyFilteredTracks> negTracks = o2::aod::track::signed1Pt < 0.f;
953973

954974
//! type of V0. 0: built solely for cascades (does not pass standard V0 cuts), 1: standard 2, 3: photon-like with TPC-only use. Regular analysis should always use type 1.
955-
Filter v0Filter = o2::aod::v0data::v0Type == uint8_t(1) && o2::aod::v0data::v0cosPA > v0cuts.cfg_min_cospa_v0hadron&& o2::aod::v0data::dcaV0daughters < v0cuts.cfg_max_pca_v0hadron;
975+
Filter v0Filter = o2::aod::v0data::v0Type == uint8_t(1) && o2::aod::v0data::v0cosPA > v0cuts.cfg_min_cospa&& o2::aod::v0data::dcaV0daughters < v0cuts.cfg_max_dca2legs;
956976
using filteredV0s = soa::Filtered<MyV0s>;
957977

958978
std::vector<int> electronIds;
@@ -1306,6 +1326,72 @@ struct taggingHFE {
13061326
used_electronIds.shrink_to_fit();
13071327
}
13081328
PROCESS_SWITCH(taggingHFE, processTTCA, "process with TTCA", true);
1329+
1330+
template <int pdgLepton, int pdgNeutrino, typename TMCParticle, typename TMCParticles>
1331+
bool isSemiLeptonic(TMCParticle const& mcParticle, TMCParticles const& mcParticles)
1332+
{
1333+
if (!mcParticle.has_daughters()) {
1334+
return false;
1335+
}
1336+
bool is_lepton_involved = false;
1337+
bool is_neutrino_involved = false;
1338+
for (int d = mcParticle.daughtersIds()[0]; d <= mcParticle.daughtersIds()[1]; ++d) {
1339+
if (d < mcParticles.size()) { // protect against bad daughter indices
1340+
const auto& daughter = mcParticles.rawIteratorAt(d);
1341+
if (daughter.pdgCode() == pdgLepton) {
1342+
is_lepton_involved = true;
1343+
} else if (daughter.pdgCode() == pdgNeutrino) {
1344+
is_neutrino_involved = true;
1345+
}
1346+
} else {
1347+
std::cout << "Daughter label (" << d << ") exceeds the McParticles size (" << mcParticles.size() << ")" << std::endl;
1348+
std::cout << " Check the MC generator" << std::endl;
1349+
return false;
1350+
}
1351+
}
1352+
1353+
if (is_lepton_involved && is_neutrino_involved) {
1354+
return true;
1355+
} else {
1356+
return false;
1357+
}
1358+
}
1359+
1360+
Partition<aod::McParticles> genDpms = nabs(o2::aod::mcparticle::pdgCode) == 411;
1361+
Partition<aod::McParticles> genD0s = nabs(o2::aod::mcparticle::pdgCode) == 421;
1362+
Partition<aod::McParticles> genDss = nabs(o2::aod::mcparticle::pdgCode) == 431;
1363+
Partition<aod::McParticles> genLcs = nabs(o2::aod::mcparticle::pdgCode) == 4122;
1364+
1365+
void processGen(aod::McCollisions const&, aod::McParticles const& mcParticles)
1366+
{
1367+
for (const auto& genD0 : genD0s) {
1368+
const auto& mcCollision = genD0.template mcCollision_as<aod::McCollisions>();
1369+
if (cfgEventGeneratorType >= 0 && mcCollision.getSubGeneratorId() != cfgEventGeneratorType) {
1370+
continue;
1371+
}
1372+
if ((isSemiLeptonic<11, -12>(genD0, mcParticles) || isSemiLeptonic<-11, 12>(genD0, mcParticles))) {
1373+
float ptE = 999.f, ptK = 999.f;
1374+
float etaE = 999.f, etaK = 999.f;
1375+
for (int d = genD0.daughtersIds()[0]; d <= genD0.daughtersIds()[1]; ++d) {
1376+
const auto& daughter = mcParticles.rawIteratorAt(d);
1377+
if (std::abs(daughter.pdgCode()) == 11) {
1378+
ptE = daughter.pt();
1379+
etaE = daughter.eta();
1380+
} else if (std::abs(daughter.pdgCode()) == 321) {
1381+
ptK = daughter.pt();
1382+
etaK = daughter.eta();
1383+
}
1384+
}
1385+
if (o2::aod::pwgem::dilepton::utils::mcutil::IsFromBeauty(genD0, mcParticles) < 0) {
1386+
fRegistry.fill(HIST("Generated/D0/prompt/hs"), ptE, ptK, etaE, etaK);
1387+
} else {
1388+
fRegistry.fill(HIST("Generated/D0/nonprompt/hs"), ptE, ptK, etaE, etaK);
1389+
}
1390+
}
1391+
1392+
} // end of gen. D0 loop
1393+
}
1394+
PROCESS_SWITCH(taggingHFE, processGen, "process gen. info", true);
13091395
};
13101396
WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
13111397
{

0 commit comments

Comments
 (0)