Skip to content

Commit 4124e26

Browse files
committed
Allow for custom subSpec and binding in user I/O spec helpers
1 parent 5582086 commit 4124e26

3 files changed

Lines changed: 52 additions & 27 deletions

File tree

Framework/include/QualityControl/UserInputOutput.h

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
#include <string>
2121

22+
#include <Headers/DataHeader.h>
2223
#include <Framework/ConcreteDataMatcher.h>
2324
#include <Framework/InputSpec.h>
2425
#include <Framework/OutputSpec.h>
@@ -31,16 +32,27 @@ namespace o2::quality_control::core
3132

3233
/// \brief returns a standard ConcreteDataMatcher for QC inputs and outputs
3334
framework::ConcreteDataMatcher
34-
createUserDataMatcher(DataSourceType dataSourceType, const std::string& detectorName, const std::string& userCodeName);
35+
createUserDataMatcher(DataSourceType dataSourceType, const std::string& detectorName, const std::string& userCodeName,
36+
o2::header::DataHeader::SubSpecificationType subSpec = 0);
3537

36-
/// \brief returns a standard InputSpec for QC inputs and outputs
38+
/// \brief returns a standard InputSpec for QC user data
39+
///
40+
/// Returns a standard InputSpec for QC user data. The combination of the first four arguments should be unique
41+
/// in a QC workflow. When provided binding is empty, userCodeName is used. If a Data Processor asks for multiple
42+
/// inputs with the same userCodeName, a custom binding should be set.
3743
framework::InputSpec
38-
createUserInputSpec(DataSourceType dataSourceType, const std::string& detectorName, const std::string& userCodeName);
44+
createUserInputSpec(DataSourceType dataSourceType, const std::string& detectorName, const std::string& userCodeName,
45+
o2::header::DataHeader::SubSpecificationType subSpec = 0, const std::string& binding = "");
3946

40-
/// \brief returns a standard OutputSpec for QC inputs and outputs
47+
/// \brief returns a standard OutputSpec for QC user data
48+
///
49+
/// Returns a standard OutputSpec for QC user data. The combination of the first four arguments should be unique
50+
/// in a QC workflow. When provided binding is empty, userCodeName is used. If a Data Processor asks for multiple
51+
/// outputs with the same userCodeName, a custom binding should be set.
4152
framework::OutputSpec
42-
createUserOutputSpec(DataSourceType dataSourceType, const std::string& detectorName, const std::string& userCodeName);
53+
createUserOutputSpec(DataSourceType dataSourceType, const std::string& detectorName, const std::string& userCodeName,
54+
o2::header::DataHeader::SubSpecificationType subSpec = 0, const framework::OutputLabel& binding = {});
4355

4456
} // namespace o2::quality_control::core
4557

46-
#endif // QUALITYCONTROL_USERINPUTOUTPUT_H
58+
#endif // QUALITYCONTROL_USERINPUTOUTPUT_H

Framework/src/UserInputOutput.cxx

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,37 +20,38 @@ namespace o2::quality_control::core
2020
{
2121

2222
framework::ConcreteDataMatcher
23-
createUserDataMatcher(DataSourceType dataSourceType, const std::string& detectorName, const std::string& userCodeName)
23+
createUserDataMatcher(DataSourceType dataSourceType, const std::string& detectorName, const std::string& userCodeName,
24+
o2::header::DataHeader::SubSpecificationType subSpec)
2425
{
2526
return {
2627
createDataOrigin(dataSourceType, detectorName),
2728
createDataDescription(userCodeName, dataSourceType),
28-
0
29+
subSpec
2930
};
3031
}
3132

3233
framework::InputSpec
33-
createUserInputSpec(DataSourceType dataSourceType, const std::string& detectorName, const std::string& userCodeName)
34+
createUserInputSpec(DataSourceType dataSourceType, const std::string& detectorName, const std::string& userCodeName,
35+
o2::header::DataHeader::SubSpecificationType subSpec, const std::string& binding)
3436
{
3537
// currently all of our outputs are Lifetime::Sporadic, so we don't allow for customization, but it could be factored out.
36-
// we assume using `userCodeName` as a binding in all cases
3738
return {
38-
userCodeName,
39-
createUserDataMatcher(dataSourceType, detectorName, userCodeName),
39+
binding.empty() ? userCodeName : binding,
40+
createUserDataMatcher(dataSourceType, detectorName, userCodeName, subSpec),
4041
framework::Lifetime::Sporadic
4142
};
4243
}
4344

4445
framework::OutputSpec
45-
createUserOutputSpec(DataSourceType dataSourceType, const std::string& detectorName, const std::string& userCodeName)
46+
createUserOutputSpec(DataSourceType dataSourceType, const std::string& detectorName, const std::string& userCodeName,
47+
o2::header::DataHeader::SubSpecificationType subSpec, const framework::OutputLabel& binding)
4648
{
4749
// currently all of our outputs are Lifetime::Sporadic, so we don't allow for customization, but it could be factored out.
48-
// we assume using `userCodeName` as a binding in all cases
4950
return {
50-
framework::OutputLabel{ userCodeName },
51-
createUserDataMatcher(dataSourceType, detectorName, userCodeName),
51+
binding.value.empty() ? framework::OutputLabel{ userCodeName } : binding,
52+
createUserDataMatcher(dataSourceType, detectorName, userCodeName, subSpec),
5253
framework::Lifetime::Sporadic
5354
};
5455
}
5556

56-
} // namespace o2::quality_control::core
57+
} // namespace o2::quality_control::core

Framework/test/testUserInputOutput.cxx

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,26 +28,38 @@ namespace o2::quality_control::core
2828

2929
TEST_CASE("ConcreteDataMatcher")
3030
{
31-
auto dataMatcher = createUserDataMatcher(DataSourceType::Task, "TST", "mytask");
31+
auto dataMatcher = createUserDataMatcher(DataSourceType::Task, "TST", "mytask", 7);
3232
CHECK(dataMatcher.origin == DataOrigin{ "QTST" });
3333
CHECK(dataMatcher.description == DataDescription{ "mytask" });
34-
CHECK(dataMatcher.subSpec == 0);
34+
CHECK(dataMatcher.subSpec == 7);
3535
}
3636

3737
TEST_CASE("InputSpec")
3838
{
39-
auto inputSpec = createUserInputSpec(DataSourceType::Task, "TST", "mytask");
40-
CHECK(inputSpec.binding == "mytask");
41-
CHECK(inputSpec.lifetime == framework::Lifetime::Sporadic);
42-
CHECK(framework::DataSpecUtils::match(inputSpec, framework::ConcreteDataMatcher{ DataOrigin{ "QTST" }, DataDescription{ "mytask" }, 0 }));
39+
{
40+
auto inputSpec = createUserInputSpec(DataSourceType::Task, "TST", "mytask", 3);
41+
CHECK(inputSpec.binding == "mytask");
42+
CHECK(inputSpec.lifetime == framework::Lifetime::Sporadic);
43+
CHECK(framework::DataSpecUtils::match(inputSpec, framework::ConcreteDataMatcher{ DataOrigin{ "QTST" }, DataDescription{ "mytask" }, 3 }));
44+
}
45+
{
46+
auto inputSpec = createUserInputSpec(DataSourceType::Task, "TST", "mytask", 3, "custom_binding");
47+
CHECK(inputSpec.binding == "custom_binding");
48+
}
4349
}
4450

4551
TEST_CASE("OutputSpec")
4652
{
47-
auto outputSpec = createUserOutputSpec(DataSourceType::Task, "TST", "mytask");
48-
CHECK(outputSpec.binding.value == "mytask");
49-
CHECK(outputSpec.lifetime == framework::Lifetime::Sporadic);
50-
CHECK(framework::DataSpecUtils::match(outputSpec, framework::ConcreteDataMatcher{ DataOrigin{ "QTST" }, DataDescription{ "mytask" }, 0 }));
53+
{
54+
auto outputSpec = createUserOutputSpec(DataSourceType::Task, "TST", "mytask", 5);
55+
CHECK(outputSpec.binding.value == "mytask");
56+
CHECK(outputSpec.lifetime == framework::Lifetime::Sporadic);
57+
CHECK(framework::DataSpecUtils::match(outputSpec, framework::ConcreteDataMatcher{ DataOrigin{ "QTST" }, DataDescription{ "mytask" }, 5 }));
58+
}
59+
{
60+
auto outputSpec = createUserOutputSpec(DataSourceType::Task, "TST", "mytask", 5, { "custom_binding" });
61+
CHECK(outputSpec.binding.value == "custom_binding");
62+
}
5163
}
5264

5365
} // namespace o2::quality_control::core

0 commit comments

Comments
 (0)