5#ifndef LArBadChannelParser_H
6#define LArBadChannelParser_H
8#include "GaudiKernel/MsgStream.h"
20 const std::string& filename, MsgStream*
const log,
21 unsigned int numInts,
int numStrings,
unsigned int firstWildcard = 0);
45 std::vector< std::pair<std::vector<int>, std::vector<T> > >
parseFile();
52 std::vector<int>
getIdFields(
const std::vector<std::string>& words);
53 std::vector<std::string>
parseLine(std::string& line)
const;
56 bool stringToNumber(T& theNumber,
const std::string& theStr)
const;
59 bool convertStrings(std::vector<T>&
result,
const std::vector<std::string>::const_iterator begin,
60 const std::vector<std::string>::const_iterator end)
const;
82 typedef std::pair< std::vector<int>, std::vector<T> > LineData;
83 std::vector<LineData>
result;
87 (*m_log) << MSG::ERROR <<
"LArBadChannelParser - Could not open file: " <<
m_filename <<
endmsg;
94 std::getline(
m_fin, line);
98 std::vector<std::string> input =
parseLine(line);
102 if(input.size() != 0)
103 {(*m_log) << MSG::WARNING <<
"LArBadChannelParser REJECTED line " <<
m_linenumber \
104 <<
" -\t not enough parameters given: " << input.size() <<
endmsg;}
111 if(parsedData.first.size() == 0)
114 const std::vector<std::string>::const_iterator start = input.begin() +
m_numInts;
115 const std::vector<std::string>::const_iterator stop = \
116 (m_numStrings < 0) ? static_cast<const std::vector<std::string>::const_iterator>(input.end()) : (start +
m_numStrings);
124 if(stop < input.end())
125 (*
m_log) << MSG::WARNING <<
"LArBadChannelParser IGNORED unexpected input on line " <<
m_linenumber <<
"." <<
endmsg;
127 result.push_back(std::move(parsedData));
143 const std::vector<std::string>::const_iterator begin,
const std::vector<std::string>::const_iterator end)
const
146 result.reserve(
static_cast<unsigned int>(end - begin));
147 for(std::vector<std::string>::const_iterator iter = begin; iter != end; ++iter)
151 result.push_back(element);
154 (*m_log) << MSG::WARNING <<
"LArBadChannelParser REJECTED line " <<
m_linenumber \
155 <<
" -\t failed to extract status." <<
endmsg;
165 const std::vector<std::string>::const_iterator begin,
const std::vector<std::string>::const_iterator end)
const
167 result.assign(begin, end);
175 std::istringstream iss(theString);
177 return !(iss >> std::dec >> theNumber).fail();
std::vector< int > getIdFields(const std::vector< std::string > &words)
const unsigned int m_firstWildcard
bool fileStatusGood() const
You can use this function to check whether file-reading will succeed.
std::vector< std::string > parseLine(std::string &line) const
LArBadChannelParser(const std::string &filename, MsgStream *const log, unsigned int numInts, int numStrings, unsigned int firstWildcard=0)
A parser object must be initialized with the filename that it is to parse.
virtual ~LArBadChannelParser()
bool stringToNumber(T &theNumber, const std::string &theStr) const
const unsigned int m_numInts
unsigned int m_linenumber
const std::string m_filename
bool convertStrings(std::vector< T > &result, const std::vector< std::string >::const_iterator begin, const std::vector< std::string >::const_iterator end) const
std::vector< std::pair< std::vector< int >, std::vector< T > > > parseFile()
Parse the file using the following format for each line: First, exactly numInts integers are required...