19 #include "GaudiKernel/ThreadLocalContext.h"
30 void popRenounced(
const std::vector<std::string> &renounce,
31 std::vector<Gaudi::DataHandle *> &new_input_handles) {
32 for (
const std::string &a_key : renounce) {
33 if (new_input_handles.back()->objKey() == a_key ) {
34 new_input_handles.pop_back();
56 size_t dotPosition =
varname.find(
'.');
57 containerName =
varname.substr(0, dotPosition);
58 methodName =
varname.substr(dotPosition + 1);
61 std::pair<RootUtils::TSMethodCall, TVirtualCollectionProxy *>
64 std::cout <<
"DEBUG SGxAODProxyLoader search for " << method_name <<
" in type " <<
info.name() << std::endl;
66 TClass *containerClass = TClass::GetClass(
info);
67 if (!containerClass) {
72 if (!containerClass) {
73 std::stringstream
msg;
74 msg <<
"No dictionary for " <<
info.name() << std::endl;
75 throw std::runtime_error(
msg.str());
78 TClass *elementClass=
nullptr;
79 TVirtualCollectionProxy *collection_proxy=
nullptr;
80 if( strcmp(containerClass->GetName(),
"SG::AuxElementStandaloneData")==0 ) {
81 elementClass=containerClass;
84 collection_proxy = containerClass->GetCollectionProxy();
85 elementClass = (collection_proxy ? collection_proxy->GetValueClass() :
nullptr);
87 std::stringstream
msg;
88 msg <<
"No collection proxy or element class for " <<
info.name() << std::endl;
89 throw std::runtime_error(
msg.str());
93 method_call.
setProto (elementClass, method_name,
"",
94 ROOT::kConversionMatch);
95 if (!method_call.
call() || !method_call.
call()->IsValid()) {
96 std::stringstream
msg;
97 msg <<
"No valid method " << method_name <<
" for " <<
info.name() << std::endl;
98 throw std::runtime_error(
msg.str());
102 std::cout <<
"DEBUG SGxAODProxyLoader got method " <<
" . " << method_name <<
" : "
103 << method_call.
call()->GetMethod()->GetReturnTypeNormalizedName ()
104 <<
" proto=" << method_call.
call()->GetProto()
105 <<
" signature=" << method_call.
call()->GetMethod()->GetSignature ()
106 <<
" proto=" << method_call.
call()->GetMethod()->GetPrototype()
109 return std::make_pair( method_call, collection_proxy);
113 template <
class T_Aux>
118 const std::string &method_name)
const
122 std::stringstream
msg;
123 msg <<
"Failed to get " <<
key.key();
124 throw std::runtime_error(
msg.str());
127 return std::unique_ptr<IAccessor>();
140 const std::string &
varname)
const
144 std::string container_name;
145 std::string method_name;
147 ReadHandleMap::const_iterator key_iter =
m_readKeys.find(container_name);
149 std::stringstream
msg;
150 msg <<
"No read handle key for " << container_name;
151 throw std::runtime_error(
msg.str());
154 ReadDecorHandleMap::const_iterator decor_key_iter =
m_decorKeys.end();
157 if (method_id != SG::null_auxid) {
161 std::unique_ptr<IAccessor>
accessor;
163 if (
m_verbose) { std::cout <<
"DEBUG SGxAODProxyLoader::computeClassForVarname is Vector: " <<
varname << std::endl; }
171 if (
m_verbose) { std::cout <<
"DEBUG SGxAODProxyLoader::computeClassForVarname is element: " <<
varname << std::endl; }
179 if (
m_verbose) { std::cout <<
"DEBUG SGxAODProxyLoader::computeClassForVarname try to create plain type accessor for " <<
varname << std::endl; }
187 std::cout <<
"DEBUG SGxAODProxyLoader use accessor "
188 <<
typeid(*accessorPlainPtr).name() <<
" for " <<
varname
191 accessor_iter->second.set(std::move(
accessor));
192 return *(accessor_iter->second);
196 const EventContext& ctx = Gaudi::Hive::currentContext();
201 template <
typename T>
203 for (
auto elm :
vec) {
204 std::cout <<
" " << elm;
211 #ifdef DEBUG_VARIABLE_LOADING
212 std::cout <<
"DEBUG SGxAODProxyLoader::dump " <<
varname <<
val << std::endl;
220 const EventContext& ctx = Gaudi::Hive::currentContext();
226 const EventContext& ctx = Gaudi::Hive::currentContext();
232 const EventContext& ctx = Gaudi::Hive::currentContext();
238 const EventContext& ctx = Gaudi::Hive::currentContext();
243 const std::vector<std::string> &var_names,
244 const std::vector<std::string> &renounce,
245 const std::vector<const DataObjID *> &input_data_in,
246 const std::vector<const DataObjID *> &output_data_in,
247 std::vector<Gaudi::DataHandle *> &new_input_handles,
248 std::vector<Gaudi::DataHandle *> &new_output_handles)
250 (void) new_output_handles;
252 for (
const std::string &
var_name : var_names) {
254 std::string container_name;
255 std::string method_name;
258 std::cout <<
"DEBUG SGxAODProxyLoader::updateDataDependencies var " <<
var_name <<
" -> " << container_name <<
" . " << method_name
259 <<
" i:" << input_data_in.size() <<
" o:" << output_data_in.size()
262 const DataObjID *container_data_id=
nullptr;
263 const DataObjID *method_data_id=
nullptr;
272 auto set_ids = [&method_data_id,&container_data_id,&
var_name,&container_name,
verbose](
const DataObjID *obj_data_id) ->
bool {
273 std::string_view handle_key(obj_data_id->key());
274 std::string::size_type
pos=obj_data_id->key().find(
'+');
275 pos = (
pos==std::string::npos ? 0 :
pos+1);
276 handle_key=handle_key.substr(
pos,handle_key.size()-
pos);
277 if (
verbose && (handle_key == container_name || handle_key ==
var_name)) {
279 std::cout <<
"DEBUG SGxAODProxyLoader::updateDataDependencies " << handle_key <<
" matches " <<
var_name <<
" ? "
280 << (handle_key ==
var_name ?
" method " :
"")
281 << (handle_key == container_name ?
" container " :
"")
282 <<
"-> " << (base_info ? base_info->
typeinfo().name() :
"")
286 method_data_id = obj_data_id;
287 if (container_data_id)
return true;
289 else if (handle_key == container_name ) {
290 container_data_id = obj_data_id;
291 if (method_data_id)
return true;
296 for( std::vector<const DataObjID *>::const_iterator elm_iter = output_data_in.begin(); elm_iter != output_data_in.end() && !set_ids(*elm_iter); ++elm_iter) {}
297 if (!method_data_id) {
298 for( std::vector<const DataObjID *>::const_iterator elm_iter = input_data_in.begin(); elm_iter != input_data_in.end() && !set_ids(*elm_iter); ++elm_iter) {}
300 if (method_data_id) {
301 if (!container_data_id) {
302 container_data_id=method_data_id;
306 if (
m_verbose && method_data_id && method_data_id != container_data_id) {
307 std::cout <<
"DEBUG SGxAODProxyLoader method_clid " << method_data_id->clid() << std::endl;
310 std::cout <<
"DEBUG SGxAODProxyLoader container_clid " << container_data_id->clid() << std::endl;
314 if (container_data_id) {
317 if (have_container_read_key && !method_data_id)
continue;
319 auto clid = container_data_id->clid();
323 std::stringstream
msg;
324 msg <<
"Missing type information about container " << container_name <<
".";
325 if (container_data_id) {
326 msg <<
" It seems that inheritance information is missing for " << container_data_id->className() <<
"."
327 <<
" Only container which inherit from SG::AuxVectorBase or data inheriting from SG::AuxElement "
328 <<
" are supported by the SGxAODProxyLoader loader.";
331 msg <<
" This problem may occur if the container is read from the input"
332 <<
" file and not accessed anywhere in the job via read handles. ";
334 throw std::runtime_error(
msg.str());
338 std::cout <<
"DEBUG SGxAODProxyLoader " << container_name <<
" -> " << base_info->
typeinfo().name() << std::endl;
341 std::cout <<
"DEBUG SGxAODProxyLoader " << container_name <<
" base: " << a_base_info->
typeinfo().name() << std::endl;
350 if (!have_container_read_key) {
351 read_key = std::make_any<SG::ReadHandleKey<SG::AuxVectorBase> >(container_name);
353 if (method_data_id) {
354 decor_key = std::make_any<SG::ReadDecorHandleKey<SG::AuxVectorBase> >(
var_name);
358 if (!have_container_read_key) {
359 read_key = std::make_any<SG::ReadHandleKey<SG::AuxElement> >(container_name);
361 if (method_data_id) {
362 decor_key = std::make_any<SG::ReadDecorHandleKey<SG::AuxElement> >(
var_name);
366 if (method_data_id && method_data_id != container_data_id && method_data_id->clid() != container_data_id->clid()) {
367 std::stringstream
msg;
368 msg <<
"Did not expect a \"method\" handle for the plain type " <<
var_name;
369 throw std::logic_error(
msg.str());
372 if (registered_key) {
373 popRenounced(renounce, new_input_handles);
378 if (!have_container_read_key) {
379 if (!read_key.has_value()) {
380 std::stringstream
msg;
381 msg <<
"Container " << container_name <<
" is of unsupported type " << base_info->
typeinfo().name()
382 <<
" expected a type derived from SG::AuxVectorBase or SG::AuxElement";
383 throw std::runtime_error(
msg.str());
385 std::pair<ReadHandleMap::iterator, bool> ret =
m_readKeys.insert(std::make_pair(container_name, std::move(read_key)));
389 std::stringstream
msg;
390 msg <<
"Failed to add read handle key for " << container_name;
391 throw std::runtime_error(
msg.str());
399 popRenounced(renounce, new_input_handles);
403 if (method_data_id) {
404 if (!decor_key.has_value()) {
405 std::stringstream
msg;
406 msg <<
"Container " << container_name <<
" is of unsupported type " << base_info->
typeinfo().name()
407 <<
" expected a type derived from SG::AuxVectorBase or SG::AuxElement";
408 throw std::runtime_error(
msg.str());
410 std::pair<ReadDecorHandleMap::iterator, bool> ret =
m_decorKeys.insert(std::make_pair(
var_name,std::move(decor_key)));
414 std::stringstream
msg;
415 msg <<
"Failed to add read decor handle key for " <<
var_name;
416 throw std::runtime_error(
msg.str());
424 popRenounced(renounce, new_input_handles);