Project
Loading...
Searching...
No Matches
TRDTrackletTransformerSpec.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
12#include <gsl/span>
13#include <cstring>
14
16
23
24using namespace o2::framework;
25using namespace o2::globaltracking;
26
27namespace o2
28{
29namespace trd
30{
31
33{
35 if (ic.options().get<bool>("apply-xor")) {
36 mTransformer.setApplyXOR();
37 }
38 if (getenv("ALIEN_JDL_LPMPRODUCTIONTYPE") && std::strcmp(getenv("ALIEN_JDL_LPMPRODUCTIONTYPE"), "MC") == 0) {
39 // apply artificial pad shift in case non-ideal alignment is used to compensate for shift in current alignment from real data
40 mTransformer.setApplyShift(false);
41 }
42}
43
45{
46 LOG(debug) << "Running tracklet transformer";
47
49 inputData.collectData(pc, *mDataRequest);
50 updateTimeDependentParams(pc); // Make sure this is called after recoData.collectData, which may load some conditions
51
52 auto tracklets = pc.inputs().get<gsl::span<Tracklet64>>("trdtracklets");
53 auto trigRecs = pc.inputs().get<gsl::span<TriggerRecord>>("trdtriggerrec");
54
55 std::vector<CalibratedTracklet> calibratedTracklets(tracklets.size());
56
57 std::vector<char> trigRecBitfield(trigRecs.size()); // flag TRD IR with ITS data (std::vector<bool> platform dependend)
58 int nTrackletsTransformed = 0;
59
60 if (mTrigRecFilterActive) {
61 const auto irFrames = inputData.getIRFramesITS();
62 size_t lastMatchedIdx = 0; // ITS IR are sorted in time and do not overlap
63 for (const auto& irFrame : irFrames) {
64 if (!irFrame.info) { // skip IRFrames where ITS did not find any track
65 continue;
66 }
67 for (auto j = lastMatchedIdx; j < trigRecs.size(); ++j) {
68 const auto& trigRec = trigRecs[j];
69 if (trigRec.getBCData() >= irFrame.getMin()) {
70 if (trigRec.getBCData() <= irFrame.getMax()) {
71 // TRD interaction record inside ITS frame
72 trigRecBitfield[j] = 1;
73 lastMatchedIdx = j;
74 } else {
75 // too late, also the higher trigger records won't match
76 break;
77 }
78 }
79 }
80 LOGF(debug, "ITS IR Frame start: %li, end: %li", irFrame.getMin().toLong(), irFrame.getMax().toLong());
81 }
82 /*
83 // for debugging: print TRD trigger times which are accepted and which are filtered out
84 for (int j = 0; j < trigRecs.size(); ++j) {
85 const auto& trigRec = trigRecs[j];
86 if (!trigRecBitfield[j]) {
87 LOGF(debug, "Could not find ITS info for TRD trigger %i: %li", j, trigRec.getBCData().toLong());
88 } else {
89 LOGF(debug, "Found ITS info for TRD trigger %i: %li", j, trigRec.getBCData().toLong());
90 }
91 }
92 */
93 } else {
94 // fill bitmask with 1
95 std::fill(trigRecBitfield.begin(), trigRecBitfield.end(), 1);
96 }
97
98 if (mTrigRecFilterActive) {
99 // skip tracklets from TRD triggers without ITS data
100 for (size_t iTrig = 0; iTrig < trigRecs.size(); ++iTrig) {
101 if (!trigRecBitfield[iTrig]) {
102 continue;
103 } else {
104 const auto& trigRec = trigRecs[iTrig];
105 for (int iTrklt = trigRec.getFirstTracklet(); iTrklt < trigRec.getFirstTracklet() + trigRec.getNumberOfTracklets(); ++iTrklt) {
106 calibratedTracklets[iTrklt] = mTransformer.transformTracklet(tracklets[iTrklt]);
107 ++nTrackletsTransformed;
108 }
109 }
110 }
111 } else {
112 // transform all tracklets
113 for (size_t iTrklt = 0; iTrklt < tracklets.size(); ++iTrklt) {
114 calibratedTracklets[iTrklt] = mTransformer.transformTracklet(tracklets[iTrklt]);
115 ++nTrackletsTransformed;
116 }
117 }
118
119 LOGF(info, "Found %lu tracklets in %lu trigger records. Applied filter for ITS IR frames: %i. Transformed %i tracklets.", tracklets.size(), trigRecs.size(), mTrigRecFilterActive, nTrackletsTransformed);
120
121 pc.outputs().snapshot(Output{"TRD", "CTRACKLETS", 0}, calibratedTracklets);
122 pc.outputs().snapshot(Output{"TRD", "TRIGRECMASK", 0}, trigRecBitfield);
123}
124
125void TRDTrackletTransformerSpec::updateTimeDependentParams(ProcessingContext& pc)
126{
128 static bool initOnceDone = false;
129 if (!initOnceDone) { // this params need to be queried only once
130 initOnceDone = true;
131 // init-once stuff
132 mTransformer.init();
133 }
134 pc.inputs().get<o2::trd::CalVdriftExB*>("calvdexb"); // just to trigger the finaliseCCDB
135}
136
138{
140 return;
141 }
142 if (matcher == ConcreteDataMatcher("TRD", "CALVDRIFTEXB", 0)) {
143 LOG(info) << "CalVdriftExB object has been updated";
144 mTransformer.setCalVdriftExB((const o2::trd::CalVdriftExB*)obj);
145 return;
146 }
147}
148
150{
151 std::shared_ptr<DataRequest> dataRequest = std::make_shared<DataRequest>();
152 if (trigRecFilterActive) {
153 dataRequest->requestIRFramesITS();
154 }
155 auto& inputs = dataRequest->inputs;
156 inputs.emplace_back("trdtracklets", "TRD", "TRACKLETS", 0, Lifetime::Timeframe);
157 inputs.emplace_back("trdtriggerrec", "TRD", "TRKTRGRD", 0, Lifetime::Timeframe);
158 inputs.emplace_back("calvdexb", "TRD", "CALVDRIFTEXB", 0, Lifetime::Condition, ccdbParamSpec("TRD/Calib/CalVdriftExB"));
159 auto ggRequest = std::make_shared<o2::base::GRPGeomRequest>(false, // orbitResetTime
160 false, // GRPECS=true
161 false, // GRPLHCIF
162 true, // GRPMagField
163 false, // askMatLUT
165 inputs,
166 true);
167 std::vector<OutputSpec> outputs;
168 outputs.emplace_back("TRD", "CTRACKLETS", 0, Lifetime::Timeframe);
169 outputs.emplace_back("TRD", "TRIGRECMASK", 0, Lifetime::Timeframe);
170
171 return DataProcessorSpec{
172 "TRDTRACKLETTRANSFORMER",
173 inputs,
174 outputs,
175 AlgorithmSpec{adaptFromTask<TRDTrackletTransformerSpec>(dataRequest, ggRequest, trigRecFilterActive)},
176 Options{
177 {"apply-xor", o2::framework::VariantType::Bool, false, {"flip the 8-th bit of slope and position (for processing CTFs from 2021 pilot beam)"}}}};
178}
179
180} //end namespace trd
181} //end namespace o2
Class to delimit start and end IR of certain time period.
uint32_t j
Definition RawData.h:0
std::ostringstream debug
std::vector< o2::mid::ColumnData > inputData
void checkUpdates(o2::framework::ProcessingContext &pc)
static GRPGeomHelper & instance()
void setRequest(std::shared_ptr< GRPGeomRequest > req)
void snapshot(const Output &spec, T const &object)
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.
void finaliseCCDB(framework::ConcreteDataMatcher &matcher, void *obj) final
void run(o2::framework::ProcessingContext &pc) override
void init(o2::framework::InitContext &ic) override
CalibratedTracklet transformTracklet(Tracklet64 tracklet, bool trackingFrame=true) const
void setCalVdriftExB(const CalVdriftExB *cal)
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
o2::framework::DataProcessorSpec getTRDTrackletTransformerSpec(bool trigRecFilterActive)
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
void collectData(o2::framework::ProcessingContext &pc, const DataRequest &request)
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
std::vector< Tracklet64 > tracklets