Jpp  18.2.0-rc.1
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|lower|upper) 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 options upper and lower refer to a rotation of the PMTs in the upper and lower hemisphere of the module, respectively.
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 937 of file JEditDetector.cc.

938 {
939  using namespace std;
940  using namespace JPP;
941 
942  typedef JToken<';'> JToken_t;
943 
944  string inputFile;
945  string outputFile;
946  vector<JToken_t> hdr;
950  vector< pair<int,
951  JModuleModifier> > wip;
953  JPMTModifier> > pmt;
955  JPMTModifier> > alt;
956  vector<JRange_t> keep;
958  vector<int> id;
959  multimap<int, int> del;
960  int option;
961  bool squash;
962  int debug;
963 
964  try {
965 
966  JParser<> zap("Auxiliary program to modify detector.");
967 
968  zap['a'] = make_field(inputFile);
969  zap['o'] = make_field(outputFile);
970  zap['@'] = make_field(hdr, "header modification") = JPARSER::initialised();
971  zap['M'] = make_field(mod, "module modification") = JPARSER::initialised();
972  zap['S'] = make_field(str, "string modification (optical modules and base modules)") = JPARSER::initialised();
973  zap['s'] = make_field(dos, "string modification (optical modules only)") = JPARSER::initialised();
974  zap['W'] = make_field(wip, "module status modification") = JPARSER::initialised();
975  zap['P'] = make_field(pmt, "PMT status modification by PMT logical address") = JPARSER::initialised();
976  zap['p'] = make_field(alt, "PMT status modification by PMT physical address") = JPARSER::initialised();
977  zap['k'] = make_field(keep, "keep string[s]") = JPARSER::initialised();
978  zap['r'] = make_field(rm, "remove string[s]") = JPARSER::initialised();
979  zap['m'] = make_field(id, "remove module by identifier") = JPARSER::initialised();
980  zap['D'] = make_field(del, "remove module by location") = JPARSER::initialised();
981  zap['O'] = make_field(option, "sort modules: "\
982  "0 -> no sort; 1 -> module identifier; 2 -> module location") = 0, 1, 2;
983  zap['q'] = make_field(squash, "squash meta data");
984  zap['d'] = make_field(debug, "debug level") = 2;
985 
986  zap(argc, argv);
987  }
988  catch(const exception &error) {
989  FATAL(error.what() << endl);
990  }
991 
992  gRandom->SetSeed(0);
993 
994  const int ns = ((keep.empty() ? 0 : 1) +
995  (rm .empty() ? 0 : 1) +
996  (id .empty() ? 0 : 1) +
997  (del .empty() ? 0 : 1));
998 
999  if (ns > 1) {
1000  FATAL("Use either option -k, -r, -m or -D." << endl);
1001  }
1002 
1004 
1005  try {
1006  load(inputFile, detector);
1007  }
1008  catch(const JException& error) {
1009  FATAL(error);
1010  }
1011 
1012  if (squash) {
1013  detector.comment.clear();
1014  }
1015 
1016  detector.comment.add(JMeta(argc,argv));
1017 
1018  if (detector.setToLatestVersion()) {
1019  NOTICE("Set detector version to " << detector.getVersion() << endl);
1020  }
1021 
1022 
1023  if (!hdr.empty()) {
1024 
1025  int id = -1;
1026 
1027  JProperties helper = detector.getProperties();
1028 
1029  helper["id"] = id;
1030 
1031  for (vector<JToken_t>::const_iterator i = hdr.begin(); i != hdr.end(); ++i) {
1032 
1033  istringstream is(*i);
1034 
1035  is >> helper;
1036  }
1037 
1038  if (id != -1) {
1039  detector.setID(id);
1040  }
1041  }
1042 
1043 
1044  if (ns != 0) {
1045 
1046  for (JDetector::iterator module = detector.begin(); module != detector.end(); ) {
1047 
1048  bool __rm__ = !keep.empty() && rm.empty();
1049 
1050  for (vector<JRange_t>::const_iterator i = keep.begin(); i != keep.end(); ++i) {
1051  if (module->getString() >= i->first && module->getString() <= i->second) {
1052  __rm__ = false;
1053  }
1054  }
1055 
1056  for (vector<JRange_t>::const_iterator i = rm.begin(); i != rm.end(); ++i) {
1057  if (module->getString() >= i->first && module->getString() <= i->second) {
1058  __rm__ = true;
1059  }
1060  }
1061 
1062  if (!id.empty()) {
1063  __rm__ = find(id.begin(), id.end(), module->getID()) == id.end();
1064  }
1065 
1066  const auto range = del.equal_range(module->getString());
1067 
1068  for (auto i = range.first; i != range.second; ++i) {
1069  if (i->second == module->getFloor()) {
1070  __rm__ = true;
1071  }
1072  }
1073 
1074  if (__rm__)
1075  module = detector.erase(module);
1076  else
1077  ++module;
1078  }
1079  }
1080 
1081 
1082  for (vector< pair<int, JModifier> >::const_iterator i = mod.begin(); i != mod.end(); ++i) {
1083 
1084  for (JDetector::iterator module = detector.begin(); module != detector.end(); ++module) {
1085 
1086  if (module->getID() == i->first || i->first == WILDCARD ){
1087 
1088  if (debug >= debug_t) {
1089  print(cout, *module, i->second);
1090  }
1091 
1092  if (!i->second.apply(*module)) {
1093  ERROR("No valid action: " << i->first << ' ' << i->second << endl);
1094  }
1095  }
1096  }
1097  }
1098 
1099 
1100  for (vector< pair<int, JModifier> >::const_iterator i = str.begin(); i != str.end(); ++i) {
1101 
1102  for (JDetector::iterator module = detector.begin(); module != detector.end(); ++module) {
1103 
1104  if (module->getString() == i->first || i->first == WILDCARD) {
1105 
1106  const JModifier modifier = getModifier(module->getString(), i->second);
1107 
1108  if (debug >= debug_t) {
1109  print(cout, *module, i->second);
1110  }
1111 
1112  if (!modifier.apply(*module)) {
1113  ERROR("No valid action: " << i->first << ' ' << i->second << endl);
1114  }
1115  }
1116  }
1117  }
1118 
1119 
1120  for (vector< pair<int, JModifier> >::const_iterator i = dos.begin(); i != dos.end(); ++i) {
1121 
1122  for (JDetector::iterator module = detector.begin(); module != detector.end(); ++module) {
1123 
1124  if (module->getFloor() != 0) {
1125 
1126  if (module->getString() == i->first || i->first == WILDCARD) {
1127 
1128  const JModifier modifier = getModifier(module->getString(), i->second);
1129 
1130  if (debug >= debug_t) {
1131  print(cout, *module, i->second);
1132  }
1133 
1134  if (!modifier.apply(*module)) {
1135  ERROR("No valid action: " << i->first << ' ' << i->second << endl);
1136  }
1137  }
1138  }
1139  }
1140  }
1141 
1142 
1143  for (vector< pair<int, JModuleModifier> >::const_iterator i = wip.begin(); i != wip.end(); ++i) {
1144 
1145  for (JDetector::iterator module = detector.begin(); module != detector.end(); ++module) {
1146 
1147  if (module->getID() == i->first || i->first == WILDCARD ){
1148 
1149  if (debug >= debug_t) {
1150  print(cout, *module, i->second);
1151  }
1152 
1153  if (!i->second.apply(*module)) {
1154  ERROR("No valid action: " << i->first << ' ' << i->second << endl);
1155  }
1156  }
1157  }
1158  }
1159 
1160 
1161  for (vector< pair<JPMTIdentifier, JPMTModifier> >::const_iterator i = pmt.begin(); i != pmt.end(); ++i) {
1162 
1163  for (JDetector::iterator module = detector.begin(); module != detector.end(); ++module) {
1164 
1165  if (module->getID() == i->first.getModuleID() || i->first.getModuleID() == WILDCARD) {
1166 
1167  if (debug >= debug_t) {
1168  print(cout, i->first, i->second);
1169  }
1170 
1171  if (i->first.getPMTAddress() == WILDCARD) {
1172 
1173  for (int pmt = 0; pmt != getNumberOfPMTs(*module); ++pmt) {
1174  if (!i->second.apply(module->getPMT(pmt))) {
1175  ERROR("No valid action: " << i->first << ' ' << i->second << endl);
1176  }
1177  }
1178 
1179  } else if (i->first.getPMTAddress() >= 0 &&
1180  i->first.getPMTAddress() < getNumberOfPMTs(*module) &&
1181  !i->second.apply(module->getPMT(i->first.getPMTAddress()))) {
1182  ERROR("No valid action: " << i->first << ' ' << i->second << endl);
1183  }
1184  }
1185  }
1186  }
1187 
1188 
1189  if (!alt.empty()) {
1190 
1191  if (!hasDetectorAddressMap(detector.getID())) {
1192  FATAL("Invalid detector identifier " << detector.getID() << endl);
1193  }
1194 
1195  const JDetectorAddressMap& demo = getDetectorAddressMap(detector.getID());
1196 
1197  for (JDetector::iterator module = detector.begin(); module != detector.end(); ++module) {
1198 
1199  const JModuleAddressMap memo = demo.get(module->getID());
1200 
1201  for (vector< pair<JPMTPhysicalAddress, JPMTModifier> >::const_iterator i = alt.begin(); i != alt.end(); ++i) {
1202 
1203  const JPMTIdentifier id(module->getID(), memo.getAddressTranslator(i->first).tdc);
1204 
1205  if (debug >= debug_t) {
1206  print(cout, id, i->second);
1207  }
1208 
1209  if (!i->second.apply(module->getPMT(id.getPMTAddress()))) {
1210  ERROR("No valid action: " << i->first << ' ' << i->second << endl);
1211  }
1212  }
1213  }
1214  }
1215 
1216 
1217  switch (option) {
1218  case 1:
1219  sort(detector.begin(), detector.end(), make_comparator(&JModule::getID));
1220  break;
1221 
1222  case 2:
1223  sort(detector.begin(), detector.end(), make_comparator(&JModule::getLocation));
1224  break;
1225 
1226  default:
1227  break;
1228  };
1229 
1230 
1231  try {
1233  }
1234  catch(const JException& error) {
1235  FATAL(error);
1236  }
1237 }
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:1514
General exception.
Definition: JException.hh:24
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.
Detector data structure.
Definition: JDetector.hh:89
std::vector< size_t > ns
bool hasDetectorAddressMap(const int id)
Check if detector address map is available.
Utility class to parse parameter values.
Definition: JProperties.hh:497
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.
then rm
Definition: sftpput.zsh:30
Detector file.
Definition: JHead.hh:226
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1989
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