1 #ifndef __JDETECTOR__JDETECTORTOOLKIT__ 
    2 #define __JDETECTOR__JDETECTORTOOLKIT__ 
   41 namespace JDETECTOR {}
 
   42 namespace JPP { 
using namespace JDETECTOR; }
 
   64   static const char* 
const GDML_SCHEMA                   = getenv(
"GDML_SCHEMA_DIR");  
 
   83     for (JDetector::const_iterator i1 = detector.begin(); i1 != detector.end(); ++i1) {
 
   84       for (JDetector::const_iterator i2 = detector.begin(); i2 != i1; ++i2) {
 
   86         if (option || (i1->getFloor() != 0 && i2->getFloor() != 0)) {
 
   88           const double ds = 
getDistance(i1->getPosition(), i2->getPosition());
 
  146     if (!module.empty()) {
 
  150       for (JModule::const_iterator pmt = module.begin(); pmt != module.end(); ++pmt) {
 
  175     return module.size();
 
  187     int number_of_pmts = 0;
 
  189     for (JDetector::const_iterator module = detector.begin(); module != detector.end(); ++module) {
 
  193     return number_of_pmts;
 
  207     for (JDetector::const_iterator module = detector.begin(); module != detector.end(); ++module) {
 
  208       buffer.insert(module->getString());
 
  225     for (JDetector::const_iterator module = detector.begin(); module != detector.end(); ++module) {
 
  226       buffer.insert(module->getFloor());
 
  229     return buffer.size();
 
  249     for (JDetector::const_iterator module = detector.begin(); module != detector.end(); ++module) {
 
  250       buffer.
include(module->getFloor());
 
  267     for (JDetector::const_iterator module = detector.begin(); module != detector.end(); ++module) {
 
  268       buffer.insert(module->getID());
 
  271     return buffer.size();
 
  285     const double phi = atan2(dir.
getDY(), dir.
getDZ())*(180.0/
PI);
 
  306     return asin(-dir.
getDX())*(180.0/
PI);
 
  327     const double DEFAULT_CAN_MARGIN_M   = 350.0;  
 
  328     const double DEFAULT_WORLD_MARGIN_M =  50.0;  
 
  330     const JCylinder3D cylinder(detector.begin(), detector.end());
 
  337       cerr << 
"CAN_MARGIN_M not defined! Setting standard CAN_MARGIN_M " << DEFAULT_CAN_MARGIN_M << 
" m." << endl;
 
  338       can_margin = DEFAULT_CAN_MARGIN_M; 
 
  341     const double WorldCylinderHeight = 2*(cylinder.getZmax() - cylinder.getZmin() + can_margin + DEFAULT_WORLD_MARGIN_M);
 
  342     const double WorldRadius         = cylinder.getLength() + cylinder.getRadius() + can_margin + DEFAULT_WORLD_MARGIN_M;
 
  344     const double Crust_Z_size     =  WorldCylinderHeight/2;
 
  345     const double Crust_Z_position = -WorldCylinderHeight/4;                     
 
  347     out << 
"<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<gdml xmlns:gdml=\"http://cern.ch/2001/Schemas/GDML\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"";
 
  349       cerr << 
"GDML_SCHEMA_DIR NOT DEFINED! Setting default path." << endl;
 
  356     out << 
"<rotation name=\"identity\"/>\n<position name=\"zero\"/>\n";
 
  360     for (JDetector::const_iterator module = detector.begin(); module != detector.end(); ++module) {
 
  362     if(module->empty()) 
continue;
 
  364         const JVector3D center = module->getCenter();
 
  366         out << 
"<position name=\"PosString" << module->getString() << 
"_Dom" << module->getID() << 
"\" unit=\"m\" x=\"" << module->
getX() << 
"\" y=\"" << module->getY() << 
"\" z=\"" << module->getZ() << 
"\"/>\n";
 
  368         for (JModule::const_iterator pmt = module->begin(); pmt != module->end(); ++pmt) {
 
  371           out << 
"<position name=\"CathodPosition" << pmt->getID() << 
"_" << module->getID() << 
"\" unit=\"m\" x=\"" << vec.
getX() << 
"\" y=\"" << vec.
getY() << 
"\" z=\"" << vec.
getZ() << 
"\"/>\n";
 
  372           out << 
"<rotation name=\"CathodRotation" << pmt->getID() << 
"_" << module->getID() << 
"\" unit=\"deg\" x=\"" << 
GetXrotationG4(*pmt) << 
"\" y=\"" << 
GetYrotationG4(*pmt) << 
"\" z=\"0.000000\"/>\n";
 
  373           out << 
"<constant name=\"CathodID_" << PMTs_NO << 
"\" value=\"" << pmt->getID() << 
"\"/>\n";
 
  379     out << 
"<position name=\"OMShift\" unit=\"m\" x=\"0\" y=\"0\" z=\"0.0392\"/>\n";
 
  381     out << 
"<!-- end of DU position definitions -->\n<position name=\"CrustPosition\"   unit=\"m\" x=\"0\" y=\"0\" z=\"" << Crust_Z_position << 
"\"/>\n";
 
  383     out << 
"</define>\n";
 
  384     out << 
"<materials>\n";
 
  385     out << 
"</materials>\n";
 
  387     out << 
"    <box name=\"CrustBox\" lunit=\"m\" x=\"2200\" y=\"2200\" z=\"" << Crust_Z_size << 
"\"/>\n";
 
  388     out << 
"    <box name=\"StoreyBox\" lunit=\"m\" x=\"0.6\" y=\"0.6\" z=\"0.6\"/>\n";
 
  389     out << 
"    <sphere name=\"OMSphere\" lunit=\"cm\" aunit=\"deg\" rmin=\"0.0\" rmax=\"21.6\" startphi=\"0.0\" deltaphi=\"360.0\" starttheta=\"0.0\" deltatheta=\"180.0\"/>\n";
 
  390     out << 
"    <tube name=\"CathodTube\" lunit=\"cm\" aunit=\"deg\" rmin=\"0.0\" rmax=\"4.7462\" z=\"0.5\" startphi=\"0.0\" deltaphi=\"360.0\"/>\n";
 
  391     out << 
"    <tube name=\"WorldTube\" lunit=\"m\" aunit=\"deg\" rmin=\"0.0\" rmax=\"" << WorldRadius << 
"\" z=\"" << WorldCylinderHeight << 
"\" startphi=\"0.0\" deltaphi=\"360.0\"/>\n";    
 
  392     out << 
"</solids>\n\n\n";
 
  394     out << 
"<structure>\n";
 
  395     out << 
"    <volume name=\"CathodVolume\">\n";
 
  396     out << 
"            <materialref ref=\"Cathod\"/>\n";
 
  397     out << 
"            <solidref ref=\"CathodTube\"/>\n";
 
  398     out << 
"    </volume>\n";
 
  400     out << 
"<!-- OMVolume(s) construction -->\n";
 
  402     for (JDetector::const_iterator module = detector.begin(); module != detector.end(); ++module) {
 
  404           if(module->empty()) 
continue;
 
  405       out << 
"  <volume name=\"OMVolume" << module->getID() << 
"\">\n";
 
  406       out << 
"          <materialref ref=\"Water\"/>\n";
 
  407       out << 
"          <solidref ref=\"OMSphere\"/>\n";
 
  409       for (JModule::const_iterator pmt = module->begin(); pmt != module->end(); ++pmt) {
 
  410         out << 
"                <physvol>\n";
 
  411         out << 
"                        <volumeref ref=\"CathodVolume\"/>\n";
 
  412         out << 
"                        <positionref ref=\"CathodPosition" << pmt->getID() << 
"_" << module->getID() << 
"\"/>\n";
 
  413         out << 
"                        <rotationref ref=\"CathodRotation" << pmt->getID() << 
"_" << module->getID() << 
"\"/>\n";
 
  414         out << 
"                </physvol>\n";
 
  417       out << 
"  </volume>\n";
 
  420     out << 
"<!-- StoreyVolume(s) construction -->\n";
 
  422     for (JDetector::const_iterator module = detector.begin(); module != detector.end(); ++module) {
 
  423       if(module->empty()) 
continue;             
 
  424       out << 
"  <volume name=\"StoreyVolume" << module->getID() << 
"\">\n";
 
  425       out << 
"          <materialref ref=\"Water\"/>\n";
 
  426       out << 
"          <solidref ref=\"StoreyBox\"/>\n";
 
  427       out << 
"          <physvol>\n";
 
  428       out << 
"                  <volumeref ref=\"OMVolume" << module->getID() << 
"\"/>\n";
 
  429       out << 
"                  <positionref ref=\"OMShift\"/>\n";
 
  430       out << 
"                  <rotationref ref=\"identity\"/>\n";
 
  431       out << 
"          </physvol>\n";
 
  432       out << 
"  </volume>\n";
 
  435     out << 
"<!-- Crust Volume construction-->\n";
 
  436     out << 
"<volume name=\"CrustVolume\">\n";
 
  437     out << 
"    <materialref ref=\"Crust\"/>\n";
 
  438     out << 
"    <solidref ref=\"CrustBox\"/>\n";
 
  439     out << 
"</volume>\n";
 
  441     out << 
"<!-- World Volume construction-->\n";
 
  442     out << 
"<volume name=\"WorldVolume\">\n";
 
  443     out << 
"    <materialref ref=\"Water\"/>\n";
 
  444     out << 
"    <solidref ref=\"WorldTube\"/>\n";
 
  446     out << 
"    <physvol>\n";
 
  447     out << 
"            <volumeref ref=\"CrustVolume\"/>\n";
 
  448     out << 
"            <positionref ref=\"CrustPosition\"/>\n";
 
  449     out << 
"            <rotationref ref=\"identity\"/>\n";
 
  450     out << 
"    </physvol>\n";
 
  452     for (JDetector::const_iterator module = detector.begin(); module != detector.end(); ++module) {
 
  453       if(module->empty()) 
continue;             
 
  454       out << 
"  <physvol>\n";
 
  455       out << 
"          <volumeref ref=\"StoreyVolume" << module->getID() << 
"\"/>\n";
 
  456       out << 
"          <positionref ref=\"PosString" <<  module->getString()  << 
"_Dom" <<  module->getID()  << 
"\"/>\n";
 
  457       out << 
"                  <rotationref ref=\"identity\"/>\n";
 
  458       out << 
"  </physvol>\n";  
 
  461     out << 
"</volume>\n";
 
  463     out << 
"</structure>\n";
 
  464     out << 
"<setup name=\"Default\" version=\"1.0\">\n";
 
  465     out << 
"<world ref=\"WorldVolume\"/>\n";
 
  492       ifstream 
in(file_name.c_str());
 
  502       detector.swap(buffer);
 
  507       JFileStreamReader 
in(file_name.c_str());
 
  517       } 
catch(
const exception& error) {
 
  535       ifstream 
in(file_name.c_str());
 
  583       JFileStreamWriter out(file_name.c_str());
 
  595       std::ofstream out(file_name.c_str());
 
  619       std::ofstream out(file_name.c_str());
 
  643     static const size_t NUMBER_OF_DIMENSIONS = 3;    
 
  657       if (first.size() == second.size()) {
 
  659         const size_t N = first.size();
 
  661         if (N >= NUMBER_OF_DIMENSIONS) {
 
  666           for (
size_t i = 0; 
i != 
N; ++
i) {
 
  671           for (
size_t i = 0; 
i != NUMBER_OF_DIMENSIONS; ++
i) {
 
  672             if (!orthonormalise(
i)) {
 
  677           this->a00 = out[0].getX() * 
in[0].getX()  +  out[1].getX() * 
in[1].getX()  +  out[2].getX() * 
in[2].getX();
 
  678           this->a01 = out[0].getX() * 
in[0].getY()  +  out[1].getX() * 
in[1].getY()  +  out[2].getX() * 
in[2].getY();
 
  679           this->a02 = out[0].getX() * 
in[0].getZ()  +  out[1].getX() * 
in[1].getZ()  +  out[2].getX() * 
in[2].getZ();
 
  681           this->a10 = out[0].getY() * 
in[0].getX()  +  out[1].getY() * 
in[1].getX()  +  out[2].getY() * 
in[2].getX();
 
  682           this->a11 = out[0].getY() * 
in[0].getY()  +  out[1].getY() * 
in[1].getY()  +  out[2].getY() * 
in[2].getY();
 
  683           this->a12 = out[0].getY() * 
in[0].getZ()  +  out[1].getY() * 
in[1].getZ()  +  out[2].getY() * 
in[2].getZ();
 
  685           this->a20 = out[0].getZ() * 
in[0].getX()  +  out[1].getZ() * 
in[1].getX()  +  out[2].getZ() * 
in[2].getX();
 
  686           this->a21 = out[0].getZ() * 
in[0].getY()  +  out[1].getZ() * 
in[1].getY()  +  out[2].getZ() * 
in[2].getY();
 
  687           this->a22 = out[0].getZ() * 
in[0].getZ()  +  out[1].getZ() * 
in[1].getZ()  +  out[2].getZ() * 
in[2].getZ();
 
  691           THROW(
JException, 
"Module " << first.
getID() << 
" size " << N << 
" < " << NUMBER_OF_DIMENSIONS);
 
  696         THROW(
JException, 
"Module " << first.
getID() << 
" size " << first.size() << 
" != " << second.size());
 
  717       for (
size_t i = index + 1; 
i != 
in.size(); ++
i) {
 
  718         if (
in[
i].getLengthSquared() > 
in[pos].getLengthSquared()) {
 
  723       const double u = 
in[pos].getLength();
 
  731           swap(
in [pos], 
in [index]);
 
  732           swap(out[pos], out[index]);
 
  735         for (
size_t i = index + 1; 
i != 
in.size(); ++
i) {
 
  737           const double dot = 
in[index].getDot(
in[
i]);
 
  739           in [
i] -= dot * 
in [index];
 
  740           out[
i] -= dot * out[index];
 
Exception for opening of file. 
 
Data structure for a composite optical module. 
 
const JCalibration & getCalibration() const 
Get calibration. 
 
double getIndexOfRefraction()
Get average index of refraction of water corresponding to group velocity. 
 
const JDirection3D & getDirection() const 
Get direction. 
 
#define THROW(JException_t, A)
Marco for throwing exception with std::ostream compatible message. 
 
std::set< int > getStringIDs(const JDetector &detector)
Get list of strings identifiers. 
 
JTOOLS::JRange< int > floor_range
Type definition for range of floors. 
 
int getNumberOfPMTs(const JModule &module)
Get number of PMTs. 
 
static void setStartOfComment(const start_of_comment_type option)
Set option for short start of comment in binary I/O. 
 
static JRotation getRotation
Function object to get rotation matrix to go from first to second module. 
 
JCalibration getCalibration(const JCalibration &first, const JCalibration &second)
Get calibration to go from first to second calibration. 
 
Jpp environment information. 
 
static const char *const BINARY_DETECTOR_FILE_FORMAT[]
JIO binary file format. 
 
Data structure for time calibration. 
 
void read_gdml(std::istream &, JDetector &)
 
static const char *const GDML_SCHEMA
directory necessary for correct GDML header output 
 
static const JModuleCounter getNumberOfModules
Function object to count unique modules. 
 
double GetYrotationG4(const JVersor3D &dir)
Get rotation over Y axis in Geant4 coordinate system. 
 
static const char *const CAN_MARGIN_M
extension of the detector size to comply with the can definition 
 
floor_range getRangeOfFloors(const JDetector &detector)
Get range of floors. 
 
Data structure for detector geometry and calibration. 
 
then echo The file $DIR KM3NeT_00000001_00000000 root already please rename or remove it first
 
double getDistance(const JFirst_t &first, const JSecond_t &second)
Get distance between objects. 
 
JTimeRange getTimeRange(const Evt &event)
Get time range (i.e. time between earliest and latest hit) of Monte Carlo event. 
 
Monte Carlo detector (i.e. ".det" file). 
 
double putTime(const T &t1, const JCalibration &cal)
Get de-calibrated time. 
 
JVector3D & sub(const JVector3D &vector)
Subtract vector. 
 
virtual JReader & read(JReader &in) override
Read from input. 
 
std::string getGITVersion(const std::string &tag)
Get GIT version for given GIT tag. 
 
Data structure for vector in three dimensions. 
 
virtual JWriter & write(JWriter &out) const override
Write to output. 
 
double getDY() const 
Get y direction. 
 
Auxiliary class to get rotation matrix between two optical modules. 
 
double getDX() const 
Get x direction. 
 
int getID() const 
Get identifier. 
 
void store(const std::string &file_name, const JDetector &detector)
Store detector to output file. 
 
JPosition3D getPosition(const Vec &pos)
Get position. 
 
int getNumberOfFloors(const JDetector &detector)
Get number of floors. 
 
static const double PI
Mathematical constants. 
 
double getY() const 
Get y position. 
 
const JPosition3D & getPosition() const 
Get position. 
 
double getMaximalTime(const double R_Hz)
Get maximal time for given rate. 
 
const JPMT & getPMT(const int index) const 
Get PMT. 
 
Logical location of module. 
 
const JRotation3D & operator()(const JModule &first, const JModule &second)
Get rotation matrix to go from first to second module. 
 
std::vector< JVector3D > in
 
double GetXrotationG4(const JVersor3D &dir)
Get rotation over X axis in Geant4 coordinate system. 
 
static const char *const KM3NET_DETECTOR_FILE_FORMAT
KM3NeT standard ASCII format 
 
static const char *const ZIPPED_DETECTOR_FILE_FORMAT
zipped KM3NeT standard ASCII format 
 
static const char *const GENDET_DETECTOR_FILE_FORMAT
File name extensions. 
 
then usage $script< input file >[option[primary[working directory]]] nWhere option can be N
 
void load(const std::string &file_name, JDetector &detector)
Load detector from input file. 
 
Auxiliary class to define a range between two values. 
 
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
 
std::string getFilenameExtension(const std::string &file_name)
Get file name extension, i.e. part after last JEEP::FILENAME_SEPARATOR if any. 
 
const double getInverseSpeedOfLight()
Get inverse speed of light. 
 
double getX() const 
Get x position. 
 
double getMaximalDistance(const JDetector &detector, const bool option=false)
Get maximal distance between modules in detector. 
 
static const char *const G4GDML_DEFAULT_SCHEMALOCATION
 
double getTanThetaC()
Get average tangent of Cherenkov angle of water corresponding to group velocity. 
 
Data structure for position in three dimensions. 
 
do set_variable DETECTOR_TXT $WORKDIR detector
 
Data structure for normalised vector in three dimensions. 
 
static const char *const GDML_DETECTOR_FILE_FORMAT
KM3Sim input format. 
 
double getZ() const 
Get z position. 
 
double getDZ() const 
Get z direction. 
 
std::vector< JVector3D > out
 
bool orthonormalise(const size_t index, const double precision=std::numeric_limits< double >::epsilon())
Put normalised primary direction at specified index and orthoganilise following directions. 
 
double getSinThetaC()
Get average sine of Cherenkov angle of water corresponding to group velocity. 
 
void write_gdml(std::ostream &out, const JDetector &detector)
Writes KM3Sim GDML input file from detector. 
 
double getT0() const 
Get time offset.