Jpp  17.2.1-pre0
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Functions
JEditDetector.cc File Reference

Auxiliary program to modify detector calibration. More...

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include "TRandom3.h"
#include "JDetector/JDetector.hh"
#include "JDetector/JDetectorToolkit.hh"
#include "JDetector/JDetectorHeader.hh"
#include "JDetector/JModuleStatus.hh"
#include "JDetector/JModuleRouter.hh"
#include "JDetector/JPMTIdentifier.hh"
#include "JDetector/JPMTPhysicalAddress.hh"
#include "JDetector/JPMTStatus.hh"
#include "JDetector/JModuleAddressMap.hh"
#include "JDetector/JDetectorAddressMap.hh"
#include "JDetector/JDetectorAddressMapToolkit.hh"
#include "JGeometry3D/JVector3D.hh"
#include "JMath/JConstants.hh"
#include "JMath/JMath.hh"
#include "JTools/JRange.hh"
#include "JLang/JException.hh"
#include "JLang/JToken.hh"
#include "JLang/JComparator.hh"
#include "JLang/JComparison.hh"
#include "JSupport/JMeta.hh"
#include "Jeep/JeepToolkit.hh"
#include "Jeep/JPrint.hh"
#include "Jeep/JParser.hh"
#include "Jeep/JMessage.hh"

Go to the source code of this file.

Functions

int main (int argc, char **argv)
 

Detailed Description

Auxiliary program to modify detector calibration.

Syntax:

    -M     "<module identifier>     (set|add|sub|randset|randadd|randsub) x0 [x1 x2]"
    -(S|s) "<string number>         (set|add|sub|randset|randadd|randsub) x0 [x1 x2]"
    -M     "<module identifier>     (setx|addx|subx|sety|addy|suby|setz|addz|subz) value"
    -(S|s) "<string number>         (setx|addx|subx|sety|addy|suby|setz|addz|subz) value"
    -M     "<module identifier>     (rot|randrot) phi"
    -(S|s) "<string number>         (rot|randrot) phi"
    -M     "<module identifier>     (mul|randmul) factor"
    -(S|s) "<string number>         (mul|randmul) factor"
    -M     "<module identifier>     (div|randdiv) factor"
    -(S|s) "<string number>         (div|randdiv) factor"
    -M     "<module identifier>     (reset)"
    -(S|s) "<string number>         (reset)"
    -M     "<module identifier>     (assign)  identifier"
    -M     "<module identifier>     (locate)  <string> <floor>"
    -M     "<module identifier>     (swap)    <PMT>    <PMT>"
    -M     "<module identifier>     (SET|ADD|SUB|) x0 [x1 x2 x3]"
    -(S|s) "<string number>         (SET|ADD|SUB|) x0 [x1 x2 x3]"
    -M     "<module identifier>     (ROT) phi"
    -(S|s) "<string number>         (ROT) phi"
    -(S|s) "<string number>         (tilt|randtilt) Tx Ty"
    -W     "<module identifier>     (set|reset)  (MODULE_DISABLE|COMPASS_DISABLE|HYDROPHONE_DISABLE|PIEZO_DISABLE|MODULE_OUT_OF_SYNC)"
    -P     "<PMT identifier>        (set|reset)  (PMT_DISABLE|HIGH_RATE_VETO_DISABLE|FIFO_FULL_DISABLE|UDP_COUNTER_DISABLE|UDP_TRAILER_DISABLE|OUT_OF_SYNC)"
    -p     "<PMT physical address>  (set|reset)  (PMT_DISABLE|HIGH_RATE_VETO_DISABLE|FIFO_FULL_DISABLE|UDP_COUNTER_DISABLE|UDP_TRAILER_DISABLE|OUT_OF_SYNC)"
    -k     "<string number>[-<string number>]"
    -r     "<string number>[-<string number>]"
    -m     "<module identifier>"
    -D     "<string number> <floor>"
    -@    "<key>=<value>[;<key>=<value>"

Options -M and -S refer to a module and a string, respectively.
The values provided for a string modification coherently apply to the modules of the specified string number.
The option -s is equivalent to option -S except that the action applies only to the optical modules in the string and not the base module.

The options randxxx correspond to a randomisation of the specified option.

If the module identifier or string number is -1, the action is applied to all modules or strings in the detector, respectively.

For options [rand]set, [rand]add and [rand]sub, the number of values apply to position or time calibration in the following way:

  1. time calibration (t = x0)
  2. invalid
  3. position calibration (x = x0, y = x1, z = x2)

For options (set|add|sub)(x|y|z), the value corresponds to last character of the the quoted action.

For options [rand]rot, the angle phi refers to an anti-clockwise rotation around the z-axis.
The rotation angle is defined in radians.

For options [rand]mul and [rand]div, the multiplication/division factor (a.k.a. "stretching") applies to the z-coordinates of the modules.
The factor is defined as a fraction; the actual multiplication/division factor is (1 + factor).

For options SET, ADD and SUB, the number of values apply to time or quaternion calibration of the module in the following way:

  1. time calibration of piezo sensor or hydrophone (t = x0)
  2. invalid
  3. invalid
  4. quaternion calibration of compass (qa = x0, qb = x1, qc = x2, qd = x3)

For options ROT, the angle phi refers to an anti-clockwise rotation around the z-axis of the quaternion calibration of the compass.
The rotation angle is defined in radians.

Note that to correct the time calibration for the delay time of the piezo sensor and hydrophone, application JDetectorDB.cc can be used (option -WW).

The units of all positions and time values are m and ns, respectively.

Note that for string modifiers with option randxxx, the action is coherently applied to the modules in the specified string.
Only one type of action (defined by xxx and the number of values) is then allowed per string.

Option -@ refers to the header information.
The list of possible keys can be obtained using JPrintDetector.cc with option -O header.

Multiple options -M, -S, -s or -@ will be processed in order of appearance.

Options -k and -r can be used to keep and remove (a range of) string numbers, respectively.

The options -m and -D can be used to maintain a specific module (and remove all others) and to delete a floor from a string, respectively.

Note finally that if the output file name is the same as the input file name, the original file will be overwritten.

Author
mdejong

Definition in file JEditDetector.cc.

Function Documentation

int main ( int  argc,
char **  argv 
)

Definition at line 913 of file JEditDetector.cc.

914 {
915  using namespace std;
916  using namespace JPP;
917 
918  typedef JToken<';'> JToken_t;
919 
920  string inputFile;
921  string outputFile;
922  vector<JToken_t> hdr;
926  vector< pair<int,
927  JModuleModifier> > wip;
929  JPMTModifier> > pmt;
931  JPMTModifier> > alt;
932  vector<JRange_t> keep;
934  vector<int> id;
935  multimap<int, int> del;
936  int option;
937  bool squash;
938  int debug;
939 
940  try {
941 
942  JParser<> zap("Auxiliary program to modify detector.");
943 
944  zap['a'] = make_field(inputFile);
945  zap['o'] = make_field(outputFile);
946  zap['@'] = make_field(hdr, "header modification") = JPARSER::initialised();
947  zap['M'] = make_field(mod, "module modification") = JPARSER::initialised();
948  zap['S'] = make_field(str, "string modification (optical modules and base module") = JPARSER::initialised();
949  zap['s'] = make_field(dos, "string modification (optical modules only)") = JPARSER::initialised();
950  zap['W'] = make_field(wip, "module status modification") = JPARSER::initialised();
951  zap['P'] = make_field(pmt, "PMT status modification by PMT logical address") = JPARSER::initialised();
952  zap['p'] = make_field(alt, "PMT status modification by PMT physical address") = JPARSER::initialised();
953  zap['k'] = make_field(keep, "keep string[s]") = JPARSER::initialised();
954  zap['r'] = make_field(rm, "remove string[s]") = JPARSER::initialised();
955  zap['m'] = make_field(id, "remove module by identifier") = JPARSER::initialised();
956  zap['D'] = make_field(del, "remove module by location") = JPARSER::initialised();
957  zap['O'] = make_field(option, "sort modules") = 0, 1, 2;
958  zap['q'] = make_field(squash, "squash meta data");
959  zap['d'] = make_field(debug, "debug level") = 2;
960 
961  zap(argc, argv);
962  }
963  catch(const exception &error) {
964  FATAL(error.what() << endl);
965  }
966 
968 
969  try {
970  load(inputFile, detector);
971  }
972  catch(const JException& error) {
973  FATAL(error);
974  }
975 
976 
977  gRandom->SetSeed(0);
978 
979 
980  if ((keep.empty() ? 0 : 1 +
981  rm .empty() ? 0 : 1 +
982  id .empty() ? 0 : 1) > 1) {
983  FATAL("Use either option -k, -r or -m." << endl);
984  }
985 
986  if (squash) {
987  detector.comment.clear();
988  }
989 
990  detector.comment.add(JMeta(argc,argv));
991 
992  if (detector.setToLatestVersion()) {
993  NOTICE("Set detector version to " << detector.getVersion() << endl);
994  }
995 
996 
997  if (!hdr.empty()) {
998 
999  int id = -1;
1000 
1001  JProperties helper = detector.getProperties();
1002 
1003  helper["id"] = id;
1004 
1005  for (vector<JToken_t>::const_iterator i = hdr.begin(); i != hdr.end(); ++i) {
1006 
1007  istringstream is(*i);
1008 
1009  is >> helper;
1010  }
1011 
1012  if (id != -1) {
1013  detector.setID(id);
1014  }
1015  }
1016 
1017 
1018  for (JDetector::iterator module = detector.begin(); module != detector.end(); ) {
1019 
1020  bool __rm__ = !keep.empty() && rm.empty();
1021 
1022  for (vector<JRange_t>::const_iterator i = keep.begin(); i != keep.end(); ++i) {
1023  if (module->getString() >= i->first && module->getString() <= i->second) {
1024  __rm__ = false;
1025  }
1026  }
1027 
1028  for (vector<JRange_t>::const_iterator i = rm.begin(); i != rm.end(); ++i) {
1029  if (module->getString() >= i->first && module->getString() <= i->second) {
1030  __rm__ = true;
1031  }
1032  }
1033 
1034  if (!id.empty()) {
1035  __rm__ = find(id.begin(), id.end(), module->getID()) == id.end();
1036  }
1037 
1038  const auto range = del.equal_range(module->getString());
1039 
1040  for (auto i = range.first; i != range.second; ++i) {
1041  if (i->second == module->getFloor()) {
1042  __rm__ = true;
1043  }
1044  }
1045 
1046  if (__rm__)
1047  module = detector.erase(module);
1048  else
1049  ++module;
1050  }
1051 
1052 
1053  for (vector< pair<int, JModifier> >::const_iterator i = mod.begin(); i != mod.end(); ++i) {
1054 
1055  for (JDetector::iterator module = detector.begin(); module != detector.end(); ++module) {
1056 
1057  if (module->getID() == i->first || i->first == WILDCARD ){
1058 
1059  if (debug >= debug_t) {
1060  print(cout, *module, i->second);
1061  }
1062 
1063  if (!i->second.apply(*module)) {
1064  ERROR("No valid action: " << i->first << ' ' << i->second << endl);
1065  }
1066  }
1067  }
1068  }
1069 
1070 
1071  for (vector< pair<int, JModifier> >::const_iterator i = str.begin(); i != str.end(); ++i) {
1072 
1073  for (JDetector::iterator module = detector.begin(); module != detector.end(); ++module) {
1074 
1075  if (module->getString() == i->first || i->first == WILDCARD) {
1076 
1077  const JModifier modifier = getModifier(module->getString(), i->second);
1078 
1079  if (debug >= debug_t) {
1080  print(cout, *module, i->second);
1081  }
1082 
1083  if (!modifier.apply(*module)) {
1084  ERROR("No valid action: " << i->first << ' ' << i->second << endl);
1085  }
1086  }
1087  }
1088  }
1089 
1090 
1091  for (vector< pair<int, JModifier> >::const_iterator i = dos.begin(); i != dos.end(); ++i) {
1092 
1093  for (JDetector::iterator module = detector.begin(); module != detector.end(); ++module) {
1094 
1095  if (module->getFloor() != 0) {
1096 
1097  if (module->getString() == i->first || i->first == WILDCARD) {
1098 
1099  const JModifier modifier = getModifier(module->getString(), i->second);
1100 
1101  if (debug >= debug_t) {
1102  print(cout, *module, i->second);
1103  }
1104 
1105  if (!modifier.apply(*module)) {
1106  ERROR("No valid action: " << i->first << ' ' << i->second << endl);
1107  }
1108  }
1109  }
1110  }
1111  }
1112 
1113 
1114  for (vector< pair<int, JModuleModifier> >::const_iterator i = wip.begin(); i != wip.end(); ++i) {
1115 
1116  for (JDetector::iterator module = detector.begin(); module != detector.end(); ++module) {
1117 
1118  if (module->getID() == i->first || i->first == WILDCARD ){
1119 
1120  if (debug >= debug_t) {
1121  print(cout, *module, i->second);
1122  }
1123 
1124  if (!i->second.apply(*module)) {
1125  ERROR("No valid action: " << i->first << ' ' << i->second << endl);
1126  }
1127  }
1128  }
1129  }
1130 
1131 
1132  for (vector< pair<JPMTIdentifier, JPMTModifier> >::const_iterator i = pmt.begin(); i != pmt.end(); ++i) {
1133 
1134  for (JDetector::iterator module = detector.begin(); module != detector.end(); ++module) {
1135 
1136  if (module->getID() == i->first.getModuleID() || i->first.getModuleID() == WILDCARD) {
1137 
1138  if (debug >= debug_t) {
1139  print(cout, i->first, i->second);
1140  }
1141 
1142  if (i->first.getPMTAddress() == WILDCARD) {
1143 
1144  for (int pmt = 0; pmt != getNumberOfPMTs(*module); ++pmt) {
1145  if (!i->second.apply(module->getPMT(pmt))) {
1146  ERROR("No valid action: " << i->first << ' ' << i->second << endl);
1147  }
1148  }
1149 
1150  } else if (i->first.getPMTAddress() >= 0 &&
1151  i->first.getPMTAddress() < getNumberOfPMTs(*module) &&
1152  !i->second.apply(module->getPMT(i->first.getPMTAddress()))) {
1153  ERROR("No valid action: " << i->first << ' ' << i->second << endl);
1154  }
1155  }
1156  }
1157  }
1158 
1159 
1160  if (!alt.empty()) {
1161 
1162  if (!hasDetectorAddressMap(detector.getID())) {
1163  FATAL("Invalid detector identifier " << detector.getID() << endl);
1164  }
1165 
1166  const JDetectorAddressMap& demo = getDetectorAddressMap(detector.getID());
1167 
1168  for (JDetector::iterator module = detector.begin(); module != detector.end(); ++module) {
1169 
1170  const JModuleAddressMap memo = demo.get(module->getID());
1171 
1172  for (vector< pair<JPMTPhysicalAddress, JPMTModifier> >::const_iterator i = alt.begin(); i != alt.end(); ++i) {
1173 
1174  const JPMTIdentifier id(module->getID(), memo.getAddressTranslator(i->first).tdc);
1175 
1176  if (debug >= debug_t) {
1177  print(cout, id, i->second);
1178  }
1179 
1180  if (!i->second.apply(module->getPMT(id.getPMTAddress()))) {
1181  ERROR("No valid action: " << i->first << ' ' << i->second << endl);
1182  }
1183  }
1184  }
1185  }
1186 
1187 
1188  switch (option) {
1189  case 1:
1190  sort(detector.begin(), detector.end(), make_comparator(&JModule::getID));
1191  break;
1192 
1193  case 2:
1194  sort(detector.begin(), detector.end(), make_comparator(&JModule::getLocation));
1195  break;
1196 
1197  default:
1198  break;
1199  };
1200 
1201 
1202  try {
1204  }
1205  catch(const JException& error) {
1206  FATAL(error);
1207  }
1208 }
Auxiliary class for ROOT I/O of application specific meta data.
Definition: JMeta.hh:70
Utility class to parse command line options.
Definition: JParser.hh:1517
General exception.
Definition: JException.hh:23
debug
Definition: JMessage.hh:29
JComparator< JResult_t T::*, JComparison::lt > make_comparator(JResult_t T::*member)
Helper method to create comparator between values of data member.
Definition: JComparator.hh:185
Detector data structure.
Definition: JDetector.hh:89
bool hasDetectorAddressMap(const int id)
Check if detector address map is available.
Utility class to parse parameter values.
Definition: JProperties.hh:496
int getNumberOfPMTs(const JModule &module)
Get number of PMTs.
Lookup table for PMT addresses in detector.
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Definition: JParser.hh:83
string outputFile
is
Definition: JDAQCHSM.chsm:167
const JModuleAddressMap & get(const int id) const
Get module address map.
Lookup table for PMT addresses in optical module.
Detector file.
Definition: JHead.hh:226
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1993
void store(const std::string &file_name, const JDetector &detector)
Store detector to output file.
#define NOTICE(A)
Definition: JMessage.hh:64
#define ERROR(A)
Definition: JMessage.hh:66
JDetectorAddressMap & getDetectorAddressMap()
Get detector address map.
print
Definition: JConvertDusj.sh:44
#define FATAL(A)
Definition: JMessage.hh:67
z range($ZMAX-$ZMIN)< $MINIMAL_DZ." fi fi typeset -Z 4 STRING typeset -Z 2 FLOOR JPlot1D -f $
const JPMTAddressTranslator & getAddressTranslator(const int tdc) const
Get PMT address translator.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
Wrapper class around string.
Definition: JToken.hh:23
Data structure for PMT physical address.
do set_variable DETECTOR_TXT $WORKDIR detector
int debug
debug level