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