1#ifndef __JFIT__JSHOWER3EZREGRESSOR__
2#define __JFIT__JSHOWER3EZREGRESSOR__
60 const double epsilon = 1.0e-6;
76 const double Emin = 0.1;
78 double Tx = value.
getDX();
79 double Ty = value.
getDY();
81 const double E = max(Emin, value.
getE());
82 const double u = hypot(Tx, Ty);
113 static const int NUMBER_OF_PDFS = 2;
139 const JPDF_t::JSupervisor supervisor(
new JPDF_t::JDefaultResult(
JMATH::zero));
141 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
143 const string file_name = getFilename(fileDescriptor, pdf_t[i]);
146 _pdf.
load(file_name.c_str());
150 _npe[ i ] =
JNPE_t(_pdf, T_ns);
153 for (
int i = 1; i < NUMBER_OF_PDFS; i += 2) {
155 _npe[ i ].add(_npe[i-1]);
159 _npe[i-1].swap(buffer);
189 DIRECT_LIGHT_FROM_EMSHOWER,
190 SCATTERED_LIGHT_FROM_EMSHOWER
235 npe(storage.getNPE()),
260 const double x = D.
getX();
261 const double y = D.
getY();
274 if (get_value(H1) >= Vmax_npe) {
275 H1 *= Vmax_npe / get_value(H1);
280 const bool hit = pmt.
getN() != 0;
281 const double u =
getChi2(get_value(H1), hit) -
getChi2(get_value(H0), hit);
283 return estimator->getRho(u);
311 const double E)
const
315 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
317 if (!npe[i].empty() && D <= npe[i].getXmax()) {
333 ERROR(error << std::endl);
369 static const int NUMBER_OF_PDFS = 2;
396 const JPDF_t::JSupervisor supervisor(
new JPDF_t::JDefaultResult(
JMATH::zero));
398 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
400 const string file_name = getFilename(fileDescriptor, pdf_t[i]);
403 _pdf.
load(file_name.c_str());
407 _npe[i] =
JNPE_t(_pdf, T_ns);
412 for (
int i = 1; i < NUMBER_OF_PDFS; i += 2) {
414 _npe[ i ].add(_npe[i-1]);
418 _npe[i-1].swap(buffer);
447 DIRECT_LIGHT_FROM_EMSHOWER,
448 SCATTERED_LIGHT_FROM_EMSHOWER
482 storage_type(fileDescriptor, T_ns),
518 const double x = D.getX();
519 const double y = D.getY();
520 const double d = D.getLength();
528 JNPE_t::result_type H0 = getH0(pmt.
getR());
529 JNPE_t::result_type H1 = getH1(d, cd, theta, phi, shower.
getE());
533 if (get_value(H1) >= Vmax_npe) {
534 H1 *= Vmax_npe / get_value(H1);
537 const double signal_npe = get_value(H1);
541 const double expectation = get_value(H1);
543 const bool hit = pmt.
getN() != 0;
544 const double u = H1.getChi2(hit) - H0.getChi2(hit);
548 result.chi2 = estimator->getRho(u);
550 double energy_gradient = signal_npe/shower.
getE();
553 energy_gradient *= -exp(-expectation)/(1-exp(-expectation));
564 result.gradient.mul(estimator->getPsi(u));
566 static_cast<JShower3Z&
>(
result.gradient).mul(H1.getDerivativeOfChi2(hit) - H0.getDerivativeOfChi2(hit));
577 JNPE_t::result_type getH0(
const double R_Hz)
const
579 return JNPE_t::result_type(R_Hz * 1e-9 * T_ns.getLength(), 0.0);
592 JNPE_t::result_type getH1(
const double D,
596 const double E)
const
600 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
602 if (!npe[i].empty() && D <= npe[i].getXmax()) {
606 JNPE_t::result_type y1 = E * npe[i](std::max(D, npe[i].getXmin()), cd, theta, phi);
608 if (get_value(y1) > 0.0) {
614 ERROR(error << std::endl);
623 static double Vmax_npe;
627 std::shared_ptr<JMEstimator> estimator;
652 static const int NUMBER_OF_PDFS = 2;
679 const JPDF_t::JSupervisor supervisor(
new JPDF_t::JDefaultResult(
JMATH::zero));
681 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
683 const string file_name = getFilename(fileDescriptor, pdf_t[i]);
686 _pdf.
load(file_name.c_str());
690 _npe[i] =
JNPE_t(_pdf, T_ns);
695 for (
int i = 1; i < NUMBER_OF_PDFS; i += 2) {
697 _npe[i].add(_npe[i-1]);
701 _npe[i-1].swap(buffer);
731 DIRECT_LIGHT_FROM_EMSHOWER,
732 SCATTERED_LIGHT_FROM_EMSHOWER
767 storage_type(fileDescriptor, T_ns),
802 const double x = D.getX();
803 const double y = D.getY();
804 const double cd = z/D.getLength();
811 JNPE_t::result_type H0 = getH0(pmt.
getR());
812 JNPE_t::result_type H1 = getH1(D.getLength(), cd, theta, phi, shower.
getE());
816 if (get_value(H1) >= Vmax_npe) {
817 H1 *= Vmax_npe / get_value(H1);
822 const bool hit = pmt.
getN() != 0;
823 const double u =
getChi2(get_value(H1), hit) -
getChi2(get_value(H0), hit);
825 return estimator->getRho(u);
834 JNPE_t::result_type getH0(
const double R_Hz)
const
836 return JNPE_t::result_type(R_Hz * 1e-9 * T_ns.getLength());
849 JNPE_t::result_type getH1(
const double D,
853 const double E)
const
857 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
859 if (!npe[i].empty() && D <= npe[i].getXmax()) {
863 JNPE_t::result_type y1 = E * npe[i](std::max(D, npe[i].getXmin()), cd, theta, phi);
875 ERROR(error << std::endl);
890 JNPE_t::result_type getH1(
const JShower3EZ& shower,
const JPMTW0& pmt)
const
899 const double x = D.getX();
900 const double y = D.getY();
901 const double cd = z/D.getLength();
908 JNPE_t::result_type H1 = getH1(D.getLength(), cd, theta, phi, 1.0);
912 if (get_value(H1) >= Vmax_npe) {
913 H1 *= Vmax_npe / get_value(H1);
919 static double Vmax_npe;
923 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.
This include file containes various data structures that can be used as specific return types for the...
Definition of zero value for any class.
Place holder for custom implementation.
Fit method based on the Levenberg-Marquardt method.
Data structure for vertex fit.
Data structure for fit of straight line in positive z-direction with energy.
double getBy() const
Get bjorken y.
double getE() const
Get E.
Data structure for cascade in positive z-direction.
const JVersor3Z & getDirection() const
Get direction.
Simple fit method based on Powell's algorithm, see reference: Numerical Recipes in C++,...
Data structure for direction in three dimensions.
JDirection3D & rotate(const JRotation3D &R)
Rotate.
const JDirection3D & getDirection() const
Get direction.
Data structure for position in three dimensions.
double getDot(const JAngle3D &angle) const
Get dot product.
const JPosition3D & getPosition() const
Get position.
Data structure for vector in three dimensions.
double getY() const
Get y position.
double getLength() const
Get length.
JVector3D & sub(const JVector3D &vector)
Subtract vector.
double getX() const
Get x position.
double getTheta() const
Get theta angle.
double getPhi() const
Get phi angle.
Data structure for normalised vector in positive 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.
multifunction_t::result_type result_type
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.
double getPMTAngle(const double angle)
Constrain PMT angle to [0,pi].
double getChi2(const double P)
Get chi2 corresponding to given probability.
void model(JModel_t &value)
Auxiliary function to constrain model during fit.
static const JZero zero
Function object to assign zero value.
static const double PI
Mathematical constants.
@ SCATTERED_LIGHT_FROM_EMSHOWER
scattered light from EM shower
@ DIRECT_LIGHT_FROM_EMSHOWER
direct light from EM shower
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.
JTOOLS::JMAPLIST< JTOOLS::JPolint0FunctionalMap, JTOOLS::JPolint0FunctionalMap, JTOOLS::JPolint0FunctionalGridMap, JTOOLS::JPolint0FunctionalGridMap >::maplist JPDFMaplist_t
JPHYSICS::JPDFTable< JFunction1D_t, JPDFMaplist_t > JPDF_t
JTimeRange T_ns
Time window with respect to Cherenkov hypothesis [ns].
JPHYSICS::JNPETable< double, double, JNPEMaplist_t > JNPE_t
JRegressorStorage()
Default constructor.
JTOOLS::JPolint1Function1D_t JFunction1D_t
std::array< JNPE_t, NUMBER_OF_PDFS > JNPEs_t
NPEs.
const JNPEs_t & getNPE() const
Get NPEs.
JTOOLS::JMAPLIST< JTOOLS::JPolint0FunctionalMap, JTOOLS::JPolint0FunctionalMap, JTOOLS::JPolint0FunctionalGridMap, JTOOLS::JPolint0FunctionalGridMap >::maplist JNPEMaplist_t
JRegressorStorage(const std::string &fileDescriptor, const JTimeRange &T_ns)
Parameterized constructor.
JTimeRange T_ns
Time window with respect to Cherenkov hypothesis [ns].
std::array< JNPE_t, NUMBER_OF_PDFS > JNPEs_t
NPEs.
JTOOLS::JMAPLIST< JTOOLS::JPolint0FunctionalMap, JTOOLS::JPolint0FunctionalMap, JTOOLS::JPolint0FunctionalGridMap, JTOOLS::JPolint0FunctionalGridMap >::maplist JPDFMaplist_t
JPHYSICS::JPDFTable< JFunction1D_t, JPDFMaplist_t > JPDF_t
JRegressorStorage(const std::string &fileDescriptor, const JTimeRange &T_ns)
Parameterized constructor.
JTOOLS::JMAPLIST< JTOOLS::JPolint1FunctionalMap, JTOOLS::JPolint1FunctionalMapH, JTOOLS::JPolint1FunctionalGridMap, JTOOLS::JPolint1FunctionalGridMap >::maplist JNPEMaplist_t
const JNPEs_t & getNPE() const
Get NPEs.
JRegressorStorage()
Default constructor.
JTOOLS::JPolint1Function1D_t JFunction1D_t
JPHYSICS::JNPETable< double, double, JNPEMaplist_t > JNPE_t
Template specialisation for storage of PDF tables.
JPHYSICS::JPDFTable< JFunction1D_t, JPDFMaplist_t > JPDF_t
JTOOLS::JPolint1Function1D_t JFunction1D_t
JTOOLS::JMAPLIST< JTOOLS::JPolint0FunctionalMap, JTOOLS::JPolint0FunctionalMap, JTOOLS::JPolint0FunctionalGridMap, JTOOLS::JPolint0FunctionalGridMap >::maplist JNPEMaplist_t
const JNPEs_t & getNPE() const
Get NPEs.
std::array< JNPE_t, NUMBER_OF_PDFS > JNPEs_t
NPEs.
JTOOLS::JMAPLIST< JTOOLS::JPolint0FunctionalMap, JTOOLS::JPolint0FunctionalMap, JTOOLS::JPolint0FunctionalGridMap, JTOOLS::JPolint0FunctionalGridMap >::maplist JPDFMaplist_t
JPHYSICS::JNPETable< double, double, JNPEMaplist_t > JNPE_t
JRegressorStorage()
Default constructor.
JTimeRange T_ns
Time window with respect to Cherenkov hypothesis [ns].
JRegressorStorage(const std::string &fileDescriptor, const JTimeRange &T_ns)
Constructor.
Template data structure for storage of internal data.
JRegressor(const std::string &fileDescriptor, const JTimeRange &T_ns)
Constructor.
JRegressorStorage< JShower3EZ, JSimplex > storage_type
std::shared_ptr< JMEstimator > estimator
M-Estimator function.
static double Vmax_npe
Maximal integral of PDF [npe].
JNPE_t::result_type getH0(const double R_Hz) const
Get background hypothesis value for time integrated PDF.
JNPE_t::result_type getH1(const double D, const double cd, const double theta, const double phi, const double E) const
Get signal hypothesis value for time integrated PDF.
JRegressor()
Default constructor.
double operator()(const JShower3EZ &shower, const JPMTW0 &pmt) const
Fit function.
JRegressor(const storage_type &storage)
Constructor.
Template definition of a data regressor of given model.
void load(const char *file_name)
Load from input file.