4 #include <utl/AugerUnits.h>
6 #include <Math/PdfFuncMathCore.h>
7 #include <Math/ProbFuncMathCore.h>
8 #include <Math/QuantFuncMathCore.h>
39 namespace UnivTimeKG {
46 unsigned int imin = 0;
47 unsigned int imax = array.size() - 1;
49 while (imax - imin > 1) {
50 const unsigned int i = (imax + imin) / 2;
51 if (array[i] <= value)
55 if (array[i] == value)
63 int1_2p(
const double x0,
const double y0,
const double x1,
const double y1,
const double x)
65 return y0 + (y1 - y0) * (x - x0) / (x1 - x0);
70 int1(
const vector<double>& xs,
const vector<double>& ys,
const double x)
73 const double x0 = xs[i];
74 const double x1 = xs[i + 1];
75 const double y0 = ys[i];
76 const double y1 = ys[i + 1];
77 return int1_2p(x0, y0, x1, y1, x);
82 int1(
const double xs[],
const double ys[],
const double x,
const int n)
84 const vector<double> vxs(xs, xs + n);
85 const vector<double> vys(ys, ys + n);
86 return int1(vxs, vys, x);
91 int2(
const vector<double>& x1s,
const vector<double>& x2s,
const vector<vector<double> >& Ys,
const double x1,
const double x2)
93 const unsigned int j =
FindIndex(x2s, x2);
94 const double x21 = x2s[j];
95 const double x22 = x2s[j + 1];
97 const double fx1 =
int1(x1s, Ys[j], x1);
98 const double fx2 =
int1(x1s, Ys[j + 1], x1);
99 const double fxy =
int1_2p(x21, fx1, x22, fx2, x2);
114 TimeModel::addInterpolationTable(
const vector<double>& rs,
const vector<double>& psis,
const vector<vector<double> >& ys)
125 TimeModel::addInterpolationTable(
const std::string&
filename)
127 ifstream
file(filename.c_str());
131 vector<vector<double> > ys;
133 unsigned int Nr, Npsi;
134 if (!(
file >> Nr >> Npsi)) {
135 cerr <<
"error reading file!" << endl;
141 for (
unsigned int i = 0; i < Nr; ++i) {
145 cerr <<
"error reading file!" << endl;
150 for (
unsigned int j = 0; j < Npsi; ++j) {
154 cerr <<
"error reading file!" << endl;
159 for (
unsigned int i = 0; i < Nr; ++i) {
161 for (
unsigned int j = 0; j < Npsi; ++j) {
165 cerr <<
"error reading file!" << endl;
172 addInterpolationTable(rs, psis, ys);
177 TimeModel::clearInterpolationTables()
184 TimeModel::interpolateParameters(
const double DX,
const double r,
const double ppsi, vector<double>& output)
189 if (interpMode == 0) {
190 vector<double> intp_pars;
191 for (
unsigned int i = 0, n = tables.size(); i < n; ++i) {
196 for (
unsigned int ipar = 0; ipar < nParams; ++ipar)
197 output.push_back(getShapeParameter(ipar, intp_pars, DX));
204 const vector<double> gp_rs(t0.
rs.begin() + ir, t0.
rs.begin() + ir + 2);
205 const vector<double> gp_psis(t0.
psis.begin() + ip, t0.
psis.begin() + ip + 2);
207 for (
unsigned int ipar = 0; ipar < nParams; ++ipar) {
208 vector<vector<double> > gpshapepars;
210 for (
unsigned int cur_ir = ir; cur_ir <= ir + 1; ++cur_ir) {
213 for (
unsigned int cur_ip = ip; cur_ip <= ip + 1; ++cur_ip) {
215 vector<double> gppars;
216 for (
unsigned int i = 0, n = tables.size(); i < n; ++i)
217 gppars.push_back(tables[i].ys[cur_ir][cur_ip]);
218 tmp.push_back(getShapeParameter(ipar, gppars, DX));
221 gpshapepars.push_back(tmp);
224 output.push_back(
int2(gp_psis, gp_rs, gpshapepars, psi, r));
231 TimeModel::firstParticlePdf(
const double t,
const double npart)
233 return npart *
pow((1 - cdf(t)), npart - 1) * pdf(t);
238 TimeModel::firstParticlePdfSmeared(
const double t,
const double npart)
240 const double sigma = 25;
241 const double dtau = 2;
243 for (
double tau = -3 * sigma; tau < 3 * sigma; tau += dtau)
244 f += ROOT::Math::normal_pdf(tau, sigma, 0) * firstParticlePdf(t - tau, npart) * dtau;
250 TimeModel::getRisetime()
252 return invcdf(0.5) - invcdf(0.1);
257 TimeModel::getFalltime()
259 return invcdf(0.9) - invcdf(0.5);
double NormalizeAngleMinusPiPi(const double x)
Normalize angle to lie between -pi and pi (-180 and 180 deg)
unsigned int FindIndex(const vector< double > &array, const double value)
double int2(const vector< double > &x1s, const vector< double > &x2s, const vector< vector< double > > &Ys, const double x1, const double x2)
double pow(const double x, const unsigned int i)
double int1_2p(const double x0, const double y0, const double x1, const double y1, const double x)
double int1(const vector< double > &xs, const vector< double > &ys, const double x)
std::vector< double > psis
std::vector< std::vector< double > > ys
TimeModel(double angle_in, int primary, int Da_flag_in=1)