1 #ifndef _ScintillatorLDFFinderKG_LikelihoodFunctions_h_
2 #define _ScintillatorLDFFinderKG_LikelihoodFunctions_h_
9 #include <Minuit2/FCNBase.h>
11 #include <utl/CoordinateSystemPtr.h>
12 #include <utl/Vector.h>
13 #include <utl/Point.h>
15 #include <utl/PhysicalFunctions.h>
20 namespace ScintillatorLDFFinderKG {
30 const double scal = axis*station;
31 return std::sqrt(station*station - scal*scal);
38 const double s = std::log10(showerSize);
39 const double sec = 1. / cosTheta;
41 const double f0 = 303.242;
42 const double f1 = -355.686;
43 const double f2 = 171.659;
44 const double f3 = 586.443;
45 const double f4 = 1309.454;
46 const double f5 = -544.919;
47 const double f6 = 156.465;
48 const double f7 = -558.186;
49 const double f8 = 236.191;
51 const double distcut = f0 + f1*sec + f2*sec*sec
52 + (f3 + f4*sec + f5*sec*sec)*s
53 + (f6 + f7*sec + f8*sec*sec)*s*
s;
89 const std::vector<StationFitData>&
data)
108 const double showerSize = pars[0];
113 std::vector<double> shape(pars.begin()+3, pars.end());
114 const std::vector<double> modeledShape =
116 for (
unsigned int i = 0, n = shape.size(); i < n; ++i)
118 shape[i] = modeledShape[i];
123 double logLikelihood = 0;
125 for (std::vector<StationFitData>::const_iterator sIt =
fData.begin(), end =
fData.end();
127 const utl::Vector coreToStation = sIt->fPos - core;
130 const double signalPrediction = showerSize *
fConfig.
fLDF(rho, shape);
131 const double particlePrediction = poissonFactor * signalPrediction;
133 if (sIt->fSignal > 0) {
135 const double particlesInScintillator = poissonFactor * sIt->fSignal;
136 const double sigma = poissonFactor *
139 if (sIt->fIsSaturated)
142 if (particlePrediction > 30) {
147 logLikelihood += particlesInScintillator * std::log(particlePrediction) - particlePrediction;
148 double logarithmicFactor = 0;
149 const int stop = int(particlesInScintillator + 0.5);
150 for (
int j = 1; j <= stop; ++j)
151 logarithmicFactor += std::log(
double(j));
153 logLikelihood -= logarithmicFactor;
162 double Up()
const {
return 0.5; }
167 const std::vector<StationFitData>&
fData;
176 const std::vector<StationFitData>&
data)
193 const double showerSize = pars[0];
198 std::vector<double> shape(pars.begin()+3, pars.end());
199 const std::vector<double> modeledShape =
202 for (
unsigned int i = 0, n = shape.size(); i < n; ++i)
204 shape[i] = modeledShape[i];
206 double logLikelihood = 0;
208 for (std::vector<StationFitData>::const_iterator sIt =
fData.begin(), end =
fData.end();
210 const utl::Vector coreToStation = sIt->fPos - core;
212 const double signal = sIt->fSignal;
213 const double signalPrediction = showerSize *
fConfig.
fLDF(rho, shape);
231 if (corePropagationEnabled){
241 if (sIt->fIsSaturated)
244 logLikelihood += - 0.5*std::log(2*M_PI*
utl::Sqr(sigma))
245 - 0.5*
utl::Sqr((signal - signalPrediction) / sigma)
246 - std::log(0.5*(1 + std::erfc(signalPrediction / (
std::sqrt(2)*sigma))));
254 double Up()
const {
return 0.5; }
259 const std::vector<StationFitData>&
fData;
268 const std::vector<StationFitData>&
data)
275 const double showerSize = pars[0];
280 std::vector<double> shape(pars.begin()+3, pars.end());
281 const std::vector<double> modeledShape =
283 for (
unsigned int i = 0, n = shape.size(); i < n; ++i)
285 shape[i] = modeledShape[i];
289 for (std::vector<StationFitData>::const_iterator sIt =
fData.begin(), end =
fData.end();
293 if (sIt->fSignal > 0) {
294 const double predictedSignal = showerSize *
fConfig.
fLDF(rho, shape);
295 if (sIt->fIsSaturated)
298 const double signal = sIt->fSignal;
302 const double dev = (signal - predictedSignal) / sigma;
310 double Up()
const {
return 1; }
315 const std::vector<StationFitData>&
fData;
bool fCorePropagationEnabled
const utl::Vector & fShowerAxis
LDFLikelihoodFunctionTN(const LDFFitConfig &config, const utl::Vector &showerAxis, const std::vector< StationFitData > &data)
constexpr T Sqr(const T &x)
LDFLikelihoodFunction(const LDFFitConfig &config, const utl::Vector &showerAxis, const std::vector< StationFitData > &data)
const utl::Vector & fShowerAxis
std::vector< double > ShapeModel(const double cosTheta, const double showerSize) const
double GetCosTheta(const CoordinateSystemPtr &coordinateSystem) const
cos of zenith (theta) angle
double RPerp(const utl::Vector &axis, const utl::Vector &station)
double operator()(const std::vector< double > &pars) const
boost::shared_ptr< const CoordinateTransformer > CoordinateSystemPtr
Shared pointer for coordinate systems.
const LDFFitConfig & fConfig
double operator()(const std::vector< double > &pars) const
const utl::Vector & fShowerAxis
double SignalUncertaintyFactor(const ESignalVarianceModel model, const double cosTheta)
const LDFFitConfig & fConfig
LDFChi2Function(const LDFFitConfig &config, const utl::Vector &showerAxis, const std::vector< StationFitData > &data)
std::vector< ParameterTreatment > fLDFShapeTreatment
const LDFFitConfig & fConfig
utl::CoordinateSystemPtr gBaryCS
double DistanceCut(const double showerSize, const double cosTheta)
double PoissonFactor(const double sigmaFactor)
double SignalUncertainty(const ESignalVarianceModel model, const double cosTheta, const double signal)
const std::vector< StationFitData > & fData
const std::vector< StationFitData > & fData
const std::vector< StationFitData > & fData
double FirstDerivative(const double r, const std::vector< double > &shape) const
utl::ssd::ESignalVarianceModel fSignalVarianceModel
double LogarithmOfNormalPDF(const double x)
double operator()(const std::vector< double > &pars) const