14 # pragma warning( disable : 2259 )
30 using AIDA::IHistogram1D;
31 using AIDA::IHistogram2D;
32 using AIDA::IProfile1D;
36 const std::string& title,
int binsX,
double iminX,
double imaxX,
37 int binsY,
double iminY,
double imaxY ) {
38 auto p =
new Histogram2D(
new TH2D( title.c_str(), title.c_str(), binsX, iminX, imaxX, binsY, iminY, imaxY ) );
44 const std::string& title,
const Edges& eX,
const Edges& eY ) {
45 auto p =
new Histogram2D(
46 new TH2D( title.c_str(), title.c_str(), eX.size() - 1, &eX.front(), eY.size() - 1, &eY.front() ) );
52 auto p =
new Histogram2D( rep );
58 const IHistogram2D& hist ) {
59 TH2D*
h = getRepresentation<AIDA::IHistogram2D, TH2D>( hist );
60 Histogram2D*
n =
h ?
new Histogram2D(
new TH2D( *
h ) ) :
nullptr;
65 std::pair<DataObject*, IHistogram1D*>
Gaudi::slice1DX(
const std::string& nam,
const IHistogram2D& hist,
int first,
67 TH2* r = getRepresentation<IHistogram2D, TH2>( hist );
68 TH1D*
t = r ? r->ProjectionX(
"_px", first, last,
"e" ) :
nullptr;
69 if (
t )
t->SetName( nam.c_str() );
70 Histogram1D* p = (
t ?
new Histogram1D(
t ) :
nullptr );
74 std::pair<DataObject*, IHistogram1D*>
Gaudi::slice1DY(
const std::string& nam,
const IHistogram2D& hist,
int first,
76 TH2* r = getRepresentation<IHistogram2D, TH2>( hist );
77 TH1D*
t = r ? r->ProjectionY(
"_py", first, last,
"e" ) :
nullptr;
78 if (
t )
t->SetName( nam.c_str() );
79 Histogram1D* p = (
t ?
new Histogram1D(
t ) :
nullptr );
83 std::pair<DataObject*, IHistogram1D*>
Gaudi::project1DY(
const std::string& nam,
const IHistogram2D& hist,
int first,
85 TH2* r = getRepresentation<IHistogram2D, TH2>( hist );
86 TH1D*
t = r ? r->ProjectionY(
"_px", first, last,
"e" ) :
nullptr;
87 if (
t )
t->SetName( nam.c_str() );
88 Histogram1D* p = (
t ?
new Histogram1D(
t ) :
nullptr );
92 std::pair<DataObject*, IProfile1D*>
Gaudi::profile1DX(
const std::string& nam,
const IHistogram2D& hist,
int first,
94 TH2* r = Gaudi::getRepresentation<IHistogram2D, TH2>( hist );
95 TProfile*
t = r ? r->ProfileX(
"_pfx", first, last,
"e" ) :
nullptr;
96 if (
t )
t->SetName( nam.c_str() );
97 Profile1D* p = (
t ?
new Profile1D(
t ) :
nullptr );
101 std::pair<DataObject*, IProfile1D*>
Gaudi::profile1DY(
const std::string& nam,
const IHistogram2D& hist,
int first,
103 TH2* r = getRepresentation<IHistogram2D, TH2>( hist );
104 TProfile*
t = r ? r->ProfileY(
"_pfx", first, last,
"e" ) :
nullptr;
105 if (
t )
t->SetName( nam.c_str() );
106 Profile1D* p = (
t ?
new Profile1D(
t ) :
nullptr );
113 if ( className ==
"AIDA::IHistogram2D" )
114 return (IHistogram2D*)
this;
115 else if ( className ==
"AIDA::IHistogram" )
116 return (IHistogram*)
this;
122 if ( binHeight( indexX, indexY ) <= 0 )
return 0;
123 double xx = binHeight( indexX, indexY ) / binError( indexX, indexY );
124 return int( xx * xx + 0.5 );
129 TH2D* imp =
dynamic_cast<TH2D*
>( rep );
130 if ( !imp )
throw std::runtime_error(
"Cannot adopt native histogram representation." );
132 m_xAxis.initialize( m_rep->GetXaxis(),
true );
133 m_yAxis.initialize( m_rep->GetYaxis(),
true );
134 const TArrayD* a = m_rep->GetSumw2();
135 if ( !a || ( a && a->GetSize() == 0 ) ) m_rep->Sumw2();
136 setTitle( m_rep->GetTitle() );
144 m_rep->SetDirectory(
nullptr );
148 adoptRepresentation( rep );
149 m_sumwx = m_sumwy = 0;
150 m_rep->SetDirectory(
nullptr );
155 m_rep->SetBinContent( rIndexX( i ), rIndexY(
j ), height );
156 m_rep->SetBinError( rIndexX( i ), rIndexY(
j ), error );
158 if ( i >= 0 &&
j >= 0 ) {
159 m_sumwx += centreX * height;
160 m_sumwy += centreY * height;
162 m_sumEntries += entries;
169 return Base::reset();
174 auto guard = std::scoped_lock{ m_fillSerialization };
175 m_rep->Fill( x, y, weight );
180 m_rep->SetEntries( m_sumEntries );
181 std::vector<double> stat( 11 );
182 stat[0] = sumBinHeights();
184 if ( std::abs( equivalentBinEntries() ) > std::numeric_limits<double>::epsilon() )
185 stat[1] = ( sumBinHeights() * sumBinHeights() ) / equivalentBinEntries();
190 if ( std::abs( sumBinHeights() ) > std::numeric_limits<double>::epsilon() ) {
191 meanX = m_sumwx / sumBinHeights();
192 meanY = m_sumwy / sumBinHeights();
194 stat[3] = ( meanX * meanX + rmsX * rmsX ) * sumBinHeights();
195 stat[5] = ( meanY * meanY + rmsY * rmsY ) * sumBinHeights();
197 m_rep->PutStats( &stat.front() );
203 std::string titlestr =
h.title();
204 const char* title = titlestr.c_str();
205 if (
h.xAxis().isFixedBinning() &&
h.yAxis().isFixedBinning() )
206 m_rep.reset(
new TH2D( title, title,
h.xAxis().bins(),
h.xAxis().lowerEdge(),
h.xAxis().upperEdge(),
207 h.yAxis().bins(),
h.yAxis().lowerEdge(),
h.yAxis().upperEdge() ) );
210 for (
int i = 0; i <
h.xAxis().bins(); ++i ) eX.push_back(
h.xAxis().binLowerEdge( i ) );
212 eX.push_back(
h.xAxis().upperEdge() );
213 for (
int i = 0; i <
h.yAxis().bins(); ++i ) eY.push_back(
h.yAxis().binLowerEdge( i ) );
215 eY.push_back(
h.yAxis().upperEdge() );
216 m_rep.reset(
new TH2D( title, title, eX.size() - 1, &eX.front(), eY.size() - 1, &eY.front() ) );
218 m_xAxis.initialize( m_rep->GetXaxis(),
true );
219 m_yAxis.initialize( m_rep->GetYaxis(),
true );
225 double sumw =
h.sumBinHeights();
227 if ( std::abs(
h.equivalentBinEntries() ) > std::numeric_limits<double>::epsilon() )
228 sumw2 = ( sumw * sumw ) /
h.equivalentBinEntries();
229 double sumwx =
h.meanX() *
h.sumBinHeights();
230 double sumwx2 = (
h.meanX() *
h.meanX() +
h.rmsX() *
h.rmsX() ) *
h.sumBinHeights();
231 double sumwy =
h.meanY() *
h.sumBinHeights();
232 double sumwy2 = (
h.meanY() *
h.meanY() +
h.rmsY() *
h.rmsY() ) *
h.sumBinHeights();
236 for (
int i = -2; i < xAxis().bins(); ++i ) {
237 for (
int j = -2;
j < yAxis().bins(); ++
j ) {
239 m_rep->SetBinContent( rIndexX( i ), rIndexY(
j ),
h.binHeight( i,
j ) );
240 m_rep->SetBinError( rIndexX( i ), rIndexY(
j ),
h.binError( i,
j ) );
242 if ( i >= 0 &&
j >= 0 ) { sumwxy +=
h.binHeight( i,
j ) *
h.binMeanX( i,
j ) *
h.binMeanY( i,
j ); }
247 m_rep->SetEntries(
h.allEntries() );
249 std::array<double, 11> stat = { { sumw, sumw2, sumwx, sumwx2, sumwy, sumwy2, sumwxy } };
250 m_rep->PutStats( stat.data() );