The Gaudi Framework  v29r0 (ff2e7097)
Histo2String.cpp
Go to the documentation of this file.
1 // ============================================================================
2 // Include files
3 // ============================================================================
4 // ROOT
5 // ============================================================================
6 #include "TH1D.h"
7 #include "TH1F.h"
8 #include "TH2D.h"
9 #include "TH2F.h"
10 // ============================================================================
11 // AIDA
12 // ============================================================================
13 #include "AIDA/IHistogram1D.h"
14 #include "AIDA/IHistogram2D.h"
15 // ============================================================================
16 // GaudiKernel
17 // ============================================================================
18 #include "GaudiKernel/ToStream.h"
19 // ============================================================================
20 // local
21 // ============================================================================
22 #include "GaudiUtils/Aida2ROOT.h"
24 #include "GaudiUtils/HistoXML.h"
25 // ============================================================================
31 // ============================================================================
32 namespace
33 {
34  // ==========================================================================
35  template <class HISTO>
36  std::ostream& _toStream_1D_( const HISTO& histo, std::ostream& stream, const bool asXML )
37  {
38  if ( asXML ) {
39  return Gaudi::Utils::Histos::toXml( histo, stream );
40  }
41  //
42  stream << "{ ";
43  //
44  stream << "'name' : ";
45  Gaudi::Utils::toStream( std::string( histo.GetName() ), stream ) << " , ";
46  stream << "'title' : ";
47  Gaudi::Utils::toStream( std::string( histo.GetTitle() ), stream ) << " , ";
48  //
49  const TAxis* axis = histo.GetXaxis();
50  const unsigned int nBins = axis->GetNbins();
51  //
52  stream << std::endl << "'X' : { ";
53  if ( axis->IsVariableBinSize() ) {
54  const TArrayD* xbins = axis->GetXbins();
55  const unsigned int xsize = xbins->GetSize();
56  std::vector<double> edges;
57  for ( unsigned int iBin = 0; iBin < xsize; ++iBin ) {
58  edges.push_back( xbins->At( iBin ) );
59  }
60  stream << "'edges' : ";
61  Gaudi::Utils::toStream( edges, stream ) << " }, " << std::endl;
62  } else {
63  stream << "'nbins' : ";
64  Gaudi::Utils::toStream( nBins, stream ) << " , ";
65  stream << "'low' : ";
66  Gaudi::Utils::toStream( axis->GetXmin(), stream ) << " , ";
67  stream << "'high' : ";
68  Gaudi::Utils::toStream( axis->GetXmax(), stream ) << " }, " << std::endl;
69  }
70  // finally: the content
72  for ( unsigned int iBin = 0; iBin <= nBins + 1; ++iBin ) {
73  bins.emplace_back( histo.GetBinContent( iBin ), histo.GetBinError( iBin ) );
74  }
75  stream << "'bins' : ";
76  Gaudi::Utils::toStream( bins, stream );
77  //
78  stream << " }";
79  //
80  return stream;
81  }
82  // ==========================================================================
83  template <class HISTO>
84  std::ostream& _toStream_2D_( const HISTO& histo, std::ostream& stream, const bool asXML )
85  {
86  if ( asXML ) {
87  return Gaudi::Utils::Histos::toXml( histo, stream );
88  }
89  //
90  stream << "{ ";
91  //
92  stream << "'name' : ";
93  Gaudi::Utils::toStream( std::string( histo.GetName() ), stream ) << " , ";
94  stream << "'title' : ";
95  Gaudi::Utils::toStream( std::string( histo.GetTitle() ), stream ) << " , ";
96  //
97  const TAxis* xaxis = histo.GetXaxis();
98  const int xBins = xaxis->GetNbins();
99  //
100  stream << std::endl << "'X' : { ";
101  if ( xaxis->IsVariableBinSize() ) {
102  const TArrayD* xbins = xaxis->GetXbins();
103  const unsigned int xsize = xbins->GetSize();
104  std::vector<double> edges;
105  for ( unsigned int iBin = 0; iBin < xsize; ++iBin ) {
106  edges.push_back( xbins->At( iBin ) );
107  }
108  // the edges
109  stream << "'edges' : ";
110  Gaudi::Utils::toStream( edges, stream ) << " }," << std::endl;
111  } else {
112  stream << "'nbins' : ";
113  Gaudi::Utils::toStream( xBins, stream ) << " , ";
114  stream << "'low' : ";
115  Gaudi::Utils::toStream( xaxis->GetXmin(), stream ) << " , ";
116  stream << "'high' : ";
117  Gaudi::Utils::toStream( xaxis->GetXmax(), stream ) << " }, " << std::endl;
118  }
119  //
120  const TAxis* yaxis = histo.GetYaxis();
121  const int yBins = yaxis->GetNbins();
122  //
123  stream << std::endl << "'Y' : { ";
124  if ( yaxis->IsVariableBinSize() ) {
125  const TArrayD* ybins = yaxis->GetXbins();
126  const unsigned int ysize = ybins->GetSize();
127  std::vector<double> edges;
128  for ( unsigned int iBin = 0; iBin < ysize; ++iBin ) {
129  edges.push_back( ybins->At( iBin ) );
130  }
131  // the edges
132  stream << " 'edges' : ";
133  Gaudi::Utils::toStream( edges, stream ) << " }," << std::endl;
134  } else {
135  stream << "'nbins' : ";
136  Gaudi::Utils::toStream( yBins, stream ) << " , ";
137  stream << "'low' : ";
138  Gaudi::Utils::toStream( yaxis->GetXmin(), stream ) << " , ";
139  stream << "'high' : ";
140  Gaudi::Utils::toStream( yaxis->GetXmax(), stream ) << " }, " << std::endl;
141  }
142  //
143  // finally: the content
144  stream << "'bins' : " << std::endl << " [ ";
145  for ( int jBin = yBins + 1; jBin >= 0; --jBin ) {
146  if ( yBins + 1 != jBin ) {
147  stream << std::endl;
148  }
149  for ( int iBin = 0; iBin <= xBins + 1; ++iBin ) {
150  //
151  Gaudi::Utils::toStream( std::make_pair( histo.GetBinContent( iBin, jBin ), histo.GetBinError( iBin, jBin ) ),
152  stream );
153  //
154  if ( xBins + 1 != iBin || 0 != jBin ) {
155  stream << " , ";
156  }
157  }
158  }
159  stream << " ]";
160  //
161  stream << " }";
162  //
163  return stream;
164  }
165  // ==========================================================================
166 } // end of anonymous namespace
167 // ============================================================================
168 /* stream the ROOT histogram into output stream
169  * @param histo (INPUT) the histogram to be streamed
170  * @param stream (OUTPUT) the stream
171  * @param asXML (INPUT) use XML-format
172  */
173 // ============================================================================
174 std::ostream& Gaudi::Utils::toStream( const TH1D& histo, std::ostream& stream, const bool asXML )
175 {
176  return _toStream_1D_( histo, stream, asXML );
177 }
178 // ============================================================================
179 /* stream the ROOT histogram into output stream
180  * @param histo (INPUT) the histogram to be streamed
181  * @param stream (OUTPUT) the stream
182  * @param asXML (INPUT) use XML-format
183  */
184 // ============================================================================
185 std::ostream& Gaudi::Utils::toStream( const TH1F& histo, std::ostream& stream, const bool asXML )
186 {
187  return _toStream_1D_( histo, stream, asXML );
188 }
189 // ============================================================================
190 /* stream the ROOT histogram into output stream
191  * @param histo (INPUT) the histogram to be streamed
192  * @param stream (OUTPUT) the stream
193  * @param asXML (INPUT) use XML-format
194  */
195 // ============================================================================
196 std::ostream& Gaudi::Utils::toStream( const TH2D& histo, std::ostream& stream, const bool asXML )
197 {
198  return _toStream_2D_( histo, stream, asXML );
199 }
200 // ============================================================================
201 /* stream the ROOT histogram into output stream
202  * @param histo (INPUT) the histogram to be streamed
203  * @param stream (OUTPUT) the stream
204  * @param asXML (INPUT) use XML-format
205  */
206 // ============================================================================
207 std::ostream& Gaudi::Utils::toStream( const TH2F& histo, std::ostream& stream, const bool asXML )
208 {
209  return _toStream_2D_( histo, stream, asXML );
210 }
211 // ============================================================================
212 /* stream the AIDA histogram into output stream
213  * @param histo (INPUT) the histogram to be streamed
214  * @param stream (OUTPUT) the stream
215  * @param asXML (INPUT) use XML-format
216  */
217 // ============================================================================
218 std::ostream& Gaudi::Utils::toStream( const AIDA::IHistogram1D& histo, std::ostream& stream, const bool asXML )
219 {
220  auto root = Gaudi::Utils::Aida2ROOT::aida2root( &histo );
221  return root ? toStream( *root, stream, asXML ) : stream;
222 }
223 // ============================================================================
224 /* stream the AIDA histogram into output stream
225  * @param histo (INPUT) the histogram to be streamed
226  * @param stream (OUTPUT) the stream
227  * @param asXML (INPUT) use XML-format
228  */
229 // ============================================================================
230 std::ostream& Gaudi::Utils::toStream( const AIDA::IHistogram2D& histo, std::ostream& stream, const bool asXML )
231 {
232  //
233  auto root = Gaudi::Utils::Aida2ROOT::aida2root( &histo );
234  return root ? toStream( *root, stream, asXML ) : stream;
235 }
236 // ============================================================================
237 /* convert the histogram into the string
238  * @param histo (INPUT) the histogram to be streamed
239  * @param asXML (INPUT) use XML-format
240  * @return the string representation of the histogram
241  * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl
242  * @date 2009-09-26
243  */
244 // ============================================================================
245 std::string Gaudi::Utils::toString( const TH1D& histo, const bool asXML )
246 {
248  toStream( histo, o, asXML );
249  return o.str();
250 }
251 // ============================================================================
252 /* convert the histogram into the string
253  * @param histo (INPUT) the histogram to be streamed
254  * @param asXML (INPUT) use XML-format
255  * @return the string representation of the histogram
256  * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl
257  * @date 2009-09-26
258  */
259 // ============================================================================
260 std::string Gaudi::Utils::toString( const TH1F& histo, const bool asXML )
261 {
263  toStream( histo, o, asXML );
264  return o.str();
265 }
266 // ============================================================================
267 /* convert the histogram into the string
268  * @param histo (INPUT) the histogram to be streamed
269  * @param asXML (INPUT) use XML-format
270  * @return the string representation of the histogram
271  * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl
272  * @date 2009-09-26
273  */
274 // ============================================================================
275 std::string Gaudi::Utils::toString( const TH2D& histo, const bool asXML )
276 {
278  toStream( histo, o, asXML );
279  return o.str();
280 }
281 // ============================================================================
282 /* convert the histogram into the string
283  * @param histo (INPUT) the histogram to be streamed
284  * @param asXML (INPUT) use XML-format
285  * @return the string representation of the histogram
286  * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl
287  * @date 2009-09-26
288  */
289 // ============================================================================
290 std::string Gaudi::Utils::toString( const TH2F& histo, const bool asXML )
291 {
293  toStream( histo, o, asXML );
294  return o.str();
295 }
296 // ============================================================================
297 /* convert the histogram into the string
298  * @param histo (INPUT) the histogram to be streamed
299  * @param asXML (INPUT) use XML-format
300  * @return the string representation of the histogram
301  * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl
302  * @date 2009-09-26
303  */
304 // ============================================================================
305 std::string Gaudi::Utils::toString( const AIDA::IHistogram1D& histo, const bool asXML )
306 {
308  toStream( histo, o, asXML );
309  return o.str();
310 }
311 // =============================================================================
312 /* convert the histogram into the string
313  * @param histo (INPUT) the histogram to be streamed
314  * @param asXML (INPUT) use XML-format
315  * @return the string representation of the histogram
316  * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl
317  * @date 2009-09-26
318  */
319 // ============================================================================
320 std::string Gaudi::Utils::toString( const AIDA::IHistogram2D& histo, const bool asXML )
321 {
323  toStream( histo, o, asXML );
324  return o.str();
325 }
326 // =============================================================================
327 /* convert the histogram into the string
328  * @param histo (INPUT) the histogram to be streamed
329  * @param asXML (INPUT) use XML-format
330  * @return the string representation of the histogram
331  * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl
332  * @date 2009-09-26
333  */
334 // =============================================================================
335 std::string Gaudi::Utils::toString( const AIDA::IHistogram1D* histo ) { return histo ? toString( *histo ) : "{}"; }
336 // ============================================================================
337 /* convert the histogram into the string
338  * @param histo (INPUT) the histogram to be streamed
339  * @param asXML (INPUT) use XML-format
340  * @return the string representation of the histogram
341  * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl
342  * @date 2009-09-26
343  */
344 // =============================================================================
345 std::string Gaudi::Utils::toString( AIDA::IHistogram1D* histo ) { return histo ? toString( *histo ) : "{}"; }
346 // ============================================================================
347 /* convert the histogram into the string
348  * @param histo (INPUT) the histogram to be streamed
349  * @param asXML (INPUT) use XML-format
350  * @return the string representation of the histogram
351  * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl
352  * @date 2009-09-26
353  */
354 // =============================================================================
355 std::string Gaudi::Utils::toString( const TH1D* histo ) { return histo ? toString( *histo ) : "{}"; }
356 // ============================================================================
357 /* convert the histogram into the string
358  * @param histo (INPUT) the histogram to be streamed
359  * @param asXML (INPUT) use XML-format
360  * @return the string representation of the histogram
361  * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl
362  * @date 2009-09-26
363  */
364 // =============================================================================
365 std::string Gaudi::Utils::toString( const TH2D* histo ) { return histo ? toString( *histo ) : "{}"; }
366 // ============================================================================
367 /* convert the histogram into the string
368  * @param histo (INPUT) the histogram to be streamed
369  * @param asXML (INPUT) use XML-format
370  * @return the string representation of the histogram
371  * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl
372  * @date 2009-09-26
373  */
374 // =============================================================================
375 std::string Gaudi::Utils::toString( TH1D* histo ) { return histo ? toString( *histo ) : "{}"; }
376 // ============================================================================
377 /* convert the histogram into the string
378  * @param histo (INPUT) the histogram to be streamed
379  * @param asXML (INPUT) use XML-format
380  * @return the string representation of the histogram
381  * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl
382  * @date 2009-09-26
383  */
384 // =============================================================================
385 std::string Gaudi::Utils::toString( TH2D* histo ) { return histo ? toString( *histo ) : "{}"; }
386 // ============================================================================
387 // The END
388 // ============================================================================
std::ostream & toStream(ITERATOR first, ITERATOR last, std::ostream &s, const std::string &open, const std::string &close, const std::string &delim)
the helper function to print the sequence
Definition: ToStream.h:293
std::string toString(const TYPE &obj)
the generic implementation of the type conversion to the string
Definition: ToStream.h:346
T endl(T...args)
STL class.
T push_back(T...args)
std::ostream & toStream(const Type &, std::ostream &)
T make_pair(T...args)
static TH1D * aida2root(AIDA::IHistogram1D *aida)
get the underlying pointer for 1D-histogram
Definition: Aida2ROOT.cpp:73
GAUDI_API std::ostream & toXml(const TH1D &histo, std::ostream &stream)
stream the ROOT histogram into output stream as XML
Definition: HistoXML.cpp:66
implementation of various functions for streaming.
STL class.
std::string toString(const Type &)
T emplace_back(T...args)