Skip to content

Commit faabc51

Browse files
committed
MID: remove input wildcards in MID workflows
1 parent d9bbbfc commit faabc51

File tree

11 files changed

+88
-103
lines changed

11 files changed

+88
-103
lines changed

Detectors/MUON/MID/Workflow/include/MIDWorkflow/ColumnDataSpecsUtils.h

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -42,21 +42,28 @@ namespace mid
4242
namespace specs
4343
{
4444

45-
/// Returns the input specs for MID Column Data and corresponding ROFs and labels
45+
/// Returns the input specs for MID Column Data and corresponding ROFs and labels for EventType Standard
4646
/// \param dataBind Data binding name
4747
/// \param dataDesc Input data description
4848
/// \param useMC Builds output specs for labels
4949
/// \return Vector of input specs
50-
std::vector<framework::InputSpec> buildInputSpecs(std::string_view dataBind, std::string_view dataDesc, bool useMC);
50+
std::vector<framework::InputSpec> buildStandardInputSpecs(std::string_view dataBind, std::string_view dataDesc, bool useMC);
5151

52-
/// Returns the input specs for MID Column Data and corresponding ROFs and labels
52+
/// Returns the input specs for MID Column Data and corresponding ROFs and labels for EventType Standard
5353
/// \param dataBind Data binding name
5454
/// \param dataDesc Input data description
5555
/// \param rofDesc Input ROF record description
5656
/// \param labelsDesc Input MC labels description
5757
/// \param useMC Builds output specs for labels
5858
/// \return Vector of input specs
59-
std::vector<framework::InputSpec> buildInputSpecs(std::string_view dataBind, std::string_view dataDesc, std::string_view rofDesc, std::string_view labelsDesc, bool useMC);
59+
std::vector<framework::InputSpec> buildStandardInputSpecs(std::string_view dataBind, std::string_view dataDesc, std::string_view rofDesc, std::string_view labelsDesc, bool useMC);
60+
61+
/// Returns the input specs for MID Column Data and corresponding ROFs and labels for all three EventTypes
62+
/// \param dataBind Data binding name
63+
/// \param dataDesc Input data description
64+
/// \param rofDesc Input ROF record description
65+
/// \return Vector of input specs
66+
std::vector<framework::InputSpec> buildInputSpecs(std::string_view dataBind, std::string_view dataDesc, std::string_view rofDesc);
6067

6168
/// Returns the output specs for the different event types
6269
/// \param bind Binding name
@@ -71,30 +78,22 @@ std::vector<framework::OutputSpec> buildOutputSpecs(std::string_view bind, std::
7178
/// \return Vector of Output specs
7279
std::vector<framework::OutputSpec> buildStandardOutputSpecs(std::string_view dataBind, std::string_view dataDesc, bool useMC);
7380

74-
/// Returns the inputs for the different event types
81+
/// Returns the input matching a specific binding
7582
/// \param pc Processing context
7683
/// \param bind Binding name
7784
/// \return Array of spans
7885
template <typename T>
79-
std::array<gsl::span<const T>, NEvTypes> getInput(framework::ProcessingContext& pc, std::string_view bind)
86+
gsl::span<const T> getInput(framework::ProcessingContext& pc, std::string_view bind, size_t subSpec)
8087
{
81-
std::array<gsl::span<const T>, 3> data;
82-
for (auto const& inputRef : framework::InputRecordWalker(pc.inputs())) {
83-
auto const* dh = framework::DataRefUtils::getHeader<o2::header::DataHeader*>(inputRef);
84-
auto subSpecIdx = static_cast<size_t>(dh->subSpecification);
85-
if (framework::DataRefUtils::match(inputRef, bind.data())) {
86-
data[subSpecIdx] = pc.inputs().get<gsl::span<T>>(inputRef);
87-
}
88-
}
89-
return data;
88+
return pc.inputs().get<gsl::span<T>>(fmt::format("{}{}", bind.data(), subSpec > 0 ? fmt::format("_{}", subSpec) : ""));
9089
}
9190

9291
/// Gets the outputs
9392
/// \param outputSpecs Vector of output specs
9493
/// \return vector of outputs
9594
std::vector<framework::Output> buildOutputs(std::vector<framework::OutputSpec> outputSpecs);
9695

97-
/// Returns the array of Column Data
96+
/// Returns the array of Column Data for all three EventTypes
9897
/// \param pc Processing context
9998
/// \param dataBind Data binding name
10099
/// \return Array of Column Data spans
@@ -107,7 +106,7 @@ std::array<gsl::span<const ColumnData>, NEvTypes> getData(framework::ProcessingC
107106
/// \return Span of ColumnData
108107
gsl::span<const ColumnData> getData(framework::ProcessingContext& pc, std::string_view dataBind, EventType eventType);
109108

110-
/// Returns the array of ROF records
109+
/// Returns the array of ROF records for all three EventTypes
111110
/// \param pc Processing context
112111
/// \param dataBind Data binding name
113112
/// \return Array of ROF Records spans
@@ -124,7 +123,7 @@ gsl::span<const ROFRecord> getRofs(framework::ProcessingContext& pc, std::string
124123
/// \param pc Processing context
125124
/// \param dataBind Data binding name
126125
/// \return Pointer to MC labels
127-
std::unique_ptr<const o2::dataformats::MCTruthContainer<MCLabel>> getLabels(framework::ProcessingContext& pc, std::string_view dataBind);
126+
std::unique_ptr<const o2::dataformats::MCTruthContainer<MCLabel>> getLabels(framework::ProcessingContext& pc, std::string_view dataBind, EventType eventType = EventType::Standard);
128127

129128
} // namespace specs
130129
} // namespace mid

Detectors/MUON/MID/Workflow/src/CalibDataProcessorSpec.cxx

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -61,19 +61,9 @@ class CalibDataProcessorDPL
6161
std::array<gsl::span<const ColumnData>, 3> data;
6262
std::array<gsl::span<const ROFRecord>, 3> dataRof;
6363

64-
std::vector<of::InputSpec> filter = {
65-
{"check_data", of::ConcreteDataTypeMatcher{header::gDataOriginMID, "DATA"}, of::Lifetime::Timeframe},
66-
{"check_rof", of::ConcreteDataTypeMatcher{header::gDataOriginMID, "DATAROF"}, of::Lifetime::Timeframe},
67-
};
68-
69-
for (auto const& inputRef : of::InputRecordWalker(pc.inputs(), filter)) {
70-
auto const* dh = framework::DataRefUtils::getHeader<o2::header::DataHeader*>(inputRef);
71-
auto subSpecIdx = static_cast<size_t>(dh->subSpecification);
72-
if (of::DataRefUtils::match(inputRef, "mid_data")) {
73-
data[subSpecIdx] = pc.inputs().get<gsl::span<o2::mid::ColumnData>>(inputRef);
74-
} else if (of::DataRefUtils::match(inputRef, "mid_data_rof")) {
75-
dataRof[subSpecIdx] = pc.inputs().get<gsl::span<o2::mid::ROFRecord>>(inputRef);
76-
}
64+
for (o2::header::DataHeader::SubSpecificationType subSpec = 0; subSpec < NEvTypes; ++subSpec) {
65+
data[subSpec] = pc.inputs().get<gsl::span<o2::mid::ColumnData>>(fmt::format("mid_data_{}", subSpec));
66+
dataRof[subSpec] = pc.inputs().get<gsl::span<o2::mid::ROFRecord>>(fmt::format("mid_data_rof_{}", subSpec));
7767
}
7868

7969
mNoise.clear();
@@ -151,8 +141,10 @@ class CalibDataProcessorDPL
151141
of::DataProcessorSpec getCalibDataProcessorSpec(const FEEIdConfig& feeIdConfig, const CrateMasks& crateMasks)
152142
{
153143
std::vector<of::InputSpec> inputSpecs;
154-
inputSpecs.emplace_back("mid_data", of::ConcreteDataTypeMatcher(header::gDataOriginMID, "DATA"), of::Lifetime::Timeframe);
155-
inputSpecs.emplace_back("mid_data_rof", of::ConcreteDataTypeMatcher(header::gDataOriginMID, "DATAROF"), of::Lifetime::Timeframe);
144+
for (o2::header::DataHeader::SubSpecificationType subSpec = 0; subSpec < NEvTypes; ++subSpec) {
145+
inputSpecs.emplace_back(fmt::format("mid_data_{}", subSpec), header::gDataOriginMID, "DATA", subSpec, of::Lifetime::Timeframe);
146+
inputSpecs.emplace_back(fmt::format("mid_data_rof_{}", subSpec), header::gDataOriginMID, "DATAROF", subSpec, of::Lifetime::Timeframe);
147+
}
156148

157149
std::vector<of::OutputSpec> outputSpecs;
158150
outputSpecs.emplace_back(header::gDataOriginMID, "NOISE", 0);

Detectors/MUON/MID/Workflow/src/ClusterizerSpec.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ framework::DataProcessorSpec getClusterizerSpec(bool isMC, std::string_view inDa
132132
if (isMC) {
133133
outputSpecs.emplace_back(of::OutputSpec{header::gDataOriginMID, "CLUSTERSLABELS"});
134134
}
135-
auto inputSpecs = specs::buildInputSpecs("mid_cluster_in", inDataDesc, inRofDesc, inLabelsDesc, isMC);
135+
auto inputSpecs = specs::buildStandardInputSpecs("mid_cluster_in", inDataDesc, inRofDesc, inLabelsDesc, isMC);
136136

137137
return of::DataProcessorSpec{
138138
"MIDClusterizer",

Detectors/MUON/MID/Workflow/src/ColumnDataSpecsUtils.cxx

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,9 @@ std::string getLabelsDescription(std::string_view description)
5454
std::string buildSelector(std::string_view bind, std::string_view description, int subSpec = -1)
5555
{
5656
std::string sbind(bind.data());
57-
std::string suffix;
58-
if (subSpec >= 0) {
57+
std::string suffix = subSpec >= 0 ? fmt::format("/{}", subSpec) : "";
58+
if (subSpec > 0) {
5959
sbind += fmt::format("_{}", subSpec);
60-
suffix += fmt::format("/{}", subSpec);
6160
}
6261
return fmt::format("{}:MID/{}{}", sbind, description, suffix);
6362
}
@@ -83,14 +82,26 @@ std::string buildSelectors(std::string_view dataBind, std::string_view dataDesc,
8382
return selector;
8483
}
8584

86-
std::vector<framework::InputSpec> buildInputSpecs(std::string_view dataBind, std::string_view dataDesc, bool useMC)
85+
std::vector<framework::InputSpec> buildInputSpecs(std::string_view dataBind, std::string_view dataDesc, std::string_view rofDesc)
8786
{
88-
return buildInputSpecs(dataBind, dataDesc, getROFDescription(dataDesc), getLabelsDescription(dataDesc), useMC);
87+
std::string selector;
88+
for (size_t ievt = 0; ievt < NEvTypes; ++ievt) {
89+
if (!selector.empty()) {
90+
selector += ";";
91+
}
92+
selector += buildSelectors(dataBind, dataDesc, rofDesc, "", false, ievt);
93+
}
94+
return framework::select(selector.c_str());
95+
}
96+
97+
std::vector<framework::InputSpec> buildStandardInputSpecs(std::string_view dataBind, std::string_view dataDesc, bool useMC)
98+
{
99+
return buildStandardInputSpecs(dataBind, dataDesc, getROFDescription(dataDesc), getLabelsDescription(dataDesc), useMC);
89100
}
90101

91-
std::vector<framework::InputSpec> buildInputSpecs(std::string_view dataBind, std::string_view dataDesc, std::string_view rofDesc, std::string_view labelsDesc, bool useMC)
102+
std::vector<framework::InputSpec> buildStandardInputSpecs(std::string_view dataBind, std::string_view dataDesc, std::string_view rofDesc, std::string_view labelsDesc, bool useMC)
92103
{
93-
std::string selector = buildSelectors(dataBind, dataDesc, rofDesc, labelsDesc, useMC);
104+
std::string selector = buildSelectors(dataBind, dataDesc, rofDesc, labelsDesc, useMC, 0);
94105
return framework::select(selector.c_str());
95106
}
96107

@@ -134,29 +145,37 @@ std::vector<framework::Output> buildOutputs(std::vector<framework::OutputSpec> o
134145

135146
std::array<gsl::span<const ColumnData>, NEvTypes> getData(framework::ProcessingContext& pc, std::string_view dataBind)
136147
{
137-
return getInput<ColumnData>(pc, dataBind);
148+
std::array<gsl::span<const ColumnData>, 3> data;
149+
for (size_t ievt = 0; ievt < NEvTypes; ++ievt) {
150+
data[ievt] = getInput<ColumnData>(pc, dataBind, ievt);
151+
}
152+
153+
return data;
138154
}
139155

140156
gsl::span<const ColumnData> getData(framework::ProcessingContext& pc, std::string_view dataBind, EventType eventType)
141157
{
142-
auto idx = static_cast<size_t>(eventType);
143-
return getData(pc, dataBind)[idx];
158+
return getInput<ColumnData>(pc, dataBind.data(), static_cast<size_t>(eventType));
144159
}
145160

146161
std::array<gsl::span<const ROFRecord>, NEvTypes> getRofs(framework::ProcessingContext& pc, std::string_view dataBind)
147162
{
148-
return getInput<ROFRecord>(pc, getROFBind(dataBind));
163+
std::array<gsl::span<const ROFRecord>, 3> data;
164+
for (size_t ievt = 0; ievt < NEvTypes; ++ievt) {
165+
data[ievt] = getInput<ROFRecord>(pc, getROFBind(dataBind).data(), ievt);
166+
}
167+
168+
return data;
149169
}
150170

151171
gsl::span<const ROFRecord> getRofs(framework::ProcessingContext& pc, std::string_view dataBind, EventType eventType)
152172
{
153-
auto idx = static_cast<size_t>(eventType);
154-
return getRofs(pc, dataBind)[idx];
173+
return getInput<ROFRecord>(pc, getROFBind(dataBind).data(), static_cast<size_t>(eventType));
155174
}
156175

157-
std::unique_ptr<const o2::dataformats::MCTruthContainer<MCLabel>> getLabels(framework::ProcessingContext& pc, std::string_view dataBind)
176+
std::unique_ptr<const o2::dataformats::MCTruthContainer<MCLabel>> getLabels(framework::ProcessingContext& pc, std::string_view dataBind, EventType eventType)
158177
{
159-
return pc.inputs().get<const o2::dataformats::MCTruthContainer<MCLabel>*>(getLabelsBind(dataBind).data());
178+
return pc.inputs().get<const o2::dataformats::MCTruthContainer<MCLabel>*>(fmt::format("{}_{}", getLabelsBind(dataBind).data(), static_cast<size_t>(eventType)));
160179
}
161180

162181
} // namespace specs

Detectors/MUON/MID/Workflow/src/DecodedDataAggregatorSpec.cxx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ class DecodedDataAggregatorDeviceDPL
5858
mAggregator.process(data, inROFRecords);
5959
mTimerAlgo += std::chrono::high_resolution_clock::now() - tAlgoStart;
6060

61-
for (o2::header::DataHeader::SubSpecificationType subSpec = 0; subSpec < 3; ++subSpec) {
61+
for (o2::header::DataHeader::SubSpecificationType subSpec = 0; subSpec < NEvTypes; ++subSpec) {
6262
EventType evtType = static_cast<EventType>(subSpec);
6363
pc.outputs().snapshot(of::Output{o2::header::gDataOriginMID, "DATA", subSpec}, mAggregator.getData(evtType));
6464
pc.outputs().snapshot(of::Output{o2::header::gDataOriginMID, "DATAROF", subSpec}, mAggregator.getROFRecords(evtType));
@@ -79,7 +79,7 @@ framework::DataProcessorSpec getDecodedDataAggregatorSpec()
7979
{
8080
std::vector<of::InputSpec> inputSpecs{of::InputSpec{"mid_decoded", header::gDataOriginMID, "DECODED"}, of::InputSpec{"mid_decoded_rof", header::gDataOriginMID, "DECODEDROF"}};
8181
std::vector<of::OutputSpec> outputSpecs;
82-
for (o2::header::DataHeader::SubSpecificationType subSpec = 0; subSpec < 3; ++subSpec) {
82+
for (o2::header::DataHeader::SubSpecificationType subSpec = 0; subSpec < NEvTypes; ++subSpec) {
8383
outputSpecs.emplace_back(of::OutputSpec{header::gDataOriginMID, "DATA", subSpec});
8484
outputSpecs.emplace_back(of::OutputSpec{header::gDataOriginMID, "DATAROF", subSpec});
8585
}

Detectors/MUON/MID/Workflow/src/EntropyEncoderSpec.cxx

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -56,26 +56,15 @@ void EntropyEncoderSpec::run(ProcessingContext& pc)
5656
mTimer.Start(false);
5757
mCTFCoder.updateTimeDependentParams(pc, true);
5858
CTFHelper::TFData tfData;
59-
std::vector<InputSpec>
60-
filter = {
61-
{"check", ConcreteDataTypeMatcher{header::gDataOriginMID, "DATA"}, Lifetime::Timeframe},
62-
{"check", ConcreteDataTypeMatcher{header::gDataOriginMID, "DATAROF"}, Lifetime::Timeframe},
63-
};
6459
size_t insize = 0;
65-
for (auto const& inputRef : InputRecordWalker(pc.inputs(), filter)) {
66-
auto const* dh = framework::DataRefUtils::getHeader<o2::header::DataHeader*>(inputRef);
67-
if (dh->subSpecification >= NEvTypes) {
68-
throw std::runtime_error(fmt::format("SubSpecification={} does not match EvenTypes for {}", dh->subSpecification, dh->dataDescription.as<std::string>()));
69-
}
70-
if (DataRefUtils::match(inputRef, "cols")) {
71-
tfData.colData[dh->subSpecification] = pc.inputs().get<gsl::span<o2::mid::ColumnData>>(inputRef);
72-
insize += tfData.colData[dh->subSpecification].size() * sizeof(o2::mid::ColumnData);
73-
}
74-
if (DataRefUtils::match(inputRef, "rofs")) {
75-
tfData.rofData[dh->subSpecification] = pc.inputs().get<gsl::span<o2::mid::ROFRecord>>(inputRef);
76-
insize += tfData.rofData[dh->subSpecification].size() * sizeof(o2::mid::ROFRecord);
77-
}
60+
for (o2::header::DataHeader::SubSpecificationType subSpec = 0; subSpec < NEvTypes; ++subSpec) {
61+
tfData.colData[subSpec] = pc.inputs().get<gsl::span<o2::mid::ColumnData>>(fmt::format("cols_{}", subSpec));
62+
insize += tfData.colData[subSpec].size() * sizeof(o2::mid::ColumnData);
63+
64+
tfData.rofData[subSpec] = pc.inputs().get<gsl::span<o2::mid::ROFRecord>>(fmt::format("rofs_{}", subSpec));
65+
insize += tfData.rofData[subSpec].size() * sizeof(o2::mid::ROFRecord);
7866
}
67+
7968
if (mSelIR) {
8069
mCTFCoder.setSelectedIRFrames(pc.inputs().get<gsl::span<o2::dataformats::IRFrame>>("selIRFrames"));
8170
}
@@ -102,8 +91,10 @@ void EntropyEncoderSpec::endOfStream(EndOfStreamContext& ec)
10291
DataProcessorSpec getEntropyEncoderSpec(bool selIR, const std::string& ctfdictOpt)
10392
{
10493
std::vector<InputSpec> inputs;
105-
inputs.emplace_back("rofs", ConcreteDataTypeMatcher(header::gDataOriginMID, "DATAROF"), Lifetime::Timeframe);
106-
inputs.emplace_back("cols", ConcreteDataTypeMatcher(header::gDataOriginMID, "DATA"), Lifetime::Timeframe);
94+
for (o2::header::DataHeader::SubSpecificationType subSpec = 0; subSpec < NEvTypes; ++subSpec) {
95+
inputs.emplace_back(fmt::format("cols_{}", subSpec), header::gDataOriginMID, "DATA", subSpec, Lifetime::Timeframe);
96+
inputs.emplace_back(fmt::format("rofs_{}", subSpec), header::gDataOriginMID, "DATAROF", subSpec, Lifetime::Timeframe);
97+
}
10798

10899
if (ctfdictOpt.empty() || ctfdictOpt == "ccdb") {
109100
inputs.emplace_back("ctfdict", header::gDataOriginMID, "CTFDICT", 0, Lifetime::Condition, ccdbParamSpec("MID/Calib/CTFDictionaryTree"));

Detectors/MUON/MID/Workflow/src/FilteringBCSpec.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ class FilteringBCDeviceDPL
100100
of::DataProcessorSpec getFilteringBCSpec(bool useMC, std::string_view inDesc)
101101
{
102102

103-
auto inputSpecs = specs::buildInputSpecs("mid_filter_BC_in", inDesc, useMC);
103+
auto inputSpecs = specs::buildStandardInputSpecs("mid_filter_BC_in", inDesc, useMC);
104104
auto ggRequest = std::make_shared<o2::base::GRPGeomRequest>(false, // orbitResetTime
105105
false, // GRPECS=true
106106
true, // GRPLHCIF

Detectors/MUON/MID/Workflow/src/FilteringSpec.cxx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,8 @@ class FilteringDeviceDPL
9999

100100
std::unique_ptr<const o2::dataformats::MCTruthContainer<MCLabel>> inMCContainer = mUseMC ? specs::getLabels(pc, "mid_filter_in") : nullptr;
101101

102-
auto& maskedData = pc.outputs().make<std::vector<ColumnData>>(of::OutputRef{"mid_filter_out_0"});
103-
auto& maskedRofs = pc.outputs().make<std::vector<ROFRecord>>(of::OutputRef{"mid_filter_out_rof_0"});
102+
auto& maskedData = pc.outputs().make<std::vector<ColumnData>>(of::OutputRef{"mid_filter_out"});
103+
auto& maskedRofs = pc.outputs().make<std::vector<ROFRecord>>(of::OutputRef{"mid_filter_out_rof"});
104104

105105
maskedData.reserve(data.size());
106106
maskedRofs.reserve(inROFRecords.size());
@@ -143,7 +143,7 @@ class FilteringDeviceDPL
143143
of::DataProcessorSpec getFilteringSpec(bool useMC, std::string_view inDesc, std::string_view outDesc)
144144
{
145145

146-
auto inputSpecs = specs::buildInputSpecs("mid_filter_in", inDesc, useMC);
146+
auto inputSpecs = specs::buildStandardInputSpecs("mid_filter_in", inDesc, useMC);
147147
inputSpecs.emplace_back("mid_bad_channels", header::gDataOriginMID, "BAD_CHANNELS", 0, of::Lifetime::Condition, of::ccdbParamSpec("MID/Calib/BadChannels"));
148148
inputSpecs.emplace_back("mid_rejectlist", header::gDataOriginMID, "REJECTLIST", 0, of::Lifetime::Condition, of::ccdbParamSpec("MID/Calib/RejectList"));
149149

0 commit comments

Comments
 (0)