1#ifndef __JFIT__JSHOWER3EZREGRESSOR__
2#define __JFIT__JSHOWER3EZREGRESSOR__
57 const double epsilon = 1.0e-6;
74 double Tx = value.
getDX();
75 double Ty = value.
getDY();
76 double E = max(0.0,value.
getE());
77 const double u = hypot(Tx, Ty);
125 const JPDF_t::JSupervisor supervisor(
new JPDF_t::JDefaultResult(
JMATH::zero));
127 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
133 const string file_name = getFilename(fileDescriptor, pdf_t[i]);
135 NOTICE(
"loading PDF from file " << file_name <<
"... " << flush);
137 pdf.
load(file_name.c_str());
151 for (
int i = 1; i < NUMBER_OF_PDFS; i += 2) {
153 npe[ i ].add(npe[i-1]);
157 npe[i-1].swap(buffer);
179 const double x = D.
getX();
180 const double y = D.
getY();
191 if (get_value(H1) >= Vmax_npe) {
192 H1 *= Vmax_npe / get_value(H1);
197 const bool hit = pmt.
getN() != 0;
198 const double u =
getChi2(get_value(H1), hit) -
getChi2(get_value(H0), hit);
200 return estimator->getRho(u);
228 const double E)
const
232 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
234 if (!npe[i].empty() && D <= npe[i].getXmax()) {
250 ERROR(error << std::endl);
262 static const int NUMBER_OF_PDFS = 2;
303 JRegressor(
const std::string& fileDescriptor):
309 const JPDF_t::JSupervisor supervisor(
new JPDF_t::JDefaultResult(
JMATH::zero));
311 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
317 const string file_name = getFilename(fileDescriptor, pdf_t[i]);
319 NOTICE(
"loading PDF from file " << file_name <<
"... " << flush);
321 pdf.load(file_name.c_str());
325 pdf.setExceptionHandler(supervisor);
327 npe[i] = JNPE_t(pdf);
335 for (
int i = 1; i < NUMBER_OF_PDFS; i += 2) {
337 npe[ i ].add(npe[i-1]);
341 npe[i-1].swap(buffer);
363 const double x = D.getX();
364 const double y = D.getY();
365 const double d = D.getLength();
373 JNPE_t::result_type H0 = getH0(pmt.
getR());
374 JNPE_t::result_type H1 = getH1(d, cd, theta, phi, shower.
getE());
376 if (get_value(H1) >= Vmax_npe) {
377 H1 *= Vmax_npe / get_value(H1);
380 double signal_npe = get_value(H1);
384 double expectation = get_value(H1);
386 const bool hit = pmt.
getN() != 0;
387 const double u = H1.getChi2(hit) - H0.getChi2(hit);
391 result.chi2 = estimator->getRho(u);
393 double energy_gradient = signal_npe/shower.
getE();
394 if(hit) energy_gradient *= -exp(-expectation)/(1-exp(-expectation));
404 result.gradient.mul(estimator->getPsi(u));
405 static_cast<JShower3Z&
>(
result.gradient).mul(H1.getDerivativeOfChi2(hit) - H0.getDerivativeOfChi2(hit));
416 JNPE_t::result_type getH0(
const double R_Hz)
const
418 return JNPE_t::result_type(R_Hz * 1e-9 * T_ns.getLength(), 0.0);
431 JNPE_t::result_type getH1(
const double D,
435 const double E)
const
439 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
441 if (!npe[i].empty() && D <= npe[i].getXmax()) {
445 JNPE_t::result_type y1 = E * npe[i](std::max(D, npe[i].getXmin()), cd, theta, phi);
447 if (get_value(y1) > 0.0) {
453 ERROR(error << std::endl);
463 static double Vmax_npe;
465 static const int NUMBER_OF_PDFS = 2;
469 JNPE_t npe[NUMBER_OF_PDFS];
505 JRegressor(
const std::string& fileDescriptor):
511 const JPDF_t::JSupervisor supervisor(
new JPDF_t::JDefaultResult(
JMATH::zero));
513 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
519 const string file_name = getFilename(fileDescriptor, pdf_t[i]);
521 NOTICE(
"loading PDF from file " << file_name <<
"... " << flush);
523 pdf.load(file_name.c_str());
527 pdf.setExceptionHandler(supervisor);
529 npe[ i ] = JNPE_t(pdf);
537 for (
int i = 1; i < NUMBER_OF_PDFS; i += 2) {
539 npe[ i ].add(npe[i-1]);
543 npe[i-1].swap(buffer);
565 const double x = D.getX();
566 const double y = D.getY();
567 const double cd = z/D.getLength();
574 JNPE_t::result_type H0 = getH0(pmt.
getR());
575 JNPE_t::result_type H1 = getH1(D.getLength(), cd, theta, phi, shower.
getE());
577 if (get_value(H1) >= Vmax_npe) {
578 H1 *= Vmax_npe / get_value(H1);
583 const bool hit = pmt.
getN() != 0;
584 const double u =
getChi2(get_value(H1), hit) -
getChi2(get_value(H0), hit);
586 return estimator->getRho(u);
595 JNPE_t::result_type getH0(
const double R_Hz)
const
597 return JNPE_t::result_type(R_Hz * 1e-9 * T_ns.getLength());
610 JNPE_t::result_type getH1(
const double D,
614 const double E)
const
618 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
620 if (!npe[i].empty() && D <= npe[i].getXmax()) {
624 JNPE_t::result_type y1 = E * npe[i](std::max(D, npe[i].getXmin()), cd, theta, phi);
636 ERROR(error << std::endl);
651 JNPE_t::result_type getH1(
const JShower3EZ& shower,
const JPMTW0& pmt)
const
660 const double x = D.getX();
661 const double y = D.getY();
662 const double cd = z/D.getLength();
669 JNPE_t::result_type H1 = getH1(D.getLength(), cd, theta, phi, 1.0);
671 if (get_value(H1) >= Vmax_npe) {
672 H1 *= Vmax_npe / get_value(H1);
678 static double Vmax_npe;
680 static const int NUMBER_OF_PDFS = 2;
682 static const JPDFType_t pdf_t[NUMBER_OF_PDFS];
684 JNPE_t npe[NUMBER_OF_PDFS];
694 SCATTERED_LIGHT_FROM_EMSHOWER };
697 SCATTERED_LIGHT_FROM_EMSHOWER };
699 SCATTERED_LIGHT_FROM_EMSHOWER };
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.
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.
virtual const char * what() const override
Get error message.
The template JSharedPointer class can be used to share a pointer to an object.
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.
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.
JPHYSICS::JPDFTable< JFunction1D_t, JPDFMaplist_t > JPDF_t
JLANG::JSharedPointer< JMEstimator > estimator
M-Estimator function.
JTOOLS::JMapList< JTOOLS::JPolint0FunctionalMap, JTOOLS::JMapList< JTOOLS::JPolint0FunctionalMap, JTOOLS::JMapList< JTOOLS::JPolint0FunctionalGridMap, JTOOLS::JMapList< JTOOLS::JPolint0FunctionalGridMap > > > > JPDFMaplist_t
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.
double operator()(const JShower3EZ &shower, const JPMTW0 &pmt) const
Fit function.
JTOOLS::JMapList< JTOOLS::JPolint0FunctionalMap, JTOOLS::JMapList< JTOOLS::JPolint0FunctionalMap, JTOOLS::JMapList< JTOOLS::JPolint0FunctionalGridMap, JTOOLS::JMapList< JTOOLS::JPolint0FunctionalGridMap > > > > JNPEMaplist_t
static JTimeRange T_ns
Time window with respect to Cherenkov hypothesis [ns].
JRegressor(const std::string &fileDescriptor)
Parameterized constructor.
JTOOLS::JSplineFunction1S_t JFunction1D_t
JPHYSICS::JNPETable< double, double, JNPEMaplist_t > JNPE_t
Template definition of a data regressor of given model.
void load(const char *file_name)
Load from input file.