38 return object.ReadLine(in);
50 return out <<
object.Data();
63 inline TString
replace(
const TString& target,
const TRegexp& regexp,
const T& replacement)
68 TString buffer = target;
70 if ((pos = buffer.Index(regexp, &len)) != -1) {
72 TSubString substr = buffer(pos, len);
74 TString format(substr.Data(), substr.Length());
76 format.ReplaceAll(
"T",
"s");
78 buffer.Replace(pos, len, TString::Format(format.Data(), replacement));
95 int main(
int argc,
char **argv)
107 JParser<> zap(
"Auxiliary program to print result from ROOT objects."\
108 "\nNote that the formula may contain method names of the specified object.");
110 zap[
'f'] =
make_field(inputFile,
"<input file>:<object name>");
112 zap[
'O'] =
make_field(option,
"format, e.g. \"%s %T %f\","\
113 "\nwhere '%s', '%T' and '%f' will be replaced by name, title and value(s) from formula(s), respectively") =
"";
118 catch(
const exception &error) {
119 FATAL(error.what() << endl);
123 const TRegexp STRING(
"%[+-]?[0-9]*s");
124 const TRegexp TITLE (
"%[+-]?[0-9]*T");
125 const TRegexp DOUBLE(
"%[+-]?[0-9]*\\.?[0-9]*f");
130 DEBUG(
"Input: " << *input << endl);
135 ERROR(
"File: " << input->getFullFilename() <<
" not opened." << endl);
139 const TRegexp regexp(input->getObjectName());
141 TIter iter(dir->GetListOfKeys());
143 for (TKey* key; (key = (TKey*) iter.Next()) != NULL; ) {
145 const TString tag(key->GetName());
147 DEBUG(
"Key: " << tag <<
" match = " << tag.Contains(regexp) << endl);
151 if (tag.Contains(regexp) &&
isTObject(key)) {
153 TObject*
object = key->ReadObj();
159 TString buffer = option;
161 buffer =
replace(buffer, STRING, object->GetName());
162 buffer =
replace(buffer, TITLE, object->GetTitle());
166 const double value =
getResult(*i,
object);
168 if (buffer.Contains(DOUBLE)){
170 buffer =
replace(buffer, DOUBLE, value);
174 if (i != formula.begin()) {
178 buffer.Append(TString::Format(
"%20.10e", value));
181 cout << buffer << endl;
General purpose messaging.
#define DEBUG(A)
Message macros.
Utility class to parse command line options.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
std::istream & operator>>(std::istream &in, JFormula &object)
Read formula from input stream.
int main(int argc, char **argv)
TString replace(const TString &target, const TRegexp ®exp, const T &replacement)
Replace regular expression in input by given replacement.
std::ostream & operator<<(std::ostream &out, const JFormula &object)
Write formula to output stream.
I/O formatting auxiliaries.
Utility class to parse command line options.
TDirectory * getDirectory(const JRootObjectID &id)
Get TDirectory pointer.
bool isTObject(const TKey *key)
Check if given key corresponds to a TObject.
Double_t getResult(const TString &text, TObject *object=NULL)
Get result of given textual formula.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Auxiliary data structure for floating point format specification.