33 void SkipEmptyLines(std::istream &input);
34 void SkipWSCharacters(std::istream &input);
35 bool NextCharacterIsEOL(std::istream &input);
59 template<
class>
struct InvalidTupleType;
62 struct InvalidTupleType<TNtuple>
70 struct InvalidTupleType<TNtupleD>
79 template<
class DataType,
class Tuple>
80 Long64_t FillNtupleFromStream(std::istream &inputStream, Tuple &tuple,
char delimiter,
bool strictMode)
82 InvalidTupleType<Tuple> typeChecker;
84 if (delimiter ==
'\r' || delimiter ==
'\n') {
85 ::Error(
"FillNtupleFromStream",
"invalid delimiter - newline character");
89 if (delimiter ==
'#') {
90 ::Error(
"FillNtuplesFromStream",
"invalid delimiter, '#' symbols can only start a comment");
94 const Int_t nVars = tuple.GetNvar();
96 ::Error(
"FillNtupleFromStream",
"invalid number of elements");
100 DataType *args = tuple.GetArgs();
101 assert(args != 0 &&
"FillNtupleFromStream, args buffer is a null");
109 SkipEmptyLines(inputStream);
111 if (!inputStream.good()) {
113 ::Error(
"FillNtupleFromStream",
"no data read");
118 for (Int_t i = 0; i < nVars; ++i) {
119 SkipWSCharacters(inputStream);
120 if (!inputStream.good()) {
121 ::Error(
"FillNtupleFromStream",
"failed to read a tuple (not enough values found)");
125 if (i > 0 && !std::isspace(delimiter)) {
126 const char test = inputStream.peek();
127 if (!inputStream.good() || test != delimiter) {
128 ::Error(
"FillNtupleFromStream",
"delimiter expected");
133 SkipWSCharacters(inputStream);
136 if (NextCharacterIsEOL(inputStream)) {
138 ::Error(
"FillNtupleFromStream",
"unexpected character or eof found");
142 inputStream>>args[i];
144 if (!(inputStream.eof() && i + 1 == nVars) && !inputStream.good()){
145 ::Error(
"FillNtupleFromStream",
"error while reading a value");
150 SkipWSCharacters(inputStream);
151 if (!NextCharacterIsEOL(inputStream)) {
152 ::Error(
"FillNtupleFromStream",
153 "only whitespace and new line can follow the last number on the line");
159 static_cast<TTree &
>(tuple).Fill();
168 SkipEmptyLines(inputStream);
170 if (!inputStream.good()) {
173 ::Error(
"FillNtupleFromStream",
"no data read");
175 ::Error(
"FillNtupleFromStream",
"unexpected character or eof found");
179 if (i > 0 && !std::isspace(delimiter)) {
181 const char test = inputStream.peek();
182 if (!inputStream.good() || test != delimiter) {
183 ::Error(
"FillNtupleFromStream",
"delimiter expected (non-strict mode)");
188 SkipEmptyLines(inputStream);
192 inputStream>>args[i];
194 if (!(inputStream.eof() && i + 1 == nVars) && !inputStream.good()){
195 ::Error(
"FillNtupleFromStream",
"error while reading a value");
199 if (i + 1 == nVars) {
201 static_cast<TTree &
>(tuple).Fill();
212 template Long64_t FillNtupleFromStream<Float_t, TNtuple>(std::istream &, TNtuple &, char, bool);
213 template Long64_t FillNtupleFromStream<Double_t, TNtupleD>(std::istream &, TNtupleD &, char, bool);
240 void SkipComment(std::istream &input)
242 while (input.good()) {
243 const char next = input.peek();
246 if (next ==
'\r' || next ==
'\n')
259 void SkipEmptyLines(std::istream &input)
261 while (input.good()) {
262 const char c = input.peek();
268 else if (!std::isspace(c))
280 void SkipWSCharacters(std::istream &input)
282 while (input.good()) {
283 const char next = input.peek();
285 if (std::isspace(next) && next !=
'\n' && next !=
'\r')
298 bool NextCharacterIsEOL(std::istream &input)
303 const char next = input.peek();
307 return next ==
'\r' || next ==
'\n';