1#ifndef HEAD_HH_INCLUDED 
    2#define HEAD_HH_INCLUDED 
   25  s.erase( s.begin(), std::find_if(s.begin(), s.end(), [](
int ch) {
 
   26    return !std::isspace(ch);
 
   30  s.erase(std::find_if(s.rbegin(), s.rend(), [](
int ch) {
 
   31    return !std::isspace(ch);
 
 
   51  while (getline(ss, token, delim))
 
   54    if (token != 
"") r.push_back(token);
 
 
   67    static constexpr const char* 
const UUID = 
"UUID";
 
 
   79    return count( key ) != 0;
 
 
   89  const std::string& 
get_line( std::string key )
 const 
 
  103    return this->at(key);
 
 
  119    auto match = [&] (
const std::string & key) {
 
  121      if (key == tag) 
return true;
 
  123      if ( key.find( tag ) != 0 ) 
return false;
 
  126      std::string left = key.substr( tag.length(), key.length() );
 
  127      if (left.length() < 2 || left[0] != 
'_' ) 
return false ;
 
  128      for ( 
unsigned i = 1; i < left.length(); i++ )
 
  130        if (!std::isdigit( left[i] )) 
return false ;
 
  135    for ( 
auto& p : *
this )
 
  137      if ( match( p.first ) ) r.push_back( p.first );
 
 
  176  std::string 
set_line( std::string tag, std::string line , 
bool ensure_unique = 
true )
 
  181      for (
int i = 1; find(k) != end() ; i++)
 
  183        k = tag + 
"_" + std::to_string(i);
 
 
  204    if ( idx < 0 || idx >= 
int ( v.size() ) )
 
  206      THROW(
Exception, 
"Cannot find word number " << idx << 
" in line " << 
get_line(key) << 
" for key: " << key);
 
 
  223    if ( d.count(key) == 0 ) 
return -1;
 
  225    auto i = std::find (v.begin(), v.end(), field );
 
  226    if (i == v.end()) 
return -1;
 
  227    return i - v.begin();
 
 
  240  std::string 
get_field( std::string key, std::string field )
 const 
 
  263  void set_field( std::string key, std::string field, std::string value )
 
  267    if ( field == 
"" ) 
get_line( key ) = value;
 
  273      THROW(
Exception, 
"GFailed to find field in header line: " << key << 
" " << field);
 
  279    while ( 
int( vals.size() ) <= idx ) vals.push_back(
"0");
 
  284    for (
unsigned i = 0; i < vals.size() ; i++ )
 
  287      if ( i != vals.size() - 1) ss << 
" ";
 
 
  298  void print ( std::ostream& out = std::cout )
 const 
  300    if (count(
"start_run")) out << 
"start_run: " << at(
"start_run") << std::endl;
 
  302    for ( 
auto& p : *
this )
 
  304      if ( p.first == 
"start_run" || p.first == 
"end_event" ) 
continue;
 
  305      out << p.first << 
": " << p.second << std::endl ;
 
  307    out << 
"end_event:" << std::endl;
 
 
  322    if ( r.size() > 0 ) 
return r;
 
  326      "cut_primary cut_seamuon cut_in cut_nu:Emin Emax cosTmin cosTmax\n" 
  327      "generator physics simul:program version date time\n" 
  328      "seed:program level iseed\n" 
  329      "PM1_type_area:type area TTS\n" 
  331      "model:interaction muon scattering numberOfEnergyBins\n" 
  333      "genvol:zmin zmax r volume numberOfEvents\n" 
  335      "coord_origin:x y z\n" 
  337      "genhencut:gDir Emin\n" 
  340      "norma:primaryFlux numberOfPrimaries\n" 
  341      "livetime:numberOfSeconds errorOfSeconds\n" 
  342      "flux:type key file_1 file_2\n" 
  344      "fixedcan:xcenter ycenter zmin zmax radius\n" 
 
  368    return stod ( 
get_field(
"genvol", 
"numberOfEvents") );
 
 
  378    return stod ( 
get_field(
"DAQ", 
"livetime") );
 
 
  389    return stod ( 
get_field(
"livetime", 
"numberOfSeconds") );
 
 
 
static void trimstring(std::string &s)
Trim a string in place.
 
std::ostream & operator<<(std::ostream &out, const Head &h)
Print header.
 
std::vector< std::string > splitstring(const std::string &str, char delim=' ')
Split string at delimiter.
 
#define THROW(JException_t, A)
Marco for throwing exception with std::ostream compatible message.
 
The Head class reflects the header of Monte-Carlo event files, which consists of keys (also referred ...
 
std::string & get_line(std::string key)
Get data with the given key.
 
static int ROOT_IO_VERSION
Streamer version as obtained from ROOT file.
 
void set_field(std::string key, std::string field, std::string value)
Set data with the given key at given field.
 
double mc_livetime() const
Get the Monte Carlo live time.
 
Vec coord_origin() const
Get coordinate origin.
 
static const std::map< std::string, std::vector< std::string > > & _hdr_dict()
Get internal description of the known lines in header.
 
const std::string & get_line(std::string key) const
Get data with the given key.
 
Vec translate() const
Get coordinate translation.
 
bool have_line(std::string key) const
Check availability of data with the given key.
 
std::vector< std::string > matching_keys(const std::string &tag) const
In case of duplicate keys, they are internally stored in the map with a suffix "_n".
 
double ngen() const
Get the number of generated events needed for computing event rates.
 
std::string set_line(std::string tag, std::string line, bool ensure_unique=true)
Set data with the given tag.
 
static void actionAtFileOpen(int version)
Action method at file open.
 
double daq_livetime() const
Get the the live time provided by the DAQ sytstem (=number of processed timeslices * frametime).
 
std::string get_field(std::string key, std::string field) const
Get data with the given key at given field.
 
int get_index_of_field(std::string key, std::string field) const
Get index of data with the given key at given field.
 
void print(std::ostream &out=std::cout) const
Print header.
 
std::vector< std::string > get_lines(const std::string &tag) const
Get all data compatible with the given key.
 
std::string get_field(std::string key, int idx) const
Get data with the given key at given index.
 
The Vec class is a straightforward 3-d vector, which also works in pyroot.