40{
43
44 string inputFileA;
45 string inputFileB;
46 double precision;
48
49 try {
50
51 JParser<> zap(
"Auxiliary program to compare PDF tables of the arrival time of the Cherenkov light from a bright point.");
52
57
58 zap(argc, argv);
59 }
60 catch(const exception &error) {
61 FATAL(error.what() << endl);
62 }
63
68
69 typedef JFunction1D_t::argument_type argument_type;
71
72 JPDF_t pdfA;
73 JPDF_t pdfB;
74
75 const JFunction1D_t::JSupervisor supervisor(new JFunction1D_t::JDefaultResult(0.0));
76
78 const string file_name;
79 JPDF_t& pdf;
80 } buffer[] = {
81 { inputFileA, pdfA },
82 { inputFileB, pdfB }
83 };
84
86
87 try {
88
89 NOTICE(
"loading input from file " << i.file_name <<
"... " << flush);
90
91 i.pdf.load(i.file_name.c_str());
92 i.pdf.compile();
93 i.pdf.setExceptionHandler(supervisor);
94
96 }
99 }
100 }
101
102 bool ok = true;
103
104 JPDF_t::super_const_iterator i = pdfA.super_begin();
105 JPDF_t::super_const_iterator
j = pdfB.super_begin();
106
107 for ( ; i != pdfA.super_end() &&
108 j != pdfB.super_end(); ++i, ++j) {
109
110 const double Wa = pdfA.transformer->getWeight(JArray_t((*i).getKey()));
111 const double Wb = pdfB.transformer->getWeight(JArray_t((*j).getKey()));
112
113 if (fabs(i->first -
j->first) > precision ||
114 fabs(i->second->first -
j->second->first) > precision ||
115 fabs(Wa - Wb) > precision) {
116
118 << i->first << ' '
119 << i->second->first << ' '
120 << Wa << endl);
121
124 <<
j->second->first <<
' '
125 << Wb << endl);
126
127 ok = false;
128 }
129
130 const JFunction1D_t& fa = (*i).getValue();
131 const JFunction1D_t& fb = (*j).getValue();
132
133 JFunction1D_t::const_iterator p = fa.begin();
134 JFunction1D_t::const_iterator q = fb.begin();
135
136 while (p != fa.end() &&
137 q != fb.end()) {
138
139 if (fabs(p->getX() - q->getX()) > precision) {
140
141 DEBUG(
"a.x " << p->getX() << endl);
142 DEBUG(
"b.x " << q->getX() << endl);
143
144 ok = false;
145 }
146
147 if (!compare(p->getY(), q->getY(), precision)) {
148
149 DEBUG(
"a.y " << p->getX() <<
' ' << p->getY() << endl);
150 DEBUG(
"b.y " << q->getX() <<
' ' << q->getY() << endl);
151
152 ok = false;
153 }
154
155 if (p->getX() < q->getX())
156 ++p;
157 else if (q->getX() < p->getX())
158 ++q;
159 else {
160 ++p;
161 ++q;
162 }
163 }
164
165 for ( ; p != fa.end(); ++p) {
166
167 DEBUG(
"a.x " << p->getX() << endl);
168
169 ok = false;
170 }
171
172 for ( ; q != fb.end(); ++q) {
173
174 DEBUG(
"b.x " << q->getX() << endl);
175
176 ok = false;
177 }
178 }
179
180 for ( ; i != pdfA.super_end(); ++i) {
181
183 << i->first << ' '
184 << i->second->first << endl);
185
186 ok = false;
187 }
188
189 for ( ;
j != pdfB.super_end(); ++
j) {
190
193 <<
j->second->first << endl);
194
195 ok = false;
196 }
197
198 if (!ok) {
199 ERROR(inputFileA <<
" and " << inputFileB <<
" differ." << endl);
200 }
201
202 return (ok ? 0 : 1);
203}
#define DEBUG(A)
Message macros.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
virtual const char * what() const override
Get error message.
Utility class to parse command line options.
Multi-dimensional PDF table for arrival time of Cherenkov light.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).