11 #include "AIDA/IHistogram1D.h" 12 #include "AIDA/IHistogram2D.h" 13 #include "AIDA/IHistogram3D.h" 49 template<
typename Iterator,
typename Skipper>
50 class EdgeGrammar :
public qi::grammar<Iterator, Edges(), qi::locals<char>,
62 ( ( qi::lit(
"edges") |
"'edges'" |
"\"edges\"" )
63 >>
":" >>
edges[qi::_val *= qi::_1] )
66 ((( qi::lit(
"nbins") |
"'nbins'" |
"\"nbins\"")
67 >>
":" >>
nbins [ qi::_val /= qi::_1 ])
69 (( qi::lit(
"low") |
"'low'" |
"\"low\"" )
70 >>
":" >>
low [qi::_val -= qi::_1])
72 (( qi::lit(
"high") |
"'high'" |
"\"high\"" )
73 >>
":" >>
high [qi::_val += qi::_1])) %
',';
75 begin = enc::char_(
'[')[qi::_val=
']']
76 | enc::char_(
'{')[qi::_val=
'}']
77 | enc::char_(
'(')[qi::_val=
')'];
78 end = enc::char_(qi::_r1);
80 >>
inner[qi::_val = qi::_1]
88 qi::rule<Iterator, char()>
begin;
89 qi::rule<Iterator, void(char)>
end;
94 template<
typename Iterator,
typename Skipper>
95 class H1Grammar :
public qi::grammar<Iterator, H1(), qi::locals<char>,
107 (((qi::lit(
"name") |
"'name'" |
"\"name\"" )
108 >>
":" >>
name[qi::_val *= qi::_1 ])
110 (( qi::lit(
"title") |
"'title'" |
"\"title\"" )
111 >>
":" >> title [ qi::_val /= qi::_1 ])
113 ( -(( qi::lit(
"X") |
"'X'" |
"\"X\"" |
"x" |
"'x'" |
"\"x\"" ) >>
':' )
114 >>
edges [ qi::_val &= qi::_1 ])
116 (( qi::lit(
"nbins") |
"'nbins'" |
"\"nbins\"" )
117 >>
":" >>
nbins [qi::_val |= qi::_1])
119 (( qi::lit(
"low") |
"'low'" |
"\"low\"" )
120 >>
":" >>
low [qi::_val -= qi::_1])
122 (( qi::lit(
"high") |
"'high'" |
"\"high\"" )
123 >>
":" >>
high [qi::_val ^= qi::_1])
125 (( qi::lit(
"bins") |
"'bins'" |
"\"bins\"" )
126 >>
':' >> bins [qi::_val += qi::_1])) %
',';
128 begin = enc::char_(
'[')[qi::_val=
']']
129 | enc::char_(
'{')[qi::_val=
'}']
130 | enc::char_(
'(')[qi::_val=
')'];
131 end = enc::char_(qi::_r1);
133 >>
inner[qi::_val = qi::_1]
146 qi::rule<Iterator, H1(), Skipper>
inner;
148 qi::rule<Iterator, void(char)>
end;
153 template<
typename Iterator,
typename Skipper>
154 class H2Grammar :
public qi::grammar<Iterator, H2(), qi::locals<char>,
166 ((( qi::lit(
"name") |
"'name'" |
"\"name\"" )
167 >>
":" >>
name [qi::_val *= qi::_1])
169 (( qi::lit(
"title") |
"'title'" |
"\"title\"" )
170 >>
":" >> title [qi::_val /= qi::_1])
172 (( qi::lit(
"X") |
"'X'" |
"\"X\"" |
"x" |
"'x'" |
"\"x\"" ) >>
':' 173 >>
edges [qi::_val &= qi::_1 ])
175 (( qi::lit(
"Y") |
"'Y'" |
"\"Y\"" |
"y" |
"'y'" |
"\"y\"" ) >>
':' 176 >>
edges [qi::_val |= qi::_1 ])
178 (( qi::lit(
"bins") |
"'bins'" |
"\"bins\"" )
179 >>
':' >> bins [ qi::_val += qi::_1 ])) %
',';
181 begin = enc::char_(
'[')[qi::_val=
']']
182 | enc::char_(
'{')[qi::_val=
'}']
183 | enc::char_(
'(')[qi::_val=
')'];
184 end = enc::char_(qi::_r1);
186 >>
inner[qi::_val = qi::_1]
187 >>
end(qi::_a)) |
inner[qi::_val = qi::_1];
195 qi::rule<Iterator, H2(), Skipper>
inner;
197 qi::rule<Iterator, void(char)>
end;
226 template <
class HISTO1>
237 if ( sc.
isFailure() || !h1.ok() ) {
return H1P() ; }
242 ( h1.m_edges.edges.empty() ?
249 h1.m_title .c_str() ,
250 h1.m_edges.edges.size() -1 ,
251 &h1.m_edges.edges.front() ) ) ;
254 for (
unsigned int ibin = 0 ; ibin < h1.m_bins.size() ; ++ibin )
256 histo -> SetBinContent ( ibin , h1.m_bins[ibin].first ) ;
257 histo -> SetBinError ( ibin , h1.m_bins[ibin].second ) ;
265 template <
class HISTO2>
274 if ( sc.
isFailure() || !h2.ok() ) {
return H2P() ; }
279 ( h2.m_xedges.edges.empty() &&
280 h2.m_yedges.edges.empty() ?
289 h2.m_xedges.edges.empty() && !h2.m_xedges.edges.empty() ?
295 h2.m_yedges.nBins() ,
296 &h2.m_yedges.edges.front() ) :
297 !h2.m_xedges.edges.empty() && h2.m_xedges.edges.empty() ?
300 h2.m_xedges.nBins() ,
301 &h2.m_xedges.edges.front() ,
307 h2.m_xedges.nBins() ,
308 &h2.m_xedges.edges.front() ,
309 h2.m_yedges.nBins() ,
310 &h2.m_yedges.edges.front() ) ) ;
313 const int xBins = h2.m_xedges.nBins() ;
314 const int yBins = h2.m_yedges.nBins() ;
316 for (
int jBin = yBins + 1 ; jBin >= 0 ; --jBin )
318 for (
int iBin = 0 ; iBin <= xBins + 1 ; ++iBin )
320 histo -> SetBinContent ( iBin , jBin , h2.m_bins[ibin].first ) ;
321 histo -> SetBinError ( iBin , jBin , h2.m_bins[ibin].second ) ;
345 auto h1 = _parse_1D<TH1D> ( input ,
name ) ;
349 h1->Copy ( result ) ;
350 result.SetName ( name.
c_str () ) ;
355 return ( std::string::npos != input.find(
'<') )
372 auto h1 = _parse_1D<TH1F> ( input ,
name ) ;
376 h1->Copy ( result ) ;
377 result.SetName ( name.
c_str () ) ;
382 return ( std::string::npos != input.find(
'<') )
398 auto h2 = _parse_2D<TH2D> ( input ,
name ) ;
402 h2->Copy ( result ) ;
403 result.SetName ( name.
c_str () ) ;
408 return ( std::string::npos != input.find(
'<') )
424 auto h2 = _parse_2D<TH2F> ( input ,
name ) ;
428 h2->Copy ( result ) ;
429 result.SetName ( name.
c_str () ) ;
434 if ( std::string::npos != input.find(
'<') )
449 if ( result ) {
return parse ( *result , input ) ; }
453 auto h1 = _parse_1D<TH1D> ( input ,
name ) ;
456 result = h1.release() ;
457 result->SetName ( name.
c_str() ) ;
462 return ( std::string::npos != input.find(
'<') )
476 if ( result ) {
return parse ( *result , input ) ; }
480 auto h2 = _parse_2D<TH2D> ( input ,
name ) ;
483 result = h2.release() ;
484 result->SetName ( name.
c_str() ) ;
489 return ( std::string::npos != input.find(
'<') )
EdgeGrammar< Iterator, Skipper > edges
IntGrammar< Iterator, unsigned int, Skipper > nbins
RealGrammar< Iterator, double, Skipper > low
qi::rule< Iterator, char()> begin
qi::rule< Iterator, void(char)> end
GAUDI_API StatusCode fromXml(TH1D &result, const std::string &input)
parse the histogram from standard ROOT XML
StatusCode parse_(ResultT &result, const std::string &input)
qi::rule< Iterator, H2(), Skipper > inner
REGISTER_GRAMMAR(std::string, StringGrammar)
qi::rule< Iterator, char()> begin
qi::rule< Iterator, H1(), qi::locals< char >, Skipper > result
RealGrammar< Iterator, double, Skipper > low
qi::rule< Iterator, Edges(), qi::locals< char >, Skipper > result
RealGrammar< Iterator, double, Skipper > high
StatusCode parse(GaudiUtils::HashMap< K, V > &result, const std::string &input)
Basic parser for the types of HashMap used in DODBasicMapper.
VectorGrammar< Iterator, std::vector< double >, Skipper > edges
std::vector< double > Edges
qi::rule< Iterator, Edges(), Skipper > inner_pairs
bool isFailure() const
Test for a status code of FAILURE.
StringGrammar< Iterator, Skipper > title
StringGrammar< Iterator, Skipper > title
VectorGrammar< Iterator, std::vector< std::pair< double, double > >, Skipper > bins
This class is used for returning status codes from appropriate routines.
qi::rule< Iterator, Edges(), Skipper > inner
qi::rule< Iterator, H2(), qi::locals< char >, Skipper > result
static TH1D * aida2root(AIDA::IHistogram1D *aida)
get the underlying pointer for 1D-histogram
qi::rule< Iterator, H1(), Skipper > inner
qi::rule< Iterator, void(char)> end
qi::rule< Iterator, void(char)> end
VectorGrammar< Iterator, std::vector< std::pair< double, double > >, Skipper > bins
EdgeGrammar< Iterator, Skipper > edges
Helper functions to set/get the application return code.
IntGrammar< Iterator, unsigned int, Skipper > nbins
qi::rule< Iterator, char()> begin