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
233 npe(storage.getNPE()),
258 const double x = D.
getX();
259 const double y = D.
getY();
270 if (get_value(H1) >= Vmax_npe) {
271 H1 *= Vmax_npe / get_value(H1);
276 const bool hit = pmt.
getN() != 0;
277 const double u =
getChi2(get_value(H1), hit) -
getChi2(get_value(H0), hit);
279 return estimator->getRho(u);
307 const double E)
const
311 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
313 if (!npe[i].empty() && D <= npe[i].getXmax()) {
329 ERROR(error << std::endl);
365 static const int NUMBER_OF_PDFS = 2;
392 const JPDF_t::JSupervisor supervisor(
new JPDF_t::JDefaultResult(
JMATH::zero));
394 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
396 const string file_name = getFilename(fileDescriptor, pdf_t[i]);
399 _pdf.
load(file_name.c_str());
403 _npe[i] =
JNPE_t(_pdf, T_ns);
408 for (
int i = 1; i < NUMBER_OF_PDFS; i += 2) {
410 _npe[ i ].add(_npe[i-1]);
414 _npe[i-1].swap(buffer);
443 DIRECT_LIGHT_FROM_EMSHOWER,
444 SCATTERED_LIGHT_FROM_EMSHOWER
478 storage_type(fileDescriptor, T_ns),
514 const double x = D.getX();
515 const double y = D.getY();
516 const double d = D.getLength();
524 JNPE_t::result_type H0 = getH0(pmt.
getR());
525 JNPE_t::result_type H1 = getH1(d, cd, theta, phi, shower.
getE());
527 if (get_value(H1) >= Vmax_npe) {
528 H1 *= Vmax_npe / get_value(H1);
531 double signal_npe = get_value(H1);
535 double expectation = get_value(H1);
537 const bool hit = pmt.
getN() != 0;
538 const double u = H1.getChi2(hit) - H0.getChi2(hit);
542 result.chi2 = estimator->getRho(u);
544 double energy_gradient = signal_npe/shower.
getE();
545 if(hit) energy_gradient *= -exp(-expectation)/(1-exp(-expectation));
555 result.gradient.mul(estimator->getPsi(u));
556 static_cast<JShower3Z&
>(
result.gradient).mul(H1.getDerivativeOfChi2(hit) - H0.getDerivativeOfChi2(hit));
567 JNPE_t::result_type getH0(
const double R_Hz)
const
569 return JNPE_t::result_type(R_Hz * 1e-9 * T_ns.getLength(), 0.0);
582 JNPE_t::result_type getH1(
const double D,
586 const double E)
const
590 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
592 if (!npe[i].empty() && D <= npe[i].getXmax()) {
596 JNPE_t::result_type y1 = E * npe[i](std::max(D, npe[i].getXmin()), cd, theta, phi);
598 if (get_value(y1) > 0.0) {
604 ERROR(error << std::endl);
613 static double Vmax_npe;
617 std::shared_ptr<JMEstimator> estimator;
642 static const int NUMBER_OF_PDFS = 2;
669 const JPDF_t::JSupervisor supervisor(
new JPDF_t::JDefaultResult(
JMATH::zero));
671 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
673 const string file_name = getFilename(fileDescriptor, pdf_t[i]);
676 _pdf.
load(file_name.c_str());
680 _npe[i] =
JNPE_t(_pdf, T_ns);
685 for (
int i = 1; i < NUMBER_OF_PDFS; i += 2) {
687 _npe[i].add(_npe[i-1]);
691 _npe[i-1].swap(buffer);
721 DIRECT_LIGHT_FROM_EMSHOWER,
722 SCATTERED_LIGHT_FROM_EMSHOWER
757 storage_type(fileDescriptor, T_ns),
792 const double x = D.getX();
793 const double y = D.getY();
794 const double cd = z/D.getLength();
801 JNPE_t::result_type H0 = getH0(pmt.
getR());
802 JNPE_t::result_type H1 = getH1(D.getLength(), cd, theta, phi, shower.
getE());
804 if (get_value(H1) >= Vmax_npe) {
805 H1 *= Vmax_npe / get_value(H1);
810 const bool hit = pmt.
getN() != 0;
811 const double u =
getChi2(get_value(H1), hit) -
getChi2(get_value(H0), hit);
813 return estimator->getRho(u);
822 JNPE_t::result_type getH0(
const double R_Hz)
const
824 return JNPE_t::result_type(R_Hz * 1e-9 * T_ns.getLength());
837 JNPE_t::result_type getH1(
const double D,
841 const double E)
const
845 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
847 if (!npe[i].empty() && D <= npe[i].getXmax()) {
851 JNPE_t::result_type y1 = E * npe[i](std::max(D, npe[i].getXmin()), cd, theta, phi);
863 ERROR(error << std::endl);
878 JNPE_t::result_type getH1(
const JShower3EZ& shower,
const JPMTW0& pmt)
const
887 const double x = D.getX();
888 const double y = D.getY();
889 const double cd = z/D.getLength();
896 JNPE_t::result_type H1 = getH1(D.getLength(), cd, theta, phi, 1.0);
898 if (get_value(H1) >= Vmax_npe) {
899 H1 *= Vmax_npe / get_value(H1);
904 static double Vmax_npe;
908 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.