1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407
|
.. doctest-skip-all
.. _astroquery.astrometry_net:
************************************************************
Astrometry.net plate solutions (`astroquery.astrometry_net`)
************************************************************
Getting started
===============
The module `astroquery.astrometry_net` provides the astroquery interface to
the `astrometry.net`_ plate solving service. Given a list of known sources in
an image and their fluxes or an image, `astrometry.net`_ matches the image to
the sky and constructs a WCS solution.
To use `astroquery.astrometry_net` you will need to set up an account at
`astrometry.net`_ and get your API key. The API key is available under your
profile at `astrometry.net`_ when you are logged in.
Setting API key for astroquery.astrometry_net
---------------------------------------------
Adding API key to astroquery.cfg
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1. Go to https://nova.astrometry.net and sign in.
2. Copy your API key
3. Add the following to your config file located at ``$HOME/.astropy/config/astroquery.cfg``
.. code-block:: python
[astrometry_net]
## The Astrometry.net API key.
api_key =
## Name of server
server = http://nova.astrometry.net
## Default timeout for connecting to server
timeout = 120
4. Add your API key to the config file!
For more information about `astropy.config`, see: https://docs.astropy.org/en/stable/config/index.html
Using keyring to store API key
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
You can use the `keyring <https://pypi.org/project/keyring>`_ library to store your API key.
.. code-block:: python
>>> import keyring
>>> keyring.set_password('astroquery:astrometry_net', None, 'apikeyhere')
If you have multiple users and keys you can change ``None`` to another name to assign usernames to different keys.
Now you can include the ``keyring`` module to set your API key.
.. code-block:: python
>>> import keyring
>>> from astroquery.astrometry_net import AstrometryNet
WARNING: Astrometry.net API key not found in configuration file [astroquery.astrometry_net.core]
WARNING: You need to manually edit the configuration file and add it [astroquery.astrometry_net.core]
WARNING: You may also register it for this session with AstrometryNet.key = 'XXXXXXXX' [astroquery.astrometry_net.core]
>>> ast = AstrometryNet()
WARNING: Astrometry.net API key not found in configuration file [astroquery.astrometry_net.core]
WARNING: You need to manually edit the configuration file and add it [astroquery.astrometry_net.core]
WARNING: You may also register it for this session with AstrometryNet.key = 'XXXXXXXX' [astroquery.astrometry_net.core]
>>> ast.api_key = keyring.get_password('astroquery:astrometry_net', '')
For multiple users, replace the empty argument with the desired username.
.. code-block:: python
>>> ast.api_key = keyring.get_password('astroquery:astrometry_net', 'username')
.. note::
Be aware that some information you submit to `astrometry.net`_ is publicly
available even if the raw image isn't. For example, the log of each job
is accessible if one knows the job id regardless of the permissions set
for the image. The log will contain the RA/Dec of the solution.
For publicly viewable images or source lists `astrometry.net`_ includes
links to download the FITS files for the image.
Solving from a list of sources
==============================
The most efficient way to use `astrometry.net`_ is to pass it a list of
sources in an image instead of uploading the entire image. The data can be in
an `astropy.table.Table`, pandas data frame or something other structure.
The only important requirement is that **the list must be sorted by flux in
descending order**.
In the example below, assume that ``catalog.fits`` is a table of pixel positions
(columns ``X_IMAGE`` and ``Y_IMAGE``) and flux (column ``FLUX``) and perhaps
other columns, and that the image is 3073 by 2048 pixels.
The ``solve_timeout`` used below is the time, in seconds, to allow the
`astrometry.net`_ server to find a solution. It typically makes sense for this
to be a longer time than the timeout set in
`astroquery.astrometry_net.AstrometryNetClass.TIMEOUT`, which is intended to
act primarily as a timeout for network transactions.
TODO: Insert link to an actual catalog
.. code-block:: python
from astropy.table import Table
from astroquery.astrometry_net import AstrometryNet
ast = AstrometryNet()
ast.api_key = 'XXXXXXXXXXXXXXXX'
sources = Table.read('catalog.fits')
# Sort sources in ascending order
sources.sort('FLUX')
# Reverse to get descending order
sources.reverse()
image_width = 3073
image_height = 2048
wcs_header = ast.solve_from_source_list(sources['X_IMAGE'], sources['Y_IMAGE'],
image_width, image_height,
solve_timeout=120)
If `astrometry.net`_ is able to find a solution it is returned as an
`astropy.io.fits.Header`. If it is unable to find a solution an empty
dictionary is returned instead. For more details, see
:ref:`handling_results`.
Solving from an image
=====================
There are two ways to get a solution from an image:
1. Detect sources in the image and upload the source list to get the plate solution.
2. Upload the image entire image. `astrometry.net`_ will detect sources and attempt to determine a solution.
In both cases, use
`astroquery.astrometry_net.AstrometryNetClass.solve_from_image`.
There are a few settings common to both cases that make it convenient
to use pointing information from the FITS header of the image:
``ra_key``
Name of the key in the FITS header that contains the RA.
``dec_key``
Name of the key in the FITS header that contains the RA.
``ra_dec_units``
Tuple specifying the units of the right ascension and declination in
the header. The default value is ``('hour', 'degree')``.
Detect sources and upload source list
-------------------------------------
To use this method you must have the package `photutils`_ installed.
.. code-block:: python
from astroquery.astrometry_net import AstrometryNet
ast = AstrometryNet()
ast.api_key = 'XXXXXXXXXXXXXXXX'
wcs_header = ast.solve_from_image('/path/to/image.fit')
There are a few settings specific to this case:
``FWHM``
The rough full-width half-max of stars in the image, in pixels.
``detect_threshold``
The number of standard deviations above background a source needs
to be to count as a detection.
For more options see :ref:`common_settings`.
If `astrometry.net`_ is able to find a solution it is returned as an
`astropy.io.fits.Header`. If it is unable to find a solution an empty
dictionary is returned instead. For more details, see
:ref:`handling_results`.
Upload image
------------
Keep in mind that uploading an image requires transferring roughly 10,000 times
the data as uploading a source list. It would almost certainly take less time to
find the sources in your image locally and upload that source list than it would
to upload the image.
The image will be uploaded under two circumstances. You call
`~astroquery.astrometry_net.AstrometryNetClass.solve_from_image` and either
+ do not have `photutils`_ installed, or
+ set ``force_image_upload=True``.
For example:
.. code-block:: python
from astroquery.astrometry_net import AstrometryNet
ast = AstrometryNet()
ast.api_key = 'XXXXXXXXXXXXXXXX'
wcs_header = ast.solve_from_image('/path/to/image.fit', force_image_upload=True)
If `astrometry.net`_ is able to find a solution it is returned as an
`astropy.io.fits.Header`. If it is unable to find a solution an empty
dictionary is returned instead. For more details, see
:ref:`handling_results`.
.. _handling_results:
Testing for success, failure and time outs
==========================================
There are three outcomes from a call to either
`~astroquery.astrometry_net.AstrometryNetClass.solve_from_source_list` or
`~astroquery.astrometry_net.AstrometryNetClass.solve_from_image`.
+ The solve succeeds: the return value is an
`astropy.io.fits.Header` generated by `astrometry.net`_ whose content
is the WCS solution.
+ The solve fails: the return value is an empty dictionary.
+ The solve neither succeeds nor fails before it times out: A
``TimeoutError`` is raised. This
does *not* mean the job has failed. It simply means the solve did not
complete in the time allowed by the ``solve_timeout`` argument, whose
default value is
`astroquery.astrometry_net.AstrometryNetClass.TIMEOUT`. In this case
it often makes sense to recheck the submission.
Code to handle these cases looks something like this:
.. code-block:: python
from astroquery.astrometry_net import AstrometryNet
ast = AstrometryNet()
ast.api_key = 'XXXXXXXXXXXXXXXX'
try_again = True
submission_id = None
while try_again:
try:
if not submission_id:
wcs_header = ast.solve_from_image('/path/to/image.fit',
submission_id=submission_id)
else:
wcs_header = ast.monitor_submission(submission_id,
solve_timeout=120)
except TimeoutError as e:
submission_id = e.args[1]
else:
# got a result, so terminate
try_again = False
if wcs_header:
# Code to execute when solve succeeds
else:
# Code to execute when solve fails
.. _common_settings:
Settings common to all solve methods
====================================
In order to speed up the astrometric solution it is possible to pass a
dictionary of settings to
`~astroquery.astrometry_net.AstrometryNetClass.solve_from_source_list` or
`~astroquery.astrometry_net.AstrometryNetClass.solve_from_image`. If no
settings are passed to the build function then a set of default parameters
will be used, although this will increase the time it takes astrometry.net to
generate a solution. It is recommended to at least set the bounds of the pixel
scale to a reasonable value.
Most of the following descriptions are taken directly from
`astrometry.net`_.
Scale
-----
It is important to set the pixel scale of the image as accurate as possible to increase the
speed of astrometry.net. From astrometry.net: "Most digital-camera images are at least 10
degrees wide; most professional-grade telescopes are narrower than 2 degrees."
Several parameters are available to set the pixel scale.
``scale_units``
- Units used by pixel scale variables
- Possible values:
* ``arcsecperpix``: arcseconds per pixel
* ``arcminwidth``: width of the field (in arcminutes)
* ``degwidth``:width of the field (in degrees)
* ``focalmm``: focal length of the lens (for 35mm film equivalent sensor)
``scale_type``
- Type of scale used
- Possible values:
* ``ul``: Set upper and lower bounds. If ``scale_type='ul'`` the parameters
``scale_upper`` and ``scale_lower`` must be set to the upper and lower bounds
of the pixel scale respectively
* ``ev``: Set the estimated value with a given error. If ``scale_type='ev'`` the
parameters ``scale_est`` and ``scale_err`` must be set to the estiimated value
(in pix) and error (percentage) of the pixel scale.
Parity
------
Flipping an image reverses its "parity". If you point a digital camera at the sky and
submit the JPEG, it probably has negative parity. If you have a FITS image, it probably
has positive parity. Selecting the right parity will make the solving process run faster,
but if in doubt just try both. ``parity`` can be set to the following values:
- ``0``: positive parity
- ``1``: negative parity
- ``2``: try both
Star Positional Error
---------------------
When we find a matching "landmark", we check to see how many of the stars in your field
match up with stars we know about. To do this, we need to know how much a star in your
field could have moved from where it should be.
The unit for positional error is in pixels and is set by the key ``positional_error``.
Limits
------
In order to narrow down our search, you can supply a field center along with a radius.
We will only search in indexes which fall within this area.
To set limits use all of the following parameters:
``center_ra``: center RA of the field (in degrees)
``center_dec``: center DEC of the field (in degrees)
``radius``: how far the actual RA and DEC might be from the estimated values (in degrees)
Tweak
-----
By default we try to compute a SIP polynomial distortion correction with order 2.
You can disable this by changing the order to 0, or change the polynomial order by setting
``tweak_order``.
CRPIX Center
------------
By default the reference point (CRPIX) of the WCS we compute can be anywhere in your image,
but often it's convenient to force it to be the center of the image. This can be set by choosing
``crpix_center=True``.
License and Sharing
-------------------
The Astrometry.net [website](https://nova.astrometry.net/) allows users to upload images
as well as catalogs to be used in generating an astrometric solution, so the site gives
users the choice of licenses for their publically available images. Since the astroquery
astrometry.net api is only uploading a source catalog the choice of ``public_visibility``,
``allow_commercial_use``, and ``allow_modifications`` are not really relevant and can be left
to their defaults, although their settings are described below
Visibility
^^^^^^^^^^
By default all images/source lists uploaded are publicly available. To change this use the setting
``publicly_visible='n'``.
.. note::
Be aware that some information you submit to `astrometry.net`_ is publicly
available even if the raw image isn't. For example, the log of each job
is accessible if one knows the job id regardless of the permissions set
for the image. The log will contain the RA/Dec of the solution.
For publicly viewable images `astrometry.net`_ includes links to download
the FITS files for the image.
License
^^^^^^^
There are two parameters that describe setting a license:
``allow_commercial_use``:
Chooses whether or not an image uploaded to astrometry.net is licensed
for commercial use. This can either be set to ``y``, ``n``, or ``d``, which
uses the default license associated with the api key.
``allow_modifications``:
Whether or not images uploaded to astrometry.net are allowed to be modified by
other users. This can either be set to ``y``, ``n``, or ``d``, which
uses the default license associated with the api key.
Reference/API
=============
.. automodapi:: astroquery.astrometry_net
:no-inheritance-diagram:
.. _astrometry.net: https://astrometry.net/
.. _photutils: https://photutils.readthedocs.io/en/stable/
|