File: predef_models2D.rst

package info (click to toggle)
astropy 7.0.1-3
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 35,328 kB
  • sloc: python: 233,437; ansic: 55,264; javascript: 17,680; lex: 8,621; sh: 3,317; xml: 2,287; makefile: 191
file content (138 lines) | stat: -rw-r--r-- 5,116 bytes parent folder | download
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
.. _predef_models2D:

*********
2D Models
*********

These models take as input x and y arrays.

Operations
==========

These models perform simple mathematical operations.

- :class:`~astropy.modeling.functional_models.Const2D` model returns the
  constant replicated by the number of input x and y values.

Shapes
======

These models provide shapes, often used to model general x, y, z data.

- :class:`~astropy.modeling.functional_models.Planar2D` model computes
  a tilted plan with specified x,y slopes and z intercept

Profiles
========

These models provide profiles, often used sources in images.
All models have parameters giving the x,y location of the center and
an amplitude.

- :class:`~astropy.modeling.functional_models.AiryDisk2D` model computes
  the Airy function for a radius

- :class:`~astropy.modeling.functional_models.Box2D` model computes a box
  with x,y dimensions

- :class:`~astropy.modeling.functional_models.Disk2D` model computes a
  disk a radius

- :class:`~astropy.modeling.functional_models.Ellipse2D` model computes
  an ellipse with major and minor axis and rotation angle

- :class:`~astropy.modeling.functional_models.Gaussian2D` model computes
  a Gaussian with x,y standard deviations and rotation angle

- :class:`~astropy.modeling.functional_models.Moffat2D` model computes
  a Moffat with x,y dimensions and alpha (power index) and gamma (core width)

- :class:`~astropy.modeling.functional_models.Lorentz2D` model computes
  a Lorentz profile with x,y dimensions and full width at half maximum

- :class:`~astropy.modeling.functional_models.RickerWavelet2D` model computes
  a symmetric RickerWavelet function with the specified sigma

- :class:`~astropy.modeling.functional_models.Sersic2D` model computes
  a Sersic profile with an effective half-light radius, rotation, and
  Sersic index

- :class:`~astropy.modeling.functional_models.GeneralSersic2D` model
  computes a generalized Sersic profile with an effective half-light
  radius, rotation, Sersic index, and a parameter to control the shape of
  the isophotes (e.g., boxy or disky)

- :class:`~astropy.modeling.functional_models.TrapezoidDisk2D` model
  computes a disk with a radius and slope

- :class:`~astropy.modeling.functional_models.Ring2D` model computes
  a ring with inner and outer radii

.. plot::

    import numpy as np
    import math
    import matplotlib.pyplot as plt
    from matplotlib.colors import LogNorm

    from astropy.modeling.models import (AiryDisk2D, Box2D, Disk2D, Ellipse2D,
                                         Gaussian2D, Moffat2D, Lorentz2D,
                                         RickerWavelet2D, Sersic2D,
                                         GeneralSersic2D,
                                         TrapezoidDisk2D, Ring2D)

    x = np.linspace(-4.0, 6.0, num=100)
    r = np.logspace(-1.0, 2.0, num=100)

    fig, sax = plt.subplots(nrows=5, ncols=3, figsize=(9, 12))
    ax = sax.flatten()

    # setup the x,y coordinates
    x_npts = 100
    y_npts = x_npts
    x0, x1 = -4, 6
    y0, y1 = -3, 7
    x = np.linspace(x0, x1, num=x_npts)
    y = np.linspace(y0, y1, num=y_npts)
    X, Y = np.meshgrid(x, y)

    # plot the different 2D profiles
    mods = [AiryDisk2D(amplitude=10.0, x_0=1.0, y_0=2.0, radius=1.0),
            Box2D(amplitude=10.0, x_0=1.0, y_0=2.0, x_width=1.0, y_width=2.0),
            Disk2D(amplitude=10.0, x_0=1.0, y_0=2.0, R_0=1.0),
            Ellipse2D(amplitude=10.0, x_0=1.0, y_0=2.0, a=1.0, b=2.0, theta=math.pi/4.),
            Gaussian2D(amplitude=10.0, x_mean=1.0, y_mean=2.0, x_stddev=1.0, y_stddev=2.0, theta=math.pi/4.),
            Moffat2D(amplitude=10.0, x_0=1.0, y_0=2.0, alpha=3, gamma=4),
            Lorentz2D(amplitude=10.0, x_0=1.0, y_0=2.0, fwhm=3),
            RickerWavelet2D(amplitude=10.0, x_0=1.0, y_0=2.0, sigma=1.0),
            Sersic2D(amplitude=10.0, x_0=1.0, y_0=2.0, r_eff=1.0, ellip=0.5, theta=math.pi/4.),
            GeneralSersic2D(amplitude=10.0, x_0=1.0, y_0=2.0, r_eff=1.0, ellip=0.5, theta=math.pi/4., c=-1),
            GeneralSersic2D(amplitude=10.0, x_0=1.0, y_0=2.0, r_eff=1.0, ellip=0.5, theta=math.pi/4., c=1),
            TrapezoidDisk2D(amplitude=10.0, x_0=1.0, y_0=2.0, R_0=1.0, slope=5.0),
            Ring2D(amplitude=10.0, x_0=1.0, y_0=2.0, r_in=1.0, r_out=2.0)]

    for k, mod in enumerate(mods):
        cname = mod.__class__.__name__
        if cname == "AiryDisk2D":
            normfunc = LogNorm(vmin=0.001, vmax=10.)
        elif cname in ["Gaussian2D", "Sersic2D", "GeneralSersic2D"]:
            normfunc = LogNorm(vmin=0.1, vmax=10.)
        else:
            normfunc = None
        if cname == "GeneralSersic2D":
            cname = f'{cname}, c={mod.c.value:.1f}'
        ax[k].set_title(cname)

        ax[k].imshow(mod(X, Y), extent=[x0, x1, y0, y1], origin="lower", cmap=plt.cm.gray_r,
                     norm=normfunc)

    for k in range(len(mods)):
        ax[k].set_xlabel("x")
        ax[k].set_ylabel("y")

    # remove axis for any plots not used
    for k in range(len(mods), len(ax)):
        ax[k].axis("off")

    plt.tight_layout()
    plt.show()