45{
   48 
   50  
   53  bool                  reuse;
   55  TString               formula;
   56  bool                  reverse;
   58 
   59  try {
   60 
   61    JParser<> zap(
"Auxiliary program to histogram bin-by-bin deviations of a set of 2D histograms.");
 
   62 
   63    zap[
'f'] = 
make_field(inputFile,  
"<input file>:<object name>");
 
   64    zap[
'o'] = 
make_field(
outputFile, 
"ROOT file with histogram (possibly I/O, option -r)")       = 
"variance.root";
 
   65    zap[
'r'] = 
make_field(reuse,      
"reuse histogram from existing output file");
 
   67    zap[
'F'] = 
make_field(formula,    
"ROOT TFormula (may contain method names of object)")       = 
"0";
 
   68    zap[
'R'] = 
make_field(reverse,    
"reverse sign");
 
   70 
   71    zap(argc, argv);
   72  }
   73  catch(const exception &error) {
   74    FATAL(error.what() << endl);
 
   75  }
   76 
   77 
   79 
   80  for (vector<JRootObjectID>::const_iterator input = inputFile.begin(); input != inputFile.end(); ++input) {
   81 
   82    TH2* h2 = 
dynamic_cast<TH2*
>(
getObject(*input));
 
   83 
   84    if (h2 != NULL) {
   85      listOfHistograms.push_back(h2);
   86    }
   87  }
   88 
   89  if (listOfHistograms.empty()) {
   90    FATAL(
"No histograms." << endl);
 
   91  }
   92 
   93  if (formula == "") {
   94    FATAL(
"Empty formula." << endl);
 
   95  }
   96 
   97  TH1* h0 = NULL;
   98 
   99  if (reuse) {
  101  }
  102 
  103  if (h0 == NULL) {
  104    h0 = new TH1D("h0", NULL,
  106  }
  107 
  108 
  109  TH2* h2 = listOfHistograms[0];
  110 
  111  if (listOfHistograms.size() == 1) {
  112 
  113    const double y1 = 
getResult(formula, h2);
 
  114 
  115    DEBUG(h2->GetName() << 
' ' << formula << 
' ' << y1 << endl);
 
  116 
  117    for (Int_t ix = 1; ix <= h2->GetNbinsX(); ++ix) {
  118      for (Int_t iy = 1; iy <= h2->GetNbinsY(); ++iy) {
  119 
  120        const Double_t yp = h2->GetBinContent(ix,iy); 
  121 
  122        h0->Fill(reverse ? y1 - yp : yp - y1);
  123      }
  124    }
  125 
  126  } else {
  127 
  128    if (formula == first_t) {
  129 
  130      for (Int_t ix = 1; ix <= h2->GetNbinsX(); ++ix) {
  131        for (Int_t iy = 1; iy <= h2->GetNbinsY(); ++iy) {
  132 
  133          const double y1 = h2->GetBinContent(ix,iy);
  134        
  135          for (vector<TH2*>::const_iterator p = listOfHistograms.begin(); ++p != listOfHistograms.end(); ) {
  136          
  137            const Double_t yp = (*p)->GetBinContent(ix,iy);
  138          
  139            h0->Fill(reverse ? y1 - yp : yp - y1);
  140          }
  141        }
  142      }
  143 
  144    } else {
  145 
  147 
  148      for (Int_t ix = 1; ix <= h2->GetNbinsX(); ++ix) {
  149        for (Int_t iy = 1; iy <= h2->GetNbinsY(); ++iy) {
  150 
  151          for (vector<TH2*>::const_iterator p = listOfHistograms.begin(); p != listOfHistograms.end(); ++p) {
  152          
  153            const Double_t yp = (*p)->GetBinContent(ix,iy);
  154 
  155            h0->Fill(reverse ? y1 - yp : yp - y1);
  156          }
  157        }
  158      }
  159    }
  160  }
  161 
  162 
  164    
  165  h0->Write();
  166    
  167  out.Write();
  168  out.Close();
  169}
#define DEBUG(A)
Message macros.
 
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
 
Auxiliary class to handle file name, ROOT directory and object name.
 
Utility class to parse command line options.
 
Double_t getResult(const TString &text, TObject *object=NULL)
Get result of given textual formula.
 
TObject * getObject(const JRootObjectID &id)
Get first TObject with given identifier.
 
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).