Jpp  18.3.0
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Functions
JDiffPDF.cc File Reference

Auxiliary program to compare PDF tables of the arrival time of the Cherenkov light from a muon. More...

#include <string>
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cmath>
#include <algorithm>
#include "JTools/JFunction1D_t.hh"
#include "JTools/JFunctionalMap_t.hh"
#include "JPhysics/JPDFTable.hh"
#include "Jeep/JParser.hh"
#include "Jeep/JMessage.hh"

Go to the source code of this file.

Functions

int main (int argc, char **argv)
 

Detailed Description

Auxiliary program to compare PDF tables of the arrival time of the Cherenkov light from a muon.

Author
mdejong

Definition in file JDiffPDF.cc.

Function Documentation

int main ( int  argc,
char **  argv 
)

Definition at line 39 of file JDiffPDF.cc.

40 {
41  using namespace std;
42  using namespace JPP;
43 
44  string inputFileA;
45  string inputFileB;
46  double precision;
47  int debug;
48 
49  try {
50 
51  JParser<> zap("Auxiliary program to compare PDF tables of the arrival time of the Cherenkov light from a muon.");
52 
53  zap['a'] = make_field(inputFileA);
54  zap['b'] = make_field(inputFileB);
55  zap['p'] = make_field(precision) = 1.0e-6;
56  zap['d'] = make_field(debug) = 0;
57 
58  zap(argc, argv);
59  }
60  catch(const exception &error) {
61  FATAL(error.what() << endl);
62  }
63 
64  typedef JSplineFunction1D_t JFunction1D_t;
65  typedef JMAPLIST<JPolint1FunctionalMap,
66  JPolint1FunctionalGridMap,
67  JPolint1FunctionalGridMap>::maplist JMapList_t;
68  typedef JPDFTable<JFunction1D_t, JMapList_t> JPDF_t;
69 
70  typedef JFunction1D_t::argument_type argument_type;
71  typedef JArray<3, argument_type> JArray_t;
72 
73  JPDF_t pdfA;
74  JPDF_t pdfB;
75 
76  const JFunction1D_t::JSupervisor supervisor(new JFunction1D_t::JDefaultResult(0.0));
77 
78  struct pair_type {
79  const string file_name;
80  JPDF_t& pdf;
81  } buffer[] = {
82  { inputFileA, pdfA },
83  { inputFileB, pdfB }
84  };
85 
86  for (const pair_type& i : buffer) {
87 
88  try {
89 
90  NOTICE("loading input from file " << i.file_name << "... " << flush);
91 
92  i.pdf.load(i.file_name.c_str());
93  i.pdf.compile();
94  i.pdf.setExceptionHandler(supervisor);
95 
96  NOTICE("OK" << endl);
97  }
98  catch(const JException& error) {
99  FATAL(error.what() << endl);
100  }
101  }
102 
103  bool ok = true;
104 
105  JPDF_t::super_const_iterator i = pdfA.super_begin();
106  JPDF_t::super_const_iterator j = pdfB.super_begin();
107 
108  for ( ; i != pdfA.super_end() &&
109  j != pdfB.super_end(); ++i, ++j) {
110 
111  const double Wa = pdfA.transformer->getWeight(JArray_t((*i).getKey()));
112  const double Wb = pdfB.transformer->getWeight(JArray_t((*j).getKey()));
113 
114  if (fabs(i->first - j->first) > precision ||
115  fabs(i->second->first - j->second->first) > precision ||
116  fabs(i->second->second->first - j->second->second->first) > precision ||
117  fabs(Wa - Wb) > precision) {
118 
119  DEBUG("a[] "
120  << i->first << ' '
121  << i->second->first << ' '
122  << i->second->second->first << ' '
123  << Wa << endl);
124 
125  DEBUG("b[] "
126  << j->first << ' '
127  << j->second->first << ' '
128  << j->second->second->first << ' '
129  << Wb << endl);
130 
131  ok = false;
132  }
133 
134  const JFunction1D_t& fa = (*i).getValue();
135  const JFunction1D_t& fb = (*j).getValue();
136 
137  JFunction1D_t::const_iterator p = fa.begin();
138  JFunction1D_t::const_iterator q = fb.begin();
139 
140  while (p != fa.end() &&
141  q != fb.end()) {
142 
143  if (fabs(p->getX() - q->getX()) > precision) {
144 
145  DEBUG("a.x " << p->getX() << endl);
146  DEBUG("b.x " << q->getX() << endl);
147 
148  ok = false;
149  }
150 
151  if (!compare(p->getY(), q->getY(), precision)) {
152 
153  DEBUG("a.y " << p->getX() << ' ' << p->getY() << endl);
154  DEBUG("b.y " << q->getX() << ' ' << q->getY() << endl);
155 
156  ok = false;
157  }
158 
159  if (p->getX() < q->getX())
160  ++p;
161  else if (q->getX() < p->getX())
162  ++q;
163  else {
164  ++p;
165  ++q;
166  }
167  }
168 
169  for ( ; p != fa.end(); ++p) {
170 
171  DEBUG("a.x " << p->getX() << endl);
172 
173  ok = false;
174  }
175 
176  for ( ; q != fb.end(); ++q) {
177 
178  DEBUG("b.x " << q->getX() << endl);
179 
180  ok = false;
181  }
182  }
183 
184  for ( ; i != pdfA.super_end(); ++i) {
185 
186  DEBUG("a[] "
187  << i->first << ' '
188  << i->second->first << ' '
189  << i->second->second->first << endl);
190 
191  ok = false;
192  }
193 
194  for ( ; j != pdfB.super_end(); ++j) {
195 
196  DEBUG("b[] "
197  << j->first << ' '
198  << j->second->first << ' '
199  << j->second->second->first << endl);
200 
201  ok = false;
202  }
203 
204  if (!ok) {
205  ERROR(inputFileA << " and " << inputFileB << " differ." << endl);
206  }
207 
208  return (ok ? 0 : 1);
209 }
Utility class to parse command line options.
Definition: JParser.hh:1514
JCombinatorics::pair_type pair_type
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1989
#define NOTICE(A)
Definition: JMessage.hh:64
#define ERROR(A)
Definition: JMessage.hh:66
#define FATAL(A)
Definition: JMessage.hh:67
int j
Definition: JPolint.hh:792
int debug
debug level
#define DEBUG(A)
Message macros.
Definition: JMessage.hh:62