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++)
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") );
std::ostream & operator<<(std::ostream &out, const Head &h)
Print header.
static void trimstring(std::string &s)
Trim a string in place.
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.
std::string to_string(const T &value)
Convert value to string.
std::istream & getline(std::istream &in, JString &object)
Read string from input stream until end of line.
The Head class reflects the header of Monte-Carlo event files, which consists of keys (also referred ...
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.
Vec translate() const
Get coordinate translation.
bool have_line(std::string key) const
Check availability of data with the given key.
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.
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".
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_line(std::string key)
Get data with the given key.
static const std::map< std::string, std::vector< std::string > > & _hdr_dict()
Get internal description of the known lines in header.
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.
const std::string & get_line(std::string key) const
Get data with the given key.
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.