@@ -428,7 +428,7 @@ void AODProducerWorkflowDPL::addToMFTTracksTable(mftTracksCursorType& mftTracksC
428428}
429429
430430template <typename TracksCursorType, typename TracksCovCursorType, typename TracksExtraCursorType, typename TracksQACursorType, typename AmbigTracksCursorType,
431- typename MFTTracksCursorType, typename AmbigMFTTracksCursorType,
431+ typename MFTTracksCursorType, typename MFTTracksCovCursorType, typename AmbigMFTTracksCursorType,
432432 typename FwdTracksCursorType, typename FwdTracksCovCursorType, typename AmbigFwdTracksCursorType, typename FwdTrkClsCursorType>
433433void AODProducerWorkflowDPL::fillTrackTablesPerCollision (int collisionID,
434434 std::uint64_t collisionBC,
@@ -441,6 +441,7 @@ void AODProducerWorkflowDPL::fillTrackTablesPerCollision(int collisionID,
441441 TracksQACursorType& tracksQACursor,
442442 AmbigTracksCursorType& ambigTracksCursor,
443443 MFTTracksCursorType& mftTracksCursor,
444+ MFTTracksCovCursorType& mftTracksCovCursor,
444445 AmbigMFTTracksCursorType& ambigMFTTracksCursor,
445446 FwdTracksCursorType& fwdTracksCursor,
446447 FwdTracksCovCursorType& fwdTracksCovCursor,
@@ -460,6 +461,9 @@ void AODProducerWorkflowDPL::fillTrackTablesPerCollision(int collisionID,
460461 } else if (src == GIndex::Source::MCH || src == GIndex::Source::MFTMCH || src == GIndex::Source::MCHMID) {
461462 fwdTracksCursor.reserve (nToReserve + fwdTracksCursor.lastIndex ());
462463 fwdTracksCovCursor.reserve (nToReserve + fwdTracksCovCursor.lastIndex ());
464+ if (src == GIndex::Source::MFTMCH) {
465+ mftTracksCovCursor.reserve (nToReserve + mftTracksCovCursor.lastIndex ());
466+ }
463467 } else {
464468 tracksCursor.reserve (nToReserve + tracksCursor.lastIndex ());
465469 tracksCovCursor.reserve (nToReserve + tracksCovCursor.lastIndex ());
@@ -479,7 +483,7 @@ void AODProducerWorkflowDPL::fillTrackTablesPerCollision(int collisionID,
479483 if (trackIndex.isAmbiguous () && mGIDToTableFwdID .find (trackIndex) != mGIDToTableFwdID .end ()) { // was it already stored ?
480484 continue ;
481485 }
482- addToFwdTracksTable (fwdTracksCursor, fwdTracksCovCursor, ambigFwdTracksCursor, trackIndex, data, collisionID, collisionBC, bcsMap);
486+ addToFwdTracksTable (fwdTracksCursor, fwdTracksCovCursor, ambigFwdTracksCursor, mftTracksCovCursor, trackIndex, data, collisionID, collisionBC, bcsMap);
483487 mGIDToTableFwdID .emplace (trackIndex, mTableTrFwdID );
484488 addClustersToFwdTrkClsTable (data, fwdTrkClsCursor, trackIndex, mTableTrFwdID );
485489 mTableTrFwdID ++;
@@ -600,9 +604,9 @@ void AODProducerWorkflowDPL::fillIndexTablesPerCollision(const o2::dataformats::
600604 }
601605}
602606
603- template <typename FwdTracksCursorType, typename FwdTracksCovCursorType, typename AmbigFwdTracksCursorType>
607+ template <typename FwdTracksCursorType, typename FwdTracksCovCursorType, typename AmbigFwdTracksCursorType, typename mftTracksCovCursorType >
604608void AODProducerWorkflowDPL::addToFwdTracksTable (FwdTracksCursorType& fwdTracksCursor, FwdTracksCovCursorType& fwdTracksCovCursor,
605- AmbigFwdTracksCursorType& ambigFwdTracksCursor, GIndex trackID,
609+ AmbigFwdTracksCursorType& ambigFwdTracksCursor, mftTracksCovCursorType& mftTracksCovCursor, GIndex trackID,
606610 const o2::globaltracking::RecoContainer& data, int collisionID, std::uint64_t collisionBC,
607611 const std::map<uint64_t , int >& bcsMap)
608612{
@@ -744,6 +748,8 @@ void AODProducerWorkflowDPL::addToFwdTracksTable(FwdTracksCursorType& fwdTracksC
744748 fwdInfo.trackTimeRes = time.getTimeStampError () * 1 .e3 ;
745749 } else { // This is a GlobalMuonTrack or a GlobalForwardTrack
746750 const auto & track = data.getGlobalFwdTrack (trackID);
751+ const auto & mftTracks = data.getMFTTracks ();
752+ const auto & mfttrack = mftTracks[track.getMFTTrackID ()];
747753 if (!extrapMCHTrack (track.getMCHTrackID ())) {
748754 LOGF (warn, " Unable to extrapolate MCH track with ID %d! Dummy parameters will be used" , track.getMCHTrackID ());
749755 }
@@ -783,6 +789,26 @@ void AODProducerWorkflowDPL::addToFwdTracksTable(FwdTracksCursorType& fwdTracksC
783789 fwdCovInfo.rho1PtTgl = (Char_t)(128 . * track.getCovariances ()(3 , 4 ) / (fwdCovInfo.sig1Pt * fwdCovInfo.sigTgl ));
784790
785791 fwdInfo.trackTypeId = (fwdInfo.chi2matchmchmid >= 0 ) ? o2::aod::fwdtrack::GlobalMuonTrack : o2::aod::fwdtrack::GlobalForwardTrack;
792+
793+ float sX = TMath::Sqrt (mfttrack.getSigma2X ()), sY = TMath::Sqrt (mfttrack.getSigma2Y ()), sPhi = TMath::Sqrt (mfttrack.getSigma2Phi ()),
794+ sTgl = TMath::Sqrt (mfttrack.getSigma2Tanl ()), sQ2Pt = TMath::Sqrt (mfttrack.getSigma2InvQPt ());
795+
796+ mftTracksCovCursor (fwdInfo.matchmfttrackid ,
797+ truncateFloatFraction (sX , mTrackCovDiag ),
798+ truncateFloatFraction (sY , mTrackCovDiag ),
799+ truncateFloatFraction (sPhi , mTrackCovDiag ),
800+ truncateFloatFraction (sTgl , mTrackCovDiag ),
801+ truncateFloatFraction (sQ2Pt , mTrackCovDiag ),
802+ (Char_t)(128 . * mfttrack.getCovariances ()(0 , 1 ) / (sX * sY )),
803+ (Char_t)(128 . * mfttrack.getCovariances ()(0 , 2 ) / (sPhi * sX )),
804+ (Char_t)(128 . * mfttrack.getCovariances ()(1 , 2 ) / (sPhi * sY )),
805+ (Char_t)(128 . * mfttrack.getCovariances ()(0 , 3 ) / (sTgl * sX )),
806+ (Char_t)(128 . * mfttrack.getCovariances ()(1 , 3 ) / (sTgl * sY )),
807+ (Char_t)(128 . * mfttrack.getCovariances ()(2 , 3 ) / (sTgl * sPhi )),
808+ (Char_t)(128 . * mfttrack.getCovariances ()(0 , 4 ) / (sQ2Pt * sX )),
809+ (Char_t)(128 . * mfttrack.getCovariances ()(1 , 4 ) / (sQ2Pt * sY )),
810+ (Char_t)(128 . * mfttrack.getCovariances ()(2 , 4 ) / (sQ2Pt * sPhi )),
811+ (Char_t)(128 . * mfttrack.getCovariances ()(3 , 4 ) / (sQ2Pt * sTgl )));
786812 }
787813
788814 std::uint64_t bcOfTimeRef;
@@ -1837,6 +1863,7 @@ void AODProducerWorkflowDPL::run(ProcessingContext& pc)
18371863 auto fwdTracksCovCursor = createTableCursor<o2::aod::StoredFwdTracksCov>(pc);
18381864 auto fwdTrkClsCursor = createTableCursor<o2::aod::FwdTrkCls>(pc);
18391865 auto mftTracksCursor = createTableCursor<o2::aod::StoredMFTTracks>(pc);
1866+ auto mftTracksCovCursor = createTableCursor<o2::aod::StoredMFTTracksCov>(pc);
18401867 auto tracksCursor = createTableCursor<o2::aod::StoredTracksIU>(pc);
18411868 auto tracksCovCursor = createTableCursor<o2::aod::StoredTracksCovIU>(pc);
18421869 auto tracksExtraCursor = createTableCursor<o2::aod::StoredTracksExtra>(pc);
@@ -2171,7 +2198,7 @@ void AODProducerWorkflowDPL::run(ProcessingContext& pc)
21712198 auto & trackRef = primVer2TRefs.back (); // references to unassigned tracks are at the end
21722199 // fixme: interaction time is undefined for unassigned tracks (?)
21732200 fillTrackTablesPerCollision (-1 , std::uint64_t (-1 ), trackRef, primVerGIs, recoData, tracksCursor, tracksCovCursor, tracksExtraCursor, tracksQACursor,
2174- ambigTracksCursor, mftTracksCursor, ambigMFTTracksCursor,
2201+ ambigTracksCursor, mftTracksCursor, mftTracksCovCursor, ambigMFTTracksCursor,
21752202 fwdTracksCursor, fwdTracksCovCursor, ambigFwdTracksCursor, fwdTrkClsCursor, bcsMap);
21762203
21772204 // filling collisions and tracks into tables
@@ -2213,7 +2240,7 @@ void AODProducerWorkflowDPL::run(ProcessingContext& pc)
22132240 auto & trackRef = primVer2TRefs[collisionID];
22142241 // passing interaction time in [ps]
22152242 fillTrackTablesPerCollision (collisionID, globalBC, trackRef, primVerGIs, recoData, tracksCursor, tracksCovCursor, tracksExtraCursor, tracksQACursor, ambigTracksCursor,
2216- mftTracksCursor, ambigMFTTracksCursor,
2243+ mftTracksCursor, mftTracksCovCursor, ambigMFTTracksCursor,
22172244 fwdTracksCursor, fwdTracksCovCursor, ambigFwdTracksCursor, fwdTrkClsCursor, bcsMap);
22182245 collisionID++;
22192246 }
@@ -3139,6 +3166,7 @@ DataProcessorSpec getAODProducerWorkflowSpec(GID::mask_t src, bool enableSV, boo
31393166 OutputForTable<StoredFwdTracks>::spec (),
31403167 OutputForTable<StoredFwdTracksCov>::spec (),
31413168 OutputForTable<StoredMFTTracks>::spec (),
3169+ OutputForTable<StoredMFTTracksCov>::spec (),
31423170 OutputForTable<StoredTracksIU>::spec (),
31433171 OutputForTable<StoredTracksCovIU>::spec (),
31443172 OutputForTable<StoredTracksExtra>::spec (),
0 commit comments