Jpp  17.0.0
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 897 of file JEditDetector.cc.

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