Jpp 19.3.0-rc.3
the software that should make you happy
Loading...
Searching...
No Matches
JCompass.cc File Reference

Example program to monitor AHRS data of the first floor and check offsets vs detector file. More...

#include <iostream>
#include <iomanip>
#include <vector>
#include <map>
#include "TROOT.h"
#include "TFile.h"
#include "TGraph.h"
#include "JDB/JAHRS.hh"
#include "JDB/JAHRSCalibration_t.hh"
#include "JDB/JSupport.hh"
#include "JDB/JAHRSToolkit.hh"
#include "JGeometry3D/JEigen3D.hh"
#include "JROOT/JGraph.hh"
#include "JDetector/JDetector.hh"
#include "JDetector/JDetectorToolkit.hh"
#include "JDetector/JDetectorSupportkit.hh"
#include "JDetector/JModuleRouter.hh"
#include "JDetector/JCompass.hh"
#include "JGeometry3D/JQuaternion3D.hh"
#include "JGeometry3D/JDirection3D.hh"
#include "JLang/JComparator.hh"
#include "JSupport/JMultipleFileScanner.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

Example program to monitor AHRS data of the first floor and check offsets vs detector file.

Author
mdejong, vkulikovskiy

Definition in file examples/JDB/JCompass.cc.

Function Documentation

◆ main()

int main ( int argc,
char ** argv )

Definition at line 42 of file examples/JDB/JCompass.cc.

43{
44 using namespace std;
45 using namespace JPP;
46
48 JLimit_t& numberOfEvents = inputFile.getLimit();
49 string outputFile;
50 string detectorFile;
51 double Tmax_s;
52 string ahrsFile;
53 int debug;
54 JRange<int> frange;
55
56 try {
57
58 JParser<> zap("Example program to monitor AHRS data.");
59
60 zap['f'] = make_field(inputFile);
61 zap['n'] = make_field(numberOfEvents) = JLimit::max();
62 zap['o'] = make_field(outputFile) = "ahrs.root";
63 zap['a'] = make_field(detectorFile);
64 zap['T'] = make_field(Tmax_s) = 600.0; // [s]
65 zap['R'] = make_field(frange, "floor range") = JRange<int>(1,1);
66 zap['c'] = make_field(ahrsFile, "output of JAHRSCalibration");
67 zap['d'] = make_field(debug) = 2;
68
69
70 zap(argc, argv);
71 }
72 catch(const exception &error) {
73 FATAL(error.what() << endl);
74 }
75
77
78 try {
79 load(detectorFile, detector);
80 }
81 catch(const JException& error) {
82 FATAL(error);
83 }
84
85 const JModuleRouter router(detector);
86
87 const JAHRSCalibration_t calibration(ahrsFile.c_str());
89
90 typedef vector<JAHRS> buffer_type; // data type
91 typedef map<JObjectID, buffer_type> map_type; // DOM -> data
92
93 map_type data;
94
95 for (int counter = 0; inputFile.hasNext(); ++counter) {
96
97 STATUS("counter: " << setw(8) << counter << '\r' << flush); DEBUG(endl);
98
99 const JAHRS* parameters = inputFile.next();
100
101 if (is_valid(*parameters) && router.hasModule(parameters->DOMID) && calibration.has(parameters->DOMID)) {
102
103 const JLocation location = router.getModule(parameters->DOMID);
104
105 if (frange(location.getFloor())) {
106 data[parameters->DOMID].push_back(*parameters);
107 }
108 }
109 }
110
111 map <JObjectID, double> DOM_heading_map;
112 const JDetectorBuilder& demo = getDetectorBuilder(detector.getID());
113 for (JDetector::const_iterator module = detector.begin(); module != detector.end(); ++module) {
114 if (frange(module->getFloor())) {
115 JModule buffer = demo.getModule(module->getID(), module->getLocation());
116 const JQuaternion3D Q = getRotation(buffer, *module);
118 const double phi = (JVector3Z_t.getDot(q1.twist) >= 0.0 ? +1.0 : -1.0) * q1.twist.getAngle();
119 DOM_heading_map[module->getID()] = phi;
120 cout << "Heading from detector file: " << module->getID() << " " << module->getString() << " " << module->getFloor() << " " << phi/M_PI*180. << " [deg]" << endl;
121 }
122 }
123
124 STATUS(endl);
125
126
131
132 JGraph_t PD_all;
133
134 for (map_type::iterator module = data.begin(); module != data.end(); ++module) {
135
136 if (!module->second.empty()) {
137 const JLocation location = router.getModule(module->first);
138
139 sort(module->second.begin(), module->second.end(), make_comparator(&JAHRS::UNIXTIME));
140
141 for (buffer_type::const_iterator p = module->second.begin(); p != module->second.end(); ) {
142
143 set<int> buffer;
144
145 buffer_type::const_iterator q = p;
147
148 for ( ; q != module->second.end() && q->UNIXTIME - p->UNIXTIME <= Tmax_s * 1.0e3; ++q) {
149 Q.put(JCompass(*q, calibration.get(q->DOMID)).getQuaternion());
150 }
151
152 JDirection3D u(0,0,1);
153 JDirection3D x(1,0,0);
154 JDirection3D d(cos(DOM_heading_map[module->first]),sin(DOM_heading_map[module->first]),0);
155
156 u.rotate(Q);
157 x.rotate(Q);
158 d.rotate_back(Q);
159
160 const double t1 = p->UNIXTIME * 1.0e-3 + 0.5*Tmax_s;
161
162 ZO[module->first].put(t1, atan2(u.getDY(), u.getDX()));
163 ZA[module->first].put(t1, sqrt(u.getDX()*u.getDX() + u.getDY()* u.getDY()));
164 PD[module->first].put(t1, atan2(d.getDY(), d.getDX()));
165 PD_all.put(location.getString(), atan2(d.getDY(), d.getDX()));
166 XO[module->first].put(t1, atan2(x.getDY(), x.getDX()));
167
168 p = q;
169 }
170 }
171 }
172
173
174 TFile out(outputFile.c_str(), "recreate");
175
176 for (map<JObjectID, JGraph_t>::const_iterator i = ZO.begin(); i != ZO.end(); ++i) {
177 const JLocation location = router.getModule(i->first);
178 out << JGraph(i->second, MAKE_CSTRING("G[" << location.getString() << ","<< location.getFloor() << "].orientation"));
179 }
180
181 for (map<JObjectID, JGraph_t>::const_iterator i = ZA.begin(); i != ZA.end(); ++i) {
182 const JLocation location = router.getModule(i->first);
183 out << JGraph(i->second, MAKE_CSTRING("G[" << location.getString() << ","<< location.getFloor() << "].amplitude"));
184 }
185
186 for (map<JObjectID, JGraph_t>::const_iterator i = PD.begin(); i != PD.end(); ++i) {
187 const JLocation location = router.getModule(i->first);
188 out << JGraph(i->second, MAKE_CSTRING("G[" << location.getString() << ","<< location.getFloor() << "].offset"));
189 }
190
191 for (map<JObjectID, JGraph_t>::const_iterator i = XO.begin(); i != XO.end(); ++i) {
192 const JLocation location = router.getModule(i->first);
193 out << JGraph(i->second, MAKE_CSTRING("G[" << location.getString() << ","<< location.getFloor() << "].xorientation"));
194 }
195 out << JGraph(PD_all, "all_off");
196
197
198 out.Write();
199 out.Close();
200}
string outputFile
#define DEBUG(A)
Message macros.
Definition JMessage.hh:62
#define STATUS(A)
Definition JMessage.hh:63
#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
#define MAKE_CSTRING(A)
Make C-string.
Definition JPrint.hh:72
Data structure for compass in three dimensions.
Definition JCompass.hh:51
JQuaternion3D getQuaternion() const
Get quaternion.
Definition JCompass.hh:201
Detector data structure.
Definition JDetector.hh:96
Logical location of module.
Definition JLocation.hh:40
int getFloor() const
Get floor number.
Definition JLocation.hh:146
int getString() const
Get string number.
Definition JLocation.hh:135
Router for direct addressing of module data in detector data structure.
Data structure for a composite optical module.
Definition JModule.hh:75
Data structure for direction in three dimensions.
Data structure for unit quaternion in three dimensions.
double getDot(const JVector3D &vector) const
Get dot product.
Definition JVector3D.hh:282
General exception.
Definition JException.hh:24
Utility class to parse command line options.
Definition JParser.hh:1698
General purpose class for object reading from a list of file names.
virtual bool hasNext() override
Check availability of next element.
virtual const pointer_type & next() override
Get next element.
Range of values.
Definition JRange.hh:42
const char * map
Definition elog.cc:87
static JRotation getRotation
Function object to get rotation matrix to go from first to second module.
JDetectorBuilder & getDetectorBuilder()
Get detector builder.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
static const JVector3D JVector3Z_t(0, 0, 1)
unit z-vector
JComparator< JResult_t T::*, JComparison::lt > make_comparator(JResult_t T::*member)
Helper method to create comparator between values of data member.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
std::vector< JHitW0 > buffer_type
hits
Definition JPerth.cc:70
bool is_valid(const json &js)
Check validity of JSon data.
std::map< int, range_type > map_type
Calibration.
Definition JHead.hh:330
Detector file.
Definition JHead.hh:227
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 interface for building detector.
const JModule & getModule(const int id=-1, const JLocation &location=JLocation()) const
Get module.
Auxiliary data structure for decomposition of quaternion in twist and swing quaternions.
Auxiliary class to determine average of set of values.
Definition JMath.hh:409
void put(const JValue_t &value, const double w=1.0)
Put value.
Definition JMath.hh:467
Auxiliary data structure to build TGraph.
Definition JGraph.hh:44
Auxiliary class for defining the range of iterations of objects.
Definition JLimit.hh:45
static counter_type max()
Get maximum counter value.
Definition JLimit.hh:128