88 for (
size_t i = 0; i != getTimeSlewing.size(); ++i) {
133 virtual void apply(
const double step)
override
135 for (data_type::iterator evt =
data.begin(); evt !=
data.end(); ++evt) {
137 map_type::iterator p = evt->data.find(
id);
139 if ((evt->status = (p != evt->data.end()))) {
140 for (buffer_type::iterator hit = p->second.begin(); hit != p->second.end(); ++hit) {
141 static_cast<JHit&
>(*hit) =
JHit(hit->getT1() + step, hit->getToT());
183 for (
size_t i = 0; i < ns; ++i) {
185 thread worker([
this, storage, option]() {
189 regressor.parameters.resize(5);
203 unique_lock<mutex> lock(
in);
219 if (option != 2 || evt->
status) {
220 for (map_type::const_iterator p = evt->
data.begin(); p != evt->
data.end(); ++p) {
221 copy(p->second.begin(), p->second.end(), back_inserter(data));
230 const double chi2 = regressor(value, data.begin(), data.end());
233 unique_lock<mutex> lock(
out);
241 workers.emplace_back(std::move(worker));
254 unique_lock<mutex> lock(
in);
273 std::condition_variable
cv;
320 typedef JParallelFileScanner_t::multi_pointer_type multi_pointer_type;
327 JLimit_t& numberOfEvents = inputFile.getLimit();
329 JCalibration_t calibrationFile;
333 bool overwriteDetector;
338 int number_of_iterations = 1000;
339 int number_of_extra_steps = 0;
340 double epsilon = 1.0e-4;
346 parameters.
ZMin_m = -1.0e4;
347 parameters.
ZMax_m = +1.0e4;
349 const int DEFAULT_ID = -1;
360 JParser<> zap(
"Program to determine string or optical module time calibrations.");
370 zap[
'A'] =
make_field(overwriteDetector,
"overwrite detector file provided through '-a' with fitted time offsets.");
376 zap[
'N'] =
make_field(threads,
"number of threads") = 1;
381 catch(
const exception& error) {
382 FATAL(error.what() << endl);
386 if ((strings.empty() ? 0 : 1) +
387 (modules.empty() ? 0 : 1) +
388 (indices.empty() ? 0 : 1) != 1) {
389 FATAL(
"Set either strings (option -S) or modules (option -M) or indices (option -I)." << endl);
406 unique_ptr<JDynamics> dynamics;
408 if (!calibrationFile.empty()) {
414 dynamics->load(calibrationFile);
416 catch(
const exception& error) {
423 NOTICE(
"Reading PDFs... " << flush);
429 JRegressor_t::debug =
debug;
430 JRegressor_t::Vmax_npe = parameters.
VMax_npe;
431 JRegressor_t::MAXIMUM_ITERATIONS = parameters.
NMax;
435 NOTICE(
"Reading data" << endl);
448 for (JParallelFileScanner_t in(*i); (skip -= in.skip(skip)) == 0 && in.hasNext() && counter != numberOfEvents; ++counter) {
450 STATUS(
"event: " << setw(10) << counter <<
'\r');
DEBUG(endl);
452 multi_pointer_type ps = in.next();
460 dynamics->update(*tev);
465 if (evt->begin() != __end) {
471 buildL0(*tev, router,
true, back_inserter(dataL0));
490 for (vector<JHitL0>::const_iterator i = dataL0.begin(); i != dataL0.end(); ++i) {
496 const int type = wip.
getType();
497 const double QE = wip.
QE;
498 const double R_Hz = summary.
getRate(i->getPMTIdentifier(), parameters.
R_Hz);
500 JHitW0 hit(*i, type, QE, R_Hz);
505 buffer.push_back(hit);
513 buffer_type::const_iterator __end = unique(buffer.begin(), buffer.end(), equal_to<JDAQPMTIdentifier>());
519 for (buffer_type::const_iterator hit = buffer.begin(); hit != __end; ++hit) {
522 const JTOT_t index = (JTOT_t) range.
constrain(hit->getToT());
524 if (!strings.empty()) {
map[module.
getString()].push_back(*hit); }
525 if (!modules.empty()) {
map[module.
getID()] .push_back(*hit); }
526 if (!indices.empty()) {
map[index] .push_back(*hit); }
529 data.push_back({
map, tz,
true});
539 JGradient fit(number_of_iterations, number_of_extra_steps, epsilon, 3);
549 const JPerth_t perth = {storage, data, threads};
551 const double chi2 = fit(perth);
555 for (
size_t i = 0; i != fit.size(); ++i) {
559 if (p != NULL) {
STATUS(fit[i].name <<
' ' <<
FIXED(9,3) << p->
t0 <<
" [ns]" << endl); }
564 if (!indices.empty()) {
569 double Y[2] = { 0.0, 0.0 };
571 for (
size_t i = 0; i != fit.size(); ++i) {
577 const double x = p->
id;
578 const double y = p->
t0;
595 const double a = V.
a00 * Y[0] + V.
a01 * Y[1];
598 cout <<
"// Produced by JPerth.cc; to be included in JTimeSlewing.hh" << endl;
600 for (
size_t i = 0; i != getTimeSlewing.size(); ++i) {
605 cout <<
"this->push_back(" <<
FIXED(6,2) << getTimeSlewing[i] - y <<
");" << endl;
608 catch(
const exception& error) {
613 if (overwriteDetector) {
619 for (
size_t i = 0; i != fit.size(); ++i) {
630 for (JDetector::iterator module =
detector.begin(); module !=
detector.end(); ++module) {
632 if (!module->empty()) {
635 !modules.empty() ?
calibration.find(module->getID()) :
639 module->getPMT(pmt).addT0(p->second - t0);
645 NOTICE(
"Store calibration data on file " << detectorFile << endl);
Time calibration (including definition of sign of time offset).
Data structure for detector geometry and calibration.
Dynamic detector calibration.
Basic data structure for L0 hit.
Data regression method for JFIT::JLine3Z.
Base class for data structures with artithmetic capabilities.
General purpose messaging.
#define DEBUG(A)
Message macros.
Direct access to module in detector data structure.
Scanning of objects from multiple files according a format that follows from the extension of each fi...
Parallel scanning of objects from a single file or multiple files according a format that follows fro...
Utility class to parse command line options.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
int main(int argc, char **argv)
#define MAKE_STRING(A)
Make string.
Utility class to parse parameter values.
#define gmake_property(A)
macros to convert (template) parameter to JPropertiesElement object
Auxiliary class to define a range between two values.
ROOT TTree parameter settings of various packages.
Auxiliary methods to convert data members or return values of member methods of a set of objects to a...
int getString() const
Get string number.
Router for direct addressing of module data in detector data structure.
const JModule & getModule(const JObjectID &id) const
Get module parameters.
Data structure for a composite optical module.
Auxiliary class for map of PMT parameters.
const JPMTParameters & getPMTParameters(const JPMTIdentifier &id) const
Get PMT parameters.
Data structure for PMT parameters.
double QE
relative quantum efficiency
int getType() const
Get type for for time-slewing correction.
Utility class to parse parameter values.
Data structure for set of track fit results.
Data structure for track fit results with history and optional associated values.
const std::vector< double > & getW() const
Get associated values.
double getT() const
Get time.
Data structure for fit of straight line paralel to z-axis.
static parameter_type pY()
static parameter_type pX()
static parameter_type pT()
Data structure for fit of straight line in positive z-direction.
static parameter_type pDY()
static parameter_type pDX()
JAxis3D & rotate(const JRotation3D &R)
Rotate axis.
int getID() const
Get identifier.
void invert()
Invert matrix.
Utility class to parse command line options.
Auxiliary class for a hit with background rate value.
General purpose class for object reading from a list of file names.
General purpose class for parallel reading of objects from a single file or multiple files.
File router for fast addressing of summary data.
void update(const JDAQHeader &header)
Update router.
double getRate(const JDAQPMTIdentifier &id) const
Get rate.
unsigned char JTOT_t
time over threshold [ns]
static const int JSTART_ZMAX_M
end position of track see JRECONSTRUCTION::JMuonStart
static const int JSTART_LENGTH_METRES
distance between projected positions on the track of optical modules for which the response does not ...
static const int JSTART_ZMIN_M
start position of track see JRECONSTRUCTION::JMuonStart
JDirection3D getDirection(const Vec &dir)
Get direction.
JPosition3D getPosition(const Vec &pos)
Get position.
JTOOLS::JRange< double > JTimeRange
Type definition for time range (unit [s]).
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
void store(const std::string &file_name, const JDetector &detector)
Store detector to output file.
std::set< int > getStringIDs(const JDetector &detector)
Get list of strings identifiers.
const double TIME_OVER_THRESHOLD_NS
Specification for time-over-threshold corresponding to a one photo-electron pulse.
std::set< int > getModuleIDs(const JDetector &detector, const bool option=false)
Get list of modules identifiers.
JTOOLS::JRange< double > JZRange
const array_type< JValue_t > & get_values(const std::map< JKey_t, JValue_t, JComparator_t, JAllocator_t > &data)
Method to create array of values of map.
std::iterator_traits< T >::value_type getAverage(T __begin, T __end)
Get average.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
std::vector< JHitW0 > buffer_type
hits
void copy(const JFIT::JEvt::const_iterator __begin, const JFIT::JEvt::const_iterator __end, Evt &out)
Copy tracks.
bool qualitySorter(const JFit &first, const JFit &second)
Comparison of fit results.
JLANG::JSTDObjectReader< const event_type > input_type
std::vector< event_type > data_type
JFIT::JRegressor< JFIT::JLine3Z, JFIT::JGandalf > JRegressor_t
std::set< int > getTimeOverThresholdIDs()
Get list of time-over-threshold identifiers.
JFIT::JRegressorStorage< JFIT::JLine3Z, JFIT::JGandalf > JRegressorStorage_t
std::map< int, buffer_type > map_type
identifier -> hits
Long64_t counter_type
Type definition for counter.
JTRIGGER::JTimeSlewing_t getTimeSlewing
Function object to get time-slewing correction.
KM3NeT DAQ data structures and auxiliaries.
static const int NUMBER_OF_PMTS
Total number of PMTs in module.
Auxiliary data structure for sequence of same character.
Auxiliary data structure for floating point format specification.
Data structure for measured coincidence rates of all pairs of PMTs in optical module.
Dynamic detector calibration.
size_t numberOfIterations
Auxiliary class to test history.
Auxiliary class to match data points with given model.
Auxiliary data structure for editable parameter.
Auxiliary data structure for fit parameter.
Template data structure for storage of internal data.
Template definition of a data regressor of given model.
virtual const pointer_type & next() override
Get next element.
virtual bool hasNext() override
Check availability of next element.
Implementation of object iteration from STD container.
Auxiliary data structure for average.
void put(const double x)
Put value.
double getMean() const
Get mean value.
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Auxiliary class for editing time offset.
double t0
time offset [ns]
JEditor(data_type &data, const int id)
Constructor.
virtual void apply(const double step) override
Apply step.
Data structure for fit parameters.
double TTS_ns
transition-time spread [ns]
double TMin_ns
minimal time w.r.t. Cherenkov hypothesis [ns]
double roadWidth_m
road width [m]
double TMax_ns
maximal time w.r.t. Cherenkov hypothesis [ns]
double VMax_npe
maximum number of of photo-electrons
double ZMax_m
maximal z-positon [m]
double ZMin_m
minimal z-positon [m]
int NMax
maximum number of iterations
double R_Hz
default rate [Hz]
Auxiliary data structure for chi2 function object.
const JRegressorStorage_t & storage
double operator()(const int option) const
Get chi2.
Thread pool for fits to data.
std::vector< std::thread > workers
std::condition_variable cv
static JMATH::JQuantile_t Q
JPerth(const JRegressorStorage_t &storage, const data_type &data, const size_t ns, const int option)
Constructor.
Auxiliary data structure to store data and fit in memory.
Auxiliary class for defining the range of iterations of objects.
static counter_type max()
Get maximum counter value.
Auxiliary data structure for sorting of hits.