Skip to content

Commit 8b1d6cf

Browse files
committed
PWGLF: extend Micro001 quality and remove hybrid track processing
Store TPC crossed rows and ITS cluster map in Micro001 and expose ITS quality getters. Keep per-collision processData slicing and remove the redundant hybrid callback and its configuration checks. Micro001 is intentionally extended in place; older version-1 files require regeneration or conversion. Validated with a target build and identical-input Data/MC smoke tests.
1 parent 1388606 commit 8b1d6cf

2 files changed

Lines changed: 25 additions & 35 deletions

File tree

PWGLF/DataModel/LFResonanceTables.h

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -800,6 +800,14 @@ DECLARE_SOA_DYNAMIC_COLUMN(PassedPtDependentDCAxy, passedPtDependentDCAxy,
800800
[](uint8_t trackSelectionFlags) { return DCAEncoding::testPtDependentDCAxy(trackSelectionFlags); });
801801
DECLARE_SOA_DYNAMIC_COLUMN(PassedPtDependentDCAz, passedPtDependentDCAz,
802802
[](uint8_t trackSelectionFlags) { return DCAEncoding::testPtDependentDCAz(trackSelectionFlags); });
803+
DECLARE_SOA_DYNAMIC_COLUMN(HasITSHitInLayer, hasITSHitInLayer,
804+
[](uint8_t itsClusterMap, int layer) -> bool {
805+
constexpr int NumberOfITSLayers = 7;
806+
if (layer < 0 || layer >= NumberOfITSLayers) {
807+
return false;
808+
}
809+
return (itsClusterMap & (1u << layer)) != 0;
810+
});
803811
} // namespace resomicrodaughter001
804812

805813
// Ultra-micro track representation. The momentum components are quantised
@@ -1036,6 +1044,8 @@ using ResoMicroTrack = ResoMicroTracks::iterator;
10361044

10371045
// Keep ResoMicroTracks as the version-0 API for existing producers and
10381046
// consumers. Version-1 users must request ResoMicroTracks_001 explicitly.
1047+
// Version 1 includes TPC crossed rows and the ITS cluster map; older version-1
1048+
// files without these columns must be regenerated or explicitly converted.
10391049
DECLARE_SOA_TABLE_VERSIONED(ResoMicroTracks_001, "AOD", "RESOMICROTRACK", 1,
10401050
o2::soa::Index<>,
10411051
resodaughter::ResoCollisionId,
@@ -1048,6 +1058,8 @@ DECLARE_SOA_TABLE_VERSIONED(ResoMicroTracks_001, "AOD", "RESOMICROTRACK", 1,
10481058
resomicrodaughter::PidNSigmaPrFlag,
10491059
resomicrodaughter001::TrackSelectionFlags,
10501060
resodaughter::TrackFlags,
1061+
resodaughter::TpcNClsCrossedRows,
1062+
track::ITSClusterMap,
10511063
// Dynamic columns
10521064
resomicrodaughter::Pt<resodaughter::Px, resodaughter::Py>,
10531065
resodaughter::Eta<resodaughter::Px, resodaughter::Py, resodaughter::Pz>,
@@ -1069,7 +1081,10 @@ DECLARE_SOA_TABLE_VERSIONED(ResoMicroTracks_001, "AOD", "RESOMICROTRACK", 1,
10691081
resodaughter::IsPrimaryTrack<resodaughter::TrackFlags>,
10701082
resodaughter::IsPVContributor<resodaughter::TrackFlags>,
10711083
resodaughter::HasTOF<resodaughter::TrackFlags>,
1072-
resodaughter::Sign<resodaughter::TrackFlags>);
1084+
resodaughter::Sign<resodaughter::TrackFlags>,
1085+
track::ITSNCls<track::ITSClusterMap>,
1086+
track::ITSNClsInnerBarrel<track::ITSClusterMap>,
1087+
resomicrodaughter001::HasITSHitInLayer<track::ITSClusterMap>);
10731088
// Positional soft-link side table retained for ResoMicroTracks version 000.
10741089
// Version 001 stores the same row number as a scalar and should be consumed
10751090
// without joining this side table, since both columns expose trackId().

PWGLF/TableProducer/Resonances/resonanceModuleInitializer.cxx

Lines changed: 9 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1243,13 +1243,12 @@ struct ResonanceDaughterInitializer {
12431243
// data-model relation keeps its legacy v000 default target; v001 consumers
12441244
// must use resoCollision_as<T>() with the exact bound v001 table type for
12451245
// dereferencing (aod::ResoCollisions_001 when the parent is not joined).
1246-
// Original-collision grouping is provided by the scalar-only version-1
1247-
// ResoCollisionGroups_001 table, avoiding a hard source-AO2D relation.
1246+
// Daughter callbacks use the original collision ID from ResoCollisionColls
1247+
// to slice input candidates explicitly. The scalar ResoCollisionGroups_001
1248+
// output is retained for consumers that do not need source-AO2D dereferencing.
12481249
// Collision mappings are always written; cfgBypassCollIndexFill is retained
12491250
// only so existing configuration files remain accepted.
12501251
using ResoCollisionWithIndex = soa::Join<aod::ResoCollisions_001, aod::ResoCollisionColls>;
1251-
using SelectedResoCollisions = soa::Join<aod::ResoCollisions_001, aod::ResoCollisionGroups_001>;
1252-
PresliceUnsorted<SelectedResoCollisions> reducedCollisionsPerOriginalCollision = aod::resocollisiongroup001::originalCollisionId;
12531252

12541253
/**
12551254
* @brief Initializes the task
@@ -1263,7 +1262,7 @@ struct ResonanceDaughterInitializer {
12631262
LOGF(fatal, "cfgPairGateMode must be 0 (configured gates) or 1 (V0 or cascade)");
12641263
}
12651264
const bool useEitherPairGate = FilterForDerivedTables.cfgPairGateMode.value == PairGateModeEither;
1266-
const bool processTrackDataEnabled = doprocessData || doprocessDataHybrid || doprocessDataWithPairGate ||
1265+
const bool processTrackDataEnabled = doprocessData || doprocessDataWithPairGate ||
12671266
doprocessDataWithV0PairGate || doprocessDataWithCascPairGate;
12681267
const bool processTrackMCEnabled = doprocessMC || doprocessMCWithPairGate ||
12691268
doprocessMCWithV0PairGate || doprocessMCWithCascPairGate;
@@ -1275,7 +1274,6 @@ struct ResonanceDaughterInitializer {
12751274
const bool anyDataProcessEnabled = processTrackDataEnabled || processV0DataEnabled || processCascDataEnabled;
12761275
const bool anyMCProcessEnabled = processTrackMCEnabled || doprocessV0MC || doprocessCascMC;
12771276
const int enabledTrackProcesses = static_cast<int>(doprocessData) +
1278-
static_cast<int>(doprocessDataHybrid) +
12791277
static_cast<int>(doprocessDataWithPairGate) +
12801278
static_cast<int>(doprocessDataWithV0PairGate) +
12811279
static_cast<int>(doprocessDataWithCascPairGate) +
@@ -1311,10 +1309,10 @@ struct ResonanceDaughterInitializer {
13111309
if (static_cast<int>(doprocessCascData) + static_cast<int>(doprocessCascMC) > 1) {
13121310
LOGF(fatal, "Only one cascade process can be enabled in ResonanceDaughterInitializer");
13131311
}
1314-
if ((doprocessData || doprocessDataHybrid || doprocessMC) &&
1312+
if ((doprocessData || doprocessMC) &&
13151313
(useEitherPairGate || FilterForDerivedTables.cfgBypassNoPairV0s || FilterForDerivedTables.cfgBypassNoPairCascades ||
13161314
FilterForDerivedTables.cfgGlobalDaughterVeto)) {
1317-
LOGF(warn, "Pair-gate options are ignored by processData/processDataHybrid/processMC; enable the matching *WithPairGate process to apply them");
1315+
LOGF(warn, "Pair-gate options are ignored by processData/processMC; enable the matching *WithPairGate process to apply them");
13181316
}
13191317
const auto validatePairGateOutputs = [&](bool pairProcessEnabled,
13201318
bool v0OutputEnabled,
@@ -2204,7 +2202,9 @@ struct ResonanceDaughterInitializer {
22042202
static_cast<uint8_t>(o2::aod::resomicrodaughter001::PidNSigma(track.tpcNSigmaKa(), track.tofNSigmaKa(), track.hasTOF())),
22052203
static_cast<uint8_t>(o2::aod::resomicrodaughter001::PidNSigma(track.tpcNSigmaPr(), track.tofNSigmaPr(), track.hasTOF())),
22062204
static_cast<uint8_t>(trackSelFlag),
2207-
trackFlags);
2205+
trackFlags,
2206+
static_cast<uint8_t>(track.tpcNClsCrossedRows()),
2207+
track.itsClusterMap());
22082208
if (!FilterForDerivedTables.cfgBypassTrackIndexFill) {
22092209
resoMicroTrackTracks(track.globalIndex());
22102210
}
@@ -2783,31 +2783,6 @@ struct ResonanceDaughterInitializer {
27832783
}
27842784
PROCESS_SWITCH(ResonanceDaughterInitializer, processData, "Process tracks for data", false);
27852785

2786-
/**
2787-
* @brief Processes data tracks using the two-stage hybrid grouping
2788-
*
2789-
* GroupSlicer associates tracks automatically to the original
2790-
* aod::Collision. Reduced collisions retain a scalar original-collision row
2791-
* number and are explicitly sliced from the much smaller mapping table. The
2792-
* tracks argument is already the selected slice and must not be sliced again.
2793-
*/
2794-
void processDataHybrid(aod::Collision const& originalCollision,
2795-
SelectedResoCollisions const& reducedCollisions,
2796-
soa::Filtered<aod::ResoTrackCandidates> const& tracks)
2797-
{
2798-
auto reducedCollisionsThisCollision = reducedCollisions.sliceBy(reducedCollisionsPerOriginalCollision, originalCollision.globalIndex());
2799-
if (reducedCollisionsThisCollision.size() == 0) {
2800-
return;
2801-
}
2802-
if (reducedCollisionsThisCollision.size() > 1) {
2803-
LOGF(error, "Found %zu reduced collisions for one original collision; skipping the ambiguous association", reducedCollisionsThisCollision.size());
2804-
return;
2805-
}
2806-
auto reducedCollision = reducedCollisionsThisCollision.begin();
2807-
fillTrackTables<false>(reducedCollision, tracks);
2808-
}
2809-
PROCESS_SWITCH(ResonanceDaughterInitializer, processDataHybrid, "Process data tracks with the two-stage hybrid grouping", false);
2810-
28112786
/**
28122787
* @brief Processes data tracks with configurable selected V0 and cascade gates
28132788
*/

0 commit comments

Comments
 (0)