Jpp  18.3.1
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
JDiffAcousticsEvt.cc
Go to the documentation of this file.
1 #include <iostream>
2 #include <iomanip>
3 #include <vector>
4 #include <algorithm>
5 
6 #include "TROOT.h"
7 #include "TFile.h"
8 
9 #include "JAcoustics/JEvt.hh"
10 #include "JAcoustics/JSupport.hh"
11 
13 
14 #include "JLang/JComparator.hh"
15 #include "JLang/JComparison.hh"
16 
17 #include "Jeep/JParser.hh"
18 #include "Jeep/JMessage.hh"
19 
20 namespace {
21 
22  using JACOUSTICS::JFit;
23  using JACOUSTICS::JEvt;
24 
25 
26  const struct {
27 
28  /**
29  * Compare fits.
30  *
31  * \param first first fit
32  * \param second second fit
33  * \return true if first fit less than second; else false
34  */
35  inline bool operator()(const JFit& first, const JFit& second) const
36  {
37  if (first.id == second.id) {
38 
39  if (first.tx == second.tx) {
40 
41  return first.ty < second.ty;
42 
43  } else {
44 
45  return first.tx < second.tx;
46  }
47 
48  } else {
49 
50  return first.id < second.id;
51  }
52  }
53 
54 
55  /**
56  * Compare events.
57  *
58  * \param first first event
59  * \param second second event
60  * \return true if first event less than second; else false
61  */
62  inline bool operator()(const JEvt& first, const JEvt& second) const
63  {
64  if (first.oid == second.oid) {
65 
66  if (first.UNIXTimeStart == second.UNIXTimeStart) {
67 
68  if (first.UNIXTimeStop == second.UNIXTimeStop) {
69 
70  if (first.nhit == second.nhit) {
71 
72  if (first.npar == second.npar) {
73 
74  if (first.size() == second.size()) {
75 
76  for (JEvt::const_iterator
77  p0 = first .begin(),
78  p1 = second.begin(); p0 != first.end() && p1 != second.end(); ++p0, ++p1) {
79 
80  if ((*this)(*p0, *p1)) {
81  return true;
82  }
83  }
84 
85  return false;
86 
87  } else {
88 
89  return first.size() < second.size();
90  }
91 
92  } else {
93 
94  return first.npar < second.npar;
95  }
96 
97  } else {
98 
99  return first.nhit < second.nhit;
100  }
101 
102  } else {
103 
104  return first.UNIXTimeStop < second.UNIXTimeStop;
105  }
106 
107  } else {
108 
109  return first.UNIXTimeStart < second.UNIXTimeStart;
110  }
111 
112  } else {
113 
114  return first.oid < second.oid;
115  }
116  }
117  } compare;
118 
119 
120  /**
121  * Printer.
122  */
123  struct printer {
124 
125  int debug;
126  size_t width;
127 
128  /**
129  * Print data.
130  *
131  * \param out output stream
132  * \param filename file name
133  * \param index index
134  * \param evt event
135  * \param prefix prefix
136  * \param postfix postfix
137  * \return output stream
138  */
139  std::ostream& operator()(std::ostream& out, const std::string& filename, const int index, const JEvt& evt, const std::string& prefix, const std::string& postfix) const
140  {
141  using namespace std;
142  using namespace JPP;
143 
144  if (debug >= debug_t) {
145  out << prefix << (prefix == "" ? "" : " ")
146  << setw(width) << left << filename << right << ' '
147  << "[" << FILL(6,'0') << index << "]" << FILL() << ' '
148  << evt.oid << ' '
149  << FIXED(20,5) << evt.UNIXTimeStart << ' '
150  << FIXED(20,5) << evt.UNIXTimeStop << ' '
151  << (postfix == "" ? "" : " ") << postfix << endl;
152  }
153 
154  return out;
155  }
156 
157 
158  /**
159  * Write fit to output stream.
160  *
161  * \param out output stream
162  * \param object fit
163  * \param prefix prefix
164  * \param postfix postfix
165  * \return output stream
166  */
167  std::ostream& operator()(std::ostream& out, const JFit& object, const std::string& prefix, const std::string& postfix) const
168  {
169  using namespace std;
170  using namespace JPP;
171 
172  if (debug >= debug_t) {
173  out << prefix << (prefix == "" ? "" : " ")
174  << FILL(4,'0') << object.id << FILL() << ' '
175  << FIXED(9,6) << object.tx << ' '
176  << FIXED(9,6) << object.ty << ' '
177  << (postfix == "" ? "" : " ") << postfix << endl;
178  }
179 
180  return out;
181  }
182  };
183 }
184 
185 /**
186  * \file
187  *
188  * Program to compare acoustics fit data.
189  * \author mdejong
190  */
191 int main(int argc, char **argv)
192 {
193  using namespace std;
194  using namespace JPP;
195 
196  vector<string> inputFile;
197  JLimit numberOfEvents;
198  int debug;
199 
200  try {
201 
202  JParser<> zap("Program to compare acoustics fit data.");
203 
204  zap['f'] = make_field(inputFile, "two outputs of JKatoomba[.sh]");
205  zap['n'] = make_field(numberOfEvents) = JLimit::max();
206  zap['d'] = make_field(debug) = 2;
207 
208  zap(argc, argv);
209  }
210  catch(const exception &error) {
211  FATAL(error.what() << endl);
212  }
213 
214  if (inputFile.size() != 2u) {
215  FATAL("Wrong number of input files " << inputFile.size() << endl);
216  }
217 
218  const size_t width = max(inputFile[0].size(), inputFile[1].size());
219  const printer print = { debug, width };
220 
221  vector<JEvt> buffer[2];
222 
223  for (int i = 0; i != 2; ++i) {
224 
225  for (JSingleFileScanner<JEvt> in(inputFile[i], numberOfEvents); in.hasNext(); ) {
226  buffer[i].push_back(*in.next());
227  }
228 
229  sort(buffer[i].begin(), buffer[i].end());
230  }
231 
232  if (true) {
233  for (int i = 0; i != 2; ++i) {
234  for (vector<JEvt>::iterator p = buffer[i].begin(); p != buffer[i].end(); ++p) {
235  sort(p->begin(), p->end(), make_comparator(&JFit::id, JComparison::lt()));
236  }
237  }
238  }
239 
240  int count[] = { 0, 0 };
241 
243  p0 = buffer[0].begin(),
244  p1 = buffer[1].begin(); p0 != buffer[0].end() && p1 != buffer[1].end(); ) {
245 
246  for ( ; p0 != buffer[0].end() && p1 != buffer[1].end() && compare(*p0,*p1); ++p0, ++count[1]) {
247  print(cout, inputFile[0], distance(buffer[0].cbegin(),p0), *p0, ">>", "");
248  }
249 
250  for ( ; p0 != buffer[0].end() && p1 != buffer[1].end() && compare(*p1,*p0); ++p1, ++count[1]) {
251  print(cout, inputFile[1], distance(buffer[1].cbegin(),p1), *p1, "<<", "");
252  }
253 
254  if (p0 != buffer[0].end() && p1 != buffer[1].end()) {
255 
256  if (!compare(*p0,*p1) && !compare(*p1,*p0)) {
257 
258  ++count[0];
259 
260  print(cout, inputFile[0], distance(buffer[0].cbegin(),p0), *p0, "", "\\");
261  print(cout, inputFile[1], distance(buffer[1].cbegin(),p1), *p1, "", "/ ");
262 
263  } else {
264 
265  ++count[1];
266 
267  if (p0->oid == p1->oid &&
268  p0->UNIXTimeStart == p1->UNIXTimeStart &&
269  p0->UNIXTimeStop == p1->UNIXTimeStop) {
270 
271  print(cout, inputFile[0], distance(buffer[0].cbegin(),p0), *p0, "", "");
272  print(cout, inputFile[1], distance(buffer[1].cbegin(),p1), *p1, "", "");
273 
274  JEvt::const_iterator i0 = p0->begin();
275  JEvt::const_iterator i1 = p1->begin();
276 
277  for ( ; i0 != p0->end() && i1 != p1->end(); ++i0, ++i1) {
278  if (compare(*i0, *i1) || compare(*i1,*i0)) {
279  print(cout, *i0, ">>", "");
280  print(cout, *i1, "<<", "");
281  }
282  }
283 
284  for ( ; i0 != p0->end(); ++i0) {
285  print(cout, *i0, ">>", "");
286  }
287 
288  for ( ; i1 != p1->end(); ++i1) {
289  print(cout, *i1, "<<", "");
290  }
291 
292  } else {
293 
294  print(cout, inputFile[0], distance(buffer[0].cbegin(),p0), *p0, ">>", "");
295  print(cout, inputFile[1], distance(buffer[1].cbegin(),p1), *p1, "<<", "");
296  }
297  }
298 
299  if (compare(*p0,*p1) || compare(*p1,*p0)) {
300 
301  } else {
302 
303  ++p0;
304  ++p1;
305  }
306  }
307  }
308 
309  STATUS("Number of differences / events: " << count[1] << " / " << count[0] << endl);
310 
311  if (buffer[0].size() != buffer[1].size()) {
312  FATAL("Different size " << buffer[0].size() << ' ' << buffer[1].size() << endl);
313  }
314 
315  if (count[1] != 0) {
316  FATAL("Number of differences " << count[1] << endl);
317  }
318 }
Utility class to parse command line options.
Definition: JParser.hh:1514
int id
string identifier
int npar
number of fit parameters
debug
Definition: JMessage.hh:29
int main(int argc, char *argv[])
Definition: Main.cc:15
TPaveText * p1
JComparator< JResult_t T::*, JComparison::lt > make_comparator(JResult_t T::*member)
Helper method to create comparator between values of data member.
std::string oid
detector identifier
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
#define STATUS(A)
Definition: JMessage.hh:63
ROOT TTree parameter settings.
Auxiliary data structure for floating point format specification.
Definition: JManip.hh:446
double ty
slope dy/dz
Acoustic single fit.
then echo The file $DIR KM3NeT_00000001_00000000 root already please rename or remove it first
Scanning of objects from a single file according a format that follows from the extension of each fil...
double UNIXTimeStop
stop time
Auxiliary class for defining the range of iterations of objects.
Definition: JLimit.hh:41
double tx
slope dx/dz
Acoustic event fit.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1989
then awk string
print
Definition: JConvertDusj.sh:44
General purpose messaging.
Auxiliary data structure for sequence of same character.
Definition: JManip.hh:328
#define FATAL(A)
Definition: JMessage.hh:67
int nhit
number of hits
double UNIXTimeStart
start time
then fatal Wrong number of arguments fi set_variable DETECTOR $argv[1] set_variable INPUT_FILE $argv[2] eval JPrintDetector a $DETECTOR O IDENTIFIER eval JPrintDetector a $DETECTOR O SUMMARY JAcoustics sh $DETECTOR_ID source JAcousticsToolkit sh CHECK_EXIT_CODE typeset A EMITTERS get_tripods $WORKDIR tripod txt EMITTERS get_transmitters $WORKDIR transmitter txt EMITTERS for EMITTER in
Definition: JCanberra.sh:48
Utility class to parse command line options.
Object reading from a list of files.
double u[N+1]
Definition: JPolint.hh:865
Acoustic event fit.
int debug
debug level