24#include <TInterpreter.h>
25#include <boost/format.hpp>
29#include "Gaudi/Interfaces/IOptionsSvc.h"
30#include <GaudiKernel/ServiceHandle.h>
48 std::string makeArrayName (
const std::string& name, std::size_t index)
50 return name +
"@" + std::to_string (index);
56 AsgComponentConfig (
const std::string& val_typeAndName)
63 bool AsgComponentConfig ::
64 empty ()
const noexcept
73 const std::string& AsgComponentConfig ::
74 type ()
const noexcept
81 void AsgComponentConfig ::
82 setType (
const std::string& val_type)
89 const std::string& AsgComponentConfig ::
90 name ()
const noexcept
97 void AsgComponentConfig ::
98 setName (
const std::string& val_name)
105 std::string AsgComponentConfig ::
115 void AsgComponentConfig ::
116 setTypeAndName (
const std::string& val_typeAndName)
118 const auto split = val_typeAndName.find (
'/');
119 if (
split == std::string::npos)
132 void AsgComponentConfig ::
133 setPropertyFromString (
const std::string&
name,
134 const std::string& value)
137 if (
split == std::string::npos)
143 subtool.config->setPropertyFromString (subtool.name, value);
149 StatusCode AsgComponentConfig ::
150 createPrivateTool (
const std::string&
name,
151 const std::string& toolType)
158 std::string AsgComponentConfig ::
159 createPrivateToolInArray (
const std::string&
name,
160 const std::string& toolType)
167 StatusCode AsgComponentConfig ::
168 addPrivateTool (
const std::string&
name,
171 using namespace msgComponentConfig;
174 if (
split == std::string::npos)
178 return StatusCode::SUCCESS;
182 return subtool.config->addPrivateTool (subtool.name, std::move (toolConfig));
188 std::string AsgComponentConfig ::
189 addPrivateToolInArray (
const std::string&
name,
192 using namespace msgComponentConfig;
195 if (
split == std::string::npos)
198 auto myname = makeArrayName (
name, arrayData.size());
201 arrayData.push_back (myname);
206 return subtool.prefix + subtool.config
207 ->addPrivateToolInArray (subtool.name, std::move (toolConfig));
213 StatusCode AsgComponentConfig ::
214 checkTypeName (
bool nestedNames)
const
216 using namespace msgComponentConfig;
218 std::regex typeExpr (
"[A-Za-z_][A-Za-z0-9_]*(::[A-Za-z_][A-Za-z0-9_]*)*");
219 if (!std::regex_match (
m_type, typeExpr))
222 return StatusCode::FAILURE;
226 nameExpr = std::regex (
"[A-Za-z_][A-Za-z0-9_]*(\\.[A-Za-z_][A-Za-z0-9_]*)*(@[0-9]+)?");
228 nameExpr = std::regex (
"[A-Za-z_][A-Za-z0-9_]*(@[0-9]+)?");
229 if (!std::regex_match (
m_name, nameExpr))
232 return StatusCode::FAILURE;
234 return StatusCode::SUCCESS;
240 accessSubtool (
const std::string&
name, std::size_t
split)
245 throw std::runtime_error (
"trying to access unknown private tool: " +
name.substr (0,
split));
246 result.config = &(subtool->second.m_config);
254#ifdef XAOD_STANDALONE
270 constexpr bool noDictionaryFactories =
false;
272 StatusCode createComponent (std::unique_ptr<AsgComponent>& component,
273 const std::string&
type,
274 const std::string& name,
275 const std::string& newCommand)
277 using namespace msgComponentConfig;
279 const auto *factory = getComponentFactory (
type);
283 component = (*factory) (name);
284 if (component ==
nullptr)
287 return StatusCode::FAILURE;
289 return StatusCode::SUCCESS;
292 if (noDictionaryFactories)
294 ANA_MSG_ERROR (
"no component factory for type " << type <<
" (dictionary factories disabled)");
295 return StatusCode::FAILURE;
298 ANA_MSG_DEBUG (
"using dictionary as factory for type " << type);
303 TClass* componentClass = TClass::GetClass (
type.c_str());
306 ATH_MSG_ERROR (
"Unable to load class dictionary for type " << type);
307 return StatusCode::FAILURE;
310 AsgComponent *
comp =
reinterpret_cast<AsgComponent*
>
311 (gInterpreter->Calc((
"dynamic_cast<asg::AsgComponent*>(" + (boost::format (newCommand) % type % name).
str() +
")").c_str()));
314 ANA_MSG_ERROR (
"failed to create component of type " << type);
315 ANA_MSG_ERROR (
"make sure you created a dictionary for your component");
316 return StatusCode::FAILURE;
318 component.reset (comp);
320 return StatusCode::SUCCESS;
327 makeComponentExpert<AsgComponent> (std::unique_ptr<AsgComponent>& component,
328 const std::string& newCommand,
329 bool nestedNames, std::string prefix)
const
331 using namespace msgComponentConfig;
337 if (!createComponent (component, m_type, name, newCommand).isSuccess())
338 return StatusCode::FAILURE;
340 for (
auto& toolInfo : m_privateTools)
342 ToolHandle<AsgTool>
th (toolInfo.first, component.get());
343 std::shared_ptr<void> mycleanup;
346 ANA_MSG_ERROR (
"failed to create subtool \"" << toolInfo.first <<
"\" on component \"" << component->name() <<
"\"");
347 return StatusCode::FAILURE;
349 component->addCleanup (mycleanup);
350 if (toolInfo.second.m_propName.empty())
352 if (component->setProperty (toolInfo.first,
th->name()).isFailure())
354 ANA_MSG_ERROR (
"failed to set ToolHandle property \"" << toolInfo.first <<
"\" on component \"" << component->name() <<
"\"");
355 return StatusCode::FAILURE;
360 for (
const auto& toolArray : m_toolArrays)
362 std::vector<std::string> valueArray;
363 for (
const auto& tool : toolArray.second)
364 valueArray.emplace_back (component->name() +
"." + tool);
365 std::string valueString;
366 ANA_CHECK (asg::detail::GetCastStringHelper<std::vector<std::string>>
::get (valueArray, valueString));
367 ANA_CHECK (component->setProperty (toolArray.first, valueString));
370 for (
auto& property : m_propertyValues)
372 ANA_CHECK (component->setProperty (property.first, property.second));
376 return StatusCode::SUCCESS;
385 StatusCode AsgComponentConfig ::
386 configureComponentExpert (
const std::string& prefix,
387 bool nestedNames)
const
389 using namespace msgComponentConfig;
398 ANA_CHECK (tool.second.m_config.configureComponentExpert (prefix +
m_name +
".",
true));
399 if (tool.second.m_propName.empty())
401 std::string toolPath = prefix +
m_name +
"." + tool.first;
402 joSvc->set (toolPath, tool.second.m_config.typeAndName());
408 std::vector<std::string> valueArray;
409 for (
const auto& tool : toolArray.second)
414 ANA_MSG_ERROR (
"Couldn't find private tool with name \"" << tool <<
"\"");
416 return StatusCode::FAILURE;
418 valueArray.push_back (toolConfig->second.m_config.typeAndName());
420 std::string valueString = Gaudi::Utils::toString (valueArray);
421 std::string propertyPath = prefix +
m_name +
"." + toolArray.first;
422 joSvc->set (propertyPath, valueString);
427 std::string propertyPath = prefix +
m_name +
"." +
property.first;
428 joSvc->set (propertyPath, property.second);
431 return StatusCode::SUCCESS;
std::string addPrivateToolInArray(const std::string &name, AsgComponentConfig toolConfig)
the array version of addPrivateTool
std::string m_type
the value of type
std::map< std::string, std::string > m_propertyValues
the map of property values
std::map< std::string, details::AsgComponentPrivateToolConfig > m_privateTools
the map of (private) tools to create
const std::string & name() const noexcept
the name of the component
void setType(const std::string &val_type)
set the value of type
void setTypeAndName(const std::string &val_typeAndName)
set type and name at the same time
AsgComponentConfig()=default
standard constructor
StatusCode checkTypeName(bool nestedNames) const
check that the type and name members have the correct format
AccessSubtoolData accessSubtool(const std::string &name, std::size_t split)
StatusCode addPrivateTool(const std::string &name, AsgComponentConfig toolConfig)
add a private tool from the given configuration
std::string m_name
the value of name
void setName(const std::string &val_name)
set the value of name
std::map< std::string, std::vector< std::string > > m_toolArrays
the map of (private) tool handle arrays to manage, and the tools they contain
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
std::vector< std::string > split(const std::string &s, const std::string &t=":")
::StatusCode StatusCode
StatusCode definition for legacy code.