Loading [MathJax]/extensions/tex2jax.js
The Gaudi Framework  v38r0 (2143aa4c)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
PropertyAlg.cpp
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2020 CERN for the benefit of the LHCb and ATLAS collaborations *
3 * *
4 * This software is distributed under the terms of the Apache version 2 licence, *
5 * copied verbatim in the file "LICENSE". *
6 * *
7 * In applying this licence, CERN does not waive the privileges and immunities *
8 * granted to it by virtue of its status as an Intergovernmental Organization *
9 * or submit itself to any jurisdiction. *
10 \***********************************************************************************/
11 // Include files
12 #include "GaudiKernel/DataObject.h"
15 #include "GaudiKernel/MsgStream.h"
16 #include "GaudiKernel/SmartIF.h"
17 #include <sstream>
18 
20 
21 #include "PropertyAlg.h"
22 
23 namespace {
24  // idea coming from The art of computer programming by Knuth
25  constexpr bool essentiallyEqual( double const a, double const b ) {
26  return std::abs( a - b ) <= std::min( std::abs( a ), std::abs( b ) ) * std::numeric_limits<double>::epsilon();
27  }
28 } // namespace
29 
30 // Read Handler
31 //------------------------------------------------------------------------------
33  // do not print messages if we are created in genconf
34  const std::string cmd = System::cmdLineArgs()[0];
35  if ( cmd.find( "genconf" ) != std::string::npos ) return;
36 
37  info() << "Read handler called for property: " << p << endmsg;
38 }
39 
40 // Update Handler
41 //------------------------------------------------------------------------------
43  // avoid the readHandler (which writes to the _same_ MsgStream!) from writing
44  // something in the middle of the printout of this message...
46  os << p;
47  info() << "Update handler called for property: " << os.str() << endmsg;
48 }
49 
50 // Constructor
51 //------------------------------------------------------------------------------
53  //------------------------------------------------------------------------------
54  // Associate read and update handlers
55 
56  p_double.declareUpdateHandler( &PropertyAlg::updateHandler, this );
57  p_double.declareReadHandler( &PropertyAlg::readHandler, this );
58 
59  {
60  // do not print messages if we are created in genconf
61  const std::string cmd = System::cmdLineArgs()[0];
62  if ( cmd.find( "genconf" ) != std::string::npos ) return;
63  }
64 
65  info() << "Before Initialization......" << endmsg;
66 
67  info() << "Int = " << m_int.value() << endmsg;
68  info() << "Int64 = " << m_int64.value() << endmsg;
69  info() << "UInt64 = " << m_uint64.value() << endmsg;
70  info() << "Double = " << m_double.value() << endmsg;
71  info() << "String = " << m_string.value() << endmsg;
72  info() << "Bool = " << m_bool.value() << endmsg;
73  info() << "IntArray = " << m_intarray.value() << endmsg;
74  info() << "Int64Array = " << m_int64array.value() << endmsg;
75  info() << "UInt64Array = " << m_uint64array.value() << endmsg;
76  info() << "DoubleArray = " << m_doublearray.value() << endmsg;
77  info() << "StringArray = " << m_stringarray.value() << endmsg;
78  info() << "BoolArray = " << m_boolarray.value() << endmsg;
79  info() << "EmptyArray = " << m_emptyarray.value() << endmsg;
80  info() << "IntPairArray = " << u_intpairarray.value() << endmsg;
81  info() << "DoublePairArray = " << u_doublepairarray.value() << endmsg;
82 
83  info() << "PInt = " << p_int << endmsg;
85  os << p_double; // avoid read handler from printing _during_ info()!
86  info() << "PDouble = " << os.str() << endmsg;
87  info() << "PString = " << p_string << endmsg;
88  info() << "PBool = " << p_bool << endmsg;
89  info() << "PIntArray = " << p_intarray << endmsg;
90  info() << "PDoubleArray = " << p_doublearray << endmsg;
91  info() << "PStringArray = " << p_stringarray << endmsg;
92  info() << "PBoolArray = " << p_boolarray << endmsg;
93 }
94 
95 //------------------------------------------------------------------------------
97  //------------------------------------------------------------------------------
98 
99  //
100  // Checking the JobOptions interface. Be able to set the properties
101  //
102  info() << "After Initialization having read the JobOptions file..." << endmsg;
103 
104  info() << "Int = " << m_int.value() << endmsg;
105  info() << "Int64 = " << m_int64.value() << endmsg;
106  info() << "UInt64 = " << m_uint64.value() << endmsg;
107  info() << "Double = " << m_double.value() << endmsg;
108  info() << "String = " << m_string.value() << endmsg;
109  info() << "Bool = " << m_bool.value() << endmsg;
110  info() << "IntArray = " << m_intarray.value() << endmsg;
111  info() << "Int64Array = " << m_int64array.value() << endmsg;
112  info() << "UInt64Array = " << m_uint64array.value() << endmsg;
113  info() << "DoubleArray = " << m_doublearray.value() << endmsg;
114  info() << "StringArray = " << m_stringarray.value() << endmsg;
115  info() << "BoolArray = " << m_boolarray.value() << endmsg;
116  info() << "EmptyArray = " << m_emptyarray.value() << endmsg;
117  info() << "IntPairArray = " << u_intpairarray.value() << endmsg;
118  info() << "DoublePairArray = " << u_doublepairarray.value() << endmsg;
119  info() << "StringMap = " << m_strmap << endmsg;
120 
121  info() << "PInt = " << p_int << endmsg;
123  os << p_double; // avoid read handler from printing _during_ info()!
124  info() << "PDouble = " << os.str() << endmsg;
125  info() << "PString = " << p_string << endmsg;
126  info() << "PBool = " << p_bool << endmsg;
127  info() << "PIntArray = " << p_intarray << endmsg;
128  info() << "PDoubleArray = " << p_doublearray << endmsg;
129  info() << "PStringArray = " << p_stringarray << endmsg;
130  info() << "PBoolArray = " << p_boolarray << endmsg;
131  //
132  // Checking units
133  //
134  auto& doublearrayunits = u_doublearrayunits.value();
135  auto& doublearray = u_doublearray.value();
136  for ( unsigned int i = 0; i < doublearrayunits.size(); i++ ) {
137 
138  if ( !essentiallyEqual( doublearrayunits[i], doublearray[i] ) ) {
139  error() << format( "DoubleArrayWithUnits[%d] = %g and should be %g", i, doublearrayunits[i], doublearray[i] )
140  << endmsg;
141  } else {
142  info() << format( "DoubleArrayWithUnits[%d] = %g", i, doublearrayunits[i] ) << endmsg;
143  }
144  }
145 
146  //
147  // Checking the Property Verifier
148  //
149  info() << "===============Checking Property Verifier ===============" << endmsg;
150 
151  info() << "Playing with PropertyVerifiers..." << endmsg;
152 
153  p_int.verifier().setBounds( 0, 200 );
154  p_int = 155;
155  // info() << "PInt= " << p_int << " [should be 155, bounds are " <<
156  // p_int.verifier().lower() << ", " <<
157  // p_int.verifier().upper() << " ]" << endmsg;
158  info() << format( "PInt= %d [should be 155, bounds are %d, %d]", (int)p_int, (int)p_int.verifier().lower(),
159  (int)p_int.verifier().upper() )
160  << endmsg;
161  try {
162  p_int = 255;
163  } catch ( ... ) { info() << "Got an exception when setting a value outside bounds" << endmsg; }
164  info() << "PInt= " << p_int << " [should be 155]" << endmsg;
165 
166  //
167  // Checking the Property CallBacks
168  //
169  info() << "===============Checking Property CallBaks ===============" << endmsg;
170 
171  double d;
172  info() << "Accessing PDouble ... " << endmsg;
173  d = p_double;
174 
175  info() << "Value obtained is: " << d << endmsg;
176 
177  info() << "Updating PDouble ... " << endmsg;
178  p_double = 999.;
179 
180  //
181  // Checking Accessing Properties by string
182  //
183 
184  info() << "==========Checking Accesing Properties by string=========" << endmsg;
185 
186  auto appmgr = serviceLocator()->as<IProperty>();
187  // StatusCode sc = serviceLocator()->service("ApplicationMgr", appmgr);
188  if ( !appmgr ) {
189  error() << "Unable to locate the ApplicationMgr" << endmsg;
190  } else {
191  std::string value( "empty" );
192  appmgr->getProperty( "ExtSvc", value ).ignore();
193  info() << " Got property ApplicationMgr.ExtSvc = " << value << ";" << endmsg;
194 
195  appmgr->setPropertyRepr( "ExtSvc", "[\"EvtDataSvc/EventDataSvc\", \"DetDataSvc/DetectorDataSvc\"]" ).ignore();
196  info() << " Set property ApplicationMgr.ExtSvc = "
197  << " [\"EvtDataSvc/EventDataSvc\", \"DetDataSvc/DetectorDataSvc\"]"
198  << ";" << endmsg;
199  appmgr->getProperty( "ExtSvc", value ).ignore();
200  info() << " Got property ApplicationMgr.ExtSvc = " << value << ";" << endmsg;
201 
202  appmgr->setPropertyRepr( "ExtSvc", "[ 'EventDataSvc', 'DetectorDataSvc']" ).ignore();
203  info() << " Set property ApplicationMgr.ExtSvc = "
204  << " [ 'EventDataSvc', 'DetectorDataSvc']"
205  << ";" << endmsg;
206  appmgr->getProperty( "ExtSvc", value ).ignore();
207  info() << " Got property ApplicationMgr.ExtSvc = " << value << ";" << endmsg;
208  }
209  // Testing setting bool
211  std::make_tuple( "true", true ), std::make_tuple( "false", false ), std::make_tuple( "True", true ),
212  std::make_tuple( "False", false ), std::make_tuple( "TRUE", true ), std::make_tuple( "FALSE", false ),
213  std::make_tuple( "T", true ), // not expected to work
214  std::make_tuple( "F", false ), // not expected to work
215  std::make_tuple( "10", true ), // not expected to work
216  };
218  for ( auto& c : cases ) {
219  p_bool = m_bool = !std::get<1>( c );
220  try {
221  sc = setPropertyRepr( "PBool", std::get<0>( c ) );
222  } catch ( ... ) { sc = StatusCode::FAILURE; }
223  if ( !sc || ( p_bool != std::get<1>( c ) ) ) {
224  error() << "PBool can not be set to " << std::get<0>( c ) << endmsg;
225  }
226  try {
227  sc = setPropertyRepr( "Bool", std::get<0>( c ) );
228  } catch ( ... ) { sc = StatusCode::FAILURE; }
229  if ( !sc || ( m_bool != std::get<1>( c ) ) ) { error() << "Bool can not be set to " << std::get<0>( c ) << endmsg; }
230  }
231 
232  // Testing the control of the output level directly from MessageSvc
233  MsgStream newlog( msgSvc(), "MsgTest" );
234  newlog << MSG::VERBOSE << "This should be printed if threshold is VERBOSE" << endmsg;
235  newlog << MSG::DEBUG << "This should be printed if threshold is DEBUG" << endmsg;
236  newlog << MSG::INFO << "This should be printed if threshold is INFO" << endmsg;
237  newlog << MSG::WARNING << "This should be printed if threshold is WARNING" << endmsg;
238  newlog << MSG::ERROR << "This should be printed if threshold is ERROR" << endmsg;
239  newlog << MSG::FATAL << "This should be printed if threshold is FATAL" << endmsg;
240  newlog << MSG::ALWAYS << "This should be printed ALWAYS" << endmsg;
241 
242  // Testing access to the JobOptions catalogue
243  auto& opts = serviceLocator()->getOptsSvc();
244 
245  // Dump of the catalogue
246  info() << "=================================================" << endmsg;
248  auto opt_items = opts.items(); // this copy is just to hide differences between gcc and clang outputs
249  ostream_joiner( info() << "Dump of the property catalogue:\n", opt_items, '\n',
250  []( MsgStream& os, const auto& item ) -> MsgStream& {
251  return os << std::get<0>( item ) << ": " << std::get<1>( item );
252  } )
253  << endmsg;
254  info() << "=================================================" << endmsg;
255 
256  // Change an option of my own....
257  opts.set( name() + '.' + "PInt", "154" );
258  info() << "PInt= " << p_int << " [should be 154]" << endmsg;
259 
260  auto orig_policy =
262  try {
263  info() << "Try to assign invalid value to DoubleArray" << endmsg;
264  opts.set( name() + '.' + "DoubleArray", "{\"12.12\", \"13.13\"}" );
265  } catch ( const GaudiException& exc ) { error() << "got exception: " << exc.what() << endmsg; }
266 
267  try {
268  info() << "Try to assign invalid value to StringMap" << endmsg;
269  opts.set( name() + '.' + "StringMap", "{\"one\", {\"une\", \"eins\"}}" );
270  } catch ( const GaudiException& exc ) { error() << "got exception: " << exc.what() << endmsg; }
271 
273 
274  info() << "DoubleArray = " << m_doublearray.value() << endmsg;
275  info() << "=================================================" << endmsg;
276  return StatusCode::SUCCESS;
277 }
278 
279 //------------------------------------------------------------------------------
281  //------------------------------------------------------------------------------
282  info() << "executing...." << endmsg;
283  return StatusCode::SUCCESS;
284 }
285 
286 //------------------------------------------------------------------------------
288  //------------------------------------------------------------------------------
289  info() << "finalizing...." << endmsg;
290  return StatusCode::SUCCESS;
291 }
292 
293 // Static Factory declaration
MSG::DEBUG
@ DEBUG
Definition: IMessageSvc.h:25
Gaudi::Details::PropertyBase
PropertyBase base class allowing PropertyBase* collections to be "homogeneous".
Definition: PropertyBase.h:35
PropertyAlg::m_doublearray
Gaudi::Property< std::vector< double > > m_doublearray
Definition: PropertyAlg.h:55
std::make_tuple
T make_tuple(T... args)
PropertyAlg::m_emptyarray
Gaudi::Property< std::vector< double > > m_emptyarray
Definition: PropertyAlg.h:58
PropertyAlg::initialize
StatusCode initialize() override
Three mandatory member functions of any algorithm.
Definition: PropertyAlg.cpp:96
PropertyAlg.h
PropertyAlg::m_stringarray
Gaudi::Property< std::vector< std::string > > m_stringarray
Definition: PropertyAlg.h:56
std::string
STL class.
PropertyAlg::p_stringarray
Gaudi::Property< std::vector< std::string > > p_stringarray
Definition: PropertyAlg.h:75
bug_34121.name
name
Definition: bug_34121.py:20
Gaudi::Algorithm::name
const std::string & name() const override
The identifying name of the algorithm object.
Definition: Algorithm.cpp:528
PropertyAlg::m_strmap
Gaudi::Property< std::map< std::string, std::string > > m_strmap
Definition: PropertyAlg.h:65
MSG::INFO
@ INFO
Definition: IMessageSvc.h:25
PropertyAlg::p_double
Gaudi::PropertyWithReadHandler< double > p_double
Definition: PropertyAlg.h:68
std::vector
STL class.
std::string::find
T find(T... args)
ISvcLocator
Definition: ISvcLocator.h:46
GaudiException
Definition: GaudiException.h:31
Algorithm
Alias for backward compatibility.
Definition: Algorithm.h:58
PropertyAlg::p_bool
Gaudi::Property< bool > p_bool
Definition: PropertyAlg.h:71
PropertyAlg::u_intpairarray
Gaudi::Property< std::vector< std::pair< int, int > > > u_intpairarray
Definition: PropertyAlg.h:62
Gaudi::Algorithm::serviceLocator
SmartIF< ISvcLocator > & serviceLocator() const override
The standard service locator.
Definition: Algorithm.cpp:572
MSG::WARNING
@ WARNING
Definition: IMessageSvc.h:25
PropertyAlg::PropertyAlg
PropertyAlg(const std::string &name, ISvcLocator *pSvcLocator)
Constructor of this form must be provided.
Definition: PropertyAlg.cpp:52
std::abs
Gaudi::ParticleID abs(const Gaudi::ParticleID &p)
Return the absolute value for a PID.
Definition: ParticleID.h:191
gaudirun.c
c
Definition: gaudirun.py:525
PropertyAlg::readHandler
void readHandler(Gaudi::Details::PropertyBase &)
Callbacks for properties.
Definition: PropertyAlg.cpp:32
PropertyAlg::p_doublearray
Gaudi::Property< std::vector< double > > p_doublearray
Definition: PropertyAlg.h:74
PropertyAlg::m_int64array
Gaudi::Property< std::vector< long long > > m_int64array
Definition: PropertyAlg.h:53
IDataProviderSvc.h
IProperty
Definition: IProperty.h:33
PropertyAlg::p_string
Gaudi::Property< std::string > p_string
Definition: PropertyAlg.h:70
SmartIF.h
PropertyAlg::m_uint64
Gaudi::Property< unsigned long long > m_uint64
Definition: PropertyAlg.h:47
PropertyAlg::p_boolarray
Gaudi::Property< std::vector< bool > > p_boolarray
Definition: PropertyAlg.h:76
StatusCode
Definition: StatusCode.h:65
gaudirun.opts
opts
Definition: gaudirun.py:336
PropertyHolder< CommonMessaging< implements< IAlgorithm, IDataHandleHolder, IProperty, IStateful > > >::setPropertyRepr
StatusCode setPropertyRepr(const std::string &n, const std::string &r) override
set the property from name and value string representation
Definition: PropertyHolder.h:177
Gaudi::Property::value
const ValueType & value() const
Definition: Property.h:239
PropertyAlg::m_intarray
Gaudi::Property< std::vector< int > > m_intarray
Definition: PropertyAlg.h:52
format
GAUDI_API std::string format(const char *,...)
MsgStream format utility "a la sprintf(...)".
Definition: MsgStream.cpp:119
endmsg
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:203
MsgStream
Definition: MsgStream.h:34
PropertyAlg::u_doublearrayunits
Gaudi::Property< std::vector< double > > u_doublearrayunits
Definition: PropertyAlg.h:59
MSG::FATAL
@ FATAL
Definition: IMessageSvc.h:25
std::numeric_limits::epsilon
T epsilon(T... args)
Gaudi::Details::Property::setParsingErrorPolicy
ParsingErrorPolicy setParsingErrorPolicy(ParsingErrorPolicy p)
Definition: Property.cpp:523
PropertyAlg::u_doublepairarray
Gaudi::Property< std::vector< std::pair< double, double > > > u_doublepairarray
Definition: PropertyAlg.h:63
PropertyAlg::m_string
Gaudi::Property< std::string > m_string
Definition: PropertyAlg.h:49
std::min
T min(T... args)
SmartIF::as
SmartIF< IFace > as() const
return a new SmartIF instance to another interface
Definition: SmartIF.h:117
std::ostringstream
STL class.
PropertyAlg::p_int
Gaudi::CheckedProperty< int > p_int
Definition: PropertyAlg.h:67
PropertyAlg::m_uint64array
Gaudi::Property< std::vector< unsigned long long > > m_uint64array
Definition: PropertyAlg.h:54
MSG::VERBOSE
@ VERBOSE
Definition: IMessageSvc.h:25
StatusCode::SUCCESS
constexpr static const auto SUCCESS
Definition: StatusCode.h:100
DataObject.h
IChronoStatSvc.h
PropertyAlg::execute
StatusCode execute() override
Definition: PropertyAlg.cpp:280
MSG::ALWAYS
@ ALWAYS
Definition: IMessageSvc.h:25
PropertyAlg::m_bool
Gaudi::Property< bool > m_bool
Definition: PropertyAlg.h:50
DECLARE_COMPONENT
#define DECLARE_COMPONENT(type)
Definition: PluginServiceV1.h:46
System::cmdLineArgs
GAUDI_API const std::vector< std::string > cmdLineArgs()
Command line arguments including executable name as arg[0] as vector of strings.
Definition: System.cpp:363
PropertyAlg::updateHandler
void updateHandler(Gaudi::Details::PropertyBase &)
Definition: PropertyAlg.cpp:42
MSG::ERROR
@ ERROR
Definition: IMessageSvc.h:25
PropertyAlg::m_boolarray
Gaudi::Property< std::vector< bool > > m_boolarray
Definition: PropertyAlg.h:57
PropertyAlg::m_double
Gaudi::Property< double > m_double
Definition: PropertyAlg.h:48
PropertyAlg::p_intarray
Gaudi::Property< std::vector< int > > p_intarray
Definition: PropertyAlg.h:73
std::ostringstream::str
T str(T... args)
SerializeSTL.h
AsyncIncidents.msgSvc
msgSvc
Definition: AsyncIncidents.py:34
StatusCode::FAILURE
constexpr static const auto FAILURE
Definition: StatusCode.h:101
PropertyAlg::finalize
StatusCode finalize() override
Definition: PropertyAlg.cpp:287
PropertyAlg
Definition: PropertyAlg.h:28
Gaudi::Details::Property::ParsingErrorPolicy::Exception
@ Exception
PropertyAlg::m_int64
Gaudi::Property< long long > m_int64
Definition: PropertyAlg.h:46
PropertyAlg::m_int
Gaudi::Property< int > m_int
These data members are used in the execution of this algorithm They are set in the initialization pha...
Definition: PropertyAlg.h:45
PropertyAlg::u_doublearray
Gaudi::Property< std::vector< double > > u_doublearray
Definition: PropertyAlg.h:60
GaudiException::what
const char * what() const override
method from std::exception
Definition: GaudiException.h:110
MsgStream.h
GaudiUtils::details::ostream_joiner
Stream & ostream_joiner(Stream &os, Iterator first, Iterator last, Separator sep, OutputElement output=OutputElement{})
Definition: SerializeSTL.h:73