@@ -386,8 +386,8 @@ void AODProducerWorkflowDPL::addToTracksQATable(TracksQACursorType& tracksQACurs
386386 trackQAInfoHolder.dTofdZ );
387387}
388388
389- template <typename mftTracksCursorType, typename AmbigMFTTracksCursorType>
390- void AODProducerWorkflowDPL::addToMFTTracksTable (mftTracksCursorType& mftTracksCursor, AmbigMFTTracksCursorType& ambigMFTTracksCursor,
389+ template <typename mftTracksCursorType, typename mftTracksCovCursorType, typename AmbigMFTTracksCursorType>
390+ void AODProducerWorkflowDPL::addToMFTTracksTable (mftTracksCursorType& mftTracksCursor, mftTracksCovCursorType& mftTracksCovCursor, AmbigMFTTracksCursorType& ambigMFTTracksCursor,
391391 GIndex trackID, const o2::globaltracking::RecoContainer& data, int collisionID,
392392 std::uint64_t collisionBC, const std::map<uint64_t , int >& bcsMap)
393393{
@@ -422,6 +422,30 @@ void AODProducerWorkflowDPL::addToMFTTracksTable(mftTracksCursorType& mftTracksC
422422 truncateFloatFraction (track.getTrackChi2 (), mTrackChi2 ),
423423 truncateFloatFraction (trackTime, mTrackTime ),
424424 truncateFloatFraction (trackTimeRes, mTrackTimeError ));
425+ if (mStoreAllMFTCov ) {
426+ float sX = TMath::Sqrt (track.getSigma2X ());
427+ float sY = TMath::Sqrt (track.getSigma2Y ());
428+ float sPhi = TMath::Sqrt (track.getSigma2Phi ());
429+ float sTgl = TMath::Sqrt (track.getSigma2Tanl ());
430+ float sQ2Pt = TMath::Sqrt (track.getSigma2InvQPt ());
431+
432+ mftTracksCovCursor (mTableTrMFTID ,
433+ truncateFloatFraction (sX , mTrackCovDiag ),
434+ truncateFloatFraction (sY , mTrackCovDiag ),
435+ truncateFloatFraction (sPhi , mTrackCovDiag ),
436+ truncateFloatFraction (sTgl , mTrackCovDiag ),
437+ truncateFloatFraction (sQ2Pt , mTrackCovDiag ),
438+ (Char_t)(128 . * track.getCovariances ()(0 , 1 ) / (sX * sY )),
439+ (Char_t)(128 . * track.getCovariances ()(0 , 2 ) / (sPhi * sX )),
440+ (Char_t)(128 . * track.getCovariances ()(1 , 2 ) / (sPhi * sY )),
441+ (Char_t)(128 . * track.getCovariances ()(0 , 3 ) / (sTgl * sX )),
442+ (Char_t)(128 . * track.getCovariances ()(1 , 3 ) / (sTgl * sY )),
443+ (Char_t)(128 . * track.getCovariances ()(2 , 3 ) / (sTgl * sPhi )),
444+ (Char_t)(128 . * track.getCovariances ()(0 , 4 ) / (sQ2Pt * sX )),
445+ (Char_t)(128 . * track.getCovariances ()(1 , 4 ) / (sQ2Pt * sY )),
446+ (Char_t)(128 . * track.getCovariances ()(2 , 4 ) / (sQ2Pt * sPhi )),
447+ (Char_t)(128 . * track.getCovariances ()(3 , 4 ) / (sQ2Pt * sTgl )));
448+ }
425449 if (needBCSlice) {
426450 ambigMFTTracksCursor (mTableTrMFTID , bcSlice);
427451 }
@@ -458,10 +482,13 @@ void AODProducerWorkflowDPL::fillTrackTablesPerCollision(int collisionID,
458482 int nToReserve = end - start; // + last index for a given table
459483 if (src == GIndex::Source::MFT) {
460484 mftTracksCursor.reserve (nToReserve + mftTracksCursor.lastIndex ());
485+ if (mStoreAllMFTCov ) {
486+ mftTracksCovCursor.reserve (nToReserve + mftTracksCovCursor.lastIndex ());
487+ }
461488 } else if (src == GIndex::Source::MCH || src == GIndex::Source::MFTMCH || src == GIndex::Source::MCHMID) {
462489 fwdTracksCursor.reserve (nToReserve + fwdTracksCursor.lastIndex ());
463490 fwdTracksCovCursor.reserve (nToReserve + fwdTracksCovCursor.lastIndex ());
464- if (src == GIndex::Source::MFTMCH) {
491+ if (! mStoreAllMFTCov && src == GIndex::Source::MFTMCH) {
465492 mftTracksCovCursor.reserve (nToReserve + mftTracksCovCursor.lastIndex ());
466493 }
467494 } else {
@@ -476,7 +503,7 @@ void AODProducerWorkflowDPL::fillTrackTablesPerCollision(int collisionID,
476503 if (trackIndex.isAmbiguous () && mGIDToTableMFTID .find (trackIndex) != mGIDToTableMFTID .end ()) { // was it already stored ?
477504 continue ;
478505 }
479- addToMFTTracksTable (mftTracksCursor, ambigMFTTracksCursor, trackIndex, data, collisionID, collisionBC, bcsMap);
506+ addToMFTTracksTable (mftTracksCursor, mftTracksCovCursor, ambigMFTTracksCursor, trackIndex, data, collisionID, collisionBC, bcsMap);
480507 mGIDToTableMFTID .emplace (trackIndex, mTableTrMFTID );
481508 mTableTrMFTID ++;
482509 } else if (src == GIndex::Source::MCH || src == GIndex::Source::MFTMCH || src == GIndex::Source::MCHMID) { // FwdTracks tracks are treated separately since they are stored in a different table
@@ -793,22 +820,24 @@ void AODProducerWorkflowDPL::addToFwdTracksTable(FwdTracksCursorType& fwdTracksC
793820 float sX = TMath::Sqrt (mfttrack.getSigma2X ()), sY = TMath::Sqrt (mfttrack.getSigma2Y ()), sPhi = TMath::Sqrt (mfttrack.getSigma2Phi ()),
794821 sTgl = TMath::Sqrt (mfttrack.getSigma2Tanl ()), sQ2Pt = TMath::Sqrt (mfttrack.getSigma2InvQPt ());
795822
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 )));
823+ if (!mStoreAllMFTCov ) {
824+ mftTracksCovCursor (fwdInfo.matchmfttrackid ,
825+ truncateFloatFraction (sX , mTrackCovDiag ),
826+ truncateFloatFraction (sY , mTrackCovDiag ),
827+ truncateFloatFraction (sPhi , mTrackCovDiag ),
828+ truncateFloatFraction (sTgl , mTrackCovDiag ),
829+ truncateFloatFraction (sQ2Pt , mTrackCovDiag ),
830+ (Char_t)(128 . * mfttrack.getCovariances ()(0 , 1 ) / (sX * sY )),
831+ (Char_t)(128 . * mfttrack.getCovariances ()(0 , 2 ) / (sPhi * sX )),
832+ (Char_t)(128 . * mfttrack.getCovariances ()(1 , 2 ) / (sPhi * sY )),
833+ (Char_t)(128 . * mfttrack.getCovariances ()(0 , 3 ) / (sTgl * sX )),
834+ (Char_t)(128 . * mfttrack.getCovariances ()(1 , 3 ) / (sTgl * sY )),
835+ (Char_t)(128 . * mfttrack.getCovariances ()(2 , 3 ) / (sTgl * sPhi )),
836+ (Char_t)(128 . * mfttrack.getCovariances ()(0 , 4 ) / (sQ2Pt * sX )),
837+ (Char_t)(128 . * mfttrack.getCovariances ()(1 , 4 ) / (sQ2Pt * sY )),
838+ (Char_t)(128 . * mfttrack.getCovariances ()(2 , 4 ) / (sQ2Pt * sPhi )),
839+ (Char_t)(128 . * mfttrack.getCovariances ()(3 , 4 ) / (sQ2Pt * sTgl )));
840+ }
812841 }
813842
814843 std::uint64_t bcOfTimeRef;
@@ -1700,6 +1729,7 @@ void AODProducerWorkflowDPL::init(InitContext& ic)
17001729 mThinTracks = ic.options ().get <bool >(" thin-tracks" );
17011730 mPropTracks = ic.options ().get <bool >(" propagate-tracks" );
17021731 mPropMuons = ic.options ().get <bool >(" propagate-muons" );
1732+ mStoreAllMFTCov = ic.options ().get <bool >(" store-all-mft-cov" );
17031733 if (auto s = ic.options ().get <std::string>(" with-streamers" ); !s.empty ()) {
17041734 mStreamerMask = static_cast <AODProducerStreamerMask>(std::stoul (s, nullptr , 2 ));
17051735 if (O2_ENUM_ANY_BIT (mStreamerMask )) {
@@ -3228,6 +3258,7 @@ DataProcessorSpec getAODProducerWorkflowSpec(GID::mask_t src, bool enableSV, boo
32283258 ConfigParamSpec{" propagate-tracks" , VariantType::Bool, false , {" Propagate tracks (not used for secondary vertices) to IP" }},
32293259 ConfigParamSpec{" hepmc-update" , VariantType::String, " always" , {" When to update HepMC Aux tables: always - force update, never - never update, all - if all keys are present, any - when any key is present (not valid yet)" }},
32303260 ConfigParamSpec{" propagate-muons" , VariantType::Bool, false , {" Propagate muons to IP" }},
3261+ ConfigParamSpec{" store-all-mft-cov" , VariantType::Bool, false , {" Store covariance matrices for all MFT tracks" }},
32313262 ConfigParamSpec{" thin-tracks" , VariantType::Bool, false , {" Produce thinned track tables" }},
32323263 ConfigParamSpec{" trackqc-fraction" , VariantType::Float, float (0.1 ), {" Fraction of tracks to QC" }},
32333264 ConfigParamSpec{" trackqc-NTrCut" , VariantType::Int64, 4L , {" Minimal length of the track - in amount of tracklets" }},
0 commit comments