14 # pragma warning( disable : 2259 )
20 # pragma warning( disable : 4996 )
33 using AIDA::IHistogram1D;
34 using AIDA::IHistogram2D;
35 using AIDA::IProfile1D;
39 int binsY,
double iminY,
double imaxY ) {
40 auto p =
new Histogram2D(
new TH2D( title.
c_str(), title.
c_str(), binsX, iminX, imaxX, binsY, iminY, imaxY ) );
45 auto p =
new Histogram2D(
46 new TH2D( title.
c_str(), title.
c_str(), eX.size() - 1, &eX.front(), eY.size() - 1, &eY.front() ) );
51 auto p =
new Histogram2D( rep );
56 TH2D*
h = getRepresentation<AIDA::IHistogram2D, TH2D>( hist );
57 Histogram2D*
n =
h ?
new Histogram2D(
new TH2D( *
h ) ) :
nullptr;
63 TH2*
r = getRepresentation<IHistogram2D, TH2>( hist );
64 TH1D*
t =
r ?
r->ProjectionX(
"_px", first, last,
"e" ) :
nullptr;
65 if (
t )
t->SetName( nam.
c_str() );
66 Histogram1D* p = (
t ?
new Histogram1D(
t ) :
nullptr );
72 TH2*
r = getRepresentation<IHistogram2D, TH2>( hist );
73 TH1D*
t =
r ?
r->ProjectionY(
"_py", first, last,
"e" ) :
nullptr;
74 if (
t )
t->SetName( nam.
c_str() );
75 Histogram1D* p = (
t ?
new Histogram1D(
t ) :
nullptr );
81 TH2*
r = getRepresentation<IHistogram2D, TH2>( hist );
82 TH1D*
t =
r ?
r->ProjectionY(
"_px", first, last,
"e" ) :
nullptr;
83 if (
t )
t->SetName( nam.
c_str() );
84 Histogram1D* p = (
t ?
new Histogram1D(
t ) :
nullptr );
90 TH2*
r = Gaudi::getRepresentation<IHistogram2D, TH2>( hist );
91 TProfile*
t =
r ?
r->ProfileX(
"_pfx", first, last,
"e" ) :
nullptr;
92 if (
t )
t->SetName( nam.
c_str() );
93 Profile1D* p = (
t ?
new Profile1D(
t ) :
nullptr );
99 TH2*
r = getRepresentation<IHistogram2D, TH2>( hist );
100 TProfile*
t =
r ?
r->ProfileY(
"_pfx", first, last,
"e" ) :
nullptr;
101 if (
t )
t->SetName( nam.
c_str() );
102 Profile1D* p = (
t ?
new Profile1D(
t ) :
nullptr );
109 if ( className ==
"AIDA::IHistogram2D" )
110 return (IHistogram2D*)
this;
111 else if ( className ==
"AIDA::IHistogram" )
112 return (IHistogram*)
this;
118 if ( binHeight( indexX, indexY ) <= 0 )
return 0;
119 double xx = binHeight( indexX, indexY ) / binError( indexX, indexY );
120 return int( xx * xx + 0.5 );
125 TH2D* imp =
dynamic_cast<TH2D*
>( rep );
126 if ( !imp )
throw std::runtime_error(
"Cannot adopt native histogram representation." );
128 m_xAxis.initialize( m_rep->GetXaxis(),
true );
129 m_yAxis.initialize( m_rep->GetYaxis(),
true );
130 const TArrayD* a = m_rep->GetSumw2();
131 if ( !a || ( a && a->GetSize() == 0 ) ) m_rep->Sumw2();
132 setTitle( m_rep->GetTitle() );
140 m_rep->SetDirectory(
nullptr );
144 adoptRepresentation( rep );
145 m_sumwx = m_sumwy = 0;
146 m_rep->SetDirectory(
nullptr );
151 m_rep->SetBinContent( rIndexX( i ), rIndexY( j ), height );
152 m_rep->SetBinError( rIndexX( i ), rIndexY( j ), error );
154 if ( i >= 0 && j >= 0 ) {
155 m_sumwx += centreX * height;
156 m_sumwy += centreY * height;
158 m_sumEntries += entries;
165 return Base::reset();
171 # pragma warning( push )
172 # pragma warning( disable : 1572 )
176 auto guard = std::scoped_lock{ m_fillSerialization };
177 ( weight == 1. ) ? m_rep->Fill( x, y ) : m_rep->Fill( x, y, weight );
182 m_rep->SetEntries( m_sumEntries );
184 stat[0] = sumBinHeights();
186 if ( equivalentBinEntries() != 0 ) stat[1] = ( sumBinHeights() * sumBinHeights() ) / equivalentBinEntries();
189 if ( sumBinHeights() != 0 ) meanX = m_sumwx / sumBinHeights();
190 stat[3] = ( meanX * meanX + rmsX * rmsX ) * sumBinHeights();
193 if ( sumBinHeights() != 0 ) meanY = m_sumwy / sumBinHeights();
194 stat[5] = ( meanY * meanY + rmsY * rmsY ) * sumBinHeights();
196 m_rep->PutStats( &stat.
front() );
203 const char* title = titlestr.
c_str();
204 if (
h.xAxis().isFixedBinning() &&
h.yAxis().isFixedBinning() )
205 m_rep.reset(
new TH2D( title, title,
h.xAxis().bins(),
h.xAxis().lowerEdge(),
h.xAxis().upperEdge(),
206 h.yAxis().bins(),
h.yAxis().lowerEdge(),
h.yAxis().upperEdge() ) );
209 for (
int i = 0; i <
h.xAxis().bins(); ++i ) eX.
push_back(
h.xAxis().binLowerEdge( i ) );
211 eX.push_back(
h.xAxis().upperEdge() );
212 for (
int i = 0; i <
h.yAxis().bins(); ++i ) eY.push_back(
h.yAxis().binLowerEdge( i ) );
214 eY.push_back(
h.yAxis().upperEdge() );
215 m_rep.reset(
new TH2D( title, title, eX.size() - 1, &eX.front(), eY.size() - 1, &eY.front() ) );
217 m_xAxis.initialize( m_rep->GetXaxis(),
true );
218 m_yAxis.initialize( m_rep->GetYaxis(),
true );
224 double sumw =
h.sumBinHeights();
226 if (
h.equivalentBinEntries() != 0 ) sumw2 = ( sumw * sumw ) /
h.equivalentBinEntries();
227 double sumwx =
h.meanX() *
h.sumBinHeights();
228 double sumwx2 = (
h.meanX() *
h.meanX() +
h.rmsX() *
h.rmsX() ) *
h.sumBinHeights();
229 double sumwy =
h.meanY() *
h.sumBinHeights();
230 double sumwy2 = (
h.meanY() *
h.meanY() +
h.rmsY() *
h.rmsY() ) *
h.sumBinHeights();
234 for (
int i = -2; i < xAxis().bins(); ++i ) {
235 for (
int j = -2; j < yAxis().bins(); ++j ) {
237 m_rep->SetBinContent( rIndexX( i ), rIndexY( j ),
h.binHeight( i, j ) );
238 m_rep->SetBinError( rIndexX( i ), rIndexY( j ),
h.binError( i, j ) );
240 if ( i >= 0 && j >= 0 ) { sumwxy +=
h.binHeight( i, j ) *
h.binMeanX( i, j ) *
h.binMeanY( i, j ); }
245 m_rep->SetEntries(
h.allEntries() );
248 m_rep->PutStats( stat.
data() );
253 # pragma warning( pop )