Here I describe a collection of OTW scripts that are designed to apply coordinate transformations to files that specify ds9 regions. I use these primarily for the VIRUS and HET overplotting tools I developed in the 2014-2016 time period. The _trans files take fixed rgions (IFU boxes, text names, lines) and transform them by offsetting about an image center, applying a rotation angle (for example using the parallactic angle), and apply a scale factor (i.e. transform units in microns in the focal plane to units of arcseconds projected on the sky). I'll start with the usage messages and example runs for each type of code. Then I'll give a little more detail about the transformation parameters specified as command line arguments and the format of the input data files. Here are the basic routines:
Usage: cbf_trans.sh IHMP_foot.cbf 0.0 1.9675 426.0 344.1 arg1 - name of input CBF (XY) file arg2 - rotation angle in degrees (- for CCW, + for CW) arg3 - scale (arcsec/pixel) arg4 - Xo in pixels for new frame arg5 - Xo in pixels for new frame Usage: circles_trans.sh xyr.arc 27.5 1.35 1000.0 900.1 arg1 - name of input XYR file arg2 - rotation angle in degrees (- for CCW, + for CW) arg3 - multiplicative scale (pixels/units) arg4 - Xo in pixels for new frame arg5 - Yo in pixels for new frame Usage: lsegs_trans.sh file.lsegs 0.0 1.9675 426.0 344.1 arg1 - name of input line segments file arg2 - rotation angle in degrees (- for CCW, + for CW) arg3 - multiplicative scale (pixels/units) arg4 - Xo in pixels for new frame arg5 - Yo in pixels for new frame Usage: text_trans.sh file.text 0.0 1.9675 426.0 344.1 arg1 - name of input line segments file arg2 - rotation angle in degrees (- for CCW, + for CW) arg3 - multiplicative scale (pixels/units) arg4 - Xo in pixels for new frame arg5 - Yo in pixels for new frame
Here I give a brief explanation of what each routine is plotting and an example of the input file used.
% cat cbf_example1.dat
# Closed boundary - example 1
# linear units: arcseconds
# data
988 1097
1044 1085
1081 1038
1075 982
1027 965
940 986
896 1045
907 1107
Now I rotate this set by 10deg, with no scale change (arg2=PS=1.0),
about the rotation point X,Y=0.0. I then translate the rotation
point to X,Y=10,20:
% cbf_trans.sh cbf_example1.dat 10.0 1.0 10.0 20.0
1173.482 928.770
1226.548 907.228
1254.824 854.517
1239.191 800.409
1188.968 792.003
1106.936 827.791
1073.850 893.535
1095.449 952.683
% cat circles_example1.dat
# circles - example 1
# linear units: arcseconds
# data
988 1097 20
1044 1085 20.5
1081 1038 12
1075 982 15
1027 965 20
940 986 20
896 1045 20
907 1107 20
Now I rotate this set by 10deg, with no scale change (arg2=PS=1.0),
about the rotation point X,Y=0.0. I then translate the rotation
point to X,Y=10,20:
% circles_trans.sh circles_example1.dat 10.0 1.0 10.0 20.0
1173.482 928.770 20.000
1226.548 907.228 20.500
1254.824 854.517 12.000
1239.191 800.409 15.000
1188.968 792.003 20.000
1106.936 827.791 20.000
1073.850 893.535 20.000
1095.449 952.683 20.000
% cat lsegs_example1.dat
# IFU line segments
# linear units: arcseconds
# data
225.000 425.000 225.000 475.000
225.000 475.000 275.000 475.000
275.000 475.000 275.000 425.000
275.000 425.000 225.000 425.000
125.000 425.000 125.000 475.000
125.000 475.000 175.000 475.000
175.000 475.000 175.000 425.000
175.000 425.000 125.000 425.000
Now I rotate this set by 10deg, with no scale change (arg2=PS=1.0),
about the rotation point X,Y=0.0. I then translate the rotation
point to X,Y=10,20:
% lsegs_trans.sh lsegs_example1.dat 10.0 1.0 10.0 20.0
305.382 399.472 314.065 448.713
314.065 448.713 363.305 440.030
363.305 440.030 354.623 390.790
354.623 390.790 305.382 399.472
206.901 416.837 215.584 466.078
215.584 466.078 264.824 457.395
264.824 457.395 256.142 408.155
256.142 408.155 206.901 416.837
% cat text_example1.dat
% cat text_example1.dat
# IFU text names
# linear units: arcseconds
# data
250.000 450.000
030
150.000 450.000
040
50.000 450.000
025
250.000 -50.000
057
Now I rotate this set by 10deg, with no scale change (arg2=PS=1.0),
about the rotation point X,Y=0.0. I then translate the rotation
point to X,Y=10,20:
% text_trans.sh text_example1.dat 10.0 1.0 10.0 20.0
334.344 419.751 030
235.863 437.116 040
137.382 454.481 025
247.520 -72.652 057
The *_trans.sh results all go to standard out. When I use these in a script I generally direct the output to a file (e.g. Blah.pix). Then I feed this file to the appropriete (usually python) code that generates the ds9 regions file. Then I use a simple xpa command to overplot the regions. Below are examples pulled from my gstar script. The script assume I will have a file prepared named "probe.gc1" that gives the Telecen_X,Telecen_Y of the gc1 probe. The "gprobes.sh" converts these Telecen_X,Telecen_Y to units of arcseconds on the sky (written to gprobes.circles and gprobes.text). Here is how I plot the results:
if [ -e "probe.gc1" ] then # Make the circle/text file, transform it, and display it read xo yo pnamo < probe.gc1 gprobes.sh $xo $yo gc1 circles_trans.sh gprobes.circles $rotang $ps $Xihmp_dss $Yihmp_dss > D.pix circles_file_ds9.py D.pix blue $pall >> gco.reg text_trans.sh gprobes.text $rotang $ps $Xihmp_dss $Yihmp_dss > F.pix text_file_ds9.py F.pix red $textsize > text.reg cat text.reg | xpaset ds9 regions -format ds9 fi