Jpp  pmt_effective_area_update
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 "TRandom3.h"
#include "JDetector/JDetector.hh"
#include "JDetector/JDetectorToolkit.hh"
#include "JDetector/JDetectorHeader.hh"
#include "JDetector/JModuleRouter.hh"
#include "JDetector/JPMTIdentifier.hh"
#include "JDetector/JPMTPhysicalAddress.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 "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>     (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>     (reset)"
    -(S|s) "<string number>         (reset)"
    -M     "<module identifier>     (assign)  identifier"
    -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"
    -M     "<module identifier>     (SET)"
    -(S|s) "<string number>         (SET)"
    -(S|s) "<string number>         (tilt|randtilt) Tx Ty"
    -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 [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, the multiplication factor (a.k.a. "stretching") applies to the z-coordinates of the optical modules and not to the base module (read anchor).
The factor is defined as a fraction; the actual multiplication 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.

If no values are given at the option SET,

In this, the time calibration is corrected for the delay time of the piezo sensor and hydrophone
which are defined by JDETECTOR::PIEZO_DELAYTIME_US JDETECTOR::HYDROPHONE_DELAYTIME_US, respectively.
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 724 of file JEditDetector.cc.

725 {
726  using namespace std;
727  using namespace JPP;
728 
729  typedef JToken<';'> JToken_t;
730 
731  string inputFile;
732  string outputFile;
733  vector<JToken_t> hdr;
738  JPMTModifier> > pmt;
740  JPMTModifier> > alt;
741  vector<JRange_t> keep;
742  vector<JRange_t> rm;
743  vector<int> id;
744  multimap<int, int> del;
745  int debug;
746 
747  try {
748 
749  JParser<> zap("Auxiliary program to modify detector.");
750 
751  zap['a'] = make_field(inputFile);
752  zap['o'] = make_field(outputFile);
753  zap['@'] = make_field(hdr, "header modification") = JPARSER::initialised();
754  zap['M'] = make_field(mod, "module modification") = JPARSER::initialised();
755  zap['S'] = make_field(str, "string modification (optical modules and base module") = JPARSER::initialised();
756  zap['s'] = make_field(dos, "string modification (optical modules only)") = JPARSER::initialised();
757  zap['P'] = make_field(pmt, "PMT modification by PMT logical address") = JPARSER::initialised();
758  zap['p'] = make_field(alt, "PMT modification by PMT physical address") = JPARSER::initialised();
759  zap['k'] = make_field(keep, "keep string[s]") = JPARSER::initialised();
760  zap['r'] = make_field(rm, "remove string[s]") = JPARSER::initialised();
761  zap['m'] = make_field(id, "remove module by identifier") = JPARSER::initialised();
762  zap['D'] = make_field(del, "remove module by location") = JPARSER::initialised();
763  zap['d'] = make_field(debug) = 2;
764 
765  zap(argc, argv);
766  }
767  catch(const exception &error) {
768  FATAL(error.what() << endl);
769  }
770 
772 
773  try {
774  load(inputFile, detector);
775  }
776  catch(const JException& error) {
777  FATAL(error);
778  }
779 
780 
781  gRandom->SetSeed(0);
782 
783 
784  if ((keep.empty() ? 0 : 1 +
785  rm .empty() ? 0 : 1 +
786  id .empty() ? 0 : 1) > 1) {
787  FATAL("Use either option -k, -r or -m." << endl);
788  }
789 
790 
791  detector.comment.add(JMeta(argc,argv));
792 
793  if (detector.setToLatestVersion()) {
794  NOTICE("Set detector version to " << detector.getVersion() << endl);
795  }
796 
797 
798  if (!hdr.empty()) {
799 
800  int id = -1;
801 
802  JProperties helper = detector.getProperties();
803 
804  helper["id"] = id;
805 
806  for (vector<JToken_t>::const_iterator i = hdr.begin(); i != hdr.end(); ++i) {
807 
808  istringstream is(*i);
809 
810  is >> helper;
811  }
812 
813  if (id != -1) {
814  detector.setID(id);
815  }
816  }
817 
818 
819  for (JDetector::iterator module = detector.begin(); module != detector.end(); ) {
820 
821  bool __rm__ = !keep.empty() && rm.empty();
822 
823  for (vector<JRange_t>::const_iterator i = keep.begin(); i != keep.end(); ++i) {
824  if (module->getString() >= i->first && module->getString() <= i->second) {
825  __rm__ = false;
826  }
827  }
828 
829  for (vector<JRange_t>::const_iterator i = rm.begin(); i != rm.end(); ++i) {
830  if (module->getString() >= i->first && module->getString() <= i->second) {
831  __rm__ = true;
832  }
833  }
834 
835  if (!id.empty()) {
836  __rm__ = find(id.begin(), id.end(), module->getID()) == id.end();
837  }
838 
839  const auto range = del.equal_range(module->getString());
840 
841  for (auto i = range.first; i != range.second; ++i) {
842  if (i->second == module->getFloor()) {
843  __rm__ = true;
844  }
845  }
846 
847  if (__rm__)
848  module = detector.erase(module);
849  else
850  ++module;
851  }
852 
853 
854  for (vector< pair<int, JModifier> >::const_iterator i = mod.begin(); i != mod.end(); ++i) {
855 
856  for (JDetector::iterator module = detector.begin(); module != detector.end(); ++module) {
857 
858  if (module->getID() == i->first || i->first == WILDCARD ){
859 
860  if (debug >= debug_t) {
861  print(cout, *module, i->second);
862  }
863 
864  if (!i->second.apply(*module)) {
865  ERROR("No valid action: " << i->first << ' ' << i->second << endl);
866  }
867  }
868  }
869  }
870 
871 
872  for (vector< pair<int, JModifier> >::const_iterator i = str.begin(); i != str.end(); ++i) {
873 
874  for (JDetector::iterator module = detector.begin(); module != detector.end(); ++module) {
875 
876  if (module->getString() == i->first || i->first == WILDCARD) {
877 
878  const JModifier modifier = getModifier(module->getString(), i->second);
879 
880  if (debug >= debug_t) {
881  print(cout, *module, i->second);
882  }
883 
884  if (!modifier.apply(*module)) {
885  ERROR("No valid action: " << i->first << ' ' << i->second << endl);
886  }
887  }
888  }
889  }
890 
891 
892  for (vector< pair<int, JModifier> >::const_iterator i = dos.begin(); i != dos.end(); ++i) {
893 
894  for (JDetector::iterator module = detector.begin(); module != detector.end(); ++module) {
895 
896  if (module->getFloor() != 0) {
897 
898  if (module->getString() == i->first || i->first == WILDCARD) {
899 
900  const JModifier modifier = getModifier(module->getString(), i->second);
901 
902  if (debug >= debug_t) {
903  print(cout, *module, i->second);
904  }
905 
906  if (!modifier.apply(*module)) {
907  ERROR("No valid action: " << i->first << ' ' << i->second << endl);
908  }
909  }
910  }
911  }
912  }
913 
914 
915  for (vector< pair<JPMTIdentifier, JPMTModifier> >::const_iterator i = pmt.begin(); i != pmt.end(); ++i) {
916 
917  for (JDetector::iterator module = detector.begin(); module != detector.end(); ++module) {
918 
919  if (module->getID() == i->first.getModuleID() || i->first.getModuleID() == WILDCARD) {
920 
921  if (debug >= debug_t) {
922  print(cout, i->first, i->second);
923  }
924 
925  if (i->first.getPMTAddress() == WILDCARD) {
926 
927  for (int pmt = 0; pmt != getNumberOfPMTs(*module); ++pmt) {
928  if (!i->second.apply(module->getPMT(pmt))) {
929  ERROR("No valid action: " << i->first << ' ' << i->second << endl);
930  }
931  }
932 
933  } else if (i->first.getPMTAddress() < 0 ||
934  i->first.getPMTAddress() >= getNumberOfPMTs(*module) ||
935  !i->second.apply(module->getPMT(i->first.getPMTAddress()))) {
936  ERROR("No valid action: " << i->first << ' ' << i->second << endl);
937  }
938  }
939  }
940  }
941 
942 
943  if (!alt.empty()) {
944 
945  if (!hasDetectorAddressMap(detector.getID())) {
946  FATAL("Invalid detector identifier " << detector.getID() << endl);
947  }
948 
949  const JDetectorAddressMap& demo = getDetectorAddressMap(detector.getID());
950 
951  for (JDetector::iterator module = detector.begin(); module != detector.end(); ++module) {
952 
953  const JModuleAddressMap memo = demo.get(module->getID());
954 
955  for (vector< pair<JPMTPhysicalAddress, JPMTModifier> >::const_iterator i = alt.begin(); i != alt.end(); ++i) {
956 
957  const JPMTIdentifier id(module->getID(), memo.getAddressTranslator(i->first).tdc);
958 
959  if (debug >= debug_t) {
960  print(cout, id, i->second);
961  }
962 
963  if (!i->second.apply(module->getPMT(id.getPMTAddress()))) {
964  ERROR("No valid action: " << i->first << ' ' << i->second << endl);
965  }
966  }
967  }
968  }
969 
970 
971  try {
973  }
974  catch(const JException& error) {
975  FATAL(error);
976  }
977 }
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
Detector data structure.
Definition: JDetector.hh:81
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:196
#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:63
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