Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions Detectors/ITSMFT/ITS/tracking/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,11 @@ o2_add_library(ITStracking
O2::ITSMFTReconstruction
O2::DataFormatsITS)

if (OpenMP_CXX_FOUND)
target_compile_definitions(${targetName} PRIVATE WITH_OPENMP)
target_link_libraries(${targetName} PRIVATE OpenMP::OpenMP_CXX)
endif()

o2_target_root_dictionary(ITStracking
HEADERS include/ITStracking/ClusterLines.h
include/ITStracking/Tracklet.h
Expand Down
3 changes: 3 additions & 0 deletions Detectors/ITSMFT/ITS/tracking/include/ITStracking/Tracker.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,8 @@ class Tracker
// GPU-specific interfaces
TimeFrame* getTimeFrameGPU();
void loadToDevice();
void setNThreads(int n);
int getNThreads() const { return mNThreads; }

private:
track::TrackParCov buildTrackSeed(const Cluster& cluster1, const Cluster& cluster2, const Cluster& cluster3,
Expand Down Expand Up @@ -107,6 +109,7 @@ class Tracker
std::vector<MemoryParameters> mMemParams;
std::vector<TrackingParameters> mTrkParams;

int mNThreads = 1;
bool mCUDA = false;
bool mApplySmoothing = false;
o2::base::PropagatorImpl<float>::MatCorrType mCorrType = o2::base::PropagatorImpl<float>::MatCorrType::USEMatCorrNONE;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ struct TrackerParamConfig : public o2::conf::ConfigurableParamHelper<TrackerPara

// Use TGeo for mat. budget
bool useMatCorrTGeo = false;
bool useFastMaterial = false;
float sysErrY2[7] = {0}; // systematic error^2 in Y per layer
float sysErrZ2[7] = {0}; // systematic error^2 in Z per layer
float nSigmaCut = -1.f;
Expand All @@ -56,6 +57,7 @@ struct TrackerParamConfig : public o2::conf::ConfigurableParamHelper<TrackerPara
float cellsPerClusterLimit = -1.f;
float trackletsPerClusterLimit = -1.f;
int findShortTracks = -1;
int nThreads = 1;

O2ParamDef(TrackerParamConfig, "ITSCATrackerParam");
};
Expand Down
43 changes: 37 additions & 6 deletions Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@
#include <string>
#include <climits>

#ifdef WITH_OPENMP
#include <omp.h>
#endif

namespace o2
{
namespace its
Expand Down Expand Up @@ -80,6 +84,7 @@ void Tracker::clustersToTracks(std::function<void(std::string s)> logger, std::f

total += evaluateTask(&Tracker::findCellsNeighbours, "Neighbour finding", logger, iteration);
total += evaluateTask(&Tracker::findRoads, "Road finding", logger, iteration);
logger(fmt::format("\t- Number of Roads: {}", mTimeFrame->getRoads().size()));
total += evaluateTask(&Tracker::findTracks, "Track finding", logger);
total += evaluateTask(&Tracker::extendTracks, "Extending tracks", logger);
}
Expand All @@ -90,7 +95,7 @@ void Tracker::clustersToTracks(std::function<void(std::string s)> logger, std::f
std::stringstream sstream;
if (constants::DoTimeBenchmarks) {
sstream << std::setw(2) << " - "
<< "Timeframe " << mTimeFrameCounter++ << " processing completed in: " << total << "ms";
<< "Timeframe " << mTimeFrameCounter++ << " processing completed in: " << total << "ms using " << mNThreads << " threads.";
}
logger(sstream.str());

Expand Down Expand Up @@ -259,9 +264,12 @@ void Tracker::findRoads(int& iteration)

void Tracker::findTracks()
{
std::vector<TrackITSExt> tracks;
tracks.reserve(mTimeFrame->getRoads().size());
std::vector<std::vector<TrackITSExt>> tracks(mNThreads);
for (auto& tracksV : tracks) {
tracksV.reserve(mTimeFrame->getRoads().size() / mNThreads);
}

#pragma omp parallel for num_threads(mNThreads)
for (auto& road : mTimeFrame->getRoads()) {
std::vector<int> clusters(mTrkParams[0].NLayers, constants::its::UnusedIndex);
int lastCellLevel = constants::its::UnusedIndex;
Expand Down Expand Up @@ -352,16 +360,25 @@ void Tracker::findTracks()
continue;
}
// temporaryTrack.setROFrame(rof);
tracks.emplace_back(temporaryTrack);
#ifdef WITH_OPENMP
int iThread = omp_get_thread_num();
#else
int iThread = 0;
#endif
tracks[iThread].emplace_back(temporaryTrack);
}

for (int iV{1}; iV < mNThreads; ++iV) {
tracks[0].insert(tracks[0].end(), tracks[iV].begin(), tracks[iV].end());
}

if (mApplySmoothing) {
// Smoothing tracks
}
std::sort(tracks.begin(), tracks.end(),
std::sort(tracks[0].begin(), tracks[0].end(),
[](TrackITSExt& track1, TrackITSExt& track2) { return track1.isBetter(track2, 1.e6f); });

for (auto& track : tracks) {
for (auto& track : tracks[0]) {
int nShared = 0;
for (int iLayer{0}; iLayer < mTrkParams[0].NLayers; ++iLayer) {
if (track.getClusterIndex(iLayer) == constants::its::UnusedIndex) {
Expand Down Expand Up @@ -831,7 +848,12 @@ void Tracker::getGlobalConfiguration()
auto& tc = o2::its::TrackerParamConfig::Instance();
if (tc.useMatCorrTGeo) {
setCorrType(o2::base::PropagatorImpl<float>::MatCorrType::USEMatCorrTGeo);
} else if (tc.useFastMaterial) {
setCorrType(o2::base::PropagatorImpl<float>::MatCorrType::USEMatCorrNONE);
} else {
setCorrType(o2::base::PropagatorImpl<float>::MatCorrType::USEMatCorrLUT);
}
setNThreads(tc.nThreads);
for (auto& params : mTrkParams) {
if (params.NLayers == 7) {
for (int i{0}; i < 7; ++i) {
Expand Down Expand Up @@ -878,5 +900,14 @@ void Tracker::setBz(float bz)
mTimeFrame->setBz(bz);
}

void Tracker::setNThreads(int n)
{
#ifdef WITH_OPENMP
mNThreads = n > 0 ? n : 1;
#else
mNThreads = 1;
#endif
}

} // namespace its
} // namespace o2
48 changes: 25 additions & 23 deletions Detectors/ITSMFT/ITS/workflow/src/TrackerSpec.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -81,21 +81,24 @@ void TrackerDPL::init(InitContext& ic)

} else if (mMode == "sync_misaligned") {

trackParams.resize(1);
trackParams.resize(3);
trackParams[0].PhiBins = 32;
trackParams[0].ZBins = 64;
trackParams[0].CellDeltaTanLambdaSigma *= 10;
trackParams[0].LayerMisalignment[0] = 3.e-2;
trackParams[0].LayerMisalignment[1] = 3.e-2;
trackParams[0].LayerMisalignment[2] = 3.e-2;
trackParams[0].LayerMisalignment[3] = 1.e-1;
trackParams[0].LayerMisalignment[4] = 1.e-1;
trackParams[0].LayerMisalignment[5] = 1.e-1;
trackParams[0].LayerMisalignment[6] = 1.e-1;
trackParams[0].FitIterationMaxChi2[0] = 100.;
trackParams[0].FitIterationMaxChi2[1] = 50.;
trackParams[0].MinTrackLength = 4;
memParams.resize(1);
trackParams[0].CellDeltaTanLambdaSigma *= 3.;
trackParams[0].LayerMisalignment[0] = 1.e-2;
trackParams[0].LayerMisalignment[1] = 1.e-2;
trackParams[0].LayerMisalignment[2] = 1.e-2;
trackParams[0].LayerMisalignment[3] = 3.e-2;
trackParams[0].LayerMisalignment[4] = 3.e-2;
trackParams[0].LayerMisalignment[5] = 3.e-2;
trackParams[0].LayerMisalignment[6] = 3.e-2;
trackParams[0].FitIterationMaxChi2[0] = 50.;
trackParams[0].FitIterationMaxChi2[1] = 25.;
trackParams[1] = trackParams[0];
trackParams[2] = trackParams[0];
trackParams[1].MinTrackLength = 6;
trackParams[2].MinTrackLength = 4;
memParams.resize(3);
LOG(info) << "Initializing tracker in misaligned sync. phase reconstruction with " << trackParams.size() << " passes";

} else if (mMode == "sync") {
Expand All @@ -112,15 +115,15 @@ void TrackerDPL::init(InitContext& ic)
trackParams[0].PhiBins = 4;
trackParams[0].ZBins = 16;
trackParams[0].PVres = 1.e5f;
trackParams[0].LayerMisalignment[0] = 3.e-2;
trackParams[0].LayerMisalignment[1] = 3.e-2;
trackParams[0].LayerMisalignment[2] = 3.e-2;
trackParams[0].LayerMisalignment[3] = 1.e-1;
trackParams[0].LayerMisalignment[4] = 1.e-1;
trackParams[0].LayerMisalignment[5] = 1.e-1;
trackParams[0].LayerMisalignment[6] = 1.e-1;
trackParams[0].FitIterationMaxChi2[0] = 100.;
trackParams[0].FitIterationMaxChi2[1] = 50.;
trackParams[0].LayerMisalignment[0] = 1.e-2;
trackParams[0].LayerMisalignment[1] = 1.e-2;
trackParams[0].LayerMisalignment[2] = 1.e-2;
trackParams[0].LayerMisalignment[3] = 3.e-2;
trackParams[0].LayerMisalignment[4] = 3.e-2;
trackParams[0].LayerMisalignment[5] = 3.e-2;
trackParams[0].LayerMisalignment[6] = 3.e-2;
trackParams[0].FitIterationMaxChi2[0] = 50.;
trackParams[0].FitIterationMaxChi2[1] = 25.;
trackParams[0].TrackletsPerClusterLimit = 100.;
trackParams[0].CellsPerClusterLimit = 100.;
LOG(info) << "Initializing tracker in reconstruction for cosmics with " << trackParams.size() << " passes";
Expand Down Expand Up @@ -318,7 +321,6 @@ void TrackerDPL::updateTimeDependentParams(ProcessingContext& pc)
pc.inputs().get<o2::itsmft::DPLAlpideParam<o2::detectors::DetID::ITS>*>("alppar");
GeometryTGeo* geom = GeometryTGeo::Instance();
geom->fillMatrixCache(o2::math_utils::bit2Mask(o2::math_utils::TransformType::T2L, o2::math_utils::TransformType::T2GRot, o2::math_utils::TransformType::T2G));
mTracker->setCorrType(o2::base::PropagatorImpl<float>::MatCorrType::USEMatCorrLUT); /// TODO: eventually remove this in favour of the one below
mVertexer->getGlobalConfiguration();
mTracker->getGlobalConfiguration();
}
Expand Down