Skip to content

Commit ef0dc54

Browse files
author
Michal Tichák
committed
for Piotr
1 parent 2424063 commit ef0dc54

File tree

6 files changed

+129
-11
lines changed

6 files changed

+129
-11
lines changed

Framework/include/QualityControl/Data.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
#include <any>
2121
#include <concepts>
2222
#include <functional>
23-
#include <map>
2423
#include <memory>
2524
#include <optional>
2625
#include <string>

Framework/include/QualityControl/DataAdapters.h

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,19 @@ Data createData(const std::map<std::string, std::shared_ptr<MonitorObject>>& moM
2828
Data createData(const QualityObjectsMapType& moMap);
2929

3030
template <typename Result, typename DataContainer>
31-
auto iterateMOsFilterByNameAndTransform(const DataGeneric<DataContainer>& data, std::string_view moName)
32-
{
33-
return data.template iterateByTypeFilterAndTransform<MonitorObject, Result>(
34-
[name = std::string{ moName }](const std::pair<std::string_view, const MonitorObject*>& pair) -> bool { return std::string_view{ pair.second->GetName() } == name; },
35-
[](const MonitorObject* ptr) -> const Result* { return dynamic_cast<const Result*>(ptr->getObject()); });
36-
}
31+
auto iterateMonitorObjects(const DataGeneric<DataContainer>& data, std::string_view moName);
32+
33+
inline auto iterateMonitorObjects(const Data& data);
34+
inline auto iterateMonitorObjects(const Data& data, std::string_view taskName);
35+
36+
std::optional<std::reference_wrapper<const MonitorObject>> getMonitorObject(const Data& data, std::string_view objectName, std::string_view taskName);
37+
// returns first occurence of MO with given name (possible name clash)
38+
template <typename StoredType = MonitorObject>
39+
std::optional<std::reference_wrapper<const StoredType>> getMonitorObject(const Data& data, std::string_view objectName);
3740

3841
} // namespace o2::quality_control::core
3942

43+
// Templates definitions
44+
#include "QualityControl/DataAdapters.inl"
45+
4046
#endif
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
// Copyright 2025 CERN and copyright holders of ALICE O2.
2+
// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3+
// All rights not expressly granted are reserved.
4+
//
5+
// This software is distributed under the terms of the GNU General Public
6+
// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7+
//
8+
// In applying this license CERN does not waive the privileges and immunities
9+
// granted to it by virtue of its status as an Intergovernmental Organization
10+
// or submit itself to any jurisdiction.
11+
12+
///
13+
/// \file DataAdapters.h
14+
/// \author Michal Tichak
15+
///
16+
17+
#ifndef QC_CORE_DATA_ADAPTERS_IMPL_H
18+
#define QC_CORE_DATA_ADAPTERS_IMPL_H
19+
20+
#include <optional>
21+
#include <string_view>
22+
#include "QualityControl/Data.h"
23+
#include "QualityControl/MonitorObject.h"
24+
#include "QualityControl/QualityObject.h"
25+
// #include "QualityControl/DataAdapters.h"
26+
27+
namespace o2::quality_control::core
28+
{
29+
30+
template <typename Result, typename DataContainer>
31+
auto iterateMonitorObjects(const DataGeneric<DataContainer>& data, std::string_view moName)
32+
{
33+
return data.template iterateByTypeFilterAndTransform<MonitorObject, Result>(
34+
[name = std::string{ moName }](const std::pair<std::string_view, const MonitorObject*>& pair) -> bool { return std::string_view{ pair.second->GetName() } == name; },
35+
[](const MonitorObject* ptr) -> const Result* { return dynamic_cast<const Result*>(ptr->getObject()); });
36+
}
37+
38+
inline auto iterateMonitorObjects(const o2::quality_control::core::Data& data)
39+
{
40+
return data.iterateByType<o2::quality_control::core::MonitorObject>();
41+
}
42+
43+
template <typename StoredType>
44+
std::optional<std::reference_wrapper<const StoredType>> getMonitorObject(const Data& data, std::string_view objectName)
45+
{
46+
if constexpr (std::same_as<StoredType, MonitorObject>) {
47+
for (const auto& mo : data.iterateByTypeAndFilter<o2::quality_control::core::MonitorObject>(
48+
[&objectName](const auto& pair) {
49+
return pair.second->GetName() == objectName;
50+
})) {
51+
return { mo };
52+
}
53+
} else {
54+
for (const auto& v : data.template iterateByTypeFilterAndTransform<MonitorObject, StoredType>(
55+
[&objectName](const std::pair<std::string_view, const MonitorObject*>& pair) -> bool { return std::string_view{ pair.second->GetName() } == objectName; },
56+
[](const MonitorObject* ptr) -> const auto* { return dynamic_cast<const StoredType*>(ptr->getObject()); })) {
57+
return { v };
58+
}
59+
}
60+
return std::nullopt;
61+
}
62+
63+
// inline auto iterateMonitorObjects(const o2::quality_control::core::Data& data, std::string_view taskName)
64+
// {
65+
// return data.iterateByTypeAndFilter<o2::quality_control::core::MonitorObject>([taskName = std::string{ taskName }](const auto& pair) { return pair.second->getTaskName() == taskName; });
66+
// }
67+
//
68+
// std::optional<std::reference_wrapper<const o2::quality_control::core::MonitorObject>> getMonitorObject(const o2::quality_control::core::Data& data, std::string_view objectName, std::string_view taskName)
69+
// {
70+
// for (const auto& mo : data.iterateByTypeAndFilter<o2::quality_control::core::MonitorObject>(
71+
// [&taskName, &objectName](const auto& pair) {
72+
// return std::tuple(pair.second->getTaskName(), pair.second->GetName()) == std::tuple(taskName, objectName);
73+
// })) {
74+
// return { mo };
75+
// }
76+
// return std::nullopt;
77+
// }
78+
79+
// std::optional<std::reference_wrapper<const o2::quality_control::core::MonitorObject>> getMonitorObject(const o2::quality_control::core::Data& data, std::string_view objectName)
80+
// {
81+
// for (const auto& mo : data.iterateByTypeAndFilter<o2::quality_control::core::MonitorObject>(
82+
// [&objectName](const auto& pair) {
83+
// return objectName == pair.second->GetName();
84+
// })) {
85+
// return { mo };
86+
// }
87+
// return std::nullopt;
88+
// }
89+
90+
} // namespace o2::quality_control::core
91+
92+
#endif

Framework/test/testData.cxx

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ TEST_CASE("Data - Monitor adaptors MOs", "[Data]")
135135

136136
REQUIRE(data.size() == 2);
137137

138-
auto filteredHistos = iterateMOsFilterByNameAndTransform<TH1F>(data, "th11");
138+
auto filteredHistos = iterateMonitorObjects<TH1F>(data, "th11");
139139
REQUIRE(!filteredHistos.empty());
140140
size_t count{};
141141
for (const auto& histo1d : filteredHistos) {
@@ -279,6 +279,26 @@ TEMPLATE_TEST_CASE("Data - inserting and iterating MOs", "[.Data-benchmark]", st
279279
data.insert(mo->getFullName(), mo);
280280
}
281281

282-
REQUIRE(iterateMOsFilterByNameAndTransform<TH1F>(data, "notimportantname").empty());
282+
REQUIRE(iterateMonitorObjects<TH1F>(data, "notimportantname").empty());
283283
};
284284
}
285+
286+
TEST_CASE("Data adapters - helper functions")
287+
{
288+
289+
Data data;
290+
for (size_t i{}; i != 10; ++i) {
291+
const auto iStr = std::to_string(i);
292+
const auto thName = std::string("TH1F_") + iStr;
293+
const auto moName = "testMO_" + iStr;
294+
auto* h = new TH1F(thName.c_str(), thName.c_str(), 100, 0, 99);
295+
data.insert(moName, std::make_shared<MonitorObject>(h, "taskname", "class1", "TST"));
296+
}
297+
298+
REQUIRE(data.size() == 10);
299+
300+
const auto moOpt = getMonitorObject(data, "TH1F_1");
301+
REQUIRE(moOpt.has_value());
302+
const auto th1Opt = getMonitorObject<TH1F>(data, "TH1F_8");
303+
REQUIRE(th1Opt.has_value());
304+
}

Modules/Skeleton/src/SkeletonAggregator.cxx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
#include "Skeleton/SkeletonAggregator.h"
1818
#include "QualityControl/QcInfoLogger.h"
19+
#include "QualityControl/DataAdapters.h"
1920

2021
using namespace std;
2122
using namespace o2::quality_control::core;
@@ -42,7 +43,7 @@ std::map<std::string, Quality> SkeletonAggregator::aggregate(const o2::quality_c
4243

4344
// we return the worse quality of all the objects we receive
4445
Quality current = Quality::Good;
45-
for (const auto& qo : data.iterateByType<QualityObject>()) {
46+
for (const auto& qo : iterateQualityObjects(data)) {
4647
ILOG(Info, Devel) << "Object: " << qo << ENDM;
4748
if (qo.getQuality().isWorseThan(current)) {
4849
current = qo.getQuality();

Modules/Skeleton/src/SkeletonCheck.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ Quality SkeletonCheck::check(const quality_control::core::Data& data)
5858
// and you can get your custom parameters:
5959
ILOG(Debug, Devel) << "custom param physics.pp.myOwnKey1 : " << mCustomParameters.atOrDefaultValue("myOwnKey1", "default_value", "physics", "pp") << ENDM;
6060

61-
for (const auto& h : iterateMOsFilterByNameAndTransform<TH1>(data, "example")) {
61+
for (const auto& h : iterateMonitorObjects<TH1>(data, "example")) {
6262
// unless we find issues, we assume the quality is good
6363
result = Quality::Good;
6464

0 commit comments

Comments
 (0)