Skip to content

Commit 52cca07

Browse files
committed
Use workaround to avoid memory problems
To be understood: it is enough to uncomment in the ITS EntropyDecoderSpec dummy output for phystrig and corresponding make<> to see weird crashes (looks like memory misalignment) in the HMP-Clusterer and MID-tracker.
1 parent a1c8c05 commit 52cca07

11 files changed

Lines changed: 59 additions & 44 deletions

File tree

DataFormats/Detectors/ITSMFT/common/include/DataFormatsITSMFT/PhysTrigger.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,8 @@ namespace o2::itsmft
2121
{
2222
// root friendly version of the trigger (root does not support anonymous structs)
2323
struct PhysTrigger {
24-
o2::InteractionRecord ir;
25-
uint16_t triggerType = 0;
26-
bool internal = false;
27-
bool noData = false;
24+
o2::InteractionRecord ir{};
25+
uint64_t data = 0;
2826

2927
ClassDefNV(PhysTrigger, 1);
3028
};

Detectors/ITSMFT/ITS/workflow/include/ITSWorkflow/CookedTrackerSpec.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ namespace its
3535
class CookedTrackerDPL : public Task
3636
{
3737
public:
38-
CookedTrackerDPL(std::shared_ptr<o2::base::GRPGeomRequest> gr, bool useMC, bool useTRDTriggers, const std::string& trMode);
38+
CookedTrackerDPL(std::shared_ptr<o2::base::GRPGeomRequest> gr, bool useMC, int trgType, const std::string& trMode);
3939
~CookedTrackerDPL() override = default;
4040
void init(InitContext& ic) final;
4141
void run(ProcessingContext& pc) final;
@@ -50,7 +50,7 @@ class CookedTrackerDPL : public Task
5050
int mState = 0;
5151
bool mUseMC = true;
5252
bool mRunVertexer = true;
53-
bool mUseTRDTriggers = false;
53+
int mUseTriggers = 0;
5454
std::string mMode = "async";
5555
const o2::itsmft::TopologyDictionary* mDict = nullptr;
5656
std::unique_ptr<o2::parameters::GRPObject> mGRP = nullptr;
@@ -62,7 +62,7 @@ class CookedTrackerDPL : public Task
6262

6363
/// create a processor spec
6464
/// run ITS CookedMatrix tracker
65-
framework::DataProcessorSpec getCookedTrackerSpec(bool useMC, bool useTRD, const std::string& trMode);
65+
framework::DataProcessorSpec getCookedTrackerSpec(bool useMC, int useTrig, const std::string& trMode);
6666

6767
} // namespace its
6868
} // namespace o2

Detectors/ITSMFT/ITS/workflow/include/ITSWorkflow/RecoWorkflow.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ namespace reco_workflow
2929
{
3030

3131
framework::WorkflowSpec getWorkflow(bool useMC, bool useCAtracker, const std::string& trmode, o2::gpu::GPUDataTypes::DeviceType dType = o2::gpu::GPUDataTypes::DeviceType::CPU,
32-
bool upstreamDigits = false, bool upstreamClusters = false, bool disableRootOutput = false, bool useTRD = false, bool eencode = false);
32+
bool upstreamDigits = false, bool upstreamClusters = false, bool disableRootOutput = false, int useTrig = 0, bool eencode = false);
3333
}
3434

3535
} // namespace its

Detectors/ITSMFT/ITS/workflow/include/ITSWorkflow/TrackerSpec.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ namespace its
4141
class TrackerDPL : public framework::Task
4242
{
4343
public:
44-
TrackerDPL(std::shared_ptr<o2::base::GRPGeomRequest> gr, bool isMC, bool useTRDTriggers, const std::string& trModeS, o2::gpu::GPUDataTypes::DeviceType dType = o2::gpu::GPUDataTypes::DeviceType::CPU); // : mIsMC{isMC} {}
44+
TrackerDPL(std::shared_ptr<o2::base::GRPGeomRequest> gr, bool isMC, int trgType, const std::string& trModeS, o2::gpu::GPUDataTypes::DeviceType dType = o2::gpu::GPUDataTypes::DeviceType::CPU); // : mIsMC{isMC} {}
4545
~TrackerDPL() override = default;
4646
void init(framework::InitContext& ic) final;
4747
void run(framework::ProcessingContext& pc) final;
@@ -55,7 +55,7 @@ class TrackerDPL : public framework::Task
5555
bool mIsMC = false;
5656
bool mRunVertexer = true;
5757
bool mCosmicsProcessing = false;
58-
bool mUseTRDTriggers = false;
58+
int mUseTriggers = 0;
5959
std::string mMode = "sync";
6060
std::shared_ptr<o2::base::GRPGeomRequest> mGGCCDBRequest;
6161
const o2::itsmft::TopologyDictionary* mDict = nullptr;
@@ -68,7 +68,7 @@ class TrackerDPL : public framework::Task
6868

6969
/// create a processor spec
7070
/// run ITS CA tracker
71-
framework::DataProcessorSpec getTrackerSpec(bool useMC, bool useTRD, const std::string& trModeS, o2::gpu::GPUDataTypes::DeviceType dType);
71+
framework::DataProcessorSpec getTrackerSpec(bool useMC, int useTrig, const std::string& trModeS, o2::gpu::GPUDataTypes::DeviceType dType);
7272

7373
} // namespace its
7474
} // namespace o2

Detectors/ITSMFT/ITS/workflow/src/CookedTrackerSpec.cxx

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ namespace its
5252

5353
using Vertex = o2::dataformats::Vertex<o2::dataformats::TimeStamp<int>>;
5454

55-
CookedTrackerDPL::CookedTrackerDPL(std::shared_ptr<o2::base::GRPGeomRequest> gr, bool useMC, bool useTRDTriggers, const std::string& trMode) : mGGCCDBRequest(gr), mUseMC(useMC), mUseTRDTriggers{useTRDTriggers}, mMode(trMode)
55+
CookedTrackerDPL::CookedTrackerDPL(std::shared_ptr<o2::base::GRPGeomRequest> gr, bool useMC, int trgType, const std::string& trMode) : mGGCCDBRequest(gr), mUseMC(useMC), mUseTriggers{trgType}, mMode(trMode)
5656
{
5757
mVertexerTraitsPtr = std::make_unique<VertexerTraits>();
5858
mVertexerPtr = std::make_unique<Vertexer>(mVertexerTraitsPtr.get());
@@ -81,17 +81,17 @@ void CookedTrackerDPL::run(ProcessingContext& pc)
8181
auto rofsinput = pc.inputs().get<gsl::span<o2::itsmft::ROFRecord>>("ROframes");
8282
gsl::span<const o2::itsmft::PhysTrigger> physTriggers;
8383
std::vector<o2::itsmft::PhysTrigger> fromTRD;
84-
if (mUseTRDTriggers) {
84+
if (mUseTriggers == 2) { // use TRD triggers
8585
o2::InteractionRecord ir{0, pc.services().get<o2::framework::TimingInfo>().firstTForbit};
8686
auto trdTriggers = pc.inputs().get<gsl::span<o2::trd::TriggerRecord>>("phystrig");
8787
for (const auto& trig : trdTriggers) {
8888
if (trig.getBCData() >= ir && trig.getNumberOfTracklets()) {
8989
ir = trig.getBCData();
90-
fromTRD.emplace_back(o2::itsmft::PhysTrigger{ir, 0, false, false});
90+
fromTRD.emplace_back(o2::itsmft::PhysTrigger{ir, 0});
9191
}
9292
}
9393
physTriggers = gsl::span<const o2::itsmft::PhysTrigger>(fromTRD.data(), fromTRD.size());
94-
} else {
94+
} else if (mUseTriggers == 1) { // use Phys triggers from ITS stream
9595
physTriggers = pc.inputs().get<gsl::span<o2::itsmft::PhysTrigger>>("phystrig");
9696
}
9797

@@ -262,18 +262,18 @@ void CookedTrackerDPL::finaliseCCDB(ConcreteDataMatcher& matcher, void* obj)
262262
}
263263
}
264264

265-
DataProcessorSpec getCookedTrackerSpec(bool useMC, bool useTRD, const std::string& trMode)
265+
DataProcessorSpec getCookedTrackerSpec(bool useMC, int trgType, const std::string& trMode)
266266
{
267267
std::vector<InputSpec> inputs;
268268
inputs.emplace_back("compClusters", "ITS", "COMPCLUSTERS", 0, Lifetime::Timeframe);
269269
inputs.emplace_back("patterns", "ITS", "PATTERNS", 0, Lifetime::Timeframe);
270270
inputs.emplace_back("ROframes", "ITS", "CLUSTERSROF", 0, Lifetime::Timeframe);
271271
inputs.emplace_back("cldict", "ITS", "CLUSDICT", 0, Lifetime::Condition, ccdbParamSpec("ITS/Calib/ClusterDictionary"));
272272
inputs.emplace_back("alppar", "ITS", "ALPIDEPARAM", 0, Lifetime::Condition, ccdbParamSpec("ITS/Config/AlpideParam"));
273-
if (useTRD) {
274-
inputs.emplace_back("phystrig", "TRD", "TRKTRGRD", 0, Lifetime::Timeframe);
275-
} else {
273+
if (trgType == 1) {
276274
inputs.emplace_back("phystrig", "ITS", "PHYSTRIG", 0, Lifetime::Timeframe);
275+
} else if (trgType == 2) {
276+
inputs.emplace_back("phystrig", "TRD", "TRKTRGRD", 0, Lifetime::Timeframe);
277277
}
278278

279279
std::vector<OutputSpec> outputs;
@@ -302,7 +302,7 @@ DataProcessorSpec getCookedTrackerSpec(bool useMC, bool useTRD, const std::strin
302302
"its-cooked-tracker",
303303
inputs,
304304
outputs,
305-
AlgorithmSpec{adaptFromTask<CookedTrackerDPL>(ggRequest, useMC, useTRD, trMode)},
305+
AlgorithmSpec{adaptFromTask<CookedTrackerDPL>(ggRequest, useMC, trgType, trMode)},
306306
Options{{"nthreads", VariantType::Int, 1, {"Number of threads"}}}};
307307
}
308308

Detectors/ITSMFT/ITS/workflow/src/RecoWorkflow.cxx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,10 @@ namespace reco_workflow
3030
{
3131

3232
framework::WorkflowSpec getWorkflow(bool useMC, bool useCAtracker, const std::string& trmode, o2::gpu::GPUDataTypes::DeviceType dtype,
33-
bool upstreamDigits, bool upstreamClusters, bool disableRootOutput, bool useTRD,
33+
bool upstreamDigits, bool upstreamClusters, bool disableRootOutput, int useTrig,
3434
bool eencode)
3535
{
3636
framework::WorkflowSpec specs;
37-
3837
if (!(upstreamDigits || upstreamClusters)) {
3938
specs.emplace_back(o2::itsmft::getITSDigitReaderSpec(useMC, false, true, "itsdigits.root"));
4039
}
@@ -47,9 +46,9 @@ framework::WorkflowSpec getWorkflow(bool useMC, bool useCAtracker, const std::st
4746
}
4847
if (!trmode.empty()) {
4948
if (useCAtracker) {
50-
specs.emplace_back(o2::its::getTrackerSpec(useMC, useTRD, trmode, dtype));
49+
specs.emplace_back(o2::its::getTrackerSpec(useMC, useTrig, trmode, dtype));
5150
} else {
52-
specs.emplace_back(o2::its::getCookedTrackerSpec(useMC, useTRD, trmode));
51+
specs.emplace_back(o2::its::getCookedTrackerSpec(useMC, useTrig, trmode));
5352
}
5453
if (!disableRootOutput) {
5554
specs.emplace_back(o2::its::getTrackWriterSpec(useMC));

Detectors/ITSMFT/ITS/workflow/src/TrackerSpec.cxx

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ namespace its
5050
{
5151
using Vertex = o2::dataformats::Vertex<o2::dataformats::TimeStamp<int>>;
5252

53-
TrackerDPL::TrackerDPL(std::shared_ptr<o2::base::GRPGeomRequest> gr, bool isMC, bool useTRDTriggers, const std::string& trModeS, o2::gpu::GPUDataTypes::DeviceType dType) : mGGCCDBRequest(gr), mIsMC{isMC}, mUseTRDTriggers{useTRDTriggers}, mMode{trModeS}, mRecChain{o2::gpu::GPUReconstruction::CreateInstance(dType, true)}
53+
TrackerDPL::TrackerDPL(std::shared_ptr<o2::base::GRPGeomRequest> gr, bool isMC, int trgType, const std::string& trModeS, o2::gpu::GPUDataTypes::DeviceType dType) : mGGCCDBRequest(gr), mIsMC{isMC}, mUseTriggers{trgType}, mMode{trModeS}, mRecChain{o2::gpu::GPUReconstruction::CreateInstance(dType, true)}
5454
{
5555
std::transform(mMode.begin(), mMode.end(), mMode.begin(), [](unsigned char c) { return std::tolower(c); });
5656
}
@@ -141,17 +141,17 @@ void TrackerDPL::run(ProcessingContext& pc)
141141
gsl::span<const unsigned char> patterns = pc.inputs().get<gsl::span<unsigned char>>("patterns");
142142
gsl::span<const o2::itsmft::PhysTrigger> physTriggers;
143143
std::vector<o2::itsmft::PhysTrigger> fromTRD;
144-
if (mUseTRDTriggers) {
144+
if (mUseTriggers == 2) { // use TRD triggers
145145
o2::InteractionRecord ir{0, pc.services().get<o2::framework::TimingInfo>().firstTForbit};
146146
auto trdTriggers = pc.inputs().get<gsl::span<o2::trd::TriggerRecord>>("phystrig");
147147
for (const auto& trig : trdTriggers) {
148148
if (trig.getBCData() >= ir && trig.getNumberOfTracklets()) {
149149
ir = trig.getBCData();
150-
fromTRD.emplace_back(o2::itsmft::PhysTrigger{ir, 0, false, false});
150+
fromTRD.emplace_back(o2::itsmft::PhysTrigger{ir, 0});
151151
}
152152
}
153153
physTriggers = gsl::span<const o2::itsmft::PhysTrigger>(fromTRD.data(), fromTRD.size());
154-
} else {
154+
} else if (mUseTriggers == 1) { // use Phys triggers from ITS stream
155155
physTriggers = pc.inputs().get<gsl::span<o2::itsmft::PhysTrigger>>("phystrig");
156156
}
157157

@@ -348,16 +348,16 @@ void TrackerDPL::endOfStream(EndOfStreamContext& ec)
348348
mTimer.CpuTime(), mTimer.RealTime(), mTimer.Counter() - 1);
349349
}
350350

351-
DataProcessorSpec getTrackerSpec(bool useMC, bool useTRD, const std::string& trModeS, o2::gpu::GPUDataTypes::DeviceType dType)
351+
DataProcessorSpec getTrackerSpec(bool useMC, int trgType, const std::string& trModeS, o2::gpu::GPUDataTypes::DeviceType dType)
352352
{
353353
std::vector<InputSpec> inputs;
354354
inputs.emplace_back("compClusters", "ITS", "COMPCLUSTERS", 0, Lifetime::Timeframe);
355355
inputs.emplace_back("patterns", "ITS", "PATTERNS", 0, Lifetime::Timeframe);
356356
inputs.emplace_back("ROframes", "ITS", "CLUSTERSROF", 0, Lifetime::Timeframe);
357-
if (useTRD) {
358-
inputs.emplace_back("phystrig", "TRD", "TRKTRGRD", 0, Lifetime::Timeframe);
359-
} else {
357+
if (trgType == 1) {
360358
inputs.emplace_back("phystrig", "ITS", "PHYSTRIG", 0, Lifetime::Timeframe);
359+
} else if (trgType == 2) {
360+
inputs.emplace_back("phystrig", "TRD", "TRKTRGRD", 0, Lifetime::Timeframe);
361361
}
362362
inputs.emplace_back("cldict", "ITS", "CLUSDICT", 0, Lifetime::Condition, ccdbParamSpec("ITS/Calib/ClusterDictionary"));
363363
inputs.emplace_back("alppar", "ITS", "ALPIDEPARAM", 0, Lifetime::Condition, ccdbParamSpec("ITS/Config/AlpideParam"));
@@ -389,7 +389,7 @@ DataProcessorSpec getTrackerSpec(bool useMC, bool useTRD, const std::string& trM
389389
"its-tracker",
390390
inputs,
391391
outputs,
392-
AlgorithmSpec{adaptFromTask<TrackerDPL>(ggRequest, useMC, useTRD, trModeS, dType)},
392+
AlgorithmSpec{adaptFromTask<TrackerDPL>(ggRequest, useMC, trgType, trModeS, dType)},
393393
Options{}};
394394
}
395395

Detectors/ITSMFT/ITS/workflow/src/its-reco-workflow.cxx

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ void customize(std::vector<o2::framework::ConfigParamSpec>& workflowOptions)
4646
{"disable-root-output", o2::framework::VariantType::Bool, false, {"do not write output root files"}},
4747
{"disable-mc", o2::framework::VariantType::Bool, false, {"disable MC propagation even if available"}},
4848
{"trackerCA", o2::framework::VariantType::Bool, false, {"use trackerCA (default: trackerCM)"}},
49-
{"select-with-trd", o2::framework::VariantType::Bool, false, {"use TRD triggers to prescale processed ROFs"}},
49+
{"select-with-triggers", o2::framework::VariantType::String, "none", {"use triggers to prescale processed ROFs: phys, trd, none"}},
5050
{"tracking-mode", o2::framework::VariantType::String, "sync", {"sync,async,cosmics"}},
5151
{"disable-tracking", o2::framework::VariantType::Bool, false, {"disable tracking step"}},
5252
{"entropy-encoding", o2::framework::VariantType::Bool, false, {"produce entropy encoded data"}},
@@ -67,7 +67,7 @@ WorkflowSpec defineDataProcessing(ConfigContext const& configcontext)
6767
auto useMC = !configcontext.options().get<bool>("disable-mc");
6868
auto useCAtracker = configcontext.options().get<bool>("trackerCA");
6969
auto trmode = configcontext.options().get<std::string>("tracking-mode");
70-
auto selTRD = configcontext.options().get<bool>("select-with-trd");
70+
auto selTrig = configcontext.options().get<std::string>("select-with-triggers");
7171
auto gpuDevice = static_cast<o2::gpu::GPUDataTypes::DeviceType>(configcontext.options().get<int>("gpuDevice"));
7272
auto extDigits = configcontext.options().get<bool>("digits-from-upstream");
7373
auto extClusters = configcontext.options().get<bool>("clusters-from-upstream");
@@ -79,8 +79,18 @@ WorkflowSpec defineDataProcessing(ConfigContext const& configcontext)
7979
std::transform(trmode.begin(), trmode.end(), trmode.begin(), [](unsigned char c) { return std::tolower(c); });
8080

8181
o2::conf::ConfigurableParam::updateFromString(configcontext.options().get<std::string>("configKeyValues"));
82+
int trType = 0;
83+
if (!selTrig.empty() && selTrig != "none") {
84+
if (selTrig == "phys") {
85+
trType = 1;
86+
} else if (selTrig == "trd") {
87+
trType = 2;
88+
} else {
89+
LOG(fatal) << "Unknown trigger type requested for events prescaling: " << selTrig;
90+
}
91+
}
8292

83-
auto wf = o2::its::reco_workflow::getWorkflow(useMC, useCAtracker, trmode, gpuDevice, extDigits, extClusters, disableRootOutput, selTRD, eencode);
93+
auto wf = o2::its::reco_workflow::getWorkflow(useMC, useCAtracker, trmode, gpuDevice, extDigits, extClusters, disableRootOutput, trType, eencode);
8494

8595
// configure dpl timer to inject correct firstTForbit: start from the 1st orbit of TF containing 1st sampled orbit
8696
o2::raw::HBFUtilsInitializer hbfIni(configcontext, wf);

Detectors/ITSMFT/common/reconstruction/include/ITSMFTReconstruction/GBTLink.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -279,8 +279,7 @@ GBTLink::CollectedDataStatus GBTLink::collectROFCableData(const Mapping& chmap)
279279
gbtTrg = gbtTrgTmp; // this is a trigger describing the following data
280280
} else {
281281
if (extTrigVec) { // this link collects external triggers
282-
extTrigVec->emplace_back(PhysTrigger{o2::InteractionRecord(uint16_t(gbtTrgTmp->bc), uint32_t(gbtTrgTmp->orbit)),
283-
uint16_t(gbtTrgTmp->triggerType), gbtTrgTmp->internal != 0, gbtTrgTmp->noData != 0});
282+
extTrigVec->emplace_back(PhysTrigger{o2::InteractionRecord(uint16_t(gbtTrgTmp->bc), uint32_t(gbtTrgTmp->orbit)), uint64_t(gbtTrgTmp->triggerType)});
284283
}
285284
}
286285
continue;

Detectors/ITSMFT/common/workflow/src/EntropyDecoderSpec.cxx

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ void EntropyDecoderSpec::run(ProcessingContext& pc)
5656
// since the buff is const, we cannot use EncodedBlocks::relocate directly, instead we wrap its data to another flat object
5757
// const auto ctfImage = o2::itsmft::CTF::getImage(buff.data());
5858

59+
// this produces weird memory problems in unrelated devices, to be understood
60+
// auto& trigs = pc.outputs().make<std::vector<o2::itsmft::PhysTrigger>>(OutputRef{"phystrig"}); // dummy output
61+
5962
auto& rofs = pc.outputs().make<std::vector<o2::itsmft::ROFRecord>>(OutputRef{"ROframes"});
6063
if (mGetDigits) {
6164
auto& digits = pc.outputs().make<std::vector<o2::itsmft::Digit>>(OutputRef{"Digits"});
@@ -73,7 +76,6 @@ void EntropyDecoderSpec::run(ProcessingContext& pc)
7376
mTimer.Stop();
7477
LOG(info) << "Decoded " << compcl.size() << " clusters in " << rofs.size() << " RO frames, (" << iosize.asString() << ") in " << mTimer.CpuTime() - cput << " s";
7578
}
76-
pc.outputs().make<std::vector<o2::itsmft::PhysTrigger>>(OutputRef{"phystrig"}); // dummy output
7779
pc.outputs().snapshot({"ctfrep", 0}, iosize);
7880
}
7981

@@ -114,6 +116,11 @@ void EntropyDecoderSpec::finaliseCCDB(o2::framework::ConcreteDataMatcher& matche
114116
DataProcessorSpec getEntropyDecoderSpec(o2::header::DataOrigin orig, int verbosity, bool getDigits, unsigned int sspec)
115117
{
116118
std::vector<OutputSpec> outputs;
119+
// this is a special dummy input which makes sense only in sync workflows
120+
121+
// this produces weird memory problems in unrelated devices, to be understood
122+
// outputs.emplace_back(OutputSpec{{"phystrig"}, orig, "PHYSTRIG", 0, Lifetime::Timeframe});
123+
117124
if (getDigits) {
118125
outputs.emplace_back(OutputSpec{{"Digits"}, orig, "DIGITS", 0, Lifetime::Timeframe});
119126
outputs.emplace_back(OutputSpec{{"ROframes"}, orig, "DIGITSROF", 0, Lifetime::Timeframe});
@@ -124,9 +131,6 @@ DataProcessorSpec getEntropyDecoderSpec(o2::header::DataOrigin orig, int verbosi
124131
}
125132
outputs.emplace_back(OutputSpec{{"ctfrep"}, orig, "CTFDECREP", 0, Lifetime::Timeframe});
126133

127-
// this is a special dummy input which makes sense only in sync workflows
128-
outputs.emplace_back(OutputSpec{{"phystrig"}, orig, "PHYSTRIG", 0, Lifetime::Timeframe});
129-
130134
std::vector<InputSpec> inputs;
131135
inputs.emplace_back("ctf", orig, "CTFDATA", sspec, Lifetime::Timeframe);
132136
inputs.emplace_back("noise", orig, "NOISEMAP", 0, Lifetime::Condition, ccdbParamSpec(fmt::format("{}/Calib/NoiseMap", orig.as<std::string>())));

0 commit comments

Comments
 (0)