Jpp 21.0.0-rc.1
the software that should make you happy
Loading...
Searching...
No Matches
examples/JDB/JCompass.cc
Go to the documentation of this file.
1#include <iostream>
2#include <iomanip>
3#include <vector>
4#include <map>
5
6#include "TROOT.h"
7#include "TFile.h"
8#include "TGraph.h"
9
10#include "JDB/JAHRS.hh"
12#include "JDB/JSupport.hh"
13#include "JDB/JAHRSToolkit.hh"
14
15#include "JGeometry3D/JEigen3D.hh" //JAverage
16
17#include "JROOT/JGraph.hh"
18
23#include "JDetector/JCompass.hh"
24
27
28#include "JLang/JComparator.hh"
30
31#include "Jeep/JPrint.hh"
32#include "Jeep/JParser.hh"
33#include "Jeep/JMessage.hh"
34
35
36/**
37 * \file
38 *
39 * Example program to monitor AHRS data of the first floor and check offsets vs detector file
40 * \author mdejong, vkulikovskiy
41 */
42int main(int argc, char **argv)
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<JModuleIdentifier, 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<JModuleIdentifier, double> DOM_heading_map;
112
113 const JDetectorBuilder& demo = getDetectorBuilder(detector.getID());
114
115 for (JDetector::const_iterator module = detector.begin(); module != detector.end(); ++module) {
116 if (frange(module->getFloor())) {
117
118 const JModule buffer = demo.getModule(module->getID(), module->getLocation());
119
120 const JQuaternion3D Q = getRotation(buffer, *module);
121
123
124 const double phi = (JVector3Z_t.getDot(q1.twist) >= 0.0 ? +1.0 : -1.0) * q1.twist.getAngle();
125
126 DOM_heading_map[module->getID()] = phi;
127 cout << "Heading from detector file: " << module->getID() << " " << module->getString() << " " << module->getFloor() << " " << phi/M_PI*180. << " [deg]" << endl;
128 }
129 }
130
131 STATUS(endl);
132
133
138
139 JGraph_t PD_all;
140
141 for (map_type::iterator module = data.begin(); module != data.end(); ++module) {
142
143 if (!module->second.empty()) {
144 const JLocation location = router.getModule(module->first);
145
146 sort(module->second.begin(), module->second.end(), make_comparator(&JAHRS::UNIXTIME));
147
148 for (buffer_type::const_iterator p = module->second.begin(); p != module->second.end(); ) {
149
150 set<int> buffer;
151
152 buffer_type::const_iterator q = p;
154
155 for ( ; q != module->second.end() && q->UNIXTIME - p->UNIXTIME <= Tmax_s * 1.0e3; ++q) {
156 Q.put(JCompass(*q, calibration.get(q->DOMID)).getQuaternion());
157 }
158
159 JDirection3D u(0,0,1);
160 JDirection3D x(1,0,0);
161 JDirection3D d(cos(DOM_heading_map[module->first]),sin(DOM_heading_map[module->first]),0);
162
163 u.rotate(Q);
164 x.rotate(Q);
165 d.rotate_back(Q);
166
167 const double t1 = p->UNIXTIME * 1.0e-3 + 0.5*Tmax_s;
168
169 ZO[module->first].put(t1, atan2(u.getDY(), u.getDX()));
170 ZA[module->first].put(t1, sqrt(u.getDX()*u.getDX() + u.getDY()* u.getDY()));
171 PD[module->first].put(t1, atan2(d.getDY(), d.getDX()));
172 PD_all.put(location.getString(), atan2(d.getDY(), d.getDX()));
173 XO[module->first].put(t1, atan2(x.getDY(), x.getDX()));
174
175 p = q;
176 }
177 }
178 }
179
180
181 TFile out(outputFile.c_str(), "recreate");
182
183 for (map<JModuleIdentifier, JGraph_t>::const_iterator i = ZO.begin(); i != ZO.end(); ++i) {
184 const JLocation location = router.getModule(i->first);
185 out << JGraph(i->second, MAKE_CSTRING("G[" << location.getString() << ","<< location.getFloor() << "].orientation"));
186 }
187
188 for (map<JModuleIdentifier, JGraph_t>::const_iterator i = ZA.begin(); i != ZA.end(); ++i) {
189 const JLocation location = router.getModule(i->first);
190 out << JGraph(i->second, MAKE_CSTRING("G[" << location.getString() << ","<< location.getFloor() << "].amplitude"));
191 }
192
193 for (map<JModuleIdentifier, JGraph_t>::const_iterator i = PD.begin(); i != PD.end(); ++i) {
194 const JLocation location = router.getModule(i->first);
195 out << JGraph(i->second, MAKE_CSTRING("G[" << location.getString() << ","<< location.getFloor() << "].offset"));
196 }
197
198 for (map<JModuleIdentifier, JGraph_t>::const_iterator i = XO.begin(); i != XO.end(); ++i) {
199 const JLocation location = router.getModule(i->first);
200 out << JGraph(i->second, MAKE_CSTRING("G[" << location.getString() << ","<< location.getFloor() << "].xorientation"));
201 }
202
203 out << JGraph(PD_all, "all_off");
204
205
206 out.Write();
207 out.Close();
208}
string outputFile
ROOT TTree parameter settings.
Detector support kit.
Data structure for detector geometry and calibration.
General purpose messaging.
#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:74
Direct access to module in detector data structure.
Scanning of objects from multiple files according a format that follows from the extension of each fi...
Utility class to parse command line options.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition JParser.hh:2140
I/O formatting auxiliaries.
#define MAKE_CSTRING(A)
Make C-string.
Definition JPrint.hh:57
Data structure for compass in three dimensions.
Definition JCompass.hh:51
JQuaternion3D getQuaternion() const
Get quaternion.
Definition JCompass.hh:198
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.
bool hasModule(const JModuleIdentifier &id) const
Has module.
const JModule & getModule(const JModuleIdentifier &id) const
Get module parameters.
Data structure for a composite optical module.
Definition JModule.hh:76
Data structure for direction in three dimensions.
JDirection3D & rotate(const JRotation3D &R)
Rotate.
JDirection3D & rotate_back(const JRotation3D &R)
Rotate back.
Data structure for unit quaternion in three dimensions.
double getAngle() const
Get rotation angle.
double getDot(const JVector3D &vector) const
Get dot product.
Definition JVector3D.hh:282
double getDY() const
Get y direction.
Definition JVersor3D.hh:106
double getDX() const
Get x direction.
Definition JVersor3D.hh:95
General exception.
Definition JException.hh:25
Utility class to parse command line options.
Definition JParser.hh:1697
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
int main(int argc, char **argv)
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:74
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.
JQuaternion3D twist
rotation around parallel axis
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