2727#include " DataFormatsTPC/VDriftCorrFact.h"
2828#include < fairlogger/Logger.h>
2929#include < set>
30+ #include < algorithm>
31+ #include < random>
3032
3133using namespace o2 ::tpc;
3234using GTrackID = o2::dataformats::GlobalTrackID;
@@ -55,7 +57,7 @@ void TrackInterpolation::init()
5557 LOG (info) << " Done initializing TrackInterpolation" ;
5658}
5759
58- void TrackInterpolation::process (const o2::globaltracking::RecoContainer& inp, const std::vector<GTrackID>& gids, const std::vector<o2::globaltracking::RecoContainer::GlobalIDSet>& gidTables, std::vector<o2::track::TrackParCov>& seeds, const std::vector<float >& trkTimes)
60+ void TrackInterpolation::process (const o2::globaltracking::RecoContainer& inp, const std::vector<GTrackID>& gids, const std::vector<o2::globaltracking::RecoContainer::GlobalIDSet>& gidTables, std::vector<o2::track::TrackParCov>& seeds, const std::vector<float >& trkTimes, const std::unordered_map< int , int >& trkCounters )
5961{
6062 // main processing function
6163
@@ -80,11 +82,29 @@ void TrackInterpolation::process(const o2::globaltracking::RecoContainer& inp, c
8082 mTrackData .reserve (nSeeds);
8183 mClRes .reserve (nSeeds * param::NPadRows);
8284
85+ // In case we have more input tracks available than are required per TF
86+ // we want to sample them. But we still prefer global ITS-TPC-TRD-TOF tracks
87+ // over ITS-TPC-TRD tracks and so on. So we have to shuffle the indices
88+ // in blocks.
89+ // The input GIDs are sorted. ITS-TPC-TRD-TOF are first followed by ITS-TPC-TRD,
90+ // ITS-TPC-TOF and ITS-TPC
91+ std::random_device rd;
92+ std::mt19937 g (rd ());
93+ std::vector<int > trackIndices (nSeeds);
94+ std::iota (trackIndices.begin (), trackIndices.end (), 0 );
95+ std::shuffle (trackIndices.begin (), trackIndices.begin () + trkCounters.at (GTrackID::Source::ITSTPCTRDTOF ), g);
96+ int nTracks = trkCounters.at (GTrackID::Source::ITSTPCTRDTOF );
97+ std::shuffle (trackIndices.begin () + nTracks, trackIndices.begin () + nTracks + trkCounters.at (GTrackID::Source::ITSTPCTRD ), g);
98+ nTracks += trkCounters.at (GTrackID::Source::ITSTPCTRD );
99+ std::shuffle (trackIndices.begin () + nTracks, trackIndices.begin () + nTracks + trkCounters.at (GTrackID::Source::ITSTPCTOF ), g);
100+ nTracks += trkCounters.at (GTrackID::Source::ITSTPCTOF );
101+ std::shuffle (trackIndices.begin () + nTracks, trackIndices.begin () + nTracks + trkCounters.at (GTrackID::Source::ITSTPC ), g);
102+
83103 for (int iSeed = 0 ; iSeed < nSeeds; ++iSeed) {
84- if (gids[iSeed].includesDet (DetID::TRD ) || gids[iSeed].includesDet (DetID::TOF )) {
85- interpolateTrack (iSeed);
104+ if (gids[trackIndices[ iSeed]] .includesDet (DetID::TRD ) || gids[trackIndices[ iSeed] ].includesDet (DetID::TOF )) {
105+ interpolateTrack (trackIndices[ iSeed] );
86106 } else {
87- extrapolateTrack (iSeed);
107+ extrapolateTrack (trackIndices[ iSeed] );
88108 }
89109 if (mMaxTracksPerTF >= 0 && mTrackDataCompact .size () >= mMaxTracksPerTF ) {
90110 LOG (info) << " Maximum number of tracks per TF reached. Skipping the remaining " << nSeeds - iSeed << " tracks." ;
@@ -277,14 +297,6 @@ void TrackInterpolation::interpolateTrack(int iSeed)
277297 trackData.nTrkltsTRD = gidTable[GTrackID::TRD ].isIndexSet () ? mRecoCont ->getITSTPCTRDTrack <o2::trd::TrackTRD>(gidTable[GTrackID::ITSTPCTRD ]).getNtracklets () : 0 ;
278298 trackData.clAvailTOF = gidTable[GTrackID::TOF ].isIndexSet () ? 1 : 0 ;
279299
280- /*
281- // FIXME
282-
283- Calculate number of tracks required per TF based on calibration slot length
284- In case too many tracks available, use std::sample algorithm to take random sample of input tracks
285- (make sure to use first most global tracks, then ITS-TPC-TRD, then ITS-TPC-TOF)
286- */
287-
288300 TrackParams params; // for refitted track parameters and flagging rejected clusters
289301 if (validateTrack (trackData, params, clusterResiduals)) {
290302 // track is good
0 commit comments