Jpp 21.0.0-rc.1-88-g0130508c4
the software that should make you happy
Loading...
Searching...
No Matches
JCALIBRATE::JFit Class Reference

Fit. More...

#include <JFitK40.hh>

Classes

struct  result_type
 Result type. More...
 

Public Types

typedef std::shared_ptr< JMEstimatorestimator_type
 

Public Member Functions

 JFit (const int option, const int debug)
 Constructor.
 
result_type operator() (const data_type &data)
 Fit.
 

Public Attributes

int debug
 
estimator_type estimator
 M-Estimator function.
 
double lambda
 
JModel value
 
JModel_t error
 
int numberOfIterations
 
JMATH::JMatrixNS V
 
bool TEST = false
 

Static Public Attributes

static constexpr int MAXIMUM_ITERATIONS = 100000
 maximal number of iterations.
 
static constexpr double EPSILON = 1.0e-3
 maximal distance to minimum.
 
static constexpr double LAMBDA_MIN = 1.0e-2
 minimal value control parameter
 
static constexpr double LAMBDA_MAX = 1.0e+4
 maximal value control parameter
 
static constexpr double LAMBDA_UP = 10.0
 multiplication factor control parameter
 
static constexpr double LAMBDA_DOWN = 10.0
 multiplication factor control parameter
 
static constexpr double PIVOT = std::numeric_limits<double>::epsilon()
 minimal value diagonal element of matrix
 

Private Member Functions

void evaluate (const data_type &data)
 Evaluation of fit.
 
void seterr (const data_type &data)
 Set errors.
 

Private Attributes

JMATH::JVectorND Y
 
double successor
 
JModel previous
 
std::vector< double > h
 

Detailed Description

Fit.

Definition at line 1631 of file JFitK40.hh.

Member Typedef Documentation

◆ estimator_type

Definition at line 1642 of file JFitK40.hh.

Constructor & Destructor Documentation

◆ JFit()

JCALIBRATE::JFit::JFit ( const int option,
const int debug )
inline

Constructor.

Parameters
optionM-estimator
debugdebug

Definition at line 1651 of file JFitK40.hh.

1651 :
1652 debug(debug)
1653 {
1654 using namespace JPP;
1655
1656 estimator.reset(getMEstimator(option));
1657 }
estimator_type estimator
M-Estimator function.
Definition JFitK40.hh:1862
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).

Member Function Documentation

◆ operator()()

result_type JCALIBRATE::JFit::operator() ( const data_type & data)
inline

Fit.

Parameters
datadata
Returns
chi2, NDF

Definition at line 1666 of file JFitK40.hh.

1667 {
1668 using namespace std;
1669 using namespace JPP;
1670
1671
1672 value.setIndex();
1673
1674 const size_t N = value.getN();
1675
1676 V.resize(N);
1677 Y.resize(N);
1678 h.resize(N);
1679
1680 double xmax = numeric_limits<double>::lowest();
1681 double xmin = numeric_limits<double>::max();
1682
1683 int ndf = 0;
1684
1685 for (data_type::const_iterator ix = data.begin(); ix != data.end(); ++ix) {
1686
1687 const pair_type& pair = ix->first;
1688
1689 if (value.parameters[pair.first ].status &&
1690 value.parameters[pair.second].status) {
1691
1692 ndf += ix->second.size();
1693
1694 for (const rate_type& iy : ix->second) {
1695 if (iy.dt_ns > xmax) { xmax = iy.dt_ns; }
1696 if (iy.dt_ns < xmin) { xmin = iy.dt_ns; }
1697 }
1698 }
1699 }
1700
1701 ndf -= value.getN();
1702
1703 if (ndf < 0) {
1704 return { 0.0, ndf };
1705 }
1706
1707 for (int pmt = 0; pmt != NUMBER_OF_PMTS; ++pmt) {
1708 if (value.parameters[pmt].t0.isFree()) {
1709 value.parameters[pmt].t0.setLimits(xmin, xmax);
1710 }
1711 }
1712
1713
1715
1716 double precessor = numeric_limits<double>::max();
1717
1719
1720 DEBUG("step: " << numberOfIterations << endl);
1721
1722 evaluate(data);
1723
1724 DEBUG("lambda: " << FIXED(12,5) << lambda << endl);
1725 DEBUG("chi2: " << FIXED(12,3) << successor << endl);
1726
1727 if (successor < precessor) {
1728
1729 if (numberOfIterations != 0) {
1730
1731 if (fabs(precessor - successor) < EPSILON) {
1732
1733 seterr(data);
1734
1735 return { successor / estimator->getRho(1.0), ndf };
1736 }
1737
1738 if (lambda > LAMBDA_MIN) {
1740 }
1741 }
1742
1743 precessor = successor;
1744 previous = value;
1745
1746 } else {
1747
1748 value = previous;
1749 lambda *= LAMBDA_UP;
1750
1751 if (lambda > LAMBDA_MAX) {
1752 break;
1753 }
1754
1755 evaluate(data);
1756 }
1757
1758 if (debug >= debug_t) {
1759
1760 size_t row = 0;
1761
1762 if (value.model.R .isFree()) { cout << "R " << FIXED(12,5) << Y[row] << endl; ++row; }
1763 if (value.model.p1.isFree()) { cout << "p1 " << FIXED(12,5) << Y[row] << endl; ++row; }
1764 if (value.model.p2.isFree()) { cout << "p2 " << FIXED(12,5) << Y[row] << endl; ++row; }
1765 if (value.model.p3.isFree()) { cout << "p3 " << FIXED(12,5) << Y[row] << endl; ++row; }
1766 if (value.model.p4.isFree()) { cout << "p4 " << FIXED(12,5) << Y[row] << endl; ++row; }
1767 if (value.model.cc.isFree()) { cout << "cc " << FIXED(12,3) << Y[row] << endl; ++row; }
1768
1769 for (int i = 0; i != NUMBER_OF_RINGS; ++i) {
1770 if (value.transmittance[i].isFree()) { cout << "transmittance[" << ring_type::getRing(i) << "] " << FIXED(9,6) << Y[row] << endl; ++row; }
1771 }
1772
1773 for (int pmt = 0; pmt != NUMBER_OF_PMTS; ++pmt) {
1774 if (value.parameters[pmt].QE .isFree()) { cout << "PMT[" << setw(2) << pmt << "].QE " << FIXED(12,5) << Y[row] << endl; ++row; }
1775 if (value.parameters[pmt].TTS.isFree()) { cout << "PMT[" << setw(2) << pmt << "].TTS " << FIXED(12,5) << Y[row] << endl; ++row; }
1776 if (value.parameters[pmt].t0 .isFree()) { cout << "PMT[" << setw(2) << pmt << "].t0 " << FIXED(12,5) << Y[row] << endl; ++row; }
1777 if (value.parameters[pmt].bg .isFree()) { cout << "PMT[" << setw(2) << pmt << "].bg " << FIXED(12,5) << Y[row] << endl; ++row; }
1778 }
1779 }
1780
1781 // force definite positiveness
1782
1783 for (size_t i = 0; i != N; ++i) {
1784
1785 if (V(i,i) < PIVOT) {
1786 V(i,i) = PIVOT;
1787 }
1788
1789 h[i] = 1.0 / sqrt(V(i,i));
1790 }
1791
1792 // normalisation
1793
1794 for (size_t i = 0; i != N; ++i) {
1795 for (size_t j = 0; j != i; ++j) {
1796 V(j,i) *= h[i] * h[j];
1797 V(i,j) = V(j,i);
1798 }
1799 }
1800
1801 for (size_t i = 0; i != N; ++i) {
1802 V(i,i) = 1.0 + lambda;
1803 }
1804
1805 // solve A x = b
1806
1807 for (size_t col = 0; col != N; ++col) {
1808 Y[col] *= h[col];
1809 }
1810
1811 try {
1812 V.solve(Y);
1813 }
1814 catch (const exception& error) {
1815
1816 ERROR("JGandalf: " << error.what() << endl << V << endl);
1817
1818 break;
1819 }
1820
1821 // update value
1822
1823 const double factor = 2.0;
1824
1825 size_t row = 0;
1826
1827 if (value.model.R .isFree()) { value.model.R -= factor * h[row] * Y[row]; ++row; }
1828 if (value.model.p1.isFree()) { value.model.p1 -= factor * h[row] * Y[row]; ++row; }
1829 if (value.model.p2.isFree()) { value.model.p2 -= factor * h[row] * Y[row]; ++row; }
1830 if (value.model.p3.isFree()) { value.model.p3 -= factor * h[row] * Y[row]; ++row; }
1831 if (value.model.p4.isFree()) { value.model.p4 -= factor * h[row] * Y[row]; ++row; }
1832 if (value.model.cc.isFree()) { value.model.cc -= factor * h[row] * Y[row]; ++row; }
1833 if (value.model.bc.isFree()) { value.model.bc -= factor * h[row] * Y[row]; ++row; }
1834
1835 for (int i = 0; i != NUMBER_OF_RINGS; ++i) {
1836 if (value.transmittance[i].isFree()) { value.transmittance[i] -= factor * h[row] * Y[row]; ++row; }
1837 }
1838
1839 for (int pmt = 0; pmt != NUMBER_OF_PMTS; ++pmt) {
1840 if (value.parameters[pmt].QE .isFree()) { value.parameters[pmt].QE -= factor * h[row] * Y[row]; ++row; }
1841 if (value.parameters[pmt].TTS.isFree()) { value.parameters[pmt].TTS -= factor * h[row] * Y[row]; ++row; }
1842 if (value.parameters[pmt].t0 .isFree()) { value.parameters[pmt].t0 -= factor * h[row] * Y[row]; ++row; }
1843 if (value.parameters[pmt].bg .isFree()) { value.parameters[pmt].bg -= factor * h[row] * Y[row]; ++row; }
1844 }
1845 }
1846
1847 seterr(data);
1848
1849 return { precessor / estimator->getRho(1.0), ndf };
1850 }
#define DEBUG(A)
Message macros.
Definition JMessage.hh:62
#define ERROR(A)
Definition JMessage.hh:66
std::vector< double > h
Definition JFitK40.hh:2198
static constexpr double LAMBDA_MIN
minimal value control parameter
Definition JFitK40.hh:1855
static constexpr double LAMBDA_DOWN
multiplication factor control parameter
Definition JFitK40.hh:1858
void seterr(const data_type &data)
Set errors.
Definition JFitK40.hh:2155
static constexpr double LAMBDA_MAX
maximal value control parameter
Definition JFitK40.hh:1856
static constexpr double LAMBDA_UP
multiplication factor control parameter
Definition JFitK40.hh:1857
JMATH::JMatrixNS V
Definition JFitK40.hh:1868
static constexpr double EPSILON
maximal distance to minimum.
Definition JFitK40.hh:1854
void evaluate(const data_type &data)
Evaluation of fit.
Definition JFitK40.hh:1878
static constexpr int MAXIMUM_ITERATIONS
maximal number of iterations.
Definition JFitK40.hh:1853
static constexpr double PIVOT
minimal value diagonal element of matrix
Definition JFitK40.hh:1859
JMATH::JVectorND Y
Definition JFitK40.hh:2195
bool isFree() const
Check if parameter is free.
Definition JFitK40.hh:247
void setLimits(const double xmin, const double xmax)
Set limits.
Definition JFitK40.hh:329
static const int NUMBER_OF_RINGS
number of rings in optical module.
Definition JFitK40.hh:63
int j
Definition JPolint.hh:801
Auxiliary data structure for floating point format specification.
Definition JManip.hh:448
JParameter_t bc
constant background
Definition JFitK40.hh:717
JParameter_t R
maximal coincidence rate [Hz]
Definition JFitK40.hh:711
JParameter_t p1
1st order angle dependence coincidence rate
Definition JFitK40.hh:712
JParameter_t p2
2nd order angle dependence coincidence rate
Definition JFitK40.hh:713
JParameter_t p3
3rd order angle dependence coincidence rate
Definition JFitK40.hh:714
JParameter_t p4
4th order angle dependence coincidence rate
Definition JFitK40.hh:715
JParameter_t cc
fraction of signal correlated background
Definition JFitK40.hh:716
JTransmittance transmittance
Definition JFitK40.hh:1164
JK40Parameters model
Definition JFitK40.hh:1163
JPMTParameters_t parameters[NUMBER_OF_PMTS]
Definition JFitK40.hh:1165
size_t getN() const
Get number of fit parameters.
Definition JFitK40.hh:1486
void setIndex()
Set index of PMT used for fixed time offset.
Definition JFitK40.hh:1460
JParameter_t t0
time offset [ns]
Definition JFitK40.hh:605
JParameter_t TTS
transition-time spread [ns]
Definition JFitK40.hh:604
JParameter_t bg
background [Hz/ns]
Definition JFitK40.hh:606
JParameter_t QE
relative quantum efficiency [unit]
Definition JFitK40.hh:603
Data structure for measured coincidence rate of pair of PMTs.
Definition JFitK40.hh:73
double dt_ns
time difference [ns]
Definition JFitK40.hh:99
static ring_type getRing(const int index)
Get ring.
Definition JFitK40.hh:941
void resize(const size_t size)
Resize matrix.
Definition JMatrixND.hh:446
void solve(JVectorND_t &u)
Get solution of equation A x = b.
Definition JMatrixNS.hh:308
Data structure for a pair of indices.

◆ evaluate()

void JCALIBRATE::JFit::evaluate ( const data_type & data)
inlineprivate

Evaluation of fit.

Parameters
datadata

Definition at line 1878 of file JFitK40.hh.

1879 {
1880 using namespace std;
1881 using namespace JPP;
1882
1883 typedef JModel::real_type real_type;
1884
1885
1886 successor = 0.0;
1887
1888 V.reset();
1889 Y.reset();
1890
1891
1892 // model parameter indices
1893
1894 const struct M_t {
1895 M_t(const JModel& value)
1896 {
1897 R = value.model.getIndex(&JK40Parameters_t::R);
1898 p1 = value.model.getIndex(&JK40Parameters_t::p1);
1899 p2 = value.model.getIndex(&JK40Parameters_t::p2);
1900 p3 = value.model.getIndex(&JK40Parameters_t::p3);
1901 p4 = value.model.getIndex(&JK40Parameters_t::p4);
1902 cc = value.model.getIndex(&JK40Parameters_t::cc);
1903 bc = value.model.getIndex(&JK40Parameters_t::bc);
1904 }
1905
1906 int R;
1907 int p1;
1908 int p2;
1909 int p3;
1910 int p4;
1911 int cc;
1912 int bc;
1913
1914 } M(value);
1915
1916
1917 // transmittance indices
1918
1919 const struct T_t : public std::array<int, NUMBER_OF_RINGS> {
1920 T_t(const JModel& value)
1921 {
1922 for (int i = 0; i != NUMBER_OF_RINGS; ++i) {
1923 (*this)[i] = INVALID_INDEX;
1924 }
1925
1926 int N = value.model.getN();
1927
1928 for (int i = 0; i != NUMBER_OF_RINGS; ++i) {
1929 if (value.transmittance[i].isFree()) { (*this)[i] = N; ++N; }
1930 }
1931 }
1932 } T(value);
1933
1934
1935 // PMT parameter indices
1936
1937 struct i_t {
1938 i_t() :
1939 QE (INVALID_INDEX),
1940 TTS(INVALID_INDEX),
1941 t0 (INVALID_INDEX),
1942 bg (INVALID_INDEX)
1943 {}
1944
1945 int QE;
1946 int TTS;
1947 int t0;
1948 int bg;
1949 };
1950
1951 const struct I_t : public std::array<i_t, NUMBER_OF_PMTS> {
1952 I_t(const JModel& value)
1953 {
1954 int N = value.model.getN() + value.transmittance.getN();
1955
1956 for (int i = 0; i != NUMBER_OF_PMTS; ++i) {
1957 if (value.parameters[i].QE .isFree()) { (*this)[i].QE = N; ++N; }
1958 if (value.parameters[i].TTS.isFree()) { (*this)[i].TTS = N; ++N; }
1959 if (value.parameters[i].t0 .isFree()) { (*this)[i].t0 = N; ++N; }
1960 if (value.parameters[i].bg .isFree()) { (*this)[i].bg = N; ++N; }
1961 }
1962 }
1963
1964 } I(value);
1965
1966
1967 struct buffer_type : public vector< pair<int, double> > {
1968 double operator[](const int index) const
1969 {
1970 for (const_iterator i = this->begin(); i != this->end(); ++i) {
1971 if (i->first == index) {
1972 return i->second;
1973 }
1974 }
1975
1976 THROW(JValueOutOfRange, "Invalid index " << index);
1977 }
1978 };
1979
1980 buffer_type buffer;
1981
1982#define PUSH_BACK(i,v) if (i != INVALID_INDEX) { buffer.push_back({i, v}); }
1983
1984
1985 size_t number_of_errors = 0;
1986
1987 for (data_type::const_iterator ix = data.begin(); ix != data.end(); ++ix) {
1988
1989 const pair_type& pair = ix->first;
1990
1991 if (value.parameters[pair.first ].status &&
1992 value.parameters[pair.second].status) {
1993
1994 const real_type& real = value.getReal(pair);
1995
1996 const JBell bell(real.t0, real.sigma, real.signal, 0.0, BELL_SHAPE);
1997
1998 const double R1 = value.model .getValue (real.ct);
1999 const double T1 = value.transmittance.getValue (real.ct, real.pair);
2000 const JK40Parameters_t& R1p = value.model .getGradient(real.ct);
2001 const JTransmittance_t& T1p = value.transmittance.getGradient(real.ct, real.pair);
2002
2003 for (const rate_type& iy : ix->second) {
2004
2005 const double R2 = bell.getValue (iy.dt_ns);
2006 const JBell_t& R2p = bell.getGradient(iy.dt_ns);
2007
2008 const double R = real.bc + real.background + T1 * R1 * (real.cc + R2);
2009 const double u = (iy.value - R) / iy.error;
2010 const double w = -estimator->getPsi(u) / iy.error;
2011
2012 successor += estimator->getRho(u);
2013
2014 buffer.clear();
2015
2016 PUSH_BACK(M.R, w * T1 * (real.cc + R2) * R1p.R () * value.model.R .getDerivative());
2017 PUSH_BACK(M.p1, w * T1 * (real.cc + R2) * R1p.p1() * value.model.p1.getDerivative());
2018 PUSH_BACK(M.p2, w * T1 * (real.cc + R2) * R1p.p2() * value.model.p2.getDerivative());
2019 PUSH_BACK(M.p3, w * T1 * (real.cc + R2) * R1p.p3() * value.model.p3.getDerivative());
2020 PUSH_BACK(M.p4, w * T1 * (real.cc + R2) * R1p.p4() * value.model.p4.getDerivative());
2021 PUSH_BACK(M.cc, w * T1 * real.signal * R1p.cc() * value.model.cc.getDerivative());
2022 PUSH_BACK(M.bc, w * R1p.bc() * value.model.bc.getDerivative());
2023
2024 for (int i = 0; i != NUMBER_OF_RINGS; ++i) {
2025 PUSH_BACK(T[i], w * R1 * (real.cc + R2) * T1p[i] * value.transmittance[i].getDerivative());
2026 }
2027
2028 PUSH_BACK(I[pair.first] .QE, w * T1 * R1 * R2p.signal * value.parameters[pair.second].QE () * value.parameters[pair.first ].QE .getDerivative());
2029 PUSH_BACK(I[pair.second].QE, w * T1 * R1 * R2p.signal * value.parameters[pair.first ].QE () * value.parameters[pair.second].QE .getDerivative());
2030 PUSH_BACK(I[pair.first] .TTS, w * T1 * R1 * R2p.sigma * value.parameters[pair.first ].TTS() * value.parameters[pair.first ].TTS.getDerivative() / real.sigma);
2031 PUSH_BACK(I[pair.second].TTS, w * T1 * R1 * R2p.sigma * value.parameters[pair.second].TTS() * value.parameters[pair.second].TTS.getDerivative() / real.sigma);
2032 PUSH_BACK(I[pair.first] .t0, w * T1 * R1 * R2p.mean * value.parameters[pair.first ].t0 .getDerivative() * +1.0);
2033 PUSH_BACK(I[pair.second].t0, w * T1 * R1 * R2p.mean * value.parameters[pair.second].t0 .getDerivative() * -1.0);
2034 PUSH_BACK(I[pair.first] .bg, w * value.parameters[pair.first ].bg .getDerivative());
2035 PUSH_BACK(I[pair.second].bg, w * value.parameters[pair.second].bg .getDerivative());
2036
2037 if (TEST) {
2038
2039 DEBUG("PMT pair(" << setw(2) << pair.first << "," << setw(2) << pair.second << ") " << FIXED(7,3) << iy.dt_ns << " [ns]" << endl);
2040
2041 const double PRECISION = 1.0e-5;
2042
2043#define MAKE_TEST(i,v) if (i != INVALID_INDEX) { \
2044 \
2045 const bool status = fabs(buffer[i] - v) <= PRECISION; \
2046 \
2047 DEBUG((status ? GREEN : RED) \
2048 << setw(20) << left << #i << right << ' ' \
2049 << setw(3) << i << ' ' \
2050 << FIXED(12,5) << buffer[i] << ' ' \
2051 << FIXED(12,5) << v << ' ' \
2052 << (!status ? "***" : "") \
2053 << RESET << endl); \
2054 \
2055 if (!status) { \
2056 number_of_errors += 1; \
2057 } \
2058 }
2059
2060 struct JTest_t : public JModel
2061 {
2062 JTest_t& operator=(const JModel& model)
2063 {
2064 static_cast<JModel&>(*this) = model;
2065
2066 this->model.R .relax();
2067 this->model.p1.relax();
2068 this->model.p2.relax();
2069 this->model.p3.relax();
2070 this->model.p4.relax();
2071 this->model.cc.relax();
2072 this->model.bc.relax();
2073
2074 for (int i = 0; i != NUMBER_OF_PMTS; ++i) {
2075 parameters[i].QE .relax();
2076 parameters[i].TTS.relax();
2077 parameters[i].t0 .relax();
2078 parameters[i].bg .relax();
2079 }
2080
2081 return *this;
2082 }
2083
2084 double operator()(const pair_type& pair, const rate_type& iy) const
2085 {
2086 return (iy.value - getValue(pair, iy.dt_ns)) / iy.error;
2087 }
2088 };
2089
2090 const double DX = 1.0e-8; // dx
2091 JTest_t m1, m2; // y1, y2
2092
2093 // derivative
2094
2095 auto fp = [&DX = DX, &m1 = m1, &m2 = m2, &estimator = estimator](const pair_type& pair, const rate_type& iy)
2096 {
2097 return (estimator->getRho(m2(pair, iy)) - estimator->getRho(m1(pair, iy))) / DX;
2098 };
2099
2100 { m1 = m2 = value; m2.model.R += 0.5*DX; m1.model.R -= 0.5*DX; MAKE_TEST(M.R, fp(pair, iy) * value.model.R .getDerivative()); }
2101 { m1 = m2 = value; m2.model.p1 += 0.5*DX; m1.model.p1 -= 0.5*DX; MAKE_TEST(M.p1, fp(pair, iy) * value.model.p1.getDerivative()); }
2102 { m1 = m2 = value; m2.model.p2 += 0.5*DX; m1.model.p2 -= 0.5*DX; MAKE_TEST(M.p2, fp(pair, iy) * value.model.p2.getDerivative()); }
2103 { m1 = m2 = value; m2.model.p3 += 0.5*DX; m1.model.p3 -= 0.5*DX; MAKE_TEST(M.p3, fp(pair, iy) * value.model.p3.getDerivative()); }
2104 { m1 = m2 = value; m2.model.p4 += 0.5*DX; m1.model.p4 -= 0.5*DX; MAKE_TEST(M.p4, fp(pair, iy) * value.model.p4.getDerivative()); }
2105 { m1 = m2 = value; m2.model.cc += 0.5*DX; m1.model.cc -= 0.5*DX; MAKE_TEST(M.cc, fp(pair, iy) * value.model.cc.getDerivative()); }
2106 { m1 = m2 = value; m2.model.bc += 0.5*DX; m1.model.bc -= 0.5*DX; MAKE_TEST(M.bc, fp(pair, iy) * value.model.bc.getDerivative()); }
2107
2108 { m1 = m2 = value; m2.parameters[pair.first] .QE += 0.5*DX; m1.parameters[pair.first] .QE -= 0.5*DX; MAKE_TEST(I[pair.first] .QE, fp(pair, iy) * value.parameters[pair.first] .QE .getDerivative()); }
2109 { m1 = m2 = value; m2.parameters[pair.second].QE += 0.5*DX; m1.parameters[pair.second].QE -= 0.5*DX; MAKE_TEST(I[pair.second].QE, fp(pair, iy) * value.parameters[pair.second].QE .getDerivative()); }
2110 { m1 = m2 = value; m2.parameters[pair.first] .TTS += 0.5*DX; m1.parameters[pair.first] .TTS -= 0.5*DX; MAKE_TEST(I[pair.first] .TTS, fp(pair, iy) * value.parameters[pair.first] .TTS.getDerivative()); }
2111 { m1 = m2 = value; m2.parameters[pair.second].TTS += 0.5*DX; m1.parameters[pair.second].TTS -= 0.5*DX; MAKE_TEST(I[pair.second].TTS, fp(pair, iy) * value.parameters[pair.second].TTS.getDerivative()); }
2112 if (pair.first != value.getIndex()) {
2113 m1 = m2 = value; m2.parameters[pair.first] .t0 += 0.5*DX; m1.parameters[pair.first] .t0 -= 0.5*DX; MAKE_TEST(I[pair.first] .t0, fp(pair, iy) * value.parameters[pair.first] .t0 .getDerivative());
2114 }
2115 if (pair.second != value.getIndex()) {
2116 m1 = m2 = value; m2.parameters[pair.second].t0 += 0.5*DX; m1.parameters[pair.second].t0 -= 0.5*DX; MAKE_TEST(I[pair.second].t0, fp(pair, iy) * value.parameters[pair.second].t0 .getDerivative());
2117 }
2118 { m1 = m2 = value; m2.parameters[pair.first] .bg += 0.5*DX; m1.parameters[pair.first] .bg -= 0.5*DX; MAKE_TEST(I[pair.first] .bg, fp(pair, iy) * value.parameters[pair.first] .bg .getDerivative()); }
2119 { m1 = m2 = value; m2.parameters[pair.second].bg += 0.5*DX; m1.parameters[pair.second].bg -= 0.5*DX; MAKE_TEST(I[pair.second].bg, fp(pair, iy) * value.parameters[pair.second].bg .getDerivative()); }
2120
2121 cout << endl;
2122 }
2123
2124 for (buffer_type::const_iterator row = buffer.begin(); row != buffer.end(); ++row) {
2125
2126 Y[row->first] += row->second;
2127
2128 V[row->first][row->first] += row->second * row->second;
2129
2130 for (buffer_type::const_iterator col = buffer.begin(); col != row; ++col) {
2131 V[row->first][col->first] += row->second * col->second;
2132 V[col->first][row->first] = V[row->first][col->first];
2133 }
2134 }
2135 }
2136 }
2137 }
2138
2139#undef PUSH_BACK
2140
2141 if (TEST) {
2142
2143 STATUS("Test finished with " << number_of_errors << " errors." << endl);
2144
2145 exit(number_of_errors == 0 ? 0 : 1);
2146 }
2147 }
TPaveText * p1
#define THROW(JException_t, A)
Marco for throwing exception with std::ostream compatible message.
#define PUSH_BACK(i, v)
#define MAKE_TEST(i, v)
#define STATUS(A)
Definition JMessage.hh:63
double getDerivative() const
Get derivative of value.
Definition JFitK40.hh:386
Interface to read input and write output for TObject tests.
Definition JTest_t.hh:42
Exception for accessing a value in a collection that is outside of its range.
#define R1(x)
static const int INVALID_INDEX
invalid index
Definition JFitK40.hh:61
static double BELL_SHAPE
Bell shape.
Definition JFitK40.hh:67
double getValue(const JScale_t scale)
Get numerical value corresponding to scale.
Definition JScale.hh:47
Model for fit to acoustics data.
size_t getN() const
Get number of fit parameters.
size_t getIndex(int id, double JString::*p) const
Get index of fit parameter for given string.
Fit parameters for two-fold coincidence rate due to K40.
Definition JFitK40.hh:613
const JK40Parameters_t & getGradient(const double ct) const
Get gradient.
Definition JFitK40.hh:818
double getValue(const double ct) const
Get K40 coincidence rate as a function of cosine angle between PMT axes.
Definition JFitK40.hh:806
Auxiliary data structure for derived quantities of a given PMT pair.
Definition JFitK40.hh:1220
int getIndex() const
Get index of PMT used for fixed time offset.
Definition JFitK40.hh:1451
const real_type & getReal(const pair_type &pair) const
Get derived quantities.
Definition JFitK40.hh:1529
Auxiliary data structure to handle transmittance of glass sphere due to sedimentation.
Definition JFitK40.hh:1016
double getValue(const double ct, const ring_pair pair) const
Get weighed contribution of water and glass.
Definition JFitK40.hh:1107
const JTransmittance_t & getGradient(const double ct, const ring_pair pair) const
Get gradient.
Definition JFitK40.hh:1122
double error
error of rate [Hz/ns]
Definition JFitK40.hh:101
double value
value of rate [Hz/ns]
Definition JFitK40.hh:100
Bell function object.
Definition JBell.hh:32
Gauss model.
Definition JGauss.hh:32
double background
Definition JGauss.hh:164
double signal
Definition JGauss.hh:163
JMatrixND & reset()
Set matrix to the null matrix.
Definition JMatrixND.hh:459
void reset()
Reset.
Definition JVectorND.hh:45

◆ seterr()

void JCALIBRATE::JFit::seterr ( const data_type & data)
inlineprivate

Set errors.

Parameters
datadata

Definition at line 2155 of file JFitK40.hh.

2156 {
2157 using namespace std;
2158
2159 error.reset();
2160
2161 evaluate(data);
2162
2163 try {
2164 V.invert();
2165 }
2166 catch (const exception& error) {}
2167
2168#define SQRT(X) (X >= 0.0 ? sqrt(X) : std::numeric_limits<double>::max())
2169
2170 size_t row = 0;
2171
2172 if (value.model.R .isFree()) { error.model.R = SQRT(V(row,row)); ++row; }
2173 if (value.model.p1.isFree()) { error.model.p1 = SQRT(V(row,row)); ++row; }
2174 if (value.model.p2.isFree()) { error.model.p2 = SQRT(V(row,row)); ++row; }
2175 if (value.model.p3.isFree()) { error.model.p3 = SQRT(V(row,row)); ++row; }
2176 if (value.model.p4.isFree()) { error.model.p4 = SQRT(V(row,row)); ++row; }
2177 if (value.model.cc.isFree()) { error.model.cc = SQRT(V(row,row)); ++row; }
2178 if (value.model.bc.isFree()) { error.model.bc = SQRT(V(row,row)); ++row; }
2179
2180 for (int i = 0; i != NUMBER_OF_RINGS; ++i) {
2181 if (value.transmittance[i].isFree()) { error.transmittance[i] = SQRT(V(row,row)); ++row; }
2182 }
2183
2184 for (int pmt = 0; pmt != NUMBER_OF_PMTS; ++pmt) {
2185 if (value.parameters[pmt].QE .isFree()) { error.parameters[pmt].QE = SQRT(V(row,row)); ++row; }
2186 if (value.parameters[pmt].TTS.isFree()) { error.parameters[pmt].TTS = SQRT(V(row,row)); ++row; }
2187 if (value.parameters[pmt].t0 .isFree()) { error.parameters[pmt].t0 = SQRT(V(row,row)); ++row; }
2188 if (value.parameters[pmt].bg .isFree()) { error.parameters[pmt].bg = SQRT(V(row,row)); ++row; }
2189 }
2190
2191#undef SQRT
2192 }
#define SQRT(X)
void reset()
Reset.
Definition JFitK40.hh:1171
void invert()
Invert matrix according LDU decomposition.
Definition JMatrixNS.hh:75

Member Data Documentation

◆ MAXIMUM_ITERATIONS

int JCALIBRATE::JFit::MAXIMUM_ITERATIONS = 100000
staticconstexpr

maximal number of iterations.

Definition at line 1853 of file JFitK40.hh.

◆ EPSILON

double JCALIBRATE::JFit::EPSILON = 1.0e-3
staticconstexpr

maximal distance to minimum.

Definition at line 1854 of file JFitK40.hh.

◆ LAMBDA_MIN

double JCALIBRATE::JFit::LAMBDA_MIN = 1.0e-2
staticconstexpr

minimal value control parameter

Definition at line 1855 of file JFitK40.hh.

◆ LAMBDA_MAX

double JCALIBRATE::JFit::LAMBDA_MAX = 1.0e+4
staticconstexpr

maximal value control parameter

Definition at line 1856 of file JFitK40.hh.

◆ LAMBDA_UP

double JCALIBRATE::JFit::LAMBDA_UP = 10.0
staticconstexpr

multiplication factor control parameter

Definition at line 1857 of file JFitK40.hh.

◆ LAMBDA_DOWN

double JCALIBRATE::JFit::LAMBDA_DOWN = 10.0
staticconstexpr

multiplication factor control parameter

Definition at line 1858 of file JFitK40.hh.

◆ PIVOT

double JCALIBRATE::JFit::PIVOT = std::numeric_limits<double>::epsilon()
staticconstexpr

minimal value diagonal element of matrix

Definition at line 1859 of file JFitK40.hh.

◆ debug

int JCALIBRATE::JFit::debug

Definition at line 1861 of file JFitK40.hh.

◆ estimator

estimator_type JCALIBRATE::JFit::estimator

M-Estimator function.

Definition at line 1862 of file JFitK40.hh.

◆ lambda

double JCALIBRATE::JFit::lambda

Definition at line 1864 of file JFitK40.hh.

◆ value

JModel JCALIBRATE::JFit::value

Definition at line 1865 of file JFitK40.hh.

◆ error

JModel_t JCALIBRATE::JFit::error

Definition at line 1866 of file JFitK40.hh.

◆ numberOfIterations

int JCALIBRATE::JFit::numberOfIterations

Definition at line 1867 of file JFitK40.hh.

◆ V

JMATH::JMatrixNS JCALIBRATE::JFit::V

Definition at line 1868 of file JFitK40.hh.

◆ TEST

bool JCALIBRATE::JFit::TEST = false

Definition at line 1870 of file JFitK40.hh.

◆ Y

JMATH::JVectorND JCALIBRATE::JFit::Y
private

Definition at line 2195 of file JFitK40.hh.

◆ successor

double JCALIBRATE::JFit::successor
private

Definition at line 2196 of file JFitK40.hh.

◆ previous

JModel JCALIBRATE::JFit::previous
private

Definition at line 2197 of file JFitK40.hh.

◆ h

std::vector<double> JCALIBRATE::JFit::h
private

Definition at line 2198 of file JFitK40.hh.


The documentation for this class was generated from the following file: