Project
Loading...
Searching...
No Matches
TPCITSMatchingSpec.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
13
14#include <vector>
15
21#include "Framework/Task.h"
25#include <string>
26#include "TStopwatch.h"
47#include "Headers/DataHeader.h"
53#include "TPCFastTransformPOD.h"
54
55#ifdef ENABLE_UPGRADES
57#endif
58
59using namespace o2::framework;
61using MCLabelsTr = gsl::span<const o2::MCCompLabel>;
63
64namespace o2
65{
66namespace globaltracking
67{
68
69class TPCITSMatchingDPL : public Task
70{
71 public:
72 TPCITSMatchingDPL(std::shared_ptr<DataRequest> dr, std::shared_ptr<o2::base::GRPGeomRequest> gr,
73 bool useFT0, bool calib, bool skipTPCOnly, bool useMC, bool requestCTPLumi)
74 : mDataRequest(dr), mGGCCDBRequest(gr), mUseFT0(useFT0), mCalibMode(calib), mSkipTPCOnly(skipTPCOnly), mUseMC(useMC), mRequestCTPLumi(requestCTPLumi) {}
75 ~TPCITSMatchingDPL() override = default;
76 void init(InitContext& ic) final;
77 void run(ProcessingContext& pc) final;
79 void finaliseCCDB(framework::ConcreteDataMatcher& matcher, void* obj) final;
80
81 private:
82 void updateTimeDependentParams(ProcessingContext& pc);
83 std::shared_ptr<DataRequest> mDataRequest;
84 std::shared_ptr<o2::base::GRPGeomRequest> mGGCCDBRequest;
85 o2::tpc::VDriftHelper mTPCVDriftHelper{};
86 const o2::gpu::TPCFastTransformPOD* mTPCCorrMaps{};
87 o2::globaltracking::MatchTPCITS mMatching; // matching engine
88 bool mUseFT0 = false;
89 bool mCalibMode = false;
90 bool mSkipTPCOnly = false; // to use only externally constrained tracks (for test only)
91 bool mUseMC = true;
92 bool mRequestCTPLumi = false;
93 TStopwatch mTimer;
94};
95
97{
98 mTimer.Stop();
99 mTimer.Reset();
100 int lane = ic.services().get<const o2::framework::DeviceSpec>().inputTimesliceId;
101 int maxLanes = ic.services().get<const o2::framework::DeviceSpec>().maxInputTimeslices;
102 mMatching.setDebugTreeFileName(maxLanes == 1 ? "dbg_TPCITSmatch.root" : fmt::format("dbg_TPCITSmatch_{}.root", lane));
104 mMatching.setNThreads(std::max(1, ic.options().get<int>("nthreads")));
105 mMatching.setUseBCFilling(!ic.options().get<bool>("ignore-bc-check"));
106 mMatching.setDebugFlag(ic.options().get<int>("debug-tree-flags"));
107}
108
110{
111 mTimer.Start(false);
112 RecoContainer recoData;
113 recoData.collectData(pc, *mDataRequest.get());
114 updateTimeDependentParams(pc); // Make sure this is called after recoData.collectData, which may load some conditions
115
116 static pmr::vector<o2::MCCompLabel> dummyMCLab, dummyMCLabAB;
118
119 auto& matchedTracks = pc.outputs().make<std::vector<o2::dataformats::TrackTPCITS>>(Output{"GLO", "TPCITS", 0});
120 auto& ABTrackletRefs = pc.outputs().make<std::vector<o2::itsmft::TrkClusRef>>(Output{"GLO", "TPCITSAB_REFS", 0});
121 auto& ABTrackletClusterIDs = pc.outputs().make<std::vector<int>>(Output{"GLO", "TPCITSAB_CLID", 0});
122 auto& matchLabels = mUseMC ? pc.outputs().make<std::vector<o2::MCCompLabel>>(Output{"GLO", "TPCITS_MC", 0}) : dummyMCLab;
123 auto& ABTrackletLabels = mUseMC ? pc.outputs().make<std::vector<o2::MCCompLabel>>(Output{"GLO", "TPCITSAB_MC", 0}) : dummyMCLabAB;
124 auto& calib = mCalibMode ? pc.outputs().make<std::vector<o2::dataformats::Triplet<float, float, float>>>(Output{"GLO", "TPCITS_VDTGL", 0}) : dummyCalib;
125
126 mMatching.run(recoData, matchedTracks, ABTrackletRefs, ABTrackletClusterIDs, matchLabels, ABTrackletLabels, calib);
127
128 static bool first = true;
129 if (first) {
130 first = false;
133 }
134 }
135
136 mTimer.Stop();
137}
138
140{
141 mMatching.end();
142 LOGF(info, "TPC-ITS matching total timing: Cpu: %.3e Real: %.3e s in %d slots",
143 mTimer.CpuTime(), mTimer.RealTime(), mTimer.Counter() - 1);
144 mMatching.reportTiming();
145}
146
148{
150 return;
151 }
152 if (mTPCVDriftHelper.accountCCDBInputs(matcher, obj)) {
153 return;
154 }
155 if (matcher == ConcreteDataMatcher("GLO", "ITSTPCPARAM", 0)) {
156 LOG(info) << "ITS-TPC Matching params updated from ccdb";
157 return;
158 }
159 if (matcher == ConcreteDataMatcher("ITS", "CLUSDICT", 0)) {
160 LOG(info) << "its cluster dictionary updated";
162 return;
163 }
164 if (matcher == ConcreteDataMatcher("ITS", "ALPIDEPARAM", 0)) {
165 LOG(info) << "ITS Alpide param updated";
167 par.printKeyValues();
168 return;
169 }
170 if (matcher == ConcreteDataMatcher("ITS", "GEOMTGEO", 0)) {
171 LOG(info) << "ITS GeometryTGeo loaded from ccdb";
173 return;
174 }
175#ifdef ENABLE_UPGRADES
176 if (matcher == ConcreteDataMatcher("IT3", "CLUSDICT", 0)) {
177 LOG(info) << "it3 cluster dictionary updated";
178 mMatching.setIT3Dictionary((const o2::its3::TopologyDictionary*)obj);
179 return;
180 }
181#endif
182}
183
184void TPCITSMatchingDPL::updateTimeDependentParams(ProcessingContext& pc)
185{
187 mTPCVDriftHelper.extractCCDBInputs(pc);
188 auto const& raw = pc.inputs().get<const char*>("corrMap");
189 mTPCCorrMaps = &o2::gpu::TPCFastTransformPOD::get(raw);
190 float lumiCTP = mRequestCTPLumi ? pc.inputs().get<float>("lumiCTP") : 0;
191
192 static bool initOnceDone = false;
193 if (!initOnceDone) { // this params need to be queried only once
194 initOnceDone = true;
196
197 // Note: ITS/CLUSDICT and ITS/ALPIDEPARAM are requested/loaded by the recocontainer
199 if (mMatching.isITSTriggered()) {
200 mMatching.setITSROFrameLengthMUS(alpParams.roFrameLengthTrig / 1.e3); // ITS ROFrame duration in \mus
201 } else {
202 mMatching.setITSROFrameLengthInBC(alpParams.roFrameLengthInBC); // ITS ROFrame duration in \mus
203 }
204 mMatching.setITSTimeBiasInBC(alpParams.roFrameBiasInBC);
205 mMatching.setSkipTPCOnly(mSkipTPCOnly);
206 mMatching.setITSTriggered(!o2::base::GRPGeomHelper::instance().getGRPECS()->isDetContinuousReadOut(o2::detectors::DetID::ITS));
207 mMatching.setNHBPerTF(o2::base::GRPGeomHelper::instance().getGRPECS()->getNHBFPerTF());
208 mMatching.setMCTruthOn(mUseMC);
209 mMatching.setUseFT0(mUseFT0);
210 mMatching.setVDriftCalib(mCalibMode);
211 if (o2::base::GRPGeomHelper::instance().getGRPECS()->getRunType() != o2::parameters::GRPECSObject::RunType::COSMICS) {
212 mMatching.setBunchFilling(o2::base::GRPGeomHelper::instance().getGRPLHCIF()->getBunchFilling());
213 } else {
214 mMatching.setCosmics(true);
215 }
216 if (pc.inputs().getPos("itsTGeo") >= 0) {
217 pc.inputs().get<o2::its::GeometryTGeo*>("itsTGeo");
218 }
219 mMatching.init();
220 // check consistency of material correction options
221 if (mMatching.getUseMatCorrFlag() == o2::base::Propagator::MatCorrType::USEMatCorrTGeo && !o2::base::GeometryManager::isGeometryLoaded()) {
222 LOGP(fatal, "USEMatCorrTGeo cannot work w/o full geometry request in the GRPGeomHelper");
223 }
224 }
225
226 mMatching.setTPCCorrMaps(mTPCCorrMaps, lumiCTP);
227
228 if (mTPCVDriftHelper.isUpdated()) {
229 LOGP(info, "Updating TPC VDrift: corrFact {} wrt refVDrift {} and DriftTimeOffset correction {} wrt {} from source {}",
230 mTPCVDriftHelper.getVDriftObject().corrFact, mTPCVDriftHelper.getVDriftObject().refVDrift,
231 mTPCVDriftHelper.getVDriftObject().timeOffsetCorr, mTPCVDriftHelper.getVDriftObject().refTimeOffset,
232 mTPCVDriftHelper.getSourceName());
233 mMatching.setTPCVDrift(mTPCVDriftHelper.getVDriftObject());
234 mTPCVDriftHelper.acknowledgeUpdate();
235 }
236}
237
238DataProcessorSpec getTPCITSMatchingSpec(GTrackID::mask_t src, bool useFT0, bool calib, bool skipTPCOnly, bool useGeom, bool useMC, bool requestCTPLumi)
239{
240 std::vector<OutputSpec> outputs;
241 auto dataRequest = std::make_shared<DataRequest>();
242 if ((src & GTrackID::getSourcesMask("TPC-TRD,TPC-TOF,TPC-TRD-TOF")).any()) { // preliminary stage of extended workflow ?
243 dataRequest->setMatchingInputStrict();
244 }
245 dataRequest->inputs.emplace_back("MatchParam", "GLO", "ITSTPCPARAM", 0, Lifetime::Condition, ccdbParamSpec("GLO/Config/ITSTPCParam"));
246
247 dataRequest->requestTracks(src, useMC);
248 dataRequest->requestTPCClusters(false);
249// Only ITS clusters labels are needed for the afterburner and request possibly for ITS3
250#ifdef ENABLE_UPGRADES
251 if (o2::GlobalParams::Instance().withITS3) {
252 dataRequest->requestIT3Clusters(useMC);
253 } else {
254 dataRequest->requestITSClusters(useMC);
255 }
256#else
257 dataRequest->requestITSClusters(useMC);
258#endif
259 if (useFT0) {
260 dataRequest->requestFT0RecPoints(false);
261 }
262 outputs.emplace_back("GLO", "TPCITS", 0, Lifetime::Timeframe);
263 outputs.emplace_back("GLO", "TPCITSAB_REFS", 0, Lifetime::Timeframe); // AftetBurner ITS tracklet references (referred by GlobalTrackID::ITSAB) on cluster indices
264 outputs.emplace_back("GLO", "TPCITSAB_CLID", 0, Lifetime::Timeframe); // cluster indices of ITS tracklets attached by the AfterBurner
265
266 if (calib) {
267 outputs.emplace_back("GLO", "TPCITS_VDTGL", 0, Lifetime::Timeframe);
268 }
269
270 if (useMC) {
271 outputs.emplace_back("GLO", "TPCITS_MC", 0, Lifetime::Timeframe);
272 outputs.emplace_back("GLO", "TPCITSAB_MC", 0, Lifetime::Timeframe); // AfterBurner ITS tracklet MC
273 }
274 // Note: ITS/CLUSDICT and ITS/ALPIDEPARAM are requested/loaded by the recocontainer
275
276 auto ggRequest = std::make_shared<o2::base::GRPGeomRequest>(true, // orbitResetTime
277 true, // GRPECS=true
278 true, // GRPLHCIF
279 true, // GRPMagField
280 true, // askMatLUT
282 dataRequest->inputs,
283 true); // query only once all objects except mag.field
284 if (!useGeom) { // load ITS GeomTGeo since the full geometry is not loaded
285 ggRequest->addInput({"itsTGeo", "ITS", "GEOMTGEO", 0, Lifetime::Condition, ccdbParamSpec("ITS/Config/Geometry")}, dataRequest->inputs);
286 }
287
288 Options opts{
289 {"nthreads", VariantType::Int, 1, {"Number of afterburner threads"}},
290 {"ignore-bc-check", VariantType::Bool, false, {"Do not check match candidate against BC filling"}},
291 {"debug-tree-flags", VariantType::Int, 0, {"DebugFlagTypes bit-pattern for debug tree"}}};
292
293 o2::tpc::VDriftHelper::requestCCDBInputs(dataRequest->inputs);
294 dataRequest->inputs.emplace_back("corrMap", o2::header::gDataOriginTPC, "TPCCORRMAP", 0, Lifetime::Timeframe);
295 if (requestCTPLumi) {
296 dataRequest->inputs.emplace_back("lumiCTP", o2::header::gDataOriginCTP, "LUMICTP", 0, Lifetime::Timeframe);
297 }
298 return DataProcessorSpec{
299 "itstpc-track-matcher",
300 dataRequest->inputs,
301 outputs,
302 AlgorithmSpec{adaptFromTask<TPCITSMatchingDPL>(dataRequest, ggRequest, useFT0, calib, skipTPCOnly, useMC, requestCTPLumi)},
303 opts};
304}
305
306} // namespace globaltracking
307} // namespace o2
Class of a TPC cluster in TPC-native coordinates (row, time)
Definition of the ITS/MFT clusterer settings.
Definition of the ITSMFT compact cluster.
gsl::span< const o2::MCCompLabel > MCLabelsTr
Wrapper container for different reconstructed object types.
Definition of the ITSMFT cluster.
Definition of the ClusterTopology class.
Definition of the Names Generator class.
Definition of the GeometryManager class.
Definition of the BuildTopologyDictionary class for ITS3.
o2::raw::RawFileWriter * raw
Header of the AggregatedRunInfo struct.
Helper for geometry and GRP related CCDB requests.
Definition of the GeometryTGeo class.
Definition of the ITSMFT ROFrame (trigger) record.
Definition of a container to keep Monte Carlo truth external to simulation objects.
Configurable params for TPC ITS matching.
Class to perform TPC ITS matching.
POD correction map.
Definition of the ITS track.
Result of refitting TPC-ITS matched track.
Helper class to extract VDrift from different sources.
Helper class to obtain TPC clusters / digits / labels from DPL.
void checkUpdates(o2::framework::ProcessingContext &pc)
static GRPGeomHelper & instance()
void setRequest(std::shared_ptr< GRPGeomRequest > req)
static std::string getConfigOutputFileName(const std::string &procName, const std::string &confName="", bool json=true)
Definition NameConf.cxx:115
static void write(std::string const &filename, std::string const &keyOnly="")
static mask_t getSourcesMask(const std::string_view srcList)
static constexpr ID ITS
Definition DetID.h:63
decltype(auto) make(const Output &spec, Args... args)
ServiceRegistryRef services()
Definition InitContext.h:34
ConfigParamRegistry const & options()
Definition InitContext.h:33
int getPos(const char *name) const
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.
ServiceRegistryRef services()
The services registry associated with this processing context.
void setDebugTreeFileName(std::string name)
get the name of output debug file
void reportTiming()
clear results of previous event reco
void setITSROFrameLengthMUS(float fums)
set ITS ROFrame duration in BC (continuous mode only)
void setTPCVDrift(const o2::tpc::VDriftCorrFact &v)
void setNHBPerTF(int n)
ITS readout mode.
void setTPCCorrMaps(const o2::gpu::TPCFastTransformPOD *maph, float lumi)
print settings
void setMCTruthOn(bool v)
request VDrift calibration
void run(const o2::globaltracking::RecoContainer &inp, pmr::vector< o2::dataformats::TrackTPCITS > &matchedTracks, pmr::vector< o2::itsmft::TrkClusRef > &ABTrackletRefs, pmr::vector< int > &ABTrackletClusterIDs, pmr::vector< o2::MCCompLabel > &matchLabels, pmr::vector< o2::MCCompLabel > &ABTrackletLabels, pmr::vector< o2::dataformats::Triplet< float, float, float > > &calib)
void setBunchFilling(const o2::BunchFilling &bf)
void setDebugFlag(UInt_t flag, bool on=true)
set the name of output debug file
void setITSDictionary(const o2::itsmft::TopologyDictionary *d)
set flag to use MC truth
void setNThreads(int n)
perform all initializations
TPCITSMatchingDPL(std::shared_ptr< DataRequest > dr, std::shared_ptr< o2::base::GRPGeomRequest > gr, bool useFT0, bool calib, bool skipTPCOnly, bool useMC, bool requestCTPLumi)
void endOfStream(framework::EndOfStreamContext &ec) final
This is invoked whenever we have an EndOfStream event.
void finaliseCCDB(framework::ConcreteDataMatcher &matcher, void *obj) final
void run(ProcessingContext &pc) final
static void adopt(GeometryTGeo *raw, bool canDelete=false)
static void requestCCDBInputs(std::vector< o2::framework::InputSpec > &inputs, bool laser=true, bool itstpcTgl=true)
void extractCCDBInputs(o2::framework::ProcessingContext &pc, bool laser=true, bool itstpcTgl=true)
const VDriftCorrFact & getVDriftObject() const
bool accountCCDBInputs(const o2::framework::ConcreteDataMatcher &matcher, void *obj)
static std::string_view getSourceName(Source s)
bool isUpdated() const
GLenum src
Definition glcorearb.h:1767
constexpr o2::header::DataOrigin gDataOriginCTP
Definition DataHeader.h:564
constexpr o2::header::DataOrigin gDataOriginTPC
Definition DataHeader.h:576
Defining ITS Vertex explicitly as messageable.
Definition Cartesian.h:288
std::vector< ConfigParamSpec > ccdbParamSpec(std::string const &path, int runDependent, std::vector< CCDBMetadata > metadata={}, int qrate=0)
std::vector< ConfigParamSpec > Options
framework::DataProcessorSpec getTPCITSMatchingSpec(o2::dataformats::GlobalTrackID::mask_t src, bool useFT0, bool calib, bool skipTPCOnly, bool useGeom, bool useMC, bool requestCTPLumi)
create a processor spec
std::vector< T, fair::mq::pmr::polymorphic_allocator< T > > vector
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
std::string name
The name of the associated DataProcessorSpec.
Definition DeviceSpec.h:50
size_t inputTimesliceId
The time pipelining id of this particular device.
Definition DeviceSpec.h:68
void collectData(o2::framework::ProcessingContext &pc, const DataRequest &request)
float refTimeOffset
additive time offset reference (\mus)
float refVDrift
reference vdrift for which factor was extracted
float timeOffsetCorr
additive time offset correction (\mus)
float corrFact
drift velocity correction factor (multiplicative)
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"