Jpp  17.1.1
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Functions
software/JCompass/JBallarat.cc File Reference

Auxiliary program to process AHRS data. More...

#include <string>
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <utility>
#include <vector>
#include "km3net-dataformat/definitions/module_status.hh"
#include "JDB/JSupport.hh"
#include "JDB/JAHRS.hh"
#include "JDB/JAHRSCalibration_t.hh"
#include "JDB/JAHRSToolkit.hh"
#include "JSupport/JMultipleFileScanner.hh"
#include "JSupport/JFileRecorder.hh"
#include "JSupport/JMeta.hh"
#include "JDetector/JDetector.hh"
#include "JDetector/JDetectorToolkit.hh"
#include "JDetector/JModuleRouter.hh"
#include "JDetector/JCompass.hh"
#include "JGeometry3D/JQuaternion3D.hh"
#include "JGeometry3D/JEigen3D.hh"
#include "JTools/JHashMap.hh"
#include "JLang/JVectorize.hh"
#include "JLang/JComparator.hh"
#include "JMath/JLegendre.hh"
#include "JCompass/JEvt.hh"
#include "JCompass/JEvtToolkit.hh"
#include "JCompass/JSupport.hh"
#include "JCompass/JNOAA.hh"
#include "JCompass/JPolicy.hh"
#include "JCompass/JCompassSupportkit.hh"
#include "Jeep/JPrint.hh"
#include "Jeep/JParser.hh"
#include "Jeep/JMessage.hh"

Go to the source code of this file.

Functions

int main (int argc, char **argv)
 

Detailed Description

Auxiliary program to process AHRS data.

The AHRS calibration as well as the quaternion calibration are applied to the data.
Possible outliers are removed according the specified maximal angle (option -S <angle_deg>.
For this, interpolations of the data are made based on Legendre polynomials with the number of points and the number of degrees set to NUMBER_OF_POINTS and NUMBER_OF_DEGREES, respectively.

Author
mdejong

Definition in file software/JCompass/JBallarat.cc.

Function Documentation

int main ( int  argc,
char **  argv 
)

Definition at line 63 of file software/JCompass/JBallarat.cc.

64 {
65  using namespace std;
66  using namespace JPP;
67 
68  JMultipleFileScanner_t inputFile;
69  counter_type numberOfEvents;
71  string detectorFile;
72  string ahrsFile;
73  double angle_deg;
74  int debug;
75 
76  try {
77 
78  JParser<> zap("Auxiliary program to process AHRS data.");
79 
80  zap['f'] = make_field(inputFile, "output of JConvertDB -q ahrs");
81  zap['n'] = make_field(numberOfEvents) = JLimit::max();
82  zap['a'] = make_field(detectorFile);
83  zap['c'] = make_field(ahrsFile, "output of JAHRSCalibration");
84  zap['o'] = make_field(outputFile, "ROOT formatted orientations file");
85  zap['S'] = make_field(angle_deg) = 0.0;
86  zap['d'] = make_field(debug) = 1;
87 
88  zap(argc, argv);
89  }
90  catch(const exception &error) {
91  FATAL(error.what() << endl);
92  }
93 
94 
96 
97  try {
98  load(detectorFile, detector);
99  }
100  catch(const JException& error) {
101  FATAL(error);
102  }
103 
104  const JModuleRouter router(detector);
105  const JNOAAFunction1D_t& getMagneticDeclination = (isARCADetector(detector) ? static_cast<const JNOAAFunction1D_t&>(getARCAMagneticDeclination) :
107  static_cast<const JNOAAFunction1D_t&>(getZEROMagneticDeclination));
108  const double meridian = (isARCADetector(detector) ? ARCA_MERIDIAN_CONVERGENCE_ANGLE_RAD :
110  0.0);
111 
112  NOTICE("Magnetic declination " << getMagneticDeclination << endl);
113  NOTICE("Meridian angle [rad] " << FIXED(5,3) << meridian << endl);
114 
115  const JAHRSCalibration_t calibration(ahrsFile.c_str());
116  const JAHRSValidity is_valid;
117 
118 
119  typedef pair<double, JQuaternion3D> element_type;
120  typedef vector<element_type> buffer_type;
121  typedef JHashMap<int, buffer_type> map_type; // container for temporary storage of data
122 
123  JLegendre<JQuaternion3D, NUMBER_OF_DEGREES> f1; // interpolator for outlier removal
124 
125 
126  outputFile.open();
127 
128  outputFile.put(JMeta(argc, argv));
129 
130  counter_type counter = 0;
131 
132  for (JMultipleFileScanner_t::const_iterator file_name = inputFile.begin(); file_name != inputFile.end(); ++file_name) {
133 
134  STATUS("processing file " << *file_name << "... " << flush);
135 
136  // collect data
137 
138  map_type data;
139 
140  for (JMultipleFileScanner<JAHRS> in(*file_name); in.hasNext() && counter != numberOfEvents; ++counter) {
141 
142  const JAHRS* parameters = in.next();
143  const int id = parameters->DOMID;
144 
145  if (is_valid(*parameters) && calibration.has(id) && router.hasModule(id)) {
146 
147  const JModule& module = router.getModule(id);
148 
149  if (module.getFloor() != 0 && !module.has(COMPASS_DISABLE)) {
150 
151  JCompass compass(*parameters, calibration.get(id));
152 
153  compass.correct(getMagneticDeclination(parameters->UNIXTIME * 1.0e-3), meridian);
154 
155  const JQuaternion3D Q = compass.getQuaternion();
156 
157  data[id].push_back(element_type(parameters->UNIXTIME * 1.0e-3, Q));
158  }
159  }
160  }
161 
162  // remove outliers
163 
164  if (angle_deg > 0.0) {
165 
166  for (map_type::iterator module = data.begin(); module != data.end(); ++module) {
167 
168  if (!module->second.empty()) {
169 
170  sort(module->second.begin(), module->second.end(), make_comparator(&element_type::first));
171 
172  buffer_type::iterator out = module->second.begin(); // output
173  buffer_type::const_iterator in = module->second.begin(); // input
174  buffer_type::const_iterator p = module->second.begin(); // begin interpolation data
175  buffer_type::const_iterator q = module->second.begin(); // end interpolation data
176 
177  for (int i = 0; i != NUMBER_OF_POINTS && q != module->second.end(); ++i, ++q) {}
178 
179  for (int i = 0; i != NUMBER_OF_POINTS/2 && in != q; ++i, ++in) {
180 
181  f1.set(p, in, q);
182 
183  if (getAngle(in->second, f1(in->first)) <= angle_deg) {
184  *out = *in;
185  ++out;
186  }
187  }
188 
189  for (++p; q++ != module->second.end(); ++p, ++in) {
190 
191  f1.set(p, in, q);
192 
193  if (getAngle(in->second, f1(in->first)) <= angle_deg) {
194  *out = *in;
195  ++out;
196  }
197  }
198 
199  for ( ; in != module->second.end(); ++in) {
200 
201  f1.set(p, in, q);
202 
203  if (getAngle(in->second, f1(in->first)) <= angle_deg) {
204  *out = *in;
205  ++out;
206  }
207  }
208 
209  module->second.erase(out, module->second.end()); // remove leftovers
210  }
211  }
212  }
213 
214  // apply policy for missing modules and write output
215 
216  const array_type<map_type::key_type>& buffer = make_array(data.begin(), data.end(), &map_type::value_type::first);
217 
218  const JPolicy policy(router, buffer.begin(), buffer.end());
219 
220  for (JPolicy::const_iterator module = policy.begin(); module != policy.end(); ++module) {
221  for (JPolicy::mapped_type::const_iterator in = module->second.begin(); in != module->second.end(); ++in) {
222  for (map_type::mapped_type::const_iterator i = data[*in].begin(); i != data[*in].end(); ++i) {
223  outputFile.put(JOrientation(module->first, i->first, getQuaternion(i->second)));
224  }
225  }
226  }
227 
228  STATUS(endl);
229  }
230 
231  JMultipleFileScanner<JMeta> io(inputFile);
232 
233  io >> outputFile;
234 
235  outputFile.close();
236 }
bool isORCADetector(const JDetectorHeader &header)
Check if given detector header is compatible with that of ORCA.
Auxiliary class for ROOT I/O of application specific meta data.
Definition: JMeta.hh:70
Object writing to file.
Utility class to parse command line options.
Definition: JParser.hh:1517
double getAngle(const JQuaternion3D &first, const JQuaternion3D &second)
Get space angle between quanternions.
General exception.
Definition: JException.hh:23
static JARCAMagneticDeclination getARCAMagneticDeclination
Function object for magnetic declination at ARCA site.
Definition: JNOAA.hh:730
Q(UTCMax_s-UTCMin_s)-livetime_s
void correct(const double declination, const double meridian)
Correct compass for magnetic declination and meridian convergence angle.
Definition: JCompass.hh:274
JComparator< JResult_t T::*, JComparison::lt > make_comparator(JResult_t T::*member)
Helper method to create comparator between values of data member.
Definition: JComparator.hh:185
int getFloor() const
Get floor number.
Definition: JLocation.hh:145
Data structure for a composite optical module.
Definition: JModule.hh:68
bool isARCADetector(const JDetectorHeader &header)
Check if given detector header is compatible with tat of ARCA.
General purpose class for hash map of unique keys.
Definition: JHashMap.hh:72
JQuaternion3D getQuaternion(const JQuaternion &Q)
Get quaternion.
#define STATUS(A)
Definition: JMessage.hh:63
Detector data structure.
Definition: JDetector.hh:89
JPolynome & set(const Args &...args)
Set values.
Definition: JPolynome.hh:217
static JZEROMagneticDeclination getZEROMagneticDeclination
Function object for zero magnetic declination.
Definition: JNOAA.hh:732
Router for direct addressing of module data in detector data structure.
*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
Long64_t counter_type
Type definition for counter.
Auxiliary data structure for floating point format specification.
Definition: JManip.hh:446
string outputFile
static const double ARCA_MERIDIAN_CONVERGENCE_ANGLE_RAD
ARCA meridian convergence angle [rad].
static JORCAMagneticDeclination getORCAMagneticDeclination
Function object for magnetic declination at ORCA site.
Definition: JNOAA.hh:731
then echo The file $DIR KM3NeT_00000001_00000000 root already please rename or remove it first
static const int COMPASS_DISABLE
Enable (disable) use of compass if this status bit is 0 (1);.
const JPolynome f1(1.0, 2.0, 3.0)
Function.
Detector file.
Definition: JHead.hh:226
Auxiliary base class for interpolation of magnetic declination data obtained from website of NOAA...
Definition: JNOAA.hh:25
bool has(const int bit) const
Test PMT status.
Definition: JStatus.hh:120
Auxiliary class to define policy for invalid modules.
Definition: JPolicy.hh:31
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1993
const array_type< JValue_t > & make_array(const JValue_t(&array)[N])
Method to create array of values.
Definition: JVectorize.hh:54
Template definition for function evaluation of Legendre polynome.
Definition: JLegendre.hh:213
bool is_valid(const json &js)
Check validity of JSon data.
Data structure for compass in three dimensions.
Definition: JCompass.hh:49
#define NOTICE(A)
Definition: JMessage.hh:64
#define FATAL(A)
Definition: JMessage.hh:67
Data structure for unit quaternion in three dimensions.
Auxiliary base class for list of file names.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
General purpose class for object reading from a list of file names.
Auxiliary class to map module identifier to AHRS calibration.
Orientation of module.
do set_variable DETECTOR_TXT $WORKDIR detector
static const double ORCA_MERIDIAN_CONVERGENCE_ANGLE_RAD
ORCA meridian convergence angle [rad].
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:46
long long int UNIXTIME
[ms]
Definition: JAHRS.hh:26
Auxiliary data structure for return type of make methods.
Definition: JVectorize.hh:26
int debug
debug level
Auxiliary data structure to check validity of AHRS data.
Definition: JAHRSToolkit.hh:20