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.