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>
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+
249263struct 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