Default constructor.
Constructor.
Get common policy.
Get common policy.
67{
70
74 string detectorFile;
75 string ahrsFile;
76 double angle_deg;
77 double T_s;
78 size_t npy;
80
81 try {
82
83 JParser<> zap(
"Auxiliary program to process AHRS data.");
84
85 zap[
'f'] =
make_field(inputFile,
"output of JConvertDB -q ahrs");
88 zap[
'c'] =
make_field(ahrsFile,
"output of JAHRSCalibration");
90 zap[
'S'] =
make_field(angle_deg,
"maximal angle w.r.t. fit") = 0.0;
91 zap[
'T'] =
make_field(T_s,
"time window for averaging") = 0.0;
92 zap[
'N'] =
make_field(npy,
"number of floors for missing data policy") = 1;
94
95 zap(argc, argv);
96 }
97 catch(const exception &error) {
98 FATAL(error.what() << endl);
99 }
100
101
103
104 try {
106 }
109 }
110
117 0.0);
118
119 NOTICE(
"Magnetic declination " << getMagneticDeclination << endl);
120 NOTICE(
"Meridian angle [rad] " <<
FIXED(5,3) << meridian << endl);
121
124
125
126 struct element_type;
129
130
131 struct element_type {
132
133
134
135 element_type() :
136 first(0.0),
137 second(),
138 ns(0),
139 policy(false)
140 {}
141
142
143
144
145
146
147
148
149
150 element_type(const double t1,
152 const size_t ns,
153 const bool policy) :
154 first(t1),
155 second(Q),
156 ns(ns),
157 policy(policy)
158 {}
159
160
161
162
163
164
165
166
167 static inline bool getOR(buffer_type::const_iterator __begin,
168 buffer_type::const_iterator __end)
169 {
170 for (buffer_type::const_iterator i = __begin; i != __end; ++i) {
171 if (i->policy) {
172 return true;
173 }
174 }
175
176 return false;
177 }
178
179
180
181
182
183
184
185
186 static inline bool getAND(buffer_type::const_iterator __begin,
187 buffer_type::const_iterator __end)
188 {
189 for (buffer_type::const_iterator i = __begin; i != __end; ++i) {
190 if (!i->policy) {
191 return false;
192 }
193 }
194
195 return true;
196 }
197
198 double first;
200 size_t ns;
201 bool policy;
202 };
203
204
206
207
209
211
213
214 for (JMultipleFileScanner_t::const_iterator file_name = inputFile.begin(); file_name != inputFile.end(); ++file_name) {
215
216 STATUS(
"processing file " << *file_name <<
"... " << flush);
217
218
219
221
223
224 const JAHRS* parameters = in.next();
225 const int id = parameters->
DOMID;
226
228
229 const JModule& module = router.getModule(
id);
230
232
234
235 compass.correct(getMagneticDeclination(parameters->
UNIXTIME * 1.0e-3), meridian);
236
238
239 data[id].push_back(element_type(parameters->
UNIXTIME * 1.0e-3, Q, 1,
false));
240 }
241 }
242 }
243
244
245
246 if (angle_deg > 0.0) {
247
248 for (map_type::iterator module =
data.begin(); module !=
data.end(); ++module) {
249
250 if (!module->second.empty()) {
251
252 sort(module->second.begin(), module->second.end(),
make_comparator(&element_type::first));
253
254 buffer_type::iterator out = module->second.begin();
255 buffer_type::const_iterator in = module->second.begin();
256 buffer_type::const_iterator p = module->second.begin();
257 buffer_type::const_iterator q = module->second.begin();
258
259 for (int i = 0; i != NUMBER_OF_POINTS && q != module->second.end(); ++i, ++q) {}
260
261 for (int i = 0; i != NUMBER_OF_POINTS/2 && in != q; ++i, ++in) {
262
264
265 if (
getAngle(in->second, f1(in->first)) <= angle_deg) {
266 *out = *in;
267 ++out;
268 }
269 }
270
271 for (++p; q++ != module->second.end(); ++p, ++in) {
272
274
275 if (
getAngle(in->second, f1(in->first)) <= angle_deg) {
276 *out = *in;
277 ++out;
278 }
279 }
280
281 for ( ; in != module->second.end(); ++in) {
282
284
285 if (
getAngle(in->second, f1(in->first)) <= angle_deg) {
286 *out = *in;
287 ++out;
288 }
289 }
290
291 module->second.erase(out, module->second.end());
292 }
293 }
294 }
295
296
297
298
300
301 const JPolicy policy(router, buffer.begin(), buffer.end(), npy);
302
303 for (JPolicy::const_iterator module = policy.begin(); module != policy.end(); ++module) {
304
306
307 for (JPolicy::mapped_type::const_iterator in = module->second.begin(); in != module->second.end(); ++in) {
308 for (map_type::mapped_type::const_iterator i = data[*in].begin(); i !=
data[*in].end(); ++i) {
309 buffer.push_back(element_type(i->first, i->second, 1, true));
310 }
311 }
312
313
314
315 if (T_s > 0.0) {
316
317 sort(buffer.begin(), buffer.end(),
make_comparator(&element_type::first));
318
319 buffer_type::iterator out = buffer.begin();
320 buffer_type::const_iterator p = buffer.begin();
321 buffer_type::const_iterator q = buffer.begin();
322
323 for (p = buffer.begin(); p != buffer.end(); p = q) {
324
325 for (q = p; q != buffer.end() && q->first - p->first < T_s; ++q) {}
326
328
331
332 out->first =
getAverage(t1.begin(), t1.end());
333 out->second =
getAverage(q1.begin(), q1.end());
335 out->policy = element_type::getOR(p,q);
336
337 } else {
338
339 *out = *p;
340 }
341
342 ++out;
343 }
344
345 buffer.erase(out, buffer.end());
346 }
347
348 for (buffer_type::const_iterator i = buffer.begin(); i != buffer.end(); ++i) {
350 }
351 }
352
354 }
355
357
359
361}
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Data structure for compass in three dimensions.
int getFloor() const
Get floor number.
Router for direct addressing of module data in detector data structure.
Data structure for a composite optical module.
bool has(const int bit) const
Test PMT status.
Data structure for unit quaternion in three dimensions.
const JQuaternion3D & getQuaternion() const
Get quaternion.
Utility class to parse command line options.
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.
static JORCAMagneticDeclination getORCAMagneticDeclination
Function object for magnetic declination at ORCA site.
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.
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.
std::iterator_traits< T >::value_type getAverage(T __begin, T __end)
Get average.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
std::vector< JHitW0 > buffer_type
hits
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.
Auxiliary base class for interpolation of magnetic declination data obtained from website of NOAA.
Auxiliary class to define policy for invalid modules.
Auxiliary class to map module identifier to AHRS calibration.
Auxiliary data structure to check validity of AHRS data.
long long int UNIXTIME
[ms]
Auxiliary data structure for return type of make methods.
Template definition for function evaluation of Legendre polynome.
void set(T __begin, T __end)
Set Legendre polynome.
static counter_type max()
Get maximum counter value.
Auxiliary base class for list of file names.