1 #ifndef _LDFFinderKG_LikelihoodFunctions_h_
2 #define _LDFFinderKG_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 LDFFinderKG {
30 const double scal = axis*station;
31 return std::sqrt(station*station - scal*scal);
82 const std::vector<StationFitData>&
data)
99 const double showerSize = pars[0];
104 std::vector<double> shape(pars.begin()+3, pars.end());
105 const std::vector<double> modeledShape =
107 for (
unsigned int i = 0, n = shape.size(); i < n; ++i)
109 shape[i] = modeledShape[i];
114 double logLikelihood = 0;
116 for (std::vector<StationFitData>::const_iterator sIt =
fData.begin(), end =
fData.end();
118 const utl::Vector coreToStation = sIt->fPos - core;
121 const double signalPrediction = showerSize *
fConfig.
fLDF(rho, shape);
122 const double particlePrediction = poissonFactor * signalPrediction;
124 if (sIt->fSignal > 0) {
126 const double particlesInStation = poissonFactor * sIt->fSignal;
127 const double sigma = poissonFactor *
130 if (sIt->fIsSaturated) {
133 const double n = poissonFactor * sIt->fRecoveredSignal;
134 const double dn = poissonFactor * sIt->fRecoveredSignalErr;
138 const double signal = (sIt->fRecoveredSignal > sIt->fSignal) ?
139 (sIt->fRecoveredSignal - sIt->fRecoveredSignalErr) : sIt->fSignal;
140 const double n = poissonFactor * signal;
144 if (particlesInStation > 30) {
152 logLikelihood += particlesInStation * std::log(particlePrediction) - particlePrediction;
154 double logarithmicFactor = 0;
155 const int stop = int(particlesInStation + 0.5);
156 for (
int j = 1; j <= stop; ++j)
157 logarithmicFactor += std::log(
double(j));
159 logLikelihood -= logarithmicFactor;
165 logLikelihood += particlePrediction > 0.03 ?
166 -particlePrediction +
168 particlePrediction * (1 +
169 0.5*particlePrediction * (1 +
170 (1./3)*particlePrediction
187 double Up()
const {
return 0.5; }
192 const std::vector<StationFitData>&
fData;
201 const std::vector<StationFitData>&
data)
208 const double& pu = pars[0];
209 const double& pv = pars[1];
210 const double& rCore = pars[2];
211 const double& cTCore = pars[3];
213 const double pw =
std::sqrt(1 + pu*pu + pv*pv);
214 const double u = pu/pw;
215 const double v = pv/pw;
217 const double w =
std::sqrt(1 - u*u - v*v);
223 for (
const auto& st :
fData) {
228 const utl::Vector stationToCenter = stationToCore + rCore*axis;
229 const double rStation = stationToCenter.
GetMag();
231 const double cosThetaStation = stationToCenter.
GetZ(
gBaryCS) / rStation;
233 const double sigma2 =
237 const double cdt = (st.fCTime - rStation) - (cTCore - rCore);
244 double Up()
const {
return 1; }
248 const std::vector<StationFitData>&
fData;
264 const double u = pars[0];
265 const double v = pars[1];
266 const double w =
std::sqrt(1 - u*u - v*v);
272 const std::vector<double> curvPars(pars.begin(), pars.begin()+4);
273 const std::vector<double> ldfPars(pars.begin()+4, pars.end());
277 double Up()
const {
return 0.5; }
293 const std::vector<StationFitData>&
data)
300 const double showerSize = pars[0];
305 std::vector<double> shape(pars.begin()+3, pars.end());
306 const std::vector<double> modeledShape =
308 for (
unsigned int i = 0, n = shape.size(); i < n; ++i)
310 shape[i] = modeledShape[i];
314 for (std::vector<StationFitData>::const_iterator sIt =
fData.begin(), end =
fData.end();
318 if (sIt->fSignal > 0) {
319 const double predictedSignal = showerSize *
fConfig.
fLDF(rho, shape);
321 sIt->fRecoveredSignal > 0 &&
322 sIt->fRecoveredSignalErr > 0;
324 if (sIt->fIsSaturated && !useRecovery)
327 const double signal = sIt->fIsSaturated ? sIt->fRecoveredSignal : sIt->fSignal;
330 const double sigma = sIt->fIsSaturated ?
334 const double dev = (signal - predictedSignal) / sigma;
348 double Up()
const {
return 1; }
353 const std::vector<StationFitData>&
fData;
double LogarithmOfNormalComplementCDF(const double x)
const sdet::STimeVariance & fTimeVarModel
double fSilentRadiusTransition
constexpr T Sqr(const T &x)
const CurvatureChi2Function fCurvPart
double RPerp(const utl::Vector &axis, const utl::Vector &station)
double GetCosTheta(const CoordinateSystemPtr &coordinateSystem) const
cos of zenith (theta) angle
std::vector< double > ShapeModel(const double cosTheta, const double showerSize) const
utl::CoordinateSystemPtr gBaryCS
const std::vector< StationFitData > & fData
const utl::Vector & fShowerAxis
double fSilentSignalThreshold
boost::shared_ptr< const CoordinateTransformer > CoordinateSystemPtr
Shared pointer for coordinate systems.
double Fermi(const double x)
GlobalFitFunction(const LDFFitConfig &config, const std::vector< StationFitData > &data)
const LDFFitConfig & fConfig
const LDFLikelihoodFunction fLDFPart
LDFLikelihoodFunction(const LDFFitConfig &config, const utl::Vector &showerAxis, const std::vector< StationFitData > &data)
const std::vector< StationFitData > & fData
std::vector< ParameterTreatment > fLDFShapeTreatment
bool fUseAdditionalGPSTimeVariance
CurvatureChi2Function(const utl::Point &core, const std::vector< StationFitData > &data)
double fRecoveryThreshold
constexpr double kSpeedOfLight
double operator()(const std::vector< double > &pars) const
const std::vector< StationFitData > & fData
double SignalUncertainty(const ESignalVarianceModel model, const double cosTheta, const double signal)
utl::wcd::ESignalVarianceModel fSignalVarianceModel
double fRecoveredSignalErr
double operator()(const std::vector< double > &pars) const
double SignalUncertaintyFactor(const ESignalVarianceModel model, const double cosTheta)
bool fUseSaturationRecovery
LDFChi2Function(const LDFFitConfig &config, const utl::Vector &showerAxis, const std::vector< StationFitData > &data)
double GetZ(const CoordinateSystemPtr &coordinateSystem) const
const LDFFitConfig & fConfig
double LogarithmOfNormalPDF(const double x)
const utl::Vector & fShowerAxis
double PoissonFactor(const double sigmaFactor)
double operator()(const std::vector< double > &pars) const
double operator()(const std::vector< double > &pars) const
double GetTimeSigma2(const double signal, const double t50, const double cosTheta, const double distance=0) const