4 # pragma warning( disable : 2259 ) 10 # pragma warning( disable : 4996 ) 25 TH3D* imp = dynamic_cast<TH3D*>( rep );
26 if ( !imp )
throw std::runtime_error(
"Cannot adopt native histogram representation." );
28 m_xAxis.initialize( m_rep->GetXaxis(), true );
29 m_yAxis.initialize( m_rep->GetYaxis(), true );
30 m_zAxis.initialize( m_rep->GetZaxis(), true );
31 const TArrayD* a = m_rep->GetSumw2();
32 if ( !a || ( a && a->GetSize() == 0 ) ) m_rep->Sumw2();
33 setTitle( m_rep->GetTitle() );
39 double xup,
int nBinsY,
double ylow,
double yup,
40 int nBinsZ,
double zlow,
double zup ) {
41 auto p =
new Histogram3D(
42 new TH3D( title.
c_str(), title.
c_str(), nBinsX, xlow, xup, nBinsY, ylow, yup, nBinsZ, zlow, zup ) );
48 const Edges& eY,
const Edges& eZ ) {
49 auto p =
new Histogram3D(
new TH3D( title.
c_str(), title.
c_str(), eX.size() - 1, &eX.front(), eY.size() - 1,
50 &eY.front(), eZ.size() - 1, &eZ.front() ) );
55 TH3D* h = getRepresentation<AIDA::IHistogram3D, TH3D>( hist );
56 Histogram3D*
n = h ?
new Histogram3D(
new TH3D( *h ) ) : nullptr;
66 m_rep->SetDirectory(
nullptr );
70 adoptRepresentation( rep );
74 m_rep->SetDirectory(
nullptr );
79 double centreY,
double centreZ ) {
80 m_rep->SetBinContent( rIndexX( i ), rIndexY( j ), rIndexZ( k ), height );
81 m_rep->SetBinError( rIndexX( i ), rIndexY( j ), rIndexZ( k ), error );
83 if ( i >= 0 && j >= 0 && k >= 0 ) {
84 m_sumwx += centreX * height;
85 m_sumwy += centreY * height;
86 m_sumwz += centreZ * height;
88 m_sumEntries += entries;
104 m_rep->Fill( x, y, z, weight );
109 if ( className ==
"AIDA::IHistogram3D" ) {
110 return (AIDA::IHistogram3D*)
this;
111 }
else if ( className ==
"AIDA::IHistogram" ) {
112 return (AIDA::IHistogram*)
this;
120 # pragma warning( push ) 121 # pragma warning( disable : 1572 ) 124 m_rep->SetEntries( m_sumEntries );
127 stat[0] = sumBinHeights();
129 if ( equivalentBinEntries() != 0 ) stat[1] = ( sumBinHeights() * sumBinHeights() ) / equivalentBinEntries();
132 if ( sumBinHeights() != 0 ) meanX = m_sumwx / sumBinHeights();
133 stat[3] = ( meanX * meanX + rmsX * rmsX ) * sumBinHeights();
136 if ( sumBinHeights() != 0 ) meanY = m_sumwy / sumBinHeights();
137 stat[5] = ( meanY * meanY + rmsY * rmsY ) * sumBinHeights();
141 if ( sumBinHeights() != 0 ) meanZ = m_sumwz / sumBinHeights();
142 stat[8] = ( meanZ * meanZ + rmsZ * rmsZ ) * sumBinHeights();
145 m_rep->PutStats( &stat.
front() );
151 const char* title = h.title().
c_str();
152 if ( h.xAxis().isFixedBinning() && h.yAxis().isFixedBinning() && h.zAxis().isFixedBinning() ) {
153 m_rep.reset(
new TH3D( title, title, h.xAxis().bins(), h.xAxis().lowerEdge(), h.xAxis().upperEdge(),
154 h.yAxis().bins(), h.yAxis().lowerEdge(), h.yAxis().upperEdge(), h.zAxis().bins(),
155 h.zAxis().lowerEdge(), h.zAxis().upperEdge() ) );
158 for (
int i = 0; i < h.xAxis().bins(); ++i ) eX.
push_back( h.xAxis().binLowerEdge( i ) );
160 eX.push_back( h.xAxis().upperEdge() );
161 for (
int i = 0; i < h.yAxis().bins(); ++i ) eY.push_back( h.yAxis().binLowerEdge( i ) );
163 eY.push_back( h.yAxis().upperEdge() );
164 for (
int i = 0; i < h.zAxis().bins(); ++i ) eZ.push_back( h.zAxis().binLowerEdge( i ) );
166 eZ.push_back( h.zAxis().upperEdge() );
168 new TH3D( title, title, eX.size() - 1, &eX.front(), eY.size() - 1, &eY.front(), eZ.size() - 1, &eZ.front() ) );
170 m_xAxis.initialize( m_rep->GetXaxis(), true );
171 m_yAxis.initialize( m_rep->GetYaxis(), true );
172 m_zAxis.initialize( m_rep->GetZaxis(), true );
173 const TArrayD* a = m_rep->GetSumw2();
174 if ( !a || ( a && a->GetSize() == 0 ) ) m_rep->Sumw2();
181 double sumw = h.sumBinHeights();
183 if ( h.equivalentBinEntries() != 0 ) sumw2 = ( sumw * sumw ) / h.equivalentBinEntries();
184 double sumwx = h.meanX() * h.sumBinHeights();
185 double sumwx2 = ( h.meanX() * h.meanX() + h.rmsX() * h.rmsX() ) * h.sumBinHeights();
186 double sumwy = h.meanY() * h.sumBinHeights();
187 double sumwy2 = ( h.meanY() * h.meanY() + h.rmsY() * h.rmsY() ) * h.sumBinHeights();
188 double sumwz = h.meanZ() * h.sumBinHeights();
189 double sumwz2 = ( h.meanZ() * h.meanZ() + h.rmsZ() * h.rmsZ() ) * h.sumBinHeights();
195 for (
int i = -2; i < xAxis().bins(); ++i ) {
196 for (
int j = -2; j < yAxis().bins(); ++j ) {
197 for (
int k = -2; k < zAxis().bins(); ++k ) {
198 m_rep->SetBinContent( rIndexX( i ), rIndexY( j ), rIndexZ( k ), h.binHeight( i, j, k ) );
199 m_rep->SetBinError( rIndexX( i ), rIndexY( j ), rIndexZ( k ), h.binError( i, j, k ) );
201 if ( i >= 0 && j >= 0 && k >= 0 ) {
202 sumwxy += h.binHeight( i, j, k ) * h.binMeanX( i, j, k ) * h.binMeanY( i, j, k );
203 sumwxz += h.binHeight( i, j, k ) * h.binMeanX( i, j, k ) * h.binMeanZ( i, j, k );
204 sumwyz += h.binHeight( i, j, k ) * h.binMeanY( i, j, k ) * h.binMeanZ( i, j, k );
211 m_rep->SetEntries( h.allEntries() );
226 m_rep->PutStats( &stat.
front() );
231 # pragma warning( pop )
std::vector< double > Edges
void * cast(const std::string &className) const override
Introspection method.
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.
std::pair< DataObject *, AIDA::IHistogram3D * > createH3D(const AIDA::IHistogram3D &hist)
Copy constructor.
Histogram3D()
Standard Constructor.
bool setTitle(const std::string &title) override
Set the title of the object.
bool fill(double x, double y, double z, double weight) override
Fill bin content.
void copyFromAida(const AIDA::IHistogram3D &h)
Create new histogram from any AIDA based histogram.
std::unique_ptr< IMPLEMENTATION > m_rep
Reference to underlying implementation.
virtual bool setRms(double rmsX, double rmsY, double rmsZ)
Sets the rms of the histogram.
void adoptRepresentation(TObject *rep) override
Adopt ROOT histogram representation.
Header file for std:chrono::duration-based Counters.
Common AIDA implementation stuff for histograms and profiles using ROOT implementations.