Skip to content

Commit bc28880

Browse files
authored
Add efficiency estimation
1 parent 01dc968 commit bc28880

File tree

1 file changed

+84
-1
lines changed

1 file changed

+84
-1
lines changed

PWGCF/TwoParticleCorrelations/Tasks/longrangeCorrelation.cxx

Lines changed: 84 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,13 @@
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 {
9193
static constexpr std::string_view kCorrType[] = {"Ft0aGlobal/", "Ft0cGlobal/", "MftGlobal/", "Ft0aMft/", "Ft0aFt0c/"};
9294
static constexpr std::string_view kEvntType[] = {"SE/", "ME/"};
9395
auto static constexpr kMinFt0cCell = 96;
96+
auto static constexpr kMinCharge = 3.f;
9497
AxisSpec axisEvent{10, 0.5, 9.5, "#Event", "EventAxis"};
9598

9699
namespace 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

816899
struct MultiplicityClassifier {

0 commit comments

Comments
 (0)