73 static const std::string randset_t = rand_t + set_t;
74 static const std::string randadd_t = rand_t + add_t;
75 static const std::string randsub_t = rand_t + sub_t;
76 static const std::string randrot_t = rand_t + rot_t;
77 static const std::string randmul_t = rand_t + mul_t;
78 static const std::string randdiv_t = rand_t + div_t;
79 static const std::string randtilt_t = rand_t + tilt_t;
97 if (action == reset_t) {
106 for (JModule::iterator pmt = module.begin(); pmt != module.end(); ++pmt) {
111 }
else if (action == RESET_t) {
136 if (action == set_t) {
140 }
else if (action == setx_t) {
144 }
else if (action == addx_t) {
148 }
else if (action == subx_t) {
152 }
else if (action == sety_t) {
156 }
else if (action == addy_t) {
160 }
else if (action == suby_t) {
164 }
else if (action == setz_t) {
168 }
else if (action == addz_t) {
172 }
else if (action == subz_t) {
176 }
else if (action == add_t) {
180 }
else if (action == sub_t) {
184 }
else if (action == rot_t) {
194 }
else if (action == lower_t ||
203 for (JModule::iterator pmt = module.begin(); pmt != module.end(); ++pmt) {
204 if ((action == upper_t && pmt->getDZ() > 0.0) ||
205 (action == lower_t && pmt->getDZ() < 0.0)) {
212 }
else if (action == mul_t) {
227 }
else if (action == div_t) {
242 }
else if (action == SET_t) {
246 }
else if (action == ADD_t) {
250 }
else if (action == SUB_t) {
254 }
else if (action == ROT_t) {
258 }
else if (action == randadd_t) {
260 module.
add(gRandom->Gaus(0.0, value));
262 }
else if (action == randsub_t) {
264 module.
sub(gRandom->Gaus(0.0, value));
266 }
else if (action == randrot_t){
276 }
else if (action == randmul_t) {
284 }
else if (action == randdiv_t) {
292 }
else if (action == assign_t) {
294 module.
setID((
int) value);
320 if (action == tilt_t) {
322 const double Tx =
first;
323 const double Ty = second;
324 const double Tz = sqrt(1.0 - Tx*Tx - Ty*Ty);
326 const double x = Tx * module.
getZ() + module.
getX();
327 const double y = Ty * module.
getZ() + module.
getY();
328 const double z = Tz * module.
getZ();
332 }
else if (action == locate_t) {
336 }
else if (action == swap_t) {
338 std::swap(module[(
int) first], module[(
int) second]);
360 gRandom->Gaus(0.0, pos.
getY()),
361 gRandom->Gaus(0.0, pos.
getZ()));
365 else if (action == add_t)
367 else if (action == sub_t)
369 else if (action == randset_t)
371 else if (action == randadd_t)
373 else if (action == randsub_t)
394 else if (action == ADD_t)
396 else if (action == SUB_t)
421 else if (action == reset_t)
428 catch(
const std::exception&) {
448 else if (action == reset_t)
455 catch(
const std::exception&) {
479 return (action !=
"" && !
data.empty());
489 bool apply(
JModule& module)
const
491 switch (
data.size()) {
494 return ::apply(module, action);
497 return ::apply(module, action,
data[0]);
500 return ::apply(module, action,
data[0],
data[1]);
521 friend inline std::istream&
operator>>(std::istream&
in, JModifier& modifier)
523 if (in >> modifier.action) {
525 modifier.data.clear();
527 for (
double x; in >>
x; ) {
528 modifier.data.push_back(x);
531 in.clear(std::ios_base::eofbit);
545 friend inline std::ostream&
operator<<(std::ostream& out,
const JModifier& modifier)
547 out << modifier.action;
572 inline const JModifier& getModifier(
const int id,
const JModifier& modifier)
578 const string::size_type pos = modifier.action.find(rand_t);
580 if (pos != string::npos) {
582 JModifier&
result = buffer[id][modifier.action][modifier.data.size()];
584 if (!result.is_valid()) {
586 result.action = modifier.action.substr(pos + rand_t.length());
588 for (
size_t i = 0;
i != modifier.data.size(); ++
i) {
589 result.data.push_back(gRandom->Gaus(0.0, modifier.data[
i]));
605 struct JModuleModifier {
619 bool apply(
JModule& module)
const
621 return ::apply(module, action, value);
632 friend inline std::istream&
operator>>(std::istream& in, JModuleModifier& modifier)
634 return in >> modifier.action >> modifier.value;
645 friend inline std::ostream&
operator<<(std::ostream& out,
const JModuleModifier& modifier)
647 out << modifier.action;
649 out << modifier.value;
663 struct JPMTModifier {
677 bool apply(
JPMT& pmt)
const
679 return ::apply(pmt, action, value);
690 friend inline std::istream&
operator>>(std::istream& in, JPMTModifier& modifier)
692 return in >> modifier.action >> modifier.value;
703 friend inline std::ostream&
operator<<(std::ostream& out,
const JPMTModifier& modifier)
705 out << modifier.action;
707 out << modifier.value;
729 static const char SEPARATOR =
'-';
748 if (in >> range.
first) {
752 if (in.peek() == (int) JRange_t::SEPARATOR) {
777 return out << range.
first << JRange_t::SEPARATOR << range.
second;
789 inline void print(std::ostream& out,
const JModule& module,
const JModifier& modifier)
794 out <<
"Modifier" <<
' '
796 << setw(10) << module.
getID() <<
' '
797 <<
"action " << modifier << endl;
813 out <<
"module modifier" <<
' '
814 <<
"(" << setw(10) <<
id.getID() <<
")" <<
' '
815 <<
"action" <<
' ' << modifier.action <<
' '
816 <<
"value" <<
' ' << modifier.value << endl;
827 inline void print(std::ostream& out,
const JPMTIdentifier& pmt,
const JPMTModifier& modifier)
832 out <<
"PMT modifier" <<
' '
833 <<
"(" << setw(10) << pmt.
getID() <<
"," << setw(2) << pmt.
getPMTAddress() <<
")" <<
' '
834 <<
"action" <<
' ' << modifier.action <<
' '
835 <<
"value" <<
' ' << modifier.value << endl;
945 int main(
int argc,
char **argv)
959 JModuleModifier> > wip;
976 JParser<> zap(
"Auxiliary program to modify detector.");
992 zap[
'O'] =
make_field(option,
"sort modules: "\
993 "0 -> no sort; 1 -> module identifier; 2 -> module location") = 0, 1, 2;
994 zap[
'q'] =
make_field(squash,
"squash meta data");
999 catch(
const exception &error) {
1000 FATAL(error.what() << endl);
1003 gRandom->SetSeed(0);
1005 const int ns = ((keep.empty() ? 0 : 1) +
1006 (
rm .empty() ? 0 : 1) +
1007 (
id .empty() ? 0 : 1) +
1008 (del .empty() ? 0 : 1));
1011 FATAL(
"Use either option -k, -r, -m or -D." << endl);
1029 if (
detector.setToLatestVersion()) {
1030 NOTICE(
"Set detector version to " <<
detector.getVersion() << endl);
1044 istringstream
is(*
i);
1057 for (JDetector::iterator module =
detector.begin(); module !=
detector.end(); ) {
1059 bool __rm__ = !keep.empty() &&
rm.empty();
1074 __rm__ = find(
id.begin(),
id.end(), module->
getID()) ==
id.end();
1077 const auto range = del.equal_range(module->
getString());
1095 for (JDetector::iterator module =
detector.begin(); module !=
detector.end(); ++module) {
1100 print(cout, *module,
i->second);
1103 if (!
i->second.apply(*module)) {
1104 ERROR(
"No valid action: " <<
i->first <<
' ' <<
i->second << endl);
1113 for (JDetector::iterator module =
detector.begin(); module !=
detector.end(); ++module) {
1117 const JModifier modifier = getModifier(module->
getString(),
i->second);
1120 print(cout, *module,
i->second);
1123 if (!modifier.apply(*module)) {
1124 ERROR(
"No valid action: " <<
i->first <<
' ' <<
i->second << endl);
1133 for (JDetector::iterator module =
detector.begin(); module !=
detector.end(); ++module) {
1139 const JModifier modifier = getModifier(module->
getString(),
i->second);
1142 print(cout, *module,
i->second);
1145 if (!modifier.apply(*module)) {
1146 ERROR(
"No valid action: " <<
i->first <<
' ' <<
i->second << endl);
1156 for (JDetector::iterator module =
detector.begin(); module !=
detector.end(); ++module) {
1161 print(cout, *module,
i->second);
1164 if (!
i->second.apply(*module)) {
1165 ERROR(
"No valid action: " <<
i->first <<
' ' <<
i->second << endl);
1174 for (JDetector::iterator module =
detector.begin(); module !=
detector.end(); ++module) {
1176 if (module->
getID() ==
i->first.getModuleID() ||
i->first.getModuleID() ==
WILDCARD) {
1179 print(cout,
i->first,
i->second);
1182 if (
i->first.getPMTAddress() ==
WILDCARD) {
1185 if (!
i->second.apply(module->
getPMT(pmt))) {
1186 ERROR(
"No valid action: " <<
i->first <<
' ' <<
i->second << endl);
1190 }
else if (
i->first.getPMTAddress() >= 0 &&
1192 !
i->second.apply(module->
getPMT(
i->first.getPMTAddress()))) {
1193 ERROR(
"No valid action: " <<
i->first <<
' ' <<
i->second << endl);
1200 if (!alt.empty() || !ring.empty()) {
1203 FATAL(
"Invalid detector identifier " <<
detector.getID() << endl);
1208 for (JDetector::iterator module =
detector.begin(); module !=
detector.end(); ++module) {
1217 print(cout,
id,
i->second);
1220 if (!
i->second.apply(module->
getPMT(
id.getPMTAddress()))) {
1221 ERROR(
"No valid action: " <<
i->first <<
' ' <<
i->second << endl);
1225 const auto range = ring.equal_range(module->
getID());
1231 modifier.
ring = (char) toupper(modifier.
ring);
1233 if (modifier.
ring !=
'A') {
1237 for (
size_t i = 0;
i != module->size(); ++
i) {
1241 if (address.
ring == modifier.
ring) {
1242 buffer[address] = (*module)[
i];
1246 for (
size_t i = 0;
i != module->size(); ++
i) {
1250 if (address.
ring == modifier.
ring) {
1254 while (position > 6) { position -= 6; }
1255 while (position < 1) { position += 6; }
1259 DEBUG(
"Module " << setw(10) << module->
getID() <<
' ' << address <<
" <= " << source << endl);
1261 (*module)[
i] = buffer[source];
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.
std::string getLabel(const JLocation &location)
Get module label for monitoring and other applications.
bool is_valid(const json &js)
Check validity of JSon data.
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)...
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.
static const char WILDCARD
JModule & sub(const JVector3D &pos)
Subtract position.
Lookup table for PMT addresses in optical module.
int getStatus() const
Get status.
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.
#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.
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).
char ring
ring number ['A','F']
double getY() const
Get y position.
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.
void setStatus(const JStatus &status)
Set status.
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 $
then JCookie sh JDataQuality D $DETECTOR_ID R
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.
Auxiliary class for object identification.
Wrapper class around string.
void setCalibration(const JCalibration &cal)
Set calibration.
int position
position within ring [1,6]
void setID(const int id)
Set identifier.
double getX() const
Get x position.
Base class for data structures with artithmetic capabilities.
const JPMTPhysicalAddress & getPMTPhysicalAddress(const int tdc) const
Get PMT physical address.
void addT0(const double t0)
Add time offset.
Data structure for position in three dimensions.
Data structure for PMT physical address.
JQuaternion3D & normalise()
Normalise quaternion.
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 JAcoustics sh $DETECTOR_ID source JAcousticsToolkit sh CHECK_EXIT_CODE typeset A EMITTERS get_tripods $WORKDIR tripod txt EMITTERS get_transmitters $WORKDIR transmitter txt EMITTERS 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.
static const std::string string_t
string