Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
CompositeAlgorithm.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 // **********************************************************************
6 // $Id: CompositeAlgorithm.cxx,v 1.5 2009-05-07 14:45:54 ponyisi Exp $
7 // **********************************************************************
8 
10 #include "dqm_core/LibraryManager.h"
11 #include "dqm_core/AlgorithmManager.h"
12 
13 #include <iostream>
14 #include <boost/scoped_ptr.hpp>
15 
16 #include <TCollection.h>
17 #include <TDirectory.h>
18 #include <TFile.h>
19 #include <TGraph.h>
20 #include <TKey.h>
21 
22 
23 namespace dqi{
24 
27  : Algorithm(other)
29 {
30  AlgVec_t::const_iterator subAlgsEnd = other.m_subAlgs.end();
31  AlgVec_t::const_iterator subAlgsIter = other.m_subAlgs.begin();
32  for( ; subAlgsIter != subAlgsEnd; ++subAlgsIter ) {
33  dqm_core::Algorithm* otherSubAlg = subAlgsIter->first;
34  dqm_core::Algorithm* alg = otherSubAlg->clone();
35  m_subAlgs.push_back( AlgVec_t::value_type(alg, subAlgsIter->second) );
36  }
37 }
38 
39 
41 CompositeAlgorithm( HanConfigCompAlg& compAlgConfig )
42  : m_name (compAlgConfig.GetName())
43 {
44  TObjString* libStr;
45  TIter libIter( compAlgConfig.GetAllLib() );
46  while( (libStr = dynamic_cast<TObjString*>( libIter() )) != 0 ){
47  try {
48  dqm_core::LibraryManager::instance().loadLibrary( libStr->GetString().Data() );
49  }
50  catch ( dqm_core::Exception& ex ) {
51  std::cout << "Can't load library " << libStr->GetString()
52  << " for composite algorithm " << m_name
53  << ". Continuing regardless ..." << std::endl;
54  }
55  }
56 
57  TObjString* algStr;
58  TIter algIter( compAlgConfig.GetAllAlg() );
59  while( (algStr = dynamic_cast<TObjString*>( algIter() )) != 0 ){
60  dqm_core::Algorithm* alg(0);
61  std::string algName(algStr->GetString().Data());
62  try {
64  }
65  catch( dqm_core::Exception& ex ) {
66  throw dqm_core::BadConfig( ERS_HERE, m_name, ex.what(), ex );
67  }
68  m_subAlgs.push_back( AlgVec_t::value_type(alg, algName) );
69  }
70  dqm_core::AlgorithmManager::instance().registerAlgorithm( m_name, this );
71 }
72 
73 
76 {
77  AlgVec_t::const_iterator subAlgsEnd = m_subAlgs.end();
78  AlgVec_t::const_iterator subAlgsIter = m_subAlgs.begin();
79  for( ; subAlgsIter != subAlgsEnd; ++subAlgsIter ) {
80  dqm_core::Algorithm* alg = subAlgsIter->first;
81  delete alg;
82  }
83  m_subAlgs.clear();
84 }
85 
86 
87 dqm_core::Algorithm*
89 clone()
90 {
92  return result;
93 }
94 
95 
96 void
99 {
100  std::string message;
101  message += "\n";
102  message += "Algorithm: \"" + m_name + "\"\n";
103  message += "Description: Builds a container for subalgorithms.\n";
104  message += "Parameters: none\n";
105 
106  std::cout << message;
107 }
108 
109 
112 execute( const std::string& name, const TObject& data, const dqm_core::AlgorithmConfig& config )
113 {
115  std::map<std::string,double> tags;
116 
117  AlgVec_t::const_iterator subAlgsEnd = m_subAlgs.end();
118  AlgVec_t::const_iterator subAlgsIter = m_subAlgs.begin();
119  for( ; subAlgsIter != subAlgsEnd; ++subAlgsIter ) {
120  boost::scoped_ptr<HanAlgorithmConfig> subConfig(ConfigureSubAlg(config, subAlgsIter->second));
121 
122  dqm_core::Algorithm* alg = subAlgsIter->first;
123  dqm_core::Result* subResult = alg->execute( name, data, *subConfig );
124  if( subResult->status_ != dqm_core::Result::Undefined ) {
126  status = ( subResult->status_ < status ) ? subResult->status_ : status;
127  }
128 
129  std::map<std::string,double>::const_iterator tagsEnd = subResult->tags_.end();
130  std::map<std::string,double>::const_iterator tagsIter = subResult->tags_.begin();
131  for( ; tagsIter != tagsEnd; ++tagsIter ) {
132  std::map<std::string,double>::value_type tagVal( subAlgsIter->second + std::string("|") + tagsIter->first, tagsIter->second );
133  tags.insert( tagVal );
134  }
135  delete subResult;
136  }
137 
139  result->tags_ = std::move(tags);
140 
141  return result;
142 }
143 
146 ConfigureSubAlg(const dqm_core::AlgorithmConfig& config, const std::string& subalg)
147 {
148 // caller owns the returned object
149 
150 // what we do: copy reference, params, limits to newly created config
151 // copy all those WITHOUT a / (backwards compatibility) and those of the form
152 // subalg/xxx.
153 
154  TObject* ref(0);
155  try {
156  ref = config.getReference();
157  } catch (dqm_core::BadConfig &) { /* ignore */ }
158  std::map< std::string,double > pars;
159  std::map<std::string,std::string> strPars;
160  std::map<std::string,double> grthr;
161  std::map<std::string,double> rdthr;
162 
163  std::map< std::string, double > oldpars(config.getParameters());
164  std::map<std::string,double> oldgrthr(config.getGreenThresholds());
165  std::map<std::string,double> oldrdthr(config.getRedThresholds());
166 
167  for (std::map< std::string, double >::const_iterator parVal = oldpars.begin();
168  parVal != oldpars.end(); ++parVal) {
169  std::string parname(parVal->first);
170  std::string::size_type pos = parname.find('|');
171  if (pos == std::string::npos) {
172  pars.insert(*parVal);
173  } else if (parname.substr(0, pos) == subalg) {
174  pars.insert(std::map< std::string, double >::value_type(parname.substr(pos+1), parVal->second));
175  }
176  }
177  for ( auto& strPar : config.getGenericParameters() ) {
178  std::string parname = strPar.first;
179  auto pipeIndex = parname.find( '|' );
180  if ( pipeIndex == std::string::npos ) {
181  strPars.insert( strPar );
182  } else if ( parname.substr( 0, pipeIndex ) == subalg ) {
183  strPars.emplace( parname.substr( pipeIndex + 1 ), strPar.second );
184  }
185  }
186  for (std::map< std::string, double >::const_iterator thrVal = oldgrthr.begin();
187  thrVal != oldgrthr.end(); ++thrVal) {
188  std::string thrname(thrVal->first);
189  std::string::size_type pos = thrname.find('|');
190  if (pos == std::string::npos) {
191  grthr.insert(*thrVal);
192  } else if (thrname.substr(0, pos) == subalg) {
193  grthr.insert(std::map< std::string, double >::value_type(thrname.substr(pos+1), thrVal->second));
194  }
195  }
196  for (std::map< std::string, double >::const_iterator thrVal = oldrdthr.begin();
197  thrVal != oldrdthr.end(); ++thrVal) {
198  std::string thrname(thrVal->first);
199  std::string::size_type pos = thrname.find('|');
200  if (pos == std::string::npos) {
201  rdthr.insert(*thrVal);
202  } else if (thrname.substr(0, pos) == subalg) {
203  rdthr.insert(std::map< std::string, double >::value_type(thrname.substr(pos+1), thrVal->second));
204  }
205  }
206  return new HanAlgorithmConfig(ref, pars, strPars, grthr, rdthr, 0);
207 }
208 
209 
210 
211 }//namespace dqi
make_hlt_rep.pars
pars
Definition: make_hlt_rep.py:90
dqi::CompositeAlgorithm::clone
virtual dqm_core::Algorithm * clone()
Definition: CompositeAlgorithm.cxx:89
dqi::HanConfigCompAlg
Definition: HanConfigCompAlg.h:22
data
char data[hepevt_bytes_allocation_ATLAS]
Definition: HepEvt.cxx:11
dqi::CompositeAlgorithm::~CompositeAlgorithm
virtual ~CompositeAlgorithm()
Definition: CompositeAlgorithm.cxx:75
Undefined
@ Undefined
Definition: MaterialTypes.h:8
SGout2dot.alg
alg
Definition: SGout2dot.py:243
get_generator_info.result
result
Definition: get_generator_info.py:21
dqi::CompositeAlgorithm::ConfigureSubAlg
HanAlgorithmConfig * ConfigureSubAlg(const dqm_core::AlgorithmConfig &config, const std::string &subalg)
Definition: CompositeAlgorithm.cxx:146
dqi::HanAlgorithmConfig
Definition: HanAlgorithmConfig.h:22
dqi::CompositeAlgorithm::CompositeAlgorithm
CompositeAlgorithm(const CompositeAlgorithm &other)
Definition: CompositeAlgorithm.cxx:26
xAOD::JetAlgorithmType::algName
const std::string & algName(ID id)
Converts a JetAlgorithmType::ID into a string.
Definition: JetContainerInfo.cxx:67
python.CreateTierZeroArgdict.parname
parname
Definition: CreateTierZeroArgdict.py:194
dqi::HanConfigCompAlg::GetAllLib
virtual TIter GetAllLib() const
Definition: HanConfigCompAlg.cxx:113
m_name
std::string m_name
Definition: ColumnarPhysliteTest.cxx:53
ReweightUtils.message
message
Definition: ReweightUtils.py:15
config
Definition: PhysicsAnalysis/AnalysisCommon/AssociationUtils/python/config.py:1
dqi::HanConfigCompAlg::GetAllAlg
virtual TIter GetAllAlg() const
Definition: HanConfigCompAlg.cxx:98
instance
std::map< std::string, double > instance
Definition: Run_To_Get_Tags.h:8
tags
std::vector< std::string > tags
Definition: hcg.cxx:102
Result
ICscStripFitter::Result Result
Definition: CalibCscStripFitter.cxx:13
python.handimod.Green
int Green
Definition: handimod.py:524
dqi::CompositeAlgorithm::m_subAlgs
AlgVec_t m_subAlgs
Definition: CompositeAlgorithm.h:36
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
CompositeAlgorithm.h
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:18
InDetDD::other
@ other
Definition: InDetDD_Defs.h:16
Athena::Status
Status
Athena specific StatusCode values.
Definition: AthStatusCode.h:22
ref
const boost::regex ref(r_ef)
dqi::CompositeAlgorithm::m_name
std::string m_name
Definition: CompositeAlgorithm.h:35
dqi::CompositeAlgorithm
Definition: CompositeAlgorithm.h:18
merge.status
status
Definition: merge.py:17
dqi
Definition: CompositeAlgorithm.h:16
dqi::CompositeAlgorithm::execute
virtual dqm_core::Result * execute(const std::string &name, const TObject &data, const dqm_core::AlgorithmConfig &config)
Definition: CompositeAlgorithm.cxx:112
dqi::CompositeAlgorithm::printDescription
virtual void printDescription()
Definition: CompositeAlgorithm.cxx:98