| The Gaudi Framework v30r0 (c919700c)

- Main Page
- Related Pages
- Modules
- Namespaces
- Classes
- Files

- File List
- File Members

H3D.cpp
Go to the documentation of this file.
1 #ifdef __ICC
2 // disable icc remark #2259: non-pointer conversion from "X" to "Y" may lose significant bits
3 // TODO: To be removed, since it comes from ROOT TMathBase.h
4 #pragma warning( disable : 2259 )
5 #endif
6 #ifdef WIN32
7 // Disable warning
8 // warning C4996: 'sprintf': This function or variable may be unsafe.
9 // coming from TString.h
10 #pragma warning( disable : 4996 )
11 #endif
12
13 #include <GaudiCommonSvc/Generic3D.h>
14 #include <GaudiCommonSvc/H3D.h>
15 #include <GaudiCommonSvc/HistogramUtility.h>
16 #include <GaudiKernel/DataObject.h>
17 #include <GaudiKernel/ObjectFactory.h>
18
19 #include "GaudiPI.h"
20 #include "TH3D.h"
21
22 namespace Gaudi
23 {
24 template <>
25 void Generic3D<AIDA::IHistogram3D, TH3D>::adoptRepresentation( TObject* rep )
26 {
27 TH3D* imp = dynamic_cast<TH3D*>( rep );
28 if ( !imp ) throw std::runtime_error( "Cannot adopt native histogram representation." );
29 m_rep.reset( imp );
30 m_xAxis.initialize( m_rep->GetXaxis(), true );
31 m_yAxis.initialize( m_rep->GetYaxis(), true );
32 m_zAxis.initialize( m_rep->GetZaxis(), true );
33 const TArrayD* a = m_rep->GetSumw2();
34 if ( !a || ( a && a->GetSize() == 0 ) ) m_rep->Sumw2();
35 setTitle( m_rep->GetTitle() );
36 }
37 }
38
40 std::pair<DataObject*, AIDA::IHistogram3D*> Gaudi::createH3D( const std::string& title, int nBinsX, double xlow,
41 double xup, int nBinsY, double ylow, double yup,
42 int nBinsZ, double zlow, double zup )
43 {
44 auto p = new Histogram3D(
45 new TH3D( title.c_str(), title.c_str(), nBinsX, xlow, xup, nBinsY, ylow, yup, nBinsZ, zlow, zup ) );
46 return {p, p};
47 }
48
50 std::pair<DataObject*, AIDA::IHistogram3D*> Gaudi::createH3D( const std::string& title, const Edges& eX,
51 const Edges& eY, const Edges& eZ )
52 {
53 auto p = new Histogram3D( new TH3D( title.c_str(), title.c_str(), eX.size() - 1, &eX.front(), eY.size() - 1,
54 &eY.front(), eZ.size() - 1, &eZ.front() ) );
55 return {p, p};
56 }
57
58 std::pair<DataObject*, AIDA::IHistogram3D*> Gaudi::createH3D( const AIDA::IHistogram3D& hist )
59 {
60 TH3D* h = getRepresentation<AIDA::IHistogram3D, TH3D>( hist );
61 Histogram3D* n = h ? new Histogram3D( new TH3D( *h ) ) : nullptr;
62 return {n, n};
63 }
64
65 Gaudi::Histogram3D::Histogram3D() : Base( new TH3D() )
66 {
67 setTitle( "" );
68 m_rep->Sumw2();
69 m_sumwx = 0;
70 m_sumwy = 0;
71 m_sumwz = 0;
72 m_rep->SetDirectory( nullptr );
73 }
74
75 Gaudi::Histogram3D::Histogram3D( TH3D* rep )
76 {
77 adoptRepresentation( rep );
78 m_sumwx = 0;
79 m_sumwy = 0;
80 m_sumwz = 0;
81 m_rep->SetDirectory( nullptr );
82 }
83
84 // set bin content (entries and centre are not used )
85 bool Gaudi::Histogram3D::setBinContents( int i, int j, int k, int entries, double height, double error, double centreX,
86 double centreY, double centreZ )
87 {
88 m_rep->SetBinContent( rIndexX( i ), rIndexY( j ), rIndexZ( k ), height );
89 m_rep->SetBinError( rIndexX( i ), rIndexY( j ), rIndexZ( k ), error );
90 // accumulate sum bin centers
91 if ( i >= 0 && j >= 0 && k >= 0 ) {
92 m_sumwx += centreX * height;
93 m_sumwy += centreY * height;
94 m_sumwz += centreZ * height;
95 }
96 m_sumEntries += entries;
97 return true;
98 }
99
100 bool Gaudi::Histogram3D::reset()
101 {
102 m_sumwx = 0;
103 m_sumwy = 0;
104 m_sumwz = 0;
105 m_sumEntries = 0;
106 m_rep->Reset();
107 return true;
108 }
109
110 bool Gaudi::Histogram3D::fill( double x, double y, double z, double weight )
111 {
112 m_rep->Fill( x, y, z, weight );
113 return true;
114 }
115
116 void* Gaudi::Histogram3D::cast( const std::string& className ) const
117 {
118 if ( className == "AIDA::IHistogram3D" ) {
119 return (AIDA::IHistogram3D*)this;
120 } else if ( className == "AIDA::IHistogram" ) {
121 return (AIDA::IHistogram*)this;
122 }
123 return nullptr;
124 }
125
126 #ifdef __ICC
127 // disable icc remark #1572: floating-point equality and inequality comparisons are unreliable
128 // The comparison are meant
129 #pragma warning( push )
130 #pragma warning( disable : 1572 )
131 #endif
132 bool Gaudi::Histogram3D::setRms( double rmsX, double rmsY, double rmsZ )
133 {
134 m_rep->SetEntries( m_sumEntries );
135 std::vector<double> stat( 11 );
136 // sum weights
137 stat[0] = sumBinHeights();
138 stat[1] = 0;
139 if ( equivalentBinEntries() != 0 ) stat[1] = ( sumBinHeights() * sumBinHeights() ) / equivalentBinEntries();
140 stat[2] = m_sumwx;
141 double meanX = 0;
142 if ( sumBinHeights() != 0 ) meanX = m_sumwx / sumBinHeights();
143 stat[3] = ( meanX * meanX + rmsX * rmsX ) * sumBinHeights();
144 stat[4] = m_sumwy;
145 double meanY = 0;
146 if ( sumBinHeights() != 0 ) meanY = m_sumwy / sumBinHeights();
147 stat[5] = ( meanY * meanY + rmsY * rmsY ) * sumBinHeights();
148 stat[6] = 0;
149 stat[7] = m_sumwz;
150 double meanZ = 0;
151 if ( sumBinHeights() != 0 ) meanZ = m_sumwz / sumBinHeights();
152 stat[8] = ( meanZ * meanZ + rmsZ * rmsZ ) * sumBinHeights();
153 // do not need to use sumwxy sumwxz and sumwyz
154
155 m_rep->PutStats( &stat.front() );
156 return true;
157 }
158
159 void Gaudi::Histogram3D::copyFromAida( const AIDA::IHistogram3D& h )
160 {
161 // implement here the copy
162 const char* tit = h.title().c_str();
163 if ( h.xAxis().isFixedBinning() && h.yAxis().isFixedBinning() && h.zAxis().isFixedBinning() ) {
164 m_rep.reset( new TH3D( tit, tit, h.xAxis().bins(), h.xAxis().lowerEdge(), h.xAxis().upperEdge(), h.yAxis().bins(),
165 h.yAxis().lowerEdge(), h.yAxis().upperEdge(), h.zAxis().bins(), h.zAxis().lowerEdge(),
166 h.zAxis().upperEdge() ) );
167 } else {
168 Edges eX, eY, eZ;
169 for ( int i = 0; i < h.xAxis().bins(); ++i ) eX.push_back( h.xAxis().binLowerEdge( i ) );
170 // add also upperedges at the end
171 eX.push_back( h.xAxis().upperEdge() );
172 for ( int i = 0; i < h.yAxis().bins(); ++i ) eY.push_back( h.yAxis().binLowerEdge( i ) );
173 // add also upperedges at the end
174 eY.push_back( h.yAxis().upperEdge() );
175 for ( int i = 0; i < h.zAxis().bins(); ++i ) eZ.push_back( h.zAxis().binLowerEdge( i ) );
176 // add also upperedges at the end
177 eZ.push_back( h.zAxis().upperEdge() );
178 m_rep.reset(
179 new TH3D( tit, tit, eX.size() - 1, &eX.front(), eY.size() - 1, &eY.front(), eZ.size() - 1, &eZ.front() ) );
180 }
181 m_xAxis.initialize( m_rep->GetXaxis(), true );
182 m_yAxis.initialize( m_rep->GetYaxis(), true );
183 m_zAxis.initialize( m_rep->GetZaxis(), true );
184 const TArrayD* a = m_rep->GetSumw2();
185 if ( !a || ( a && a->GetSize() == 0 ) ) m_rep->Sumw2();
186 m_sumEntries = 0;
187 m_sumwx = 0;
188 m_sumwy = 0;
189 m_sumwz = 0;
190
191 // statistics
192 double sumw = h.sumBinHeights();
193 double sumw2 = 0;
194 if ( h.equivalentBinEntries() != 0 ) sumw2 = ( sumw * sumw ) / h.equivalentBinEntries();
195 double sumwx = h.meanX() * h.sumBinHeights();
196 double sumwx2 = ( h.meanX() * h.meanX() + h.rmsX() * h.rmsX() ) * h.sumBinHeights();
197 double sumwy = h.meanY() * h.sumBinHeights();
198 double sumwy2 = ( h.meanY() * h.meanY() + h.rmsY() * h.rmsY() ) * h.sumBinHeights();
199 double sumwz = h.meanZ() * h.sumBinHeights();
200 double sumwz2 = ( h.meanZ() * h.meanZ() + h.rmsZ() * h.rmsZ() ) * h.sumBinHeights();
201 double sumwxy = 0;
202 double sumwxz = 0;
203 double sumwyz = 0;
204
205 // copy the contents in (AIDA underflow/overflow are -2,-1)
206 for ( int i = -2; i < xAxis().bins(); ++i ) {
207 for ( int j = -2; j < yAxis().bins(); ++j ) {
208 for ( int k = -2; k < zAxis().bins(); ++k ) {
209 m_rep->SetBinContent( rIndexX( i ), rIndexY( j ), rIndexZ( k ), h.binHeight( i, j, k ) );
210 m_rep->SetBinError( rIndexX( i ), rIndexY( j ), rIndexZ( k ), h.binError( i, j, k ) );
211 // calculate statistics
212 if ( i >= 0 && j >= 0 && k >= 0 ) {
213 sumwxy += h.binHeight( i, j, k ) * h.binMeanX( i, j, k ) * h.binMeanY( i, j, k );
214 sumwxz += h.binHeight( i, j, k ) * h.binMeanX( i, j, k ) * h.binMeanZ( i, j, k );
215 sumwyz += h.binHeight( i, j, k ) * h.binMeanY( i, j, k ) * h.binMeanZ( i, j, k );
216 }
217 }
218 }
219 }
220 // need to do set entries after setting contents otherwise root will recalulate them
221 // taking into account how many time SetBinContents() has been called
222 m_rep->SetEntries( h.allEntries() );
223
224 // fill stat vector
225 std::vector<double> stat( 11 );
226 stat[0] = sumw;
227 stat[1] = sumw2;
228 stat[2] = sumwx;
229 stat[3] = sumwx2;
230 stat[4] = sumwy;
231 stat[5] = sumwy2;
232 stat[6] = sumwxy;
233 stat[7] = sumwz;
234 stat[8] = sumwz2;
235 stat[9] = sumwxz;
236 stat[10] = sumwyz;
237 m_rep->PutStats( &stat.front() );
238 }
239
240 #ifdef __ICC
241 // re-enable icc remark #1572
242 #pragma warning( pop )
243 #endif
Gaudi::Generic3D::rIndexZ
int rIndexZ(int index) const
Definition: Generic3D.h:87
Gaudi::Generic3D::rIndexX
int rIndexX(int index) const
Definition: Generic3D.h:85
Gaudi::Generic3D::m_xAxis
Gaudi::Axis m_xAxis
Definition: Generic3D.h:231
Gaudi::Generic3D::meanZ
double meanZ() const override
The mean of the IHistogram3D along the z axis.
Definition: Generic3D.h:178
Gaudi::Generic3D::m_yAxis
Gaudi::Axis m_yAxis
Definition: Generic3D.h:232
Gaudi::Generic3D::entries
int entries() const override
Get the number or all the entries.
Definition: Generic3D.h:261
std::vector::front
T front(T...args)
ObjectFactory.h
H3D.h
Gaudi::Generic3D::yAxis
const AIDA::IAxis & yAxis() const override
Get the y axis of the IHistogram3D.
Definition: Generic3D.h:188
Gaudi::Edges
std::vector< double > Edges
Definition: GaudiPI.h:18
Gaudi::Generic3D::zAxis
const AIDA::IAxis & zAxis() const override
Get the z axis of the IHistogram3D.
Definition: Generic3D.h:190
Gaudi::Histogram3D::m_sumwx
double m_sumwx
Definition: H3D.h:45
Gaudi::Generic3D::rmsZ
double rmsZ() const override
The RMS of the IHistogram3D along the z axis.
Definition: Generic3D.h:184
GaudiPI.h
std::string
STL class.
GaudiPluginService.cpluginsvc.n
n
Definition: cpluginsvc.py:228
Gaudi::Histogram3D::m_sumwy
double m_sumwy
Definition: H3D.h:46
std::vector::push_back
T push_back(T...args)
Gaudi::Histogram3D::setBinContents
virtual bool setBinContents(int i, int j, int k, int entries, double height, double error, double centreX, double centreY, double centreZ)
Fast filling method for a given bin. It can be also the over/underflow bin.
Definition: H3D.cpp:85
Gaudi::createH3D
std::pair< DataObject *, AIDA::IHistogram3D * > createH3D(const AIDA::IHistogram3D &hist)
Copy constructor.
Gaudi::Histogram3D::Histogram3D
Histogram3D()
Standard Constructor.
Definition: H3D.cpp:65
Gaudi::Histogram3D
AIDA implementation for 3 D histograms using ROOT THD2.
Definition: H3D.h:18
Gaudi::Generic3D::sumBinHeights
double sumBinHeights() const override
Get the sum of in range bin heights in the IProfile.
Definition: Generic3D.h:285
std::runtime_error
STL class.
std::unique_ptr::reset
T reset(T...args)
Gaudi::Generic3D::m_zAxis
Gaudi::Axis m_zAxis
Definition: Generic3D.h:233
Gaudi::Generic3D::setTitle
bool setTitle(const std::string &title) override
Set the title of the object.
Definition: Generic3D.h:245
Gaudi::Histogram3D::fill
bool fill(double x, double y, double z, double weight) override
Fill bin content.
Definition: H3D.cpp:110
Gaudi::Generic3D::rIndexY
int rIndexY(int index) const
Definition: Generic3D.h:86
Gaudi::Histogram3D::copyFromAida
void copyFromAida(const AIDA::IHistogram3D &h)
Create new histogram from any AIDA based histogram.
Definition: H3D.cpp:159
Gaudi::Generic3D::m_rep
std::unique_ptr< IMPLEMENTATION > m_rep
Reference to underlying implementation.
Definition: Generic3D.h:237
std::pair
std::vector< double >
Gaudi::Generic3D::m_sumEntries
int m_sumEntries
Definition: Generic3D.h:241
Gaudi::Axis::initialize
void initialize(TAxis *itaxi, bool)
Definition: Axis.h:67
std::string::c_str
T c_str(T...args)
Gaudi::Generic3D::xAxis
const AIDA::IAxis & xAxis() const override
Get the x axis of the IHistogram3D.
Definition: Generic3D.h:186
Gaudi::Histogram3D::setRms
virtual bool setRms(double rmsX, double rmsY, double rmsZ)
Sets the rms of the histogram.
Definition: H3D.cpp:132
Gaudi::Generic3D::rmsY
double rmsY() const override
The RMS of the IHistogram3D along the y axis.
Definition: Generic3D.h:182
Gaudi::Generic3D::adoptRepresentation
void adoptRepresentation(TObject *rep) override
Adopt ROOT histogram representation.
Generic3D.h
Gaudi::Generic3D::rmsX
double rmsX() const override
The RMS of the IHistogram3D along the x axis.
Definition: Generic3D.h:180
HistogramUtility.h
Gaudi::Generic3D::meanY
double meanY() const override
The mean of the IHistogram3D along the y axis.
Definition: Generic3D.h:176
Gaudi::Histogram3D::cast
void * cast(const std::string &className) const override
Introspection method.
Definition: H3D.cpp:116
Gaudi::Generic3D::equivalentBinEntries
double equivalentBinEntries() const override
Number of equivalent entries, i.e. SUM[ weight ] ^ 2 / SUM[ weight^2 ]
Definition: Generic3D.h:297
Gaudi::Histogram3D::reset
bool reset() override
Definition: H3D.cpp:100
Gaudi
Helper functions to set/get the application return code.
Definition: __init__.py:1
Gaudi::Generic3D::meanX
double meanX() const override
The mean of the IHistogram3D along the x axis.
Definition: Generic3D.h:173
Gaudi::Histogram3D::m_sumwz
double m_sumwz
Definition: H3D.h:47
DataObject.h
Gaudi::Generic3D
Common AIDA implementation stuff for histograms and profiles using ROOT implementations.
Definition: Generic3D.h:36