Skip to content

Commit

Permalink
Delete the interfaces deprecated by Checkers 2.0 (#297)
Browse files Browse the repository at this point in the history
  • Loading branch information
knopers8 committed Jan 31, 2020
1 parent 492ac73 commit db5649f
Show file tree
Hide file tree
Showing 9 changed files with 1 addition and 225 deletions.
62 changes: 1 addition & 61 deletions Framework/include/QualityControl/MonitorObject.h
Expand Up @@ -24,26 +24,10 @@
#include <TObject.h>
// O2
#include <Common/Exceptions.h>
// QC
#include "QualityControl/Quality.h"

namespace o2::quality_control::core
{

/// \brief Container for the definition of a check
struct CheckDefinition {
public:
CheckDefinition() : result(Quality::Null) {}
virtual ~CheckDefinition() = default;

std::string name;
std::string className;
std::string libraryName;
Quality result;

ClassDef(CheckDefinition, 1);
};

struct DuplicateObjectError : virtual AliceO2::Common::ExceptionBase {
const char* what() const noexcept override
{
Expand Down Expand Up @@ -84,22 +68,10 @@ class MonitorObject : public TObject
/// @return The name as "{getTaskName()}/{getName())}.
const std::string getFullName() const { return getTaskName() + "/" + getName(); }

///
/// \brief Get the quality of this object.
///
/// The method returns the lowest quality met amongst all the checks listed in \ref mChecks.
/// If there are no checks, the method returns \ref Quality::Null.
///
/// @return the quality of the object
///
Quality getQuality() const;

TObject* getObject() const { return mObject; }

void setObject(TObject* object) { mObject = object; }

std::map<std::string, CheckDefinition> getChecks() const { return mChecks; }

bool isIsOwner() const { return mIsOwner; }

void setIsOwner(bool isOwner) { mIsOwner = isOwner; }
Expand All @@ -110,37 +82,6 @@ class MonitorObject : public TObject
const std::string& getDetectorName() const { return mDetectorName; }
void setDetectorName(const std::string& detectorName) { mDetectorName = detectorName; }

/// \brief Add a check to be executed on this object when computing the quality.
/// If a check with the same name already exists it will be replaced by this check.
/// Several checks can be added for the same check class name, but with different names (and
/// they will get different configuration).
/// \author Barthelemy von Haller
/// \param name Arbitrary name to identify this Check.
/// \param checkClassName The name of the class of the Check.
/// \param checkLibraryName The name of the library containing the Check. If not specified it is taken from already
/// loaded libraries.
void addCheck(const std::string name, const std::string checkClassName, const std::string checkLibraryName = "");

/// \brief Add or update the check with the provided name.
/// @param checkName The name of the check. If another check has already been added with this name it will be
/// replaced.
/// @param check The check to add or replace.
void addOrReplaceCheck(std::string checkName, CheckDefinition check);

/// \brief Set the given quality to the check called checkName.
/// If no check exists with this name, it throws a AliceO2::Common::ObjectNotFoundError.
/// @param checkName The name of the check
/// @param quality The new quality of the check.
/// \throw AliceO2::Common::ObjectNotFoundError
void setQualityForCheck(std::string checkName, Quality quality);

/// Return the check (by value!) for the given name.
/// If no such check exists, AliceO2::Common::ObjectNotFoundError is thrown.
/// \param checkName The name of the check
/// \return The CheckDefinition of the check named checkName.
/// \throw AliceO2::Common::ObjectNotFoundError
CheckDefinition getCheck(std::string checkName) const;

/// \brief Add key value pair that will end up in the database
/// Add a metadata (key value pair) to the MonitorObject. It will be stored in the database.
/// If the key already exists the value will be updated.
Expand All @@ -158,7 +99,6 @@ class MonitorObject : public TObject

private:
TObject* mObject;
std::map<std::string /*checkName*/, CheckDefinition> mChecks;
std::string mTaskName;
std::string mDetectorName;
std::map<std::string, std::string> mUserMetadata;
Expand All @@ -168,7 +108,7 @@ class MonitorObject : public TObject
// TODO : maybe we should always be the owner ?
bool mIsOwner;

ClassDefOverride(MonitorObject, 5);
ClassDefOverride(MonitorObject, 6);
};

} // namespace o2::quality_control::core
Expand Down
20 changes: 0 additions & 20 deletions Framework/include/QualityControl/ObjectsManager.h
Expand Up @@ -71,26 +71,6 @@ class ObjectsManager
*/
void stopPublishing(const std::string& name);

/**
* Return the quality of the object whose name is contained in objectName.
* @param objectName
* @return The quality of the object if was found.
* @throw ObjectNotFoundError if object is not found.
*/
Quality getQuality(std::string objectName);

/// \brief Add a check to the object defined by objectName.
/// If a check with the same already exist for this object, it will be replaced.
/// \param objectName
/// \param checkName
/// \param checkClassName
/// \param checkLibraryName
void addCheck(const std::string& objectName, const std::string& checkName, const std::string& checkClassName,
const std::string& checkLibraryName = "");

void addCheck(const TObject* object, const std::string& checkName, const std::string& checkClassName,
const std::string& checkLibraryName = "");

MonitorObject* getMonitorObject(std::string objectName);

TObject* getObject(std::string objectName);
Expand Down
4 changes: 0 additions & 4 deletions Framework/include/QualityControl/TypesLinkDef.h
Expand Up @@ -5,12 +5,8 @@

#pragma link C++ namespace o2::quality_control::core;

#pragma link C++ class o2::quality_control::core::CheckDefinition + ;
#pragma link C++ class o2::quality_control::core::MonitorObject + ;
#pragma link C++ class o2::quality_control::core::QualityObject + ;
#pragma link C++ class o2::quality_control::core::Quality + ;

#pragma link C++ class std::pair < std::string, o2::quality_control::core::CheckDefinition>;
#pragma link C++ class std::map < std::string, o2::quality_control::core::CheckDefinition>;

#endif
48 changes: 0 additions & 48 deletions Framework/src/MonitorObject.cxx
Expand Up @@ -63,54 +63,6 @@ const char* MonitorObject::GetName() const
return mObject->GetName();
}

void MonitorObject::setQualityForCheck(std::string checkName, Quality quality)
{
auto check = mChecks.find(checkName);
if (check != mChecks.end()) {
check->second.result = quality;
mChecks[checkName] = check->second;
} else {
throw AliceO2::Common::ObjectNotFoundError();
}
}

CheckDefinition MonitorObject::getCheck(std::string checkName) const
{
if (mChecks.find(checkName) != mChecks.end()) {
return mChecks.at(checkName);
} else {
throw AliceO2::Common::ObjectNotFoundError();
}
}

void MonitorObject::addCheck(const std::string name, const std::string checkClassName,
const std::string checkLibraryName)
{
CheckDefinition check;
check.name = name;
check.libraryName = checkLibraryName;
check.className = checkClassName;
mChecks[name] = check;
}

void MonitorObject::addOrReplaceCheck(std::string checkName, CheckDefinition check) { mChecks[checkName] = check; }

Quality MonitorObject::getQuality() const
{
Quality global = Quality::Null;

for (const auto& checkPair : getChecks()) {
const CheckDefinition& checkDef = checkPair.second;
if (checkDef.result != Quality::Null) {
if (checkDef.result.isWorstThan(global) || global == Quality::Null) {
global = checkDef.result;
}
}
}

return global;
}

void MonitorObject::addMetadata(std::string key, std::string value)
{
mUserMetadata[key] = value;
Expand Down
22 changes: 0 additions & 22 deletions Framework/src/ObjectsManager.cxx
Expand Up @@ -95,22 +95,6 @@ void ObjectsManager::stopPublishing(const string& name)
mMonitorObjects->Remove(mo);
}

Quality ObjectsManager::getQuality(std::string objectName)
{
MonitorObject* mo = getMonitorObject(objectName);
return mo->getQuality();
}
// fixme: keep user informed, that giving the same names for their objects is a bad idea
void ObjectsManager::addCheck(const std::string& objectName, const std::string& checkName,
const std::string& checkClassName, const std::string& checkLibraryName)
{
MonitorObject* mo = getMonitorObject(objectName);
mo->addCheck(checkName, checkClassName, checkLibraryName);

QcInfoLogger::GetInstance() << "Added check : " << objectName << " , " << checkName << " , " << checkClassName
<< " , " << checkLibraryName << infologger::endm;
}

MonitorObject* ObjectsManager::getMonitorObject(std::string objectName)
{
TObject* mo = mMonitorObjects->FindObject(objectName.c_str());
Expand All @@ -133,12 +117,6 @@ TObjArray* ObjectsManager::getNonOwningArray() const
return new TObjArray(*mMonitorObjects);
}

void ObjectsManager::addCheck(const TObject* object, const std::string& checkName, const std::string& checkClassName,
const std::string& checkLibraryName)
{
addCheck(object->GetName(), checkName, checkClassName, checkLibraryName);
}

void ObjectsManager::addMetadata(const std::string& objectName, const std::string& key, const std::string& value)
{
MonitorObject* mo = getMonitorObject(objectName);
Expand Down
47 changes: 0 additions & 47 deletions Framework/test/testMonitorObject.cxx
Expand Up @@ -35,38 +35,6 @@ BOOST_AUTO_TEST_CASE(mo)
o2::quality_control::core::MonitorObject obj;
BOOST_CHECK_EQUAL(obj.getName(), "");
BOOST_CHECK_EQUAL(obj.GetName(), "");

obj.addCheck("first", "class1", "lib1");
obj.addCheck("second", "class1", "lib1");
obj.addCheck("third", "class2", "lib1");
obj.addCheck("first", "class2", "lib1");
auto checkers1 = obj.getChecks();
BOOST_CHECK_EQUAL(checkers1["first"].name, "first");
BOOST_CHECK_EQUAL(checkers1["first"].className, "class2");
BOOST_CHECK_EQUAL(checkers1["first"].libraryName, "lib1");
BOOST_CHECK_EQUAL(obj.getCheck("second").name, "second");
BOOST_CHECK_EQUAL(obj.getCheck("second").className, "class1");
BOOST_CHECK_EQUAL(obj.getCheck("second").libraryName, "lib1");

BOOST_CHECK_EQUAL(obj.getQuality(), Quality::Null);
obj.setQualityForCheck("first", Quality::Good);
BOOST_CHECK_EQUAL(obj.getQuality(), Quality::Good);
obj.setQualityForCheck("second", Quality::Bad);
BOOST_CHECK_EQUAL(obj.getQuality(), Quality::Bad);
obj.setQualityForCheck("second", Quality::Medium);
BOOST_CHECK_EQUAL(obj.getQuality(), Quality::Medium);
}

BOOST_AUTO_TEST_CASE(mo_check)
{
o2::quality_control::core::MonitorObject obj;
BOOST_CHECK_EQUAL(obj.getQuality(), Quality::Null);
CheckDefinition check;
check.name = "test";
check.libraryName = "test";
check.className = "test";
obj.addOrReplaceCheck("test", check);
BOOST_CHECK_EQUAL(obj.getQuality(), Quality::Null);
}

BOOST_AUTO_TEST_CASE(mo_save)
Expand All @@ -82,15 +50,7 @@ BOOST_AUTO_TEST_CASE(mo_save)
BOOST_CHECK_EQUAL(obj.GetTitle(), "");
obj.setIsOwner(false);
string libName = "libraryName";
obj.addCheck("name", "className", libName);
string libName2 = "libraryName2";
obj.addCheck("name2", "className2", libName2);
obj.setQualityForCheck("name", Quality::Good);
BOOST_CHECK_EQUAL(obj.getQuality(), Quality::Good);
ILOG(Info) << "quality : " << obj.getQuality() << ENDM;
ILOG(Info) << "check numbers : " << obj.getChecks().size() << ENDM;
CheckDefinition c = obj.getCheck("name2");
ILOG(Info) << "check2 libraryName : " << c.libraryName << ENDM;
std::chrono::nanoseconds ns = std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::system_clock::now().time_since_epoch());
std::string filename = string("/tmp/test") + std::to_string(ns.count()) + ".root";
TFile file(filename.data(), "RECREATE");
Expand All @@ -106,13 +66,6 @@ BOOST_AUTO_TEST_CASE(mo_save)
BOOST_CHECK_EQUAL(mo->getName(), objectName);
ILOG(Info) << "name : " << mo->GetName() << ENDM;
ILOG(Info) << "name : " << mo->getName() << ENDM;
BOOST_CHECK_EQUAL(mo->getQuality(), Quality::Good);
ILOG(Info) << "quality : " << mo->getQuality() << ENDM;
BOOST_CHECK_EQUAL(mo->getChecks().size(), 2);
ILOG(Info) << "check numbers : " << mo->getChecks().size() << ENDM;
CheckDefinition c2 = mo->getCheck("name2");
ILOG(Info) << "check2 libraryName : " << c2.libraryName << ENDM;
BOOST_CHECK_EQUAL(c2.libraryName, libName2);
gSystem->Unlink(filename.data());
}

Expand Down
16 changes: 0 additions & 16 deletions Framework/test/testPublisher.cxx
Expand Up @@ -39,26 +39,10 @@ BOOST_AUTO_TEST_CASE(publisher_test)

TObjString* s2 = (TObjString*)(objectsManager.getObject("content"));
BOOST_CHECK_EQUAL(s.GetString(), s2->GetString());
BOOST_CHECK_EQUAL(Quality::Null, objectsManager.getQuality("content"));
MonitorObject* mo = nullptr;
BOOST_CHECK_THROW(mo = objectsManager.getMonitorObject("test"), AliceO2::Common::ObjectNotFoundError);
BOOST_CHECK_EQUAL(mo, nullptr);
mo = objectsManager.getMonitorObject("content");
BOOST_CHECK_THROW(mo->setQualityForCheck("test", Quality::Medium), AliceO2::Common::ObjectNotFoundError);

objectsManager.addCheck("content", "checkname", "test", "Skeleton");
BOOST_CHECK_EQUAL(Quality::Null, objectsManager.getQuality("content"));
BOOST_CHECK_THROW(objectsManager.getQuality("test2"), ObjectNotFoundError);

// that is just for me to see how it looks like
// try {
// objectsManager.getQuality("test2");
// } catch (ObjectNotFoundError& e) {
// std::ILOG(Info) << e.what() << std::ENDM;
// if (std::string const* extra = boost::get_error_info<errinfo_object_name>(e)) {
// std::ILOG(Info) << "object name : " << *extra << std::ENDM;
// }
// }
}

} // namespace o2::quality_control::core
4 changes: 0 additions & 4 deletions Modules/Common/test/testMeanIsAbove.cxx
Expand Up @@ -29,8 +29,6 @@ namespace o2::quality_control_modules::common
BOOST_AUTO_TEST_CASE(test_checks)
{
std::shared_ptr<MonitorObject> mo(new MonitorObject()); // here we are the owner of the histo
mo->addCheck("test", "test", "test");
mo->setQualityForCheck("test", Quality::Null);
TH1F th1f("h1", "h1", 10, 0, 9);
mo->setObject(&th1f);
mo->setIsOwner(false);
Expand Down Expand Up @@ -61,8 +59,6 @@ BOOST_AUTO_TEST_CASE(test_checks)
BOOST_AUTO_TEST_CASE(test_types)
{
std::shared_ptr<MonitorObject> mo(new MonitorObject()); // here we are the owner of the histo
mo->addCheck("test", "test", "test");
mo->setQualityForCheck("test", Quality::Null);
TObject obj;
mo->setObject(&obj);
mo->setIsOwner(false);
Expand Down
3 changes: 0 additions & 3 deletions doc/Advanced.md
Expand Up @@ -227,9 +227,6 @@ workflow specification for AliECS
- The library is compiled with the same QC, O2, ROOT and GCC version as the
ones which are installed with the FLP suite. Especially, the task and check
interfaces have to be identical.
- If there are checks applied to MonitorObjects, update the library path in
the addCheck() functions as well. This will not be necessary when checks are
configured inside config files.

## Use MySQL as QC backend

Expand Down

0 comments on commit db5649f

Please sign in to comment.