Skip to content

Commit a77dc7f

Browse files
author
Michal Tichák
committed
Data used in aggregators
1 parent c37c37e commit a77dc7f

File tree

8 files changed

+103
-17
lines changed

8 files changed

+103
-17
lines changed

Framework/include/QualityControl/AggregatorInterface.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "QualityControl/UserCodeInterface.h"
2424
#include "QualityControl/Quality.h"
2525
#include "QualityControl/Activity.h"
26+
#include "QualityControl/Data.h"
2627

2728
namespace o2::quality_control::checker
2829
{
@@ -42,7 +43,13 @@ class AggregatorInterface : public o2::quality_control::core::UserCodeInterface
4243
///
4344
/// @param qoMap A map of the the QualityObjects to aggregate and their full names.
4445
/// @return The new qualities, associated with a name.
45-
virtual std::map<std::string, core::Quality> aggregate(std::map<std::string, std::shared_ptr<const core::QualityObject>>& qoMap) = 0;
46+
virtual std::map<std::string, core::Quality> aggregate(std::map<std::string, std::shared_ptr<const core::QualityObject>>& qoMap);
47+
48+
/// \brief Returns new qualities (usually fewer) based on the input qualities stored in Data structure
49+
///
50+
/// @param data A generic data structure containing QualityObjects or possible other inputs.
51+
/// @return The new qualities, associated with a name.
52+
virtual std::map<std::string, core::Quality> aggregate(const core::Data& data);
4653

4754
virtual void startOfActivity(const core::Activity& activity);
4855
virtual void endOfActivity(const core::Activity& activity);

Framework/include/QualityControl/Data.h

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,21 @@ class Data
6464
template <typename T>
6565
static const T* any_cast_try_shared_ptr(const std::any& value)
6666
{
67+
// sadly it is necessary to check for any of these types if we want to test for
68+
// shared_ptr, raw ptr and a value
6769
if (auto* casted = std::any_cast<std::shared_ptr<T>>(&value); casted != nullptr) {
6870
return casted->get();
69-
} else {
70-
return std::any_cast<T>(&value);
7171
}
72+
if (auto* casted = std::any_cast<std::shared_ptr<const T>>(&value); casted != nullptr) {
73+
return casted->get();
74+
}
75+
if (auto* casted = std::any_cast<T*>(&value); casted != nullptr) {
76+
return *casted;
77+
}
78+
if (auto* casted = std::any_cast<const T*>(&value); casted != nullptr) {
79+
return *casted;
80+
}
81+
return std::any_cast<T>(&value);
7282
}
7383

7484
template <typename T>

Framework/include/QualityControl/DataAdapters.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@
1919

2020
#include "Data.h"
2121
#include "QualityControl/MonitorObject.h"
22+
#include "QualityObject.h"
2223

2324
namespace o2::quality_control::core
2425
{
2526

2627
Data createData(const std::map<std::string, std::shared_ptr<MonitorObject>>& moMap);
28+
Data createData(const QualityObjectsMapType& moMap);
2729

2830
template <typename Result>
2931
auto iterateMOsFilterByNameAndTransform(const Data& data, std::string_view moName)
@@ -33,6 +35,14 @@ auto iterateMOsFilterByNameAndTransform(const Data& data, std::string_view moNam
3335
[](const MonitorObject* ptr) -> const Result* { return dynamic_cast<const Result*>(ptr->getObject()); });
3436
}
3537

38+
template <typename Result>
39+
auto iterateQOsFilterByNameAndTransform(const Data& data, std::string_view moName)
40+
{
41+
return data.iterateByTypeFilterAndTransform<MonitorObject, Result>(
42+
[name = std::string{ moName }](const std::pair<std::string_view, const MonitorObject*>& pair) -> bool { return std::string_view{ pair.second->GetName() } == name; },
43+
[](const MonitorObject* ptr) -> const Result* { return dynamic_cast<const Result*>(ptr->getObject()); });
44+
}
45+
3646
} // namespace o2::quality_control::core
3747

3848
#endif

Framework/src/AggregatorInterface.cxx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,25 @@
1515
///
1616

1717
#include "QualityControl/AggregatorInterface.h"
18+
#include "QualityControl/DataAdapters.h"
1819

1920
using namespace std;
2021
using namespace o2::quality_control::core;
2122

2223
namespace o2::quality_control::checker
2324
{
2425

26+
std::map<std::string, core::Quality> AggregatorInterface::aggregate(std::map<std::string, std::shared_ptr<const core::QualityObject>>& qoMap)
27+
{
28+
auto data = createData(qoMap);
29+
return aggregate(data);
30+
}
31+
32+
std::map<std::string, core::Quality> AggregatorInterface::aggregate(const core::Data& data)
33+
{
34+
return {};
35+
}
36+
2537
void AggregatorInterface::startOfActivity(const Activity& activity)
2638
{
2739
// noop, override it if you want.

Framework/src/DataAdapters.cxx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,13 @@ Data createData(const std::map<std::string, std::shared_ptr<MonitorObject>>& moM
2828
return data;
2929
}
3030

31+
Data createData(const QualityObjectsMapType& qoMap)
32+
{
33+
Data data;
34+
for (const auto& [key, qo] : qoMap) {
35+
data.insert(key, qo);
36+
}
37+
return data;
38+
}
39+
3140
} // namespace o2::quality_control::core

Framework/test/testData.cxx

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ TEST_CASE("Data - iterateByTypeFilterAndTransform", "[Data]")
118118
REQUIRE(count == 1);
119119
}
120120

121-
TEST_CASE("Data - Monitor adaptors", "[Data]")
121+
TEST_CASE("Data - Monitor adaptors MOs", "[Data]")
122122
{
123123
auto* h1 = new TH1F("th11", "th11", 100, 0, 99);
124124
std::shared_ptr<MonitorObject> mo1 = std::make_shared<MonitorObject>(h1, "taskname", "class1", "TST");
@@ -135,12 +135,51 @@ TEST_CASE("Data - Monitor adaptors", "[Data]")
135135
REQUIRE(data.size() == 2);
136136

137137
auto filteredHistos = iterateMOsFilterByNameAndTransform<TH1F>(data, "th11");
138-
std::vector result(filteredHistos.begin(), filteredHistos.end());
139-
// REQUIRE(!filteredHistos.empty());
138+
REQUIRE(!filteredHistos.empty());
140139
size_t count{};
141-
for (const auto& histo1d : result) {
140+
for (const auto& histo1d : filteredHistos) {
142141
REQUIRE(std::string_view{ histo1d.GetName() } == "th11");
143142
++count;
144143
}
145144
REQUIRE(count == 1);
146145
}
146+
147+
TEST_CASE("Data - Monitor adaptors QOs", "[Data]")
148+
{
149+
QualityObjectsMapType qoMap;
150+
qoMap["1"] = std::make_shared<QualityObject>(Quality::Good, "1");
151+
qoMap["2"] = std::make_shared<QualityObject>(Quality::Good, "2");
152+
153+
auto data = createData(qoMap);
154+
155+
REQUIRE(data.size() == 2);
156+
157+
auto filteredObjects = data.iterateByType<QualityObject>();
158+
REQUIRE(!filteredObjects.empty());
159+
size_t count{};
160+
for (const auto& qo : filteredObjects) {
161+
const auto& name = qo.getName();
162+
REQUIRE((name == "1" || name == "2"));
163+
++count;
164+
}
165+
REQUIRE(count == 2);
166+
}
167+
168+
TEST_CASE("Data - raw pointers", "[Data]")
169+
{
170+
Data data;
171+
int a = 1;
172+
int b = 2;
173+
data.insert("1", &a);
174+
data.insert("2", &b);
175+
176+
auto ints = data.iterateByType<int>();
177+
REQUIRE(!ints.empty());
178+
179+
size_t count{};
180+
for (const auto& v : ints) {
181+
REQUIRE((v == 1 || v == 2));
182+
++count;
183+
}
184+
REQUIRE(count == 2);
185+
}

Modules/Skeleton/include/Skeleton/SkeletonAggregator.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include <Rtypes.h>
2222
// QC
2323
#include "QualityControl/AggregatorInterface.h"
24+
#include "QualityControl/Data.h"
2425

2526
namespace o2::quality_control_modules::skeleton
2627
{
@@ -32,11 +33,11 @@ class SkeletonAggregator : public o2::quality_control::checker::AggregatorInterf
3233
public:
3334
// Override interface
3435
void configure() override;
35-
std::map<std::string, o2::quality_control::core::Quality> aggregate(o2::quality_control::core::QualityObjectsMapType& qoMap) override;
36+
std::map<std::string, o2::quality_control::core::Quality> aggregate(const o2::quality_control::core::Data& data) override;
3637

3738
ClassDefOverride(SkeletonAggregator, 1);
3839
};
3940

4041
} // namespace o2::quality_control_modules::skeleton
4142

42-
#endif //QUALITYCONTROL_SKELETONAGGREGATOR_H
43+
#endif // QUALITYCONTROL_SKELETONAGGREGATOR_H

Modules/Skeleton/src/SkeletonAggregator.cxx

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,22 +32,20 @@ void SkeletonAggregator::configure()
3232
std::string parameter = mCustomParameters.atOrDefaultValue("myOwnKey", "fallback value");
3333
}
3434

35-
std::map<std::string, Quality> SkeletonAggregator::aggregate(QualityObjectsMapType& qoMap)
35+
std::map<std::string, Quality> SkeletonAggregator::aggregate(const o2::quality_control::core::Data& data)
3636
{
3737
// THUS FUNCTION BODY IS AN EXAMPLE. PLEASE REMOVE EVERYTHING YOU DO NOT NEED.
3838
std::map<std::string, Quality> result;
3939

4040
ILOG(Info, Devel) << "Entered SkeletonAggregator::aggregate" << ENDM;
41-
ILOG(Info, Devel) << " received a list of size : " << qoMap.size() << ENDM;
42-
for (const auto& item : qoMap) {
43-
ILOG(Info, Devel) << "Object: " << (*item.second) << ENDM;
44-
}
41+
ILOG(Info, Devel) << " received a data of size : " << data.size() << ENDM;
4542

4643
// we return the worse quality of all the objects we receive
4744
Quality current = Quality::Good;
48-
for (const auto& qo : qoMap) {
49-
if (qo.second->getQuality().isWorseThan(current)) {
50-
current = qo.second->getQuality();
45+
for (const auto& qo : data.iterateByType<QualityObject>()) {
46+
ILOG(Info, Devel) << "Object: " << qo << ENDM;
47+
if (qo.getQuality().isWorseThan(current)) {
48+
current = qo.getQuality();
5149
}
5250
}
5351

0 commit comments

Comments
 (0)