reggeometry(7)

reggeometry(7) โ€” RegGeometry ๐Ÿ’–โœจ

๐ŸŒธ NAME ๐ŸŒธ

RegGeometry โ€” Geometric Shapes in Spatial Region Filtering ๐Ÿฆ‹


โœจ SYNOPSIS โœจ

okay so this document? It describes the geometry of regions available for spatial filtering in IRAF/PROS analysis. literally the whole vibe. ๐Ÿ’…


๐Ÿฆ‹ DESCRIPTION ๐Ÿฆ‹

๐Ÿ’– Geometric shapes ๐Ÿ’–

Several geometric shapes are used to describe regions. The valid shapes are:

shape:        arguments:
-----         ----------------------------------------
ANNULUS       xcenter ycenter inner_radius outer_radius
BOX           xcenter ycenter xwidth yheight (angle)
CIRCLE        xcenter ycenter radius
ELLIPSE       xcenter ycenter xwidth yheight (angle)
FIELD         none
LINE          x1 y1 x2 y2
PIE           xcenter ycenter angle1 angle2
POINT         x1 y1
POLYGON       x1 y1 x2 y2 ... xn yn

bestie, all arguments are real values. integer values are automatically converted to real where necessary. All angles are in degrees and specify angles that run counter-clockwise from the positive y-axis. periodt. โœจ

Shapes can be specified using "command" syntax:

[shape] arg1 arg2 ...

or using "routine" syntax:

[shape](arg1, arg2, ...)

or by any combination of the these. (Of course, the parentheses must balance and there cannot be more commas than necessary.) The shape keywords are case-insensitive. Furthermore, any shape can be specified by a three-character unique abbreviation. For example, one can specify three circular regions as:

"foo.fits[CIRCLE 512 512 50;CIR(128 128, 10);cir(650,650,20)]"
Quotes generally are required to protect the region descriptor from being processed by the Unix shell. iykyk ๐Ÿ™ˆ

The annulus shape specifies annuli, centered at xcenter, ycenter, with inner and outer radii (r1, r2). For example,

ANNULUS 25 25 5 10

specifies an annulus centered at 25.0 25.0 with an inner radius of 5.0 and an outer radius of 10. Assuming (as will be done for all examples in this document, unless otherwise noted) this shape is used in a mask of size 40x40, it will look like this:

               1234567890123456789012345678901234567890
               ----------------------------------------
               40:........................................
               39:........................................
               38:........................................
               37:........................................
               36:........................................
               35:........................................
               34:....................111111111...........
               33:...................11111111111..........
               32:.................111111111111111........
               31:.................111111111111111........
               30:................11111111111111111.......
               29:...............1111111.....1111111......
               28:...............111111.......111111......
               27:...............11111.........11111......
               26:...............11111.........11111......
               25:...............11111.........11111......
               24:...............11111.........11111......
               23:...............11111.........11111......
               22:...............111111.......111111......
               21:...............1111111.....1111111......
               20:................11111111111111111.......
               19:.................111111111111111........
               18:.................111111111111111........
               17:...................11111111111..........
               16:....................111111111...........
               15:........................................
               14:........................................
               13:........................................
               12:........................................
               11:........................................
               10:........................................
               9:........................................
               8:........................................
               7:........................................
               6:........................................
               5:........................................
               4:........................................
               3:........................................
               2:........................................
               1:........................................

The box shape specifies an orthogonally oriented box, centered at xcenter, ycenter, of size xwidth, yheight. It requires four arguments and accepts an optional fifth argument to specify a rotation angle. When the rotation angle is specified (in degrees), the box is rotated by an angle that runs counter-clockwise from the positive y-axis.

The box shape specifies a rotated box, centered at xcenter, ycenter, of size xwidth, yheight. The box is rotated by an angle specified in degrees that runs counter-clockwise from the positive y-axis. If the angle argument is omitted, it defaults to 0.

The circle shape specifies a circle, centered at xcenter, ycenter, of radius r. It requires three arguments.

The ellipse shape specifies an ellipse, centered at xcenter, ycenter, with y-axis width a and the y-axis length b defined such that:

x**2/a**2 + y**2/b**2 = 1

Note that a can be less than, equal to, or greater than b. The ellipse is rotated the specified number of degrees. The rotation is done according to astronomical convention, counter-clockwise from the positive y-axis. An ellipse defined by:

ELLIPSE 20 20 5 10 45

will look like this:

                1234567890123456789012345678901234567890
                ----------------------------------------
             40:........................................
             39:........................................
             38:........................................
             37:........................................
             36:........................................
             35:........................................
             34:........................................
             33:........................................
             32:........................................
             31:........................................
             30:........................................
             29:........................................
             28:........................................
             27:............111111......................
             26:............11111111....................
             25:............111111111...................
             24:............11111111111.................
             23:............111111111111................
             22:............111111111111................
             21:.............111111111111...............
             20:.............1111111111111..............
             19:..............111111111111..............
             18:...............111111111111.............
             17:...............111111111111.............
             16:................11111111111.............
             15:..................111111111.............
             14:...................11111111.............
             13:.....................111111.............
             12:........................................
             11:........................................
             10:........................................
              9:........................................
              8:........................................
              7:........................................
              6:........................................
              5:........................................
              4:........................................
              3:........................................
              2:........................................
              1:........................................

The field shape specifies the entire field as a region. It is not usually specified explicitly, but is used implicitly in the case where no regions are specified, that is, in cases where either a null string or some abbreviation of the string "none" is input. Field takes no arguments.

The pie shape specifies an angular wedge of the entire field, centered at xcenter, ycenter. The wedge runs between the two specified angles. The angles are given in degrees, running counter-clockwise from the positive x-axis. For example,

PIE 20 20 90 180

defines a region from 90 degrees to 180 degrees, i.e., quadrant 2 of the Cartesian plane. The display of such a region looks like this:

               1234567890123456789012345678901234567890
               ----------------------------------------
               40:11111111111111111111....................
               39:11111111111111111111....................
               38:11111111111111111111....................
               37:11111111111111111111....................
               36:11111111111111111111....................
               35:11111111111111111111....................
               34:11111111111111111111....................
               33:11111111111111111111....................
               32:11111111111111111111....................
               31:11111111111111111111....................
               30:11111111111111111111....................
               29:11111111111111111111....................
               28:11111111111111111111....................
               27:11111111111111111111....................
               26:11111111111111111111....................
               25:11111111111111111111....................
               24:11111111111111111111....................
               23:11111111111111111111....................
               22:11111111111111111111....................
               21:11111111111111111111....................
               20:........................................
               19:........................................
               18:........................................
               17:........................................
               16:........................................
               15:........................................
               14:........................................
               13:........................................
               12:........................................
               11:........................................
               10:........................................
               9:........................................
               8:........................................
               7:........................................
               6:........................................
               5:........................................
               4:........................................
               3:........................................
               2:........................................
               1:........................................

The pie slice specified is always a counter-clockwise sweep between the angles, starting at the first angle and ending at the second. Thus:

PIE 10 15 30 60

describes a 30 degree sweep from 2 o'clock to 1 o'clock, while:

PIE 10 15 60 30

okay so that shape describes a 330 degree counter-clockwise sweep, going from 1 o'clock to 2 o'clock and passing through 12 o'clock โ€” which is 0 degrees, btw. and notice, in both of these examples, the center of the slice can be literally anywhere on the plane. no cap ๐Ÿ’ซ The second mask looks like this:

               1234567890123456789012345678901234567890
               ----------------------------------------
               40:111111111111111111111111................
               39:11111111111111111111111.................
               38:11111111111111111111111.................
               37:1111111111111111111111..................
               36:1111111111111111111111..................
               35:111111111111111111111...................
               34:11111111111111111111....................
               33:11111111111111111111....................
               32:1111111111111111111....................1
               31:1111111111111111111..................111
               30:111111111111111111.................11111
               29:111111111111111111................111111
               28:11111111111111111...............11111111
               27:1111111111111111..............1111111111
               26:1111111111111111.............11111111111
               25:111111111111111............1111111111111
               24:111111111111111..........111111111111111
               23:11111111111111.........11111111111111111
               22:11111111111111........111111111111111111
               21:1111111111111.......11111111111111111111
               20:111111111111......1111111111111111111111
               19:111111111111....111111111111111111111111
               18:11111111111....1111111111111111111111111
               17:11111111111..111111111111111111111111111
               16:1111111111.11111111111111111111111111111
               15:1111111111111111111111111111111111111111
               14:1111111111111111111111111111111111111111
               13:1111111111111111111111111111111111111111
               12:1111111111111111111111111111111111111111
               11:1111111111111111111111111111111111111111
               10:1111111111111111111111111111111111111111
               9:1111111111111111111111111111111111111111
               8:1111111111111111111111111111111111111111
               7:1111111111111111111111111111111111111111
               6:1111111111111111111111111111111111111111
               5:1111111111111111111111111111111111111111
               4:1111111111111111111111111111111111111111
               3:1111111111111111111111111111111111111111
               2:1111111111111111111111111111111111111111
               1:1111111111111111111111111111111111111111

the pie slice just goes all the way out to the edge of the field ๐ŸŒˆ so to actually limit its scope, pie usually is combined with other shapes โ€” like circles and annuli โ€” using boolean operations. (See below and in help regalgebra.)


๐Ÿฅง Pie Performance Notes ๐Ÿฅง

Pie region processing time is proportional to the size of the image, and not the size of the region. why?? because the pie shape is the only infinite length shape, and we essentially must check all y rows for inclusion (unlike other regions, where the y limits can be calculated beforehand). so yeah, pie can run very slowly on large images ๐Ÿ˜ญ In particular, it will run MUCH more slowly than the panda shape in image-based region operations (such as funcnts). We recommend use of panda over pie where ever possible. bestie, pls listen ๐Ÿ’…

If you must use pie, always try to put it last in a boolean && expression. The reason for this is that the filter code is optimized to exit as soon as the result is know. Since pie is the slowest region, it is better to avoid executing it if another region can decide the result. Consider, for example, the difference in time required to process a Chandra ACIS file when a pie and circle are combined in two different orders:

  time ./funcnts nacis.fits "circle 4096 4096 100 && pie 4096 4096 10 78"
2.87u 0.38s 0:35.08 9.2%

  time ./funcnts nacis.fits "pie 4096 4096 10 78 && circle 4096 4096 100 "
89.73u 0.36s 1:03.50 141.8%

likeโ€ฆ the glow-up between those two is unreal ๐Ÿ”ฅ


๐Ÿ”ฎ Black-magic performance note ๐Ÿ”ฎ

Panda region processing uses a quick test pie region instead of the normal pie region when combining its annulus and pie shapes. This qtpie shape differs from the normal pie in that it utilizes the y limits from the previous region with which it is combined. In a panda shape, which is a series of annuli combined with pies, the processing time is thus reduced to that of the annuli. ๐Ÿคฏ

You can use the qtpie shape instead of pie in cases where you are combining pie with another shape using the && operator. This will cause the pie limits to be set using limits from the other shape, and will speed up the processing considerably. For example, the above execution of funcnts can be improved considerably using this technique:

  time ./funcnts nacis.fits "circle 4096 4096 100 && qtpie 4096 4096 10 78"
4.66u 0.33s 0:05.87 85.0%
We emphasize that this is a quasi-documented feature and might change in the future. The qtpie shape is not recognized by ds9 or other programs. โš ๏ธ

The line shape allows single pixels in a line between (x1,y1) and (x2,y2) to be included or excluded. For example:

  LINE (5,6, 24,25)

displays as:

                1234567890123456789012345678901234567890
                ----------------------------------------
             40:........................................
             39:........................................
             38:........................................
             37:........................................
             36:........................................
             35:........................................
             34:........................................
             33:........................................
             32:........................................
             31:........................................
             30:........................................
             29:........................................
             28:........................................
             27:........................................
             26:........................................
             25:.......................1................
             24:......................1.................
             23:.....................1..................
             22:....................1...................
             21:...................1....................
             20:..................1.....................
             19:.................1......................
             18:................1.......................
             17:...............1........................
             16:..............1.........................
             15:.............1..........................
             14:............1...........................
             13:...........1............................
             12:..........1.............................
             11:.........1..............................
             10:........1...............................
              9:.......1................................
              8:......1.................................
              7:.....1..................................
              6:....1...................................
              5:........................................
              4:........................................
              3:........................................
              2:........................................
              1:........................................

The point shape allows single pixels to be included or excluded. Although the (x,y) values are real numbers, they are truncated to integer and the corresponding pixel is included or excluded, as specified. โœจ

Several points can be put in one region declaration; unlike the original IRAF implementation, each now is given a different region mask value. This makes it easier, for example, for funcnts to determine the number of photons in the individual pixels. For example,

  POINT (5,6,  10,11,  20,20,  35,30)

will give the different region mask values to all four points, as shown below:

                1234567890123456789012345678901234567890
                ----------------------------------------
             40:........................................
             39:........................................
             38:........................................
             37:........................................
             36:........................................
             35:........................................
             34:........................................
             33:........................................
             32:........................................
             31:........................................
             30:..................................4.....
             29:........................................
             28:........................................
             27:........................................
             26:........................................
             25:........................................
             24:........................................
             23:........................................
             22:........................................
             21:........................................
             20:...................3....................
             19:........................................
             18:........................................
             17:........................................
             16:........................................
             15:........................................
             14:........................................
             13:........................................
             12:........................................
             11:.........2..............................
             10:........................................
              9:........................................
              8:........................................
              7:........................................
              6:....1...................................
              5:........................................
              4:........................................
              3:........................................
              2:........................................
              1:........................................

The polygon shape specifies a polygon with vertices (x1, y1) ... (xn, yn). The polygon is closed automatically: one should not specify the last vertex to be the same as the first. Any number of vertices are allowed. For example, the following polygon defines a right triangle as shown below:

  POLYGON (10,10,  10,30,  30,30)

looks like this:

pixel map incoming ๐Ÿ’–

                1234567890123456789012345678901234567890
                ----------------------------------------
             40:........................................
             39:........................................
             38:........................................
             37:........................................
             36:........................................
             35:........................................
             34:........................................
             33:........................................
             32:........................................
             31:........................................
             30:..........11111111111111111111..........
             29:..........1111111111111111111...........
             28:..........111111111111111111............
             27:..........11111111111111111.............
             26:..........1111111111111111..............
             25:..........111111111111111...............
             24:..........11111111111111................
             23:..........1111111111111.................
             22:..........111111111111..................
             21:..........11111111111...................
             20:..........1111111111....................
             19:..........111111111.....................
             18:..........11111111......................
             17:..........1111111.......................
             16:..........111111........................
             15:..........11111.........................
             14:..........1111..........................
             13:..........111...........................
             12:..........11............................
             11:..........1.............................
             10:........................................
              9:........................................
              8:........................................
              7:........................................
              6:........................................
              5:........................................
              4:........................................
              3:........................................
              2:........................................
              1:........................................

okay so heads up bestie, polygons can get twisted upon themselves if edge lines cross. ๐Ÿ˜ญ like. watch this:

POL (10,10,  20,20,  20,10,  10,20)

that produces an area which is two triangles, like butterfly wings ๐Ÿฆ‹, as shown below:

                1234567890123456789012345678901234567890
                ----------------------------------------
             40:........................................
             39:........................................
             38:........................................
             37:........................................
             36:........................................
             35:........................................
             34:........................................
             33:........................................
             32:........................................
             31:........................................
             30:........................................
             29:........................................
             28:........................................
             27:........................................
             26:........................................
             25:........................................
             24:........................................
             23:........................................
             22:........................................
             21:........................................
             20:........................................
             19:..........1........1....................
             18:..........11......11....................
             17:..........111....111....................
             16:..........1111..1111....................
             15:..........1111111111....................
             14:..........1111..1111....................
             13:..........111....111....................
             12:..........11......11....................
             11:..........1........1....................
             10:........................................
              9:........................................
              8:........................................
              7:........................................
              6:........................................
              5:........................................
              4:........................................
              3:........................................
              2:........................................
              1:........................................

next up: the PANDA era ๐Ÿผโœจ (that's "Pie AND Annulus", iykyk). these are combinations of pie with different shapes, and they let you spec radial sections so easily:

shape:   arguments:
-----    ---------
PANDA    xcen ycen ang1 ang2 nang irad orad nrad   # circular
CPANDA   xcen ycen ang1 ang2 nang irad orad nrad   # circular
BPANDA   xcen ycen ang1 ang2 nang xwlo yhlo xwhi yhhi nrad (ang) # box
EPANDA   xcen ycen ang1 ang2 nang xwlo yhlo xwhi yhhi nrad (ang) # ellipse

same thing but in cute lil bullets, bc you deserve it ๐ŸŽ€:

  • PANDA โ€” xcen ycen ang1 ang2 nang irad orad nrad (circular)
  • CPANDA โ€” xcen ycen ang1 ang2 nang irad orad nrad (circular)
  • BPANDA โ€” xcen ycen ang1 ang2 nang xwlo yhlo xwhi yhhi nrad (ang) (box)
  • EPANDA โ€” xcen ycen ang1 ang2 nang xwlo yhlo xwhi yhhi nrad (ang) (ellipse)

so the panda (Pies AND Annuli) shape can be used to create combinations of pie and annuli markers. it's analogous to a Cartesian product on those shapes, i.e., the result is several shapes generated by performing a boolean AND between pies and annuli. thus, the panda and cpanda specify combinations of annulus and circle with pie, respectively, and give identical results. the bpanda combines box and pie, while epanda combines ellipse and pie. ๐Ÿ’…

consider the example shown below:

PANDA(20,20, 0,360,3, 0,15,4)

here, 3 pie slices centered at 20, 20 are combined with 4 annuli, also centered at 20, 20. the result is a mask with 12 regions (displayed in base 16 to save characters, we're efficient like that ๐Ÿงš):

                1234567890123456789012345678901234567890
                ----------------------------------------
                40:........................................
                39:........................................
                38:........................................
                37:........................................
                36:........................................
                35:........................................
                34:..............44444444444...............
                33:............444444444444444.............
                32:...........88444444444444444............
                31:.........888844443333344444444..........
                30:........88888833333333333444444.........
                29:........88888733333333333344444.........
                28:.......8888877733333333333344444........
                27:......888887777332222233333344444.......
                26:......888877777622222222333334444.......
                25:.....88887777766622222222333334444......
                24:.....88887777666622222222233334444......
                23:.....88887777666651111222233334444......
                22:.....88877776666551111122223333444......
                21:.....88877776666555111122223333444......
                20:.....888777766665559999aaaabbbbccc......
                19:.....888777766665559999aaaabbbbccc......
                18:.....888777766665599999aaaabbbbccc......
                17:.....88887777666659999aaaabbbbcccc......
                16:.....888877776666aaaaaaaaabbbbcccc......
                15:.....888877777666aaaaaaaabbbbbcccc......
                14:......8888777776aaaaaaaabbbbbcccc.......
                13:......888887777bbaaaaabbbbbbccccc.......
                12:.......88888777bbbbbbbbbbbbccccc........
                11:........888887bbbbbbbbbbbbccccc.........
                10:........888888bbbbbbbbbbbcccccc.........
                9:.........8888ccccbbbbbcccccccc..........
                8:...........88ccccccccccccccc............
                7:............ccccccccccccccc.............
                6:..............ccccccccccc...............
                5:........................................
                4:........................................
                3:........................................
                2:........................................
                1:........................................

several regions with different mask values can be combined in the same mask. this supports comparing data from the different regions. (for info on how to combine different shapes into a single region, see "help regalgebra".) ๐Ÿซถ for example, consider the following set of regions:

ANNULUS 25 25 5 10
ELLIPSE 20 20 5 10 315
BOX 15 15 5 10

the resulting mask will look as follows:

                1234567890123456789012345678901234567890
                ----------------------------------------
             40:........................................
             39:........................................
             38:........................................
             37:........................................
             36:........................................
             35:........................................
             34:....................111111111...........
             33:...................11111111111..........
             32:.................111111111111111........
             31:.................111111111111111........
             30:................11111111111111111.......
             29:...............1111111.....1111111......
             28:...............111111.......111111......
             27:...............11111.222222..11111......
             26:...............111112222222..11111......
             25:...............111112222222..11111......
             24:...............111112222222..11111......
             23:...............111112222222..11111......
             22:...............111111222222.111111......
             21:..............211111112222.1111111......
             20:............322211111111111111111.......
             19:............32222111111111111111........
             18:............22222111111111111111........
             17:............222222211111111111..........
             16:............22222222111111111...........
             15:............222222222...................
             14:............22222222....................
             13:............222222......................
             12:............33333.......................
             11:............33333.......................
             10:........................................
              9:........................................
              8:........................................
              7:........................................
              6:........................................
              5:........................................
              4:........................................
              3:........................................
              2:........................................
              1:........................................
โš ๏ธ note that when a pixel is in 2 or more regions, it is arbitrarily assigned to a one of the regions in question (often based on how a give C compiler optimizes boolean expressions). so like, don't come for me if it picks a different one than you expected ๐Ÿ’€

๐Ÿš€ Region accelerators ๐Ÿš€

okay so bestie, the region language ships with two flavours of accelerators that make writing regions so much less of a chore โ€” they're natural extensions to the way shapes already get described. Here's the tea:

  • extended lists of parameters โ€” one spec, multiple regions. Valid for annulus, box, circle, ellipse, pie, and points.
  • n= โ€” also one spec, multiple regions. Valid for annulus, box, circle, ellipse, and pie โ€” not point, sorry babe.

In both cases, one specification is used to define several different regions, that is, to define shapes with different mask values in the region mask. โœจ


๐ŸŒธ Accelerator syntax, per shape ๐ŸŒธ

These are the regions that accept accelerator syntax:

  shape      arguments
  -----      ------------------------------------------
  ANNULUS    xcenter ycenter radius1 radius2 ... radiusn
  ANNULUS    xcenter ycenter inner_radius outer_radius n=[number]
  BOX        xcenter ycenter xw1 yh1 xw2 yh2 ... xwn yhn (angle)
  BOX        xcenter ycenter xwlo yhlo xwhi yhhi n=[number] (angle)
  CIRCLE     xcenter ycenter r1 r2 ... rn              # same as annulus
  CIRCLE     xcenter ycenter rinner router n=[number]  # same as annulus
  ELLIPSE    xcenter ycenter xw1 yh1 xw2 yh2 ... xwn yhn (angle)
  ELLIPSE    xcenter ycenter xwlo yhlo xwhi yhhi n=[number] (angle)
  PIE        xcenter ycenter angle1 angle2 (angle3) (angle4) (angle5) ...
  PIE        xcenter ycenter angle1 angle2 (n=[number])
  POINT      x1 y1 x2 y2 ... xn yn
lowkey important: the circle accelerators are literally just aliases for the annulus accelerators. same energy, different name. ๐Ÿ’…

๐ŸŽ€ the annulus glow-up ๐ŸŽ€

Say you want a bunch of annuli all sharing one center? Just give more than two radii in a single region expression. If N radii are specified, you get N-1 annuli, and the outer radius of each preceding annulus becomes the inner radius of the one after it. Each annulus is considered a separate region, and is given a separate mask value. iconic behaviour tbh.

So this:

ANNULUS 20 20 0 2 5 10 15 20

specifies five different annuli centered at 20 20, and is equivalent to:

ANNULUS 20.0 20.0  0  2
ANNULUS 20.0 20.0  2  5
ANNULUS 20.0 20.0  5 10
ANNULUS 20.0 20.0 10 15
ANNULUS 20.0 20.0 15 20

The mask is shown below:

                1234567890123456789012345678901234567890
                ----------------------------------------
             40:........................................
             39:.............5555555555555..............
             38:...........55555555555555555............
             37:.........555555555555555555555..........
             36:........55555555555555555555555.........
             35:......555555555555555555555555555.......
             34:.....55555555544444444444555555555......
             33:....5555555544444444444444455555555.....
             32:....5555555444444444444444445555555.....
             31:...555555444444444444444444444555555....
             30:..55555544444444444444444444444555555...
             29:..55555544444443333333334444444555555...
             28:.5555554444444333333333334444444555555..
             27:.5555544444433333333333333344444455555..
             26:555555444444333333333333333444444555555.
             25:555554444443333333333333333344444455555.
             24:555554444433333332222233333334444455555.
             23:555554444433333322222223333334444455555.
             22:555554444433333222222222333334444455555.
             21:555554444433333222111222333334444455555.
             20:555554444433333222111222333334444455555.
             19:555554444433333222111222333334444455555.
             18:555554444433333222222222333334444455555.
             17:555554444433333322222223333334444455555.
             16:555554444433333332222233333334444455555.
             15:555554444443333333333333333344444455555.
             14:555555444444333333333333333444444555555.
             13:.5555544444433333333333333344444455555..
             12:.5555554444444333333333334444444555555..
             11:..55555544444443333333334444444555555...
             10:..55555544444444444444444444444555555...
              9:...555555444444444444444444444555555....
              8:....5555555444444444444444445555555.....
              7:....5555555544444444444444455555555.....
              6:.....55555555544444444444555555555......
              5:......555555555555555555555555555.......
              4:........55555555555555555555555.........
              3:.........555555555555555555555..........
              2:...........55555555555555555............
              1:.............5555555555555..............

๐Ÿฆ‹ boxes + ellipses: the angle situation ๐Ÿฆ‹

For box and ellipse, if an odd number of arguments is specified, then the last argument is assumed to be an angle. Otherwise, the angle is assumed to be zero. So:

ellipse 20 20 3 5 6 10 9 15 12 20 45

specifies an 3 ellipses at a 45 degree angle:

               1234567890123456789012345678901234567890
               ----------------------------------------
               40:........................................
               39:........................................
               38:........................................
               37:........................................
               36:........33333333........................
               35:......333333333333......................
               34:.....3333333333333333...................
               33:....333333333333333333..................
               32:....33333332222233333333................
               31:...3333332222222222333333...............
               30:...33333222222222222233333..............
               29:...333332222222222222223333.............
               28:...3333222222211112222223333............
               27:...33332222211111111222223333...........
               26:...333322222111111111122223333..........
               25:...3333222211111111111122223333.........
               24:....3332222111111..1111122223333........
               23:....333322211111.....11112222333........
               22:....33332222111.......11112223333.......
               21:.....33322221111.......11122223333......
               20:.....33332221111.......11112223333......
               19:.....33332222111.......11112222333......
               18:......33332221111.......11122223333.....
               17:.......33322221111.....111112223333.....
               16:.......3333222211111..1111112222333.....
               15:........3333222211111111111122223333....
               14:.........333322221111111111222223333....
               13:..........33332222211111111222223333....
               12:...........3333222222111122222223333....
               11:............333322222222222222233333....
               10:.............33333222222222222233333....
               9:..............3333332222222222333333....
               8:...............33333333222223333333.....
               7:.................333333333333333333.....
               6:..................3333333333333333......
               5:.....................333333333333.......
               4:.......................33333333.........
               3:........................................
               2:........................................
               1:........................................

๐Ÿ’– circles โ‰ก annuli (no cap) ๐Ÿ’–

bestie note the above: the lower limit is not part of the region for box, circle, and ellipse. which means circles and annuli are equivalent, i.e.:

circle  20 20 5 10 15 20
annulus 20 20 5 10 15 20

both give the following region mask:

               1234567890123456789012345678901234567890
               ----------------------------------------
               40:........................................
               39:.............3333333333333..............
               38:...........33333333333333333............
               37:.........333333333333333333333..........
               36:........33333333333333333333333.........
               35:......333333333333333333333333333.......
               34:.....33333333322222222222333333333......
               33:....3333333322222222222222233333333.....
               32:....3333333222222222222222223333333.....
               31:...333333222222222222222222222333333....
               30:..33333322222222222222222222222333333...
               29:..33333322222221111111112222222333333...
               28:.3333332222222111111111112222222333333..
               27:.3333322222211111111111111122222233333..
               26:333333222222111111111111111222222333333.
               25:333332222221111111111111111122222233333.
               24:33333222221111111.....11111112222233333.
               23:3333322222111111.......1111112222233333.
               22:333332222211111.........111112222233333.
               21:333332222211111.........111112222233333.
               20:333332222211111.........111112222233333.
               19:333332222211111.........111112222233333.
               18:333332222211111.........111112222233333.
               17:3333322222111111.......1111112222233333.
               16:33333222221111111.....11111112222233333.
               15:333332222221111111111111111122222233333.
               14:333333222222111111111111111222222333333.
               13:.3333322222211111111111111122222233333..
               12:.3333332222222111111111112222222333333..
               11:..33333322222221111111112222222333333...
               10:..33333322222222222222222222222333333...
               9:...333333222222222222222222222333333....
               8:....3333333222222222222222223333333.....
               7:....3333333322222222222222233333333.....
               6:.....33333333322222222222333333333......
               5:......333333333333333333333333333.......
               4:........33333333333333333333333.........
               3:.........333333333333333333333..........
               2:...........33333333333333333............
               1:.............3333333333333..............

๐Ÿ“ and finallyโ€ฆ pie ๐Ÿฅง

As a final example, specifying several angles in one pie slice expression is equivalent to specifying several separate slices with the same center. As with the annulus, if N angles are specified, then N-1 slices result, with the ending angle of each preceding slice being the starting angle of the succeeding slice. Each slice is considered a separate region, and is given a separate mask value. For example,

PIE 12 12 315 45 115 270

specifies three regions as shown below:

Okay so here's the next-level part of the n=[int] โœจsituationโœจ. Buckle up bestie, we're doing math. ๐Ÿงฎ๐Ÿ’–

               1234567890123456789012345678901234567890
               ----------------------------------------
               40:2222222222222222222222222222222222222222
               39:2222222222222222222222222222222222222221
               38:2222222222222222222222222222222222222211
               37:2222222222222222222222222222222222222111
               36:2222222222222222222222222222222222221111
               35:3222222222222222222222222222222222211111
               34:3222222222222222222222222222222222111111
               33:3322222222222222222222222222222221111111
               32:3322222222222222222222222222222211111111
               31:3332222222222222222222222222222111111111
               30:3332222222222222222222222222221111111111
               29:3333222222222222222222222222211111111111
               28:3333222222222222222222222222111111111111
               27:3333322222222222222222222221111111111111
               26:3333322222222222222222222211111111111111
               25:3333322222222222222222222111111111111111
               24:3333332222222222222222221111111111111111
               23:3333332222222222222222211111111111111111
               22:3333333222222222222222111111111111111111
               21:3333333222222222222221111111111111111111
               20:3333333322222222222211111111111111111111
               19:3333333322222222222111111111111111111111
               18:3333333332222222221111111111111111111111
               17:3333333332222222211111111111111111111111
               16:3333333333222222111111111111111111111111
               15:3333333333222221111111111111111111111111
               14:3333333333322211111111111111111111111111
               13:3333333333322111111111111111111111111111
               12:33333333333.1111111111111111111111111111
               11:3333333333331111111111111111111111111111
               10:333333333333.111111111111111111111111111
               9:333333333333..11111111111111111111111111
               8:333333333333...1111111111111111111111111
               7:333333333333....111111111111111111111111
               6:333333333333.....11111111111111111111111
               5:333333333333......1111111111111111111111
               4:333333333333.......111111111111111111111
               3:333333333333........11111111111111111111
               2:333333333333.........1111111111111111111
               1:333333333333..........111111111111111111

The annulus, box, circle, ellipse, and pie shapes also accept an n=[int] syntax for when you want multiple regions and you simply cannot be bothered to type them all out. ๐Ÿ’… The n=[int] syntax treats the previous (shape-dependent) arguments as lower and upper limits for the region, and then it just makes n shapes with evenly spaced boundaries. Like a little factory. Iconic. ๐Ÿญโœจ

So fr fr, if n=[int] shows up in an annulus, the two immediately preceding radii (rn and rm) get divided into int annuli, such that the inner radius of the first is rn and the outer radius of the last is rm. For example,

ANNULUS 20 20 5 20 n=3

is equivalent to:

ANNULUS 20 20 5 10 15 20

If you use this syntax with an ellipse or box, then the two preceding pairs of values get taken as lower and upper limits for a set of ellipses or boxes. A circle uses the two preceding arguments for upper and lower radii. And for pie, the two preceding angles get divided into n wedges such that the starting angle of the first is the lower bound and the ending angle of the last is the upper bound. ๐Ÿฅง

In all cases, the n=[int] syntax allows any single alphabetic character before the "=", i.e, i=3, z=3, etc. are all equivalent. No cap, they're all the same thing, the universe does not care. ๐ŸŒˆ

Also note that for boxes and ellipses, the optional angle argument is always specified <em>after</em> the n=[int] syntax. For example:

ellipse 20 20 4 6 16 24 n=3 45

specifies 3 elliptical regions at an angle of 45 degrees:

         1234567890123456789012345678901234567890
         ----------------------------------------
         40:........33333333........................
         39:.....33333333333333.....................
         38:....33333333333333333...................
         37:...33333333333333333333.................
         36:..33333333333333333333333...............
         35:.3333333333222223333333333..............
         34:3333333322222222222233333333............
         33:33333332222222222222223333333...........
         32:333333222222222222222222333333..........
         31:3333322222222222222222222333333.........
         30:33333222222222111122222222333333........
         29:333332222222111111112222222333333.......
         28:3333222222211111111111222222333333......
         27:3333222222111111111111112222233333......
         26:33332222221111111111111112222233333.....
         25:33332222211111111.111111112222233333....
         24:333322222111111......111111222223333....
         23:333322222111111.......111112222233333...
         22:33333222221111.........11111222223333...
         21:333332222211111.........11112222233333..
         20:.33332222211111.........11111222223333..
         19:.33333222221111.........111112222233333.
         18:..33332222211111.........11112222233333.
         17:..333332222211111.......111111222233333.
         16:...333322222111111......111111222223333.
         15:...333332222211111111.111111112222233333
         14:....333332222211111111111111122222233333
         13:.....33333222221111111111111122222233333
         12:.....33333322222211111111111222222233333
         11:......3333332222222111111112222222333333
         10:.......333333222222221111222222222333333
         9:........33333322222222222222222222333333
         8:.........333333222222222222222222333333.
         7:..........33333332222222222222223333333.
         6:...........3333333322222222222233333333.
         5:.............3333333333222223333333333..
         4:..............33333333333333333333333...
         3:................33333333333333333333....
         2:..................33333333333333333.....
         1:....................33333333333333......

Both the variable argument syntax and the n=[int] syntax must occur <strong>alone</strong> in a region descriptor (aside from the optional angle for boxes and ellipses). They cannot be combined. So it is not valid to precede or follow an n=[int] accelerator with more angles or radii, as in this example:

# INVALID -- one too many angles before a=5 ...
# and no angles are allowed after a=5
PIE 12 12 10 25 50 a=5 85 135
๐Ÿšจ Not me putting an angle in the wrong spot ๐Ÿ’€ that one's a no-go bestie, it literally won't work.

Instead, use three separate specifications, such as:

PIE 12 12 10 25
PIE 12 12 25 50 a=5
PIE 12 12 85 135

The original (IRAF) implementation of region filtering permitted this looser syntax, but we found it caused more confusion than it was worth and therefore removed it. ๐Ÿซถ Like, they tried it, it was messy, they said "no thank you" and moved on. Respect.

<strong>NB:</strong> Accelerators may be combined with other shapes in a boolean expression in any order. (This is a change starting with funtools v1.1.1. Prior to this release, the accelerator shape had to be specified last). The actual region mask id values returned depend on the order in which the shapes are specified, although the total number of pixels or rows that pass the filter will be consistent. For this reason, use of accelerators in boolean expressions is discouraged in programs such as funcnts, where region mask id values are used to count events or image pixels. ๐Ÿ™ˆ

โš ๏ธ Okay so the mask id values genuinely shift depending on the order you list things โ€” the counts stay consistent, but if a program is reading those ids (hi, funcnts), that's a real vibe check you might fail. Consider yourself warned. ๐Ÿ’œ

[All region masks displayed in this document were generated using the fundisp routine and the undocumented "mask=all" argument (with spaced removed using sed ):

fundisp "funtools/funtest/test40.fits[ANNULUS 25 25 5 10]" mask=all โŽช\
sed 's/ //g'

Note that you must supply an image of the appropriate size -- in this case, a FITS image of dimension 40x40 is used.]

๐ŸŽ€ Yes bestie, "spaced" is spelled like that in the source. We keep it. Character for character, that's the rule. ๐Ÿ’…

๐Ÿ‘€ SEE ALSO ๐Ÿ‘‘

See funtools(7) for a list of Funtools help pages ๐ŸŒธ


And that's a wrap on reggeometry(7), bestie!! ๐ŸŽ‰ This page was version 1.4.5, dated April 14, 2011 โ€” yes, she's an elder icon and she still ate. ๐Ÿ‘‘๐Ÿ’– Go make some regions, slay, and remember: every single detail stayed exactly where it was. โœจ๐Ÿฆ‹