1515// /
1616// / \author Bong-Hwi Lim <bong-hwi.lim@cern.ch>, Sawan Sawan <sawan.sawan@cern.ch>
1717
18- #include < TLorentzVector.h >
19- #include " TF1 .h"
20- #include " TRandom3 .h"
18+ #include " PWGLF/DataModel/LFResonanceTables.h "
19+ #include " PWGLF/DataModel/mcCentrality .h"
20+ #include " PWGLF/Utils/inelGt .h"
2121
22- #include " Common/DataModel/PIDResponse.h"
2322#include " Common/DataModel/Centrality.h"
2423#include " Common/DataModel/EventSelection.h"
25- #include " Framework/AnalysisTask.h"
24+ #include " Common/DataModel/PIDResponse.h"
25+
26+ #include " CommonConstants/PhysicsConstants.h"
27+ #include " DataFormatsParameters/GRPObject.h"
2628#include " Framework/ASoAHelpers.h"
29+ #include " Framework/AnalysisTask.h"
2730#include " Framework/runDataProcessing.h"
28- #include " PWGLF/DataModel/LFResonanceTables.h"
29- #include " DataFormatsParameters/GRPObject.h"
30- #include " CommonConstants/PhysicsConstants.h"
31+
32+ #include " TF1.h"
33+ #include " TRandom3.h"
34+ #include < TLorentzVector.h>
3135
3236using namespace o2 ;
3337using namespace o2 ::framework;
@@ -59,6 +63,9 @@ struct K892analysis {
5963 Configurable<bool > invmass1D{" invmass1D" , false , " Invariant mass 1D" };
6064 Configurable<bool > studyAntiparticle{" studyAntiparticle" , false , " Study anti-particles separately" };
6165 Configurable<bool > fillPidPlots{" fillPidPlots" , false , " Make TPC and TOF PID plots" };
66+ Configurable<bool > cisInelGt0{" cisInelGt0" , true , " check if INEL>0" };
67+ Configurable<bool > cMCCent{" cMCCent" , true , " Using calibrated MC centrality (for FT0M)" };
68+
6269 // Configurable<bool> applyOccupancyCut{"applyOccupancyCut", false, "Apply occupancy cut"};
6370 // Configurable<int> occupancyCut{"occupancyCut", 1000, "Mimimum Occupancy cut"};
6471
@@ -426,11 +433,11 @@ struct K892analysis {
426433 return false ;
427434 }
428435
429- template <bool IsMC, bool IsMix, typename CollisionType, typename TracksType>
430- void fillHistograms (const CollisionType& collision, const TracksType& dTracks1, const TracksType& dTracks2)
436+ template <bool IsMC, bool IsMix, typename CollisionType, typename TracksType, typename Multdatamc >
437+ void fillHistograms (const CollisionType& collision, const TracksType& dTracks1, const TracksType& dTracks2, const Multdatamc& multiplicity )
431438 {
432439 // auto multNTracksPV = collision.multNTracksPV();
433- auto multiplicity = collision.cent ();
440+ // auto multiplicity = collision.cent();
434441 if (additionalEvsel && !eventSelected (collision, multiplicity)) {
435442 return ;
436443 }
@@ -703,28 +710,105 @@ struct K892analysis {
703710 }
704711 }
705712
706- void processDataLight (aod::ResoCollision const & collision,
707- aod::ResoTracks const & resotracks)
713+ void processDataLight (aod::ResoCollision const & resocollisions, aod::ResoCollisionColls const & collisionIndex, soa::Join<aod::Collisions, aod::PVMults> const & collisions, aod::ResoTracks const & resotracks)
708714 {
709715 // LOG(info) << "new collision, zvtx: " << collision.posZ();
716+ if (cisInelGt0) {
717+ auto linkRow = collisionIndex.iteratorAt (resocollisions.globalIndex ());
718+ auto collId = linkRow.collisionId (); // Take original collision global index matched with resoCollision
719+
720+ auto coll = collisions.iteratorAt (collId); // Take original collision matched with resoCollision
721+
722+ if (!coll.isInelGt0 ()) // Check reco INELgt0 (at least one PV track in |eta| < 1) about the collision
723+ return ;
724+ }
710725 if (additionalQAeventPlots)
711726 histos.fill (HIST (" QAevent/hEvtCounterSameE" ), 1.0 );
712- fillHistograms<false , false >(collision, resotracks, resotracks);
727+ auto multiplicity = resocollisions.cent ();
728+ fillHistograms<false , false >(resocollisions, resotracks, resotracks, multiplicity);
713729 }
714730 PROCESS_SWITCH (K892analysis, processDataLight, " Process Event for data" , false );
715731
716- void processMCLight (ResoMCCols::iterator const & collision,
717- soa::Join<aod::ResoTracks, aod::ResoMCTracks> const & resotracks)
732+ void processMCLight (ResoMCCols::iterator const & resoCollision,
733+ aod::ResoCollisionColls const & collisionIndex,
734+ soa::Join<aod::ResoCollisionCandidatesMC, aod::PVMults> const & collisionsMC,
735+ soa::Join<aod::ResoTracks, aod::ResoMCTracks> const & resoTracks,
736+ soa::Join<aod::McCollisions, aod::McCentFT0Ms> const &)
718737 {
719- if (!collision.isInAfterAllCuts () || (std::abs (collision.posZ ()) > cZvertCutMC)) // MC event selection, all cuts missing vtx cut
738+ float multiplicity;
739+ if (cMCCent && cisInelGt0) {
740+ auto linkRow = collisionIndex.iteratorAt (resoCollision.globalIndex ());
741+ auto collId = linkRow.collisionId (); // Take original collision global index matched with resoCollision
742+
743+ auto coll = collisionsMC.iteratorAt (collId); // Take original collision matched with resoCollision
744+
745+ if (!coll.isInelGt0 ()) // Check reco INELgt0 (at least one PV track in |eta| < 1) about the collision
746+ return ;
747+
748+ auto mcColl = coll.mcCollision_as <soa::Join<aod::McCollisions, aod::McCentFT0Ms>>();
749+ multiplicity = mcColl.centFT0M ();
750+ } else if (!cMCCent && cisInelGt0) {
751+ auto linkRow = collisionIndex.iteratorAt (resoCollision.globalIndex ());
752+ auto collId = linkRow.collisionId (); // Take original collision global index matched with resoCollision
753+
754+ auto coll = collisionsMC.iteratorAt (collId); // Take original collision matched with resoCollision
755+
756+ if (!coll.isInelGt0 ()) // Check reco INELgt0 (at least one PV track in |eta| < 1) about the collision
757+ return ;
758+
759+ multiplicity = resoCollision.cent ();
760+ } else if (cMCCent && !cisInelGt0) {
761+ auto linkRow = collisionIndex.iteratorAt (resoCollision.globalIndex ());
762+ auto collId = linkRow.collisionId (); // Take original collision global index matched with resoCollision
763+
764+ auto coll = collisionsMC.iteratorAt (collId); // Take original collision matched with resoCollision
765+
766+ auto mcColl = coll.mcCollision_as <soa::Join<aod::McCollisions, aod::McCentFT0Ms>>();
767+ multiplicity = mcColl.centFT0M ();
768+ } else {
769+ multiplicity = resoCollision.cent ();
770+ }
771+ if (!resoCollision.isInAfterAllCuts () || (std::abs (resoCollision.posZ ()) > cZvertCutMC)) // MC event selection, all cuts missing vtx cut
720772 return ;
721- fillHistograms<true , false >(collision, resotracks, resotracks );
773+ fillHistograms<true , false >(resoCollision, resoTracks, resoTracks, multiplicity );
722774 }
723775 PROCESS_SWITCH (K892analysis, processMCLight, " Process Event for MC (Reconstructed)" , false );
724776
725- void processMCTrue (ResoMCCols::iterator const & collision , aod::ResoMCParents const & resoParents)
777+ void processMCTrue (ResoMCCols::iterator const & resoCollision , aod::ResoCollisionColls const & collisionIndex, aod:: ResoMCParents const & resoParents, aod::ResoCollisionCandidatesMC const & collisionsMC, soa::Join<aod::McCollisions, aod::McCentFT0Ms> const & )
726778 {
727- auto multiplicity = collision.cent ();
779+ float multiplicity;
780+ if (cMCCent && cisInelGt0) {
781+ auto linkRow = collisionIndex.iteratorAt (resoCollision.globalIndex ());
782+ auto collId = linkRow.collisionId (); // Take original collision global index matched with resoCollision
783+
784+ auto coll = collisionsMC.iteratorAt (collId); // Take original collision matched with resoCollision
785+
786+ if (!coll.isInelGt0 ()) // Check reco INELgt0 (at least one PV track in |eta| < 1) about the collision
787+ return ;
788+
789+ auto mcColl = coll.mcCollision_as <soa::Join<aod::McCollisions, aod::McCentFT0Ms>>();
790+ multiplicity = mcColl.centFT0M ();
791+ } else if (!cMCCent && cisInelGt0) {
792+ auto linkRow = collisionIndex.iteratorAt (resoCollision.globalIndex ());
793+ auto collId = linkRow.collisionId (); // Take original collision global index matched with resoCollision
794+
795+ auto coll = collisionsMC.iteratorAt (collId); // Take original collision matched with resoCollision
796+
797+ if (!coll.isInelGt0 ()) // Check reco INELgt0 (at least one PV track in |eta| < 1) about the collision
798+ return ;
799+
800+ multiplicity = resoCollision.cent ();
801+ } else if (cMCCent && !cisInelGt0) {
802+ auto linkRow = collisionIndex.iteratorAt (resoCollision.globalIndex ());
803+ auto collId = linkRow.collisionId (); // Take original collision global index matched with resoCollision
804+
805+ auto coll = collisionsMC.iteratorAt (collId); // Take original collision matched with resoCollision
806+
807+ auto mcColl = coll.mcCollision_as <soa::Join<aod::McCollisions, aod::McCentFT0Ms>>();
808+ multiplicity = mcColl.centFT0M ();
809+ } else {
810+ multiplicity = resoCollision.cent ();
811+ }
728812 for (const auto & part : resoParents) { // loop over all pre-filtered MC particles
729813 if (std::abs (part.pdgCode ()) != 313 || std::abs (part.y ()) >= 0.5 )
730814 continue ;
@@ -734,28 +818,28 @@ struct K892analysis {
734818 if (!pass1 || !pass2)
735819 continue ;
736820
737- if (collision .isVtxIn10 ()) // INEL10
821+ if (resoCollision .isVtxIn10 ()) // INEL10
738822 {
739823 if (part.pdgCode () > 0 )
740824 histos.fill (HIST (" k892Gen" ), 0 , part.pt (), multiplicity);
741825 else
742826 histos.fill (HIST (" k892GenAnti" ), 0 , part.pt (), multiplicity);
743827 }
744- if (collision .isVtxIn10 () && collision .isInSel8 ()) // INEL>10, vtx10
828+ if (resoCollision .isVtxIn10 () && resoCollision .isInSel8 ()) // INEL>10, vtx10
745829 {
746830 if (part.pdgCode () > 0 )
747831 histos.fill (HIST (" k892Gen" ), 1 , part.pt (), multiplicity);
748832 else
749833 histos.fill (HIST (" k892GenAnti" ), 1 , part.pt (), multiplicity);
750834 }
751- if (collision .isVtxIn10 () && collision .isTriggerTVX ()) // vtx10, TriggerTVX
835+ if (resoCollision .isVtxIn10 () && resoCollision .isTriggerTVX ()) // vtx10, TriggerTVX
752836 {
753837 if (part.pdgCode () > 0 )
754838 histos.fill (HIST (" k892Gen" ), 2 , part.pt (), multiplicity);
755839 else
756840 histos.fill (HIST (" k892GenAnti" ), 2 , part.pt (), multiplicity);
757841 }
758- if (collision .isInAfterAllCuts ()) // after all event selection
842+ if (resoCollision .isInAfterAllCuts ()) // after all event selection
759843 {
760844 if (part.pdgCode () > 0 )
761845 histos.fill (HIST (" k892Gen" ), 3 , part.pt (), multiplicity);
@@ -775,9 +859,10 @@ struct K892analysis {
775859 SameKindPair<aod::ResoCollisions, aod::ResoTracks, BinningTypeVtxZT0M> pairs{colBinning, nEvtMixing, -1 , collisions, tracksTuple, &cache}; // -1 is the number of the bin to skip
776860
777861 for (const auto & [collision1, tracks1, collision2, tracks2] : pairs) {
862+ auto multiplicity = collision1.cent ();
778863 if (additionalQAeventPlots)
779864 histos.fill (HIST (" QAevent/hEvtCounterMixedE" ), 1.0 );
780- fillHistograms<false , true >(collision1, tracks1, tracks2);
865+ fillHistograms<false , true >(collision1, tracks1, tracks2, multiplicity );
781866 }
782867 };
783868 PROCESS_SWITCH (K892analysis, processMELight, " Process EventMixing light without partition" , false );
0 commit comments