Jpp  18.0.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) 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 916 of file JEditDetector.cc.

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