1#ifndef __JFIT__JLINE3ZREGRESSOR__
2#define __JFIT__JLINE3ZREGRESSOR__
37namespace JPP {
using namespace JFIT; }
85 template<
class JHit_t>
86 double operator()(
const JLine3Z& track,
const JHit_t& hit)
const
95 const double R = sqrt(D.getLengthSquared() - z*z);
97 const double t1 = track.
getT() + (z + R *
getKappaC()) * getInverseSpeedOfLight();
99 const double u = (t1 - hit.getT()) / sigma;
101 return estimator->getRho(u) * hit.getW();
104 std::shared_ptr<JMEstimator> estimator;
128 static const int NUMBER_OF_PDFS = 6;
159 const double epsilon = 1.0e-10) :
165 const JPDF_t::JSupervisor supervisor(
new JPDF_t::JDefaultResult(
JMATH::zero));
167 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
169 const string file_name = getFilename(fileDescriptor, pdf_t[i]);
171 _pdf[i].load(file_name.c_str());
173 _pdf[i].setExceptionHandler(supervisor);
178 for (
int i = 1; i < NUMBER_OF_PDFS; i += 2) {
180 _pdf[ i ].add(_pdf[i-1]);
181 _pdf[ i ].compress(numeric_limits<double>::max(), T_ns);
185 _pdf[i-1].swap(buffer);
191 _npe[ i ] =
JNPE_t(_pdf[i], T_ns);
225 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
226 _pdf[i].transform(transformer);
227 _npe[i].transform(transformer);
249 DIRECT_LIGHT_FROM_MUON,
250 SCATTERED_LIGHT_FROM_MUON,
251 DIRECT_LIGHT_FROM_DELTARAYS,
252 SCATTERED_LIGHT_FROM_DELTARAYS,
253 DIRECT_LIGHT_FROM_EMSHOWERS,
254 SCATTERED_LIGHT_FROM_EMSHOWERS
299 const double epsilon = 1.0e-10) :
300 storage_type(fileDescriptor, T_ns, TTS_ns,
numberOfPoints, epsilon),
313 pdf(storage.getPDF()),
340 template<
class JHit_t>
341 result_type operator()(
const JLine3Z& track,
const JHit_t& hit)
const
351 const double x = D.getX() - z * track.
getDX();
352 const double y = D.getY() - z * track.
getDY();
353 const double R2 = D.getLengthSquared() - z*z;
354 const double R = sqrt(R2);
356 const double t1 = track.
getT() + (z + R * getTanThetaC()) * getInverseSpeedOfLight();
360 const double theta = U.getTheta();
361 const double phi = fabs(U.getPhi());
363 const double E = gWater.getE(E_GeV, z);
364 const double dt = T_ns.constrain(hit.getT() - t1);
366 JPDF_t::result_type H0 = getH0(hit.getR(), dt);
367 JPDF_t::result_type H1 = getH1(E, R, theta, phi, dt);
371 if (H1.V >= Vmax_npe) {
372 H1 *= Vmax_npe / H1.V;
379 result.chi2 = H1.getChi2() - H0.getChi2();
381 const double wc = 1.0 - getTanThetaC() * z / R;
384 -getTanThetaC() * D.getY() / R,
388 wc * (D.getY() - D.getZ()*track.
getDY()/track.
getDZ())));
390 result.gradient.mul(getInverseSpeedOfLight() * (H1.getDerivativeOfChi2() -
391 H0.getDerivativeOfChi2()));
405 result_type operator()(
const JLine3Z& track,
const JPMTW0& pmt)
const
416 const double x = D.getX() - z * track.
getDX();
417 const double y = D.getY() - z * track.
getDY();
418 const double R2 = D.getLengthSquared() - z*z;
419 const double R = sqrt(R2);
423 const double theta = U.getTheta();
424 const double phi = fabs(U.getPhi());
426 const double E = gWater.getE(E_GeV, z);
428 JNPE_t::result_type H0 = getH0(pmt.
getR());
429 JNPE_t::result_type H1 = getH1(E, R, theta, phi);
433 if (H1.f >= Vmax_npe) {
434 H1 *= Vmax_npe / H1.f;
439 const bool hit = pmt.
getN() != 0;
440 const double u = H1.getChi2(hit);
444 result.chi2 = estimator->getRho(u);
453 result.gradient.mul(estimator->getPsi(u));
454 result.gradient.mul(H1.getDerivativeOfChi2(hit));
467 JPDF_t::result_type getH0(
const double R_Hz,
468 const double t1)
const
470 return JPDF_t::result_type(R_Hz * 1e-9, t1, T_ns);
484 JPDF_t::result_type getH1(
const double E,
488 const double t1)
const
493 JPDF_t::result_type h1 = zero;
495 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
497 if (!pdf[i].empty() && R <= pdf[i].getXmax()) {
499 JPDF_t::result_type y1 = pdf[i](max(R, pdf[i].getXmin()), theta, phi, t1);
515 y1 *= JDeltaRays::getEnergyLossFromMuon(E);
534 JNPE_t::result_type getH0(
const double R_Hz)
const
536 return JNPE_t::result_type(R_Hz * 1e-9 * T_ns.getLength(), 0.0);
549 JNPE_t::result_type getH1(
const double E,
552 const double phi)
const
559 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
561 if (!npe[i].empty() && R <= npe[i].getXmax()) {
565 JNPE_t::result_type y1 = npe[i](max(R, npe[i].getXmin()), theta, phi);
574 y1 *= JDeltaRays::getEnergyLossFromMuon(E);
583 ERROR(error << endl);
597 inline double getRmax()
const
601 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
602 if (!pdf[i].empty() && pdf[i].getXmax() > xmax) {
603 xmax = pdf[i].getXmax();
611 static double Vmax_npe;
618 std::shared_ptr<JMEstimator> estimator;
Various implementations of functional maps.
Maximum likelihood estimator (M-estimators).
General purpose messaging.
Numbering scheme for PDF types.
Auxiliary class to define a range between two values.
General purpose data regression method.
Definition of zero value for any class.
Fit method based on the Levenberg-Marquardt method.
Data structure for fit of straight line paralel to z-axis.
Data structure for fit of straight line in positive z-direction.
JVersor3D getDirection(const JVector3D &pos) const
Get photon direction of Cherenkov light on PMT.
double getT(const JVector3D &pos) const
Get arrival time of Cherenkov light at given position.
Simple fit method based on Powell's algorithm, see reference: Numerical Recipes in C++,...
Data structure for direction in three dimensions.
const JDirection3D & getDirection() const
Get direction.
Data structure for position in three dimensions.
const JPosition3D & getPosition() const
Get position.
Data structure for normalised vector in positive z-direction.
double getDZ() const
Get z direction.
double getDY() const
Get y direction.
double getDX() const
Get x direction.
Custom class for integrated values of the PDF of the arrival time of Cherenkov light.
Multi-dimensional PDF table for arrival time of Cherenkov light.
double getNPE(const Hit &hit)
Get true charge of hit.
Auxiliary classes and methods for linear and iterative data regression.
Auxiliary classes and methods for 3D geometrical objects and operations.
static const JZero zero
Function object to assign zero value.
Auxiliary methods for light properties of deep-sea water.
double getKappaC()
Get average R-dependence of arrival time of Cherenkov light (a.k.a.
bool is_deltarays(const int pdf)
Test if given PDF type corresponds to Cherenkov light from delta-rays.
bool is_bremsstrahlung(const int pdf)
Test if given PDF type corresponds to Cherenkov light from Bremsstrahlung.
@ SCATTERED_LIGHT_FROM_DELTARAYS
scattered light from delta-rays
@ DIRECT_LIGHT_FROM_EMSHOWERS
direct light from EM showers
@ SCATTERED_LIGHT_FROM_EMSHOWERS
scattered light from EM showers
@ SCATTERED_LIGHT_FROM_MUON
scattered light from muon
@ DIRECT_LIGHT_FROM_DELTARAYS
direct light from delta-rays
@ DIRECT_LIGHT_FROM_MUON
direct light from muon
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Abstract class for global fit method.
Auxiliary class for handling PMT geometry, rate and response.
int getN() const
Get number of hits.
double getR() const
Get rate.
double getQE() const
Get relative quantum efficiency.
JPHYSICS::JNPETable< double, double, JNPEMaplist_t > JNPE_t
time integrated PDF
const JNPEs_t & getNPE() const
Get NPEs.
JRegressorStorage()
Default constructor.
JTOOLS::JSplineFunction1S_t JFunction1D_t
std::array< JPDF_t, NUMBER_OF_PDFS > JPDFs_t
PDFs.
JPHYSICS::JPDFTable< JFunction1D_t, JPDFMaplist_t > JPDF_t
time dependent PDF
JTimeRange T_ns
Time window with respect to Cherenkov hypothesis [ns].
JTOOLS::JMAPLIST< JTOOLS::JPolint1FunctionalMap, JTOOLS::JPolint0FunctionalGridMap, JTOOLS::JPolint0FunctionalGridMap >::maplist JPDFMaplist_t
std::array< JNPE_t, NUMBER_OF_PDFS > JNPEs_t
NPEs.
JTOOLS::JMAPLIST< JTOOLS::JPolint1FunctionalMapH, JTOOLS::JPolint1FunctionalGridMap, JTOOLS::JPolint1FunctionalGridMap >::maplist JNPEMaplist_t
JPDF_t::transformer_type transformer_type
const JPDFs_t & getPDF() const
Get PDFs.
JRegressorStorage(const std::string &fileDescriptor, const JTimeRange &T_ns, const double TTS_ns, const int numberOfPoints=25, const double epsilon=1.0e-10)
Constructor.
void transform(const transformer_type &transformer)
Transform PDFs and NPEs.
Template data structure for storage of internal data.
Template definition of a data regressor of given model.
Auxiliary class to set-up Hit.