Project
Loading...
Searching...
No Matches
TrackerSpec.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
16
18
19#include <chrono>
24#include "Framework/Logger.h"
25#include "Framework/Output.h"
26#include "Framework/Task.h"
33#include "MIDTracking/Tracker.h"
37
38namespace of = o2::framework;
39
40namespace o2
41{
42namespace mid
43{
45{
46 public:
47 TrackerDeviceDPL(std::shared_ptr<o2::base::GRPGeomRequest> gr, bool isMC, bool checkMasked) : mGGCCDBRequest(gr), mIsMC(isMC), mCheckMasked(checkMasked) {}
48 ~TrackerDeviceDPL() = default;
49
51 {
53 mKeepAll = !ic.options().get<bool>("mid-tracker-keep-best");
54
55 auto stop = [this]() {
56 double scaleFactor = (mNROFs == 0) ? 0. : 1.e6 / mNROFs;
57 LOG(info) << "Processing time / " << mNROFs << " ROFs: full: " << mTimer.count() * scaleFactor << " us tracking: " << mTimerTracker.count() * scaleFactor << " us hitMapBuilder: " << mTimerBuilder.count() << " us";
58 };
59 ic.services().get<of::CallbackService>().set<of::CallbackService::Id::Stop>(stop);
60 }
61
63 {
64 auto tStart = std::chrono::high_resolution_clock::now();
65 updateTimeDependentParams(pc);
66
67 auto clusters = pc.inputs().get<gsl::span<Cluster>>("mid_clusters");
68
69 auto inROFRecords = pc.inputs().get<gsl::span<ROFRecord>>("mid_clusters_rof");
70
71 auto tAlgoStart = std::chrono::high_resolution_clock::now();
72 mTracker->process(clusters, inROFRecords);
73 mTimerTracker += std::chrono::high_resolution_clock::now() - tAlgoStart;
74
75 tAlgoStart = std::chrono::high_resolution_clock::now();
76 std::vector<Track> tracks = mTracker->getTracks();
77 mHitMapBuilder->process(tracks, clusters);
78 mTimerBuilder += std::chrono::high_resolution_clock::now() - tAlgoStart;
79
80 if (mIsMC) {
81 std::unique_ptr<const o2::dataformats::MCTruthContainer<MCClusterLabel>> labels = pc.inputs().get<const o2::dataformats::MCTruthContainer<MCClusterLabel>*>("mid_clusterlabels");
82 mTrackLabeler.process(mTracker->getClusters(), tracks, *labels);
83 pc.outputs().snapshot(of::Output{"MID", "TRACKLABELS", 0}, mTrackLabeler.getTracksLabels());
84 LOG(debug) << "Sent " << mTrackLabeler.getTracksLabels().size() << " indexed tracks.";
85 pc.outputs().snapshot(of::Output{"MID", "TRCLUSLABELS", 0}, mTrackLabeler.getTrackClustersLabels());
86 LOG(debug) << "Sent " << mTrackLabeler.getTrackClustersLabels().getIndexedSize() << " indexed track clusters.";
87 }
88
89 pc.outputs().snapshot(of::Output{"MID", "TRACKS", 0}, tracks);
90 LOG(debug) << "Sent " << tracks.size() << " tracks.";
91 pc.outputs().snapshot(of::Output{"MID", "TRACKCLUSTERS", 0}, mTracker->getClusters());
92 LOG(debug) << "Sent " << mTracker->getClusters().size() << " track clusters.";
93
94 pc.outputs().snapshot(of::Output{"MID", "TRACKROFS", 0}, mTracker->getTrackROFRecords());
95 LOG(debug) << "Sent " << mTracker->getTrackROFRecords().size() << " ROFs.";
96 pc.outputs().snapshot(of::Output{"MID", "TRCLUSROFS", 0}, mTracker->getClusterROFRecords());
97 LOG(debug) << "Sent " << mTracker->getClusterROFRecords().size() << " ROFs.";
98
99 mTimer += std::chrono::high_resolution_clock::now() - tStart;
100 mNROFs += inROFRecords.size();
101 }
102
104 {
106 return;
107 }
108 if (mCheckMasked) {
109 bool rebuildMaskedChannels = false;
110 if (matcher == of::ConcreteDataMatcher(header::gDataOriginMID, "BAD_CH_TRK", 0)) {
111 LOG(info) << "Update MID_BAD_CH_TRK";
112 mBadChannels = *static_cast<std::vector<ColumnData>*>(obj);
113 rebuildMaskedChannels = true;
114 } else if (matcher == of::ConcreteDataMatcher(header::gDataOriginMID, "REJECTLIST_TRK", 0)) {
115 LOG(info) << "Update MID_REJECTLIST_TRK";
116 mRejectList = *static_cast<std::vector<ColumnData>*>(obj);
117 rebuildMaskedChannels = true;
118 }
119 if (rebuildMaskedChannels) {
120 mHitMapBuilder->setMaskedChannels(mBadChannels, true);
121 mHitMapBuilder->setMaskedChannels(mRejectList, false);
122 }
123 }
124 }
125
126 private:
127 void updateTimeDependentParams(o2::framework::ProcessingContext& pc)
128 {
129 // Triggers finalizeCCDB
131 static bool initOnceDone = false;
132 if (!initOnceDone) {
133 initOnceDone = true;
134 auto geoTrans = createTransformationFromManager(gGeoManager);
135 mTracker = std::make_unique<Tracker>(geoTrans);
136 if (!mTracker->init(mKeepAll)) {
137 LOG(error) << "Initialization of MID tracker device failed";
138 }
139 mHitMapBuilder = std::make_unique<HitMapBuilder>(geoTrans);
140 }
141 pc.inputs().get<std::vector<ColumnData>*>("mid_bad_channels_forTracks");
142 pc.inputs().get<std::vector<ColumnData>*>("mid_rejectlist_forTracks");
143 }
144
145 bool mIsMC = false;
146 bool mKeepAll = false;
147 bool mCheckMasked = false;
148 TrackLabeler mTrackLabeler{};
149 std::shared_ptr<o2::base::GRPGeomRequest> mGGCCDBRequest;
150 std::unique_ptr<Tracker> mTracker{nullptr};
151 std::unique_ptr<HitMapBuilder> mHitMapBuilder{nullptr};
152 std::chrono::duration<double> mTimer{0};
153 std::chrono::duration<double> mTimerTracker{0};
154 std::chrono::duration<double> mTimerBuilder{0};
155 unsigned int mNROFs{0};
156 std::vector<ColumnData> mBadChannels{};
157 std::vector<ColumnData> mRejectList{};
158};
159
161{
162 std::vector<of::InputSpec> inputSpecs;
163 inputSpecs.emplace_back("mid_clusters", header::gDataOriginMID, "CLUSTERS");
164 inputSpecs.emplace_back("mid_clusters_rof", header::gDataOriginMID, "CLUSTERSROF");
165 inputSpecs.emplace_back("mid_bad_channels_forTracks", header::gDataOriginMID, "BAD_CH_TRK", 0, of::Lifetime::Condition, of::ccdbParamSpec("MID/Calib/BadChannels"));
166 inputSpecs.emplace_back("mid_rejectlist_forTracks", header::gDataOriginMID, "REJECTLIST_TRK", 0, of::Lifetime::Condition, of::ccdbParamSpec("MID/Calib/RejectList"));
167 auto ggRequest = std::make_shared<o2::base::GRPGeomRequest>(false, // orbitResetTime
168 false, // GRPECS=true
169 false, // GRPLHCIF
170 false, // GRPMagField
171 false, // askMatLUT
173 inputSpecs,
174 true);
175 std::vector<of::OutputSpec> outputSpecs{
177 of::OutputSpec{header::gDataOriginMID, "TRACKCLUSTERS"},
180
181 if (isMC) {
182 inputSpecs.emplace_back(of::InputSpec{"mid_clusterlabels", header::gDataOriginMID, "CLUSTERSLABELS"});
183
184 outputSpecs.emplace_back(of::OutputSpec{header::gDataOriginMID, "TRACKLABELS"});
185 outputSpecs.emplace_back(of::OutputSpec{header::gDataOriginMID, "TRCLUSLABELS"});
186 }
187
189 "MIDTracker",
190 {inputSpecs},
191 {outputSpecs},
192 of::adaptFromTask<o2::mid::TrackerDeviceDPL>(ggRequest, isMC, checkMasked),
193 of::Options{{"mid-tracker-keep-best", of::VariantType::Bool, false, {"Keep only best track (default is keep all)"}}}};
194}
195} // namespace mid
196} // namespace o2
Reconstructed MID cluster.
Reconstructed MID track.
Definition of the GeometryManager class.
Helper for geometry and GRP related CCDB requests.
Utility to build the MID track hit maps.
Label for MID clusters.
Track reconstruction algorithm for MID.
Data processor spec for MID tracker device.
Definition of the MID event record.
Definition of the Names Generator class.
Tracks labeler for MID.
std::ostringstream debug
void checkUpdates(o2::framework::ProcessingContext &pc)
static GRPGeomHelper & instance()
void setRequest(std::shared_ptr< GRPGeomRequest > req)
A container to hold and manage MC truth information/labels.
void snapshot(const Output &spec, T const &object)
ServiceRegistryRef services()
Definition InitContext.h:34
ConfigParamRegistry const & options()
Definition InitContext.h:33
decltype(auto) get(R binding, int part=0) const
DataAllocator & outputs()
The data allocator is used to allocate memory for the output data.
InputRecord & inputs()
The inputs associated with this processing context.
const o2::dataformats::MCTruthContainer< MCClusterLabel > & getTrackClustersLabels()
Returns the cluster labels.
void process(gsl::span< const Cluster > clusters, gsl::span< const Track > tracks, const o2::dataformats::MCTruthContainer< MCClusterLabel > &inMCContainer)
const std::vector< MCCompLabel > & getTracksLabels()
Returns the tracks labels.
void run(o2::framework::ProcessingContext &pc)
void finaliseCCDB(o2::framework::ConcreteDataMatcher &matcher, void *obj)
void init(o2::framework::InitContext &ic)
TrackerDeviceDPL(std::shared_ptr< o2::base::GRPGeomRequest > gr, bool isMC, bool checkMasked)
constexpr o2::header::DataOrigin gDataOriginMID
Definition DataHeader.h:573
Defining PrimaryVertex explicitly as messageable.
Definition TFIDInfo.h:20
std::vector< ConfigParamSpec > ccdbParamSpec(std::string const &path, int runDependent, std::vector< CCDBMetadata > metadata={}, int qrate=0)
std::vector< ConfigParamSpec > Options
framework::DataProcessorSpec getTrackerSpec(bool isMC, bool checkMasked)
GeometryTransformer createTransformationFromManager(const TGeoManager *geoManager)
std::vector< Cluster > clusters
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"