66{
69
73 string detectorFile;
74 string ahrsFile;
75 double angle_deg;
76 double T_s;
78
79 try {
80
81 JParser<> zap(
"Auxiliary program to process AHRS data.");
82
83 zap[
'f'] =
make_field(inputFile,
"output of JConvertDB -q ahrs");
86 zap[
'c'] =
make_field(ahrsFile,
"output of JAHRSCalibration");
88 zap[
'S'] =
make_field(angle_deg,
"maximal angle w.r.t. fit") = 0.0;
89 zap[
'T'] =
make_field(T_s,
"time window for averaging") = 0.0;
91
92 zap(argc, argv);
93 }
94 catch(const exception &error) {
95 FATAL(error.what() << endl);
96 }
97
98
100
101 try {
103 }
106 }
107
114 0.0);
115
116 NOTICE(
"Magnetic declination " << getMagneticDeclination << endl);
117 NOTICE(
"Meridian angle [rad] " <<
FIXED(5,3) << meridian << endl);
118
121
122
126
128
129
131
133
135
136 for (JMultipleFileScanner_t::const_iterator file_name = inputFile.begin(); file_name != inputFile.end(); ++file_name) {
137
138 STATUS(
"processing file " << *file_name <<
"... " << flush);
139
140
141
143
145
146 const JAHRS* parameters = in.next();
147 const int id = parameters->
DOMID;
148
150
151 const JModule& module = router.getModule(
id);
152
154
156
157 compass.correct(getMagneticDeclination(parameters->
UNIXTIME * 1.0e-3), meridian);
158
160
161 data[id].push_back(element_type(parameters->
UNIXTIME * 1.0e-3, Q));
162 }
163 }
164 }
165
166
167
168 if (angle_deg > 0.0) {
169
170 for (map_type::iterator module =
data.begin(); module !=
data.end(); ++module) {
171
172 if (!module->second.empty()) {
173
174 sort(module->second.begin(), module->second.end(),
make_comparator(&element_type::first));
175
176 buffer_type::iterator out = module->second.begin();
177 buffer_type::const_iterator in = module->second.begin();
178 buffer_type::const_iterator p = module->second.begin();
179 buffer_type::const_iterator q = module->second.begin();
180
181 for (int i = 0; i != NUMBER_OF_POINTS && q != module->second.end(); ++i, ++q) {}
182
183 for (int i = 0; i != NUMBER_OF_POINTS/2 && in != q; ++i, ++in) {
184
186
187 if (
getAngle(in->second,
f1(in->first)) <= angle_deg) {
188 *out = *in;
189 ++out;
190 }
191 }
192
193 for (++p; q++ != module->second.end(); ++p, ++in) {
194
196
197 if (
getAngle(in->second,
f1(in->first)) <= angle_deg) {
198 *out = *in;
199 ++out;
200 }
201 }
202
203 for ( ; in != module->second.end(); ++in) {
204
206
207 if (
getAngle(in->second,
f1(in->first)) <= angle_deg) {
208 *out = *in;
209 ++out;
210 }
211 }
212
213 module->second.erase(out, module->second.end());
214 }
215 }
216 }
217
218
219
220
222
223 const JPolicy policy(router, buffer.begin(), buffer.end());
224
225 for (JPolicy::const_iterator module = policy.begin(); module != policy.end(); ++module) {
226
228
229 for (JPolicy::mapped_type::const_iterator in = module->second.begin(); in != module->second.end(); ++in) {
230 for (map_type::mapped_type::const_iterator i = data[*in].begin(); i !=
data[*in].end(); ++i) {
231 buffer.push_back(element_type(i->first, i->second));
232 }
233 }
234
235
236
237 if (T_s > 0.0) {
238
239 sort(buffer.begin(), buffer.end(),
make_comparator(&element_type::first));
240
241 buffer_type::iterator out = buffer.begin();
242 buffer_type::const_iterator p = buffer.begin();
243 buffer_type::const_iterator q = buffer.begin();
244
245 for (p = buffer.begin(); p != buffer.end(); p = q) {
246
247 for (q = p; q != buffer.end() && q->first - p->first < T_s; ++q) {}
248
250
253
254 out->first =
getAverage(t1.begin(), t1.end());
255 out->second =
getAverage(q1.begin(), q1.end());
256
257 } else {
258
259 *out = *p;
260 }
261
262 ++out;
263 }
264
265 buffer.erase(out, buffer.end());
266 }
267
268 for (buffer_type::const_iterator i = buffer.begin(); i != buffer.end(); ++i) {
270 }
271 }
272
274 }
275
277
279
281}
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
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.
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);.
const JPolynome f1(1.0, 2.0, 3.0)
Function.
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(const double *pA)
Set parameter values.
static counter_type max()
Get maximum counter value.
Auxiliary base class for list of file names.