1#ifndef __JFIT__JSHOWER3EZREGRESSOR__
2#define __JFIT__JSHOWER3EZREGRESSOR__
60 const double epsilon = 1.0e-6;
77 double Tx = value.
getDX();
78 double Ty = value.
getDY();
79 double E = max(0.0,value.
getE());
80 const double u = hypot(Tx, Ty);
111 static const int NUMBER_OF_PDFS = 2;
137 const JPDF_t::JSupervisor supervisor(
new JPDF_t::JDefaultResult(
JMATH::zero));
139 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
141 const string file_name = getFilename(fileDescriptor, pdf_t[i]);
144 _pdf.
load(file_name.c_str());
148 _npe[ i ] =
JNPE_t(_pdf, T_ns);
151 for (
int i = 1; i < NUMBER_OF_PDFS; i += 2) {
153 _npe[ i ].add(_npe[i-1]);
157 _npe[i-1].swap(buffer);
187 DIRECT_LIGHT_FROM_EMSHOWER,
188 SCATTERED_LIGHT_FROM_EMSHOWER
232 npe(storage.getNPE()),
257 const double x = D.
getX();
258 const double y = D.
getY();
269 if (get_value(H1) >= Vmax_npe) {
270 H1 *= Vmax_npe / get_value(H1);
275 const bool hit = pmt.
getN() != 0;
276 const double u =
getChi2(get_value(H1), hit) -
getChi2(get_value(H0), hit);
278 return estimator->getRho(u);
306 const double E)
const
310 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
312 if (!npe[i].empty() && D <= npe[i].getXmax()) {
328 ERROR(error << std::endl);
364 static const int NUMBER_OF_PDFS = 2;
391 const JPDF_t::JSupervisor supervisor(
new JPDF_t::JDefaultResult(
JMATH::zero));
393 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
395 const string file_name = getFilename(fileDescriptor, pdf_t[i]);
398 _pdf.
load(file_name.c_str());
402 _npe[i] =
JNPE_t(_pdf, T_ns);
407 for (
int i = 1; i < NUMBER_OF_PDFS; i += 2) {
409 _npe[ i ].add(_npe[i-1]);
413 _npe[i-1].swap(buffer);
442 DIRECT_LIGHT_FROM_EMSHOWER,
443 SCATTERED_LIGHT_FROM_EMSHOWER
477 storage_type(fileDescriptor, T_ns),
513 const double x = D.getX();
514 const double y = D.getY();
515 const double d = D.getLength();
523 JNPE_t::result_type H0 = getH0(pmt.
getR());
524 JNPE_t::result_type H1 = getH1(d, cd, theta, phi, shower.
getE());
526 if (get_value(H1) >= Vmax_npe) {
527 H1 *= Vmax_npe / get_value(H1);
530 double signal_npe = get_value(H1);
534 double expectation = get_value(H1);
536 const bool hit = pmt.
getN() != 0;
537 const double u = H1.getChi2(hit) - H0.getChi2(hit);
541 result.chi2 = estimator->getRho(u);
543 double energy_gradient = signal_npe/shower.
getE();
544 if(hit) energy_gradient *= -exp(-expectation)/(1-exp(-expectation));
554 result.gradient.mul(estimator->getPsi(u));
555 static_cast<JShower3Z&
>(
result.gradient).mul(H1.getDerivativeOfChi2(hit) - H0.getDerivativeOfChi2(hit));
566 JNPE_t::result_type getH0(
const double R_Hz)
const
568 return JNPE_t::result_type(R_Hz * 1e-9 * T_ns.getLength(), 0.0);
581 JNPE_t::result_type getH1(
const double D,
585 const double E)
const
589 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
591 if (!npe[i].empty() && D <= npe[i].getXmax()) {
595 JNPE_t::result_type y1 = E * npe[i](std::max(D, npe[i].getXmin()), cd, theta, phi);
597 if (get_value(y1) > 0.0) {
603 ERROR(error << std::endl);
612 static double Vmax_npe;
616 std::shared_ptr<JMEstimator> estimator;
641 static const int NUMBER_OF_PDFS = 2;
668 const JPDF_t::JSupervisor supervisor(
new JPDF_t::JDefaultResult(
JMATH::zero));
670 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
672 const string file_name = getFilename(fileDescriptor, pdf_t[i]);
675 _pdf.
load(file_name.c_str());
679 _npe[i] =
JNPE_t(_pdf, T_ns);
684 for (
int i = 1; i < NUMBER_OF_PDFS; i += 2) {
686 _npe[i].add(_npe[i-1]);
690 _npe[i-1].swap(buffer);
720 DIRECT_LIGHT_FROM_EMSHOWER,
721 SCATTERED_LIGHT_FROM_EMSHOWER
756 storage_type(fileDescriptor, T_ns),
791 const double x = D.getX();
792 const double y = D.getY();
793 const double cd = z/D.getLength();
800 JNPE_t::result_type H0 = getH0(pmt.
getR());
801 JNPE_t::result_type H1 = getH1(D.getLength(), cd, theta, phi, shower.
getE());
803 if (get_value(H1) >= Vmax_npe) {
804 H1 *= Vmax_npe / get_value(H1);
809 const bool hit = pmt.
getN() != 0;
810 const double u =
getChi2(get_value(H1), hit) -
getChi2(get_value(H0), hit);
812 return estimator->getRho(u);
821 JNPE_t::result_type getH0(
const double R_Hz)
const
823 return JNPE_t::result_type(R_Hz * 1e-9 * T_ns.getLength());
836 JNPE_t::result_type getH1(
const double D,
840 const double E)
const
844 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
846 if (!npe[i].empty() && D <= npe[i].getXmax()) {
850 JNPE_t::result_type y1 = E * npe[i](std::max(D, npe[i].getXmin()), cd, theta, phi);
862 ERROR(error << std::endl);
877 JNPE_t::result_type getH1(
const JShower3EZ& shower,
const JPMTW0& pmt)
const
886 const double x = D.getX();
887 const double y = D.getY();
888 const double cd = z/D.getLength();
895 JNPE_t::result_type H1 = getH1(D.getLength(), cd, theta, phi, 1.0);
897 if (get_value(H1) >= Vmax_npe) {
898 H1 *= Vmax_npe / get_value(H1);
903 static double Vmax_npe;
907 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.
JTOOLS::JMapList< JTOOLS::JPolint0FunctionalMap, JTOOLS::JMapList< JTOOLS::JPolint0FunctionalMap, JTOOLS::JMapList< JTOOLS::JPolint0FunctionalGridMap, JTOOLS::JMapList< JTOOLS::JPolint0FunctionalGridMap > > > > 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::JMapList< JTOOLS::JPolint0FunctionalMap, JTOOLS::JMapList< JTOOLS::JPolint0FunctionalGridMap, JTOOLS::JMapList< JTOOLS::JPolint0FunctionalGridMap > > > > 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.
JPHYSICS::JPDFTable< JFunction1D_t, JPDFMaplist_t > JPDF_t
JRegressorStorage(const std::string &fileDescriptor, const JTimeRange &T_ns)
Parameterized constructor.
JTOOLS::JMapList< JTOOLS::JPolint0FunctionalMap, JTOOLS::JMapList< JTOOLS::JPolint0FunctionalMap, JTOOLS::JMapList< JTOOLS::JPolint0FunctionalGridMap, JTOOLS::JMapList< JTOOLS::JPolint0FunctionalGridMap > > > > JPDFMaplist_t
JTOOLS::JMapList< JTOOLS::JPolint1FunctionalMap, JTOOLS::JMapList< JTOOLS::JPolint1FunctionalMapH, JTOOLS::JMapList< JTOOLS::JPolint1FunctionalGridMap, JTOOLS::JMapList< JTOOLS::JPolint1FunctionalGridMap > > > > 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
const JNPEs_t & getNPE() const
Get NPEs.
std::array< JNPE_t, NUMBER_OF_PDFS > JNPEs_t
NPEs.
JTOOLS::JMapList< JTOOLS::JPolint0FunctionalMap, JTOOLS::JMapList< JTOOLS::JPolint0FunctionalMap, JTOOLS::JMapList< JTOOLS::JPolint0FunctionalGridMap, JTOOLS::JMapList< JTOOLS::JPolint0FunctionalGridMap > > > > JNPEMaplist_t
JTOOLS::JMapList< JTOOLS::JPolint0FunctionalMap, JTOOLS::JMapList< JTOOLS::JPolint0FunctionalMap, JTOOLS::JMapList< JTOOLS::JPolint0FunctionalGridMap, JTOOLS::JMapList< JTOOLS::JPolint0FunctionalGridMap > > > > 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.