18 #ifdef XAOD_STANDALONE
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)
82 setType (
const std::string& val_type)
98 setName (
const std::string& val_name)
118 const auto split = val_typeAndName.find (
'/');
119 if (
split == std::string::npos)
134 const std::string&
value)
137 if (
split == std::string::npos)
143 subtool.config->setPropertyFromString (subtool.name,
value);
151 const std::string& toolType)
160 const std::string& toolType)
171 using namespace msgComponentConfig;
174 if (
split == std::string::npos)
178 return StatusCode::SUCCESS;
182 return subtool.config->addPrivateTool (subtool.name, std::move (toolConfig));
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));
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;
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;
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;
303 TClass* componentClass = TClass::GetClass (
type.c_str());
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()));
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;
338 return StatusCode::FAILURE;
342 ToolHandle<AsgTool>
th (toolInfo.first, component.get());
343 std::shared_ptr<void> mycleanup;
344 if (AsgToolConfig(toolInfo.second.m_config).makeTool (
th, mycleanup).isFailure())
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;
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));
372 ANA_CHECK (component->setProperty (property.first, property.second));
376 return StatusCode::SUCCESS;
387 bool nestedNames)
const
389 using namespace msgComponentConfig;
399 if (
tool.second.m_propName.empty())
402 joSvc->set (toolPath,
tool.second.m_config.typeAndName());
408 std::vector<std::string> valueArray;
409 for (
const auto&
tool : toolArray.second)
416 return StatusCode::FAILURE;
418 valueArray.push_back (toolConfig->second.m_config.typeAndName());
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;