# astrobase.periodbase.smav module¶

Contains the Schwarzenberg-Czerny Analysis of Variance period-search algorithm implementation for periodbase. This uses the multi-harmonic version presented in Schwarzenberg-Czerny (1996).

`astrobase.periodbase.smav.``aovhm_theta`(times, mags, errs, frequency, nharmonics, magvariance)[source]

This calculates the harmonic AoV theta statistic for a frequency.

This is a mostly faithful translation of the inner loop in aovper.f90. See the following for details:

Schwarzenberg-Czerny (1996) equation 11:

```theta_prefactor = (K - 2N - 1)/(2N)
theta_top = sum(c_n*c_n) (from n=0 to n=2N)
theta_bot = variance(timeseries) - sum(c_n*c_n) (from n=0 to n=2N)

theta = theta_prefactor * (theta_top/theta_bot)

N = number of harmonics (nharmonics)
K = length of time series (times.size)
```
Parameters: times,mags,errs (np.array) – The input time-series to calculate the test statistic for. These should all be of nans/infs and be normalized to zero. frequency (float) – The test frequency to calculate the statistic for. nharmonics (int) – The number of harmonics to calculate up to.The recommended range is 4 to 8. magvariance (float) – This is the (weighted by errors) variance of the magnitude time series. We provide it as a pre-calculated value here so we don’t have to re-calculate it for every worker. aov_harmonic_theta – THe value of the harmonic AoV theta for the specified test frequency. float
`astrobase.periodbase.smav.``aovhm_periodfind`(times, mags, errs, magsarefluxes=False, startp=None, endp=None, stepsize=0.0001, autofreq=True, normalize=True, nharmonics=6, nbestpeaks=5, periodepsilon=0.1, sigclip=10.0, nworkers=None, verbose=True)[source]

This runs a parallelized harmonic Analysis-of-Variance (AoV) period search.

NOTE: normalize = True here as recommended by Schwarzenberg-Czerny 1996, i.e. mags will be normalized to zero and rescaled so their variance = 1.0.

Parameters: times,mags,errs (np.array) – The mag/flux time-series with associated measurement errors to run the period-finding on. magsarefluxes (bool) – If the input measurement values in mags and errs are in fluxes, set this to True. startp,endp (float or None) – The minimum and maximum periods to consider for the transit search. stepsize (float) – The step-size in frequency to use when constructing a frequency grid for the period search. autofreq (bool) – If this is True, the value of stepsize will be ignored and the `astrobase.periodbase.get_frequency_grid()` function will be used to generate a frequency grid based on startp, and endp. If these are None as well, startp will be set to 0.1 and endp will be set to times.max() - times.min(). normalize (bool) – This sets if the input time-series is normalized to 0.0 and rescaled such that its variance = 1.0. This is the recommended procedure by Schwarzenberg-Czerny 1996. nharmonics (int) – The number of harmonics to use when calculating the AoV theta value at a test frequency. This should be between 4 and 8 in most cases. nbestpeaks (int) – The number of ‘best’ peaks to return from the periodogram results, starting from the global maximum of the periodogram peak values. periodepsilon (float) – The fractional difference between successive values of ‘best’ periods when sorting by periodogram power to consider them as separate periods (as opposed to part of the same periodogram peak). This is used to avoid broad peaks in the periodogram and make sure the ‘best’ periods returned are all actually independent. sigclip (float or int or sequence of two floats/ints or None) – If a single float or int, a symmetric sigma-clip will be performed using the number provided as the sigma-multiplier to cut out from the input time-series. If a list of two ints/floats is provided, the function will perform an ‘asymmetric’ sigma-clip. The first element in this list is the sigma value to use for fainter flux/mag values; the second element in this list is the sigma value to use for brighter flux/mag values. For example, sigclip=[10., 3.], will sigclip out greater than 10-sigma dimmings and greater than 3-sigma brightenings. Here the meaning of “dimming” and “brightening” is set by physics (not the magnitude system), which is why the magsarefluxes kwarg must be correctly set. If sigclip is None, no sigma-clipping will be performed, and the time-series (with non-finite elems removed) will be passed through to the output. nworkers (int) – The number of parallel workers to use when calculating the periodogram. verbose (bool) – If this is True, will indicate progress and details about the frequency grid used for the period search. This function returns a dict, referred to as an lspinfo dict in other astrobase functions that operate on periodogram results. This is a standardized format across all astrobase period-finders, and is of the form below: ```{'bestperiod': the best period value in the periodogram, 'bestlspval': the periodogram peak associated with the best period, 'nbestpeaks': the input value of nbestpeaks, 'nbestlspvals': nbestpeaks-size list of best period peak values, 'nbestperiods': nbestpeaks-size list of best periods, 'lspvals': the full array of periodogram powers, 'periods': the full array of periods considered, 'method':'mav' -> the name of the period-finder method, 'kwargs':{ dict of all of the input kwargs for record-keeping}} ``` dict
`astrobase.periodbase.smav.``analytic_false_alarm_probability`(lspinfo, times, conservative_nfreq_eff=True, peakvals=None, inplace=True)[source]

This returns the analytic false alarm probabilities for periodogram peak values.

FIXME: this doesn’t actually work. Fix later.

The calculation follows that on page 3 of Zechmeister & Kurster (2009):

```FAP = 1 − [1 − Prob(z > z0)]**M
```

where:

```M is the number of independent frequencies
Prob(z > z0) is the probability of peak with value > z0
z0 is the peak value we're evaluating
```

For AoV and AoV-harmonic, the Prob(z > z0) is described by the F distribution, according to:

This is given by:

```F( 2N, K - 2N - 1; theta_aov )
```

Where:

```N = number of harmonics used for AOV_harmonic
K = number of observations
```

This translates to a scipy.stats call to the F distribution CDF:

```x = theta_aov_best
prob_exceeds_val = scipy.stats.f.cdf(x, 2N, K - 2N - 1)
```

Which we can then plug into the false alarm prob eqn above with the calculation of M.

Parameters: lspinfo (dict) – The dict returned by the `aovhm_periodfind()` function. times (np.array) – The times for which the periodogram result in `lspinfo` was calculated. conservative_nfreq_eff (bool) – If True, will follow the prescription given in Schwarzenberg-Czerny (2003): http://adsabs.harvard.edu/abs/2003ASPC..292..383S and estimate the effective number of independent frequences M_eff as: ```min(N_obs, N_freq, DELTA_f/delta_f) ``` peakvals (sequence or None) – The peak values for which to evaluate the false-alarm probability. If None, will calculate this for each of the peak values in the `nbestpeaks` key of the `lspinfo` dict. inplace (bool) – If True, puts the results of the FAP calculation into the `lspinfo` dict as a list available as `lspinfo['falsealarmprob']`. The calculated false alarm probabilities for each of the peak values in `peakvals`. list