1#ifndef __JCALIBRATE_JGANDALFK40__ 
    2#define __JCALIBRATE_JGANDALFK40__ 
   42  using KM3NETDAQ::NUMBER_OF_PMTS;
 
  102    public std::map<pair_type, std::vector<rate_type> >
 
 
  110    public JMath<JParameter_t>
 
  322    void setRange(
const double xmin, 
const double xmax)
 
  324      const double x = 
get();
 
 
  391    operator double()
 const 
 
  420      return in >> 
object.value;
 
 
  435      out << 
FIXED(12,6) <<  
object.get()                       << 
' ' 
  436          << setw(5)     << (
object.isFixed() ? 
"fixed" : 
" ")  << 
' ';
 
  439        out << 
"[" << 
FIXED(12,6) << 
object.range.getLowerLimit() << 
"," << 
FIXED(12,6) << 
object.range.getUpperLimit() << 
"]";
 
 
 
  483      parameters.
QE .
set(1.0);
 
  485      parameters.
t0 .
set(0.0);
 
  486      parameters.
bg .
set(0.0);
 
 
  513      if (
QE .isFree()) { 
QE .
set(parameters.
QE); }
 
  515      if (
t0 .isFree()) { 
t0 .
set(parameters.
t0); }
 
  516      if (
bg .isFree()) { 
bg .
set(parameters.
bg); }
 
 
  527      return ((
QE. isFree() ? 1 : 0) +
 
 
  542      if (!(this->*p).isFree()) {
 
 
  596      out << 
"QE  " << 
FIXED(7,3) << 
object.QE  << endl;
 
  597      out << 
"TTS " << 
FIXED(7,3) << 
object.TTS << endl;
 
  598      out << 
"t0  " << 
FIXED(7,3) << 
object.t0  << endl;
 
  599      out << 
"bg  " << 
FIXED(7,3) << 
object.bg  << endl;
 
 
 
  674      out << 
"Rate [Hz] " << 
FIXED(12,6) << 
object.R  << endl;
 
  675      out << 
"p1        " << 
FIXED(12,6) << 
object.p1 << endl;
 
  676      out << 
"p2        " << 
FIXED(12,6) << 
object.p2 << endl;
 
  677      out << 
"p3        " << 
FIXED(12,6) << 
object.p3 << endl;
 
  678      out << 
"p4        " << 
FIXED(12,6) << 
object.p4 << endl;
 
  679      out << 
"cc        " << 
FIXED(12,6) << 
object.cc << endl;
 
  680      out << 
"bc        " << 
FIXED(12,6) << 
object.bc << endl;
 
 
 
  721      parameters.
R .
set(18.460546);
 
  722      parameters.
p1.
set( 3.0767);
 
  723      parameters.
p2.
set(-1.2078);
 
  724      parameters.
p3.
set( 0.9905);
 
  725      parameters.
p4.
set( 0.9379);
 
  726      parameters.
cc.
set( 0.0);
 
  727      parameters.
bc.
set( 0.0);
 
 
  740      return ((
R .isFree() ? 1 : 0) +
 
 
  758      if (!(this->*p).isFree()) {
 
 
  799      const double ct2   = ct * ct;
 
 
 
  837      out << static_cast<const JK40Parameters&>(
object);
 
  839      for (
int i = 0; i != NUMBER_OF_PMTS; ++i) {
 
  840        out << 
"PMT[" << 
FILL(2,
'0') << i << 
FILL() << 
"]." << 
object.parameters[i].status << endl << 
object.parameters[i];
 
 
 
  904      for (
int i = 0; i != NUMBER_OF_PMTS; ++i) {
 
  908      for (JTDC_t::const_iterator i = TDC.first; i != TDC.second; ++i) {
 
  912          this->parameters[i->second].t0.fix();
 
  916          for (
int i = 0; i != NUMBER_OF_PMTS; ++i) {
 
  917            this->parameters[i].t0.fix();
 
 
  941      for (
int i = 0; i != NUMBER_OF_PMTS; ++i) {
 
 
  975        for (
int i = 0; i != NUMBER_OF_PMTS; ++i) {
 
  985        for (
int i = 0; i != NUMBER_OF_PMTS; ++i) {
 
 1009        for (
int i = 0; i != NUMBER_OF_PMTS; ++i) {
 
 1021        for (
int i = 0; i != NUMBER_OF_PMTS; ++i) {
 
 
 1059      for (
int i = 0; i != NUMBER_OF_PMTS; ++i) {
 
 
 1088        for (
int i = 0; i != NUMBER_OF_PMTS; ++i) {
 
 
 1114      for (
int i = 0; i != NUMBER_OF_PMTS; ++i) {
 
 
 1132      for (
int i = 0; i != pmt; ++i) {
 
 
 1186                         pair.second == this->index  ?  +this->parameters[
pair.first ].t0()  :
 
 1187                         this->parameters[
pair.first].t0() - this->parameters[
pair.second].t0());
 
 1190                              this->parameters[
pair.second].TTS() * this->parameters[
pair.second].TTS()  +
 
 1191                              this->getSigmaK40()                 * this->getSigmaK40());
 
 1200      const double z1 = (*this)[
pair.first ].getDirection().getDZ();
 
 1201      const double z2 = (*this)[
pair.second].getDirection().getDZ();
 
 1205          signbit(z1) != signbit(z2)) {
 
 
 1223      using namespace std;
 
 1224      using namespace JPP;
 
 1231      const double R2  = bell.
getValue(dt_ns);
 
 
 1245      using namespace std;
 
 1246      using namespace JPP;
 
 
 1266      using namespace std;
 
 1268      out << 
"Module    " << setw(10)  << 
object.getID() << endl;
 
 1269      out << 
"option    " << 
object.option << endl;
 
 1270      out << 
"index     " << 
object.index  << endl;
 
 1272      out << static_cast<const JModel_t&>(
object);
 
 
 
 1311      using namespace JPP;
 
 
 1325      using namespace std;
 
 1326      using namespace JPP;
 
 1337      double xmax = numeric_limits<double>::lowest();
 
 1338      double xmin = numeric_limits<double>::max();
 
 1342      for (data_type::const_iterator ix = data.begin(); ix != data.end(); ++ix) {
 
 1349          ndf += ix->second.size();
 
 1351          for (
const rate_type& iy : ix->second) {
 
 1361        return { 0.0, ndf };
 
 1364      for (
int pmt = 0; pmt != NUMBER_OF_PMTS; ++pmt) {
 
 1373      double precessor = numeric_limits<double>::max();
 
 1415        if (
debug >= debug_t) {
 
 1426          for (
int pmt = 0; pmt != NUMBER_OF_PMTS; ++pmt) {
 
 1436        for (
size_t i = 0; i != N; ++i) {
 
 1442          h[i] = 1.0 / sqrt(
V(i,i));
 
 1447        for (
size_t i = 0; i != N; ++i) {
 
 1448          for (
size_t j = 0; j != i; ++j) {
 
 1449            V(j,i) *= 
h[i] * 
h[j];
 
 1454        for (
size_t i = 0; i != N; ++i) {
 
 1460        for (
size_t col = 0; col != N; ++col) {
 
 1467        catch (
const exception& 
error) {
 
 1469          ERROR(
"JGandalf: " << 
error.what() << endl << 
V << endl);
 
 1476        const double factor = 2.0;
 
 1488        for (
int pmt = 0; pmt != NUMBER_OF_PMTS; ++pmt) {
 
 1498      return { precessor / 
estimator->getRho(1.0), ndf };
 
 
 1508    static constexpr double PIVOT              = std::numeric_limits<double>::epsilon();  
 
 1527      using namespace std;
 
 1528      using namespace JPP;
 
 1544          R  = model.getIndex(&JK40Parameters_t::R);
 
 1545          p1 = model.getIndex(&JK40Parameters_t::p1);
 
 1546          p2 = model.getIndex(&JK40Parameters_t::p2);
 
 1547          p3 = model.getIndex(&JK40Parameters_t::p3);
 
 1548          p4 = model.getIndex(&JK40Parameters_t::p4);
 
 1549          cc = model.getIndex(&JK40Parameters_t::cc);
 
 1550          bc = model.getIndex(&JK40Parameters_t::bc);
 
 1567        I_t(
const JModel& model, 
const int pmt) :
 
 1573          const int index = model.getIndex(pmt);
 
 1577          if (model.parameters[pmt].QE .isFree()) { QE  = index + N; ++N; }
 
 1578          if (model.parameters[pmt].TTS.isFree()) { TTS = index + N; ++N; }
 
 1579          if (model.parameters[pmt].t0 .isFree()) { t0  = index + N; ++N; }
 
 1580          if (model.parameters[pmt].bg .isFree()) { bg  = index + N; ++N; }
 
 1594      for (data_type::const_iterator ix = data.begin(); ix != data.end(); ++ix) {
 
 1611          for (
const rate_type& iy : ix->second) {
 
 1616            const double  R   = real.bc  +  real.
background  +  
R1 * (real.cc + R2);
 
 1641            for (buffer_type::const_iterator row = buffer.begin(); row != buffer.end(); ++row) {
 
 1643              Y[row->first] += row->second;
 
 1645              V[row->first][row->first] += row->second * row->second;
 
 1647              for (buffer_type::const_iterator col = buffer.begin(); col != row; ++col) {
 
 1648                V[row->first][col->first] += row->second * col->second;
 
 1649                V[col->first][row->first]  = 
V[row->first][col->first];
 
 
 1665      using namespace std;
 
 1674      catch (
const exception& 
error) {}
 
 1676#define SQRT(X) (X >= 0.0 ? sqrt(X) : std::numeric_limits<double>::max()) 
 1688      for (
int pmt = 0; pmt != NUMBER_OF_PMTS; ++pmt) {
 
 
 
JDAQPMTIdentifier PMT
Command line options.
 
KM3NeT DAQ constants, bit handling, etc.
 
#define THROW(JException_t, A)
Marco for throwing exception with std::ostream compatible message.
 
Maximum likelihood estimator (M-estimators).
 
Base class for data structures with artithmetic capabilities.
 
General purpose messaging.
 
#define DEBUG(A)
Message macros.
 
Data structure for optical module.
 
Auxiliary class to define a range between two values.
 
std::shared_ptr< JMEstimator > estimator_type
 
static constexpr double LAMBDA_MIN
minimal value control parameter
 
static constexpr double LAMBDA_DOWN
multiplication factor control parameter
 
result_type operator()(const data_type &data)
Fit.
 
void seterr(const data_type &data)
Set errors.
 
static constexpr double LAMBDA_MAX
maximal value control parameter
 
static constexpr double LAMBDA_UP
multiplication factor control parameter
 
static constexpr double EPSILON
maximal distance to minimum.
 
JFit(const int option, const int debug)
Constructor.
 
void evaluate(const data_type &data)
Evaluation of fit.
 
static constexpr int MAXIMUM_ITERATIONS
maximal number of iterations.
 
static constexpr double PIVOT
minimal value diagonal element of matrix
 
estimator_type estimator
M-Estimator function.
 
Auxiliary class for fit parameter with optional limits.
 
JParameter_t & mul(const double factor)
Scale parameter.
 
void set(const double value)
Set value.
 
void fix()
Fix current value.
 
JParameter_t & sub(const JParameter_t ¶meter)
Subtract parameter.
 
JParameter_t & operator=(double value)
Assignment operator.
 
bool isFree() const
Check if parameter is free.
 
friend std::ostream & operator<<(std::ostream &out, const JParameter_t &object)
Write parameter to output stream.
 
friend std::istream & operator>>(std::istream &in, JParameter_t &object)
Read parameter from input stream.
 
JParameter_t & div(const double factor)
Scale parameter.
 
JParameter_t & mul(const JParameter_t &first, const JParameter_t &second)
Scale parameter.
 
double operator()() const
Type conversion operator.
 
void set()
Set current value.
 
JParameter_t(const double value, const range_type &range=range_type::DEFAULT_RANGE())
Constructor.
 
void setRange(const double xmin, const double xmax)
Set range.
 
JParameter_t & negate()
Negate parameter.
 
JParameter_t()
Default constructor.
 
bool atLimit(const double precision) const
Check if parameter is at limit;.
 
JTOOLS::JRange< double > range_type
Type definition for range of parameter values.
 
double getDerivative() const
Get derivative of value.
 
JParameter_t & add(const JParameter_t ¶meter)
Add parameter.
 
void fix(const double value)
Fix value.
 
double get() const
Get value.
 
bool isBound() const
Check if parameter is bound.
 
bool isFixed() const
Check if parameter is fixed.
 
Data structure for a composite optical module.
 
Exception for accessing a value in a collection that is outside of its range.
 
Auxiliary classes and methods for PMT calibration.
 
static double TEROSTAT_R1
scaling factor
 
static const int INVALID_INDEX
invalid index
 
@ FIT_PMTS_QE_FIXED_t
fit parameters of PMTs with QE fixed
 
@ FIT_PMTS_AND_ANGULAR_DEPENDENCE_t
fit parameters of PMTs and angular dependence of K40 rate
 
@ FIT_MODEL_t
fit parameters of K40 rate and TTSs of PMTs
 
@ FIT_PMTS_AND_BACKGROUND_t
fit parameters of PMTs and background
 
@ FIT_PMTS_t
fit parameters of PMTs
 
static double TEROSTAT_DZ
maximal PMT inclination
 
static double BELL_SHAPE
Bell shape.
 
double getDot(const JFirst_t &first, const JSecond_t &second)
Get dot product of objects.
 
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
 
Auxiliary data structure for sequence of same character.
 
Auxiliary data structure for floating point format specification.
 
PMT combinatorics for optical module.
 
Fit parameters for two-fold coincidence rate due to K40.
 
JParameter_t bc
constant background
 
JParameter_t R
maximal coincidence rate [Hz]
 
JParameter_t p1
1st order angle dependence coincidence rate
 
JParameter_t p2
2nd order angle dependence coincidence rate
 
friend std::ostream & operator<<(std::ostream &out, const JK40Parameters_t &object)
Write model parameters to output stream.
 
JParameter_t p3
3rd order angle dependence coincidence rate
 
const JK40Parameters_t & getK40Parameters() const
Get K40 parameters.
 
JParameter_t p4
4th order angle dependence coincidence rate
 
JParameter_t cc
fraction of signal correlated background
 
JK40Parameters_t()
Default constructor.
 
void setK40Parameters(const JK40Parameters_t ¶meters)
Set K40 parameters.
 
Fit parameters for two-fold coincidence rate due to K40.
 
size_t getN() const
Get number of fit parameters.
 
const JK40Parameters_t & getGradient(const double ct) const
Get gradient.
 
JK40Parameters_t gradient
 
static const JK40Parameters & getInstance()
Get default values.
 
int getIndex(JParameter_t JK40Parameters::*p) const
Get index of parameter.
 
double getValue(const double ct) const
Get K40 coincidence rate as a function of cosine angle between PMT axes.
 
JK40Parameters()
Default constructor.
 
Auxiliary data structure for derived quantities of a given PMT pair.
 
double signal
combined signal
 
double sigma
total width [ns]
 
double cc
correlated background
 
double background
combined background
 
double t0
time offset [ns]
 
double bc
uncorrelated background
 
double ct
cosine angle between PMT axes
 
friend std::ostream & operator<<(std::ostream &out, const JModel_t &object)
Write model parameters to output stream.
 
JPMTParameters_t parameters[NUMBER_OF_PMTS]
 
JModel()
Default constructor.
 
int getIndex(int pmt, JParameter_t JPMTParameters_t::*p) const
Get index of parameter.
 
friend std::ostream & operator<<(std::ostream &out, const JModel &object)
Write model parameters to output stream.
 
int getIndex(int pmt) const
Get index of parameter.
 
size_t getN() const
Get number of fit parameters.
 
double getValue(const pair_type &pair) const
Get K40 coincidence rate.
 
double sigmaK40_ns
intrinsic K40 arrival time spread [ns]
 
JOption_t getOption() const
Get fit option.
 
double getFixedTimeOffset() const
Get time offset.
 
void setSigmaK40(const double sigma)
Set intrinsic K40 arrival time spread.
 
int getIndex() const
Get index of PMT used for fixed time offset.
 
double getSigmaK40() const
Get intrinsic K40 arrival time spread.
 
void setOption(const int option)
Set fit option.
 
const real_type & getReal(const pair_type &pair) const
Get derived quantities.
 
JModel(const JModule &module, const JK40Parameters ¶meters)
Constructor.
 
double getValue(const pair_type &pair, const double dt_ns) const
Get K40 coincidence rate.
 
void setIndex()
Set index of PMT used for fixed time offset.
 
JModel(const JModule &module, const JK40Parameters ¶meters, const JTDC_t::range_type &TDC, const int option)
Constructor.
 
bool hasFixedTimeOffset() const
Check if time offset is fixed.
 
int index
index of PMT used for fixed time offset
 
Fit parameters for single PMT.
 
static constexpr double QE_MIN
minimal QE
 
friend std::ostream & operator<<(std::ostream &out, const JPMTParameters_t &object)
Write PMT parameters to output stream.
 
JParameter_t t0
time offset [ns]
 
static constexpr double TTS_NS
start value transition-time spread [ns]
 
JParameter_t TTS
transition-time spread [ns]
 
void disable()
Disable PMT.
 
size_t getN() const
Get number of fit parameters.
 
JPMTParameters_t()
Default constructor.
 
void set(const JPMTParameters_t ¶meters)
Set parameters that are free to given values.
 
JParameter_t bg
background [Hz/ns]
 
static constexpr double QE_MAX
maximal QE
 
int getIndex(JParameter_t JPMTParameters_t::*p) const
Get index of parameter.
 
static const JPMTParameters_t & getInstance()
Get default values.
 
JParameter_t QE
relative quantum efficiency [unit]
 
Data structure for measured coincidence rates of all pairs of PMTs in optical module.
 
Data structure for measured coincidence rate of pair of PMTs.
 
rate_type(double dt_ns, double value, double error)
Constructor.
 
double error
error of rate [Hz/ns]
 
double value
value of rate [Hz/ns]
 
rate_type()
Default constructor.
 
double dt_ns
time difference [ns]
 
Interface for maximum likelihood estimator (M-estimator).
 
const JBell_t & getGradient(const double x) const
Get gradient.
 
double getValue(const double x) const
Function value.
 
Auxiliary base class for aritmetic operations of derived class types.
 
void resize(const size_t size)
Resize matrix.
 
JMatrixND & reset()
Set matrix to the null matrix.
 
void solve(JVectorND_t &u)
Get solution of equation A x = b.
 
void invert()
Invert matrix according LDU decomposition.