Skip to content
Snippets Groups Projects
Commit dd701159 authored by Marco Clemencic's avatar Marco Clemencic
Browse files

Fix tool data handle propagation

Data handles of tools were not "propagated" to their parent algorithm
or tool. Similarly for sub-algorithms.

See merge request !223
parents f2881a2e b2293412
No related branches found
No related tags found
1 merge request!223Fix tool data handle propagation
Pipeline #
......@@ -200,8 +200,8 @@ public:
virtual void acceptDHVisitor( IDataHandleVisitor* ) const override;
DataObjIDColl inputDataObjs() const { return m_inputDataObjs; }
DataObjIDColl outputDataObjs() const { return m_outputDataObjs; }
const DataObjIDColl& inputDataObjs() const override { return m_inputDataObjs; }
const DataObjIDColl& outputDataObjs() const override { return m_outputDataObjs; }
void commitHandles() override;
......
......@@ -452,8 +452,8 @@ public:
virtual void acceptDHVisitor( IDataHandleVisitor* ) const override;
const DataObjIDColl& inputDataObjs() const { return m_inputDataObjs; }
const DataObjIDColl& outputDataObjs() const { return m_outputDataObjs; }
const DataObjIDColl& inputDataObjs() const override { return m_inputDataObjs; }
const DataObjIDColl& outputDataObjs() const override { return m_outputDataObjs; }
void commitHandles() override;
......
......@@ -5,18 +5,21 @@
#include "GaudiKernel/DataObjID.h"
#include <set>
class DHHVisitor : public IDataHandleVisitor {
public:
DHHVisitor(DataObjIDColl& ido, DataObjIDColl& odo);
const DataObjIDColl& ignoredInpKeys() const { return m_ign_i; }
const DataObjIDColl& ignoredOutKeys() const { return m_ign_o; }
void visit(const IDataHandleHolder* idhh) override;
DHHVisitor(DataObjIDColl& ido, DataObjIDColl& odo);
const DataObjIDColl& ignoredInpKeys() const { return m_ign_i; }
const DataObjIDColl& ignoredOutKeys() const { return m_ign_o; }
void visit(const IDataHandleHolder* visitee) override;
private:
DataObjIDColl &m_ido, &m_odo;
DataObjIDColl m_ign_i, m_ign_o;
DataObjIDColl &m_ido, &m_odo;
DataObjIDColl m_ign_i, m_ign_o;
};
#endif
......@@ -28,11 +28,15 @@ public:
virtual void commitHandles() = 0;
virtual const DataObjIDColl& inputDataObjs() const = 0;
virtual const DataObjIDColl& outputDataObjs() const = 0;
DeclareInterfaceID(IDataHandleHolder,1,0);
protected:
protected:
virtual void declareInput(Gaudi::DataHandle*) = 0;
virtual void declareOutput(Gaudi::DataHandle*) = 0;
};
class IDataHandleVisitor {
......
......@@ -210,8 +210,12 @@ StatusCode AlgTool::sysInitialize()
if ( !sc ) return sc;
m_state = m_targetState;
if ( m_updateDataHandles ) acceptDHVisitor( m_updateDataHandles.get() );
if (m_updateDataHandles) acceptDHVisitor(m_updateDataHandles.get());
// visit all sub-tools, build full set
DHHVisitor avis(m_inputDataObjs, m_outputDataObjs);
acceptDHVisitor(&avis);
return sc;
} );
}
......@@ -229,7 +233,7 @@ StatusCode AlgTool::initialize()
StatusCode AlgTool::sysStart()
{
//-----------------------------------------------------------------------------
return attempt( *this, "sysInitialize", [&]() {
return attempt( *this, "sysStart", [&]() {
m_targetState = Gaudi::StateMachine::ChangeState( Gaudi::StateMachine::START, m_state );
Gaudi::Guards::AuditorGuard guard( this,
// check if we want to audit the initialize
......
#include "GaudiKernel/DataHandleHolderVisitor.h"
#include "GaudiKernel/IDataHandleHolder.h"
#include "GaudiKernel/DataHandle.h"
#include <iostream>
#include "GaudiKernel/DataObjID.h"
#include <tuple>
#include <typeinfo>
DHHVisitor::DHHVisitor(DataObjIDColl& ido, DataObjIDColl& odo) :
m_ido(ido), m_odo(odo) {
namespace {
using std::make_tuple;
}
void
DHHVisitor::visit(const IDataHandleHolder* idhh) {
if (idhh == 0) return;
for (auto h : idhh->inputHandles()) {
if (! h->objKey().empty()) {
m_ido.insert(h->fullKey());
} else {
m_ign_i.insert(h->fullKey());
}
}
for (auto h : idhh->outputHandles()) {
if (! h->objKey().empty()) {
m_odo.insert(h->fullKey());
} else {
m_ign_o.insert(h->fullKey());
}
}
for (auto id : idhh->extraInputDeps()) {
if (! id.key().empty()) {
m_ido.insert( id );
} else {
m_ign_i.insert(id);
}
}
for (auto id : idhh->extraOutputDeps()) {
if (! id.key().empty()) {
m_odo.insert( id );
} else {
m_ign_o.insert(id);
}
}
DHHVisitor::DHHVisitor(DataObjIDColl& ido, DataObjIDColl& odo)
: m_ido(ido), m_odo(odo)
{
}
void DHHVisitor::visit(const IDataHandleHolder* v) {
if (!v) {
return;
}
// Loop over inputs and outputs of handles, extra dependiencies and objects to
// collect all of them.
// Handles and extra dependencies are those of a specific algorith or tool, while
// the collection of data objects also contains those of the tree of tools and
// algorithms below it.
// Loop over input handles and output handles and store those with with non-empty keys
// in the container of input objects passed to us and the others in a container of those
// we ignore for debug purposes. To avoid multiple for loops, make some tuples and loop
// over those.
for (auto& hs : {make_tuple(v->inputHandles(), std::ref(m_ido), std::ref(m_ign_i)),
make_tuple(v->outputHandles(), std::ref(m_odo), std::ref(m_ign_o))}) {
for (const auto& h : std::get<0>(hs)) {
if (! h->objKey().empty()) {
std::get<1>(hs).emplace(h->fullKey());
} else {
std::get<2>(hs).emplace(h->fullKey());
}
}
}
// The containers of handles are a different type than the on of input deps and input
// objects, so we need another loop here.
// NOTE: perhaps a view from range v3 can be used to also avoid this second loop.
for (auto& hs : {make_tuple(v->extraInputDeps(), std::ref(m_ido), std::ref(m_ign_i)),
make_tuple(v->extraOutputDeps(), std::ref(m_odo), std::ref(m_ign_o)),
make_tuple(v->inputDataObjs(), std::ref(m_ido), std::ref(m_ign_i)),
make_tuple(v->outputDataObjs(), std::ref(m_odo), std::ref(m_ign_o))}) {
for (const auto& h : std::get<0>(hs)) {
if (! h.key().empty()) {
std::get<1>(hs).emplace(h.fullKey());
} else {
std::get<2>(hs).emplace(h.fullKey());
}
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment