82                                {
   83 
   86 
   87  string         steeringFile;
   88  
   89  string         file1;
   90  string         file2;
   91  
   92  string         output;
   93  string         ascii;
   94 
   96  
   97  bool           onlyFailures;
   98 
  100 
  102  
  103  try {
  104 
  105    const string& keysExplainer = 
MAKE_STRING(
"Terminal output:" << endl << listOfKeys);
 
  106    
  107    JParser<> zap(
"\nProgram to compare histograms in root files that have the same directory structure. See the link below this usage for further details.\n");
 
  108    
  109    zap[
's'] = 
make_field(steeringFile , 
"ASCII steering file with list of histograms and tests");
 
  110    zap[
'a'] = 
make_field(file1        , 
"input file 1");
 
  111    zap[
'b'] = 
make_field(file2        , 
"input file 2");
 
  112    zap[
'o'] = 
make_field(output       , 
"output file root") = 
"zebramantis.root";
 
  113    zap[
't'] = 
make_field(ascii        , 
"output file txt" ) = 
"zebramantis.txt";
 
  115    zap[
'w'] = 
make_field(onlyFailures , 
"write only failed tests" );
 
  117    
  118    zap(argc,argv);
  119  }
  120  catch(const exception &error) {
  121    ERROR(error.what() << endl);
 
  122  }
  123 
  124  if (keys.empty()) {
  125    keys = listOfKeys;
  126  }
  127  
  128  TFile* 
f1 = TFile::Open(file1.c_str());
 
  129  TFile* f2 = TFile::Open(file2.c_str());
  130  
  131  TFile out(output.c_str(),"recreate");
  132 
  133  ofstream results;
  134  results.open (ascii);
  135  results << "# " << listOfKeys << endl;
  136 
  138 
  139  std::ifstream infile(steeringFile);
  140 
  142 
  143  size_t npassed = 0;
  144  size_t nfailed = 0;
  145    
  146  for (
string line; 
getline(infile, line); ) {
 
  147      
  148    istringstream iss(line);
  149 
  150    TString       name;
  151    int           testID;
  152    
  153    if (!(iss >> name >> testID)) {
  154      continue;
  155    }
  156 
  157    DEBUG(
"Input: " << name << 
' ' << testID << endl);
 
  158    
  159    const TRegexp regexp(name); 
  160    
  161    for (vector<JRootObjectID>::const_iterator objectID = objectIDs.cbegin() ; objectID != objectIDs.cend() ; ++objectID) {
  162 
  163      const TString& dirName  = objectID->getDirectory();
  164      const TString& fullName = objectID->getFullObjectName();
  165 
  166      DEBUG(
"Key: " << fullName << 
" match = " << fullName.Contains(regexp) << endl);
 
  167      
  168      if ((fullName.Index(regexp) != -1)) {
  169 
  172 
  173        if (!obj1 || !obj2) {
  174          DEBUG(
"Could not retrieve " << fullName << endl);
 
  175          continue;
  176        }
  177 
  178        d[testID]->read(iss);
  179        d[testID]->test(obj1,obj2);
  180 
  181        if (dirName.Length() > 0 && !out.GetDirectory(dirName)) {
  182          
  183          if (dirName[0] == JRootObjectID::PATHNAME_SEPARATOR) { 
  184            out.mkdir(TString(dirName(1, dirName.Length() - 1))); 
  185          } else {
  186            out.mkdir(dirName);
  187          }
  188        }
  189 
  190        out.cd(dirName);
  191        
  193 
  194          if (onlyFailures && r->passed) {
  195            continue;
  196          }
  197 
  198          print(cout,    *r, keys.cbegin(),       keys.cend(),       
' ', 
false);
 
  199          print(results, *r, listOfKeys.cbegin(), listOfKeys.cend(), 
' ', 
true);
 
  200 
  201          r->obj->Write();
  202        }
  203 
  204        const size_t Npass = count_if(d[testID]->cbegin(), d[testID]->cend(),
  205                                      make_predicate(&JTestResult::passed, true));
  206        
  207        npassed += Npass;
  208        nfailed += (d[testID]->size() - Npass);
  209 
  210        d[testID]->clear();
  211      }
  212    }
  213  }
  214    
  215  infile.close();
  216 
  217  results << WHITE << "# PASSED: " << npassed << " " << " FAILED: " << nfailed << " FAILURE FRACTION: " << float (nfailed)/(nfailed+npassed) << endl;
  218 
  220  JMeta::copy(file1.c_str(), out);
  221  JMeta::copy(file2.c_str(), out);
  222 
  223  results.close();
  224  out    .Close();
  225  
  226  return 0; 
  227}
#define DEBUG(A)
Message macros.
 
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
 
void readDir(TDirectory *dir, std::vector< TString > &v)
 
#define MAKE_STRING(A)
Make string.
 
void print(const TH1 &h1, std::ostream &out)
Print histogram parameters.
 
Dictionary to map different tests to unique integer indices.
 
Class dedicated to standardize the title of the graphical objects produced by the JTest_t() derived c...
 
Utility class to parse command line options.
 
const JPolynome f1(1.0, 2.0, 3.0)
Function.
 
std::istream & getline(std::istream &in, JString &object)
Read string from input stream until end of line.
 
const array_type< JKey_t > & get_keys(const std::map< JKey_t, JValue_t, JComparator_t, JAllocator_t > &data)
Method to create array of keys of map.
 
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
 
bool putObject(TDirectory &dir, const TObject &object)
Write object to ROOT directory.
 
Auxiliary data structure for return type of make methods.
 
Empty structure for specification of parser element that is initialised (i.e. does not require input)...