Loading [MathJax]/extensions/tex2jax.js
The Gaudi Framework  v36r16 (ea80daf8)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
P1D.cpp
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2019 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 #include "GaudiPI.h"
24 #include <Gaudi/MonitoringHub.h>
26 #include <GaudiCommonSvc/P1D.h>
28 
30 
31 #include <cmath>
32 
34  const std::string& title, int nBins, double xlow,
35  double xup, double ylow, double yup,
36  const std::string& opt ) {
37  auto _p = new TProfile( title.c_str(), title.c_str(), nBins, xlow, xup, ylow, yup, opt.c_str() );
38  auto p = new Profile1D( _p );
39  svcLocator->monitoringHub().registerEntity( "", path, "histogram:ProfileHistogram:double", *p );
40  return { p, p };
41 }
42 
44  const std::string& title, const Edges& e, double ylow,
45  double yup, const std::string& opt ) {
46  auto p =
47  new Profile1D( new TProfile( title.c_str(), title.c_str(), e.size() - 1, &e.front(), ylow, yup, opt.c_str() ) );
48  svcLocator->monitoringHub().registerEntity( "", path, "histogram:ProfileHistogram:double", *p );
49  return { p, p };
50 }
51 
53  const AIDA::IProfile1D& hist ) {
54  TProfile* h = getRepresentation<AIDA::IProfile1D, TProfile>( hist );
55  auto n = ( h ? new Profile1D( new TProfile( *h ) ) : nullptr );
56  if ( n ) { svcLocator->monitoringHub().registerEntity( "", path, "histogram:ProfileHistogram:double", *n ); }
57  return { n, n };
58 }
59 
60 namespace Gaudi {
61  template <>
63  return int( m_rep->GetBinEntries( rIndex( index ) ) + 0.5 );
64  }
65 
66  template <>
67  void* Generic1D<AIDA::IProfile1D, TProfile>::cast( const std::string& className ) const {
68  return className == "AIDA::IProfile1D"
69  ? const_cast<AIDA::IProfile1D*>( static_cast<const AIDA::IProfile1D*>( this ) )
70  : className == "AIDA::IProfile" ? const_cast<AIDA::IProfile*>( static_cast<const AIDA::IProfile*>( this ) )
71  : className == "AIDA::IBaseHistogram"
72  ? const_cast<AIDA::IBaseHistogram*>( static_cast<const AIDA::IBaseHistogram*>( this ) )
73  : nullptr;
74  }
75 
76  template <>
78  TProfile* imp = dynamic_cast<TProfile*>( rep );
79  if ( !imp ) throw std::runtime_error( "Cannot adopt native histogram representation." );
80  m_rep.reset( imp );
81  m_axis.initialize( m_rep->GetXaxis(), true );
82  const TArrayD* a = m_rep->GetSumw2();
83  if ( !a || ( a && a->GetSize() == 0 ) ) m_rep->Sumw2();
84  setTitle( m_rep->GetTitle() );
85  }
86 } // namespace Gaudi
87 
88 Gaudi::Profile1D::Profile1D() : Base( new TProfile() ) { init( "", false ); }
89 
90 Gaudi::Profile1D::Profile1D( TProfile* rep ) : Base( rep ) { init( m_rep->GetTitle() ); }
91 
92 void Gaudi::Profile1D::init( const std::string& title, bool initialize_axis ) {
93  m_classType = "IProfile1D";
94  setTitle( title );
95  setName( title );
96  if ( initialize_axis ) { axis().initialize( m_rep->GetXaxis(), false ); }
97  // m_rep->SetErrorOption("s");
98  m_rep->SetDirectory( nullptr );
99  m_sumEntries = 0;
100 }
101 
102 bool Gaudi::Profile1D::setBinContents( int i, int entries, double height, double /*error*/, double spread,
103  double /* centre */ ) {
104  m_rep->SetBinEntries( rIndex( i ), entries );
105  // set content takes in root height * entries
106  m_rep->SetBinContent( rIndex( i ), height * entries );
107  // set error takes sqrt of bin sum(w*y**2)
108  double sumwy2Bin = ( spread * spread + height * height ) * entries;
109  m_rep->SetBinError( rIndex( i ), sqrt( sumwy2Bin ) );
110  m_sumEntries += entries;
111  // not very efficient (but do evey bin since root cannot figure out by himself)
112  m_rep->SetEntries( m_sumEntries );
113  return true;
114 }
115 
116 #ifdef __ICC
117 // disable icc remark #1572: floating-point equality and inequality comparisons are unreliable
118 // The comparison is correct
119 # pragma warning( disable : 1572 )
120 #endif
121 bool Gaudi::Profile1D::fill( double x, double y, double weight ) {
122  // avoid race conditions when filling the profile
123  auto guard = std::scoped_lock{ m_fillSerialization };
124  ( weight == 1. ) ? m_rep->Fill( x, y ) : m_rep->Fill( x, y, weight );
125  return true;
126 }
127 
128 nlohmann::json Gaudi::Profile1D::toJSON() const { return *m_rep.get(); }
Gaudi::Profile1D::setBinContents
virtual bool setBinContents(int i, int entries, double height, double error, double spread, double centre)
Definition: P1D.cpp:102
Gaudi::Accumulators::sqrt
auto sqrt(std::chrono::duration< Rep, Period > d)
sqrt for std::chrono::duration
Definition: Counters.h:34
Gaudi::Generic1D< AIDA::IProfile1D, TProfile >::m_rep
std::unique_ptr< TProfile > m_rep
Reference to underlying implementation.
Definition: Generic1D.h:141
ISvcLocator::monitoringHub
Gaudi::Monitoring::Hub & monitoringHub()
Definition: ISvcLocator.cpp:26
std::string
STL class.
AtlasMCRecoFullPrecedenceDump.path
path
Definition: AtlasMCRecoFullPrecedenceDump.py:49
MonitoringHub.h
std::pair
ISvcLocator
Definition: ISvcLocator.h:46
jsonFromLHCbLog.json
json
Definition: jsonFromLHCbLog.py:87
P1D.h
ObjectFactory.h
Utils.h
HistogramUtility.h
Gaudi::svcLocator
GAUDI_API ISvcLocator * svcLocator()
std::string::c_str
T c_str(T... args)
AlgSequencer.h
h
Definition: AlgSequencer.py:32
Gaudi::Profile1D::Profile1D
Profile1D()
Default Constructor.
Definition: P1D.cpp:88
GaudiPython.Bindings.nullptr
nullptr
Definition: Bindings.py:92
Gaudi::Monitoring::Hub::registerEntity
void registerEntity(std::string c, std::string n, std::string t, T &ent)
Definition: MonitoringHub.h:167
std::runtime_error
STL class.
Gaudi::createProf1D
std::pair< DataObject *, AIDA::IProfile1D * > createProf1D(ISvcLocator *svcLocator, const std::string &path, const AIDA::IProfile1D &hist)
Copy constructor.
Gaudi::Profile1D::init
void init(const std::string &title, bool initialize_axis=true)
Definition: P1D.cpp:92
Gaudi::Profile1D::toJSON
nlohmann::json toJSON() const
dumps Histogram to json data
Definition: P1D.cpp:128
Gaudi
Header file for std:chrono::duration-based Counters.
Definition: __init__.py:1
GaudiPluginService.cpluginsvc.n
n
Definition: cpluginsvc.py:235
Gaudi::Profile1D::fill
bool fill(double x, double y, double weight=1.) override
Fill the Profile1D with a value and the corresponding weight.
Definition: P1D.cpp:121
GaudiPI.h
Gaudi::Generic1D::binEntries
int binEntries(int index) const override
Number of entries in the corresponding bin (ie the number of times fill was called for this bin).
Gaudi::Generic1D
Definition: Generic1D.h:46