4444#include " Framework/HistogramRegistry.h"
4545#include " Framework/StepTHn.h"
4646#include " Framework/runDataProcessing.h"
47+ #include " Framework/O2DatabasePDGPlugin.h"
4748#include " ReconstructionDataFormats/Track.h"
4849
4950#include < TComplex.h>
5051#include < TH1F.h>
5152#include < TMath.h>
53+ #include < TPDGCode.h>
5254
5355#include < chrono>
5456#include < cstdio>
@@ -91,6 +93,7 @@ enum KindOfCorrType {
9193static constexpr std::string_view kCorrType [] = {" Ft0aGlobal/" , " Ft0cGlobal/" , " MftGlobal/" , " Ft0aMft/" , " Ft0aFt0c/" };
9294static constexpr std::string_view kEvntType [] = {" SE/" , " ME/" };
9395auto static constexpr kMinFt0cCell = 96 ;
96+ auto static constexpr kMinCharge = 3 .f;
9497AxisSpec axisEvent{10 , 0.5 , 9.5 , " #Event" , " EventAxis" };
9598
9699namespace o2 ::aod
@@ -113,7 +116,9 @@ struct LongrangeCorrelation {
113116
114117 SliceCache cache;
115118 Service<o2::ccdb::BasicCCDBManager> ccdb;
119+ Service<o2::framework::O2DatabasePDG> pdg;
116120 o2::ccdb::CcdbApi ccdbApi;
121+ o2::ft0::Geometry ft0Det;
117122 std::vector<o2::detectors::AlignParam>* offsetFT0;
118123 HistogramRegistry histos{" histos" , {}, OutputObjHandlingPolicy::AnalysisObject};
119124 Configurable<float > cfgVtxCut{" cfgVtxCut" , 10 .0f , " Vertex Z range to consider" };
@@ -153,9 +158,11 @@ struct LongrangeCorrelation {
153158 using CollTable = soa::Join<aod::Collisions, aod::EvSels, aod::LRMultTables>;
154159 using TrksTable = soa::Filtered<soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksDCA, aod::TrackSelection>>;
155160 using MftTrkTable = soa::Filtered<aod::MFTTracks>;
161+ using CollTableMC = soa::SmallGroups<soa::Join<aod::McCollisionLabels, aod::Collisions, aod::EvSels, aod::LRMultTables>>;
162+ using TrksTableMC = soa::Filtered<soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksDCA, aod::McTrackLabels, aod::TrackSelection>>;
156163 Preslice<TrksTable> perColGlobal = aod::track::collisionId;
164+ Preslice<TrksTableMC> perColMC = aod::track::collisionId;
157165 Preslice<MftTrkTable> perColMft = aod::fwdtrack::collisionId;
158- o2::ft0::Geometry ft0Det;
159166
160167 OutputObj<CorrelationContainer> sameFt0aGlobal{Form (" sameEventFt0aGlobal_%i_%i" , static_cast <int >(cfgMinMult), static_cast <int >(cfgMaxMult))};
161168 OutputObj<CorrelationContainer> mixedFt0aGlobal{Form (" mixedEventFt0aGlobal_%i_%i" , static_cast <int >(cfgMinMult), static_cast <int >(cfgMaxMult))};
@@ -256,6 +263,13 @@ struct LongrangeCorrelation {
256263 sameFt0aFt0c.setObject (new CorrelationContainer (Form (" sameEventFt0aFt0c_%i_%i" , static_cast <int >(cfgMinMult), static_cast <int >(cfgMaxMult)), Form (" sameEventFt0aFt0c_%i_%i" , static_cast <int >(cfgMinMult), static_cast <int >(cfgMaxMult)), corrAxis, effAxis, userAxis));
257264 mixedFt0aFt0c.setObject (new CorrelationContainer (Form (" mixedEventFt0aFt0c_%i_%i" , static_cast <int >(cfgMinMult), static_cast <int >(cfgMaxMult)), Form (" mixedEventFt0aFt0c_%i_%i" , static_cast <int >(cfgMinMult), static_cast <int >(cfgMaxMult)), corrAxis, effAxis, userAxis));
258265 }
266+
267+ if (doprocessEff) {
268+ histos.add (" hmcgendndptPrimary" , " hmcgendndptPrimary" , kTHnSparseD , {axisEtaTrig, axisPtTrigger, axisMultiplicity, axisVtxZ}, false );
269+ histos.add (" hmcrecdndptRecoPrimary" , " hmcrecdndptRecoPrimary" , kTHnSparseD , {axisEtaTrig, axisPtTrigger, axisMultiplicity, axisVtxZ}, false );
270+ histos.add (" hmcrecdndptRecoAll" , " hmcrecdndptRecoAll" , kTHnSparseD , {axisEtaTrig, axisPtTrigger, axisMultiplicity, axisVtxZ}, false );
271+ histos.add (" hmcrecdndptFake" , " hmcrecdndptFake" , kTHnSparseD , {axisEtaTrig, axisPtTrigger, axisMultiplicity, axisVtxZ}, false );
272+ }
259273 }
260274
261275 Filter fTrackSelectionITS = ncheckbit(aod::track::v001::detectorMap, (uint8_t )o2::aod::track::ITS) &&
@@ -800,6 +814,74 @@ struct LongrangeCorrelation {
800814 }
801815 } // mixed event
802816
817+ template <typename CheckGenTrack>
818+ bool isGenTrackSelected (CheckGenTrack const & track)
819+ {
820+ if (!track.isPhysicalPrimary ()) {
821+ return false ;
822+ }
823+ if (!track.producedByGenerator ()) {
824+ return false ;
825+ }
826+ auto pdgTrack = pdg->GetParticle (track.pdgCode ());
827+ if (pdgTrack == nullptr ) {
828+ return false ;
829+ }
830+ if (std::abs (pdgTrack->Charge ()) < kMinCharge ) {
831+ return false ;
832+ }
833+ if (std::abs (track.eta ()) >= cfgEtaCut) {
834+ return false ;
835+ }
836+ return true ;
837+ }
838+
839+ void processEff (aod::McCollisions::iterator const & mcCollision, CollTableMC const & RecCols, aod::McParticles const & GenParticles, TrksTableMC const & RecTracks)
840+ {
841+ if (std::abs (mcCollision.posZ ()) >= cfgVtxCut) {
842+ return ;
843+ }
844+
845+ auto multiplicity = -999 .;
846+ auto numcontributors = -999 ;
847+ for (const auto & RecCol : RecCols) {
848+ if (!isEventSelected (RecCol)) {
849+ continue ;
850+ }
851+ if (RecCol.numContrib () <= numcontributors) {
852+ continue ;
853+ } else {
854+ numcontributors = RecCol.numContrib ();
855+ }
856+ multiplicity = RecCol.multiplicity ();
857+ }
858+
859+ for (const auto & particle : GenParticles) {
860+ if (!isGenTrackSelected (particle)) {
861+ continue ;
862+ }
863+ histos.fill (HIST (" hmcgendndptPrimary" ), particle.eta (), particle.pt (), multiplicity, mcCollision.posZ ());
864+ } // track (mcgen) loop
865+
866+ for (const auto & RecCol : RecCols) {
867+ if (!isEventSelected (RecCol)) {
868+ continue ;
869+ }
870+ auto recTracksPart = RecTracks.sliceBy (perColMC, RecCol.globalIndex ());
871+ for (const auto & Rectrack : recTracksPart) {
872+ if (Rectrack.has_mcParticle ()) {
873+ auto mcpart = Rectrack.mcParticle ();
874+ histos.fill (HIST (" hmcrecdndptRecoAll" ), mcpart.eta (), mcpart.pt (), multiplicity, mcCollision.posZ ());
875+ if (mcpart.isPhysicalPrimary ()) {
876+ histos.fill (HIST (" hmcrecdndptRecoPrimary" ), mcpart.eta (), mcpart.pt (), multiplicity, mcCollision.posZ ());
877+ }
878+ } else {
879+ histos.fill (HIST (" hmcrecdndptFake" ), Rectrack.eta (), Rectrack.pt (), multiplicity, mcCollision.posZ ());
880+ }
881+ } // track (mcrec) loop
882+ } // rec collision
883+ }
884+
803885 PROCESS_SWITCH (LongrangeCorrelation, processEventStat, " event stat" , false );
804886 PROCESS_SWITCH (LongrangeCorrelation, processFt0aGlobalSE, " same event FT0a vs global" , false );
805887 PROCESS_SWITCH (LongrangeCorrelation, processFt0aGlobalME, " mixed event FT0a vs global" , false );
@@ -811,6 +893,7 @@ struct LongrangeCorrelation {
811893 PROCESS_SWITCH (LongrangeCorrelation, processFt0aMftME, " mixed event FT0a vs MFT" , false );
812894 PROCESS_SWITCH (LongrangeCorrelation, processFt0aFt0cSE, " same event FT0a vs FT0c" , false );
813895 PROCESS_SWITCH (LongrangeCorrelation, processFt0aFt0cME, " mixed event FT0a vs FT0c" , false );
896+ PROCESS_SWITCH (LongrangeCorrelation, processEff, " Estimate efficiency" , false );
814897};
815898
816899struct MultiplicityClassifier {
0 commit comments