Evaluation of fit.
1526 {
1527 using namespace std;
1528 using namespace JPP;
1529
1531
1532
1534
1537
1538
1539
1540
1541 const struct M_t {
1543 {
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);
1551 }
1552
1553 int R;
1555 int p2;
1556 int p3;
1557 int p4;
1558 int cc;
1559 int bc;
1560
1562
1563
1564
1565
1566 struct I_t {
1567 I_t(
const JModel& model,
const int pmt) :
1572 {
1573 const int index =
model.getIndex(pmt);
1574
1575 int N = 0;
1576
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; }
1581 }
1582
1583 int QE;
1584 int TTS;
1585 int t0;
1586 int bg;
1587 };
1588
1589
1591
1593
1594 for (data_type::const_iterator ix =
data.begin(); ix !=
data.end(); ++ix) {
1595
1596 const pair_type& pair = ix->first;
1597
1598 if (value.parameters[pair.first ].status &&
1599 value.parameters[pair.second].status) {
1600
1601 const real_type& real = value.getReal(pair);
1602
1603 const JBell bell(real.t0, real.sigma, real.signal, 0.0, BELL_SHAPE);
1604
1605 const double R1 = value.getValue (real.ct);
1606 const JK40Parameters_t& R1p = value.getGradient(real.ct);
1607
1608 const std::pair<I_t, I_t> PMT(I_t(value, pair.first),
1609 I_t(value, pair.second));
1610
1611 for (const rate_type& iy : ix->second) {
1612
1613 const double R2 = bell.getValue (iy.dt_ns);
1614 const JBell_t& R2p = bell.getGradient(iy.dt_ns);
1615
1616 const double R = real.bc + real.background + R1 * (real.cc + R2);
1617 const double u = (iy.value - R) / iy.error;
1618 const double w = -estimator->getPsi(u) / iy.error;
1619
1620 successor += estimator->getRho(u);
1621
1622 buffer.clear();
1623
1624 if (M.R != INVALID_INDEX) { buffer.push_back({M.R, w * (value.cc() + R2) * R1p.R () * value.R .getDerivative()}); }
1625 if (M.p1 != INVALID_INDEX) { buffer.push_back({M.p1, w * (value.cc() + R2) * R1p.p1() * value.p1.getDerivative()}); }
1626 if (M.p2 != INVALID_INDEX) { buffer.push_back({M.p2, w * (value.cc() + R2) * R1p.p2() * value.p2.getDerivative()}); }
1627 if (M.p3 != INVALID_INDEX) { buffer.push_back({M.p3, w * (value.cc() + R2) * R1p.p3() * value.p3.getDerivative()}); }
1628 if (M.p4 != INVALID_INDEX) { buffer.push_back({M.p4, w * (value.cc() + R2) * R1p.p4() * value.p4.getDerivative()}); }
1629 if (M.cc != INVALID_INDEX) { buffer.push_back({M.cc, w * R1 * R1p.cc() * value.cc.getDerivative()}); }
1630 if (M.bc != INVALID_INDEX) { buffer.push_back({M.bc, w * R1p.bc() * value.bc.getDerivative()}); }
1631
1632 if (PMT.first .QE != INVALID_INDEX) { buffer.push_back({PMT.first .QE , w * R1 * R2p.signal * value.parameters[pair.second].QE () * value.parameters[pair.first ].QE .getDerivative()}); }
1633 if (PMT.second.QE != INVALID_INDEX) { buffer.push_back({PMT.second.QE , w * R1 * R2p.signal * value.parameters[pair.first ].QE () * value.parameters[pair.second].QE .getDerivative()}); }
1634 if (PMT.first .TTS != INVALID_INDEX) { buffer.push_back({PMT.first .TTS, w * R1 * R2p.sigma * value.parameters[pair.first ].TTS() * value.parameters[pair.first ].TTS.getDerivative() / real.sigma}); }
1635 if (PMT.second.TTS != INVALID_INDEX) { buffer.push_back({PMT.second.TTS, w * R1 * R2p.sigma * value.parameters[pair.second].TTS() * value.parameters[pair.second].TTS.getDerivative() / real.sigma}); }
1636 if (PMT.first .t0 != INVALID_INDEX) { buffer.push_back({PMT.first .t0, w * R1 * R2p.mean * value.parameters[pair.first ].t0 .getDerivative() * +1.0}); }
1637 if (PMT.second.t0 != INVALID_INDEX) { buffer.push_back({PMT.second.t0, w * R1 * R2p.mean * value.parameters[pair.second].t0 .getDerivative() * -1.0}); }
1638 if (PMT.first .bg != INVALID_INDEX) { buffer.push_back({PMT.first .bg, w * value.parameters[pair.first ].bg .getDerivative()}); }
1639 if (PMT.second.bg != INVALID_INDEX) { buffer.push_back({PMT.second.bg, w * value.parameters[pair.second].bg .getDerivative()}); }
1640
1641 for (buffer_type::const_iterator row = buffer.begin(); row != buffer.end(); ++row) {
1642
1643 Y[row->first] += row->second;
1644
1645 V[row->first][row->first] += row->second * row->second;
1646
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];
1650 }
1651 }
1652 }
1653 }
1654 }
1655 }
static const int INVALID_INDEX
invalid index
Model for fit to acoustics data.
Auxiliary data structure for derived quantities of a given PMT pair.
JMatrixND & reset()
Set matrix to the null matrix.