45  static const int         WILDCARD    =  -1;
 
   47  static const std::string reset_t     = 
"reset";             
 
   48  static const std::string set_t       = 
"set";               
 
   49  static const std::string setx_t      = 
"setx";              
 
   50  static const std::string sety_t      = 
"sety";              
 
   51  static const std::string setz_t      = 
"setz";              
 
   52  static const std::string addx_t      = 
"addx";              
 
   53  static const std::string addy_t      = 
"addy";              
 
   54  static const std::string addz_t      = 
"addz";              
 
   55  static const std::string subx_t      = 
"subx";              
 
   56  static const std::string suby_t      = 
"suby";              
 
   57  static const std::string subz_t      = 
"subz";              
 
   58  static const std::string add_t       = 
"add";               
 
   59  static const std::string sub_t       = 
"sub";               
 
   60  static const std::string rot_t       = 
"rot";               
 
   61  static const std::string lower_t     = 
"lower";             
 
   62  static const std::string upper_t     = 
"upper";             
 
   63  static const std::string mul_t       = 
"mul";               
 
   64  static const std::string div_t       = 
"div";               
 
   65  static const std::string tilt_t      = 
"tilt";              
 
   66  static const std::string swap_t      = 
"swap";              
 
   68  static const std::string assign_t    = 
"assign";            
 
   69  static const std::string locate_t    = 
"locate";            
 
   70  static const std::string 
string_t    = 
"string";            
 
   72  static const std::string rand_t      = 
"rand";              
 
   73  static const std::string randset_t   =  rand_t + set_t;     
 
   74  static const std::string randadd_t   =  rand_t + add_t;     
 
   75  static const std::string randsub_t   =  rand_t + sub_t;     
 
   76  static const std::string randrot_t   =  rand_t + rot_t;     
 
   77  static const std::string randmul_t   =  rand_t + mul_t;     
 
   78  static const std::string randdiv_t   =  rand_t + div_t;     
 
   79  static const std::string randtilt_t  =  rand_t + tilt_t;    
 
   81  static const std::string RESET_t     = 
"RESET";             
 
   82  static const std::string SET_t       = 
"SET";               
 
   83  static const std::string ADD_t       = 
"ADD";               
 
   84  static const std::string SUB_t       = 
"SUB";               
 
   85  static const std::string ROT_t       = 
"ROT";               
 
   95  inline bool apply(
JModule& module, 
const std::string& action)
 
   97    if        (action == reset_t) {
 
  101      module.setCalibration(JCalibration());
 
  102      module.setStatus(JStatus());
 
  103      module.setQuaternion(JQuaternion3D());
 
  104      module.set(getModule<JKM3NeT_t>(1).getPosition());
 
  106      for (JModule::iterator pmt = module.begin(); pmt != module.end(); ++pmt) {
 
  111    } 
else if (action == RESET_t) {
 
  113      module.setCalibration(JCalibration());
 
  114      module.setQuaternion(JQuaternion3D());
 
  115      module.setCalibration(getAverage(make_array(module.begin(), module.end(), &JPMT::getT0), 0.0));
 
  134  inline bool apply(
JModule& module, 
const std::string& action, 
const double value)
 
  136    if        (action == set_t) {                          
 
  140    } 
else if (action == setx_t) {
 
  142      module.set(JVector3D(value, module.getY(), module.getZ()));
 
  144    } 
else if (action == addx_t) {
 
  146      module.add(JVector3D(value, 0.0, 0.0));
 
  148    } 
else if (action == subx_t) {
 
  150      module.sub(JVector3D(value, 0.0, 0.0));
 
  152    } 
else if (action == sety_t) {
 
  154      module.set(JVector3D(module.getX(), value, module.getZ()));
 
  156    } 
else if (action == addy_t) {
 
  158      module.add(JVector3D(0.0, value, 0.0));
 
  160    } 
else if (action == suby_t) {
 
  162      module.sub(JVector3D(0.0, value, 0.0));
 
  164    } 
else if (action == setz_t) {
 
  166      module.set(JVector3D(module.getX(), module.getY(), value));
 
  168    } 
else if (action == addz_t) {
 
  170      module.add(JVector3D(0.0, 0.0, value));
 
  172    } 
else if (action == subz_t) {
 
  174      module.sub(JVector3D(0.0, 0.0, value));
 
  176    } 
else if (action == add_t) {
 
  180    } 
else if (action == sub_t) {
 
  184    } 
else if (action == rot_t) {
 
  186      const JVector3D center = 
module.getPosition();
 
  190      module.rotate(JRotation3Z(value));
 
  194    } 
else if (action == lower_t ||
 
  197      const JVector3D center = 
module.getPosition();
 
  203      for (JModule::iterator pmt = module.begin(); pmt != module.end(); ++pmt) {
 
  204        if ((action == upper_t && pmt->getDZ() > 0.0) ||
 
  205            (action == lower_t && pmt->getDZ() < 0.0)) {
 
  212    } 
else if (action == mul_t) {
 
  227    } 
else if (action == div_t) {
 
  242    } 
else if (action == SET_t) {
 
  244      module.getCalibration().setT0(value);
 
  246    } 
else if (action == ADD_t) {
 
  248      module.getCalibration().addT0(value);
 
  250    } 
else if (action == SUB_t) {
 
  252      module.getCalibration().subT0(value);
 
  254    } 
else if (action == ROT_t) {
 
  256      module.setQuaternion(JQuaternion3Z(value) * module.getQuaternion());
 
  258    } 
else if (action == randadd_t) {                      
 
  260      module.add(gRandom->Gaus(0.0, value));
 
  262    } 
else if (action == randsub_t) {
 
  264      module.sub(gRandom->Gaus(0.0, value));
 
  266    } 
else if (action == randrot_t){
 
  268      const JVector3D center = 
module.getPosition();
 
  272      module.rotate(JRotation3Z(gRandom->Gaus(0.0, value)));
 
  276    } 
else if (action == randmul_t) {
 
  284    } 
else if (action == randdiv_t) {
 
  292    } 
else if (action == assign_t) {                       
 
  294      module.setID((int) value);
 
  298      module.setLocation(JLocation((int) value, module.getFloor()));
 
  318  inline bool apply(
JModule& module, 
const std::string& action, 
const double first, 
const double second)
 
  320    if        (action == tilt_t) {                         
 
  322      const double Tx = first;
 
  323      const double Ty = second;
 
  324      const double Tz = sqrt(1.0 - Tx*Tx - Ty*Ty);
 
  326      const double x  = Tx * module.
getZ()  +  
module.getX();
 
  327      const double y  = Ty * module.
getZ()  +  
module.getY();
 
  328      const double z  = Tz * module.
getZ();
 
  330      module.set(JPosition3D(x,y,z));
 
  332    } 
else if (action == locate_t) {
 
  334      module.setLocation(JLocation((int) first, (int) second));
 
  336    } 
else if (action == swap_t) {
 
  338      std::swap(module[(
int) first], module[(
int) second]);
 
  357  inline bool apply(
JModule& module, 
const std::string& action, 
const JVector3D& pos)
 
  360                            gRandom->Gaus(0.0, pos.
getY()),
 
  361                            gRandom->Gaus(0.0, pos.
getZ()));
 
  365    else if (action == add_t)
 
  367    else if (action == sub_t)
 
  369    else if (action == randset_t)                      
 
  371    else if (action == randadd_t)
 
  373    else if (action == randsub_t)
 
  393      module.setQuaternion(Q);
 
  394    else if (action == ADD_t)
 
  395      module.setQuaternion(Q * module.getQuaternion());
 
  396    else if (action == SUB_t)
 
  397      module.setQuaternion(Q.getConjugate() * module.getQuaternion());
 
  401    module.getQuaternion().normalise();
 
  415  inline bool apply(
JModule& module, 
const std::string& action, 
const std::string& value)
 
  420        module.getStatus().set  (getModuleStatusBit(value));
 
  421      else if (action == reset_t)
 
  422        module.getStatus().reset(getModuleStatusBit(value));
 
  428    catch(
const std::exception&) {
 
  442  inline bool apply(
JPMT& pmt, 
const std::string& action, 
const std::string& value)
 
  448      else if (action == reset_t)
 
  455    catch(
const std::exception&) {
 
  479      return (action != 
"" && !
data.empty());
 
  489    bool apply(
JModule& module)
 const 
  491      switch (
data.size()) {
 
  494        return  ::apply(module, action);
 
  497        return  ::apply(module, action, data[0]);
 
  500        return  ::apply(module, action, data[0], data[1]);
 
  503        return  ::apply(module, action, 
JVector3D(data[0], data[1], data[2]));
 
  506        return  ::apply(module, action, 
JQuaternion3D(data[0], data[1], data[2], data[3]));
 
  521    friend inline std::istream& 
operator>>(std::istream& in, JModifier& modifier)
 
  523      if (in >> modifier.action) {
 
  525        modifier.data.clear();
 
  527        for (
double x; in >> 
x; ) {
 
  528          modifier.data.push_back(x);
 
  531        in.clear(std::ios_base::eofbit);
 
  545    friend inline std::ostream& 
operator<<(std::ostream& out, 
const JModifier& modifier)
 
  547      out << modifier.action;
 
  549      for (std::vector<double>::const_iterator i = modifier.data.begin(); i != modifier.data.end(); ++i) {
 
  572  inline const JModifier& getModifier(
const int id, 
const JModifier& modifier)
 
  578    const string::size_type pos = modifier.action.find(rand_t);
 
  580    if (pos != string::npos) {
 
  582      JModifier& 
result = buffer[id][modifier.action][modifier.data.size()];
 
  586        result.action = modifier.action.substr(pos + rand_t.length());
 
  588        for (
size_t i = 0; i != modifier.data.size(); ++i) {
 
  589          result.data.push_back(gRandom->Gaus(0.0, modifier.data[i]));
 
  605  struct JModuleModifier {
 
  619    bool apply(
JModule& module)
 const 
  621      return ::apply(module, action, value);
 
  632    friend inline std::istream& 
operator>>(std::istream& in, JModuleModifier& modifier)
 
  634      return in >> modifier.action >> modifier.value;
 
  645    friend inline std::ostream& 
operator<<(std::ostream& out, 
const JModuleModifier& modifier)
 
  647      out << modifier.action;
 
  649      out << modifier.value;
 
  663  struct JPMTModifier {
 
  677    bool apply(
JPMT& pmt)
 const 
  679      return ::apply(pmt, action, value);
 
  690    friend inline std::istream& 
operator>>(std::istream& in, JPMTModifier& modifier)
 
  692      return in >> modifier.action >> modifier.value;
 
  703    friend inline std::ostream& 
operator<<(std::ostream& out, 
const JPMTModifier& modifier)
 
  705      out << modifier.action;
 
  707      out << modifier.value;
 
  729    static const char SEPARATOR = 
'-';
 
  748      if (in >> range.
first) {
 
  752        if (in.peek() == (
int) JRange_t::SEPARATOR) {
 
  777      return out << range.
first << JRange_t::SEPARATOR << range.
second;
 
  789  inline void print(std::ostream& out, 
const JModule& module, 
const JModifier& modifier)
 
  794    out << 
"Modifier"                     << 
' ' 
  796        << setw(10)  << module.
getID()    << 
' ' 
  797        << 
"action " << modifier          << endl;
 
  813    out << 
"module modifier"                    << 
' ' 
  814        << 
"(" << setw(10) << 
id.getID() << 
")" << 
' ' 
  815        << 
"action" << 
' ' << modifier.action << 
' '  
  816        << 
"value"  << 
' ' << modifier.value  << endl;
 
  827  inline void print(std::ostream& out, 
const JPMTIdentifier& pmt, 
const JPMTModifier& modifier)
 
  832    out << 
"PMT modifier"                                                                 << 
' ' 
  833        << 
"(" << setw(10) << pmt.
getID() << 
"," << setw(2) << pmt.
getPMTAddress() << 
")" << 
' ' 
  834        << 
"action" << 
' ' << modifier.action << 
' '  
  835        << 
"value"  << 
' ' << modifier.value  << endl;
 
  950  typedef JToken<
';'>  JToken_t;
 
  959               JModuleModifier> >  wip;
 
  976    JParser<> zap(
"Auxiliary program to modify detector.");
 
  992    zap[
'O'] = 
make_field(option, 
"sort modules: "\
 
  993                          "0 -> no sort; 1 -> module identifier; 2 -> module location")     = 0, 1, 2;
 
  994    zap[
'q'] = 
make_field(squash, 
"squash meta data");
 
  999  catch(
const exception &error) {
 
 1000    FATAL(error.what() << endl);
 
 1003  gRandom->SetSeed(0);
 
 1005  const int ns = ((keep.empty() ? 0 : 1)  +
 
 1006                  (rm  .empty() ? 0 : 1)  +
 
 1007                  (
id  .empty() ? 0 : 1)  +
 
 1008                  (del .empty() ? 0 : 1));
 
 1011    FATAL(
"Use either option -k, -r, -m or -D." << endl);
 
 1029  if (
detector.setToLatestVersion()) {
 
 1030    NOTICE(
"Set detector version to " << 
detector.getVersion() << endl);
 
 1042    for (vector<JToken_t>::const_iterator i = hdr.begin(); i != hdr.end(); ++i) {
 
 1044      istringstream is(*i);
 
 1057    for (JDetector::iterator module = 
detector.begin(); module != 
detector.end(); ) {
 
 1059      bool __rm__ = !keep.empty() && rm.empty();
 
 1061      for (vector<JRange_t>::const_iterator i = keep.begin(); i != keep.end(); ++i) {
 
 1067      for (vector<JRange_t>::const_iterator i = rm.begin(); i != rm.end(); ++i) {
 
 1074        __rm__ = find(
id.begin(), 
id.end(), module->
getID()) == 
id.end();
 
 1077      const auto range = del.equal_range(module->
getString());
 
 1079      for (
auto i = range.
first; i != range.
second; ++i) {
 
 1080        if (i->second == module->
getFloor()) {
 
 1086        module = detector.erase(module);
 
 1095    for (JDetector::iterator module = 
detector.begin(); module != 
detector.end(); ++module) {
 
 1097      if (module->
getID() == i->first || i->first == WILDCARD ){
 
 1100          print(cout, *module, i->second);
 
 1103        if (!i->second.apply(*module)) {
 
 1104          ERROR(
"No valid action: " << i->first << 
' ' << i->second << endl);
 
 1113    for (JDetector::iterator module = 
detector.begin(); module != 
detector.end(); ++module) {
 
 1115      if (module->
getString() == i->first || i->first == WILDCARD) {
 
 1117        const JModifier modifier = getModifier(module->
getString(), i->second);
 
 1120          print(cout, *module, i->second);
 
 1123        if (!modifier.apply(*module)) {
 
 1124          ERROR(
"No valid action: " << i->first << 
' ' << i->second << endl);
 
 1133    for (JDetector::iterator module = 
detector.begin(); module != 
detector.end(); ++module) {
 
 1137        if (module->
getString() == i->first || i->first == WILDCARD) {
 
 1139          const JModifier modifier = getModifier(module->
getString(), i->second);
 
 1142            print(cout, *module, i->second);
 
 1145          if (!modifier.apply(*module)) {
 
 1146            ERROR(
"No valid action: " << i->first << 
' ' << i->second << endl);
 
 1156    for (JDetector::iterator module = 
detector.begin(); module != 
detector.end(); ++module) {
 
 1158      if (module->
getID() == i->first || i->first == WILDCARD ){
 
 1161          print(cout, *module, i->second);
 
 1164        if (!i->second.apply(*module)) {
 
 1165          ERROR(
"No valid action: " << i->first << 
' ' << i->second << endl);
 
 1174    for (JDetector::iterator module = 
detector.begin(); module != 
detector.end(); ++module) {
 
 1176      if (module->
getID() == i->first.getModuleID() || i->first.getModuleID() == WILDCARD) {
 
 1179          print(cout, i->first, i->second);
 
 1182        if        (i->first.getPMTAddress() == WILDCARD) {
 
 1185            if (!i->second.apply(module->
getPMT(pmt))) {
 
 1186              ERROR(
"No valid action: " << i->first << 
' ' << i->second << endl);
 
 1190        } 
else if (i->first.getPMTAddress() >= 0                         &&
 
 1192                   !i->second.apply(module->
getPMT(i->first.getPMTAddress()))) {
 
 1193          ERROR(
"No valid action: " << i->first << 
' ' << i->second << endl);
 
 1200  if (!alt.empty() || !ring.empty()) {
 
 1203      FATAL(
"Invalid detector identifier " << 
detector.getID() << endl);
 
 1208    for (JDetector::iterator module = 
detector.begin(); module != 
detector.end(); ++module) {
 
 1217          print(cout, 
id, i->second);
 
 1220        if (!i->second.apply(module->
getPMT(
id.getPMTAddress()))) {
 
 1221          ERROR(
"No valid action: " << i->first << 
' ' << i->second << endl);
 
 1225      const auto range = ring.equal_range(module->
getID());
 
 1227      for (
auto i = range.
first; i != range.
second; ++i) {
 
 1231        modifier.
ring = (char) toupper(modifier.
ring);
 
 1233        if (modifier.
ring != 
'A') {
 
 1237          for (
size_t i = 0; i != 
module->size(); ++i) {
 
 1241            if (address.
ring == modifier.
ring) {
 
 1242              buffer[address] = (*module)[i];
 
 1246          for (
size_t i = 0; i != 
module->size(); ++i) {
 
 1250            if (address.
ring == modifier.
ring) {
 
 1254              while (position > 6) { position -= 6; }
 
 1255              while (position < 1) { position += 6; }
 
 1259              DEBUG(
"Module " << setw(10) << module->
getID() << 
' ' << address << 
" <= " << source << endl);
 
 1261              (*module)[i] = buffer[source];
 
 
Data structure for detector geometry and calibration.
 
int main(int argc, char **argv)
 
Base class for data structures with artithmetic capabilities.
 
General purpose messaging.
 
#define DEBUG(A)
Message macros.
 
Direct access to module in detector data structure.
 
Utility class to parse command line options.
 
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
 
I/O formatting auxiliaries.
 
Auxiliary class to define a range between two values.
 
Data structure for time calibration.
 
Lookup table for PMT addresses in detector.
 
const JModuleAddressMap & get(const int id) const
Get module address map.
 
const JLocation & getLocation() const
Get location.
 
int getFloor() const
Get floor number.
 
int getString() const
Get string number.
 
Lookup table for PMT addresses in optical module.
 
const JPMTAddressTranslator & getAddressTranslator(const int tdc) const
Get PMT address translator.
 
const JPMTPhysicalAddress & getPMTPhysicalAddress(const int tdc) const
Get PMT physical address.
 
Data structure for a composite optical module.
 
const JPMT & getPMT(const int index) const
Get PMT.
 
int getPMTAddress() const
Get PMT address (= TDC).
 
Data structure for PMT physical address.
 
char ring
ring number ['A','F']
 
int position
position within ring [1,6]
 
Data structure for PMT geometry, calibration and status.
 
Utility class to parse parameter values.
 
const JPosition3D & getPosition() const
Get position.
 
Data structure for unit quaternion in three dimensions.
 
Data structure for vector in three dimensions.
 
double getY() const
Get y position.
 
double getZ() const
Get z position.
 
double getX() const
Get x position.
 
Auxiliary class for object identification.
 
int getID() const
Get identifier.
 
Wrapper class around string.
 
Utility class to parse command line options.
 
static const std::string string_t
string
 
std::ostream & print(std::ostream &out, const JTestSummary &summary, const char delimiter=' ', const bool useColors=true)
Print test summary.
 
std::istream & operator>>(std::istream &in, JAHRSCalibration &calibration)
Read AHRS calibration from input stream.
 
std::ostream & operator<<(std::ostream &out, const JAHRSCalibration &calibration)
Write AHRS calibration to output stream.
 
std::string getLabel(const JLocation &location)
Get module label for monitoring and other applications.
 
int getNumberOfPMTs(const JModule &module)
Get number of PMTs.
 
static const JGetPMTStatusBit getPMTStatusBit
Function object to map key to PMT status bit.
 
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
 
void store(const std::string &file_name, const JDetector &detector)
Store detector to output file.
 
JDetectorAddressMap & getDetectorAddressMap()
Get detector address map.
 
bool hasDetectorAddressMap(const int id)
Check if detector address map is available.
 
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).
 
bool is_valid(const json &js)
Check validity of JSon data.
 
Type definition of range.
 
JRange_t()
Default constructor.
 
Auxiliary class for handling status.
 
int getStatus() const
Get status.
 
Empty structure for specification of parser element that is initialised (i.e. does not require input)...