File: C:/Users/fred/anaconda3/Lib/site-packages/astropy/timeseries/periodograms/bls/tests/test_bls.py
# Licensed under a 3-clause BSD style license - see LICENSE.rst
import numpy as np
import pytest
from numpy.testing import assert_allclose, assert_equal
from astropy import units as u
from astropy.tests.helper import assert_quantity_allclose
from astropy.time import Time, TimeDelta
from astropy.timeseries.periodograms.bls import BoxLeastSquares
from astropy.timeseries.periodograms.lombscargle.core import has_units
def assert_allclose_blsresults(blsresult, other, **kwargs):
"""Assert that another BoxLeastSquaresResults object is consistent
This method loops over all attributes and compares the values using
:func:`~astropy.tests.helper.assert_quantity_allclose` function.
Parameters
----------
other : BoxLeastSquaresResults
The other results object to compare.
"""
for k, v in blsresult.items():
if k not in other:
raise AssertionError(f"missing key '{k}'")
if k == "objective":
assert (
v == other[k]
), f"Mismatched objectives. Expected '{v}', got '{other[k]}'"
continue
assert_quantity_allclose(v, other[k], **kwargs)
# NOTE: PR 10644 replaced deprecated usage of RandomState but could not
# find a new seed that did not cause test failure, resorted to hardcoding.
@pytest.fixture
def data():
t = np.array(
[
6.96469186,
2.86139335,
2.26851454,
5.51314769,
7.1946897,
4.2310646,
9.80764198,
6.84829739,
4.80931901,
3.92117518,
3.43178016,
7.29049707,
4.38572245,
0.59677897,
3.98044255,
7.37995406,
1.8249173,
1.75451756,
5.31551374,
5.31827587,
6.34400959,
8.49431794,
7.24455325,
6.11023511,
7.22443383,
3.22958914,
3.61788656,
2.28263231,
2.93714046,
6.30976124,
0.9210494,
4.33701173,
4.30862763,
4.93685098,
4.2583029,
3.12261223,
4.26351307,
8.93389163,
9.44160018,
5.01836676,
6.23952952,
1.15618395,
3.17285482,
4.14826212,
8.66309158,
2.50455365,
4.83034264,
9.85559786,
5.19485119,
6.12894526,
1.20628666,
8.26340801,
6.03060128,
5.45068006,
3.42763834,
3.04120789,
4.17022211,
6.81300766,
8.75456842,
5.10422337,
6.69313783,
5.85936553,
6.24903502,
6.74689051,
8.42342438,
0.83194988,
7.63682841,
2.43666375,
1.94222961,
5.72456957,
0.95712517,
8.85326826,
6.27248972,
7.23416358,
0.16129207,
5.94431879,
5.56785192,
1.58959644,
1.53070515,
6.95529529,
3.18766426,
6.91970296,
5.5438325,
3.88950574,
9.2513249,
8.41669997,
3.57397567,
0.43591464,
3.04768073,
3.98185682,
7.0495883,
9.95358482,
3.55914866,
7.62547814,
5.93176917,
6.91701799,
1.51127452,
3.98876293,
2.40855898,
3.43456014,
5.13128154,
6.6662455,
1.05908485,
1.30894951,
3.21980606,
6.61564337,
8.46506225,
5.53257345,
8.54452488,
3.84837811,
3.16787897,
3.54264676,
1.71081829,
8.29112635,
3.38670846,
5.52370075,
5.78551468,
5.21533059,
0.02688065,
9.88345419,
9.05341576,
2.07635861,
2.92489413,
5.20010153,
9.01911373,
9.83630885,
2.57542064,
5.64359043,
8.06968684,
3.94370054,
7.31073036,
1.61069014,
6.00698568,
8.65864458,
9.83521609,
0.7936579,
4.28347275,
2.0454286,
4.50636491,
5.47763573,
0.9332671,
2.96860775,
9.2758424,
5.69003731,
4.57411998,
7.53525991,
7.41862152,
0.48579033,
7.08697395,
8.39243348,
1.65937884,
7.80997938,
2.86536617,
3.06469753,
6.65261465,
1.11392172,
6.64872449,
8.87856793,
6.96311268,
4.40327877,
4.38214384,
7.65096095,
5.65642001,
0.84904163,
5.82671088,
8.14843703,
3.37066383,
9.2757658,
7.50717,
5.74063825,
7.51643989,
0.79148961,
8.59389076,
8.21504113,
9.0987166,
1.28631198,
0.81780087,
1.38415573,
3.9937871,
4.24306861,
5.62218379,
1.2224355,
2.01399501,
8.11644348,
4.67987574,
8.07938209,
0.07426379,
5.51592726,
9.31932148,
5.82175459,
2.06095727,
7.17757562,
3.7898585,
6.68383947,
0.29319723,
6.35900359,
0.32197935,
7.44780655,
4.72913002,
1.21754355,
5.42635926,
0.66774443,
6.53364871,
9.96086327,
7.69397337,
5.73774114,
1.02635259,
6.99834075,
6.61167867,
0.49097131,
7.92299302,
5.18716591,
4.25867694,
7.88187174,
4.11569223,
4.81026276,
1.81628843,
3.213189,
8.45532997,
1.86903749,
4.17291061,
9.89034507,
2.36599812,
9.16832333,
9.18397468,
0.91296342,
4.63652725,
5.02216335,
3.1366895,
0.47339537,
2.41685637,
0.95529642,
2.38249906,
8.07791086,
8.94978288,
0.43222892,
3.01946836,
9.80582199,
5.39504823,
6.26309362,
0.05545408,
4.84909443,
9.88328535,
3.75185527,
0.97038159,
4.61908762,
9.63004466,
3.41830614,
7.98922733,
7.98846331,
2.08248297,
4.43367702,
7.15601275,
4.10519785,
1.91006955,
9.67494307,
6.50750366,
8.65459852,
2.52423578e-01,
2.66905815,
5.02071100,
6.74486351e-01,
9.93033261,
2.36462396,
3.74292182,
2.14011915,
1.05445866,
2.32479786,
3.00610136,
6.34442268,
2.81234781,
3.62276761,
5.94284372e-02,
3.65719126,
5.33885982,
1.62015837,
5.97433108,
2.93152469,
6.32050495,
2.61966053e-01,
8.87593460,
1.61186304e-01,
1.26958031,
7.77162462,
4.58952322e-01,
7.10998694,
9.71046141,
8.71682933,
7.10161651,
9.58509743,
4.29813338,
8.72878914,
3.55957668,
9.29763653,
1.48777656,
9.40029015,
8.32716197,
8.46054838,
1.23923010,
5.96486898,
1.63924809e-01,
7.21184366,
7.73751413e-02,
8.48222774e-01,
2.25498410,
8.75124534,
3.63576318,
5.39959935,
5.68103214,
2.25463360,
5.72146768,
6.60951795,
2.98245393,
4.18626859,
4.53088925,
9.32350662,
5.87493747,
9.48252372,
5.56034754,
5.00561421,
3.53221097e-02,
4.80889044,
9.27454999,
1.98365689,
5.20911344e-01,
4.06778893,
3.72396481,
8.57153058,
2.66111156e-01,
9.20149230,
6.80902999,
9.04225994,
6.07529071,
8.11953312,
3.35543874,
3.49566228,
3.89874230,
7.54797082,
3.69291174,
2.42219806,
9.37668357,
9.08011084,
3.48797316,
6.34638070,
2.73842212,
2.06115129,
3.36339529,
3.27099893,
8.82276101,
8.22303815,
7.09623229,
9.59345225,
4.22543353,
2.45033039,
1.17398437,
3.01053358,
1.45263734,
9.21860974e-01,
6.02932197,
3.64187450,
5.64570343,
1.91335721,
6.76905860,
2.15505447,
2.78023594,
7.41760422,
5.59737896,
3.34836413,
5.42988783,
6.93984703,
9.12132121,
5.80713213,
2.32686379,
7.46697631,
7.77769018,
2.00401315,
8.20574220,
4.64934855,
7.79766662,
2.37478220,
3.32580270,
9.53697119,
6.57815073,
7.72877831,
6.88374343,
2.04304118,
4.70688748,
8.08963873,
6.75035127,
6.02788565e-02,
8.74077427e-01,
3.46794720,
9.44365540,
4.91190481,
2.70176267,
3.60423719,
2.10652628,
4.21200057,
2.18035440,
8.45752507,
4.56270599,
2.79802018,
9.32891648,
3.14351354,
9.09714662,
4.34180910e-01,
7.07115060,
4.83889039,
4.44221061,
3.63233444e-01,
4.06831905e-01,
3.32753617,
9.47119540,
6.17659977,
3.68874842,
6.11977039,
2.06131536,
1.65066443,
3.61817266,
8.63353352,
5.09401727,
2.96901516,
9.50251625,
8.15966090,
3.22973943,
9.72098245,
9.87351098,
4.08660134,
6.55923103,
4.05653198,
2.57348106,
8.26526760e-01,
2.63610346,
2.71479854,
3.98639080,
1.84886031,
9.53818403,
1.02879885,
6.25208533,
4.41697388,
4.23518049,
3.71991783,
8.68314710,
2.80476981,
2.05761574e-01,
9.18097016,
8.64480278,
2.76901790,
5.23487548,
1.09088197,
9.34270688e-01,
8.37466108,
4.10265718,
6.61716540,
9.43200558,
2.45130592,
1.31598313e-01,
2.41484058e-01,
7.09385692,
9.24551885,
4.67330273,
3.75109148,
5.42860425,
8.58916838,
6.52153874,
2.32979897,
7.74580205,
1.34613497,
1.65559971,
6.12682283,
2.38783406,
7.04778548,
3.49518527,
2.77423960,
9.98918406,
4.06161246e-01,
6.45822522,
3.86995850e-01,
7.60210258,
2.30089957,
8.98318671e-01,
6.48449712,
7.32601217,
6.78095315,
5.19009471e-01,
2.94306946,
4.51088346,
2.87103290,
8.10513456,
1.31115105,
6.12179362,
9.88214944,
9.02556539,
2.22157062,
8.18876137e-04,
9.80597342,
8.82712985,
9.19472466,
4.15503551,
7.44615462,
]
)
y = np.ones_like(t)
dy = np.array(
[
0.00606416,
0.00696152,
0.00925774,
0.00563806,
0.00946933,
0.00748254,
0.00713048,
0.00652823,
0.00958424,
0.00758812,
0.00902013,
0.00928826,
0.00961191,
0.0065169,
0.00669905,
0.00797537,
0.00720662,
0.00966421,
0.00698782,
0.00738889,
0.00808593,
0.0070237,
0.00996239,
0.00549426,
0.00610302,
0.00661328,
0.00573861,
0.0064211,
0.00889623,
0.00761446,
0.00516977,
0.00991311,
0.00808003,
0.0052947,
0.00830584,
0.00689185,
0.00567837,
0.00781832,
0.0086354,
0.00835563,
0.00623757,
0.00762433,
0.00768832,
0.00858402,
0.00679934,
0.00898866,
0.00813961,
0.00519166,
0.0077324,
0.00930956,
0.00783787,
0.00587914,
0.00755188,
0.00878473,
0.00555053,
0.0090855,
0.00583741,
0.00767038,
0.00692872,
0.00624312,
0.00823716,
0.00518696,
0.00880023,
0.0076347,
0.00937886,
0.00760359,
0.00517517,
0.005718,
0.00897802,
0.00745988,
0.0072094,
0.00659217,
0.00642275,
0.00982943,
0.00716485,
0.00942002,
0.00824082,
0.00929214,
0.00926225,
0.00978156,
0.00848971,
0.00902698,
0.00866564,
0.00802613,
0.00858677,
0.00857875,
0.00520454,
0.00758055,
0.00896326,
0.00621481,
0.00732574,
0.00717493,
0.00701394,
0.0056092,
0.00762856,
0.00723124,
0.00831696,
0.00774707,
0.00513771,
0.00515959,
0.0085068,
0.00853791,
0.0097997,
0.00938352,
0.0073403,
0.00812953,
0.00728591,
0.00611473,
0.00688338,
0.00551942,
0.00833264,
0.00596015,
0.00737734,
0.00983718,
0.00515834,
0.00575865,
0.0064929,
0.00970903,
0.00954421,
0.00581,
0.00990559,
0.00875374,
0.00769989,
0.00965851,
0.00940304,
0.00695658,
0.00828172,
0.00823693,
0.00663484,
0.00589695,
0.00733405,
0.00631641,
0.00677533,
0.00977072,
0.00730569,
0.00842446,
0.00668115,
0.00997931,
0.00829384,
0.00598005,
0.00549092,
0.0097159,
0.00972389,
0.00810664,
0.00508496,
0.00612767,
0.00900638,
0.0093773,
0.00726995,
0.0068276,
0.00637113,
0.00558485,
0.00557872,
0.00976301,
0.00904313,
0.0058239,
0.00603525,
0.00827776,
0.00882332,
0.00905157,
0.00581669,
0.00992064,
0.00613901,
0.00794708,
0.00793808,
0.00983681,
0.00828834,
0.00792452,
0.00759386,
0.00882329,
0.00553028,
0.00501046,
0.00976244,
0.00749329,
0.00664168,
0.00684027,
0.00901922,
0.00691185,
0.00885085,
0.00720231,
0.00922039,
0.00538102,
0.00740564,
0.00733425,
0.00632164,
0.00971807,
0.00952514,
0.00721798,
0.0054858,
0.00603392,
0.00635746,
0.0074211,
0.00669189,
0.00887068,
0.00738013,
0.00935185,
0.00997891,
0.00609918,
0.00805836,
0.00923751,
0.00972618,
0.00645043,
0.00863521,
0.00507508,
0.00939571,
0.00531969,
0.00866698,
0.00997305,
0.00750595,
0.00604667,
0.00797322,
0.00812075,
0.00834036,
0.00586306,
0.00949356,
0.00810496,
0.00521784,
0.00842021,
0.00598042,
0.0051367,
0.00775477,
0.00906657,
0.00929971,
0.0055176,
0.00831521,
0.00855038,
0.00647258,
0.00985682,
0.00639344,
0.00534991,
0.0075964,
0.00847157,
0.0062233,
0.00669291,
0.00781814,
0.00943339,
0.00873663,
0.00604796,
0.00625889,
0.0076194,
0.00884479,
0.00809381,
0.00750662,
0.00798563,
0.0087803,
0.0076854,
0.00948876,
0.00973534,
0.00957677,
0.00877259,
0.00623161,
0.00692636,
0.0064,
0.0082883,
0.00662111,
0.00877196,
0.00556755,
0.00887682,
0.00792951,
0.00917694,
0.00715438,
0.00812482,
0.00777206,
0.00987836,
0.00877737,
0.00772407,
0.00587016,
0.00952057,
0.00602919,
0.00825022,
0.00968236,
0.0061179,
0.00612962,
0.00925909,
0.00913828,
0.00675852,
0.00632548,
0.00563694,
0.00993968,
0.00917672,
0.00949696,
0.0075684,
0.00557192,
0.0052629,
0.00665291,
0.00960165,
0.00973791,
0.00920582,
0.0057934,
0.00709962,
0.00623121,
0.00602675,
0.00842413,
0.00743056,
0.00662455,
0.00550107,
0.00772382,
0.00673513,
0.00695548,
0.00655254,
0.00693598,
0.0077793,
0.00507072,
0.00923823,
0.0096096,
0.00775265,
0.00634011,
0.0099512,
0.00691597,
0.00846828,
0.00844976,
0.00717155,
0.00599579,
0.0098329,
0.00531845,
0.00742575,
0.00610365,
0.00646987,
0.00914264,
0.00683633,
0.00541674,
0.00598155,
0.00930187,
0.00988514,
0.00633991,
0.00837704,
0.00540599,
0.00861733,
0.00708218,
0.0095908,
0.00655768,
0.00970733,
0.00751624,
0.00674446,
0.0082351,
0.00624873,
0.00614882,
0.00598173,
0.0097995,
0.00746457,
0.00875807,
0.00736996,
0.0079377,
0.00792069,
0.00989943,
0.00834217,
0.00619885,
0.00507599,
0.00609341,
0.0072776,
0.0069671,
0.00906163,
0.00892778,
0.00544548,
0.00976005,
0.00763728,
0.00798202,
0.00702528,
0.0082475,
0.00935663,
0.00836968,
0.00985049,
0.00850561,
0.0091086,
0.0052252,
0.00836349,
0.00827376,
0.00550873,
0.00921194,
0.00807086,
0.00549164,
0.00797234,
0.00739208,
0.00616647,
0.00509878,
0.00682784,
0.00809926,
0.0066464,
0.00653627,
0.00875561,
0.00879312,
0.00859383,
0.00550591,
0.00758083,
0.00778899,
0.00872402,
0.00951589,
0.00684519,
0.00714332,
0.00866384,
0.00831318,
0.00778935,
0.0067507,
0.00597676,
0.00591904,
0.00540792,
0.005406,
0.00922899,
0.00691836,
0.0053037,
0.00948213,
0.00611635,
0.00634062,
0.00597249,
0.00983751,
0.0055627,
0.00861082,
0.00966044,
0.00834001,
0.00929363,
0.00621224,
0.00836964,
0.00850436,
0.00729166,
0.00935273,
0.00847193,
0.00947439,
0.00876602,
0.00760145,
0.00749344,
0.00726864,
0.00510823,
0.00767571,
0.00711487,
0.00578767,
0.00559535,
0.00724676,
0.00519957,
0.0099329,
0.0068906,
0.00691055,
0.00525563,
0.00713336,
0.00507873,
0.00515047,
0.0066955,
0.00910484,
0.00729411,
0.0050742,
0.0058161,
0.00869961,
0.00869147,
0.00877261,
0.00675835,
0.00676138,
0.00901038,
0.00699069,
0.00863596,
0.00790562,
0.00682171,
0.00540003,
0.00558063,
0.00944779,
0.0072617,
0.00997002,
0.00681948,
0.00624977,
0.0067527,
0.00671543,
0.00818678,
0.00506369,
0.00881634,
0.00708207,
0.0071612,
0.00740558,
0.00724606,
0.00748735,
0.00672952,
0.00726673,
0.00702326,
0.00759121,
0.00811635,
0.0062052,
0.00754219,
0.00797311,
0.00508474,
0.00760247,
0.00619647,
0.00702269,
0.00913265,
0.00663118,
0.00741608,
0.00512371,
0.00654375,
0.00819861,
0.00657581,
0.00602899,
0.00645328,
0.00977189,
0.00543401,
0.00731679,
0.00529193,
0.00769329,
0.00573018,
0.00817042,
0.00632199,
0.00845458,
0.00673573,
0.00502084,
0.00647447,
]
)
period = 2.0
transit_time = 0.5
duration = 0.16
depth = 0.2
m = (
np.abs((t - transit_time + 0.5 * period) % period - 0.5 * period)
< 0.5 * duration
)
y[m] = 1.0 - depth
randn_arr = np.array(
[
-1.00326528e-02,
-8.45644428e-01,
9.11460610e-01,
-1.37449688e00,
-5.47065645e-01,
-7.55266106e-05,
-1.21166803e-01,
-2.00858547e00,
-9.20646543e-01,
1.68234342e-01,
-1.31989156e00,
1.26642930e00,
4.95180889e-01,
-5.14240391e-01,
-2.20292465e-01,
1.86156412e00,
9.35988451e-01,
3.80219145e-01,
-1.41551877e00,
1.62961132e00,
1.05240107e00,
-1.48405388e-01,
-5.49698069e-01,
-1.87903939e-01,
-1.20193668e00,
-4.70785558e-01,
7.63160514e-01,
-1.80762128e00,
-3.14074374e-01,
1.13755973e-01,
1.03568037e-01,
-1.17893695e00,
-1.18215289e00,
1.08916538e00,
-1.22452909e00,
1.00865096e00,
-4.82365315e-01,
1.07979635e00,
-4.21078505e-01,
-1.16647132e00,
8.56554856e-01,
-1.73912222e-02,
1.44857659e00,
8.92200085e-01,
-2.29426629e-01,
-4.49667602e-01,
2.33723433e-02,
1.90210018e-01,
-8.81748527e-01,
8.41939573e-01,
-3.97363492e-01,
-4.23027745e-01,
-5.40688337e-01,
2.31017267e-01,
-6.92052602e-01,
1.34970110e-01,
2.76660307e00,
-5.36094601e-02,
-4.34004738e-01,
-1.66768923e00,
5.02219248e-02,
-1.10923094e00,
-3.75558119e-01,
1.51607594e-01,
-1.73098945e00,
1.57462752e-01,
3.04515175e-01,
-1.29710002e00,
-3.92309192e-01,
-1.83066636e00,
1.57550094e00,
3.30563277e-01,
-1.79588501e-01,
-1.63435831e-01,
1.13144361e00,
-9.41655519e-02,
3.30816771e-01,
1.51862956e00,
-3.46167148e-01,
-1.09263532e00,
-8.24500575e-01,
1.42866383e00,
9.14283085e-02,
-5.02331288e-01,
9.73644380e-01,
9.97957386e-01,
-4.75647768e-01,
-9.71936837e-01,
-1.57052860e00,
-1.79388892e00,
-2.64986452e-01,
-8.93195947e-01,
1.85847441e00,
5.85377547e-02,
-1.94214954e00,
1.41872928e00,
1.61710309e-01,
7.04979480e-01,
6.82034777e-01,
2.96556567e-01,
5.23342630e-01,
2.38760672e-01,
-1.10638591e00,
3.66732198e-01,
1.02390550e00,
-2.10056413e-01,
5.51302218e-01,
4.19589145e-01,
1.81565206e00,
-2.52750301e-01,
-2.92004163e-01,
-1.16931740e-01,
-1.02391075e-01,
-2.27261771e00,
-6.42609841e-01,
2.99885067e-01,
-8.25651467e-03,
-7.99339154e-01,
-6.64779252e-01,
-3.55613128e-01,
-8.01571781e-01,
-5.13050610e-01,
-5.39390119e-01,
8.95370847e-01,
1.01639127e00,
9.33585094e-01,
4.26701799e-01,
-7.08322484e-01,
9.59830450e-01,
-3.14250587e-01,
2.30522083e-02,
1.33822053e00,
8.39928561e-02,
2.47284030e-01,
-1.41277949e00,
4.87009294e-01,
-9.80006647e-01,
1.01193966e00,
-1.84599177e-01,
-2.23616884e00,
-3.58020103e-01,
-2.28034538e-01,
4.85475226e-01,
6.70512391e-01,
-3.27764245e-01,
1.01286819e00,
-3.16705533e00,
-7.13988998e-01,
-1.11236427e00,
-1.25418351e00,
9.59706371e-01,
8.29170399e-01,
-7.75770020e-01,
1.17805700e00,
1.01466892e-01,
-4.21684101e-01,
-6.92922796e-01,
-7.78271726e-01,
4.72774857e-01,
6.50154901e-01,
2.38501212e-01,
-2.05021768e00,
2.96358656e-01,
5.65396564e-01,
-6.69205605e-01,
4.32505429e-02,
-1.86388430e00,
-1.22996906e00,
-3.24235348e-01,
-3.09751144e-01,
3.51679372e-01,
-1.18692539e00,
-3.41206065e-01,
-4.89779780e-01,
5.28010474e-01,
1.42104277e00,
1.72092032e00,
-1.56844005e00,
-4.80141918e-02,
-1.11252931e00,
-6.47449515e-02,
4.22919280e-01,
8.14908987e-02,
-4.90116988e-02,
1.48303917e00,
7.20989392e-01,
-2.72654462e-01,
2.42113609e-02,
8.70897807e-01,
6.09790506e-01,
-4.25076104e-01,
-1.77524284e00,
-1.18465749e00,
1.45979225e-01,
-1.78652685e00,
-1.52394498e-01,
-4.53569176e-01,
9.99252803e-01,
-1.31804382e00,
-1.93176898e00,
-4.19640742e-01,
6.34763132e-01,
1.06991860e00,
-9.09327017e-01,
4.70263748e-01,
-1.11143045e00,
-7.48827466e-01,
5.67594726e-01,
7.18150543e-01,
-9.99380749e-01,
4.74898323e-01,
-1.86849981e00,
-2.02658907e-01,
-1.13424803e00,
-8.07699340e-01,
-1.27607735e00,
5.53626395e-01,
5.53874470e-01,
-6.91200445e-01,
3.75582306e-01,
2.61272553e-01,
-1.28451754e-01,
2.15817020e00,
-8.40878617e-01,
1.43050907e-02,
-3.82387029e-01,
-3.71780015e-01,
1.59412004e-01,
-2.94395700e-01,
-8.60426760e-01,
1.24227498e-01,
1.18233165e00,
9.42766380e-01,
2.03044488e-01,
-7.35396814e-01,
1.86429600e-01,
1.08464302e00,
1.19118926e00,
3.59687060e-01,
-3.64357200e-01,
-2.02752749e-01,
7.72045927e-01,
6.86346215e-01,
-1.75769961e00,
6.58617565e-01,
7.11288340e-01,
-8.87191425e-01,
-7.64981116e-01,
-7.57164098e-01,
-6.80262803e-01,
-1.41674959e00,
3.13091930e-01,
-7.85719399e-01,
-7.03838361e-02,
-4.97568783e-01,
2.55177521e-01,
-1.01061704e00,
2.45265375e-01,
3.89781016e-01,
8.27594585e-01,
1.96776909e00,
-2.09210177e00,
3.20314334e-01,
-7.09162842e-01,
-1.92505867e00,
8.41630623e-01,
1.33219988e00,
-3.91627710e-01,
2.10916296e-01,
-6.40767402e-02,
4.34197668e-01,
8.80535749e-01,
3.44937336e-01,
3.45769929e-01,
1.25973654e00,
-1.64662222e-01,
9.23064571e-01,
-8.22000422e-01,
1.60708495e00,
7.37825392e-01,
-4.03759534e-01,
-2.11454815e00,
-3.10717131e-04,
-1.18180941e00,
2.99634603e-01,
1.45116882e00,
1.60059793e-01,
-1.78012614e-01,
3.42205404e-01,
2.85650196e-01,
-2.36286411e00,
2.40936864e-01,
6.20277356e-01,
-2.59341634e-01,
9.78559078e-01,
-1.27674575e-01,
7.66998762e-01,
2.27310511e00,
-9.63911290e-02,
-1.94213217e00,
-3.36591724e-01,
-1.72589000e00,
6.11237826e-01,
1.30935097e00,
6.95879662e-01,
3.20308213e-01,
-6.44925458e-01,
1.57564975e00,
7.53276212e-01,
2.84469557e-01,
2.04860319e-01,
1.11627359e-01,
4.52216424e-01,
-6.13327179e-01,
1.52524993e00,
1.52339753e-01,
6.00054450e-01,
-4.33567278e-01,
3.74918534e-01,
-2.28175243e00,
-1.11829888e00,
-3.14131532e-02,
-1.32247311e00,
2.43941406e00,
-1.66808131e00,
3.45900749e-01,
1.65577315e00,
4.81287059e-01,
-3.10227553e-01,
-5.52144084e-01,
6.73255489e-01,
-8.00270681e-01,
-1.19486110e-01,
6.91198606e-01,
-3.07879027e-01,
8.75100102e-02,
-3.04086293e-01,
-9.69797604e-01,
1.18915048e00,
1.39306624e00,
-3.16699954e-01,
-2.65576159e-01,
-1.77899339e-01,
5.38803274e-01,
-9.05300265e-01,
-8.85253056e-02,
2.62959055e-01,
6.42042149e-01,
-2.78083727e00,
4.03403210e-01,
3.45846762e-01,
1.00772824e00,
-5.26264015e-01,
-5.18353205e-01,
1.20251659e00,
-1.56315671e00,
1.62909029e00,
2.55589446e00,
4.77451685e-01,
8.14098474e-01,
-1.48958171e00,
-6.94559787e-01,
1.05786255e00,
3.61815347e-01,
-1.81427463e-01,
2.32869132e-01,
5.06976484e-01,
-2.93095701e-01,
-2.89459450e-02,
-3.63073748e-02,
-1.05227898e00,
3.23594628e-01,
1.80358591e00,
1.73196213e00,
-1.47639930e00,
5.70631220e-01,
6.75503781e-01,
-4.10510463e-01,
-9.64200035e-01,
-1.32081431e00,
-4.44703779e-01,
3.50009137e-01,
-1.58058176e-01,
-6.10933088e-01,
-1.24915663e00,
3.50716258e-01,
1.06654245e00,
-9.26921972e-01,
4.48428964e-01,
-1.87947524e00,
-6.57466109e-01,
7.29604120e-01,
-1.11776721e00,
-6.04436725e-01,
1.41796683e00,
-7.32843980e-01,
-8.53944819e-01,
5.75848362e-01,
1.95473356e00,
-2.39669947e-01,
7.68735860e-01,
1.34576918e00,
3.25552163e-01,
-2.69917901e-01,
-8.76326739e-01,
-1.42521096e00,
1.11170175e00,
1.80957146e-01,
1.33280094e00,
9.88925316e-01,
-6.16970520e-01,
-1.18688670e00,
4.12669583e-01,
-6.32506884e-01,
3.76689141e-01,
-7.31151938e-01,
-8.61225253e-01,
-1.40990810e-01,
9.34100620e-01,
3.06539895e-01,
1.17837515e00,
-1.23356170e00,
-1.05707714e00,
-8.91636992e-02,
2.16570138e00,
6.74286114e-01,
-1.06661274e00,
-7.61404530e-02,
2.20714791e-01,
-5.68685746e-01,
6.13274991e-01,
-1.56446138e-01,
-2.99330718e-01,
1.26025679e00,
-1.70966090e00,
-9.61805342e-01,
-8.17308981e-01,
-8.47681070e-01,
-7.28753045e-01,
4.88475958e-01,
1.09653283e00,
9.16041261e-01,
-1.01956213e00,
-1.07417899e-01,
4.52265213e-01,
2.40002952e-01,
1.30574740e00,
-6.75334236e-01,
1.56319421e-01,
-3.93230715e-01,
2.51075019e-01,
-1.07889691e00,
-9.28937721e-01,
-7.30110860e-01,
-5.63669311e-01,
1.54792327e00,
1.17540191e00,
-2.12649671e-01,
1.72933294e-01,
-1.59443602e00,
-1.79292347e-01,
1.59614713e-01,
1.14568421e00,
3.26804720e-01,
4.32890059e-01,
2.97762890e-01,
2.69001190e-01,
-1.39675918e00,
-4.16757668e-01,
1.43488680e00,
8.23896443e-01,
4.94234499e-01,
6.67153092e-02,
6.59441396e-01,
-9.44889409e-01,
-1.58005956e00,
-3.82086552e-01,
5.37923058e-01,
1.07829882e-01,
1.01395868e00,
3.51450517e-01,
4.48421962e-02,
1.32748495e00,
1.13237578e00,
-9.80913012e-02,
-1.10304986e00,
-9.07361492e-01,
-1.61451138e-01,
-3.66811384e-01,
1.65776233e00,
-1.68013415e00,
-6.42577869e-02,
-1.06622649e00,
1.16801869e-01,
3.82264833e-01,
-4.04896974e-01,
5.30481414e-01,
-1.98626941e-01,
-1.79395613e-01,
-4.17888725e-01,
]
)
y += dy * randn_arr
return (
t,
y,
dy,
dict(period=period, transit_time=transit_time, duration=duration, depth=depth),
)
def test_32bit_bug():
rand = np.random.default_rng(42)
t = rand.uniform(0, 10, 500)
y = np.ones_like(t)
y[np.abs((t + 1.0) % 2.0 - 1) < 0.08] = 1.0 - 0.1
y += 0.01 * rand.standard_normal(len(t))
model = BoxLeastSquares(t, y)
results = model.autopower(0.16)
assert_allclose(results.period[np.argmax(results.power)], 2.000412388152837)
periods = np.linspace(1.9, 2.1, 5)
results = model.power(periods, 0.16)
assert_allclose(
results.power,
[0.01723948, 0.0643028, 0.1338783, 0.09428816, 0.03577543],
rtol=1.1e-7,
)
@pytest.mark.parametrize("objective", ["likelihood", "snr"])
def test_correct_model(data, objective):
t, y, dy, params = data
model = BoxLeastSquares(t, y, dy)
periods = np.exp(
np.linspace(
np.log(params["period"]) - 0.1, np.log(params["period"]) + 0.1, 1000
)
)
results = model.power(periods, params["duration"], objective=objective)
ind = np.argmax(results.power)
for k, v in params.items():
assert_allclose(results[k][ind], v, atol=0.01)
chi = (results.depth[ind] - params["depth"]) / results.depth_err[ind]
assert np.abs(chi) < 1
@pytest.mark.parametrize("objective", ["likelihood", "snr"])
@pytest.mark.parametrize("offset", [False, True])
def test_fast_method(data, objective, offset):
t, y, dy, params = data
if offset:
t = t - params["transit_time"] + params["period"]
model = BoxLeastSquares(t, y, dy)
periods = np.exp(
np.linspace(np.log(params["period"]) - 1, np.log(params["period"]) + 1, 10)
)
durations = params["duration"]
results = model.power(periods, durations, objective=objective)
assert_allclose_blsresults(
results, model.power(periods, durations, method="slow", objective=objective)
)
def test_input_units(data):
t, y, dy, params = data
t_unit = u.day
y_unit = u.mag
with pytest.raises(u.UnitConversionError):
BoxLeastSquares(t * t_unit, y * y_unit, dy * u.one)
with pytest.raises(u.UnitConversionError):
BoxLeastSquares(t * t_unit, y * u.one, dy * y_unit)
with pytest.raises(u.UnitConversionError):
BoxLeastSquares(t * t_unit, y, dy * y_unit)
model = BoxLeastSquares(t * t_unit, y * u.one, dy)
assert model.dy.unit == model.y.unit
model = BoxLeastSquares(t * t_unit, y * y_unit, dy)
assert model.dy.unit == model.y.unit
model = BoxLeastSquares(t * t_unit, y * y_unit)
assert model.dy is None
def test_period_units(data):
t, y, dy, params = data
t_unit = u.day
y_unit = u.mag
model = BoxLeastSquares(t * t_unit, y * y_unit, dy)
p = model.autoperiod(params["duration"])
assert p.unit == t_unit
p = model.autoperiod(params["duration"] * 24 * u.hour)
assert p.unit == t_unit
with pytest.raises(u.UnitConversionError):
model.autoperiod(params["duration"] * u.mag)
p = model.autoperiod(params["duration"], minimum_period=0.5)
assert p.unit == t_unit
with pytest.raises(u.UnitConversionError):
p = model.autoperiod(params["duration"], minimum_period=0.5 * u.mag)
p = model.autoperiod(params["duration"], maximum_period=0.5)
assert p.unit == t_unit
with pytest.raises(u.UnitConversionError):
p = model.autoperiod(params["duration"], maximum_period=0.5 * u.mag)
p = model.autoperiod(params["duration"], minimum_period=0.5, maximum_period=1.5)
p2 = model.autoperiod(params["duration"], maximum_period=0.5, minimum_period=1.5)
assert_quantity_allclose(p, p2)
@pytest.mark.parametrize("method", ["fast", "slow"])
@pytest.mark.parametrize("with_err", [True, False])
@pytest.mark.parametrize("t_unit", [None, u.day])
@pytest.mark.parametrize("y_unit", [None, u.mag])
@pytest.mark.parametrize("objective", ["likelihood", "snr"])
def test_results_units(data, method, with_err, t_unit, y_unit, objective):
t, y, dy, params = data
periods = np.linspace(params["period"] - 1.0, params["period"] + 1.0, 3)
if t_unit is not None:
t = t * t_unit
if y_unit is not None:
y = y * y_unit
dy = dy * y_unit
if not with_err:
dy = None
model = BoxLeastSquares(t, y, dy)
results = model.power(
periods, params["duration"], method=method, objective=objective
)
if t_unit is None:
assert not has_units(results.period)
assert not has_units(results.duration)
assert not has_units(results.transit_time)
else:
assert results.period.unit == t_unit
assert results.duration.unit == t_unit
assert results.transit_time.unit == t_unit
if y_unit is None:
assert not has_units(results.power)
assert not has_units(results.depth)
assert not has_units(results.depth_err)
assert not has_units(results.depth_snr)
assert not has_units(results.log_likelihood)
else:
assert results.depth.unit == y_unit
assert results.depth_err.unit == y_unit
assert results.depth_snr.unit == u.one
if dy is None:
assert results.log_likelihood.unit == y_unit * y_unit
if objective == "snr":
assert results.power.unit == u.one
else:
assert results.power.unit == y_unit * y_unit
else:
assert results.log_likelihood.unit == u.one
assert results.power.unit == u.one
def test_autopower(data):
t, y, dy, params = data
duration = params["duration"] + np.linspace(-0.1, 0.1, 3)
model = BoxLeastSquares(t, y, dy)
period = model.autoperiod(duration)
results1 = model.power(period, duration)
results2 = model.autopower(duration)
assert_allclose_blsresults(results1, results2)
@pytest.mark.parametrize("with_units", [True, False])
def test_model(data, with_units):
t, y, dy, params = data
# Compute the model using linear regression
A = np.zeros((len(t), 2))
p = params["period"]
dt = np.abs((t - params["transit_time"] + 0.5 * p) % p - 0.5 * p)
m_in = dt < 0.5 * params["duration"]
A[~m_in, 0] = 1.0
A[m_in, 1] = 1.0
w = np.linalg.solve(np.dot(A.T, A / dy[:, None] ** 2), np.dot(A.T, y / dy**2))
model_true = np.dot(A, w)
if with_units:
t = t * u.day
y = y * u.mag
dy = dy * u.mag
model_true = model_true * u.mag
# Compute the model using the periodogram
pgram = BoxLeastSquares(t, y, dy)
model = pgram.model(t, p, params["duration"], params["transit_time"])
# Make sure that the transit mask is consistent with the model
transit_mask = pgram.transit_mask(t, p, params["duration"], params["transit_time"])
transit_mask0 = (model - model.max()) < 0.0
assert_allclose(transit_mask, transit_mask0)
assert_quantity_allclose(model, model_true)
@pytest.mark.parametrize("shape", [(1,), (2,), (3,), (2, 3)])
def test_shapes(data, shape):
t, y, dy, params = data
duration = params["duration"]
model = BoxLeastSquares(t, y, dy)
period = np.empty(shape)
period.flat = np.linspace(params["period"] - 1, params["period"] + 1, period.size)
if len(period.shape) > 1:
with pytest.raises(ValueError):
results = model.power(period, duration)
else:
results = model.power(period, duration)
for k, v in results.items():
if k == "objective":
continue
assert v.shape == shape
@pytest.mark.parametrize("with_units", [True, False])
@pytest.mark.parametrize("with_err", [True, False])
def test_compute_stats(data, with_units, with_err):
t, y, dy, params = data
y_unit = 1
if with_units:
y_unit = u.mag
t = t * u.day
y = y * u.mag
dy = dy * u.mag
params["period"] = params["period"] * u.day
params["duration"] = params["duration"] * u.day
params["transit_time"] = params["transit_time"] * u.day
params["depth"] = params["depth"] * u.mag
if not with_err:
dy = None
model = BoxLeastSquares(t, y, dy)
results = model.power(params["period"], params["duration"], oversample=1000)
stats = model.compute_stats(
params["period"], params["duration"], params["transit_time"]
)
# Test the calculated transit times
tt = params["period"] * np.arange(int(t.max() / params["period"]) + 1)
tt += params["transit_time"]
assert_quantity_allclose(tt, stats["transit_times"])
# Test that the other parameters are consistent with the periodogram
assert_allclose(stats["per_transit_count"], [9, 7, 7, 7, 8])
assert_quantity_allclose(
np.sum(stats["per_transit_log_likelihood"]), results["log_likelihood"]
)
assert_quantity_allclose(stats["depth"][0], results["depth"])
# Check the half period result
results_half = model.power(
0.5 * params["period"], params["duration"], oversample=1000
)
assert_quantity_allclose(stats["depth_half"][0], results_half["depth"])
# Skip the uncertainty tests when the input errors are None
if not with_err:
assert_quantity_allclose(
stats["harmonic_amplitude"], 0.029945029964964204 * y_unit
)
assert_quantity_allclose(
stats["harmonic_delta_log_likelihood"],
-0.5875918155223113 * y_unit * y_unit,
)
return
assert_quantity_allclose(stats["harmonic_amplitude"], 0.033027988742275853 * y_unit)
assert_quantity_allclose(
stats["harmonic_delta_log_likelihood"], -12407.505922833765
)
assert_quantity_allclose(stats["depth"][1], results["depth_err"])
assert_quantity_allclose(stats["depth_half"][1], results_half["depth_err"])
for f, k in zip(
(1.0, 1.0, 1.0, 0.0), ("depth", "depth_even", "depth_odd", "depth_phased")
):
res = np.abs((stats[k][0] - f * params["depth"]) / stats[k][1])
assert res < 1, f"f={f}, k={k}, res={res}"
def test_negative_times(data):
t, y, dy, params = data
mu = np.mean(t)
duration = params["duration"] + np.linspace(-0.1, 0.1, 3)
model1 = BoxLeastSquares(t, y, dy)
results1 = model1.autopower(duration)
# Compute the periodogram with offset (negative) times
model2 = BoxLeastSquares(t - mu, y, dy)
results2 = model2.autopower(duration)
# Shift the transit times back into the unshifted coordinates
results2.transit_time = (results2.transit_time + mu) % results2.period
assert_allclose_blsresults(results1, results2)
@pytest.mark.parametrize("timedelta", [False, True])
def test_absolute_times(data, timedelta):
# Make sure that we handle absolute times correctly. We also check that
# TimeDelta works properly when timedelta is True.
# The example data uses relative times
t, y, dy, params = data
# Add units
t = t * u.day
y = y * u.mag
dy = dy * u.mag
# We now construct a set of absolute times but keeping the rest the same.
start = Time("2019-05-04T12:34:56")
trel = TimeDelta(t) if timedelta else t
t = trel + start
# and we set up two instances of BoxLeastSquares, one with absolute and one
# with relative times.
bls1 = BoxLeastSquares(t, y, dy)
bls2 = BoxLeastSquares(trel, y, dy)
results1 = bls1.autopower(0.16 * u.day)
results2 = bls2.autopower(0.16 * u.day)
# All the results should match except transit time which should be
# absolute instead of relative in the first case.
for key in results1:
if key == "transit_time":
assert_quantity_allclose((results1[key] - start).to(u.day), results2[key])
elif key == "objective":
assert results1[key] == results2[key]
else:
assert_allclose(results1[key], results2[key])
# Check that model evaluation works fine
model1 = bls1.model(t, 0.2 * u.day, 0.05 * u.day, Time("2019-06-04T12:34:56"))
model2 = bls2.model(trel, 0.2 * u.day, 0.05 * u.day, TimeDelta(1 * u.day))
assert_quantity_allclose(model1, model2)
# Check model validation
MESSAGE = (
r"{} was provided as {} time but the BoxLeastSquares class was initialized with"
r" {} times\."
)
with pytest.raises(
TypeError, match=MESSAGE.format("transit_time", "a relative", "absolute")
):
bls1.model(t, 0.2 * u.day, 0.05 * u.day, 1 * u.day)
with pytest.raises(
TypeError, match=MESSAGE.format("t_model", "a relative", "absolute")
):
bls1.model(trel, 0.2 * u.day, 0.05 * u.day, Time("2019-06-04T12:34:56"))
with pytest.raises(
TypeError, match=MESSAGE.format("transit_time", "an absolute", "relative")
):
bls2.model(trel, 0.2 * u.day, 0.05 * u.day, Time("2019-06-04T12:34:56"))
with pytest.raises(
TypeError, match=MESSAGE.format("t_model", "an absolute", "relative")
):
bls2.model(t, 0.2 * u.day, 0.05 * u.day, 1 * u.day)
# Check compute_stats
stats1 = bls1.compute_stats(0.2 * u.day, 0.05 * u.day, Time("2019-06-04T12:34:56"))
stats2 = bls2.compute_stats(0.2 * u.day, 0.05 * u.day, 1 * u.day)
for key in stats1:
if key == "transit_times":
assert_quantity_allclose(
(stats1[key] - start).to(u.day), stats2[key], atol=1e-10 * u.day
)
elif key.startswith("depth"):
for value1, value2 in zip(stats1[key], stats2[key]):
assert_quantity_allclose(value1, value2)
else:
assert_allclose(stats1[key], stats2[key])
# Check compute_stats validation
MESSAGE = (
r"{} was provided as {} time but the BoxLeastSquares class was"
r" initialized with {} times\."
)
with pytest.raises(
TypeError, match=MESSAGE.format("transit_time", "a relative", "absolute")
):
bls1.compute_stats(0.2 * u.day, 0.05 * u.day, 1 * u.day)
with pytest.raises(
TypeError, match=MESSAGE.format("transit_time", "an absolute", "relative")
):
bls2.compute_stats(0.2 * u.day, 0.05 * u.day, Time("2019-06-04T12:34:56"))
# Check transit_mask
mask1 = bls1.transit_mask(t, 0.2 * u.day, 0.05 * u.day, Time("2019-06-04T12:34:56"))
mask2 = bls2.transit_mask(trel, 0.2 * u.day, 0.05 * u.day, 1 * u.day)
assert_equal(mask1, mask2)
# Check transit_mask validation
with pytest.raises(
TypeError, match=MESSAGE.format("transit_time", "a relative", "absolute")
):
bls1.transit_mask(t, 0.2 * u.day, 0.05 * u.day, 1 * u.day)
with pytest.raises(TypeError, match=MESSAGE.format("t", "a relative", "absolute")):
bls1.transit_mask(trel, 0.2 * u.day, 0.05 * u.day, Time("2019-06-04T12:34:56"))
with pytest.raises(
TypeError, match=MESSAGE.format("transit_time", "an absolute", "relative")
):
bls2.transit_mask(trel, 0.2 * u.day, 0.05 * u.day, Time("2019-06-04T12:34:56"))
with pytest.raises(TypeError, match=MESSAGE.format("t", "an absolute", "relative")):
bls2.transit_mask(t, 0.2 * u.day, 0.05 * u.day, 1 * u.day)
def test_transit_time_in_range(data):
t, y, dy, params = data
t_ref = 10230.0
t2 = t + t_ref
bls1 = BoxLeastSquares(t, y, dy)
bls2 = BoxLeastSquares(t2, y, dy)
results1 = bls1.autopower(0.16)
results2 = bls2.autopower(0.16)
assert np.allclose(results1.transit_time, results2.transit_time - t_ref)
assert np.all(results1.transit_time >= t.min())
assert np.all(results1.transit_time <= t.max())
assert np.all(results2.transit_time >= t2.min())
assert np.all(results2.transit_time <= t2.max())