39 static const int WILDCARD = -1;
41 static const std::string reset_t =
"reset";
42 static const std::string set_t =
"set";
43 static const std::string add_t =
"add";
44 static const std::string sub_t =
"sub";
45 static const std::string rot_t =
"rot";
46 static const std::string mul_t =
"mul";
48 static const std::string assign_t =
"assign";
49 static const std::string string_t =
"string";
51 static const std::string rand_t =
"rand";
52 static const std::string randset_t = rand_t + set_t;
53 static const std::string randadd_t = rand_t + add_t;
54 static const std::string randsub_t = rand_t + sub_t;
55 static const std::string randrot_t = rand_t + rot_t;
56 static const std::string randmul_t = rand_t + mul_t;
58 static const std::string RESET_t =
"RESET";
59 static const std::string SET_t =
"SET";
60 static const std::string ADD_t =
"ADD";
61 static const std::string SUB_t =
"SUB";
62 static const std::string ROT_t =
"ROT";
72 inline bool apply(
JModule& module,
const std::string& action)
74 if (action == reset_t) {
78 for (JModule::iterator pmt = module.begin(); pmt != module.end(); ++pmt) {
83 }
else if (action == RESET_t) {
88 }
else if (action == SET_t) {
114 inline bool apply(
JModule& module,
const std::string& action,
const double value)
116 if (action == set_t) {
120 }
else if (action == add_t) {
124 }
else if (action == sub_t) {
128 }
else if (action == rot_t) {
138 }
else if (action == mul_t) {
146 }
else if (action == SET_t) {
150 }
else if (action == ADD_t) {
154 }
else if (action == SUB_t) {
158 }
else if (action == ROT_t) {
162 }
else if (action == randadd_t) {
164 module.
add(gRandom->Gaus(0.0, value));
166 }
else if (action == randsub_t) {
168 module.
sub(gRandom->Gaus(0.0, value));
170 }
else if (action == randrot_t){
180 }
else if (action == randmul_t) {
191 }
else if (action == assign_t) {
193 module.
setID((
int) value);
195 }
else if (action == string_t) {
216 inline bool apply(
JModule& module,
const std::string& action,
const JVector3D& pos)
219 gRandom->Gaus(0.0, pos.
getY()),
220 gRandom->Gaus(0.0, pos.
getZ()));
224 else if (action == add_t)
226 else if (action == sub_t)
228 else if (action == randset_t)
230 else if (action == randadd_t)
232 else if (action == randsub_t)
253 else if (action == ADD_t)
255 else if (action == SUB_t)
272 inline bool apply(
JPMT& pmt,
const std::string& action,
const std::string& value)
278 else if (action == reset_t)
285 catch(
const std::exception&) {
309 return (action !=
"" && !data.empty());
319 bool apply(
JModule& module)
const
321 switch (data.size()) {
324 return ::apply(module, action);
327 return ::apply(module, action, data[0]);
330 return ::apply(module, action,
JVector3D(data[0], data[1], 0.0));
333 return ::apply(module, action,
JVector3D(data[0], data[1], data[2]));
336 return ::apply(module, action,
JQuaternion3D(data[0], data[1], data[2], data[3]));
351 friend inline std::istream&
operator>>(std::istream&
in, JModifier& modifier)
353 if (in >> modifier.action) {
355 modifier.data.clear();
357 for (
double x; in >> x; ) {
358 modifier.data.push_back(x);
361 in.clear(std::ios_base::eofbit);
375 friend inline std::ostream&
operator<<(std::ostream& out,
const JModifier& modifier)
377 out << modifier.action;
402 inline const JModifier& getModifier(
const int id,
const JModifier& modifier)
408 const string::size_type pos = modifier.action.find(rand_t);
410 if (pos != string::npos) {
412 JModifier&
result = buffer[id][modifier.action][modifier.data.size()];
414 if (!result.is_valid()) {
416 result.action = modifier.action.substr(pos + rand_t.length());
418 for (
size_t i = 0; i != modifier.data.size(); ++i) {
419 result.data.push_back(gRandom->Gaus(0.0, modifier.data[i]));
435 struct JPMTModifier {
449 bool apply(
JPMT& pmt)
const
451 return ::apply(pmt, action, value);
462 friend inline std::istream&
operator>>(std::istream& in, JPMTModifier& modifier)
464 return in >> modifier.action >> modifier.value;
475 friend inline std::ostream&
operator<<(std::ostream& out,
const JPMTModifier& modifier)
477 out << modifier.action;
479 out << modifier.value;
501 static const char SEPARATOR =
'-';
518 friend inline std::istream&
operator>>(std::istream& in, JRange_t&
range)
520 if (in >> range.first) {
522 range.second = range.first;
524 if (in.peek() == (int) JRange_t::SEPARATOR) {
547 friend inline std::ostream&
operator<<(std::ostream& out,
const JRange_t& range)
549 return out << range.first << JRange_t::SEPARATOR << range.second;
561 inline void print(std::ostream& out,
const JModule& module,
const JModifier& modifier)
566 out <<
"Modifier" <<
' '
568 << setw(10) << module.
getID() <<
' '
569 <<
"action" <<
' ' << modifier.action <<
JEEPZ() << modifier.data << endl;
580 inline void print(std::ostream& out,
const JPMTIdentifier& pmt,
const JPMTModifier& modifier)
585 out <<
"PMT modifier" <<
' '
586 <<
"(" << setw(10) << pmt.
getID() <<
"," << setw(2) << pmt.
getPMTAddress() <<
")" <<
' '
587 <<
"action" <<
' ' << modifier.action <<
' '
588 <<
"value" <<
' ' << modifier.value << endl;
687 int main(
int argc,
char **argv)
712 JParser<> zap(
"Auxiliary program to modify detector.");
730 catch(
const exception &error) {
731 FATAL(error.what() << endl);
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);
756 if (
detector.setToLatestVersion()) {
757 NOTICE(
"Set detector version to " <<
detector.getVersion() << endl);
771 istringstream
is(*i);
782 for (JDetector::iterator module =
detector.begin(); module !=
detector.end(); ) {
784 bool __rm__ = !keep.empty() && rm.empty();
799 __rm__ = find(
id.begin(),
id.end(), module->
getID()) ==
id.end();
802 const auto range = del.equal_range(module->
getString());
804 for (
auto i = range.first; i != range.second; ++i) {
805 if (i->second == module->
getFloor()) {
819 for (JDetector::iterator module =
detector.begin(); module !=
detector.end(); ++module) {
821 if (module->
getID() == i->first || i->first == WILDCARD ){
824 print(cout, *module, i->second);
827 if (!i->second.apply(*module)) {
828 ERROR(
"No valid action: " << i->first <<
' ' << i->second << endl);
837 for (JDetector::iterator module =
detector.begin(); module !=
detector.end(); ++module) {
839 if (module->
getString() == i->first || i->first == WILDCARD) {
841 const JModifier modifier = getModifier(module->
getString(), i->second);
844 print(cout, *module, i->second);
847 if (!modifier.apply(*module)) {
848 ERROR(
"No valid action: " << i->first <<
' ' << i->second << endl);
857 for (JDetector::iterator module =
detector.begin(); module !=
detector.end(); ++module) {
861 if (module->
getString() == i->first || i->first == WILDCARD) {
863 const JModifier modifier = getModifier(module->
getString(), i->second);
866 print(cout, *module, i->second);
869 if (!modifier.apply(*module)) {
870 ERROR(
"No valid action: " << i->first <<
' ' << i->second << endl);
880 for (JDetector::iterator module =
detector.begin(); module !=
detector.end(); ++module) {
882 if (module->
getID() == i->first.getModuleID() || i->first.getModuleID() == WILDCARD) {
885 print(cout, i->first, i->second);
888 if (i->first.getPMTAddress() == WILDCARD) {
891 if (!i->second.apply(module->
getPMT(pmt))) {
892 ERROR(
"No valid action: " << i->first <<
' ' << i->second << endl);
896 }
else if (i->first.getPMTAddress() < 0 ||
898 !i->second.apply(module->
getPMT(i->first.getPMTAddress()))) {
899 ERROR(
"No valid action: " << i->first <<
' ' << i->second << endl);
909 FATAL(
"Invalid detector identifier " <<
detector.getID() << endl);
914 for (JDetector::iterator module =
detector.begin(); module !=
detector.end(); ++module) {
923 print(cout,
id, i->second);
926 if (!i->second.apply(module->
getPMT(
id.getPMTAddress()))) {
927 ERROR(
"No valid action: " << i->first <<
' ' << i->second << endl);
void set(const int bit)
Set PMT status.
Utility class to parse command line options.
static const JGetPMTStatusBit getPMTStatusBit
Function object to map key to PMT status bit.
int main(int argc, char *argv[])
int getFloor() const
Get floor number.
Data structure for a composite optical module.
static const double HYDROPHONE_DELAYTIME_US
Hydrophone delay time [us].
JQuaternion3D getConjugate() const
Get conjugate of this quaternion.
void setLocation(const JLocation &location)
Set location.
bool hasDetectorAddressMap(const int id)
Check if detector address map is available.
Utility class to parse parameter values.
std::iterator_traits< T >::value_type getAverage(T __begin, T __end)
Get average.
int getNumberOfPMTs(const JModule &module)
Get number of PMTs.
void subT0(const double t0)
Subtract time offset.
Auxiliary class for controlling PMT status.
Lookup table for PMT addresses in detector.
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Data structure for time calibration.
void reset(const int bit)
Reset PMT status.
Data structure for detector geometry and calibration.
const JModuleAddressMap & get(const int id) const
Get module address map.
const JQuaternion3D & getQuaternion() const
Get quaternion.
JModule & sub(const JVector3D &pos)
Subtract position.
Lookup table for PMT addresses in optical module.
I/O formatting auxiliaries.
static const double PIEZO_DELAYTIME_US
Piezo delay time [us].
Data structure for vector in three dimensions.
void setQuaternion(const JQuaternion3D &quaternion)
Set quaternion.
Logical location of module.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
const array_type< JValue_t > & make_array(const JValue_t(&array)[N])
Method to create array of values.
int getID() const
Get identifier.
This class represents a rotation around the z-axis.
bool is_valid(const json &js)
Check validity of JSon data.
Data structure for PMT geometry and calibration.
void store(const std::string &file_name, const JDetector &detector)
Store detector to output file.
JPosition3D getPosition(const Vec &pos)
Get position.
int getPMTAddress() const
Get PMT identifier (= TDC).
double getY() const
Get y position.
Auxiliary data structure for streaming of STL containers.
const JPosition3D & getPosition() const
Get position.
JDetectorAddressMap & getDetectorAddressMap()
Get detector address map.
static const JModule & getInstance()
Get reference to unique instance of this class object.
const JPMT & getPMT(const int index) const
Get PMT.
void rotate(const JRotation3D &R)
Rotate module.
General purpose messaging.
Auxiliary data structure for sequence of same character.
z range($ZMAX-$ZMIN)< $MINIMAL_DZ." fi fi mv $WORKDIR/fit.root $MODULE_ROOT typeset -Z 4 STRING typeset -Z 2 FLOOR JPlot1D -f $
Data structure for unit quaternion in three dimensions.
Direct access to module in detector data structure.
int getString() const
Get string number.
std::istream & operator>>(std::istream &in, JAANET::JHead &header)
Read header from input.
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.
void setT0(const double t0)
Set time offset.
Auxiliary class to define a range between two values.
Utility class to parse command line options.
Wrapper class around string.
void setCalibration(const JCalibration &cal)
Set calibration.
void setID(const int id)
Set identifier.
double getX() const
Get x position.
Base class for data structures with artithmetic capabilities.
void addT0(const double t0)
Add time offset.
Data structure for PMT physical address.
do set_variable DETECTOR_TXT $WORKDIR detector
then fatal Wrong number of arguments fi set_variable DETECTOR $argv[1] set_variable INPUT_FILE $argv[2] eval JPrintDetector a $DETECTOR O IDENTIFIER eval JPrintDetector a $DETECTOR O SUMMARY source JAcoustics sh $DETECTOR_ID CHECK_EXIT_CODE typeset A TRIPODS get_tripods $WORKDIR tripod txt TRIPODS for EMITTER in
JModule & set(const JVector3D &pos)
Set position.
double getZ() const
Get z position.
JModule & add(const JVector3D &pos)
Add position.
double getT0() const
Get time offset.