Jpp  15.0.2
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
JHydrophone.cc
Go to the documentation of this file.
1 #include <iostream>
2 #include <iomanip>
3 
4 #include "TROOT.h"
5 #include "TFile.h"
6 #include "TH1D.h"
7 
8 #include "JDB/JToAshort.hh"
9 #include "JDB/JSupport.hh"
10 
11 #include "JDetector/JDetector.hh"
13 #include "JDetector/JTripod.hh"
14 #include "JDetector/JHydrophone.hh"
15 
17 #include "JSupport/JTreeScanner.hh"
18 
19 #include "JTools/JHashMap.hh"
20 #include "JTools/JRange.hh"
21 
22 #include "JROOT/JManager.hh"
23 #include "JROOT/JRootToolkit.hh"
24 
25 #include "JAcoustics/JEmitterID.hh"
27 #include "JAcoustics/JEmitter.hh"
28 #include "JAcoustics/JReceiver.hh"
32 #include "JAcoustics/JHit.hh"
33 #include "JAcoustics/JEvent.hh"
34 #include "JAcoustics/JSupport.hh"
35 
36 #include "Jeep/JContainer.hh"
37 #include "Jeep/JPrint.hh"
38 #include "Jeep/JParser.hh"
39 #include "Jeep/JMessage.hh"
40 
41 namespace {
42 
43  /**
44  * Auxiliary data structure for organistation of histograms.
45  */
46  struct key_type :
47  public std::pair<int, int>
48  {
49  /**
50  * Constructor.
51  *
52  * \param first first value
53  * \param second second value
54  */
55  key_type(const int first,
56  const int second) :
57  std::pair<int, int>(first, second)
58  {}
59 
60 
61  /**
62  * Read key from input.
63  *
64  * \param in input stream
65  * \param key key
66  * \return input stream
67  */
68  friend inline std::istream& operator>>(std::istream& in, key_type& key)
69  {
70  in >> key.first;
71  in >> key.second;
72 
73  return in;
74  }
75 
76 
77  /**
78  * Write key to output.
79  *
80  * \param out output stream
81  * \param key key
82  * \return output stream
83  */
84  friend inline std::ostream& operator<<(std::ostream& out, const key_type& key)
85  {
86  out << key.first;
87  out << '.';
88  out << key.second;
89 
90  return out;
91  }
92 
93  /**
94  * Less=than operator.
95  *
96  * \param first first key
97  * \param second second key
98  * \return true if first key less than second key; else false
99  */
100  friend inline bool operator<(const key_type& first, const key_type& second)
101  {
102  if (first.first == second.first)
103  return first.second < second.second;
104  else
105  return first.first < second.first;
106  }
107  };
108 }
109 
110 
111 /**
112  * \file
113  *
114  * Example program to plot hydrophone data.
115  * \author mdejong
116  */
117 int main(int argc, char **argv)
118 {
119  using namespace std;
120  using namespace JPP;
121 
122  typedef JContainer< vector<JTripod> > tripods_container;
123  typedef JContainer< vector<JHydrophone> > hydrophones_container;
124 
126  JMultipleFileScanner<JToAshort> toashortFile;
127  string detectorFile;
128  JLimit_t& numberOfEvents = inputFile.getLimit();
129  string outputFile;
130  JSoundVelocity V = getSoundVelocity; // default sound velocity
131  tripods_container tripods; // tripods
132  hydrophones_container hydrophones; // hydrophones
133  double Q;
134  int debug;
135 
136  try {
137 
138  JParser<> zap("Example program to plot hydrophone data.");
139 
140  zap['f'] = make_field(inputFile);
141  zap['n'] = make_field(numberOfEvents) = JLimit::max();
142  zap['i'] = make_field(toashortFile);
143  zap['o'] = make_field(outputFile) = "hydrophone.root";
144  zap['a'] = make_field(detectorFile);
145  zap['V'] = make_field(V, "sound velocity") = JPARSER::initialised();
146  zap['T'] = make_field(tripods, "tripod data");
147  zap['H'] = make_field(hydrophones, "hydrophone data") = JPARSER::initialised();
148  zap['W'] = make_field(getEmitterID, "waveform identification data") = JPARSER::initialised();
149  zap['Q'] = make_field(Q, "quality") = 0.0;
150  zap['d'] = make_field(debug) = 2;
151 
152  zap(argc, argv);
153  }
154  catch(const exception &error) {
155  FATAL(error.what() << endl);
156  }
157 
158 
160 
161  try {
162  load(detectorFile, detector);
163  }
164  catch(const JException& error) {
165  FATAL(error);
166  }
167 
168  V.set(detector.getUTMZ());
169 
170  JHashMap<int, JReceiver> receivers;
171  JHashMap<int, JEmitter> emitters;
172 
173  for (hydrophones_container::const_iterator i = hydrophones.begin(); i != hydrophones.end(); ++i) {
174 
175  for (JDetector::const_iterator module = detector.begin(); module != detector.end(); ++module) {
176 
177  if (i->getLocation() == module->getLocation()) {
178 
179  receivers[module->getID()] = JReceiver(module->getID(),
180  module->getPosition() + i->getPosition(),
181  module->getT0() * 1.0e-9);
182  break;
183  }
184  }
185  }
186 
187  for (tripods_container::const_iterator i = tripods.begin(); i != tripods.end(); ++i) {
188  emitters[i->getID()] = JEmitter(i->getID(),
189  i->getUTMPosition() - detector.getUTMPosition());
190  }
191 
192 
193  map<int, vector<double> > buffer; // emitter identifier -> times-of-emission
194 
195  while (inputFile.hasNext()) {
196 
197  STATUS("event: " << setw(10) << inputFile.getCounter() << '\r'); DEBUG(endl);
198 
199  const JEvent* evt = inputFile.next();
200 
201  if (!evt->empty()) {
202  buffer[evt->getID()].push_back((*evt)[0].getToE());
203  }
204  }
205  STATUS(endl);
206 
207 
208  const JRange<double> T0(-0.05, +0.05);
209  const JRange<double> T1(-0.01, +0.01);
210 
211  TH1D h0(MAKE_CSTRING("Q0 " << T0), NULL, 100, 0.0, 8.0);
212  TH1D h1(MAKE_CSTRING("Q1 " << T1), NULL, 100, 0.0, 8.0);
213 
214  JManager<key_type, TH1D> H1(new TH1D("[%]", NULL, 50000, -5.0e-2, +5.0e-2));
215 
216  for (int counter = 0; toashortFile.hasNext(); ++counter) {
217 
218  if (counter%1000 == 0) {
219  STATUS("counter: " << setw(8) << counter << '\r' << flush); DEBUG(endl);
220  }
221 
222  const JToAshort* parameters = toashortFile.next();
223 
224  const int id = getEmitterID(parameters->EMITTERID);
225 
226  if (parameters->QUALITYFACTOR >= Q) {
227 
228  if (emitters.has(id) && receivers.has(parameters->DOMID) && !buffer[id].empty()) {
229 
230  const JTransceiver transceiver(emitters[id], receivers[parameters->DOMID]);
231 
232  const JTransmission transmission = transceiver.getTransmission(*parameters, V);
233 
234  double t1 = numeric_limits<double>::max();
235  double w1 = 1.0 / (double) buffer[id].size();
236 
237  for (vector<double>::const_iterator i = buffer[id].begin(); i != buffer[id].end(); ++i) {
238 
239  const double ti = transmission.getToE() - *i;
240 
241  if (fabs(ti) < fabs(t1)) {
242  t1 = ti;
243  }
244  }
245 
246  H1[key_type(parameters->DOMID, id)]->Fill(t1); //, w1);
247 
248  H1->Fill(t1);
249 
250  const double Q = log10(transmission.getQ());
251 
252  if (T0(t1)) { h0.Fill(Q); }
253  if (T1(t1)) { h1.Fill(Q); }
254  }
255  }
256  }
257  STATUS(endl);
258 
259  TFile out(outputFile.c_str(), "recreate");
260 
261  out << h0 << h1 << H1;
262 
263  out.Write();
264  out.Close();
265 }
Utility class to parse command line options.
Definition: JParser.hh:1500
Acoustic hit.
General exception.
Definition: JException.hh:23
Acoustic receiver.
Definition: JReceiver.hh:27
Q(UTCMax_s-UTCMin_s)-livetime_s
int main(int argc, char *argv[])
Definition: Main.cc:15
double getQ() const
Get quality.
Sound velocity.
General purpose class for hash map of unique keys.
Definition: JHashMap.hh:72
bool operator<(const Head &first, const Head &second)
Less than operator.
Definition: JHead.hh:1603
do rm f tmp H1
General purpose class for hash map of unique elements.
#define STATUS(A)
Definition: JMessage.hh:63
ROOT TTree parameter settings.
Detector data structure.
Definition: JDetector.hh:89
*fatal Wrong number of arguments esac JCookie sh typeset Z DETECTOR typeset Z SOURCE_RUN typeset Z TARGET_RUN set_variable PARAMETERS_FILE $WORKDIR parameters
Definition: diff-Tuna.sh:38
#define MAKE_CSTRING(A)
Make C-string.
Definition: JPrint.hh:151
then for HISTOGRAM in h0 h1
Definition: JMatrixNZ.sh:71
Acoustic event.
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Definition: JParser.hh:66
Dynamic ROOT object management.
string outputFile
Acoustic emitter.
double getToE() const
Get estimated time of emission.
Data structure for detector geometry and calibration.
then echo The file $DIR KM3NeT_00000001_00000000 root already please rename or remove it first
Data structure for hydrophone.
Auxiliary class for defining the range of iterations of objects.
Definition: JLimit.hh:41
static const JSoundVelocity getSoundVelocity(1541.0,-17.0e-3,-2000.0)
Function object for velocity of sound.
Acoustic transmission.
Auxiliary class to manage set of compatible ROOT objects (e.g. histograms) using unique keys...
Definition: JManager.hh:43
I/O formatting auxiliaries.
Detector file.
Definition: JHead.hh:196
Acoustics support kit.
Acoustic emitter.
Definition: JEmitter.hh:27
Acoustics toolkit.
Auxiliary wrapper for I/O of container with optional comment (see JComment).
Definition: JContainer.hh:39
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1961
JTransmission getTransmission(const JToAshort &data, const JAbstractSoundVelocity &V) const
Get transmission.
Definition: JTransceiver.hh:62
Acoustic transceiver.
Definition: JTransceiver.hh:29
Emitter identification.
ROOT TTree parameter settings.
int debug
debug level
Definition: JSirene.cc:63
General purpose messaging.
Implementation for velocity of sound.
#define FATAL(A)
Definition: JMessage.hh:67
Scanning of objects from multiple files according a format that follows from the extension of each fi...
Acoustic receiver.
std::istream & operator>>(std::istream &in, JAANET::JHead &header)
Read header from input.
Definition: JHead.hh:1618
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
Auxiliary class to define a range between two values.
General purpose class for object reading from a list of file names.
Utility class to parse command line options.
Acoustic transceiver.
then usage $script< input_file >< detector_file > fi set_variable OUTPUT_DIR set_variable SELECTOR JDAQTimesliceL1 set_variable DEBUG case set_variable DEBUG
Acoustic event.
std::ostream & operator<<(std::ostream &stream, const CLBCommonHeader &header)
const JLimit & getLimit() const
Get limit.
Definition: JLimit.hh:73
static JEmitterID getEmitterID
Function object for emitter identification.
Definition: JEmitterID.hh:119
do set_variable DETECTOR_TXT $WORKDIR detector
int getID() const
Get identifier.
Data structure for tripod.
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 source JAcoustics sh $DETECTOR_ID CHECK_EXIT_CODE typeset A TRIPODS get_tripods $WORKDIR tripod txt TRIPODS for EMITTER in
Definition: JCanberra.sh:41
int EMITTERID
waveform identifier
Definition: JToAshort.hh:27
Container I/O.