14 # pragma warning( disable : 2259 )
27 const std::string& title,
int nBins,
double xlow,
29 auto p =
new Histogram1D(
new TH1D( title.c_str(), title.c_str(), nBins, xlow, xup ) );
35 const std::string& title,
const Edges& e ) {
36 auto p =
new Histogram1D(
new TH1D( title.c_str(), title.c_str(), e.size() - 1, &e.front() ) );
42 const AIDA::IHistogram1D& hist ) {
43 TH1D*
h = getRepresentation<AIDA::IHistogram1D, TH1D>( hist );
44 auto n = (
h ?
new Histogram1D(
new TH1D( *
h ) ) :
nullptr );
53 if ( className ==
"AIDA::IHistogram1D" )
return const_cast<AIDA::IHistogram1D*
>( (AIDA::IHistogram1D*)
this );
54 if ( className ==
"AIDA::IHistogram" )
return const_cast<AIDA::IHistogram*
>( (AIDA::IHistogram*)
this );
60 if ( binHeight(
index ) <= 0 )
return 0;
61 double xx = binHeight(
index ) / binError(
index );
62 return int( xx * xx + 0.5 );
67 TH1D* imp =
dynamic_cast<TH1D*
>( rep );
68 if ( !imp )
throw std::runtime_error(
"Cannot adopt native histogram representation." );
77 init( m_rep->GetTitle() );
82 m_classType =
"IHistogram1D";
83 if ( initialize_axis ) { m_axis.initialize( m_rep->GetXaxis(),
false ); }
84 const TArrayD* a = m_rep->GetSumw2();
85 if ( !a || ( a && a->GetSize() == 0 ) ) m_rep->Sumw2();
87 m_rep->SetDirectory(
nullptr );
95 for (
int i = 1,
n = m_rep->GetNbinsX(); i <=
n; ++i ) {
96 m_sumwx += m_rep->GetBinContent( i ) * m_rep->GetBinCenter( i );
97 m_sumEntries += m_rep->GetBinContent( i );
104 return Base::reset();
111 init( m_rep->GetTitle() );
117 m_rep->SetBinContent( rIndex( i ), height );
118 m_rep->SetBinError( rIndex( i ), error );
120 if ( i != AIDA::IAxis::UNDERFLOW_BIN && i != AIDA::IAxis::OVERFLOW_BIN ) m_sumwx += centre * height;
121 m_sumEntries += entries;
126 m_rep->SetEntries( m_sumEntries );
127 std::vector<double> stat( 11 );
129 stat[0] = sumBinHeights();
131 if ( std::abs( equivalentBinEntries() ) > std::numeric_limits<double>::epsilon() )
132 stat[1] = ( sumBinHeights() * sumBinHeights() ) / equivalentBinEntries();
135 if ( std::abs( sumBinHeights() ) > std::numeric_limits<double>::epsilon() ) mean = m_sumwx / sumBinHeights();
136 stat[3] = ( mean * mean + rms * rms ) * sumBinHeights();
137 m_rep->PutStats( &stat.front() );
143 m_rep->SetEntries( allEntries );
145 std::vector<double> stat( 11 );
147 stat[0] = sumBinHeights();
150 if ( std::abs( eqBinEntries ) > std::numeric_limits<double>::epsilon() )
151 stat[1] = ( sumBinHeights() * sumBinHeights() ) / eqBinEntries;
153 stat[2] = mean * sumBinHeights();
155 stat[3] = ( mean * mean + rms * rms ) * sumBinHeights();
156 m_rep->PutStats( &stat.front() );
162 auto guard = std::scoped_lock{ m_fillSerialization };
163 m_rep->Fill( x, weight );
169 std::string title =
h.title() +
"Copy";
170 if (
h.axis().isFixedBinning() ) {
172 new TH1D( title.c_str(), title.c_str(),
h.axis().bins(),
h.axis().lowerEdge(),
h.axis().upperEdge() ) );
175 for (
int i = 0; i <
h.axis().bins(); ++i ) { e.push_back(
h.axis().binLowerEdge( i ) ); }
177 e.push_back(
h.axis().upperEdge() );
178 m_rep.reset(
new TH1D( title.c_str(), title.c_str(), e.size() - 1, &e.front() ) );
180 m_axis.initialize( m_rep->GetXaxis(),
false );
185 double sumw =
h.sumBinHeights();
188 if ( std::abs(
h.equivalentBinEntries() ) > std::numeric_limits<double>::epsilon() )
189 sumw2 = ( sumw * sumw ) /
h.equivalentBinEntries();
191 double sumwx =
h.mean() *
h.sumBinHeights();
192 double sumwx2 = (
h.mean() *
h.mean() +
h.rms() *
h.rms() ) *
h.sumBinHeights();
195 for (
int i = -2; i < axis().bins(); ++i ) {
197 m_rep->SetBinContent( rIndex( i ),
h.binHeight( i ) );
198 m_rep->SetBinError( rIndex( i ),
h.binError( i ) );
202 m_rep->SetEntries(
h.allEntries() );
204 std::vector<double> stat( 11 );
209 m_rep->PutStats( &stat.front() );
217 for (
int j = 0;
j <
size;
j++ ) {
218 std::string
key, value;
220 if ( !annotation().addItem(
key, value ) ) { annotation().setValue(
key, value ); };
221 if (
"Title" ==
key ) { title = value; }
223 double lowerEdge, upperEdge, binHeight, binError;
224 int isFixedBinning, bins;
225 s >> isFixedBinning >> bins;
227 if ( isFixedBinning ) {
228 s >> lowerEdge >> upperEdge;
229 m_rep.reset(
new TH1D( title.c_str(), title.c_str(), bins, lowerEdge, upperEdge ) );
232 edges.resize( bins );
233 for (
int i = 0; i <= bins; ++i ) s >> edges[i];
234 m_rep.reset(
new TH1D( title.c_str(), title.c_str(), edges.size() - 1, &edges.front() ) );
236 m_axis.initialize( m_rep->GetXaxis(),
true );
241 for (
int i = 0; i <= bins + 1; ++i ) {
242 s >> binHeight >> binError;
243 m_rep->SetBinContent( i, binHeight );
244 m_rep->SetBinError( i, binError );
248 m_rep->SetEntries( allEntries );
250 s >> stats[0] >> stats[1] >> stats[2] >> stats[3];
251 m_rep->PutStats( stats );
257 s << static_cast<int>( annotation().
size() );
258 for (
int i = 0; i < annotation().size(); i++ ) {
259 s << annotation().key( i );
260 s << annotation().value( i );
262 const AIDA::IAxis& axis( this->axis() );
263 const int isFixedBinning = axis.isFixedBinning();
264 const int bins = axis.bins();
265 s << isFixedBinning << bins;
266 if ( isFixedBinning ) {
267 s << axis.lowerEdge();
269 for (
int i = 0; i < bins; ++i )
s << axis.binLowerEdge( i );
271 s << axis.upperEdge();
272 for (
int i = 0; i <= bins + 1; ++i )
s << m_rep->GetBinContent( i ) << m_rep->GetBinError( i );
274 s << m_rep->GetEntries();
276 m_rep->GetStats( stats );
277 s << stats[0] << stats[1] << stats[2] << stats[3];