@@ -409,7 +409,7 @@ void AODProducerWorkflowDPL::addToMFTTracksTable(mftTracksCursorType& mftTracksC
409409
410410template <typename TracksCursorType, typename TracksCovCursorType, typename TracksExtraCursorType, typename TracksQACursorType, typename AmbigTracksCursorType,
411411 typename MFTTracksCursorType, typename AmbigMFTTracksCursorType,
412- typename FwdTracksCursorType, typename FwdTracksCovCursorType, typename AmbigFwdTracksCursorType>
412+ typename FwdTracksCursorType, typename FwdTracksCovCursorType, typename AmbigFwdTracksCursorType, typename FwdTrkClsCursorType >
413413void AODProducerWorkflowDPL::fillTrackTablesPerCollision (int collisionID,
414414 std::uint64_t collisionBC,
415415 const o2::dataformats::VtxTrackRef& trackRef,
@@ -425,6 +425,7 @@ void AODProducerWorkflowDPL::fillTrackTablesPerCollision(int collisionID,
425425 FwdTracksCursorType& fwdTracksCursor,
426426 FwdTracksCovCursorType& fwdTracksCovCursor,
427427 AmbigFwdTracksCursorType& ambigFwdTracksCursor,
428+ FwdTrkClsCursorType& fwdTrkClsCursor,
428429 const std::map<uint64_t , int >& bcsMap)
429430{
430431 for (int src = GIndex::NSources; src--;) {
@@ -460,6 +461,7 @@ void AODProducerWorkflowDPL::fillTrackTablesPerCollision(int collisionID,
460461 }
461462 addToFwdTracksTable (fwdTracksCursor, fwdTracksCovCursor, ambigFwdTracksCursor, trackIndex, data, collisionID, collisionBC, bcsMap);
462463 mGIDToTableFwdID .emplace (trackIndex, mTableTrFwdID );
464+ addClustersToFwdTrkClsTable (data, fwdTrkClsCursor, trackIndex, mTableTrFwdID );
463465 mTableTrFwdID ++;
464466 } else {
465467 // barrel track: normal tracks table
@@ -1284,6 +1286,37 @@ void AODProducerWorkflowDPL::fillSecondaryVertices(const o2::globaltracking::Rec
12841286 }
12851287}
12861288
1289+ template <typename FwdTrkClsCursorType>
1290+ void AODProducerWorkflowDPL::addClustersToFwdTrkClsTable (const o2::globaltracking::RecoContainer& recoData, FwdTrkClsCursorType& fwdTrkClsCursor, GIndex trackID, int fwdTrackId)
1291+ {
1292+ const auto & mchTracks = recoData.getMCHTracks ();
1293+ const auto & mchmidMatches = recoData.getMCHMIDMatches ();
1294+ const auto & mchClusters = recoData.getMCHTrackClusters ();
1295+
1296+ int mchTrackID = -1 ;
1297+ if (trackID.getSource () == GIndex::MCH) { // This is an MCH track
1298+ mchTrackID = trackID.getIndex ();
1299+ } else if (trackID.getSource () == GIndex::MCHMID) { // This is an MCH-MID track
1300+ auto mchmidMatch = mchmidMatches[trackID.getIndex ()];
1301+ mchTrackID = mchmidMatch.getMCHRef ().getIndex ();
1302+ } // Others are Global Forward Tracks, their clusters will be or were added with the corresponding MCH track
1303+
1304+ if (mchTrackID > -1 && mchTrackID < mchTracks.size ()) {
1305+ const auto & mchTrack = mchTracks[mchTrackID];
1306+ fwdTrkClsCursor.reserve (mchTrack.getNClusters () + fwdTrkClsCursor.lastIndex ());
1307+ int first = mchTrack.getFirstClusterIdx ();
1308+ int last = mchTrack.getLastClusterIdx ();
1309+ for (int i = first; i <= last; i++) {
1310+ const auto & cluster = mchClusters[i];
1311+ fwdTrkClsCursor (fwdTrackId,
1312+ truncateFloatFraction (cluster.x , mMuonCl ),
1313+ truncateFloatFraction (cluster.y , mMuonCl ),
1314+ truncateFloatFraction (cluster.z , mMuonCl ),
1315+ (((cluster.ey < 5 .) & 0x1 ) << 12 ) | (((cluster.ex < 5 .) & 0x1 ) << 11 ) | cluster.getDEId ());
1316+ }
1317+ }
1318+ }
1319+
12871320template <typename HMPCursorType>
12881321void AODProducerWorkflowDPL::fillHMPID (const o2::globaltracking::RecoContainer& recoData, HMPCursorType& hmpCursor)
12891322{
@@ -1798,6 +1831,7 @@ void AODProducerWorkflowDPL::run(ProcessingContext& pc)
17981831 auto fv0aCursor = createTableCursor<o2::aod::FV0As>(pc);
17991832 auto fwdTracksCursor = createTableCursor<o2::aod::StoredFwdTracks>(pc);
18001833 auto fwdTracksCovCursor = createTableCursor<o2::aod::StoredFwdTracksCov>(pc);
1834+ auto fwdTrkClsCursor = createTableCursor<o2::aod::FwdTrkCls>(pc);
18011835 auto mcColLabelsCursor = createTableCursor<o2::aod::McCollisionLabels>(pc);
18021836 auto mcCollisionsCursor = createTableCursor<o2::aod::McCollisions>(pc);
18031837 auto mcMFTTrackLabelCursor = createTableCursor<o2::aod::McMFTTrackLabels>(pc);
@@ -2115,7 +2149,7 @@ void AODProducerWorkflowDPL::run(ProcessingContext& pc)
21152149 // fixme: interaction time is undefined for unassigned tracks (?)
21162150 fillTrackTablesPerCollision (-1 , std::uint64_t (-1 ), trackRef, primVerGIs, recoData, tracksCursor, tracksCovCursor, tracksExtraCursor, tracksQACursor,
21172151 ambigTracksCursor, mftTracksCursor, ambigMFTTracksCursor,
2118- fwdTracksCursor, fwdTracksCovCursor, ambigFwdTracksCursor, bcsMap);
2152+ fwdTracksCursor, fwdTracksCovCursor, ambigFwdTracksCursor, fwdTrkClsCursor, bcsMap);
21192153
21202154 // filling collisions and tracks into tables
21212155 collisionID = 0 ;
@@ -2157,7 +2191,7 @@ void AODProducerWorkflowDPL::run(ProcessingContext& pc)
21572191 // passing interaction time in [ps]
21582192 fillTrackTablesPerCollision (collisionID, globalBC, trackRef, primVerGIs, recoData, tracksCursor, tracksCovCursor, tracksExtraCursor, tracksQACursor, ambigTracksCursor,
21592193 mftTracksCursor, ambigMFTTracksCursor,
2160- fwdTracksCursor, fwdTracksCovCursor, ambigFwdTracksCursor, bcsMap);
2194+ fwdTracksCursor, fwdTracksCovCursor, ambigFwdTracksCursor, fwdTrkClsCursor, bcsMap);
21612195 collisionID++;
21622196 }
21632197
@@ -2940,6 +2974,7 @@ DataProcessorSpec getAODProducerWorkflowSpec(GID::mask_t src, bool enableSV, boo
29402974 OutputForTable<AmbiguousTracks>::spec (),
29412975 OutputForTable<AmbiguousMFTTracks>::spec (),
29422976 OutputForTable<AmbiguousFwdTracks>::spec (),
2977+ OutputForTable<FwdTrkCls>::spec (),
29432978 OutputForTable<V0s>::spec (),
29442979 OutputForTable<HMPIDs>::spec (),
29452980 OutputForTable<Zdcs>::spec (),
0 commit comments