Jpp  master_rocky-43-ge265d140c
the software that should make you happy
JDetectorDB.cc
Go to the documentation of this file.
1 #include <string>
2 #include <iostream>
3 #include <iomanip>
4 #include <vector>
5 #include <set>
6 #include <map>
7 #include <algorithm>
8 #include <cmath>
9 
10 #include "JDB/JDB.hh"
11 #include "JDB/JSelector.hh"
13 #include "JDB/JCLBMap.hh"
15 #include "JDB/JPBSSequence.hh"
16 #include "JDB/JProductRouter.hh"
17 #include "JDB/JDBToolkit.hh"
18 
19 #include "JDetector/JDetector.hh"
23 
24 #include "JLang/JEquation_t.hh"
25 #include "JLang/JComparator.hh"
26 #include "JLang/JPredicate.hh"
27 #include "JLang/JVectorize.hh"
28 
29 #include "JSupport/JMeta.hh"
30 
31 #include "JSon/JSupport.hh"
32 
33 #include "Jeep/JPrint.hh"
34 #include "Jeep/JParser.hh"
35 #include "Jeep/JMessage.hh"
36 
37 namespace {
38 
39  using namespace JPP;
40 
41  /**
42  * Get delay time for acoustic sensor with given %UPI.
43  *
44  * \param upi %UPI
45  * \return delay time [ns]
46  */
47  inline double getDelayTime(const JUPI_t& upi)
48  {
49  using namespace std;
50  using namespace JPP;
51 
52  if (upi.getPBS() == PBS::HYDROPHONE)
53  return HYDROPHONE_DELAYTIME_US * 1.0e3;
54  else if (upi.getPBS() == PBS::ACOUSTIC_SENSOR && upi.getVariant().find("V1") != string::npos)
55  return PIEZO_V1_DELAYTIME_US * 1.0e3;
56  else if (upi.getPBS() == PBS::ACOUSTIC_SENSOR && upi.getVariant().find("V2") != string::npos)
57  return PIEZO_V2_DELAYTIME_US * 1.0e3;
58  else if (upi.getPBS() == PBS::ACOUSTIC_SENSOR && upi.getVariant().find("V3") != string::npos)
59  return PIEZO_V3_DELAYTIME_US * 1.0e3;
60  else
61  THROW(JValueOutOfRange, "Invalid UPI " << upi);
62  }
63 
64  static const char* const NOPIEZO = "NOPIEZO"; // variant for absent piezo sensor
65 }
66 
67 
68 /**
69  * \file
70  *
71  * Auxiliary program to download or update detector from database.
72  * \author mdejong
73  */
74 int main(int argc, char **argv)
75 {
76  using namespace std;
77  using namespace JPP;
78 
79  JServer server;
80  string usr;
81  string pwd;
82  string cookie;
83  string id;
84  vector<JEquation_t> calset;
85  string detectorFile;
86  string outputFile;
87  int run;
88  string variant;
89  JCounter wizzard;
90  double precision;
91  int debug;
92 
93  try {
94 
95  JParser<> zap("Auxiliary program to download or update detector from database.");
96 
97  zap['s'] = make_field(server) = getServernames();
98  zap['u'] = make_field(usr) = "";
99  zap['!'] = make_field(pwd) = "";
100  zap['C'] = make_field(cookie) = "";
101  zap['D'] = make_field(id, "detector identifier") = "";
102  zap['r'] = make_field(run, "run number") = -1;
103  zap['@'] = make_field(calset, "calibration sets \"<key> = <value>[; <key> = <value>]\"" << endl
104  << "possible keys: " << JEEPZ() << make_array(getCalibrationType.begin(),
105  getCalibrationType.end(),
107  << "possible values: <calibration identifier> or \"?\"") = JPARSER::initialised();
108  zap['a'] = make_field(detectorFile) = "";
109  zap['o'] = make_field(outputFile) = "";
110  zap['V'] = make_field(variant, "detector version") = getDetectorVersions<string>(), "";
111  zap['W'] = make_field(wizzard, "-W add base modules; -WW set time offsets of acoustic sensors");
112  zap['p'] = make_field(precision) = 1.0e-5;
113  zap['d'] = make_field(debug) = 2;
114 
115  zap(argc, argv);
116  }
117  catch(const exception &error) {
118  FATAL(error.what() << endl);
119  }
120 
121 
123 
124  for (vector<JEquation_t>::const_iterator i = calset.begin(); i != calset.end(); ++i) {
125 
126  if (getCalibrationType.hasNickname(i->getKey()))
127  FATAL("Invalid calibration set \"" << i->getKey() << "\"" << endl);
128  else
129  calibration[i->getKey()] = i->getValue();
130  }
131 
132  if (calibration.size() != 0u &&
133  calibration.size() != 3u &&
134  calibration.size() != 6u) {
135  FATAL("Inconsistent specificaton of calibration sets, either {}, {t,p,r}cal or {t,p,r,a,c,s}cal.");
136  }
137 
138  const bool file = (detectorFile != "");
139  const bool tpr = (calibration.count(TCAL) != 0 &&
140  calibration.count(PCAL) != 0 &&
141  calibration.count(RCAL) != 0 &&
142  calibration.count(ACAL) == 0 &&
143  calibration.count(CCAL) == 0 &&
144  calibration.count(SCAL) == 0);
145  const bool tpracs = (calibration.count(TCAL) != 0 &&
146  calibration.count(PCAL) != 0 &&
147  calibration.count(RCAL) != 0 &&
148  calibration.count(ACAL) != 0 &&
149  calibration.count(CCAL) != 0 &&
150  calibration.count(SCAL) != 0);
151  const bool daq = (run != -1);
152 
153  if (file && id != "") { FATAL("Inconsistent specificaton of detector file and detector identifier."); }
154  if (file && tpr) { FATAL("Inconsistent specificaton of detector file and {t,p,r}cal calibration sets."); }
155  if (file && tpracs) { FATAL("Inconsistent specificaton of detector file and {t,p,r,a,c,s}cal calibration sets."); }
156  if (file && daq) { FATAL("Inconsistent specificaton of detector file and run number."); }
157 
158  if (tpr && id == "") { FATAL("Inconsistent specificaton of {t,p,r}cal calibration sets and no detector identifier."); }
159  if (tpr && variant != "") { FATAL("Inconsistent specificaton of {t,p,r}cal calibration sets and variant."); }
160  if (tpr && daq) { FATAL("Inconsistent specificaton of {t,p,r}cal calibration sets and run number."); }
161 
162  if (tpracs && id == "") { FATAL("Inconsistent specificaton of {t,p,r,a,c,s}cal calibration sets and no detector identifier."); }
163  if (tpracs && variant == "") { FATAL("Inconsistent specificaton of {t,p,r,a,c,s}cal calibration sets and no variant."); }
164  if (tpracs && daq) { FATAL("Inconsistent specificaton of {t,p,r,a,c,s}cal calibration sets and run number."); }
165 
166  if (daq && id == "") { FATAL("Inconsistent specificaton of run number and no detector identifier."); }
167 
168  if (wizzard &&
169  variant != "" &&
171  FATAL("Inconsistent detector variant and option -W.");
172  }
173 
174  try {
175  JDB::reset(usr, pwd, cookie);
176  }
177  catch(const exception& error) {
178  FATAL(error.what() << endl);
179  }
180 
182 
183  try {
184 
185  if (file)
186  load(detectorFile, detector);
187  else if (tpr)
188  *(JDB::get()->DetX)(id.c_str(),
189  calibration[TCAL] != "?" ? calibration[TCAL].c_str() : NULL,
190  calibration[PCAL] != "?" ? calibration[PCAL].c_str() : NULL,
191  calibration[RCAL] != "?" ? calibration[RCAL].c_str() : NULL) >> detector;
192  else if (tpracs)
193  *(JDB::get()->DetX)(id.c_str(),
194  calibration[TCAL] != "?" ? calibration[TCAL].c_str() : NULL,
195  calibration[PCAL] != "?" ? calibration[PCAL].c_str() : NULL,
196  calibration[RCAL] != "?" ? calibration[RCAL].c_str() : NULL,
197  calibration[ACAL] != "?" ? calibration[ACAL].c_str() : NULL,
198  calibration[CCAL] != "?" ? calibration[CCAL].c_str() : NULL,
199  calibration[SCAL] != "?" ? calibration[SCAL].c_str() : NULL,
200  getDetectorVersion(variant)) >> detector;
201  else if (daq && variant == "")
202  *(JDB::get()->DetX)(id.c_str(), run) >> detector;
203  else if (daq && variant != "")
204  *(JDB::get()->DetX)(id.c_str(), run, getDetectorVersion(variant)) >> detector;
205  else
206  FATAL("Invalid options.");
207  }
208  catch(const exception& error) {
209  FATAL(error.what() << endl);
210  }
211 
212 
213  detector.comment.add(JMeta(argc,argv));
214 
215  if (detector.setToLatestVersion()) {
216  NOTICE("Set detector version to " << detector.getVersion() << endl);
217  }
218 
219 
220  if (wizzard) {
221 
222  vector<JCLBMap> clbmap;
223 
224  try {
225 
226  JSelector selector = getSelector<JCLBMap>(getDetector(detector.getID()));
227 
228  selector.add(&JCLBMap::FLOORID, 0);
229 
230  ResultSet& rs = getResultSet(getTable<JCLBMap>(), selector);
231 
232  rs >> clbmap;
233 
234  rs.Close();
235  }
236  catch(const exception& error) {
237  FATAL(error.what() << endl);
238  }
239 
241 
242  for (JDetector::const_iterator module = detector.begin(); module != detector.end(); ++module) {
243  zmap[module->getString()][module->getFloor()] = module->getPosition();
244  }
245 
246  for (vector<JCLBMap>::const_iterator i = clbmap.begin(); i != clbmap.end(); ++i) {
247 
248  if (i->FLOORID == 0) {
249 
250  JDetector::iterator p = find_if(detector.begin(), detector.end(), make_predicate(&JModule::getID, i->DOMID, JComparison::eq()));
251 
252  if (p == detector.end()) {
253 
254  if (zmap[i->DUID].count(1) != 0) {
255 
256  JModule module(i->DOMID, JLocation(i->DUID, i->FLOORID));
257 
258  module.setPosition(JPosition3D(zmap[i->DUID][1].getX(),
259  zmap[i->DUID][1].getY(),
262  0.0));
263 
264  NOTICE("Adding module " << module << endl);
265 
266  detector.push_back(module);
267 
268  } else {
269 
270  ERROR("Missing floor in string " << FILL(4,'0') << i->DUID << FILL() << endl);
271  }
272 
273  } else if (zmap[i->DUID].count(1) != 0) {
274 
275  if (fabs(p->getX() - zmap[i->DUID][1].getX()) > precision ||
276  fabs(p->getY() - zmap[i->DUID][1].getY()) > precision) {
277 
278  NOTICE("Offset module " << getLabel(p->getLocation()) << " (x,y) position "
279  << SCIENTIFIC(12,3) << (p->getX() - zmap[i->DUID][1].getX()) << ' '
280  << SCIENTIFIC(12,3) << (p->getY() - zmap[i->DUID][1].getY()) << endl);
281 
282  p->setPosition(JPosition3D(zmap[i->DUID][1].getX(),
283  zmap[i->DUID][1].getY(),
284  p->getZ()));
285  }
286 
287  } else {
288 
289  FATAL("Missing floor in string " << setw(4) << i->DUID << endl);
290  }
291  }
292  }
293  }
294 
295  if (wizzard > 1) {
296 
297  try {
298 
299  JDetectorIntegration_t detector_t;
300 
301  ResultSet& rs = getResultSet(getTable<JDetectorIntegration_t>());
302 
303  if (! (rs >> detector_t)) {
304  THROW(JDatabaseException, "Error reading " << getTable<JDetectorIntegration_t>());
305  }
306 
307  detector_t.configure(getDetector(detector.getID()));
308 
309  for (const JPBS_t& pbs : { PBS::ACOUSTIC_SENSOR, PBS::HYDROPHONE }) {
310 
311  const JProductRouter router(detector_t, getPBSSequences(pbs));
312 
313  JDetectorIntegration_t::range_type range = detector_t.find(pbs);
314 
315  for (JDetectorIntegration_t::range_const_iterator i = range.first; i != range.second; ++i) {
316 
317  const JLocation_t location = router.getLocation(i->first);
318 
319  JDetector::iterator p = find_if(detector.begin(),
320  detector.end(),
322  JLocation(location.string, (pbs != PBS::HYDROPHONE ? location.floor : 0)),
323  JComparison::eq()));
324 
325  if (p != detector.end()) {
326 
327  try {
328 
329  const double t0 = getAverage(make_array(p->begin(), p->end(), &JPMT::getT0), 0.0) - getDelayTime(i->first);
330 
331  if (t0 != p->getT0()) {
332 
333  NOTICE("Set module time calibration " << getLabel(p->getLocation()) << ' ' << setw(10) << p->getID() << ' ' << setw(28) << left << i->first << right << ' ' << FIXED(12,3) << t0 << endl);
334 
335  p->setCalibration(t0);
336  }
337  }
338  catch(const exception& error) {
339  if (i->first.getVariant() != NOPIEZO) {
340  ERROR(location << ' ' << error.what() << endl);
341  }
342  }
343 
344  } else {
345 
346  ERROR("No module for UPI " << i->first << " at " << location << endl);
347  }
348  }
349  }
350  }
351  catch(const exception& error) {
352  FATAL(error.what() << endl);
353  }
354  }
355 
356  if (outputFile != "")
358  else
359  cout << detector;
360 }
string outputFile
int main(int argc, char **argv)
Definition: JDetectorDB.cc:74
Detector support kit.
Data structure for detector geometry and calibration.
#define THROW(JException_t, A)
Marco for throwing exception with std::ostream compatible message.
Definition: JException.hh:712
General purpose messaging.
#define ERROR(A)
Definition: JMessage.hh:66
#define NOTICE(A)
Definition: JMessage.hh:64
#define FATAL(A)
Definition: JMessage.hh:67
int debug
debug level
Definition: JSirene.cc:69
ROOT I/O of application specific meta data.
Utility class to parse command line options.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:2142
I/O formatting auxiliaries.
JSon definitions and auxiliaries.
Auxiliary methods to convert data members or return values of member methods of a set of objects to a...
static JDB & get()
Get connection to database.
Definition: JDB.hh:234
static void reset()
Reset connection to database.
Definition: JDB.hh:245
Auxiliary class for specifying selection of database data.
JSelector & add(const JSelector &selection)
Add selection.
double getT0() const
Get time offset.
Detector data structure.
Definition: JDetector.hh:96
Logical location of module.
Definition: JLocation.hh:40
const JLocation & getLocation() const
Get location.
Definition: JLocation.hh:70
Data structure for a composite optical module.
Definition: JModule.hh:75
Data structure for position in three dimensions.
Definition: JPosition3D.hh:38
void setPosition(const JVector3D &pos)
Set position.
Definition: JPosition3D.hh:152
Database exception.
Definition: JException.hh:684
int getID() const
Get identifier.
Definition: JObjectID.hh:50
Exception for accessing a value in a collection that is outside of its range.
Definition: JException.hh:180
Utility class to parse command line options.
Definition: JParser.hh:1698
static const JPBS_t HYDROPHONE(4, 5)
PBS of hydrophone
static const JPBS_t ACOUSTIC_SENSOR(3, 4, 3, 6, 2)
PBS of piezo sensor
ResultSet & getResultSet(const std::string &query)
Get result set.
Definition: JDB.hh:437
static JGetPBSSequences getPBSSequences
Function object to get PBS sequences as a function of PBS.
JDetectorsHelper & getDetector()
Auxiliary function for helper object initialisation.
Definition: JDBToolkit.hh:378
std::vector< JServer > getServernames()
Get list of names of available database servers.
Definition: JDB.hh:107
static const double PIEZO_V2_DELAYTIME_US
Piezo delay time [us].
std::string getLabel(const JLocation &location)
Get module label for monitoring and other applications.
Definition: JLocation.hh:247
static const double PIEZO_V1_DELAYTIME_US
Piezo delay time [us].
static const JGetDetectorVersion getDetectorVersion
Function object to map detector version to numerical value.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
static const double HYDROPHONE_DELAYTIME_US
Hydrophone delay time [us].
static const double ORCA_TBARZ_M
ORCA T-bar position relative to seabed [m].
void store(const std::string &file_name, const JDetector &detector)
Store detector to output file.
static const double ARCA_TBARZ_M
ORCA T-bar position relative to seabed [m].
bool isORCADetector(const JDetectorHeader &header)
Check if given detector header is compatible with that of ORCA.
bool isARCADetector(const JDetectorHeader &header)
Check if given detector header is compatible with tat of ARCA.
static const double PIEZO_V3_DELAYTIME_US
Piezo delay time [us].
const array_type< JValue_t > & make_array(const JValue_t(&array)[N])
Method to create array of values.
Definition: JVectorize.hh:54
JPredicate< JResult_t T::*, JComparison::eq > make_predicate(JResult_t T::*member, const JResult_t value)
Helper method to create predicate for data member.
Definition: JPredicate.hh:128
std::iterator_traits< T >::value_type getAverage(T __begin, T __end)
Get average.
Definition: JMath.hh:494
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
static const std::string TCAL
PMT time offsets.
static const std::string PCAL
(optical|base) module positions
static const std::string SCAL
(module|PMT) status
static const std::string RCAL
optical module orientations
static const std::string ACAL
acoustic time offsets (piezo sensor or hydrophone)
static const std::string CCAL
compass alignment (a.k.a. quaternion calibration)
double u[N+1]
Definition: JPolint.hh:865
Definition: JSTDTypes.hh:14
Auxiliary data structure for sequence of same character.
Definition: JManip.hh:330
Auxiliary data structure for floating point format specification.
Definition: JManip.hh:448
Calibration.
Definition: JHead.hh:330
Detector file.
Definition: JHead.hh:227
void configure(const std::string &detid, const bool option=false)
Configure detector integration for given detector identifier.
map_type::const_iterator range_const_iterator
range_type find(const JUPI_t &upi) const
Find range of products with given UPI.
Auxiliary data structure for location of product in detector.
Definition: JLocation_t.hh:26
int string
position in detector
Definition: JLocation_t.hh:105
int floor
position in string
Definition: JLocation_t.hh:106
Product breakdown structure (PBS).
Definition: JPBS_t.hh:29
const JPBS_t & getPBS() const
Get PBS.
Definition: JPBS_t.hh:101
Auxiliary class to map UPI to location in detector.
JLocation_t getLocation(const JUPI_t &upi) const
Get location of product with given UPI.
Wrapper class for server name.
Definition: JDB.hh:53
Universal product identifier (UPI).
Definition: JUPI_t.hh:32
const std::string & getVariant() const
Get variant.
Definition: JUPI_t.hh:111
Template definition for getting table specific selector.
@ V4
Version with quaternion and time offset per module.
Auxiliary data structure for streaming of STL containers.
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Definition: JParser.hh:68
std::string nick_name
nick name (e.g. "xcal")
Auxiliary data structure for correspondence between nick and full name of calibration types.
bool hasNickname(const std::string &type) const
Has calibration type.
Auxiliary class for ROOT I/O of application specific meta data.
Definition: JMeta.hh:72
Auxiliary data structure for floating point format specification.
Definition: JManip.hh:488