Skip to content

Commit da19337

Browse files
authored
[PWGLF,PWGMM] Add midrapidity tracks for weak decay correction (#18541)
1 parent efd7340 commit da19337

1 file changed

Lines changed: 90 additions & 5 deletions

File tree

‎PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx‎

Lines changed: 90 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "Common/DataModel/EventSelection.h"
2727
#include "Common/DataModel/McCollisionExtra.h"
2828
#include "Common/DataModel/Multiplicity.h"
29+
#include "Common/DataModel/TrackSelectionTables.h"
2930

3031
#include <CCDB/BasicCCDBManager.h>
3132
#include <CommonConstants/MathConstants.h>
@@ -36,6 +37,7 @@
3637
#include <Framework/AnalysisHelpers.h>
3738
#include <Framework/AnalysisTask.h>
3839
#include <Framework/Configurable.h>
40+
#include <Framework/DataTypes.h>
3941
#include <Framework/HistogramRegistry.h>
4042
#include <Framework/HistogramSpec.h>
4143
#include <Framework/InitContext.h>
@@ -246,6 +248,18 @@ struct MultE {
246248
static constexpr int CmultMFT = 4;
247249
};
248250

251+
static constexpr TrackSelectionFlags::flagtype TrackSelectionITS =
252+
TrackSelectionFlags::kITSNCls | TrackSelectionFlags::kITSChi2NDF |
253+
TrackSelectionFlags::kITSHits;
254+
static constexpr TrackSelectionFlags::flagtype TrackSelectionTPC =
255+
TrackSelectionFlags::kTPCNCls |
256+
TrackSelectionFlags::kTPCCrossedRowsOverNCls |
257+
TrackSelectionFlags::kTPCChi2NDF;
258+
static constexpr TrackSelectionFlags::flagtype TrackSelectionDCA =
259+
TrackSelectionFlags::kDCAz | TrackSelectionFlags::kDCAxy;
260+
static constexpr TrackSelectionFlags::flagtype TrackSelectionDCAXYonly =
261+
TrackSelectionFlags::kDCAxy;
262+
249263
struct DndetaMFTPbPb {
250264
SliceCache cache;
251265

@@ -257,6 +271,7 @@ struct DndetaMFTPbPb {
257271
HistogramRegistry registryQC{"registryQC", {}, OutputObjHandlingPolicy::AnalysisObject, true, true};
258272

259273
struct : ConfigurableGroup {
274+
Configurable<float> dcaZmidrap{"dcaZmidrap", 0.2f, "Custom DCA Z cut (ignored if negative)"};
260275
Configurable<bool> useEvtSel{"useEvtSel", true, "Use event selection"};
261276
Configurable<bool> useIRFromCCDB{"useIRFromCCDB", false, "Flag to retrieve Interaction rate from CCDB"};
262277
Configurable<bool> useIRCut{"useIRCut", false, "Flag to cut on IR rate"};
@@ -296,6 +311,7 @@ struct DndetaMFTPbPb {
296311
ConfigurableAxis dcaZBins{"dcaZBins", {100, -0.5, 0.5}, "DCAz binning (cm)"};
297312
ConfigurableAxis phiBins{"phiBins", {629, 0., TwoPI}, "#varphi binning (rad)"};
298313
ConfigurableAxis etaBins{"etaBins", {20, -4., -2.}, "#eta binning"};
314+
ConfigurableAxis etaMidrapBins{"etaMidrapBins", {40, -2., 2.}, "#eta midrapidity binning"};
299315
ConfigurableAxis chiSqPerNclBins{"chiSqPerNclBins", {100, 0, 100}, "#chi^{2} binning"};
300316
ConfigurableAxis nClBins{"nClBins", {10, 0.5, 10.5}, "number of clusters binning"};
301317
ConfigurableAxis tanLambdaBins{"tanLambdaBins", {100, -25, 0}, "binning for tan(lambda)"};
@@ -311,6 +327,7 @@ struct DndetaMFTPbPb {
311327
} rctCuts;
312328

313329
struct : ConfigurableGroup {
330+
Configurable<float> etaRangeMidrap{"etaRangeMidrap", 1.0f, "Eta range for midrapidity tracks"};
314331
Configurable<bool> usephiCut{"usephiCut", false, "use azimuthal angle cut"};
315332
Configurable<float> phiCut{"phiCut", 0.1f, "Cut on azimuthal angle of MFT tracks"};
316333
Configurable<float> minPhi{"minPhi", 0.f, ""};
@@ -395,6 +412,7 @@ struct DndetaMFTPbPb {
395412
const AxisSpec dcazAxis = {binOpt.dcaZBins, "DCA-z axis"};
396413
const AxisSpec phiAxis = {binOpt.phiBins, "#phi axis"};
397414
const AxisSpec etaAxis = {binOpt.etaBins, "#eta axis"};
415+
const AxisSpec etaMidrapAxis = {binOpt.etaMidrapBins, "#eta midrapidity axis"};
398416
const AxisSpec chiSqAxis = {binOpt.chiSqPerNclBins, "Chi2 axis"};
399417
const AxisSpec nclsAxis = {binOpt.nClBins, "Number of clusters axis"};
400418
const AxisSpec tanLambdaAxis{binOpt.tanLambdaBins, "tan(#lambda)"};
@@ -630,6 +648,9 @@ struct DndetaMFTPbPb {
630648
} else {
631649
registryMC.add({"Tracks/EtaZvtx", "; #eta; #it{z}_{vtx} (cm); recTrkTypeAxis; occupancy", {HistType::kTHnSparseF, {etaAxis, zAxis, recTrkTypeAxis, occupancyAxis}}});
632650
}
651+
if (doprocessMcInclusive) {
652+
registryMC.add({"TracksMidrap/EtaZvtx", "; #eta; #it{z}_{vtx} (cm); DCA_{XY} (cm); DCA_{Z} (cm); recTrkTypeAxis; occupancy", {HistType::kTHnSparseF, {etaMidrapAxis, zAxis, dcaxyAxis, dcazAxis, recTrkTypeAxis, occupancyAxis}}});
653+
}
633654
registryMC.add({"Tracks/EtaZvtxGen_t", "; #eta; #it{z}_{vtx} (cm); occupancy", {HistType::kTHnSparseF, {etaAxis, zAxis, occupancyAxis}}});
634655
registryMC.add({"Tracks/EtaZvtxGen", "; #eta; #it{z}_{vtx} (cm); occupancy", {HistType::kTHnSparseF, {etaAxis, zAxis, occupancyAxis}}});
635656
registryMC.add({"Tracks/EtaZvtxGenRecEvt", "; #eta; #it{z}_{vtx} (cm); occupancy", {HistType::kTHnSparseF, {etaAxis, zAxis, occupancyAxis}}});
@@ -682,6 +703,9 @@ struct DndetaMFTPbPb {
682703
} else {
683704
registryMC.add({"Tracks/Centrality/EtaZvtx", "; #eta; #it{z}_{vtx} (cm); recTrkTypeAxis; centrality; occupancy", {HistType::kTHnSparseF, {etaAxis, zAxis, recTrkTypeAxis, centralityAxis, occupancyAxis}}});
684705
}
706+
if (doprocessMcCentFT0C) {
707+
registryMC.add({"TracksMidrap/Centrality/EtaZvtx", "; #eta; #it{z}_{vtx} (cm); DCA_{XY} (cm); DCA_{Z} (cm); recTrkTypeAxis; centrality; occupancy", {HistType::kTHnSparseF, {etaMidrapAxis, zAxis, dcaxyAxis, dcazAxis, recTrkTypeAxis, centralityAxis, occupancyAxis}}});
708+
}
685709
registryMC.add({"Tracks/Centrality/EtaZvtxGen_t", "; #eta; #it{z}_{vtx} (cm); centrality; occupancy", {HistType::kTHnSparseF, {etaAxis, zAxis, centralityAxis, occupancyAxis}}});
686710
registryMC.add({"Tracks/Centrality/EtaZvtxGen", "; #eta; #it{z}_{vtx} (cm); centrality; occupancy", {HistType::kTHnSparseF, {etaAxis, zAxis, centralityAxis, occupancyAxis}}});
687711
registryMC.add({"Tracks/Centrality/EtaZvtxGenRecEvt", "; #eta; #it{z}_{vtx} (cm); centrality; occupancy", {HistType::kTHnSparseF, {etaAxis, zAxis, centralityAxis, occupancyAxis}}});
@@ -841,6 +865,14 @@ struct DndetaMFTPbPb {
841865
}
842866
}
843867

868+
/// Filter (midrapidity selections)
869+
expressions::Filter fTrackSelectionITS = ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::ITS) &&
870+
ncheckbit(aod::track::trackCutFlag, TrackSelectionITS);
871+
expressions::Filter fTrackSelectionTPC = ifnode(ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::TPC),
872+
ncheckbit(aod::track::trackCutFlag, TrackSelectionTPC), true);
873+
expressions::Filter fTrackSelectionDCA = ifnode(gConf.dcaZmidrap.node() > 0.f, nabs(aod::track::dcaZ) <= dcaZ && ncheckbit(aod::track::trackCutFlag, TrackSelectionDCAXYonly),
874+
ncheckbit(aod::track::trackCutFlag, TrackSelectionDCA));
875+
844876
/// Joined tables
845877
using FullBCs = soa::Join<aod::BCsWithTimestamps, aod::BcSels>;
846878
using CollBCs = soa::Join<aod::BCsWithTimestamps, aod::BcSels, aod::Run3MatchedToBCSparse>;
@@ -856,6 +888,10 @@ struct DndetaMFTPbPb {
856888
/// Tracks
857889
using MftTracksLabeled = soa::Join<aod::MFTTracks, aod::McMFTTrackLabels>;
858890
using MftBestTracksLabeled = soa::Join<aod::MFTTracks, aod::BestCollisionsFwd3d, aod::McMFTTrackLabels>;
891+
// midrapidity tracks
892+
using MidrapTracksLabeled = soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksDCA, aod::McTrackLabels, aod::TrackSelection>;
893+
using FiltMidrapTracksLabeled = soa::Filtered<MidrapTracksLabeled>;
894+
859895
/// Particles
860896
using ParticlesIdx = soa::Join<aod::McParticles, aod::ParticlesToMftTracks>;
861897

@@ -1733,6 +1769,7 @@ struct DndetaMFTPbPb {
17331769

17341770
Partition<aod::McParticles> mcSample = (aod::mcparticle::eta < trackCuts.maxEta) && (aod::mcparticle::eta > trackCuts.minEta);
17351771
Preslice<MftTracksLabeled> perColMcFiltTrk = o2::aod::fwdtrack::collisionId;
1772+
Preslice<MidrapTracksLabeled> perColMcFiltTrkMidrap = aod::track::collisionId;
17361773

17371774
std::vector<int> nRecPerCol;
17381775
std::vector<float> centRecPerCol;
@@ -1742,7 +1779,8 @@ struct DndetaMFTPbPb {
17421779
void processMc(typename MC::iterator const& mcCollision,
17431780
soa::SmallGroups<soa::Join<C, aod::McCollisionLabels>> const& collisions,
17441781
aod::McParticles const& particles,
1745-
MftTracksLabeled const& tracks)
1782+
MftTracksLabeled const& tracks,
1783+
FiltMidrapTracksLabeled const& midtracks)
17461784
{
17471785
nRecPerCol.clear();
17481786
centRecPerCol.clear();
@@ -1821,6 +1859,51 @@ struct DndetaMFTPbPb {
18211859
registryMC.fill(HIST("Events/McEvtStatus"), static_cast<float>(McEvtStatus::kMcRecNoSplitVtx), occRec);
18221860
}
18231861

1862+
// midrapidity tracks for weak deacy correction study
1863+
auto midtracksPerCol = midtracks.sliceBy(perColMcFiltTrkMidrap, collision.globalIndex());
1864+
for (auto const& midtrack : midtracksPerCol) {
1865+
if (std::abs(midtrack.eta()) >= trackCuts.etaRangeMidrap) {
1866+
continue;
1867+
}
1868+
if constexpr (has_reco_cent<C>) {
1869+
registryMC.fill(HIST("TracksMidrap/Centrality/EtaZvtx"), midtrack.eta(), collision.posZ(), midtrack.dcaXY(), midtrack.dcaZ(), static_cast<float>(McRecTrkType::kTrkSel), cRec, occRec);
1870+
} else {
1871+
registryMC.fill(HIST("TracksMidrap/EtaZvtx"), midtrack.eta(), collision.posZ(), midtrack.dcaXY(), midtrack.dcaZ(), static_cast<float>(McRecTrkType::kTrkSel), occRec);
1872+
}
1873+
if (midtrack.has_mcParticle() && (!trackCuts.removeFakeByMcMask || (midtrack.mcMask() == trackCuts.selMcMask))) {
1874+
const auto& particle = midtrack.template mcParticle_as<aod::McParticles>();
1875+
if (collision.mcCollisionId() != particle.mcCollisionId()) {
1876+
continue;
1877+
}
1878+
bool isPhysicalPrimary = particle.isPhysicalPrimary();
1879+
bool isSecondary = (particle.has_mothers() && particle.getProcess() == TMCProcess::kPDecay);
1880+
if (!isPhysicalPrimary && !isSecondary) {
1881+
continue;
1882+
}
1883+
int particleOrigin = -1;
1884+
auto particleMother = particle.template mothers_as<aod::McParticles>().front();
1885+
if (particle.isPhysicalPrimary()) {
1886+
particleOrigin = static_cast<int>(McRecTrkType::kPrimary);
1887+
} else if (particleMother.isPhysicalPrimary() && particle.getProcess() == TMCProcess::kPDecay) {
1888+
particleOrigin = static_cast<int>(McRecTrkType::kSecondary);
1889+
if (particleMother.pdgCode() == PDG_t::kK0Short || std::abs(particleMother.pdgCode()) == PDG_t::kLambda0) {
1890+
particleOrigin = static_cast<int>(McRecTrkType::kStrangeDecay);
1891+
}
1892+
}
1893+
if constexpr (has_reco_cent<C>) {
1894+
registryMC.fill(HIST("TracksMidrap/Centrality/EtaZvtx"), midtrack.eta(), collision.posZ(), midtrack.dcaXY(), midtrack.dcaZ(), static_cast<float>(particleOrigin), cRec, occRec);
1895+
} else {
1896+
registryMC.fill(HIST("TracksMidrap/EtaZvtx"), midtrack.eta(), collision.posZ(), midtrack.dcaXY(), midtrack.dcaZ(), static_cast<float>(particleOrigin), occRec);
1897+
}
1898+
} else {
1899+
if constexpr (has_reco_cent<C>) {
1900+
registryMC.fill(HIST("TracksMidrap/Centrality/EtaZvtx"), midtrack.eta(), collision.posZ(), midtrack.dcaXY(), midtrack.dcaZ(), static_cast<int>(McRecTrkType::kTrkFake), cRec, occRec);
1901+
} else {
1902+
registryMC.fill(HIST("TracksMidrap/EtaZvtx"), midtrack.eta(), collision.posZ(), midtrack.dcaXY(), midtrack.dcaZ(), static_cast<float>(McRecTrkType::kTrkFake), occRec);
1903+
}
1904+
}
1905+
}
1906+
18241907
auto nTrkRec = 0;
18251908
auto perColSample = tracks.sliceBy(perColMcFiltTrk, collision.globalIndex());
18261909
for (auto const& track : perColSample) {
@@ -1947,19 +2030,21 @@ struct DndetaMFTPbPb {
19472030
void processMcInclusive(CollsMCExtraMult::iterator const& mccollision,
19482031
soa::SmallGroups<soa::Join<Colls, aod::McCollisionLabels>> const& collisions,
19492032
aod::McParticles const& particles,
1950-
MftTracksLabeled const& tracks)
2033+
MftTracksLabeled const& tracks,
2034+
FiltMidrapTracksLabeled const& midtracks)
19512035
{
1952-
processMc<CollsMCExtraMult, Colls>(mccollision, collisions, particles, tracks);
2036+
processMc<CollsMCExtraMult, Colls>(mccollision, collisions, particles, tracks, midtracks);
19532037
}
19542038

19552039
PROCESS_SWITCH(DndetaMFTPbPb, processMcInclusive, "Count MC particles (inclusive)", false);
19562040

19572041
void processMcCentFT0C(CollsMCExtraMult::iterator const& mccollision,
19582042
soa::SmallGroups<soa::Join<CollsCentFT0C, aod::McCollisionLabels>> const& collisions,
19592043
aod::McParticles const& particles,
1960-
MftTracksLabeled const& tracks)
2044+
MftTracksLabeled const& tracks,
2045+
FiltMidrapTracksLabeled const& midtracks)
19612046
{
1962-
processMc<CollsMCExtraMult, CollsCentFT0C>(mccollision, collisions, particles, tracks);
2047+
processMc<CollsMCExtraMult, CollsCentFT0C>(mccollision, collisions, particles, tracks, midtracks);
19632048
}
19642049

19652050
PROCESS_SWITCH(DndetaMFTPbPb, processMcCentFT0C, "Count MC particles in FT0C centrality bins", false);

0 commit comments

Comments
 (0)