Jpp  18.3.0-rc.1
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
JDynamics.hh
Go to the documentation of this file.
1 #ifndef __JDYNAMICS__JDYNAMICS__
2 #define __JDYNAMICS__JDYNAMICS__
3 
4 #include <ostream>
5 #include <set>
6 
7 #include "JDetector/JDetector.hh"
10 #include "JUTC/JUTCTimeRange.hh"
11 
12 #include "JCompass/JEvt.hh"
13 #include "JCompass/JEvtToolkit.hh"
14 #include "JCompass/JSupport.hh"
15 
16 #include "JAcoustics/JModel.hh"
17 #include "JAcoustics/JGeometry.hh"
18 #include "JAcoustics/JEvt.hh"
20 #include "JAcoustics/JSupport.hh"
21 
22 #include "JLang/JObjectIterator.hh"
23 #include "JLang/JException.hh"
24 
26 #include "JGeometry3D/JEigen3D.hh"
27 
28 #include "JTools/JElement.hh"
29 #include "JTools/JCollection.hh"
30 #include "JTools/JPolfit.hh"
31 #include "JTools/JHashMap.hh"
32 #include "JTools/JRange.hh"
33 
36 
37 
38 /**
39  * \file
40  *
41  * Dynamic detector calibration.
42  * \author mdejong
43  */
44 
45 namespace JDYNAMICS {}
46 namespace JPP { using namespace JDYNAMICS; }
47 
48 /**
49  * Main namespace for dynamic position and orientation calibration.
50  */
51 namespace JDYNAMICS {
52 
57  using JUTC::JUTCTimeRange;
58 
59 
60  /**
61  * Auxiliary data structure to pre-load auxiliary data in memory.
62  */
63  struct JPreloader {
64  /**
65  * Constructor.
66  *
67  * \param id detector identifier
68  */
69  JPreloader(const int id)
70  {
71  using namespace JPP;
72 
73  getMechanics.load(id);
74  }
75  };
76 
77 
78  /**
79  * Dynamic detector calibration.
80  */
81  struct JDynamics :
82  public JPreloader,
83  public JDetector
84  {
85  /**
86  * Auxiliary data structure to track applicability period of calibration data.
87  */
88  struct JUTCTracker :
89  public JUTCTimeRange
90  {
91  /**
92  * Constructor.
93  *
94  * \param Tmax_s applicability period [s]
95  */
96  JUTCTracker(const double Tmax_s) :
97  JUTCTimeRange(-Tmax_s, +Tmax_s)
98  {}
99 
100 
101  /**
102  * Reset.
103  */
104  void reset()
105  {
106  set(0.0);
107  }
108 
109 
110  /**
111  * Set.
112  *
113  * \param t0_s UTC time [s]
114  */
115  void set(const double t0_s)
116  {
117  const double Tmax_s = 0.5 * (getUpperLimit() - getLowerLimit());
118 
119  setRange(t0_s - Tmax_s, t0_s + Tmax_s);
120  }
121  };
122 
123 
124  /**
125  * Dynamic orientation calibration.
126  */
127  struct JOrientation :
128  public JUTCTracker
129  {
130  enum {
131  NUMBER_OF_POINTS = 20, //!< number of points for interpolation
132  NUMBER_OF_DEGREES = 1 //!< number of degrees for interpolation
133  };
134 
136  typedef JTOOLS::JPolfitFunction1D<NUMBER_OF_POINTS,
137  NUMBER_OF_DEGREES,
139  typedef typename function_type::collection_type::container_type container_type;
140 
143 
146 
147 
148  /**
149  * Constructor.
150  *
151  * \param detector detector
152  * \param Tmax_s applicability period of calibration [s]
153  */
155  const double Tmax_s) :
156  JUTCTracker(Tmax_s)
157  {
158  using namespace JPP;
159 
161  THROW(JValueOutOfRange, "Detector version " << detector.getVersion() << " < " << JDetectorVersion::V4);
162  }
163 
164  if (hasDetectorBuilder(detector.getID())) {
165 
166  const JDetectorBuilder& demo = getDetectorBuilder(detector.getID());
167 
168  for (JDetector::const_iterator module = detector.begin(); module != detector.end(); ++module) {
169  if (module->getFloor() != 0) {
170  buffer[module->getID()] = getRotation(demo.getModule(module->getID()), *module);
171  }
172  }
173 
174  } else {
175 
176  THROW(JValueOutOfRange, "No detector address map for detector identier " << detector.getID());
177  }
178  }
179 
180 
181  /**
182  * Load calibration data.
183  *
184  * \param input calibration data
185  */
187  {
188  this->reset();
189 
190  while (input.hasNext()) {
191 
192  const JCOMPASS::JOrientation* orientation = input.next();
193 
194  if (buffer.has(orientation->id)) {
195  static_cast<container_type&>(calibration[orientation->id]).push_back(element_type(orientation->t, getQuaternion(*orientation)));
196  }
197  }
198 
199  for (data_type::iterator i = calibration.begin(); i != calibration.end(); ++i) {
200  i->second.sort();
201  i->second.compile();
202  }
203  }
204 
205 
206  bool empty() const { return calibration.empty(); } //!< empty
207  size_t size() const { return calibration.size(); } //!< size
208  const_iterator begin() const { return calibration.begin(); } //!< begin of calibration data
209  const_iterator end() const { return calibration.end(); } //!< end of calibration data
210  const_reverse_iterator rbegin() const { return calibration.rbegin(); } //!< begin of reverse of calibration data
211  const_reverse_iterator rend() const { return calibration.rend(); } //!< begin of reverse of calibration data
212 
213 
214  /**
215  * Get coverage.
216  *
217  * \param detector detector
218  * \param t1_s UTC time [s]
219  * \return coverage [0,1]
220  */
221  double getCoverage(const JDetector& detector, const double t1_s) const
222  {
223  int n0 = 0;
224  int n1 = 0;
225 
226  for (JDetector::const_iterator module = detector.begin(); module != detector.end(); ++module) {
227 
228  if (module->getFloor() != 0 && !module->has(COMPASS_DISABLE)) {
229 
230  ++n0;
231 
232  if (calibration.has(module->getID()) && !calibration.get(module->getID()).empty()) {
233  if (calibration[module->getID()].getXmin() <= t1_s &&
234  calibration[module->getID()].getXmax() >= t1_s) {
235  ++n1;
236  }
237  }
238  }
239  }
240 
241  if (n0 != 0)
242  return (double) n1 / (double) n0;
243  else
244  return 0.0;
245  }
246 
247 
248  /**
249  * Calibrate given detector at given UTC time.
250  *
251  * \param detector detector (I/O)
252  * \param t1_s UTC time [s]
253  * \return true if updated; else false
254  */
255  bool update(JDetector& detector, const double t1_s)
256  {
257  using namespace std;
258  using namespace JPP;
259 
260  if (!calibration.empty()) {
261 
262  if (!in_range(t1_s)) {
263 
264  for (JDetector::iterator module = detector.begin(); module != detector.end(); ++module) {
265 
266  if (module->getFloor() != 0 && !module->has(COMPASS_DISABLE) && calibration.has(module->getID()) && buffer.has(module->getID())) {
267 
268  const function_type& f1 = calibration.get(module->getID());
269 
270  if (!f1.empty()) {
271 
272  if (t1_s >= f1.getXmin() && t1_s <= f1.getXmax()) {
273 
274  JQuaternion3D Q0 = buffer[module->getID()];
275  JQuaternion3D Q1 = module->getQuaternion() * f1(t1_s);
276 
277  const JPosition3D center = module->getPosition();
278 
279  module->sub(center);
280 
281  module->rotate(Q1 * Q0.conjugate());
282 
283  module->add(center);
284 
285  buffer[module->getID()] = Q1;
286  }
287  }
288  }
289  }
290 
291  set(t1_s);
292 
293  return true;
294  }
295  }
296 
297  return false;
298  }
299 
300  protected:
303  };
304 
305 
306  /**
307  * Dynamic position calibration.
308  */
309  struct JPosition :
310  public JUTCTracker
311  {
312  enum {
313  NUMBER_OF_POINTS = 7, //!< number of points for interpolation
314  NUMBER_OF_DEGREES = 2 //!< number of degrees for interpolation
315  };
316 
318 
320  typedef JTOOLS::JPolfitFunction1D<NUMBER_OF_POINTS,
321  NUMBER_OF_DEGREES,
323 
325 
328 
329 
330  /**
331  * Constructor.
332  *
333  * \param detector detector
334  * \param Tmax_s applicability period of calibration [s]
335  */
337  const double Tmax_s) :
338  JUTCTracker(Tmax_s),
339  geometry(detector)
340  {
341  using namespace JPP;
342 
344  THROW(JValueOutOfRange, "Detector version " << detector.getVersion() << " < " << JDetectorVersion::V4);
345  }
346  }
347 
348 
349  /**
350  * Load calibration data.
351  *
352  * \param input calibration data
353  */
355  {
356  this->reset();
357 
358  while (input.hasNext()) {
359 
360  const JACOUSTICS::JEvt* evt = input.next();
361  const double t1_s = 0.5 * (evt->UNIXTimeStart + evt->UNIXTimeStop);
362 
363  for (JACOUSTICS::JEvt::const_iterator i = evt->begin(); i != evt->end(); ++i) {
364  calibration[i->id][t1_s] = getString(*i);
365  }
366  }
367 
368  for (data_type::iterator i = calibration.begin(); i != calibration.end(); ++i) {
369  i->second.compile();
370  }
371  }
372 
373 
374  bool empty() const { return calibration.empty(); } //!< empty
375  size_t size() const { return calibration.size(); } //!< size
376  const_iterator begin() const { return calibration.begin(); } //!< begin of calibration data
377  const_iterator end() const { return calibration.end(); } //!< end of calibration data
378  const_reverse_iterator rbegin() const { return calibration.rbegin(); } //!< begin of reverse of calibration data
379  const_reverse_iterator rend() const { return calibration.rend(); } //!< begin of reverse of calibration data
380 
381 
382  /**
383  * Get coverage.
384  *
385  * \param detector detector
386  * \param t1_s UTC time [s]
387  * \return coverage [0,1]
388  */
389  double getCoverage(const JDetector& detector, const double t1_s) const
390  {
391  int n0 = 0;
392  int n1 = 0;
393 
395 
396  for (JDetector::const_iterator module = detector.begin(); module != detector.end(); ++module) {
397  if (module->getFloor() != 0) {
398  string.insert(module->getString());
399  }
400  }
401 
402  for (std::set<int>::const_iterator i = string.begin(); i != string.end(); ++i) {
403 
404  ++n0;
405 
406  if (calibration.has(*i) && !calibration.get(*i).empty()) {
407  if (calibration[*i].getXmin() <= t1_s &&
408  calibration[*i].getXmax() >= t1_s) {
409  ++n1;
410  }
411  }
412  }
413 
414  if (n0 != 0)
415  return (double) n1 / (double) n0;
416  else
417  return 0.0;
418  }
419 
420 
421  /**
422  * Get detector geometry.
423  *
424  * \return detector geometry
425  */
426  const JGeometry& getGeometry() const
427  {
428  return geometry;
429  }
430 
431 
432  /**
433  * Calibrate given detector at given UTC time.
434  *
435  * \param detector detector (I/O)
436  * \param t1_s UTC time [s]
437  * \return true if updated; else false
438  */
439  bool update(JDetector& detector, const double t1_s)
440  {
441  using namespace std;
442  using namespace JPP;
443 
444  if (!calibration.empty()) {
445 
446  if (!in_range(t1_s)) {
447 
449 
450  for (JDetector::iterator module = detector.begin(); module != detector.end(); ++module) {
451 
452  if (module->getFloor() != 0) {
453 
454  if (!buffer.has(module->getString())) {
455 
456  if (calibration.has(module->getString())) {
457 
458  const function_type& f1 = calibration.get(module->getString());
459 
460  if (!f1.empty()) {
461  if (t1_s >= f1.getXmin() && t1_s <= f1.getXmax()) {
462  buffer[module->getString()] = f1(t1_s);
463  }
464  }
465  }
466  }
467 
468  if (buffer.has(module->getString())) {
469  module->set(geometry[module->getString()].getPosition(buffer[module->getString()], module->getFloor()) - getPiezoPosition());
470  }
471  }
472  }
473 
474  set(t1_s);
475 
476  return true;
477  }
478  }
479 
480  return false;
481  }
482 
483  protected:
486  };
487 
488 
489  /**
490  * Constructor.
491  *
492  * \param detector detector
493  * \param Tmax_s applicability period of calibration [s]
494  */
496  const double Tmax_s) :
497  JPreloader (detector.getID()),
498  JDetector (detector),
499  orientation(detector, Tmax_s),
500  position (detector, Tmax_s)
501  {
502  this->setUTCTimeRange(JUTCTimeRange::DEFAULT_RANGE());
503  }
504 
505 
506  /**
507  * Get actual detector.
508  *
509  * \return detector
510  */
511  const JDetector& getDetector() const
512  {
513  return static_cast<const JDetector&>(*this);
514  }
515 
516 
517  /**
518  * Load calibration data.
519  *
520  * \param input calibration data
521  */
522  template<class JObjectIterator_t>
523  void load(JObjectIterator_t& input)
524  {
525  this->setUTCTimeRange(JUTCTimeRange::DEFAULT_RANGE());
526 
527  try { orientation.load(dynamic_cast<JObjectIterator<JCOMPASS::JOrientation>&>(input)); } catch(const std::exception&) {}
528  try { position .load(dynamic_cast<JObjectIterator<JACOUSTICS::JEvt>&> (input)); } catch(const std::exception&) {}
529  }
530 
531 
532  /**
533  * Get detector calibrated at given time.
534  *
535  * \param t1_s UTC time [s]
536  * \return true if updated; else false
537  */
538  bool update(const double t1_s)
539  {
540  bool is_updated = false;
541 
542  if (!in_range(t1_s)) {
543 
545 
546  if (orientation.update(static_cast<JDetector&>(*this), t1_s)) { range.join(orientation.getUTCTimeRange()); is_updated = true; }
547  if (position .update(static_cast<JDetector&>(*this), t1_s)) { range.join(position .getUTCTimeRange()); is_updated = true; }
548 
549  if (is_updated) {
550  setUTCTimeRange(range);
551  }
552  }
553 
554  return is_updated;
555  }
556 
557 
558  /**
559  * Get detector calibrated at given time.
560  *
561  * \param chronometer chronometer
562  * \return true if updated; else false
563  */
564  bool update(const JDAQChronometer& chronometer)
565  {
566  return update(chronometer.getTimesliceStart().getUTCseconds());
567  }
568 
569 
570  /**
571  * Data structure for coverage of dynamic calibrations.
572  */
573  struct coverage_type {
574  double orientation; //!< coverage of detector by available orientation calibration [0,1]
575  double position; //!< coverage of detector by available position calibration [0,1]
576  };
577 
578 
579  /**
580  * Get coverage at given time.
581  *
582  * \param t1_s UTC time [s]
583  * \return coverage
584  */
585  coverage_type getCoverage(const double t1_s) const
586  {
587  return { orientation.getCoverage(*this, t1_s), position.getCoverage(*this, t1_s) };
588  }
589 
590 
591  /**
592  * Get coverage at given time.
593  *
594  * \param chronometer chronometer
595  * \return coverage
596  */
597  coverage_type getCoverage(const JDAQChronometer& chronometer) const
598  {
599  return getCoverage(chronometer.getTimesliceStart().getUTCseconds());
600  }
601 
602 
603  /**
604  * Get actual coverage.
605  *
606  * \return coverage
607  */
609  {
610  return getCoverage(0.5 * (getLowerLimit() + getUpperLimit()));
611  }
612 
613 
614  JOrientation orientation; //!< orientation calibration
615  JPosition position; //!< position calibration
616  };
617 }
618 
619 #endif
JTOOLS::JElement2D< double, JACOUSTICS::JMODEL::JString > element_type
Definition: JDynamics.hh:319
void set(const double t0_s)
Set.
Definition: JDynamics.hh:115
JDAQUTCTimeRange getUTCTimeRange()
Get UTC time range.
Exceptions.
bool hasDetectorBuilder(const int id)
Check if detector builder is available.
JDAQUTCExtended getTimesliceStart() const
Get start of timeslice.
int id
module identifier
General purpose class for collection of elements, see: &lt;a href=&quot;JTools.PDF&quot;;&gt;Collection of elements...
Definition: JCollection.hh:73
const_reverse_iterator rend() const
begin of reverse of calibration data
Definition: JDynamics.hh:379
The elements in a collection are sorted according to their abscissa values and a given distance opera...
coverage_type getCoverage(const JDAQChronometer &chronometer) const
Get coverage at given time.
Definition: JDynamics.hh:597
coverage_type getCoverage(const double t1_s) const
Get coverage at given time.
Definition: JDynamics.hh:585
Dynamic orientation calibration.
Definition: JDynamics.hh:127
Dynamic position calibration.
Definition: JDynamics.hh:309
double position
coverage of detector by available position calibration [0,1]
Definition: JDynamics.hh:575
const JDetector & getDetector() const
Get actual detector.
Definition: JDynamics.hh:511
static JDetectorMechanics getMechanics
Function object to get string mechanics.
Definition: JMechanics.hh:242
container_type::const_reverse_iterator const_reverse_iterator
Definition: JHashMap.hh:87
JDynamics(const JDetector &detector, const double Tmax_s)
Constructor.
Definition: JDynamics.hh:495
JTOOLS::JHashMap< int, function_type > data_type
Definition: JDynamics.hh:324
const_reverse_iterator rend() const
begin of reverse of calibration data
Definition: JDynamics.hh:211
JQuaternion3D getQuaternion(const JQuaternion &Q)
Get quaternion.
JTOOLS::JPolfitFunction1D< NUMBER_OF_POINTS, NUMBER_OF_DEGREES, element_type, JTOOLS::JCollection > function_type
Definition: JDynamics.hh:138
function_type::collection_type::container_type container_type
Definition: JDynamics.hh:139
General purpose class for hash map of unique elements.
ROOT TTree parameter settings.
JPosition position
position calibration
Definition: JDynamics.hh:615
Detector data structure.
Definition: JDetector.hh:89
#define THROW(JException_t, A)
Marco for throwing exception with std::ostream compatible message.
Definition: JException.hh:712
Acoustic geometries.
const_reverse_iterator rbegin() const
begin of reverse of calibration data
Definition: JDynamics.hh:378
JOrientation orientation
orientation calibration
Definition: JDynamics.hh:614
const_iterator begin() const
begin of calibration data
Definition: JDynamics.hh:208
static JRotation getRotation
Function object to get rotation matrix to go from first to second module.
const std::string & getVersion() const
Get version.
Interface of object iteration for a single data type.
data_type::const_reverse_iterator const_reverse_iterator
Definition: JDynamics.hh:327
Data structure for detector geometry and calibration.
JTOOLS::JHashMap< int, JGEOMETRY3D::JQuaternion3D > buffer_type
Definition: JDynamics.hh:141
JMODEL::JString getString(const JFit &fit)
Get model parameters of string.
ROOT TTree parameter settings.
const JGeometry & getGeometry() const
Get detector geometry.
Definition: JDynamics.hh:426
Calibration.
Definition: JHead.hh:328
const JQuaternion3D & getQuaternion() const
Get quaternion.
JACOUSTICS::JGeometry JGeometry
Definition: JDynamics.hh:317
static const int COMPASS_DISABLE
Enable (disable) use of compass if this status bit is 0 (1);.
double orientation
coverage of detector by available orientation calibration [0,1]
Definition: JDynamics.hh:574
Auxiliary data structure to pre-load auxiliary data in memory.
Definition: JDynamics.hh:63
void load(JObjectIterator_t &input)
Load calibration data.
Definition: JDynamics.hh:523
const_reverse_iterator rbegin() const
begin of reverse of calibration data
Definition: JDynamics.hh:210
JUTCTracker(const double Tmax_s)
Constructor.
Definition: JDynamics.hh:96
const JPolynome f1(1.0, 2.0, 3.0)
Function.
data_type::const_iterator const_iterator
Definition: JDynamics.hh:326
Acoustic event fit toolkit.
double UNIXTimeStop
stop time
uint32_t getUTCseconds() const
Get major time.
void load(JObjectIterator< JACOUSTICS::JEvt > &input)
Load calibration data.
Definition: JDynamics.hh:354
JVector3D & sub(const JVector3D &vector)
Subtract vector.
Definition: JVector3D.hh:158
const_iterator end() const
end of calibration data
Definition: JDynamics.hh:377
virtual const pointer_type & next()=0
Get next element.
Detector file.
Definition: JHead.hh:226
Detector support kit.
Acoustic event fit.
Version with quaternion and time offset per module.
JPosition(const JDetector &detector, const double Tmax_s)
Constructor.
Definition: JDynamics.hh:336
int getID() const
Get identifier.
Definition: JObjectID.hh:50
coverage_type getCoverage() const
Get actual coverage.
Definition: JDynamics.hh:608
then awk string
virtual bool hasNext()=0
Check availability of next element.
General purpose class for a collection of sorted elements.
Compass event fit.
void load(const std::string &file_name)
Load mechanical model parameters from file.
Definition: JMechanics.hh:137
const JPosition3D & getPosition() const
Get position.
Definition: JPosition3D.hh:130
double getCoverage(const JDetector &detector, const double t1_s) const
Get coverage.
Definition: JDynamics.hh:221
void load(JObjectIterator< JCOMPASS::JOrientation > &input)
Load calibration data.
Definition: JDynamics.hh:186
JPreloader(const int id)
Constructor.
Definition: JDynamics.hh:69
JTOOLS::JElement2D< double, JGEOMETRY3D::JQuaternion3D > element_type
Definition: JDynamics.hh:135
Data structure for coverage of dynamic calibrations.
Definition: JDynamics.hh:573
static const JGetDetectorVersion getDetectorVersion
Function object to map detector version to numerical value.
data_type::const_iterator const_iterator
Definition: JDynamics.hh:144
bool update(JDetector &detector, const double t1_s)
Calibrate given detector at given UTC time.
Definition: JDynamics.hh:255
const_iterator end() const
end of calibration data
Definition: JDynamics.hh:209
data_type::const_reverse_iterator const_reverse_iterator
Definition: JDynamics.hh:145
bool update(const double t1_s)
Get detector calibrated at given time.
Definition: JDynamics.hh:538
Data structure for unit quaternion in three dimensions.
bool empty() const
empty
Definition: JDynamics.hh:374
bool update(const JDAQChronometer &chronometer)
Get detector calibrated at given time.
Definition: JDynamics.hh:564
z range($ZMAX-$ZMIN)< $MINIMAL_DZ." fi fi typeset -Z 4 STRING typeset -Z 2 FLOOR JPlot1D -f $
UTC time range [s].
size_t size() const
size
Definition: JDynamics.hh:375
Dynamic detector calibration.
Definition: JDynamics.hh:81
void reset(T &value)
Reset value.
void setRange(double &xmin, double &xmax, const bool logx)
Set axis range.
double UNIXTimeStart
start time
Auxiliary class to define a range between two values.
JPosition3D getPiezoPosition()
Get relative position of piezo in optical module.
JTOOLS::JHashMap< int, function_type > data_type
Definition: JDynamics.hh:142
const_iterator begin() const
begin of calibration data
Definition: JDynamics.hh:376
JOrientation(const JDetector &detector, const double Tmax_s)
Constructor.
Definition: JDynamics.hh:154
Template class for polynomial interpolation in 1D.
Definition: JPolfit.hh:171
bool update(JDetector &detector, const double t1_s)
Calibrate given detector at given UTC time.
Definition: JDynamics.hh:439
2D Element.
Definition: JElement.hh:46
Orientation of module.
Data structure for position in three dimensions.
Definition: JPosition3D.hh:36
Exception for accessing a value in a collection that is outside of its range.
Definition: JException.hh:178
Compass event data types.
container_type::const_iterator const_iterator
Definition: JHashMap.hh:86
static JRange< T, JComparator_t > DEFAULT_RANGE()
Default range.
Definition: JRange.hh:555
JDetectorBuilder & getDetectorBuilder()
Get detector builder.
double getCoverage(const JDetector &detector, const double t1_s) const
Get coverage.
Definition: JDynamics.hh:389
Model for fit to acoutsics data.
Acoustic event fit.
bool has(const T &value) const
Test whether given value is present.
Auxiliary interface for building detector.
JVector3D & add(const JVector3D &vector)
Add vector.
Definition: JVector3D.hh:142
JTOOLS::JPolfitFunction1D< NUMBER_OF_POINTS, NUMBER_OF_DEGREES, element_type, JTOOLS::JCollection > function_type
Definition: JDynamics.hh:322
const JModule & getModule(const int id=-1, const JLocation &location=JLocation()) const
Get module.
Auxiliary data structure to track applicability period of calibration data.
Definition: JDynamics.hh:88
range_type & join(const range_type &range)
Join ranges.
Definition: JRange.hh:415
JQuaternion3D & conjugate()
Conjugate quaternion.
container_type::iterator iterator
Definition: JHashMap.hh:88