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- // }
8851008WorkflowSpec defineDataProcessing (ConfigContext const & context)
8861009{
8871010 o2::pid::tof::TOFResponseImpl::metadataInfo.initMetadata (context);
0 commit comments