38 static const int WILDCARD = -1;
40 static const char EOL =
';';
42 static const std::string reset_t =
"reset";
43 static const std::string set_t =
"set";
44 static const std::string add_t =
"add";
45 static const std::string sub_t =
"sub";
46 static const std::string rot_t =
"rot";
47 static const std::string mul_t =
"mul";
48 static const std::string via_t =
"via";
49 static const std::string assign_t =
"assign";
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;
57 static const std::string randvia_t = rand_t + via_t;
59 static const std::string RESET_t =
"RESET";
60 static const std::string SET_t =
"SET";
61 static const std::string ADD_t =
"ADD";
62 static const std::string SUB_t =
"SUB";
86 return (action !=
"" && !data.empty());
96 bool apply(
JModule& module)
const
98 switch (data.size()) {
101 return apply(module, action);
104 return apply(module, action, data[0]);
107 return apply(module, action,
JVector3D(data[0], data[1], 0.0));
110 return apply(module, action,
JVector3D(data[0], data[1], data[2]));
113 return apply(module, action,
JQuaternion3D(data[0], data[1], data[2], data[3]));
128 friend inline std::istream&
operator>>(std::istream&
in, JModifier& modifier)
132 if (in >> modifier.id >> modifier.action) {
134 modifier.data.clear();
136 for (
double x; in >> x; ) {
137 modifier.data.push_back(x);
140 in.clear(ios_base::eofbit);
154 friend inline std::ostream&
operator<<(std::ostream& out,
const JModifier& modifier)
158 out << modifier.action;
181 static bool apply(
JModule& module,
const std::string& action)
183 if (action == reset_t) {
187 for (JModule::iterator pmt = module.begin(); pmt != module.end(); ++pmt) {
194 }
else if (action == RESET_t) {
201 }
else if (action == SET_t) {
225 static bool apply(
JModule& module,
const std::string& action,
const double value)
227 if (action == set_t) {
231 }
else if (action == add_t) {
235 }
else if (action == sub_t) {
239 }
else if (action == rot_t) {
249 }
else if (action == mul_t) {
260 }
else if (action == via_t) {
264 }
else if (action == SET_t) {
268 }
else if (action == ADD_t) {
272 }
else if (action == SUB_t) {
276 }
else if (action == randadd_t) {
278 module.
add(gRandom->Gaus(0.0, value));
280 }
else if (action == randsub_t) {
282 module.
sub(gRandom->Gaus(0.0, value));
284 }
else if (action == randrot_t){
294 }
else if (action == randmul_t) {
305 }
else if (action == randvia_t) {
307 module.
add(gRandom->Gaus(0.0, value) * module.
getFloor());
309 }
else if (action == assign_t) {
311 module.
setID((
int) value);
330 static bool apply(
JModule& module,
const std::string& action,
const JVector3D& pos)
333 gRandom->Gaus(0.0, pos.
getY()),
334 gRandom->Gaus(0.0, pos.
getZ()));
338 else if (action == add_t)
340 else if (action == sub_t)
342 else if (action == randset_t)
344 else if (action == randadd_t)
346 else if (action == randsub_t)
367 else if (action == ADD_t)
369 else if (action == SUB_t)
386 inline const JModifier& getModifier(
const int id,
const JModifier& modifier)
392 const string::size_type pos = modifier.action.find(rand_t);
394 if (pos != string::npos) {
396 JModifier&
result = buffer[id][modifier.action][modifier.data.size()];
398 if (!result.is_valid()) {
401 result.action = modifier.action.substr(pos + rand_t.length());
403 for (
size_t i = 0; i != modifier.data.size(); ++i) {
404 result.data.push_back(gRandom->Gaus(0.0, modifier.data[i]));
420 template<
class JAddress_t>
438 bool apply(
JPMT& pmt)
const
442 if (action == set_t) {
446 }
else if (action == reset_t) {
457 catch(
const std::exception&) {}
470 friend inline std::istream&
operator>>(std::istream& in, JPMTModifier& modifier)
472 return in >>
static_cast<JAddress_t&
>(modifier) >> modifier.action >> modifier.value;
483 friend inline std::ostream&
operator<<(std::ostream& out,
const JPMTModifier& modifier)
485 out << static_cast<const JAddress_t&>(modifier);
487 out << modifier.action;
489 out << modifier.value;
508 static const char SEPARATOR =
'-';
525 friend inline std::istream&
operator>>(std::istream& in, JRange_t&
range)
527 if (in >> range.first) {
529 range.second = range.first;
531 if (in.peek() == (int) JRange_t::SEPARATOR) {
554 friend inline std::ostream&
operator<<(std::ostream& out,
const JRange_t& range)
556 return out << range.first << JRange_t::SEPARATOR << range.second;
651 int main(
int argc,
char **argv)
673 JParser<> zap(
"Auxiliary program to modify detector.");
690 catch(
const exception &error) {
691 FATAL(error.what() << endl);
707 if ((keep.empty() ? 0 : 1 +
708 rm .empty() ? 0 : 1 +
709 id .empty() ? 0 : 1) > 1) {
710 FATAL(
"Use either option -k, -r or -m." << endl);
716 if (
detector.setToLatestVersion()) {
717 NOTICE(
"Set detector version to " <<
detector.getVersion() << endl);
726 istringstream
is(*i);
733 for (JDetector::iterator module =
detector.begin(); module !=
detector.end(); ) {
735 bool __rm__ = !keep.empty() && rm.empty();
750 __rm__ = find(
id.begin(),
id.end(), module->
getID()) ==
id.end();
753 const auto range = del.equal_range(module->
getString());
755 for (
auto i = range.first; i != range.second; ++i) {
756 if (i->second == module->
getFloor()) {
770 for (JDetector::iterator module =
detector.begin(); module !=
detector.end(); ++module) {
772 if (module->
getID() == i->id || i->id == WILDCARD ){
774 DEBUG(
"Modifier" <<
' '
776 << setw(10) << module->
getID() <<
' '
777 <<
"action" <<
' ' << i->action <<
JEEPZ() << i->data << endl);
779 if (!i->apply(*module)) {
780 ERROR(
"No valid action: " << *i << endl);
789 for (JDetector::iterator module =
detector.begin(); module !=
detector.end(); ++module) {
791 if (module->
getString() == i->id || i->id == WILDCARD) {
793 const JModifier& modifier = getModifier(module->
getString(), *i);
795 DEBUG(
"Modifier" <<
' '
797 << setw(10) << module->
getID() <<
' '
798 <<
"action" <<
' ' << modifier.action <<
JEEPZ() << modifier.data << endl);
800 if (!modifier.apply(*module)) {
801 ERROR(
"No valid action: " << *i << endl);
808 for (
vector< JPMTModifier<JPMTIdentifier> >::const_iterator i = pmt.begin(); i != pmt.end(); ++i) {
810 for (JDetector::iterator module =
detector.begin(); module !=
detector.end(); ++module) {
812 if (module->
getID() == i->getModuleID() || i->getModuleID() == WILDCARD) {
814 DEBUG(
"PMT modifier" <<
' '
815 <<
"(" << setw(10) << module->
getID() <<
"," << setw(2) << i->getPMTAddress() <<
")" <<
' '
816 <<
"action" <<
' ' << i->action <<
' '
817 <<
"value" <<
' ' << i->value << endl);
819 if (i->getPMTAddress() == WILDCARD) {
822 if (!i->apply(module->
getPMT(pmt))) {
823 ERROR(
"No valid action: " << *i << endl);
827 }
else if (i->getPMTAddress() < 0 ||
829 !i->apply(module->
getPMT(i->getPMTAddress()))) {
830 ERROR(
"No valid action: " << *i << endl);
839 FATAL(
"Invalid detector identifier " <<
detector.getID() << endl);
844 for (JDetector::iterator module =
detector.begin(); module !=
detector.end(); ++module) {
848 for (
vector< JPMTModifier<JPMTPhysicalAddress> >::const_iterator i = alt.begin(); i != alt.end(); ++i) {
852 DEBUG(
"PMT modifier" <<
' '
853 <<
"(" << setw(10) << module->
getID() <<
"," << setw(2) << tdc <<
")" <<
' '
854 <<
"action" <<
' ' << i->action <<
' '
855 <<
"value" <<
' ' << i->value << endl);
857 if (!i->apply(module->
getPMT(tdc))) {
858 ERROR(
"No valid action: " << *i << 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 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.
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.
#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.
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.
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.
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 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.
#define DEBUG(A)
Message macros.
double getT0() const
Get time offset.
int main(int argc, char *argv[])