Navigation API#

class pylanetary.navigation.core.ModelBody(body, pixscale, shape=None)#

Wrapper to ModelEllipsoid that permits passing an ephemeris

class pylanetary.navigation.core.ModelEllipsoid(ob_lon, ob_lat, pixscale_km, np_ang, req, rpol, center=(0.0, 0.0), shape=None, sun_lon=None, sun_lat=None, longitude_convention='w')#

Projection of an ellipsoid onto a 2-D array with latitude and longitude grid

ldmodel(tb, a, beam=None, law='exp', mu0=None, psf_mode='gaussian')#

Make a limb-darkened model disk convolved with the beam See docstring of limb_darkening() for options

Parameters:
  • tb (float, required.) – [flux] brightness temperature of disk at mu=1

  • a (float or tuple, required.) – [-] limb darkening parameter(s)

  • beam (float or tuple or np.array) – units pixels. see docstring of utils.convolve_with_beam

  • law (str, optional, default "exp") – limb darkening law

  • mu0 (np.array, optional, default None) – cosine of solar incidence angle. if None, code will check if self.mu0 is defined, and use that has no effect unless law==”minnaert”. if self.mu0 undefined, law==”minnaert”, and mu0=None, then code will fail

  • psf_mode (str, optional, default "gaussian") – mode to use for convolve_with_beam(), options “airy”, “gaussian”

zonalmodel(lons, tbs, a=0.0)#
class pylanetary.navigation.core.Nav(data, body, pixscale)#

functions for comparing a model ellipsoid with observed 2-d imaging data

colocate(mode='convolution', diagnostic_plot=True, save_plot=None, **kwargs)#

Co-locate the model planet with the observed planet

Parameters:
  • mode (str, optional. Default 'convolution'.) –

    Which method should be used to overlay planet model and data. Choices are:

    • ’canny’: uses the Canny edge detection algorithm.
      kwargs:
      tb:

      float, required. [same flux unit as data] brightness temperature of disk at mu=1

      a:

      float, required. [-] exponential limb darkening param

      law:

      str, optional. default ‘exp’ type of limb darkening model to use

      beam:

      float, tuple, or np.array, optional. default None. units pixels. see utils.convolve_with_beam

      psf_mode:

      str, optional. default “gaussian” what beam shape to use, options “airy”, “gaussian”

      low_thresh:

      float, required. see documentation of skimage.feature.canny

      high_thresh:

      float, required. see documentation of skimage.feature.canny

      sigma:

      int, required. see documentation of skimage.feature.canny

      To find edges of planet disk, typical “good” values are:

      low_thresh : RMS noise in image high_thresh : approximate flux value of background disk (i.e., cloud-free, volcano-free region) sigma : 5

    • ’convolution’: takes the shift that maximizes the convolution of model and planet
      kwargs:
      tb:

      float, required. [same flux unit as data] brightness temperature of disk at mu=1

      a:

      float, required. [-] limb darkening parameter

      law:

      str, optional. default ‘exp’ type of limb darkening model to use

      beam:

      float, tuple, or np.array, optional. default None. units pixels. see utils.convolve_with_beam

      psf_mode:

      str, optional. default “gaussian” what beam shape to use, options “airy”, “gaussian”

      err:

      float per-pixel error in input image

    • ’disk’: same as convolution

  • diagnostic_plot (bool, optional. default True) – do you want the diagnostic plots to be shown

  • save_plot (str, optional. default None.) – file path to save the diagnostic plot. if None, does not save.

Returns:

  • float – dx in pixels. best-fit difference in position between model and data To shift data to center (i.e., colocated with model), apply a shift of -dx, -dy To shift model to data, apply a shift of dx, dy

  • float – dy in pixels

  • float – dxerr in pixels uncertainty in the shift based on the cross-correlation from image_registration.chi2_shift. These should be treated with extreme caution because they were designed to work on identical images corrupted by random noise, and are being used for non-identical images (model and data)

  • float – dyerr in pixels

Examples

need at least one example of each mode here

Notes

  • sometimes dxerr, dyerr give unrealistic or undefined behavior

reproject(projection='equirectangular', shape=None)#

Projects the navigated data into the target projection This function only works properly if self.lat_g and self.lon_w are centered with respect to self.data; for instance, if ONE of xy_shift_data or xy_shift_model has been applied using the dx, dy output of colocate()

Parameters:
  • projection (str or cartopy.proj.Projection instance, optional. default 'equirectangular') – string options are [‘equirectangular’, ‘polar’] Equirectangular, AKA rectilinear, projection results in pixels equally spaced in latitude and longitude Polar projection will be applied on whichever pole is closest to the sub-observer latitude any cartopy Projection object is also accepted, but in this case shape must be specified see cartopy projection list.

  • shape (tuple, optional. default None) – shape of output arrays. if None, shape is guessed from pixel scale of input image

Returns:

  • np.array – the projected data

  • np.array – cosine of the emission angle (mu) at each pixel in the projection

write(outstem, header={}, flux_unit='')#

Writes navigated data to multi-extension fits

Parameters:
  • outstem (str, required.) – stem of filenames to write

  • header (dict, optional, default {}) – dictionary of header info to put into hdul[0].header

  • flux_unit (str, optional, default "") – unit of flux to put in output fits header

  • Writes

  • ------

  • file (fits) –

Notes

hdul[0] contains the header, data is empty hdul[1] contains the data hdul[2] contains latitudes hdul[3] contains longitudes hdul[4] contains emission angles hdul[5] contains solar incidence angles

References

NAV multi-extension fits file format originally pioneered by Mike Wong e.g. https://doi.org/10.3847/1538-4365/ab775f

xy_shift_data(dx, dy)#

FFTshift data by a user-defined amount for example, to apply the suggested shift from colocate() it is preferred to use xy_shift_model() instead, which avoids touching the data

Parameters:
  • dx (float, required) – [pixels] shift in x

  • dy (float, required) – [pixels] shift in y

xy_shift_model(dx, dy)#

shift model (i.e., lat_g, lon_w, mu, and mu0) by recalculating the model with a different center as defined by user-defined dx, dy shift

Parameters:
  • dx (float, required) – [pixels] shift in x

  • dy (float, required) – [pixels] shift in y

pylanetary.navigation.core.colocate_diagnostic_plot(model, data, mode)#

assesses goodness-of-fit of navigation solution from colocate

Parameters:
  • model (np.array, required) – shifted model data

  • data (np.array, required) – observed data

  • mode (str, required) – method of co-location, one of [“canny”, “convolution”, or “disk”]

Returns:

matplotlib figure and axis objects

Return type:

fig, ax

pylanetary.navigation.core.emission_angle(ob_lat, surf_n)#

Computes the cosine of the emission angle of surface wrt observer

Parameters:
  • ob_lat (float or np.array, required.) – [deg] sub-observer latitude

  • surf_n (np.array, required.) – [x,y,z] surface normal vector at each ob_lat

Returns:

cosine of emission angle

Return type:

float or np.array

pylanetary.navigation.core.lat_lon(shape, pixscale_km, ob_lon, ob_lat, np_ang, r_e, r_p, dx=0, dy=0, longitude_convention='w')#

Computes the planetographic and planetocentric latitudes and west longitudes of an ellipsoidal planet as viewed from a tilted perspective, i.e., on the sky For now, this relies on manually de-rotating the planet and using Cartopy’s orthographic projection, because pyproj TiltedPerspective cannot handle ellipsoidal planets, only spheres.

Parameters:
  • shape (tuple, required) – shape of output arrays

  • pixscale_km (float, required) – [km/px] pixel scale of image

  • ob_lon (float, required) – [deg] sub-observer planetographic longitude

  • ob_lat (float, required) – [deg] sub-observer planetographic latitude

  • np_ang (float, required) – [deg] north polar angle

  • r_e (float, required) – [km] equatorial radius of planet

  • r_p (float, required) – [km] polar radius of planet

  • dx (float, optional, default 0) – [px] offset in x from the center of the image

  • dy (float, optional, default 0) – [px] offset in y from the center of the image

  • longitude_convention (str, optional, default 'w') – east or west longitude convention

Returns:

  • np.array – planetographic latitudes

  • np.array – planetocentric latitudes

  • np.array – West longitudes

  • np.array – x-coordinates of image grid in km, where 0 is center of planet

  • np.array – y-coordinates of image grid in km, where 0 is center of planet

pylanetary.navigation.core.limb_darkening(mu, a, law='exp', mu0=None)#
Parameters:
  • mu (float or array-like, required.) – [-] cosine of emission angle

  • a (float or array-like, required.) – [-] limb-darkening parameter(s) if law==”disc”, a is ignored if law==”exp”, “linear”, or “minnaert”, a must have length 1 if law==”quadratic”, “square-root”, a must have length 2 such that [a0, a1] are the free parameters in the first and second terms, respectively.

  • law (str, optional. default "exp".) – what type of limb darkening law to use. options are: disc : no limb darkening applied linear : ld = 1 - a * (1 - mu) exp : ld = mu**a minnaert : ld = mu0**a * mu**(a-1) quadratic : ld = 1 - a[0]*(1-mu) - a[1]*(1-mu)**2 square-root : ld = 1 - a[0]*(1-mu) - a[1]*(1-np.sqrt(mu))

  • mu0 (float or array-like, optional. default None.) – [-] cosine of solar incidence angle. has no effect unless law==”minnaert”, in which case it is required.

Returns:

limb-darkening value at each input mu value

Return type:

float or np.array

References

Overview of published limb darkening laws https://www.astro.keele.ac.uk/jkt/codes/jktld.html

pylanetary.navigation.core.rotate_about_pivot(img, angle, pivot)#
Parameters:
  • img (np.array, required) – image to rotate

  • angle (float, required) – [deg] angle to rotate image (counterclockwise)

  • pivot (tuple, required) – [px] (x,y) coordinates of pivot point about which to rotate image

Returns:

rotated image

Return type:

np.array

pylanetary.navigation.core.surface_normal(lat_g, lon_w, ob_lon)#

Computes the normal vector to the surface of the planet. Take dot product with sub-obs or sub-sun vector to find cosine of emission angle

Parameters:
  • lat_g (np.array, required) – [deg] planetographic latitude

  • lon_w (np.array, required) – [deg] west longitude

  • ob_lon (float, required) – [deg] sub-observer (or sub-sun) planetographic longitude

Returns:

[x,y,z] normal vector to the surface of the planet

Return type:

np.array