1616#include " PWGMM/Mult/DataModel/bestCollisionTable.h"
1717
1818#include " Common/CCDB/EventSelectionParams.h"
19+ #include " Common/CCDB/RCTSelectionFlags.h"
1920#include " Common/Core/RecoDecay.h"
2021#include " Common/DataModel/CollisionAssociationTables.h"
2122#include " Common/DataModel/EventSelection.h"
5758#include < cstdlib>
5859#include < string>
5960#include < string_view>
61+ #include < unordered_map>
6062#include < vector>
6163
6264using namespace o2 ;
65+ using namespace o2 ::aod::rctsel;
6366using namespace o2 ::aod::track;
6467using namespace o2 ::constants::math;
6568using namespace o2 ::framework;
@@ -91,10 +94,20 @@ enum DataType {
9194 Mc
9295};
9396
94- enum EventSelectionStep {
95- AllEvents = 0 ,
96- AfterEventSelection,
97- NEventSelectionSteps
97+ enum SpecificEventSelectionStep {
98+ AllEventsPrecise = 0 ,
99+ HasMcCollision,
100+ IsSel8,
101+ IsNoSameBunchPileup,
102+ IsGoodItsLayersAll,
103+ IsGoodZvtxFT0vsPV,
104+ IsNoCollInRofStandard,
105+ IsNoCollInRofStrict,
106+ IsNoCollInTimeRangeStandard,
107+ IsNoCollInTimeRangeStrict,
108+ IsNoHighMultCollInPrevRof,
109+ IsRctFlagChecked,
110+ NSpecificEventSelectionSteps
98111};
99112
100113enum MonteCarloEventSelectionStep {
@@ -180,6 +193,9 @@ enum MultiplicityEstimators {
180193
181194static constexpr std::string_view WhatDataType[] = {" Data/" , " MC/" };
182195static constexpr std::string_view WhatMultiplicityEstimator[] = {" multNTracksPV" , " multNumContrib" , " multFT0C" , " multFT0M" };
196+ std::unordered_map<int , float > recoVtxX;
197+ std::unordered_map<int , float > recoVtxY;
198+ std::unordered_map<int , float > recoVtxZ;
183199
184200struct MftReassociationValidation {
185201
@@ -206,7 +222,17 @@ struct MftReassociationValidation {
206222 Configurable<int > minMultiplicity{" minMultiplicity" , 0 , " minimum multiplicity selection for collision" };
207223 Configurable<int > multiplicityEstimator{" multiplicityEstimator" , 0 , " 0: multNTracksPV, 1: numContrib, 2: multFT0C, 3: multFT0M, 4: centFT0C, 5: centFT0CVariants1s, 6: centFT0M, 7: centFV0A, 8: centNTracksPV, 9: centNGlobal, 10: centMFT" };
208224 Configurable<bool > isApplyNoCollInTimeRangeStrict{" isApplyNoCollInTimeRangeStrict" , false , " " };
225+ Configurable<bool > isApplyNoCollInTimeRangeStandard{" isApplyNoCollInTimeRangeStandard" , false , " " };
226+ Configurable<bool > isApplyNoCollInRofStrict{" isApplyNoCollInRofStrict" , false , " " };
227+ Configurable<bool > isApplyNoCollInRofStandard{" isApplyNoCollInRofStandard" , false , " " };
228+ Configurable<bool > isApplyNoHighMultCollInPrevRof{" isApplyNoHighMultCollInPrevRof" , false , " " };
209229 Configurable<float > zVertexMax{" zVertexMax" , 10 .0f , " Accepted z-vertex range" };
230+ Configurable<bool > requireRCTFlagChecker{" requireRCTFlagChecker" , false , " Check event quality in run condition table" };
231+ Configurable<bool > requireCorrelationAnalysisRCTFlagChecker{" requireCorrelationAnalysisRCTFlagChecker" , false , " Check event quality in run condition table for correlation analysis" };
232+ Configurable<std::string> setRCTFlagCheckerLabel{" setRCTFlagCheckerLabel" , " CBT_muon_global" , " Evt sel: RCT flag checker label" };
233+ Configurable<bool > requireRCTFlagCheckerLimitAcceptanceAsBad{" requireRCTFlagCheckerLimitAcceptanceAsBad" , true , " Evt sel: RCT flag checker treat Limited Acceptance As Bad" };
234+ Configurable<bool > requireZDCCheck{" requireZDCCheck" , false , " Evt sel: RCT flag checker ZDC check" };
235+ Configurable<std::string> rctFlagCheckerLabel{" rctFlagCheckerLabel" , " CBT_fw" , " Evt sel: RCT flag checker label" };
210236 } configCollision;
211237
212238 // configurables for MFT tracks
@@ -231,6 +257,8 @@ struct MftReassociationValidation {
231257 Service<o2::framework::O2DatabasePDG> pdg;
232258 Service<o2::ccdb::BasicCCDBManager> ccdb;
233259 o2::ccdb::CcdbApi ccdbApi;
260+ RCTFlagsChecker rctChecker;
261+ RCTFlagsChecker correlationAnalysisRctChecker{kFT0Bad , kITSBad , kTPCBadTracking , kMFTBad };
234262 std::array<std::shared_ptr<THnSparse>, MatchedToTrueCollisionStep::NMatchedToTrueCollisionSteps> hZVtxDiffAmbiguousTracks;
235263 std::array<std::shared_ptr<THnSparse>, MatchedToTrueCollisionStep::NMatchedToTrueCollisionSteps> hZVtxDiffNonAmbiguousTracks;
236264 std::array<std::shared_ptr<THnSparse>, MatchedToTrueCollisionStep::NMatchedToTrueCollisionSteps> hZVtxDiff2dReassociatedTracks;
@@ -454,6 +482,8 @@ struct MftReassociationValidation {
454482 ccdb->setCaching (true );
455483 ccdb->setLocalObjectValidityChecking ();
456484 ccdb->setCreatedNotAfter (std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now ().time_since_epoch ()).count ());
485+ rctChecker.init (configCollision.setRCTFlagCheckerLabel , configCollision.requireZDCCheck , configCollision.requireRCTFlagCheckerLimitAcceptanceAsBad );
486+ correlationAnalysisRctChecker.init ({kFT0Bad , kITSBad , kTPCBadTracking , kMFTBad }, configCollision.requireZDCCheck , configCollision.requireRCTFlagCheckerLimitAcceptanceAsBad );
457487
458488 // =========================
459489 // Event histograms
@@ -463,14 +493,24 @@ struct MftReassociationValidation {
463493 // registry.add("Data/hNTracks", "", {HistType::kTH1F, {configAxis.axisMultiplicity}});
464494 registry.add (Form (" Data/hMultiplicity_%s" , WhatMultiplicityEstimator[configCollision.multiplicityEstimator ].data ()), " " , {HistType::kTH1D , {configAxis.axisMultiplicity }});
465495
466- registry.add (" Data/hEventCounter" , " hEventCounter" , {HistType::kTH1D , {{EventSelectionStep::NEventSelectionSteps, -0.5 , +EventSelectionStep::NEventSelectionSteps - 0.5 }}});
467- std::string labels[EventSelectionStep::NEventSelectionSteps];
468- labels[EventSelectionStep::AllEvents] = " all" ;
469- labels[EventSelectionStep::AfterEventSelection] = " after Physics selection" ;
470- registry.get <TH1>(HIST (" Data/hEventCounter" ))->SetMinimum (0 );
471-
472- for (int iBin = 0 ; iBin < EventSelectionStep::NEventSelectionSteps; iBin++) {
473- registry.get <TH1>(HIST (" Data/hEventCounter" ))->GetXaxis ()->SetBinLabel (iBin + 1 , labels[iBin].data ());
496+ registry.add (" hPreciseEventCounter" , " hPreciseEventCounter" , {HistType::kTH1D , {{SpecificEventSelectionStep::NSpecificEventSelectionSteps, -0.5 , +SpecificEventSelectionStep::NSpecificEventSelectionSteps - 0.5 }}});
497+ std::string labels[SpecificEventSelectionStep::NSpecificEventSelectionSteps];
498+ labels[SpecificEventSelectionStep::AllEventsPrecise] = " all" ;
499+ labels[SpecificEventSelectionStep::HasMcCollision] = " has MC coll?" ;
500+ labels[SpecificEventSelectionStep::IsSel8] = " sel8" ;
501+ labels[SpecificEventSelectionStep::IsNoSameBunchPileup] = " IsNoSameBunchPileup" ;
502+ labels[SpecificEventSelectionStep::IsGoodItsLayersAll] = " IsGoodItsLayersAll" ;
503+ labels[SpecificEventSelectionStep::IsGoodZvtxFT0vsPV] = " IsGoodZvtxFT0vsPV" ;
504+ labels[SpecificEventSelectionStep::IsNoCollInRofStandard] = " IsNoCollInRofStandard" ;
505+ labels[SpecificEventSelectionStep::IsNoCollInRofStrict] = " IsNoCollInRofStrict" ;
506+ labels[SpecificEventSelectionStep::IsNoCollInTimeRangeStandard] = " IsNoCollInTimeRangeStandard" ;
507+ labels[SpecificEventSelectionStep::IsNoCollInTimeRangeStrict] = " IsNoCollInTimeRangeStrict" ;
508+ labels[SpecificEventSelectionStep::IsNoHighMultCollInPrevRof] = " IsNoHighMultCollInPrevRof" ;
509+ labels[SpecificEventSelectionStep::IsRctFlagChecked] = " IsRctFlagChecked" ;
510+ registry.get <TH1>(HIST (" hPreciseEventCounter" ))->SetMinimum (0 );
511+
512+ for (int iBin = 0 ; iBin < SpecificEventSelectionStep::NSpecificEventSelectionSteps; iBin++) {
513+ registry.get <TH1>(HIST (" hPreciseEventCounter" ))->GetXaxis ()->SetBinLabel (iBin + 1 , labels[iBin].data ());
474514 }
475515
476516 registry.add (" MC/hMonteCarloEventCounter" , " hMonteCarloEventCounter" , {HistType::kTH1D , {{MonteCarloEventSelectionStep::NMonteCarloEventSelectionSteps, -0.5 , +MonteCarloEventSelectionStep::NMonteCarloEventSelectionSteps - 0.5 }}});
@@ -573,28 +613,69 @@ struct MftReassociationValidation {
573613 template <typename TCollision>
574614 bool isAcceptedCollision (TCollision const & collision, bool fillHistograms = false )
575615 {
576- if (fillHistograms) {
577- registry.fill (HIST (" Data/hEventCounter" ), EventSelectionStep::AllEvents);
578- }
579616
580617 if (!collision.sel8 ()) {
581618 return false ;
582619 }
620+ if (fillHistograms) {
621+ registry.fill (HIST (" hPreciseEventCounter" ), SpecificEventSelectionStep::IsSel8);
622+ }
583623 if (configCollision.isApplySameBunchPileup && !collision.selection_bit (o2::aod::evsel::kNoSameBunchPileup )) {
584624 return false ;
585625 }
626+ if (fillHistograms) {
627+ registry.fill (HIST (" hPreciseEventCounter" ), SpecificEventSelectionStep::IsNoSameBunchPileup);
628+ }
629+ if (configCollision.isApplyGoodItsLayersAll && !collision.selection_bit (o2::aod::evsel::kIsGoodITSLayersAll )) {
630+ return false ;
631+ }
632+ if (fillHistograms) {
633+ registry.fill (HIST (" hPreciseEventCounter" ), SpecificEventSelectionStep::IsGoodItsLayersAll);
634+ }
586635 if (configCollision.isApplyGoodZvtxFT0vsPV && !collision.selection_bit (o2::aod::evsel::kIsGoodZvtxFT0vsPV )) {
587636 return false ;
588637 }
638+ if (fillHistograms) {
639+ registry.fill (HIST (" hPreciseEventCounter" ), SpecificEventSelectionStep::IsGoodZvtxFT0vsPV);
640+ }
641+ if (configCollision.isApplyNoCollInRofStandard && !collision.selection_bit (o2::aod::evsel::kNoCollInRofStandard )) {
642+ return false ;
643+ }
644+ if (fillHistograms) {
645+ registry.fill (HIST (" hPreciseEventCounter" ), SpecificEventSelectionStep::IsNoCollInRofStandard);
646+ }
647+ if (configCollision.isApplyNoCollInRofStrict && !collision.selection_bit (o2::aod::evsel::kNoCollInRofStrict )) {
648+ return false ;
649+ }
650+ if (fillHistograms) {
651+ registry.fill (HIST (" hPreciseEventCounter" ), SpecificEventSelectionStep::IsNoCollInRofStrict);
652+ }
653+ if (configCollision.isApplyNoCollInTimeRangeStandard && !collision.selection_bit (o2::aod::evsel::kNoCollInTimeRangeStandard )) {
654+ return false ;
655+ }
656+ if (fillHistograms) {
657+ registry.fill (HIST (" hPreciseEventCounter" ), SpecificEventSelectionStep::IsNoCollInTimeRangeStandard);
658+ }
589659 if (configCollision.isApplyNoCollInTimeRangeStrict && !collision.selection_bit (o2::aod::evsel::kNoCollInTimeRangeStrict )) {
590660 return false ;
591661 }
592- if (configCollision.isApplyGoodItsLayersAll && !collision.selection_bit (o2::aod::evsel::kIsGoodITSLayersAll )) {
662+ if (fillHistograms) {
663+ registry.fill (HIST (" hPreciseEventCounter" ), SpecificEventSelectionStep::IsNoCollInTimeRangeStrict);
664+ }
665+ if (configCollision.isApplyNoHighMultCollInPrevRof && !collision.selection_bit (o2::aod::evsel::kNoHighMultCollInPrevRof )) {
666+ return false ;
667+ }
668+ if (fillHistograms) {
669+ registry.fill (HIST (" hPreciseEventCounter" ), SpecificEventSelectionStep::IsNoHighMultCollInPrevRof);
670+ }
671+ if (configCollision.requireRCTFlagChecker && !rctChecker (collision)) {
672+ return false ;
673+ }
674+ if (configCollision.requireCorrelationAnalysisRCTFlagChecker && !correlationAnalysisRctChecker (collision)) {
593675 return false ;
594676 }
595-
596677 if (fillHistograms) {
597- registry.fill (HIST (" Data/hEventCounter " ), EventSelectionStep::AfterEventSelection );
678+ registry.fill (HIST (" hPreciseEventCounter " ), SpecificEventSelectionStep::IsRctFlagChecked );
598679 }
599680
600681 registry.fill (HIST (" Data/hVtxZ" ), collision.posZ ());
@@ -677,6 +758,7 @@ struct MftReassociationValidation {
677758 soa::SmallGroups<aod::BestCollisionsFwd> const & reassociated2dMftTracks,
678759 aod::BCsWithTimestamps const &)
679760 {
761+
680762 if (!(isAcceptedCollision (collision, true ))) {
681763 return ;
682764 }
@@ -704,26 +786,42 @@ struct MftReassociationValidation {
704786 }
705787 PROCESS_SWITCH (MftReassociationValidation, processData, " Process MFT reassociation validation for DATA" , false );
706788
789+ void processCreateLookupTable (FilteredCollisionsWSelMultMcLabels const & collisions)
790+ {
791+ recoVtxX.reserve (collisions.size ());
792+ recoVtxY.reserve (collisions.size ());
793+ recoVtxZ.reserve (collisions.size ());
794+
795+ for (auto const & col : collisions) {
796+ recoVtxX.emplace (col.globalIndex (), col.posX ());
797+ recoVtxY.emplace (col.globalIndex (), col.posY ());
798+ recoVtxZ.emplace (col.globalIndex (), col.posZ ());
799+ }
800+ }
801+ PROCESS_SWITCH (MftReassociationValidation, processCreateLookupTable, " Process look uptable creation" , false );
802+
707803 void processMcReassociated2d (FilteredCollisionsWSelMultMcLabels::iterator const & collision,
708804 FilteredMftTracksWCollsMcLabels const & /* mftTracks*/ ,
709805 soa::SmallGroups<MftReasso2dTracksWCollsMcLabels> const & reassociated2dMftTracks,
710806 aod::McCollisions const & /* mcCollisions*/ ,
711807 aod::McParticles const & /* particles*/ )
712808 {
713809 registry.fill (HIST (" MC/hMonteCarloEventCounter" ), MonteCarloEventSelectionStep::AllMonteCarloEvents);
810+ registry.fill (HIST (" hPreciseEventCounter" ), SpecificEventSelectionStep::AllEventsPrecise);
714811
715- if (!isAcceptedCollision (collision, false )) {
812+ if (!collision.has_mcCollision ()) {
813+ registry.fill (HIST (" MC/hMonteCarloEventCounter" ), MonteCarloEventSelectionStep::HasNotMonteCarloCollision);
716814 return ;
717815 }
718816
719- registry.fill (HIST (" MC/hMonteCarloEventCounter" ), MonteCarloEventSelectionStep::MonteCarloEventsAfterEventSelection);
817+ registry.fill (HIST (" MC/hMonteCarloEventCounter" ), MonteCarloEventSelectionStep::HasMonteCarloCollision);
818+ registry.fill (HIST (" hPreciseEventCounter" ), SpecificEventSelectionStep::HasMcCollision);
720819
721- if (!collision.has_mcCollision ()) {
722- registry.fill (HIST (" MC/hMonteCarloEventCounter" ), MonteCarloEventSelectionStep::HasNotMonteCarloCollision);
820+ if (!isAcceptedCollision (collision, true )) {
723821 return ;
724822 }
725823
726- registry.fill (HIST (" MC/hMonteCarloEventCounter" ), MonteCarloEventSelectionStep::HasMonteCarloCollision );
824+ registry.fill (HIST (" MC/hMonteCarloEventCounter" ), MonteCarloEventSelectionStep::MonteCarloEventsAfterEventSelection );
727825
728826 for (auto const & reassociated2dMftTrack : reassociated2dMftTracks) {
729827
@@ -749,14 +847,42 @@ struct MftReassociationValidation {
749847 float reassociatedDeltaX = -999 .f ;
750848 float reassociatedDeltaY = -999 .f ;
751849 float reassociatedDeltaZ = -999 .f ;
752- auto collision = templatedTrack.collision_as <FilteredCollisionsWSelMultMcLabels>();
753- auto mcCollision = particle.mcCollision_as <aod::McCollisions>();
754- deltaX = collision.posX () - mcCollision.posX ();
755- deltaY = collision.posY () - mcCollision.posY ();
756- deltaZ = collision.posZ () - mcCollision.posZ ();
757- reassociatedDeltaX = reassociated2dMftTrack.collision ().posX () - mcCollision.posX ();
758- reassociatedDeltaY = reassociated2dMftTrack.collision ().posY () - mcCollision.posY ();
759- reassociatedDeltaZ = reassociated2dMftTrack.collision ().posZ () - mcCollision.posZ ();
850+ // auto collision = templatedTrack.collision_as<FilteredCollisionsWSelMultMcLabels>();
851+ // auto mcCollision = particle.mcCollision_as<aod::McCollisions>();
852+ // deltaZ = collision.posZ() - mcCollision.posZ();
853+ auto xPosTrue = reassociated2dMftTrack.mcParticle ().mcCollision ().posX ();
854+ auto yPosTrue = reassociated2dMftTrack.mcParticle ().mcCollision ().posY ();
855+ auto zPosTrue = reassociated2dMftTrack.mcParticle ().mcCollision ().posZ ();
856+
857+ const int bestRecoCol = reassociated2dMftTrack.bestCollisionId ();
858+ // if (bestRecoCol < 0) {
859+ // // no associated reco collision -> skip or count separately
860+ // continue;
861+ // }
862+
863+ auto iteratorRecoVtxX = recoVtxX.find (bestRecoCol);
864+ auto iteratorRecoVtxY = recoVtxY.find (bestRecoCol);
865+ auto iteratorRecoVtxZ = recoVtxZ.find (bestRecoCol);
866+ if (iteratorRecoVtxX == recoVtxX.end ()) {
867+ // bestRecoCol not found in reco collisions map -> skip or count separately
868+ continue ;
869+ }
870+ if (iteratorRecoVtxY == recoVtxY.end ()) {
871+ // bestRecoCol not found in reco collisions map -> skip or count separately
872+ continue ;
873+ }
874+ if (iteratorRecoVtxZ == recoVtxZ.end ()) {
875+ // bestRecoCol not found in reco collisions map -> skip or count separately
876+ continue ;
877+ }
878+
879+ const float xReco = iteratorRecoVtxX->second ;
880+ const float yReco = iteratorRecoVtxY->second ;
881+ const float zReco = iteratorRecoVtxZ->second ;
882+
883+ reassociatedDeltaX = xReco - xPosTrue;
884+ reassociatedDeltaY = yReco - yPosTrue;
885+ reassociatedDeltaZ = zReco - zPosTrue;
760886
761887 if (reassociated2dMftTrack.ambDegree () > 1 ) { // AMBIGUOUS TRACKS
762888 registry.fill (HIST (" MC/hAmbiguityOfMftTracks" ), MftTrackAmbiguityStep::NumberOfAmbiguousTracks);
@@ -830,19 +956,21 @@ struct MftReassociationValidation {
830956 aod::McParticles const & /* particles*/ )
831957 {
832958 registry.fill (HIST (" MC/hMonteCarloEventCounter" ), MonteCarloEventSelectionStep::AllMonteCarloEvents);
959+ registry.fill (HIST (" hPreciseEventCounter" ), SpecificEventSelectionStep::AllEventsPrecise);
833960
834- if (!isAcceptedCollision (collision, false )) {
961+ if (!collision.has_mcCollision ()) {
962+ registry.fill (HIST (" MC/hMonteCarloEventCounter" ), MonteCarloEventSelectionStep::HasNotMonteCarloCollision);
835963 return ;
836964 }
837965
838- registry.fill (HIST (" MC/hMonteCarloEventCounter" ), MonteCarloEventSelectionStep::MonteCarloEventsAfterEventSelection);
966+ registry.fill (HIST (" MC/hMonteCarloEventCounter" ), MonteCarloEventSelectionStep::HasMonteCarloCollision);
967+ registry.fill (HIST (" hPreciseEventCounter" ), SpecificEventSelectionStep::HasMcCollision);
839968
840- if (!collision.has_mcCollision ()) {
841- registry.fill (HIST (" MC/hMonteCarloEventCounter" ), MonteCarloEventSelectionStep::HasNotMonteCarloCollision);
969+ if (!isAcceptedCollision (collision, true )) {
842970 return ;
843971 }
844972
845- registry.fill (HIST (" MC/hMonteCarloEventCounter" ), MonteCarloEventSelectionStep::HasMonteCarloCollision );
973+ registry.fill (HIST (" MC/hMonteCarloEventCounter" ), MonteCarloEventSelectionStep::MonteCarloEventsAfterEventSelection );
846974
847975 for (auto const & reassociated3dMftTrack : reassociated3dMftTracks) {
848976
@@ -868,14 +996,15 @@ struct MftReassociationValidation {
868996 float reassociatedDeltaX = -999 .f ;
869997 float reassociatedDeltaY = -999 .f ;
870998 float reassociatedDeltaZ = -999 .f ;
871- auto collision = templatedTrack.collision_as <FilteredCollisionsWSelMultMcLabels>();
872- auto mcCollision = particle.mcCollision_as <aod::McCollisions>();
873- deltaX = collision.posX () - mcCollision.posX ();
874- deltaY = collision.posY () - mcCollision.posY ();
875- deltaZ = collision.posZ () - mcCollision.posZ ();
876- reassociatedDeltaX = reassociated3dMftTrack.collision ().posX () - mcCollision.posX ();
877- reassociatedDeltaY = reassociated3dMftTrack.collision ().posY () - mcCollision.posY ();
878- reassociatedDeltaZ = reassociated3dMftTrack.collision ().posZ () - mcCollision.posZ ();
999+ // auto collision = templatedTrack.collision_as<FilteredCollisionsWSelMultMcLabels>();
1000+ // auto mcCollision = particle.mcCollision_as<aod::McCollisions>();
1001+ // deltaZ = collision.posZ() - mcCollision.posZ();
1002+ auto xPosTrue = reassociated3dMftTrack.mcParticle ().mcCollision ().posX ();
1003+ auto yPosTrue = reassociated3dMftTrack.mcParticle ().mcCollision ().posY ();
1004+ auto zPosTrue = reassociated3dMftTrack.mcParticle ().mcCollision ().posZ ();
1005+ reassociatedDeltaX = reassociated3dMftTrack.collision ().posX () - xPosTrue;
1006+ reassociatedDeltaY = reassociated3dMftTrack.collision ().posY () - yPosTrue;
1007+ reassociatedDeltaZ = reassociated3dMftTrack.collision ().posZ () - zPosTrue;
8791008
8801009 if (reassociated3dMftTrack.ambDegree () > 1 ) { // AMBIGUOUS TRACKS
8811010 registry.fill (HIST (" MC/hAmbiguityOfMftTracks" ), MftTrackAmbiguityStep::NumberOfAmbiguousTracks);
0 commit comments