@@ -900,6 +900,8 @@ static const PermMap *findPermByPrefix(
900900// follow the published parent permutation;
901901// * every fIndexTracks* / fIndexMFTTracks / fIndexFwdTracks reference is
902902// remapped through it in processPasteJoinTables.
903+ // * O2fwdtrack match indices (fIndexMFTTracks, fIndexFwdTracks_MatchMCHTrack)
904+ // are remapped here after MFT/Fwd permutations are known.
903905static bool isCollGroupedTrackTable (const std ::string & tname ) {
904906 static const char * kPrefixes [] = {"O2track_iu ", "O2track ",
905907 "O2mfttrack ", "O2fwdtrack "};
@@ -916,6 +918,8 @@ static void stage1b_reorderTrackTables(
916918 const PermMap * collPermP = findPermByPrefix (allPerms , "O2collision_" );
917919 if (!collPermP ) return ; // no collisions present — nothing to regroup against
918920
921+ std ::unordered_map < std ::string , std ::vector < Long64_t >> deferredFwd ;
922+
919923 TIter it (dirIn -> GetListOfKeys ());
920924 while (TKey * key = static_cast < TKey * > (it ())) {
921925 if (TString (key -> GetClassName ()) != "TTree" ) continue ;
@@ -960,9 +964,32 @@ static void stage1b_reorderTrackTables(
960964 rowOrder .reserve (nSrc );
961965 for (auto & e : entries ) rowOrder .push_back (e .srcRow );
962966
967+ PermMap srcToOut (nSrc , -1 );
968+ for (Long64_t outRow = 0 ; outRow < (Long64_t )rowOrder .size (); ++ outRow )
969+ srcToOut [rowOrder [outRow ]] = (Int_t )outRow ;
970+ allPerms [tname ] = std ::move (srcToOut );
971+
972+ if (TString (tname .c_str ()).BeginsWith ("O2fwdtrack" )) {
973+ deferredFwd [tname ] = std ::move (rowOrder );
974+ continue ;
975+ }
976+
963977 // Reorder rows and remap fIndexCollisions values through collPerm.
964- PermMap perm = rewriteTable (src , dirOut , rowOrder , "fIndexCollisions" , * collPermP );
965- allPerms [tname ] = std ::move (perm );
978+ rewriteTable (src , dirOut , rowOrder , "fIndexCollisions" , * collPermP );
979+ written .insert (tname );
980+ }
981+
982+ const PermMap * mftPerm = findPermByPrefix (allPerms , "O2mfttrack" );
983+ const PermMap * fwdPerm = findPermByPrefix (allPerms , "O2fwdtrack" );
984+ for (auto & [tname , rowOrder ] : deferredFwd ) {
985+ TTree * src = dynamic_cast < TTree * > (dirIn -> Get (tname .c_str ()));
986+ if (!src ) continue ;
987+ std ::vector < ExtraRemap > extraRemaps ;
988+ if (mftPerm && src -> GetBranch ("fIndexMFTTracks" ))
989+ extraRemaps .push_back ({"fIndexMFTTracks" , mftPerm });
990+ if (fwdPerm && src -> GetBranch ("fIndexFwdTracks_MatchMCHTrack" ))
991+ extraRemaps .push_back ({"fIndexFwdTracks_MatchMCHTrack" , fwdPerm });
992+ rewriteTable (src , dirOut , rowOrder , "fIndexCollisions" , * collPermP , extraRemaps );
966993 written .insert (tname );
967994 }
968995}
0 commit comments