diff --git a/PWGEM/PhotonMeson/TableProducer/skimmerDalitzEE.cxx b/PWGEM/PhotonMeson/TableProducer/skimmerDalitzEE.cxx index 725fa86e9ac..809f8f3a263 100644 --- a/PWGEM/PhotonMeson/TableProducer/skimmerDalitzEE.cxx +++ b/PWGEM/PhotonMeson/TableProducer/skimmerDalitzEE.cxx @@ -57,6 +57,8 @@ struct skimmerDalitzEE { "fRegistry", { {"hNpairs", "hNpairs;pair type;Number of Pairs", {HistType::kTH1F, {{3, -1.5f, +1.5f}}}}, + {"hNele", "hNele;centrality FT0C;Number of electrons", {HistType::kTH2F, {{110, 0, 110}, {101, -0.5f, +100.5f}}}}, + {"hNpos", "hNpos;centrality FT0C;Number of positrons", {HistType::kTH2F, {{110, 0, 110}, {101, -0.5f, +100.5f}}}}, }, }; @@ -133,6 +135,9 @@ struct skimmerDalitzEE { for (auto& collision : collisions) { auto posTracks_per_coll = posTracks->sliceByCached(o2::aod::emprimaryelectron::emreducedeventId, collision.globalIndex(), cache); auto negTracks_per_coll = negTracks->sliceByCached(o2::aod::emprimaryelectron::emreducedeventId, collision.globalIndex(), cache); + fRegistry.fill(HIST("hNpos"), collision.centFT0C(), posTracks_per_coll.size()); + fRegistry.fill(HIST("hNele"), collision.centFT0C(), negTracks_per_coll.size()); + // LOGF(info, "collision.centFT0C() = %f, posTracks_per_coll.size() = %d, negTracks_per_coll.size() = %d", collision.centFT0C() , posTracks_per_coll.size(), negTracks_per_coll.size()); int npair_uls = 0, npair_lspp = 0, npair_lsmm = 0; npair_uls = fillPairTable(collision, posTracks_per_coll, negTracks_per_coll); // ULS diff --git a/PWGEM/PhotonMeson/Tasks/TaggingPi0.cxx b/PWGEM/PhotonMeson/Tasks/TaggingPi0.cxx index ad7ed63220d..76fc698f6c5 100644 --- a/PWGEM/PhotonMeson/Tasks/TaggingPi0.cxx +++ b/PWGEM/PhotonMeson/Tasks/TaggingPi0.cxx @@ -44,7 +44,7 @@ using namespace o2::aod::photonpair; using MyCollisions = soa::Join; using MyCollision = MyCollisions::iterator; -using MyV0Photons = soa::Join; +using MyV0Photons = soa::Join; using MyV0Photon = MyV0Photons::iterator; using MyDalitzEEs = soa::Join; diff --git a/PWGEM/PhotonMeson/Tasks/TaggingPi0MC.cxx b/PWGEM/PhotonMeson/Tasks/TaggingPi0MC.cxx index 9765bef03cd..1a2a0b76f0f 100644 --- a/PWGEM/PhotonMeson/Tasks/TaggingPi0MC.cxx +++ b/PWGEM/PhotonMeson/Tasks/TaggingPi0MC.cxx @@ -47,7 +47,7 @@ using namespace o2::aod::photonpair; using MyCollisions = soa::Join; using MyCollision = MyCollisions::iterator; -using MyV0Photons = soa::Join; +using MyV0Photons = soa::Join; using MyV0Photon = MyV0Photons::iterator; using MyDalitzEEs = soa::Join; diff --git a/PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx b/PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx index dc7417f80f0..2a524b9eab6 100644 --- a/PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx +++ b/PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx @@ -50,6 +50,13 @@ struct DalitzEEQC { Configurable fConfigDalitzEECuts{"cfgDalitzEECuts", "mee_all_tpchadrejortofreq_lowB,nocut", "Comma separated list of dalitz ee cuts"}; std::vector fDalitzEECuts; + Configurable cfgCentEstimator{"cfgCentEstimator", 2, "FT0M:0, FT0A:1, FT0C:2"}; + Configurable> cfgArrCentMin{"cfgArrCentMin", {0.0f, 10.0f, 20.0f, 40.0f, 60.0f, 80.0f}, "cent min array"}; // overlap (e.g. 0, 0) is not allowed. + Configurable> cfgArrCentMax{"cfgArrCentMax", {10.0f, 20.0f, 40.0f, 60.0f, 80.0f, 999.f}, "cent max array"}; // overlap (e.g. 10, 20) is not allowed. + std::vector vec_cent_min; + std::vector vec_cent_max; + + static constexpr std::string_view cent_det_names[3] = {"FT0M", "FT0A", "FT0C"}; OutputObj fOutputEvent{"Event"}; OutputObj fOutputTrack{"Track"}; OutputObj fOutputDalitzEE{"DalitzEE"}; @@ -62,39 +69,32 @@ struct DalitzEEQC { fMainList->SetName("fMainList"); // create sub lists first. - o2::aod::emphotonhistograms::AddHistClass(fMainList, "Event"); - THashList* list_ev = reinterpret_cast(fMainList->FindObject("Event")); - o2::aod::emphotonhistograms::DefineHistograms(list_ev, "Event"); - - o2::aod::emphotonhistograms::AddHistClass(fMainList, "Track"); - THashList* list_track = reinterpret_cast(fMainList->FindObject("Track")); - - o2::aod::emphotonhistograms::AddHistClass(fMainList, "DalitzEE"); - THashList* list_dalitzee = reinterpret_cast(fMainList->FindObject("DalitzEE")); - - for (const auto& cut : fDalitzEECuts) { - const char* cutname = cut.GetName(); - o2::aod::emphotonhistograms::AddHistClass(list_track, cutname); - o2::aod::emphotonhistograms::AddHistClass(list_dalitzee, cutname); - } - - // for single tracks - for (auto& cut : fDalitzEECuts) { - std::string_view cutname = cut.GetName(); - THashList* list = reinterpret_cast(fMainList->FindObject("Track")->FindObject(cutname.data())); - o2::aod::emphotonhistograms::DefineHistograms(list, "Track"); - } - - // for DalitzEEs - for (auto& cut : fDalitzEECuts) { - std::string_view cutname = cut.GetName(); - THashList* list = reinterpret_cast(fMainList->FindObject("DalitzEE")->FindObject(cutname.data())); - if (doMix) { - o2::aod::emphotonhistograms::DefineHistograms(list, "DalitzEE", "mix"); - } else { - o2::aod::emphotonhistograms::DefineHistograms(list, "DalitzEE", ""); - } - } + THashList* list_ev = reinterpret_cast(o2::aod::emphotonhistograms::AddHistClass(fMainList, "Event")); + THashList* list_track = reinterpret_cast(o2::aod::emphotonhistograms::AddHistClass(fMainList, "Track")); + THashList* list_dalitzee = reinterpret_cast(o2::aod::emphotonhistograms::AddHistClass(fMainList, "DalitzEE")); + + for (size_t icen = 0; icen < vec_cent_min.size(); icen++) { + float cen_min = vec_cent_min[icen]; + float cen_max = vec_cent_max[icen]; + const char* cent_name = Form("Cent_%s_%3.2f_%3.2f", cent_det_names[cfgCentEstimator].data(), cen_min, cen_max); + THashList* list_ev_cent = reinterpret_cast(o2::aod::emphotonhistograms::AddHistClass(list_ev, cent_name)); + o2::aod::emphotonhistograms::DefineHistograms(list_ev_cent, "Event"); + + THashList* list_track_cent = reinterpret_cast(o2::aod::emphotonhistograms::AddHistClass(list_track, cent_name)); + THashList* list_dalitzee_cent = reinterpret_cast(o2::aod::emphotonhistograms::AddHistClass(list_dalitzee, cent_name)); + for (const auto& cut : fDalitzEECuts) { + const char* cutname = cut.GetName(); + THashList* list_track_cent_cut = reinterpret_cast(o2::aod::emphotonhistograms::AddHistClass(list_track_cent, cutname)); + o2::aod::emphotonhistograms::DefineHistograms(list_track_cent_cut, "Track"); + + THashList* list_dalitzee_cent_cut = reinterpret_cast(o2::aod::emphotonhistograms::AddHistClass(list_dalitzee_cent, cutname)); + if (doMix) { + o2::aod::emphotonhistograms::DefineHistograms(list_dalitzee_cent_cut, "DalitzEE", "mix"); + } else { + o2::aod::emphotonhistograms::DefineHistograms(list_dalitzee_cent_cut, "DalitzEE", ""); + } + } // end of cut loop + } // end of centrality loop } void DefineCuts() @@ -117,6 +117,13 @@ struct DalitzEEQC { doMix = true; } + vec_cent_min = (std::vector)cfgArrCentMin; + vec_cent_max = (std::vector)cfgArrCentMax; + LOGF(info, "vec_cent_min.size() = %d", vec_cent_min.size()); + for (size_t i = 0; i < vec_cent_min.size(); i++) { + LOGF(info, "id = %d : centrality range %f - %f", i, vec_cent_min[i], vec_cent_max[i]); + } + DefineCuts(); addhistograms(); // please call this after DefinCuts(); @@ -131,6 +138,7 @@ struct DalitzEEQC { SliceCache cache; Preslice perCollision = aod::dalitzee::emreducedeventId; + Preslice perCollision_track = aod::emprimaryelectron::emreducedeventId; std::vector used_trackIds; @@ -145,156 +153,176 @@ struct DalitzEEQC { float det_pos = 999.f, det_ele = 999.f; for (auto& collision : collisions) { - reinterpret_cast(fMainList->FindObject("Event")->FindObject("hZvtx_before"))->Fill(collision.posZ()); - reinterpret_cast(fMainList->FindObject("Event")->FindObject("hCollisionCounter"))->Fill(1.0); - if (!collision.sel8()) { - continue; - } - reinterpret_cast(fMainList->FindObject("Event")->FindObject("hCollisionCounter"))->Fill(2.0); - - if (collision.numContrib() < 0.5) { - continue; - } - reinterpret_cast(fMainList->FindObject("Event")->FindObject("hCollisionCounter"))->Fill(3.0); - - if (abs(collision.posZ()) > 10.0) { - continue; - } - reinterpret_cast(fMainList->FindObject("Event")->FindObject("hCollisionCounter"))->Fill(4.0); - reinterpret_cast(fMainList->FindObject("Event")->FindObject("hZvtx_after"))->Fill(collision.posZ()); - o2::aod::emphotonhistograms::FillHistClass(list_ev, "", collision); + float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}; + float centrality = centralities[cfgCentEstimator]; auto uls_pairs_per_coll = uls_pairs->sliceByCached(o2::aod::dalitzee::emreducedeventId, collision.globalIndex(), cache); auto lspp_pairs_per_coll = lspp_pairs->sliceByCached(o2::aod::dalitzee::emreducedeventId, collision.globalIndex(), cache); auto lsmm_pairs_per_coll = lsmm_pairs->sliceByCached(o2::aod::dalitzee::emreducedeventId, collision.globalIndex(), cache); - for (const auto& cut : fDalitzEECuts) { - THashList* list_dalitzee_cut = static_cast(list_dalitzee->FindObject(cut.GetName())); - THashList* list_track_cut = static_cast(list_track->FindObject(cut.GetName())); - used_trackIds.reserve(uls_pairs_per_coll.size() * 2); - - int nuls = 0, nlspp = 0, nlsmm = 0; - for (auto& uls_pair : uls_pairs_per_coll) { - auto pos = uls_pair.template posTrack_as(); - auto ele = uls_pair.template negTrack_as(); - if (cut.IsSelected(uls_pair)) { - det_pos = pos.cYY() * pos.cZZ() - pos.cZY() * pos.cZY(); - det_ele = ele.cYY() * ele.cZZ() - ele.cZY() * ele.cZY(); - if (det_pos < 0 || det_ele < 0) { - dca_pos_3d = 999.f, dca_ele_3d = 999.f, dca_ee_3d = 999.f; - LOGF(info, "determinant is negative."); - } else { - float chi2pos = (pos.dcaXY() * pos.dcaXY() * pos.cZZ() + pos.dcaZ() * pos.dcaZ() * pos.cYY() - 2. * pos.dcaXY() * pos.dcaZ() * pos.cZY()) / det_pos; - float chi2ele = (ele.dcaXY() * ele.dcaXY() * ele.cZZ() + ele.dcaZ() * ele.dcaZ() * ele.cYY() - 2. * ele.dcaXY() * ele.dcaZ() * ele.cZY()) / det_ele; - dca_pos_3d = std::sqrt(std::abs(chi2pos) / 2.); - dca_ele_3d = std::sqrt(std::abs(chi2ele) / 2.); - dca_ee_3d = std::sqrt((dca_pos_3d * dca_pos_3d + dca_ele_3d * dca_ele_3d) / 2.); - } - values_single[0] = uls_pair.mass(); - values_single[1] = dca_pos_3d; - values_single[2] = dca_ele_3d; - values_single[3] = dca_ee_3d; - reinterpret_cast(list_dalitzee_cut->FindObject("hs_dilepton_uls_dca_same"))->Fill(values_single); + for (size_t icen = 0; icen < vec_cent_min.size(); icen++) { + if (centrality < vec_cent_min[icen] || vec_cent_max[icen] < centrality) { + continue; + } + const char* cent_name = Form("Cent_%s_%3.2f_%3.2f", cent_det_names[cfgCentEstimator].data(), vec_cent_min[icen], vec_cent_max[icen]); + THashList* list_ev_cent = static_cast(list_ev->FindObject(cent_name)); + THashList* list_dalitzee_cent = static_cast(list_dalitzee->FindObject(cent_name)); + THashList* list_track_cent = static_cast(list_track->FindObject(cent_name)); + + reinterpret_cast(list_ev_cent->FindObject("hZvtx_before"))->Fill(collision.posZ()); + reinterpret_cast(list_ev_cent->FindObject("hCollisionCounter"))->Fill(1.0); + if (!collision.sel8()) { + continue; + } + reinterpret_cast(list_ev_cent->FindObject("hCollisionCounter"))->Fill(2.0); + + if (collision.numContrib() < 0.5) { + continue; + } + reinterpret_cast(list_ev_cent->FindObject("hCollisionCounter"))->Fill(3.0); + + if (abs(collision.posZ()) > 10.0) { + continue; + } + reinterpret_cast(list_ev_cent->FindObject("hCollisionCounter"))->Fill(4.0); + reinterpret_cast(list_ev_cent->FindObject("hZvtx_after"))->Fill(collision.posZ()); + + o2::aod::emphotonhistograms::FillHistClass(list_ev_cent, "", collision); + + for (const auto& cut : fDalitzEECuts) { + THashList* list_dalitzee_cent_cut = static_cast(list_dalitzee_cent->FindObject(cut.GetName())); + THashList* list_track_cent_cut = static_cast(list_track_cent->FindObject(cut.GetName())); + used_trackIds.reserve(uls_pairs_per_coll.size() * 2); + + int nuls = 0, nlspp = 0, nlsmm = 0; + for (auto& uls_pair : uls_pairs_per_coll) { + auto pos = uls_pair.template posTrack_as(); + auto ele = uls_pair.template negTrack_as(); + if (cut.IsSelected(uls_pair)) { + det_pos = pos.cYY() * pos.cZZ() - pos.cZY() * pos.cZY(); + det_ele = ele.cYY() * ele.cZZ() - ele.cZY() * ele.cZY(); + if (det_pos < 0 || det_ele < 0) { + dca_pos_3d = 999.f, dca_ele_3d = 999.f, dca_ee_3d = 999.f; + LOGF(info, "determinant is negative."); + } else { + float chi2pos = (pos.dcaXY() * pos.dcaXY() * pos.cZZ() + pos.dcaZ() * pos.dcaZ() * pos.cYY() - 2. * pos.dcaXY() * pos.dcaZ() * pos.cZY()) / det_pos; + float chi2ele = (ele.dcaXY() * ele.dcaXY() * ele.cZZ() + ele.dcaZ() * ele.dcaZ() * ele.cYY() - 2. * ele.dcaXY() * ele.dcaZ() * ele.cZY()) / det_ele; + dca_pos_3d = std::sqrt(std::abs(chi2pos) / 2.); + dca_ele_3d = std::sqrt(std::abs(chi2ele) / 2.); + dca_ee_3d = std::sqrt((dca_pos_3d * dca_pos_3d + dca_ele_3d * dca_ele_3d) / 2.); + } + values_single[0] = uls_pair.mass(); + values_single[1] = dca_pos_3d; + values_single[2] = dca_ele_3d; + values_single[3] = dca_ee_3d; + reinterpret_cast(list_dalitzee_cent_cut->FindObject("hs_dilepton_uls_dca_same"))->Fill(values_single); - values[0] = uls_pair.mass(); - values[1] = uls_pair.pt(); - values[2] = dca_ee_3d; - values[3] = uls_pair.phiv(); - reinterpret_cast(list_dalitzee_cut->FindObject("hs_dilepton_uls_same"))->Fill(values); - - nuls++; - for (auto& track : {pos, ele}) { - if (std::find(used_trackIds.begin(), used_trackIds.end(), track.globalIndex()) == used_trackIds.end()) { - o2::aod::emphotonhistograms::FillHistClass(list_track_cut, "", track); - used_trackIds.emplace_back(track.globalIndex()); + values[0] = uls_pair.mass(); + values[1] = uls_pair.pt(); + values[2] = dca_ee_3d; + values[3] = uls_pair.phiv(); + reinterpret_cast(list_dalitzee_cent_cut->FindObject("hs_dilepton_uls_same"))->Fill(values); + + nuls++; + for (auto& track : {pos, ele}) { + if (std::find(used_trackIds.begin(), used_trackIds.end(), track.globalIndex()) == used_trackIds.end()) { + o2::aod::emphotonhistograms::FillHistClass(list_track_cent_cut, "", track); + used_trackIds.emplace_back(track.globalIndex()); + } } } - } - } // end of uls pair loop - reinterpret_cast(list_dalitzee_cut->FindObject("hNpair_uls"))->Fill(nuls); - - for (auto& lspp_pair : lspp_pairs_per_coll) { - auto pos = lspp_pair.template posTrack_as(); - auto ele = lspp_pair.template negTrack_as(); - if (cut.IsSelected(lspp_pair)) { - det_pos = pos.cYY() * pos.cZZ() - pos.cZY() * pos.cZY(); - det_ele = ele.cYY() * ele.cZZ() - ele.cZY() * ele.cZY(); - if (det_pos < 0 || det_ele < 0) { - dca_pos_3d = 999.f, dca_ele_3d = 999.f, dca_ee_3d = 999.f; - LOGF(info, "determinant is negative."); - } else { - float chi2pos = (pos.dcaXY() * pos.dcaXY() * pos.cZZ() + pos.dcaZ() * pos.dcaZ() * pos.cYY() - 2. * pos.dcaXY() * pos.dcaZ() * pos.cZY()) / det_pos; - float chi2ele = (ele.dcaXY() * ele.dcaXY() * ele.cZZ() + ele.dcaZ() * ele.dcaZ() * ele.cYY() - 2. * ele.dcaXY() * ele.dcaZ() * ele.cZY()) / det_ele; - dca_pos_3d = std::sqrt(std::abs(chi2pos) / 2.); - dca_ele_3d = std::sqrt(std::abs(chi2ele) / 2.); - dca_ee_3d = std::sqrt((dca_pos_3d * dca_pos_3d + dca_ele_3d * dca_ele_3d) / 2.); - } - values_single[0] = lspp_pair.mass(); - values_single[1] = dca_pos_3d; - values_single[2] = dca_ele_3d; - values_single[3] = dca_ee_3d; - reinterpret_cast(list_dalitzee_cut->FindObject("hs_dilepton_lspp_dca_same"))->Fill(values_single); + } // end of uls pair loop + reinterpret_cast(list_dalitzee_cent_cut->FindObject("hNpair_uls"))->Fill(nuls); + + for (auto& lspp_pair : lspp_pairs_per_coll) { + auto pos = lspp_pair.template posTrack_as(); + auto ele = lspp_pair.template negTrack_as(); + if (cut.IsSelected(lspp_pair)) { + det_pos = pos.cYY() * pos.cZZ() - pos.cZY() * pos.cZY(); + det_ele = ele.cYY() * ele.cZZ() - ele.cZY() * ele.cZY(); + if (det_pos < 0 || det_ele < 0) { + dca_pos_3d = 999.f, dca_ele_3d = 999.f, dca_ee_3d = 999.f; + LOGF(info, "determinant is negative."); + } else { + float chi2pos = (pos.dcaXY() * pos.dcaXY() * pos.cZZ() + pos.dcaZ() * pos.dcaZ() * pos.cYY() - 2. * pos.dcaXY() * pos.dcaZ() * pos.cZY()) / det_pos; + float chi2ele = (ele.dcaXY() * ele.dcaXY() * ele.cZZ() + ele.dcaZ() * ele.dcaZ() * ele.cYY() - 2. * ele.dcaXY() * ele.dcaZ() * ele.cZY()) / det_ele; + dca_pos_3d = std::sqrt(std::abs(chi2pos) / 2.); + dca_ele_3d = std::sqrt(std::abs(chi2ele) / 2.); + dca_ee_3d = std::sqrt((dca_pos_3d * dca_pos_3d + dca_ele_3d * dca_ele_3d) / 2.); + } + values_single[0] = lspp_pair.mass(); + values_single[1] = dca_pos_3d; + values_single[2] = dca_ele_3d; + values_single[3] = dca_ee_3d; + reinterpret_cast(list_dalitzee_cent_cut->FindObject("hs_dilepton_lspp_dca_same"))->Fill(values_single); - values[0] = lspp_pair.mass(); - values[1] = lspp_pair.pt(); - values[2] = dca_ee_3d; - values[3] = lspp_pair.phiv(); - reinterpret_cast(list_dalitzee_cut->FindObject("hs_dilepton_lspp_same"))->Fill(values); - nlspp++; - } - } // end of lspp pair loop - reinterpret_cast(list_dalitzee_cut->FindObject("hNpair_lspp"))->Fill(nlspp); - - for (auto& lsmm_pair : lsmm_pairs_per_coll) { - auto pos = lsmm_pair.template posTrack_as(); - auto ele = lsmm_pair.template negTrack_as(); - if (cut.IsSelected(lsmm_pair)) { - det_pos = pos.cYY() * pos.cZZ() - pos.cZY() * pos.cZY(); - det_ele = ele.cYY() * ele.cZZ() - ele.cZY() * ele.cZY(); - if (det_pos < 0 || det_ele < 0) { - dca_pos_3d = 999.f, dca_ele_3d = 999.f, dca_ee_3d = 999.f; - LOGF(info, "determinant is negative."); - } else { - float chi2pos = (pos.dcaXY() * pos.dcaXY() * pos.cZZ() + pos.dcaZ() * pos.dcaZ() * pos.cYY() - 2. * pos.dcaXY() * pos.dcaZ() * pos.cZY()) / det_pos; - float chi2ele = (ele.dcaXY() * ele.dcaXY() * ele.cZZ() + ele.dcaZ() * ele.dcaZ() * ele.cYY() - 2. * ele.dcaXY() * ele.dcaZ() * ele.cZY()) / det_ele; - dca_pos_3d = std::sqrt(std::abs(chi2pos) / 2.); - dca_ele_3d = std::sqrt(std::abs(chi2ele) / 2.); - dca_ee_3d = std::sqrt((dca_pos_3d * dca_pos_3d + dca_ele_3d * dca_ele_3d) / 2.); + values[0] = lspp_pair.mass(); + values[1] = lspp_pair.pt(); + values[2] = dca_ee_3d; + values[3] = lspp_pair.phiv(); + reinterpret_cast(list_dalitzee_cent_cut->FindObject("hs_dilepton_lspp_same"))->Fill(values); + nlspp++; } - values_single[0] = lsmm_pair.mass(); - values_single[1] = dca_pos_3d; - values_single[2] = dca_ele_3d; - values_single[3] = dca_ee_3d; - reinterpret_cast(list_dalitzee_cut->FindObject("hs_dilepton_lsmm_dca_same"))->Fill(values_single); + } // end of lspp pair loop + reinterpret_cast(list_dalitzee_cent_cut->FindObject("hNpair_lspp"))->Fill(nlspp); + + for (auto& lsmm_pair : lsmm_pairs_per_coll) { + auto pos = lsmm_pair.template posTrack_as(); + auto ele = lsmm_pair.template negTrack_as(); + if (cut.IsSelected(lsmm_pair)) { + det_pos = pos.cYY() * pos.cZZ() - pos.cZY() * pos.cZY(); + det_ele = ele.cYY() * ele.cZZ() - ele.cZY() * ele.cZY(); + if (det_pos < 0 || det_ele < 0) { + dca_pos_3d = 999.f, dca_ele_3d = 999.f, dca_ee_3d = 999.f; + LOGF(info, "determinant is negative."); + } else { + float chi2pos = (pos.dcaXY() * pos.dcaXY() * pos.cZZ() + pos.dcaZ() * pos.dcaZ() * pos.cYY() - 2. * pos.dcaXY() * pos.dcaZ() * pos.cZY()) / det_pos; + float chi2ele = (ele.dcaXY() * ele.dcaXY() * ele.cZZ() + ele.dcaZ() * ele.dcaZ() * ele.cYY() - 2. * ele.dcaXY() * ele.dcaZ() * ele.cZY()) / det_ele; + dca_pos_3d = std::sqrt(std::abs(chi2pos) / 2.); + dca_ele_3d = std::sqrt(std::abs(chi2ele) / 2.); + dca_ee_3d = std::sqrt((dca_pos_3d * dca_pos_3d + dca_ele_3d * dca_ele_3d) / 2.); + } + values_single[0] = lsmm_pair.mass(); + values_single[1] = dca_pos_3d; + values_single[2] = dca_ele_3d; + values_single[3] = dca_ee_3d; + reinterpret_cast(list_dalitzee_cent_cut->FindObject("hs_dilepton_lsmm_dca_same"))->Fill(values_single); - values[0] = lsmm_pair.mass(); - values[1] = lsmm_pair.pt(); - values[2] = dca_ee_3d; - values[3] = lsmm_pair.phiv(); - reinterpret_cast(list_dalitzee_cut->FindObject("hs_dilepton_lsmm_same"))->Fill(values); - nlsmm++; - } - } // end of lsmm pair loop - reinterpret_cast(list_dalitzee_cut->FindObject("hNpair_lsmm"))->Fill(nlsmm); - - used_trackIds.clear(); - used_trackIds.shrink_to_fit(); - } // end of cut loop - } // end of collision loop - } // end of process + values[0] = lsmm_pair.mass(); + values[1] = lsmm_pair.pt(); + values[2] = dca_ee_3d; + values[3] = lsmm_pair.phiv(); + reinterpret_cast(list_dalitzee_cent_cut->FindObject("hs_dilepton_lsmm_same"))->Fill(values); + nlsmm++; + } + } // end of lsmm pair loop + reinterpret_cast(list_dalitzee_cent_cut->FindObject("hNpair_lsmm"))->Fill(nlsmm); + + used_trackIds.clear(); + used_trackIds.shrink_to_fit(); + } // end of cut loop + } // end of centrality list loop + } // end of collision loop + } // end of process PROCESS_SWITCH(DalitzEEQC, processQC, "run Dalitz QC", true); Configurable ndepth{"ndepth", 10, "depth for event mixing"}; ConfigurableAxis ConfVtxBins{"ConfVtxBins", {VARIABLE_WIDTH, -10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}, "Mixing bins - z-vertex"}; ConfigurableAxis ConfCentBins{"ConfCentBins", {VARIABLE_WIDTH, 0.0f, 5.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f, 100.0f, 999.f}, "Mixing bins - centrality"}; - using BinningType = ColumnBinningPolicy; - BinningType colBinning{{ConfVtxBins, ConfCentBins}, true}; + using BinningType_M = ColumnBinningPolicy; + using BinningType_A = ColumnBinningPolicy; + using BinningType_C = ColumnBinningPolicy; + BinningType_M colBinning_M{{ConfVtxBins, ConfCentBins}, true}; + BinningType_A colBinning_A{{ConfVtxBins, ConfCentBins}, true}; + BinningType_C colBinning_C{{ConfVtxBins, ConfCentBins}, true}; + Filter collisionFilter_common = nabs(o2::aod::collision::posZ) < 10.f && o2::aod::collision::numContrib > (uint16_t)0 && o2::aod::evsel::sel8 == true; Filter collisionFilter_subsys = (o2::aod::emreducedevent::neeuls >= 1) || (o2::aod::emreducedevent::neelspp >= 1) || (o2::aod::emreducedevent::neelsmm >= 1); using MyFilteredCollisions = soa::Filtered; // this goes to mixed event. // e+, e- enter to event mixing, only if any pair exists. If you want to do mixed event, please store LS for ee - void processEventMixing(MyFilteredCollisions const& collisions, MyDalitzEEs const& dileptons, MyTracks const& tracks) + template + void MixedEventPairing(TEvents const& collisions, TTracks const& tracks, TMixedBinning const& colBinning) { THashList* list_dalitzee = static_cast(fMainList->FindObject("DalitzEE")); double values[4] = {0, 0, 0, 0}; @@ -305,71 +333,79 @@ struct DalitzEEQC { float det_pos = 999.f, det_ele = 999.f; for (auto& [collision1, collision2] : soa::selfCombinations(colBinning, ndepth, -1, collisions, collisions)) { // internally, CombinationsStrictlyUpperIndexPolicy(collisions, collisions) is called. - auto dileptons_coll1 = dileptons.sliceBy(perCollision, collision1.globalIndex()); - auto dileptons_coll2 = dileptons.sliceBy(perCollision, collision2.globalIndex()); - // LOGF(info, "collision1.globalIndex() = %d, collision1: posZ = %f, sel8 = %d | collision2.globalIndex() = %d, collision2: posZ = %f, sel8 = %d",collision1.globalIndex(), collision1.posZ(), collision1.sel8(), collision2.globalIndex(), collision2.posZ(), collision2.sel8()); - - for (auto& cut : fDalitzEECuts) { - THashList* list_dalitzee_cut = static_cast(list_dalitzee->FindObject(cut.GetName())); - for (auto& [dl1, dl2] : combinations(soa::CombinationsFullIndexPolicy(dileptons_coll1, dileptons_coll2))) { - if (!cut.IsSelected(dl1) || !cut.IsSelected(dl2)) { - continue; - } - - auto pos1 = dl1.template posTrack_as(); - auto ele1 = dl1.template negTrack_as(); - auto pos2 = dl2.template posTrack_as(); - auto ele2 = dl2.template negTrack_as(); - - for (auto& t1 : {pos1, ele1}) { - for (auto& t2 : {pos2, ele2}) { - v1 = ROOT::Math::PtEtaPhiMVector(t1.pt(), t1.eta(), t1.phi(), o2::constants::physics::MassElectron); - v2 = ROOT::Math::PtEtaPhiMVector(t2.pt(), t2.eta(), t2.phi(), o2::constants::physics::MassElectron); - v12 = v1 + v2; - phiv = getPhivPair(t1.px(), t1.py(), t1.pz(), t2.px(), t2.py(), t2.pz(), t1.sign(), t2.sign(), collision1.bz()); - - det_pos = t1.cYY() * t1.cZZ() - t1.cZY() * t1.cZY(); - det_ele = t2.cYY() * t2.cZZ() - t2.cZY() * t2.cZY(); - if (det_pos < 0 || det_ele < 0) { - dca_pos_3d = 999.f, dca_ele_3d = 999.f, dca_ee_3d = 999.f; - LOGF(info, "determinant is negative."); - } else { - float chi2pos = (t1.dcaXY() * t1.dcaXY() * t1.cZZ() + t1.dcaZ() * t1.dcaZ() * t1.cYY() - 2. * t1.dcaXY() * t1.dcaZ() * t1.cZY()) / det_pos; - float chi2ele = (t2.dcaXY() * t2.dcaXY() * t2.cZZ() + t2.dcaZ() * t2.dcaZ() * t2.cYY() - 2. * t2.dcaXY() * t2.dcaZ() * t2.cZY()) / det_ele; - dca_pos_3d = std::sqrt(std::abs(chi2pos) / 2.); - dca_ele_3d = std::sqrt(std::abs(chi2ele) / 2.); - dca_ee_3d = std::sqrt((dca_pos_3d * dca_pos_3d + dca_ele_3d * dca_ele_3d) / 2.); - } - values_single[0] = v12.M(); - values_single[1] = dca_pos_3d; - values_single[2] = dca_ele_3d; - values_single[3] = dca_ee_3d; + float centralities[3] = {collision1.centFT0M(), collision1.centFT0A(), collision1.centFT0C()}; + float centrality = centralities[cfgCentEstimator]; + + auto tracks_coll1 = tracks.sliceBy(perCollision_track, collision1.globalIndex()); + auto tracks_coll2 = tracks.sliceBy(perCollision_track, collision2.globalIndex()); + // LOGF(info, "collision1.globalIndex() = %d, collision1: posZ = %f, sel8 = %d, centFT0C = %f, ndl1 = %d | collision2.globalIndex() = %d, collision2: posZ = %f, sel8 = %d, centFT0C = %f, ndl2 = %d",collision1.globalIndex(), collision1.posZ(), collision1.sel8(), collision1.centFT0C(), tracks_coll1.size(), collision2.globalIndex(), collision2.posZ(), collision2.sel8(), collision2.centFT0C(), tracks_coll2.size()); + + for (size_t icen = 0; icen < vec_cent_min.size(); icen++) { + if (centrality < vec_cent_min[icen] || vec_cent_max[icen] < centrality) { + continue; + } + const char* cent_name = Form("Cent_%s_%3.2f_%3.2f", cent_det_names[cfgCentEstimator].data(), vec_cent_min[icen], vec_cent_max[icen]); + THashList* list_dalitzee_cent = static_cast(list_dalitzee->FindObject(cent_name)); + + for (auto& cut : fDalitzEECuts) { + THashList* list_dalitzee_cent_cut = static_cast(list_dalitzee_cent->FindObject(cut.GetName())); + for (auto& [t1, t2] : combinations(soa::CombinationsFullIndexPolicy(tracks_coll1, tracks_coll2))) { + v1 = ROOT::Math::PtEtaPhiMVector(t1.pt(), t1.eta(), t1.phi(), o2::constants::physics::MassElectron); + v2 = ROOT::Math::PtEtaPhiMVector(t2.pt(), t2.eta(), t2.phi(), o2::constants::physics::MassElectron); + v12 = v1 + v2; + phiv = getPhivPair(t1.px(), t1.py(), t1.pz(), t2.px(), t2.py(), t2.pz(), t1.sign(), t2.sign(), collision1.bz()); + + det_pos = t1.cYY() * t1.cZZ() - t1.cZY() * t1.cZY(); + det_ele = t2.cYY() * t2.cZZ() - t2.cZY() * t2.cZY(); + if (det_pos < 0 || det_ele < 0) { + dca_pos_3d = 999.f, dca_ele_3d = 999.f, dca_ee_3d = 999.f; + LOGF(info, "determinant is negative."); + } else { + float chi2pos = (t1.dcaXY() * t1.dcaXY() * t1.cZZ() + t1.dcaZ() * t1.dcaZ() * t1.cYY() - 2. * t1.dcaXY() * t1.dcaZ() * t1.cZY()) / det_pos; + float chi2ele = (t2.dcaXY() * t2.dcaXY() * t2.cZZ() + t2.dcaZ() * t2.dcaZ() * t2.cYY() - 2. * t2.dcaXY() * t2.dcaZ() * t2.cZY()) / det_ele; + dca_pos_3d = std::sqrt(std::abs(chi2pos) / 2.); + dca_ele_3d = std::sqrt(std::abs(chi2ele) / 2.); + dca_ee_3d = std::sqrt((dca_pos_3d * dca_pos_3d + dca_ele_3d * dca_ele_3d) / 2.); + } + values_single[0] = v12.M(); + values_single[1] = dca_pos_3d; + values_single[2] = dca_ele_3d; + values_single[3] = dca_ee_3d; - values[0] = v12.M(); - values[1] = v12.Pt(); - values[2] = dca_ee_3d; - values[3] = phiv; - - if (cut.IsSelectedTrack(t1) && cut.IsSelectedTrack(t2) && cut.IsSelectedPair(v12.M(), phiv)) { - if (t1.sign() * t2.sign() < 0) { - reinterpret_cast(list_dalitzee_cut->FindObject("hs_dilepton_uls_mix"))->Fill(values); - reinterpret_cast(list_dalitzee_cut->FindObject("hs_dilepton_uls_dca_mix"))->Fill(values_single); - } else if (t1.sign() > 0 && t2.sign() > 0) { - reinterpret_cast(list_dalitzee_cut->FindObject("hs_dilepton_lspp_mix"))->Fill(values); - reinterpret_cast(list_dalitzee_cut->FindObject("hs_dilepton_lspp_dca_mix"))->Fill(values_single); - } else if (t1.sign() < 0 && t2.sign() < 0) { - reinterpret_cast(list_dalitzee_cut->FindObject("hs_dilepton_lsmm_mix"))->Fill(values); - reinterpret_cast(list_dalitzee_cut->FindObject("hs_dilepton_lsmm_dca_mix"))->Fill(values_single); - } else { - LOGF(info, "This should not happen."); - } + values[0] = v12.M(); + values[1] = v12.Pt(); + values[2] = dca_ee_3d; + values[3] = phiv; + + if (cut.IsSelectedTrack(t1) && cut.IsSelectedTrack(t2) && cut.IsSelectedPair(v12.M(), phiv)) { + if (t1.sign() * t2.sign() < 0) { + reinterpret_cast(list_dalitzee_cent_cut->FindObject("hs_dilepton_uls_mix"))->Fill(values); + reinterpret_cast(list_dalitzee_cent_cut->FindObject("hs_dilepton_uls_dca_mix"))->Fill(values_single); + } else if (t1.sign() > 0 && t2.sign() > 0) { + reinterpret_cast(list_dalitzee_cent_cut->FindObject("hs_dilepton_lspp_mix"))->Fill(values); + reinterpret_cast(list_dalitzee_cent_cut->FindObject("hs_dilepton_lspp_dca_mix"))->Fill(values_single); + } else if (t1.sign() < 0 && t2.sign() < 0) { + reinterpret_cast(list_dalitzee_cent_cut->FindObject("hs_dilepton_lsmm_mix"))->Fill(values); + reinterpret_cast(list_dalitzee_cent_cut->FindObject("hs_dilepton_lsmm_dca_mix"))->Fill(values_single); + } else { + LOGF(info, "This should not happen."); } } - } + } // end of different dileptn combinations + } // end of centrality list loop + } // end of cut loop + } // end of different collision combinations + } - } // end of different dileptn combinations - } // end of cut loop - } // end of different collision combinations + void processEventMixing(MyFilteredCollisions const& collisions, MyTracks const& tracks) + { + if (cfgCentEstimator == 0) { + MixedEventPairing(collisions, tracks, colBinning_M); + } else if (cfgCentEstimator == 1) { + MixedEventPairing(collisions, tracks, colBinning_A); + } else if (cfgCentEstimator == 2) { + MixedEventPairing(collisions, tracks, colBinning_C); + } } PROCESS_SWITCH(DalitzEEQC, processEventMixing, "run Dalitz EE QC event mixing", true); diff --git a/PWGEM/PhotonMeson/Tasks/dalitzMuMuQC.cxx b/PWGEM/PhotonMeson/Tasks/dalitzMuMuQC.cxx index 0a09f0ccff1..3cb4c6cff45 100644 --- a/PWGEM/PhotonMeson/Tasks/dalitzMuMuQC.cxx +++ b/PWGEM/PhotonMeson/Tasks/dalitzMuMuQC.cxx @@ -131,6 +131,7 @@ struct DalitzMuMuQC { SliceCache cache; Preslice perCollision = aod::dalitzmumu::emreducedeventId; + Preslice perCollision_track = aod::emprimarymuon::emreducedeventId; std::vector used_trackIds; @@ -269,59 +270,62 @@ struct DalitzMuMuQC { Configurable ndepth{"ndepth", 10, "depth for event mixing"}; ConfigurableAxis ConfVtxBins{"ConfVtxBins", {VARIABLE_WIDTH, -10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}, "Mixing bins - z-vertex"}; ConfigurableAxis ConfCentBins{"ConfCentBins", {VARIABLE_WIDTH, 0.0f, 5.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f, 100.0f, 999.f}, "Mixing bins - centrality"}; - using BinningType = ColumnBinningPolicy; + using BinningType = ColumnBinningPolicy; BinningType colBinning{{ConfVtxBins, ConfCentBins}, true}; Filter collisionFilter_common = nabs(o2::aod::collision::posZ) < 10.f && o2::aod::collision::numContrib > (uint16_t)0 && o2::aod::evsel::sel8 == true; Filter collisionFilter_subsys = (o2::aod::emreducedevent::nmumuuls >= 1) || (o2::aod::emreducedevent::nmumulspp >= 1) || (o2::aod::emreducedevent::nmumulsmm >= 1); using MyFilteredCollisions = soa::Filtered; // this goes to mixed event. // mu+, mu- enter to event mixing, only if any pair exists. If you want to do mixed event, please store LS for mumu - void processEventMixing(MyFilteredCollisions const& collisions, MyDalitzMuMus const& dileptons, MyTracks const& tracks) + void processEventMixing(MyFilteredCollisions const& collisions, MyTracks const& tracks) { THashList* list_dalitzmumu = static_cast(fMainList->FindObject("DalitzMuMu")); double values[4] = {0, 0, 0, 0}; ROOT::Math::PtEtaPhiMVector v1, v2, v12; + float phiv = 0; + float dca_pos_3d = 999.f, dca_ele_3d = 999.f, dca_ee_3d = 999.f; + float det_pos = 999.f, det_ele = 999.f; for (auto& [collision1, collision2] : soa::selfCombinations(colBinning, ndepth, -1, collisions, collisions)) { // internally, CombinationsStrictlyUpperIndexPolicy(collisions, collisions) is called. - auto dileptons_coll1 = dileptons.sliceBy(perCollision, collision1.globalIndex()); - auto dileptons_coll2 = dileptons.sliceBy(perCollision, collision2.globalIndex()); - // LOGF(info, "collision1.globalIndex() = %d, collision1: posZ = %f, sel8 = %d | collision2.globalIndex() = %d, collision2: posZ = %f, sel8 = %d",collision1.globalIndex(), collision1.posZ(), collision1.sel8(), collision2.globalIndex(), collision2.posZ(), collision2.sel8()); + auto tracks_coll1 = tracks.sliceBy(perCollision_track, collision1.globalIndex()); + auto tracks_coll2 = tracks.sliceBy(perCollision_track, collision2.globalIndex()); + // LOGF(info, "collision1.globalIndex() = %d, collision1: posZ = %f, sel8 = %d, centFT0C = %f, ndl1 = %d | collision2.globalIndex() = %d, collision2: posZ = %f, sel8 = %d, centFT0C = %f, ndl2 = %d",collision1.globalIndex(), collision1.posZ(), collision1.sel8(), collision1.centFT0C(), tracks_coll1.size(), collision2.globalIndex(), collision2.posZ(), collision2.sel8(), collision2.centFT0C(), tracks_coll2.size()); for (auto& cut : fDalitzMuMuCuts) { THashList* list_dalitzmumu_cut = static_cast(list_dalitzmumu->FindObject(cut.GetName())); - for (auto& [dl1, dl2] : combinations(soa::CombinationsFullIndexPolicy(dileptons_coll1, dileptons_coll2))) { - if (!cut.IsSelected(dl1) || !cut.IsSelected(dl2)) { - continue; + for (auto& [t1, t2] : combinations(soa::CombinationsFullIndexPolicy(tracks_coll1, tracks_coll2))) { + v1 = ROOT::Math::PtEtaPhiMVector(t1.pt(), t1.eta(), t1.phi(), o2::constants::physics::MassMuon); + v2 = ROOT::Math::PtEtaPhiMVector(t2.pt(), t2.eta(), t2.phi(), o2::constants::physics::MassMuon); + v12 = v1 + v2; + + det_pos = t1.cYY() * t1.cZZ() - t1.cZY() * t1.cZY(); + det_ele = t2.cYY() * t2.cZZ() - t2.cZY() * t2.cZY(); + if (det_pos < 0 || det_ele < 0) { + dca_pos_3d = 999.f, dca_ele_3d = 999.f, dca_ee_3d = 999.f; + LOGF(info, "determinant is negative."); + } else { + float chi2pos = (t1.dcaXY() * t1.dcaXY() * t1.cZZ() + t1.dcaZ() * t1.dcaZ() * t1.cYY() - 2. * t1.dcaXY() * t1.dcaZ() * t1.cZY()) / det_pos; + float chi2ele = (t2.dcaXY() * t2.dcaXY() * t2.cZZ() + t2.dcaZ() * t2.dcaZ() * t2.cYY() - 2. * t2.dcaXY() * t2.dcaZ() * t2.cZY()) / det_ele; + dca_pos_3d = std::sqrt(std::abs(chi2pos) / 2.); + dca_ele_3d = std::sqrt(std::abs(chi2ele) / 2.); + dca_ee_3d = std::sqrt((dca_pos_3d * dca_pos_3d + dca_ele_3d * dca_ele_3d) / 2.); } - - auto pos1 = dl1.template posTrack_as(); - auto ele1 = dl1.template negTrack_as(); - auto pos2 = dl2.template posTrack_as(); - auto ele2 = dl2.template negTrack_as(); - - for (auto& t1 : {pos1, ele1}) { - for (auto& t2 : {pos2, ele2}) { - v1 = ROOT::Math::PtEtaPhiMVector(t1.pt(), t1.eta(), t1.phi(), o2::constants::physics::MassMuon); - v2 = ROOT::Math::PtEtaPhiMVector(t2.pt(), t2.eta(), t2.phi(), o2::constants::physics::MassMuon); - v12 = v1 + v2; - values[0] = v12.M(); - values[1] = v12.Pt(); - values[2] = sqrt((pow(t1.dcaXY() / sqrt(t1.cYY()), 2) + pow(t2.dcaXY() / sqrt(t2.cYY()), 2)) / 2.); // pair DCAxy - values[3] = 0.f; - if (cut.IsSelectedTrack(t1) && cut.IsSelectedTrack(t2) && cut.IsSelectedPair(v12.M(), 0.f)) { - if (t1.sign() * t2.sign() < 0) { - reinterpret_cast(list_dalitzmumu_cut->FindObject("hs_dilepton_uls_mix"))->Fill(values); - } else if (t1.sign() > 0 && t2.sign() > 0) { - reinterpret_cast(list_dalitzmumu_cut->FindObject("hs_dilepton_lspp_mix"))->Fill(values); - } else if (t1.sign() < 0 && t2.sign() < 0) { - reinterpret_cast(list_dalitzmumu_cut->FindObject("hs_dilepton_lsmm_mix"))->Fill(values); - } else { - LOGF(info, "This should not happen."); - } - } + values[0] = v12.M(); + values[1] = v12.Pt(); + values[2] = dca_ee_3d; + values[3] = phiv; + + if (cut.IsSelectedTrack(t1) && cut.IsSelectedTrack(t2) && cut.IsSelectedPair(v12.M(), phiv)) { + if (t1.sign() * t2.sign() < 0) { + reinterpret_cast(list_dalitzmumu_cut->FindObject("hs_dilepton_uls_mix"))->Fill(values); + } else if (t1.sign() > 0 && t2.sign() > 0) { + reinterpret_cast(list_dalitzmumu_cut->FindObject("hs_dilepton_lspp_mix"))->Fill(values); + } else if (t1.sign() < 0 && t2.sign() < 0) { + reinterpret_cast(list_dalitzmumu_cut->FindObject("hs_dilepton_lsmm_mix"))->Fill(values); + } else { + LOGF(info, "This should not happen."); } } - } // end of different dileptn combinations } // end of cut loop } // end of different collision combinations