Skip to content

Commit 2b1dfed

Browse files
lgansbartlLaura Gansbartl
andauthored
[PWGEM] [PWGEM] (#17654)
Co-authored-by: Laura Gansbartl <lgansbartl@pcikf5.ikf.uni-frankfurt.de>
1 parent f89b8db commit 2b1dfed

1 file changed

Lines changed: 165 additions & 42 deletions

File tree

PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx

Lines changed: 165 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
#include <cmath>
5252
#include <cstdint>
5353
#include <map>
54+
#include <set>
5455
#include <string>
5556
#include <string_view>
5657
#include <unordered_map>
@@ -103,6 +104,12 @@ struct skimmerPrimaryElectronFromDalitzEE {
103104

104105
Produces<aod::EMTOFNSigmas> emtofs;
105106

107+
enum class enumFillingMode {
108+
SingleTrack = 1,
109+
EpEmPairs = 2,
110+
EpEmPairsAndPhoton = 3
111+
};
112+
106113
// Configurables
107114
Configurable<std::string> ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"};
108115
Configurable<std::string> grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"};
@@ -139,9 +146,13 @@ struct skimmerPrimaryElectronFromDalitzEE {
139146
Configurable<bool> requireTOF{"requireTOF", false, "require TOF hit"};
140147
Configurable<float> min_pin_for_pion_rejection{"min_pin_for_pion_rejection", 0.0, "pion rejection is applied above this pin"}; // this is used only in TOFreq
141148
Configurable<float> max_pin_for_pion_rejection{"max_pin_for_pion_rejection", 0.5, "pion rejection is applied below this pin"};
142-
Configurable<float> maxMee{"maxMee", 0.04, "max. mee to store dalitz ee pairs"};
149+
Configurable<float> minMee{"minMee", 0., "min. mee to store dalitz ee pairs"};
150+
Configurable<float> maxMee{"maxMee", 0.5, "max. mee to store dalitz ee pairs"};
151+
Configurable<float> minMeegamma{"minMeegamma", 0.3, "min. mee to store eegamma candidates"};
152+
Configurable<float> maxMeegamma{"maxMeegamma", 0.8, "max. mee to store eegamma candidates"};
143153
Configurable<bool> fillLS{"fillLS", true, "flag to fill LS histograms for QA"};
144-
Configurable<bool> fillWithPairs{"fillWithPairs", false, "flag to fill table based on pair information"};
154+
Configurable<int> fillingMode{"fillingMode", 1, "Filling mode| 1: fill tracks without pair selection, 2: fill tracks from selected pairs, 3: fill tracks from selected pairs that can be combined with a photon"};
155+
Configurable<bool> fillWithEtaMassCut{"fillWithEtaMassCut", true, "only valid for fillingmode 3; true: filling tabled based on eta candidate selection with minMeegamma < M < maxMeegamma, false: fill identical to fillingmode 2"};
145156
Configurable<bool> includeITSsa{"includeITSsa", false, "Flag to include ITSsa tracks"};
146157
Configurable<float> maxpt_itssa{"maxpt_itssa", 0.15, "max pt for ITSsa track"}; // o2-linter: disable=name/function-variable (renaming configs would mess up hyperloop)
147158
Configurable<float> maxMeanITSClusterSize{"maxMeanITSClusterSize", 16, "max <ITS cluster size> x cos(lambda)"};
@@ -248,6 +259,8 @@ struct skimmerPrimaryElectronFromDalitzEE {
248259
return;
249260
}
250261

262+
o2::base::Propagator::initFieldFromGRP(&bc.grpMagField());
263+
251264
auto run3grpTimestamp = bc.timestamp();
252265

253266
dBz = bc.grpMagField().getNominalL3Field();
@@ -538,7 +551,8 @@ struct skimmerPrimaryElectronFromDalitzEE {
538551
fRegistry.fill(HIST("Pair/") + HIST(DileptonSigns[pairtype]) + HIST("hMvsPt"), v12.M(), v12.Pt());
539552
fRegistry.fill(HIST("Pair/") + HIST(DileptonSigns[pairtype]) + HIST("hMvsPhiV"), phiv, v12.M());
540553

541-
if (v12.M() > maxMee) { // don't store
554+
// to do: test if minMee > Mpion show effect on S/B
555+
if (v12.M() < minMee || v12.M() > maxMee) { // don't store //|| v12.M() > maxMee
542556
continue;
543557
}
544558

@@ -713,32 +727,88 @@ struct skimmerPrimaryElectronFromDalitzEE {
713727
continue;
714728
}
715729

730+
auto varFillingMode = static_cast<enumFillingMode>(fillingMode.value);
731+
716732
const auto& v0photons_per_coll = v0photons.sliceBy(perCol_pcm, collision.globalIndex());
717733
const auto& posTracks_per_coll = posTracks->sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), cache);
718734
const auto& negTracks_per_coll = negTracks->sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), cache);
719735
const auto& slicedTracks = tracks.sliceBy(perTracksCollision, collision.globalIndex());
720736
acceptedPosTrackIds_per_collision.reserve(posTracks_per_coll.size());
721737
acceptedNegTrackIds_per_collision.reserve(negTracks_per_coll.size());
722738

723-
if (!fillWithPairs) {
724-
fillTrackInfo<false>(collision, slicedTracks);
725-
} else {
726-
fillPairInfo<false, 0>(collision, posTracks_per_coll, negTracks_per_coll); // ULS
727-
if (fillLS) {
728-
fillPairInfo<false, 1>(collision, posTracks_per_coll, posTracks_per_coll); // LS++
729-
fillPairInfo<false, 2>(collision, negTracks_per_coll, negTracks_per_coll); // LS--
730-
}
731-
732-
if ((v0photons_per_coll.size() >= 1 && !acceptedPosTrackIds_per_collision.empty() && !acceptedNegTrackIds_per_collision.empty()) || (acceptedPosTrackIds_per_collision.size() >= 2 && acceptedNegTrackIds_per_collision.size() >= 2)) {
733-
for (const auto& posId : acceptedPosTrackIds_per_collision) {
734-
const auto& pos = tracks.rawIteratorAt(posId);
735-
fillTrackTable<false>(collision, pos);
739+
auto iterEp = tracks.begin();
740+
auto iterEm = tracks.begin();
741+
auto iterTrack = tracks.begin();
742+
auto iterPhoton = v0photons.begin();
743+
744+
switch (varFillingMode) {
745+
case enumFillingMode::SingleTrack:
746+
fillTrackInfo<false>(collision, slicedTracks);
747+
break;
748+
case enumFillingMode::EpEmPairs:
749+
fillPairInfo<false, 0>(collision, posTracks_per_coll, negTracks_per_coll); // ULS
750+
if (fillLS) {
751+
fillPairInfo<false, 1>(collision, posTracks_per_coll, posTracks_per_coll); // LS++
752+
fillPairInfo<false, 2>(collision, negTracks_per_coll, negTracks_per_coll); // LS--
753+
}
754+
if ((!acceptedPosTrackIds_per_collision.empty() && !acceptedNegTrackIds_per_collision.empty())) {
755+
for (const auto& posId : acceptedPosTrackIds_per_collision) {
756+
iterEp.setCursor(posId);
757+
fillTrackTable<false>(collision, iterEp);
758+
}
759+
for (const auto& eleId : acceptedNegTrackIds_per_collision) {
760+
iterEm.setCursor(eleId);
761+
fillTrackTable<false>(collision, iterEm);
762+
}
736763
}
737-
for (const auto& eleId : acceptedNegTrackIds_per_collision) {
738-
const auto& ele = tracks.rawIteratorAt(eleId);
739-
fillTrackTable<false>(collision, ele);
764+
break;
765+
case enumFillingMode::EpEmPairsAndPhoton:
766+
std::set<int64_t> tracksToFill;
767+
768+
fillPairInfo<false, 0>(collision, posTracks_per_coll, negTracks_per_coll); // ULS
769+
if (fillLS) {
770+
fillPairInfo<false, 1>(collision, posTracks_per_coll, posTracks_per_coll); // LS++
771+
fillPairInfo<false, 2>(collision, negTracks_per_coll, negTracks_per_coll); // LS--
740772
}
741-
}
773+
if (v0photons_per_coll.size() >= 1 && ((!acceptedPosTrackIds_per_collision.empty() && !acceptedNegTrackIds_per_collision.empty()))) {
774+
if (!fillWithEtaMassCut) {
775+
for (const auto& posId : acceptedPosTrackIds_per_collision) {
776+
iterEp.setCursor(posId);
777+
fillTrackTable<false>(collision, iterEp);
778+
}
779+
for (const auto& eleId : acceptedNegTrackIds_per_collision) {
780+
iterEm.setCursor(eleId);
781+
fillTrackTable<false>(collision, iterEm);
782+
}
783+
} else {
784+
for (const auto& posId : acceptedPosTrackIds_per_collision) {
785+
iterEp.setCursor(posId);
786+
ROOT::Math::PtEtaPhiMVector vEp(iterEp.pt(), iterEp.eta(), iterEp.phi(), o2::constants::physics::MassElectron);
787+
for (const auto& eleId : acceptedNegTrackIds_per_collision) {
788+
iterEm.setCursor(eleId);
789+
ROOT::Math::PtEtaPhiMVector vEm(iterEm.pt(), iterEm.eta(), iterEm.phi(), o2::constants::physics::MassElectron);
790+
for (const auto& photonId : v0photons_per_coll) {
791+
iterPhoton.setCursor(photonId.globalIndex());
792+
ROOT::Math::PtEtaPhiMVector vPhoton(iterPhoton.pt(), iterPhoton.eta(), iterPhoton.phi(), o2::constants::physics::MassPhoton);
793+
ROOT::Math::PtEtaPhiMVector vTotal = vEp + vEm + vPhoton;
794+
795+
if (vTotal.M() < minMeegamma || vTotal.M() > maxMeegamma) { // don't store
796+
continue;
797+
}
798+
tracksToFill.insert(posId); // store independently
799+
tracksToFill.insert(eleId);
800+
}
801+
}
802+
}
803+
}
804+
}
805+
if (fillWithEtaMassCut) {
806+
for (const auto& trackId : tracksToFill) {
807+
iterTrack.setCursor(trackId);
808+
fillTrackTable<false>(collision, iterTrack);
809+
}
810+
}
811+
break;
742812
}
743813

744814
acceptedPosTrackIds_per_collision.clear();
@@ -808,7 +878,7 @@ struct skimmerPrimaryElectronFromDalitzEE {
808878
Partition<MyTracksMC> posTracksMC = o2::aod::track::signed1Pt > 0.f;
809879
Partition<MyTracksMC> negTracksMC = o2::aod::track::signed1Pt < 0.f;
810880
// ---------- for MC ----------
811-
void processMC(MyCollisionsMC const& collisions, aod::McCollisions const&, MyBCs const& bcs, MyTracksMC const& tracks, aod::V0PhotonsKF const& v0photons, aod::TrackAssoc const& trackIndices)
881+
void processMC(MyCollisionsMC const& collisions, aod::McCollisions const&, MyBCs const& bcs, MyTracksMC const& tracks, aod::V0PhotonsKF const& v0photons, aod::TrackAssoc const& trackIndices, aod::McParticles const&)
812882
{
813883
uint64_t nCollisSel = 0;
814884
uint64_t nNoMcColl = 0;
@@ -836,6 +906,8 @@ struct skimmerPrimaryElectronFromDalitzEE {
836906
}
837907
nProcessedCollisions++;
838908

909+
auto varFillingMode = static_cast<enumFillingMode>(fillingMode.value);
910+
839911
const auto& v0photons_per_coll = v0photons.sliceBy(perCol_pcm, collision.globalIndex());
840912
const auto& posTracks_per_coll = posTracksMC->sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), cache);
841913
const auto& negTracks_per_coll = negTracksMC->sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), cache);
@@ -844,25 +916,80 @@ struct skimmerPrimaryElectronFromDalitzEE {
844916
acceptedNegTrackIds_per_collision.reserve(negTracks_per_coll.size());
845917
acceptedTrackIds_per_collision.reserve(2 * (negTracks_per_coll.size()));
846918

847-
if (!fillWithPairs) {
848-
fillTrackInfo<true>(collision, slicedTracks);
849-
} else {
850-
fillPairInfo<true, 0>(collision, posTracks_per_coll, negTracks_per_coll); // ULS
851-
if (fillLS) {
852-
fillPairInfo<true, 1>(collision, posTracks_per_coll, posTracks_per_coll); // LS++
853-
fillPairInfo<true, 2>(collision, negTracks_per_coll, negTracks_per_coll); // LS--
854-
}
855-
if ((acceptedPosTrackIds_per_collision.empty() && acceptedNegTrackIds_per_collision.empty()) || (acceptedPosTrackIds_per_collision.size() >= 2 && acceptedNegTrackIds_per_collision.size() >= 2)) { // v0photons_per_coll.size() >= 1 &&
856-
for (const auto& posId : acceptedPosTrackIds_per_collision) {
857-
const auto& pos = tracks.rawIteratorAt(posId);
858-
fillTrackTable<true>(collision, pos);
919+
auto iterEp = tracks.begin();
920+
auto iterEm = tracks.begin();
921+
auto iterTrack = tracks.begin();
922+
auto iterPhoton = v0photons.begin();
923+
924+
switch (varFillingMode) {
925+
case enumFillingMode::SingleTrack:
926+
fillTrackInfo<true>(collision, slicedTracks);
927+
break;
928+
case enumFillingMode::EpEmPairs:
929+
fillPairInfo<true, 0>(collision, posTracks_per_coll, negTracks_per_coll); // ULS
930+
if (fillLS) {
931+
fillPairInfo<true, 1>(collision, posTracks_per_coll, posTracks_per_coll); // LS++
932+
fillPairInfo<true, 2>(collision, negTracks_per_coll, negTracks_per_coll); // LS--
859933
}
860-
for (const auto& eleId : acceptedNegTrackIds_per_collision) {
861-
const auto& ele = tracks.rawIteratorAt(eleId);
862-
fillTrackTable<true>(collision, ele);
934+
if ((!acceptedPosTrackIds_per_collision.empty() && !acceptedNegTrackIds_per_collision.empty())) {
935+
for (const auto& posId : acceptedPosTrackIds_per_collision) {
936+
iterEp.setCursor(posId);
937+
fillTrackTable<true>(collision, iterEp);
938+
}
939+
for (const auto& eleId : acceptedNegTrackIds_per_collision) {
940+
iterEm.setCursor(eleId);
941+
fillTrackTable<true>(collision, iterEm);
942+
}
863943
}
864-
}
865-
} // end of fill loop
944+
break;
945+
case enumFillingMode::EpEmPairsAndPhoton:
946+
std::set<int64_t> tracksToFill;
947+
948+
fillPairInfo<true, 0>(collision, posTracks_per_coll, negTracks_per_coll); // ULS
949+
if (fillLS) {
950+
fillPairInfo<true, 1>(collision, posTracks_per_coll, posTracks_per_coll); // LS++
951+
fillPairInfo<true, 2>(collision, negTracks_per_coll, negTracks_per_coll); // LS--
952+
}
953+
if (v0photons_per_coll.size() >= 1 && ((!acceptedPosTrackIds_per_collision.empty() && !acceptedNegTrackIds_per_collision.empty()))) {
954+
if (!fillWithEtaMassCut) {
955+
for (const auto& posId : acceptedPosTrackIds_per_collision) {
956+
iterEp.setCursor(posId);
957+
fillTrackTable<true>(collision, iterEp);
958+
}
959+
for (const auto& eleId : acceptedNegTrackIds_per_collision) {
960+
iterEm.setCursor(eleId);
961+
fillTrackTable<true>(collision, iterEm);
962+
}
963+
} else {
964+
for (const auto& posId : acceptedPosTrackIds_per_collision) {
965+
iterEp.setCursor(posId);
966+
ROOT::Math::PtEtaPhiMVector vEp(iterEp.pt(), iterEp.eta(), iterEp.phi(), o2::constants::physics::MassElectron);
967+
for (const auto& eleId : acceptedNegTrackIds_per_collision) {
968+
iterEm.setCursor(eleId);
969+
ROOT::Math::PtEtaPhiMVector vEm(iterEm.pt(), iterEm.eta(), iterEm.phi(), o2::constants::physics::MassElectron);
970+
for (const auto& photonId : v0photons_per_coll) {
971+
iterPhoton.setCursor(photonId.globalIndex());
972+
ROOT::Math::PtEtaPhiMVector vPhoton(iterPhoton.pt(), iterPhoton.eta(), iterPhoton.phi(), o2::constants::physics::MassPhoton);
973+
ROOT::Math::PtEtaPhiMVector vTotal = vEp + vEm + vPhoton;
974+
975+
if (vTotal.M() < minMeegamma || vTotal.M() > maxMeegamma) { // don't store
976+
continue;
977+
}
978+
tracksToFill.insert(posId); // store independently
979+
tracksToFill.insert(eleId);
980+
}
981+
}
982+
}
983+
}
984+
}
985+
if (fillWithEtaMassCut) {
986+
for (const auto& trackId : tracksToFill) {
987+
iterTrack.setCursor(trackId);
988+
fillTrackTable<true>(collision, iterTrack);
989+
}
990+
}
991+
break;
992+
}
866993

867994
acceptedPosTrackIds_per_collision.clear();
868995
acceptedNegTrackIds_per_collision.clear();
@@ -878,10 +1005,6 @@ struct skimmerPrimaryElectronFromDalitzEE {
8781005
PROCESS_SWITCH(skimmerPrimaryElectronFromDalitzEE, processMC, "process reconstructed and MC info ", true);
8791006
};
8801007

881-
// WorkflowSpec defineDataProcessing(ConfigContext const& context)
882-
// {
883-
// return WorkflowSpec{adaptAnalysisTask<skimmerPrimaryElectronFromDalitzEE>(context, TaskName{"skimmer-primary-electron-from-dalitzee"})};
884-
// }
8851008
WorkflowSpec defineDataProcessing(ConfigContext const& context)
8861009
{
8871010
o2::pid::tof::TOFResponseImpl::metadataInfo.initMetadata(context);

0 commit comments

Comments
 (0)