1 #ifndef __JDETECTOR__JMONTECARLODETECTOR__
2 #define __JDETECTOR__JMONTECARLODETECTOR__
22 namespace JDETECTOR {}
23 namespace JPP {
using namespace JDETECTOR; }
91 iterator p = this->begin();
93 for ( ; n != 0; --
n, ++p)
203 iterator p = this->begin();
205 for ( ; n != 0; --
n, ++p)
240 const int __pmt_id) :
296 for (
string key, buffer; in >>
key; ) {
300 OMaddress.push_back(
OM(in));
302 else if (key ==
"OM_cluster:")
306 else if (key ==
"OM_position:")
310 else if (key ==
"string:")
312 DetectorString.push_back(
String(in));
314 else if (key ==
"OM_cluster_data:")
318 else if (key ==
"LCM_logic:")
334 const int lcm_id =
i->getID();
336 for (LCM_logic::const_iterator
j =
i->begin();
j !=
i->end(); ++
j) {
339 const int pmt_id =
distance(
i->begin(),
j) + 1;
348 sort(OMaddress .begin(), OMaddress .end());
349 sort(OMcluster .begin(), OMcluster .end());
350 sort(OMposition .begin(), OMposition .end());
351 sort(DetectorString .begin(), DetectorString .end());
352 sort(LCMreverselogic.begin(), LCMreverselogic.end());
363 for (OMclusterIterator = OMcluster.begin();
364 OMclusterIterator != OMcluster.end();
365 OMclusterIterator++) {
367 StringIterator =
find(DetectorString.begin(),
368 DetectorString.end(),
369 OMclusterIterator->string_id);
371 if (StringIterator != DetectorString.end()) {
373 const JLocation location(StringIterator->getID(), -1);
375 for (addressIterator = OMclusterIterator->begin();
376 addressIterator != OMclusterIterator->end();
379 OMIterator =
find(OMaddress.begin(),
383 if (OMIterator != OMaddress.end()) {
385 OMpositionIterator =
find(OMposition.begin(),
387 OMIterator->address);
389 if (OMpositionIterator != OMposition.end()) {
393 double ct = cos(StringIterator->twist *
PI / 180.0);
394 double st =
sin(StringIterator->twist *
PI / 180.0);
396 double x = ct * OMpositionIterator->x - st * OMpositionIterator->y;
397 double y = st * OMpositionIterator->x + ct * OMpositionIterator->y;
400 StringIterator->y + y,
401 StringIterator->z + OMpositionIterator->z + OMclusterIterator->z);
404 StringIterator->twist *
PI / 180.0 + OMpositionIterator->phi));
406 int lcm_id = OMclusterIterator->getID();
407 int pmt_id = OMIterator->address;
412 LCMreverselogic.end(),
413 OMIterator->getID());
415 if (p != LCMreverselogic.end()) {
421 detector.
put(lcm_id, pmt_id - 1, location,
JPMT(OMIterator->getID(),
JAxis3D(pos, dir)));
431 for (OMclusterdataIterator = OMclusterdata.begin();
432 OMclusterdataIterator != OMclusterdata.end();
433 OMclusterdataIterator++) {
436 OMclusterdataIterator->y,
437 OMclusterdataIterator->z);
440 OMclusterdataIterator->phi,
441 OMclusterdataIterator->psi));
443 OMclusterIterator =
find(OMcluster.begin(),
445 OMclusterdataIterator->getID());
447 if (OMclusterIterator != OMcluster.end()) {
449 const JLocation location(OMclusterIterator->string_id, -1);
451 for (addressIterator = OMclusterIterator->begin();
452 addressIterator != OMclusterIterator->end();
455 OMIterator =
find(OMaddress.begin(),
459 if (OMIterator != OMaddress.end()) {
461 OMpositionIterator =
find(OMposition.begin(),
463 OMIterator->address);
465 if (OMpositionIterator != OMposition.end()) {
468 OMpositionIterator->y,
469 OMpositionIterator->z);
472 OMpositionIterator->phi));
479 int lcm_id = OMclusterIterator->getID();
480 int pmt_id = OMIterator->address;
485 LCMreverselogic.end(),
486 OMIterator->getID());
488 if (p != LCMreverselogic.end()) {
494 detector.
put(lcm_id, pmt_id - 1, location,
JPMT(OMIterator->getID(),
JAxis3D(pos, dir)));
508 for (JDetector::iterator module = detector.begin(); module != detector.end(); ++module) {
510 if (module->getString() != string) {
511 string = module->getString();
515 module->setLocation(
JLocation(
string,++floor));
544 const int pmtAddress,
548 JDetector::iterator p = std::lower_bound(this->begin(), this->end(), moduleID);
550 if (p == this->end() || p->getID() != moduleID) {
552 JModule module(moduleID, location);
554 module.resize(pmtAddress + 1);
556 module[pmtAddress] = pmt;
560 this->insert(p, module);
568 for (JModule::const_iterator
i = p->begin();
i != p->end(); ++
i) {
574 if (pmtAddress + 1 > (
int) p->size()) {
575 p->resize(pmtAddress + 1);
583 P.
sub(p->at(pmtAddress).getPosition());
590 p->at(pmtAddress) = pmt;
606 static T find(
T __begin,
T __end,
const int id)
608 T i = std::lower_bound(__begin, __end,
id);
610 if (i != __end && *i !=
id)
630 return first.
getZ() < second.
getZ();
Data structure for angles in three dimensions.
Data structure for Euler angles in three dimensions.
String(std::istream &in)
Constructor.
JVector3D & mul(const double factor)
Scale vector.
OM_cluster(std::istream &in)
Constructor.
Data structure for direction in three dimensions.
Data structure for a composite optical module.
int lcm_id
LCM identifier.
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
double twistRate
twist rate
static const int LED_BEACON_PMT_TYPE
PMT type of LED beacon.
JMonteCarloDetector()
Default constructor.
static bool compare(const JModule &first, const JModule &second)
Module comparator.
LCM_logic(std::istream &in)
Constructor.
void setUseLogic(const bool useLogic)
Set usage of logic.
int serialNumber
PMT serial number.
JDirection3D & transform(const JMatrix3D &T)
Transform.
Data structure for detector geometry and calibration.
void transform(const JRotation3D &R, const JVector3D &pos)
Transform position.
OM_position(std::istream &in)
Constructor.
Monte Carlo detector (i.e. ".det" file).
OM(std::istream &in)
Constructor.
int pmt_id
PMT identifier.
double tOffset
time offset
double theta
zenit angle of orientation
JVector3D & sub(const JVector3D &vector)
Subtract vector.
JDetector & put(const int moduleID, const int pmtAddress, const JLocation &location, const JPMT &pmt)
Set PMT.
Logical location of module.
LCM_reverse_logic()
Default constructor.
static T find(T __begin, T __end, const int id)
Binary search method.
do set_variable OUTPUT_DIRECTORY $WORKDIR T
int getID() const
Get identifier.
JMonteCarloDetector(const bool useLogic)
Constructor.
Data structure for PMT geometry, calibration and status.
std::istream & getline(std::istream &in, JString &object)
Read string from input stream until end of line.
Auxiliary class for string parameters.
static const double PI
Mathematical constants.
Auxiliary class for LCM logic parameters.
int string_id
string identifier
const JPosition3D & getPosition() const
Get position.
Auxiliary class for OM cluster data.
Auxiliary class for OM position.
Auxiliary class for LCM logic parameters.
then JCookie sh JDataQuality D $DETECTOR_ID R
int getString() const
Get string number.
friend std::istream & operator>>(std::istream &in, JMonteCarloDetector &detector)
Read detector from input.
then fatal The output file must have the wildcard in the e g root fi 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
Auxiliary class for object identification.
int string_id
string identifier
OM_cluster_data(std::istream &in)
Constructor.
const JObjectID & getUndefinedObjectID()
Get undefined object identifier.
Auxiliary class for OM cluster parameters.
Data structure for position in three dimensions.
double phi
azimuth angle of orientation
LCM_reverse_logic(const int __id, const int __lcm_id, const int __pmt_id)
Constructor.
JVector3D & div(const double factor)
Scale vector.
int lcm_id
LCM identifier.
do set_variable DETECTOR_TXT $WORKDIR detector
double getZ() const
Get z position.
JVector3D & add(const JVector3D &vector)
Add vector.
void setPosition(const JVector3D &pos)
Set position.