Jpp 20.0.0-rc.7
the software that should make you happy
Loading...
Searching...
No Matches
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.
A policy for missing compass data is applied in which data from neighbouring compasses are used.
The number of floors that will be covered can be specified with option -N <npy>.
Finally, data within a given time window can be averaged (option -T <T_s>.
)

Author
mdejong

Definition in file software/JCompass/JBallarat.cc.

Function Documentation

◆ main()

int main ( int argc,
char ** argv )

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

147{
148 using namespace std;
149 using namespace JPP;
150
151 JMultipleFileScanner_t inputFile;
152 counter_type numberOfEvents;
154 string detectorFile;
155 string ahrsFile;
156 double angle_deg;
157 double T_s;
158 size_t npy;
159 int debug;
160
161 try {
162
163 JParser<> zap("Auxiliary program to process AHRS data.");
164
165 zap['f'] = make_field(inputFile, "output of JConvertDB -q ahrs");
166 zap['n'] = make_field(numberOfEvents) = JLimit::max();
167 zap['a'] = make_field(detectorFile);
168 zap['c'] = make_field(ahrsFile, "output of JAHRSCalibration");
169 zap['o'] = make_field(outputFile, "ROOT formatted orientations file");
170 zap['S'] = make_field(angle_deg, "maximal angle w.r.t. fit") = 0.0;
171 zap['T'] = make_field(T_s, "time window for averaging") = 0.0;
172 zap['N'] = make_field(npy, "number of floors for missing data policy") = 1;
173 zap['d'] = make_field(debug) = 1;
174
175 zap(argc, argv);
176 }
177 catch(const exception &error) {
178 FATAL(error.what() << endl);
179 }
180
181
183
184 try {
185 load(detectorFile, detector);
186 }
187 catch(const JException& error) {
188 FATAL(error);
189 }
190
191 const JModuleRouter router(detector);
192 const JNOAAFunction1D_t& getMagneticDeclination = (isARCADetector(detector) ? static_cast<const JNOAAFunction1D_t&>(getARCAMagneticDeclination) :
194 static_cast<const JNOAAFunction1D_t&>(getZEROMagneticDeclination));
197 0.0);
198
199 NOTICE("Magnetic declination " << getMagneticDeclination << endl);
200 NOTICE("Meridian angle [rad] " << FIXED(5,3) << meridian << endl);
201
202 const JAHRSCalibration_t calibration(ahrsFile.c_str());
204
205 typedef JHashMap<int, buffer_type> map_type; // container for temporary storage of data
206
207 JLegendre<JQuaternion3D, NUMBER_OF_DEGREES> f1; // interpolator for outlier removal
208
209
210 outputFile.open();
211
212 outputFile.put(JMeta(argc, argv));
213
214 counter_type counter = 0;
215
216 for (JMultipleFileScanner_t::const_iterator file_name = inputFile.begin(); file_name != inputFile.end(); ++file_name) {
217
218 STATUS("processing file " << *file_name << "... " << flush);
219
220 // collect data
221
222 map_type data;
223
224 for (JMultipleFileScanner<JAHRS> in(*file_name); in.hasNext() && counter != numberOfEvents; ++counter) {
225
226 const JAHRS* parameters = in.next();
227 const int id = parameters->DOMID;
228
229 if (is_valid(*parameters) && calibration.has(id) && router.hasModule(id)) {
230
231 const JModule& module = router.getModule(id);
232
233 if (module.getFloor() != 0 && !module.has(COMPASS_DISABLE)) {
234
235 JCompass compass(*parameters, calibration.get(id));
236
237 compass.correct(getMagneticDeclination(parameters->UNIXTIME * 1.0e-3), meridian);
238
239 const JQuaternion3D Q = compass.getQuaternion();
240
241 data[id].push_back(element_type(parameters->UNIXTIME * 1.0e-3, Q, 1, false));
242 }
243 }
244 }
245
246 // remove outliers
247
248 if (angle_deg > 0.0) {
249
250 for (map_type::iterator module = data.begin(); module != data.end(); ++module) {
251
252 if (!module->second.empty()) {
253
254 sort(module->second.begin(), module->second.end(), make_comparator(&element_type::first));
255
256 buffer_type::iterator out = module->second.begin(); // output
257 buffer_type::const_iterator in = module->second.begin(); // input
258 buffer_type::const_iterator p = module->second.begin(); // begin interpolation data
259 buffer_type::const_iterator q = module->second.begin(); // end interpolation data
260
261 for (int i = 0; i != NUMBER_OF_POINTS && q != module->second.end(); ++i, ++q) {}
262
263 for (int i = 0; i != NUMBER_OF_POINTS/2 && in != q; ++i, ++in) {
264
265 f1.set(p, in, q);
266
267 if (getAngle(in->second, f1(in->first)) <= angle_deg) {
268 *out = *in;
269 ++out;
270 }
271 }
272
273 for (++p; q++ != module->second.end(); ++p, ++in) {
274
275 f1.set(p, in, q);
276
277 if (getAngle(in->second, f1(in->first)) <= angle_deg) {
278 *out = *in;
279 ++out;
280 }
281 }
282
283 for ( ; in != module->second.end(); ++in) {
284
285 f1.set(p, in, q);
286
287 if (getAngle(in->second, f1(in->first)) <= angle_deg) {
288 *out = *in;
289 ++out;
290 }
291 }
292
293 module->second.erase(out, module->second.end()); // remove leftovers
294 }
295 }
296 }
297
298
299 // apply policy for missing modules and write output
300
301 const array_type<map_type::key_type>& buffer = make_array(data.begin(), data.end(), &map_type::value_type::first);
302
303 const JPolicy policy(router, buffer.begin(), buffer.end(), npy);
304
305 for (JPolicy::const_iterator module = policy.begin(); module != policy.end(); ++module) {
306
307 buffer_type buffer;
308
309 for (JPolicy::mapped_type::const_iterator in = module->second.begin(); in != module->second.end(); ++in) {
310 for (map_type::mapped_type::const_iterator i = data[*in].begin(); i != data[*in].end(); ++i) {
311 buffer.push_back(element_type(i->first, i->second, 1, module->first != *in));
312 }
313 }
314
315 // average
316
317 if (T_s > 0.0) {
318
319 sort(buffer.begin(), buffer.end(), make_comparator(&element_type::first));
320
321 buffer_type::iterator out = buffer.begin(); // output
322 buffer_type::const_iterator p = buffer.begin(); // begin averaging data
323 buffer_type::const_iterator q = buffer.begin(); // end averaging data
324
325 for (p = buffer.begin(); p != buffer.end(); p = q) {
326
327 for (q = p; q != buffer.end() && q->first - p->first < T_s; ++q) {}
328
329 if (distance(p,q) > 1) {
330
331 const array_type<double>& t1 = make_array(p, q, &element_type::first);
332 const array_type<JQuaternion3D>& q1 = make_array(p, q, &element_type::second);
333
334 out->first = getAverage(t1.begin(), t1.end());
335 out->second = getAverage(q1.begin(), q1.end());
336 out->ns = distance(p,q);
337 out->policy = element_type::getOR(p,q);
338
339 } else {
340
341 *out = *p;
342 }
343
344 ++out;
345 }
346
347 buffer.erase(out, buffer.end()); // remove leftovers
348 }
349
350 for (buffer_type::const_iterator i = buffer.begin(); i != buffer.end(); ++i) {
351 outputFile.put(JOrientation(module->first, i->first, getQuaternion(i->second), i->ns, i->policy));
352 }
353 }
354
355 STATUS(endl);
356 }
357
358 JMultipleFileScanner<JMeta> io(inputFile);
359
360 io >> outputFile;
361
362 outputFile.close();
363}
string outputFile
#define STATUS(A)
Definition JMessage.hh:63
#define NOTICE(A)
Definition JMessage.hh:64
#define FATAL(A)
Definition JMessage.hh:67
int debug
debug level
Definition JSirene.cc:72
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition JParser.hh:2142
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
Data structure for compass in three dimensions.
Definition JCompass.hh:51
Detector data structure.
Definition JDetector.hh:96
int getFloor() const
Get floor number.
Definition JLocation.hh:146
Router for direct addressing of module data in detector data structure.
Data structure for a composite optical module.
Definition JModule.hh:76
bool has(const int bit) const
Test PMT status.
Definition JStatus.hh:198
Data structure for unit quaternion in three dimensions.
const JQuaternion3D & getQuaternion() const
Get quaternion.
General exception.
Definition JException.hh:24
Utility class to parse command line options.
Definition JParser.hh:1698
Object writing to file.
General purpose class for object reading from a list of file names.
virtual bool hasNext() override
Check availability of next element.
static const int COMPASS_DISABLE
Enable (disable) use of compass if this status bit is 0 (1);.
JQuaternion3D getQuaternion(const JQuaternion &Q)
Get quaternion.
static JARCAMagneticDeclination getARCAMagneticDeclination
Function object for magnetic declination at ARCA site.
Definition JNOAA.hh:850
static JORCAMagneticDeclination getORCAMagneticDeclination
Function object for magnetic declination at ORCA site.
Definition JNOAA.hh:851
static const double ORCA_MERIDIAN_CONVERGENCE_ANGLE_RAD
ORCA meridian convergence angle [rad].
static const double ARCA_MERIDIAN_CONVERGENCE_ANGLE_RAD
ARCA meridian convergence angle [rad].
static JZEROMagneticDeclination getZEROMagneticDeclination
Function object for zero magnetic declination.
Definition JNOAA.hh:852
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
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.
double getAngle(const JQuaternion3D &first, const JQuaternion3D &second)
Get space angle between quanternions.
JComparator< JResult_t T::*, JComparison::lt > make_comparator(JResult_t T::*member)
Helper method to create comparator between values of data member.
const array_type< JValue_t > & make_array(const JValue_t(&array)[N])
Method to create array of values.
Definition JVectorize.hh:54
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).
Long64_t counter_type
Type definition for counter.
bool is_valid(const json &js)
Check validity of JSon data.
std::map< int, range_type > map_type
Auxiliary data structure for floating point format specification.
Definition JManip.hh:448
Calibration.
Definition JHead.hh:330
Detector file.
Definition JHead.hh:227
Auxiliary base class for interpolation of magnetic declination data obtained from website of NOAA.
Definition JNOAA.hh:28
Orientation of module.
Auxiliary class to define policy for invalid modules.
Definition JPolicy.hh:34
Auxiliary class to map module identifier to AHRS calibration.
Auxiliary data structure to check validity of AHRS data.
long long int UNIXTIME
[ms]
Definition JAHRS.hh:26
Auxiliary data structure for return type of make methods.
Definition JVectorize.hh:28
Template definition for function evaluation of Legendre polynome.
Definition JLegendre.hh:269
void set(T __begin, T __end)
Set Legendre polynome.
Definition JLegendre.hh:327
static counter_type max()
Get maximum counter value.
Definition JLimit.hh:128
Auxiliary class for ROOT I/O of application specific meta data.
Definition JMeta.hh:72
Auxiliary base class for list of file names.
General purpose class for hash map of unique keys.
Definition JHashMap.hh:75