Skip to content

Commit 13084fd

Browse files
authored
refactor MonitorObject and adding Copy capabilities (#2450)
refactored MonitorObject to use more modern code and to be safer. --------- Co-authored-by: Michal Tichák <michal.tichak@cern.ch>
1 parent 83c27f8 commit 13084fd

4 files changed

Lines changed: 369 additions & 41 deletions

File tree

Framework/CMakeLists.txt

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,22 @@ configure_file("include/QualityControl/Version.h.in"
55
"${CMAKE_CURRENT_BINARY_DIR}/include/QualityControl/Version.h"
66
@ONLY)
77

8-
# ---- Library for the types ----
8+
# ---- Library for IL ----
9+
add_library(O2QualityControlInfoLogger STATIC
10+
src/QcInfoLogger.cxx
11+
)
12+
13+
target_include_directories(O2QualityControlInfoLogger
14+
PUBLIC
15+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
16+
)
17+
18+
target_link_libraries(O2QualityControlInfoLogger
19+
PUBLIC
20+
AliceO2::InfoLogger
21+
)
922

23+
# ---- Library for the types ----
1024
add_library(O2QualityControlTypes
1125
src/MonitorObject.cxx
1226
src/QualityObject.cxx
@@ -21,11 +35,13 @@ target_include_directories(
2135
)
2236

2337
target_link_libraries(O2QualityControlTypes
38+
PRIVATE
39+
O2QualityControlInfoLogger
2440
PUBLIC
25-
ROOT::Hist
41+
AliceO2::BookkeepingApi
2642
AliceO2::Common
2743
O2::DataFormatsQualityControl
28-
AliceO2::BookkeepingApi
44+
ROOT::Hist
2945
)
3046

3147
add_root_dictionary(O2QualityControlTypes
@@ -70,7 +86,6 @@ add_library(O2QualityControl
7086
src/AggregatorInterface.cxx
7187
src/DatabaseFactory.cxx
7288
src/CcdbDatabase.cxx
73-
src/QcInfoLogger.cxx
7489
src/TaskFactory.cxx
7590
src/TaskRunner.cxx
7691
src/TaskRunnerFactory.cxx
@@ -141,7 +156,6 @@ target_link_libraries(O2QualityControl
141156
ROOT::Hist
142157
ROOT::TreePlayer
143158
AliceO2::Common
144-
AliceO2::InfoLogger
145159
AliceO2::Monitoring
146160
AliceO2::Configuration
147161
AliceO2::Occ
@@ -159,6 +173,7 @@ target_link_libraries(O2QualityControl
159173
${RDKAFKA_LIB}
160174
PRIVATE Boost::system
161175
CURL::libcurl
176+
O2QualityControlInfoLogger
162177
)
163178

164179
add_root_dictionary(O2QualityControl

Framework/include/QualityControl/MonitorObject.h

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,12 @@ class MonitorObject : public TObject
5050
/// Destructor
5151
~MonitorObject() override;
5252

53-
/// Copy constructor
54-
MonitorObject(const MonitorObject& other) = default;
53+
// /// Copy constructor
54+
MonitorObject(const MonitorObject& other);
5555
/// Move constructor
5656
MonitorObject(MonitorObject&& other) /*noexcept*/ = default;
5757
/// Copy assignment operator
58-
MonitorObject& operator=(const MonitorObject& other) = default;
58+
MonitorObject& operator=(const MonitorObject& other);
5959
/// Move assignment operator
6060
MonitorObject& operator=(MonitorObject&& other) /*noexcept*/ = default;
6161

@@ -69,19 +69,19 @@ class MonitorObject : public TObject
6969

7070
/// \brief Return joined task name and name of the encapsulated object (if any).
7171
/// @return The name as "{getTaskName()}/{getName())}.
72-
const std::string getFullName() const { return getTaskName() + "/" + getName(); }
72+
std::string getFullName() const;
7373

74-
TObject* getObject() const { return mObject; }
75-
void setObject(TObject* object) { mObject = object; }
74+
TObject* getObject() const;
75+
void setObject(TObject* object);
7676

77-
bool isIsOwner() const { return mIsOwner; }
78-
void setIsOwner(bool isOwner) { mIsOwner = isOwner; }
77+
bool isIsOwner() const;
78+
void setIsOwner(bool isOwner);
7979

80-
const std::string& getTaskName() const { return mTaskName; }
81-
void setTaskName(const std::string& taskName) { mTaskName = taskName; }
80+
const std::string& getTaskName() const;
81+
void setTaskName(const std::string& taskName);
8282

83-
const std::string& getDetectorName() const { return mDetectorName; }
84-
void setDetectorName(const std::string& detectorName) { mDetectorName = detectorName; }
83+
const std::string& getDetectorName() const;
84+
void setDetectorName(const std::string& detectorName);
8585

8686
const std::string& getTaskClass() const;
8787
void setTaskClass(const std::string& taskClass);
@@ -117,6 +117,8 @@ class MonitorObject : public TObject
117117
void Draw(Option_t* option) override;
118118
TObject* DrawClone(Option_t* option) const override;
119119

120+
void Copy(TObject& object) const override;
121+
120122
/// \brief Build the path to this object.
121123
/// Build the path to this object as it will appear in the GUI.
122124
/// \return A string containing the path.
@@ -126,7 +128,7 @@ class MonitorObject : public TObject
126128
void setDescription(const std::string& description);
127129

128130
private:
129-
TObject* mObject;
131+
std::unique_ptr<TObject> mObject;
130132
std::string mTaskName;
131133
std::string mTaskClass;
132134
std::string mDetectorName;
@@ -141,7 +143,10 @@ class MonitorObject : public TObject
141143
// tells Merger to create an object with data from the last cycle only on the side of the complete object
142144
bool mCreateMovingWindow = false;
143145

144-
ClassDefOverride(MonitorObject, 12);
146+
void releaseObject();
147+
void cloneAndSetObject(const MonitorObject&);
148+
149+
ClassDefOverride(MonitorObject, 13);
145150
};
146151

147152
} // namespace o2::quality_control::core

Framework/src/MonitorObject.cxx

Lines changed: 128 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -15,50 +15,92 @@
1515
///
1616

1717
#include "QualityControl/MonitorObject.h"
18+
#include <TObject.h>
19+
#include "QualityControl/RepoPathUtils.h"
20+
#include "QualityControl/QcInfoLogger.h"
1821

1922
#include <iostream>
20-
#include "QualityControl/RepoPathUtils.h"
2123

2224
using namespace std;
2325

2426
namespace o2::quality_control::core
2527
{
2628

2729
MonitorObject::MonitorObject()
28-
: TObject(),
29-
mObject(nullptr),
30-
mTaskName(""),
31-
mDetectorName(""),
32-
mIsOwner(true)
30+
: TObject{},
31+
mIsOwner{ true }
3332
{
3433
mActivity.mProvenance = "qc";
3534
mActivity.mId = 0;
3635
mActivity.mValidity = gInvalidValidityInterval;
3736
}
3837

3938
MonitorObject::MonitorObject(TObject* object, const std::string& taskName, const std::string& taskClass, const std::string& detectorName, int runNumber, const std::string& periodName, const std::string& passName, const std::string& provenance)
40-
: TObject(),
41-
mObject(object),
42-
mTaskName(taskName),
43-
mTaskClass(taskClass),
44-
mDetectorName(detectorName),
45-
mActivity(runNumber, "NONE", periodName, passName, provenance, gInvalidValidityInterval),
46-
mIsOwner(true)
39+
: TObject{},
40+
mObject{ object },
41+
mTaskName{ taskName },
42+
mTaskClass{ taskClass },
43+
mDetectorName{ detectorName },
44+
mActivity{ runNumber, "NONE", periodName, passName, provenance, gInvalidValidityInterval },
45+
mIsOwner{ true }
46+
{
47+
}
48+
49+
MonitorObject::MonitorObject(const MonitorObject& other)
50+
: TObject{ other },
51+
mObject{},
52+
mTaskName{ other.mTaskName },
53+
mTaskClass{ other.mTaskClass },
54+
mDetectorName{ other.mDetectorName },
55+
mUserMetadata{ other.mUserMetadata },
56+
mDescription{ other.mDescription },
57+
mActivity{ other.mActivity },
58+
mCreateMovingWindow{ other.mCreateMovingWindow }
59+
{
60+
cloneAndSetObject(other);
61+
}
62+
63+
MonitorObject& MonitorObject::operator=(const MonitorObject& other)
64+
{
65+
TObject::operator=(other);
66+
mTaskName = other.mTaskName;
67+
mTaskClass = other.mTaskClass;
68+
mDetectorName = other.mDetectorName;
69+
mUserMetadata = other.mUserMetadata;
70+
mDescription = other.mDescription;
71+
mActivity = other.mActivity;
72+
mCreateMovingWindow = other.mCreateMovingWindow;
73+
cloneAndSetObject(other);
74+
75+
return *this;
76+
}
77+
78+
void MonitorObject::Copy(TObject& object) const
4779
{
80+
static_cast<MonitorObject&>(object) = *this;
4881
}
4982

5083
MonitorObject::~MonitorObject()
5184
{
52-
if (mIsOwner) {
53-
delete mObject;
54-
mObject = nullptr;
55-
}
85+
releaseObject();
5686
}
5787

58-
void MonitorObject::Draw(Option_t* option) { mObject->Draw(option); }
88+
void MonitorObject::Draw(Option_t* option)
89+
{
90+
if (mObject) {
91+
mObject->Draw(option);
92+
} else {
93+
ILOG(Error, Devel) << "MonitorObject::Draw() : You are trying to draw MonitorObject with no internal TObject" << ENDM;
94+
}
95+
}
5996

6097
TObject* MonitorObject::DrawClone(Option_t* option) const
6198
{
99+
if (!mObject) {
100+
ILOG(Error, Devel) << "MonitorObject::DrawClone() : You are trying to draw MonitorObject with no internal TObject" << ENDM;
101+
return nullptr;
102+
}
103+
62104
auto* clone = new MonitorObject();
63105
clone->setTaskName(this->getTaskName());
64106
clone->setObject(mObject->DrawClone(option));
@@ -72,10 +114,9 @@ const std::string MonitorObject::getName() const
72114

73115
const char* MonitorObject::GetName() const
74116
{
75-
if (mObject == nullptr) {
76-
cerr << "MonitorObject::getName() : No object in this MonitorObject, returning empty string" << endl;
77-
static char empty[] = "";
78-
return empty;
117+
if (!mObject) {
118+
ILOG(Error, Ops) << "MonitorObject::getName() : No object in this MonitorObject, returning empty string" << ENDM;
119+
return "";
79120
}
80121
return mObject->GetName();
81122
}
@@ -160,6 +201,52 @@ void MonitorObject::updateValidity(validity_time_t value)
160201
mActivity.mValidity.update(value);
161202
}
162203

204+
std::string MonitorObject::getFullName() const
205+
{
206+
return getTaskName() + "/" + getName();
207+
}
208+
209+
TObject* MonitorObject::getObject() const
210+
{
211+
return mObject.get();
212+
}
213+
214+
void MonitorObject::setObject(TObject* object)
215+
{
216+
releaseObject();
217+
mObject.reset(object);
218+
}
219+
220+
bool MonitorObject::isIsOwner() const
221+
{
222+
return mIsOwner;
223+
}
224+
225+
void MonitorObject::setIsOwner(bool isOwner)
226+
{
227+
mIsOwner = isOwner;
228+
}
229+
230+
const std::string& MonitorObject::getTaskName() const
231+
{
232+
return mTaskName;
233+
}
234+
235+
void MonitorObject::setTaskName(const std::string& taskName)
236+
{
237+
mTaskName = taskName;
238+
}
239+
240+
const std::string& MonitorObject::getDetectorName() const
241+
{
242+
return mDetectorName;
243+
}
244+
245+
void MonitorObject::setDetectorName(const std::string& detectorName)
246+
{
247+
mDetectorName = detectorName;
248+
}
249+
163250
ValidityInterval MonitorObject::getValidity() const
164251
{
165252
return mActivity.mValidity;
@@ -185,4 +272,23 @@ bool MonitorObject::getCreateMovingWindow() const
185272
return mCreateMovingWindow;
186273
}
187274

275+
void MonitorObject::releaseObject()
276+
{
277+
if (!mIsOwner) {
278+
void(mObject.release());
279+
}
280+
}
281+
282+
void MonitorObject::cloneAndSetObject(const MonitorObject& other)
283+
{
284+
releaseObject();
285+
286+
if (auto* otherObject = other.getObject(); otherObject != nullptr && other.isIsOwner()) {
287+
mObject.reset(otherObject->Clone());
288+
} else {
289+
mObject.reset(otherObject);
290+
}
291+
mIsOwner = other.isIsOwner();
292+
}
293+
188294
} // namespace o2::quality_control::core

0 commit comments

Comments
 (0)