Jpp - 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)"
    -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. position calibration (x = x0, y = x1, z = 0)
  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 687 of file JEditDetector.cc.

688 {
689  using namespace std;
690  using namespace JPP;
691 
692  typedef JToken<';'> JToken_t;
693 
694  string inputFile;
695  string outputFile;
696  vector<JToken_t> hdr;
701  JPMTModifier> > pmt;
703  JPMTModifier> > alt;
704  vector<JRange_t> keep;
705  vector<JRange_t> rm;
706  vector<int> id;
707  multimap<int, int> del;
708  int debug;
709 
710  try {
711 
712  JParser<> zap("Auxiliary program to modify detector.");
713 
714  zap['a'] = make_field(inputFile);
715  zap['o'] = make_field(outputFile);
716  zap['@'] = make_field(hdr) = JPARSER::initialised();
717  zap['M'] = make_field(mod) = JPARSER::initialised();
718  zap['S'] = make_field(str) = JPARSER::initialised();
719  zap['s'] = make_field(dos) = JPARSER::initialised();
720  zap['P'] = make_field(pmt) = JPARSER::initialised();
721  zap['p'] = make_field(alt) = JPARSER::initialised();
722  zap['k'] = make_field(keep) = JPARSER::initialised();
723  zap['r'] = make_field(rm) = JPARSER::initialised();
724  zap['m'] = make_field(id) = JPARSER::initialised();
725  zap['D'] = make_field(del) = JPARSER::initialised();
726  zap['d'] = make_field(debug) = 2;
727 
728  zap(argc, argv);
729  }
730  catch(const exception &error) {
731  FATAL(error.what() << endl);
732  }
733 
735 
736  try {
737  load(inputFile, detector);
738  }
739  catch(const JException& error) {
740  FATAL(error);
741  }
742 
743 
744  gRandom->SetSeed(0);
745 
746 
747  if ((keep.empty() ? 0 : 1 +
748  rm .empty() ? 0 : 1 +
749  id .empty() ? 0 : 1) > 1) {
750  FATAL("Use either option -k, -r or -m." << endl);
751  }
752 
753 
754  detector.comment.add(JMeta(argc,argv));
755 
756  if (detector.setToLatestVersion()) {
757  NOTICE("Set detector version to " << detector.getVersion() << endl);
758  }
759 
760 
761  if (!hdr.empty()) {
762 
763  int id = -1;
764 
765  JProperties helper = detector.getProperties();
766 
767  helper["id"] = id;
768 
769  for (vector<JToken_t>::const_iterator i = hdr.begin(); i != hdr.end(); ++i) {
770 
771  istringstream is(*i);
772 
773  is >> helper;
774  }
775 
776  if (id != -1) {
777  detector.setID(id);
778  }
779  }
780 
781 
782  for (JDetector::iterator module = detector.begin(); module != detector.end(); ) {
783 
784  bool __rm__ = !keep.empty() && rm.empty();
785 
786  for (vector<JRange_t>::const_iterator i = keep.begin(); i != keep.end(); ++i) {
787  if (module->getString() >= i->first && module->getString() <= i->second) {
788  __rm__ = false;
789  }
790  }
791 
792  for (vector<JRange_t>::const_iterator i = rm.begin(); i != rm.end(); ++i) {
793  if (module->getString() >= i->first && module->getString() <= i->second) {
794  __rm__ = true;
795  }
796  }
797 
798  if (!id.empty()) {
799  __rm__ = find(id.begin(), id.end(), module->getID()) == id.end();
800  }
801 
802  const auto range = del.equal_range(module->getString());
803 
804  for (auto i = range.first; i != range.second; ++i) {
805  if (i->second == module->getFloor()) {
806  __rm__ = true;
807  }
808  }
809 
810  if (__rm__)
811  module = detector.erase(module);
812  else
813  ++module;
814  }
815 
816 
817  for (vector< pair<int, JModifier> >::const_iterator i = mod.begin(); i != mod.end(); ++i) {
818 
819  for (JDetector::iterator module = detector.begin(); module != detector.end(); ++module) {
820 
821  if (module->getID() == i->first || i->first == WILDCARD ){
822 
823  if (debug >= debug_t) {
824  print(cout, *module, i->second);
825  }
826 
827  if (!i->second.apply(*module)) {
828  ERROR("No valid action: " << i->first << ' ' << i->second << endl);
829  }
830  }
831  }
832  }
833 
834 
835  for (vector< pair<int, JModifier> >::const_iterator i = str.begin(); i != str.end(); ++i) {
836 
837  for (JDetector::iterator module = detector.begin(); module != detector.end(); ++module) {
838 
839  if (module->getString() == i->first || i->first == WILDCARD) {
840 
841  const JModifier modifier = getModifier(module->getString(), i->second);
842 
843  if (debug >= debug_t) {
844  print(cout, *module, i->second);
845  }
846 
847  if (!modifier.apply(*module)) {
848  ERROR("No valid action: " << i->first << ' ' << i->second << endl);
849  }
850  }
851  }
852  }
853 
854 
855  for (vector< pair<int, JModifier> >::const_iterator i = dos.begin(); i != dos.end(); ++i) {
856 
857  for (JDetector::iterator module = detector.begin(); module != detector.end(); ++module) {
858 
859  if (module->getFloor() != 0) {
860 
861  if (module->getString() == i->first || i->first == WILDCARD) {
862 
863  const JModifier modifier = getModifier(module->getString(), i->second);
864 
865  if (debug >= debug_t) {
866  print(cout, *module, i->second);
867  }
868 
869  if (!modifier.apply(*module)) {
870  ERROR("No valid action: " << i->first << ' ' << i->second << endl);
871  }
872  }
873  }
874  }
875  }
876 
877 
878  for (vector< pair<JPMTIdentifier, JPMTModifier> >::const_iterator i = pmt.begin(); i != pmt.end(); ++i) {
879 
880  for (JDetector::iterator module = detector.begin(); module != detector.end(); ++module) {
881 
882  if (module->getID() == i->first.getModuleID() || i->first.getModuleID() == WILDCARD) {
883 
884  if (debug >= debug_t) {
885  print(cout, i->first, i->second);
886  }
887 
888  if (i->first.getPMTAddress() == WILDCARD) {
889 
890  for (int pmt = 0; pmt != getNumberOfPMTs(*module); ++pmt) {
891  if (!i->second.apply(module->getPMT(pmt))) {
892  ERROR("No valid action: " << i->first << ' ' << i->second << endl);
893  }
894  }
895 
896  } else if (i->first.getPMTAddress() < 0 ||
897  i->first.getPMTAddress() >= getNumberOfPMTs(*module) ||
898  !i->second.apply(module->getPMT(i->first.getPMTAddress()))) {
899  ERROR("No valid action: " << i->first << ' ' << i->second << endl);
900  }
901  }
902  }
903  }
904 
905 
906  if (!alt.empty()) {
907 
908  if (!hasDetectorAddressMap(detector.getID())) {
909  FATAL("Invalid detector identifier " << detector.getID() << endl);
910  }
911 
912  const JDetectorAddressMap& demo = getDetectorAddressMap(detector.getID());
913 
914  for (JDetector::iterator module = detector.begin(); module != detector.end(); ++module) {
915 
916  const JModuleAddressMap memo = demo.get(module->getID());
917 
918  for (vector< pair<JPMTPhysicalAddress, JPMTModifier> >::const_iterator i = alt.begin(); i != alt.end(); ++i) {
919 
920  const JPMTIdentifier id(module->getID(), memo.getAddressTranslator(i->first).tdc);
921 
922  if (debug >= debug_t) {
923  print(cout, id, i->second);
924  }
925 
926  if (!i->second.apply(module->getPMT(id.getPMTAddress()))) {
927  ERROR("No valid action: " << i->first << ' ' << i->second << endl);
928  }
929  }
930  }
931  }
932 
933 
934  try {
936  }
937  catch(const JException& error) {
938  FATAL(error);
939  }
940 }
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:80
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
z range($ZMAX-$ZMIN)< $MINIMAL_DZ." fi fi mv $WORKDIR/fit.root $MODULE_ROOT typeset -Z 4 STRING typeset -Z 2 FLOOR JPlot1D -f $
Definition: module-Z:fit.sh:84
#define FATAL(A)
Definition: JMessage.hh:67
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