10 #include <type_traits>
77 JFremantle(
const std::string& oid,
87 for (
size_t i = 0; i <
N; ++i) {
89 thread worker([
this, katoomba]() {
96 unique_lock<mutex> lock(
in);
98 cv.wait(lock, [
this]() {
return stop || !input.empty(); });
100 if (
stop && input.empty()) {
104 data.swap(input.front());
109 const auto result = fremantle(data.begin(), data.end());
111 if (
result.chi2 /
result.ndf <= fremantle.parameters.chi2perNDF) {
115 for (data_type::const_iterator i =
result.begin; i !=
result.end; ++i) {
116 range.include(i->getValue());
120 range.getLowerLimit(),
121 range.getUpperLimit(),
129 unique_lock<mutex> lock(out);
131 this->output.
put(evt);
137 workers.emplace_back(move(worker));
150 unique_lock<mutex> lock(
in);
157 for (
auto& worker : workers) {
173 unique_lock<mutex> lock(
in);
185 void enqueue(data_type& data)
190 unique_lock<mutex> lock(
in);
193 throw runtime_error(
"The thread pool has been stopped.");
196 input.emplace(move(data));
204 queue <data_type> input;
207 condition_variable cv;
221 int main(
int argc,
char **argv)
237 transmitters_container transmitters;
238 hydrophones_container hydrophones;
241 disable_container disable;
248 JParser<> zap(
"Application to fit position calibration model to acoustic data.");
250 zap[
'f'] =
make_field(inputFile,
"output of JAcousticEventBuilder[.sh]");
252 zap[
'n'] =
make_field(numberOfEvents) = JLimit::max();
260 zap[
'u'] =
make_field(unify,
"unify weighing of pings");
262 zap[
'N'] =
make_field(jobs,
"number of parallel jobs") = 1;
263 zap[
's'] =
make_field(sleep_us,
"sleep time [us]") = 100;
268 catch(
const exception &error) {
269 FATAL(error.what() << endl);
272 ROOT::EnableThreadSafety();
288 for (JDetector::const_iterator i =
detector.begin(); i !=
detector.end(); ++i) {
289 receivers[i->getID()] = i->getLocation();
292 for (tripods_container::const_iterator i =
tripods.begin(); i !=
tripods.end(); ++i) {
293 emitters[i->getID()] =
JEmitter(i->getID(),
294 i->getUTMPosition() -
detector.getUTMPosition());
297 for (transmitters_container::const_iterator i = transmitters.begin(); i != transmitters.end(); ++i) {
299 emitters[i->getID()] =
JEmitter(i->getID(),
302 catch(
const exception&) {
325 for (
const string& file_name : inputFile) {
335 else if (oid != evt->
getOID())
336 FATAL(
"Invalid detector identifier " << evt->
getOID() <<
" != " << oid << endl);
339 zmap[evt->begin()->getToE()] = file_name;
348 inputFile.push_back(i->second);
358 JFremantle fremantle(oid, katoomba,
outputFile, jobs);
360 typedef deque<JEvent> buffer_type;
362 for (buffer_type zbuf; inputFile.hasNext(); ) {
364 STATUS(inputFile.getFilename() <<
'\r');
DEBUG(endl);
368 for (
const string file_name = inputFile.getFilename(); inputFile.hasNext() && file_name == inputFile.getFilename(); ) {
370 const JEvent* evt = inputFile.next();
372 if (emitters.has(evt->
getID())) {
373 zbuf.push_back(*evt);
377 sort(zbuf.begin(), zbuf.end());
379 for (buffer_type::iterator p = zbuf.begin(), q; p != zbuf.end(); p = q) {
381 for (q = p; ++q != zbuf.end() && q->begin()->getToE() <= p->rbegin()->getToE() +
parameters.Tmax_s; ) {}
383 if (q == zbuf.end()) {
385 if (inputFile.hasNext()) {
387 zbuf.erase(zbuf.begin(), p);
397 for (buffer_type::const_iterator i = p; i != q; ++i) {
398 numberOfPings[i->getID()] += 1;
402 DEBUG(
"Number of pings " << setw(2) << i->first <<
' ' << setw(3) << i->second << endl);
405 int minimum_number_of_pings = numeric_limits<int>::max();
408 minimum_number_of_pings = min(minimum_number_of_pings, i->second);
413 for (buffer_type::iterator evt = p; evt != q; ++evt) {
415 sort(evt->begin(), evt->end(),
compare);
419 const JEmitter& emitter = emitters[evt->getID()];
420 const double signal = (unify ? (double) minimum_number_of_pings / (
double) numberOfPings[evt->getID()] : 1.0);
422 for (JEvent::const_iterator i = evt->begin(); i != __end; ++i) {
427 if (receivers.has(i->getID()) && geometry.
hasLocation(receivers[i->getID()]) && i->getQ() >=
parameters.Qmin) {
431 receivers[i->getID()],
438 while (fremantle.backlog() > jobs) {
439 this_thread::sleep_for(chrono::microseconds(sleep_us));
442 fremantle.enqueue(data);
448 catch(
const exception& error) {
449 FATAL(
"main " << error.what());
Worker class for fit function of acoustic model.
Utility class to parse command line options.
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.
static JDetectorMechanics getMechanics
Function object to get string mechanics.
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
General purpose class for hash map of unique elements.
ROOT TTree parameter settings.
Recording of objects on file according a format that follows from the file name extension.
then JShowerPostfit f $INPUT_FILE o $OUTPUT_FILE N
JEvt getEvt(const JHead &header, const JModel &model)
Get event.
*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
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
V(JDAQEvent-JTriggerReprocessor)*1.0/(JDAQEvent+1.0e-10)
Data structure for detector geometry and calibration.
Data structure for hydrophone.
size_t getNumberOfEmitters(T __begin, T __end)
Get number of emitters.
then usage $script[port]< option > nPossible stop
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.
Data structure for transmitter.
Auxiliary wrapper for I/O of container with optional comment (see JComment).
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
const std::string & getOID() const
Get detector identifier.
JPosition3D getPosition(const Vec &pos)
Get position.
static struct JACOUSTICS::@4 compare
Auxiliary data structure to sort transmissions.
General purpose messaging.
Implementation for depth dependend velocity of sound.
Scanning of objects from multiple files according a format that follows from the extension of each fi...
z range($ZMAX-$ZMIN)< $MINIMAL_DZ." fi fi typeset -Z 4 STRING typeset -Z 2 FLOOR JPlot1D -f $
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
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.
Acoustic transmission identifier.
bool hasLocation(const JLocation &location) const
Check if this detector has given location.
Template interface of object output for single data type.
Custom probability density function of time-of-arrival.
const JLimit & getLimit() const
Get limit.
Fit functions of acoustic model.
virtual bool put(const T &object)=0
Object output.
do set_variable DETECTOR_TXT $WORKDIR detector
int getID() const
Get identifier.
Data structure for tripod.
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
Acoustic transmission identifier.
Template definition of fit function of acoustic model.
#define DEBUG(A)
Message macros.
Data structure for optical module.