@@ -426,7 +426,7 @@ void AODProducerWorkflowDPL::addToMFTTracksTable(mftTracksCursorType& mftTracksC
426426}
427427
428428template <typename TracksCursorType, typename TracksCovCursorType, typename TracksExtraCursorType, typename TracksQACursorType, typename AmbigTracksCursorType,
429- typename MFTTracksCursorType, typename AmbigMFTTracksCursorType,
429+ typename MFTTracksCursorType, typename MFTTracksCovCursorType, typename AmbigMFTTracksCursorType,
430430 typename FwdTracksCursorType, typename FwdTracksCovCursorType, typename AmbigFwdTracksCursorType, typename FwdTrkClsCursorType>
431431void AODProducerWorkflowDPL::fillTrackTablesPerCollision (int collisionID,
432432 std::uint64_t collisionBC,
@@ -439,6 +439,7 @@ void AODProducerWorkflowDPL::fillTrackTablesPerCollision(int collisionID,
439439 TracksQACursorType& tracksQACursor,
440440 AmbigTracksCursorType& ambigTracksCursor,
441441 MFTTracksCursorType& mftTracksCursor,
442+ MFTTracksCovCursorType& mftTracksCovCursor,
442443 AmbigMFTTracksCursorType& ambigMFTTracksCursor,
443444 FwdTracksCursorType& fwdTracksCursor,
444445 FwdTracksCovCursorType& fwdTracksCovCursor,
@@ -458,6 +459,9 @@ void AODProducerWorkflowDPL::fillTrackTablesPerCollision(int collisionID,
458459 } else if (src == GIndex::Source::MCH || src == GIndex::Source::MFTMCH || src == GIndex::Source::MCHMID) {
459460 fwdTracksCursor.reserve (nToReserve + fwdTracksCursor.lastIndex ());
460461 fwdTracksCovCursor.reserve (nToReserve + fwdTracksCovCursor.lastIndex ());
462+ if (src == GIndex::Source::MFTMCH) {
463+ mftTracksCovCursor.reserve (nToReserve + mftTracksCovCursor.lastIndex ());
464+ }
461465 } else {
462466 tracksCursor.reserve (nToReserve + tracksCursor.lastIndex ());
463467 tracksCovCursor.reserve (nToReserve + tracksCovCursor.lastIndex ());
@@ -477,7 +481,7 @@ void AODProducerWorkflowDPL::fillTrackTablesPerCollision(int collisionID,
477481 if (trackIndex.isAmbiguous () && mGIDToTableFwdID .find (trackIndex) != mGIDToTableFwdID .end ()) { // was it already stored ?
478482 continue ;
479483 }
480- addToFwdTracksTable (fwdTracksCursor, fwdTracksCovCursor, ambigFwdTracksCursor, trackIndex, data, collisionID, collisionBC, bcsMap);
484+ addToFwdTracksTable (fwdTracksCursor, fwdTracksCovCursor, ambigFwdTracksCursor, mftTracksCovCursor, trackIndex, data, collisionID, collisionBC, bcsMap);
481485 mGIDToTableFwdID .emplace (trackIndex, mTableTrFwdID );
482486 addClustersToFwdTrkClsTable (data, fwdTrkClsCursor, trackIndex, mTableTrFwdID );
483487 mTableTrFwdID ++;
@@ -598,9 +602,9 @@ void AODProducerWorkflowDPL::fillIndexTablesPerCollision(const o2::dataformats::
598602 }
599603}
600604
601- template <typename FwdTracksCursorType, typename FwdTracksCovCursorType, typename AmbigFwdTracksCursorType>
605+ template <typename FwdTracksCursorType, typename FwdTracksCovCursorType, typename AmbigFwdTracksCursorType, typename mftTracksCovCursorType >
602606void AODProducerWorkflowDPL::addToFwdTracksTable (FwdTracksCursorType& fwdTracksCursor, FwdTracksCovCursorType& fwdTracksCovCursor,
603- AmbigFwdTracksCursorType& ambigFwdTracksCursor, GIndex trackID,
607+ AmbigFwdTracksCursorType& ambigFwdTracksCursor, mftTracksCovCursorType& mftTracksCovCursor, GIndex trackID,
604608 const o2::globaltracking::RecoContainer& data, int collisionID, std::uint64_t collisionBC,
605609 const std::map<uint64_t , int >& bcsMap)
606610{
@@ -742,6 +746,8 @@ void AODProducerWorkflowDPL::addToFwdTracksTable(FwdTracksCursorType& fwdTracksC
742746 fwdInfo.trackTimeRes = time.getTimeStampError () * 1 .e3 ;
743747 } else { // This is a GlobalMuonTrack or a GlobalForwardTrack
744748 const auto & track = data.getGlobalFwdTrack (trackID);
749+ const auto & mftTracks = data.getMFTTracks ();
750+ const auto & mfttrack = mftTracks[track.getMFTTrackID ()];
745751 if (!extrapMCHTrack (track.getMCHTrackID ())) {
746752 LOGF (warn, " Unable to extrapolate MCH track with ID %d! Dummy parameters will be used" , track.getMCHTrackID ());
747753 }
@@ -781,6 +787,27 @@ void AODProducerWorkflowDPL::addToFwdTracksTable(FwdTracksCursorType& fwdTracksC
781787 fwdCovInfo.rho1PtTgl = (Char_t)(128 . * track.getCovariances ()(3 , 4 ) / (fwdCovInfo.sig1Pt * fwdCovInfo.sigTgl ));
782788
783789 fwdInfo.trackTypeId = (fwdInfo.chi2matchmchmid >= 0 ) ? o2::aod::fwdtrack::GlobalMuonTrack : o2::aod::fwdtrack::GlobalForwardTrack;
790+
791+ float sX = TMath::Sqrt (mfttrack.getSigma2X ()), sY = TMath::Sqrt (mfttrack.getSigma2Y ()), sPhi = TMath::Sqrt (mfttrack.getSigma2Phi ()),
792+ sTgl = TMath::Sqrt (mfttrack.getSigma2Tanl ()), sQ2Pt = TMath::Sqrt (mfttrack.getSigma2InvQPt ());
793+
794+ mftTracksCovCursor (fwdInfo.matchmfttrackid ,
795+ truncateFloatFraction (sX , mTrackCovDiag ),
796+ truncateFloatFraction (sY , mTrackCovDiag ),
797+ truncateFloatFraction (sPhi , mTrackCovDiag ),
798+ truncateFloatFraction (sTgl , mTrackCovDiag ),
799+ truncateFloatFraction (sQ2Pt , mTrackCovDiag ),
800+ (Char_t)(128 . * mfttrack.getCovariances ()(0 , 1 ) / (sX * sY )),
801+ (Char_t)(128 . * mfttrack.getCovariances ()(0 , 2 ) / (sPhi * sX )),
802+ (Char_t)(128 . * mfttrack.getCovariances ()(1 , 2 ) / (sPhi * sY )),
803+ (Char_t)(128 . * mfttrack.getCovariances ()(0 , 3 ) / (sTgl * sX )),
804+ (Char_t)(128 . * mfttrack.getCovariances ()(1 , 3 ) / (sTgl * sY )),
805+ (Char_t)(128 . * mfttrack.getCovariances ()(2 , 3 ) / (sTgl * sPhi )),
806+ (Char_t)(128 . * mfttrack.getCovariances ()(0 , 4 ) / (sQ2Pt * sX )),
807+ (Char_t)(128 . * mfttrack.getCovariances ()(1 , 4 ) / (sQ2Pt * sY )),
808+ (Char_t)(128 . * mfttrack.getCovariances ()(2 , 4 ) / (sQ2Pt * sPhi )),
809+ (Char_t)(128 . * mfttrack.getCovariances ()(3 , 4 ) / (sQ2Pt * sTgl )));
810+
784811 }
785812
786813 std::uint64_t bcOfTimeRef;
@@ -1834,6 +1861,7 @@ void AODProducerWorkflowDPL::run(ProcessingContext& pc)
18341861 auto fwdTracksCovCursor = createTableCursor<o2::aod::StoredFwdTracksCov>(pc);
18351862 auto fwdTrkClsCursor = createTableCursor<o2::aod::FwdTrkCls>(pc);
18361863 auto mftTracksCursor = createTableCursor<o2::aod::StoredMFTTracks>(pc);
1864+ auto mftTracksCovCursor = createTableCursor<o2::aod::StoredMFTTracksCov>(pc);
18371865 auto tracksCursor = createTableCursor<o2::aod::StoredTracksIU>(pc);
18381866 auto tracksCovCursor = createTableCursor<o2::aod::StoredTracksCovIU>(pc);
18391867 auto tracksExtraCursor = createTableCursor<o2::aod::StoredTracksExtra>(pc);
@@ -2168,7 +2196,7 @@ void AODProducerWorkflowDPL::run(ProcessingContext& pc)
21682196 auto & trackRef = primVer2TRefs.back (); // references to unassigned tracks are at the end
21692197 // fixme: interaction time is undefined for unassigned tracks (?)
21702198 fillTrackTablesPerCollision (-1 , std::uint64_t (-1 ), trackRef, primVerGIs, recoData, tracksCursor, tracksCovCursor, tracksExtraCursor, tracksQACursor,
2171- ambigTracksCursor, mftTracksCursor, ambigMFTTracksCursor,
2199+ ambigTracksCursor, mftTracksCursor, mftTracksCovCursor, ambigMFTTracksCursor,
21722200 fwdTracksCursor, fwdTracksCovCursor, ambigFwdTracksCursor, fwdTrkClsCursor, bcsMap);
21732201
21742202 // filling collisions and tracks into tables
@@ -2210,7 +2238,7 @@ void AODProducerWorkflowDPL::run(ProcessingContext& pc)
22102238 auto & trackRef = primVer2TRefs[collisionID];
22112239 // passing interaction time in [ps]
22122240 fillTrackTablesPerCollision (collisionID, globalBC, trackRef, primVerGIs, recoData, tracksCursor, tracksCovCursor, tracksExtraCursor, tracksQACursor, ambigTracksCursor,
2213- mftTracksCursor, ambigMFTTracksCursor,
2241+ mftTracksCursor, mftTracksCovCursor, ambigMFTTracksCursor,
22142242 fwdTracksCursor, fwdTracksCovCursor, ambigFwdTracksCursor, fwdTrkClsCursor, bcsMap);
22152243 collisionID++;
22162244 }
@@ -3123,6 +3151,7 @@ DataProcessorSpec getAODProducerWorkflowSpec(GID::mask_t src, bool enableSV, boo
31233151 OutputForTable<StoredFwdTracks>::spec (),
31243152 OutputForTable<StoredFwdTracksCov>::spec (),
31253153 OutputForTable<StoredMFTTracks>::spec (),
3154+ OutputForTable<StoredMFTTracksCov>::spec (),
31263155 OutputForTable<StoredTracksIU>::spec (),
31273156 OutputForTable<StoredTracksCovIU>::spec (),
31283157 OutputForTable<StoredTracksExtra>::spec (),
0 commit comments