The Gaudi Framework  master (37c0b60a)
HistogramSvc.cpp
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2024 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 #ifdef __ICC
12 // disable icc remark #2259: non-pointer conversion from "X" to "Y" may lose significant bits
13 // TODO: To be removed, since it comes from ROOT TMathBase.h
14 # pragma warning( disable : 2259 )
15 #endif
16 #ifdef WIN32
17 // Disable warning
18 // warning C4996: 'sprintf': This function or variable may be unsafe.
19 // coming from TString.h
20 # pragma warning( disable : 4996 )
21 #endif
22 
23 // STD & STL
24 #include <cstdlib>
25 #include <sstream>
26 #include <stdexcept>
27 
28 // GaudiKernel
29 #include <Gaudi/Property.h>
31 #include <GaudiKernel/DataObject.h>
34 
35 // Local
36 #include "GaudiPI.h"
38 
39 namespace {
40  using namespace AIDA;
41  using std::string;
42 
43  string histoAddr( const string& name ) {
44  if ( name.starts_with( "/stat/" ) ) { return string( name, 6 ); }
45  return name;
46  }
47 
48  string histoAddr( const DataObject* obj, const string& rel ) {
49  if ( !obj ) { return rel; }
50  IRegistry* reg = obj->registry();
51  if ( !reg ) { return rel; }
52  const string& name = reg->identifier();
53  //
54  if ( rel.empty() ) { return histoAddr( name ); }
55  if ( '/' == name[name.size() - 1] || '/' == rel[0] ) { return histoAddr( name + rel ); }
56  return histoAddr( name + "/" + rel );
57  }
58 
59  size_t removeLeading( HistogramSvc::Histo1DMap& m, const string& lead = "/stat/" ) {
60  auto it = std::find_if( m.begin(), m.end(), [&lead]( const auto& i ) { return 0 == i.first.find( lead ); } );
61  if ( it == m.end() ) return 0;
62  string addr = string( it->first, lead.size() );
63  Gaudi::Histo1DDef hdef = it->second;
64  m.erase( it ); // remove
65  m[addr] = hdef; // insert
66  return 1 + removeLeading( m, lead ); // return
67  }
68 } // namespace
69 
70 //------------------------------------------------------------------------------
71 StatusCode HistogramSvc::registerObject( const string& full, IBaseHistogram* obj ) {
72  std::pair<string, string> split = i_splitPath( full );
73  return registerObject( split.first, split.second, obj );
74 }
75 
76 //------------------------------------------------------------------------------
77 StatusCode HistogramSvc::registerObject( DataObject* pPar, const string& obj, IBaseHistogram* hObj ) {
78  // Set the histogram id
79  if ( obj[0] == SEPARATOR ) {
80  // hObj->setTitle(obj.substr(1) + "|" + hObj->title());
81  if ( !hObj->annotation().addItem( "id", obj.substr( 1 ) ) ) hObj->annotation().setValue( "id", obj.substr( 1 ) );
82  } else {
83  // hObj->setTitle(obj + "|" + hObj->title());
84  if ( !hObj->annotation().addItem( "id", obj ) ) hObj->annotation().setValue( "id", obj );
85  }
86  // Register the histogram in the histogram data store
87  return DataSvc::registerObject( pPar, obj, ::detail::cast( hObj ) );
88 }
89 
90 // Helper for 2D projections
91 AIDA::IHistogram2D* HistogramSvc::i_project( const string& nameAndTitle, const IHistogram3D& h, const string& dir ) {
92  TH3D* h3d = Gaudi::getRepresentation<IHistogram3D, TH3D>( h );
93  if ( h3d ) {
94  TH2D* h2d = dynamic_cast<TH2D*>( h3d->Project3D( dir.c_str() ) );
95  if ( h2d ) {
97  if ( r.second && registerObject( nameAndTitle, r.second ).isSuccess() ) { return r.second; }
98  }
99  }
100  return nullptr;
101 }
102 
103 //------------------------------------------------------------------------------
104 // ASCII output
105 //------------------------------------------------------------------------------
106 std::ostream& HistogramSvc::print( IBaseHistogram* h, std::ostream& s ) const {
107  Gaudi::HistogramBase* b = dynamic_cast<Gaudi::HistogramBase*>( h );
108  if ( b ) return b->print( s );
109  error() << "Unknown histogram type: Cannot cast to Gaudi::HistogramBase." << endmsg;
110  return s;
111 }
112 
113 //------------------------------------------------------------------------------
114 std::ostream& HistogramSvc::write( IBaseHistogram* h, std::ostream& s ) const {
115  Gaudi::HistogramBase* b = dynamic_cast<Gaudi::HistogramBase*>( h );
116  if ( b ) return b->write( s );
117  error() << "Unknown histogram type: Cannot cast to Gaudi::HistogramBase." << endmsg;
118  return s;
119 }
120 
121 //------------------------------------------------------------------------------
122 int HistogramSvc::write( IBaseHistogram* h, const char* file_name ) const {
123  Gaudi::HistogramBase* b = dynamic_cast<Gaudi::HistogramBase*>( h );
124  if ( b ) return b->write( file_name );
125  error() << "Unknown histogram type: Cannot cast to Gaudi::HistogramBase." << endmsg;
126  return 0;
127 }
128 
129 //------------------------------------------------------------------------------
131  string tmp = full;
132  if ( tmp[0] != SEPARATOR ) {
133  tmp.insert( tmp.begin(), SEPARATOR );
134  tmp.insert( tmp.begin(), m_rootName.begin(), m_rootName.end() );
135  }
136  // Remove trailing "/" from newPath if it exists
137  if ( tmp.rfind( SEPARATOR ) == tmp.length() - 1 ) { tmp.erase( tmp.length() - 1, 1 ); }
138  int sep = tmp.rfind( SEPARATOR );
139  return { tmp.substr( 0, sep ), tmp.substr( sep + 1 ) };
140 }
141 
142 //------------------------------------------------------------------------------
143 DataObject* HistogramSvc::createPath( const string& newPath ) {
144  string tmpPath = newPath;
145  if ( tmpPath[0] != SEPARATOR ) {
146  tmpPath.insert( tmpPath.begin(), SEPARATOR );
147  tmpPath.insert( tmpPath.begin(), m_rootName.begin(), m_rootName.end() );
148  }
149  // Remove trailing "/" from newPath if it exists
150  if ( tmpPath.rfind( SEPARATOR ) == tmpPath.length() - 1 ) { tmpPath.erase( tmpPath.rfind( SEPARATOR ), 1 ); }
151  DataObject* pObject = nullptr;
152  StatusCode sc = findObject( tmpPath, pObject );
153  if ( sc.isSuccess() ) { return pObject; }
154  int sep = tmpPath.rfind( SEPARATOR );
155  string rest( tmpPath, sep + 1, tmpPath.length() - sep );
156  string subPath( tmpPath, 0, sep );
157  if ( 0 != sep ) {
158  createPath( subPath );
159  } else {
160  error() << "Unable to create the histogram path" << endmsg;
161  return nullptr;
162  }
163  pObject = createDirectory( subPath, rest );
164  return pObject;
165 }
166 
167 //------------------------------------------------------------------------------
168 DataObject* HistogramSvc::createDirectory( const string& parentDir, const string& subDir ) {
169  auto directory = std::make_unique<DataObject>();
170  if ( directory ) {
171  DataObject* pnode;
172  StatusCode status = retrieveObject( parentDir, pnode );
173  if ( !status.isSuccess() ) {
174  error() << "Unable to create the histogram directory: " << parentDir << "/" << subDir << endmsg;
175  return nullptr;
176  }
177  status = DataSvc::registerObject( pnode, subDir, directory.get() );
178  if ( !status.isSuccess() ) {
179  error() << "Unable to create the histogram directory: " << parentDir << "/" << subDir << endmsg;
180  return nullptr;
181  }
182  }
183  return directory.release();
184 }
185 
186 //------------------------------------------------------------------------------
188  setDataLoader( nullptr ).ignore();
189  clearStore().ignore();
190 }
191 
192 //------------------------------------------------------------------------------
194  using Parser = Gaudi::Utils::AttribStringParser;
195  DataObject* pO = nullptr;
196  StatusCode status = this->findObject( m_rootName.value(), pO );
197  if ( status.isSuccess() ) {
198  string::size_type loc = ident.find( " " );
199  string filename, auth, svc = "", typ = "";
200  string logname = ident.substr( 0, loc );
201  for ( auto attrib : Parser( ident.substr( loc + 1 ) ) ) {
202  switch ( ::toupper( attrib.tag[0] ) ) {
203  case 'F': // FILE='<file name>'
204  case 'D': // DATAFILE='<file name>'
205  filename = std::move( attrib.value );
206  break;
207  case 'T': // TYP='<HBOOK,ROOT,OBJY,...>'
208  typ = std::move( attrib.value );
209  break;
210  default:
211  break;
212  }
213  }
214  if ( typ.length() > 0 ) {
215  // Now add the registry entry to the store
216  string entryname = m_rootName;
217  entryname += '/';
218  entryname += logname;
219  GenericAddress* pA = nullptr;
220  switch ( ::toupper( typ[0] ) ) {
221  case 'H':
222  pA = new GenericAddress( HBOOK_StorageType, CLID_StatisticsFile, filename, entryname, 0, 'O' );
223  break;
224  case 'R':
225  pA = new GenericAddress( ROOT_StorageType, CLID_StatisticsFile, filename, entryname, 0, 'O' );
226  break;
227  }
228  if ( pA ) {
229  status = registerAddress( pO, logname, pA );
230  if ( status.isSuccess() ) {
231  info() << "Added stream file:" << filename << " as " << logname << endmsg;
232  return status;
233  }
234  pA->release();
235  }
236  }
237  }
238  error() << "Cannot add " << ident << " invalid filename!" << endmsg;
239  return StatusCode::FAILURE;
240 }
241 
242 //------------------------------------------------------------------------------
244  StatusCode status = DataSvc::initialize();
245  // Set root object
246  if ( status.isSuccess() ) {
247  auto rootObj = std::make_unique<DataObject>();
248  status = setRoot( "/stat", rootObj.get() );
249  if ( status.isFailure() ) {
250  error() << "Unable to set hstogram data store root." << endmsg;
251  return status;
252  }
253  rootObj.release();
254  auto svc = service<IConversionSvc>( "HistogramPersistencySvc", true );
255  if ( !svc ) {
256  error() << "Could not find HistogramPersistencySvc." << endmsg;
257  return StatusCode::FAILURE;
258  }
259  setDataLoader( svc.get() ).ignore();
260  // Connect all input streams (if any)
261  for ( auto& j : m_input ) {
262  status = connectInput( j );
263  if ( !status.isSuccess() ) return status;
264  }
265  }
266  if ( !m_defs1D.empty() ) {
267  info() << " Predefined 1D-Histograms: " << endmsg;
268  for ( const auto& ih : m_defs1D ) {
269  info() << " Path='" << ih.first << "'"
270  << " Description " << ih.second << endmsg;
271  }
272  }
273  return status;
274 }
275 
276 //------------------------------------------------------------------------------
278 
279 //------------------------------------------------------------------------------
280 IHistogram1D* HistogramSvc::sliceX( const string& name, const IHistogram2D& h, int idxY1, int idxY2 ) {
281  std::pair<DataObject*, IHistogram1D*> o( nullptr, nullptr );
282  try {
283  int firstbin = Gaudi::Axis::toRootIndex( idxY1, h.yAxis().bins() );
284  int lastbin = Gaudi::Axis::toRootIndex( idxY2, h.yAxis().bins() );
285  o = Gaudi::slice1DX( name, h, firstbin, lastbin );
286  } catch ( ... ) {
287  throw GaudiException( "Cannot cast 2D histogram to H2D to create sliceX `" + name + "'!", "HistogramSvc",
289  }
290  if ( o.first && registerObject( name, o.second ).isSuccess() ) { return o.second; }
291  delete o.first;
292  throw GaudiException( "Cannot create sliceX `" + name + "' of 2D histogram!", "HistogramSvc", StatusCode::FAILURE );
293 }
294 
295 //------------------------------------------------------------------------------
296 IHistogram1D* HistogramSvc::sliceY( const string& name, const IHistogram2D& h, int indexX1, int indexX2 ) {
297  std::pair<DataObject*, IHistogram1D*> o( nullptr, nullptr );
298  try {
299  int firstbin = Gaudi::Axis::toRootIndex( indexX1, h.xAxis().bins() );
300  int lastbin = Gaudi::Axis::toRootIndex( indexX2, h.xAxis().bins() );
301  o = Gaudi::slice1DY( name, h, firstbin, lastbin );
302  } catch ( ... ) {
303  throw GaudiException( "Cannot create sliceY `" + name + "'!", "HistogramSvc", StatusCode::FAILURE );
304  }
305  // name stands here for the fullPath of the histogram
306  if ( o.first && registerObject( name, (IBaseHistogram*)o.second ).isSuccess() ) { return o.second; }
307  delete o.first;
308  throw GaudiException( "Cannot create sliceY `" + name + "' of 2D histogram!", "HistogramSvc", StatusCode::FAILURE );
309 }
310 
311 //------------------------------------------------------------------------------
312 bool HistogramSvc::destroy( IBaseHistogram* hist ) {
313  StatusCode sc = unregisterObject( dynamic_cast<IHistogram*>( hist ) );
314  if ( !sc.isSuccess() ) return false;
315  delete hist;
316  return true;
317 }
318 
319 // ============================================================================
320 AIDA::IHistogram1D* HistogramSvc::book( DataObject* pPar, const string& rel, const string& title, int nx, double lowx,
321  double upx ) {
322  if ( m_defs1D.empty() ) {
323  return i_book( pPar, rel, title,
324  Gaudi::createH1D( serviceLocator(), buildHistoPath( pPar, rel ), title, nx, lowx, upx ) );
325  }
326  string hn = histoAddr( pPar, rel );
327  auto ifound = m_defs1D.find( hn );
328  if ( m_defs1D.end() == ifound ) {
329  return i_book( pPar, rel, title,
330  Gaudi::createH1D( serviceLocator(), buildHistoPath( pPar, rel ), title, nx, lowx, upx ) );
331  }
332  if ( msgLevel( MSG::DEBUG ) ) {
333  debug() << " Redefine the parameters for the histogram '" + hn + "' to be " << ifound->second << endmsg;
334  }
335  m_mods1D.insert( hn );
336  return i_book( pPar, rel, ifound->second.title(),
337  Gaudi::createH1D( serviceLocator(), buildHistoPath( pPar, rel ), ifound->second.title(),
338  ifound->second.bins(), ifound->second.lowEdge(), ifound->second.lowEdge() ) );
339 }
340 
341 // ============================================================================
342 // constructor
343 // ============================================================================
344 HistogramSvc::HistogramSvc( const string& nam, ISvcLocator* svc ) : base_class( nam, svc ) {
345  m_rootName = "/stat";
346  m_rootCLID = CLID_DataObject;
347 }
348 
349 // ============================================================================
351  // check and remove the leading '/stat/'
352  removeLeading( m_defs1D.value(), "/stat/" );
353 }
354 
356  std::string const& path = pPar->registry()->identifier();
357  std::string const& root = rootName();
358  return path.substr( root.size() ) + '/' + rel;
359 }
360 
361 // ============================================================================
362 // finalize the service
363 // ============================================================================
365  if ( !m_mods1D.empty() ) {
366  if ( msgLevel( MSG::DEBUG ) ) debug() << " Substituted histograms #" << m_mods1D.size() << " : " << endmsg;
367  for ( const auto& ih : m_mods1D ) {
368  if ( msgLevel( MSG::DEBUG ) ) debug() << " Path='" << ih << "'";
369  auto im = m_defs1D.find( ih );
370  if ( m_defs1D.end() != im ) { debug() << " " << im->second; }
371  }
372  m_mods1D.clear();
373  }
374  return DataSvc::finalize();
375 }
376 
377 // ============================================================================
378 AIDA::IHistogram1D* HistogramSvc::book( const string& par, const string& rel, const string& title, int nx, double lowx,
379  double upx ) {
380  return book( createPath( par ), rel, title, nx, lowx, upx );
381 }
382 
383 // ============================================================================
384 AIDA::IHistogram1D* HistogramSvc::book( const string& par, int hID, const string& title, int nx, double lowx,
385  double upx ) {
386  return book( par, std::to_string( hID ), title, nx, lowx, upx );
387 }
388 
389 // ============================================================================
390 AIDA::IHistogram1D* HistogramSvc::book( DataObject* pPar, int hID, const string& title, int nx, double lowx,
391  double upx ) {
392  return book( pPar, std::to_string( hID ), title, nx, lowx, upx );
393 }
394 
395 // ============================================================================
396 AIDA::IHistogram1D* HistogramSvc::book( const std::pair<string, string>& loc, const string& title, int nx, double lowx,
397  double upx ) {
398  return book( loc.first, loc.second, title, nx, lowx, upx );
399 }
400 
401 // ============================================================================
402 AIDA::IHistogram1D* HistogramSvc::book( const string& full, const string& title, int nx, double lowx, double upx ) {
403  return book( i_splitPath( full ), title, nx, lowx, upx );
404 }
405 
406 // ============================================================================
407 AIDA::IProfile1D* HistogramSvc::bookProf( const string& par, const string& rel, const string& title, int nx,
408  double lowx, double upx, const string& opt ) {
409  return bookProf( createPath( par ), rel, title, nx, lowx, upx, opt );
410 }
411 
412 // ============================================================================
413 AIDA::IProfile1D* HistogramSvc::bookProf( const string& par, int hID, const string& title, int nx, double lowx,
414  double upx, const string& opt ) {
415  return bookProf( par, std::to_string( hID ), title, nx, lowx, upx, opt );
416 }
417 
418 // ============================================================================
419 AIDA::IProfile1D* HistogramSvc::bookProf( DataObject* pPar, int hID, const string& title, int nx, double lowx,
420  double upx, const string& opt ) {
421  return bookProf( pPar, std::to_string( hID ), title, nx, lowx, upx, opt );
422 }
423 
424 // ============================================================================
425 AIDA::IProfile1D* HistogramSvc::bookProf( const std::pair<string, string>& loc, const string& title, int nx,
426  double lowx, double upx, const string& opt ) {
427  return bookProf( loc.first, loc.second, title, nx, lowx, upx, opt );
428 }
429 
430 // ============================================================================
431 AIDA::IProfile1D* HistogramSvc::bookProf( const string& full, const string& title, int nx, double lowx, double upx,
432  const string& opt ) {
433  return bookProf( i_splitPath( full ), title, nx, lowx, upx, opt );
434 }
435 
436 // ============================================================================
437 AIDA::IProfile1D* HistogramSvc::bookProf( DataObject* pPar, const string& rel, const string& title, int nx, double lowx,
438  double upx, const string& opt ) {
439  return i_book(
440  pPar, rel, title,
441  Gaudi::createProf1D( serviceLocator(), buildHistoPath( pPar, rel ), title, nx, lowx, upx, 0, 0, opt ) );
442 }
443 
444 // ============================================================================
445 AIDA::IProfile1D* HistogramSvc::bookProf( const string& par, const string& rel, const string& title, int nx,
446  double lowx, double upx, double upper, double lower, const string& opt ) {
447  return bookProf( createPath( par ), rel, title, nx, lowx, upx, upper, lower, opt );
448 }
449 
450 // ============================================================================
451 AIDA::IProfile1D* HistogramSvc::bookProf( const string& par, int hID, const string& title, int nx, double lowx,
452  double upx, double upper, double lower, const string& opt ) {
453  return bookProf( par, std::to_string( hID ), title, nx, lowx, upx, upper, lower, opt );
454 }
455 
456 // ============================================================================
457 AIDA::IProfile1D* HistogramSvc::bookProf( DataObject* pPar, int hID, const string& title, int nx, double lowx,
458  double upx, double upper, double lower, const string& opt ) {
459  return bookProf( pPar, std::to_string( hID ), title, nx, lowx, upx, upper, lower, opt );
460 }
461 
462 // ============================================================================
463 AIDA::IProfile1D* HistogramSvc::bookProf( const std::pair<string, string>& loc, const string& title, int nx,
464  double lowx, double upx, double upper, double lower, const string& opt ) {
465  return bookProf( loc.first, loc.second, title, nx, lowx, upx, upper, lower, opt );
466 }
467 
468 // ============================================================================
469 AIDA::IProfile1D* HistogramSvc::bookProf( const string& full, const string& title, int nx, double lowx, double upx,
470  double upper, double lower, const string& opt ) {
471  return bookProf( i_splitPath( full ), title, nx, lowx, upx, upper, lower, opt );
472 }
473 
474 // ============================================================================
475 AIDA::IProfile1D* HistogramSvc::bookProf( DataObject* pPar, const string& rel, const string& title, int nx, double lowx,
476  double upx, double upper, double lower, const string& opt ) {
477  return i_book(
478  pPar, rel, title,
479  Gaudi::createProf1D( serviceLocator(), buildHistoPath( pPar, rel ), title, nx, lowx, upx, upper, lower, opt ) );
480 }
481 
482 // ============================================================================
483 AIDA::IHistogram1D* HistogramSvc::book( const std::string& par, int hID, const std::string& title, Edges e ) {
484  return book( par, std::to_string( hID ), title, e );
485 }
486 
487 // ============================================================================
488 AIDA::IHistogram1D* HistogramSvc::book( DataObject* pPar, int hID, const std::string& title, Edges e ) {
489  return book( pPar, std::to_string( hID ), title, e );
490 }
491 
492 // ============================================================================
493 AIDA::IHistogram1D* HistogramSvc::book( const std::string& par, const std::string& rel, const std::string& title,
494  Edges e ) {
495  return book( createPath( par ), rel, title, e );
496 }
497 
498 // ============================================================================
499 AIDA::IHistogram1D* HistogramSvc::book( const std::pair<std::string, std::string>& loc, const std::string& title,
500  Edges e ) {
501  return book( loc.first, loc.second, title, e );
502 }
503 
504 // ============================================================================
505 AIDA::IHistogram1D* HistogramSvc::book( const std::string& full, const std::string& title, Edges e ) {
506  return book( i_splitPath( full ), title, e );
507 }
508 
509 // ============================================================================
510 AIDA::IHistogram1D* HistogramSvc::book( DataObject* pPar, const std::string& rel, const std::string& title, Edges e ) {
511  return i_book( pPar, rel, title, Gaudi::createH1D( serviceLocator(), buildHistoPath( pPar, rel ), title, e ) );
512 }
513 
514 // ============================================================================
515 AIDA::IProfile1D* HistogramSvc::bookProf( const std::string& full, const std::string& title, Edges e ) {
516  return bookProf( i_splitPath( full ), title, e );
517 }
518 
519 // ============================================================================
520 AIDA::IProfile1D* HistogramSvc::bookProf( const std::string& par, const std::string& rel, const std::string& title,
521  Edges e ) {
522  return bookProf( createPath( par ), rel, title, e );
523 }
524 
525 // ============================================================================
526 AIDA::IProfile1D* HistogramSvc::bookProf( const std::string& par, int hID, const std::string& title, Edges e ) {
527  return bookProf( par, std::to_string( hID ), title, e );
528 }
529 
530 // ============================================================================
531 AIDA::IProfile1D* HistogramSvc::bookProf( DataObject* pPar, int hID, const std::string& title, Edges e ) {
532  return bookProf( pPar, std::to_string( hID ), title, e );
533 }
534 
535 // ============================================================================
536 AIDA::IProfile1D* HistogramSvc::bookProf( const std::pair<std::string, std::string>& loc, const std::string& title,
537  Edges e ) {
538  return bookProf( loc.first, loc.second, title, e );
539 }
540 
541 // ============================================================================
542 AIDA::IProfile1D* HistogramSvc::bookProf( DataObject* pPar, const std::string& rel, const std::string& title,
543  Edges e ) {
544  return i_book( pPar, rel, title,
545  Gaudi::createProf1D( serviceLocator(), buildHistoPath( pPar, rel ), title, e, 0, 0 ) );
546 }
547 
548 // ============================================================================
549 AIDA::IProfile1D* HistogramSvc::bookProf( const std::string& full, const std::string& title, Edges e, double upper,
550  double lower ) {
551  return bookProf( i_splitPath( full ), title, e, upper, lower );
552 }
553 
554 // ============================================================================
555 AIDA::IProfile1D* HistogramSvc::bookProf( const std::string& par, const std::string& rel, const std::string& title,
556  Edges e, double upper, double lower ) {
557  return bookProf( createPath( par ), rel, title, e, upper, lower );
558 }
559 
560 // ============================================================================
561 AIDA::IProfile1D* HistogramSvc::bookProf( const std::string& par, int hID, const std::string& title, Edges e,
562  double upper, double lower ) {
563  return bookProf( par, std::to_string( hID ), title, e, upper, lower );
564 }
565 
566 // ============================================================================
567 AIDA::IProfile1D* HistogramSvc::bookProf( DataObject* pPar, int hID, const std::string& title, Edges e, double upper,
568  double lower ) {
569  return bookProf( pPar, std::to_string( hID ), title, e, upper, lower );
570 }
571 
572 // ============================================================================
573 AIDA::IProfile1D* HistogramSvc::bookProf( const std::pair<std::string, std::string>& loc, const std::string& title,
574  Edges e, double upper, double lower ) {
575  return bookProf( loc.first, loc.second, title, e, upper, lower );
576 }
577 
578 // ============================================================================
579 AIDA::IProfile1D* HistogramSvc::bookProf( DataObject* pPar, const std::string& rel, const std::string& title, Edges e,
580  double upper, double lower ) {
581  return i_book( pPar, rel, title,
582  Gaudi::createProf1D( serviceLocator(), buildHistoPath( pPar, rel ), title, e, upper, lower ) );
583 }
584 
585 // ============================================================================
586 AIDA::IHistogram2D* HistogramSvc::book( const std::string& full, const std::string& title, int nx, double lowx,
587  double upx, int ny, double lowy, double upy ) {
588  return book( i_splitPath( full ), title, nx, lowx, upx, ny, lowy, upy );
589 }
590 
591 // ============================================================================
592 AIDA::IHistogram2D* HistogramSvc::book( const std::string& par, const std::string& rel, const std::string& title,
593  int nx, double lowx, double upx, int ny, double lowy, double upy ) {
594  return book( createPath( par ), rel, title, nx, lowx, upx, ny, lowy, upy );
595 }
596 
597 // ============================================================================
598 AIDA::IHistogram2D* HistogramSvc::book( const std::string& par, int hID, const std::string& title, int nx, double lowx,
599  double upx, int ny, double lowy, double upy ) {
600  return book( par, std::to_string( hID ), title, nx, lowx, upx, ny, lowy, upy );
601 }
602 
603 // ============================================================================
604 AIDA::IHistogram2D* HistogramSvc::book( const std::pair<std::string, std::string>& loc, const std::string& title,
605  int nx, double lowx, double upx, int ny, double lowy, double upy ) {
606  return book( loc.first, loc.second, title, nx, lowx, upx, ny, lowy, upy );
607 }
608 
609 // ============================================================================
610 AIDA::IHistogram2D* HistogramSvc::book( DataObject* pPar, int hID, const std::string& title, int nx, double lowx,
611  double upx, int ny, double lowy, double upy ) {
612  return book( pPar, std::to_string( hID ), title, nx, lowx, upx, ny, lowy, upy );
613 }
614 
615 // ============================================================================
616 AIDA::IHistogram2D* HistogramSvc::book( DataObject* pPar, const std::string& rel, const std::string& title, int nx,
617  double lowx, double upx, int ny, double lowy, double upy ) {
618  return i_book(
619  pPar, rel, title,
620  Gaudi::createH2D( serviceLocator(), buildHistoPath( pPar, rel ), title, nx, lowx, upx, ny, lowy, upy ) );
621 }
622 
623 // ============================================================================
624 AIDA::IProfile2D* HistogramSvc::bookProf( const std::string& full, const std::string& title, int nx, double lowx,
625  double upx, int ny, double lowy, double upy, double upper, double lower ) {
626  return bookProf( i_splitPath( full ), title, nx, lowx, upx, ny, lowy, upy, upper, lower );
627 }
628 
629 // ============================================================================
630 AIDA::IProfile2D* HistogramSvc::bookProf( const std::string& par, const std::string& rel, const std::string& title,
631  int nx, double lowx, double upx, int ny, double lowy, double upy,
632  double upper, double lower ) {
633  return bookProf( createPath( par ), rel, title, nx, lowx, upx, ny, lowy, upy, upper, lower );
634 }
635 
636 // ============================================================================
637 AIDA::IProfile2D* HistogramSvc::bookProf( const std::pair<std::string, std::string>& loc, const std::string& title,
638  int nx, double lowx, double upx, int ny, double lowy, double upy,
639  double upper, double lower ) {
640  return bookProf( loc.first, loc.second, title, nx, lowx, upx, ny, lowy, upy, upper, lower );
641 }
642 
643 // ============================================================================
644 AIDA::IProfile2D* HistogramSvc::bookProf( const std::string& par, int hID, const std::string& title, int nx,
645  double lowx, double upx, int ny, double lowy, double upy, double upper,
646  double lower ) {
647  return bookProf( par, std::to_string( hID ), title, nx, lowx, upx, ny, lowy, upy, upper, lower );
648 }
649 
650 // ============================================================================
651 AIDA::IProfile2D* HistogramSvc::bookProf( DataObject* pPar, int hID, const std::string& title, int nx, double lowx,
652  double upx, int ny, double lowy, double upy, double upper, double lower ) {
653  return bookProf( pPar, std::to_string( hID ), title, nx, lowx, upx, ny, lowy, upy, upper, lower );
654 }
655 
656 // ============================================================================
657 AIDA::IProfile2D* HistogramSvc::bookProf( DataObject* pPar, const std::string& rel, const std::string& title, int nx,
658  double lowx, double upx, int ny, double lowy, double upy, double upper,
659  double lower ) {
660  return i_book( pPar, rel, title,
661  Gaudi::createProf2D( serviceLocator(), buildHistoPath( pPar, rel ), title, nx, lowx, upx, ny, lowy,
662  upy, upper, lower ) );
663 }
664 
665 // ============================================================================
666 AIDA::IProfile2D* HistogramSvc::bookProf( const std::string& full, const std::string& title, int nx, double lowx,
667  double upx, int ny, double lowy, double upy ) {
668  return bookProf( i_splitPath( full ), title, nx, lowx, upx, ny, lowy, upy );
669 }
670 
671 // ============================================================================
672 AIDA::IProfile2D* HistogramSvc::bookProf( const std::string& par, const std::string& rel, const std::string& title,
673  int nx, double lowx, double upx, int ny, double lowy, double upy ) {
674  return bookProf( createPath( par ), rel, title, nx, lowx, upx, ny, lowy, upy );
675 }
676 
677 // ============================================================================
678 AIDA::IProfile2D* HistogramSvc::bookProf( const std::pair<std::string, std::string>& loc, const std::string& title,
679  int nx, double lowx, double upx, int ny, double lowy, double upy ) {
680  return bookProf( loc.first, loc.second, title, nx, lowx, upx, ny, lowy, upy );
681 }
682 
683 // ============================================================================
684 AIDA::IProfile2D* HistogramSvc::bookProf( const std::string& par, int hID, const std::string& title, int nx,
685  double lowx, double upx, int ny, double lowy, double upy ) {
686  return bookProf( par, std::to_string( hID ), title, nx, lowx, upx, ny, lowy, upy );
687 }
688 
689 // ============================================================================
690 AIDA::IProfile2D* HistogramSvc::bookProf( DataObject* pPar, int hID, const std::string& title, int nx, double lowx,
691  double upx, int ny, double lowy, double upy ) {
692  return bookProf( pPar, std::to_string( hID ), title, nx, lowx, upx, ny, lowy, upy );
693 }
694 
695 // ============================================================================
696 AIDA::IProfile2D* HistogramSvc::bookProf( DataObject* pPar, const std::string& rel, const std::string& title, int nx,
697  double lowx, double upx, int ny, double lowy, double upy ) {
698  return i_book(
699  pPar, rel, title,
700  Gaudi::createProf2D( serviceLocator(), buildHistoPath( pPar, rel ), title, nx, lowx, upx, ny, lowy, upy, 0, 0 ) );
701 }
702 
703 // ============================================================================
704 AIDA::IHistogram2D* HistogramSvc::book( const std::string& full, const std::string& title, Edges x, Edges y ) {
705  return book( i_splitPath( full ), title, x, y );
706 }
707 
708 // ============================================================================
709 AIDA::IHistogram2D* HistogramSvc::book( const std::string& par, const std::string& rel, const std::string& title,
710  Edges x, Edges y ) {
711  return book( createPath( par ), rel, title, x, y );
712 }
713 
714 // ============================================================================
715 AIDA::IHistogram2D* HistogramSvc::book( const std::string& par, int hID, const std::string& title, Edges x, Edges y ) {
716  return book( par, std::to_string( hID ), title, x, y );
717 }
718 
719 // ============================================================================
720 AIDA::IHistogram2D* HistogramSvc::book( const std::pair<std::string, std::string>& loc, const std::string& title,
721  Edges x, Edges y ) {
722  return book( loc.first, loc.second, title, x, y );
723 }
724 
725 // ============================================================================
726 AIDA::IHistogram2D* HistogramSvc::book( DataObject* pPar, int hID, const std::string& title, Edges x, Edges y ) {
727  return book( pPar, std::to_string( hID ), title, x, y );
728 }
729 
730 // ============================================================================
731 AIDA::IHistogram2D* HistogramSvc::book( DataObject* pPar, const std::string& rel, const std::string& title, Edges x,
732  Edges y ) {
733  return i_book( pPar, rel, title, Gaudi::createH2D( serviceLocator(), buildHistoPath( pPar, rel ), title, x, y ) );
734 }
735 
736 // ============================================================================
737 AIDA::IProfile2D* HistogramSvc::bookProf( const std::string& full, const std::string& title, Edges x, Edges y ) {
738  return bookProf( i_splitPath( full ), title, x, y );
739 }
740 
741 // ============================================================================
742 AIDA::IProfile2D* HistogramSvc::bookProf( const std::string& par, const std::string& rel, const std::string& title,
743  Edges x, Edges y ) {
744  return bookProf( createPath( par ), rel, title, x, y );
745 }
746 
747 // ============================================================================
748 AIDA::IProfile2D* HistogramSvc::bookProf( const std::string& par, int hID, const std::string& title, Edges x,
749  Edges y ) {
750  return bookProf( par, std::to_string( hID ), title, x, y );
751 }
752 
753 // ============================================================================
754 AIDA::IProfile2D* HistogramSvc::bookProf( DataObject* pPar, int hID, const std::string& title, Edges x, Edges y ) {
755  return bookProf( pPar, std::to_string( hID ), title, x, y );
756 }
757 
758 // ============================================================================
759 AIDA::IProfile2D* HistogramSvc::bookProf( const std::pair<std::string, std::string>& loc, const std::string& title,
760  Edges x, Edges y ) {
761  return bookProf( loc.first, loc.second, title, x, y );
762 }
763 
764 // ============================================================================
765 AIDA::IProfile2D* HistogramSvc::bookProf( DataObject* pPar, const std::string& rel, const std::string& title, Edges x,
766  Edges y ) {
767  return i_book( pPar, rel, title,
768  Gaudi::createProf2D( serviceLocator(), buildHistoPath( pPar, rel ), title, x, y, 0, 0 ) );
769 }
770 
771 // ============================================================================
772 AIDA::IProfile2D* HistogramSvc::bookProf( const std::string& full, const std::string& title, Edges x, Edges y,
773  double upper, double lower ) {
774  return bookProf( i_splitPath( full ), title, x, y, upper, lower );
775 }
776 
777 // ============================================================================
778 AIDA::IProfile2D* HistogramSvc::bookProf( const std::string& par, const std::string& rel, const std::string& title,
779  Edges x, Edges y, double upper, double lower ) {
780  return bookProf( createPath( par ), rel, title, x, y, upper, lower );
781 }
782 
783 // ============================================================================
784 AIDA::IProfile2D* HistogramSvc::bookProf( const std::string& par, int hID, const std::string& title, Edges x, Edges y,
785  double upper, double lower ) {
786  return bookProf( par, std::to_string( hID ), title, x, y, upper, lower );
787 }
788 
789 // ============================================================================
790 AIDA::IProfile2D* HistogramSvc::bookProf( DataObject* pPar, int hID, const std::string& title, Edges x, Edges y,
791  double upper, double lower ) {
792  return bookProf( pPar, std::to_string( hID ), title, x, y, upper, lower );
793 }
794 
795 // ============================================================================
796 AIDA::IProfile2D* HistogramSvc::bookProf( const std::pair<std::string, std::string>& loc, const std::string& title,
797  Edges x, Edges y, double upper, double lower ) {
798  return bookProf( loc.first, loc.second, title, x, y, upper, lower );
799 }
800 
801 // ============================================================================
802 AIDA::IProfile2D* HistogramSvc::bookProf( DataObject* pPar, const std::string& rel, const std::string& title, Edges x,
803  Edges y, double upper, double lower ) {
804  return i_book( pPar, rel, title,
805  Gaudi::createProf2D( serviceLocator(), buildHistoPath( pPar, rel ), title, x, y, upper, lower ) );
806 }
807 
808 // ============================================================================
809 AIDA::IHistogram3D* HistogramSvc::book( const std::string& full, const std::string& title, int nx, double lowx,
810  double upx, int ny, double lowy, double upy, int nz, double lowz, double upz ) {
811  return book( i_splitPath( full ), title, nx, lowx, upx, ny, lowy, upy, nz, lowz, upz );
812 }
813 
814 // ============================================================================
815 AIDA::IHistogram3D* HistogramSvc::book( const std::string& par, const std::string& rel, const std::string& title,
816  int nx, double lowx, double upx, int ny, double lowy, double upy, int nz,
817  double lowz, double upz ) {
818  return book( createPath( par ), rel, title, nx, lowx, upx, ny, lowy, upy, nz, lowz, upz );
819 }
820 
821 // ============================================================================
822 AIDA::IHistogram3D* HistogramSvc::book( const std::string& par, int hID, const std::string& title, int nx, double lowx,
823  double upx, int ny, double lowy, double upy, int nz, double lowz, double upz ) {
824  return book( par, std::to_string( hID ), title, nx, lowx, upx, ny, lowy, upy, nz, lowz, upz );
825 }
826 
827 // ============================================================================
828 AIDA::IHistogram3D* HistogramSvc::book( DataObject* pPar, int hID, const std::string& title, int nx, double lowx,
829  double upx, int ny, double lowy, double upy, int nz, double lowz, double upz ) {
830  return book( pPar, std::to_string( hID ), title, nx, lowx, upx, ny, lowy, upy, nz, lowz, upz );
831 }
832 
833 // ============================================================================
834 AIDA::IHistogram3D* HistogramSvc::book( const std::pair<std::string, std::string>& loc, const std::string& title,
835  int nx, double lowx, double upx, int ny, double lowy, double upy, int nz,
836  double lowz, double upz ) {
837  return book( loc.first, loc.second, title, nx, lowx, upx, ny, lowy, upy, nz, lowz, upz );
838 }
839 
840 // ============================================================================
841 AIDA::IHistogram3D* HistogramSvc::book( DataObject* pPar, const std::string& rel, const std::string& title, int nx,
842  double lowx, double upx, int ny, double lowy, double upy, int nz, double lowz,
843  double upz ) {
844  return i_book( pPar, rel, title,
845  Gaudi::createH3D( serviceLocator(), buildHistoPath( pPar, rel ), title, nx, lowx, upx, ny, lowy, upy,
846  nz, lowz, upz ) );
847 }
848 
849 // ============================================================================
850 AIDA::IHistogram3D* HistogramSvc::book( const std::string& full, const std::string& title, Edges x, Edges y, Edges z ) {
851  return book( i_splitPath( full ), title, x, y, z );
852 }
853 
854 // ============================================================================
855 AIDA::IHistogram3D* HistogramSvc::book( const std::string& par, const std::string& rel, const std::string& title,
856  Edges x, Edges y, Edges z ) {
857  return book( createPath( par ), rel, title, x, y, z );
858 }
859 
860 // ============================================================================
861 AIDA::IHistogram3D* HistogramSvc::book( const std::string& par, int hID, const std::string& title, Edges x, Edges y,
862  Edges z ) {
863  return book( par, std::to_string( hID ), title, x, y, z );
864 }
865 
866 // ============================================================================
867 AIDA::IHistogram3D* HistogramSvc::book( DataObject* pPar, int hID, const std::string& title, Edges x, Edges y,
868  Edges z ) {
869  return book( pPar, std::to_string( hID ), title, x, y, z );
870 }
871 
872 // ============================================================================
873 AIDA::IHistogram3D* HistogramSvc::book( const std::pair<std::string, std::string>& loc, const std::string& title,
874  Edges x, Edges y, Edges z ) {
875  return book( loc.first, loc.second, title, x, y, z );
876 }
877 
878 // ============================================================================
879 AIDA::IHistogram3D* HistogramSvc::book( DataObject* pPar, const std::string& rel, const std::string& title, Edges x,
880  Edges y, Edges z ) {
881  return i_book( pPar, rel, title, Gaudi::createH3D( serviceLocator(), buildHistoPath( pPar, rel ), title, x, y, z ) );
882 }
883 
884 // ============================================================================
886  return registerObject( createPath( parent ), rel, obj );
887 }
888 
889 // ============================================================================
891  return registerObject( ::detail::cast( pPar ), rel, obj );
892 }
893 
894 // ============================================================================
895 StatusCode HistogramSvc::unregisterObject( Base* obj ) { return unregisterObject( ::detail::cast( obj ) ); }
896 
897 // ============================================================================
899  return unregisterObject( ::detail::cast( obj ), objectPath );
900 }
901 
902 // ============================================================================
904  return unregisterObject( ::detail::cast( obj ), item );
905 }
906 
907 // ============================================================================
908 StatusCode HistogramSvc::retrieveObject( IRegistry* pReg, const std::string& path, AIDA::IHistogram1D*& obj ) {
909  return Helper( this ).retrieve( pReg, path, obj );
910 }
911 
912 // ============================================================================
913 StatusCode HistogramSvc::retrieveObject( IRegistry* pReg, const std::string& path, AIDA::IProfile1D*& obj ) {
914  return Helper( this ).retrieve( pReg, path, obj );
915 }
916 
917 // ============================================================================
918 StatusCode HistogramSvc::retrieveObject( IRegistry* pReg, const std::string& path, AIDA::IHistogram2D*& obj ) {
919  return Helper( this ).retrieve( pReg, path, obj );
920 }
921 
922 // ============================================================================
923 StatusCode HistogramSvc::retrieveObject( IRegistry* pReg, const std::string& path, AIDA::IProfile2D*& obj ) {
924  return Helper( this ).retrieve( pReg, path, obj );
925 }
926 
927 // ============================================================================
928 StatusCode HistogramSvc::retrieveObject( IRegistry* pReg, const std::string& path, AIDA::IHistogram3D*& obj ) {
929  return Helper( this ).retrieve( pReg, path, obj );
930 }
931 
932 // ============================================================================
933 StatusCode HistogramSvc::retrieveObject( const std::string& full, AIDA::IProfile1D*& obj ) {
934  return Helper( this ).retrieve( full, obj );
935 }
936 
937 // ============================================================================
938 StatusCode HistogramSvc::retrieveObject( const std::string& full, AIDA::IProfile2D*& obj ) {
939  return Helper( this ).retrieve( full, obj );
940 }
941 
942 // ============================================================================
943 StatusCode HistogramSvc::retrieveObject( const std::string& full, AIDA::IHistogram1D*& obj ) {
944  return Helper( this ).retrieve( full, obj );
945 }
946 
947 // ============================================================================
948 StatusCode HistogramSvc::retrieveObject( const std::string& full, AIDA::IHistogram2D*& obj ) {
949  return Helper( this ).retrieve( full, obj );
950 }
951 
952 // ============================================================================
953 StatusCode HistogramSvc::retrieveObject( const std::string& full, AIDA::IHistogram3D*& obj ) {
954  return Helper( this ).retrieve( full, obj );
955 }
956 
957 // ============================================================================
959 
960  AIDA::IProfile1D*& obj ) {
961  return Helper( this ).retrieve( parent, rel, obj );
962 }
963 
964 // ============================================================================
965 StatusCode HistogramSvc::retrieveObject( const std::string& parent, const std::string& rel, AIDA::IProfile2D*& obj ) {
966  return Helper( this ).retrieve( parent, rel, obj );
967 }
968 
969 // ============================================================================
970 StatusCode HistogramSvc::retrieveObject( const std::string& parent, const std::string& rel, AIDA::IHistogram1D*& obj ) {
971  return Helper( this ).retrieve( parent, rel, obj );
972 }
973 
974 // ============================================================================
975 StatusCode HistogramSvc::retrieveObject( const std::string& parent, const std::string& rel, AIDA::IHistogram2D*& obj ) {
976  return Helper( this ).retrieve( parent, rel, obj );
977 }
978 
979 // ============================================================================
980 StatusCode HistogramSvc::retrieveObject( const std::string& parent, const std::string& rel, AIDA::IHistogram3D*& obj ) {
981  return Helper( this ).retrieve( parent, rel, obj );
982 }
983 
984 // ============================================================================
985 StatusCode HistogramSvc::retrieveObject( const std::string& parent, int item, AIDA::IProfile1D*& obj ) {
986  return Helper( this ).retrieve( parent, item, obj );
987 }
988 
989 // ============================================================================
990 StatusCode HistogramSvc::retrieveObject( const std::string& parent, int item, AIDA::IProfile2D*& obj ) {
991  return Helper( this ).retrieve( parent, item, obj );
992 }
993 
994 // ============================================================================
995 StatusCode HistogramSvc::retrieveObject( const std::string& parent, int item, AIDA::IHistogram1D*& obj ) {
996  return Helper( this ).retrieve( parent, item, obj );
997 }
998 
999 // ============================================================================
1000 StatusCode HistogramSvc::retrieveObject( const std::string& parent, int item, AIDA::IHistogram2D*& obj ) {
1001  return Helper( this ).retrieve( parent, item, obj );
1002 }
1003 
1004 // ============================================================================
1005 StatusCode HistogramSvc::retrieveObject( const std::string& parent, int item, AIDA::IHistogram3D*& obj ) {
1006  return Helper( this ).retrieve( parent, item, obj );
1007 }
1008 // ============================================================================
1009 StatusCode HistogramSvc::retrieveObject( DataObject* par, const std::string& item, AIDA::IProfile1D*& obj ) {
1010  return Helper( this ).retrieve( par, item, obj );
1011 }
1012 
1013 // ============================================================================
1014 StatusCode HistogramSvc::retrieveObject( DataObject* par, const std::string& item, AIDA::IProfile2D*& obj ) {
1015  return Helper( this ).retrieve( par, item, obj );
1016 }
1017 
1018 // ============================================================================
1019 StatusCode HistogramSvc::retrieveObject( DataObject* par, const std::string& item, AIDA::IHistogram1D*& obj ) {
1020  return Helper( this ).retrieve( par, item, obj );
1021 }
1022 
1023 // ============================================================================
1024 StatusCode HistogramSvc::retrieveObject( DataObject* par, const std::string& item, AIDA::IHistogram2D*& obj ) {
1025  return Helper( this ).retrieve( par, item, obj );
1026 }
1027 
1028 // ============================================================================
1029 StatusCode HistogramSvc::retrieveObject( DataObject* par, const std::string& item, AIDA::IHistogram3D*& obj ) {
1030  return Helper( this ).retrieve( par, item, obj );
1031 }
1032 
1033 // ============================================================================
1034 StatusCode HistogramSvc::retrieveObject( DataObject* par, int item, AIDA::IProfile1D*& obj ) {
1035  return Helper( this ).retrieve( par, item, obj );
1036 }
1037 
1038 // ============================================================================
1039 StatusCode HistogramSvc::retrieveObject( DataObject* par, int item, AIDA::IProfile2D*& obj ) {
1040  return Helper( this ).retrieve( par, item, obj );
1041 }
1042 
1043 // ============================================================================
1044 StatusCode HistogramSvc::retrieveObject( DataObject* par, int item, AIDA::IHistogram1D*& obj ) {
1045  return Helper( this ).retrieve( par, item, obj );
1046 }
1047 
1048 // ============================================================================
1049 StatusCode HistogramSvc::retrieveObject( DataObject* par, int item, AIDA::IHistogram2D*& obj ) {
1050  return Helper( this ).retrieve( par, item, obj );
1051 }
1052 
1053 // ============================================================================
1054 StatusCode HistogramSvc::retrieveObject( DataObject* par, int item, AIDA::IHistogram3D*& obj ) {
1055  return Helper( this ).retrieve( par, item, obj );
1056 }
1057 
1058 // ============================================================================
1059 StatusCode HistogramSvc::retrieveObject( Base* par, int item, AIDA::IProfile1D*& obj ) {
1060  return Helper( this ).retrieve( ::detail::cast( par ), item, obj );
1061 }
1062 
1063 // ============================================================================
1064 StatusCode HistogramSvc::retrieveObject( Base* par, int item, AIDA::IProfile2D*& obj ) {
1065  return Helper( this ).retrieve( ::detail::cast( par ), item, obj );
1066 }
1067 
1068 // ============================================================================
1069 StatusCode HistogramSvc::retrieveObject( Base* par, int item, AIDA::IHistogram1D*& obj ) {
1070  return Helper( this ).retrieve( ::detail::cast( par ), item, obj );
1071 }
1072 
1073 // ============================================================================
1074 StatusCode HistogramSvc::retrieveObject( Base* par, int item, AIDA::IHistogram2D*& obj ) {
1075  return Helper( this ).retrieve( ::detail::cast( par ), item, obj );
1076 }
1077 
1078 // ============================================================================
1079 StatusCode HistogramSvc::retrieveObject( Base* par, int item, AIDA::IHistogram3D*& obj ) {
1080  return Helper( this ).retrieve( ::detail::cast( par ), item, obj );
1081 }
1082 
1083 // ============================================================================
1084 StatusCode HistogramSvc::retrieveObject( Base* par, const std::string& item, AIDA::IProfile1D*& obj ) {
1085  return Helper( this ).retrieve( ::detail::cast( par ), item, obj );
1086 }
1087 
1088 // ============================================================================
1089 StatusCode HistogramSvc::retrieveObject( Base* par, const std::string& item, AIDA::IProfile2D*& obj ) {
1090  return Helper( this ).retrieve( ::detail::cast( par ), item, obj );
1091 }
1092 
1093 // ============================================================================
1094 StatusCode HistogramSvc::retrieveObject( Base* par, const std::string& item, AIDA::IHistogram1D*& obj ) {
1095  return Helper( this ).retrieve( ::detail::cast( par ), item, obj );
1096 }
1097 
1098 // ============================================================================
1099 StatusCode HistogramSvc::retrieveObject( Base* par, const std::string& item, AIDA::IHistogram2D*& obj ) {
1100  return Helper( this ).retrieve( ::detail::cast( par ), item, obj );
1101 }
1102 
1103 // ============================================================================
1104 StatusCode HistogramSvc::retrieveObject( Base* par, const std::string& item, AIDA::IHistogram3D*& obj ) {
1105  return Helper( this ).retrieve( ::detail::cast( par ), item, obj );
1106 }
1107 
1108 // ============================================================================
1109 StatusCode HistogramSvc::findObject( IRegistry* pReg, const std::string& path, AIDA::IProfile1D*& obj ) {
1110  return Helper( this ).find( pReg, path, obj );
1111 }
1112 // ============================================================================
1113 StatusCode HistogramSvc::findObject( IRegistry* pReg, const std::string& path, AIDA::IProfile2D*& obj ) {
1114  return Helper( this ).find( pReg, path, obj );
1115 }
1116 // ============================================================================
1117 StatusCode HistogramSvc::findObject( IRegistry* pReg, const std::string& path, AIDA::IHistogram1D*& obj ) {
1118  return Helper( this ).find( pReg, path, obj );
1119 }
1120 // ============================================================================
1121 StatusCode HistogramSvc::findObject( IRegistry* pReg, const std::string& path, AIDA::IHistogram2D*& obj ) {
1122  return Helper( this ).find( pReg, path, obj );
1123 }
1124 // ============================================================================
1125 StatusCode HistogramSvc::findObject( IRegistry* pReg, const std::string& path, AIDA::IHistogram3D*& obj ) {
1126  return Helper( this ).find( pReg, path, obj );
1127 }
1128 // ============================================================================
1129 StatusCode HistogramSvc::findObject( const std::string& full, AIDA::IProfile1D*& obj ) {
1130  return Helper( this ).find( full, obj );
1131 }
1132 // ============================================================================
1133 StatusCode HistogramSvc::findObject( const std::string& full, AIDA::IProfile2D*& obj ) {
1134  return Helper( this ).find( full, obj );
1135 }
1136 
1137 // ============================================================================
1138 StatusCode HistogramSvc::findObject( const std::string& full, AIDA::IHistogram1D*& obj ) {
1139  return Helper( this ).find( full, obj );
1140 }
1141 
1142 // ============================================================================
1143 StatusCode HistogramSvc::findObject( const std::string& full, AIDA::IHistogram2D*& obj ) {
1144  return Helper( this ).find( full, obj );
1145 }
1146 
1147 // ============================================================================
1148 StatusCode HistogramSvc::findObject( const std::string& full, AIDA::IHistogram3D*& obj ) {
1149  return Helper( this ).find( full, obj );
1150 }
1151 
1152 // ============================================================================
1153 StatusCode HistogramSvc::findObject( const std::string& par, const std::string& rel, AIDA::IProfile1D*& obj ) {
1154  return Helper( this ).find( par, rel, obj );
1155 }
1156 
1157 // ============================================================================
1158 StatusCode HistogramSvc::findObject( const std::string& par, const std::string& rel, AIDA::IProfile2D*& obj ) {
1159  return Helper( this ).find( par, rel, obj );
1160 }
1161 
1162 // ============================================================================
1163 StatusCode HistogramSvc::findObject( const std::string& par, const std::string& rel, AIDA::IHistogram1D*& obj ) {
1164  return Helper( this ).find( par, rel, obj );
1165 }
1166 
1167 // ============================================================================
1168 StatusCode HistogramSvc::findObject( const std::string& par, const std::string& rel, AIDA::IHistogram2D*& obj ) {
1169  return Helper( this ).find( par, rel, obj );
1170 }
1171 
1172 // ============================================================================
1173 StatusCode HistogramSvc::findObject( const std::string& par, const std::string& rel, AIDA::IHistogram3D*& obj ) {
1174  return Helper( this ).find( par, rel, obj );
1175 }
1176 
1177 // ============================================================================
1178 StatusCode HistogramSvc::findObject( const std::string& par, int item, AIDA::IProfile1D*& obj ) {
1179  return Helper( this ).find( par, item, obj );
1180 }
1181 
1182 // ============================================================================
1183 StatusCode HistogramSvc::findObject( const std::string& par, int item, AIDA::IProfile2D*& obj ) {
1184  return Helper( this ).find( par, item, obj );
1185 }
1186 
1187 // ============================================================================
1188 StatusCode HistogramSvc::findObject( const std::string& par, int item, AIDA::IHistogram1D*& obj ) {
1189  return Helper( this ).find( par, item, obj );
1190 }
1191 
1192 // ============================================================================
1193 StatusCode HistogramSvc::findObject( const std::string& par, int item, AIDA::IHistogram2D*& obj ) {
1194  return Helper( this ).find( par, item, obj );
1195 }
1196 
1197 // ============================================================================
1198 StatusCode HistogramSvc::findObject( const std::string& par, int item, AIDA::IHistogram3D*& obj ) {
1199  return Helper( this ).find( par, item, obj );
1200 }
1201 
1202 // ============================================================================
1203 StatusCode HistogramSvc::findObject( DataObject* par, int item, AIDA::IProfile1D*& obj ) {
1204  return Helper( this ).find( par, item, obj );
1205 }
1206 
1207 // ============================================================================
1208 StatusCode HistogramSvc::findObject( DataObject* par, int item, AIDA::IProfile2D*& obj ) {
1209  return Helper( this ).find( par, item, obj );
1210 }
1211 
1212 // ============================================================================
1213 StatusCode HistogramSvc::findObject( DataObject* par, int item, AIDA::IHistogram1D*& obj ) {
1214  return Helper( this ).find( par, item, obj );
1215 }
1216 
1217 // ============================================================================
1218 StatusCode HistogramSvc::findObject( DataObject* par, int item, AIDA::IHistogram2D*& obj ) {
1219  return Helper( this ).find( par, item, obj );
1220 }
1221 
1222 // ============================================================================
1223 StatusCode HistogramSvc::findObject( DataObject* par, int item, AIDA::IHistogram3D*& obj ) {
1224  return Helper( this ).find( par, item, obj );
1225 }
1226 
1227 // ============================================================================
1228 StatusCode HistogramSvc::findObject( DataObject* par, const std::string& item, AIDA::IProfile1D*& obj ) {
1229  return Helper( this ).find( par, item, obj );
1230 }
1231 
1232 // ============================================================================
1233 StatusCode HistogramSvc::findObject( DataObject* par, const std::string& item, AIDA::IProfile2D*& obj ) {
1234  return Helper( this ).find( par, item, obj );
1235 }
1236 
1237 // ============================================================================
1238 StatusCode HistogramSvc::findObject( DataObject* par, const std::string& item, AIDA::IHistogram1D*& obj ) {
1239  return Helper( this ).find( par, item, obj );
1240 }
1241 
1242 // ============================================================================
1243 StatusCode HistogramSvc::findObject( DataObject* par, const std::string& item, AIDA::IHistogram2D*& obj ) {
1244  return Helper( this ).find( par, item, obj );
1245 }
1246 
1247 // ============================================================================
1248 StatusCode HistogramSvc::findObject( DataObject* par, const std::string& item, AIDA::IHistogram3D*& obj ) {
1249  return Helper( this ).find( par, item, obj );
1250 }
1251 
1252 // ============================================================================
1253 StatusCode HistogramSvc::findObject( Base* par, int item, AIDA::IProfile1D*& obj ) {
1254  return Helper( this ).find( ::detail::cast( par ), item, obj );
1255 }
1256 
1257 // ============================================================================
1258 StatusCode HistogramSvc::findObject( Base* par, int item, AIDA::IProfile2D*& obj ) {
1259  return Helper( this ).find( ::detail::cast( par ), item, obj );
1260 }
1261 
1262 // ============================================================================
1263 StatusCode HistogramSvc::findObject( Base* par, int item, AIDA::IHistogram1D*& obj ) {
1264  return Helper( this ).find( ::detail::cast( par ), item, obj );
1265 }
1266 
1267 // ============================================================================
1268 StatusCode HistogramSvc::findObject( Base* par, int item, AIDA::IHistogram2D*& obj ) {
1269  return Helper( this ).find( ::detail::cast( par ), item, obj );
1270 }
1271 
1272 // ============================================================================
1273 StatusCode HistogramSvc::findObject( Base* par, int item, AIDA::IHistogram3D*& obj ) {
1274  return Helper( this ).find( ::detail::cast( par ), item, obj );
1275 }
1276 
1277 // ============================================================================
1278 StatusCode HistogramSvc::findObject( Base* par, const std::string& item, AIDA::IProfile1D*& obj ) {
1279  return Helper( this ).find( ::detail::cast( par ), item, obj );
1280 }
1281 
1282 // ============================================================================
1283 StatusCode HistogramSvc::findObject( Base* par, const std::string& item, AIDA::IProfile2D*& obj ) {
1284  return Helper( this ).find( ::detail::cast( par ), item, obj );
1285 }
1286 
1287 // ============================================================================
1288 StatusCode HistogramSvc::findObject( Base* par, const std::string& item, AIDA::IHistogram1D*& obj ) {
1289  return Helper( this ).find( ::detail::cast( par ), item, obj );
1290 }
1291 
1292 // ============================================================================
1293 StatusCode HistogramSvc::findObject( Base* par, const std::string& item, AIDA::IHistogram2D*& obj ) {
1294  return Helper( this ).find( ::detail::cast( par ), item, obj );
1295 }
1296 
1297 // ============================================================================
1298 StatusCode HistogramSvc::findObject( Base* par, const std::string& item, AIDA::IHistogram3D*& obj ) {
1299  return Helper( this ).find( ::detail::cast( par ), item, obj );
1300 }
1301 
1302 // ============================================================================
1303 AIDA::IHistogram1D* HistogramSvc::projectionX( const std::string& name, const AIDA::IHistogram2D& h ) {
1304  return sliceX( name, h, IAxis::UNDERFLOW_BIN, IAxis::OVERFLOW_BIN );
1305 }
1306 
1307 // ============================================================================
1308 AIDA::IHistogram1D* HistogramSvc::projectionY( const std::string& name, const AIDA::IHistogram2D& h ) {
1309  return sliceY( name, h, IAxis::UNDERFLOW_BIN, IAxis::OVERFLOW_BIN );
1310 }
1311 
1312 // ============================================================================
1313 AIDA::IHistogram1D* HistogramSvc::sliceX( const std::string& name, const AIDA::IHistogram2D& h, int indexY ) {
1314  return sliceX( name, h, indexY, indexY );
1315 }
1316 
1317 // ============================================================================
1318 AIDA::IHistogram1D* HistogramSvc::sliceY( const std::string& name, const AIDA::IHistogram2D& h, int indexX ) {
1319  return sliceY( name, h, indexX, indexX );
1320 }
1321 
1322 // ============================================================================
1323 AIDA::IHistogram1D* HistogramSvc::add( const std::string& nameAndTitle, const AIDA::IHistogram1D& a,
1324  const AIDA::IHistogram1D& b ) {
1325  return Helper::act( createCopy( nameAndTitle, a ), b, &TH1::Add, 1. );
1326 }
1327 
1328 // ============================================================================
1329 AIDA::IHistogram1D* HistogramSvc::subtract( const std::string& nameAndTitle, const AIDA::IHistogram1D& a,
1330  const AIDA::IHistogram1D& b ) {
1331  return Helper::act( createCopy( nameAndTitle, a ), b, &TH1::Add, -1. );
1332 }
1333 
1334 // ============================================================================
1335 AIDA::IHistogram1D* HistogramSvc::multiply( const std::string& nameAndTitle, const AIDA::IHistogram1D& a,
1336  const AIDA::IHistogram1D& b ) {
1337  return Helper::act( createCopy( nameAndTitle, a ), b, &TH1::Multiply );
1338 }
1339 
1340 // ============================================================================
1341 AIDA::IHistogram1D* HistogramSvc::divide( const std::string& nameAndTitle, const AIDA::IHistogram1D& a,
1342  const AIDA::IHistogram1D& b ) {
1343  return Helper::act( createCopy( nameAndTitle, a ), b, &TH1::Divide );
1344 }
1345 
1346 // ============================================================================
1347 AIDA::IHistogram2D* HistogramSvc::add( const std::string& nameAndTitle, const AIDA::IHistogram2D& a,
1348  const AIDA::IHistogram2D& b ) {
1349  return Helper::act( createCopy( nameAndTitle, a ), b, &TH2D::Add, 1. );
1350 }
1351 
1352 // ============================================================================
1353 AIDA::IHistogram2D* HistogramSvc::subtract( const std::string& nameAndTitle, const AIDA::IHistogram2D& a,
1354  const AIDA::IHistogram2D& b ) {
1355  return Helper::act( createCopy( nameAndTitle, a ), b, &TH2D::Add, -1. );
1356 }
1357 
1358 // ============================================================================
1359 AIDA::IHistogram2D* HistogramSvc::multiply( const std::string& nameAndTitle, const AIDA::IHistogram2D& a,
1360  const AIDA::IHistogram2D& b ) {
1361  return Helper::act( createCopy( nameAndTitle, a ), b, &TH2D::Multiply );
1362 }
1363 
1364 // ============================================================================
1365 AIDA::IHistogram2D* HistogramSvc::divide( const std::string& nameAndTitle, const AIDA::IHistogram2D& a,
1366  const AIDA::IHistogram2D& b ) {
1367  return Helper::act( createCopy( nameAndTitle, a ), b, &TH2D::Divide );
1368 }
1369 
1370 // ============================================================================
1371 AIDA::IHistogram3D* HistogramSvc::add( const std::string& nameAndTitle, const AIDA::IHistogram3D& a,
1372  const AIDA::IHistogram3D& b ) {
1373  return Helper::act( createCopy( nameAndTitle, a ), b, &TH3D::Add, 1. );
1374 }
1375 
1376 // ============================================================================
1377 AIDA::IHistogram3D* HistogramSvc::subtract( const std::string& nameAndTitle, const AIDA::IHistogram3D& a,
1378  const AIDA::IHistogram3D& b ) {
1379  return Helper::act( createCopy( nameAndTitle, a ), b, &TH3D::Add, -1. );
1380 }
1381 
1382 // ============================================================================
1383 AIDA::IHistogram3D* HistogramSvc::multiply( const std::string& nameAndTitle, const AIDA::IHistogram3D& a,
1384  const AIDA::IHistogram3D& b ) {
1385  return Helper::act( createCopy( nameAndTitle, a ), b, &TH3D::Multiply );
1386 }
1387 
1388 // ============================================================================
1389 AIDA::IHistogram3D* HistogramSvc::divide( const std::string& nameAndTitle, const AIDA::IHistogram3D& a,
1390  const AIDA::IHistogram3D& b ) {
1391  return Helper::act( createCopy( nameAndTitle, a ), b, &TH3D::Divide );
1392 }
1393 
1394 // ============================================================================
1395 AIDA::IHistogram2D* HistogramSvc::projectionXY( const std::string& nameAndTitle, const AIDA::IHistogram3D& h ) {
1396  return i_project( nameAndTitle, h, "xy" );
1397 }
1398 
1399 // ============================================================================
1400 AIDA::IHistogram2D* HistogramSvc::projectionXZ( const std::string& nameAndTitle, const AIDA::IHistogram3D& h ) {
1401  return i_project( nameAndTitle, h, "xz" );
1402 }
1403 
1404 // ============================================================================
1405 AIDA::IHistogram2D* HistogramSvc::projectionYZ( const std::string& nameAndTitle, const AIDA::IHistogram3D& h ) {
1406  return i_project( nameAndTitle, h, "yz" );
1407 }
1408 
1409 // ============================================================================
1410 AIDA::IHistogram1D* HistogramSvc::createHistogram1D( const std::string& name, const std::string& title, int nx,
1411  double lowx, double upx ) {
1412  return book( name, title, nx, lowx, upx );
1413 }
1414 
1415 // ============================================================================
1416 AIDA::IHistogram1D* HistogramSvc::createHistogram1D( const std::string& name, const std::string& title, int nx,
1417  double lowx, double upx, const std::string& /*opt*/ ) {
1418  return book( name, title, nx, lowx, upx );
1419 }
1420 
1421 // ============================================================================
1422 AIDA::IHistogram1D* HistogramSvc::createHistogram1D( const std::string& name, const std::string& title, const Edges& x,
1423  const std::string& /*opt*/ ) {
1424  return book( name, title, x );
1425 }
1426 
1427 // ============================================================================
1428 AIDA::IHistogram1D* HistogramSvc::createHistogram1D( const std::string& nameAndTitle, int nx, double lowx,
1429  double upx ) {
1430  return book( nameAndTitle, nameAndTitle, nx, lowx, upx );
1431 }
1432 
1433 // ============================================================================
1434 AIDA::IHistogram1D* HistogramSvc::createCopy( const std::string& full, const AIDA::IHistogram1D& h ) {
1435  return createCopy( i_splitPath( full ), h );
1436 }
1437 
1438 // ============================================================================
1439 AIDA::IHistogram1D* HistogramSvc::createCopy( const std::string& par, const std::string& rel,
1440  const AIDA::IHistogram1D& h ) {
1441  return createCopy( createPath( par ), rel, h );
1442 }
1443 
1444 // ============================================================================
1446  const AIDA::IHistogram1D& h ) {
1447  return createCopy( loc.first, loc.second, h );
1448 }
1449 
1450 // ============================================================================
1451 AIDA::IHistogram1D* HistogramSvc::createCopy( DataObject* pPar, const std::string& rel, const AIDA::IHistogram1D& h ) {
1452  return i_book( pPar, rel, h.title(), Gaudi::createH1D( serviceLocator(), buildHistoPath( pPar, rel ), h ) );
1453 }
1454 
1455 // ============================================================================
1456 AIDA::IHistogram2D* HistogramSvc::createHistogram2D( const std::string& name, const std::string& title, int nx,
1457  double lowx, double upx, int ny, double lowy, double upy ) {
1458  return book( name, title, nx, lowx, upx, ny, lowy, upy );
1459 }
1460 
1461 // ============================================================================
1462 AIDA::IHistogram2D* HistogramSvc::createHistogram2D( const std::string& name, const std::string& title, int nx,
1463  double lowx, double upx, int ny, double lowy, double upy,
1464  const std::string& /*opt*/ ) {
1465  return book( name, title, nx, lowx, upx, ny, lowy, upy );
1466 }
1467 
1468 // ============================================================================
1469 AIDA::IHistogram2D* HistogramSvc::createHistogram2D( const std::string& name, const std::string& title, const Edges& x,
1470  const Edges& y, const std::string& /*opt*/ ) {
1471  return book( name, title, x, y );
1472 }
1473 
1474 // ============================================================================
1475 AIDA::IHistogram2D* HistogramSvc::createHistogram2D( const std::string& nameAndTitle, int nx, double lowx, double upx,
1476  int ny, double lowy, double upy ) {
1477  return book( nameAndTitle, nameAndTitle, nx, lowx, upx, ny, lowy, upy );
1478 }
1479 
1480 // ============================================================================
1481 AIDA::IHistogram2D* HistogramSvc::createCopy( const std::string& full, const AIDA::IHistogram2D& h ) {
1482  return createCopy( i_splitPath( full ), h );
1483 }
1484 
1485 // ============================================================================
1486 AIDA::IHistogram2D* HistogramSvc::createCopy( const std::string& par, const std::string& rel,
1487  const AIDA::IHistogram2D& h ) {
1488  return createCopy( createPath( par ), rel, h );
1489 }
1490 
1491 // ============================================================================
1493  const AIDA::IHistogram2D& h ) {
1494  return createCopy( loc.first, loc.second, h );
1495 }
1496 
1497 // ============================================================================
1498 AIDA::IHistogram2D* HistogramSvc::createCopy( DataObject* pPar, const std::string& rel, const AIDA::IHistogram2D& h ) {
1499  return i_book( pPar, rel, h.title(), Gaudi::createH2D( serviceLocator(), buildHistoPath( pPar, rel ), h ) );
1500 }
1501 
1502 // ============================================================================
1503 AIDA::IHistogram3D* HistogramSvc::createHistogram3D( const std::string& name, const std::string& title, int nx,
1504  double lowx, double upx, int ny, double lowy, double upy, int nz,
1505  double lowz, double upz ) {
1506  return book( name, title, nx, lowx, upx, ny, lowy, upy, nz, lowz, upz );
1507 }
1508 
1509 // ============================================================================
1510 AIDA::IHistogram3D* HistogramSvc::createHistogram3D( const std::string& name, const std::string& title, int nx,
1511  double lowx, double upx, int ny, double lowy, double upy, int nz,
1512  double lowz, double upz, const std::string& /*opt*/ ) {
1513  return book( name, title, nx, lowx, upx, ny, lowy, upy, nz, lowz, upz );
1514 }
1515 
1516 // ============================================================================
1517 AIDA::IHistogram3D* HistogramSvc::createHistogram3D( const std::string& name, const std::string& title, const Edges& x,
1518  const Edges& y, const Edges& z, const std::string& /*opt*/ ) {
1519  return book( name, title, x, y, z );
1520 }
1521 
1522 // ============================================================================
1523 AIDA::IHistogram3D* HistogramSvc::createHistogram3D( const std::string& nameAndTitle, int nx, double lowx, double upx,
1524  int ny, double lowy, double upy, int nz, double lowz,
1525  double upz ) {
1526  return book( nameAndTitle, nameAndTitle, nx, lowx, upx, ny, lowy, upy, nz, lowz, upz );
1527 }
1528 
1529 // ============================================================================
1530 AIDA::IHistogram3D* HistogramSvc::createCopy( const std::string& full, const AIDA::IHistogram3D& h ) {
1531  return createCopy( i_splitPath( full ), h );
1532 }
1533 
1534 // ============================================================================
1535 AIDA::IHistogram3D* HistogramSvc::createCopy( const std::string& par, const std::string& rel,
1536  const AIDA::IHistogram3D& h ) {
1537  return createCopy( createPath( par ), rel, h );
1538 }
1539 
1540 // ============================================================================
1542  const AIDA::IHistogram3D& h ) {
1543  return createCopy( loc.first, loc.second, h );
1544 }
1545 
1546 // ============================================================================
1547 AIDA::IHistogram3D* HistogramSvc::createCopy( DataObject* pPar, const std::string& rel, const AIDA::IHistogram3D& h ) {
1548  return i_book( pPar, rel, h.title(), Gaudi::createH3D( serviceLocator(), buildHistoPath( pPar, rel ), h ) );
1549 }
1550 
1551 // ============================================================================
1552 AIDA::IProfile1D* HistogramSvc::createProfile1D( const std::string& name, const std::string& title, int nx, double lowx,
1553  double upx, const std::string& opt ) {
1554  return bookProf( name, title, nx, lowx, upx, opt );
1555 }
1556 
1557 // ============================================================================
1558 AIDA::IProfile1D* HistogramSvc::createProfile1D( const std::string& name, const std::string& title, int nx, double lowx,
1559  double upx, double upper, double lower, const std::string& opt ) {
1560  return bookProf( name, title, nx, lowx, upx, upper, lower, opt );
1561 }
1562 
1563 // ============================================================================
1564 AIDA::IProfile1D* HistogramSvc::createProfile1D( const std::string& name, const std::string& title, const Edges& x,
1565  const std::string& /* opt */ ) {
1566  return bookProf( name, title, x );
1567 }
1568 
1569 // ============================================================================
1570 AIDA::IProfile1D* HistogramSvc::createProfile1D( const std::string& name, const std::string& title, const Edges& x,
1571  double upper, double lower, const std::string& /* opt */ ) {
1572  return bookProf( name, title, x, upper, lower );
1573 }
1574 
1575 // ============================================================================
1576 AIDA::IProfile1D* HistogramSvc::createProfile1D( const std::string& nametit, int nx, double lowx, double upx ) {
1577  return bookProf( nametit, nametit, nx, lowx, upx, "s" );
1578 }
1579 
1580 // ============================================================================
1581 AIDA::IProfile1D* HistogramSvc::createProfile1D( const std::string& nametit, int nx, double lowx, double upx,
1582  double upper, double lower ) {
1583  return bookProf( nametit, nametit, nx, lowx, upx, upper, lower, "s" );
1584 }
1585 
1586 // ============================================================================
1587 AIDA::IProfile1D* HistogramSvc::createCopy( const std::string& full, const AIDA::IProfile1D& h ) {
1588  return createCopy( i_splitPath( full ), h );
1589 }
1590 
1591 // ============================================================================
1592 AIDA::IProfile1D* HistogramSvc::createCopy( const std::string& par, const std::string& rel,
1593  const AIDA::IProfile1D& h ) {
1594  return createCopy( createPath( par ), rel, h );
1595 }
1596 
1597 // ============================================================================
1599  const AIDA::IProfile1D& h ) {
1600  return createCopy( loc.first, loc.second, h );
1601 }
1602 
1603 // ============================================================================
1604 AIDA::IProfile1D* HistogramSvc::createCopy( DataObject* pPar, const std::string& rel, const AIDA::IProfile1D& h ) {
1605  return i_book( pPar, rel, h.title(), Gaudi::createProf1D( serviceLocator(), buildHistoPath( pPar, rel ), h ) );
1606 }
1607 
1608 // ============================================================================
1609 AIDA::IProfile2D* HistogramSvc::createProfile2D( const std::string& name, const std::string& title, int nx, double lowx,
1610  double upx, int ny, double lowy, double upy ) {
1611  return bookProf( name, title, nx, lowx, upx, ny, lowy, upy );
1612 }
1613 
1614 // ============================================================================
1615 AIDA::IProfile2D* HistogramSvc::createProfile2D( const std::string& name, const std::string& title, int nx, double lowx,
1616  double upx, int ny, double lowy, double upy,
1617  const std::string& /*opt*/ ) {
1618  return bookProf( name, title, nx, lowx, upx, ny, lowy, upy );
1619 }
1620 
1621 // ============================================================================
1622 AIDA::IProfile2D* HistogramSvc::createProfile2D( const std::string& name, const std::string& title, const Edges& x,
1623  const Edges& y, const std::string& /*opt*/ ) {
1624  return bookProf( name, title, x, y );
1625 }
1626 
1627 // ============================================================================
1628 AIDA::IProfile2D* HistogramSvc::createProfile2D( const std::string& nameAndTitle, int nx, double lowx, double upx,
1629  int ny, double lowy, double upy ) {
1630  return bookProf( nameAndTitle, nameAndTitle, nx, lowx, upx, ny, lowy, upy );
1631 }
1632 
1633 // ============================================================================
1634 AIDA::IProfile2D* HistogramSvc::createProfile2D( const std::string& name, const std::string& title, int nx, double lowx,
1635  double upx, int ny, double lowy, double upy, double upper,
1636  double lower ) {
1637  return bookProf( name, title, nx, lowx, upx, ny, lowy, upy, upper, lower );
1638 }
1639 
1640 // ============================================================================
1641 AIDA::IProfile2D* HistogramSvc::createProfile2D( const std::string& name, const std::string& title, int nx, double lowx,
1642  double upx, int ny, double lowy, double upy, double upper,
1643  double lower, const std::string& /*opt*/ ) {
1644  return bookProf( name, title, nx, lowx, upx, ny, lowy, upy, upper, lower );
1645 }
1646 
1647 // ============================================================================
1648 AIDA::IProfile2D* HistogramSvc::createProfile2D( const std::string& name, const std::string& title, const Edges& x,
1649  const Edges& y, double upper, double lower,
1650  const std::string& /*opt*/ ) {
1651  return bookProf( name, title, x, y, upper, lower );
1652 }
1653 
1654 // ============================================================================
1655 AIDA::IProfile2D* HistogramSvc::createProfile2D( const std::string& nameAndTitle, int nx, double lowx, double upx,
1656  int ny, double lowy, double upy, double upper, double lower ) {
1657  return bookProf( nameAndTitle, nameAndTitle, nx, lowx, upx, ny, lowy, upy, upper, lower );
1658 }
1659 
1660 // ============================================================================
1661 AIDA::IProfile2D* HistogramSvc::createCopy( const std::string& full, const AIDA::IProfile2D& h ) {
1662  return createCopy( i_splitPath( full ), h );
1663 }
1664 
1665 // ============================================================================
1666 AIDA::IProfile2D* HistogramSvc::createCopy( const std::string& par, const std::string& rel,
1667  const AIDA::IProfile2D& h ) {
1668  return createCopy( createPath( par ), rel, h );
1669 }
1670 
1671 // ============================================================================
1673  const AIDA::IProfile2D& h ) {
1674  return createCopy( loc.first, loc.second, h );
1675 }
1676 
1677 // ============================================================================
1678 AIDA::IProfile2D* HistogramSvc::createCopy( DataObject* pPar, const std::string& rel, const AIDA::IProfile2D& h ) {
1679  return i_book( pPar, rel, h.title(), Gaudi::createProf2D( serviceLocator(), buildHistoPath( pPar, rel ), h ) );
1680 }
MSG::DEBUG
@ DEBUG
Definition: IMessageSvc.h:25
AIDA
GaudiKernel.
Definition: Annotation.h:22
toupper
void toupper(std::string &s)
Definition: ExceptionSvc.cpp:36
std::string
STL class.
HistogramSvc::write
std::ostream & write(Base *h, std::ostream &s=std::cout) const override
Write (ASCII) the 1D histogram table into the output stream.
HistogramSvc::createProfile2D
AIDA::IProfile2D * createProfile2D(const std::string &name, const std::string &title, int nx, double lowx, double upx, int ny, double lowy, double upy)
Definition: HistogramSvc.cpp:1609
std::move
T move(T... args)
AtlasMCRecoFullPrecedenceDump.path
path
Definition: AtlasMCRecoFullPrecedenceDump.py:49
StatusCode::isSuccess
bool isSuccess() const
Definition: StatusCode.h:314
HistogramSvc::~HistogramSvc
~HistogramSvc() override
Destructor.
Definition: HistogramSvc.cpp:187
std::pair
HistogramSvc::book
AIDA::IHistogram1D * book(const std::string &par, const std::string &rel, const std::string &title, int nx, double lowx, double upx) override
Book histogram and register it with the histogram data store.
gaudirun.s
string s
Definition: gaudirun.py:346
std::vector< double >
std::find_if
T find_if(T... args)
std::set::size
T size(T... args)
HistogramSvc::m_mods1D
std::set< std::string > m_mods1D
Definition: HistogramSvc.h:1086
DataSvc::setDataLoader
StatusCode setDataLoader(IConversionSvc *svc, IDataProviderSvc *dpsvc=nullptr) override
IDataManagerSvc: IDataManagerSvc: Pass a default data loader to the service and optionally a data pro...
Definition: DataSvc.cpp:186
ISvcLocator
Definition: ISvcLocator.h:46
GaudiException
Definition: GaudiException.h:31
HBOOK_StorageType
const long HBOOK_StorageType
Definition: ClassID.h:66
HistogramSvc::retrieveObject
StatusCode retrieveObject(IRegistry *pReg, const std::string &path, AIDA::IHistogram1D *&obj) override
Definition: HistogramSvc.cpp:908
gaudiComponentHelp.root
root
Definition: gaudiComponentHelp.py:42
HistogramSvc::projectionXY
AIDA::IHistogram2D * projectionXY(const std::string &nameAndTitle, const AIDA::IHistogram3D &h) override
Definition: HistogramSvc.cpp:1395
HistogramSvc::m_defs1D
Gaudi::Property< Histo1DMap > m_defs1D
Definition: HistogramSvc.h:1082
Gaudi::slice1DY
std::pair< DataObject *, AIDA::IHistogram1D * > slice1DY(const std::string &name, const AIDA::IHistogram2D &h, int firstbin, int lastbin)
Create 1D slice from 2D histogram.
IRegistry
Definition: IRegistry.h:32
HistogramSvc::Helper::act
static R * act(R *res, const S &b, void(T1::*pmf)(const T2 *, Double_t), Double_t scale)
Definition: HistogramSvc.h:103
HistogramSvc::finalize
StatusCode finalize() override
finalize the service
Definition: HistogramSvc.cpp:364
HistogramSvc::sliceX
AIDA::IHistogram1D * sliceX(const std::string &name, const AIDA::IHistogram2D &h, int indexY) override
Definition: HistogramSvc.cpp:1313
HistogramSvc::Base
AIDA::IBaseHistogram Base
Definition: HistogramSvc.h:69
CommonMessaging< implements< IService, IProperty, IStateful > >::msgLevel
MSG::Level msgLevel() const
get the cached level (originally extracted from the embedded MsgStream)
Definition: CommonMessaging.h:148
HistogramSvc::createHistogram3D
AIDA::IHistogram3D * createHistogram3D(const std::string &name, const std::string &title, int nx, double lowx, double upx, int ny, double lowy, double upy, int nz, double lowz, double upz)
Definition: HistogramSvc.cpp:1503
HistogramSvc::sliceY
AIDA::IHistogram1D * sliceY(const std::string &name, const AIDA::IHistogram2D &h, int indexX) override
Definition: HistogramSvc.cpp:1318
DataSvc::clearStore
StatusCode clearStore() override
IDataManagerSvc: Remove all data objects in the data store.
Definition: DataSvc.cpp:111
std::set::clear
T clear(T... args)
Gaudi::HistogramBase
Definition: HistogramBase.h:32
GenericAddress.h
compareOutputFiles.par
par
Definition: compareOutputFiles.py:477
HistogramSvc::createHistogram1D
AIDA::IHistogram1D * createHistogram1D(const std::string &name, const std::string &title, int nx, double lowx, double upx)
Definition: HistogramSvc.cpp:1410
HistogramSvc::i_book
T * i_book(DataObject *pPar, const std::string &rel, const std::string &title, const std::pair< DataObject *, T * > &o)
Definition: HistogramSvc.h:170
GenericAddress
Definition: GenericAddress.h:30
Gaudi::Histo1DDef
Definition: HistoDef.h:41
HistogramSvc::initialize
StatusCode initialize() override
Initialise the service.
Definition: HistogramSvc.cpp:243
Service::name
const std::string & name() const override
Retrieve name of the service
Definition: Service.cpp:332
StatusCode
Definition: StatusCode.h:65
HistogramSvc::createProfile1D
AIDA::IProfile1D * createProfile1D(const std::string &name, const std::string &title, int nx, double lowx, double upx, const std::string &opt) override
Definition: HistogramSvc.cpp:1552
HistogramSvc::subtract
AIDA::IHistogram1D * subtract(const std::string &nameAndTitle, const AIDA::IHistogram1D &a, const AIDA::IHistogram1D &b) override
Definition: HistogramSvc.cpp:1329
HistogramSvc::projectionY
AIDA::IHistogram1D * projectionY(const std::string &name, const AIDA::IHistogram2D &h) override
Definition: HistogramSvc.cpp:1308
HistogramSvc::multiply
AIDA::IHistogram1D * multiply(const std::string &nameAndTitle, const AIDA::IHistogram1D &a, const AIDA::IHistogram1D &b) override
Definition: HistogramSvc.cpp:1335
HistogramSvc::connectInput
StatusCode connectInput(const std::string &ident)
Connect input histogram file to the service.
Definition: HistogramSvc.cpp:193
HistogramSvc::bookProf
AIDA::IProfile1D * bookProf(const std::string &par, const std::string &rel, const std::string &title, int nx, double lowx, double upx, const std::string &opt) override
Book histogram and register it with the histogram data store.
Gaudi::Units::m
constexpr double m
Definition: SystemOfUnits.h:108
ProduceConsume.j
j
Definition: ProduceConsume.py:104
std::ostream
STL class.
DataSvc::m_rootName
Gaudi::Property< std::string > m_rootName
Definition: DataSvc.h:62
Gaudi::HistogramBase::write
virtual std::ostream & write(std::ostream &s) const =0
Write (binary) histogram to output stream.
HistogramSvc::unregisterObject
StatusCode unregisterObject(Base *obj) override
Definition: HistogramSvc.cpp:895
CommonMessaging
Definition: CommonMessaging.h:66
AlgSequencer.h
h
Definition: AlgSequencer.py:31
Gaudi::Property::value
const ValueType & value() const
Definition: Property.h:237
std::to_string
T to_string(T... args)
Gaudi::createH3D
std::pair< DataObject *, AIDA::IHistogram3D * > createH3D(ISvcLocator *svcLocator, const std::string &path, const AIDA::IHistogram3D &hist)
Copy constructor.
DataSvc::rootName
const std::string & rootName() const override
IDataManagerSvc: Accessor for root event name.
Definition: DataSvc.cpp:867
AttribStringParser.h
HistogramSvc::destroy
bool destroy(IBaseHistogram *hist) override
Definition: HistogramSvc.cpp:312
endmsg
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:202
ROOT_StorageType
const long ROOT_StorageType
Definition: ClassID.h:62
std::map
STL class.
Gaudi::createProf1D
std::pair< DataObject *, AIDA::IProfile1D * > createProf1D(ISvcLocator *svcLocator, const std::string &path, const AIDA::IProfile1D &hist)
Copy constructor.
HistogramSvc::projectionXZ
AIDA::IHistogram2D * projectionXZ(const std::string &nameAndTitle, const AIDA::IHistogram3D &h) override
Definition: HistogramSvc.cpp:1400
HistogramSvc.h
Gaudi::HistogramBase::print
virtual std::ostream & print(std::ostream &s) const =0
Print histogram to output stream.
StatusCode::ignore
const StatusCode & ignore() const
Allow discarding a StatusCode without warning.
Definition: StatusCode.h:139
SEPARATOR
constexpr char SEPARATOR
Definition: RegistryEntry.cpp:50
HistogramSvc::buildHistoPath
std::string buildHistoPath(DataObject const *pPar, std::string const &rel)
extracts the path of an histogram from the related DataObject
Definition: HistogramSvc.cpp:355
StatusCode::isFailure
bool isFailure() const
Definition: StatusCode.h:129
HistogramSvc::findObject
StatusCode findObject(IRegistry *pReg, const std::string &path, AIDA::IProfile1D *&obj) override
Definition: HistogramSvc.cpp:1109
HistogramSvc::createHistogram2D
AIDA::IHistogram2D * createHistogram2D(const std::string &name, const std::string &title, int nx, double lowx, double upx, int ny, double lowy, double upy)
Definition: HistogramSvc.cpp:1456
StatusCode::SUCCESS
constexpr static const auto SUCCESS
Definition: StatusCode.h:100
ConditionsStallTest.name
name
Definition: ConditionsStallTest.py:77
HistogramSvc::createPath
DataObject * createPath(const std::string &newPath) override
Create all directories in a given full path.
Definition: HistogramSvc.cpp:143
DataObject.h
GaudiPI.h
GenericAddress::release
unsigned long release() override
release reference to object
Definition: GenericAddress.h:71
HistogramSvc::projectionX
AIDA::IHistogram1D * projectionX(const std::string &name, const AIDA::IHistogram2D &h) override
Definition: HistogramSvc.cpp:1303
HistogramSvc::i_splitPath
std::pair< std::string, std::string > i_splitPath(const std::string &full)
Split full path into its components.
Definition: HistogramSvc.cpp:130
std::set::insert
T insert(T... args)
HistogramSvc::i_project
AIDA::IHistogram2D * i_project(const std::string &nameAndTitle, const AIDA::IHistogram3D &h, const std::string &dir)
Helper for 2D projections.
Definition: HistogramSvc.cpp:91
DataSvc::setRoot
StatusCode setRoot(std::string root_name, DataObject *pRootObj) override
Initialize data store for new event by giving new event path and root object.
Definition: DataSvc.cpp:141
Gaudi::slice1DX
std::pair< DataObject *, AIDA::IHistogram1D * > slice1DX(const std::string &name, const AIDA::IHistogram2D &h, int firstbin, int lastbin)
Create 1D slice from 2D histogram.
IRegistry::identifier
virtual const id_type & identifier() const =0
Full identifier (or key)
DataObject
Definition: DataObject.h:36
HistogramSvc::print
std::ostream & print(Base *h, std::ostream &s=std::cout) const override
Print (ASCII) the 1D histogram into the output stream.
Definition: HistogramSvc.cpp:106
HistogramSvc::reinitialize
StatusCode reinitialize() override
Initialise the service.
Definition: HistogramSvc.cpp:277
DataSvc::registerObject
StatusCode registerObject(std::string_view parentPath, std::string_view objPath, DataObject *pObject) override
Register object with the data store.
Definition: DataSvc.cpp:302
std::set::empty
T empty(T... args)
HistogramSvc::m_input
Gaudi::Property< DBaseEntries > m_input
Definition: HistogramSvc.h:1081
GaudiConfig2.semantics.ident
ident
Definition: semantics.py:198
HistogramSvc::HistogramSvc
HistogramSvc(const std::string &name, ISvcLocator *svc)
Statndard Constructor.
Definition: HistogramSvc.cpp:344
DataSvc::initialize
StatusCode initialize() override
Service initialization.
Definition: DataSvc.cpp:821
HistogramSvc::update1Ddefs
void update1Ddefs()
handler to be invoked for updating property m_defs1D
Definition: HistogramSvc.cpp:350
StatusCode::FAILURE
constexpr static const auto FAILURE
Definition: StatusCode.h:101
HistogramSvc::projectionYZ
AIDA::IHistogram2D * projectionYZ(const std::string &nameAndTitle, const AIDA::IHistogram3D &h) override
Definition: HistogramSvc.cpp:1405
IConversionSvc.h
HistogramSvc::divide
AIDA::IHistogram1D * divide(const std::string &nameAndTitle, const AIDA::IHistogram1D &a, const AIDA::IHistogram1D &b) override
Definition: HistogramSvc.cpp:1341
Gaudi::createH1D
std::pair< DataObject *, AIDA::IHistogram1D * > createH1D(ISvcLocator *svcLocator, const std::string &path, const AIDA::IHistogram1D &hist)
Copy constructor.
HistogramSvc::registerObject
StatusCode registerObject(const std::string &parent, const std::string &rel, Base *obj) override
Definition: HistogramSvc.cpp:885
DataSvc::m_rootCLID
Gaudi::Property< CLID > m_rootCLID
Definition: DataSvc.h:61
graphanalysis.filename
filename
Definition: graphanalysis.py:130
Gaudi::Utils::AttribStringParser
Parse attribute strings allowing iteration over the various attributes.
Definition: AttribStringParser.h:40
Gaudi::createH2D
std::pair< DataObject *, AIDA::IHistogram2D * > createH2D(ISvcLocator *svcLocator, const std::string &path, const AIDA::IHistogram2D &hist)
Copy constructor.
DataObject::registry
IRegistry * registry() const
Get pointer to Registry.
Definition: DataObject.h:78
Gaudi::createProf2D
std::pair< DataObject *, AIDA::IProfile2D * > createProf2D(ISvcLocator *svcLocator, const std::string &path, const AIDA::IProfile2D &hist)
Copy constructor.
Gaudi::Axis::toRootIndex
static int toRootIndex(int index, int nbins)
Definition: Axis.h:31
DataSvc::registerAddress
StatusCode registerAddress(std::string_view fullPath, IOpaqueAddress *pAddress) override
IDataManagerSvc: Register object address with the data store.
Definition: DataSvc.cpp:224
HistogramSvc::createDirectory
DataObject * createDirectory(const std::string &parentDir, const std::string &subDir) override
Create a sub-directory in a directory.
Definition: HistogramSvc.cpp:168
GaudiPartProp.Service.Helper
Helper
Definition: Service.py:39
Property.h
HistogramSvc::createCopy
AIDA::IHistogram1D * createCopy(const std::string &full, const AIDA::IHistogram1D &h) override
Definition: HistogramSvc.cpp:1434
Service::serviceLocator
SmartIF< ISvcLocator > & serviceLocator() const override
Retrieve pointer to service locator
Definition: Service.cpp:335
HistogramSvc::add
AIDA::IHistogram1D * add(const std::string &nameAndTitle, const AIDA::IHistogram1D &a, const AIDA::IHistogram1D &b) override
Definition: HistogramSvc.cpp:1323
DataSvc::finalize
StatusCode finalize() override
Service initialization.
Definition: DataSvc.cpp:854