36 double ofac,
double hifac,
int *nout,
int *jmax,
double *prob,
46 double ave, c, cc, cwtau, effm, expy, pnow, pymax, s, ss, sumc, sumcy, sums, sumsh, sumsy;
47 double swtau, var, wtau, xave, xdiff, xmax, xmin, yy;
51 std::vector<double> wi, wpi, wpr, wr;
58 wi.erase(wi.begin(), wi.end());
59 wpi.erase(wpi.begin(), wpi.end());
60 wpr.erase(wpr.begin(), wpr.end());
61 wr.erase(wr.begin(), wr.end());
68 ntmp = (int)(0.5 * ofac * hifac * n);
72 if (
avevar(indata, &ave, &var) != 0) {
73 std::cerr <<
"LOMB: Average failed!\n";
80 for (p = indata->begin(); p != indata->end(); p++) {
81 if ((*p).x > xmax) xmax = (*p).x;
82 if ((*p).x < xmin) xmin = (*p).x;
86 xave = 0.5 * (xmax + xmin);
88 pnow = 1. / (xdiff * ofac);
90 for (p = indata->begin(); p != indata->end(); p++) {
93 wpr.push_back((-2. * std::pow(std::sin(0.5 *
arg) , 2)));
94 wpi.push_back(std::sin(
arg));
95 wr.push_back(std::cos(
arg));
96 wi.push_back(std::sin(
arg));
101 if ((wr.end() - wr.begin()) != n) {
102 std::cerr <<
"LOMB: Vector range mismatch!!!\n";
106 for (i = 0; i < (*nout); i++) {
111 for (j = 0; j < n; j++) {
116 sumc += (c - s) * (c + s);
119 wtau = 0.5 * std::atan2(2.0 * sumsh, sumc);
120 swtau = std::sin(wtau);
121 cwtau = std::cos(wtau);
127 for (j = 0, p = indata->begin() ; j < n && p != indata->end() ; j++, p++) {
130 ss = s * cwtau - c * swtau;
131 cc = c * cwtau + s * swtau;
138 wr[j] = (wr[j] * wpr[j] - wi[j] * wpi[j]) + wr[j];
139 wi[j] = (wi[j] * wpr[j] + wtemp * wpi[j]) + wi[j];
143 pt.
y = 0.5 * (sumcy * sumcy / sumc + sumsy * sumsy / sums) / var;
144 if (amp) pt.
y = std::sqrt(std::pow((sumcy / sumc), 2.) + std::pow((sumsy / sums), 2.));
151 outdata->push_back(pt);
153 pnow += 1. / (ofac * xdiff);
156 expy = std::exp(-pymax);
157 effm = 2. * (*nout) / ofac;
160 if (*prob > 0.01) *prob = 1. - std::pow((1. - expy), effm);
162 wi.erase(wi.begin(), wi.end());
163 wpi.erase(wpi.begin(), wpi.end());
164 wpr.erase(wpr.begin(), wpr.end());
165 wr.erase(wr.begin(), wr.end());
240 double *sdev,
double *var,
double *skew,
double *curt)
267 std::cerr <<
"To few data points for moment analysis!\n";
277 for (p = indata->begin(); p != indata->end(); p++) {
278 s += (*p).y * (*p).x;
282 *ave = s / (double)nn;
295 for (p = indata->begin(); p != indata->end(); p++) {
298 *adev = *adev + (double)std::abs((
double)s);
301 *var += pnr * (*p).y;
304 *skew += pnr * (*p).y;
307 *curt += pnr * (*p).y;
310 *adev = *adev / (double)nn;
312 *var = (*var - ep * ep / (double)nn) / ((double)(nn - 1));
314 *sdev = std::sqrt(*var);
317 *skew = *skew / ((double)nn * std::pow(*sdev, 3.));
318 *curt = *curt / ((double)nn * std::pow(*var, 2.)) - 3.;
320 std::cerr <<
"No skew or kurtosis when zero variance in moment\n";