35   struct JParameters_t {
 
   37     static const char SKIPLINE  =  
'#';           
 
   43       number_of_entries (0),
 
   44       number_of_outliers(0),
 
   45       range(JRange<double>::DEFAULT_RANGE)
 
   56     friend inline std::istream& 
operator>>(std::istream& in, JParameters_t& 
object)
 
   58       return in >> 
object.number_of_entries >> 
object.number_of_outliers >> 
object.range;
 
   69     friend inline std::ostream& 
operator<<(std::ostream& out, 
const JParameters_t& 
object)
 
   74       return out << setw(5)     << 
object.number_of_entries     << 
' ' 
   75                  << setw(3)     << 
object.number_of_outliers    << 
' ' 
   76                  << 
FIXED(15,3) << 
object.range.getLowerLimit() << 
' ' 
   77                  << 
FIXED(15,3) << 
object.range.getUpperLimit();
 
   80     int  number_of_entries;
 
   81     int  number_of_outliers;
 
   93 int main(
int argc, 
char **argv)
 
   98   JRootObjectID  inputFile;
 
   99   string         parametersFile;
 
  106     JParser<> zap(
"Auxiliary program to apply test criteria to file.");
 
  108     zap[
'f'] = 
make_field(inputFile,         
"<input file>:<object name>");
 
  109     zap[
'P'] = 
make_field(parametersFile,    
"ASCII formatted input file with test criteria");
 
  116   catch(
const exception &error) {
 
  117     FATAL(error.what() << endl);
 
  125   ifstream in(parametersFile.c_str());
 
  130     JParameters_t parameters;
 
  132     for (
string buffer; 
getline(in, buffer); ) {
 
  134       if (!buffer.empty() && buffer[0] != JParameters_t::SKIPLINE) {
 
  136         istringstream is(buffer);
 
  138         if (is >> key >> parameters) {
 
  139           zmap[key] = parameters;
 
  147     FATAL(
"Error opening file: " << parametersFile << endl);
 
  151     for (map_type::const_iterator i = zmap.begin(); i != zmap.end(); ++i) {
 
  152       cout << setw(48) << left << i->first << 
' ' << i->second << endl; 
 
  160     FATAL(
"File: " << inputFile.getFullFilename() << 
" not opened." << endl);
 
  166   cout.imbue(locale(cout.getloc(), 
color_facets[facet]->clone()));
 
  169   int number_of_tests    = 0;
 
  170   int number_of_failures = 0;
 
  172   const TRegexp regexp(inputFile.getObjectName());
 
  174   TIter iter(dir->GetListOfKeys());
 
  176   for (TKey* key; (key = (TKey*) iter.Next()) != NULL; ) {
 
  178     const TString tag(key->GetName());
 
  180     DEBUG(
"Key: " << tag << 
" match = " << tag.Contains(regexp) << endl);
 
  184     if (tag.Contains(regexp)) {
 
  186       TGraph* 
g1 = dynamic_cast<TGraph*>(key->ReadObj());
 
  190         map_type::const_iterator p = zmap.find(
g1->GetName());
 
  192         if (p != zmap.end()) {
 
  194           const JParameters_t& parameters = p->second;
 
  196           const int N = 
g1->GetN();
 
  198           bool status = (N >= parameters.number_of_entries);
 
  200           int number_of_outliers = 0;
 
  202           for (
int i = 0; i != 
g1->GetN(); ++i) {
 
  203             if (!parameters.range(
g1->GetY()[i])) {
 
  204               ++number_of_outliers;
 
  208           status = status && (number_of_outliers <= parameters.number_of_outliers);
 
  210           cout << (status ? 
GREEN : 
RED) << 
"Test " << 
g1->GetName() << 
" " << (status ? 
"passed" : 
"failed") << 
"." << 
RESET << endl;
 
  212           if (out != NULL && !status) {
 
  214             const JRange<double> range(
g1->GetX(), 
g1->GetX() + 
g1->GetN());
 
  216             g1->GetListOfFunctions()->Add(
new TF1(
MAKE_CSTRING(
g1->GetName() << 
":upper"), 
MAKE_CSTRING(parameters.range.getUpperLimit()), range.getLowerLimit(), range.getUpperLimit()));
 
  217             g1->GetListOfFunctions()->Add(
new TF1(
MAKE_CSTRING(
g1->GetName() << 
":lower"), 
MAKE_CSTRING(parameters.range.getLowerLimit()), range.getLowerLimit(), range.getUpperLimit()));
 
  218             out->WriteTObject(
g1);
 
  221           number_of_tests    +=  1;
 
  222           number_of_failures += (status ? 0 : 1);
 
  228   cout << (number_of_tests > 0 && number_of_failures == 0 ? 
GREEN : 
RED) << 
"Number of tests/failures " << number_of_tests << 
"/" << number_of_failures << 
RESET << endl;