diff --git a/.github/workflows/lightkurve-tests.yml b/.github/workflows/lightkurve-tests.yml
index b25b6a8ea..c5736cf22 100644
--- a/.github/workflows/lightkurve-tests.yml
+++ b/.github/workflows/lightkurve-tests.yml
@@ -42,7 +42,7 @@ jobs:
- name: "3.11"
python-version: "3.11"
pytest-command: ./poetry/bin/poetry run pytest
- - name: "3.12-remote-data"
+ - name: "3.12"
python-version: "3.12"
pytest-command: ./poetry/bin/poetry run pytest
- name: "3.13"
diff --git a/CHANGES.rst b/CHANGES.rst
index e61dadb9b..50b2e7923 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -1,4 +1,9 @@
-2.5.2dev (unreleased)
+2.6.1dev
+=====================
+- Update search URL for query_solar_system_objects [#1556]
+- Fixed search result sort order for the cases involving TESS sectors 99 and 100, etc. [#1558]
+
+2.6.0 (2026-04-16)
=====================
- Patch for changes to astroquery 0.4.11. Search results using GAIA DR2 now case insensitive. Integer searches converted to string. [#1511]
- Added Folded lightcurve reader to open data saved with ``lk.FoldedLightCurve.to_fits()`` [#1488]
@@ -7,8 +12,18 @@
- Include MOM_CENTR1 and MOM_CENTR2, if it exists, when saving fits files [#1488]
- Fixed bugs in ``bin`` for ``flux_err`` column. Improved ``bin`` performance. [#1499]
- Updated search result sort order [#1384]
+- When reading in data saved with to_fits, change meta.flux_origin to reflect origin [#1371]
- Convert flux and flux_err to Quantity objects when using ``select_flux`` [#1513]
- Fixed bugs in ``FoldedLightCurve`` objects with normalized phase to support pickle / dill [#1529]
+- Added support in ``read_generic_lightcurve()`` for FITS Standard reference time keywords like [M]JDREF [#1535]
+- Capped pandas version at <3.0.0 for breaking changes [#1534]
+- Added ability to download 20-s CBV products for TESS [#1537]
+- Changed search so that it longer emits ERROR log message when the search result is empty [#1540]
+- Fixed search by exact match for TICs with fewer than 9 digits, avoiding the extra
+ fallback cone search [#1541]
+- Modified how SAP_QUALITY is treated when reading/writing TESS and Kepler data [#1538]
+- Added ability to use nifty-ls for periodograms [#1550]
+- Added new tutorial for read_generic_lightcurve [#1542]
2.5.1 (2025-05-20)
=====================
diff --git a/docs/source/tutorials/2-creating-light-curves/2-4-using_the_to_fits_and_read_generic_lightcurve_function.ipynb b/docs/source/tutorials/2-creating-light-curves/2-4-using_the_to_fits_and_read_generic_lightcurve_function.ipynb
new file mode 100644
index 000000000..7efed8226
--- /dev/null
+++ b/docs/source/tutorials/2-creating-light-curves/2-4-using_the_to_fits_and_read_generic_lightcurve_function.ipynb
@@ -0,0 +1,621 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "c292a249-adc4-4ca8-9957-4df3d7fcb90d",
+ "metadata": {},
+ "source": [
+ "# Using the to_fits and read_generic_lightcurve functions\n",
+ "\n",
+ "## Learning Goals\n",
+ "\n",
+ "By the end of this tutorial you will: \n",
+ "\n",
+ "- Learn how to create a [LightCurve object](https://lightkurve.github.io/lightkurve/tutorials/1-getting-started/what-are-lightcurve-objects.html).\n",
+ "- Save the LightCurve object as a fits file using the [`to_fits`](https://lightkurve.github.io/lightkurve/reference/api/lightkurve.LightCurve.to_fits.html?highlight=to_fits#lightkurve.LightCurve.to_fits) function.\n",
+ "- Read in the same FITs file using the [`read_generic_lightcurve`](https://github.com/lightkurve/lightkurve/blob/f8e8c16ba5135b8811d908bb919815b93dcce2bd/src/lightkurve/io/generic.py#L20-L31) function.\n",
+ "\n",
+ "## Introduction\n",
+ "\n",
+ "The intent of the tutorial is to illustrate how one might use data from any mission (not just Kepler, K2, or TESS) and analize it within Lightkurve. \n",
+ "\n",
+ "## Imports\n",
+ "This tutorial requires:\n",
+ "\n",
+ "- [Lightkurve](https://lightkurve.github.io/lightkurve/index.html)\n",
+ "- [Matplotlib](https://matplotlib.org/)\n",
+ "- [numpy](https://numpy.org/)\n",
+ "- astropy [time](https://docs.astropy.org/en/stable/time/index.html) and [units](https://docs.astropy.org/en/latest/units/index.html)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "id": "8e374a70-fdb3-431c-a96d-b5be40a87ab2",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "%matplotlib inline\n",
+ "\n",
+ "import lightkurve as lk\n",
+ "import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
+ "\n",
+ "from astropy.time import Time\n",
+ "import astropy.units as u"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7b016c47-2163-4902-8622-a78a80cf7de0",
+ "metadata": {},
+ "source": [
+ "## 1: Creating our lightcurve data and our LightCurve Object\n",
+ "\n",
+ "First we will create some fake lightcurve data to use as an example and convert this into a LightCurve Object. \n",
+ "You could also download a LightCurve Object via using [`search_lightcurve`](https://lightkurve.github.io/lightkurve/reference/api/lightkurve.search_lightcurve.html?highlight=search_lightcurve#lightkurve.search_lightcurve) and [`download()`](https://lightkurve.github.io/lightkurve/reference/api/lightkurve.SearchResult.download.html?highlight=download#lightkurve.SearchResult.download) if you wish, but for now we will create our simple data set."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "id": "eebdab4d-0db0-41d6-800b-9c582f2db671",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#Create the time values and specify the format\n",
+ "time_values = Time(np.linspace(2458000, 2458000 + 10, 100), format='jd')\n",
+ "\n",
+ "#Create the flux and flux error values\n",
+ "flux_values = np.sin(time_values.value * 0.5) + 1000\n",
+ "flux_err_values = np.full_like(flux_values, 0.01, dtype=np.float32)\n",
+ "\n",
+ "#Specify the flux units \n",
+ "unit_flux = u.electron/u.second"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d67112b8-6fdc-42ee-a9b5-ab789abc7954",
+ "metadata": {},
+ "source": [
+ "Using this data set we then use the `LightCurve` function to create our object and look at the data. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "id": "977c745f-df64-43ec-800b-a18e345e0406",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ "\n",
+ " time flux flux_err \n",
+ " electron / s electron / s \n",
+ " Time float32 float32 \n",
+ "------------------ ------------------ --------------------\n",
+ " 2458000.0 1000.4536743164062 0.009999999776482582\n",
+ " 2458000.101010101 1000.4080810546875 0.009999999776482582\n",
+ " 2458000.202020202 1000.3614501953125 0.009999999776482582\n",
+ " 2458000.303030303 1000.31396484375 0.009999999776482582\n",
+ " 2458000.404040404 1000.265625 0.009999999776482582\n",
+ " 2458000.505050505 1000.2166137695312 0.009999999776482582\n",
+ " 2458000.606060606 1000.1670532226562 0.009999999776482582\n",
+ " 2458000.707070707 1000.1170654296875 0.009999999776482582\n",
+ "2458000.8080808083 1000.0667724609375 0.009999999776482582\n",
+ " ... ... ...\n",
+ "2458009.1919191917 1000.8324584960938 0.009999999776482582\n",
+ " 2458009.292929293 1000.859375 0.009999999776482582\n",
+ " 2458009.393939394 1000.8840942382812 0.009999999776482582\n",
+ " 2458009.494949495 1000.9065551757812 0.009999999776482582\n",
+ " 2458009.595959596 1000.9266967773438 0.009999999776482582\n",
+ " 2458009.696969697 1000.9444580078125 0.009999999776482582\n",
+ " 2458009.797979798 1000.9598388671875 0.009999999776482582\n",
+ " 2458009.898989899 1000.9727783203125 0.009999999776482582\n",
+ " 2458010.0 1000.9832763671875 0.009999999776482582"
+ ]
+ },
+ "execution_count": 25,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "read_lc"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "id": "dde547a9-4f4e-45fd-b2a9-7988ec105374",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/latex": [
+ "$[1000.4537,~1000.4081,~1000.3615,~1000.314,~1000.2656,~1000.2166,~1000.1671,~1000.1171,~1000.0668,~1000.0163,~999.96582,~999.91541,~999.86523,~999.81537,~999.76599,~999.71722,~999.66913,~999.62195,~999.57568,~999.53052,~999.48651,~999.44385,~999.40259,~999.36285,~999.32477,~999.28839,~999.25385,~999.22119,~999.19049,~999.16193,~999.13544,~999.11115,~999.08917,~999.06952,~999.05219,~999.03729,~999.02484,~999.01489,~999.00751,~999.00256,~999.00024,~999.00043,~999.00317,~999.00842,~999.01624,~999.02655,~999.03937,~999.05463,~999.07233,~999.09235,~999.11469,~999.13928,~999.16608,~999.19501,~999.22595,~999.25891,~999.29376,~999.33038,~999.36877,~999.40869,~999.4502,~999.49304,~999.53723,~999.58258,~999.62897,~999.67633,~999.72449,~999.77338,~999.82281,~999.87274,~999.92297,~999.97339,~1000.0239,~1000.0743,~1000.1246,~1000.1745,~1000.224,~1000.2729,~1000.3212,~1000.3685,~1000.415,~1000.4604,~1000.5046,~1000.5475,~1000.5891,~1000.6292,~1000.6676,~1000.7043,~1000.7393,~1000.7723,~1000.8034,~1000.8325,~1000.8594,~1000.8841,~1000.9066,~1000.9267,~1000.9445,~1000.9598,~1000.9728,~1000.9833] \\; \\mathrm{\\frac{e^{-}}{s}}$"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 26,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "read_lc.flux"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "id": "95d9db0a-d902-44ff-8d83-552c275f5f14",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 27,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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Vavm5p5QqVKl7IILLnCnKinRIlqBRqxSqpryRL/77ju/pwIAQEiotlTBg7IRSpYs6fd0gNioiQjWpk2bXK1B0iLjypUru183b95sxYoV8zTWy2sG2w9a19orkEjO6NGjXQ2IAhedSujk5VwXzyjoCIYCmqRBTThfRvfEE0+4UyjVkQAAEKlOnz7tTiCUkcDPNESamAgi9u7dm+yJReA5Fe56HevlNYPx5Zdfut9z9913J3peHYnq1q3rLprREefWrVvdjc59+vSxF154wSpUqJDia6aW4pU0VahNmzYWCZQnqnxR/fmfffZZdm0AABHr1VdftZo1a7qf80BMBhHaRQ9nx48fT3anXelHgY97HevlNc9FKUyvv/6667TUsGHDs1Kf9AioVauW1atXzzp37uzqQVJrATdhwoSgWrxGwilEQgULFrSnn37aBRMKpPLmzev3lAAA8EQ1kFmzZnV1kkBM1kRo5/2RRx6xcKaFvdqxJhVY6AcW/l7GennN1Ozbt88thrXY1+663lDORfUTtWvXdi1iU6uR0GsG84i0IELKlCljjz76qMsjPXnypN/TAQAgaF9//bW7Yyvc109AhgYRefLksaZNm1o4U/68FutJBZ4rUqSI57FeXjMlhw4dcik5+lUnCsH8noQ3OmvxrIKsWFW9enVr0aKFu4gu3E/DAAAI3AWhO66eeuop7j5CRIvo7kzB0h0S6r+ctNB4/fr18R/3OtbLayZHJxbPPfecew3tpqdUUJ2SHTt2uNOOXLlyWSy7/vrrXYH5m2++6fdUAABI1Z9//mljxoxxG4eRmAUAZEgQoR14Hc0l3Z3XN4zy1jt16uR23dX+NLOphkAdEObMmRP/nFKR5s2b57ohJOyiFOxYL6959OhRV/egPtCiFCT9nejvQilMqd06Hfg9Canz09KlS93N2NxoadaqVSt38eCnn37q91QAAEhWXFyc2zxUTR93QSAaZAtlgdDHH39sY8eOje9QpF363r17u4Ww0k20kFagoShcef2hoM+pdKBANyQtrgP/3bx5c5dupUW9Fv0qRNZcdNPzggULbNeuXdalS5dErxfsWC+vuXHjRuvbt298FyRdjrdkyRK7+uqr7eDBg7Zw4cJE43WRXICCDZ04KNBQQbG6M82dO9d1KWrfvn1I/g6jgfpr62i4RIkSrtMFAADhQunHyjpQLZ/a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zet2csePH+8KUpXilCtXLr+nBaTq+++/d804nnzyyVTr5gAg3MVMEHHzzTfb2LFjbcyYMXbnnXe6XX8VjOzbt899/Pjx457GeR17Lkphev31193JRcOGDROlPekRUKtWLbfz2rlzZ1d3MWDAgBRfc8KECUEVVnMKgUilk7kHHnjALcyU4qTgOrmTPCAc7n9QwKtufKp/IOAFEOliJoho2rSp7d692+3iq7WqVKxY0e644w6bPn16/Bt6sOO8jk2Ngg6lZWjBr0XQuS4XUu1E7dq1bfHixYlOQZLS69GdCbFA3w9qq6wTiRYtWlijRo38nhIQT2mqSl/SLewKegEgGsRMECHt2rVzC3zVKuTJk8flVWs3XxLezRDsOK9jk3Po0CF3kZZ+VWpGkSJFgvqzqCuN6i6OHTtGoAD89z4JXbD46quvum43Xbp04ZQNvtNdQDqxfvzxx7nXB0BUiakgIpBHrcLkgBUrVrgFedLc1GDHeR2bkNKd1JVj+/btbgfVSxqGCvPUXpYjccAS1RB17drVFi5caN26dXP3uJx//vl+TwsxSKfESinVBpPu/tHPCQCIJjHT4jU56je/ceNGl/6g3Or0jktprC6QU82DWvkl/AGjwuh169a5FKaUdqgS/p6AzZs329KlS61GjRrnnA8Qixo0aOAu7tLiTZc4xsidmggTO3fudHf9lChRwqWqEkAAiEYxcxKhfvJTp051C+98+fK5rkrz5s1ztz5rwe91nJexCip08VzCLki6nXTJkiV29dVX28GDB93OadJFkCjQ0ImDgoyCBQu67kxz5851bWTbt2+fwX9rQOQqWbKkS2/SbrAupuvVq5f7PgUykt7LdYGc/r1deOGFfk8HADJMzAQRqjXQrv2MGTPcfQvaIWrbtq27OTphYXKw47yOTWrTpk3uV50o6JFUIIhQN6avvvrKZs+e7e59KFCggNWpU8cFJCqwTo261SQ9qWjWrJl7ALFA34f333+/y0tXC9hHHnnELr/8cr+nhSikE2fd56MNnlGjRlGPAyDqZTnDOX/UUbDRsmVL126Womvg/8TFxbkL6nRCocCCRR5CRYX8r732mt17772uUxgAxMI6koR6ADFBeem6V0VtmFV8rXokID3UHU/3BM2aNcsFqAQQAGJJzKQzAYA0btzYatas6YqulbPesWNHTiXg2dq1a10Aod2666+/3u/pAECm4yQCQMwpXLiwu/yrXLly7lRCTRGAYJw4ccLeeOMNmzJlig0ZMoQAAkDM4iQCQEzKkiWL3Xjjje5UYsSIEe5UQjntKowFkqM7gMaNG+eaZzz00EN+TwcAfEUQASCmqcuaTiXUmlOnEkpvUutlIODAgQPuJnT1IRk6dKjlz5/f7ykBgO8IIqIYLV6B4E8lGjZs6FoqK1Xlk08+sS5durgAA7FLQcPnn3/uCqd18kB7YAD4/wgiopgu2qLFKxC8PHnyuOBbnZueffZZl+9+++23czN8DNq2bZu79+Giiy5yBdQU3wNAYvxkBIAkdEO8Lgw7ffq0S3FatWqV31NCJt4nouBB6UuB9DYCCAA4GycRAJDCbdf/8z//Y40aNXLFtO+99549+uij7rI6RJ9Tp07ZRx99ZHPnzrX27dtz5wMAnANBBACkolChQta7d2/79ddf3d0SFSpUcItMUgWjx3/+8x978803rX79+vbyyy9btmz8aASAc+GdEgCCoOBBtxJ/++231qNHD7vpppusefPmLDgjmAJDBQ8qoH/++eetQIECfk8JACIGP/0AwEMXp2uuucaluqhjT+fOne3WW291t2Ar/QmR4ffff3fBg76enTp1sjJlyvg9JQCIOFnOqIcdosrhw4etZcuWVrp0aVq8Ahno2LFjNmPGDPv666/trrvusgYNGriFKcLTrl27bPz48Xbw4EG7//77rXz58n5PCQDCdh05bdq0VFN3OYmIYrR4BTKWbrdu3bq1u8F4+vTp9thjj7k3Xp1W0BY2fPz55582ZcoU27lzp+u2VK1aNb+nBAARjyACANIpd+7crtj6zjvvdF2cpk6dak2bNrUmTZrQHtRHv/zyiwsejh8/bnfffbe78wEAEBoEEQAQInnz5rUOHTpYmzZt7LPPPnO3XtetW9ddWKePIXP89NNPLnhQofS9995rF154od9TAoCoQxABABmQ5qQUpxYtWtiiRYusb9++rruTTioo4s24+pR58+a5ex70d92zZ08rXry439MCgKhFEAEAGUR1Eddff717rF692hX1HjhwwLWGvfbaa2kPGwLbt2+3Dz74wNavX++6ZA0bNsyllwEAMhY/wQAgE1SvXt09FER88sknLtXp0ksvdScW3ILtzYkTJ9x9Hfp7zJMnjzvhUbtdOmMBQOYhiACATJQ/f37X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+57V1/bgwYNWrFgxq1+/vt1+++2WK1cuv6eHIKh4ecaMGe5nrR5aQ3Xt2tUaNWoUEWstTiKQbqNGjbJZs2a5N68HHnjAVfIPGDDA1qxZ4/fUkE4ffPCBLV682C677DL3tW3SpIn7uj7++OO2ZcsWv6eHELaFfu+991h4RJnly5fbE088Yfv377eWLVvagw8+aFdddZXt2bPH76khnXbv3m3du3e39evXW7Nmzdz7c9WqVe2dd96xF1980e/pIUgHDhywqVOn2rZt26xcuXIRt9biJALposh50aJF7l6KO+64wz3XsGFDe+yxx2zixIk2fPhwv6eIdLjtttusZ8+elj179vjnrr32Wvf1ff/9961Hjx6+zg+h8dZbb7kTJrWH1g81RD5dFjVy5EgXNPTp0yfVNo2IPNqNPnTokA0bNswuvPBC95w2edRwU6fH2qnOmzev39PEOaiF6qRJk6xQoUK2ceNGFxhG0lqLdxWky7fffut+OOnNKyBHjhzWuHFjW7dundstQeSqVq1aogBCSpUq5VJetHOCyLd69Wr3faydLUSPr776yv7++2+Xeqj36KNHj7ogEdEhcKNwwYIFEz2vxai+3tmysUccCbJnz+6+ZpG61iKIQLps2rTJ5cb/85//TPR85cqV3a+bN2/2aWbIKNrp0uIkf/78fk8F6XTq1Cl744037MYbb3T5tYgeK1ascO/LSl16+OGH7X/+539cStPYsWNdbQQi2yWXXOJ+ffnll93PYS0iv/76a/vss8+sefPmpCZGmU1hutYiVEW66Gbs5KLowHPk3kafL7/80n1d7777br+ngnSaM2eOW3wMGjTI76kgA4puFSTqa6vdynbt2tmqVavs448/dmkwqpVA5KpZs6Yrqp0+fbotWbIk/vl//etf7vQJ0WVvmK61CCKQLtrRSpruEjhmC3wc0UMpTK+//ror4FM+JiKXah/U6UO70wUKFPB7OggxpS8dO3bMmjZtag899JB7rm7dunby5EkXPGoTQKmJiFzFixe36tWru6+rOuf98MMPrkGCFpY6jUD0OB6may2CCKSL/gGr7VhSgX/QgX/giHz79u2zgQMHuuNUFWpmzZrV7ykhHdQaUoWXLDaiU+C997rrrkv0vDq7KIhQHjVBRORSke0rr7zi0hGLFi3qnlMwoboXFdrq607KafTIEaZrLWoikO7OAlpcJhV4rkiRIj7MCqGm9Idnn33W/aqWcnxdIz/VZe7cuXbLLbe4Y/KdO3e6h35IKQVG/62+84js9+bkCm8Dp07q3oPI9emnn1qFChXiA4iAWrVquRMo5dAjehQO07UWJxFIF/U11kVk6hSRsOBHvasDH0dk007Hc889Z9u3b3f51erMhMim/FntWI4bN849krr//vvdZWR0bIpcFStWdMXV+lqXKVMm/nkFjcIudWRTc4vkWrgqXU20GYDoUS5M11oEEUiXevXq2cyZM93xeKB3sXYz582b5/rO6wZNRC79IHrhhRdc6sPTTz/taiEQ+RQI9u3bN9kUJ92gquDhvPPO82VuCI1rrrnG3eXyxRdfuMsiAz7//HOXihjo7oPIpFS0//znP25zR117EqY5qRUo3daiS70wXWsRRCBd9I9X/7h1WYpuRdXCQxfd7Nq1y7p06eL39BCCS8jU+ePqq6926S264CihBg0a+DY3pJ1SWurUqXPW8x9++KH7NbmPIbIo1UVdmRREaDNABbjqzqR+82r3SkpiZNNC8scff3T1abqxWoXVy5Ytc8+pZTNf38jx8X87pgU6LC1dujT+v1WzlidPnrBda2U5o6bvQDrTXbSDqdafyrPVDohaz11xxRV+Tw3p9OSTT7rLyFLy0UcfZep8kPFfb3VtevXVV/2eCkJAqS3q1qPdSqUxabdSC85bb73V76khBHSL8TvvvOPqH7TJU6JECdc1784776TxRQS57777XDCQnDfffNN9XcN1rUUQAQAAAMATujMBAAAA8IQgAgAAAIAnBBEAAAAAPCGIAAAAAOAJQQQAAAAATwgiAAAAAHjCZXMAAABADPrggw/iL7zTJXZDhgyxf/7zn0H9XoIIAAAAIMZ88skntnz5chs2bJi7jPK3336z7NmzB/37uWwOAODZLbfc4ml88eLFbfz48fG3oCe8iTXc6cbn0aNHx/9/rly53E3Qyf19JL3FPenfk24S1i5f4cKFrUKFCnb11Vdb7dq1U7xhuFWrVm6HMKBr167WqFGjkPy5AMSuU6dOWceOHW3o0KHuBCItOIkAAHjWsGHDs55bu3at/fnnn1auXDn3SCh//vwW6QJ/rhw5cqT570v7docPH7bt27fbwoULbcGCBe4HeM+ePa1y5cpn/b7rrrvOjh07Zps3b3YPIBZs2LDBfW+sXLnSdu3aZfny5bMqVarYPffcY6VLl/b8etOmTbPJkyfbBRdcYK+++mqij61atcr69u2b7O8bPny4Va1aNf7///jjD/c6P//8sx08eNDt3tevX99uv/12t7mQUY4cOWIzZsxwfy96xMXFpbqhcOLECZsyZYp7j9HYsmXLWtu2ba1GjRrxY/bs2ePeW7799lubPXu25cmTx/05brrppqDnRRABAPCsW7duZz03cuRIF0RoZ71NmzYp/j794CpSpIhFmtT+XGn5+9Lf1aRJk+ybb75xi5gXXnjBypcvn2jMo48+6n595513CCIQU3n62pSoV6+eWwD//fffLm//8ccftxdffNEuvPDCoF/rr7/+cieH51rk69SwUqVKiZ5LuEO/e/du6969u1tsN2vWzAU269atc9+bv/76qz399NOWUQ4cOGBTp051QYs2MhT4pGbUqFEuOGjRooWVKlXK5s+fbwMGDLDBgwfbxRdfHB9E6JRTgZFOhvWr/gxlypSJH3MuBBEAgEyjtCb8/wVK7969LXfu3PbFF1+4lKmEaVNAtFJao94Lkguu5bbbbnOncwnz86+99lp77LHH7P3337cePXoE/bneeustd4px+vRptxhPiRbOClpSol19LbpVPxAIYpo0aeJOF3Vqoh3/vHnzJvt79TGdqtStWzfZj3/11VdWq1atFAMdpT9qw6FQoUK2ceNGF8ykRCcVixYtsg4dOtgdd9wRfxKqv7uJEye60xUJnKgqZTJnzpwuONHJ5w8//BB0EEGLVwBApi4etOO3c+fORM/rufvuu8/l6WrH7cEHH7Q777zTHnnkEVeTEPDTTz+5Xft//etf7offSy+9lOLCQK/16aefusWIxuv1unTp4o7u9bFwoT+3Fg+bNm2yNWvW+D0dwHfVqlU7q8BXO+pKR9q2bVvQr6P6K+3IP/DAA0GNV6phSu8N+pgULFgw0fOFChWyf/zjH5YtW7ZUC5gVfHz33Xdnfezzzz93pys6LUiJ/i70eYKhP6/mowAnQAFD48aN3cmJTlREaWGpzTkYBBEAgLChH7SzZs1yO33aDVOwod15BRL64fjMM8+4H/JXXHGFW3hrd1BH9El7hChlqn///vbaa6+5Y3rtRF5++eW2b98+d3SvNobamQwHSo+oWbOm++9zpSkAsUrf40prCra+Su8Tb7zxht14440uJepc9D7T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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "read_lc.plot()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b2ff9422-1392-4f65-b56a-9e328e541857",
+ "metadata": {},
+ "source": [
+ "We can even check the meta data to make sure our telescope, mission, and origin information was saved correctly."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "id": "7befd3bf-034f-4622-9fac-67bcf49e58a9",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'EXTNAME': 'PRIMARY',\n",
+ " 'CHECKSUM': 'AaAiBX9ZAaAfAU7Z',\n",
+ " 'DATASUM': '0',\n",
+ " 'SIMPLE': True,\n",
+ " 'BITPIX': 8,\n",
+ " 'NAXIS': 0,\n",
+ " 'EXTEND': True,\n",
+ " 'NEXTEND': 2,\n",
+ " 'EXTVER': 1,\n",
+ " 'ORIGIN': 'Tutorial',\n",
+ " 'DATE': '2026-03-04',\n",
+ " 'CREATOR': 'lightkurve.LightCurve.to_fits()',\n",
+ " 'TELESCOP': 'MY_FAKE_TELESCOPE',\n",
+ " 'INSTRUME': None,\n",
+ " 'OBJECT': None,\n",
+ " 'RADESYS': 'ICRS',\n",
+ " 'RA_OBJ': None,\n",
+ " 'DEC_OBJ': None,\n",
+ " 'EQUINOX': 2000.0,\n",
+ " 'PROCVER': '2.5.2dev',\n",
+ " 'MISSION': 'MY_FAKE_MISSION',\n",
+ " 'LABEL': None,\n",
+ " 'RA': None,\n",
+ " 'DEC': None,\n",
+ " 'FILENAME': './my_custom_lightcurve.fits',\n",
+ " 'FLUX_ORIGIN': 'lightkurve.LightCurve.to_fits()'}"
+ ]
+ },
+ "execution_count": 28,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "read_lc.meta"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "09d64fbd-c8e7-4ecc-8b66-bb8a7030ebc1",
+ "metadata": {},
+ "source": [
+ "We now know how to create a LightCurve Object, save it as a FITS file, and read in a FITS file as a LightCurve Object."
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.12.12"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/pyproject.toml b/pyproject.toml
index 4fff36a30..d1e62b8a1 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[tool.poetry]
name = "lightkurve"
-version = "2.5.2dev"
+version = "2.6.1dev"
description = "A friendly package for Kepler & TESS time series analysis in Python."
license = "MIT"
authors = ["Geert Barentsen ", "TESS Science Support Center "]
@@ -36,7 +36,7 @@ beautifulsoup4 = ">=4.6.0"
requests = ">=2.22.0"
urllib3 = { version = ">=1.23", python = ">=3.8,<4.0" } # necessary to make requests work on py310
tqdm = ">=4.25.0"
-pandas = ">=1.3.6"
+pandas = ">=1.3.6, <3.0.0"
uncertainties = ">=3.1.4"
patsy = ">=0.5.0"
fbpca = ">=1.0"
@@ -81,6 +81,7 @@ mistune = "<2.0.0" # Workaround for #1162 (not a true dependency)
# See https://github.com/python-poetry/poetry/issues/9293
docutils = "!=0.21"
lxml-html-clean = "^0.4.2"
+ipython = ">=7.0"
[build-system]
requires = ["poetry-core"]
diff --git a/src/lightkurve/correctors/cbvcorrector.py b/src/lightkurve/correctors/cbvcorrector.py
index 0e051f58b..9024b08e0 100644
--- a/src/lightkurve/correctors/cbvcorrector.py
+++ b/src/lightkurve/correctors/cbvcorrector.py
@@ -96,7 +96,7 @@ class CBVCorrector(RegressionCorrector):
"""
def __init__(self, lc, interpolate_cbvs=False, extrapolate_cbvs=False, do_not_load_cbvs=False,
- cbv_dir=None):
+ cbv_dir=None, fast_cadence=False):
"""Constructor
This constructor will retrieve all relevant CBVs from MAST and then
@@ -120,6 +120,8 @@ def __init__(self, lc, interpolate_cbvs=False, extrapolate_cbvs=False, do_not_lo
cbv_dir : str
Path to specific directory holding TESS CBVs. If this is None, will query
MAST by default.
+ fast_cadence : bool
+ If True, then the 20-s fast cadence CBV file will be loaded
"""
if not isinstance(lc, LightCurve):
raise Exception(' must be a LightCurve class')
@@ -129,6 +131,11 @@ def __init__(self, lc, interpolate_cbvs=False, extrapolate_cbvs=False, do_not_lo
if extrapolate_cbvs and (extrapolate_cbvs != interpolate_cbvs):
raise Exception('interpolate_cbvs must be True if extrapolate_cbvs is True')
+
+ # Check if the lightkurve has 20-s cadence.
+ if hasattr(lc, 'filename'):
+ if 'fast' in lc.filename:
+ fast_cadence = True
# We do not want any NaNs
lc = lc.remove_nans()
@@ -151,7 +158,7 @@ def __init__(self, lc, interpolate_cbvs=False, extrapolate_cbvs=False, do_not_lo
# For TESS we load multiple CBV types
# Single-Scale
cbvs.append(load_tess_cbvs(cbv_dir=cbv_dir,sector=self.lc.sector,
- camera=self.lc.camera, ccd=self.lc.ccd, cbv_type='SingleScale'))
+ camera=self.lc.camera, ccd=self.lc.ccd, cbv_type='SingleScale', fast_cadence=fast_cadence))
# Multi-Scale
# Although there has always been 3 bands, there could be more,
@@ -162,7 +169,7 @@ def __init__(self, lc, interpolate_cbvs=False, extrapolate_cbvs=False, do_not_lo
iBand += 1
cbvObj = load_tess_cbvs(cbv_dir=cbv_dir,sector=self.lc.sector,
camera=self.lc.camera, ccd=self.lc.ccd, cbv_type='MultiScale',
- band=iBand)
+ band=iBand, fast_cadence=fast_cadence)
if (cbvObj.band == iBand):
cbvs.append(cbvObj)
else:
@@ -170,7 +177,7 @@ def __init__(self, lc, interpolate_cbvs=False, extrapolate_cbvs=False, do_not_lo
# Spike
cbvs.append(load_tess_cbvs(cbv_dir=cbv_dir,sector=self.lc.sector,
- camera=self.lc.camera, ccd=self.lc.ccd, cbv_type='Spike'))
+ camera=self.lc.camera, ccd=self.lc.ccd, cbv_type='Spike', fast_cadence=fast_cadence))
else:
raise ValueError('Unknown mission type')
@@ -1837,7 +1844,7 @@ def download_tess_cbvs(*args, **kwargs):
def load_tess_cbvs(cbv_dir=None,sector=None, camera=None,
- ccd=None, cbv_type='SingleScale', band=None):
+ ccd=None, cbv_type='SingleScale', band=None, fast_cadence=False):
"""Loads TESS cotrending basis vectors, either from a directory of
CBV files already saved locally if cbv_dir is passed, or else
will retrieve the relevant files programmatically from MAST.
@@ -1863,6 +1870,8 @@ def load_tess_cbvs(cbv_dir=None,sector=None, camera=None,
'SingleScale' or 'MultiScale' or 'Spike'
band : int
Multi-scale band number
+ fast_cadence : bool
+ 'True' to get 20-s cadence CBVs. If False, defaults to the 2-min CBV file.
Returns
-------
@@ -1934,7 +1943,10 @@ def load_tess_cbvs(cbv_dir=None,sector=None, camera=None,
else:
curlBaseUrl = 'https://archive.stsci.edu/missions/tess/download_scripts/sector/tesscurl_sector_'
- curlEndUrl = '_cbv.sh'
+ if fast_cadence:
+ curlEndUrl = '_fast-cbv.sh'
+ else:
+ curlEndUrl = '_cbv.sh'
curlUrl = curlBaseUrl + str(sector) + curlEndUrl
# This is the string to search for in the curl script file
diff --git a/src/lightkurve/io/generic.py b/src/lightkurve/io/generic.py
index a0bcd5061..c41c674a7 100644
--- a/src/lightkurve/io/generic.py
+++ b/src/lightkurve/io/generic.py
@@ -99,12 +99,29 @@ def read_generic_lightcurve(
log.debug("Ignoring {} rows with NaN times".format(np.sum(nans)))
tab = tab[~nans]
+ # Set default reference time value to 0.0
+ reference_time_value = 0.0
+
# Prepare a special time column
if not time_format:
+ # Check for the Kepler and TESS special cases
if hdulist[ext].header.get("BJDREFI") == 2454833: # Kepler specific
time_format = "bkjd"
elif hdulist[ext].header.get("BJDREFI") == 2457000: # TESS specific
time_format = "btjd"
+ # Work through options from the FITS Standard v4.0 Section 9.2.2
+ elif ("MJDREFI" in hdulist[ext].header) and ("MJDREFF" in hdulist[ext].header): # Check if MJDREFI and MJDREFF set
+ time_format = "mjd"
+ reference_time_value = hdulist[ext].header.get("MJDREFI") + hdulist[ext].header.get("MJDREFF")
+ elif "MJDREF" in hdulist[ext].header: # Check if MJDREF set
+ time_format = "mjd"
+ reference_time_value = hdulist[ext].header.get("MJDREF")
+ elif ("JDREFI" in hdulist[ext].header) and ("JDREFF" in hdulist[ext].header): # Check if JDREFI and JDREFF set
+ time_format = "jd"
+ reference_time_value = hdulist[ext].header.get("JDREFI") + hdulist[ext].header.get("JDREFF")
+ elif "JDREF" in hdulist[ext].header: # Check if JDREF set
+ time_format = "jd"
+ reference_time_value = hdulist[ext].header.get("JDREF")
# make compatible with normalized light curves without absolute start sime (see #1502)
elif hdulist[ext].header.get("TIMESYS") == "local":
try:
@@ -115,14 +132,19 @@ def read_generic_lightcurve(
tab.remove_column("time")
except:
raise KeyError(f"Unclear unit for local time system: TUNIT1 must be astropy.unit value.") # Error handling for invalid astropy.unit value or if the TUNIT1 keyword is missing from header
-
+ # Check for nonstandard, format-flavored values of TIMESYS
elif hdulist[ext].header.get("TIMESYS") == "mjd":
time_format = 'mjd'
elif hdulist[ext].header.get("TIMESYS") == "jd":
time_format = 'jd'
+ # Raise error if reference time (or related variants) not found
else:
- raise ValueError(f"Input file has unclear time format: {filename}")
+ raise ValueError(f"No reference time found in {filename}. Pass in a common time_format manually, or edit the FITS header.")
if 'time' not in locals():
+ if (tab["time"].unit is not None) and (tab["time"].unit != u.d) and (type(tab["time"].unit) is not u.UnrecognizedUnit):
+ # If time column is in a recognized unit other than days...
+ tab["time"] = tab["time"].to(u.d, copy=False) # ...convert to days.
+ tab["time"] += reference_time_value # Add reference time to the time column values
time = Time(
tab["time"].data,
scale=hdulist[ext].header.get("TIMESYS", "tdb").lower(),
@@ -156,7 +178,15 @@ def read_generic_lightcurve(
tab.meta["RA"] = hdulist[0].header.get("RA_OBJ")
tab.meta["DEC"] = hdulist[0].header.get("DEC_OBJ")
tab.meta["FILENAME"] = filename
- tab.meta["FLUX_ORIGIN"] = flux_column
+ # issue 1371 -
+ # When reading in a file saved with to_fits, the flux source is not known
+ # We could save the flux_origin keyword, but that is an incomplete story,
+ # as we don't know if other manipulation (like detrending) also occurred
+ # So, we populate the 'FLUX_ORIGIN' meta data with 'to_fits' to contain that ambiguity
+ if ("CREATOR" in hdulist[0].header) and (hdulist[0].header["CREATOR"] == 'lightkurve.LightCurve.to_fits()'):
+ tab.meta["FLUX_ORIGIN"] = "lightkurve.LightCurve.to_fits()"
+ else:
+ tab.meta["FLUX_ORIGIN"] = flux_column
return LightCurve(time=time, data=tab)
finally:
diff --git a/src/lightkurve/io/kepler.py b/src/lightkurve/io/kepler.py
index 98b56fb37..2f162d387 100644
--- a/src/lightkurve/io/kepler.py
+++ b/src/lightkurve/io/kepler.py
@@ -4,6 +4,8 @@
from .generic import read_generic_lightcurve
+import numpy as np
+
def read_kepler_lightcurve(
filename, flux_column="pdcsap_flux", quality_bitmask="default"
@@ -38,6 +40,11 @@ def read_kepler_lightcurve(
time_format="bkjd",
)
+ #RAH - To allow generic lightcurves to be read by Kepler read we need to add this work around
+ if "sap_quality" not in lc.columns:
+ lc['sap_quality'] = np.zeros(len(lc['time']), dtype=int)
+
+
# Filter out poor-quality data
# NOTE: Unfortunately Astropy Table masking does not yet work for columns
# that are Quantity objects, so for now we remove poor-quality data instead
diff --git a/src/lightkurve/io/tess.py b/src/lightkurve/io/tess.py
index 0f833f58d..1dbc95646 100644
--- a/src/lightkurve/io/tess.py
+++ b/src/lightkurve/io/tess.py
@@ -4,6 +4,8 @@
from .generic import read_generic_lightcurve
+import numpy as np
+
def read_tess_lightcurve(
filename, flux_column="pdcsap_flux", quality_bitmask="default", time_format="btjd",
@@ -32,6 +34,10 @@ def read_tess_lightcurve(
"""
lc = read_generic_lightcurve(filename, flux_column=flux_column, time_format=time_format)
+ #RAH - To allow generic lightcurves to be read by TESS read we need to add this work around
+ if "quality" not in lc.columns:
+ lc['quality'] = np.zeros(len(lc['time']), dtype=int)
+
# Filter out poor-quality data
# NOTE: Unfortunately Astropy Table masking does not yet work for columns
# that are Quantity objects, so for now we remove poor-quality data instead
diff --git a/src/lightkurve/lightcurve.py b/src/lightkurve/lightcurve.py
index 5bcad1343..d7ea14c8a 100644
--- a/src/lightkurve/lightcurve.py
+++ b/src/lightkurve/lightcurve.py
@@ -275,9 +275,9 @@ class LightCurve(TimeSeries):
Time values. They can either be given directly as a
`~astropy.time.Time` array or as any iterable that initializes the
`~astropy.time.Time` class.
- flux : `~astropy.units.Quantity` or iterable
+ flux : `~astropy.units.Quantity`, `~astropy.units.masked.MaskedQuantity`, or iterable
Flux values for every time point.
- flux_err : `~astropy.units.Quantity` or iterable
+ flux_err : `~astropy.units.Quantity`, `~astropy.units.masked.MaskedQuantity`, or iterable
Uncertainty on each flux data point.
**kwargs : dict
Additional keyword arguments are passed to `~astropy.table.QTable`.
@@ -579,8 +579,14 @@ def time(self, time):
self["time"] = time
@property
- def flux(self) -> Quantity:
- """Brightness values stored as an AstroPy `~astropy.units.Quantity` object."""
+ def flux(self):
+ """Brightness values stored as an AstroPy `~astropy.units.Quantity` object.
+
+ Note: In special circumstances, this may be an `~astropy.units.masked.MaskedQuantity`
+ object. Masked values are treated by lightkurve as missing data. Masked
+ data may be accessed via self.flux.unmasked, which returns the unmasked
+ Quantity object.
+ """
return self["flux"]
@flux.setter
@@ -588,8 +594,15 @@ def flux(self, flux):
self["flux"] = flux
@property
- def flux_err(self) -> Quantity:
- """Brightness uncertainties stored as an AstroPy `~astropy.units.Quantity` object."""
+ def flux_err(self):
+ """Brightness uncertainties stored as an AstroPy `~astropy.units.Quantity` object.
+
+
+ Note: In special circumstances, this may be an `~astropy.units.masked.MaskedQuantity`
+ object. Masked values are treated by lightkurve as missing data. Masked
+ data may be accessed via self.flux_err.unmasked, which returns the unmasked
+ Quantity object.
+ """
return self["flux_err"]
@flux_err.setter
@@ -1844,7 +1857,7 @@ def query_solar_system_objects(
the solar system objects (name, brightness, time) that passed in the
vicinity of the target during the span of the light curve.
- This method queries the `SkyBot API `_,
+ This method queries the `SkyBot API `_,
which returns a list of asteroids/comets/planets given a location, time,
and search cone.
@@ -2537,7 +2550,11 @@ def to_seismology(self, **kwargs):
return Seismology.from_lightcurve(self, **kwargs)
def to_fits(
- self, path=None, overwrite=False, flux_column_name="FLUX", **extra_data
+ self,
+ path=None,
+ overwrite=False,
+ flux_column_name="FLUX",
+ **extra_data
):
"""Converts the light curve to a FITS file in the Kepler/TESS file format.
@@ -2576,12 +2593,14 @@ def to_fits(
np.float64: "D",
}
+
# If users give a dictionary of values, we first need to "remove" the values from the dictionary
if extra_data.get('extra_data') is not None:
for k in extra_data.get('extra_data').keys():
extra_data[k] = extra_data['extra_data'][k]
extra_data.pop('extra_data')
+
def _header_template(extension):
"""Returns a template `fits.Header` object for a given extension."""
template_fn = os.path.join(
@@ -2639,7 +2658,7 @@ def _make_lightcurve_extension(extra_data=None):
)
)
if ~np.asarray(
- [flux_column_name in k.upper() for k in extra_data.keys()]
+ [flux_column_name.upper() == k.upper() for k in extra_data.keys()]
).any():
cols.append(
fits.Column(
@@ -2687,15 +2706,12 @@ def _make_lightcurve_extension(extra_data=None):
array=extra_data[kw],
)
)
- if "SAP_QUALITY" not in extra_data:
- cols.append(
- fits.Column(
- name="SAP_QUALITY", format="J", array=np.zeros(len(self.flux))
- )
- )
+
coldefs = fits.ColDefs(cols)
hdu = fits.BinTableHDU.from_columns(coldefs)
hdu.header["EXTNAME"] = "LIGHTCURVE"
+
+
return hdu
def _hdulist(**extra_data):
@@ -3382,8 +3398,6 @@ def to_fits(
self,
path=None,
overwrite=False,
- flux_column_name="FLUX",
- aperture_mask=None,
**extra_data,
):
"""Writes the FoldedLightCurve to a FITS file.
@@ -3394,13 +3408,6 @@ def to_fits(
File path, if `None` returns an astropy.io.fits.HDUList object.
overwrite : bool
Whether or not to overwrite the file
- flux_column_name : str
- The name of the label for the FITS extension, e.g. SAP_FLUX or FLUX
- aperture_mask : array-like
- Optional 2D aperture mask to save with this lightcurve object, if
- defined. The mask can be either a boolean mask or an integer mask
- mimicking the Kepler/TESS convention; boolean masks are
- automatically converted to the Kepler/TESS conventions
extra_data : dict
Extra keywords or columns to include in the FITS file.
Arguments of type str, int, float, or bool will be stored as
@@ -3629,13 +3636,16 @@ def read(cls, *args, **kwargs):
# Default to Kepler file format
if kwargs.get("format") is None:
kwargs["format"] = "kepler"
+
+
return super().read(*args, **kwargs)
+
+
def to_fits(
self,
path=None,
overwrite=False,
- flux_column_name="FLUX",
aperture_mask=None,
**extra_data,
):
@@ -3647,8 +3657,6 @@ def to_fits(
File path, if `None` returns an astropy.io.fits.HDUList object.
overwrite : bool
Whether or not to overwrite the file
- flux_column_name : str
- The name of the label for the FITS extension, e.g. SAP_FLUX or FLUX
aperture_mask : array-like
Optional 2D aperture mask to save with this lightcurve object, if
defined. The mask can be either a boolean mask or an integer mask
@@ -3759,7 +3767,6 @@ def to_fits(
self,
path=None,
overwrite=False,
- flux_column_name="FLUX",
aperture_mask=None,
**extra_data,
):
@@ -3771,8 +3778,6 @@ def to_fits(
File path, if `None` returns an astropy.io.fits.HDUList object.
overwrite : bool
Whether or not to overwrite the file
- flux_column_name : str
- The name of the label for the FITS extension, e.g. SAP_FLUX or FLUX
aperture_mask : array-like
Optional 2D aperture mask to save with this lightcurve object, if
defined. The mask can be either a boolean mask or an integer mask
@@ -3790,6 +3795,7 @@ def to_fits(
hdu : astropy.io.fits
Returns an astropy.io.fits object if path is None
"""
+
tess_specific_data = {
"OBJECT": "{}".format(self.targetid),
"MISSION": self.meta.get("MISSION"),
@@ -3800,9 +3806,9 @@ def to_fits(
"SECTOR": self.meta.get("SECTOR"),
"TARGETID": self.meta.get("TARGETID"),
"DEC_OBJ": self.meta.get("DEC"),
+ "SAP_QUALITY": self.quality,
}
-
-
+
# Not every HLSP has centroid col/row information, so only pass this along if the data exists
if hasattr(self, 'centroid_col'):
diff --git a/src/lightkurve/periodogram.py b/src/lightkurve/periodogram.py
index 1009c2348..28e2f56cf 100644
--- a/src/lightkurve/periodogram.py
+++ b/src/lightkurve/periodogram.py
@@ -844,6 +844,7 @@ def from_lightcurve(
)
time = lc.time.copy()
+ flux = lc.flux.copy()
# Approximate Nyquist Frequency and frequency bin width in terms of days
nyquist = 0.5 * (1.0 / (np.median(np.diff(time.value)))) * (1 / cds.d)
@@ -912,6 +913,22 @@ def from_lightcurve(
# Convert to desired units
frequency = u.Quantity(frequency, freq_unit)
+ # Slight tweaks to support nifty-ls implementation
+ if ls_method[:9] == 'fastnifty': # nifty-ls
+ try:
+ import nifty_ls
+ # If using nifty_ls, flux must be float64
+ flux = flux.value.astype('float64')*flux.unit
+ except ImportError:
+ oldmethod = ls_method
+ ls_method = {"fastnifty": "fast", "fastnifty_chi2": "fastchi2"}[ls_method]
+ log.warning(
+ "nifty_ls is not available.\n"
+ "Method has been changed from '{}' to '{}'.".format(
+ oldmethod, ls_method
+ )
+ )
+
# Change to compatible ls method if sampling not even in frequency
if not implementations.main._is_regular(frequency) and ls_method in [
"fastchi2",
@@ -940,11 +957,11 @@ def from_lightcurve(
if float(astropy.__version__[0]) >= 3:
LS = LombScargle(
- time, lc.flux, nterms=nterms, normalization="psd", **kwargs
+ time, flux, nterms=nterms, normalization="psd", **kwargs
)
power = LS.power(frequency, method=ls_method)
else:
- LS = LombScargle(time, lc.flux, nterms=nterms, **kwargs)
+ LS = LombScargle(time, flux, nterms=nterms, **kwargs)
power = LS.power(frequency, method=ls_method, normalization="psd")
if normalization == "psd": # Power spectral density
diff --git a/src/lightkurve/search.py b/src/lightkurve/search.py
index ca08df963..658b90553 100644
--- a/src/lightkurve/search.py
+++ b/src/lightkurve/search.py
@@ -138,7 +138,12 @@ def _sort_table(self):
self.table["sort_order"] = [
sort_priority.get(author, 9) for author in self.table["author"]
]
- self.table.sort(["distance", "sort_order", "author", "year", "exptime", "mission",])
+
+ # Columns "year", "sequence_number", "mission" together maintain chronological sub-order.
+ # We need all three columns because:
+ # - year + mission would fail for TESS sectors 99 and 100 (both in yr 2026, 100 would be ahead)
+ # - year + sequence_number would fail for Kepler (which has no value for sequence_number)
+ self.table.sort(["distance", "sort_order", "author", "year", "sequence_number", "mission", "exptime"])
def _add_columns(self):
@@ -948,7 +953,7 @@ def _search_products(
)
target = str(target)
# see: https://archive.stsci.edu/k2/manuals/KSCI-19082-021.pdf
- elif (target > 200000000) and (target < 252090718):
+ elif (target > 200000000) and (target < 252090718):
log.warning(
"Warning: {} may refer to a different K2 or TESS target. "
"Please add the prefix 'EPIC' or 'TIC' to disambiguate."
@@ -962,7 +967,7 @@ def _search_products(
"".format(target)
)
return None
-
+
# astroquery 0.4.11 update breaks if passing an integer, so convert to string
else:
target = f"TIC {target}"
@@ -1009,7 +1014,8 @@ def _search_products(
"".format(len(observations))
)
if len(observations) == 0:
- raise SearchError('No data found for target "{}".'.format(target))
+ log.debug('No data found for target "{}".'.format(target))
+ return SearchResult(None)
# Light curves and target pixel files
if filetype.lower() != "ffi":
@@ -1182,7 +1188,7 @@ def _query_mast(
# Was a TESS target ID passed?
tess_match = re.match(r"^(tess|tic) ?(\d+)$", target_lower)
if tess_match:
- exact_target_name = f"{tess_match.group(2).zfill(9)}"
+ exact_target_name = f"{tess_match.group(2)}" # for TESS, the id is not zero-padded in MAST
if exact_target_name and radius is None:
log.debug(
diff --git a/src/lightkurve/targetpixelfile.py b/src/lightkurve/targetpixelfile.py
index add4c17f7..7e2b2c848 100644
--- a/src/lightkurve/targetpixelfile.py
+++ b/src/lightkurve/targetpixelfile.py
@@ -955,7 +955,7 @@ def query_solar_system_objects(
the solar system objects (name, brightness, time) that passed in the
vicinity of the target during the span of the light curve.
- This method queries the `SkyBot API `_,
+ This method queries the `SkyBot API `_,
which returns a list of asteroids/comets/planets given a location, time,
and search cone.
diff --git a/src/lightkurve/utils.py b/src/lightkurve/utils.py
index 037eb6c3a..9189da800 100644
--- a/src/lightkurve/utils.py
+++ b/src/lightkurve/utils.py
@@ -22,6 +22,7 @@
LinearStretch,
)
from astropy.time import Time
+import time
log = logging.getLogger(__name__)
@@ -731,18 +732,21 @@ def _query_solar_system_objects(
-------
result : `pandas.DataFrame`
DataFrame containing the list of known solar system objects at the
- requested time and location.
+ requested time and location. Note a unique line in the table is created for
+ each timestamp in which an object is present.
"""
# We import pandas locally, because it takes quite a bit of time to import,
# and it is only required for this specific feature.
import pandas as pd
+ from pandas.errors import EmptyDataError
+ from urllib.error import HTTPError
if (location.lower() == "kepler") or (location.lower() == "k2"):
location = "C55"
elif location.lower() == "tess":
location = "C57"
- url = "http://vo.imcce.fr/webservices/skybot/skybotconesearch_query.php?"
+ url = "https://ssp.imcce.fr/webservices/skybot/api/conesearch.php?"
url += "-mime=text&"
url += "-ra={}&".format(ra)
url += "-dec={}&".format(dec)
@@ -753,14 +757,24 @@ def _query_solar_system_objects(
times = np.atleast_1d(times)
for time in tqdm(times, desc="Querying for SSOs", disable=~show_progress):
url_queried = url + "EPOCH={}".format(time)
- response = download_file(url_queried, cache=cache, show_progress=show_progress)
+ for attempt in range(5):
+ try:
+ response = download_file(url_queried, cache=cache, show_progress=show_progress)
+ break
+ except HTTPError:
+ log.info(f"HTTP error (Attempt {attempt+1} of 5). Trying again...")
+ time.sleep(1)
+
if open(response).read(10) == "# Flag: -1": # error code detected?
raise IOError(
"SkyBot Solar System query failed.\n"
"URL used:\n" + url_queried + "\n"
"Response received:\n" + open(response).read()
)
- res = pd.read_csv(response, delimiter="|", skiprows=2)
+ try:
+ res = pd.read_csv(response, delimiter="|", skiprows=2)
+ except EmptyDataError:
+ res = []
if len(res) > 0:
res["epoch"] = time
res.rename(
diff --git a/src/lightkurve/version.py b/src/lightkurve/version.py
index 54e189b12..8069e7c3a 100644
--- a/src/lightkurve/version.py
+++ b/src/lightkurve/version.py
@@ -1,3 +1,3 @@
# It is important to store the version number in a separate file
# so that we can read it from setup.py without importing the package
-__version__ = "2.5.2dev"
+__version__ = "2.6.1dev"
diff --git a/tests/data/test-sparcs-jdref.fits b/tests/data/test-sparcs-jdref.fits
new file mode 100644
index 000000000..8591ae120
--- /dev/null
+++ b/tests/data/test-sparcs-jdref.fits
@@ -0,0 +1,230 @@
+SIMPLE = T / conforms to FITS standard BITPIX = -32 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 32 NAXIS2 = 32 EXTEND = T IMG_TYPE= 'Subraster' / image type BUNIT = 'electron/s' / brightness unit for array values X_REF = 511 / ROI center pixel coordinate in FFI (x-axis) Y_REF = 511 / ROI center pixel coordinate in FFI (y-axis) EXTNAME = 'PRIMARY ' / name of extension OBSERVAT= 'SPARCS ' / observatory name TELESCOP= 'SPARCS ' / telescope name OBSERVER= 'SPARCS ' / observer name INSTRUME= 'SPARCS Photometer' / instrument name CAMERA = 'SPARCam ' / camera name CCD = 'NUV ' / detector name DOI = 'doi:10.17909/fwhs-qk10' / digital object identifier for mission LICENSE = 'CC BY 4.0' / license LICENURL= 'https://creativecommons.org/licenses/by/4.0/' / license URL VER = 'DR0 ' / data release version CAL_VER = '0.0.0 ' / data processing pipeline version CAMP_ID = 3 / observing campaign number OBJECT = 'AD Leo ' / target name RA_TARG = 154.9011700755108 / [deg] right ascension coordinate of the target DEC_TARG= 19.87000290182528 / [deg] declination coordinate of the target OBS_MODE= 'Dynamic ' / observing mode SIMULATD= 1 / 0: Actual observations; 1: Simulated TIMESYS = 'TDB ' / time scale of time-related keywords TREFPOS = 'BARYCENTER' / time reference position CHANNEL = 'NUV ' / observing channel (NUV or FUV) FILTER = 'NUV ' / SPARCS filter (NUV or FUV) WAVEBAND= 'UV ' / waveband for MAST DB LAM-MIN = 'N/A ' / [nm] minimum wavelength LAM-MAX = 'N/A ' / [nm] maximum wavelength WCSAXES = 2 / Number of coordinate axes CRPIX1 = 16.5 / Pixel coordinate of reference point CRPIX2 = 16.5 / Pixel coordinate of reference point CDELT1 = 0.0013638888888889 / [deg] Coordinate increment at reference point CDELT2 = 0.0013638888888889 / [deg] Coordinate increment at reference point CUNIT1 = 'deg' / Units of coordinate increment and value CUNIT2 = 'deg' / Units of coordinate increment and value CTYPE1 = 'RA---TAN' / Right ascension, gnomonic projection CTYPE2 = 'DEC--TAN' / Declination, gnomonic projection CRVAL1 = 154.90117007551 / [deg] Coordinate value at reference point CRVAL2 = 19.870002901825 / [deg] Coordinate value at reference point LONPOLE = 180.0 / [deg] Native longitude of celestial pole LATPOLE = 19.870002901825 / [deg] Native latitude of celestial pole MJDREF = 0.0 / [d] MJD of fiducial time RADESYS = 'ICRS' / Equatorial coordinate system PC1_1 = 1.0 / linear transformation matrix element cos(rho) PC1_2 = 0.0 / linear transformation matrix element -sin(rho) PC2_1 = 0.0 / linear transformation matrix element sin(rho) PC2_2 = 1.0 / linear transformation matrix element cos(rho) TEMP_CCD= 0.0 / [degrees celsius] average detector temperature TEMP_NUV= 0.0 / [degrees celsius] average NUV detector temp TEMP_FUV= 0.0 / [degrees celsius] average FUV detector temp TEMP_TEL= 0.0 / [degrees celsius] average telescope temp TEMP_TEC= 0.0 / [degrees celsius] average TEC temp TEMP_OPT= 0.0 / [degrees celsius] average optical bench temp XPOSURE = 377192.8849489689 / [s] duration of exposure, excluding dead time EXPTIME = 90.0 / [s] duration of single exposure in stack TSTART = 2459526.520800724 / [JD] time at start of first exposure DATE-OBS= '2021-11-08T00:29:57.183' / ISO 8601 TDB at start of first exposure JD-OBS = 2459526.520800724 / Julian Date (JD) at start of first exposure MJD-BEG = 59526.02080072416 / [d] modified JD at start of first exposure MJD-MID = 59528.52183985477 / [d] modified JD at mid-sequence MJD-END = 59531.02287898539 / [d] modified JD at end of last exposure ANNEAL = '' / TDB date of latest on-orbit annealing SAT_MET = -1144.977121014614 / mission elapsed time [Days] SAT_STAT= 'OK ' / satellite position status BJD = 2459529.020767412 / barycentric Julian Date at mid-exposure DATE = '2024-10-30T17:20:06.798' / TDB of file creation CHECKSUM= 'ZDS3bCS2ZCS2bCS2' / HDU checksum updated 2026-01-23T13:59:22 DATASUM = '3141787759' / data unit checksum updated 2026-01-23T13:59:22 REDLEAK = 1 / red leak correction factor APTCORR = 1 / aperture correction factor ABSCAL = 2.19258146405945E-15 / [erg/cm^2/electron/A]flux density calib factor END A.clA-\A-A/,A.A-A.A-wqA-A/,A. A.A-/A.KA-HA-A. aA.IA. A.]A-AA.A.}FA.+"A-)A.CA.[A.)KA/A.,A-yA/A.?A.27A.BA-{A-$A.QA.A-"{A.eA-A-A- A.pA-m*A.A-A.~nA.8IA.A.?A.D.A.FA.UA.A-A.A.3A-AA.A-5A.A-qA- A-A-aA-7A.SA-A-;A-A.YA.?aA-sA.GA-A.vA/A.A-A-LA.;A-ۅA. !A.QA-MA- A.C:A.jA-GA-A-#A.izA-eA-zA-3A.CA.A.>VA.A-{A.?[A.A.XWA-HA,A._A-A.8'A-.A-TA.%2A-CA-ٔA.9A.{A.#A,jA-A-A-A.BA.WkA-KA.kA.A.A.A-sA.9&A.KA.A.`A.uA-A-ŃA-KA.A-A.5A.
+A-A.A.;A->A-XA-A.A.KA-ъA-A-A.SNA-A-A.&
+A.fA-A.A.bA.A.ilA-A--A.A.7A.KA- A-]A.%A.ZA-A-JA.YA-A.A-dA.YA.+A.`A.\A-c>A.~A.A.
A-A-A-A.]}A-ְA.jA.A-A.TA.]sA-A-sA->A.9A-]A-A.A.!A.rA-5A.BA-A-A.~A-A.WLA-'A-A.{A-1A.UA.uA-#A.nA.WBA-yA-A.A.WdA-zWA.mA.Z2A.
A-A.UA.|\A-A.GuA/ A/bA0tA0dA/>A-aA/8A-A/fA-A.yA."A.bA.4A-A-A.iA.$A-A.VA.rA-A-A-sA-A.#A--A.*A.A-^A-uA-EA0jA6;A:A9A5TA1A/!A.)A.1WA-A.@A,A--A-4A.dA-A.A-oA-mA-mOA.A.]A.rA.cA-KoA-A-A-,A-KdA- A.zA/ףA6AD|APDAOAA-A4A/bA.rA-_A-`A-,A.PA.A.A.A.
A.DA-qA.eA-^A-GCA,ƽA-CA.A.,A.I]A.tCA-A.;A.A.9BA0pA:uAPpAd>Ac}AMA9A0XjA.`A/ tA-A.!A.LA-kA.A-VA-iA-QA.A.HyA-A-AGA.NA.&A.A-ȿA.)PA.A-cA-A.A.=A1IA:AO&AcPAbANA9!A1IA/Y_A-A-uA.A.2#A.A-\mA.A.A.A-{A-A.XA.}A.A.~A-aA-A.aA-A-A.*BA.TrA.A.A.A.A-A-A-xA/lA-A-A-A.]A.ܓA.A.A.dA-A-dA-`A-A.#6A.}iA.@A-CA.TA-uA.A.^A-EA-A.4A-uxA-ґA.tA.A-8A,ZA.HvA-A.):A.AA.A-ޞA-A-#A-XA-A-$A.-A-A.nA.A-A.A-A-A-^A-KA.bA-A.]A.-A.A.uA.2jA-HA-xA-A.(oA-A.A-xA-
A.A/yA-IA.A.UA.>A.ƶA.A.A-A.A.A>A-A-A- A.]{A.4A.eAA.$A-A.PA-A-A.1A.sA-A.=A.8A-
+A.kA..A.A.ZA-A.oA-q(A.ntA.
+A.bA.A-A-DsA.KVA.BA-A-FA.3A-]*A-M/A.A-ZA/C}A-$A-WjA-A.A.[fA.tA.CA-A.QA.~A-A.RA-A.;A.A-qA.vA.A.+FA-BA-A-A.CA.tiA.A.ZA.>bA-fA.oA.BA.;A-aA.JA-:A.5A.A.҂A-tA.;A.2A-OA-ćA.)`A.A.
?A.A-A-zA.^A-%A-blA.=A.rJA-A-$A-A-A-dA-G
+A-aA-6A-|A.A-A-A-{A.A-S XTENSION= 'BINTABLE' / binary table extension BITPIX = 8 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 86 / length of dimension 1 NAXIS2 = 4253 / length of dimension 2 PCOUNT = 0 / number of group parameters GCOUNT = 1 / number of groups TFIELDS = 21 / number of table fields TCTYP1 = 'TDB ' / time scale TRPOS1 = 'BARYCENTER' / time reference position TTYPE1 = 'TIME ' / column name: time (BJD) at mid-exposure TFORM1 = 'D ' / column format: 64-bit floating point TUNIT1 = 'd ' / column unit: day TTYPE2 = 'TIMECORR' / column name: barycentric correction TFORM2 = 'E ' / column format: 32-bit floating point TUNIT2 = 'd ' / column unit: day TTYPE3 = 'CTR ' / column name: source count rates TFORM3 = 'E ' / column format: 32-bit floating point TUNIT3 = 'electron/s' / column unit: electron/s TTYPE4 = 'CTR_ERR ' / column name: source count rate errors TFORM4 = 'E ' / column format: 32-bit floating point TUNIT4 = 'electron/s' / column unit: electron/s TTYPE5 = 'FLUX ' / column name: source flux density TFORM5 = 'E ' / column format: 32-bit floating point TUNIT5 = 'erg/s/cm^2/A' / column unit: erg/s/cm^2/A TTYPE6 = 'FLUX_ERR' / column name: source flux density error TFORM6 = 'E ' / column format: 32-bit floating point TUNIT6 = 'erg/s/cm^2/A' / column unit: erg/s/cm^2/A TTYPE7 = 'EXPTIME ' / column name: detector exposure time TFORM7 = 'E ' / column format: 32-bit floating point TUNIT7 = 's ' / column unit: second TTYPE8 = 'GAIN ' / column name: detector gain TFORM8 = 'E ' / column format: 32-bit floating point TUNIT8 = 'electron/adu' / column unit: electron/adu TTYPE9 = 'TEMP_CCD' / column name: detector temperature TFORM9 = 'E ' / column format: 32-bit floating point TUNIT9 = 'Celsius ' / column unit: degree celsius TTYPE10 = 'TEMP_TEL' / column name: telescope temperature TFORM10 = 'E ' / column format: 32-bit floating point TUNIT10 = 'Celsius ' / column unit: degree celsius TTYPE11 = 'TEMP_TEC' / column name: TEC temperature TFORM11 = 'E ' / column format: 32-bit floating point TUNIT11 = 'Celsius ' / column unit: degree celsius TTYPE12 = 'TEMP_OPT' / column name: optical bench temperature TFORM12 = 'E ' / column format: 32-bit floating point TUNIT12 = 'Celsius ' / column unit: degree celsius TTYPE13 = 'CENX_WCS' / column name: WCS-based source centroid (axis 1)TFORM13 = 'E ' / column format: 32-bit floating point TUNIT13 = 'pixel ' / column unit: pixel TTYPE14 = 'CENY_WCS' / column name: WCS-based source centroid (axis 2)TFORM14 = 'E ' / column format: 32-bit floating point TUNIT14 = 'pixel ' / column unit: pixel TTYPE15 = 'CENX ' / column name: source centroid along axis 1 TFORM15 = 'E ' / column format: 32-bit floating point TUNIT15 = 'pixel ' / column unit: pixel TTYPE16 = 'CENY ' / column name: source centroid along axis 2 TFORM16 = 'E ' / column format: 32-bit floating point TUNIT16 = 'pixel ' / column unit: pixel TTYPE17 = 'RA_AVG ' / column name: average RA during exposure TFORM17 = 'E ' / column format: 32-bit floating point TUNIT17 = 'deg ' / column unit: degree TTYPE18 = 'RA_SIG ' / column name: stdev RA during exposure TFORM18 = 'E ' / column format: 32-bit floating point TUNIT18 = 'deg ' / column unit: degree TTYPE19 = 'DEC_AVG ' / column name: average DEC during exposure TFORM19 = 'E ' / column format: 32-bit floating point TUNIT19 = 'deg ' / column unit: degree TTYPE20 = 'DEC_SIG ' / column name: stdev DEC during exposure TFORM20 = 'E ' / column format: 32-bit floating point TUNIT20 = 'deg ' / column unit: degree TTYPE21 = 'QUALITY ' / column name: quality flag TFORM21 = 'I ' / column format: 16-bit integer EXTNAME = 'LIGHT CURVES' / extension name REDLEAK = 1 / red leak correction factor APTCORR = 1 / aperture correction factor ABSCAL = 2.19258146405945E-15 / [erg/cm^2/electron/A]flux density calib factor TIMESYS = 'TDB ' / time scale of time-related keywords TREFPOS = 'BARYCENTER' / time reference position TIMEPIXR= 0.5 / bin time beginning=0 middle=0.5 end=1 JDREF = 2400000.5 / BJD reference offset CHECKSUM= 'Sr4iSo2fSo2fSo2f' / HDU checksum updated 2026-01-23T13:59:22 DATASUM = '3846380264' / data unit checksum updated 2026-01-23T13:59:22 END @@ B @vK AA <