Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
#include "DataFormatsMID/ColumnData.h"
#include "DataFormatsMID/ROFRecord.h"
#include "DataFormatsMID/MCLabel.h"
#include "Framework/Logger.h"

namespace o2
{
Expand All @@ -42,21 +43,28 @@ namespace mid
namespace specs
{

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

/// Returns the input specs for MID Column Data and corresponding ROFs and labels
/// Returns the input specs for MID Column Data and corresponding ROFs and labels for EventType Standard
/// \param dataBind Data binding name
/// \param dataDesc Input data description
/// \param rofDesc Input ROF record description
/// \param labelsDesc Input MC labels description
/// \param useMC Builds output specs for labels
/// \return Vector of input specs
std::vector<framework::InputSpec> buildInputSpecs(std::string_view dataBind, std::string_view dataDesc, std::string_view rofDesc, std::string_view labelsDesc, bool useMC);
std::vector<framework::InputSpec> buildStandardInputSpecs(std::string_view dataBind, std::string_view dataDesc, std::string_view rofDesc, std::string_view labelsDesc, bool useMC);

/// Returns the input specs for MID Column Data and corresponding ROFs and labels for all three EventTypes
/// \param dataBind Data binding name
/// \param dataDesc Input data description
/// \param rofDesc Input ROF record description
/// \return Vector of input specs
std::vector<framework::InputSpec> buildInputSpecs(std::string_view dataBind, std::string_view dataDesc, std::string_view rofDesc);

/// Returns the output specs for the different event types
/// \param bind Binding name
Expand All @@ -71,30 +79,27 @@ std::vector<framework::OutputSpec> buildOutputSpecs(std::string_view bind, std::
/// \return Vector of Output specs
std::vector<framework::OutputSpec> buildStandardOutputSpecs(std::string_view dataBind, std::string_view dataDesc, bool useMC);

/// Returns the inputs for the different event types
/// Returns the input matching a specific binding
/// \param pc Processing context
/// \param bind Binding name
/// \return Array of spans
template <typename T>
std::array<gsl::span<const T>, NEvTypes> getInput(framework::ProcessingContext& pc, std::string_view bind)
gsl::span<const T> getInput(framework::ProcessingContext& pc, std::string_view bind)
{
std::array<gsl::span<const T>, 3> data;
for (auto const& inputRef : framework::InputRecordWalker(pc.inputs())) {
auto const* dh = framework::DataRefUtils::getHeader<o2::header::DataHeader*>(inputRef);
auto subSpecIdx = static_cast<size_t>(dh->subSpecification);
if (framework::DataRefUtils::match(inputRef, bind.data())) {
data[subSpecIdx] = pc.inputs().get<gsl::span<T>>(inputRef);
return pc.inputs().get<gsl::span<T>>(inputRef);
}
}
return data;
return gsl::span<const T>();
}

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

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

/// Returns the array of ROF records
/// Returns the array of ROF records for all three EventTypes
/// \param pc Processing context
/// \param dataBind Data binding name
/// \return Array of ROF Records spans
Expand Down
22 changes: 7 additions & 15 deletions Detectors/MUON/MID/Workflow/src/CalibDataProcessorSpec.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -61,19 +61,9 @@ class CalibDataProcessorDPL
std::array<gsl::span<const ColumnData>, 3> data;
std::array<gsl::span<const ROFRecord>, 3> dataRof;

std::vector<of::InputSpec> filter = {
{"check_data", of::ConcreteDataTypeMatcher{header::gDataOriginMID, "DATA"}, of::Lifetime::Timeframe},
{"check_rof", of::ConcreteDataTypeMatcher{header::gDataOriginMID, "DATAROF"}, of::Lifetime::Timeframe},
};

for (auto const& inputRef : of::InputRecordWalker(pc.inputs(), filter)) {
auto const* dh = framework::DataRefUtils::getHeader<o2::header::DataHeader*>(inputRef);
auto subSpecIdx = static_cast<size_t>(dh->subSpecification);
if (of::DataRefUtils::match(inputRef, "mid_data")) {
data[subSpecIdx] = pc.inputs().get<gsl::span<o2::mid::ColumnData>>(inputRef);
} else if (of::DataRefUtils::match(inputRef, "mid_data_rof")) {
dataRof[subSpecIdx] = pc.inputs().get<gsl::span<o2::mid::ROFRecord>>(inputRef);
}
for (o2::header::DataHeader::SubSpecificationType subSpec = 0; subSpec < NEvTypes; ++subSpec) {
data[subSpec] = pc.inputs().get<gsl::span<o2::mid::ColumnData>>(fmt::format("mid_data_{}", subSpec));
dataRof[subSpec] = pc.inputs().get<gsl::span<o2::mid::ROFRecord>>(fmt::format("mid_data_rof_{}", subSpec));
}

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

std::vector<of::OutputSpec> outputSpecs;
outputSpecs.emplace_back(header::gDataOriginMID, "NOISE", 0);
Expand Down
2 changes: 1 addition & 1 deletion Detectors/MUON/MID/Workflow/src/ClusterizerSpec.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ framework::DataProcessorSpec getClusterizerSpec(bool isMC, std::string_view inDa
if (isMC) {
outputSpecs.emplace_back(of::OutputSpec{header::gDataOriginMID, "CLUSTERSLABELS"});
}
auto inputSpecs = specs::buildInputSpecs("mid_cluster_in", inDataDesc, inRofDesc, inLabelsDesc, isMC);
auto inputSpecs = specs::buildStandardInputSpecs("mid_cluster_in", inDataDesc, inRofDesc, inLabelsDesc, isMC);

return of::DataProcessorSpec{
"MIDClusterizer",
Expand Down
40 changes: 31 additions & 9 deletions Detectors/MUON/MID/Workflow/src/ColumnDataSpecsUtils.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -78,19 +78,31 @@ std::string buildSelectors(std::string_view dataBind, std::string_view dataDesc,
if (!selector.empty()) {
selector += ";";
}
selector += buildSelector(getLabelsBind(dataBind), labelsDesc, subSpec);
selector += buildSelector(getLabelsBind(dataBind), labelsDesc);
}
return selector;
}

std::vector<framework::InputSpec> buildInputSpecs(std::string_view dataBind, std::string_view dataDesc, bool useMC)
std::vector<framework::InputSpec> buildInputSpecs(std::string_view dataBind, std::string_view dataDesc, std::string_view rofDesc)
{
return buildInputSpecs(dataBind, dataDesc, getROFDescription(dataDesc), getLabelsDescription(dataDesc), useMC);
std::string selector;
for (size_t ievt = 0; ievt < NEvTypes; ++ievt) {
if (!selector.empty()) {
selector += ";";
}
selector += buildSelectors(dataBind, dataDesc, rofDesc, "", false, ievt);
}
return framework::select(selector.c_str());
}

std::vector<framework::InputSpec> buildStandardInputSpecs(std::string_view dataBind, std::string_view dataDesc, bool useMC)
{
return buildStandardInputSpecs(dataBind, dataDesc, getROFDescription(dataDesc), getLabelsDescription(dataDesc), useMC);
}

std::vector<framework::InputSpec> buildInputSpecs(std::string_view dataBind, std::string_view dataDesc, std::string_view rofDesc, std::string_view labelsDesc, bool useMC)
std::vector<framework::InputSpec> buildStandardInputSpecs(std::string_view dataBind, std::string_view dataDesc, std::string_view rofDesc, std::string_view labelsDesc, bool useMC)
{
std::string selector = buildSelectors(dataBind, dataDesc, rofDesc, labelsDesc, useMC);
std::string selector = buildSelectors(dataBind, dataDesc, rofDesc, labelsDesc, useMC, 0);
return framework::select(selector.c_str());
}

Expand Down Expand Up @@ -134,24 +146,34 @@ std::vector<framework::Output> buildOutputs(std::vector<framework::OutputSpec> o

std::array<gsl::span<const ColumnData>, NEvTypes> getData(framework::ProcessingContext& pc, std::string_view dataBind)
{
return getInput<ColumnData>(pc, dataBind);
std::array<gsl::span<const ColumnData>, 3> data;
for (size_t ievt = 0; ievt < NEvTypes; ++ievt) {
data[ievt] = getInput<ColumnData>(pc, fmt::format("{}_{}", dataBind, ievt));
}

return data;
}

gsl::span<const ColumnData> getData(framework::ProcessingContext& pc, std::string_view dataBind, EventType eventType)
{
auto idx = static_cast<size_t>(eventType);
return getData(pc, dataBind)[idx];
return getInput<ColumnData>(pc, fmt::format("{}_{}", dataBind.data(), idx));
}

std::array<gsl::span<const ROFRecord>, NEvTypes> getRofs(framework::ProcessingContext& pc, std::string_view dataBind)
{
return getInput<ROFRecord>(pc, getROFBind(dataBind));
std::array<gsl::span<const ROFRecord>, 3> data;
for (size_t ievt = 0; ievt < NEvTypes; ++ievt) {
data[ievt] = getInput<ROFRecord>(pc, fmt::format("{}_{}", getROFBind(dataBind).data(), ievt));
}

return data;
}

gsl::span<const ROFRecord> getRofs(framework::ProcessingContext& pc, std::string_view dataBind, EventType eventType)
{
auto idx = static_cast<size_t>(eventType);
return getRofs(pc, dataBind)[idx];
return getInput<ROFRecord>(pc, fmt::format("{}_{}", getROFBind(dataBind).data(), idx));
}

std::unique_ptr<const o2::dataformats::MCTruthContainer<MCLabel>> getLabels(framework::ProcessingContext& pc, std::string_view dataBind)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ class DecodedDataAggregatorDeviceDPL
mAggregator.process(data, inROFRecords);
mTimerAlgo += std::chrono::high_resolution_clock::now() - tAlgoStart;

for (o2::header::DataHeader::SubSpecificationType subSpec = 0; subSpec < 3; ++subSpec) {
for (o2::header::DataHeader::SubSpecificationType subSpec = 0; subSpec < NEvTypes; ++subSpec) {
EventType evtType = static_cast<EventType>(subSpec);
pc.outputs().snapshot(of::Output{o2::header::gDataOriginMID, "DATA", subSpec}, mAggregator.getData(evtType));
pc.outputs().snapshot(of::Output{o2::header::gDataOriginMID, "DATAROF", subSpec}, mAggregator.getROFRecords(evtType));
Expand All @@ -79,7 +79,7 @@ framework::DataProcessorSpec getDecodedDataAggregatorSpec()
{
std::vector<of::InputSpec> inputSpecs{of::InputSpec{"mid_decoded", header::gDataOriginMID, "DECODED"}, of::InputSpec{"mid_decoded_rof", header::gDataOriginMID, "DECODEDROF"}};
std::vector<of::OutputSpec> outputSpecs;
for (o2::header::DataHeader::SubSpecificationType subSpec = 0; subSpec < 3; ++subSpec) {
for (o2::header::DataHeader::SubSpecificationType subSpec = 0; subSpec < NEvTypes; ++subSpec) {
outputSpecs.emplace_back(of::OutputSpec{header::gDataOriginMID, "DATA", subSpec});
outputSpecs.emplace_back(of::OutputSpec{header::gDataOriginMID, "DATAROF", subSpec});
}
Expand Down
31 changes: 11 additions & 20 deletions Detectors/MUON/MID/Workflow/src/EntropyEncoderSpec.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -56,26 +56,15 @@ void EntropyEncoderSpec::run(ProcessingContext& pc)
mTimer.Start(false);
mCTFCoder.updateTimeDependentParams(pc, true);
CTFHelper::TFData tfData;
std::vector<InputSpec>
filter = {
{"check", ConcreteDataTypeMatcher{header::gDataOriginMID, "DATA"}, Lifetime::Timeframe},
{"check", ConcreteDataTypeMatcher{header::gDataOriginMID, "DATAROF"}, Lifetime::Timeframe},
};
size_t insize = 0;
for (auto const& inputRef : InputRecordWalker(pc.inputs(), filter)) {
auto const* dh = framework::DataRefUtils::getHeader<o2::header::DataHeader*>(inputRef);
if (dh->subSpecification >= NEvTypes) {
throw std::runtime_error(fmt::format("SubSpecification={} does not match EvenTypes for {}", dh->subSpecification, dh->dataDescription.as<std::string>()));
}
if (DataRefUtils::match(inputRef, "cols")) {
tfData.colData[dh->subSpecification] = pc.inputs().get<gsl::span<o2::mid::ColumnData>>(inputRef);
insize += tfData.colData[dh->subSpecification].size() * sizeof(o2::mid::ColumnData);
}
if (DataRefUtils::match(inputRef, "rofs")) {
tfData.rofData[dh->subSpecification] = pc.inputs().get<gsl::span<o2::mid::ROFRecord>>(inputRef);
insize += tfData.rofData[dh->subSpecification].size() * sizeof(o2::mid::ROFRecord);
}
for (o2::header::DataHeader::SubSpecificationType subSpec = 0; subSpec < NEvTypes; ++subSpec) {
tfData.colData[subSpec] = pc.inputs().get<gsl::span<o2::mid::ColumnData>>(fmt::format("cols_{}", subSpec));
insize += tfData.colData[subSpec].size() * sizeof(o2::mid::ColumnData);

tfData.rofData[subSpec] = pc.inputs().get<gsl::span<o2::mid::ROFRecord>>(fmt::format("rofs_{}", subSpec));
insize += tfData.rofData[subSpec].size() * sizeof(o2::mid::ROFRecord);
}

if (mSelIR) {
mCTFCoder.setSelectedIRFrames(pc.inputs().get<gsl::span<o2::dataformats::IRFrame>>("selIRFrames"));
}
Expand All @@ -102,8 +91,10 @@ void EntropyEncoderSpec::endOfStream(EndOfStreamContext& ec)
DataProcessorSpec getEntropyEncoderSpec(bool selIR, const std::string& ctfdictOpt)
{
std::vector<InputSpec> inputs;
inputs.emplace_back("rofs", ConcreteDataTypeMatcher(header::gDataOriginMID, "DATAROF"), Lifetime::Timeframe);
inputs.emplace_back("cols", ConcreteDataTypeMatcher(header::gDataOriginMID, "DATA"), Lifetime::Timeframe);
for (o2::header::DataHeader::SubSpecificationType subSpec = 0; subSpec < NEvTypes; ++subSpec) {
inputs.emplace_back(fmt::format("cols_{}", subSpec), header::gDataOriginMID, "DATA", subSpec, Lifetime::Timeframe);
inputs.emplace_back(fmt::format("rofs_{}", subSpec), header::gDataOriginMID, "DATAROF", subSpec, Lifetime::Timeframe);
}

if (ctfdictOpt.empty() || ctfdictOpt == "ccdb") {
inputs.emplace_back("ctfdict", header::gDataOriginMID, "CTFDICT", 0, Lifetime::Condition, ccdbParamSpec("MID/Calib/CTFDictionaryTree"));
Expand Down
2 changes: 1 addition & 1 deletion Detectors/MUON/MID/Workflow/src/FilteringBCSpec.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ class FilteringBCDeviceDPL
of::DataProcessorSpec getFilteringBCSpec(bool useMC, std::string_view inDesc)
{

auto inputSpecs = specs::buildInputSpecs("mid_filter_BC_in", inDesc, useMC);
auto inputSpecs = specs::buildStandardInputSpecs("mid_filter_BC_in", inDesc, useMC);
auto ggRequest = std::make_shared<o2::base::GRPGeomRequest>(false, // orbitResetTime
false, // GRPECS=true
true, // GRPLHCIF
Expand Down
2 changes: 1 addition & 1 deletion Detectors/MUON/MID/Workflow/src/FilteringSpec.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ class FilteringDeviceDPL
of::DataProcessorSpec getFilteringSpec(bool useMC, std::string_view inDesc, std::string_view outDesc)
{

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

Expand Down
32 changes: 8 additions & 24 deletions Detectors/MUON/MID/Workflow/src/MaskMakerSpec.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -69,28 +69,10 @@ class MaskMakerDeviceDPL
gsl::span<const ColumnData> calibData, fetData;
gsl::span<const ROFRecord> calibDataRof, fetDataRof;

std::vector<of::InputSpec> filter = {
{"check_data", of::ConcreteDataTypeMatcher{header::gDataOriginMID, "DATA"}, of::Lifetime::Timeframe},
{"check_rof", of::ConcreteDataTypeMatcher{header::gDataOriginMID, "DATAROF"}, of::Lifetime::Timeframe},
};

for (auto const& inputRef : of::InputRecordWalker(pc.inputs(), filter)) {
auto const* dh = framework::DataRefUtils::getHeader<o2::header::DataHeader*>(inputRef);
if (of::DataRefUtils::match(inputRef, "mid_data")) {
if (dh->subSpecification == 1) {
calibData = pc.inputs().get<gsl::span<o2::mid::ColumnData>>(inputRef);
} else if (dh->subSpecification == 2) {
fetData = pc.inputs().get<gsl::span<o2::mid::ColumnData>>(inputRef);
}
}
if (of::DataRefUtils::match(inputRef, "mid_data_rof")) {
if (dh->subSpecification == 1) {
calibDataRof = pc.inputs().get<gsl::span<o2::mid::ROFRecord>>(inputRef);
} else if (dh->subSpecification == 2) {
fetDataRof = pc.inputs().get<gsl::span<o2::mid::ROFRecord>>(inputRef);
}
}
}
calibData = pc.inputs().get<gsl::span<o2::mid::ColumnData>>("mid_data_1");
calibDataRof = pc.inputs().get<gsl::span<o2::mid::ROFRecord>>("mid_data_rof_1");
fetData = pc.inputs().get<gsl::span<o2::mid::ColumnData>>("mid_data_2");
fetDataRof = pc.inputs().get<gsl::span<o2::mid::ROFRecord>>("mid_data_rof_2");

unsigned long nEvents = calibDataRof.size();
if (nEvents == 0) {
Expand Down Expand Up @@ -145,8 +127,10 @@ class MaskMakerDeviceDPL
framework::DataProcessorSpec getMaskMakerSpec(const FEEIdConfig& feeIdConfig, const CrateMasks& crateMasks)
{
std::vector<of::InputSpec> inputSpecs;
inputSpecs.emplace_back("mid_data", of::ConcreteDataTypeMatcher(header::gDataOriginMID, "DATA"), of::Lifetime::Timeframe);
inputSpecs.emplace_back("mid_data_rof", of::ConcreteDataTypeMatcher(header::gDataOriginMID, "DATAROF"), of::Lifetime::Timeframe);
for (o2::header::DataHeader::SubSpecificationType subSpec = 1; subSpec < NEvTypes; ++subSpec) {
inputSpecs.emplace_back(fmt::format("mid_data_{}", subSpec), o2::header::gDataOriginMID, "DATA", subSpec, of::Lifetime::Timeframe);
inputSpecs.emplace_back(fmt::format("mid_data_rof_{}", subSpec), o2::header::gDataOriginMID, "DATAROF", subSpec, of::Lifetime::Timeframe);
}

std::vector<of::OutputSpec> outputSpecs{
of::OutputSpec{header::gDataOriginMID, "MASKS", 1},
Expand Down
2 changes: 1 addition & 1 deletion Detectors/MUON/MID/Workflow/src/TimingSpec.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ class TimingDeviceDPL

of::DataProcessorSpec getTimingSpec(int localToBC, std::string_view inRofDesc)
{
auto inputSpecs = specs::buildInputSpecs("mid_timing_in", "", inRofDesc, "", false);
auto inputSpecs = specs::buildInputSpecs("mid_timing_in", "", inRofDesc);
auto outputSpecs = specs::buildOutputSpecs("mid_timing_out", "TDATAROF");

return of::DataProcessorSpec{
Expand Down
2 changes: 1 addition & 1 deletion Detectors/MUON/MID/Workflow/src/ZeroSuppressionSpec.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ class ZeroSuppressionDeviceDPL

framework::DataProcessorSpec getZeroSuppressionSpec(bool useMC, std::string_view dataDesc)
{
auto inputSpecs = specs::buildInputSpecs("mid_zs_in", dataDesc, useMC);
auto inputSpecs = specs::buildStandardInputSpecs("mid_zs_in", dataDesc, useMC);
auto outputSpecs = specs::buildStandardOutputSpecs("mid_zs_out", "DATA", useMC);

return of::DataProcessorSpec{
Expand Down