10 #include <type_traits> 
   65 namespace JACOUSTICS {
 
   71   using namespace JDETECTOR;
 
  112       bool hasString(
const int id)
 const 
  128     static constexpr 
double   RADIUS_M  =  1.0;                     
 
  149         std::
set<int>(buffer.begin(), buffer.end())
 
  163         std::set_difference(A.begin(), A.end(), B.begin(), B.end(), std::inserter(*
this, this->begin()));
 
  179         std::set_difference(A.begin(), A.end(), B.begin(), B.end(), std::inserter(*
this, this->begin()));
 
  192         for (
int id; in >> id; ) {
 
  213         for (
const int id : 
object) {
 
  276       virtual void apply(
const double step)
 override 
  321       virtual void apply(
const double step)
 override 
  323         for (
const auto i : index) {
 
  365       virtual void apply(
const double step)
 override 
  367         for (
const auto i : index) {
 
  414       virtual void apply(
const double step)
 override 
  416         tripods[index].add(direction * step);
 
  439         hydrophones (setup.hydrophones),
 
  440         transmitters(setup.transmitters)
 
  455       virtual void apply(
const double step)
 override 
  461         if (index[0] != hydrophones .size()) { hydrophones [index[0]].rotate(R); }
 
  462         if (index[1] != transmitters.size()) { transmitters[index[1]].rotate(R); }
 
  482         Nmax   (std::numeric_limits<size_t>::max()),
 
  508           for (
double value; in >> value; ) {
 
  509             object.steps.push_back(value);
 
  532         out << setw(2)         << 
object.option      << 
' ' 
  533             << setw(2)         << 
object.mestimator  << 
' ' 
  536             << setw(3)         << 
object.Nextra;
 
  538         for (
const double value : 
object.steps) {
 
  539           out << 
' ' << 
FIXED(9,5) << value;
 
  565       filenames(filenames),
 
  572       setup.tripods.load(filenames.
tripod.c_str());
 
  577       for (JDetector::const_iterator 
i = setup.detector.begin(); 
i != setup.detector.end(); ++
i) {
 
  578         receivers[
i->getID()] = 
i->getLocation();
 
  585       for (JDetector::iterator module = setup.detector.begin(); module != setup.detector.end(); ++module) {
 
  591       fits.initialise(setup);
 
  593       this->V.
set(setup.detector.getUTMZ());                              
 
  600       ROOT::EnableThreadSafety();
 
  618       for (JDetector::iterator module = setup.detector.begin(); module != setup.detector.end(); ++module) {
 
  620         if (fits.strings.count(module->getString()) != 0)
 
  621           buffer[0].push_back(*module);                            
 
  623           buffer[1].push_back(*module);                            
 
  626       setup.detector.swap(buffer[1]);
 
  630       for (
const int i : fits.tripods) {
 
  636       const double chi2 = fit(*
this);
 
  638       copy(buffer[0].begin(), buffer[0].end(), back_inserter(setup.detector));
 
  658       for (
const int i : fits.strings) {
 
  664       for (
const int i : fits.tripods) {
 
  670       for (
const int i : 
ids_t(fits.hydrophones, fits.transmitters)) {
 
  674       for (
const int i : fits.transmitters) {
 
  676         JModule& module = setup.detector.getModule(router->getAddress(
JLocation(i,0)));
 
  682       const double chi2 = fit(*
this);
 
  704       for (JDetector::iterator module = setup.detector.begin(); module != setup.detector.end(); ++module) {
 
  706         buffer[module->getString()].push_back(*module);
 
  708         if (module->getZ() > z0) {
 
  713       setup.detector.clear();      
 
  715       for (
const int i : fits.strings) {
 
  717         setup.detector.swap(buffer[i]);
 
  726         const double chi2 = fit(*
this);
 
  728         STATUS(
"string: " << setw(4) << i << 
' ' << 
FIXED(9,4) << chi2 << endl);
 
  730         setup.detector.swap(buffer[i]);
 
  733       setup.detector.clear();      
 
  735       for (
const auto& 
detector : buffer) {
 
  757       for (JDetector::iterator module = setup.detector.begin(); module != setup.detector.end(); ++module) {
 
  758         if (fits.strings.count(module->getString()) != 0 && module->getFloor() != 0) {
 
  763       const double chi2 = fit(*
this);
 
  780       const JGeometry geometry(setup.detector, setup.hydrophones);
 
  784       for (tripods_container::const_iterator 
i = setup.tripods.begin(); 
i != setup.tripods.end(); ++
i) {
 
  786           emitters[
i->getID()]  = 
JEmitter(
i->getID(), 
i->getUTMPosition() - setup.detector.getUTMPosition());
 
  790       for (transmitters_container::const_iterator 
i = setup.transmitters.begin(); 
i != setup.transmitters.end(); ++
i) {
 
  792           emitters[
i->getID()]  = 
JEmitter(
i->getID(), 
i->getPosition()    + router->getModule(
i->getLocation()).
getPosition());
 
  794         catch(
const exception&) {}                                        
 
  809           for (idat_type::const_iterator superevt = idat.begin(); superevt != idat.end(); ++superevt) {
 
  816             for (ievt_type::const_iterator evt = superevt->begin(); evt != superevt->end(); ++evt) {
 
  818               const JEmitter& emitter = emitters [evt->getID()];
 
  819               const double    weight  = 
getWeight(evt->getID());
 
  821               for (JEvent::const_iterator 
i = evt->begin(); 
i != evt->end(); ++
i) {
 
  825                   data.push_back(
JHit(emitter,
 
  827                                       receivers[
i->getID()],
 
  832                   counter.insert(evt->getID());
 
  845       } 
else if (option == 2) {                                           
 
  850           for (odat_type::const_iterator superevt = odat.begin(); superevt != odat.end(); ++superevt) {
 
  859         return numeric_limits<float>::max();
 
  874       ifstream 
in(script.c_str());
 
  884             fits.initialise(setup);
 
  886           } 
else if (key == 
fix_t) {                   
 
  890             istringstream 
is(value);
 
  895             if (is >> type >> 
id) {
 
  897                 fits.strings     .
fix(
id);
 
  898                 fits.hydrophones .fix(
id);
 
  899                 fits.transmitters.fix(
id);
 
  901                 fits.tripods     .fix(
id);
 
  911             istringstream 
is(value);
 
  916             if (is >> stage >> input) {
 
  918               STATUS(
"stage " << setw(3) << stage << 
" {" << input << 
"}" << endl);
 
  924               ofstream out(
MAKE_CSTRING(
"stage-" << stage << 
".log"));
 
  929                 switch (stage[stage.size() - 1]) {
 
  985       if (
getFileStatus(dir.c_str()) || (mkdir(dir.c_str(), S_IRWXU | S_IRWXG) != -1)) {
 
  989         for (JDetector::iterator module = 
detector.begin(); module != 
detector.end(); ++module) {
 
  990           module->set(router->getModule(module->getLocation()).
getPosition());
 
  995         setup.tripods.store(
getFilename(dir, filenames.tripod).c_str());
 
  997         if (filenames.hydrophone  != 
"") { setup.hydrophones .store(
getFilename(dir, filenames.hydrophone) .c_str()); }
 
  998         if (filenames.transmitter != 
"") { setup.transmitters.store(
getFilename(dir, filenames.transmitter).c_str()); }
 
 1040   using namespace std;
 
 1041   using namespace JPP;
 
 1055     JParser<> zap(
"Application to perform acoustic pre-calibration.");
 
 1057     zap[
'f'] = 
make_field(inputFile,              
"output of JAcousticEventBuilder[.sh]");
 
 1058     zap[
'n'] = 
make_field(numberOfEvents)                                           = JLimit::max();
 
 1063     zap[
'T'] = 
make_field(filenames.tripod,       
"tripod file");
 
 1068     zap[
'N'] = 
make_field(jobs,                   
"number of parallel jobs")        = 1;
 
 1073   catch(
const exception &error) {
 
 1074     FATAL(error.what() << endl);
 
 1078     FATAL(
"Invalid number of jobs " << jobs << endl);
 
 1088       receivers.insert(
i->getID());
 
 1094       emitters.insert(
i->getID());
 
 1100       emitters.insert(
i->getID());
 
 1108   while (inputFile.hasNext()) {
 
 1110     const JEvent* evt = inputFile.next();
 
 1112     if (emitters.count(evt->
getID())) {
 
 1113       zbuf.push_back(*evt);
 
 1119   sort(zbuf.begin(), zbuf.end());                  
 
 1121   for (buffer_type::iterator p = zbuf.begin(), q; p != zbuf.end(); p = q) {
 
 1123     for (q = p; ++q != zbuf.end() && q->begin()->getToE() <= p->rbegin()->getToE() + 
parameters.Tmax_s; ) {}
 
 1129     for (buffer_type::iterator evt = p; evt != q; ++evt) {
 
 1135       for (JEvent::iterator 
i = evt->begin(); 
i != __end; ) {
 
 1140           if (receivers.count(
i->getID()) && 
i->getQ() >= 
parameters.Qmin * (unit(
parameters.Qmin) ? 
i->getW() : 1.0)) {
 
 1145         iter_swap(
i, --__end);
 
 1148       buffer.push_back(
JEvent(evt->getOID(), buffer.size(), evt->getID(), evt->begin(), __end));
 
 1152       sydney.
idat.push_back(buffer);
 
void initialise(const JSetup &setup)
Initialise. 
 
std::vector< ievt_type > idat_type
 
ids_t(const std::vector< int > &buffer)
Copy constructor. 
 
Auxiliary class to edit length of Dyneema ropes. 
 
Utility class to parse command line options. 
 
JSydney(const JFilenames &filenames, const JSoundVelocity &V, const size_t jobs, const int debug)
Constructor. 
 
std::vector< JHydrophone > & hydrophones
 
JDetector detector
detector 
 
friend std::ostream & operator<<(std::ostream &out, const JParameters_t &object)
Write parameters to output stream. 
 
JPredicate< JResult_t T::*, JComparison::eq > make_predicate(JResult_t T::*member, const JResult_t value)
Helper method to create predicate for data member. 
 
int main(int argc, char *argv[])
 
void stage_b(const JParameters_t ¶meters)
Fit procedure to determine the stretching and z-positions of individual strings. 
 
void stage_a(const JParameters_t ¶meters)
Fit procedure to determine the positions of the strings and tripods. 
 
friend std::istream & operator>>(std::istream &in, ids_t &object)
Read identifiers from input stream. 
 
JComparator< JResult_t T::*, JComparison::lt > make_comparator(JResult_t T::*member)
Helper method to create comparator between values of data member. 
 
double getWeight(T __begin, T __end)
Get total weight of data points. 
 
static const std::string fix_t
fix objects 
 
Data structure for a composite optical module. 
 
JContainer< std::vector< JTransmitter > > transmitters_container
 
double operator()(const int option) const 
Get chi2. 
 
static JDetectorMechanics getMechanics
Function object to get string mechanics. 
 
std::string detector
detector 
 
bool hasModule(const JLocation &location) const 
Check availability of module parameters. 
 
virtual void apply(const double step) override
Apply step. 
 
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance. 
 
JVector3D getPosition(T __begin, T __end, const JPredicate< JTypename_t, JComparator_t > &predicate)
Get position from element in data which corresponds to given predicate. 
 
Auxiliary data structure to unify weights of acoustics data according to the number of pings per emit...
 
General purpose class for hash map of unique elements. 
 
std::vector< JEvent > ievt_type
 
ROOT TTree parameter settings. 
 
#define THROW(JException_t, A)
Marco for throwing exception with std::ostream compatible message. 
 
virtual void apply(const double step) override
Apply step. 
 
Auxiliary data structure for setup of complete system. 
 
*fatal Wrong number of arguments esac JCookie sh typeset Z DETECTOR typeset Z SOURCE_RUN typeset Z TARGET_RUN set_variable PARAMETERS_FILE $WORKDIR parameters
 
#define MAKE_CSTRING(A)
Make C-string. 
 
void run(const std::string &script)
Run. 
 
tripods_container tripods
tripods 
 
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
 
then usage $script< detector specific pre-calibration script >< option > nAuxiliary script to make scan of pre stretching of detector strings(see JEditDetector)." "\nPossible options
 
Auxiliary data structure for floating point format specification. 
 
Auxiliary data structure for handling file names. 
 
Extended data structure for parameters of stage. 
 
transmitters_container transmitters
transmitters 
 
V(JDAQEvent-JTriggerReprocessor)*1.0/(JDAQEvent+1.0e-10)
 
ids_t(const ids_t &A, const ids_t &B)
Difference constructor. 
 
Data structure for detector geometry and calibration. 
 
JMODEL::JString getString(const JFit &fit)
Get model parameters of string. 
 
static const JVector3D JVector3X_t(1, 0, 0)
unit x-vector 
 
Data structure for hydrophone. 
 
static const std::string stage_t
fit stage 
 
size_t getNumberOfEmitters(T __begin, T __end)
Get number of emitters. 
 
Auxiliary class to edit (x,y,z) position of string. 
 
#define MAKE_STRING(A)
Make string. 
 
Direct access to location in detector data structure. 
 
static const std::string tripod_t
tripod 
 
Implementation of object output from STD container. 
 
std::vector< double > steps
 
Auxiliary class for defining the range of iterations of objects. 
 
static const JSoundVelocity getSoundVelocity(1541.0,-17.0e-3,-2000.0)
Function object for velocity of sound. 
 
std::string hydrophone
hydrophone 
 
void store(const std::string &dir=".")
Store data in given directory. 
 
JParameters_t()
Default constuctor. 
 
JModuleEditor(JModule &module)
Constructor. 
 
Auxiliary class to edit (z) position of module. 
 
This class can be used to temporarily redirect one output (input) stream to another output (input) st...
 
JContainer< std::vector< JHydrophone > > hydrophones_container
 
void fix(const ids_t &B)
Fix. 
 
Data structure for vector in three dimensions. 
 
Router for direct addressing of location data in detector data structure. 
 
Data structure for transmitter. 
 
Logical location of module. 
 
Auxiliary wrapper for I/O of container with optional comment (see JComment). 
 
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object 
 
JContainer< std::set< JTransmission_t > > disable_container
 
ids_t()
Default constructor. 
 
const array_type< JValue_t > & make_array(const JValue_t(&array)[N])
Method to create array of values. 
 
int getID() const 
Get identifier. 
 
ids_t transmitters
transmitters 
 
void store(const std::string &file_name, const JDetector &detector)
Store detector to output file. 
 
Auxiliary class for CPU timing and usage. 
 
std::istream & getline(std::istream &in, JString &object)
Read string from input stream until end of line. 
 
static JTOOLS::JQuantile Q
chi2/NDF 
 
Auxiliary data structure for fit parameter. 
 
double getY() const 
Get y position. 
 
Auxiliary class to edit rotation of anchor. 
 
JContainer< std::vector< JTripod > > tripods_container
 
General purpose messaging. 
 
virtual void apply(const double step) override
Apply step. 
 
JDyneemaEditor(JSetup &setup, const int id, const double z0=0.0)
Constructor. 
 
Implementation for depth dependend velocity of sound. 
 
Scanning of objects from multiple files according a format that follows from the extension of each fi...
 
static JStat getFileStatus
Function object for file status. 
 
void enqueue(data_type &data)
Queue data. 
 
Auxiliary data structure for editable parameter. 
 
fits_t()
Default constructor. 
 
virtual void apply(const double step) override
Apply step. 
 
Thread pool for global fits. 
 
then JCookie sh JDataQuality D $DETECTOR_ID R
 
static void overlap(T p, T q, const double Tmax_s)
Empty overlapping events. 
 
int getString() const 
Get string number. 
 
std::vector< JTransmitter > & transmitters
 
friend std::ostream & operator<<(std::ostream &out, const ids_t &object)
Write identifiers to output stream. 
 
void load(const std::string &file_name, JDetector &detector)
Load detector from input file. 
 
detector()
Default constructor. 
 
void stage_c(const JParameters_t ¶meters)
Fit procedure to determine the z-positions of the modules. 
 
Auxiliary class to define a range between two values. 
 
General purpose class for object reading from a list of file names. 
 
Utility class to parse command line options. 
 
Main class for pre-calibration using acoustics data. 
 
static output_type * output
optional output 
 
JFitParameters parameters
 
Acoustic transmission identifier. 
 
JTOOLS::JHashMap< int, JLocation > receivers
 
Fit functions of acoustic model. 
 
ids_t hydrophones
hydrophones 
 
static const JVector3D JVector3Z_t(0, 0, 1)
unit z-vector 
 
JAnchorEditor(JSetup &setup, const int id)
Constructor. 
 
then if[[!-f $DETECTOR]] then JDetector sh $DETECTOR fi cat $WORKDIR trigger_parameters txt<< EOFtrigger3DMuon.enabled=1;trigger3DMuon.numberOfHits=5;trigger3DMuon.gridAngle_deg=1;ctMin=0.0;TMaxLocal_ns=15.0;EOF set_variable TRIGGEREFFICIENCY_TRIGGERED_EVENTS_ONLY INPUT_FILES=() for((i=1;$i<=$NUMBER_OF_RUNS;++i));do JSirene.sh $DETECTOR $JPP_DATA/genhen.km3net_wpd_V2_0.evt.gz $WORKDIR/sirene_ ${i}.root JTriggerEfficiency.sh $DETECTOR $DETECTOR $WORKDIR/sirene_ ${i}.root $WORKDIR/trigger_efficiency_ ${i}.root $WORKDIR/trigger_parameters.txt $JPP_DATA/PMT_parameters.txt INPUT_FILES+=($WORKDIR/trigger_efficiency_ ${i}.root) done for ANGLE_DEG in $ANGLES_DEG[*];do set_variable SIGMA_NS 3.0 set_variable OUTLIERS 3 set_variable OUTPUT_FILE $WORKDIR/matrix\[${ANGLE_DEG}\deg\].root $JPP_DIR/examples/JReconstruction-f"$INPUT_FILES[*]"-o $OUTPUT_FILE-S ${SIGMA_NS}-A ${ANGLE_DEG}-O ${OUTLIERS}-d ${DEBUG}--!fiif[[$OPTION=="plot"]];then if((0));then for H1 in h0 h1;do JPlot1D-f"$WORKDIR/matrix["${^ANGLES_DEG}" deg].root:${H1}"-y"1 2e3"-Y-L TR-T""-\^"number of events [a.u.]"-> o chi2
 
Thread pool for global fits. 
 
int getID() const 
Get identifier. 
 
static JTOOLS::JQuantile Q
chi2/NDF 
 
double getX() const 
Get x position. 
 
void copy(const Head &from, JHead &to)
Copy header from from to to. 
 
bool hasLocation(const JLocation &location) const 
Check if this detector has given location. 
 
std::string getFilename(const std::string &file_name)
Get file name part, i.e. part after last JEEP::PATHNAME_SEPARATOR if any. 
 
std::vector< size_t > index
 
JTripodEditor(JSetup &setup, const int id, const JVector3D &direction)
Constructor. 
 
std::vector< size_t > index
 
JStringEditor(JSetup &setup, const int id, const JVector3D &direction, const bool option)
Constructor. 
 
const JLimit & getLimit() const 
Get limit. 
 
static const std::string initialise_t
initialise 
 
Exception for accessing a value in a collection that is outside of its range. 
 
Auxiliary data structure for group of lists of identifiers of to-be-fitted objects. 
 
virtual void apply(const double step) override
Apply step. 
 
int getID() const 
Get emitter identifier. 
 
static const JVector3D JVector3Y_t(0, 1, 0)
unit y-vector 
 
std::string transmitter
transmitter 
 
Data structure for tripod. 
 
std::vector< JSuperEvt > odat_type
 
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
 
source $JPP_DIR setenv csh $JPP_DIR &dev null eval JShellParser o a A
 
Acoustic transmission identifier. 
 
JSoundVelocity & set(const double z0)
Set depth. 
 
Auxiliary data structure for floating point format specification. 
 
void enqueue(const JSuperEvt &evt)
Queue super event. 
 
JModule & set(const JVector3D &pos)
Set position. 
 
friend std::istream & operator>>(std::istream &in, JParameters_t &object)
Read parameters from input stream. 
 
double getZ() const 
Get z position. 
 
std::unique_ptr< JLocationRouter > router
 
void stage_0(const JParameters_t ¶meters)
Fit procedure to determine the positions of tripods using strings that are fixed. ...
 
Template definition of fit function of acoustic model. 
 
std::vector< JTripod > & tripods
 
unsigned long long usec_wall
 
Data structure for optical module. 
 
static const std::string string_t
string 
 
Auxiliary class to edit (x,y,z) position of tripod.