44 static const int WILDCARD = -1;
46 static const std::string reset_t =
"reset";
47 static const std::string set_t =
"set";
48 static const std::string setx_t =
"setx";
49 static const std::string sety_t =
"sety";
50 static const std::string setz_t =
"setz";
51 static const std::string add_t =
"add";
52 static const std::string sub_t =
"sub";
53 static const std::string rot_t =
"rot";
54 static const std::string mul_t =
"mul";
55 static const std::string div_t =
"div";
56 static const std::string tilt_t =
"tilt";
57 static const std::string swap_t =
"swap";
59 static const std::string assign_t =
"assign";
60 static const std::string locate_t =
"locate";
61 static const std::string string_t =
"string";
63 static const std::string rand_t =
"rand";
64 static const std::string randset_t = rand_t + set_t;
65 static const std::string randadd_t = rand_t + add_t;
66 static const std::string randsub_t = rand_t + sub_t;
67 static const std::string randrot_t = rand_t + rot_t;
68 static const std::string randmul_t = rand_t + mul_t;
69 static const std::string randdiv_t = rand_t + div_t;
70 static const std::string randtilt_t = rand_t + tilt_t;
72 static const std::string RESET_t =
"RESET";
73 static const std::string SET_t =
"SET";
74 static const std::string ADD_t =
"ADD";
75 static const std::string SUB_t =
"SUB";
76 static const std::string ROT_t =
"ROT";
86 inline bool apply(
JModule& module,
const std::string& action)
88 if (action == reset_t) {
94 for (JModule::iterator pmt = module.begin(); pmt != module.end(); ++pmt) {
99 }
else if (action == RESET_t) {
122 inline bool apply(
JModule& module,
const std::string& action,
const double value)
124 if (action == set_t) {
128 }
else if (action == setx_t) {
132 }
else if (action == sety_t) {
136 }
else if (action == setz_t) {
140 }
else if (action == add_t) {
144 }
else if (action == sub_t) {
148 }
else if (action == rot_t) {
158 }
else if (action == mul_t) {
166 }
else if (action == div_t) {
174 }
else if (action == SET_t) {
178 }
else if (action == ADD_t) {
182 }
else if (action == SUB_t) {
186 }
else if (action == ROT_t) {
190 }
else if (action == randadd_t) {
192 module.
add(gRandom->Gaus(0.0, value));
194 }
else if (action == randsub_t) {
196 module.
sub(gRandom->Gaus(0.0, value));
198 }
else if (action == randrot_t){
208 }
else if (action == randmul_t) {
216 }
else if (action == randdiv_t) {
224 }
else if (action == assign_t) {
226 module.
setID((
int) value);
228 }
else if (action == string_t) {
250 inline bool apply(
JModule& module,
const std::string& action,
const double first,
const double second)
252 if (action == tilt_t) {
254 const double Tx =
first;
255 const double Ty = second;
256 const double Tz = sqrt(1.0 - Tx*Tx - Ty*Ty);
258 const double x = Tx * module.
getZ() + module.
getX();
259 const double y = Ty * module.
getZ() + module.
getY();
260 const double z = Tz * module.
getZ();
264 }
else if (action == locate_t) {
268 }
else if (action == swap_t) {
270 std::swap(module[(
int) first], module[(
int) second]);
289 inline bool apply(
JModule& module,
const std::string& action,
const JVector3D& pos)
292 gRandom->Gaus(0.0, pos.
getY()),
293 gRandom->Gaus(0.0, pos.
getZ()));
297 else if (action == add_t)
299 else if (action == sub_t)
301 else if (action == randset_t)
303 else if (action == randadd_t)
305 else if (action == randsub_t)
326 else if (action == ADD_t)
328 else if (action == SUB_t)
345 inline bool apply(
JModule& module,
const std::string& action,
const std::string& value)
351 else if (action == reset_t)
358 catch(
const std::exception&) {
372 inline bool apply(
JPMT& pmt,
const std::string& action,
const std::string& value)
378 else if (action == reset_t)
385 catch(
const std::exception&) {
409 return (action !=
"" && !data.empty());
419 bool apply(
JModule& module)
const
421 switch (data.size()) {
424 return ::apply(module, action);
427 return ::apply(module, action, data[0]);
430 return ::apply(module, action, data[0], data[1]);
433 return ::apply(module, action,
JVector3D(data[0], data[1], data[2]));
436 return ::apply(module, action,
JQuaternion3D(data[0], data[1], data[2], data[3]));
451 friend inline std::istream&
operator>>(std::istream&
in, JModifier& modifier)
453 if (in >> modifier.action) {
455 modifier.data.clear();
457 for (
double x; in >>
x; ) {
458 modifier.data.push_back(x);
461 in.clear(std::ios_base::eofbit);
475 friend inline std::ostream&
operator<<(std::ostream& out,
const JModifier& modifier)
477 out << modifier.action;
502 inline const JModifier& getModifier(
const int id,
const JModifier& modifier)
508 const string::size_type pos = modifier.action.find(rand_t);
510 if (pos != string::npos) {
512 JModifier&
result = buffer[id][modifier.action][modifier.data.size()];
514 if (!result.is_valid()) {
516 result.action = modifier.action.substr(pos + rand_t.length());
518 for (
size_t i = 0; i != modifier.data.size(); ++i) {
519 result.data.push_back(gRandom->Gaus(0.0, modifier.data[i]));
535 struct JModuleModifier {
549 bool apply(
JModule& module)
const
551 return ::apply(module, action, value);
562 friend inline std::istream&
operator>>(std::istream& in, JModuleModifier& modifier)
564 return in >> modifier.action >> modifier.value;
575 friend inline std::ostream&
operator<<(std::ostream& out,
const JModuleModifier& modifier)
577 out << modifier.action;
579 out << modifier.value;
593 struct JPMTModifier {
607 bool apply(
JPMT& pmt)
const
609 return ::apply(pmt, action, value);
620 friend inline std::istream&
operator>>(std::istream& in, JPMTModifier& modifier)
622 return in >> modifier.action >> modifier.value;
633 friend inline std::ostream&
operator<<(std::ostream& out,
const JPMTModifier& modifier)
635 out << modifier.action;
637 out << modifier.value;
659 static const char SEPARATOR =
'-';
678 if (in >> range.
first) {
682 if (in.peek() == (int) JRange_t::SEPARATOR) {
707 return out << range.
first << JRange_t::SEPARATOR << range.
second;
719 inline void print(std::ostream& out,
const JModule& module,
const JModifier& modifier)
724 out <<
"Modifier" <<
' '
726 << setw(10) << module.
getID() <<
' '
727 <<
"action" <<
' ' << modifier.action <<
JEEPZ() << modifier.data << endl;
743 out <<
"module modifier" <<
' '
744 <<
"(" << setw(10) <<
id.getID() <<
")" <<
' '
745 <<
"action" <<
' ' << modifier.action <<
' '
746 <<
"value" <<
' ' << modifier.value << endl;
757 inline void print(std::ostream& out,
const JPMTIdentifier& pmt,
const JPMTModifier& modifier)
762 out <<
"PMT modifier" <<
' '
763 <<
"(" << setw(10) << pmt.
getID() <<
"," << setw(2) << pmt.
getPMTAddress() <<
")" <<
' '
764 <<
"action" <<
' ' << modifier.action <<
' '
765 <<
"value" <<
' ' << modifier.value << endl;
869 int main(
int argc,
char **argv)
883 JModuleModifier> > wip;
897 JParser<> zap(
"Auxiliary program to modify detector.");
912 zap[
'O'] =
make_field(option,
"sort modules") = 0, 1, 2;
917 catch(
const exception &error) {
918 FATAL(error.what() << endl);
934 if ((keep.empty() ? 0 : 1 +
935 rm .empty() ? 0 : 1 +
936 id .empty() ? 0 : 1) > 1) {
937 FATAL(
"Use either option -k, -r or -m." << endl);
943 if (
detector.setToLatestVersion()) {
944 NOTICE(
"Set detector version to " <<
detector.getVersion() << endl);
958 istringstream
is(*i);
969 for (JDetector::iterator module =
detector.begin(); module !=
detector.end(); ) {
971 bool __rm__ = !keep.empty() &&
rm.empty();
986 __rm__ = find(
id.begin(),
id.end(), module->
getID()) ==
id.end();
989 const auto range = del.equal_range(module->
getString());
991 for (
auto i = range.
first; i != range.
second; ++i) {
992 if (i->second == module->
getFloor()) {
1006 for (JDetector::iterator module =
detector.begin(); module !=
detector.end(); ++module) {
1008 if (module->
getID() == i->first || i->first == WILDCARD ){
1011 print(cout, *module, i->second);
1014 if (!i->second.apply(*module)) {
1015 ERROR(
"No valid action: " << i->first <<
' ' << i->second << endl);
1024 for (JDetector::iterator module =
detector.begin(); module !=
detector.end(); ++module) {
1026 if (module->
getString() == i->first || i->first == WILDCARD) {
1028 const JModifier modifier = getModifier(module->
getString(), i->second);
1031 print(cout, *module, i->second);
1034 if (!modifier.apply(*module)) {
1035 ERROR(
"No valid action: " << i->first <<
' ' << i->second << endl);
1044 for (JDetector::iterator module =
detector.begin(); module !=
detector.end(); ++module) {
1048 if (module->
getString() == i->first || i->first == WILDCARD) {
1050 const JModifier modifier = getModifier(module->
getString(), i->second);
1053 print(cout, *module, i->second);
1056 if (!modifier.apply(*module)) {
1057 ERROR(
"No valid action: " << i->first <<
' ' << i->second << endl);
1067 for (JDetector::iterator module =
detector.begin(); module !=
detector.end(); ++module) {
1069 if (module->
getID() == i->first || i->first == WILDCARD ){
1072 print(cout, *module, i->second);
1075 if (!i->second.apply(*module)) {
1076 ERROR(
"No valid action: " << i->first <<
' ' << i->second << endl);
1085 for (JDetector::iterator module =
detector.begin(); module !=
detector.end(); ++module) {
1087 if (module->
getID() == i->first.getModuleID() || i->first.getModuleID() == WILDCARD) {
1090 print(cout, i->first, i->second);
1093 if (i->first.getPMTAddress() == WILDCARD) {
1096 if (!i->second.apply(module->
getPMT(pmt))) {
1097 ERROR(
"No valid action: " << i->first <<
' ' << i->second << endl);
1101 }
else if (i->first.getPMTAddress() < 0 ||
1103 !i->second.apply(module->
getPMT(i->first.getPMTAddress()))) {
1104 ERROR(
"No valid action: " << i->first <<
' ' << i->second << endl);
1114 FATAL(
"Invalid detector identifier " <<
detector.getID() << endl);
1119 for (JDetector::iterator module =
detector.begin(); module !=
detector.end(); ++module) {
1128 print(cout,
id, i->second);
1131 if (!i->second.apply(module->
getPMT(
id.getPMTAddress()))) {
1132 ERROR(
"No valid action: " << i->first <<
' ' << i->second << endl);
Utility class to parse command line options.
static const JGetPMTStatusBit getPMTStatusBit
Function object to map key to PMT status bit.
Q(UTCMax_s-UTCMin_s)-livetime_s
int main(int argc, char *argv[])
JComparator< JResult_t T::*, JComparison::lt > make_comparator(JResult_t T::*member)
Helper method to create comparator between values of data member.
int getFloor() const
Get floor number.
Data structure for a composite optical module.
JQuaternion3D getConjugate() const
Get conjugate of this quaternion.
void setLocation(const JLocation &location)
Set location.
const JCalibration & getCalibration() const
Get calibration.
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.
Lookup table for PMT addresses in detector.
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
void reset(const int bit)
Reset PMT status.
Data structure for time calibration.
static const JGetModuleStatusBit getModuleStatusBit
Function object to map key to module status bit.
JRange_t()
Default constructor.
Data structure for detector geometry and calibration.
const JModuleAddressMap & get(const int id) const
Get module address map.
then echo The file $DIR KM3NeT_00000001_00000000 root already please rename or remove it first
const JQuaternion3D & getQuaternion() const
Get quaternion.
JModule & sub(const JVector3D &pos)
Subtract position.
Lookup table for PMT addresses in optical module.
Type definition of range.
I/O formatting auxiliaries.
Data structure for vector in three dimensions.
void setQuaternion(const JQuaternion3D &quaternion)
Set quaternion.
Logical location of module.
const JLocation & getLocation() const
Get location.
void set(const int bit)
Set PMT status.
#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.
Auxiliary class for handling status.
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, calibration and status.
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 address (= 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.
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.
Data structure for unit quaternion in three dimensions.
Direct access to module in detector data structure.
z range($ZMAX-$ZMIN)< $MINIMAL_DZ." fi fi typeset -Z 4 STRING typeset -Z 2 FLOOR JPlot1D -f $
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.
const JStatus & getStatus() const
Get status.
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.
Auxiliary class for object identification.
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 position in three dimensions.
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.