@@ -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};
13101396WorkflowSpec defineDataProcessing (ConfigContext const & cfgc)
13111397{
0 commit comments