summaryrefslogtreecommitdiffstats
path: root/ast/ast_tester
diff options
context:
space:
mode:
authorWilliam Joye <wjoye@cfa.harvard.edu>2018-01-09 19:06:55 (GMT)
committerWilliam Joye <wjoye@cfa.harvard.edu>2018-01-09 19:06:55 (GMT)
commit01e0ebfe59d9028b0246ec4a549bd7528ada94eb (patch)
treea6c5b54db03177a1c8f3e7fb531990dfbc7bae39 /ast/ast_tester
parentd64cf9c0bd23e752867b149be636d1bbd4501cf4 (diff)
downloadblt-01e0ebfe59d9028b0246ec4a549bd7528ada94eb.zip
blt-01e0ebfe59d9028b0246ec4a549bd7528ada94eb.tar.gz
blt-01e0ebfe59d9028b0246ec4a549bd7528ada94eb.tar.bz2
update ast 8.6.2
Diffstat (limited to 'ast/ast_tester')
-rw-r--r--ast/ast_tester/README33
-rw-r--r--ast/ast_tester/a20070718_00010_02_cube.ast339
-rw-r--r--ast/ast_tester/a20070718_00010_02_cube.fits-wcs61
-rw-r--r--ast/ast_tester/aitoff.attr1
-rw-r--r--ast/ast_tester/aitoff.box1
-rw-r--r--ast/ast_tester/aitoff.head13
-rwxr-xr-xast/ast_tester/ast_tester232
-rw-r--r--ast/ast_tester/brad.map58
-rw-r--r--ast/ast_tester/brad.simp49
-rw-r--r--ast/ast_tester/car1.attr1
-rw-r--r--ast/ast_tester/car1.box1
-rw-r--r--ast/ast_tester/car1.fattr1
-rw-r--r--ast/ast_tester/car1.head32
-rw-r--r--ast/ast_tester/car2.attr1
-rw-r--r--ast/ast_tester/car2.box1
-rw-r--r--ast/ast_tester/car2.fattr1
-rw-r--r--ast/ast_tester/car2.head32
-rw-r--r--ast/ast_tester/car3.attr1
-rw-r--r--ast/ast_tester/car3.box1
-rw-r--r--ast/ast_tester/car3.head8
-rw-r--r--ast/ast_tester/car4.attr0
-rw-r--r--ast/ast_tester/car4.box1
-rw-r--r--ast/ast_tester/car4.fattr1
-rw-r--r--ast/ast_tester/car4.head38
-rw-r--r--ast/ast_tester/car5.attr0
-rw-r--r--ast/ast_tester/car5.box1
-rw-r--r--ast/ast_tester/car5.head38
-rw-r--r--ast/ast_tester/car6.attr0
-rw-r--r--ast/ast_tester/car6.box1
-rw-r--r--ast/ast_tester/car6.head39
-rw-r--r--ast/ast_tester/cobe.attr1
-rw-r--r--ast/ast_tester/cobe.box1
-rw-r--r--ast/ast_tester/cobe.head61
-rw-r--r--ast/ast_tester/degen1.ast318
-rw-r--r--ast/ast_tester/degen1.fits-wcs40
-rwxr-xr-xast/ast_tester/doplot53
-rw-r--r--ast/ast_tester/dss.ast166
-rw-r--r--ast/ast_tester/dss.dss58
-rw-r--r--ast/ast_tester/dss.fits-dss108
-rw-r--r--ast/ast_tester/dss.fits-wcs39
-rw-r--r--ast/ast_tester/hpx.attr1
-rw-r--r--ast/ast_tester/hpx.box1
-rw-r--r--ast/ast_tester/hpx.head10
-rw-r--r--ast/ast_tester/joye_car_headers/CAR_model.head47
-rw-r--r--ast/ast_tester/joye_car_headers/CHIPASS_Equ.head39
-rw-r--r--ast/ast_tester/joye_car_headers/car1.fattr1
-rw-r--r--ast/ast_tester/joye_car_headers/car1.head32
-rw-r--r--ast/ast_tester/joye_car_headers/car2.fattr1
-rw-r--r--ast/ast_tester/joye_car_headers/car2.head32
-rw-r--r--ast/ast_tester/joye_car_headers/car3.head8
-rw-r--r--ast/ast_tester/joye_car_headers/car4.fattr1
-rw-r--r--ast/ast_tester/joye_car_headers/car4.head38
-rw-r--r--ast/ast_tester/joye_car_headers/car5.head38
-rw-r--r--ast/ast_tester/joye_car_headers/cmap_3years_GP_D2.head162
-rwxr-xr-xast/ast_tester/joye_car_headers/doit17
-rw-r--r--ast/ast_tester/joye_car_headers/total_hi.head35
-rw-r--r--ast/ast_tester/longslit.fits-pc18
-rw-r--r--ast/ast_tester/longslit.fits-wcs22
-rwxr-xr-xast/ast_tester/makeplot47
-rwxr-xr-xast/ast_tester/maketest35
-rw-r--r--ast/ast_tester/origin.attr1
-rw-r--r--ast/ast_tester/origin.box1
-rw-r--r--ast/ast_tester/origin.head18
-rw-r--r--ast/ast_tester/plot3d-test1.ast340
-rw-r--r--ast/ast_tester/plotter.f230
-rw-r--r--ast/ast_tester/polco.attr1
-rw-r--r--ast/ast_tester/polco.box1
-rw-r--r--ast/ast_tester/polco.head86
-rw-r--r--ast/ast_tester/polco2.attr1
-rw-r--r--ast/ast_tester/polco2.box1
-rw-r--r--ast/ast_tester/polco2.head86
-rw-r--r--ast/ast_tester/regression.current7583
-rw-r--r--ast/ast_tester/regression.f1515
-rw-r--r--ast/ast_tester/regression.out7630
-rw-r--r--ast/ast_tester/rigby.map240
-rw-r--r--ast/ast_tester/rigby.simp201
-rw-r--r--ast/ast_tester/scp.attr1
-rw-r--r--ast/ast_tester/scp.box1
-rw-r--r--ast/ast_tester/scp.head204
-rw-r--r--ast/ast_tester/serpens.attr1
-rw-r--r--ast/ast_tester/serpens.box1
-rw-r--r--ast/ast_tester/serpens.head160
-rw-r--r--ast/ast_tester/simplify.f123
-rw-r--r--ast/ast_tester/sip.fits-wcs289
-rw-r--r--ast/ast_tester/sip.head288
-rw-r--r--ast/ast_tester/sparse.ast392
-rw-r--r--ast/ast_tester/specflux.ast29
-rw-r--r--ast/ast_tester/specflux.attr1
-rw-r--r--ast/ast_tester/specflux.box2
-rw-r--r--ast/ast_tester/specflux.head28
-rw-r--r--ast/ast_tester/splittest1.ast185
-rw-r--r--ast/ast_tester/stcschan-test1-doc3-props.ast126
-rw-r--r--ast/ast_tester/stcschan-test1-doc3.ast272
-rw-r--r--ast/ast_tester/testchannel.f88
-rw-r--r--ast/ast_tester/testchebymap.f475
-rw-r--r--ast/ast_tester/testcmpmap.f149
-rw-r--r--ast/ast_tester/testconvert.c232
-rw-r--r--ast/ast_tester/testerror.c44
-rw-r--r--ast/ast_tester/testfitschan.f988
-rw-r--r--ast/ast_tester/testfitstable.f590
-rw-r--r--ast/ast_tester/testflux.f354
-rw-r--r--ast/ast_tester/testframeset.f391
-rw-r--r--ast/ast_tester/testkeymap.f1369
-rw-r--r--ast/ast_tester/testlutmap.f177
-rw-r--r--ast/ast_tester/testmapping.f85
-rw-r--r--ast/ast_tester/testnormmap.f94
-rw-r--r--ast/ast_tester/testobject.c120
-rw-r--r--ast/ast_tester/testplot3d.f1357
-rw-r--r--ast/ast_tester/testpolymap.f319
-rw-r--r--ast/ast_tester/testrate.f344
-rw-r--r--ast/ast_tester/testratemap.f148
-rw-r--r--ast/ast_tester/testrebin.f4176
-rw-r--r--ast/ast_tester/testrebinseq.f1580
-rw-r--r--ast/ast_tester/testregions.f4032
-rw-r--r--ast/ast_tester/testskyframe.f89
-rw-r--r--ast/ast_tester/testspecflux.f331
-rw-r--r--ast/ast_tester/testspecframe.f251
-rw-r--r--ast/ast_tester/teststc.f1858
-rw-r--r--ast/ast_tester/teststc_com13
-rw-r--r--ast/ast_tester/teststc_eg171
-rw-r--r--ast/ast_tester/teststc_eg1018
-rw-r--r--ast/ast_tester/teststc_eg2114
-rw-r--r--ast/ast_tester/teststc_eg3113
-rw-r--r--ast/ast_tester/teststc_eg455
-rw-r--r--ast/ast_tester/teststc_eg5109
-rw-r--r--ast/ast_tester/teststc_eg649
-rw-r--r--ast/ast_tester/teststc_eg752
-rw-r--r--ast/ast_tester/teststc_eg852
-rw-r--r--ast/ast_tester/teststc_eg949
-rwxr-xr-xast/ast_tester/teststcschan.f654
-rw-r--r--ast/ast_tester/testswitchmap.f794
-rw-r--r--ast/ast_tester/testtable.f537
-rw-r--r--ast/ast_tester/testtime.f979
-rw-r--r--ast/ast_tester/testtrangrid.f276
-rw-r--r--ast/ast_tester/testunitnormmap.f324
-rw-r--r--ast/ast_tester/testxmlchan.f246
-rw-r--r--ast/ast_tester/testxmlchan_com13
-rw-r--r--ast/ast_tester/testzoommap.f91
-rw-r--r--ast/ast_tester/timeplot.attr1
-rw-r--r--ast/ast_tester/timeplot.box1
-rw-r--r--ast/ast_tester/timeplot.head34
-rw-r--r--ast/ast_tester/timj.ast234
-rw-r--r--ast/ast_tester/timj.fits-aips11
-rw-r--r--ast/ast_tester/timj.fits-iraf13
-rw-r--r--ast/ast_tester/timj.fits-pc16
-rw-r--r--ast/ast_tester/timj.fits-wcs39
-rw-r--r--ast/ast_tester/timj.native217
-rw-r--r--ast/ast_tester/tnx.attr1
-rw-r--r--ast/ast_tester/tnx.box1
-rw-r--r--ast/ast_tester/tnx.head180
-rw-r--r--ast/ast_tester/tsc.attr1
-rw-r--r--ast/ast_tester/tsc.box1
-rw-r--r--ast/ast_tester/tsc.head116
-rw-r--r--ast/ast_tester/wcsconverter.f222
-rw-r--r--ast/ast_tester/zpn.attr1
-rw-r--r--ast/ast_tester/zpn.box1
-rw-r--r--ast/ast_tester/zpn.head136
-rw-r--r--ast/ast_tester/zpx.attr1
-rw-r--r--ast/ast_tester/zpx.head153
159 files changed, 48084 insertions, 0 deletions
diff --git a/ast/ast_tester/README b/ast/ast_tester/README
new file mode 100644
index 0000000..8c50db6
--- /dev/null
+++ b/ast/ast_tester/README
@@ -0,0 +1,33 @@
+
+This directory contains files used for performing some fairly restricted
+testing of the AST library. A Fortran 77 compiler is required. As supplied
+it uses the g77 Fortran compiler, but this can be changed by editing the ast_tester
+script.
+
+To perform a test:
+
+- build AST
+
+- define the environment variables AST and STARLINK so that $AST/lib contains
+ the AST libraries to be tested, and $STARLINK/lib contains the the USSC libraries.
+
+- If required, edit the ast_tester script to modify the fortran compiler and/or options.
+
+- execute the ast_tester script.
+
+
+The script generates various output files which are compared with existing files
+which are presumed to represent correct behaviour of the AST library. Any differences
+are reported by the script.
+
+The script also generates various postscript files representing "critically difficult" plots.
+A file "*-new.ps" is created for each file "*.head" in the directory. The directory also
+contains files "*.ps" which represent the expected appearance of the plots. By default, the
+new plots are displayed using ghostview. This can be disabled by specifying the "-nd" option
+on the ast_tester command line.
+
+
+
+
+
+
diff --git a/ast/ast_tester/a20070718_00010_02_cube.ast b/ast/ast_tester/a20070718_00010_02_cube.ast
new file mode 100644
index 0000000..f005938
--- /dev/null
+++ b/ast/ast_tester/a20070718_00010_02_cube.ast
@@ -0,0 +1,339 @@
+ Begin FrameSet # Set of inter-related coordinate systems
+# Title = "3-d compound coordinate system" # Title of coordinate system
+# Naxes = 3 # Number of coordinate axes
+# Domain = "SKY-DSBSPECTRUM" # Coordinate system domain
+# Epoch = 2007.54208230851 # Julian epoch of observation
+# Lbl1 = "Right ascension" # Label for axis 1
+# Lbl2 = "Declination" # Label for axis 2
+# Lbl3 = "Radio velocity (USB)" # Label for axis 3
+# System = "Compound" # Coordinate system type
+# Uni1 = "hh:mm:ss.s" # Units for axis 1
+# Uni2 = "ddd:mm:ss" # Units for axis 2
+# Uni3 = "km/s" # Units for axis 3
+# Dir1 = 0 # Plot axis 1 in reverse direction
+ IsA Frame # Coordinate system description
+ Nframe = 4 # Number of Frames in FrameSet
+# Base = 1 # Index of base Frame
+ Currnt = 4 # Index of current Frame
+ Nnode = 5 # Number of nodes in FrameSet
+ Nod1 = 3 # Frame 1 is associated with node 3
+ Nod2 = 4 # Frame 2 is associated with node 4
+ Nod3 = 5 # Frame 3 is associated with node 5
+ Nod4 = 2 # Frame 4 is associated with node 2
+ Lnk2 = 1 # Node 2 is derived from node 1
+ Lnk3 = 1 # Node 3 is derived from node 1
+ Lnk4 = 1 # Node 4 is derived from node 1
+ Lnk5 = 1 # Node 5 is derived from node 1
+ Frm1 = # Frame number 1
+ Begin Frame # Coordinate system description
+ Title = "Data grid indices; first pixel at (1,1,1)" # Title of coordinate system
+ Naxes = 3 # Number of coordinate axes
+ Domain = "GRID" # Coordinate system domain
+# Lbl1 = "Data grid index 1" # Label for axis 1
+# Lbl2 = "Data grid index 2" # Label for axis 2
+# Lbl3 = "Data grid index 3" # Label for axis 3
+# Uni1 = "pixel" # Units for axis 1
+# Uni2 = "pixel" # Units for axis 2
+# Uni3 = "pixel" # Units for axis 3
+ Ax1 = # Axis number 1
+ Begin Axis # Coordinate axis
+ Label = "Data grid index 1" # Axis Label
+ Symbol = "g1" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ Ax2 = # Axis number 2
+ Begin Axis # Coordinate axis
+ Label = "Data grid index 2" # Axis Label
+ Symbol = "g2" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ Ax3 = # Axis number 3
+ Begin Axis # Coordinate axis
+ Label = "Data grid index 3" # Axis Label
+ Symbol = "g3" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ End Frame
+ Frm2 = # Frame number 2
+ Begin Frame # Coordinate system description
+ Title = "Pixel coordinates; first pixel at (-8.5,-8.5,-2048.5)" # Title of coordinate system
+ Naxes = 3 # Number of coordinate axes
+ Domain = "PIXEL" # Coordinate system domain
+# Lbl1 = "Pixel coordinate 1" # Label for axis 1
+# Lbl2 = "Pixel coordinate 2" # Label for axis 2
+# Lbl3 = "Pixel coordinate 3" # Label for axis 3
+# Uni1 = "pixel" # Units for axis 1
+# Uni2 = "pixel" # Units for axis 2
+# Uni3 = "pixel" # Units for axis 3
+ Ax1 = # Axis number 1
+ Begin Axis # Coordinate axis
+ Label = "Pixel coordinate 1" # Axis Label
+ Symbol = "p1" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ Ax2 = # Axis number 2
+ Begin Axis # Coordinate axis
+ Label = "Pixel coordinate 2" # Axis Label
+ Symbol = "p2" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ Ax3 = # Axis number 3
+ Begin Axis # Coordinate axis
+ Label = "Pixel coordinate 3" # Axis Label
+ Symbol = "p3" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ End Frame
+ Frm3 = # Frame number 3
+ Begin Frame # Coordinate system description
+ Title = "Axis coordinates; first pixel at (-8.5,-8.5,-2048.5)" # Title of coordinate system
+ Naxes = 3 # Number of coordinate axes
+ Domain = "AXIS" # Coordinate system domain
+# Lbl1 = "Axis 1" # Label for axis 1
+# Lbl2 = "Axis 2" # Label for axis 2
+# Lbl3 = "Axis 3" # Label for axis 3
+# Uni1 = "pixel" # Units for axis 1
+# Uni2 = "pixel" # Units for axis 2
+# Uni3 = "pixel" # Units for axis 3
+ Ax1 = # Axis number 1
+ Begin Axis # Coordinate axis
+ Label = "Axis 1" # Axis Label
+ Symbol = "a1" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ Ax2 = # Axis number 2
+ Begin Axis # Coordinate axis
+ Label = "Axis 2" # Axis Label
+ Symbol = "a2" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ Ax3 = # Axis number 3
+ Begin Axis # Coordinate axis
+ Label = "Axis 3" # Axis Label
+ Symbol = "a3" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ End Frame
+ Frm4 = # Frame number 4
+ Begin CmpFrame # Compound coordinate system description
+# Title = "3-d compound coordinate system" # Title of coordinate system
+# Naxes = 3 # Number of coordinate axes
+# Domain = "SKY-DSBSPECTRUM" # Coordinate system domain
+# Lbl1 = "Right ascension" # Label for axis 1
+# Lbl2 = "Declination" # Label for axis 2
+# Lbl3 = "Radio velocity (USB)" # Label for axis 3
+# Uni1 = "hh:mm:ss.s" # Units for axis 1
+# Uni2 = "ddd:mm:ss" # Units for axis 2
+# Uni3 = "km/s" # Units for axis 3
+# Dir1 = 0 # Plot axis 1 in reverse direction
+ IsA Frame # Coordinate system description
+ FrameA = # First component Frame
+ Begin SkyFrame # Description of celestial coordinate system
+ Naxes = 2 # Number of coordinate axes
+ Epoch = 2007.54208230851 # Julian epoch of observation
+ System = "FK5" # Coordinate system type
+ ObsLat = 0.346026050148997 # Observers geodetic latitude (rads)
+ ObsLon = -2.71363306946838 # Observers geodetic longitude (rads)
+ Dut1 = -0.162963400559962 # UT1-UTC in seconds
+ Ax1 = # Axis number 1
+ Begin SkyAxis # Celestial coordinate axis
+ End SkyAxis
+ Ax2 = # Axis number 2
+ Begin SkyAxis # Celestial coordinate axis
+ End SkyAxis
+ IsA Frame # Coordinate system description
+ SRef1 = 4.90555239050187 # Ref. pos. RA 18:44:16.2
+ SRef2 = -0.0698132003068136 # Ref. pos. Dec -4:00:00
+ End SkyFrame
+ FrameB = # Second component Frame
+ Begin DSBSpecFrame # Dual sideband spectral axis
+ Naxes = 1 # Number of coordinate axes
+ Epoch = 2007.54208230851 # Julian epoch of observation
+ System = "VRAD" # Coordinate system type
+ ObsLat = 0.346026069000144 # Observers geodetic latitude (rads)
+ ObsLon = -2.71363307300091 # Observers geodetic longitude (rads)
+ Dut1 = -0.162963400559962 # UT1-UTC in seconds
+ Ax1 = # Axis number 1
+ Begin Axis # Coordinate axis
+ End Axis
+ IsA Frame # Coordinate system description
+ SoR = "LSRK" # Standard of rest
+ RefRA = 4.90553899950038 # Reference RA (rads, FK5 J2000)
+ RefDec = -0.0698131700797732 # Reference Dec (rads, FK5 J2000)
+ RstFrq = 372672509000 # Rest frequency (Hz)
+ SrcVel = 87012.623732646 # Source velocity (m/s)
+ SrcVRF = "LSRK" # Source velocity rest frame
+ UFreq = "GHz" # Preferred units for frequency
+ IsA SpecFrame # Description of spectral coordinate system
+ DSBCen = 372576971505.836 # Central frequency (Hz topo)
+ IF = -5251168918.31241 # Intermediate frequency (Hz)
+ SideBn = "USB" # Represents upper sideband
+ End DSBSpecFrame
+ End CmpFrame
+ Map2 = # Mapping between nodes 1 and 2
+ Begin CmpMap # Compound Mapping
+ Nin = 3 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 3 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Series = 0 # Component Mappings applied in parallel
+ InvA = 1 # First Mapping used in inverse direction
+ MapA = # First component Mapping
+ Begin WinMap # Map one window on to another
+ Nin = 2 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Sft1 = 10 # Shift for axis 1
+ Sft2 = 10.4938775599003 # Shift for axis 2
+ End WinMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 1 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ IsA Mapping # Mapping between coordinate systems
+ InvA = 1 # First Mapping used in inverse direction
+ MapA = # First component Mapping
+ Begin WinMap # Map one window on to another
+ Nin = 1 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Sft1 = 6105939.046167 # Shift for axis 1
+ Scl1 = -1.63834485003565e-05 # Scale factor for axis 1
+ End WinMap
+ MapB = # Second component Mapping
+ Begin SpecMap # Conversion between spectral coordinate systems
+ Nin = 1 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Nspec = 2 # Number of conversion steps
+ Spec1 = "FRTOVL" # Convert frequency to rel. velocity
+ Spec1a = 372672509000 # Rest frequency (Hz)
+ Spec2 = "VLTOVR" # Convert relativistic to radio velocity
+ End SpecMap
+ End CmpMap
+ End CmpMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 3 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ Series = 0 # Component Mappings applied in parallel
+ MapA = # First component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin MatrixMap # Matrix transformation
+ Nin = 2 # Number of input coordinates
+ Invert = 1 # Mapping inverted
+ IsA Mapping # Mapping between coordinate systems
+ M0 = -2.90888208665722e-05 # Forward matrix value
+ M1 = 2.90888208665722e-05 # Forward matrix value
+ Form = "Diagonal" # Matrix storage form
+ End MatrixMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ InvA = 1 # First Mapping used in inverse direction
+ MapA = # First component Mapping
+ Begin WcsMap # FITS-WCS sky projection
+ Nin = 2 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Type = "TAN" # Gnomonic projection
+ End WcsMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ InvA = 1 # First Mapping used in inverse direction
+ MapA = # First component Mapping
+ Begin SphMap # Cartesian to Spherical mapping
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ UntRd = 1 # All input vectors have unit length
+ PlrLg = 0 # Polar longitude (rad.s)
+ End SphMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin MatrixMap # Matrix transformation
+ Nin = 3 # Number of input coordinates
+ Invert = 1 # Mapping inverted
+ IsA Mapping # Mapping between coordinate systems
+ M0 = -0.0133908234539359 # Forward matrix value
+ M1 = 0.981401710741326 # Forward matrix value
+ M2 = 0.191497697117288 # Forward matrix value
+ M3 = 0.068459122667767 # Forward matrix value
+ M4 = 0.191965314976427 # Forward matrix value
+ M5 = -0.979011065499037 # Forward matrix value
+ M6 = -0.997564050259824 # Forward matrix value
+ M7 = 0 # Forward matrix value
+ M8 = -0.0697564737441253 # Forward matrix value
+ Form = "Full" # Matrix storage form
+ End MatrixMap
+ MapB = # Second component Mapping
+ Begin SphMap # Cartesian to Spherical mapping
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ Invert = 1 # Mapping inverted
+ IsA Mapping # Mapping between coordinate systems
+ UntRd = 1 # All input vectors have unit length
+ PlrLg = 4.90555329534916 # Polar longitude (rad.s)
+ End SphMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ MapB = # Second component Mapping
+ Begin ZoomMap # Zoom about the origin
+ Nin = 1 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ Zoom = 0.001 # Zoom factor
+ End ZoomMap
+ End CmpMap
+ End CmpMap
+ Map3 = # Mapping between nodes 1 and 3
+ Begin UnitMap # Unit (null) Mapping
+ Nin = 3 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ IsA Mapping # Mapping between coordinate systems
+ End UnitMap
+ Map4 = # Mapping between nodes 1 and 4
+ Begin WinMap # Map one window on to another
+ Nin = 3 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ IsA Mapping # Mapping between coordinate systems
+ Sft1 = -9.5 # Shift for axis 1
+ Sft2 = -9.5 # Shift for axis 2
+ Sft3 = -2049.5 # Shift for axis 3
+ End WinMap
+ Map5 = # Mapping between nodes 1 and 5
+ Begin WinMap # Map one window on to another
+ Nin = 3 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ IsA Mapping # Mapping between coordinate systems
+ Sft1 = -9.5 # Shift for axis 1
+ Sft2 = -9.5 # Shift for axis 2
+ Sft3 = -2049.5 # Shift for axis 3
+ End WinMap
+ End FrameSet
diff --git a/ast/ast_tester/a20070718_00010_02_cube.fits-wcs b/ast/ast_tester/a20070718_00010_02_cube.fits-wcs
new file mode 100644
index 0000000..428efaa
--- /dev/null
+++ b/ast/ast_tester/a20070718_00010_02_cube.fits-wcs
@@ -0,0 +1,61 @@
+WCSAXES = 3 / Number of WCS axes
+CRPIX1 = 10.0 / Reference pixel on axis 1
+CRPIX2 = 10.493878 / Reference pixel on axis 2
+CRPIX3 = 1.0 / Reference pixel on axis 3
+CRVAL1 = 281.0675 / Value at ref. pixel on axis 1
+CRVAL2 = -4.0 / Value at ref. pixel on axis 2
+CRVAL3 = -13.610153 / Value at ref. pixel on axis 3
+CTYPE1 = 'RA---TAN' / Type of co-ordinate on axis 1
+CTYPE2 = 'DEC--TAN' / Type of co-ordinate on axis 2
+CTYPE3 = 'VRAD ' / Type of co-ordinate on axis 3
+CDELT1 = -0.0016666667 / Pixel size on axis 1
+CDELT2 = 0.0016666667 / Pixel size on axis 2
+CDELT3 = 0.049100739 / Pixel size on axis 3
+CUNIT3 = 'km/s ' / Units for axis 3
+MJD-OBS = 54299.245 / Modified Julian Date of observation
+DATE-OBS= '2007-07-18T05:52:31.475' / Date of observation
+RADESYS = 'FK5 ' / Reference frame for RA/DEC values
+EQUINOX = 2000.0 / [yr] Epoch of reference equinox
+SPECSYS = 'LSRK ' / Standard of rest for spectral axis
+SSYSSRC = 'LSRK ' / Standard of rest for source redshift
+ZSOURCE = 0.000290285 / [] Redshift of source
+VELOSYS = -10097.217 / [m/s] Topo. apparent velocity of rest frame
+RESTFRQ = 3.7267251E+11 / [Hz] Rest frequency
+IMAGFREQ= 3.621676E+11 / [Hz] Image frequency
+OBSGEO-X= -5461073.2 / [m] Observatory geocentric X
+OBSGEO-Y= -2491089.0 / [m] Observatory geocentric Y
+OBSGEO-Z= 2149568.8 / [m] Observatory geocentric Z
+WCSAXESA= 3 / Number of WCS axes
+WCSNAMEA= 'PIXEL ' / Reference name for the coord. frame
+CRPIX1A = 1.0 / Reference pixel on axis 1
+CRPIX2A = 1.0 / Reference pixel on axis 2
+CRPIX3A = 1.0 / Reference pixel on axis 3
+CRVAL1A = -8.5 / Value at ref. pixel on axis 1
+CRVAL2A = -8.5 / Value at ref. pixel on axis 2
+CRVAL3A = -2048.5 / Value at ref. pixel on axis 3
+CTYPE1A = 'p1 ' / Pixel coordinate 1
+CTYPE2A = 'p2 ' / Pixel coordinate 2
+CTYPE3A = 'p3 ' / Pixel coordinate 3
+CDELT1A = 1.0 / Pixel size on axis 1
+CDELT2A = 1.0 / Pixel size on axis 2
+CDELT3A = 1.0 / Pixel size on axis 3
+CUNIT1A = 'pixel ' / Units for axis 1
+CUNIT2A = 'pixel ' / Units for axis 2
+CUNIT3A = 'pixel ' / Units for axis 3
+WCSAXESB= 3 / Number of WCS axes
+WCSNAMEB= 'AXIS ' / Reference name for the coord. frame
+CRPIX1B = 1.0 / Reference pixel on axis 1
+CRPIX2B = 1.0 / Reference pixel on axis 2
+CRPIX3B = 1.0 / Reference pixel on axis 3
+CRVAL1B = -8.5 / Value at ref. pixel on axis 1
+CRVAL2B = -8.5 / Value at ref. pixel on axis 2
+CRVAL3B = -2048.5 / Value at ref. pixel on axis 3
+CTYPE1B = 'a1 ' / Axis 1
+CTYPE2B = 'a2 ' / Axis 2
+CTYPE3B = 'a3 ' / Axis 3
+CDELT1B = 1.0 / Pixel size on axis 1
+CDELT2B = 1.0 / Pixel size on axis 2
+CDELT3B = 1.0 / Pixel size on axis 3
+CUNIT1B = 'pixel ' / Units for axis 1
+CUNIT2B = 'pixel ' / Units for axis 2
+CUNIT3B = 'pixel ' / Units for axis 3
diff --git a/ast/ast_tester/aitoff.attr b/ast/ast_tester/aitoff.attr
new file mode 100644
index 0000000..85aa9de
--- /dev/null
+++ b/ast/ast_tester/aitoff.attr
@@ -0,0 +1 @@
+Grid=1,tickall=0,border=1,tol=0.001
diff --git a/ast/ast_tester/aitoff.box b/ast/ast_tester/aitoff.box
new file mode 100644
index 0000000..b4f303e
--- /dev/null
+++ b/ast/ast_tester/aitoff.box
@@ -0,0 +1 @@
+10.0 -10.0 300.0 280.0
diff --git a/ast/ast_tester/aitoff.head b/ast/ast_tester/aitoff.head
new file mode 100644
index 0000000..5f34de0
--- /dev/null
+++ b/ast/ast_tester/aitoff.head
@@ -0,0 +1,13 @@
+SIMPLE = T / Written by IDL: 30-Jul-1997 05:35:42.00
+BITPIX = -32 / Bits per pixel.
+NAXIS = 2 / Number of dimensions
+NAXIS1 = 300 / Length of x axis.
+NAXIS2 = 300 / Length of y axis.
+CTYPE1 = 'GLON-AIT' / X-axis type
+CTYPE2 = 'GLAT-AIT' / Y-axis type
+CRVAL1 = -149.56866 / Reference pixel value
+CRVAL2 = -19.758201 / Reference pixel value
+CRPIX1 = 150.500 / Reference pixel
+CRPIX2 = 150.500 / Reference pixel
+CDELT1 = -1.20000 / Degrees/pixel
+CDELT2 = 1.20000 / Degrees/pixel
diff --git a/ast/ast_tester/ast_tester b/ast/ast_tester/ast_tester
new file mode 100755
index 0000000..e626157
--- /dev/null
+++ b/ast/ast_tester/ast_tester
@@ -0,0 +1,232 @@
+#!/bin/tcsh
+#+
+# Purpose:
+# Does a few tests of the version of AST installed in $INSTALL.
+
+# Usage:
+# ast_tester <-nd>
+
+# Description:
+# Build and run various tests of an AST installation.
+#
+# Some tests produce graphical output. Postscript plots of the FITS
+# headers in the current directory are produced for visual comparison
+# with previous versions. For each file matching "*.head" in the current
+# directory, a file is created called "*-new.ps". This file should be
+# compared visually with the file "*.ps". The new files are displayed
+# automatically unless the -nd option is supplied on the command line
+#
+# This script assumes the gfortran compiler is available. If this is not
+# the case, do a global edit of gfortran to whatever fortran 77 compiler
+# you have available (you will probably also need to change the compiler
+# flags).
+
+# Options:
+# -nd : Suppresses display of test plots.
+
+# Prior Requirements:
+# - Unless the "-nd" option is specified, it requires the gv command (a
+# frontend for ghostscript) to be on your PATH.
+# - The following environment variables are used:
+# STARLINK_DIR - should be set to the root of the tree in which the SSC is
+# installed. A default of /star is used if not set.
+# AST - should be set to the root of the tree in which the version of
+# AST to be tested is installed. A default of $STARLINK_DIR is used
+# if not set.
+
+# Author:
+# DSB: David Berry (JAC, Hawaii)
+#-
+
+if( ! $?STARLINK_DIR ) then
+ setenv STARLINK_DIR /star
+endif
+
+if( ! $?AST ) then
+ setenv AST $STARLINK_DIR
+endif
+
+if( ! $?LDFLAGS ) then
+ setenv LDFLAGS ""
+endif
+
+setenv PATH $AST/bin\:$STARLINK_DIR/bin\:$PATH
+
+
+# Build the progs
+#gfortran -fno-second-underscore -o regression regression.f -fno-range-check $LDFLAGS -I$AST/include -I$STARLINK_DIR/include -L$AST/lib -L$STARLINK_DIR/lib `ast_link -ems` `chr_link`
+gfortran -fno-second-underscore -o plotter plotter.f -fno-range-check $LDFLAGS -I$AST/include -I$STARLINK_DIR/include -L$AST/lib -L$STARLINK_DIR/lib `ast_link -pgp -ems` `pgplot_link`
+gfortran -fno-second-underscore -o wcsconverter wcsconverter.f -fno-range-check $LDFLAGS -I$AST/include -I$STARLINK_DIR/include -L$AST/lib -L$STARLINK_DIR/lib `ast_link -ems` `chr_link` `err_link`
+gfortran -fno-second-underscore -o simplify simplify.f -fno-range-check $LDFLAGS -I$AST/include -I$STARLINK_DIR/include -L$AST/lib -L$STARLINK_DIR/lib `ast_link -ems` `chr_link` `err_link`
+
+# Run the other test progs
+echo ""
+
+
+foreach prog (testmapping testchebymap testunitnormmap testskyframe testframeset testchannel testpolymap testcmpmap testlutmap testfitstable testtable teststcschan teststc testspecframe testfitschan testswitchmap testrebin testrebinseq testtrangrid testnormmap testtime testrate testflux testratemap testspecflux testxmlchan testregions testkeymap )
+
+gfortran -fno-second-underscore -w -g -o $prog -g $prog.f -fno-range-check $LDFLAGS -I$AST/include \
+ -I$STARLINK_DIR/include -L$AST/lib -L$STARLINK_DIR/lib `ast_link -ems` \
+ `psx_link` `prm_link` `chr_link` `err_link`
+
+./$prog
+\rm $prog
+
+end
+
+
+
+foreach prog (testobject testconvert testerror)
+
+gcc -o $prog $prog.c -I.. -DHAVE_CONFIG_H $LDFLAGS -L$STARLINK_DIR/lib `ast_link`
+
+./$prog
+\rm $prog
+
+end
+
+
+
+
+# Make new plots.
+echo ""
+echo "Generating new plots..."
+echo ""
+if( $1 == "-nd" ) then
+echo " (but not displaying them because the -nd option was supplied)"
+echo ""
+endif
+
+\rm *-new.ps >& /dev/null
+
+foreach n (*.head)
+ set bn = `basename $n .head`
+
+ set atfile = "${bn}.attr"
+ if( -e $atfile ) then
+ set attr1 = `cat $atfile`
+ else
+ set attr1 = ' '
+ endif
+
+ set atfile = "${bn}.fattr"
+ if( -e $atfile ) then
+ set attr2 = `cat $atfile`
+ else
+ set attr2 = ' '
+ endif
+
+ set boxfile = "${bn}.box"
+ if( -e $boxfile ) then
+ set box = `cat $boxfile`
+ else
+ set box = ' '
+ endif
+
+
+ set psfile = "${bn}-new.ps"
+ ./plotter $n "$attr1" "$attr2" a.ps $box
+
+ if( -e $STARLINK_DIR/bin/psmerge ) then
+ $STARLINK_DIR/bin/psmerge -t300x300 -r90 a.ps > $psfile
+ else
+ cp a.ps $psfile
+ endif
+
+ if( $1 != "-nd" ) then
+ gv $psfile -orientation=landscape
+ endif
+
+end
+
+\rm -f a.ps
+
+
+# Make new fits headers
+echo ""
+echo "Doing WCS conversion tests..."
+echo ""
+
+set ok = 1
+foreach n ( "timj ast fits-wcs cdmatrix=1" \
+ "timj ast fits-iraf" \
+ "timj ast fits-aips" \
+ "timj ast fits-pc" \
+ "timj ast native" \
+ "timj ast native" \
+ "a20070718_00010_02_cube ast fits-wcs" \
+ "dss fits-dss ast" \
+ "dss ast dss" \
+ "dss ast fits-wcs cdmatrix=1" \
+ "degen1 ast fits-wcs cdmatrix=1" \
+ "degen1 ast fits-wcs cdmatrix=1" \
+ "sip head fits-wcs cdmatrix=1,sipreplace=0" \
+ "longslit fits-pc fits-wcs cdmatrix=1" )
+
+ set a = `echo $n`
+
+ set base = $a[1]
+ set in_suffix = $a[2]
+ set encoding = $a[3]
+ if( $#a > 3 ) then
+ set attrs = $a[4]
+ else
+ set attrs = ""
+ endif
+
+ set in_file = "$base.$in_suffix"
+ set old_file = "$base.$encoding"
+ set new_file = "$base-new.$encoding"
+
+
+ ./wcsconverter $in_file $encoding $new_file "$attrs,FitsDigits=8"
+ diff -c $old_file $new_file > ! $old_file.diff
+
+ if( $status == 0 ) then
+ \rm -f $old_file.diff $new_file
+ else
+ echo " $old_file and $new_file differ\!\! (see $old_file.diff)"
+ echo " Command was:"
+ echo " wcsconverter $in_file $encoding $new_file <quote>$attrs,FitsDigits=8<quote>"
+ set ok = 0
+ endif
+
+end
+
+if( $ok == 1 ) then
+ echo " All WCS conversion tests passed"
+ echo ""
+endif
+
+
+echo ""
+echo "Doing Simplification tests..."
+echo ""
+
+set ok = 1
+foreach n ( *.map )
+ set a = `basename $n .map`
+ ./simplify $n $a.out
+ diff -c $a.simp $a.out > ! $a.diff
+
+ if( $status == 0 ) then
+ \rm -f $a.out $a.diff
+ else
+ echo " $a.simp and $a.out differ\!\! (see $a.diff)"
+ set ok = 0
+ endif
+
+end
+
+if( $ok == 1 ) then
+ echo " All simplification tests passed"
+ echo ""
+ echo ""
+endif
+
+
+
+
+
+
+\rm -f plotter wcsconverter simplify testxmlchan
diff --git a/ast/ast_tester/brad.map b/ast/ast_tester/brad.map
new file mode 100644
index 0000000..d403fce
--- /dev/null
+++ b/ast/ast_tester/brad.map
@@ -0,0 +1,58 @@
+Begin CmpMap # Compound Mapping
+ Nin = 3 # Number of input coordinates
+IsA Mapping # Mapping between coordinate systems
+ Series = 0 # Component Mappings applied in parallel
+ MapA = # First component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 1 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ InvA = 1 # First Mapping used in inverse direction
+ MapA = # First component Mapping
+ Begin WinMap # Map one window on to another
+ Nin = 1 # Number of input coordinates
+ Invert = 1 # Mapping inverted
+ IsA Mapping # Mapping between coordinate systems
+ Sft1 = 0.215698 # Shift for axis 1
+ End WinMap
+ MapB = # Second component Mapping
+ Begin LutMap # Map 1-d coordinates using a lookup table
+ Nin = 1 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Nlut = 11 # Number of lookup table elements
+ Start = 1 # Input value at first element
+ Incr = 100 # Input value increment between elements
+ LutInt = 0 # Interpolation method
+ L1 = 1.39532005786896 # Lookup table elements...
+ L2 = 1.50432002544403
+ L3 = 1.61332011222839
+ L4 = 1.72232007980347
+ L5 = 1.83132004737854
+ L6 = 1.94032001495361
+ L7 = 2.04932022094727
+ L8 = 2.15831995010376
+ L9 = 2.26732015609741
+ L10 = 2.37632012367249
+ L11 = 2.48532009124756
+ End LutMap
+ End CmpMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin ZoomMap # Zoom about the origin
+ Nin = 2 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Zoom = 5.23598775598299e-06 # Zoom factor
+ End ZoomMap
+ MapB = # Second component Mapping
+ Begin WcsMap # FITS-WCS sky projection
+ Nin = 2 # Number of input coordinates
+ Invert = 1 # Mapping inverted
+ IsA Mapping # Mapping between coordinate systems
+ Type = "TAN" # Gnomonic projection
+ End WcsMap
+ End CmpMap
+End CmpMap
diff --git a/ast/ast_tester/brad.simp b/ast/ast_tester/brad.simp
new file mode 100644
index 0000000..ffa6e18
--- /dev/null
+++ b/ast/ast_tester/brad.simp
@@ -0,0 +1,49 @@
+ Begin CmpMap # Compound Mapping
+ Nin = 3 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin WinMap # Map one window on to another
+ Nin = 3 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ IsA Mapping # Mapping between coordinate systems
+ Sft1 = -0.215698 # Shift for axis 1
+ Scl2 = 5.2359877559829903e-06 # Scale factor for axis 2
+ Scl3 = 5.2359877559829903e-06 # Scale factor for axis 3
+ End WinMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 3 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ IsA Mapping # Mapping between coordinate systems
+ Series = 0 # Component Mappings applied in parallel
+ MapA = # First component Mapping
+ Begin LutMap # Map 1-d coordinates using a lookup table
+ Nin = 1 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Nlut = 11 # Number of lookup table elements
+ Start = 1 # Input value at first element
+ Incr = 100 # Input value increment between elements
+ LutInt = 0 # Interpolation method
+ L1 = 1.39532005786896 # Lookup table elements...
+ L2 = 1.5043200254440301
+ L3 = 1.61332011222839
+ L4 = 1.7223200798034699
+ L5 = 1.83132004737854
+ L6 = 1.94032001495361
+ L7 = 2.0493202209472701
+ L8 = 2.1583199501037602
+ L9 = 2.2673201560974099
+ L10 = 2.3763201236724898
+ L11 = 2.4853200912475599
+ End LutMap
+ MapB = # Second component Mapping
+ Begin WcsMap # FITS-WCS sky projection
+ Nin = 2 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Type = "TAN" # Gnomonic projection
+ End WcsMap
+ End CmpMap
+ End CmpMap
diff --git a/ast/ast_tester/car1.attr b/ast/ast_tester/car1.attr
new file mode 100644
index 0000000..f74084f
--- /dev/null
+++ b/ast/ast_tester/car1.attr
@@ -0,0 +1 @@
+numlabgap=0.05
diff --git a/ast/ast_tester/car1.box b/ast/ast_tester/car1.box
new file mode 100644
index 0000000..09670e6
--- /dev/null
+++ b/ast/ast_tester/car1.box
@@ -0,0 +1 @@
+0 0 2962 562
diff --git a/ast/ast_tester/car1.fattr b/ast/ast_tester/car1.fattr
new file mode 100644
index 0000000..5f408d2
--- /dev/null
+++ b/ast/ast_tester/car1.fattr
@@ -0,0 +1 @@
+carlin=1
diff --git a/ast/ast_tester/car1.head b/ast/ast_tester/car1.head
new file mode 100644
index 0000000..bec8d59
--- /dev/null
+++ b/ast/ast_tester/car1.head
@@ -0,0 +1,32 @@
+SIMPLE = T / Standard FITS format
+BITPIX = 16 / Bits per pixel
+NAXIS = 2 / Number of axes
+NAXIS1 = 2961 / Number pixels on axis 1
+NAXIS2 = 561 / Number pixels on axis 2
+CTYPE1 = 'GLON-CAR' / axis 1 coord type
+CRVAL1 = 1.850000e+02 / coord value at CRPIX1
+CDELT1 = -1.250000e-01 / pixel spacing for axis 1
+CRPIX1 = 1.000000 / ref pixel for axis 1
+CTYPE2 = 'GLAT-CAR' / axis 2 coord type
+CRVAL2 = -3.500000e+01 / coord value at CRPIX2
+CDELT2 = 1.250000e-01 / pixel spacing for axis 2
+CRPIX2 = 1.000000 / ref pixel for axis 2
+BSCALE = 2.610167e-02 / real = int*bscale + bzero
+BZERO = 8.321995e+02 /
+DATAMIN = -6.326761e+00 / minimum real value
+DATAMAX = 1.670731e+03 / maximum real value
+BLANK = -32768 / missing data flag
+COMMENT PARENT DISK FILE: Wco_DHT2001.fits
+COMMENT temp =colscales( CHANGE-ME , -185.0000, 185.0000)
+COMMENT coords=rowscales( temp, 35.0000, -35.0000)
+COMMENT Written by MacFITS
+COMMENT Created: Tuesday, 14 August, 2001 01:18:06 PM
+COMMENT Whole-Galaxy velocity-integrated CO(1-0) map (Fig. 2) from
+COMMENT "The Milky Way in Molecular Clouds: A New Complete CO Survey"
+COMMENT T. M. Dame, Dap Hartmann, & P. Thaddeus (2001), ApJ, 547, 792.
+COMMENT WARNING: Both the angular resolution and the sensitivity varies
+COMMENT from region to region in this map: see Fig. 1 and Table 1 from
+COMMENT the paper above. Moment masking and clipping were used as
+COMMENT necessary to keep the noise in the map below ~1.5 K km/s.
+COMMENT See Section 2.2 for details.
+END
diff --git a/ast/ast_tester/car2.attr b/ast/ast_tester/car2.attr
new file mode 100644
index 0000000..483f747
--- /dev/null
+++ b/ast/ast_tester/car2.attr
@@ -0,0 +1 @@
+numlabgap(2)=0.05,labelling=interior
diff --git a/ast/ast_tester/car2.box b/ast/ast_tester/car2.box
new file mode 100644
index 0000000..09670e6
--- /dev/null
+++ b/ast/ast_tester/car2.box
@@ -0,0 +1 @@
+0 0 2962 562
diff --git a/ast/ast_tester/car2.fattr b/ast/ast_tester/car2.fattr
new file mode 100644
index 0000000..5f408d2
--- /dev/null
+++ b/ast/ast_tester/car2.fattr
@@ -0,0 +1 @@
+carlin=1
diff --git a/ast/ast_tester/car2.head b/ast/ast_tester/car2.head
new file mode 100644
index 0000000..bec8d59
--- /dev/null
+++ b/ast/ast_tester/car2.head
@@ -0,0 +1,32 @@
+SIMPLE = T / Standard FITS format
+BITPIX = 16 / Bits per pixel
+NAXIS = 2 / Number of axes
+NAXIS1 = 2961 / Number pixels on axis 1
+NAXIS2 = 561 / Number pixels on axis 2
+CTYPE1 = 'GLON-CAR' / axis 1 coord type
+CRVAL1 = 1.850000e+02 / coord value at CRPIX1
+CDELT1 = -1.250000e-01 / pixel spacing for axis 1
+CRPIX1 = 1.000000 / ref pixel for axis 1
+CTYPE2 = 'GLAT-CAR' / axis 2 coord type
+CRVAL2 = -3.500000e+01 / coord value at CRPIX2
+CDELT2 = 1.250000e-01 / pixel spacing for axis 2
+CRPIX2 = 1.000000 / ref pixel for axis 2
+BSCALE = 2.610167e-02 / real = int*bscale + bzero
+BZERO = 8.321995e+02 /
+DATAMIN = -6.326761e+00 / minimum real value
+DATAMAX = 1.670731e+03 / maximum real value
+BLANK = -32768 / missing data flag
+COMMENT PARENT DISK FILE: Wco_DHT2001.fits
+COMMENT temp =colscales( CHANGE-ME , -185.0000, 185.0000)
+COMMENT coords=rowscales( temp, 35.0000, -35.0000)
+COMMENT Written by MacFITS
+COMMENT Created: Tuesday, 14 August, 2001 01:18:06 PM
+COMMENT Whole-Galaxy velocity-integrated CO(1-0) map (Fig. 2) from
+COMMENT "The Milky Way in Molecular Clouds: A New Complete CO Survey"
+COMMENT T. M. Dame, Dap Hartmann, & P. Thaddeus (2001), ApJ, 547, 792.
+COMMENT WARNING: Both the angular resolution and the sensitivity varies
+COMMENT from region to region in this map: see Fig. 1 and Table 1 from
+COMMENT the paper above. Moment masking and clipping were used as
+COMMENT necessary to keep the noise in the map below ~1.5 K km/s.
+COMMENT See Section 2.2 for details.
+END
diff --git a/ast/ast_tester/car3.attr b/ast/ast_tester/car3.attr
new file mode 100644
index 0000000..b80a7c0
--- /dev/null
+++ b/ast/ast_tester/car3.attr
@@ -0,0 +1 @@
+grid=1
diff --git a/ast/ast_tester/car3.box b/ast/ast_tester/car3.box
new file mode 100644
index 0000000..54240c7
--- /dev/null
+++ b/ast/ast_tester/car3.box
@@ -0,0 +1 @@
+0 0 400 400
diff --git a/ast/ast_tester/car3.head b/ast/ast_tester/car3.head
new file mode 100644
index 0000000..de6c76e
--- /dev/null
+++ b/ast/ast_tester/car3.head
@@ -0,0 +1,8 @@
+CTYPE1 = 'GLON-CAR'
+CRVAL1 = 1.850000e+02
+CDELT1 = -1.250000e-01
+CRPIX1 = 200.000000
+CTYPE2 = 'GLAT-CAR'
+CRVAL2 = -3.500000e+01
+CDELT2 = 1.250000e-01
+CRPIX2 = 200.000000
diff --git a/ast/ast_tester/car4.attr b/ast/ast_tester/car4.attr
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/ast/ast_tester/car4.attr
diff --git a/ast/ast_tester/car4.box b/ast/ast_tester/car4.box
new file mode 100644
index 0000000..0393b0d
--- /dev/null
+++ b/ast/ast_tester/car4.box
@@ -0,0 +1 @@
+0 0 951 1851
diff --git a/ast/ast_tester/car4.fattr b/ast/ast_tester/car4.fattr
new file mode 100644
index 0000000..5f408d2
--- /dev/null
+++ b/ast/ast_tester/car4.fattr
@@ -0,0 +1 @@
+carlin=1
diff --git a/ast/ast_tester/car4.head b/ast/ast_tester/car4.head
new file mode 100644
index 0000000..95cd97a
--- /dev/null
+++ b/ast/ast_tester/car4.head
@@ -0,0 +1,38 @@
+SIMPLE = T / Written by IDL: Thu Apr 27 08:52:27 2000
+BITPIX = -32 /
+NAXIS = 2 /
+NAXIS1 = 951 /
+NAXIS2 = 1851 /
+CRPIX1 = 211076.0 /
+CRVAL1 = 0.000000000 /
+CTYPE1 = 'GLON-CAR' /
+CRPIX2 = 475.39400 /
+CRVAL2 = 0.000000000 /
+CTYPE2 = 'GLAT-CAR' /
+CROTA2 = 0.000000000 /
+LONPOLE = 0.00000 / Defined by Greisen and Calabretta
+CD1_1 = -0.0016666667 /
+CD1_2 = 0.00000 /
+CD2_1 = 0.00000 /
+CD2_2 = 0.0016666667 /
+WAVELENG= 8.28000e-06 / Isophotal wavelength in meters
+BUNIT = 'W/m^2-sr' /
+SECURITY= 'Unclassified' /
+TELESCOP= 'MSX ' /
+INSTRUME= 'SPIRITIII' /
+ORIGIN = 'AFRL-VSBC' /
+MJD-OBS = 50295.5 / Mean modified Julian date of observation
+DATE = '16/02/2000' / Date of file generation
+HISTORY Convert Version 6.2.X
+HISTORY Level-2A Deshadow Version 4.0
+HISTORY Level-2A Saturation Correction Version 1.0
+HISTORY Pointing Convert Version 6.0.1
+HISTORY Makeimage Version 3.2
+HISTORY Destriped
+HISTORY Data collected in J2000 FK5 coordinates
+HISTORY Data samples transformed to Galactic coordinates
+HISTORY and convolved onto image grid using sigma=3.0 arcsec
+HISTORY Gaussian kernel
+HISTORY Master Plate: GP_351.0_+0.0_A.fits
+HISTORY Written by IDL: 28-Jan-2000 17:44:54.00
+END
diff --git a/ast/ast_tester/car5.attr b/ast/ast_tester/car5.attr
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/ast/ast_tester/car5.attr
diff --git a/ast/ast_tester/car5.box b/ast/ast_tester/car5.box
new file mode 100644
index 0000000..0393b0d
--- /dev/null
+++ b/ast/ast_tester/car5.box
@@ -0,0 +1 @@
+0 0 951 1851
diff --git a/ast/ast_tester/car5.head b/ast/ast_tester/car5.head
new file mode 100644
index 0000000..2be3a64
--- /dev/null
+++ b/ast/ast_tester/car5.head
@@ -0,0 +1,38 @@
+SIMPLE = T / Written by IDL: Thu Apr 27 08:52:27 2000
+BITPIX = -32 /
+NAXIS = 2 /
+NAXIS1 = 951 /
+NAXIS2 = 1851 /
+CRPIX1 = -4932.0204 /
+CRVAL1 = 0.000000000 /
+CTYPE1 = 'GLON-CAR' /
+CRPIX2 = 475.39400 /
+CRVAL2 = 0.000000000 /
+CTYPE2 = 'GLAT-CAR' /
+CROTA2 = 0.000000000 /
+LONPOLE = 0.00000 / Defined by Greisen and Calabretta
+CD1_1 = -0.0016666667 /
+CD1_2 = 0.00000 /
+CD2_1 = 0.00000 /
+CD2_2 = 0.0016666667 /
+WAVELENG= 8.28000e-06 / Isophotal wavelength in meters
+BUNIT = 'W/m^2-sr' /
+SECURITY= 'Unclassified' /
+TELESCOP= 'MSX ' /
+INSTRUME= 'SPIRITIII' /
+ORIGIN = 'AFRL-VSBC' /
+MJD-OBS = 50295.5 / Mean modified Julian date of observation
+DATE = '16/02/2000' / Date of file generation
+HISTORY Convert Version 6.2.X
+HISTORY Level-2A Deshadow Version 4.0
+HISTORY Level-2A Saturation Correction Version 1.0
+HISTORY Pointing Convert Version 6.0.1
+HISTORY Makeimage Version 3.2
+HISTORY Destriped
+HISTORY Data collected in J2000 FK5 coordinates
+HISTORY Data samples transformed to Galactic coordinates
+HISTORY and convolved onto image grid using sigma=3.0 arcsec
+HISTORY Gaussian kernel
+HISTORY Master Plate: GP_351.0_+0.0_A.fits
+HISTORY Written by IDL: 28-Jan-2000 17:44:54.00
+END
diff --git a/ast/ast_tester/car6.attr b/ast/ast_tester/car6.attr
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/ast/ast_tester/car6.attr
diff --git a/ast/ast_tester/car6.box b/ast/ast_tester/car6.box
new file mode 100644
index 0000000..e5f0493
--- /dev/null
+++ b/ast/ast_tester/car6.box
@@ -0,0 +1 @@
+0 0 5401 1741
diff --git a/ast/ast_tester/car6.head b/ast/ast_tester/car6.head
new file mode 100644
index 0000000..5356fa5
--- /dev/null
+++ b/ast/ast_tester/car6.head
@@ -0,0 +1,39 @@
+FITS headers in CHIPASS_Equ.fits:
+SIMPLE = T / file does conform to FITS standard
+BITPIX = -32 / IEEE (big-endian) 32-bit floating point data
+NAXIS = 2 / number of data axes
+NAXIS1 = 5401 / length of data axis 1
+NAXIS2 = 1741 / length of data axis 2
+EXTEND = T / FITS dataset may contain extensions
+COMMENT FITS (Flexible Image Transport System) format is defined in 'Astronomy
+COMMENT and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H
+BUNIT = 'mK ' / Using 438.5 mK/(Jy/beam) plus 3300 mK offset
+CTYPE1 = 'RA---CAR'
+CRPIX1 = 2701.
+CDELT1 = -0.0666666666666667
+CRVAL1 = 180.
+CTYPE2 = 'DEC--CAR'
+CRPIX2 = 1351.
+CDELT2 = 0.0666666666666667
+CRVAL2 = 0.
+LONPOLE = 0. / Native longitude of celestial pole
+LATPOLE = 90. / Native latitude of celestial pole
+RADESYS = 'FK5 ' / Equatorial coordinate system
+EQUINOX = 2000.0 / Equinox of equatorial coordinates
+BMAJ = 0.24000 / [deg] Beam major axis
+BMIN = 0.24000 / [deg] Beam minor axis
+BPA = 0.0 / [deg] Beam position angle
+FREQENCY= 1.3945E+09 / [Hz] Centre frequency
+BANDWID = 6.4E+07 / [Hz] Bandwidth
+DATE = '2013-04-20T13:20:39' / file creation date (YYYY-MM-DDThh:mm:ss UT)
+COMMENT ------------------------------------------------------------------------
+COMMENT This file contains a 1.4 GHz continuum map of the sky south of dec +26
+COMMENT produced from HIPASS and ZOA data. These surveys were undertaken with
+COMMENT the 13-beam multibeam system on the Parkes radio telescope.
+COMMENT Details may be found in the following paper:
+COMMENT Calabretta, M.R., Staveley-Smith, L., and Barnes, D.G., (2013)
+COMMENT PASA (in preparation).
+COMMENT ------------------------------------------------------------------------
+COMMENT THIS IS A PRE-PUBLICATION IMAGE, FOR RESTRICTED DISTRIBUTION ONLY
+COMMENT ------------------------------------------------------------------------
+END
diff --git a/ast/ast_tester/cobe.attr b/ast/ast_tester/cobe.attr
new file mode 100644
index 0000000..c1f61e5
--- /dev/null
+++ b/ast/ast_tester/cobe.attr
@@ -0,0 +1 @@
+format(1)=gd,format(2)=gd,Grid=1,tickall=0,width(axes)=3
diff --git a/ast/ast_tester/cobe.box b/ast/ast_tester/cobe.box
new file mode 100644
index 0000000..b4f303e
--- /dev/null
+++ b/ast/ast_tester/cobe.box
@@ -0,0 +1 @@
+10.0 -10.0 300.0 280.0
diff --git a/ast/ast_tester/cobe.head b/ast/ast_tester/cobe.head
new file mode 100644
index 0000000..fb6da34
--- /dev/null
+++ b/ast/ast_tester/cobe.head
@@ -0,0 +1,61 @@
+SIMPLE = T / Written by IDL: 30-Jul-1997 05:35:42.00
+BITPIX = -32 / Bits per pixel.
+NAXIS = 2 / Number of dimensions
+NAXIS1 = 300 / Length of x axis.
+NAXIS2 = 300 / Length of y axis.
+CTYPE1 = 'GLON-ZEA' / X-axis type
+CTYPE2 = 'GLAT-ZEA' / Y-axis type
+CRVAL1 = -149.56866 / Reference pixel value
+CRVAL2 = -19.758201 / Reference pixel value
+CRPIX1 = 150.500 / Reference pixel
+CRPIX2 = 150.500 / Reference pixel
+CDELT1 = -1.20000 / Degrees/pixel
+CDELT2 = 1.20000 / Degrees/pixel
+CROTA1 = 0.00000 / Rotation in degrees.
+COMMENT
+COMMENT This file was produced by the SkyView survey analysis system from
+COMMENT available astronomical surveys. The data are formatted
+COMMENT as a simple two-dimensional FITS image with the same units as
+COMMENT the orginal survey. A single ASCII table extension may be present
+COMMENT which describes catalog objects found within the field of view.
+COMMENT Copies of relevant copyright notices are included in this file.
+COMMENT
+COMMENT Questions should be directed to:
+COMMENT
+COMMENT scollick@skyview.gsfc.nasa.gov
+COMMENT or
+COMMENT mcglynn@grossc.gsfc.nasa.gov
+COMMENT
+COMMENT SkyView
+COMMENT Code 668.1
+COMMENT Goddard Space Flight Center, Greenbelt, MD 20771
+COMMENT 301-286-7780
+COMMENT
+COMMENT SkyView is supported by NASA ADP grant NAS 5-32068.
+COMMENT
+SURVEY = 'COBE DIRBE'
+BUNITS = 'MJy/sr ' /
+ORIGIN = 'CDAC ' / Cosmology Data Analysis Center
+TELESCOP= 'COBE ' / COsmic Background Explorer satellite
+INSTRUME= 'DIRBE ' / COBE instrument [DIRBE, DMR, FIRAS]
+PIXRESOL= 9 / Quad tree pixel resolution [6, 9]
+DATE = '27/09/94' / FITS file creation date (dd/mm/yy)
+DATE-MAP= '16/09/94' / Date of original file creation (dd/mm/yy)
+COMMENT COBE specific keywords
+DATE-BEG= '08/12/89' / date of initial data represented (dd/mm/yy)
+DATE-END= '25/09/90' / date of final data represented (dd/mm/yy)
+COMMENT
+COMMENT THE COBE DIRBE map is a combination of the original ten
+COMMENT band passes with the following wavelengths:
+COMMENT Band 1 - 1.25 microns
+COMMENT Band 2 - 2.2 microns
+COMMENT Band 3 - 3.5 microns
+COMMENT Band 4 - 4.9 microns
+COMMENT Band 5 - 12 microns
+COMMENT Band 6 - 25 microns
+COMMENT Band 7 - 60 microns
+COMMENT Band 8 - 100 microns
+COMMENT Band 9 - 140 microns
+COMMENT Band 10 - 240 microns
+COMMENT
+END
diff --git a/ast/ast_tester/degen1.ast b/ast/ast_tester/degen1.ast
new file mode 100644
index 0000000..202f149
--- /dev/null
+++ b/ast/ast_tester/degen1.ast
@@ -0,0 +1,318 @@
+#
+# This FrameSet has 2 axes in the Base (GRID) Frame, but 3 in the Current
+# Frame. It is used to test the ability of FitsChan to create degenerate
+# WCS axes. It represents the first DEC plane from a WAVE/RA/DEC 3D NDF.
+#
+ Begin FrameSet # Set of inter-related coordinate systems
+# Title = "3-d compound coordinate system" # Title of coordinate system
+# Naxes = 3 # Number of coordinate axes
+# Domain = "CMP" # Coordinate system domain
+# Epoch = 2003.0173483725 # Julian epoch of observation
+# Lbl1 = "Right ascension" # Label for axis 1
+# Lbl2 = "Declination" # Label for axis 2
+# Lbl3 = "Wavelength axis with no distortion" # Label for axis 3
+# System = "Compound" # Coordinate system type
+# Uni1 = "hh:mm:ss.s" # Units for axis 1
+# Uni2 = "ddd:mm:ss" # Units for axis 2
+# Uni3 = "um " # Units for axis 3
+# Dir1 = 0 # Plot axis 1 in reverse direction
+ ActUnt = 0 # Unit strings do not affect alignment
+ IsA Frame # Coordinate system description
+ Nframe = 4 # Number of Frames in FrameSet
+# Base = 1 # Index of base Frame
+ Currnt = 4 # Index of current Frame
+ Nnode = 5 # Number of nodes in FrameSet
+ Nod1 = 3 # Frame 1 is associated with node 3
+ Nod2 = 4 # Frame 2 is associated with node 4
+ Nod3 = 5 # Frame 3 is associated with node 5
+ Nod4 = 2 # Frame 4 is associated with node 2
+ Lnk2 = 1 # Node 2 is derived from node 1
+ Lnk3 = 1 # Node 3 is derived from node 1
+ Lnk4 = 1 # Node 4 is derived from node 1
+ Lnk5 = 1 # Node 5 is derived from node 1
+ Frm1 = # Frame number 1
+ Begin Frame # Coordinate system description
+ Title = "Data grid indices; first pixel at (1,1)" # Title of coordinate system
+ Naxes = 2 # Number of coordinate axes
+ Domain = "GRID" # Coordinate system domain
+# Lbl1 = "Data grid index 1" # Label for axis 1
+# Lbl2 = "Data grid index 2" # Label for axis 2
+# Uni1 = "pixel" # Units for axis 1
+# Uni2 = "pixel" # Units for axis 2
+ ActUnt = 0 # Unit strings do not affect alignment
+ Ax1 = # Axis number 1
+ Begin Axis # Coordinate axis
+ Label = "Data grid index 1" # Axis Label
+ Symbol = "g1" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ Ax2 = # Axis number 2
+ Begin Axis # Coordinate axis
+ Label = "Data grid index 2" # Axis Label
+ Symbol = "g2" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ End Frame
+ Frm2 = # Frame number 2
+ Begin Frame # Coordinate system description
+ Title = "Pixel coordinates; first pixel at (0.5,0.5)" # Title of coordinate system
+ Naxes = 2 # Number of coordinate axes
+ Domain = "PIXEL" # Coordinate system domain
+# Lbl1 = "Pixel coordinate 1" # Label for axis 1
+# Lbl2 = "Pixel coordinate 2" # Label for axis 2
+# Uni1 = "pixel" # Units for axis 1
+# Uni2 = "pixel" # Units for axis 2
+ ActUnt = 0 # Unit strings do not affect alignment
+ Ax1 = # Axis number 1
+ Begin Axis # Coordinate axis
+ Label = "Pixel coordinate 1" # Axis Label
+ Symbol = "p1" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ Ax2 = # Axis number 2
+ Begin Axis # Coordinate axis
+ Label = "Pixel coordinate 2" # Axis Label
+ Symbol = "p2" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ End Frame
+ Frm3 = # Frame number 3
+ Begin Frame # Coordinate system description
+ Title = "Axis coordinates; first pixel at (0.5,0.5)" # Title of coordinate system
+ Naxes = 2 # Number of coordinate axes
+ Domain = "AXIS" # Coordinate system domain
+# Lbl1 = "Axis 1" # Label for axis 1
+# Lbl2 = "Axis 2" # Label for axis 2
+ ActUnt = 0 # Unit strings do not affect alignment
+ Ax1 = # Axis number 1
+ Begin Axis # Coordinate axis
+ Label = "Axis 1" # Axis Label
+ Symbol = "a1" # Axis symbol
+ End Axis
+ Ax2 = # Axis number 2
+ Begin Axis # Coordinate axis
+ Label = "Axis 2" # Axis Label
+ Symbol = "a2" # Axis symbol
+ End Axis
+ End Frame
+ Frm4 = # Frame number 4
+ Begin CmpFrame # Compound coordinate system description
+# Title = "3-d compound coordinate system" # Title of coordinate system
+# Naxes = 3 # Number of coordinate axes
+# Domain = "CMP" # Coordinate system domain
+# Lbl1 = "Right ascension" # Label for axis 1
+# Lbl2 = "Declination" # Label for axis 2
+# Lbl3 = "Wavelength axis with no distortion" # Label for axis 3
+# Uni1 = "hh:mm:ss.s" # Units for axis 1
+# Uni2 = "ddd:mm:ss" # Units for axis 2
+# Uni3 = "um " # Units for axis 3
+# Dir1 = 0 # Plot axis 1 in reverse direction
+ ActUnt = 0 # Unit strings do not affect alignment
+ IsA Frame # Coordinate system description
+ Axp1 = 3 # Axis 1 permuted to use internal axis 3
+ Axp2 = 1 # Axis 2 permuted to use internal axis 1
+ Axp3 = 2 # Axis 3 permuted to use internal axis 2
+ FrameA = # First component Frame
+ Begin SkyFrame # Description of celestial coordinate system
+ Naxes = 2 # Number of coordinate axes
+ Epoch = 2003.0173483725 # Julian epoch of observation
+ System = "FK5" # Coordinate system type
+ ActUnt = 0 # Unit strings do not affect alignment
+ Ax1 = # Axis number 1
+ Begin SkyAxis # Celestial coordinate axis
+ End SkyAxis
+ Ax2 = # Axis number 2
+ Begin SkyAxis # Celestial coordinate axis
+ End SkyAxis
+ IsA Frame # Coordinate system description
+ Proj = "gnomonic" # Description of sky projection
+ Eqnox = 2000 # Julian epoch of mean equinox
+ End SkyFrame
+ FrameB = # Second component Frame
+ Begin Frame # Coordinate system description
+ Naxes = 1 # Number of coordinate axes
+ ActUnt = 0 # Unit strings do not affect alignment
+ Ax1 = # Axis number 1
+ Begin Axis # Coordinate axis
+ Label = "Wavelength axis with no distortion" # Axis Label
+ Symbol = "WAVE-WAV" # Axis symbol
+ Unit = "um " # Axis units
+ End Axis
+ End Frame
+ End CmpFrame
+ Map2 = # Mapping between nodes 1 and 2
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ Nout = 3 # Number of output coordinates
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin PermMap # Coordinate permutation
+ Nin = 2 # Number of input coordinates
+ Nout = 3 # Number of output coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Out1 = 1 # Output coordinate 1 = input coordinate 1
+ Out2 = 2 # Output coordinate 2 = input coordinate 2
+ Out3 = -1 # Output coordinate 3 = constant no. 1
+ InCpy = 1 # Input coordinates = output coordinates
+ Nconst = 1 # Number of constants
+ Con1 = 1 # Constant number 1
+ End PermMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 3 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin WinMap # Map one window on to another
+ Nin = 3 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Sft1 = -512.5 # Shift for axis 1
+ Sft2 = -480.5 # Shift for axis 2
+ Sft3 = -480.5 # Shift for axis 3
+ End WinMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 3 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin MatrixMap # Matrix transformation
+ Nin = 3 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ M0 = -0.00109 # Forward matrix value
+ M1 = 5.84161700642502e-07 # Forward matrix value
+ M2 = -5.84161700642502e-07 # Forward matrix value
+ Form = "Diagonal" # Matrix storage form
+ End MatrixMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 3 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ InvA = 1 # First Mapping used in inverse direction
+ MapA = # First component Mapping
+ Begin WcsMap # FITS-WCS sky projection
+ Nin = 3 # Number of input coordinates
+ Invert = 1 # Mapping inverted
+ IsA Mapping # Mapping between coordinate systems
+ Type = "TAN" # Gnomonic projection
+ WcsAx1 = 2 # Index of celestial longitude axis
+ WcsAx2 = 3 # Index of celestial latitude axis
+ End WcsMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 3 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin PermMap # Coordinate permutation
+ Nin = 3 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Out1 = 2 # Output coordinate 1 = input coordinate 2
+ Out2 = 3 # Output coordinate 2 = input coordinate 3
+ Out3 = 1 # Output coordinate 3 = input coordinate 1
+ In1 = 3 # Input coordinate 1 = output coordinate 3
+ In2 = 1 # Input coordinate 2 = output coordinate 1
+ In3 = 2 # Input coordinate 3 = output coordinate 2
+ End PermMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 3 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 3 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ Series = 0 # Component Mappings applied in parallel
+ MapA = # First component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ Nout = 3 # Number of output coordinates
+ IsA Mapping # Mapping between coordinate systems
+ InvA = 1 # First Mapping used in inverse direction
+ MapA = # First component Mapping
+ Begin SphMap # Cartesian to Spherical mapping
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ UntRd = 1 # All input vectors have unit length
+ End SphMap
+ MapB = # Second component Mapping
+ Begin MatrixMap # Matrix transformation
+ Nin = 3 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ M0 = 0.0122898607703168 # Forward matrix value
+ M1 = -0.231781944526882 # Forward matrix value
+ M2 = -0.972690130264301 # Forward matrix value
+ M3 = -0.00292831230784838 # Forward matrix value
+ M4 = -0.972767767862061 # Forward matrix value
+ M5 = 0.231763445771093 # Forward matrix value
+ M6 = -0.999920188969737 # Forward matrix value
+ M7 = 0 # Forward matrix value
+ M8 = -0.0126339103497717 # Forward matrix value
+ Form = "Full" # Matrix storage form
+ End MatrixMap
+ End CmpMap
+ MapB = # Second component Mapping
+ Begin SphMap # Cartesian to Spherical mapping
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ UntRd = 1 # All input vectors have unit length
+ End SphMap
+ End CmpMap
+ MapB = # Second component Mapping
+ Begin WinMap # Map one window on to another
+ Nin = 1 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ Sft1 = 1.9534 # Shift for axis 1
+ End WinMap
+ End CmpMap
+ MapB = # Second component Mapping
+ Begin PermMap # Coordinate permutation
+ Nin = 3 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ Out1 = 3 # Output coordinate 1 = input coordinate 3
+ Out2 = 1 # Output coordinate 2 = input coordinate 1
+ Out3 = 2 # Output coordinate 3 = input coordinate 2
+ In1 = 2 # Input coordinate 1 = output coordinate 2
+ In2 = 3 # Input coordinate 2 = output coordinate 3
+ In3 = 1 # Input coordinate 3 = output coordinate 1
+ End PermMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ Map3 = # Mapping between nodes 1 and 3
+ Begin UnitMap # Unit (null) Mapping
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ End UnitMap
+ Map4 = # Mapping between nodes 1 and 4
+ Begin WinMap # Map one window on to another
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ Sft1 = -0.5 # Shift for axis 1
+ Sft2 = -0.5 # Shift for axis 2
+ End WinMap
+ Map5 = # Mapping between nodes 1 and 5
+ Begin WinMap # Map one window on to another
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ Sft1 = -0.5 # Shift for axis 1
+ Sft2 = -0.5 # Shift for axis 2
+ End WinMap
+ End FrameSet
diff --git a/ast/ast_tester/degen1.fits-wcs b/ast/ast_tester/degen1.fits-wcs
new file mode 100644
index 0000000..6e5309d
--- /dev/null
+++ b/ast/ast_tester/degen1.fits-wcs
@@ -0,0 +1,40 @@
+WCSAXES = 3 / Number of WCS axes
+CRPIX1 = 1.0 / Reference pixel on axis 1
+CRPIX2 = 480.5 / Reference pixel on axis 2
+CRPIX3 = 480.5 / Reference pixel on axis 3
+CRVAL1 = 2.510935 / Value at ref. pixel on axis 1
+CRVAL2 = 166.59799 / Value at ref. pixel on axis 2
+CRVAL3 = -0.723889 / Value at ref. pixel on axis 3
+CTYPE1 = 'WAVE-WAV' / Wavelength axis with no distortion
+CTYPE2 = 'RA---TAN' / Type of co-ordinate on axis 2
+CTYPE3 = 'DEC--TAN' / Type of co-ordinate on axis 3
+CD1_1 = -0.00109 / Transformation matrix element
+CD2_2 = 3.347E-5 / Transformation matrix element
+CD3_3 = -3.347E-5 / Transformation matrix element
+CUNIT1 = 'um ' / Units for axis 1
+MJD-OBS = 52646.586 / Modified Julian Date of observation
+DATE-OBS= '2003-01-07T14:03:28.816' / Date of observation
+RADESYS = 'FK5 ' / Reference frame for RA/DEC values
+EQUINOX = 2000.0 / [yr] Epoch of reference equinox
+WCSAXESA= 2 / Number of WCS axes
+WCSNAMEA= 'PIXEL ' / Reference name for the coord. frame
+CRPIX1A = 1.0 / Reference pixel on axis 1
+CRPIX2A = 1.0 / Reference pixel on axis 2
+CRVAL1A = 0.5 / Value at ref. pixel on axis 1
+CRVAL2A = 0.5 / Value at ref. pixel on axis 2
+CTYPE1A = 'p1 ' / Pixel coordinate 1
+CTYPE2A = 'p2 ' / Pixel coordinate 2
+CD1_1A = 1.0 / Transformation matrix element
+CD2_2A = 1.0 / Transformation matrix element
+CUNIT1A = 'pixel ' / Units for axis 1
+CUNIT2A = 'pixel ' / Units for axis 2
+WCSAXESB= 2 / Number of WCS axes
+WCSNAMEB= 'AXIS ' / Reference name for the coord. frame
+CRPIX1B = 1.0 / Reference pixel on axis 1
+CRPIX2B = 1.0 / Reference pixel on axis 2
+CRVAL1B = 0.5 / Value at ref. pixel on axis 1
+CRVAL2B = 0.5 / Value at ref. pixel on axis 2
+CTYPE1B = 'a1 ' / Axis 1
+CTYPE2B = 'a2 ' / Axis 2
+CD1_1B = 1.0 / Transformation matrix element
+CD2_2B = 1.0 / Transformation matrix element
diff --git a/ast/ast_tester/doplot b/ast/ast_tester/doplot
new file mode 100755
index 0000000..f7df1ce
--- /dev/null
+++ b/ast/ast_tester/doplot
@@ -0,0 +1,53 @@
+#!/bin/tcsh
+
+ if( ! $?STARLINK ) then
+ setenv STARLINK /star
+ endif
+
+ if( ! $?AST ) then
+ setenv AST $STARLINK
+ endif
+
+ if( ! $?LDFLAGS ) then
+ setenv LDFLAGS ""
+ endif
+
+ setenv PATH $AST/bin\:$STARLINK/bin\:$PATH
+
+ gfortran -fno-second-underscore -o plotter plotter.f -fno-range-check $LDFLAGS -I$AST/include -I$STARLINK/include -L$AST/lib -L$STARLINK/lib `ast_link -pgp -ems` `pgplot_link`
+
+ set bn = $1
+ set n = "${bn}.head"
+
+ set atfile = "${bn}.attr"
+ if( -e $atfile ) then
+ set attr1 = `cat $atfile`
+ else
+ set attr1 = ' '
+ endif
+
+ set atfile = "${bn}.fattr"
+ if( -e $atfile ) then
+ set attr2 = `cat $atfile`
+ else
+ set attr2 = ' '
+ endif
+
+ set boxfile = "${bn}.box"
+ if( -e $boxfile ) then
+ set box = `cat $boxfile`
+ else
+ set box = ' '
+ endif
+
+
+ plotter $n "$attr1" "$attr2" a.ps $box
+
+ if( -e $STARLINK/bin/psmerge ) then
+ $STARLINK/bin/psmerge -t300x300 -r90 a.ps > b.ps
+ else
+ cp a.ps b.ps
+ endif
+
+ gv b.ps -orientation=landscape
+
diff --git a/ast/ast_tester/dss.ast b/ast/ast_tester/dss.ast
new file mode 100644
index 0000000..6c778c4
--- /dev/null
+++ b/ast/ast_tester/dss.ast
@@ -0,0 +1,166 @@
+ Begin FrameSet # Set of inter-related coordinate systems
+# Title = "FK5 equatorial coordinates; mean equinox J2000.0; gnomonic polynomial projection" # Title of coordinate system
+# Naxes = 2 # Number of coordinate axes
+# Domain = "SKY" # Coordinate system domain
+# Epoch = 2000 # Julian epoch of observation
+# Lbl1 = "Right ascension" # Label for axis 1
+# Lbl2 = "Declination" # Label for axis 2
+# System = "FK5" # Coordinate system type
+# Uni1 = "hh:mm:ss.s" # Units for axis 1
+# Uni2 = "ddd:mm:ss" # Units for axis 2
+# Dir1 = 0 # Plot axis 1 in reverse direction
+# Bot2 = -1.5707963267948966 # Lowest legal axis value
+# Top2 = 1.5707963267948966 # Highest legal axis value
+ IsA Frame # Coordinate system description
+ Nframe = 2 # Number of Frames in FrameSet
+ Base = 1 # Index of base Frame
+ Currnt = 2 # Index of current Frame
+ Lnk2 = 1 # Node 2 is derived from node 1
+ Frm1 = # Frame number 1
+ Begin Frame # Coordinate system description
+ Title = "Pixel Coordinates" # Title of coordinate system
+ Naxes = 2 # Number of coordinate axes
+ Domain = "GRID" # Coordinate system domain
+# Lbl1 = "Pixel axis 1" # Label for axis 1
+# Lbl2 = "Pixel axis 2" # Label for axis 2
+ Ax1 = # Axis number 1
+ Begin Axis # Coordinate axis
+ Label = "Pixel axis 1" # Axis Label
+ End Axis
+ Ax2 = # Axis number 2
+ Begin Axis # Coordinate axis
+ Label = "Pixel axis 2" # Axis Label
+ End Axis
+ End Frame
+ Frm2 = # Frame number 2
+ Begin SkyFrame # Description of celestial coordinate system
+ Ident = " " # Permanent Object identification string
+ IsA Object # AST Object
+# Title = "FK5 equatorial coordinates; mean equinox J2000.0; gnomonic polynomial projection" # Title of coordinate system
+ Naxes = 2 # Number of coordinate axes
+# Domain = "SKY" # Coordinate system domain
+ Epoch = 2000 # Julian epoch of observation
+# Lbl1 = "Right ascension" # Label for axis 1
+# Lbl2 = "Declination" # Label for axis 2
+ System = "FK5" # Coordinate system type
+# Uni1 = "hh:mm:ss.s" # Units for axis 1
+# Uni2 = "ddd:mm:ss" # Units for axis 2
+# Dir1 = 0 # Plot axis 1 in reverse direction
+# Bot2 = -1.5707963267948966 # Lowest legal axis value
+# Top2 = 1.5707963267948966 # Highest legal axis value
+ Ax1 = # Axis number 1
+ Begin SkyAxis # Celestial coordinate axis
+ End SkyAxis
+ Ax2 = # Axis number 2
+ Begin SkyAxis # Celestial coordinate axis
+ End SkyAxis
+ IsA Frame # Coordinate system description
+ Proj = "gnomonic polynomial" # Description of sky projection
+# SkyTol = 0.001 # Smallest significant separation [arc-sec]
+ Eqnox = 2000 # Julian epoch of mean equinox
+ SRefIs = "Ignored" # Not rotated (ref. pos. is ignored)
+ SRef1 = 2.8272374655684112 # Ref. pos. RA 10:47:57.3
+ SRef2 = -1.0518122540502668 # Ref. pos. Dec -60:15:52
+ End SkyFrame
+ Map2 = # Mapping between nodes 1 and 2
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin WinMap # Map one window on to another
+ Nin = 2 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Sft1 = -0.3287946560728543 # Shift for axis 1
+ Scl1 = -0.00044129690205585437 # Scale factor for axis 1
+ Sft2 = 0.38797155568647818 # Shift for axis 2
+ Scl2 = 0.00044129690205585437 # Scale factor for axis 2
+ End WinMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ InvA = 1 # First Mapping used in inverse direction
+ MapA = # First component Mapping
+ Begin WcsMap # FITS-WCS sky projection
+ Nin = 2 # Number of input coordinates
+ Invert = 1 # Mapping inverted
+ IsA Mapping # Mapping between coordinate systems
+ Type = "TPN" # Gnomonic polynomial projection
+ PV1_0 = 0.00037777813768480556 # Projection parameter 0 for axis 1
+ PV1_1 = 0.018675372165510556 # Projection parameter 1 for axis 1
+ PV1_2 = 1.4659181119170556e-05 # Projection parameter 2 for axis 1
+ PV1_4 = -5.6541834490241662e-09 # Projection parameter 4 for axis 1
+ PV1_5 = -1.6598619578175834e-10 # Projection parameter 5 for axis 1
+ PV1_6 = 3.324645548432778e-09 # Projection parameter 6 for axis 1
+ PV1_7 = 6.8029375162963896e-10 # Projection parameter 7 for axis 1
+ PV1_8 = -1.0315391309210556e-11 # Projection parameter 8 for axis 1
+ PV1_9 = 6.5770184096316667e-10 # Projection parameter 9 for axis 1
+ PV1_10 = 4.6843790588691666e-11 # Projection parameter 10 for axis 1
+ PV1_17 = 0 # Projection parameter 17 for axis 1
+ PV1_19 = 0 # Projection parameter 19 for axis 1
+ PV1_21 = 0 # Projection parameter 21 for axis 1
+ PV2_0 = 0.00020734395690532499 # Projection parameter 0 for axis 2
+ PV2_1 = 0.018675089806542779 # Projection parameter 1 for axis 2
+ PV2_2 = -1.6578391725152224e-05 # Projection parameter 2 for axis 2
+ PV2_4 = -5.1378767937980552e-09 # Projection parameter 4 for axis 2
+ PV2_5 = -1.7623932712259446e-09 # Projection parameter 5 for axis 2
+ PV2_6 = 2.7161547313251387e-10 # Projection parameter 6 for axis 2
+ PV2_7 = 7.088907407099166e-10 # Projection parameter 7 for axis 2
+ PV2_8 = 1.8432618513145277e-11 # Projection parameter 8 for axis 2
+ PV2_9 = 6.8491061989569442e-10 # Projection parameter 9 for axis 2
+ PV2_10 = 7.3325859634708332e-13 # Projection parameter 10 for axis 2
+ PV2_17 = 0 # Projection parameter 17 for axis 2
+ PV2_19 = 0 # Projection parameter 19 for axis 2
+ PV2_21 = 0 # Projection parameter 21 for axis 2
+ End WcsMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ InvA = 1 # First Mapping used in inverse direction
+ MapA = # First component Mapping
+ Begin SphMap # Cartesian to Spherical mapping
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ Invert = 1 # Mapping inverted
+ IsA Mapping # Mapping between coordinate systems
+ UntRd = 1 # All input vectors have unit length
+ PlrLg = 0 # Polar longitude (rad.s)
+ End SphMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin MatrixMap # Matrix transformation
+ Nin = 3 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ M0 = 0.82577216035104439 # Forward matrix value
+ M1 = -0.30920332196760869 # Forward matrix value
+ M2 = -0.47169232013396639 # Forward matrix value
+ M3 = -0.26848851872737706 # Forward matrix value
+ M4 = -0.95099595460979502 # Forward matrix value
+ M5 = 0.153364303628268 # Forward matrix value
+ M6 = -0.49599824042101986 # Forward matrix value
+ M7 = 0 # Forward matrix value
+ M8 = -0.86832352582390171 # Forward matrix value
+ Form = "Full" # Matrix storage form
+ End MatrixMap
+ MapB = # Second component Mapping
+ Begin SphMap # Cartesian to Spherical mapping
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ UntRd = 1 # All input vectors have unit length
+ PlrLg = 2.8272374655684112 # Polar longitude (rad.s)
+ End SphMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ End FrameSet
diff --git a/ast/ast_tester/dss.dss b/ast/ast_tester/dss.dss
new file mode 100644
index 0000000..c57a035
--- /dev/null
+++ b/ast/ast_tester/dss.dss
@@ -0,0 +1,58 @@
+CNPIX1 = 1.0 / X corner (pixels)
+CNPIX2 = 1.0 / Y corner (pixels)
+PPO1 = 0.0 / Orientation co-efficients
+PPO2 = 0.0
+PPO3 = -18825.904
+PPO4 = 0.0
+PPO5 = 0.0
+PPO6 = -22216.49
+XPIXELSZ= 25.28445 / X pixel size (microns)
+YPIXELSZ= 25.28445 / Y pixel size (microns)
+PLTRAH = 10.0 / RA at plate centre
+PLTRAM = 47.0
+PLTRAS = 57.30587
+PLTDECD = 60.0 / DEC at plate centre
+PLTDECM = 15.0
+PLTDECS = 51.85079
+PLTDECSN= '- '
+PLTSCALE= 67.230832 / Plate scale (arcsec/mm)
+AMDX1 = 67.23134 / Plate solution x co-efficients
+AMDX2 = 0.052773052
+AMDX3 = 1.3600013
+AMDX4 = -2.035506E-5
+AMDX5 = -5.975503E-7
+AMDX6 = 1.1968724E-5
+AMDX7 = 0.0
+AMDX8 = 2.4490575E-6
+AMDX9 = -3.7135409E-8
+AMDX10 = 2.3677266E-6
+AMDX11 = 1.6863765E-7
+AMDX12 = 0.0
+AMDX13 = 0.0
+AMDX14 = 0.0
+AMDX15 = 0.0
+AMDX16 = 0.0
+AMDX17 = 0.0
+AMDX18 = 0.0
+AMDX19 = 0.0
+AMDX20 = 0.0
+AMDY1 = 67.230323 / Plate solution y co-efficients
+AMDY2 = -0.05968221
+AMDY3 = 0.74643824
+AMDY4 = -1.8496356E-5
+AMDY5 = -6.3446158E-6
+AMDY6 = 9.778157E-7
+AMDY7 = 0.0
+AMDY8 = 2.5520067E-6
+AMDY9 = 6.6357427E-8
+AMDY10 = 2.4656782E-6
+AMDY11 = 2.6397309E-9
+AMDY12 = 0.0
+AMDY13 = 0.0
+AMDY14 = 0.0
+AMDY15 = 0.0
+AMDY16 = 0.0
+AMDY17 = 0.0
+AMDY18 = 0.0
+AMDY19 = 0.0
+AMDY20 = 0.0
diff --git a/ast/ast_tester/dss.fits-dss b/ast/ast_tester/dss.fits-dss
new file mode 100644
index 0000000..c728dc4
--- /dev/null
+++ b/ast/ast_tester/dss.fits-dss
@@ -0,0 +1,108 @@
+SIMPLE = T /FITS header
+BITPIX = 16 /No.Bits per pixel
+NAXIS = 2 /No.dimensions
+NAXIS1 = 530 /Length X axis
+NAXIS2 = 530 /Length Y axis
+EXTEND = T /
+DATE = '29/08/02 ' /Date of FITS file creation
+ORIGIN = 'CASB -- STScI ' /Origin of FITS image
+PLTLABEL= 'V 11596 ' /Observatory plate label
+PLATEID = '06A6 ' /GSSS Plate ID
+REGION = 'XV128 ' /GSSS Region Name
+DATE-OBS= '19/01/87 ' /UT date of Observation
+UT = '17:35:00.00 ' /UT time of observation
+EPOCH = 1.9870512695313E+03 /Epoch of plate
+PLTRAH = 10 /Plate center RA
+PLTRAM = 47 /
+PLTRAS = 5.7305870000000E+01 /
+PLTDECSN= '- ' /Plate center Dec
+PLTDECD = 60 /
+PLTDECM = 15 /
+PLTDECS = 5.1850790000000E+01 /
+EQUINOX = 2.0000000000000E+03 /Julian Reference frame equinox
+EXPOSURE= 4.0000000000000E+00 /Exposure time minutes
+BANDPASS= 6 /GSSS Bandpass code
+PLTGRADE= 1 /Plate grade
+PLTSCALE= 6.7200000000000E+01 /Plate Scale arcsec per mm
+SITELAT = '-31:16:24.00 ' /Latitude of Observatory
+SITELONG= '+149:03:42.00 ' /Longitude of Observatory
+TELESCOP= 'UK Schmidt (new optics)' /Telescope where plate taken
+CNPIX1 = 7696 /X corner (pixels)
+CNPIX2 = 7926 /Y corner
+DATATYPE= 'INTEGER*2 ' /Type of Data
+SCANIMG = 'XV128_06A6_00_00.PIM' /Name of original scan
+SCANNUM = 0 /Identifies scan of the plate
+DCHOPPED= F /Image repaired for chopping effects
+DSHEARED= F /Image repaired for shearing effects
+DSCNDNUM= 0 /Identifies descendant of plate scan image
+XPIXELSZ= 2.5284450000000E+01 /X pixel size microns
+YPIXELSZ= 2.5284450000000E+01 /Y pixel size microns
+PPO1 = 0.0000000000000E+00 /Orientation Coefficients
+PPO2 = 0.0000000000000E+00 /
+PPO3 = 1.7573793885557E+05 /
+PPO4 = 0.0000000000000E+00 /
+PPO5 = 0.0000000000000E+00 /
+PPO6 = 1.7816277576304E+05 /
+AMDX1 = 6.7231339795838E+01 /Plate solution x coefficients
+AMDX2 = 5.2773052029014E-02 /
+AMDX3 = 1.3600012956653E+00 /
+AMDX4 = -2.0355060416487E-05 /
+AMDX5 = -5.9755030481433E-07 /
+AMDX6 = 1.1968723974358E-05 /
+AMDX7 = 0.0000000000000E+00 /
+AMDX8 = 2.4490575058667E-06 /
+AMDX9 = -3.7135408713158E-08 /
+AMDX10 = 2.3677266274674E-06 /
+AMDX11 = 1.6863764611929E-07 /
+AMDX12 = 0.0000000000000E+00 /
+AMDX13 = 0.0000000000000E+00 /
+AMDX14 = 0.0000000000000E+00 /
+AMDX15 = 0.0000000000000E+00 /
+AMDX16 = 0.0000000000000E+00 /
+AMDX17 = 0.0000000000000E+00 /
+AMDX18 = 0.0000000000000E+00 /
+AMDX19 = 0.0000000000000E+00 /
+AMDX20 = 0.0000000000000E+00 /
+AMDY1 = 6.7230323303554E+01 /Plate solution y coefficients
+AMDY2 = -5.9682210210548E-02 /
+AMDY3 = 7.4643824485917E-01 /
+AMDY4 = -1.8496356457673E-05 /
+AMDY5 = -6.3446157764134E-06 /
+AMDY6 = 9.7781570327705E-07 /
+AMDY7 = 0.0000000000000E+00 /
+AMDY8 = 2.5520066665557E-06 /
+AMDY9 = 6.6357426647323E-08 /
+AMDY10 = 2.4656782316245E-06 /
+AMDY11 = 2.6397309468495E-09 /
+AMDY12 = 0.0000000000000E+00 /
+AMDY13 = 0.0000000000000E+00 /
+AMDY14 = 0.0000000000000E+00 /
+AMDY15 = 0.0000000000000E+00 /
+AMDY16 = 0.0000000000000E+00 /
+AMDY17 = 0.0000000000000E+00 /
+AMDY18 = 0.0000000000000E+00 /
+AMDY19 = 0.0000000000000E+00 /
+AMDY20 = 0.0000000000000E+00 /
+ Based on photographic data obtained using The UK Schmidt Telescope.
+ The UK Schmidt Telescope was operated by the Royal Observatory
+ Edinburgh, with funding from the UK Science and Engineering Research
+ Council, until 1988 June, and thereafter by the Anglo-Australian
+ Observatory. Original plate material is copyright (c) the Royal
+ Observatory Edinburgh and the Anglo-Australian Observatory. The
+ plates were processed into the present compressed digital form with
+ their permission. The Digitized Sky Survey was produced at the Space
+ Telescope Science Institute under US Government grant NAG W-2166.
+
+ Investigators using these scans are requested to include the above
+ acknowledgements in any publications.
+
+ Copyright (c) 1993, 1994, Association of Universities for Research in
+ Astronomy, Inc. All rights reserved.
+DATAMAX = 23833 /Maximum data value
+DATAMIN = 3673 /Minimum data value
+OBJECT = 'data ' /Object ID
+OBJCTRA = '10 44 10.340 ' /Object Right Ascension (J2000)
+OBJCTDEC= '-59 43 11.40 ' /Object Declination (J2000)
+OBJCTX = 7961.96 /Object X on plate (pixels)
+OBJCTY = 8191.07 /Object Y on plate (pixels)
+END
diff --git a/ast/ast_tester/dss.fits-wcs b/ast/ast_tester/dss.fits-wcs
new file mode 100644
index 0000000..e9896db
--- /dev/null
+++ b/ast/ast_tester/dss.fits-wcs
@@ -0,0 +1,39 @@
+WCSAXES = 2 / Number of WCS axes
+CRPIX1 = -745.0645 / Reference pixel on axis 1
+CRPIX2 = -879.1622 / Reference pixel on axis 2
+CRVAL1 = 161.98877 / Value at ref. pixel on axis 1
+CRVAL2 = -60.264403 / Value at ref. pixel on axis 2
+CTYPE1 = 'RA---TAN' / Type of co-ordinate on axis 1
+CTYPE2 = 'DEC--TAN' / Type of co-ordinate on axis 2
+CD1_1 = -0.02528445 / Transformation matrix element
+CD2_2 = 0.02528445 / Transformation matrix element
+MJD-OBS = 51544.499 / Modified Julian Date of observation
+DATE-OBS= '2000-01-01T11:58:55.816' / Date of observation
+QV1_0 = 0.00037777814 / Projection parameter
+QV1_1 = 0.018675372 / Projection parameter
+QV1_2 = 1.4659181E-5 / Projection parameter
+QV1_4 = -5.6541834E-9 / Projection parameter
+QV1_5 = -1.659862E-10 / Projection parameter
+QV1_6 = 3.3246455E-9 / Projection parameter
+QV1_7 = 6.8029375E-10 / Projection parameter
+QV1_8 = -1.0315391E-11 / Projection parameter
+QV1_9 = 6.5770184E-10 / Projection parameter
+QV1_10 = 4.6843791E-11 / Projection parameter
+QV1_17 = 0.0 / Projection parameter
+QV1_19 = 0.0 / Projection parameter
+QV1_21 = 0.0 / Projection parameter
+QV2_0 = 0.00020734396 / Projection parameter
+QV2_1 = 0.01867509 / Projection parameter
+QV2_2 = -1.6578392E-5 / Projection parameter
+QV2_4 = -5.1378768E-9 / Projection parameter
+QV2_5 = -1.7623933E-9 / Projection parameter
+QV2_6 = 2.7161547E-10 / Projection parameter
+QV2_7 = 7.0889074E-10 / Projection parameter
+QV2_8 = 1.8432619E-11 / Projection parameter
+QV2_9 = 6.8491062E-10 / Projection parameter
+QV2_10 = 7.332586E-13 / Projection parameter
+QV2_17 = 0.0 / Projection parameter
+QV2_19 = 0.0 / Projection parameter
+QV2_21 = 0.0 / Projection parameter
+RADESYS = 'FK5 ' / Reference frame for RA/DEC values
+EQUINOX = 2000.0 / [yr] Epoch of reference equinox
diff --git a/ast/ast_tester/hpx.attr b/ast/ast_tester/hpx.attr
new file mode 100644
index 0000000..496403c
--- /dev/null
+++ b/ast/ast_tester/hpx.attr
@@ -0,0 +1 @@
+border=1
diff --git a/ast/ast_tester/hpx.box b/ast/ast_tester/hpx.box
new file mode 100644
index 0000000..8b52762
--- /dev/null
+++ b/ast/ast_tester/hpx.box
@@ -0,0 +1 @@
+0.5 0.5 300.5 200.5
diff --git a/ast/ast_tester/hpx.head b/ast/ast_tester/hpx.head
new file mode 100644
index 0000000..9e82b8e
--- /dev/null
+++ b/ast/ast_tester/hpx.head
@@ -0,0 +1,10 @@
+NAXIS1 = 300
+NAXIS2 = 200
+CTYPE1 = 'GLON-HPX'
+CTYPE2 = 'GLAT-HPX'
+CRVAL1 = -149.56866
+CRVAL2 = -19.758201
+CRPIX1 = 150.500
+CRPIX2 = 100.500
+CDELT1 = -1.00000
+CDELT2 = 1.00000
diff --git a/ast/ast_tester/joye_car_headers/CAR_model.head b/ast/ast_tester/joye_car_headers/CAR_model.head
new file mode 100644
index 0000000..82a7d4e
--- /dev/null
+++ b/ast/ast_tester/joye_car_headers/CAR_model.head
@@ -0,0 +1,47 @@
+FITS headers in CAR_model.fits:
+SIMPLE = T / File conforms to NOST standard
+BITPIX = -32 / Bits per pixel
+NAXIS = 2 / No data is associated with this header
+NAXIS1 = 72 / Length of data axis 1
+NAXIS2 = 36 / Length of data axis 2
+EXTEND = T / Extensions may be present
+COMMENT FITS (Flexible Image Transport System) format is defined in 'Astronomy
+COMMENT and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H
+CTYPE1 = 'RA---CAR' / RA---%%%, %%% is the projection, e.g., AIT
+CRPIX1 = 36.5 / Reference pixel
+CRVAL1 = 266.41683 / RA at the reference pixel
+CDELT1 = -5. / X-axis incr per pixel at ref pixel (deg)
+CUNIT1 = 'deg ' / Physical unit of X-axis
+CTYPE2 = 'DEC--CAR' / DEC---%%%, %%% is the projection, e.g., AIT
+CRPIX2 = 18.5 / Reference pixel
+CRVAL2 = -29.00781 / DEC at the reference pixel
+CDELT2 = 5. / Y-axis incr per pixel at ref pixel (deg)
+CUNIT2 = 'deg ' / Physical unit of Y-axis
+CROTA2 = 0. / Image rotation (deg)
+DATE = '2011-03-16T11:50:24' /
+TELESCOP= 'GLAST ' / Name of telescope generating data
+INSTRUME= 'LAT ' / Name of instrument generating data
+EQUINOX = 2000. / Equinox of RA & DEC specifications
+CREATOR = 'gtmodel ' / Software creating file
+HISTORY $Id: LatCountsMapTemplate,v 1.2 2004/09/24 03:54:20 jc
+HISTORY hiang E
+CHECKSUM= 'AU2LCU0IAU0IAU0I' / HDU checksum updated 2011-03-16T15:51:49
+DATASUM = '2800807754' / data unit checksum updated 2011-03-16T15:51:49
+DSTYP1 = 'TIME '
+DSUNI1 = 's '
+DSVAL1 = 'TABLE '
+DSREF1 = ':GTI '
+DSTYP2 = 'ENERGY '
+DSUNI2 = 'MeV '
+DSVAL2 = '100:1000'
+DSTYP3 = 'EVENT_CLASS'
+DSUNI3 = 'dimensionless'
+DSVAL3 = '4:4 '
+DSTYP4 = 'ZENITH_ANGLE'
+DSUNI4 = 'deg '
+DSVAL4 = '0:105 '
+NDSKEYS = 4
+FILENAME= 'CAR_model.fits'
+HISTORY File modified by user 'jsperki1' with fv on 2011-03-16T12:00:29
+HISTORY File modified by user 'jsperki1' with fv on 2011-03-16T12:01:49
+END
diff --git a/ast/ast_tester/joye_car_headers/CHIPASS_Equ.head b/ast/ast_tester/joye_car_headers/CHIPASS_Equ.head
new file mode 100644
index 0000000..5356fa5
--- /dev/null
+++ b/ast/ast_tester/joye_car_headers/CHIPASS_Equ.head
@@ -0,0 +1,39 @@
+FITS headers in CHIPASS_Equ.fits:
+SIMPLE = T / file does conform to FITS standard
+BITPIX = -32 / IEEE (big-endian) 32-bit floating point data
+NAXIS = 2 / number of data axes
+NAXIS1 = 5401 / length of data axis 1
+NAXIS2 = 1741 / length of data axis 2
+EXTEND = T / FITS dataset may contain extensions
+COMMENT FITS (Flexible Image Transport System) format is defined in 'Astronomy
+COMMENT and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H
+BUNIT = 'mK ' / Using 438.5 mK/(Jy/beam) plus 3300 mK offset
+CTYPE1 = 'RA---CAR'
+CRPIX1 = 2701.
+CDELT1 = -0.0666666666666667
+CRVAL1 = 180.
+CTYPE2 = 'DEC--CAR'
+CRPIX2 = 1351.
+CDELT2 = 0.0666666666666667
+CRVAL2 = 0.
+LONPOLE = 0. / Native longitude of celestial pole
+LATPOLE = 90. / Native latitude of celestial pole
+RADESYS = 'FK5 ' / Equatorial coordinate system
+EQUINOX = 2000.0 / Equinox of equatorial coordinates
+BMAJ = 0.24000 / [deg] Beam major axis
+BMIN = 0.24000 / [deg] Beam minor axis
+BPA = 0.0 / [deg] Beam position angle
+FREQENCY= 1.3945E+09 / [Hz] Centre frequency
+BANDWID = 6.4E+07 / [Hz] Bandwidth
+DATE = '2013-04-20T13:20:39' / file creation date (YYYY-MM-DDThh:mm:ss UT)
+COMMENT ------------------------------------------------------------------------
+COMMENT This file contains a 1.4 GHz continuum map of the sky south of dec +26
+COMMENT produced from HIPASS and ZOA data. These surveys were undertaken with
+COMMENT the 13-beam multibeam system on the Parkes radio telescope.
+COMMENT Details may be found in the following paper:
+COMMENT Calabretta, M.R., Staveley-Smith, L., and Barnes, D.G., (2013)
+COMMENT PASA (in preparation).
+COMMENT ------------------------------------------------------------------------
+COMMENT THIS IS A PRE-PUBLICATION IMAGE, FOR RESTRICTED DISTRIBUTION ONLY
+COMMENT ------------------------------------------------------------------------
+END
diff --git a/ast/ast_tester/joye_car_headers/car1.fattr b/ast/ast_tester/joye_car_headers/car1.fattr
new file mode 100644
index 0000000..5f408d2
--- /dev/null
+++ b/ast/ast_tester/joye_car_headers/car1.fattr
@@ -0,0 +1 @@
+carlin=1
diff --git a/ast/ast_tester/joye_car_headers/car1.head b/ast/ast_tester/joye_car_headers/car1.head
new file mode 100644
index 0000000..bec8d59
--- /dev/null
+++ b/ast/ast_tester/joye_car_headers/car1.head
@@ -0,0 +1,32 @@
+SIMPLE = T / Standard FITS format
+BITPIX = 16 / Bits per pixel
+NAXIS = 2 / Number of axes
+NAXIS1 = 2961 / Number pixels on axis 1
+NAXIS2 = 561 / Number pixels on axis 2
+CTYPE1 = 'GLON-CAR' / axis 1 coord type
+CRVAL1 = 1.850000e+02 / coord value at CRPIX1
+CDELT1 = -1.250000e-01 / pixel spacing for axis 1
+CRPIX1 = 1.000000 / ref pixel for axis 1
+CTYPE2 = 'GLAT-CAR' / axis 2 coord type
+CRVAL2 = -3.500000e+01 / coord value at CRPIX2
+CDELT2 = 1.250000e-01 / pixel spacing for axis 2
+CRPIX2 = 1.000000 / ref pixel for axis 2
+BSCALE = 2.610167e-02 / real = int*bscale + bzero
+BZERO = 8.321995e+02 /
+DATAMIN = -6.326761e+00 / minimum real value
+DATAMAX = 1.670731e+03 / maximum real value
+BLANK = -32768 / missing data flag
+COMMENT PARENT DISK FILE: Wco_DHT2001.fits
+COMMENT temp =colscales( CHANGE-ME , -185.0000, 185.0000)
+COMMENT coords=rowscales( temp, 35.0000, -35.0000)
+COMMENT Written by MacFITS
+COMMENT Created: Tuesday, 14 August, 2001 01:18:06 PM
+COMMENT Whole-Galaxy velocity-integrated CO(1-0) map (Fig. 2) from
+COMMENT "The Milky Way in Molecular Clouds: A New Complete CO Survey"
+COMMENT T. M. Dame, Dap Hartmann, & P. Thaddeus (2001), ApJ, 547, 792.
+COMMENT WARNING: Both the angular resolution and the sensitivity varies
+COMMENT from region to region in this map: see Fig. 1 and Table 1 from
+COMMENT the paper above. Moment masking and clipping were used as
+COMMENT necessary to keep the noise in the map below ~1.5 K km/s.
+COMMENT See Section 2.2 for details.
+END
diff --git a/ast/ast_tester/joye_car_headers/car2.fattr b/ast/ast_tester/joye_car_headers/car2.fattr
new file mode 100644
index 0000000..5f408d2
--- /dev/null
+++ b/ast/ast_tester/joye_car_headers/car2.fattr
@@ -0,0 +1 @@
+carlin=1
diff --git a/ast/ast_tester/joye_car_headers/car2.head b/ast/ast_tester/joye_car_headers/car2.head
new file mode 100644
index 0000000..bec8d59
--- /dev/null
+++ b/ast/ast_tester/joye_car_headers/car2.head
@@ -0,0 +1,32 @@
+SIMPLE = T / Standard FITS format
+BITPIX = 16 / Bits per pixel
+NAXIS = 2 / Number of axes
+NAXIS1 = 2961 / Number pixels on axis 1
+NAXIS2 = 561 / Number pixels on axis 2
+CTYPE1 = 'GLON-CAR' / axis 1 coord type
+CRVAL1 = 1.850000e+02 / coord value at CRPIX1
+CDELT1 = -1.250000e-01 / pixel spacing for axis 1
+CRPIX1 = 1.000000 / ref pixel for axis 1
+CTYPE2 = 'GLAT-CAR' / axis 2 coord type
+CRVAL2 = -3.500000e+01 / coord value at CRPIX2
+CDELT2 = 1.250000e-01 / pixel spacing for axis 2
+CRPIX2 = 1.000000 / ref pixel for axis 2
+BSCALE = 2.610167e-02 / real = int*bscale + bzero
+BZERO = 8.321995e+02 /
+DATAMIN = -6.326761e+00 / minimum real value
+DATAMAX = 1.670731e+03 / maximum real value
+BLANK = -32768 / missing data flag
+COMMENT PARENT DISK FILE: Wco_DHT2001.fits
+COMMENT temp =colscales( CHANGE-ME , -185.0000, 185.0000)
+COMMENT coords=rowscales( temp, 35.0000, -35.0000)
+COMMENT Written by MacFITS
+COMMENT Created: Tuesday, 14 August, 2001 01:18:06 PM
+COMMENT Whole-Galaxy velocity-integrated CO(1-0) map (Fig. 2) from
+COMMENT "The Milky Way in Molecular Clouds: A New Complete CO Survey"
+COMMENT T. M. Dame, Dap Hartmann, & P. Thaddeus (2001), ApJ, 547, 792.
+COMMENT WARNING: Both the angular resolution and the sensitivity varies
+COMMENT from region to region in this map: see Fig. 1 and Table 1 from
+COMMENT the paper above. Moment masking and clipping were used as
+COMMENT necessary to keep the noise in the map below ~1.5 K km/s.
+COMMENT See Section 2.2 for details.
+END
diff --git a/ast/ast_tester/joye_car_headers/car3.head b/ast/ast_tester/joye_car_headers/car3.head
new file mode 100644
index 0000000..de6c76e
--- /dev/null
+++ b/ast/ast_tester/joye_car_headers/car3.head
@@ -0,0 +1,8 @@
+CTYPE1 = 'GLON-CAR'
+CRVAL1 = 1.850000e+02
+CDELT1 = -1.250000e-01
+CRPIX1 = 200.000000
+CTYPE2 = 'GLAT-CAR'
+CRVAL2 = -3.500000e+01
+CDELT2 = 1.250000e-01
+CRPIX2 = 200.000000
diff --git a/ast/ast_tester/joye_car_headers/car4.fattr b/ast/ast_tester/joye_car_headers/car4.fattr
new file mode 100644
index 0000000..5f408d2
--- /dev/null
+++ b/ast/ast_tester/joye_car_headers/car4.fattr
@@ -0,0 +1 @@
+carlin=1
diff --git a/ast/ast_tester/joye_car_headers/car4.head b/ast/ast_tester/joye_car_headers/car4.head
new file mode 100644
index 0000000..95cd97a
--- /dev/null
+++ b/ast/ast_tester/joye_car_headers/car4.head
@@ -0,0 +1,38 @@
+SIMPLE = T / Written by IDL: Thu Apr 27 08:52:27 2000
+BITPIX = -32 /
+NAXIS = 2 /
+NAXIS1 = 951 /
+NAXIS2 = 1851 /
+CRPIX1 = 211076.0 /
+CRVAL1 = 0.000000000 /
+CTYPE1 = 'GLON-CAR' /
+CRPIX2 = 475.39400 /
+CRVAL2 = 0.000000000 /
+CTYPE2 = 'GLAT-CAR' /
+CROTA2 = 0.000000000 /
+LONPOLE = 0.00000 / Defined by Greisen and Calabretta
+CD1_1 = -0.0016666667 /
+CD1_2 = 0.00000 /
+CD2_1 = 0.00000 /
+CD2_2 = 0.0016666667 /
+WAVELENG= 8.28000e-06 / Isophotal wavelength in meters
+BUNIT = 'W/m^2-sr' /
+SECURITY= 'Unclassified' /
+TELESCOP= 'MSX ' /
+INSTRUME= 'SPIRITIII' /
+ORIGIN = 'AFRL-VSBC' /
+MJD-OBS = 50295.5 / Mean modified Julian date of observation
+DATE = '16/02/2000' / Date of file generation
+HISTORY Convert Version 6.2.X
+HISTORY Level-2A Deshadow Version 4.0
+HISTORY Level-2A Saturation Correction Version 1.0
+HISTORY Pointing Convert Version 6.0.1
+HISTORY Makeimage Version 3.2
+HISTORY Destriped
+HISTORY Data collected in J2000 FK5 coordinates
+HISTORY Data samples transformed to Galactic coordinates
+HISTORY and convolved onto image grid using sigma=3.0 arcsec
+HISTORY Gaussian kernel
+HISTORY Master Plate: GP_351.0_+0.0_A.fits
+HISTORY Written by IDL: 28-Jan-2000 17:44:54.00
+END
diff --git a/ast/ast_tester/joye_car_headers/car5.head b/ast/ast_tester/joye_car_headers/car5.head
new file mode 100644
index 0000000..2be3a64
--- /dev/null
+++ b/ast/ast_tester/joye_car_headers/car5.head
@@ -0,0 +1,38 @@
+SIMPLE = T / Written by IDL: Thu Apr 27 08:52:27 2000
+BITPIX = -32 /
+NAXIS = 2 /
+NAXIS1 = 951 /
+NAXIS2 = 1851 /
+CRPIX1 = -4932.0204 /
+CRVAL1 = 0.000000000 /
+CTYPE1 = 'GLON-CAR' /
+CRPIX2 = 475.39400 /
+CRVAL2 = 0.000000000 /
+CTYPE2 = 'GLAT-CAR' /
+CROTA2 = 0.000000000 /
+LONPOLE = 0.00000 / Defined by Greisen and Calabretta
+CD1_1 = -0.0016666667 /
+CD1_2 = 0.00000 /
+CD2_1 = 0.00000 /
+CD2_2 = 0.0016666667 /
+WAVELENG= 8.28000e-06 / Isophotal wavelength in meters
+BUNIT = 'W/m^2-sr' /
+SECURITY= 'Unclassified' /
+TELESCOP= 'MSX ' /
+INSTRUME= 'SPIRITIII' /
+ORIGIN = 'AFRL-VSBC' /
+MJD-OBS = 50295.5 / Mean modified Julian date of observation
+DATE = '16/02/2000' / Date of file generation
+HISTORY Convert Version 6.2.X
+HISTORY Level-2A Deshadow Version 4.0
+HISTORY Level-2A Saturation Correction Version 1.0
+HISTORY Pointing Convert Version 6.0.1
+HISTORY Makeimage Version 3.2
+HISTORY Destriped
+HISTORY Data collected in J2000 FK5 coordinates
+HISTORY Data samples transformed to Galactic coordinates
+HISTORY and convolved onto image grid using sigma=3.0 arcsec
+HISTORY Gaussian kernel
+HISTORY Master Plate: GP_351.0_+0.0_A.fits
+HISTORY Written by IDL: 28-Jan-2000 17:44:54.00
+END
diff --git a/ast/ast_tester/joye_car_headers/cmap_3years_GP_D2.head b/ast/ast_tester/joye_car_headers/cmap_3years_GP_D2.head
new file mode 100644
index 0000000..d27e368
--- /dev/null
+++ b/ast/ast_tester/joye_car_headers/cmap_3years_GP_D2.head
@@ -0,0 +1,162 @@
+FITS headers in cmap_3years_GP_D2.fits:
+SIMPLE = T / File conforms to NOST standard
+BITPIX = 32 / Bits per pixel
+NAXIS = 2 / No data is associated with this header
+NAXIS1 = 1800 / Length of data axis 1
+NAXIS2 = 500 / Length of data axis 2
+EXTEND = T / Extensions may be present
+COMMENT FITS (Flexible Image Transport System) format is defined in 'Astronomy
+COMMENT and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H
+CTYPE1 = 'GLON-CAR' / RA---%%%, %%% represents the projection method
+CRPIX1 = 900.5 / Reference pixel
+CRVAL1 = 0. / RA at the reference pixel
+CDELT1 = -0.2 / X-axis incr per pixel of physical coord at posi
+CUNIT1 = 'deg ' / Physical unit of X-axis
+CTYPE2 = 'GLAT-CAR' / DEC---%%%, %%% represents the projection method
+CRPIX2 = 250.5 / Reference pixel
+CRVAL2 = 0. / DEC at the reference pixel
+CDELT2 = 0.2 / Y-axis incr per pixel of physical coord at posi
+CUNIT2 = 'deg ' / Physical unit of Y-axis
+CROTA2 = 0. / Image rotation (deg)
+DATE = '2011-11-18T09:38:44' / file creation date (YYYY-MM-DDThh:mm:ss U
+FILENAME= 'cmap_3years_GP_D2.fits' /
+TELESCOP= 'GLAST ' / name of telescope generating data
+INSTRUME= 'LAT ' / name of instrument generating data
+DATE-OBS= '2008-08-04T15:43:37.6089' / start date and time of the observation (U
+DATE-END= '2011-07-31T23:59:59.0000' / end date and time of the observation (UTC
+TIMEUNIT= 's ' / units for the time related keywords
+TIMEZERO= 0. / clock correction
+TIMESYS = 'TT ' / type of time system that is used
+TIMEREF = 'LOCAL ' / reference frame used for times
+CLOCKAPP= F / whether a clock drift correction has been appli
+GPS_OUT = F / whether GPS time was unavailable at any time du
+NDSKEYS = 5
+EQUINOX = 2000. / Equinox of RA & DEC specifications
+OBSERVER= 'Peter Michelson' / GLAST/LAT PI
+CREATOR = 'gtbin ' / Software and version creating file
+HISTORY LatCountMapTemplate,v 1.3 2005/04/05 21:06:39 peachey
+HISTORY Exp
+CHECKSUM= 'HG8SH95PHE5PH95P' / HDU checksum updated 2011-11-18T08:38:44
+DATASUM = '3748023 ' / data unit checksum updated 2011-11-18T08:38:44
+DSTYP1 = 'TIME '
+DSUNI1 = 's '
+DSVAL1 = 'TABLE '
+DSREF1 = ':GTI '
+DSTYP2 = 'CONVERSION_TYPE'
+DSUNI2 = 'dimensionless'
+DSVAL2 = '1:1 '
+DSTYP3 = 'ENERGY '
+DSUNI3 = 'MeV '
+DSVAL3 = '2000:10000'
+DSTYP4 = 'EVENT_CLASS'
+DSUNI4 = 'dimensionless'
+DSVAL4 = '4: '
+DSTYP5 = 'ZENITH_ANGLE'
+DSUNI5 = 'deg '
+DSVAL5 = '0:100 '
+HISTORY The following history was copied from input files by gtbin
+HISTORY ------------------------------------------------------------------------
+HISTORY BEGIN history copied from ft1_D2_Front.fits[EVENTS]
+HISTORY ------------------------------------------------------------------------
+HISTORY Input merit file: /scratch/glastmp/P120-FT1/128/r0240311566_v120_merit.r
+HISTORY oot
+HISTORY Filter string: (FT1EventClass!=0) && (EvtElapsedTime >= 240311568) && (
+HISTORY EvtElapsedTime <= 240314221)
+HISTORY CFITSIO used the following filtering expression to create this table:
+HISTORY /scratch/glastmp/P120-FT1/128/foo.fit[EVENTS][gtifilter("/scratch/glastm
+HISTORY p/P120-FT1/128/gll_xp_p120_r0240311566_v122.fit_tempgti")]
+HISTORY CFITSIO used the following filtering expression to create this table:
+HISTORY data/august_08-ft1.fits[EVENTS][100 <= ENERGY && ENERGY <= 1000000 && 4
+HISTORY <= EVENT_CLASS && 0 <= TIME && TIME <= 1000000000 && 0 <= ZENITH_ANGLE &
+HISTORY & ZENITH_ANGLE <= 100 && gtifilter()]
+HISTORY Filter string: 100 <= ENERGY && ENERGY <= 1000000 && 4 <= EVENT_CLASS &&
+HISTORY 0 <= TIME && TIME <= 1000000000 && 0 <= ZENITH_ANGLE && ZENITH_ANGLE <=
+HISTORY 100 && gtifilter()
+HISTORY CFITSIO used the following filtering expression to create this table:
+HISTORY data/august_08_z100_ft1.fits[EVENTS][gtifilter("data/august_08-ft1.fits_
+HISTORY rocking_tempgti")]
+HISTORY Filter string: 0 <= CONVERSION_TYPE && CONVERSION_TYPE <= 0 && 1000 <= E
+HISTORY NERGY && ENERGY <= 5000 && 4 <= EVENT_CLASS && 0 <= TIME && TIME <= 1000
+HISTORY 000000 && 0 <= ZENITH_ANGLE && ZENITH_ANGLE <= 100 && gtifilter()
+HISTORY ------------------------------------------------------------------------
+HISTORY END copied history
+HISTORY ------------------------------------------------------------------------
+HISTORY ------------------------------------------------------------------------
+HISTORY BEGIN history copied from ft1_D2_Back.fits[EVENTS]
+HISTORY ------------------------------------------------------------------------
+HISTORY Input merit file: /scratch/glastmp/P120-FT1/128/r0240311566_v120_merit.r
+HISTORY oot
+HISTORY Filter string: (FT1EventClass!=0) && (EvtElapsedTime >= 240311568) && (
+HISTORY EvtElapsedTime <= 240314221)
+HISTORY CFITSIO used the following filtering expression to create this table:
+HISTORY /scratch/glastmp/P120-FT1/128/foo.fit[EVENTS][gtifilter("/scratch/glastm
+HISTORY p/P120-FT1/128/gll_xp_p120_r0240311566_v122.fit_tempgti")]
+HISTORY CFITSIO used the following filtering expression to create this table:
+HISTORY data/august_08-ft1.fits[EVENTS][100 <= ENERGY && ENERGY <= 1000000 && 4
+HISTORY <= EVENT_CLASS && 0 <= TIME && TIME <= 1000000000 && 0 <= ZENITH_ANGLE &
+HISTORY & ZENITH_ANGLE <= 100 && gtifilter()]
+HISTORY Filter string: 100 <= ENERGY && ENERGY <= 1000000 && 4 <= EVENT_CLASS &&
+HISTORY 0 <= TIME && TIME <= 1000000000 && 0 <= ZENITH_ANGLE && ZENITH_ANGLE <=
+HISTORY 100 && gtifilter()
+HISTORY CFITSIO used the following filtering expression to create this table:
+HISTORY data/august_08_z100_ft1.fits[EVENTS][gtifilter("data/august_08-ft1.fits_
+HISTORY rocking_tempgti")]
+HISTORY Filter string: 1 <= CONVERSION_TYPE && CONVERSION_TYPE <= 1 && 2000 <= E
+HISTORY NERGY && ENERGY <= 10000 && 4 <= EVENT_CLASS && 0 <= TIME && TIME <= 100
+HISTORY 0000000 && 0 <= ZENITH_ANGLE && ZENITH_ANGLE <= 100 && gtifilter()
+HISTORY ------------------------------------------------------------------------
+HISTORY END copied history
+HISTORY ------------------------------------------------------------------------
+END
+XTENSION= 'BINTABLE' / Binary table extension
+BITPIX = 8 / Bits per pixel
+NAXIS = 2 / Required value
+NAXIS1 = 16 / Number of bytes per row
+NAXIS2 = 17159 / Number of rows
+PCOUNT = 0 / Normally 0 (no varying arrays)
+GCOUNT = 1 / Required value
+TFIELDS = 2 / Number of columns in table
+TTYPE1 = 'START ' / Start time of an interval
+TFORM1 = 'D ' / Data format of this field
+TTYPE2 = 'STOP ' / Stop time of an interval
+TFORM2 = 'D ' / Data format of this field
+EXTNAME = 'GTI ' / Extension name
+TELESCOP= 'GLAST ' / name of telescope generating data
+INSTRUME= 'LAT ' / name of instrument generating data
+MJDREFI = 51910. / Integer part of MJD corresponding to SC clock s
+MJDREFF = '7.428703703703703D-4' / Fractional part of MJD corresponding to SC c
+TSTART = 239557418.608944 / mission time of the start of the observation
+TSTOP = 333849601. / mission time of the end of the observation
+EXPOSURE= 69878014.2344566 / Integration time (in seconds) for the PHA data
+HDUCLASS= 'OGIP ' / File format is OGIP standard
+HDUCLAS1= 'GTI ' / Contains Good Time Intervals
+HDUVERS = '1.2.0 ' / Version of file format
+DATE-OBS= '2008-08-04T15:43:37.6089' / start date and time of the observation (U
+DATE-END= '2011-07-31T23:59:59.0000' / end date and time of the observation (UTC
+TIMEUNIT= 's ' / units for the time related keywords
+TIMEZERO= 0. / clock correction
+TIMESYS = 'TT ' / type of time system that is used
+TIMEREF = 'LOCAL ' / reference frame used for times
+CLOCKAPP= F / whether a clock drift correction has been appli
+GPS_OUT = F / whether GPS time was unavailable at any time du
+CREATOR = 'gtbin ' / Software and version creating file
+HISTORY LatCountMapTemplate,v 1.3 2005/04/05 21:06:39 peachey
+HISTORY Exp
+
+
+
+
+TUNIT1 = 's ' / Unit of this field
+
+TUNIT2 = 's ' / Unit of this field
+EXTVER = 1 / auto assigned by template parser
+CHECKSUM= 'S4FDU3FBS3FBS3FB' / HDU checksum updated 2011-11-18T08:38:44
+DATASUM = '1639695499' / data unit checksum updated 2011-11-18T08:38:44
+HISTORY The following history was copied from input files by gtbin
+HISTORY ------------------------------------------------------------------------
+HISTORY No history available in ft1_D2_Front.fits[GTI]
+HISTORY ------------------------------------------------------------------------
+HISTORY ------------------------------------------------------------------------
+HISTORY No history available in ft1_D2_Back.fits[GTI]
+HISTORY ------------------------------------------------------------------------
+END
diff --git a/ast/ast_tester/joye_car_headers/doit b/ast/ast_tester/joye_car_headers/doit
new file mode 100755
index 0000000..a78a590
--- /dev/null
+++ b/ast/ast_tester/joye_car_headers/doit
@@ -0,0 +1,17 @@
+#!/bin/tcsh
+
+foreach n (*.head)
+ set bn = `basename $n .head`
+ echo "Doing $bn"
+
+ set fat = "${bn}.fattr"
+ if( -e "$fat" ) then
+ set fattr = `cat $fat`
+ else
+ set fattr = ""
+ endif
+
+ $HOME/work/ast/fplottest $n ps_l "$fattr" n
+ mv gks74.ps ${bn}.ps
+end
+
diff --git a/ast/ast_tester/joye_car_headers/total_hi.head b/ast/ast_tester/joye_car_headers/total_hi.head
new file mode 100644
index 0000000..2ed691c
--- /dev/null
+++ b/ast/ast_tester/joye_car_headers/total_hi.head
@@ -0,0 +1,35 @@
+SIMPLE = T
+BITPIX = -32
+NAXIS = 2
+NAXIS1 = 721
+NAXIS2 = 361
+BUNIT = 'K km/s '
+DATAMAX = 11847.260742187500
+DATAMIN = -368.407501220703
+BZERO = 0.000000000000
+BSCALE = 1.000000000000
+BLANK = -32768
+OBJECT = 'Leiden/Dwingeloo HI Survey; (l,b) total HI'
+TELESCOP= 'Dwingeloo 25-m'
+OBSERVER= 'Dap Hartmann'
+DATE-OBS= '02/09/93'
+DATE = '20/01/96'
+CTYPE1 = 'GLON-CAR'
+CRVAL1 = 360.000000000000
+CRPIX1 = 1
+CDELT1 = -0.500000000000
+CTYPE2 = 'GLAT-CAR'
+CRVAL2 = -90.000000000000
+CRPIX2 = 1
+CDELT2 = 0.500000000000
+COMMENT = +-------------------------------------------------------------+
+COMMENT = | (l,b) map, integrated between -450 km/s < V_lsr < +400 km/s |
+COMMENT = | To Convert to N_HI, multiply by 1.8224e18 K km s^-1 cm^-2 |
+COMMENT = +-------------------------------------------------------------+
+COMMENT =
+COMMENT = +-------------------------------------------------+
+COMMENT = | The Leiden/Dwingeloo Survey of HI in the Galaxy |
+COMMENT = | Dap Hartmann & W.B.Burton |
+COMMENT = | Leiden Observatory |
+COMMENT = | Cambridge University Press 1997 |
+END
diff --git a/ast/ast_tester/longslit.fits-pc b/ast/ast_tester/longslit.fits-pc
new file mode 100644
index 0000000..2adf05a
--- /dev/null
+++ b/ast/ast_tester/longslit.fits-pc
@@ -0,0 +1,18 @@
+NAXIS = 3
+NAXIS1 = 1024
+NAXIS2 = 2048
+NAXIS3 = 1
+CRPIX1 = 1
+CRPIX2 = 1024.5
+CRPIX3 = 1
+CDELT1 = 100.0 / delta lambda = 100 nm
+CDELT2 = -0.0005555555 / sigma = 2 arcsec
+CDELT3 = 1
+CTYPE1 = 'WAVE '
+CTYPE2 = 'RA---ARC'
+CTYPE3 = 'DEC--ARC'
+CUNIT1 = 'nm '
+CRVAL1 = 1000.0 / Lambda-ref = 1000 nm
+CRVAL2 = 150.000 / RA-ref = 150 deg (10:00:00)
+CRVAL3 = -35.0 / Dec-ref = -35:00:00
+LONPOLE = 120.0 / rho = 30 degs
diff --git a/ast/ast_tester/longslit.fits-wcs b/ast/ast_tester/longslit.fits-wcs
new file mode 100644
index 0000000..cff2ca0
--- /dev/null
+++ b/ast/ast_tester/longslit.fits-wcs
@@ -0,0 +1,22 @@
+NAXIS = 3
+NAXIS1 = 1024
+NAXIS2 = 2048
+NAXIS3 = 1
+CRPIX1 = 1.0 / Reference pixel on axis 1
+CRPIX2 = 1024.5 / Reference pixel on axis 2
+CRPIX3 = 1.0 / Reference pixel on axis 3
+CTYPE1 = 'WAVE ' / Type of co-ordinate on axis 1
+CTYPE2 = 'RA---ARC' / Type of co-ordinate on axis 2
+CTYPE3 = 'DEC--ARC' / Type of co-ordinate on axis 3
+CUNIT1 = 'nm ' / Units for axis 1
+CRVAL1 = 1000.0 / Lambda-ref = 1000 nm
+CRVAL2 = 150.0 / RA-ref = 150 deg (10:00:00)
+CRVAL3 = -35.0 / Dec-ref = -35:00:00
+LONPOLE = 120.0 / rho = 30 degs
+CD1_1 = 100.0 / Transformation matrix element
+CD2_2 = -5.555555E-4 / Transformation matrix element
+CD3_3 = 1.0 / Transformation matrix element
+PV2_3 = 120.0 / Projection parameter
+RADESYS = 'ICRS ' / Reference frame for RA/DEC values
+SPECSYS = 'HELIOCEN' / Standard of rest for spectral axis
+VELOSYS = -20038.807 / [m/s] Topo. apparent velocity of rest frame
diff --git a/ast/ast_tester/makeplot b/ast/ast_tester/makeplot
new file mode 100755
index 0000000..760fac9
--- /dev/null
+++ b/ast/ast_tester/makeplot
@@ -0,0 +1,47 @@
+#!/bin/tcsh
+
+if( "$1" == "" ) then
+ echo "Usage: makeplot <plot>"
+ echo " (e.g. makeplot serpens)"
+ exit
+endif
+
+gfortran -fno-second-underscore -w -g -fno-range-check -o plotter plotter.f \
+ -I$GITSTAR/include -L$GITSTAR/lib `ast_link -pgp -ems` `pgplot_link`
+
+set bn = $1
+
+set atfile = "${bn}.attr"
+if( -e $atfile ) then
+ set attr1 = `cat $atfile`
+else
+ set attr1 = ' '
+endif
+
+set atfile = "${bn}.fattr"
+if( -e $atfile ) then
+ set attr2 = `cat $atfile`
+else
+ set attr2 = ' '
+endif
+
+set boxfile = "${bn}.box"
+if( -e $boxfile ) then
+ set box = `cat $boxfile`
+else
+ set box = ' '
+endif
+
+
+set psfile = "${bn}-new.ps"
+echo "plotter $bn.head '$attr1' '$attr2' a.ps $box"
+plotter $bn.head "$attr1" "$attr2" a.ps $box
+
+if( -e $GITSTAR/bin/psmerge ) then
+ $GITSTAR/bin/psmerge -t300x300 -r90 a.ps > $psfile
+else
+ cp a.ps $psfile
+endif
+
+gv $psfile -orientation=landscape
+
diff --git a/ast/ast_tester/maketest b/ast/ast_tester/maketest
new file mode 100755
index 0000000..5891121
--- /dev/null
+++ b/ast/ast_tester/maketest
@@ -0,0 +1,35 @@
+#!/bin/tcsh
+
+if( "$1" == "" ) then
+ echo "Usage: maketest <test>"
+ echo " (e.g. maketest regions)"
+ exit
+endif
+
+if( ! $?LDFLAGS ) then
+ setenv LDFLAGS ""
+endif
+
+set a = "test$1"
+
+echo "Building $a"
+if( "$a" == "testplot3d" ) then
+ gfortran -fno-second-underscore -w -g -fno-range-check $LDFLAGS -o testplot3d testplot3d.f \
+ -L$GITSTAR/lib -I$GITSTAR/include \
+ `ast_link -ems -pgplot3d` `sla_link` `chr_link` `err_link`
+
+else if( -e "$a.f" ) then
+ gfortran -fno-second-underscore -w -g -fno-range-check $LDFLAGS -o $a $a.f -L$GITSTAR/lib -I$GITSTAR/include \
+ `ast_link -ems` `chr_link` `err_link` `prm_link` `psx_link`
+
+else if( -e "$a.c" ) then
+ gcc -o $a -g $a.c -I.. -DHAVE_CONFIG_H -L$GITSTAR/lib $LDFLAGS `ast_link`
+
+else
+ echo "Cannot find $a.f or $a.c"
+
+endif
+
+echo "Running $a"
+$a
+
diff --git a/ast/ast_tester/origin.attr b/ast/ast_tester/origin.attr
new file mode 100644
index 0000000..277e359
--- /dev/null
+++ b/ast/ast_tester/origin.attr
@@ -0,0 +1 @@
+format(1)=ghms,format(2)=gdm,edge(2)=r,tickall=0,grid=1
diff --git a/ast/ast_tester/origin.box b/ast/ast_tester/origin.box
new file mode 100644
index 0000000..9b5eb80
--- /dev/null
+++ b/ast/ast_tester/origin.box
@@ -0,0 +1 @@
+0 0 500 500
diff --git a/ast/ast_tester/origin.head b/ast/ast_tester/origin.head
new file mode 100644
index 0000000..88ea783
--- /dev/null
+++ b/ast/ast_tester/origin.head
@@ -0,0 +1,18 @@
+SIMPLE = T / file does conform to FITS standard
+BITPIX = 16 / number of bits per data pixel
+NAXIS = 2 / number of data axes
+NAXIS1 = 500 / length of data axis 1
+NAXIS2 = 500 / length of data axis 2
+EPOCH = 1.977780E+03 / Epoch of observation
+RADECSYS= 'ICRS ' / Reference frame for RA/DEC in original file
+CRVAL1 = 0.0 / Axis 1 reference value
+CRPIX1 = 250 / Axis 1 pixel value
+CTYPE1 = 'RA---ARC' / Quantity represented by axis 1
+CRVAL2 = 0.0 / Axis 2 reference value
+CRPIX2 = 250 / Axis 2 pixel value
+CTYPE2 = 'DEC--ARC' / Quantity represented by axis 2
+CDELT1 = 0.001 / Co-ordinate transformation matrix
+CDELT2 = 0.001 / Co-ordinate transformation matrix
+EQUINOX = 2.000000E+03 / Julian reference frame equinox
+
+END
diff --git a/ast/ast_tester/plot3d-test1.ast b/ast/ast_tester/plot3d-test1.ast
new file mode 100644
index 0000000..271faf1
--- /dev/null
+++ b/ast/ast_tester/plot3d-test1.ast
@@ -0,0 +1,340 @@
+ Begin FrameSet # Set of inter-related coordinate systems
+# Title = "3-d compound coordinate system" # Title of coordinate system
+# Naxes = 3 # Number of coordinate axes
+# Domain = "SKY-DSBSPECTRUM" # Coordinate system domain
+# Epoch = 2007.3268594222 # Julian epoch of observation
+# Lbl1 = "Right ascension" # Label for axis 1
+# Lbl2 = "Declination" # Label for axis 2
+# Lbl3 = "Radio velocity (USB)" # Label for axis 3
+# System = "Compound" # Coordinate system type
+# Uni1 = "hh:mm:ss.s" # Units for axis 1
+# Uni2 = "ddd:mm:ss" # Units for axis 2
+# Uni3 = "km/s" # Units for axis 3
+# Dir1 = 0 # Plot axis 1 in reverse direction
+ IsA Frame # Coordinate system description
+ Nframe = 4 # Number of Frames in FrameSet
+# Base = 1 # Index of base Frame
+ Currnt = 4 # Index of current Frame
+ Nnode = 5 # Number of nodes in FrameSet
+ Nod1 = 3 # Frame 1 is associated with node 3
+ Nod2 = 4 # Frame 2 is associated with node 4
+ Nod3 = 5 # Frame 3 is associated with node 5
+ Nod4 = 2 # Frame 4 is associated with node 2
+ Lnk2 = 1 # Node 2 is derived from node 1
+ Lnk3 = 1 # Node 3 is derived from node 1
+ Lnk4 = 1 # Node 4 is derived from node 1
+ Lnk5 = 1 # Node 5 is derived from node 1
+ Frm1 = # Frame number 1
+ Begin Frame # Coordinate system description
+ Title = "Data grid indices; first pixel at (1,1,1)" # Title of coordinate system
+ Naxes = 3 # Number of coordinate axes
+ Domain = "GRID" # Coordinate system domain
+# Lbl1 = "Data grid index 1" # Label for axis 1
+# Lbl2 = "Data grid index 2" # Label for axis 2
+# Lbl3 = "Data grid index 3" # Label for axis 3
+# Uni1 = "pixel" # Units for axis 1
+# Uni2 = "pixel" # Units for axis 2
+# Uni3 = "pixel" # Units for axis 3
+ Ax1 = # Axis number 1
+ Begin Axis # Coordinate axis
+ Label = "Data grid index 1" # Axis Label
+ Symbol = "g1" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ Ax2 = # Axis number 2
+ Begin Axis # Coordinate axis
+ Label = "Data grid index 2" # Axis Label
+ Symbol = "g2" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ Ax3 = # Axis number 3
+ Begin Axis # Coordinate axis
+ Label = "Data grid index 3" # Axis Label
+ Symbol = "g3" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ End Frame
+ Frm2 = # Frame number 2
+ Begin Frame # Coordinate system description
+ Title = "Pixel coordinates; first pixel at (-77.5,-52.5,-820.5)" # Title of coordinate system
+ Naxes = 3 # Number of coordinate axes
+ Domain = "PIXEL" # Coordinate system domain
+# Lbl1 = "Pixel coordinate 1" # Label for axis 1
+# Lbl2 = "Pixel coordinate 2" # Label for axis 2
+# Lbl3 = "Pixel coordinate 3" # Label for axis 3
+# Uni1 = "pixel" # Units for axis 1
+# Uni2 = "pixel" # Units for axis 2
+# Uni3 = "pixel" # Units for axis 3
+ Ax1 = # Axis number 1
+ Begin Axis # Coordinate axis
+ Label = "Pixel coordinate 1" # Axis Label
+ Symbol = "p1" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ Ax2 = # Axis number 2
+ Begin Axis # Coordinate axis
+ Label = "Pixel coordinate 2" # Axis Label
+ Symbol = "p2" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ Ax3 = # Axis number 3
+ Begin Axis # Coordinate axis
+ Label = "Pixel coordinate 3" # Axis Label
+ Symbol = "p3" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ End Frame
+ Frm3 = # Frame number 3
+ Begin Frame # Coordinate system description
+ Title = "Axis coordinates; first pixel at (-77.5,-52.5,-820.5)" # Title of coordinate system
+ Naxes = 3 # Number of coordinate axes
+ Domain = "AXIS" # Coordinate system domain
+# Lbl1 = "Axis 1" # Label for axis 1
+# Lbl2 = "Axis 2" # Label for axis 2
+# Lbl3 = "Axis 3" # Label for axis 3
+# Uni1 = "pixel" # Units for axis 1
+# Uni2 = "pixel" # Units for axis 2
+# Uni3 = "pixel" # Units for axis 3
+ Ax1 = # Axis number 1
+ Begin Axis # Coordinate axis
+ Label = "Axis 1" # Axis Label
+ Symbol = "a1" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ Ax2 = # Axis number 2
+ Begin Axis # Coordinate axis
+ Label = "Axis 2" # Axis Label
+ Symbol = "a2" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ Ax3 = # Axis number 3
+ Begin Axis # Coordinate axis
+ Label = "Axis 3" # Axis Label
+ Symbol = "a3" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ End Frame
+ Frm4 = # Frame number 4
+ Begin CmpFrame # Compound coordinate system description
+# Title = "3-d compound coordinate system" # Title of coordinate system
+# Naxes = 3 # Number of coordinate axes
+# Domain = "SKY-DSBSPECTRUM" # Coordinate system domain
+# Lbl1 = "Right ascension" # Label for axis 1
+# Lbl2 = "Declination" # Label for axis 2
+# Lbl3 = "Radio velocity (USB)" # Label for axis 3
+# Uni1 = "hh:mm:ss.s" # Units for axis 1
+# Uni2 = "ddd:mm:ss" # Units for axis 2
+# Uni3 = "km/s" # Units for axis 3
+# Dir1 = 0 # Plot axis 1 in reverse direction
+ IsA Frame # Coordinate system description
+ FrameA = # First component Frame
+ Begin SkyFrame # Description of celestial coordinate system
+ Naxes = 2 # Number of coordinate axes
+ Epoch = 2007.3268594222 # Julian epoch of observation
+ System = "FK5" # Coordinate system type
+ ObsLat = 0.346026050148997 # Observers geodetic latitude (rads)
+ ObsLon = -2.71363306946838 # Observers geodetic longitude (rads)
+ Dut1 = -0.0989801599329792 # UT1-UTC in seconds
+ Ax1 = # Axis number 1
+ Begin SkyAxis # Celestial coordinate axis
+ End SkyAxis
+ Ax2 = # Axis number 2
+ Begin SkyAxis # Celestial coordinate axis
+ End SkyAxis
+ IsA Frame # Coordinate system description
+ SRef1 = 4.8432980149123 # Ref. pos. RA 18:30:00.1
+ SRef2 = 0.0213067755653197 # Ref. pos. Dec 1:13:15
+ End SkyFrame
+ FrameB = # Second component Frame
+ Begin DSBSpecFrame # Dual sideband spectral axis
+ Naxes = 1 # Number of coordinate axes
+ Epoch = 2007.3268594222 # Julian epoch of observation
+ System = "VRAD" # Coordinate system type
+ ObsLat = 0.346026069000144 # Observers geodetic latitude (rads)
+ ObsLon = -2.71363307300091 # Observers geodetic longitude (rads)
+ Dut1 = -0.0989801599329792 # UT1-UTC in seconds
+ Ax1 = # Axis number 1
+ Begin Axis # Coordinate axis
+ End Axis
+ IsA Frame # Coordinate system description
+ SoR = "LSRK" # Standard of rest
+ RefRA = 4.84328867428426 # Reference RA (rads, FK5 J2000)
+ RefDec = 0.0213075607299356 # Reference Dec (rads, FK5 J2000)
+ RstFrq = 345795989900 # Rest frequency (Hz)
+ SrcVel = 7000.08172321467 # Source velocity (m/s)
+ SrcVRF = "LSRK" # Source velocity rest frame
+ UFreq = "GHz" # Preferred units for frequency
+ IsA SpecFrame # Description of spectral coordinate system
+ DSBCen = 345834569302.861 # Central frequency (Hz topo)
+ IF = -5000001243.89453 # Intermediate frequency (Hz)
+ SideBn = "USB" # Represents upper sideband
+ AlSdBn = 1 # Align sidebands?
+ End DSBSpecFrame
+ End CmpFrame
+ Map2 = # Mapping between nodes 1 and 2
+ Begin CmpMap # Compound Mapping
+ Nin = 3 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 3 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ Series = 0 # Component Mappings applied in parallel
+ MapA = # First component Mapping
+ Begin WinMap # Map one window on to another
+ Nin = 2 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Sft1 = -78.9102040827274 # Shift for axis 1
+ Sft2 = -54.3591836988926 # Shift for axis 2
+ End WinMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 1 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin WinMap # Map one window on to another
+ Nin = 1 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Sft1 = 346188848728.921 # Shift for axis 1
+ Scl1 = -488347.122802699 # Scale factor for axis 1
+ End WinMap
+ MapB = # Second component Mapping
+ Begin SpecMap # Conversion between spectral coordinate systems
+ Nin = 1 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Nspec = 2 # Number of conversion steps
+ Spec1 = "FRTOVL" # Convert frequency to rel. velocity
+ Spec1a = 345795989900 # Rest frequency (Hz)
+ Spec2 = "VLTOVR" # Convert relativistic to radio velocity
+ End SpecMap
+ End CmpMap
+ End CmpMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 3 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ Series = 0 # Component Mappings applied in parallel
+ MapA = # First component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin MatrixMap # Matrix transformation
+ Nin = 2 # Number of input coordinates
+ Invert = 1 # Mapping inverted
+ IsA Mapping # Mapping between coordinate systems
+ M0 = 1.49080827566563e-05 # Forward matrix value
+ M1 = -3.19704866431787e-05 # Forward matrix value
+ M2 = -3.19704866431787e-05 # Forward matrix value
+ M3 = -1.49080827566563e-05 # Forward matrix value
+ Form = "Full" # Matrix storage form
+ End MatrixMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ InvA = 1 # First Mapping used in inverse direction
+ MapA = # First component Mapping
+ Begin WcsMap # FITS-WCS sky projection
+ Nin = 2 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Type = "TAN" # Gnomonic projection
+ End WcsMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ InvA = 1 # First Mapping used in inverse direction
+ MapA = # First component Mapping
+ Begin SphMap # Cartesian to Spherical mapping
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ UntRd = 1 # All input vectors have unit length
+ PlrLg = 0 # Polar longitude (rad.s)
+ End SphMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin MatrixMap # Matrix transformation
+ Nin = 3 # Number of input coordinates
+ Invert = 1 # Mapping inverted
+ IsA Mapping # Mapping between coordinate systems
+ M0 = 0.00278113801100606 # Forward matrix value
+ M1 = 0.991443912134338 # Forward matrix value
+ M2 = 0.130503771451718 # Forward matrix value
+ M3 = -0.021123653434259 # Forward matrix value
+ M4 = 0.130533402207093 # Forward matrix value
+ M5 = -0.9912188568494 # Forward matrix value
+ M6 = -0.999773002504545 # Forward matrix value
+ M7 = 0 # Forward matrix value
+ M8 = 0.0213059490060158 # Forward matrix value
+ Form = "Full" # Matrix storage form
+ End MatrixMap
+ MapB = # Second component Mapping
+ Begin SphMap # Cartesian to Spherical mapping
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ Invert = 1 # Mapping inverted
+ IsA Mapping # Mapping between coordinate systems
+ UntRd = 1 # All input vectors have unit length
+ PlrLg = 4.84329594648948 # Polar longitude (rad.s)
+ End SphMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ MapB = # Second component Mapping
+ Begin ZoomMap # Zoom about the origin
+ Nin = 1 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ Zoom = 0.001 # Zoom factor
+ End ZoomMap
+ End CmpMap
+ End CmpMap
+ Map3 = # Mapping between nodes 1 and 3
+ Begin UnitMap # Unit (null) Mapping
+ Nin = 3 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ IsA Mapping # Mapping between coordinate systems
+ End UnitMap
+ Map4 = # Mapping between nodes 1 and 4
+ Begin WinMap # Map one window on to another
+ Nin = 3 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ IsA Mapping # Mapping between coordinate systems
+ Sft1 = -78.5 # Shift for axis 1
+ Sft2 = -53.5 # Shift for axis 2
+ Sft3 = -821.5 # Shift for axis 3
+ End WinMap
+ Map5 = # Mapping between nodes 1 and 5
+ Begin WinMap # Map one window on to another
+ Nin = 3 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ IsA Mapping # Mapping between coordinate systems
+ Sft1 = -78.5 # Shift for axis 1
+ Sft2 = -53.5 # Shift for axis 2
+ Sft3 = -821.5 # Shift for axis 3
+ End WinMap
+ End FrameSet
diff --git a/ast/ast_tester/plotter.f b/ast/ast_tester/plotter.f
new file mode 100644
index 0000000..79bb8e1
--- /dev/null
+++ b/ast/ast_tester/plotter.f
@@ -0,0 +1,230 @@
+ PROGRAM PLOTTER
+
+* Usage:
+* PLOTTER <fits file> <attr1> <attr2> <ps file> [<xlo> <ylo> <xhi> <yhi>]
+
+* Description:
+* Plots a standard grid from the specified fits header file, using
+* the specified attributes, and sends postscript output to the
+* specified ps file.
+
+* Parameters:
+* file file
+* A text file containing fits headers.
+* attr1
+* A string containg a comma-separated list of attribute
+* settings for the Plot.
+* attr2
+* A string containg a comma-separated list of attribute
+* settings for the FitsChan.
+* ps file
+* The output postscript file
+* xlo ylo xhi yhi
+* The bounds within the GRID Frame of the required plot.
+* Taken from the FITS headers if not supplied
+
+
+ IMPLICIT NONE
+ INCLUDE 'AST_PAR'
+
+ INTEGER STATUS, FC, FS, NAXIS1, NAXIS2, PL, PGBEG, IARGC, OC
+ CHARACTER FILE*80, CARD*80, DEVN*80, PSFILE*80, ATTR*255, TEXT*80
+ REAL GBOX(4), RANGE, DELTA, ASP
+ DOUBLE PRECISION PBOX(4)
+
+ STATUS = 0
+*
+* Check command line arguments have been supplied.
+*
+ IF( IARGC() .LT. 3 ) THEN
+ WRITE(*,*) 'Usage: plotter <file file> <attrs> <fattrs> '//
+ : '<ps file> [<xlo> <ylo> <xhi> <yhi>]'
+ RETURN
+ END IF
+
+*
+* Use object caching to minimise allocation of new memory
+*
+ OC = AST_TUNE( 'ObjectCaching', 1, STATUS )
+ IF( OC .NE. 0 ) THEN
+ WRITE(*,'(A,I6)') 'Default ObjectCaching VALUE is ',OC
+ END IF
+
+ IF( AST_TUNE( 'ObjectCaching', AST__TUNULL, STATUS ) .NE. 1 ) THEN
+ WRITE(*,'(A,I6)') 'Set ObjectCaching VALUE is ',OC
+ END IF
+
+*
+* Create a FitsChan to store the FITS headers.
+*
+ CALL GETARG( 3, ATTR )
+ FC = AST_FITSCHAN( AST_NULL, AST_NULL, ATTR, STATUS )
+
+*
+* Open a text file containing a list of FITS headers.
+*
+ CALL GETARG( 1, FILE )
+ OPEN( UNIT=10, FILE=FILE, STATUS='OLD' )
+
+*
+* Read each card out of the text file and store it in the FitsChan.
+*
+ DO WHILE( .TRUE. )
+ READ( 10, '(A)', END = 10 ) CARD
+ CALL AST_PUTFITS( FC, CARD, 0, STATUS )
+ END DO
+
+ 10 CLOSE( 10 )
+
+
+*
+* If the base frame box was supplied on the command line, use it.
+*
+ IF( IARGC() .GT. 6 ) THEN
+ CALL GETARG( 5, TEXT )
+ READ( TEXT, * ) PBOX( 1 )
+
+ CALL GETARG( 6, TEXT )
+ READ( TEXT, * ) PBOX( 2 )
+
+ CALL GETARG( 7, TEXT )
+ READ( TEXT, * ) PBOX( 3 )
+
+ CALL GETARG( 8, TEXT )
+ READ( TEXT, * ) PBOX( 4 )
+
+* Otherwise use NAXISi keywords in the header.
+ ELSE
+
+*
+* See if values were supplied for NAXIS1 and NAXIS2. If not assume a value
+* of 100 for each. The FitsChan is re-wound before calling AST_FINDFITS so
+* that the search starts form the beginning.
+*
+ CALL AST_CLEAR( FC, 'CARD', STATUS )
+ IF ( AST_FINDFITS( FC, 'NAXIS1', CARD, .TRUE., STATUS ) ) THEN
+ READ(CARD(11:),*) NAXIS1
+ ELSE
+ NAXIS1 = 100
+ END IF
+
+ CALL AST_CLEAR( FC, 'CARD', STATUS )
+ IF ( AST_FINDFITS( FC, 'NAXIS2', CARD, .TRUE., STATUS ) ) THEN
+ READ(CARD(11:),*) NAXIS2
+ ELSE
+ NAXIS2 = 100
+ END IF
+
+ PBOX(1) = 0.5
+ PBOX(2) = 0.5
+ PBOX(3) = DBLE( NAXIS1 )+0.5
+ PBOX(4) = DBLE( NAXIS2 )+0.5
+ END IF
+
+*
+* Read an Object from the contents of the FitsChan. This should be a
+* FrameSet (this should be tested really, and an error reported if any
+* other type of Object is obtained). Re-wind the FitsChan first so that
+* its entire contents are read. Note, this is a destructive read, in that
+* the cards which are significant to the creation of the FrameSet are
+* removed from the FitsChan (this is why NAXIS1 and NAXIS2 are read out
+* earlier - just in case they are significant to the FrameSet). Any
+* insignificant cards are left as they are.
+*
+ CALL AST_CLEAR( FC, 'CARD', STATUS )
+ FS = AST_READ( FC, STATUS )
+
+ IF( FS .EQ. AST__NULL ) THEN
+ WRITE(*,*) '!!! No object read from FitsChan!!!'
+ GO TO 999
+ END IF
+
+*
+* If all is OK, start up PGPLOT.
+*
+ IF( STATUS .EQ. 0 ) THEN
+ CALL GETARG( 4, PSFILE )
+ CALL DELETEFILE( PSFILE )
+
+ DEVN = 'pscol_l;'//PSFILE
+c IF( PGBEG( 0, '?', 1, 1 ) .EQ. 1 ) THEN
+ IF( PGBEG( 0, DEVN, 1, 1 ) .EQ. 1 ) THEN
+ CALL PGPAGE
+ CALL PGWNAD( 0.0, 1.0, 0.0, 1.0 )
+
+*
+* Create the Plot. The pixel coordinates box is
+* mapped onto a window which is 10% smaller than the full PGPLOT window.
+* This gives some space for things like tick marks with negative length
+* (which stick outside the pixel cooridnates box).
+*
+ CALL PGQWIN( GBOX(1), GBOX(3), GBOX(2), GBOX(4) )
+
+ RANGE = GBOX(3) - GBOX(1)
+ GBOX(1) = GBOX(1) + 0.05*RANGE
+ GBOX(3) = GBOX(3) - 0.05*RANGE
+
+ RANGE = GBOX(4) - GBOX(2)
+ GBOX(2) = GBOX(2) + 0.05*RANGE
+ GBOX(4) = GBOX(4) - 0.05*RANGE
+
+ ASP = REAL( PBOX(4) - PBOX(2) )/REAL( PBOX(3) - PBOX(1) )
+ IF( ASP .LT. 0.05 .OR. ASP .GT. 20 ) ASP = 1.0
+
+ IF( ASP .GT. 1.0 ) THEN
+ DELTA = 0.5*( ( GBOX(3) - GBOX(1) ) -
+ : ( GBOX(4) - GBOX(2) )/ASP )
+ GBOX(3) = GBOX(3) - DELTA
+ GBOX(1) = GBOX(1) + DELTA
+ ELSE
+ DELTA = 0.5*( ( GBOX(4) - GBOX(2) ) -
+ : ASP*( GBOX(3) - GBOX(1) ) )
+ GBOX(4) = GBOX(4) - DELTA
+ GBOX(2) = GBOX(2) + DELTA
+ END IF
+
+ CALL GETARG( 2, ATTR )
+ PL = AST_PLOT( FS, GBOX, PBOX, 'title = A FITS test',
+ : STATUS )
+ CALL AST_SET( PL, ATTR, STATUS )
+
+*
+* Draw the grid.
+*
+ CALL AST_GRID( PL, STATUS )
+
+*
+* Annul the Plot, and close PGPLOT.
+*
+ CALL AST_ANNUL( PL, STATUS )
+ CALL PGEND
+ END IF
+ END IF
+
+*
+* Annul the other objects.
+*
+ CALL AST_ANNUL( FS, STATUS )
+ 999 CALL AST_ANNUL( FC, STATUS )
+
+ END
+
+
+*
+* Delete a file if it exists.
+*
+ SUBROUTINE DELETEFILE( FILNAM )
+ IMPLICIT NONE
+
+ CHARACTER FILNAM*(*)
+ LOGICAL EXISTS
+
+ INQUIRE ( FILE = FILNAM,
+ : EXIST = EXISTS )
+
+ IF( EXISTS ) THEN
+ OPEN ( UNIT=10, FILE=FILNAM, STATUS='OLD' )
+ CLOSE ( 10, STATUS='DELETE' )
+ END IF
+
+ END
diff --git a/ast/ast_tester/polco.attr b/ast/ast_tester/polco.attr
new file mode 100644
index 0000000..c220287
--- /dev/null
+++ b/ast/ast_tester/polco.attr
@@ -0,0 +1 @@
+Grid=1,labelling=interior,bottom(1)=0
diff --git a/ast/ast_tester/polco.box b/ast/ast_tester/polco.box
new file mode 100644
index 0000000..0661792
--- /dev/null
+++ b/ast/ast_tester/polco.box
@@ -0,0 +1 @@
+-300 -300 500 500
diff --git a/ast/ast_tester/polco.head b/ast/ast_tester/polco.head
new file mode 100644
index 0000000..d953089
--- /dev/null
+++ b/ast/ast_tester/polco.head
@@ -0,0 +1,86 @@
+
+COMMENT AST ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ AST
+COMMENT AST Beginning of AST data for FrameSet object AST
+COMMENT AST ................................................................ AST
+BEGAST_A= 'FrameSet' / Set of inter-related coordinate systems
+NFRAME_A= 2 / Number of Frames in FrameSet
+CURRNT_A= 2 / Index of current Frame
+NOD1_A = 2 / Frame 1 is associated with node 2
+NOD2_A = 1 / Frame 2 is associated with node 1
+LNK2_A = 1 / Node 2 is derived from node 1
+FRM1_A = ' ' / Frame number 1
+BEGAST_B= 'Frame ' / Coordinate system description
+TITLE_A = 'Data grid indices; first pixel at (1&'/ Title of coordinate system
+CONTINUE '",1) "'
+NAXES_A = 2 / Number of coordinate axes
+DOMAIN_A= 'GRID ' / Coordinate system domain
+AX1_A = ' ' / Axis number 1
+BEGAST_C= 'Axis ' / Coordinate axis
+LABEL_A = 'Data grid index 1' / Axis Label
+SYMBOL_A= 'g1 ' / Axis symbol
+UNIT_A = 'pixel ' / Axis units
+FORMAT_A= '%3.1f ' / Format specifier
+ENDAST_A= 'Axis ' / End of object definition
+AX2_A = ' ' / Axis number 2
+BEGAST_D= 'Axis ' / Coordinate axis
+LABEL_B = 'Data grid index 2' / Axis Label
+SYMBOL_B= 'g2 ' / Axis symbol
+UNIT_B = 'pixel ' / Axis units
+FORMAT_B= '%3.1f ' / Format specifier
+ENDAST_B= 'Axis ' / End of object definition
+ENDAST_C= 'Frame ' / End of object definition
+FRM2_A = ' ' / Frame number 2
+BEGAST_E= 'Frame ' / Coordinate system description
+TITLE_B = 'Pixel coordinates; first pixel at (-&'/ Title of coordinate system
+CONTINUE '100.5,-200.5)'
+NAXES_B = 2 / Number of coordinate axes
+DOMAIN_B= 'POLAR ' / Coordinate system domain
+AX1_B = ' ' / Axis number 1
+BEGAST_F= 'Axis ' / Coordinate axis
+LABEL_C = 'Pixel coordinate 1' / Axis Label
+SYMBOL_C= 'p1 ' / Axis symbol
+UNIT_C = 'pixel ' / Axis units
+FORMAT_C= '%3.1f ' / Format specifier
+BOTTOM_A= 0.0 / Minimum legal axis value
+ENDAST_D= 'Axis ' / End of object definition
+AX2_B = ' ' / Axis number 2
+BEGAST_G= 'Axis ' / Coordinate axis
+LABEL_D = 'Pixel coordinate 2' / Axis Label
+SYMBOL_D= 'p2 ' / Axis symbol
+UNIT_D = 'pixel ' / Axis units
+FORMAT_D= '%3.1f ' / Format specifier
+TOP_A = 3.141592 / Maximum legal axis value
+BOTTOM_B= -3.141592 / Minimum legal axis value
+ENDAST_E= 'Axis ' / End of object definition
+ENDAST_F= 'Frame ' / End of object definition
+MAP2_A = ' ' / Mapping between nodes 1 and 2
+BEGAST_H= 'CmpMap ' / Compound Mapping
+NIN_A = 2 / Number of input coordinates
+ISA_A = 'Mapping ' / Mapping between coordinate systems
+INVA_A = 1 / First Mapping used in inverse direction
+INVB_A = 1 / Second Mapping used in inverse direction
+MAPA_A = ' ' / First component Mapping
+BEGAST_I= 'MathMap ' / Transformation using mathematical functions
+NIN_B = 2 / Number of input coordinates
+INVERT_A= 0 / Mapping not inverted
+ISA_B = 'Mapping ' / Mapping between coordinate systems
+FWD1_A = 'r=sqrt(x*x+y*y)' / Forward function 1
+FWD2_A = 'theta=atan2(y,x)' / Forward function 2
+INV1_A = 'x=r*cos(theta)' / Inverse function 1
+INV2_A = 'y=r*sin(theta)' / Inverse function 2
+SIMPFI_A= 1 / Forward-inverse pairs may simplify
+SIMPIF_A= 1 / Inverse-forward pairs may simplify
+ENDAST_G= 'MathMap ' / End of object definition
+MAPB_A = ' ' / Second component Mapping
+BEGAST_J= 'WinMap ' / Map one window on to another
+NIN_C = 2 / Number of input coordinates
+INVERT_B= 0 / Mapping not inverted
+ISA_C = 'Mapping ' / Mapping between coordinate systems
+SFT1_A = -101.5 / Shift for axis 1
+SFT2_A = -201.5 / Shift for axis 2
+ENDAST_H= 'WinMap ' / End of object definition
+ENDAST_I= 'CmpMap ' / End of object definition
+ENDAST_J= 'FrameSet' / End of object definition
+COMMENT AST ................................................................ AST
+COMMENT AST End of AST data for FrameSet object AST
+COMMENT AST ---------------------------------------------------------------- AST
diff --git a/ast/ast_tester/polco2.attr b/ast/ast_tester/polco2.attr
new file mode 100644
index 0000000..5019421
--- /dev/null
+++ b/ast/ast_tester/polco2.attr
@@ -0,0 +1 @@
+Grid=0,labelling=exterior,gap(1)=50
diff --git a/ast/ast_tester/polco2.box b/ast/ast_tester/polco2.box
new file mode 100644
index 0000000..0661792
--- /dev/null
+++ b/ast/ast_tester/polco2.box
@@ -0,0 +1 @@
+-300 -300 500 500
diff --git a/ast/ast_tester/polco2.head b/ast/ast_tester/polco2.head
new file mode 100644
index 0000000..d953089
--- /dev/null
+++ b/ast/ast_tester/polco2.head
@@ -0,0 +1,86 @@
+
+COMMENT AST ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ AST
+COMMENT AST Beginning of AST data for FrameSet object AST
+COMMENT AST ................................................................ AST
+BEGAST_A= 'FrameSet' / Set of inter-related coordinate systems
+NFRAME_A= 2 / Number of Frames in FrameSet
+CURRNT_A= 2 / Index of current Frame
+NOD1_A = 2 / Frame 1 is associated with node 2
+NOD2_A = 1 / Frame 2 is associated with node 1
+LNK2_A = 1 / Node 2 is derived from node 1
+FRM1_A = ' ' / Frame number 1
+BEGAST_B= 'Frame ' / Coordinate system description
+TITLE_A = 'Data grid indices; first pixel at (1&'/ Title of coordinate system
+CONTINUE '",1) "'
+NAXES_A = 2 / Number of coordinate axes
+DOMAIN_A= 'GRID ' / Coordinate system domain
+AX1_A = ' ' / Axis number 1
+BEGAST_C= 'Axis ' / Coordinate axis
+LABEL_A = 'Data grid index 1' / Axis Label
+SYMBOL_A= 'g1 ' / Axis symbol
+UNIT_A = 'pixel ' / Axis units
+FORMAT_A= '%3.1f ' / Format specifier
+ENDAST_A= 'Axis ' / End of object definition
+AX2_A = ' ' / Axis number 2
+BEGAST_D= 'Axis ' / Coordinate axis
+LABEL_B = 'Data grid index 2' / Axis Label
+SYMBOL_B= 'g2 ' / Axis symbol
+UNIT_B = 'pixel ' / Axis units
+FORMAT_B= '%3.1f ' / Format specifier
+ENDAST_B= 'Axis ' / End of object definition
+ENDAST_C= 'Frame ' / End of object definition
+FRM2_A = ' ' / Frame number 2
+BEGAST_E= 'Frame ' / Coordinate system description
+TITLE_B = 'Pixel coordinates; first pixel at (-&'/ Title of coordinate system
+CONTINUE '100.5,-200.5)'
+NAXES_B = 2 / Number of coordinate axes
+DOMAIN_B= 'POLAR ' / Coordinate system domain
+AX1_B = ' ' / Axis number 1
+BEGAST_F= 'Axis ' / Coordinate axis
+LABEL_C = 'Pixel coordinate 1' / Axis Label
+SYMBOL_C= 'p1 ' / Axis symbol
+UNIT_C = 'pixel ' / Axis units
+FORMAT_C= '%3.1f ' / Format specifier
+BOTTOM_A= 0.0 / Minimum legal axis value
+ENDAST_D= 'Axis ' / End of object definition
+AX2_B = ' ' / Axis number 2
+BEGAST_G= 'Axis ' / Coordinate axis
+LABEL_D = 'Pixel coordinate 2' / Axis Label
+SYMBOL_D= 'p2 ' / Axis symbol
+UNIT_D = 'pixel ' / Axis units
+FORMAT_D= '%3.1f ' / Format specifier
+TOP_A = 3.141592 / Maximum legal axis value
+BOTTOM_B= -3.141592 / Minimum legal axis value
+ENDAST_E= 'Axis ' / End of object definition
+ENDAST_F= 'Frame ' / End of object definition
+MAP2_A = ' ' / Mapping between nodes 1 and 2
+BEGAST_H= 'CmpMap ' / Compound Mapping
+NIN_A = 2 / Number of input coordinates
+ISA_A = 'Mapping ' / Mapping between coordinate systems
+INVA_A = 1 / First Mapping used in inverse direction
+INVB_A = 1 / Second Mapping used in inverse direction
+MAPA_A = ' ' / First component Mapping
+BEGAST_I= 'MathMap ' / Transformation using mathematical functions
+NIN_B = 2 / Number of input coordinates
+INVERT_A= 0 / Mapping not inverted
+ISA_B = 'Mapping ' / Mapping between coordinate systems
+FWD1_A = 'r=sqrt(x*x+y*y)' / Forward function 1
+FWD2_A = 'theta=atan2(y,x)' / Forward function 2
+INV1_A = 'x=r*cos(theta)' / Inverse function 1
+INV2_A = 'y=r*sin(theta)' / Inverse function 2
+SIMPFI_A= 1 / Forward-inverse pairs may simplify
+SIMPIF_A= 1 / Inverse-forward pairs may simplify
+ENDAST_G= 'MathMap ' / End of object definition
+MAPB_A = ' ' / Second component Mapping
+BEGAST_J= 'WinMap ' / Map one window on to another
+NIN_C = 2 / Number of input coordinates
+INVERT_B= 0 / Mapping not inverted
+ISA_C = 'Mapping ' / Mapping between coordinate systems
+SFT1_A = -101.5 / Shift for axis 1
+SFT2_A = -201.5 / Shift for axis 2
+ENDAST_H= 'WinMap ' / End of object definition
+ENDAST_I= 'CmpMap ' / End of object definition
+ENDAST_J= 'FrameSet' / End of object definition
+COMMENT AST ................................................................ AST
+COMMENT AST End of AST data for FrameSet object AST
+COMMENT AST ---------------------------------------------------------------- AST
diff --git a/ast/ast_tester/regression.current b/ast/ast_tester/regression.current
new file mode 100644
index 0000000..788c2bc
--- /dev/null
+++ b/ast/ast_tester/regression.current
@@ -0,0 +1,7583 @@
+ Begin FitsChan # I/O channels to FITS files
+ Card = 1 # Index of current card
+# Encod = "NATIVE" # Encoding system
+# FitsDg = 15 # No. of digits for floating point values
+# DfB1950 = 1 # Default to FK4 B1950
+# CdMat = 0 # Use PC matrix
+# CarLin = 0 # Use full FITS-WCS CAR projections
+# Iwc = 0 # Do not include an IWC Frame
+# Warn = "Tnx Zpx BadCel BadMat BadCTYPE" # Warnings to be reported
+ Nm1 = "NAXIS" # FITS keyword name
+ Ty1 = "integer" # FITS keyword data type
+ Dt1 = 1 # FITS keyword value
+ Nm2 = "NAXIS1" # FITS keyword name
+ Ty2 = "integer" # FITS keyword data type
+ Dt2 = 100 # FITS keyword value
+ Nm3 = "CTYPE1" # FITS keyword name
+ Ty3 = "string" # FITS keyword data type
+ Dt3 = "fred" # FITS keyword value
+ Nm4 = "CDELT1" # FITS keyword name
+ Ty4 = "floating point" # FITS keyword data type
+ Dt4 = 0 # FITS keyword value
+ Nm5 = "CRPIX1" # FITS keyword name
+ Ty5 = "integer" # FITS keyword data type
+ Dt5 = 50 # FITS keyword value
+ Nm6 = "CUNIT1" # FITS keyword name
+ Ty6 = "string" # FITS keyword data type
+ Dt6 = "GHz" # FITS keyword value
+ Nm7 = " " # FITS keyword name
+ Ty7 = "comment" # FITS keyword data type
+ End FitsChan
+ Begin FrameSet # Set of inter-related coordinate systems
+# Title = "IAU (1958) galactic coordinates; zenithal equal area projection" # Title of coordinate system
+# Naxes = 2 # Number of coordinate axes
+# Domain = "SKY" # Coordinate system domain
+# Epoch = 1950 # Besselian epoch of observation
+# Lbl1 = "Galactic longitude" # Label for axis 1
+# Lbl2 = "Galactic latitude" # Label for axis 2
+# System = "GALACTIC" # Coordinate system type
+# Uni1 = "degrees" # Units for axis 1
+# Uni2 = "degrees" # Units for axis 2
+# Bot2 = -1.5707963267949 # Lowest legal axis value
+# Top2 = 1.5707963267949 # Highest legal axis value
+ IsA Frame # Coordinate system description
+ Nframe = 2 # Number of Frames in FrameSet
+ Base = 1 # Index of base Frame
+ Currnt = 2 # Index of current Frame
+ Lnk2 = 1 # Node 2 is derived from node 1
+ Frm1 = # Frame number 1
+ Begin Frame # Coordinate system description
+ Title = "Pixel Coordinates" # Title of coordinate system
+ Naxes = 2 # Number of coordinate axes
+ Domain = "GRID" # Coordinate system domain
+# Lbl1 = "Pixel axis 1" # Label for axis 1
+# Lbl2 = "Pixel axis 2" # Label for axis 2
+ Ax1 = # Axis number 1
+ Begin Axis # Coordinate axis
+ Label = "Pixel axis 1" # Axis Label
+ End Axis
+ Ax2 = # Axis number 2
+ Begin Axis # Coordinate axis
+ Label = "Pixel axis 2" # Axis Label
+ End Axis
+ End Frame
+ Frm2 = # Frame number 2
+ Begin SkyFrame # Description of celestial coordinate system
+ Ident = " " # Permanent Object identification string
+ IsA Object # AST Object
+# Title = "IAU (1958) galactic coordinates; zenithal equal area projection" # Title of coordinate system
+ Naxes = 2 # Number of coordinate axes
+# Domain = "SKY" # Coordinate system domain
+ Epoch = 1950 # Besselian epoch of observation
+# Lbl1 = "Galactic longitude" # Label for axis 1
+# Lbl2 = "Galactic latitude" # Label for axis 2
+ System = "GALACTIC" # Coordinate system type
+# Uni1 = "degrees" # Units for axis 1
+# Uni2 = "degrees" # Units for axis 2
+# Bot2 = -1.5707963267949 # Lowest legal axis value
+# Top2 = 1.5707963267949 # Highest legal axis value
+ Ax1 = # Axis number 1
+ Begin SkyAxis # Celestial coordinate axis
+ End SkyAxis
+ Ax2 = # Axis number 2
+ Begin SkyAxis # Celestial coordinate axis
+ End SkyAxis
+ IsA Frame # Coordinate system description
+ Proj = "zenithal equal area" # Description of sky projection
+ SRefIs = "Ignored" # Not rotated (ref. pos. is ignored)
+ SRef1 = -2.61046557479594 # Ref. pos. l -149.5687
+ SRef2 = -0.344845661720836 # Ref. pos. b -19.7582
+ End SkyFrame
+ Map2 = # Mapping between nodes 1 and 2
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin WinMap # Map one window on to another
+ Nin = 2 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Sft1 = -150.5 # Shift for axis 1
+ Sft2 = -150.5 # Shift for axis 2
+ End WinMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin MatrixMap # Matrix transformation
+ Nin = 2 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ M0 = -0.020943951023932 # Forward matrix value
+ M1 = 0.020943951023932 # Forward matrix value
+ Form = "Diagonal" # Matrix storage form
+ End MatrixMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ InvA = 1 # First Mapping used in inverse direction
+ MapA = # First component Mapping
+ Begin WcsMap # FITS-WCS sky projection
+ Nin = 2 # Number of input coordinates
+ Invert = 1 # Mapping inverted
+ IsA Mapping # Mapping between coordinate systems
+ Type = "ZEA" # Zenithal equal area projection
+ End WcsMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ InvA = 1 # First Mapping used in inverse direction
+ MapA = # First component Mapping
+ Begin SphMap # Cartesian to Spherical mapping
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ Invert = 1 # Mapping inverted
+ IsA Mapping # Mapping between coordinate systems
+ UntRd = 1 # All input vectors have unit length
+ PlrLg = 0 # Polar longitude (rad.s)
+ End SphMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin MatrixMap # Matrix transformation
+ Nin = 3 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ M0 = 0.291480364581799 # Forward matrix value
+ M1 = 0.506505471460186 # AST version 4.2- 1
+PutCards Ncards = 7
+PutCards Card = 1
+PutCards Card = 8
+PutCards Ncards = 7
+PutCards Card = 1
+
+
+
+
+ FITS test number 1
+ ====================
+
+
+
+AST_SHOW:
+
+REG_SINK:
+SIMPLE = T / Written by IDL: 30-Jul-1997 05:35:42.00
+BITPIX = -32 / Bits per pixel.
+NAXIS = 2 / Number of dimensions
+NAXIS1 = 300 / Length of x axis.
+NAXIS2 = 300 / Length of y axis.
+COMMENT
+COMMENT This file was produced by the SkyView survey analysis system from
+COMMENT available astronomical surveys. The data are formatted
+COMMENT as a simple two-dimensional FITS image with the same units as
+COMMENT the orginal survey. A single ASCII table extension may be present
+COMMENT which describes catalog objects found within the field of view.
+COMMENT Copies of relevant copyright notices are included in this file.
+COMMENT
+COMMENT Questions should be directed to:
+COMMENT
+COMMENT scollick@skyview.gsfc.nasa.gov
+COMMENT or
+COMMENT mcglynn@grossc.gsfc.nasa.gov
+COMMENT
+COMMENT SkyView
+COMMENT Code 668.1
+COMMENT Goddard Space Flight Center, Greenbelt, MD 20771
+COMMENT 301-286-7780
+COMMENT
+COMMENT SkyView is supported by NASA ADP grant NAS 5-32068.
+COMMENT
+SURVEY = 'COBE DIRBE'
+BUNITS = 'MJy/sr '
+ORIGIN = 'CDAC ' / Cosmology Data Analysis Center
+TELESCOP= 'COBE ' / COsmic Background Explorer satellite
+INSTRUME= 'DIRBE ' / COBE instrument [DIRBE, DMR, FIRAS]
+PIXRESOL= 9 / Quad tree pixel resolution [6, 9]
+DATE = '27/09/94' / FITS file creation date (dd/mm/yy)
+DATE-MAP= '16/09/94' / Date of original file creation (dd/mm/yy)
+COMMENT COBE specific keywords
+DATE-BEG= '08/12/89' / date of initial data represented (dd/mm/yy)
+DATE-END= '25/09/90' / date of final data represented (dd/mm/yy)
+COMMENT
+COMMENT THE COBE DIRBE map is a combination of the original ten
+COMMENT band passes with the following wavelengths:
+COMMENT Band 1 - 1.25 microns
+COMMENT Band 2 - 2.2 microns
+COMMENT Band 3 - 3.5 microns
+COMMENT Band 4 - 4.9 microns
+COMMENT Band 5 - 12 microns
+COMMENT Band 6 - 25 microns
+COMMENT Band 7 - 60 microns
+COMMENT Band 8 - 100 microns
+COMMENT Band 9 - 140 microns
+COMMENT Band 10 - 240 microns
+COMMENT
+
+Objects written: 1
+
+Native Encoding:
+
+COMMENT AST ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ AST
+COMMENT AST WCS information in AST format AST
+COMMENT AST See http://www.starlink.ac.uk/ast/ AST
+COMMENT AST Beginning of AST data for FrameSet object AST
+COMMENT AST ................................................................ AST
+BEGAST_A= 'FrameSet' / Set of inter-related coordinate systems
+NFRAME_A= 2 / Number of Frames in FrameSet
+BASE_A = 1 / Index of base Frame
+CURRNT_A= 2 / Index of current Frame
+LNK2_A = 1 / Node 2 is derived from node 1
+FRM1_A = ' ' / Frame number 1
+BEGAST_B= 'Frame ' / Coordinate system description
+TITLE_A = 'Pixel Coordinates' / Title of coordinate system
+NAXES_A = 2 / Number of coordinate axes
+DOMAIN_A= 'GRID ' / Coordinate system domain
+AX1_A = ' ' / Axis number 1
+BEGAST_C= 'Axis ' / Coordinate axis
+LABEL_A = 'Pixel axis 1' / Axis Label
+ENDAST_A= 'Axis ' / End of object definition
+AX2_A = ' ' / Axis number 2
+BEGAST_D= 'Axis ' / Coordinate axis
+LABEL_B = 'Pixel axis 2' / Axis Label
+ENDAST_B= 'Axis ' / End of object definition
+ENDAST_C= 'Frame ' / End of object definition
+FRM2_A = ' ' / Frame number 2
+BEGAST_E= 'SkyFrame' / Description of celestial coordinate system
+IDENT_A = '" " ' / Permanent Object identification string
+ISA_A = 'Object ' / AST Object
+NAXES_B = 2 / Number of coordinate axes
+EPOCH_A = 1950.0 / Besselian epoch of observation
+SYSTEM_A= 'GALACTIC' / Coordinate system type
+AX1_B = ' ' / Axis number 1
+BEGAST_F= 'SkyAxis ' / Celestial coordinate axis
+ENDAST_D= 'SkyAxis ' / End of object definition
+AX2_B = ' ' / Axis number 2
+BEGAST_G= 'SkyAxis ' / Celestial coordinate axis
+ENDAST_E= 'SkyAxis ' / End of object definition
+ISA_B = 'Frame ' / Coordinate system description
+PROJ_A = 'zenithal equal area'/ Description of sky projection
+SREFIS_A= 'Ignored ' / Not rotated (ref. pos. is ignored)
+SREF1_A = -2.61046557479594 / Ref. pos. l -149.5687
+SREF2_A = -0.344845661720836 / Ref. pos. b -19.7582
+ENDAST_F= 'SkyFrame' / End of object definition
+MAP2_A = ' ' / Mapping between nodes 1 and 2
+BEGAST_H= 'CmpMap ' / Compound Mapping
+NIN_A = 2 / Number of input coordinates
+ISSIMP_A= 1 / Mapping has been simplified
+ISA_C = 'Mapping ' / Mapping between coordinate systems
+MAPA_A = ' ' / First component Mapping
+BEGAST_I= 'WinMap ' / Map one window on to another
+NIN_B = 2 / Number of input coordinates
+INVERT_A= 0 / Mapping not inverted
+ISA_D = 'Mapping ' / Mapping between coordinate systems
+SFT1_A = -150.5 / Shift for axis 1
+SFT2_A = -150.5 / Shift for axis 2
+ENDAST_G= 'WinMap ' / End of object definition
+MAPB_A = ' ' / Second component Mapping
+BEGAST_J= 'CmpMap ' / Compound Mapping
+NIN_C = 2 / Number of input coordinates
+ISA_E = 'Mapping ' / Mapping between coordinate systems
+MAPA_B = ' ' / First component Mapping
+BEGAST_K= 'MatrixMap' / Matrix transformation
+NIN_D = 2 / Number of input coordinates
+INVERT_B= 0 / Mapping not inverted
+ISA_F = 'Mapping ' / Mapping between coordinate systems
+M0_A = -0.020943951023932 / Forward matrix value
+M1_A = 0.020943951023932 / Forward matrix value
+FORM_A = 'Diagonal' / Matrix storage form
+ENDAST_H= 'MatrixMap' / End of object definition
+MAPB_B = ' ' / Second component Mapping
+BEGAST_L= 'CmpMap ' / Compound Mapping
+NIN_E = 2 / Number of input coordinates
+ISA_G = 'Mapping ' / Mapping between coordinate systems
+INVA_A = 1 / First Mapping used in inverse direction
+MAPA_C = ' ' / First component Mapping
+BEGAST_M= 'WcsMap ' / FITS-WCS sky projection
+NIN_F = 2 / Number of input coordinates
+INVERT_C= 1 / Mapping inverted
+ISA_H = 'Mapping ' / Mapping between coordinate systems
+TYPE_A = 'ZEA ' / Zenithal equal area projection
+ENDAST_I= 'WcsMap ' / End of object definition
+MAPB_C = ' ' / Second component Mapping
+BEGAST_N= 'CmpMap ' / Compound Mapping
+NIN_G = 2 / Number of input coordinates
+ISA_I = 'Mapping ' / Mapping between coordinate systems
+INVA_B = 1 / First Mapping used in inverse direction
+MAPA_D = ' ' / First component Mapping
+BEGAST_O= 'SphMap ' / Cartesian to Spherical mapping
+NIN_H = 3 / Number of input coordinates
+NOUT_A = 2 / Number of output coordinates
+INVERT_D= 1 / Mapping inverted
+ISA_J = 'Mapping ' / Mapping between coordinate systems
+UNTRD_A = 1 / All input vectors have unit length
+PLRLG_A = 0.0 / Polar longitude (rad.s)
+ENDAST_J= 'SphMap ' / End of object definition
+MAPB_D = ' ' / Second component Mapping
+BEGAST_P= 'CmpMap ' / Compound Mapping
+NIN_I = 3 / Number of input coordinates
+NOUT_B = 2 / Number of output coordinates
+ISA_K = 'Mapping ' / Mapping between coordinate systems
+MAPA_E = ' ' / First component Mapping
+BEGAST_Q= 'MatrixMap' / Matrix transformation
+NIN_J = 3 / Number of input coordinates
+INVERT_E= 0 / Mapping not inverted
+ISA_L = 'Mapping ' / Mapping between coordinate systems
+M0_B = 0.291480364581799 / Forward matrix value
+M1_B = 0.506505471460186 / Forward matrix value
+M2_A = -0.811474832908671 / Forward matrix value
+M3_A = 0.171224898552328 / Forward matrix value
+M4_A = -0.862236746712233 / Forward matrix value
+M5_A = -0.476686298035564 / Forward matrix value
+M6_A = -0.941127638091139 / Forward matrix value
+M7_A = 0.0 / Forward matrix value
+M8_A = -0.338051429254475 / Forward matrix value
+FORM_B = 'Full ' / Matrix storage form
+ENDAST_K= 'MatrixMap' / End of object definition
+MAPB_E = ' ' / Second component Mapping
+BEGAST_R= 'SphMap ' / Cartesian to Spherical mapping
+NIN_K = 3 / Number of input coordinates
+NOUT_C = 2 / Number of output coordinates
+INVERT_F= 0 / Mapping not inverted
+ISA_M = 'Mapping ' / Mapping between coordinate systems
+UNTRD_B = 1 / All input vectors have unit length
+PLRLG_B = -2.61046557479594 / Polar longitude (rad.s)
+ENDAST_L= 'SphMap ' / End of object definition
+ENDAST_M= 'CmpMap ' / End of object definition
+ENDAST_N= 'CmpMap ' / End of object definition
+ENDAST_O= 'CmpMap ' / End of object definition
+ENDAST_P= 'CmpMap ' / End of object definition
+ENDAST_Q= 'CmpMap ' / End of object definition
+ENDAST_R= 'FrameSet' / End of object definition
+COMMENT AST ................................................................ AST
+COMMENT AST End of AST data for FrameSet object AST
+COMMENT AST ---------------------------------------------------------------- AST
+
+ATTRIBUTES:
+ Colour(axis1) : 1
+ Font(Stri) : 1
+ Nout : 1
+ Class : 4
+ Tol : 0.100000E-01
+ Gap(1) : 1.04720
+ Border : 0
+ Invert : 0
+ TextLabGap : 0.100000E-01
+ Nin : 2
+ Current : 3
+ Base : 1
+ Nobject : 1
+ RefCOUNT : 1
+
+AST_GRID:
+REG_LINE: 15
+ 25.4 -29.7
+ 20.1 -16.6
+ 15.4 -2.03
+ 11.5 13.7
+ 8.35 30.3
+ 5.92 47.5
+ 4.25 65.0
+ 3.39 82.6
+ 3.35 100.
+ 4.19 117.
+ 5.99 133.
+ 8.83 149.
+ 12.9 163.
+ 18.3 175.
+ 25.4 185.
+REG_LINE: 119
+ 25.4 -29.7
+ 24.6 -29.7
+ 23.8 -29.7
+ 22.9 -29.6
+ 22.1 -29.5
+ 21.3 -29.5
+ 20.4 -29.3
+ 19.6 -29.2
+ 18.8 -29.0
+ 17.9 -28.9
+ 17.1 -28.7
+ 16.3 -28.5
+ 15.5 -28.2
+ 14.6 -28.0
+ 13.8 -27.7
+ 13.0 -27.4
+ 12.2 -27.1
+ 11.4 -26.7
+ 10.6 -26.4
+ 9.74 -26.0
+ 8.93 -25.6
+ 8.12 -25.2
+ 7.32 -24.8
+ 6.52 -24.3
+ 5.73 -23.9
+ 4.93 -23.4
+ 4.14 -22.9
+ 3.35 -22.3
+ 2.57 -21.8
+ 1.79 -21.2
+ 1.02 -20.6
+ .247 -20.0
+ -.520 -19.4
+ -1.28 -18.8
+ -2.04 -18.1
+ -2.79 -17.4
+ -3.54 -16.7
+ -4.29 -16.0
+ -5.02 -15.3
+ -5.76 -14.5
+ -6.49 -13.7
+ -7.21 -12.9
+ -7.92 -12.1
+ -17.3 1.12
+ -25.1 17.7
+ -31.1 37.2
+ -34.6 59.1
+ -35.4 82.8
+ -33.1 107.
+ -32.8 109.
+ -32.5 111.
+ -32.2 112.
+ -31.9 114.
+ -31.5 116.
+ -31.1 117.
+ -30.7 119.
+ -30.3 121.
+ -29.9 123.
+ -29.4 124.
+ -28.9 126.
+ -28.5 128.
+ -27.9 129.
+ -27.4 131.
+ -26.9 132.
+ -26.3 134.
+ -25.7 136.
+ -25.2 137.
+ -24.5 139.
+ -23.9 140.
+ -23.3 142.
+ -22.6 143.
+ -21.9 145.
+ -21.2 146.
+ -20.5 148.
+ -19.8 149.
+ -19.0 151.
+ -18.2 152.
+ -17.5 154.
+ -16.7 155.
+ -15.8 156.
+ -15.0 158.
+ -14.2 159.
+ -13.3 160.
+ -12.4 162.
+ -11.5 163.
+ -10.6 164.
+ -9.69 165.
+ -8.75 166.
+ -7.80 167.
+ -6.83 168.
+ -5.85 170.
+ -4.86 171.
+ -3.85 172.
+ -2.83 172.
+ -1.80 173.
+ -.761 174.
+ .293 175.
+ 1.36 176.
+ 2.43 177.
+ 3.52 178.
+ 4.61 178.
+ 5.72 179.
+ 6.83 180.
+ 7.95 180.
+ 9.08 181.
+ 10.2 181.
+ 11.4 182.
+ 12.5 182.
+ 13.7 183.
+ 14.8 183.
+ 16.0 184.
+ 17.2 184.
+ 18.3 184.
+ 19.5 184.
+ 20.7 185.
+ 21.9 185.
+ 23.1 185.
+ 24.3 185.
+ 25.4 185.
+REG_LINE: 171
+ 25.4 -29.7
+ 19.1 -40.9
+ 11.9 -49.9
+ 11.3 -50.4
+ 10.8 -50.9
+ 10.2 -51.4
+ 9.62 -51.9
+ 9.04 -52.4
+ 8.46 -52.8
+ 7.87 -53.3
+ 7.28 -53.7
+ 6.68 -54.1
+ 6.07 -54.5
+ 5.46 -54.9
+ 4.84 -55.2
+ 4.21 -55.6
+ 3.58 -55.9
+ 2.95 -56.2
+ 2.30 -56.5
+ 1.65 -56.7
+ .990 -56.9
+ .325 -57.2
+ -.348 -57.3
+ -1.03 -57.5
+ -1.71 -57.7
+ -2.41 -57.8
+ -3.11 -57.9
+ -3.82 -57.9
+ -4.54 -58.0
+ -5.27 -58.0
+ -6.00 -58.0
+ -6.74 -58.0
+ -7.50 -57.9
+ -8.26 -57.8
+ -9.03 -57.7
+ -9.80 -57.5
+ -10.6 -57.3
+ -11.4 -57.1
+ -12.2 -56.8
+ -13.0 -56.5
+ -13.8 -56.2
+ -14.7 -55.8
+ -15.5 -55.4
+ -16.4 -55.0
+ -17.2 -54.5
+ -18.1 -53.9
+ -19.0 -53.4
+ -19.9 -52.7
+ -20.8 -52.0
+ -21.7 -51.3
+ -22.6 -50.5
+ -23.6 -49.7
+ -24.5 -48.8
+ -25.5 -47.8
+ -26.4 -46.8
+ -27.4 -45.7
+ -28.4 -44.5
+ -29.4 -43.3
+ -30.4 -42.0
+ -31.4 -40.6
+ -32.4 -39.1
+ -33.5 -37.6
+ -34.5 -36.0
+ -35.5 -34.3
+ -36.6 -32.5
+ -37.6 -30.5
+ -38.7 -28.5
+ -39.7 -26.4
+ -40.8 -24.2
+ -41.8 -21.9
+ -42.8 -19.5
+ -43.9 -16.9
+ -44.9 -14.2
+ -45.9 -11.4
+ -46.9 -8.53
+ -47.8 -5.48
+ -48.8 -2.30
+ -49.7 1.01
+ -50.6 4.45
+ -51.4 8.02
+ -52.2 11.7
+ -53.0 15.6
+ -53.7 19.5
+ -54.4 23.6
+ -55.0 27.8
+ -55.5 32.2
+ -56.0 36.6
+ -56.4 41.1
+ -56.7 45.8
+ -56.9 50.5
+ -57.1 55.3
+ -57.1 60.1
+ -57.1 65.1
+ -56.9 70.0
+ -56.7 74.9
+ -56.4 79.9
+ -55.9 84.9
+ -55.4 89.8
+ -54.8 94.7
+ -54.1 99.5
+ -53.3 104.
+ -52.4 109.
+ -51.4 114.
+ -50.3 118.
+ -49.2 122.
+ -48.0 127.
+ -46.7 131.
+ -45.4 135.
+ -44.1 138.
+ -42.7 142.
+ -41.2 146.
+ -39.8 149.
+ -38.3 152.
+ -36.8 155.
+ -35.2 158.
+ -33.7 161.
+ -32.2 164.
+ -30.6 166.
+ -29.1 168.
+ -27.5 171.
+ -26.0 173.
+ -24.5 175.
+ -23.0 176.
+ -21.5 178.
+ -20.0 180.
+ -18.5 181.
+ -17.1 182.
+ -15.7 184.
+ -14.3 185.
+ -12.9 186.
+ -11.5 187.
+ -10.2 188.
+ -8.92 188.
+ -7.64 189.
+ -6.38 190.
+ -5.15 190.
+ -3.94 191.
+ -2.75 191.
+ -1.59 192.
+ -.448 192.
+ .669 193.
+ 1.76 193.
+ 2.83 193.
+ 3.88 193.
+ 4.91 193.
+ 5.92 193.
+ 6.91 193.
+ 7.88 193.
+ 8.82 193.
+ 9.75 193.
+ 10.7 193.
+ 11.6 193.
+ 12.4 193.
+ 13.3 192.
+ 14.1 192.
+ 14.9 192.
+ 15.7 192.
+ 16.5 191.
+ 17.3 191.
+ 18.1 190.
+ 18.8 190.
+ 19.5 190.
+ 20.2 189.
+ 20.9 189.
+ 21.6 188.
+ 22.3 188.
+ 22.9 187.
+ 23.6 187.
+ 24.2 186.
+ 24.8 185.
+ 25.4 185.
+REG_LINE: 171
+ 25.4 -29.7
+ 31.6 -41.1
+ 38.7 -50.2
+ 39.2 -50.7
+ 39.8 -51.2
+ 40.3 -51.8
+ 40.9 -52.3
+ 41.5 -52.8
+ 42.0 -53.2
+ 42.6 -53.7
+ 43.2 -54.1
+ 43.8 -54.6
+ 44.4 -55.0
+ 45.0 -55.4
+ 45.6 -55.7
+ 46.2 -56.1
+ 46.8 -56.4
+ 47.4 -56.7
+ 48.1 -57.0
+ 48.7 -57.3
+ 49.4 -57.6
+ 50.0 -57.8
+ 50.7 -58.0
+ 51.3 -58.2
+ 52.0 -58.4
+ 52.7 -58.5
+ 53.4 -58.6
+ 54.1 -58.7
+ 54.8 -58.8
+ 55.5 -58.8
+ 56.2 -58.9
+ 57.0 -58.8
+ 57.7 -58.8
+ 58.5 -58.7
+ 59.2 -58.6
+ 60.0 -58.5
+ 60.8 -58.3
+ 61.6 -58.2
+ 62.4 -57.9
+ 63.2 -57.7
+ 64.0 -57.4
+ 64.8 -57.0
+ 65.6 -56.6
+ 66.5 -56.2
+ 67.3 -55.8
+ 68.2 -55.2
+ 69.1 -54.7
+ 70.0 -54.1
+ 70.9 -53.4
+ 71.8 -52.7
+ 72.7 -52.0
+ 73.7 -51.2
+ 74.6 -50.3
+ 75.6 -49.4
+ 76.6 -48.4
+ 77.5 -47.3
+ 78.5 -46.2
+ 79.5 -45.0
+ 80.5 -43.7
+ 81.6 -42.4
+ 82.6 -41.0
+ 83.6 -39.5
+ 84.7 -37.9
+ 85.7 -36.2
+ 86.8 -34.4
+ 87.8 -32.5
+ 88.9 -30.5
+ 90.0 -28.5
+ 91.1 -26.3
+ 92.1 -23.9
+ 93.2 -21.5
+ 94.2 -19.0
+ 95.3 -16.3
+ 96.3 -13.5
+ 97.3 -10.6
+ 98.4 -7.51
+ 99.3 -4.31
+ 100. -.976
+ 101. 2.50
+ 102. 6.12
+ 103. 9.88
+ 104. 13.8
+ 105. 17.8
+ 105. 22.0
+ 106. 26.3
+ 106. 30.7
+ 107. 35.2
+ 107. 39.9
+ 108. 44.7
+ 108. 49.5
+ 108. 54.4
+ 108. 59.4
+ 108. 64.5
+ 108. 69.5
+ 108. 74.6
+ 107. 79.7
+ 107. 84.8
+ 106. 89.9
+ 106. 94.9
+ 105. 99.9
+ 104. 105.
+ 103. 110.
+ 102. 114.
+ 101. 119.
+ 100. 123.
+ 98.8 128.
+ 97.5 132.
+ 96.1 136.
+ 94.7 140.
+ 93.3 143.
+ 91.8 147.
+ 90.3 150.
+ 88.8 154.
+ 87.2 157.
+ 85.7 159.
+ 84.1 162.
+ 82.5 165.
+ 80.9 167.
+ 79.4 170.
+ 77.8 172.
+ 76.3 174.
+ 74.7 176.
+ 73.2 177.
+ 71.7 179.
+ 70.2 181.
+ 68.8 182.
+ 67.3 183.
+ 65.9 185.
+ 64.5 186.
+ 63.2 187.
+ 61.8 188.
+ 60.5 188.
+ 59.2 189.
+ 57.9 190.
+ 56.7 191.
+ 55.5 191.
+ 54.3 192.
+ 53.1 192.
+ 51.9 192.
+ 50.8 193.
+ 49.7 193.
+ 48.6 193.
+ 47.6 193.
+ 46.5 193.
+ 45.5 194.
+ 44.5 194.
+ 43.6 194.
+ 42.6 194.
+ 41.7 193.
+ 40.8 193.
+ 39.9 193.
+ 39.0 193.
+ 38.2 193.
+ 37.3 193.
+ 36.5 192.
+ 35.7 192.
+ 34.9 192.
+ 34.2 191.
+ 33.4 191.
+ 32.7 191.
+ 31.9 190.
+ 31.2 190.
+ 30.5 189.
+ 29.8 189.
+ 29.2 188.
+ 28.5 188.
+ 27.9 187.
+ 27.3 187.
+ 26.6 186.
+ 26.0 185.
+ 25.4 185.
+REG_LINE: 119
+ 25.4 -29.7
+ 26.3 -29.7
+ 27.1 -29.7
+ 28.0 -29.7
+ 28.8 -29.6
+ 29.6 -29.5
+ 30.5 -29.4
+ 31.3 -29.3
+ 32.1 -29.2
+ 33.0 -29.0
+ 33.8 -28.8
+ 34.6 -28.6
+ 35.4 -28.4
+ 36.3 -28.2
+ 37.1 -27.9
+ 37.9 -27.6
+ 38.7 -27.3
+ 39.5 -27.0
+ 40.4 -26.7
+ 41.2 -26.3
+ 42.0 -25.9
+ 42.8 -25.5
+ 43.6 -25.1
+ 44.4 -24.7
+ 45.2 -24.2
+ 46.0 -23.7
+ 46.8 -23.2
+ 47.6 -22.7
+ 48.4 -22.2
+ 49.2 -21.6
+ 49.9 -21.1
+ 50.7 -20.5
+ 51.5 -19.8
+ 52.2 -19.2
+ 53.0 -18.6
+ 53.8 -17.9
+ 54.5 -17.2
+ 55.3 -16.5
+ 56.0 -15.8
+ 56.8 -15.0
+ 57.5 -14.3
+ 58.2 -13.5
+ 58.9 -12.7
+ 68.4 .462
+ 76.3 17.0
+ 82.3 36.5
+ 85.9 58.6
+ 86.8 82.4
+ 84.5 107.
+ 84.2 109.
+ 83.9 110.
+ 83.5 112.
+ 83.2 114.
+ 82.8 116.
+ 82.4 117.
+ 82.0 119.
+ 81.6 121.
+ 81.2 122.
+ 80.7 124.
+ 80.2 126.
+ 79.7 128.
+ 79.2 129.
+ 78.7 131.
+ 78.1 132.
+ 77.6 134.
+ 77.0 136.
+ 76.4 137.
+ 75.8 139.
+ 75.1 140.
+ 74.5 142.
+ 73.8 144.
+ 73.1 145.
+ 72.4 147.
+ 71.7 148.
+ 70.9 150.
+ 70.2 151.
+ 69.4 152.
+ 68.6 154.
+ 67.8 155.
+ 67.0 157.
+ 66.1 158.
+ 65.3 159.
+ 64.4 160.
+ 63.5 162.
+ 62.6 163.
+ 61.7 164.
+ 60.8 165.
+ 59.8 166.
+ 58.8 168.
+ 57.9 169.
+ 56.9 170.
+ 55.9 171.
+ 54.9 172.
+ 53.8 173.
+ 52.8 174.
+ 51.8 175.
+ 50.7 175.
+ 49.6 176.
+ 48.5 177.
+ 47.4 178.
+ 46.3 178.
+ 45.2 179.
+ 44.1 180.
+ 43.0 180.
+ 41.8 181.
+ 40.7 182.
+ 39.6 182.
+ 38.4 182.
+ 37.2 183.
+ 36.1 183.
+ 34.9 184.
+ 33.7 184.
+ 32.6 184.
+ 31.4 184.
+ 30.2 185.
+ 29.0 185.
+ 27.8 185.
+ 26.6 185.
+ 25.4 185.
+REG_LINE: 15
+ 25.4 -29.7
+ 31.0 -16.7
+ 35.7 -2.18
+ 39.8 13.5
+ 43.0 30.1
+ 45.5 47.3
+ 47.2 64.8
+ 48.1 82.5
+ 48.2 99.9
+ 47.3 117.
+ 45.5 133.
+ 42.5 149.
+ 38.4 163.
+ 32.8 175.
+ 25.4 185.
+REG_LINE: 197
+ 37.2 2.94
+ 36.4 3.34
+ 35.6 3.71
+ 34.8 4.05
+ 34.0 4.37
+ 33.2 4.65
+ 32.3 4.90
+ 31.5 5.13
+ 30.7 5.32
+ 29.8 5.49
+ 29.0 5.63
+ 28.2 5.74
+ 27.3 5.82
+ 26.5 5.87
+ 25.6 5.89
+ 24.8 5.88
+ 23.9 5.84
+ 23.1 5.77
+ 22.2 5.68
+ 21.4 5.55
+ 20.5 5.40
+ 19.7 5.21
+ 18.9 5.00
+ 18.1 4.75
+ 17.2 4.48
+ 16.4 4.18
+ 15.6 3.85
+ 14.8 3.49
+ 14.0 3.10
+ 13.3 2.69
+ 12.5 2.24
+ 11.8 1.77
+ 11.0 1.26
+ 10.3 .730
+ 9.57 .169
+ 8.87 -.420
+ 8.18 -1.04
+ 7.51 -1.68
+ 6.86 -2.36
+ 6.23 -3.06
+ 5.61 -3.79
+ 5.02 -4.55
+ 4.44 -5.33
+ 3.89 -6.14
+ 3.35 -6.98
+ 2.84 -7.84
+ 2.36 -8.73
+ 1.89 -9.65
+ 1.46 -10.6
+ 1.04 -11.6
+ .660 -12.5
+ .304 -13.6
+ -0.240E-01 -14.6
+ -.322 -15.7
+ -.589 -16.7
+ -.825 -17.8
+ -1.03 -19.0
+ -1.20 -20.1
+ -1.34 -21.3
+ -1.44 -22.5
+ -1.50 -23.6
+ -1.53 -24.9
+ -1.52 -26.1
+ -1.48 -27.3
+ -1.39 -28.6
+ -1.26 -29.8
+ -1.10 -31.1
+ -.889 -32.3
+ -.640 -33.6
+ -.348 -34.9
+ -0.127E-01 -36.1
+ .365 -37.4
+ .787 -38.7
+ 1.25 -39.9
+ 1.76 -41.2
+ 2.32 -42.4
+ 2.92 -43.6
+ 3.56 -44.8
+ 4.24 -45.9
+ 4.97 -47.1
+ 5.74 -48.2
+ 6.56 -49.2
+ 7.41 -50.3
+ 8.30 -51.3
+ 9.23 -52.2
+ 10.2 -53.1
+ 11.2 -54.0
+ 12.2 -54.8
+ 13.3 -55.5
+ 14.4 -56.2
+ 15.5 -56.8
+ 16.7 -57.4
+ 17.9 -57.9
+ 19.1 -58.3
+ 20.3 -58.7
+ 21.5 -58.9
+ 22.7 -59.1
+ 24.0 -59.3
+ 25.2 -59.3
+ 26.4 -59.3
+ 27.7 -59.2
+ 28.9 -59.0
+ 30.1 -58.8
+ 31.4 -58.5
+ 32.6 -58.1
+ 33.7 -57.6
+ 34.9 -57.1
+ 36.0 -56.5
+ 37.1 -55.8
+ 38.2 -55.1
+ 39.3 -54.3
+ 40.3 -53.5
+ 41.3 -52.6
+ 42.2 -51.7
+ 43.1 -50.7
+ 44.0 -49.7
+ 44.8 -48.6
+ 45.6 -47.5
+ 46.4 -46.4
+ 47.1 -45.2
+ 47.7 -44.1
+ 48.3 -42.9
+ 48.9 -41.7
+ 49.4 -40.4
+ 49.9 -39.2
+ 50.4 -37.9
+ 50.8 -36.7
+ 51.1 -35.4
+ 51.4 -34.1
+ 51.7 -32.8
+ 51.9 -31.6
+ 52.1 -30.3
+ 52.2 -29.1
+ 52.3 -27.8
+ 52.4 -26.6
+ 52.4 -25.3
+ 52.4 -24.1
+ 52.4 -22.9
+ 52.3 -21.7
+ 52.2 -20.6
+ 52.0 -19.4
+ 51.8 -18.3
+ 51.6 -17.2
+ 51.3 -16.1
+ 51.0 -15.0
+ 50.7 -14.0
+ 50.4 -13.0
+ 50.0 -12.0
+ 49.6 -11.0
+ 49.2 -10.0
+ 48.7 -9.10
+ 48.2 -8.20
+ 47.7 -7.32
+ 47.2 -6.48
+ 46.7 -5.65
+ 46.1 -4.86
+ 45.5 -4.09
+ 44.9 -3.35
+ 44.3 -2.64
+ 43.6 -1.95
+ 43.0 -1.29
+ 42.3 -.665
+ 41.6 -0.645E-01
+ 40.9 .508
+ 40.2 1.05
+ 39.4 1.57
+ 38.7 2.05
+ 37.9 2.51
+ 37.2 2.94
+ 36.4 3.34
+ 35.6 3.71
+ 34.8 4.05
+ 34.0 4.37
+ 33.2 4.65
+ 32.3 4.90
+ 31.5 5.13
+ 30.7 5.32
+ 29.8 5.49
+ 29.0 5.63
+ 28.2 5.74
+ 27.3 5.82
+ 26.5 5.87
+ 25.6 5.89
+ 24.8 5.88
+ 23.9 5.84
+ 23.1 5.77
+ 22.2 5.68
+ 21.4 5.55
+ 20.5 5.40
+ 19.7 5.21
+ 18.9 5.00
+ 18.1 4.75
+ 17.2 4.48
+ 16.4 4.18
+ 15.6 3.85
+ 14.8 3.49
+ 14.0 3.10
+REG_LINE: 197
+ 44.8 41.5
+ 43.5 42.0
+ 42.1 42.5
+ 40.8 42.9
+ 39.5 43.3
+ 38.1 43.6
+ 36.7 43.9
+ 35.4 44.2
+ 34.0 44.4
+ 32.6 44.6
+ 31.3 44.8
+ 29.9 44.9
+ 28.5 45.0
+ 27.1 45.1
+ 25.7 45.1
+ 24.3 45.1
+ 23.0 45.1
+ 21.6 45.0
+ 20.2 44.9
+ 18.8 44.7
+ 17.4 44.5
+ 16.1 44.3
+ 14.7 44.0
+ 13.3 43.7
+ 12.0 43.4
+ 10.6 43.0
+ 9.29 42.6
+ 7.96 42.2
+ 6.65 41.7
+ 5.34 41.2
+ 4.04 40.6
+ 2.75 40.0
+ 1.48 39.4
+ .220 38.8
+ -1.02 38.0
+ -2.25 37.3
+ -3.47 36.5
+ -4.66 35.7
+ -5.84 34.8
+ -7.00 33.9
+ -8.14 33.0
+ -9.25 32.0
+ -10.3 31.0
+ -11.4 29.9
+ -12.5 28.8
+ -13.5 27.6
+ -14.5 26.4
+ -15.5 25.2
+ -16.4 23.9
+ -17.3 22.5
+ -18.2 21.2
+ -19.0 19.7
+ -19.8 18.2
+ -20.6 16.7
+ -21.4 15.1
+ -22.1 13.5
+ -22.7 11.8
+ -23.3 10.1
+ -23.9 8.29
+ -24.4 6.45
+ -24.9 4.55
+ -25.3 2.59
+ -25.7 .576
+ -26.0 -1.49
+ -26.3 -3.62
+ -26.5 -5.81
+ -26.6 -8.05
+ -26.7 -10.4
+ -26.7 -12.7
+ -26.6 -15.1
+ -26.4 -17.6
+ -26.2 -20.2
+ -25.8 -22.7
+ -25.4 -25.4
+ -24.9 -28.1
+ -24.3 -30.8
+ -23.5 -33.6
+ -22.7 -36.4
+ -21.7 -39.3
+ -20.7 -42.1
+ -19.5 -45.0
+ -18.1 -47.9
+ -16.6 -50.8
+ -15.0 -53.6
+ -13.3 -56.4
+ -11.4 -59.2
+ -9.34 -61.9
+ -7.15 -64.5
+ -4.82 -67.0
+ -2.34 -69.3
+ .268 -71.5
+ 3.01 -73.5
+ 5.87 -75.3
+ 8.84 -76.9
+ 11.9 -78.3
+ 15.1 -79.3
+ 18.3 -80.1
+ 21.5 -80.6
+ 24.8 -80.9
+ 28.1 -80.8
+ 31.3 -80.4
+ 34.6 -79.7
+ 37.7 -78.7
+ 40.8 -77.5
+ 43.8 -76.0
+ 46.7 -74.3
+ 49.5 -72.4
+ 52.2 -70.2
+ 54.7 -67.9
+ 57.1 -65.5
+ 59.4 -63.0
+ 61.5 -60.3
+ 63.4 -57.6
+ 65.2 -54.8
+ 66.9 -51.9
+ 68.4 -49.1
+ 69.8 -46.2
+ 71.1 -43.3
+ 72.2 -40.4
+ 73.2 -37.6
+ 74.1 -34.7
+ 74.9 -31.9
+ 75.5 -29.2
+ 76.1 -26.5
+ 76.6 -23.8
+ 76.9 -21.2
+ 77.2 -18.6
+ 77.4 -16.1
+ 77.5 -13.7
+ 77.6 -11.3
+ 77.5 -8.97
+ 77.4 -6.71
+ 77.3 -4.50
+ 77.0 -2.34
+ 76.7 -.250
+ 76.4 1.79
+ 76.0 3.76
+ 75.5 5.69
+ 75.0 7.55
+ 74.5 9.37
+ 73.9 11.1
+ 73.2 12.8
+ 72.5 14.5
+ 71.8 16.1
+ 71.1 17.6
+ 70.3 19.1
+ 69.4 20.6
+ 68.6 22.0
+ 67.7 23.3
+ 66.7 24.7
+ 65.8 25.9
+ 64.8 27.1
+ 63.8 28.3
+ 62.7 29.5
+ 61.7 30.5
+ 60.6 31.6
+ 59.5 32.6
+ 58.4 33.5
+ 57.2 34.5
+ 56.0 35.3
+ 54.8 36.2
+ 53.6 37.0
+ 52.4 37.7
+ 51.2 38.5
+ 49.9 39.2
+ 48.7 39.8
+ 47.4 40.4
+ 46.1 41.0
+ 44.8 41.5
+ 43.5 42.0
+ 42.1 42.5
+ 40.8 42.9
+ 39.5 43.3
+ 38.1 43.6
+ 36.7 43.9
+ 35.4 44.2
+ 34.0 44.4
+ 32.6 44.6
+ 31.3 44.8
+ 29.9 44.9
+ 28.5 45.0
+ 27.1 45.1
+ 25.7 45.1
+ 24.3 45.1
+ 23.0 45.1
+ 21.6 45.0
+ 20.2 44.9
+ 18.8 44.7
+ 17.4 44.5
+ 16.1 44.3
+ 14.7 44.0
+ 13.3 43.7
+ 12.0 43.4
+ 10.6 43.0
+ 9.29 42.6
+ 7.96 42.2
+ 6.65 41.7
+REG_LINE: 197
+ 48.1 82.5
+ 46.6 82.8
+ 45.0 83.2
+ 43.4 83.5
+ 41.8 83.8
+ 40.3 84.1
+ 38.7 84.4
+ 37.1 84.6
+ 35.5 84.8
+ 33.8 84.9
+ 32.2 85.0
+ 30.6 85.2
+ 29.0 85.2
+ 27.4 85.3
+ 25.8 85.3
+ 24.2 85.3
+ 22.5 85.3
+ 20.9 85.2
+ 19.3 85.1
+ 17.7 85.0
+ 16.1 84.8
+ 14.5 84.6
+ 12.9 84.4
+ 11.3 84.2
+ 9.69 83.9
+ 8.10 83.7
+ 6.52 83.3
+ 4.95 83.0
+ 3.39 82.6
+ 1.83 82.2
+ .284 81.8
+ -1.25 81.3
+ -2.78 80.8
+ -4.29 80.3
+ -5.80 79.7
+ -7.29 79.2
+ -8.77 78.6
+ -10.2 77.9
+ -11.7 77.2
+ -13.1 76.5
+ -14.5 75.8
+ -15.9 75.0
+ -17.3 74.2
+ -18.7 73.4
+ -20.1 72.5
+ -21.4 71.6
+ -22.7 70.7
+ -24.0 69.7
+ -25.3 68.7
+ -26.5 67.6
+ -27.8 66.5
+ -29.0 65.4
+ -30.1 64.2
+ -31.3 63.0
+ -32.4 61.8
+ -33.5 60.5
+ -34.6 59.1
+ -35.7 57.8
+ -36.7 56.3
+ -37.7 54.8
+ -38.7 53.3
+ -39.6 51.7
+ -40.5 50.0
+ -41.3 48.3
+ -42.2 46.5
+ -42.9 44.6
+ -43.7 42.7
+ -44.4 40.6
+ -45.0 38.5
+ -45.7 36.3
+ -46.2 34.0
+ -46.7 31.6
+ -47.1 29.1
+ -47.5 26.5
+ -47.8 23.7
+ -48.1 20.8
+ -48.2 17.8
+ -48.3 14.5
+ -48.2 11.1
+ -48.1 7.50
+ -47.8 3.67
+ -47.3 -.401
+ -46.7 -4.73
+ -45.9 -9.33
+ -44.9 -14.2
+ -43.6 -19.5
+ -42.0 -25.0
+ -40.0 -30.9
+ -37.7 -37.2
+ -34.8 -43.8
+ -31.3 -50.6
+ -27.2 -57.6
+ -22.3 -64.7
+ -16.7 -71.6
+ -10.1 -78.1
+ -2.67 -83.8
+ 5.54 -88.4
+ 14.4 -91.5
+ 23.6 -92.8
+ 32.8 -92.3
+ 41.9 -89.9
+ 50.3 -85.8
+ 58.1 -80.5
+ 65.0 -74.3
+ 71.1 -67.5
+ 76.2 -60.5
+ 80.7 -53.4
+ 84.4 -46.5
+ 87.5 -39.8
+ 90.0 -33.4
+ 92.1 -27.4
+ 93.9 -21.7
+ 95.3 -16.3
+ 96.4 -11.3
+ 97.3 -6.55
+ 98.0 -2.11
+ 98.5 2.06
+ 98.8 5.99
+ 99.1 9.69
+ 99.1 13.2
+ 99.1 16.5
+ 99.0 19.6
+ 98.8 22.6
+ 98.5 25.4
+ 98.2 28.1
+ 97.8 30.6
+ 97.3 33.1
+ 96.8 35.4
+ 96.2 37.7
+ 95.6 39.8
+ 94.9 41.9
+ 94.1 43.8
+ 93.4 45.7
+ 92.6 47.6
+ 91.7 49.3
+ 90.8 51.0
+ 89.9 52.6
+ 89.0 54.2
+ 88.0 55.7
+ 87.0 57.2
+ 85.9 58.6
+ 84.9 60.0
+ 83.8 61.3
+ 82.7 62.5
+ 81.5 63.8
+ 80.3 65.0
+ 79.1 66.1
+ 77.9 67.2
+ 76.7 68.3
+ 75.4 69.3
+ 74.1 70.3
+ 72.8 71.2
+ 71.5 72.2
+ 70.1 73.0
+ 68.8 73.9
+ 67.4 74.7
+ 66.0 75.5
+ 64.6 76.2
+ 63.2 77.0
+ 61.7 77.6
+ 60.3 78.3
+ 58.8 78.9
+ 57.3 79.5
+ 55.8 80.1
+ 54.3 80.6
+ 52.8 81.1
+ 51.2 81.6
+ 49.7 82.0
+ 48.1 82.5
+ 46.6 82.8
+ 45.0 83.2
+ 43.4 83.5
+ 41.8 83.8
+ 40.3 84.1
+ 38.7 84.4
+ 37.1 84.6
+ 35.5 84.8
+ 33.8 84.9
+ 32.2 85.0
+ 30.6 85.2
+ 29.0 85.2
+ 27.4 85.3
+ 25.8 85.3
+ 24.2 85.3
+ 22.5 85.3
+ 20.9 85.2
+ 19.3 85.1
+ 17.7 85.0
+ 16.1 84.8
+ 14.5 84.6
+ 12.9 84.4
+ 11.3 84.2
+ 9.69 83.9
+ 8.10 83.7
+ 6.52 83.3
+ 4.95 83.0
+ 3.39 82.6
+REG_LINE: 158
+ 46.8 122.
+ 25.8 124.
+ 4.68 123.
+ -14.9 119.
+ -31.6 115.
+ -32.7 115.
+ -33.7 115.
+ -34.7 114.
+ -35.7 114.
+ -36.6 114.
+ -37.5 114.
+ -38.4 114.
+ -39.3 113.
+ -40.1 113.
+ -41.0 113.
+ -41.7 113.
+ -42.5 113.
+ -43.2 113.
+ -43.9 113.
+ -44.6 113.
+ -45.2 113.
+ -45.8 114.
+ -46.3 114.
+ -46.8 114.
+ -47.2 115.
+ -47.6 116.
+ -48.0 116.
+ -48.3 117.
+ -48.5 118.
+ -48.6 120.
+ -48.7 121.
+ -48.6 123.
+ -48.4 125.
+ -48.1 128.
+ -47.6 131.
+ -46.8 134.
+ -45.8 138.
+ -44.3 143.
+ -42.4 149.
+ -39.8 155.
+ -36.3 163.
+ -31.6 172.
+ -25.2 181.
+ -16.8 192.
+ -5.96 201.
+ -5.08 202.
+ -4.20 203.
+ -3.30 203.
+ -2.39 204.
+ -1.47 204.
+ -.536 205.
+ .410 205.
+ 1.37 206.
+ 2.33 206.
+ 3.31 207.
+ 4.30 207.
+ 5.30 208.
+ 6.31 208.
+ 7.33 209.
+ 8.36 209.
+ 9.40 209.
+ 10.4 210.
+ 11.5 210.
+ 12.6 210.
+ 13.6 211.
+ 14.7 211.
+ 15.8 211.
+ 16.9 211.
+ 17.9 212.
+ 19.0 212.
+ 20.1 212.
+ 21.2 212.
+ 22.3 212.
+ 23.4 212.
+ 24.5 212.
+ 25.6 212.
+ 26.8 212.
+ 27.9 212.
+ 29.0 212.
+ 30.1 212.
+ 31.2 212.
+ 32.3 212.
+ 33.3 212.
+ 34.4 211.
+ 35.5 211.
+ 36.6 211.
+ 37.7 211.
+ 38.7 210.
+ 39.8 210.
+ 40.8 210.
+ 41.9 209.
+ 42.9 209.
+ 43.9 209.
+ 44.9 208.
+ 46.0 208.
+ 47.0 207.
+ 47.9 207.
+ 48.9 206.
+ 49.9 206.
+ 50.8 205.
+ 51.8 205.
+ 52.7 204.
+ 53.6 204.
+ 54.5 203.
+ 55.4 202.
+ 56.3 202.
+ 57.2 201.
+ 58.0 200.
+ 58.9 200.
+ 59.7 199.
+ 60.5 198.
+ 61.3 198.
+ 62.1 197.
+ 62.9 196.
+ 63.6 196.
+ 73.0 186.
+ 80.2 176.
+ 85.5 166.
+ 89.4 158.
+ 92.4 151.
+ 94.5 145.
+ 96.1 140.
+ 97.3 136.
+ 98.2 132.
+ 98.8 129.
+ 99.2 126.
+ 99.4 124.
+ 99.5 122.
+ 99.5 120.
+ 99.4 119.
+ 99.3 118.
+ 99.0 117.
+ 98.7 116.
+ 98.3 115.
+ 97.9 115.
+ 97.4 114.
+ 96.9 114.
+ 96.3 114.
+ 95.7 113.
+ 95.1 113.
+ 94.4 113.
+ 93.7 113.
+ 92.9 113.
+ 92.2 113.
+ 91.4 113.
+ 90.5 113.
+ 89.7 113.
+ 88.8 114.
+ 87.9 114.
+ 86.9 114.
+ 86.0 114.
+ 85.0 115.
+ 84.0 115.
+ 82.9 115.
+ 66.3 119.
+ 46.8 122.
+ 25.8 124.
+ 4.68 123.
+REG_LINE: 132
+ 39.9 158.
+ 25.7 158.
+ 11.4 158.
+ -1.28 160.
+ -2.08 160.
+ -2.85 160.
+ -3.60 160.
+ -4.34 161.
+ -5.05 161.
+ -5.74 161.
+ -6.40 162.
+ -7.04 162.
+ -7.66 162.
+ -8.25 163.
+ -8.81 163.
+ -9.34 163.
+ -9.84 164.
+ -10.3 164.
+ -10.7 165.
+ -11.1 165.
+ -11.5 166.
+ -11.8 167.
+ -12.1 167.
+ -12.4 168.
+ -12.6 169.
+ -12.7 169.
+ -12.8 170.
+ -12.9 171.
+ -12.9 172.
+ -12.9 173.
+ -12.8 174.
+ -12.6 174.
+ -12.4 175.
+ -12.1 177.
+ -11.7 178.
+ -11.3 179.
+ -10.8 180.
+ -10.2 181.
+ -9.53 182.
+ -8.78 184.
+ -7.94 185.
+ -7.02 186.
+ -6.00 188.
+ -4.88 189.
+ -3.67 190.
+ -2.36 192.
+ -.951 193.
+ .557 194.
+ 2.16 195.
+ 3.87 197.
+ 5.66 198.
+ 7.55 199.
+ 9.52 200.
+ 11.6 201.
+ 13.7 202.
+ 15.9 202.
+ 18.1 203.
+ 20.4 203.
+ 22.7 203.
+ 25.0 203.
+ 27.3 203.
+ 29.6 203.
+ 31.9 203.
+ 34.1 202.
+ 36.3 202.
+ 38.5 201.
+ 40.6 200.
+ 42.6 199.
+ 44.5 198.
+ 46.3 197.
+ 48.1 196.
+ 49.7 195.
+ 51.2 193.
+ 52.7 192.
+ 54.0 191.
+ 55.3 189.
+ 56.5 188.
+ 57.5 187.
+ 58.5 185.
+ 59.3 184.
+ 60.1 183.
+ 60.8 182.
+ 61.4 180.
+ 62.0 179.
+ 62.4 178.
+ 62.8 177.
+ 63.2 176.
+ 63.4 175.
+ 63.6 174.
+ 63.7 173.
+ 63.8 172.
+ 63.8 171.
+ 63.8 170.
+ 63.7 170.
+ 63.5 169.
+ 63.3 168.
+ 63.1 167.
+ 62.9 167.
+ 62.5 166.
+ 62.2 166.
+ 61.8 165.
+ 61.4 165.
+ 60.9 164.
+ 60.4 164.
+ 59.9 163.
+ 59.4 163.
+ 58.8 162.
+ 58.2 162.
+ 57.6 162.
+ 56.9 161.
+ 56.2 161.
+ 55.5 161.
+ 54.8 161.
+ 54.0 160.
+ 53.3 160.
+ 52.5 160.
+ 51.7 160.
+ 50.9 159.
+ 50.0 159.
+ 49.2 159.
+ 48.3 159.
+ 47.4 159.
+ 46.5 159.
+ 45.6 159.
+ 44.7 158.
+ 43.8 158.
+ 42.8 158.
+ 41.9 158.
+ 40.9 158.
+ 39.9 158.
+ 25.7 158.
+ 11.4 158.
+REG_LINE: 2
+ 40.8 84.0
+ 40.8 85.8
+REG_LINE: 2
+ 33.3 85.0
+ 33.3 86.7
+REG_LINE: 2
+ 25.8 85.3
+ 25.8 87.0
+REG_LINE: 2
+ 18.2 85.0
+ 18.2 86.8
+REG_LINE: 2
+ 10.7 84.1
+ 10.7 85.9
+REG_LINE: 2
+ -3.79 80.5
+ -3.83 82.2
+REG_LINE: 2
+ -10.7 77.7
+ -10.8 79.4
+REG_LINE: 2
+ -17.3 74.2
+ -17.4 76.0
+REG_LINE: 2
+ -23.6 70.0
+ -23.6 71.8
+REG_LINE: 2
+ -29.4 65.0
+ -29.5 66.8
+REG_LINE: 2
+ -39.3 52.2
+ -39.4 54.0
+REG_LINE: 2
+ -43.2 44.0
+ -43.4 45.7
+REG_LINE: 2
+ -46.2 34.0
+ -46.4 35.8
+REG_LINE: 2
+ -48.0 21.8
+ -48.3 23.5
+REG_LINE: 2
+ -48.0 6.25
+ -48.3 7.96
+REG_LINE: 2
+ -35.8 -41.5
+ -36.5 -39.9
+REG_LINE: 2
+ -14.6 -73.9
+ -15.8 -72.6
+REG_LINE: 2
+ 23.6 -92.8
+ 22.6 -94.3
+REG_LINE: 2
+ 62.8 -76.5
+ 64.1 -75.2
+REG_LINE: 2
+ 85.5 -44.2
+ 86.2 -42.6
+REG_LINE: 2
+ 98.7 4.70
+ 99.1 6.41
+REG_LINE: 2
+ 99.0 20.6
+ 99.3 22.3
+REG_LINE: 2
+ 97.3 33.1
+ 97.5 34.8
+REG_LINE: 2
+ 94.4 43.2
+ 94.6 44.9
+REG_LINE: 2
+ 90.5 51.6
+ 90.7 53.3
+REG_LINE: 2
+ 80.7 64.6
+ 80.8 66.3
+REG_LINE: 2
+ 75.0 69.6
+ 75.1 71.4
+REG_LINE: 2
+ 68.8 73.9
+ 68.8 75.6
+REG_LINE: 2
+ 62.2 77.4
+ 62.2 79.2
+REG_LINE: 2
+ 55.3 80.3
+ 55.3 82.0
+REG_LINE: 2
+ 40.8 84.0
+ 40.8 85.8
+REG_LINE: 2
+ 33.3 85.0
+ 33.3 86.7
+REG_LINE: 2
+ 25.8 85.3
+ 25.8 87.0
+REG_LINE: 2
+ 18.2 85.0
+ 18.2 86.8
+REG_LINE: 2
+ 10.7 84.1
+ 10.7 85.9
+REG_LINE: 2
+ 23.1 -34.3
+ 21.6 -33.5
+REG_LINE: 2
+ 20.6 -38.6
+ 19.1 -37.7
+REG_LINE: 2
+ 18.0 -42.6
+ 16.5 -41.7
+REG_LINE: 2
+ 15.2 -46.2
+ 13.8 -45.2
+REG_LINE: 2
+ 12.3 -49.4
+ 10.9 -48.4
+REG_LINE: 2
+ 6.00 -54.5
+ 4.63 -53.5
+REG_LINE: 2
+ 2.59 -56.3
+ 1.25 -55.2
+REG_LINE: 2
+ -1.03 -57.5
+ -2.33 -56.3
+REG_LINE: 2
+ -4.86 -58.0
+ -6.12 -56.8
+REG_LINE: 2
+ -8.94 -57.7
+ -10.1 -56.4
+REG_LINE: 2
+ -17.9 -54.1
+ -19.0 -52.7
+REG_LINE: 2
+ -22.8 -50.3
+ -23.9 -48.9
+REG_LINE: 2
+ -28.1 -44.9
+ -29.0 -43.4
+REG_LINE: 2
+ -33.6 -37.4
+ -34.4 -35.9
+REG_LINE: 2
+ -39.3 -27.4
+ -40.0 -25.8
+REG_LINE: 2
+ -50.1 2.52
+ -50.5 4.22
+REG_LINE: 2
+ -54.3 23.2
+ -54.6 24.9
+REG_LINE: 2
+ -56.8 47.3
+ -56.8 49.1
+REG_LINE: 2
+ -56.8 73.8
+ -56.1 75.5
+REG_LINE: 2
+ -53.9 101.
+ -54.0 98.8
+REG_LINE: 2
+ -41.1 146.
+ -41.7 144.
+REG_LINE: 2
+ -32.8 162.
+ -33.7 161.
+REG_LINE: 2
+ -24.5 175.
+ -25.5 173.
+REG_LINE: 2
+ -16.5 183.
+ -17.6 182.
+REG_LINE: 2
+ -9.06 188.
+ -10.4 187.
+REG_LINE: 2
+ 3.65 193.
+ 2.17 192.
+REG_LINE: 2
+ 9.03 193.
+ 7.49 192.
+REG_LINE: 2
+ 13.8 192.
+ 12.2 192.
+REG_LINE: 2
+ 18.1 190.
+ 16.5 190.
+REG_LINE: 2
+ 22.0 188.
+ 20.3 187.
+REG_LINE: 15
+ 3.39 82.6
+ 6.52 83.3
+ 9.69 83.9
+ 12.9 84.4
+ 16.1 84.8
+ 19.3 85.1
+ 22.5 85.3
+ 25.8 85.3
+ 29.0 85.2
+ 32.2 85.0
+ 35.5 84.8
+ 38.7 84.4
+ 41.8 83.8
+ 45.0 83.2
+ 48.1 82.5
+REG_LINE: 15
+ 3.39 82.6
+ .284 81.8
+ -2.78 80.8
+ -5.80 79.7
+ -8.77 78.6
+ -11.7 77.2
+ -14.5 75.8
+ -17.3 74.2
+ -20.1 72.5
+ -22.7 70.7
+ -25.3 68.7
+ -27.8 66.5
+ -30.1 64.2
+ -32.4 61.8
+ -34.6 59.1
+REG_LINE: 15
+ -34.6 59.1
+ -36.7 56.3
+ -38.7 53.3
+ -40.5 50.0
+ -42.2 46.5
+ -43.7 42.7
+ -45.0 38.5
+ -46.2 34.0
+ -47.1 29.1
+ -47.8 23.7
+ -48.2 17.8
+ -48.2 11.1
+ -47.8 3.67
+ -46.7 -4.73
+ -44.9 -14.2
+REG_LINE: 93
+ -44.9 -14.2
+ -42.0 -25.0
+ -37.7 -37.2
+ -31.3 -50.6
+ -22.3 -64.7
+ -21.6 -65.7
+ -20.8 -66.7
+ -20.0 -67.7
+ -19.2 -68.7
+ -18.4 -69.7
+ -17.5 -70.7
+ -16.7 -71.6
+ -15.8 -72.6
+ -14.9 -73.5
+ -14.0 -74.5
+ -13.0 -75.4
+ -12.1 -76.3
+ -11.1 -77.2
+ -10.1 -78.1
+ -9.08 -79.0
+ -8.06 -79.8
+ -7.01 -80.7
+ -5.95 -81.5
+ -4.87 -82.3
+ -3.78 -83.1
+ -2.67 -83.8
+ -1.54 -84.6
+ -.395 -85.3
+ .764 -86.0
+ 1.94 -86.6
+ 3.13 -87.2
+ 4.33 -87.8
+ 5.54 -88.4
+ 6.77 -89.0
+ 8.01 -89.5
+ 9.27 -89.9
+ 10.5 -90.4
+ 11.8 -90.8
+ 13.1 -91.2
+ 14.4 -91.5
+ 15.7 -91.8
+ 17.0 -92.1
+ 18.3 -92.3
+ 19.6 -92.5
+ 20.9 -92.6
+ 22.3 -92.8
+ 23.6 -92.8
+ 24.9 -92.9
+ 26.2 -92.9
+ 27.6 -92.8
+ 28.9 -92.7
+ 30.2 -92.6
+ 31.5 -92.5
+ 32.8 -92.3
+ 34.2 -92.0
+ 35.5 -91.8
+ 36.8 -91.4
+ 38.0 -91.1
+ 39.3 -90.7
+ 40.6 -90.3
+ 41.9 -89.9
+ 43.1 -89.4
+ 44.3 -88.9
+ 45.6 -88.3
+ 46.8 -87.7
+ 48.0 -87.1
+ 49.2 -86.5
+ 50.3 -85.8
+ 51.5 -85.2
+ 52.6 -84.4
+ 53.8 -83.7
+ 54.9 -82.9
+ 56.0 -82.2
+ 57.0 -81.4
+ 58.1 -80.5
+ 59.1 -79.7
+ 60.2 -78.8
+ 61.2 -78.0
+ 62.2 -77.1
+ 63.1 -76.2
+ 64.1 -75.2
+ 65.0 -74.3
+ 65.9 -73.4
+ 66.8 -72.4
+ 67.7 -71.4
+ 68.6 -70.5
+ 69.4 -69.5
+ 70.2 -68.5
+ 71.1 -67.5
+ 80.7 -53.4
+ 87.5 -39.8
+ 92.1 -27.4
+ 95.3 -16.3
+REG_LINE: 15
+ 95.3 -16.3
+ 97.3 -6.55
+ 98.5 2.06
+ 99.1 9.69
+ 99.1 16.5
+ 98.8 22.6
+ 98.2 28.1
+ 97.3 33.1
+ 96.2 37.7
+ 94.9 41.9
+ 93.4 45.7
+ 91.7 49.3
+ 89.9 52.6
+ 88.0 55.7
+ 85.9 58.6
+REG_LINE: 15
+ 85.9 58.6
+ 83.8 61.3
+ 81.5 63.8
+ 79.1 66.1
+ 76.7 68.3
+ 74.1 70.3
+ 71.5 72.2
+ 68.8 73.9
+ 66.0 75.5
+ 63.2 77.0
+ 60.3 78.3
+ 57.3 79.5
+ 54.3 80.6
+ 51.2 81.6
+ 48.1 82.5
+REG_LINE: 15
+ 48.1 82.5
+ 45.0 83.2
+ 41.8 83.8
+ 38.7 84.4
+ 35.5 84.8
+ 32.2 85.0
+ 29.0 85.2
+ 25.8 85.3
+ 22.5 85.3
+ 19.3 85.1
+ 16.1 84.8
+ 12.9 84.4
+ 9.69 83.9
+ 6.52 83.3
+ 3.39 82.6
+REG_LINE: 15
+ 48.1 82.5
+ 45.0 83.2
+ 41.8 83.8
+ 38.7 84.4
+ 35.5 84.8
+ 32.2 85.0
+ 29.0 85.2
+ 25.8 85.3
+ 22.5 85.3
+ 19.3 85.1
+ 16.1 84.8
+ 12.9 84.4
+ 9.69 83.9
+ 6.52 83.3
+ 3.39 82.6
+REG_LINE: 15
+ 25.4 -29.7
+ 24.4 -31.7
+ 23.4 -33.7
+ 22.4 -35.6
+ 21.3 -37.4
+ 20.2 -39.2
+ 19.1 -40.9
+ 18.0 -42.6
+ 16.8 -44.2
+ 15.6 -45.7
+ 14.4 -47.2
+ 13.1 -48.6
+ 11.9 -49.9
+ 10.6 -51.1
+ 9.23 -52.2
+REG_LINE: 15
+ 9.23 -52.2
+ 7.87 -53.3
+ 6.48 -54.2
+ 5.05 -55.1
+ 3.58 -55.9
+ 2.08 -56.5
+ .548 -57.1
+ -1.03 -57.5
+ -2.64 -57.8
+ -4.30 -58.0
+ -6.00 -58.0
+ -7.75 -57.9
+ -9.54 -57.6
+ -11.4 -57.1
+ -13.3 -56.4
+REG_LINE: 15
+ -13.3 -56.4
+ -15.2 -55.6
+ -17.2 -54.5
+ -19.3 -53.2
+ -21.4 -51.6
+ -23.6 -49.7
+ -25.8 -47.5
+ -28.1 -44.9
+ -30.4 -42.0
+ -32.8 -38.6
+ -35.2 -34.8
+ -37.6 -30.5
+ -40.1 -25.7
+ -42.5 -20.3
+ -44.9 -14.2
+REG_LINE: 15
+ -44.9 -14.2
+ -47.2 -7.52
+ -49.4 -.109
+ -51.4 8.02
+ -53.3 16.9
+ -54.8 26.4
+ -56.0 36.6
+ -56.8 47.3
+ -57.1 58.5
+ -56.9 70.0
+ -56.2 81.6
+ -55.0 93.1
+ -53.3 104.
+ -51.0 115.
+ -48.4 125.
+REG_LINE: 15
+ -48.4 125.
+ -45.4 135.
+ -42.2 143.
+ -38.8 151.
+ -35.2 158.
+ -31.6 164.
+ -28.0 170.
+ -24.5 175.
+ -21.0 179.
+ -17.6 182.
+ -14.3 185.
+ -11.1 187.
+ -8.06 189.
+ -5.15 190.
+ -2.36 192.
+REG_LINE: 15
+ -2.36 192.
+ .299 192.
+ 2.83 193.
+ 5.25 193.
+ 7.56 193.
+ 9.75 193.
+ 11.8 193.
+ 13.8 192.
+ 15.7 192.
+ 17.6 191.
+ 19.3 190.
+ 20.9 189.
+ 22.5 188.
+ 24.0 186.
+ 25.4 185.
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+Forward matrix value
+ M2 = -0.811474832908671 # Forward matrix value
+ M3 = 0.171224898552328 # Forward matrix value
+ M4 = -0.862236746712233 # Forward matrix value
+ M5 = -0.476686298035564 # Forward matrix value
+ M6 = -0.941127638091139 # Forward matrix value
+ M7 = 0 # Forward matrix value
+ M8 = -0.338051429254475 # Forward matrix value
+ Form = "Full" # Matrix storage form
+ End MatrixMap
+ MapB = # Second component Mapping
+ Begin SphMap # Cartesian to Spherical mapping
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ UntRd = 1 # All input vectors have unit length
+ PlrLg = -2.61046557479594 # Polar longitude (rad.s)
+ End SphMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ End FrameSet
+ Begin FrameSet # Set of inter-related coordinate systems
+# Title = "Pixel coordinates; first pixel at (-100.5,-200.5)" # Title of coordinate system
+# Naxes = 2 # Number of coordinate axes
+# Domain = "POLAR" # Coordinate system domain
+# Lbl1 = "Pixel coordinate 1" # Label for axis 1
+# Lbl2 = "Pixel coordinate 2" # Label for axis 2
+# Uni1 = "pixel" # Units for axis 1
+# Uni2 = "pixel" # Units for axis 2
+ IsA Frame # Coordinate system description
+ Nframe = 2 # Number of Frames in FrameSet
+# Base = 1 # Index of base Frame
+ Currnt = 2 # Index of current Frame
+ Nod1 = 2 # Frame 1 is associated with node 2
+ Nod2 = 1 # Frame 2 is associated with node 1
+ Lnk2 = 1 # Node 2 is derived from node 1
+ Frm1 = # Frame number 1
+ Begin Frame # Coordinate system description
+ Title = "Data grid indices; first pixel at (1,1) " # Title of coordinate system
+ Naxes = 2 # Number of coordinate axes
+ Domain = "GRID" # Coordinate system domain
+# Lbl1 = "Data grid index 1" # Label for axis 1
+# Lbl2 = "Data grid index 2" # Label for axis 2
+# Uni1 = "pixel" # Units for axis 1
+# Uni2 = "pixel" # Units for axis 2
+ Ax1 = # Axis number 1
+ Begin Axis # Coordinate axis
+ Label = "Data grid index 1" # Axis Label
+ Symbol = "g1" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ Ax2 = # Axis number 2
+ Begin Axis # Coordinate axis
+ Label = "Data grid index 2" # Axis Label
+ Symbol = "g2" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ End Frame
+ Frm2 = # Frame number 2
+ Begin Frame # Coordinate system description
+ Title = "Pixel coordinates; first pixel at (-100.5,-200.5)" # Title of coordinate system
+ Naxes = 2 # Number of coordinate axes
+ Domain = "POLAR" # Coordinate system domain
+# Lbl1 = "Pixel coordinate 1" # Label for axis 1
+# Lbl2 = "Pixel coordinate 2" # Label for axis 2
+# Uni1 = "pixel" # Units for axis 1
+# Uni2 = "pixel" # Units for axis 2
+ Ax1 = # Axis number 1
+ Begin Axis # Coordinate axis
+ Label = "Pixel coordinate 1" # Axis Label
+ REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '240'
+ 4.00 80.2 TC -.245 .969
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '300'
+ -32.7 57.6 TC -.791 .612
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '0'
+ -42.4 -13.7 BC .974 .227
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '60'
+ 92.9 -15.7 BC -.973 .231
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '120'
+ 84.0 57.1 TC .798 .602
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '180'
+ 47.5 80.0 TC .253 .968
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '-90'
+ 27.7 -30.8 TC -.899 .438
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '-60'
+ 10.8 -54.2 TC -.629 .777
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '-30'
+ -14.2 -58.8 TC .374 .927
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '0'
+ -47.2 -15.1 TC .937 .350
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '30'
+ -50.8 126. BC -.960 .278
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '60'
+ -3.21 194. BC -.341 .940
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '90'
+ 27.2 187. BC .711 .704
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 1
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: ' A FITS test'
+ 31.5 225. BC .000 1.00
+
+
+
+
+ FITS test number 2
+ ====================
+
+
+
+AST_SHOW:
+
+REG_SINK:
+COMMENT AST ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+AST
+COMMENT AST Beginning of AST data for FrameSet object
+AST
+COMMENT AST ................................................................
+AST
+COMMENT AST ................................................................
+AST
+COMMENT AST End of AST data for FrameSet object
+AST
+COMMENT AST ----------------------------------------------------------------
+
+Objects written: 1
+
+Native Encoding:
+
+COMMENT AST ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ AST
+COMMENT AST WCS information in AST format AST
+COMMENT AST See http://www.starlink.ac.uk/ast/ AST
+COMMENT AST Beginning of AST data for FrameSet object AST
+COMMENT AST ................................................................ AST
+BEGAST_A= 'FrameSet' / Set of inter-related coordinate systems
+NFRAME_A= 2 / Number of Frames in FrameSet
+CURRNT_A= 2 / Index of current Frame
+NOD1_A = 2 / Frame 1 is associated with node 2
+NOD2_A = 1 / Frame 2 is associated with node 1
+LNK2_A = 1 / Node 2 is derived from node 1
+FRM1_A = ' ' / Frame number 1
+BEGAST_B= 'Frame ' / Coordinate system description
+TITLE_A = 'Data grid indices; first pixel at (1&'/ Title of coordinate system
+CONTINUE '",1) "'
+NAXES_A = 2 / Number of coordinate axes
+DOMAIN_A= 'GRID ' / Coordinate system domain
+AX1_A = ' ' / Axis number 1
+BEGAST_C= 'Axis ' / Coordinate axis
+LABEL_A = 'Data grid index 1' / Axis Label
+SYMBOL_A= 'g1 ' / Axis symbol
+UNIT_A = 'pixel ' / Axis units
+FORMAT_A= '%3.1f ' / Format specifier
+ENDAST_A= 'Axis ' / End of object definition
+AX2_A = ' ' / Axis number 2
+BEGAST_D= 'Axis ' / Coordinate axis
+LABEL_B = 'Data grid index 2' / Axis Label
+SYMBOL_B= 'g2 ' / Axis symbol
+UNIT_B = 'pixel ' / Axis units
+FORMAT_B= '%3.1f ' / Format specifier
+ENDAST_B= 'Axis ' / End of object definition
+ENDAST_C= 'Frame ' / End of object definition
+FRM2_A = ' ' / Frame number 2
+BEGAST_E= 'Frame ' / Coordinate system description
+TITLE_B = 'Pixel coordinates; first pixel at (-&'/ Title of coordinate system
+CONTINUE '100.5,-200.5)'
+NAXES_B = 2 / Number of coordinate axes
+DOMAIN_B= 'POLAR ' / Coordinate system domain
+AX1_B = ' ' / Axis number 1
+BEGAST_F= 'Axis ' / Coordinate axis
+LABEL_C = 'Pixel coordinate 1' / Axis Label
+SYMBOL_C= 'p1 ' / Axis symbol
+UNIT_C = 'pixel ' / Axis units
+FORMAT_C= '%3.1f ' / Format specifier
+ENDAST_D= 'Axis ' / End of object definition
+AX2_B = ' ' / Axis number 2
+BEGAST_G= 'Axis ' / Coordinate axis
+LABEL_D = 'Pixel coordinate 2' / Axis Label
+SYMBOL_D= 'p2 ' / Axis symbol
+UNIT_D = 'pixel ' / Axis units
+FORMAT_D= '%3.1f ' / Format specifier
+ENDAST_E= 'Axis ' / End of object definition
+ENDAST_F= 'Frame ' / End of object definition
+MAP2_A = ' ' / Mapping between nodes 1 and 2
+BEGAST_H= 'CmpMap ' / Compound Mapping
+NIN_A = 2 / Number of input coordinates
+ISA_A = 'Mapping ' / Mapping between coordinate systems
+INVA_A = 1 / First Mapping used in inverse direction
+INVB_A = 1 / Second Mapping used in inverse direction
+MAPA_A = ' ' / First component Mapping
+BEGAST_I= 'MathMap ' / Transformation using mathematical functions
+NIN_B = 2 / Number of input coordinates
+INVERT_A= 0 / Mapping not inverted
+ISA_B = 'Mapping ' / Mapping between coordinate systems
+FWD1_A = 'r=sqrt(x*x+y*y)' / Forward function 1
+FWD2_A = 'theta=atan2(y,x)' / Forward function 2
+INV1_A = 'x=r*cos(theta)' / Inverse function 1
+INV2_A = 'y=r*sin(theta)' / Inverse function 2
+SIMPFI_A= 1 / Forward-inverse pairs may simplify
+SIMPIF_A= 1 / Inverse-forward pairs may simplify
+ENDAST_G= 'MathMap ' / End of object definition
+MAPB_A = ' ' / Second component Mapping
+BEGAST_J= 'WinMap ' / Map one window on to another
+NIN_C = 2 / Number of input coordinates
+INVERT_B= 0 / Mapping not inverted
+ISA_C = 'Mapping ' / Mapping between coordinate systems
+SFT1_A = -101.5 / Shift for axis 1
+SFT2_A = -201.5 / Shift for axis 2
+ENDAST_H= 'WinMap ' / End of object definition
+ENDAST_I= 'CmpMap ' / End of object definition
+ENDAST_J= 'FrameSet' / End of object definition
+COMMENT AST ................................................................ AST
+COMMENT AST End of AST data for FrameSet object AST
+COMMENT AST ---------------------------------------------------------------- AST
+
+ATTRIBUTES:
+ Colour(axis1) : 1
+ Font(Stri) : 1
+ Nout : 1
+ Class : 4
+ Tol : 0.100000E-01
+ Gap(1) : 50.0000
+ Border : 0
+ Invert : 0
+ TextLabGap : 0.100000E-01
+ Nin : 2
+ Current : 3
+ Base : 1
+ Nobject : 1
+ RefCOUNT : 1
+
+AST_GRID:
+REG_LINE: 197
+ 10.8 124.
+ 10.7 123.
+ 10.5 122.
+ 10.3 121.
+ 10.2 120.
+ 10.1 119.
+ 10.0 118.
+ 9.94 117.
+ 9.89 116.
+ 9.85 115.
+ 9.84 113.
+ 9.85 112.
+ 9.88 111.
+ 9.93 110.
+ 10.0 109.
+ 10.1 108.
+ 10.2 107.
+ 10.3 106.
+ 10.5 105.
+ 10.6 104.
+ 10.8 103.
+ 11.0 102.
+ 11.2 100.
+ 11.5 99.5
+ 11.7 98.5
+ 12.0 97.5
+ 12.3 96.6
+ 12.6 95.6
+ 13.0 94.7
+ 13.3 93.9
+ 13.7 93.0
+ 14.0 92.2
+ 14.4 91.4
+ 14.8 90.6
+ 15.2 89.8
+ 15.7 89.1
+ 16.1 88.4
+ 16.5 87.8
+ 17.0 87.2
+ 17.5 86.6
+ 18.0 86.0
+ 18.5 85.5
+ 19.0 85.0
+ 19.5 84.6
+ 20.0 84.2
+ 20.5 83.8
+ 21.1 83.5
+ 21.6 83.2
+ 22.1 82.9
+ 22.7 82.7
+ 23.2 82.5
+ 23.8 82.4
+ 24.3 82.3
+ 24.9 82.2
+ 25.5 82.2
+ 26.0 82.2
+ 26.6 82.3
+ 27.1 82.4
+ 27.7 82.5
+ 28.2 82.7
+ 28.8 82.9
+ 29.3 83.2
+ 29.9 83.4
+ 30.4 83.8
+ 30.9 84.2
+ 31.4 84.6
+ 32.0 85.0
+ 32.5 85.5
+ 33.0 86.0
+ 33.4 86.6
+ 33.9 87.1
+ 34.4 87.8
+ 34.8 88.4
+ 35.3 89.1
+ 35.7 89.8
+ 36.1 90.6
+ 36.5 91.3
+ 36.9 92.1
+ 37.3 93.0
+ 37.6 93.8
+ 38.0 94.7
+ 38.3 95.6
+ 38.6 96.5
+ 38.9 97.5
+ 39.2 98.5
+ 39.4 99.4
+ 39.7 100.
+ 39.9 101.
+ 40.1 103.
+ 40.3 104.
+ 40.5 105.
+ 40.6 106.
+ 40.7 107.
+ 40.8 108.
+ 40.9 109.
+ 41.0 110.
+ 41.1 111.
+ 41.1 112.
+ 41.1 113.
+ 41.1 115.
+ 41.1 116.
+ 41.0 117.
+ 40.9 118.
+ 40.8 119.
+ 40.7 120.
+ 40.6 121.
+ 40.5 122.
+ 40.3 123.
+ 40.1 124.
+ 39.9 125.
+ 39.7 126.
+ 39.4 127.
+ 39.2 128.
+ 38.9 129.
+ 38.6 130.
+ 38.3 131.
+ 38.0 132.
+ 37.6 133.
+ 37.3 134.
+ 36.9 135.
+ 36.5 136.
+ 36.1 136.
+ 35.7 137.
+ 35.3 138.
+ 34.8 138.
+ 34.4 139.
+ 33.9 140.
+ 33.4 140.
+ 33.0 141.
+ 32.5 141.
+ 32.0 142.
+ 31.4 142.
+ 30.9 143.
+ 30.4 143.
+ 29.9 143.
+ 29.3 144.
+ 28.8 144.
+ 28.2 144.
+ 27.7 144.
+ 27.1 145.
+ 26.6 145.
+ 26.0 145.
+ 25.5 145.
+ 24.9 145.
+ 24.3 145.
+ 23.8 145.
+ 23.2 144.
+ 22.7 144.
+ 22.1 144.
+ 21.6 144.
+ 21.1 143.
+ 20.5 143.
+ 20.0 143.
+ 19.5 142.
+ 19.0 142.
+ 18.5 141.
+ 18.0 141.
+ 17.5 140.
+ 17.0 140.
+ 16.5 139.
+ 16.1 138.
+ 15.7 138.
+ 15.2 137.
+ 14.8 136.
+ 14.4 136.
+ 14.0 135.
+ 13.7 134.
+ 13.3 133.
+ 13.0 132.
+ 12.6 131.
+ 12.3 130.
+ 12.0 129.
+ 11.7 128.
+ 11.5 127.
+ 11.2 126.
+ 11.0 125.
+ 10.8 124.
+ 10.6 123.
+ 10.5 122.
+ 10.3 121.
+ 10.2 120.
+ 10.1 119.
+ 10.0 118.
+ 9.93 117.
+ 9.88 116.
+ 9.85 115.
+ 9.84 113.
+ 9.85 112.
+ 9.89 111.
+ 9.94 110.
+ 10.0 109.
+ 10.1 108.
+ 10.2 107.
+ 10.3 106.
+ 10.5 105.
+ 10.7 104.
+ 10.8 102.
+REG_LINE: 197
+ -3.80 135.
+ -4.17 133.
+ -4.50 131.
+ -4.80 129.
+ -5.06 127.
+ -5.28 125.
+ -5.46 122.
+ -5.60 120.
+ -5.70 118.
+ -5.76 116.
+ -5.78 114.
+ -5.76 111.
+ -5.70 109.
+ -5.61 107.
+ -5.47 105.
+ -5.29 102.
+ -5.07 100.
+ -4.82 98.1
+ -4.53 95.9
+ -4.19 93.8
+ -3.82 91.7
+ -3.42 89.6
+ -2.97 87.5
+ -2.49 85.5
+ -1.97 83.5
+ -1.42 81.6
+ -.838 79.7
+ -.219 77.8
+ .433 76.0
+ 1.12 74.3
+ 1.83 72.6
+ 2.58 70.9
+ 3.35 69.3
+ 4.15 67.7
+ 4.98 66.2
+ 5.84 64.8
+ 6.72 63.4
+ 7.62 62.1
+ 8.55 60.9
+ 9.50 59.7
+ 10.5 58.6
+ 11.5 57.6
+ 12.5 56.6
+ 13.5 55.7
+ 14.5 54.9
+ 15.6 54.2
+ 16.6 53.5
+ 17.7 52.9
+ 18.8 52.4
+ 19.9 51.9
+ 21.0 51.6
+ 22.1 51.3
+ 23.2 51.1
+ 24.3 51.0
+ 25.4 50.9
+ 26.6 51.0
+ 27.7 51.1
+ 28.8 51.3
+ 29.9 51.6
+ 31.0 51.9
+ 32.1 52.4
+ 33.2 52.9
+ 34.3 53.5
+ 35.3 54.1
+ 36.4 54.9
+ 37.4 55.7
+ 38.4 56.6
+ 39.4 57.5
+ 40.4 58.6
+ 41.4 59.7
+ 42.4 60.8
+ 43.3 62.1
+ 44.2 63.4
+ 45.1 64.8
+ 45.9 66.2
+ 46.8 67.7
+ 47.6 69.2
+ 48.3 70.8
+ 49.1 72.5
+ 49.8 74.2
+ 50.5 76.0
+ 51.1 77.8
+ 51.8 79.6
+ 52.3 81.5
+ 52.9 83.5
+ 53.4 85.5
+ 53.9 87.5
+ 54.3 89.5
+ 54.7 91.6
+ 55.1 93.7
+ 55.5 95.8
+ 55.7 98.0
+ 56.0 100.
+ 56.2 102.
+ 56.4 105.
+ 56.5 107.
+ 56.6 109.
+ 56.7 111.
+ 56.7 113.
+ 56.7 116.
+ 56.6 118.
+ 56.5 120.
+ 56.4 122.
+ 56.2 125.
+ 56.0 127.
+ 55.7 129.
+ 55.5 131.
+ 55.1 133.
+ 54.7 135.
+ 54.3 137.
+ 53.9 139.
+ 53.4 141.
+ 52.9 143.
+ 52.3 145.
+ 51.8 147.
+ 51.1 149.
+ 50.5 151.
+ 49.8 153.
+ 49.1 154.
+ 48.3 156.
+ 47.6 158.
+ 46.8 159.
+ 45.9 161.
+ 45.1 162.
+ 44.2 163.
+ 43.3 165.
+ 42.4 166.
+ 41.4 167.
+ 40.4 168.
+ 39.4 169.
+ 38.4 170.
+ 37.4 171.
+ 36.4 172.
+ 35.3 173.
+ 34.3 173.
+ 33.2 174.
+ 32.1 175.
+ 31.0 175.
+ 29.9 175.
+ 28.8 176.
+ 27.7 176.
+ 26.6 176.
+ 25.4 176.
+ 24.3 176.
+ 23.2 176.
+ 22.1 176.
+ 21.0 175.
+ 19.9 175.
+ 18.8 174.
+ 17.7 174.
+ 16.6 173.
+ 15.6 173.
+ 14.5 172.
+ 13.5 171.
+ 12.5 170.
+ 11.5 169.
+ 10.5 168.
+ 9.50 167.
+ 8.55 166.
+ 7.62 165.
+ 6.72 163.
+ 5.84 162.
+ 4.98 161.
+ 4.15 159.
+ 3.35 158.
+ 2.58 156.
+ 1.83 154.
+ 1.12 153.
+ .433 151.
+ -.219 149.
+ -.838 147.
+ -1.42 145.
+ -1.97 143.
+ -2.49 141.
+ -2.97 139.
+ -3.42 137.
+ -3.82 135.
+ -4.19 133.
+ -4.53 131.
+ -4.82 129.
+ -5.07 127.
+ -5.29 124.
+ -5.47 122.
+ -5.61 120.
+ -5.70 118.
+ -5.76 116.
+ -5.78 113.
+ -5.76 111.
+ -5.70 109.
+ -5.60 107.
+ -5.46 104.
+ -5.28 102.
+ -5.06 100.
+ -4.80 97.9
+ -4.50 95.7
+ -4.17 93.6
+ -3.80 91.5
+REG_LINE: 197
+ -18.4 146.
+ -19.0 143.
+ -19.5 140.
+ -19.9 137.
+ -20.3 133.
+ -20.7 130.
+ -20.9 127.
+ -21.1 124.
+ -21.3 120.
+ -21.4 117.
+ -21.4 114.
+ -21.4 110.
+ -21.3 107.
+ -21.1 104.
+ -20.9 100.
+ -20.7 96.9
+ -20.3 93.6
+ -20.0 90.4
+ -19.5 87.1
+ -19.0 83.9
+ -18.5 80.8
+ -17.9 77.7
+ -17.2 74.6
+ -16.5 71.6
+ -15.7 68.6
+ -14.9 65.7
+ -14.0 62.8
+ -13.1 60.0
+ -12.1 57.3
+ -11.1 54.7
+ -9.99 52.1
+ -8.87 49.6
+ -7.71 47.2
+ -6.50 44.9
+ -5.26 42.6
+ -3.98 40.5
+ -2.66 38.4
+ -1.30 36.5
+ 0.922E-01 34.6
+ 1.52 32.9
+ 2.97 31.2
+ 4.45 29.6
+ 5.96 28.2
+ 7.50 26.9
+ 9.05 25.6
+ 10.6 24.5
+ 12.2 23.5
+ 13.8 22.6
+ 15.5 21.8
+ 17.1 21.2
+ 18.8 20.7
+ 20.4 20.2
+ 22.1 19.9
+ 23.8 19.7
+ 25.4 19.7
+ 27.1 19.7
+ 28.8 19.9
+ 30.5 20.2
+ 32.1 20.6
+ 33.8 21.2
+ 35.4 21.8
+ 37.0 22.6
+ 38.7 23.5
+ 40.2 24.5
+ 41.8 25.6
+ 43.4 26.8
+ 44.9 28.1
+ 46.4 29.6
+ 47.9 31.1
+ 49.4 32.8
+ 50.8 34.5
+ 52.2 36.4
+ 53.5 38.4
+ 54.9 40.4
+ 56.2 42.6
+ 57.4 44.8
+ 58.6 47.1
+ 59.8 49.5
+ 60.9 52.0
+ 62.0 54.6
+ 63.0 57.2
+ 64.0 60.0
+ 64.9 62.7
+ 65.8 65.6
+ 66.6 68.5
+ 67.4 71.5
+ 68.1 74.5
+ 68.8 77.5
+ 69.4 80.7
+ 69.9 83.8
+ 70.4 87.0
+ 70.9 90.2
+ 71.3 93.5
+ 71.6 96.8
+ 71.9 100.
+ 72.1 103.
+ 72.2 107.
+ 72.3 110.
+ 72.3 113.
+ 72.3 117.
+ 72.2 120.
+ 72.1 123.
+ 71.9 127.
+ 71.6 130.
+ 71.3 133.
+ 70.9 137.
+ 70.4 140.
+ 69.9 143.
+ 69.4 146.
+ 68.8 149.
+ 68.1 152.
+ 67.4 155.
+ 66.6 158.
+ 65.8 161.
+ 64.9 164.
+ 64.0 167.
+ 63.0 170.
+ 62.0 172.
+ 60.9 175.
+ 59.8 177.
+ 58.6 180.
+ 57.4 182.
+ 56.2 184.
+ 54.9 186.
+ 53.5 189.
+ 52.2 190.
+ 50.8 192.
+ 49.4 194.
+ 47.9 196.
+ 46.4 197.
+ 44.9 199.
+ 43.4 200.
+ 41.8 201.
+ 40.2 202.
+ 38.7 203.
+ 37.0 204.
+ 35.4 205.
+ 33.8 206.
+ 32.1 206.
+ 30.5 207.
+ 28.8 207.
+ 27.1 207.
+ 25.4 207.
+ 23.8 207.
+ 22.1 207.
+ 20.4 207.
+ 18.8 206.
+ 17.1 206.
+ 15.5 205.
+ 13.8 204.
+ 12.2 203.
+ 10.6 202.
+ 9.05 201.
+ 7.50 200.
+ 5.96 199.
+ 4.45 197.
+ 2.97 196.
+ 1.52 194.
+ 0.922E-01 192.
+ -1.30 190.
+ -2.66 188.
+ -3.98 186.
+ -5.26 184.
+ -6.50 182.
+ -7.71 180.
+ -8.87 177.
+ -9.99 175.
+ -11.1 172.
+ -12.1 170.
+ -13.1 167.
+ -14.0 164.
+ -14.9 161.
+ -15.7 158.
+ -16.5 155.
+ -17.2 152.
+ -17.9 149.
+ -18.5 146.
+ -19.0 143.
+ -19.5 140.
+ -20.0 137.
+ -20.3 133.
+ -20.7 130.
+ -20.9 127.
+ -21.1 123.
+ -21.3 120.
+ -21.4 117.
+ -21.4 113.
+ -21.4 110.
+ -21.3 107.
+ -21.1 103.
+ -20.9 100.
+ -20.7 96.7
+ -20.3 93.4
+ -19.9 90.1
+ -19.5 86.9
+ -19.0 83.7
+ -18.4 80.6
+REG_LINE: 197
+ -33.1 157.
+ -33.8 153.
+ -34.5 149.
+ -35.1 145.
+ -35.6 140.
+ -36.0 136.
+ -36.4 131.
+ -36.7 127.
+ -36.9 123.
+ -37.0 118.
+ -37.0 114.
+ -37.0 109.
+ -36.9 105.
+ -36.7 100.
+ -36.4 95.8
+ -36.1 91.4
+ -35.6 87.0
+ -35.1 82.7
+ -34.5 78.4
+ -33.9 74.1
+ -33.1 69.9
+ -32.3 65.7
+ -31.4 61.6
+ -30.5 57.6
+ -29.4 53.6
+ -28.3 49.8
+ -27.1 46.0
+ -25.9 42.3
+ -24.6 38.6
+ -23.2 35.1
+ -21.8 31.7
+ -20.3 28.3
+ -18.8 25.1
+ -17.2 22.0
+ -15.5 19.0
+ -13.8 16.2
+ -12.0 13.4
+ -10.2 10.8
+ -8.37 8.34
+ -6.47 5.99
+ -4.53 3.78
+ -2.55 1.71
+ -.540 -.225
+ 1.51 -2.01
+ 3.58 -3.65
+ 5.69 -5.14
+ 7.82 -6.47
+ 9.97 -7.66
+ 12.1 -8.69
+ 14.3 -9.56
+ 16.5 -10.3
+ 18.7 -10.8
+ 21.0 -11.2
+ 23.2 -11.5
+ 25.4 -11.6
+ 27.7 -11.5
+ 29.9 -11.2
+ 32.1 -10.9
+ 34.3 -10.3
+ 36.5 -9.59
+ 38.7 -8.72
+ 40.9 -7.70
+ 43.0 -6.52
+ 45.2 -5.19
+ 47.3 -3.70
+ 49.4 -2.07
+ 51.4 -.290
+ 53.4 1.63
+ 55.4 3.70
+ 57.3 5.91
+ 59.2 8.25
+ 61.1 10.7
+ 62.9 13.3
+ 64.7 16.1
+ 66.4 18.9
+ 68.0 21.9
+ 69.6 25.0
+ 71.2 28.2
+ 72.7 31.6
+ 74.1 35.0
+ 75.5 38.5
+ 76.8 42.1
+ 78.0 45.8
+ 79.2 49.6
+ 80.3 53.5
+ 81.4 57.5
+ 82.3 61.5
+ 83.2 65.6
+ 84.0 69.7
+ 84.8 73.9
+ 85.4 78.2
+ 86.0 82.5
+ 86.5 86.9
+ 87.0 91.2
+ 87.3 95.6
+ 87.6 100.
+ 87.8 105.
+ 87.9 109.
+ 88.0 113.
+ 87.9 118.
+ 87.8 122.
+ 87.6 127.
+ 87.3 131.
+ 87.0 136.
+ 86.5 140.
+ 86.0 144.
+ 85.4 149.
+ 84.8 153.
+ 84.0 157.
+ 83.2 161.
+ 82.3 165.
+ 81.4 169.
+ 80.3 173.
+ 79.2 177.
+ 78.0 181.
+ 76.8 185.
+ 75.5 188.
+ 74.1 192.
+ 72.7 195.
+ 71.2 199.
+ 69.6 202.
+ 68.0 205.
+ 66.4 208.
+ 64.7 211.
+ 62.9 214.
+ 61.1 216.
+ 59.2 219.
+ 57.3 221.
+ 55.4 223.
+ 53.4 225.
+ 51.4 227.
+ 49.4 229.
+ 47.3 231.
+ 45.2 232.
+ 43.0 233.
+ 40.9 235.
+ 38.7 236.
+ 36.5 236.
+ 34.3 237.
+ 32.1 238.
+ 29.9 238.
+ 27.7 238.
+ 25.4 238.
+ 23.2 238.
+ 21.0 238.
+ 18.7 238.
+ 16.5 237.
+ 14.3 236.
+ 12.1 236.
+ 9.97 235.
+ 7.82 233.
+ 5.69 232.
+ 3.58 231.
+ 1.51 229.
+ -.540 227.
+ -2.55 225.
+ -4.53 223.
+ -6.47 221.
+ -8.37 219.
+ -10.2 216.
+ -12.0 213.
+ -13.8 211.
+ -15.5 208.
+ -17.2 205.
+ -18.8 202.
+ -20.3 199.
+ -21.8 195.
+ -23.2 192.
+ -24.6 188.
+ -25.9 185.
+ -27.1 181.
+ -28.3 177.
+ -29.4 173.
+ -30.5 169.
+ -31.4 165.
+ -32.3 161.
+ -33.1 157.
+ -33.9 153.
+ -34.5 149.
+ -35.1 144.
+ -35.6 140.
+ -36.1 135.
+ -36.4 131.
+ -36.7 127.
+ -36.9 122.
+ -37.0 118.
+ -37.0 113.
+ -37.0 109.
+ -36.9 104.
+ -36.7 99.9
+ -36.4 95.5
+ -36.0 91.1
+ -35.6 86.7
+ -35.1 82.4
+ -34.5 78.1
+ -33.8 73.8
+ -33.1 69.6
+REG_LINE: 197
+ -47.7 168.
+ -48.6 163.
+ -49.5 158.
+ -50.2 152.
+ -50.8 147.
+ -51.4 141.
+ -51.8 136.
+ -52.2 130.
+ -52.4 125.
+ -52.6 119.
+ -52.7 114.
+ -52.6 108.
+ -52.5 102.
+ -52.2 96.9
+ -51.9 91.4
+ -51.4 85.9
+ -50.9 80.4
+ -50.3 75.0
+ -49.5 69.6
+ -48.7 64.3
+ -47.8 59.0
+ -46.7 53.8
+ -45.6 48.7
+ -44.4 43.6
+ -43.1 38.7
+ -41.8 33.8
+ -40.3 29.1
+ -38.8 24.5
+ -37.1 19.9
+ -35.4 15.5
+ -33.6 11.2
+ -31.8 7.08
+ -29.8 3.06
+ -27.8 -.822
+ -25.7 -4.55
+ -23.6 -8.14
+ -21.4 -11.6
+ -19.1 -14.8
+ -16.8 -17.9
+ -14.5 -20.9
+ -12.0 -23.6
+ -9.56 -26.2
+ -7.04 -28.6
+ -4.49 -30.9
+ -1.89 -32.9
+ .740 -34.8
+ 3.40 -36.5
+ 6.09 -37.9
+ 8.81 -39.2
+ 11.5 -40.3
+ 14.3 -41.2
+ 17.1 -41.9
+ 19.8 -42.4
+ 22.6 -42.7
+ 25.4 -42.8
+ 28.2 -42.7
+ 31.0 -42.4
+ 33.8 -41.9
+ 36.5 -41.2
+ 39.3 -40.3
+ 42.0 -39.3
+ 44.7 -38.0
+ 47.4 -36.5
+ 50.1 -34.8
+ 52.7 -33.0
+ 55.3 -30.9
+ 57.9 -28.7
+ 60.4 -26.3
+ 62.9 -23.7
+ 65.3 -21.0
+ 67.7 -18.0
+ 70.0 -14.9
+ 72.3 -11.7
+ 74.5 -8.26
+ 76.6 -4.68
+ 78.7 -.956
+ 80.7 2.92
+ 82.6 6.93
+ 84.5 11.1
+ 86.3 15.4
+ 88.0 19.8
+ 89.6 24.3
+ 91.2 28.9
+ 92.6 33.7
+ 94.0 38.5
+ 95.3 43.5
+ 96.5 48.5
+ 97.6 53.6
+ 98.7 58.8
+ 99.6 64.1
+ 100. 69.4
+ 101. 74.8
+ 102. 80.2
+ 102. 85.7
+ 103. 91.2
+ 103. 96.7
+ 103. 102.
+ 104. 108.
+ 104. 113.
+ 104. 119.
+ 103. 125.
+ 103. 130.
+ 103. 136.
+ 102. 141.
+ 102. 147.
+ 101. 152.
+ 100. 157.
+ 99.6 163.
+ 98.7 168.
+ 97.6 173.
+ 96.5 178.
+ 95.3 183.
+ 94.0 188.
+ 92.6 193.
+ 91.2 198.
+ 89.6 203.
+ 88.0 207.
+ 86.3 212.
+ 84.5 216.
+ 82.6 220.
+ 80.7 224.
+ 78.7 228.
+ 76.6 232.
+ 74.5 235.
+ 72.3 239.
+ 70.0 242.
+ 67.7 245.
+ 65.3 248.
+ 62.9 251.
+ 60.4 253.
+ 57.9 256.
+ 55.3 258.
+ 52.7 260.
+ 50.1 262.
+ 47.4 263.
+ 44.7 265.
+ 42.0 266.
+ 39.3 267.
+ 36.5 268.
+ 33.8 269.
+ 31.0 269.
+ 28.2 270.
+ 25.4 270.
+ 22.6 270.
+ 19.8 269.
+ 17.1 269.
+ 14.3 268.
+ 11.5 267.
+ 8.81 266.
+ 6.09 265.
+ 3.40 263.
+ .740 262.
+ -1.89 260.
+ -4.49 258.
+ -7.04 256.
+ -9.56 253.
+ -12.0 251.
+ -14.5 248.
+ -16.8 245.
+ -19.1 242.
+ -21.4 238.
+ -23.6 235.
+ -25.7 231.
+ -27.8 228.
+ -29.8 224.
+ -31.8 220.
+ -33.6 216.
+ -35.4 211.
+ -37.1 207.
+ -38.8 202.
+ -40.3 198.
+ -41.8 193.
+ -43.1 188.
+ -44.4 183.
+ -45.6 178.
+ -46.7 173.
+ -47.8 168.
+ -48.7 163.
+ -49.5 157.
+ -50.3 152.
+ -50.9 146.
+ -51.4 141.
+ -51.9 135.
+ -52.2 130.
+ -52.5 124.
+ -52.6 119.
+ -52.7 113.
+ -52.6 108.
+ -52.4 102.
+ -52.2 96.5
+ -51.8 91.0
+ -51.4 85.5
+ -50.8 80.0
+ -50.2 74.6
+ -49.5 69.2
+ -48.6 63.9
+ -47.7 58.6
+REG_LINE: 141
+ -62.3 179.
+ -63.4 173.
+ -64.4 167.
+ -65.3 160.
+ -66.1 154.
+ -66.8 147.
+ -67.3 140.
+ -67.7 134.
+ -68.0 127.
+ -68.2 120.
+ -68.3 114.
+ -68.2 107.
+ -68.1 100.
+ -67.8 93.6
+ -67.3 87.0
+ -66.8 80.4
+ -66.2 73.8
+ -65.4 67.3
+ -64.5 60.8
+ -63.5 54.4
+ -62.4 48.1
+ -61.2 41.9
+ -59.9 35.7
+ -58.4 29.7
+ -56.9 23.8
+ -55.2 17.9
+ -53.5 12.2
+ -51.6 6.66
+ -49.6 1.22
+ -47.6 -4.07
+ -45.4 -9.21
+ -43.2 -14.2
+ -40.9 -19.0
+ -38.5 -23.7
+ -36.0 -28.2
+ -33.4 -32.5
+ -30.8 -36.6
+ -28.1 -40.5
+ -25.3 -44.2
+ -22.4 -47.7
+ -19.5 -51.1
+ -16.6 -54.2
+ -13.5 -57.1
+ -10.5 -59.7
+ -7.36 -62.2
+ -4.21 -64.4
+ -1.01 -66.4
+ 2.22 -68.2
+ 5.47 -69.7
+ 8.76 -71.1
+ 12.1 -72.1
+ 15.4 -73.0
+ 18.7 -73.6
+ 22.1 -73.9
+ 25.4 -74.1
+ 28.8 -73.9
+ 32.1 -73.6
+ 35.4 -73.0
+ 38.8 -72.2
+ 42.1 -71.1
+ 45.3 -69.8
+ 48.6 -68.3
+ 51.8 -66.5
+ 55.0 -64.5
+ 58.2 -62.3
+ 61.3 -59.8
+ 64.4 -57.2
+ 67.4 -54.3
+ 70.4 -51.2
+ 73.3 -47.9
+ 76.1 -44.3
+ 78.9 -40.6
+ 81.6 -36.7
+ 84.3 -32.6
+ 86.8 -28.3
+ 89.3 -23.8
+ 91.7 -19.2
+ 94.1 -14.4
+ 96.3 -9.39
+ 98.5 -4.25
+ 101. 1.03
+ 102. 6.46
+ 104. 12.0
+ 106. 17.7
+ 108. 23.5
+ 109. 29.5
+ 111. 35.5
+ 112. 41.7
+ 113. 47.9
+ 114. 54.2
+ 115. 60.6
+ 116. 67.0
+ 117. 73.6
+ 118. 80.1
+ 118. 86.7
+ 119. 93.4
+ 119. 100.
+ 119. 107.
+ 119. 113.
+ 119. 120.
+ 119. 127.
+ 119. 133.
+ 118. 140.
+ 118. 147.
+ 117. 153.
+ 116. 160.
+ 115. 166.
+ 114. 173.
+ 113. 179.
+ 112. 185.
+ 111. 191.
+ 109. 197.
+ 108. 203.
+ 106. 209.
+ 104. 215.
+ 102. 220.
+ 101. 226.
+ 98.5 231.
+ 96.3 236.
+ 94.1 241.
+ 91.7 246.
+ 89.3 251.
+ 86.8 255.
+ 84.3 259.
+ 81.6 264.
+ 78.9 267.
+ 76.1 271.
+ 73.3 275.
+ 70.4 278.
+ 67.4 281.
+ 64.4 284.
+ 61.3 287.
+ 58.2 289.
+ 55.0 291.
+ 51.8 293.
+ 48.6 295.
+ 45.3 297.
+ 42.1 298.
+ 38.8 299.
+ 35.4 300.
+ 34.7 300.
+REG_LINE: 53
+ 16.2 300.
+ 15.4 300.
+ 12.1 299.
+ 8.76 298.
+ 5.47 297.
+ 2.22 295.
+ -1.01 293.
+ -4.21 291.
+ -7.36 289.
+ -10.5 287.
+ -13.5 284.
+ -16.6 281.
+ -19.5 278.
+ -22.4 275.
+ -25.3 271.
+ -28.1 267.
+ -30.8 263.
+ -33.4 259.
+ -36.0 255.
+ -38.5 251.
+ -40.9 246.
+ -43.2 241.
+ -45.4 236.
+ -47.6 231.
+ -49.6 226.
+ -51.6 220.
+ -53.5 215.
+ -55.2 209.
+ -56.9 203.
+ -58.4 197.
+ -59.9 191.
+ -61.2 185.
+ -62.4 179.
+ -63.5 172.
+ -64.5 166.
+ -65.4 160.
+ -66.2 153.
+ -66.8 147.
+ -67.3 140.
+ -67.8 133.
+ -68.1 127.
+ -68.2 120.
+ -68.3 113.
+ -68.2 107.
+ -68.0 99.8
+ -67.7 93.2
+ -67.3 86.5
+ -66.8 79.9
+ -66.1 73.3
+ -65.3 66.8
+ -64.4 60.4
+ -63.4 54.0
+ -62.3 47.7
+REG_LINE: 128
+ -77.0 190.
+ -78.3 183.
+ -79.4 175.
+ -80.5 168.
+ -81.4 160.
+ -82.1 153.
+ -82.8 145.
+ -83.3 137.
+ -83.6 129.
+ -83.8 122.
+ -83.9 114.
+ -83.8 106.
+ -83.6 98.1
+ -83.3 90.3
+ -82.8 82.6
+ -82.2 74.9
+ -81.4 67.2
+ -80.5 59.6
+ -79.5 52.0
+ -78.3 44.6
+ -77.1 37.2
+ -75.6 29.9
+ -74.1 22.8
+ -72.4 15.7
+ -70.6 8.81
+ -68.7 2.01
+ -66.6 -4.64
+ -64.4 -11.1
+ -62.2 -17.5
+ -59.8 -23.7
+ -57.3 -29.7
+ -54.7 -35.5
+ -51.9 -41.1
+ -49.1 -46.5
+ -46.2 -51.8
+ -43.2 -56.8
+ -40.2 -61.6
+ -37.0 -66.1
+ -33.7 -70.5
+ -30.4 -74.6
+ -27.0 -78.5
+ -23.6 -82.1
+ -20.0 -85.5
+ -16.5 -88.6
+ -12.8 -91.5
+ -9.15 -94.1
+ -5.42 -96.4
+ -1.66 -98.5
+ 2.14 -100.
+ 5.97 -102.
+ 9.83 -103.
+ 13.7 -104.
+ 17.6 -105.
+ 21.5 -105.
+ 25.4 -105.
+ 29.3 -105.
+ 33.2 -105.
+ 37.1 -104.
+ 41.0 -103.
+ 44.8 -102.
+ 48.7 -100.
+ 52.5 -98.5
+ 56.2 -96.5
+ 60.0 -94.2
+ 63.6 -91.6
+ 67.3 -88.7
+ 70.9 -85.6
+ 74.4 -82.2
+ 77.8 -78.6
+ 81.2 -74.7
+ 84.6 -70.6
+ 87.8 -66.3
+ 91.0 -61.7
+ 94.1 -56.9
+ 97.1 -51.9
+ 100. -46.7
+ 103. -41.3
+ 105. -35.7
+ 108. -29.9
+ 111. -23.9
+ 113. -17.7
+ 115. -11.4
+ 117. -4.87
+ 120. 1.78
+ 121. 8.56
+ 123. 15.5
+ 125. 22.5
+ 127. 29.7
+ 128. 37.0
+ 129. 44.3
+ 130. 51.8
+ 131. 59.3
+ 132. 66.9
+ 133. 74.6
+ 134. 82.3
+ 134. 90.0
+ 135. 97.8
+ 135. 106.
+ 135. 113.
+ 135. 121.
+ 135. 129.
+ 134. 137.
+ 134. 145.
+ 133. 152.
+ 132. 160.
+ 131. 168.
+ 130. 175.
+ 129. 183.
+ 128. 190.
+ 127. 197.
+ 125. 204.
+ 123. 211.
+ 121. 218.
+ 120. 225.
+ 117. 232.
+ 115. 238.
+ 113. 245.
+ 111. 251.
+ 108. 257.
+ 105. 263.
+ 103. 268.
+ 100. 274.
+ 97.1 279.
+ 94.1 284.
+ 91.0 289.
+ 87.8 293.
+ 84.6 298.
+ 82.5 300.
+REG_LINE: 40
+ -31.6 300.
+ -33.7 297.
+ -37.0 293.
+ -40.2 288.
+ -43.2 284.
+ -46.2 279.
+ -49.1 273.
+ -51.9 268.
+ -54.7 262.
+ -57.3 257.
+ -59.8 251.
+ -62.2 244.
+ -64.4 238.
+ -66.6 232.
+ -68.7 225.
+ -70.6 218.
+ -72.4 211.
+ -74.1 204.
+ -75.6 197.
+ -77.1 190.
+ -78.3 182.
+ -79.5 175.
+ -80.5 167.
+ -81.4 160.
+ -82.2 152.
+ -82.8 144.
+ -83.3 137.
+ -83.6 129.
+ -83.8 121.
+ -83.9 113.
+ -83.8 105.
+ -83.6 97.5
+ -83.3 89.8
+ -82.8 82.0
+ -82.1 74.3
+ -81.4 66.7
+ -80.5 59.0
+ -79.4 51.5
+ -78.3 44.1
+ -77.0 36.7
+REG_LINE: 97
+ -91.6 201.
+ -93.1 193.
+ -94.4 184.
+ -95.6 176.
+ -96.6 167.
+ -97.5 158.
+ -98.2 149.
+ -98.8 140.
+ -99.2 132.
+ -99.4 123.
+ -99.5 114.
+ -99.5 105.
+ -99.2 95.9
+ -98.8 87.0
+ -98.3 78.2
+ -97.6 69.3
+ -96.7 60.6
+ -95.7 51.9
+ -94.5 43.3
+ -93.2 34.8
+ -91.7 26.3
+ -90.1 18.0
+ -88.3 9.83
+ -86.4 1.77
+ -84.3 -6.14
+ -82.1 -13.9
+ -79.8 -21.5
+ -77.3 -28.9
+ -74.7 -36.2
+ -71.9 -43.2
+ -69.1 -50.1
+ -66.1 -56.7
+ -63.0 -63.2
+ -59.8 -69.4
+ -56.5 -75.3
+ -53.1 -81.1
+ -49.5 -86.6
+ -45.9 -91.8
+ -42.2 -96.8
+ -38.4 -101.
+ -34.5 -106.
+ -30.6 -110.
+ -26.5 -114.
+ -22.5 -117.
+ -18.3 -121.
+ -14.1 -124.
+ -9.84 -126.
+ -5.53 -129.
+ -1.19 -131.
+ 3.19 -133.
+ 7.59 -134.
+ 12.0 -135.
+ 16.5 -136.
+ 20.9 -136.
+ 25.4 -137.
+ 29.9 -136.
+ 34.3 -136.
+ 38.8 -135.
+ 43.2 -134.
+ 47.6 -133.
+ 52.0 -131.
+ 56.3 -129.
+ 60.6 -126.
+ 64.9 -124.
+ 69.1 -121.
+ 73.2 -118.
+ 77.3 -114.
+ 81.4 -110.
+ 85.3 -106.
+ 89.2 -102.
+ 93.0 -96.9
+ 96.7 -92.0
+ 100. -86.8
+ 104. -81.3
+ 107. -75.6
+ 111. -69.6
+ 114. -63.4
+ 117. -57.0
+ 120. -50.3
+ 123. -43.5
+ 126. -36.4
+ 128. -29.2
+ 131. -21.8
+ 133. -14.2
+ 135. -6.42
+ 137. 1.49
+ 139. 9.54
+ 141. 17.7
+ 143. 26.0
+ 144. 34.5
+ 145. 43.0
+ 147. 51.6
+ 148. 60.3
+ 148. 69.0
+ 149. 77.8
+ 150. 86.7
+ 150. 92.2
+REG_LINE: 23
+ 150. 135.
+ 150. 140.
+ 149. 149.
+ 148. 158.
+ 148. 167.
+ 147. 175.
+ 145. 184.
+ 144. 192.
+ 143. 201.
+ 141. 209.
+ 139. 217.
+ 137. 225.
+ 135. 233.
+ 133. 241.
+ 131. 249.
+ 128. 256.
+ 126. 263.
+ 123. 270.
+ 120. 277.
+ 117. 284.
+ 114. 290.
+ 111. 296.
+ 109. 300.
+REG_LINE: 35
+ -57.7 300.
+ -59.8 296.
+ -63.0 290.
+ -66.1 284.
+ -69.1 277.
+ -71.9 270.
+ -74.7 263.
+ -77.3 256.
+ -79.8 248.
+ -82.1 241.
+ -84.3 233.
+ -86.4 225.
+ -88.3 217.
+ -90.1 209.
+ -91.7 201.
+ -93.2 192.
+ -94.5 184.
+ -95.7 175.
+ -96.7 166.
+ -97.6 158.
+ -98.3 149.
+ -98.8 140.
+ -99.2 131.
+ -99.5 122.
+ -99.5 113.
+ -99.4 104.
+ -99.2 95.3
+ -98.8 86.4
+ -98.2 77.5
+ -97.5 68.7
+ -96.6 60.0
+ -95.6 51.3
+ -94.4 42.7
+ -93.1 34.2
+ -91.6 25.7
+REG_LINE: 63
+ -100. -13.5
+ -98.0 -21.1
+ -95.5 -29.8
+ -92.9 -38.4
+ -90.1 -46.7
+ -87.2 -54.9
+ -84.1 -62.8
+ -80.9 -70.5
+ -77.5 -78.0
+ -74.1 -85.2
+ -70.5 -92.2
+ -66.7 -98.9
+ -62.9 -105.
+ -58.9 -112.
+ -54.8 -117.
+ -50.7 -123.
+ -46.4 -128.
+ -42.0 -133.
+ -37.6 -138.
+ -33.1 -142.
+ -28.4 -146.
+ -23.8 -150.
+ -19.0 -153.
+ -14.3 -156.
+ -9.41 -159.
+ -4.52 -161.
+ .403 -163.
+ 5.36 -165.
+ 10.3 -166.
+ 15.3 -167.
+ 20.4 -168.
+ 25.4 -168.
+ 30.4 -168.
+ 35.4 -167.
+ 40.4 -166.
+ 45.4 -165.
+ 50.4 -163.
+ 55.3 -161.
+ 60.2 -159.
+ 65.0 -156.
+ 69.8 -153.
+ 74.5 -150.
+ 79.2 -146.
+ 83.8 -142.
+ 88.4 -138.
+ 92.8 -133.
+ 97.2 -129.
+ 101. -123.
+ 106. -118.
+ 110. -112.
+ 114. -106.
+ 118. -99.2
+ 121. -92.5
+ 125. -85.5
+ 128. -78.3
+ 132. -70.8
+ 135. -63.1
+ 138. -55.2
+ 141. -47.0
+ 144. -38.7
+ 146. -30.1
+ 149. -21.4
+ 150. -17.1
+REG_LINE: 9
+ 150. 244.
+ 149. 248.
+ 146. 257.
+ 144. 266.
+ 141. 274.
+ 138. 282.
+ 135. 290.
+ 132. 298.
+ 131. 300.
+REG_LINE: 9
+ -79.7 300.
+ -80.9 297.
+ -84.1 290.
+ -87.2 282.
+ -90.1 274.
+ -92.9 265.
+ -95.5 257.
+ -98.0 248.
+ -100. 240.
+REG_LINE: 54
+ -100. -72.8
+ -99.7 -73.6
+ -96.3 -82.4
+ -92.7 -91.0
+ -89.0 -99.3
+ -85.1 -107.
+ -81.1 -115.
+ -77.0 -123.
+ -72.7 -130.
+ -68.3 -137.
+ -63.8 -143.
+ -59.1 -149.
+ -54.4 -155.
+ -49.5 -161.
+ -44.6 -166.
+ -39.6 -171.
+ -34.4 -175.
+ -29.2 -179.
+ -24.0 -183.
+ -18.7 -186.
+ -13.3 -189.
+ -7.85 -192.
+ -2.38 -194.
+ 3.13 -196.
+ 8.66 -197.
+ 14.2 -198.
+ 19.8 -199.
+ 25.4 -199.
+ 30.9 -199.
+ 36.5 -198.
+ 42.1 -197.
+ 47.6 -196.
+ 53.1 -194.
+ 58.6 -192.
+ 64.0 -189.
+ 69.4 -186.
+ 74.7 -183.
+ 80.0 -179.
+ 85.2 -175.
+ 90.3 -171.
+ 95.3 -166.
+ 100. -161.
+ 105. -155.
+ 110. -150.
+ 115. -143.
+ 119. -137.
+ 123. -130.
+ 128. -123.
+ 132. -115.
+ 136. -108.
+ 140. -99.6
+ 144. -91.3
+ 147. -82.7
+ 150. -75.3
+REG_LINE: 2
+ -99.9 300.
+ -100. 300.
+REG_LINE: 13
+ -100. -121.
+ -96.2 -129.
+ -91.8 -138.
+ -87.2 -146.
+ -82.5 -154.
+ -77.7 -162.
+ -72.7 -169.
+ -67.6 -176.
+ -62.4 -182.
+ -57.0 -188.
+ -51.6 -194.
+ -46.1 -199.
+ -45.1 -200.
+REG_LINE: 13
+ 96.0 -200.
+ 96.8 -199.
+ 102. -194.
+ 108. -188.
+ 113. -182.
+ 118. -176.
+ 123. -169.
+ 128. -162.
+ 133. -154.
+ 138. -146.
+ 143. -138.
+ 147. -130.
+ 150. -123.
+REG_LINE: 6
+ -100. -165.
+ -97.4 -170.
+ -92.3 -178.
+ -87.0 -187.
+ -81.6 -194.
+ -77.4 -200.
+REG_LINE: 6
+ 128. -200.
+ 132. -195.
+ 138. -187.
+ 143. -179.
+ 148. -170.
+ 150. -167.
+REG_LINE: 10
+ 40.9 118.
+ 24.4 113.
+ 7.79 108.
+ -8.78 104.
+ -25.4 98.9
+ -41.9 94.2
+ -58.5 89.5
+ -75.1 84.8
+ -91.7 80.0
+ -100. 77.7
+REG_LINE: 12
+ 38.0 132.
+ 24.6 112.
+ 11.2 92.1
+ -2.25 72.0
+ -15.7 52.0
+ -29.1 31.9
+ -42.5 11.9
+ -55.9 -8.13
+ -69.3 -28.2
+ -82.7 -48.2
+ -96.1 -68.2
+ -100. -74.0
+REG_LINE: 13
+ 32.0 142.
+ 25.0 111.
+ 18.0 81.0
+ 11.1 50.5
+ 4.10 20.1
+ -2.86 -10.4
+ -9.83 -40.8
+ -16.8 -71.3
+ -23.8 -102.
+ -30.7 -132.
+ -37.7 -163.
+ -44.7 -193.
+ -46.3 -200.
+REG_LINE: 12
+ 24.4 145.
+ 25.5 111.
+ 26.7 77.8
+ 27.9 44.4
+ 29.1 11.0
+ 30.3 -22.4
+ 31.5 -55.8
+ 32.7 -89.2
+ 33.8 -123.
+ 35.0 -156.
+ 36.2 -189.
+ 36.6 -200.
+REG_LINE: 14
+ 17.0 140.
+ 26.1 112.
+ 35.1 83.4
+ 44.2 55.2
+ 53.2 27.0
+ 62.3 -1.14
+ 71.3 -29.3
+ 80.3 -57.5
+ 89.4 -85.7
+ 98.4 -114.
+ 107. -142.
+ 117. -170.
+ 126. -198.
+ 126. -200.
+REG_LINE: 11
+ 11.8 128.
+ 26.4 112.
+ 41.1 96.3
+ 55.8 80.3
+ 70.5 64.2
+ 85.2 48.2
+ 99.9 32.1
+ 115. 16.1
+ 129. 0.199E-02
+ 144. -16.1
+ 150. -22.6
+REG_LINE: 10
+ 9.84 113.
+ 26.6 113.
+ 43.3 113.
+ 60.1 113.
+ 76.8 113.
+ 93.5 113.
+ 110. 113.
+ 127. 113.
+ 144. 113.
+ 150. 113.
+REG_LINE: 11
+ 11.8 98.5
+ 26.4 115.
+ 41.1 131.
+ 55.8 147.
+ 70.5 163.
+ 85.2 179.
+ 99.9 195.
+ 115. 211.
+ 129. 227.
+ 144. 243.
+ 150. 250.
+REG_LINE: 9
+ 17.0 87.1
+ 26.1 115.
+ 35.1 143.
+ 44.2 172.
+ 53.2 200.
+ 62.3 228.
+ 71.3 256.
+ 80.3 284.
+ 85.4 300.
+REG_LINE: 8
+ 24.4 82.3
+ 25.5 116.
+ 26.7 149.
+ 27.9 182.
+ 29.1 216.
+ 30.3 249.
+ 31.5 283.
+ 32.1 300.
+REG_LINE: 9
+ 32.0 85.0
+ 25.0 115.
+ 18.0 146.
+ 11.1 176.
+ 4.10 207.
+ -2.86 237.
+ -9.83 268.
+ -16.8 298.
+ -17.2 300.
+REG_LINE: 12
+ 38.0 94.7
+ 24.6 115.
+ 11.2 135.
+ -2.25 155.
+ -15.7 175.
+ -29.1 195.
+ -42.5 215.
+ -55.9 235.
+ -69.3 255.
+ -82.7 275.
+ -96.1 295.
+ -99.4 300.
+REG_LINE: 10
+ 40.9 109.
+ 24.4 114.
+ 7.79 118.
+ -8.78 123.
+ -25.4 128.
+ -41.9 133.
+ -58.5 137.
+ -75.1 142.
+ -91.7 147.
+ -100. 149.
+REG_LINE: 2
+ 18.7 134.
+ 17.7 133.
+REG_LINE: 2
+ 20.4 129.
+ 19.4 128.
+REG_LINE: 2
+ 22.1 124.
+ 21.1 123.
+REG_LINE: 2
+ 23.8 119.
+ 22.8 117.
+REG_LINE: 2
+ 27.2 108.
+ 28.2 110.
+REG_LINE: 2
+ 28.8 103.
+ 29.8 104.
+REG_LINE: 2
+ 30.5 97.7
+ 31.5 99.1
+REG_LINE: 2
+ 32.2 92.4
+ 33.2 93.8
+REG_LINE: 2
+ 35.6 81.9
+ 36.6 83.3
+REG_LINE: 2
+ 37.3 76.6
+ 38.3 78.1
+REG_LINE: 2
+ 39.0 71.4
+ 40.0 72.8
+REG_LINE: 2
+ 40.7 66.1
+ 41.7 67.5
+REG_LINE: 2
+ 44.0 55.6
+ 45.0 57.0
+REG_LINE: 2
+ 45.7 50.3
+ 46.7 51.8
+REG_LINE: 2
+ 47.4 45.1
+ 48.4 46.5
+REG_LINE: 2
+ 49.1 39.8
+ 50.1 41.2
+REG_LINE: 2
+ 52.5 29.3
+ 53.5 30.7
+REG_LINE: 2
+ 54.2 24.0
+ 55.2 25.5
+REG_LINE: 2
+ 55.9 18.8
+ 56.9 20.2
+REG_LINE: 2
+ 57.5 13.5
+ 58.6 14.9
+REG_LINE: 2
+ 60.9 2.99
+ 61.9 4.43
+REG_LINE: 2
+ 62.6 -2.26
+ 63.6 -.831
+REG_LINE: 2
+ 64.3 -7.52
+ 65.3 -6.09
+REG_LINE: 2
+ 66.0 -12.8
+ 67.0 -11.3
+REG_LINE: 2
+ 69.4 -23.3
+ 70.4 -21.9
+REG_LINE: 2
+ 71.1 -28.6
+ 72.1 -27.1
+REG_LINE: 2
+ 72.7 -33.8
+ 73.7 -32.4
+REG_LINE: 2
+ 74.4 -39.1
+ 75.4 -37.6
+REG_LINE: 2
+ 77.8 -49.6
+ 78.8 -48.2
+REG_LINE: 2
+ 79.5 -54.9
+ 80.5 -53.4
+REG_LINE: 2
+ 81.2 -60.1
+ 82.2 -58.7
+REG_LINE: 2
+ 82.9 -65.4
+ 83.9 -63.9
+REG_LINE: 2
+ 86.3 -75.9
+ 87.3 -74.5
+REG_LINE: 2
+ 87.9 -81.2
+ 88.9 -79.7
+REG_LINE: 2
+ 89.6 -86.4
+ 90.6 -85.0
+REG_LINE: 2
+ 91.3 -91.7
+ 92.3 -90.2
+REG_LINE: 2
+ 94.7 -102.
+ 95.7 -101.
+REG_LINE: 2
+ 96.4 -107.
+ 97.4 -106.
+REG_LINE: 2
+ 98.1 -113.
+ 99.1 -111.
+REG_LINE: 2
+ 99.8 -118.
+ 101. -117.
+REG_LINE: 2
+ 103. -128.
+ 104. -127.
+REG_LINE: 2
+ 105. -134.
+ 106. -132.
+REG_LINE: 2
+ 107. -139.
+ 108. -138.
+REG_LINE: 2
+ 108. -144.
+ 109. -143.
+REG_LINE: 2
+ 112. -155.
+ 113. -153.
+REG_LINE: 2
+ 113. -160.
+ 114. -159.
+REG_LINE: 2
+ 115. -165.
+ 116. -164.
+REG_LINE: 2
+ 117. -171.
+ 118. -169.
+REG_LINE: 2
+ 120. -181.
+ 121. -180.
+REG_LINE: 2
+ 122. -186.
+ 123. -185.
+REG_LINE: 2
+ 123. -192.
+ 124. -190.
+REG_LINE: 2
+ 125. -197.
+ 126. -195.
+REG_LINE: 2
+ -80.3 169.
+ -81.8 170.
+REG_LINE: 2
+ -82.5 148.
+ -84.2 148.
+REG_LINE: 2
+ -83.7 126.
+ -85.5 126.
+REG_LINE: 2
+ -83.8 104.
+ -85.6 104.
+REG_LINE: 2
+ -80.7 61.1
+ -82.3 60.3
+REG_LINE: 2
+ -77.6 40.2
+ -79.0 39.1
+REG_LINE: 2
+ -73.4 19.9
+ -74.7 18.7
+REG_LINE: 2
+ -68.3 .672
+ -69.4 -.674
+REG_LINE: 2
+ -55.2 -34.3
+ -56.0 -35.9
+REG_LINE: 2
+ -47.4 -49.7
+ -48.1 -51.3
+REG_LINE: 2
+ -38.9 -63.4
+ -39.5 -65.1
+REG_LINE: 2
+ -29.7 -75.4
+ -30.2 -77.1
+REG_LINE: 2
+ -9.89 -93.6
+ -10.2 -95.3
+REG_LINE: 2
+ .619 -99.6
+ .416 -101.
+REG_LINE: 2
+ 11.4 -103.
+ 11.3 -105.
+REG_LINE: 2
+ 22.3 -105.
+ 22.2 -107.
+REG_LINE: 2
+ 44.1 -102.
+ 44.2 -104.
+REG_LINE: 2
+ 54.7 -97.3
+ 55.0 -99.1
+REG_LINE: 2
+ 65.1 -90.4
+ 65.4 -92.2
+REG_LINE: 2
+ 75.1 -81.5
+ 75.5 -83.2
+REG_LINE: 2
+ 93.5 -57.9
+ 94.1 -59.5
+REG_LINE: 2
+ 102. -43.5
+ 102. -45.1
+REG_LINE: 2
+ 109. -27.5
+ 110. -29.0
+REG_LINE: 2
+ 116. -10.1
+ 117. -11.5
+REG_LINE: 2
+ 126. 28.3
+ 128. 27.1
+REG_LINE: 2
+ 130. 48.8
+ 131. 47.9
+REG_LINE: 2
+ 133. 70.0
+ 134. 69.3
+REG_LINE: 2
+ 134. 91.6
+ 136. 91.3
+REG_LINE: 2
+ 134. 135.
+ 136. 136.
+REG_LINE: 2
+ 133. 157.
+ 134. 158.
+REG_LINE: 2
+ 130. 178.
+ 131. 179.
+REG_LINE: 2
+ 126. 199.
+ 128. 200.
+REG_LINE: 2
+ 116. 237.
+ 117. 238.
+REG_LINE: 2
+ 109. 254.
+ 110. 256.
+REG_LINE: 2
+ 102. 270.
+ 102. 272.
+REG_LINE: 2
+ 93.5 285.
+ 94.1 286.
+REG_LINE: 2
+ -38.9 290.
+ -39.5 292.
+REG_LINE: 2
+ -47.4 277.
+ -48.1 278.
+REG_LINE: 2
+ -55.2 261.
+ -56.0 263.
+REG_LINE: 2
+ -68.3 226.
+ -69.4 228.
+REG_LINE: 2
+ -73.4 207.
+ -74.7 208.
+REG_LINE: 2
+ -77.6 187.
+ -79.0 188.
+REG_LINE: 2
+ -80.7 166.
+ -82.3 167.
+REG_LINE: 2
+ -83.8 123.
+ -85.6 123.
+REG_LINE: 2
+ -83.7 101.
+ -85.5 100.
+REG_LINE: 2
+ -82.5 78.9
+ -84.2 78.4
+REG_LINE: 2
+ -80.3 57.5
+ -81.8 56.7
+REG_LINE: 15
+ 25.5 113.
+ 24.9 115.
+ 24.3 117.
+ 23.7 119.
+ 23.1 121.
+ 22.5 123.
+ 21.9 125.
+ 21.2 127.
+ 20.6 128.
+ 20.0 130.
+ 19.4 132.
+ 18.8 134.
+ 18.2 136.
+ 17.6 138.
+ 17.0 140.
+REG_LINE: 15
+ 25.5 113.
+ 26.1 112.
+ 26.7 110.
+ 27.3 108.
+ 27.9 106.
+ 28.5 104.
+ 29.1 102.
+ 29.7 100.
+ 30.3 98.4
+ 30.9 96.5
+ 31.5 94.7
+ 32.1 92.8
+ 32.7 90.9
+ 33.3 89.0
+ 33.9 87.1
+REG_LINE: 15
+ 33.9 87.1
+ 34.5 85.3
+ 35.1 83.4
+ 35.7 81.5
+ 36.3 79.6
+ 36.9 77.8
+ 37.5 75.9
+ 38.1 74.0
+ 38.7 72.1
+ 39.3 70.2
+ 39.9 68.4
+ 40.5 66.5
+ 41.1 64.6
+ 41.8 62.7
+ 42.4 60.8
+REG_LINE: 15
+ 42.4 60.8
+ 43.0 59.0
+ 43.6 57.1
+ 44.2 55.2
+ 44.8 53.3
+ 45.4 51.5
+ 46.0 49.6
+ 46.6 47.7
+ 47.2 45.8
+ 47.8 43.9
+ 48.4 42.1
+ 49.0 40.2
+ 49.6 38.3
+ 50.2 36.4
+ 50.8 34.5
+REG_LINE: 15
+ 50.8 34.5
+ 51.4 32.7
+ 52.0 30.8
+ 52.6 28.9
+ 53.2 27.0
+ 53.8 25.2
+ 54.4 23.3
+ 55.0 21.4
+ 55.6 19.5
+ 56.2 17.6
+ 56.8 15.8
+ 57.4 13.9
+ 58.0 12.0
+ 58.6 10.1
+ 59.2 8.25
+REG_LINE: 15
+ 59.2 8.25
+ 59.8 6.38
+ 60.4 4.50
+ 61.0 2.62
+ 61.6 .740
+ 62.3 -1.14
+ 62.9 -3.02
+ 63.5 -4.89
+ 64.1 -6.77
+ 64.7 -8.65
+ 65.3 -10.5
+ 65.9 -12.4
+ 66.5 -14.3
+ 67.1 -16.2
+ 67.7 -18.0
+REG_LINE: 15
+ 67.7 -18.0
+ 68.3 -19.9
+ 68.9 -21.8
+ 69.5 -23.7
+ 70.1 -25.6
+ 70.7 -27.4
+ 71.3 -29.3
+ 71.9 -31.2
+ 72.5 -33.1
+ 73.1 -34.9
+ 73.7 -36.8
+ 74.3 -38.7
+ 74.9 -40.6
+ 75.5 -42.5
+ 76.1 -44.3
+REG_LINE: 15
+ 76.1 -44.3
+ 76.7 -46.2
+ 77.3 -48.1
+ 77.9 -50.0
+ 78.5 -51.9
+ 79.1 -53.7
+ 79.7 -55.6
+ 80.3 -57.5
+ 80.9 -59.4
+ 81.5 -61.2
+ 82.2 -63.1
+ 82.8 -65.0
+ 83.4 -66.9
+ 84.0 -68.8
+ 84.6 -70.6
+REG_LINE: 15
+ 84.6 -70.6
+ 85.2 -72.5
+ 85.8 -74.4
+ 86.4 -76.3
+ 87.0 -78.1
+ 87.6 -80.0
+ 88.2 -81.9
+ 88.8 -83.8
+ 89.4 -85.7
+ 90.0 -87.5
+ 90.6 -89.4
+ 91.2 -91.3
+ 91.8 -93.2
+ 92.4 -95.1
+ 93.0 -96.9
+REG_LINE: 15
+ 93.0 -96.9
+ 93.6 -98.8
+ 94.2 -101.
+ 94.8 -103.
+ 95.4 -104.
+ 96.0 -106.
+ 96.6 -108.
+ 97.2 -110.
+ 97.8 -112.
+ 98.4 -114.
+ 99.0 -116.
+ 99.6 -118.
+ 100. -119.
+ 101. -121.
+ 101. -123.
+REG_LINE: 15
+ 101. -123.
+ 102. -125.
+ 103. -127.
+ 103. -129.
+ 104. -131.
+ 104. -133.
+ 105. -134.
+ 106. -136.
+ 106. -138.
+ 107. -140.
+ 107. -142.
+ 108. -144.
+ 109. -146.
+ 109. -148.
+ 110. -150.
+REG_LINE: 15
+ 110. -150.
+ 110. -151.
+ 111. -153.
+ 112. -155.
+ 112. -157.
+ 113. -159.
+ 114. -161.
+ 114. -163.
+ 115. -165.
+ 115. -166.
+ 116. -168.
+ 117. -170.
+ 117. -172.
+ 118. -174.
+ 118. -176.
+REG_LINE: 14
+ 118. -176.
+ 119. -178.
+ 120. -180.
+ 120. -181.
+ 121. -183.
+ 121. -185.
+ 122. -187.
+ 123. -189.
+ 123. -191.
+ 124. -193.
+ 124. -195.
+ 125. -196.
+ 126. -198.
+ 126. -200.
+REG_LINE: 15
+ -82.8 82.6
+ -83.3 90.3
+ -83.6 98.1
+ -83.8 106.
+ -83.9 114.
+ -83.8 122.
+ -83.6 129.
+ -83.3 137.
+ -82.8 145.
+ -82.1 153.
+ -81.4 160.
+ -80.5 168.
+ -79.4 175.
+ -78.3 183.
+ -77.0 190.
+REG_LINE: 15
+ -82.8 82.6
+ -82.2 74.9
+ -81.4 67.2
+ -80.5 59.6
+ -79.5 52.0
+ -78.3 44.6
+ -77.1 37.2
+ -75.6 29.9
+ -74.1 22.8
+ -72.4 15.7
+ -70.6 8.81
+ -68.7 2.01
+ -66.6 -4.64
+ -64.4 -11.1
+ -62.2 -17.5
+REG_LINE: 15
+ -62.2 -17.5
+ -59.8 -23.7
+ -57.3 -29.7
+ -54.7 -35.5
+ -51.9 -41.1
+ -49.1 -46.5
+ -46.2 -51.8
+ -43.2 -56.8
+ -40.2 -61.6
+ -37.0 -66.1
+ -33.7 -70.5
+ -30.4 -74.6
+ -27.0 -78.5
+ -23.6 -82.1
+ -20.0 -85.5
+REG_LINE: 15
+ -20.0 -85.5
+ -16.5 -88.6
+ -12.8 -91.5
+ -9.15 -94.1
+ -5.42 -96.4
+ -1.66 -98.5
+ 2.14 -100.
+ 5.97 -102.
+ 9.83 -103.
+ 13.7 -104.
+ 17.6 -105.
+ 21.5 -105.
+ 25.4 -105.
+ 29.3 -105.
+ 33.2 -105.
+REG_LINE: 15
+ 33.2 -105.
+ 37.1 -104.
+ 41.0 -103.
+ 44.8 -102.
+ 48.7 -100.
+ 52.5 -98.5
+ 56.2 -96.5
+ 60.0 -94.2
+ 63.6 -91.6
+ 67.3 -88.7
+ 70.9 -85.6
+ 74.4 -82.2
+ 77.8 -78.6
+ 81.2 -74.7
+ 84.6 -70.6
+REG_LINE: 15
+ 84.6 -70.6
+ 87.8 -66.3
+ 91.0 -61.7
+ 94.1 -56.9
+ 97.1 -51.9
+ 100. -46.7
+ 103. -41.3
+ 105. -35.7
+ 108. -29.9
+ 111. -23.9
+ 113. -17.7
+ 115. -11.4
+ 117. -4.87
+ 120. 1.78
+ 121. 8.56
+REG_LINE: 15
+ 121. 8.56
+ 123. 15.5
+ 125. 22.5
+ 127. 29.7
+ 128. 37.0
+ 129. 44.3
+ 130. 51.8
+ 131. 59.3
+ 132. 66.9
+ 133. 74.6
+ 134. 82.3
+ 134. 90.0
+ 135. 97.8
+ 135. 106.
+ 135. 113.
+REG_LINE: 15
+ 135. 113.
+ 135. 121.
+ 135. 129.
+ 134. 137.
+ 134. 145.
+ 133. 152.
+ 132. 160.
+ 131. 168.
+ 130. 175.
+ 129. 183.
+ 128. 190.
+ 127. 197.
+ 125. 204.
+ 123. 211.
+ 121. 218.
+REG_LINE: 15
+ 121. 218.
+ 120. 225.
+ 117. 232.
+ 115. 238.
+ 113. 245.
+ 111. 251.
+ 108. 257.
+ 105. 263.
+ 103. 268.
+ 100. 274.
+ 97.1 279.
+ 94.1 284.
+ 91.0 289.
+ 87.8 293.
+ 84.6 298.
+REG_LINE: 2
+ 84.6 298.
+ 82.5 300.
+REG_LINE: 12
+ -31.6 300.
+ -33.7 297.
+ -37.0 293.
+ -40.2 288.
+ -43.2 284.
+ -46.2 279.
+ -49.1 273.
+ -51.9 268.
+ -54.7 262.
+ -57.3 257.
+ -59.8 251.
+ -62.2 244.
+REG_LINE: 15
+ -62.2 244.
+ -64.4 238.
+ -66.6 232.
+ -68.7 225.
+ -70.6 218.
+ -72.4 211.
+ -74.1 204.
+ -75.6 197.
+ -77.1 190.
+ -78.3 182.
+ -79.5 175.
+ -80.5 167.
+ -81.4 160.
+ -82.2 152.
+ -82.8 144.
+REG_LINE: 15
+ -82.8 144.
+ -83.3 137.
+ -83.6 129.
+ -83.8 121.
+ -83.9 113.
+ -83.8 105.
+ -83.6 97.5
+ -83.3 89.8
+ -82.8 82.0
+ -82.1 74.3
+ -81.4 66.7
+ -80.5 59.0
+ -79.4 51.5
+ -78.3 44.1
+ -77.0 36.7
+REG_LINE: 15
+ -82.8 144.
+ -83.3 137.
+ -83.6 129.
+ -83.8 121.
+ -83.9 113.
+ -83.8 105.
+ -83.6 97.5
+ -83.3 89.8
+ -82.8 82.0
+ -82.1 74.3
+ -81.4 66.7
+ -80.5 59.0
+ -79.4 51.5
+ -78.3 44.1
+ -77.0 36.7
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '0.0'
+ 27.8 114. BC .952 .306
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '50.0'
+ 36.3 87.9 BC .952 .306
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '100.0'
+ 44.7 61.6 BC .952 .306
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '150.0'
+ 53.2 35.3 BC .952 .306
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '200.0'
+ 61.6 9.02 BC .952 .306
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '250.0'
+ 70.1 -17.3 BC .952 .306
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '300.0'
+ 78.5 -43.6 BC .952 .306
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '350.0'
+ 86.9 -69.9 BC .952 .306
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '400.0'
+ 95.4 -96.2 BC .952 .306
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '450.0'
+ 104. -122. BC .952 .306
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '500.0'
+ 112. -149. BC .952 .306
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '550.0'
+ 121. -175. BC .952 .306
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '-3.0'
+ -80.3 82.7 BC .997 0.724E-01
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '-2.5'
+ -59.8 -16.6 BC .936 .352
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '-2.0'
+ -18.4 -83.6 BC .673 .740
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '-1.5'
+Symbol = "p1" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ Ax2 = # Axis number 2
+ Begin Axis # Coordinate axis
+ Label = "Pixel coordinate 2" # Axis Label
+ Symbol = "p2" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ End Frame
+ Map2 = # Mapping between nodes 1 and 2
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ InvA = 1 # First Mapping used in inverse direction
+ InvB = 1 # Second Mapping used in inverse direction
+ MapA = # First component Mapping
+ Begin MathMap # Transformation using mathematical functions
+ Nin = 2 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Fwd1 = "r=sqrt(x*x+y*y)" # Forward function 1
+ Fwd2 = "theta=atan2(y,x)" # Forward function 2
+ Inv1 = "x=r*cos(theta)" # Inverse function 1
+ Inv2 = "y=r*sin(theta)" # Inverse function 2
+ SimpFI = 1 # Forward-inverse pairs may simplify
+ SimpIF = 1 # Inverse-forward pairs may simplify
+ End MathMap
+ MapB = # Second component Mapping
+ Begin WinMap # Map one window on to another
+ Nin = 2 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Sft1 = -101.5 # Shift for axis 1
+ Sft2 = -201.5 # Shift for axis 2
+ End WinMap
+ End CmpMap
+ End FrameSet
+ Begin FrameSet # Set of inter-related coordinate systems
+# Title = "FK5 equatorial coordinates; mean equinox J2000.0; gnomonic projection" # Title of coordinate system
+# Naxes = 2 # Number of coordinate axes
+# Domain = "SKY" # Coordinate system domain
+# Epoch = 1977.77512999212 # Besselian epoch of observation
+# Lbl1 = "Right ascension" # Label for axis 1
+# Lbl2 = "Declination" # Label for axis 2
+# System = "FK5" # Coordinate system type
+# Uni1 = "hh:mm:ss.s" # Units for axis 1
+# Uni2 = "ddd:mm:ss" # Units for axis 2
+# Dir1 = 0 # Plot axis 1 in reverse direction
+# Bot2 = -1.5707963267949 # Lowest legal axis value
+# Top2 = 1.5707963267949 # Highest legal axis value
+ IsA Frame # Coordinate system description
+ Nframe = 2 # Number of Frames in FrameSet
+ Base = 1 # Index of base Frame
+ Currnt = 2 # Index of current Frame
+ Lnk2 = 1 # Node 2 is derived from node 1
+ Frm1 = # Frame number 1
+ Begin Frame # Coordinate system description
+ Title = "Pixel Coordinates" # Title of coordinate system
+ Naxes = 2 # Number of coordinate axes
+ Domain = "GRID" # Coordinate system domain
+# Lbl1 = "Pixel axis 1" # Label for axis 1
+# Lbl2 = "Pixel axis 2" # Label for axis 2
+ Ax1 = # Axis number 1
+ Begin Axis # Coordinate axis
+ Label = "Pixel axis 1" # Axis Label
+ End Axis
+ Ax2 = # Axis number 2
+ Begin Axis # Coordinate axis
+ Label = "Pixel axis 2" # Axis Label
+ End Axis
+ End Frame
+ Frm2 = # Frame number 2
+ Begin SkyFrame # Description of celestial coordinate system
+ Ident = " " # Permanent Object identification string
+ IsA Object # AST Object
+# Title = "FK5 equatorial coordinates; mean equinox J2000.0; gnomonic projection" # Title of coordinate system
+ Naxes = 2 # Number of coordinate axes
+# Domain = "SKY" # Coordinate system domain
+ Epoch = 1977.77512999212 # Besselian epoch of observation
+# Lbl1 = "Right ascension" # Label for axis 1
+# Lbl2 = "Declination" # Label for axis 2
+ System = "FK5" # Coordinate system type
+# Uni1 = "hh:mm:ss.s" # Units for axis 1
+# Uni2 = "ddd:mm:ss" # Units for axis 2
+# Dir1 = 0 # Plot axis 1 in reverse direction
+# Bot2 = -1.5707963267949 # Lowest legal axis value
+# Top2 = 1.5707963267949 # Highest legal axis value
+ Ax1 = # Axis number 1
+ Begin SkyAxis # Celestial coordinate axis
+ End SkyAxis
+ Ax2 = # Axis number 2
+ Begin SkyAxis # Celestial coordinate axis
+ End SkyAxis
+ IsA Frame # Coordinate system description
+ Proj = "gnomonic" # Description of sky projection
+ Eqnox = 2000 # Julian epoch of mean equinox
+ SRefIs = "Ignored" # Not rotated (ref. pos. is ignored)
+ SRef1 = 0 # Ref. pos. RA 0:00:00.0
+ SRef2 = -1.57079633000002 # Ref. pos. Dec -90:00:00
+ End SkyFrame
+ Map2 = # Mapping between nodes 1 and 2
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin WinMap # Map one window on to another
+ Nin = 2 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Sft1 = -893.6318379289 # Shift for axis 1
+ Sft2 = -223.8380193875 # Shift for axis 2
+ End WinMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin MatrixMap # Matrix transformation
+ Nin = 2 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ M0 = -3.25441534352674e-06 # Forward matrix value
+ M1 = -1.60367292352974e-08 # Forward matrix value
+ M2 = -1.812057487023e-08 # Forward matrix value
+ M3 = 3.25725533992408e-06 # Forward matrix value
+ Form = "Full" # Matrix storage form
+ End MatrixMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ InvA = 1 # First Mapping used in inverse direction
+ MapA = # First component Mapping
+ Begin WcsMap # FITS-WCS sky projection
+ Nin = 2 # Number of input coordinates
+ Invert = 1 # Mapping inverted
+ IsA Mapping # Mapping between coordinate systems
+ Type = "TAN" # Gnomonic projection
+ End WcsMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ InvA = 1 # First Mapping used in inverse direction
+ MapA = # First component Mapping
+ Begin SphMap # Cartesian to Spherical mapping
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ Invert = 1 # Mapping inverted
+ IsA Mapping # Mapping between coordinate systems
+ UntRd = 1 # All input vectors have unit length
+ PlrLg = 0 # Polar longit 32.8 -102. BC -.145 .989
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '-0.5'
+ 119. 9.22 BC -.965 .262
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '0.0'
+ 132. 113. BC -1.00 0.125E-02
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '0.5'
+ 119. 218. TC .964 .265
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '1.0'
+ 82.6 296. TC .787 .617
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '2.5'
+ -59.8 243. TC -.936 .352
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '3.0'
+ -80.3 144. TC -.997 0.724E-01
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 1
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: ' A FITS test'
+ 31.0 313. BC .000 1.00
+
+
+
+
+ FITS test number 3
+ ====================
+
+
+
+AST_SHOW:
+
+REG_SINK:
+SIMPLE = T / file does conform to FITS standard
+BITPIX = 16 / number of bits per data pixel
+NAXIS = 2 / number of data axes
+NAXIS1 = 1787 / length of data axis 1
+NAXIS2 = 447 / length of data axis 2
+EXTEND = T / FITS dataset may contain extensions
+COMMENT FITS (Flexible Image Transport System) format defined in Astronomy and
+COMMENT Astrophysics Supplement Series v44/p363, v44/p371, v73/p359, v73/p365.
+COMMENT Contact the NASA Science Office of Standards and Technology for the
+COMMENT FITS Definition document #100 and other FITS information.
+PLATENUM= '3665 ' / Plate number
+EMULSION= 'IIIaJ ' / Kodak emulsion type
+FILTER = 'GG395 ' / Schott glass filter type
+PLTSCALE= '67.14 ' / [arcsec/mm] plate scale
+FIELDNUM= '1 ' / Sky survey field number
+TELESCOP= 'UKST ' / Telescope on which the plate was taken
+TELETYPE= 'SCHM ' / Type of telescope
+SITELAT = -0.5458410576565 / [radians] latitude of telescope
+SITELONG= 2.601766194458 / [radians] longitude of telescope
+LST = '00:20 ' / [hh:mm] local sidereal time at start of obs
+INSTRUME= 'SuperCOSMOS I' / Measuring machine
+DATE-MES= '2000-11-04' / [yyyy-mm-dd] Date of this plate measurement
+NHKLINES= 146 / Number of lines from house-keeping file
+HKLIN001= 'JOB.JOBNO UKJ001'
+HKLIN002= 'JOB.DATE-MES 2000:11:04'
+HKLIN003= 'JOB.TIME 12:51:09'
+HKLIN004= 'JOB.INSTRUME SuperCOSMOS I'
+HKLIN005= 'JOB.ORIGIN Royal Observatory Edinburgh'
+HKLIN006= 'JOB.SOFTWARE /home/scosdev/v033'
+HKLIN007= 'JOB.OPERATOR ebt'
+HKLIN008= 'JOB.USER htm'
+HKLIN009= 'JOB.USERREF NONE'
+HKLIN010= 'JOB.UORIGIN ROE'
+HKLIN011= 'JOB.UCOUNTRY uk'
+HKLIN012= 'JOB.COMMENT Digital catalogue of the Sky'
+HKLIN013= 'JOB.IAM_FILE iam.srt'/ / ' /
+HKLIN014= 'PLATE.TELESCOP UKST'
+HKLIN015= 'PLATE.TELTYPE SCHM'
+HKLIN016= 'PLATE.PLATE 3665'
+HKLIN017= 'PLATE.MATERIAL 3mm glass'
+HKLIN018= 'PLATE.EMULSION IIIaJ'
+HKLIN019= 'PLATE.FILTER GG395'
+HKLIN020= 'PLATE.PSCALE 67.14'
+HKLIN021= 'PLATE.FIELD 1'
+HKLIN022= 'PLATE.RA_PNT 0'
+HKLIN023= 'PLATE.DEC_PNT -90'
+HKLIN024= 'PLATE.RADECSYS FK4'
+HKLIN025= 'PLATE.EQUINOX 1950'
+HKLIN026= 'PLATE.TIMESYS BESSELIAN'
+HKLIN027= 'PLATE.EPOCH 1977.78'/ / ' /
+HKLIN028= 'PLATE.EXPOSURE 75'
+HKLIN029= 'PLATE.UTDATE 771011'
+HKLIN030= 'PLATE.LST 0020'
+HKLIN031= 'PLATE.MJD 43426.573008796'
+HKLIN032= 'PLATE.TELLAT -0.54584105765654'
+HKLIN033= 'PLATE.TELLONG 2.6017661944583'
+HKLIN034= 'PLATE.TELHT 1145'
+HKLIN035= 'PLATE.TEMP 273.155'/ / ' /
+HKLIN036= 'PLATE.ATMOSP 1013.25'/ / ' /
+HKLIN037= 'PLATE.HUMID 0.5'
+HKLIN038= 'PLATE.WAVE 4500'
+HKLIN039= 'PLATE.TROPL 0.0065'
+HKLIN040= 'CALIBRATION.CALTYPE SPLINE'
+HKLIN041= 'CALIBRATION.STEPWEDG KPNO'
+HKLIN042= 'CALIBRATION.NSTEPS 8'
+HKLIN043= 'MEASUREMENT.ORIENTAT news'
+HKLIN044= 'MEASUREMENT.EMULPOS UP'
+HKLIN045= 'MEASUREMENT.SCANFILT 14'
+HKLIN046= 'MEASUREMENT.SOSP 552'
+HKLIN047= 'MEASUREMENT.STEPSIZE 10'
+HKLIN048= 'MEASUREMENT.SCANLEN 1152'
+HKLIN049= 'MEASUREMENT.A-XMIN 1622000'/ / ' /
+HKLIN050= 'MEASUREMENT.A-YMIN 1622000'/ / ' /
+HKLIN051= 'MEASUREMENT.A-XMAX 33878000'
+HKLIN052= 'MEASUREMENT.A-YMAX 33878000'
+HKLIN053= 'MEASUREMENT.X_PNT 17500000'
+HKLIN054= 'MEASUREMENT.Y_PNT 18000000'
+HKLIN055= 'ANALYSIS.NPARAMS 32'
+HKLIN056= 'ANALYSIS.AREACUT 8'
+HKLIN057= 'ANALYSIS.AP-PARAM 1.07'
+HKLIN058= 'DEBLEND.DB-PARAM 1.05'
+HKLIN059= 'DEBLEND.DB-AMIN 16'
+HKLIN060= 'DEBLEND.DB-AMAX 100000'
+HKLIN061= 'DEBLEND.DB-ACUT 8'
+HKLIN062= 'DEBLEND.DB-LEVEL 16'
+HKLIN063= 'DEBLEND.SELECT PARENT+CHILD'
+HKLIN064= 'SKY.SKYSQUAR 64'
+HKLIN065= 'SKY.SKYDEFN MEDIAN'
+HKLIN066= 'SKY.SKYFILTR bdkjunk'/ / ' /
+HKLIN067= 'SKY.F-THRESH 8'
+HKLIN068= 'SKY.F-SCLEN 4'
+HKLIN069= 'THRESHOLDING.PCUT 10'
+HKLIN070= 'IAMQC.AREAMIN 8'
+HKLIN071= 'IAMQC.AREAMAX 77346'
+HKLIN072= 'IAMQC.MINMAG -30515'
+HKLIN073= 'IAMQC.MAXMAG -17954'
+HKLIN074= 'IAMQC.MINELL 0.0004156232'
+HKLIN075= 'IAMQC.MAXELL 1'
+HKLIN076= 'IAMQC.MODELL 0.14'
+HKLIN077= 'IAMQC.MODOR 91'
+HKLIN078= 'IAMQC.MIDELL 0.21'
+HKLIN079= 'IAMQC.MIDOR 93'
+HKLIN080= 'IAMQC.MEANELL 0.2467037'
+HKLIN081= 'IAMQC.MEANOR 91.63474'
+HKLIN082= 'IAMQC.NUMOBJ 556985'
+HKLIN083= 'IAMQC.PARENTS 486656'
+HKLIN084= 'IAMQC.RANGING TRUE'
+HKLIN085= 'IAMQC.LANE_1 15571'
+HKLIN086= 'IAMQC.LANE_2 33207'
+HKLIN087= 'IAMQC.LANE_3 51478'
+HKLIN088= 'IAMQC.LANE_4 69944'
+HKLIN089= 'IAMQC.LANE_5 89236'
+HKLIN090= 'IAMQC.LANE_6 108416'
+HKLIN091= 'IAMQC.LANE_7 127481'
+HKLIN092= 'IAMQC.LANE_8 146699'
+HKLIN093= 'IAMQC.LANE_9 166380'
+HKLIN094= 'IAMQC.LANE_10 186126'
+HKLIN095= 'IAMQC.LANE_11 205946'
+HKLIN096= 'IAMQC.LANE_12 225915'
+HKLIN097= 'IAMQC.LANE_13 245926'
+HKLIN098= 'IAMQC.LANE_14 266574'
+HKLIN099= 'IAMQC.LANE_15 287150'
+HKLIN100= 'IAMQC.LANE_16 308087'
+HKLIN101= 'IAMQC.LANE_17 328830'
+HKLIN102= 'IAMQC.LANE_18 350253'
+HKLIN103= 'IAMQC.LANE_19 370738'
+HKLIN104= 'IAMQC.LANE_20 391722'
+HKLIN105= 'IAMQC.LANE_21 412801'
+HKLIN106= 'IAMQC.LANE_22 433795'
+HKLIN107= 'IAMQC.LANE_23 454383'
+HKLIN108= 'IAMQC.LANE_24 474711'
+HKLIN109= 'IAMQC.LANE_25 495108'
+HKLIN110= 'IAMQC.LANE_26 515755'
+HKLIN111= 'IAMQC.LANE_27 536499'
+HKLIN112= 'IAMQC.LANE_28 556985'
+HKLIN113= 'XYTORADEC.STARCAT /sdata/scos/refcats/tycho2.FIT'
+HKLIN114= 'XYTORADEC.BRIGHTLIM 9'
+HKLIN115= 'XYTORADEC.C-EQUIN 2000'
+HKLIN116= 'XYTORADEC.C-EQTSYS JULIAN'
+HKLIN117= 'XYTORADEC.C-EPOCH 2000'
+HKLIN118= 'XYTORADEC.C-EPTSYS JULIAN'
+HKLIN119= 'XYTORADEC.R-EQUIN 2000'
+HKLIN120= 'XYTORADEC.R-TSYS JULIAN'
+HKLIN121= 'XYTORADEC.MAXITER 5000'
+HKLIN122= 'XYTORADEC.RCRITINI 500000'
+HKLIN123= 'XYTORADEC.RCRITABS 50000'
+HKLIN124= 'XYTORADEC.RCRITREL 1'
+HKLIN125= 'XYTORADEC.RCRITFIN 3'
+HKLIN126= 'XYTORADEC.HARDCOPY /scos1/scos/UKJ001/UKJ001.ps'
+HKLIN127= 'XYTORADEC.REFSMULT 5'
+HKLIN128= 'XYTORADEC.RESDMULT 1000'
+HKLIN129= 'XYTORADEC.RACOL RA'
+HKLIN130= 'XYTORADEC.DECOL DEC'
+HKLIN131= 'XYTORADEC.RAPMCOL PMRA'
+HKLIN132= 'XYTORADEC.DECPMCOL PMDE'
+HKLIN133= 'XYTORADEC.PLXCOL NONE'
+HKLIN134= 'XYTORADEC.RVCOL NONE'
+HKLIN135= 'XYTORADEC.MAGCOL VT'
+HKLIN136= 'XYTORADEC.STARSC 2374'
+HKLIN137= 'XYTORADEC.STARSU 1727'
+HKLIN138= 'XYTORADEC.COEFFS_1 17.640343856524'
+HKLIN139= 'XYTORADEC.COEFFS_2 -260.44151995641'
+HKLIN140= 'XYTORADEC.COEFFS_3 -163.09155572601'
+HKLIN141= 'XYTORADEC.COEFFS_4 17.504230442205'
+HKLIN142= 'XYTORADEC.COEFFS_5 -163.08676953832'
+HKLIN143= 'XYTORADEC.COEFFS_6 260.48817907668'
+HKLIN144= 'XYTORADEC.DISTR -0.33333333333333'
+HKLIN145= 'XYTORADEC.RA_PNT 0.54924996662137'
+HKLIN146= 'XYTORADEC.DEC_PNT -1.5684931501781'
+HISTORY = 'SuperCOSMOS image analysis and mapping mode (IAM and MM)' /
+HISTORY = 'data written by xydcomp_ss.' /
+HISTORY = 'Any questions/comments/suggestions/bug reports should be sent' /
+HISTORY = 'to N.Hambly@roe.ac.uk' /
+ASTSIGX = 0.37 / [arcsec] std. dev. of astrometric fit in X
+ASTSIGY = 0.38 / [arcsec] std. dev. of astrometric fit in Y
+PC001001= 1.0 / DEPRECATED - Axis rotation matrix
+PC001002= 0.004927623810613 / DEPRECATED - Axis rotation matrix
+PC002001= -0.005563056187788 / DEPRECATED - Axis rotation matrix
+PC002002= 1.0 / DEPRECATED - Axis rotation matrix
+CROTA2 = 0.3005532298491 / DEPRECATED - rotation of axis 2
+DATATYPE= 'INTEGER*2' / Type of data
+DATUNITS= 'DENSITY ' / Units: transmission, density or intensity
+XPIXELSZ= 9.997114974 / [microns] X pixel size
+YPIXELSZ= 10.0 / [microns] Y pixel size
+OBJCTRA = ' 0 0 0.000' / Centre Right Ascension (J2000)
+OBJCTDEC= '-90 0 0.00' / Centre Declination (J2000)
+OBJCTX = 16368.63183793 / [pixels] Centre X on plate
+OBJCTY = 14740.83801939 / [pixels] Centre Y on plate
+
+Objects written: 1
+
+Native Encoding:
+
+COMMENT AST ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ AST
+COMMENT AST WCS information in AST format AST
+COMMENT AST See http://www.starlink.ac.uk/ast/ AST
+COMMENT AST Beginning of AST data for FrameSet object AST
+COMMENT AST ................................................................ AST
+BEGAST_A= 'FrameSet' / Set of inter-related coordinate systems
+NFRAME_A= 2 / Number of Frames in FrameSet
+BASE_A = 1 / Index of base Frame
+CURRNT_A= 2 / Index of current Frame
+LNK2_A = 1 / Node 2 is derived from node 1
+FRM1_A = ' ' / Frame number 1
+BEGAST_B= 'Frame ' / Coordinate system description
+TITLE_A = 'Pixel Coordinates' / Title of coordinate system
+NAXES_A = 2 / Number of coordinate axes
+DOMAIN_A= 'GRID ' / Coordinate system domain
+AX1_A = ' ' / Axis number 1
+BEGAST_C= 'Axis ' / Coordinate axis
+LABEL_A = 'Pixel axis 1' / Axis Label
+ENDAST_A= 'Axis ' / End of object definition
+AX2_A = ' ' / Axis number 2
+BEGAST_D= 'Axis ' / Coordinate axis
+LABEL_B = 'Pixel axis 2' / Axis Label
+ENDAST_B= 'Axis ' / End of object definition
+ENDAST_C= 'Frame ' / End of object definition
+FRM2_A = ' ' / Frame number 2
+BEGAST_E= 'SkyFrame' / Description of celestial coordinate system
+IDENT_A = '" " ' / Permanent Object identification string
+ISA_A = 'Object ' / AST Object
+NAXES_B = 2 / Number of coordinate axes
+EPOCH_A = 1977.77512999212 / Besselian epoch of observation
+SYSTEM_A= 'FK5 ' / Coordinate system type
+AX1_B = ' ' / Axis number 1
+BEGAST_F= 'SkyAxis ' / Celestial coordinate axis
+ENDAST_D= 'SkyAxis ' / End of object definition
+AX2_B = ' ' / Axis number 2
+BEGAST_G= 'SkyAxis ' / Celestial coordinate axis
+ENDAST_E= 'SkyAxis ' / End of object definition
+ISA_B = 'Frame ' / Coordinate system description
+PROJ_A = 'gnomonic' / Description of sky projection
+EQNOX_A = 2000.0 / Julian epoch of mean equinox
+SREFIS_A= 'Ignored ' / Not rotated (ref. pos. is ignored)
+SREF1_A = 0.0 / Ref. pos. RA 0:00:00.0
+SREF2_A = -1.57079633 / Ref. pos. Dec -90:00:00
+ENDAST_F= 'SkyFrame' / End of object definition
+MAP2_A = ' ' / Mapping between nodes 1 and 2
+BEGAST_H= 'CmpMap ' / Compound Mapping
+NIN_A = 2 / Number of input coordinates
+ISSIMP_A= 1 / Mapping has been simplified
+ISA_C = 'Mapping ' / Mapping between coordinate systems
+MAPA_A = ' ' / First component Mapping
+BEGAST_I= 'WinMap ' / Map one window on to another
+NIN_B = 2 / Number of input coordinates
+INVERT_A= 0 / Mapping not inverted
+ISA_D = 'Mapping ' / Mapping between coordinate systems
+SFT1_A = -893.6318379289 / Shift for axis 1
+SFT2_A = -223.8380193875 / Shift for axis 2
+ENDAST_G= 'WinMap ' / End of object definition
+MAPB_A = ' ' / Second component Mapping
+BEGAST_J= 'CmpMap ' / Compound Mapping
+NIN_C = 2 / Number of input coordinates
+ISA_E = 'Mapping ' / Mapping between coordinate systems
+MAPA_B = ' ' / First component Mapping
+BEGAST_K= 'MatrixMap' / Matrix transformation
+NIN_D = 2 / Number of input coordinates
+INVERT_B= 0 / Mapping not inverted
+ISA_F = 'Mapping ' / Mapping between coordinate systems
+M0_A = -3.25441534352674E-6/ Forward matrix value
+M1_A = -1.60367292352974E-8/ Forward matrix value
+M2_A = -1.812057487023E-8 / Forward matrix value
+M3_A = 3.25725533992408E-6 / Forward matrix value
+FORM_A = 'Full ' / Matrix storage form
+ENDAST_H= 'MatrixMap' / End of object definition
+MAPB_B = ' ' / Second component Mapping
+BEGAST_L= 'CmpMap ' / Compound Mapping
+NIN_E = 2 / Number of input coordinates
+ISA_G = 'Mapping ' / Mapping between coordinate systems
+INVA_A = 1 / First Mapping used in inverse direction
+MAPA_C = ' ' / First component Mapping
+BEGAST_M= 'WcsMap ' / FITS-WCS sky projection
+NIN_F = 2 / Number of input coordinates
+INVERT_C= 1 / Mapping inverted
+ISA_H = 'Mapping ' / Mapping between coordinate systems
+TYPE_A = 'TAN ' / Gnomonic projection
+ENDAST_I= 'WcsMap ' / End of object definition
+MAPB_C = ' ' / Second component Mapping
+BEGAST_N= 'CmpMap ' / Compound Mapping
+NIN_G = 2 / Number of input coordinates
+ISA_I = 'Mapping ' / Mapping between coordinate systems
+INVA_B = 1 / First Mapping used in inverse direction
+MAPA_D = ' ' / First component Mapping
+BEGAST_O= 'SphMap ' / Cartesian to Spherical mapping
+NIN_H = 3 / Number of input coordinates
+NOUT_A = 2 / Number of output coordinates
+INVERT_D= 1 / Mapping inverted
+ISA_J = 'Mapping ' / Mapping between coordinate systems
+UNTRD_A = 1 / All input vectors have unit length
+PLRLG_A = 0.0 / Polar longitude (rad.s)
+ENDAST_J= 'SphMap ' / End of object definition
+MAPB_D = ' ' / Second component Mapping
+BEGAST_P= 'CmpMap ' / Compound Mapping
+NIN_I = 3 / Number of input coordinates
+NOUT_B = 2 / Number of output coordinates
+ISA_K = 'Mapping ' / Mapping between coordinate systems
+MAPA_E = ' ' / First component Mapping
+BEGAST_Q= 'MatrixMap' / Matrix transformation
+NIN_J = 3 / Number of input coordinates
+INVERT_E= 0 / Mapping not inverted
+ISA_L = 'Mapping ' / Mapping between coordinate systems
+M0_B = -1.0 / Forward matrix value
+M1_B = 1.0 / Forward matrix value
+M2_B = -1.0 / Forward matrix value
+FORM_B = 'Diagonal' / Matrix storage form
+ENDAST_K= 'MatrixMap' / End of object definition
+MAPB_E = ' ' / Second component Mapping
+BEGAST_R= 'SphMap ' / Cartesian to Spherical mapping
+NIN_K = 3 / Number of input coordinates
+NOUT_C = 2 / Number of output coordinates
+INVERT_F= 0 / Mapping not inverted
+ISA_M = 'Mapping ' / Mapping between coordinate systems
+UNTRD_B = 1 / All input vectors have unit length
+PLRLG_B = 0.0 / Polar longitude (rad.s)
+ENDAST_L= 'SphMap ' / End of object definition
+ENDAST_M= 'CmpMap ' / End of object definition
+ENDAST_N= 'CmpMap ' / End of object definition
+ENDAST_O= 'CmpMap ' / End of object definition
+ENDAST_P= 'CmpMap ' / End of object definition
+ENDAST_Q= 'CmpMap ' / End of object definition
+ENDAST_R= 'FrameSet' / End of object definition
+COMMENT AST ................................................................ AST
+COMMENT AST End of AST data for FrameSet object AST
+COMMENT AST ---------------------------------------------------------------- AST
+
+ATTRIBUTES:
+ Colour(axis1) : 1
+ Font(Stri) : 1
+ Nout : 1
+ Class : 4
+ Tol : 0.100000E-01
+ Gap(1) : .523599
+ Border : 0
+ Invert : 0
+ TextLabGap : 0.100000E-01
+ Nin : 2
+ Current : 3
+ Base : 1
+ Nobject : 1
+ RefCOUNT : 1
+
+AST_GRID:
+REG_LINE: 2
+ 15.5 -136.
+ 15.4 -137.
+REG_LINE: 2
+ 18.6 -144.
+ 18.5 -146.
+REG_LINE: 2
+ 21.8 -149.
+ 21.8 -151.
+REG_LINE: 2
+ 25.1 -150.
+ 25.1 -154.
+REG_LINE: 2
+ 28.3 -149.
+ 28.4 -150.
+REG_LINE: 2
+ 31.5 -143.
+ 31.6 -145.
+REG_LINE: 2
+ 34.6 -135.
+ 34.7 -136.
+REG_LINE: 2
+ 37.6 -123.
+ 37.8 -127.
+REG_LINE: 2
+ 40.3 -108.
+ 40.4 -110.
+REG_LINE: 2
+ 42.7 -91.0
+ 42.9 -92.7
+REG_LINE: 2
+ 44.9 -71.2
+ 45.2 -72.9
+REG_LINE: 2
+ 46.7 -49.3
+ 47.5 -53.0
+REG_LINE: 2
+ 48.1 -25.8
+ 48.6 -27.4
+REG_LINE: 2
+ 49.2 -.928
+ 49.9 -2.51
+REG_LINE: 2
+ 49.8 24.8
+ 51.0 23.5
+REG_LINE: 2
+ 50.0 50.9
+ 53.7 51.1
+REG_LINE: 2
+ 49.7 77.1
+ 50.9 78.4
+REG_LINE: 2
+ 49.1 103.
+ 49.8 104.
+REG_LINE: 2
+ 48.0 127.
+ 48.5 129.
+REG_LINE: 2
+ 46.6 151.
+ 47.3 155.
+REG_LINE: 2
+ 44.7 173.
+ 45.0 174.
+REG_LINE: 2
+ 42.6 192.
+ 42.8 194.
+REG_LINE: 2
+ 40.1 209.
+ 40.2 211.
+REG_LINE: 2
+ 37.4 224.
+ 37.6 228.
+REG_LINE: 2
+ 34.4 235.
+ 34.5 237.
+REG_LINE: 2
+ 31.3 244.
+ 31.4 245.
+REG_LINE: 2
+ 28.1 248.
+ 28.1 250.
+REG_LINE: 2
+ 24.8 250.
+ 24.8 254.
+REG_LINE: 2
+ 21.6 248.
+ 21.5 250.
+REG_LINE: 2
+ 18.4 243.
+ 18.3 245.
+REG_LINE: 2
+ 15.3 234.
+ 15.2 236.
+REG_LINE: 2
+ 12.3 223.
+ 12.1 226.
+REG_LINE: 2
+ 9.62 208.
+ 9.45 210.
+REG_LINE: 2
+ 7.17 191.
+ 6.95 192.
+REG_LINE: 2
+ 5.02 171.
+ 4.74 173.
+REG_LINE: 2
+ 3.22 149.
+ 2.41 153.
+REG_LINE: 2
+ 1.78 125.
+ 1.27 127.
+REG_LINE: 2
+ .747 101.
+ -0.657E-02 102.
+REG_LINE: 2
+ .124 74.8
+ -1.11 76.1
+REG_LINE: 2
+ -0.740E-01 48.7
+ -3.82 48.5
+REG_LINE: 2
+ .156 22.6
+ -1.02 21.3
+REG_LINE: 2
+ .811 -3.08
+ 0.841E-01 -4.67
+REG_LINE: 2
+ 1.88 -27.8
+ 1.38 -29.5
+REG_LINE: 2
+ 3.34 -51.3
+ 2.56 -54.9
+REG_LINE: 2
+ 5.17 -73.0
+ 4.89 -74.7
+REG_LINE: 2
+ 7.34 -92.6
+ 7.13 -94.3
+REG_LINE: 2
+ 9.81 -110.
+ 9.65 -111.
+REG_LINE: 2
+ 12.5 -124.
+ 12.3 -128.
+REG_LINE: 2
+ 15.5 -136.
+ 15.4 -137.
+REG_LINE: 2
+ 18.6 -144.
+ 18.5 -146.
+REG_LINE: 2
+ 21.8 -149.
+ 21.8 -151.
+REG_LINE: 2
+ 25.1 -150.
+ 25.1 -154.
+REG_LINE: 2
+ 28.3 -149.
+ 28.4 -150.
+REG_LINE: 2
+ 31.5 -143.
+ 31.6 -145.
+REG_LINE: 2
+ 34.6 -135.
+ 34.7 -136.
+REG_LINE: 2
+ 24.9 74.8
+ 26.5 75.6
+REG_LINE: 2
+ 24.9 99.9
+ 26.5 101.
+REG_LINE: 2
+ 24.9 125.
+ 26.5 126.
+REG_LINE: 2
+ 24.9 150.
+ 28.3 152.
+REG_LINE: 2
+ 24.9 175.
+ 26.5 176.
+REG_LINE: 2
+ 24.9 200.
+ 26.4 201.
+REG_LINE: 2
+ 24.8 225.
+ 26.4 226.
+REG_LINE: 2
+ 24.8 250.
+ 28.2 252.
+REG_LINE: 2
+ 24.8 275.
+ 26.4 276.
+REG_LINE: 15
+ 25.1 -150.
+ 24.1 -150.
+ 23.2 -150.
+ 22.3 -149.
+ 21.3 -148.
+ 20.4 -147.
+ 19.5 -146.
+ 18.6 -144.
+ 17.7 -142.
+ 16.8 -140.
+ 15.9 -137.
+ 15.1 -134.
+ 14.2 -131.
+ 13.4 -128.
+ 12.5 -124.
+REG_LINE: 15
+ 25.1 -150.
+ 26.0 -150.
+ 26.9 -150.
+ 27.9 -149.
+ 28.8 -148.
+ 29.7 -147.
+ 30.6 -145.
+ 31.5 -143.
+ 32.4 -141.
+ 33.3 -139.
+ 34.2 -136.
+ 35.1 -133.
+ 35.9 -130.
+ 36.7 -127.
+ 37.6 -123.
+REG_LINE: 15
+ 37.6 -123.
+ 38.4 -119.
+ 39.1 -115.
+ 39.9 -111.
+ 40.6 -106.
+ 41.4 -101.
+ 42.1 -96.2
+ 42.7 -91.0
+ 43.4 -85.6
+ 44.0 -79.9
+ 44.6 -74.2
+ 45.2 -68.2
+ 45.7 -62.1
+ 46.2 -55.8
+ 46.7 -49.3
+REG_LINE: 15
+ 46.7 -49.3
+ 47.1 -42.8
+ 47.5 -36.1
+ 47.9 -29.2
+ 48.3 -22.3
+ 48.6 -15.3
+ 48.9 -8.13
+ 49.2 -.928
+ 49.4 6.35
+ 49.6 13.7
+ 49.7 21.1
+ 49.8 28.5
+ 49.9 36.0
+ 50.0 43.4
+ 50.0 50.9
+REG_LINE: 15
+ 50.0 50.9
+ 49.9 58.4
+ 49.9 65.9
+ 49.8 73.3
+ 49.7 80.8
+ 49.5 88.1
+ 49.3 95.5
+ 49.1 103.
+ 48.8 110.
+ 48.5 117.
+ 48.2 124.
+ 47.8 131.
+ 47.4 138.
+ 47.0 144.
+ 46.6 151.
+REG_LINE: 15
+ 46.6 151.
+ 46.1 157.
+ 45.6 164.
+ 45.0 170.
+ 44.4 176.
+ 43.8 181.
+ 43.2 187.
+ 42.6 192.
+ 41.9 197.
+ 41.2 202.
+ 40.5 207.
+ 39.7 212.
+ 38.9 216.
+ 38.2 220.
+ 37.4 224.
+REG_LINE: 15
+ 37.4 224.
+ 36.5 227.
+ 35.7 231.
+ 34.8 234.
+ 34.0 237.
+ 33.1 239.
+ 32.2 241.
+ 31.3 244.
+ 30.4 245.
+ 29.5 247.
+ 28.6 248.
+ 27.6 249.
+ 26.7 250.
+ 25.8 250.
+ 24.8 250.
+REG_LINE: 15
+ 24.8 250.
+ 23.9 250.
+ 23.0 249.
+ 22.0 249.
+ 21.1 248.
+ 20.2 246.
+ 19.3 245.
+ 18.4 243.
+ 17.5 241.
+ 16.6 238.
+ 15.7 236.
+ 14.8 233.
+ 14.0 230.
+ 13.1 226.
+ 12.3 223.
+REG_LINE: 15
+ 12.3 223.
+ 11.5 219.
+ 10.8 215.
+ 9.99 210.
+ 9.25 206.
+ 8.53 201.
+ 7.84 196.
+ 7.17 191.
+ 6.52 185.
+ 5.90 180.
+ 5.31 174.
+ 4.74 168.
+ 4.20 162.
+ 3.70 155.
+ 3.22 149.
+REG_LINE: 15
+ 3.22 149.
+ 2.77 142.
+ 2.35 136.
+ 1.96 129.
+ 1.61 122.
+ 1.29 115.
+ 1.00 108.
+ .747 101.
+ .526 93.3
+ .339 85.9
+ .187 78.6
+ 0.696E-01 71.1
+ -0.132E-01 63.7
+ -0.611E-01 56.2
+ -0.740E-01 48.7
+REG_LINE: 15
+ -0.740E-01 48.7
+ -0.519E-01 41.2
+ 0.519E-02 33.7
+ 0.971E-01 26.3
+ .224 18.9
+ .385 11.5
+ .581 4.18
+ .811 -3.08
+ 1.07 -10.3
+ 1.37 -17.4
+ 1.70 -24.4
+ 2.06 -31.3
+ 2.46 -38.1
+ 2.88 -44.7
+ 3.34 -51.3
+REG_LINE: 15
+ 3.34 -51.3
+ 3.83 -57.7
+ 4.34 -63.9
+ 4.89 -70.0
+ 5.46 -75.9
+ 6.06 -81.6
+ 6.69 -87.2
+ 7.34 -92.6
+ 8.02 -97.7
+ 8.72 -103.
+ 9.44 -107.
+ 10.2 -112.
+ 11.0 -116.
+ 11.7 -120.
+ 12.5 -124.
+REG_LINE: 15
+ 12.5 -124.
+ 13.4 -128.
+ 14.2 -131.
+ 15.1 -134.
+ 15.9 -137.
+ 16.8 -140.
+ 17.7 -142.
+ 18.6 -144.
+ 19.5 -146.
+ 20.4 -147.
+ 21.3 -148.
+ 22.3 -149.
+ 23.2 -150.
+ 24.1 -150.
+ 25.1 -150.
+REG_LINE: 15
+ 25.1 -150.
+ 26.0 -150.
+ 26.9 -150.
+ 27.9 -149.
+ 28.8 -148.
+ 29.7 -147.
+ 30.6 -145.
+ 31.5 -143.
+ 32.4 -141.
+ 33.3 -139.
+ 34.2 -136.
+ 35.1 -133.
+ 35.9 -130.
+ 36.7 -127.
+ 37.6 -123.
+REG_LINE: 15
+ 25.1 -150.
+ 26.0 -150.
+ 26.9 -150.
+ 27.9 -149.
+ 28.8 -148.
+ 29.7 -147.
+ 30.6 -145.
+ 31.5 -143.
+ 32.4 -141.
+ 33.3 -139.
+ 34.2 -136.
+ 35.1 -133.
+ 35.9 -130.
+ 36.7 -127.
+ 37.6 -123.
+REG_LINE: 15
+ 24.9 49.8
+ 24.9 57.0
+ 24.9 64.1
+ 24.9 71.3
+ 24.9 78.4
+ 24.9 85.6
+ 24.9 92.7
+ 24.9 99.9
+ 24.9 107.
+ 24.9 114.
+ 24.9 121.
+ 24.9 128.
+ 24.9 136.
+ 24.9 143.
+ 24.9 150.
+REG_LINE: 15
+ 24.9 150.
+ 24.9 157.
+ 24.9 164.
+ 24.9 171.
+ 24.9 179.
+ 24.9 186.
+ 24.9 193.
+ 24.9 200.
+ 24.9 207.
+ 24.8 214.
+ 24.8 221.
+ 24.8 229.
+ 24.8 236.
+ 24.8 243.
+ 24.8 250.
+REG_LINE: 8
+ 24.8 250.
+ 24.8 257.
+ 24.8 264.
+ 24.8 272.
+ 24.8 279.
+ 24.8 286.
+ 24.8 293.
+ 24.8 300.
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '12'
+ 24.9 -148. BC -0.654E-01 .998
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '14'
+ 35.1 -123. BC -.978 .210
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '16'
+ 44.2 -49.2 BC -.997 0.716E-01
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '18'
+ 47.5 50.9 BC -1.00 -0.942E-03
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '20'
+ 44.1 151. TC .997 0.732E-01
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '22'
+ 34.9 223. TC .977 .213
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '0'
+ 24.9 248. TC -0.236E-01 1.00
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '2'
+ 14.8 222. TC -.978 .210
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '4'
+ 5.71 149. TC -.997 0.716E-01
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '6'
+ 2.43 48.7 BC 1.00 0.288E-03
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '8'
+ 5.83 -51.1 BC .997 0.732E-01
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '10'
+ 15.0 -124. BC .977 .215
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '-90:00'
+ 22.4 49.8 BC -1.00 -0.615E-03
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '59'
+ 22.4 150. BC -1.00 -0.615E-03
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '-89:58'
+ 22.3 250. BC -1.00 -0.615E-03
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 1
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: ' A FITS test'
+ 30.9 313. BC .000 1.00
+ude (rad.s)
+ End SphMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin MatrixMap # Matrix transformation
+ Nin = 3 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ M0 = -1 # Forward matrix value
+ M1 = 1 # Forward matrix value
+ M2 = -1 # Forward matrix value
+ Form = "Diagonal" # Matrix storage form
+ End MatrixMap
+ MapB = # Second component Mapping
+ Begin SphMap # Cartesian to Spherical mapping
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ UntRd = 1 # All input vectors have unit length
+ PlrLg = 0 # Polar longitude (rad.s)
+ End SphMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ End FrameSet
diff --git a/ast/ast_tester/regression.f b/ast/ast_tester/regression.f
new file mode 100644
index 0000000..e9ca32e
--- /dev/null
+++ b/ast/ast_tester/regression.f
@@ -0,0 +1,1515 @@
+ PROGRAM REGRESSION
+*+
+* Name:
+* REGRESSION
+
+* Purpose:
+* Tests many aspects of the AST library (Fortran interface).
+
+* Language:
+* Starlink Fortran 77
+
+* Type of Module:
+* Fortran program
+
+* Invocation:
+* regression
+
+* Description:
+* This application utilizes many aspects of the AST library, producing
+* textual output on standard output. The output should be redirected
+* to a text file and compared to the output from previous runs to
+* detect any changes in functionality.
+
+* Authors:
+* DSB: David Berry (STARLINK)
+* {enter_new_authors_here}
+
+* History:
+* 29-JAN-2002 (DSB):
+* Original version.
+* {enter_further_changes_here}
+
+*-
+
+* Type Definitions:
+ IMPLICIT NONE ! No implicit typing
+
+* Global Variables:
+ INTEGER CMN_FTEST ! Which FITS test are we doing?
+ INTEGER CMN_LINE ! The index of the next header to read
+ COMMON /REG/ CMN_FTEST, CMN_LINE
+
+* Global Constants:
+ INCLUDE 'SAE_PAR' ! Standard SAE constants
+ INCLUDE 'AST_PAR' ! AST constants and declarations
+
+* Status:
+ INTEGER STATUS ! Global status
+
+* External References:
+ INTEGER CHR_LEN
+
+ EXTERNAL REG_SOURCE
+ EXTERNAL REG_SINK
+
+ EXTERNAL REG_ATTR
+ EXTERNAL REG_FLUSH
+ EXTERNAL REG_LINE
+ EXTERNAL REG_MARK
+ EXTERNAL REG_TEXT
+ EXTERNAL REG_TXEXT
+ EXTERNAL REG_CAP
+ EXTERNAL REG_QCH
+ EXTERNAL REG_SCALES
+
+* Local Constants:
+ INTEGER NFITS_TESTS ! How many FITS tests?
+ PARAMETER ( NFITS_TESTS = 3 )
+
+ INTEGER NCAT, NRAT, NLAT, NDAT, NIAT ! Numbers of Attributes of each type
+ PARAMETER ( NCAT = 4,
+ : NRAT = 2,
+ : NLAT = 2,
+ : NDAT = 1,
+ : NIAT = 5 )
+
+* Local Variables:
+ CHARACTER ATTRS( NFITS_TESTS )*255 ! Plot attributes for each FITS test
+ CHARACTER CARDS*(7*80) ! Used fot testing ast_putcards
+ INTEGER FC, FS, PLOT, I, J, OC
+
+ REAL GBOX( 4 ) ! Area of graphics coords to use
+ DOUBLE PRECISION BBOX( 4, NFITS_TESTS ) ! Base Frame area to be
+ ! mapped onto GBOX for each FITS test
+
+ CHARACTER*20 CAT(NCAT), RAT(NRAT), LAT(NLAT), DAT(NDAT), IAT(NIAT)
+ CHARACTER CV*50
+ REAL RV
+ LOGICAL LV
+ DOUBLE PRECISION DV
+ INTEGER IV, VERS, MAJ, MIN, REV
+
+* Data initialization:
+ DATA CAT / 'Colour(axis1)', 'Font(Stri)', 'Nout', 'Class' /
+ DATA RAT / 'Tol', 'Gap(1)' /
+ DATA LAT / 'Border', 'Invert' /
+ DATA DAT / 'TextLabGap' /
+ DATA IAT / 'Nin', 'Current', 'Base', 'Nobject', 'RefCOUNT' /
+ DATA GBOX /-100.0, -200.0, 150.0, 300.0/
+
+
+
+ DATA BBOX / 10.0, -10.0, 290.0, 300.0,
+ : -300.0, -300.0, 500.0, 500.0,
+ : 1.0, 1.0, 1787.0, 447.0 /
+
+
+
+ DATA ATTRS/ 'Grid=1,tickall=0',
+ : 'Grid=1,labelling=interior',
+ : 'Grid=0' /
+
+
+*.
+
+* Initialize inherited global status.
+ STATUS = SAI__OK
+
+* Use object caching to minimise allocation of new memory
+ OC = AST_TUNE( 'ObjectCaching', 1, STATUS )
+ IF( OC .NE. 0 ) THEN
+ WRITE(*,'(A,I2)') 'Default ObjectCaching VALUE is ',OC
+ END IF
+
+ IF( AST_TUNE( 'ObjectCaching', AST__TUNULL, STATUS ) .NE. 1 ) THEN
+ WRITE(*,'(A,I2)') 'Set ObjectCaching VALUE is ',OC
+ END IF
+
+* Display the AST version number.
+ VERS = AST_VERSION()
+ MAJ = VERS/1000000
+ VERS = VERS - 1000000*MAJ
+ MIN = VERS/1000
+ REV = VERS - 1000*MIN
+ WRITE(*,'(A,I2,A,I1,A,I2)') 'AST version ',MAJ,'.',MIN,'-',REV
+
+* First do a test of the AST_PUTCARDS routine.
+ FC = AST_FITSCHAN( AST_NULL, AST_NULL, ' ', STATUS )
+
+ CARDS = 'NAXIS = 1'
+ CARDS( 81: ) = 'NAXIS1 = 100'
+ CARDS( 2*80 + 1: ) = 'CTYPE1 = ''fred'''
+ CARDS( 3*80 + 1: ) = 'CDELT1 = 0.0'
+ CARDS( 4*80 + 1: ) = 'CRPIX1 = 50'
+ CARDS( 5*80 + 1: ) = 'CUNIT1 = ''GHz'''
+
+ CALL AST_PUTCARDS( FC, CARDS, STATUS )
+ WRITE(*,'(A,I2)') 'PutCards Ncards = ',AST_GETI( FC, 'NCARD',
+ : STATUS )
+ WRITE(*,'(A,I2)') 'PutCards Card = ',AST_GETI( FC, 'CARD',
+ : STATUS )
+
+ CALL AST_SETI( FC, 'CARD', 10, STATUS )
+ WRITE(*,'(A,I2)') 'PutCards Card = ',AST_GETI( FC, 'CARD',
+ : STATUS )
+
+ CALL AST_PUTCARDS( FC, CARDS, STATUS )
+ WRITE(*,'(A,I2)') 'PutCards Ncards = ',AST_GETI( FC, 'NCARD',
+ : STATUS )
+ WRITE(*,'(A,I2)') 'PutCards Card = ',AST_GETI( FC, 'CARD',
+ : STATUS )
+ CALL AST_SHOW( FC, STATUS )
+
+* We loop round testing several sorts of FITS Headers.
+ DO I = 1, NFITS_TESTS
+ IF ( STATUS .NE. SAI__OK ) GO TO 999
+
+* Tell the REG_SOURCE function which FITS header to load.
+ CMN_FTEST = I
+ CMN_LINE = 1
+
+ WRITE(*,'(A)') ' '
+ WRITE(*,'(A)') ' '
+ WRITE(*,'(A)') ' '
+ WRITE(*,'(A)') ' '
+ WRITE(*,'(A,I2)') ' FITS test number ',I
+ WRITE(*,'(A)') ' ===================='
+ WRITE(*,'(A)') ' '
+ WRITE(*,'(A)') ' '
+
+* Create a FitsChan, read an Object from it, and dump the Object
+* to standard output. The Object should be a FrameSet if all is OK.
+ FC = AST_FITSCHAN( REG_SOURCE, REG_SINK, ' ', STATUS )
+ FS = AST_READ( FC, STATUS )
+ WRITE(*,'(A)') ' '
+ WRITE(*,'(A)') 'AST_SHOW:'
+ CALL AST_SHOW( FS, STATUS )
+
+* Annul the FitsChan. This will cause the unused contents (if any) to
+* be written out using REG_SINK.
+ WRITE(*,'(A)') ' '
+ WRITE(*,'(A)') 'REG_SINK:'
+ CALL AST_ANNUL( FC, STATUS )
+
+* Create another FrameSet with Native encoding. Write the FrameSet to
+* it, and then annul the FitsChan (this will cause the FITS cards to be
+* written to stdout).
+ FC = AST_FITSCHAN( AST_NULL, REG_SINK, 'Encoding=native',
+ : STATUS )
+ WRITE(*,'(A)') ' '
+ WRITE(*,'(A,I2)') 'Objects written: ', AST_WRITE( FC, FS,
+ : STATUS )
+ WRITE(*,'(A)') ' '
+ WRITE(*,'(A)') 'Native Encoding:'
+ CALL AST_ANNUL( FC, STATUS )
+
+* Create a Plot which maps the area specified by BBOX the Base Frame
+* of the FrameSet onto the GBOX area in graphics coords.
+ PLOT = AST_PLOT( FS, GBOX, BBOX( 1, I), ' grf = 1 , '//
+ : 'title = A FITS test', STATUS )
+
+* Annul the FrameSet.
+ CALL AST_ANNUL( FS, STATUS )
+
+* Tell the Plot to use the REG_... routines included in this file to
+* do the drawing.
+ CALL AST_GRFSET( PLOT, 'Attr', REG_ATTR, STATUS )
+ CALL AST_GRFSET( PLOT, 'Flush', REG_FLUSH, STATUS )
+ CALL AST_GRFSET( PLOT, 'Line', REG_LINE, STATUS )
+ CALL AST_GRFSET( PLOT, 'Mark', REG_MARK, STATUS )
+ CALL AST_GRFSET( PLOT, 'Text', REG_TEXT, STATUS )
+ CALL AST_GRFSET( PLOT, 'TxExt', REG_TXEXT, STATUS )
+ CALL AST_GRFSET( PLOT, 'Scales', REG_SCALES, STATUS )
+ CALL AST_GRFSET( PLOT, 'Cap', REG_CAP, STATUS )
+ CALL AST_GRFSET( PLOT, 'Qch', REG_QCH, STATUS )
+
+* Set some attributes.
+ CALL AST_SET( PLOT, ATTRS( I ), STATUS )
+
+* Get some attributes (separate the AST_GET calls and the WRITEs in order
+* to avoid recursive I/O due to the REG_xxx routines trying to write to
+* standard output).
+ WRITE(*,'(A)') ' '
+ WRITE(*,'(A)') 'ATTRIBUTES:'
+
+ DO J = 1, NCAT
+ CV = AST_GETC( PLOT, CAT(J), STATUS )
+ WRITE(*,'(A,I10)') ' '//CAT(J)//': ',CHR_LEN(CV)
+ END DO
+
+ DO J = 1, NRAT
+ RV = AST_GETR( PLOT, RAT(J), STATUS )
+ WRITE(*,'(A,G13.6)') ' '//RAT(J)//': ',RV
+ END DO
+
+ DO J = 1, NLAT
+ LV = AST_GETL( PLOT, LAT(J), STATUS )
+ IF( LV ) THEN
+ IV = 1
+ ELSE
+ IV = 0
+ END IF
+ WRITE(*,'(A,I1)') ' '//LAT(J)//': ',IV
+ END DO
+
+ DO J = 1, NDAT
+ DV = AST_GETD( PLOT, DAT(J), STATUS )
+ WRITE(*,'(A,G13.6)') ' '//DAT(J)//': ',DV
+ END DO
+
+ DO J = 1, NIAT
+ IV = AST_GETI( PLOT, IAT(J), STATUS )
+ WRITE(*,'(A,I4)') ' '//IAT(J)//': ',IV
+ END DO
+
+
+* Draw a grid.
+ WRITE(*,'(A)') ' '
+ WRITE(*,'(A)') 'AST_GRID:'
+ CALL AST_GRID( PLOT, STATUS )
+
+* Annul the Plot.
+ CALL AST_ANNUL( PLOT, STATUS )
+
+ END DO
+
+ 999 CONTINUE
+
+ END
+
+
+
+
+
+* Grf plotting routines for the Plot tests. These are used in preference
+* to the grf routines specified at link time.
+* ======================================================================
+
+* Flush graphics.
+* ---------------
+ INTEGER FUNCTION REG_FLUSH()
+ WRITE(*,'(A)') 'REG_FLUSH:'
+ REG_FLUSH = 1
+ END
+
+* Set or get a Plot graphics attribute.
+* -------------------------------------
+ INTEGER FUNCTION REG_ATTR( ATT, VAL, OLDVAL, PRIM )
+ IMPLICIT NONE
+
+* Includes:
+ INCLUDE 'AST_PAR'
+ INCLUDE 'GRF_PAR'
+
+* Arguments:
+ INTEGER ATT
+ DOUBLE PRECISION VAL
+ INTEGER PRIM
+ DOUBLE PRECISION OLDVAL
+
+* Local Variables:
+ INTEGER I, J
+ DOUBLE PRECISION ATTRS( 5, 3 )
+
+* Initialization:
+ DATA ATTRS /15*0.0D0/
+
+* Log this call.
+ WRITE(*,'(I4,1X,G10.3,1X,I4)') 'REG_GATTR: ', ATT, VAL, PRIM
+
+* Identify the required element.
+ IF( ATT .EQ. GRF__STYLE ) THEN
+ I = 1
+ ELSE IF( ATT .EQ. GRF__WIDTH ) THEN
+ I = 2
+ ELSE IF( ATT .EQ. GRF__SIZE ) THEN
+ I = 3
+ ELSE IF( ATT .EQ. GRF__FONT ) THEN
+ I = 4
+ ELSE IF( ATT .EQ. GRF__COLOUR ) THEN
+ I = 5
+ ELSE
+ WRITE(*,'(A,I2)') 'Bad ATT value: ', ATT
+ END IF
+
+ IF( PRIM .EQ. GRF__LINE ) THEN
+ J = 1
+ ELSE IF( PRIM .EQ. GRF__MARK ) THEN
+ J = 2
+ ELSE IF( PRIM .EQ. GRF__TEXT ) THEN
+ J = 3
+ ELSE
+ WRITE(*,'(A,I2)') 'Bad PRIM value: ', PRIM
+ END IF
+
+* Return the old value.
+ OLDVAL = ATTRS( I, J )
+
+* Store the new value if not bad.
+ IF( VAL .NE. AST__BAD ) ATTRS( I, J ) = VAL
+
+* Initialize the returned value to indicate success.
+ REG_ATTR = 1
+
+ END
+
+
+* Draw a polyline.
+* ----------------
+ INTEGER FUNCTION REG_LINE( N, X, Y )
+ IMPLICIT NONE
+
+ INTEGER N
+ REAL X( N )
+ REAL Y( N )
+ INTEGER I
+
+ WRITE(*,'(A,I4)') 'REG_LINE: ',N
+ DO I = 1, N
+ WRITE(*,'(3X,G10.3,1X,G10.3)') X(I),Y(I)
+ END DO
+
+ REG_LINE = 1
+ END
+
+* Draw a set of markers.
+* ----------------------
+ INTEGER FUNCTION REG_MARK( N, X, Y, TYPE )
+ IMPLICIT NONE
+
+ INTEGER N, TYPE
+ REAL X( N )
+ REAL Y( N )
+ INTEGER I
+
+ WRITE(*,'(A,I4,I2)') 'REG_MARK: ', N, TYPE
+ DO I = 1, N
+ WRITE(*,'(3X,G10.3,1X,G10.3)') X(I),Y(I)
+ END DO
+
+ REG_MARK = 1
+ END
+
+* Draw a text string.
+* -------------------
+ INTEGER FUNCTION REG_TEXT( TEXT, X, Y, JUST, UPX, UPY )
+ IMPLICIT NONE
+
+ CHARACTER TEXT*(*), JUST*(*)
+ REAL X, Y, UPX, UPY
+
+ WRITE(*,'(A,A,A)') 'REG_TEXT: ''', TEXT,''''
+ WRITE(*,'(3X,G10.3,1X,G10.3,1X,A,1X,G10.3,1X,G10.3)')
+ : X, Y, JUST, UPX, UPY
+
+ REG_TEXT = 1
+ END
+
+* Return the extent of a text string.
+*
+* For some reason, the arguments to this function seem particularly
+* prone to random rounding errors, resulting in the regression test
+* always failing when run twice in succession, even if not changes
+* have been made to the code in plot.c. For this reason this function
+* does not write out its argument to standard output.
+* --------------------------------------------------------------------
+ INTEGER FUNCTION REG_TXEXT( TEXT, X, Y, JUST, UPX, UPY, XB, YB )
+ IMPLICIT NONE
+
+ CHARACTER TEXT*(*), JUST*(*)
+ REAL X, Y, UPX, UPY, XB(4), YB(4)
+
+c WRITE(*,*) 'REG_TXEXT: ''', TEXT,''''
+c WRITE(*,*) ' ', X, Y, ' ''', JUST,''' ', UPX, UPY
+
+ XB( 1 ) = X - LEN( TEXT )*0.5
+ XB( 2 ) = X + LEN( TEXT )*0.5
+ XB( 3 ) = XB( 2 )
+ XB( 4 ) = XB( 1 )
+
+ YB( 1 ) = Y - 0.5
+ YB( 2 ) = YB( 1 )
+ YB( 3 ) = Y + 0.5
+ YB( 4 ) = YB( 3 )
+
+ REG_TXEXT = 1
+ END
+
+* Inquire a capability
+* ---------------------
+ INTEGER FUNCTION REG_CAP( CAP, VALUE )
+ IMPLICIT NONE
+
+ INCLUDE 'GRF_PAR'
+
+ INTEGER CAP, VALUE
+
+ WRITE(*,'(A,I2)') 'REG_CAP: ', CAP
+
+ REG_CAP = 0
+ IF( CAP .EQ. GRF__SCALES ) REG_CAP = 1
+
+ END
+
+* Inquire axis scales
+* ---------------------
+ INTEGER FUNCTION REG_SCALES( ALPHA, BETA )
+ IMPLICIT NONE
+ REAL ALPHA, BETA
+
+ WRITE(*,'(A)') 'REG_SCALES: '
+
+ ALPHA = 1.0
+ BETA = 1.0
+
+ REG_SCALES = 1
+
+ END
+
+* Inquire character size
+* ----------------------
+ INTEGER FUNCTION REG_QCH( CHV, CHH )
+ IMPLICIT NONE
+ REAL CHV, CHH
+
+ WRITE(*,'(A)') 'REG_QCH: '
+
+ CHV = 0.01
+ CHH = 0.01
+
+ REG_QCH = 1
+
+ END
+
+
+
+* A Sink funtion for use with the FitsChan class. It writes the FitsChan
+* contents to standard output.
+* ======================================================================
+ SUBROUTINE REG_SINK( CARD, STATUS )
+ IMPLICIT NONE
+ CHARACTER CARD*80
+ INTEGER STATUS
+ WRITE(*,'(A)') CARD
+ END
+
+
+
+* A Source funtion for use with the FitsChan class. It returns a different
+* header for each value of REG_FTEST.
+* ======================================================================
+ INTEGER FUNCTION REG_SOURCE( CARD, STATUS )
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+
+ INTEGER CMN_FTEST ! Which FITS test are we doing?
+ INTEGER CMN_LINE ! The index of the next header to read
+ COMMON /REG/ CMN_FTEST, CMN_LINE
+
+ CHARACTER CARD*80
+ INTEGER STATUS
+
+* Check the inherited status
+ REG_SOURCE = 0
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+* Assume more cards will be returned.
+ REG_SOURCE = 1
+
+* The following code defines the FITS headers and is generated automatically
+* from FITS header files using script make_regtest (in the AST development
+* system)....
+
+
+* FITS headers from cobe.head (Tue Jan 29 13:37:07 2002)
+ IF( CMN_FTEST .EQ. 1 ) THEN
+ IF( CMN_LINE .EQ. 1 ) THEN
+ CARD = 'SIMPLE = T / Written by I'//
+ : 'DL: 30-Jul-1997 05:35:42.00'
+ ELSE IF( CMN_LINE .EQ. 2 ) THEN
+ CARD = 'BITPIX = -32 / Bits per pix'//
+ : 'el.'
+ ELSE IF( CMN_LINE .EQ. 3 ) THEN
+ CARD = 'NAXIS = 2 / Number of di'//
+ : 'mensions'
+ ELSE IF( CMN_LINE .EQ. 4 ) THEN
+ CARD = 'NAXIS1 = 300 / Length of x '//
+ : 'axis.'
+ ELSE IF( CMN_LINE .EQ. 5 ) THEN
+ CARD = 'NAXIS2 = 300 / Length of y '//
+ : 'axis.'
+ ELSE IF( CMN_LINE .EQ. 6 ) THEN
+ CARD = 'CTYPE1 = ''GLON-ZEA'' / X-axis typ'//
+ : 'e'
+ ELSE IF( CMN_LINE .EQ. 7 ) THEN
+ CARD = 'CTYPE2 = ''GLAT-ZEA'' / Y-axis typ'//
+ : 'e'
+ ELSE IF( CMN_LINE .EQ. 8 ) THEN
+ CARD = 'CRVAL1 = -149.56866 / Reference pi'//
+ : 'xel value'
+ ELSE IF( CMN_LINE .EQ. 9 ) THEN
+ CARD = 'CRVAL2 = -19.758201 / Reference pi'//
+ : 'xel value'
+ ELSE IF( CMN_LINE .EQ. 10 ) THEN
+ CARD = 'CRPIX1 = 150.500 / Reference pi'//
+ : 'xel'
+ ELSE IF( CMN_LINE .EQ. 11 ) THEN
+ CARD = 'CRPIX2 = 150.500 / Reference pi'//
+ : 'xel'
+ ELSE IF( CMN_LINE .EQ. 12 ) THEN
+ CARD = 'CDELT1 = -1.20000 / Degrees/pixe'//
+ : 'l'
+ ELSE IF( CMN_LINE .EQ. 13 ) THEN
+ CARD = 'CDELT2 = 1.20000 / Degrees/pixe'//
+ : 'l'
+ ELSE IF( CMN_LINE .EQ. 14 ) THEN
+ CARD = 'CROTA1 = 0.00000 / Rotation in '//
+ : 'degrees.'
+ ELSE IF( CMN_LINE .EQ. 15 ) THEN
+ CARD = 'COMMENT'
+ ELSE IF( CMN_LINE .EQ. 16 ) THEN
+ CARD = 'COMMENT This file was produced by the SkyView'//
+ : ' survey analysis system from'
+ ELSE IF( CMN_LINE .EQ. 17 ) THEN
+ CARD = 'COMMENT available astronomical surveys. The '//
+ : 'data are formatted'
+ ELSE IF( CMN_LINE .EQ. 18 ) THEN
+ CARD = 'COMMENT as a simple two-dimensional FITS imag'//
+ : 'e with the same units as'
+ ELSE IF( CMN_LINE .EQ. 19 ) THEN
+ CARD = 'COMMENT the orginal survey. A single ASCII t'//
+ : 'able extension may be present'
+ ELSE IF( CMN_LINE .EQ. 20 ) THEN
+ CARD = 'COMMENT which describes catalog objects found'//
+ : ' within the field of view.'
+ ELSE IF( CMN_LINE .EQ. 21 ) THEN
+ CARD = 'COMMENT Copies of relevant copyright notices '//
+ : 'are included in this file.'
+ ELSE IF( CMN_LINE .EQ. 22 ) THEN
+ CARD = 'COMMENT'
+ ELSE IF( CMN_LINE .EQ. 23 ) THEN
+ CARD = 'COMMENT Questions should be directed to:'
+ ELSE IF( CMN_LINE .EQ. 24 ) THEN
+ CARD = 'COMMENT'
+ ELSE IF( CMN_LINE .EQ. 25 ) THEN
+ CARD = 'COMMENT scollick@skyview.gsfc.nasa.gov'
+ ELSE IF( CMN_LINE .EQ. 26 ) THEN
+ CARD = 'COMMENT or'
+ ELSE IF( CMN_LINE .EQ. 27 ) THEN
+ CARD = 'COMMENT mcglynn@grossc.gsfc.nasa.gov'
+ ELSE IF( CMN_LINE .EQ. 28 ) THEN
+ CARD = 'COMMENT'
+ ELSE IF( CMN_LINE .EQ. 29 ) THEN
+ CARD = 'COMMENT SkyView'
+ ELSE IF( CMN_LINE .EQ. 30 ) THEN
+ CARD = 'COMMENT Code 668.1'
+ ELSE IF( CMN_LINE .EQ. 31 ) THEN
+ CARD = 'COMMENT Goddard Space Flight Center, Gree'//
+ : 'nbelt, MD 20771'
+ ELSE IF( CMN_LINE .EQ. 32 ) THEN
+ CARD = 'COMMENT 301-286-7780'
+ ELSE IF( CMN_LINE .EQ. 33 ) THEN
+ CARD = 'COMMENT'
+ ELSE IF( CMN_LINE .EQ. 34 ) THEN
+ CARD = 'COMMENT SkyView is supported by NASA ADP gran'//
+ : 't NAS 5-32068.'
+ ELSE IF( CMN_LINE .EQ. 35 ) THEN
+ CARD = 'COMMENT'
+ ELSE IF( CMN_LINE .EQ. 36 ) THEN
+ CARD = 'SURVEY = ''COBE DIRBE'''
+ ELSE IF( CMN_LINE .EQ. 37 ) THEN
+ CARD = 'BUNITS = ''MJy/sr '' /'
+ ELSE IF( CMN_LINE .EQ. 38 ) THEN
+ CARD = 'ORIGIN = ''CDAC '' / Cosmology '//
+ : 'Data Analysis Center'
+ ELSE IF( CMN_LINE .EQ. 39 ) THEN
+ CARD = 'TELESCOP= ''COBE '' / COsmic Bac'//
+ : 'kground Explorer satellite'
+ ELSE IF( CMN_LINE .EQ. 40 ) THEN
+ CARD = 'INSTRUME= ''DIRBE '' / COBE instr'//
+ : 'ument [DIRBE, DMR, FIRAS]'
+ ELSE IF( CMN_LINE .EQ. 41 ) THEN
+ CARD = 'PIXRESOL= 9 / Quad tree pi'//
+ : 'xel resolution [6, 9]'
+ ELSE IF( CMN_LINE .EQ. 42 ) THEN
+ CARD = 'DATE = ''27/09/94'' / FITS file '//
+ : 'creation date (dd/mm/yy)'
+ ELSE IF( CMN_LINE .EQ. 43 ) THEN
+ CARD = 'DATE-MAP= ''16/09/94'' / Date of or'//
+ : 'iginal file creation (dd/mm/yy)'
+ ELSE IF( CMN_LINE .EQ. 44 ) THEN
+ CARD = 'COMMENT COBE specific keywords'
+ ELSE IF( CMN_LINE .EQ. 45 ) THEN
+ CARD = 'DATE-BEG= ''08/12/89'' / date of in'//
+ : 'itial data represented (dd/mm/yy)'
+ ELSE IF( CMN_LINE .EQ. 46 ) THEN
+ CARD = 'DATE-END= ''25/09/90'' / date of fi'//
+ : 'nal data represented (dd/mm/yy)'
+ ELSE IF( CMN_LINE .EQ. 47 ) THEN
+ CARD = 'COMMENT'
+ ELSE IF( CMN_LINE .EQ. 48 ) THEN
+ CARD = 'COMMENT THE COBE DIRBE map is a combination o'//
+ : 'f the original ten'
+ ELSE IF( CMN_LINE .EQ. 49 ) THEN
+ CARD = 'COMMENT band passes with the following wavele'//
+ : 'ngths:'
+ ELSE IF( CMN_LINE .EQ. 50 ) THEN
+ CARD = 'COMMENT Band 1 - 1.25 microns'
+ ELSE IF( CMN_LINE .EQ. 51 ) THEN
+ CARD = 'COMMENT Band 2 - 2.2 microns'
+ ELSE IF( CMN_LINE .EQ. 52 ) THEN
+ CARD = 'COMMENT Band 3 - 3.5 microns'
+ ELSE IF( CMN_LINE .EQ. 53 ) THEN
+ CARD = 'COMMENT Band 4 - 4.9 microns'
+ ELSE IF( CMN_LINE .EQ. 54 ) THEN
+ CARD = 'COMMENT Band 5 - 12 microns'
+ ELSE IF( CMN_LINE .EQ. 55 ) THEN
+ CARD = 'COMMENT Band 6 - 25 microns'
+ ELSE IF( CMN_LINE .EQ. 56 ) THEN
+ CARD = 'COMMENT Band 7 - 60 microns'
+ ELSE IF( CMN_LINE .EQ. 57 ) THEN
+ CARD = 'COMMENT Band 8 - 100 microns'
+ ELSE IF( CMN_LINE .EQ. 58 ) THEN
+ CARD = 'COMMENT Band 9 - 140 microns'
+ ELSE IF( CMN_LINE .EQ. 59 ) THEN
+ CARD = 'COMMENT Band 10 - 240 microns'
+ ELSE IF( CMN_LINE .EQ. 60 ) THEN
+ CARD = 'COMMENT'
+ ELSE IF( CMN_LINE .EQ. 61 ) THEN
+ CARD = 'END'
+ REG_SOURCE = 0
+ ELSE
+ REG_SOURCE = 0
+ END IF
+
+* FITS headers from polco.head (Tue Jan 29 15:06:35 2002)
+ ELSE IF( CMN_FTEST .EQ. 2 ) THEN
+ IF( CMN_LINE .EQ. 1 ) THEN
+ CARD = 'COMMENT AST +++++++++++++++++++++++++++++++++'//
+ : '+++++++++++++++++++++++++++++++'
+ ELSE IF( CMN_LINE .EQ. 2 ) THEN
+ CARD = 'AST'
+ ELSE IF( CMN_LINE .EQ. 3 ) THEN
+ CARD = 'COMMENT AST Beginning of AST data '//
+ : 'for FrameSet object'
+ ELSE IF( CMN_LINE .EQ. 4 ) THEN
+ CARD = 'AST'
+ ELSE IF( CMN_LINE .EQ. 5 ) THEN
+ CARD = 'COMMENT AST .................................'//
+ : '...............................'
+ ELSE IF( CMN_LINE .EQ. 6 ) THEN
+ CARD = 'AST'
+ ELSE IF( CMN_LINE .EQ. 7 ) THEN
+ CARD = 'BEGAST_A= ''FrameSet'' / Set of int'//
+ : 'er-related coordinate systems'
+ ELSE IF( CMN_LINE .EQ. 8 ) THEN
+ CARD = 'NFRAME_A= 2 / Number of Fr'//
+ : 'ames in FrameSet'
+ ELSE IF( CMN_LINE .EQ. 9 ) THEN
+ CARD = 'CURRNT_A= 2 / Index of cur'//
+ : 'rent Frame'
+ ELSE IF( CMN_LINE .EQ. 10 ) THEN
+ CARD = 'NOD1_A = 2 / Frame 1 is a'//
+ : 'ssociated with node 2'
+ ELSE IF( CMN_LINE .EQ. 11 ) THEN
+ CARD = 'NOD2_A = 1 / Frame 2 is a'//
+ : 'ssociated with node 1'
+ ELSE IF( CMN_LINE .EQ. 12 ) THEN
+ CARD = 'LNK2_A = 1 / Node 2 is de'//
+ : 'rived from node 1'
+ ELSE IF( CMN_LINE .EQ. 13 ) THEN
+ CARD = 'FRM1_A = '' '' / Frame numb'//
+ : 'er 1'
+ ELSE IF( CMN_LINE .EQ. 14 ) THEN
+ CARD = 'BEGAST_B= ''Frame '' / Coordinate'//
+ : ' system description'
+ ELSE IF( CMN_LINE .EQ. 15 ) THEN
+ CARD = 'TITLE_A = ''Data grid indices; first pixel at'//
+ : ' (1&''/ Title of coordinate system'
+ ELSE IF( CMN_LINE .EQ. 16 ) THEN
+ CARD = 'CONTINUE '',1) '''
+ ELSE IF( CMN_LINE .EQ. 17 ) THEN
+ CARD = 'NAXES_A = 2 / Number of co'//
+ : 'ordinate axes'
+ ELSE IF( CMN_LINE .EQ. 18 ) THEN
+ CARD = 'DOMAIN_A= ''GRID '' / Coordinate'//
+ : ' system domain'
+ ELSE IF( CMN_LINE .EQ. 19 ) THEN
+ CARD = 'AX1_A = '' '' / Axis numbe'//
+ : 'r 1'
+ ELSE IF( CMN_LINE .EQ. 20 ) THEN
+ CARD = 'BEGAST_C= ''Axis '' / Coordinate'//
+ : ' axis'
+ ELSE IF( CMN_LINE .EQ. 21 ) THEN
+ CARD = 'LABEL_A = ''Data grid index 1'' / Axis Label'
+ ELSE IF( CMN_LINE .EQ. 22 ) THEN
+ CARD = 'SYMBOL_A= ''g1 '' / Axis symbo'//
+ : 'l'
+ ELSE IF( CMN_LINE .EQ. 23 ) THEN
+ CARD = 'UNIT_A = ''pixel '' / Axis units'
+ ELSE IF( CMN_LINE .EQ. 24 ) THEN
+ CARD = 'FORMAT_A= ''%3.1f '' / Format spe'//
+ : 'cifier'
+ ELSE IF( CMN_LINE .EQ. 25 ) THEN
+ CARD = 'ENDAST_A= ''Axis '' / End of obj'//
+ : 'ect definition'
+ ELSE IF( CMN_LINE .EQ. 26 ) THEN
+ CARD = 'AX2_A = '' '' / Axis numbe'//
+ : 'r 2'
+ ELSE IF( CMN_LINE .EQ. 27 ) THEN
+ CARD = 'BEGAST_D= ''Axis '' / Coordinate'//
+ : ' axis'
+ ELSE IF( CMN_LINE .EQ. 28 ) THEN
+ CARD = 'LABEL_B = ''Data grid index 2'' / Axis Label'
+ ELSE IF( CMN_LINE .EQ. 29 ) THEN
+ CARD = 'SYMBOL_B= ''g2 '' / Axis symbo'//
+ : 'l'
+ ELSE IF( CMN_LINE .EQ. 30 ) THEN
+ CARD = 'UNIT_B = ''pixel '' / Axis units'
+ ELSE IF( CMN_LINE .EQ. 31 ) THEN
+ CARD = 'FORMAT_B= ''%3.1f '' / Format spe'//
+ : 'cifier'
+ ELSE IF( CMN_LINE .EQ. 32 ) THEN
+ CARD = 'ENDAST_B= ''Axis '' / End of obj'//
+ : 'ect definition'
+ ELSE IF( CMN_LINE .EQ. 33 ) THEN
+ CARD = 'ENDAST_C= ''Frame '' / End of obj'//
+ : 'ect definition'
+ ELSE IF( CMN_LINE .EQ. 34 ) THEN
+ CARD = 'FRM2_A = '' '' / Frame numb'//
+ : 'er 2'
+ ELSE IF( CMN_LINE .EQ. 35 ) THEN
+ CARD = 'BEGAST_E= ''Frame '' / Coordinate'//
+ : ' system description'
+ ELSE IF( CMN_LINE .EQ. 36 ) THEN
+ CARD = 'TITLE_B = ''Pixel coordinates; first pixel at'//
+ : ' (-&''/ Title of coordinate system'
+ ELSE IF( CMN_LINE .EQ. 37 ) THEN
+ CARD = 'CONTINUE ''100.5,-200.5)'''
+ ELSE IF( CMN_LINE .EQ. 38 ) THEN
+ CARD = 'NAXES_B = 2 / Number of co'//
+ : 'ordinate axes'
+ ELSE IF( CMN_LINE .EQ. 39 ) THEN
+ CARD = 'DOMAIN_B= ''POLAR '' / Coordinate'//
+ : ' system domain'
+ ELSE IF( CMN_LINE .EQ. 40 ) THEN
+ CARD = 'AX1_B = '' '' / Axis numbe'//
+ : 'r 1'
+ ELSE IF( CMN_LINE .EQ. 41 ) THEN
+ CARD = 'BEGAST_F= ''Axis '' / Coordinate'//
+ : ' axis'
+ ELSE IF( CMN_LINE .EQ. 42 ) THEN
+ CARD = 'LABEL_C = ''Pixel coordinate 1'' / Axis Label'
+ ELSE IF( CMN_LINE .EQ. 43 ) THEN
+ CARD = 'SYMBOL_C= ''p1 '' / Axis symbo'//
+ : 'l'
+ ELSE IF( CMN_LINE .EQ. 44 ) THEN
+ CARD = 'UNIT_C = ''pixel '' / Axis units'
+ ELSE IF( CMN_LINE .EQ. 45 ) THEN
+ CARD = 'FORMAT_C= ''%3.1f '' / Format spe'//
+ : 'cifier'
+ ELSE IF( CMN_LINE .EQ. 46 ) THEN
+ CARD = 'ENDAST_D= ''Axis '' / End of obj'//
+ : 'ect definition'
+ ELSE IF( CMN_LINE .EQ. 47 ) THEN
+ CARD = 'AX2_B = '' '' / Axis numbe'//
+ : 'r 2'
+ ELSE IF( CMN_LINE .EQ. 48 ) THEN
+ CARD = 'BEGAST_G= ''Axis '' / Coordinate'//
+ : ' axis'
+ ELSE IF( CMN_LINE .EQ. 49 ) THEN
+ CARD = 'LABEL_D = ''Pixel coordinate 2'' / Axis Label'
+ ELSE IF( CMN_LINE .EQ. 50 ) THEN
+ CARD = 'SYMBOL_D= ''p2 '' / Axis symbo'//
+ : 'l'
+ ELSE IF( CMN_LINE .EQ. 51 ) THEN
+ CARD = 'UNIT_D = ''pixel '' / Axis units'
+ ELSE IF( CMN_LINE .EQ. 52 ) THEN
+ CARD = 'FORMAT_D= ''%3.1f '' / Format spe'//
+ : 'cifier'
+ ELSE IF( CMN_LINE .EQ. 53 ) THEN
+ CARD = 'ENDAST_E= ''Axis '' / End of obj'//
+ : 'ect definition'
+ ELSE IF( CMN_LINE .EQ. 54 ) THEN
+ CARD = 'ENDAST_F= ''Frame '' / End of obj'//
+ : 'ect definition'
+ ELSE IF( CMN_LINE .EQ. 55 ) THEN
+ CARD = 'MAP2_A = '' '' / Mapping be'//
+ : 'tween nodes 1 and 2'
+ ELSE IF( CMN_LINE .EQ. 56 ) THEN
+ CARD = 'BEGAST_H= ''CmpMap '' / Compound M'//
+ : 'apping'
+ ELSE IF( CMN_LINE .EQ. 57 ) THEN
+ CARD = 'NIN_A = 2 / Number of in'//
+ : 'put coordinates'
+ ELSE IF( CMN_LINE .EQ. 58 ) THEN
+ CARD = 'ISA_A = ''Mapping '' / Mapping be'//
+ : 'tween coordinate systems'
+ ELSE IF( CMN_LINE .EQ. 59 ) THEN
+ CARD = 'INVA_A = 1 / First Mappin'//
+ : 'g used in inverse direction'
+ ELSE IF( CMN_LINE .EQ. 60 ) THEN
+ CARD = 'INVB_A = 1 / Second Mappi'//
+ : 'ng used in inverse direction'
+ ELSE IF( CMN_LINE .EQ. 61 ) THEN
+ CARD = 'MAPA_A = '' '' / First comp'//
+ : 'onent Mapping'
+ ELSE IF( CMN_LINE .EQ. 62 ) THEN
+ CARD = 'BEGAST_I= ''MathMap '' / Transforma'//
+ : 'tion using mathematical functions'
+ ELSE IF( CMN_LINE .EQ. 63 ) THEN
+ CARD = 'NIN_B = 2 / Number of in'//
+ : 'put coordinates'
+ ELSE IF( CMN_LINE .EQ. 64 ) THEN
+ CARD = 'INVERT_A= 0 / Mapping not '//
+ : 'inverted'
+ ELSE IF( CMN_LINE .EQ. 65 ) THEN
+ CARD = 'ISA_B = ''Mapping '' / Mapping be'//
+ : 'tween coordinate systems'
+ ELSE IF( CMN_LINE .EQ. 66 ) THEN
+ CARD = 'FWD1_A = ''r=sqrt(x*x+y*y)'' / Forward fu'//
+ : 'nction 1'
+ ELSE IF( CMN_LINE .EQ. 67 ) THEN
+ CARD = 'FWD2_A = ''theta=atan2(y,x)'' / Forward fu'//
+ : 'nction 2'
+ ELSE IF( CMN_LINE .EQ. 68 ) THEN
+ CARD = 'INV1_A = ''x=r*cos(theta)'' / Inverse fu'//
+ : 'nction 1'
+ ELSE IF( CMN_LINE .EQ. 69 ) THEN
+ CARD = 'INV2_A = ''y=r*sin(theta)'' / Inverse fu'//
+ : 'nction 2'
+ ELSE IF( CMN_LINE .EQ. 70 ) THEN
+ CARD = 'SIMPFI_A= 1 / Forward-inve'//
+ : 'rse pairs may simplify'
+ ELSE IF( CMN_LINE .EQ. 71 ) THEN
+ CARD = 'SIMPIF_A= 1 / Inverse-forw'//
+ : 'ard pairs may simplify'
+ ELSE IF( CMN_LINE .EQ. 72 ) THEN
+ CARD = 'ENDAST_G= ''MathMap '' / End of obj'//
+ : 'ect definition'
+ ELSE IF( CMN_LINE .EQ. 73 ) THEN
+ CARD = 'MAPB_A = '' '' / Second com'//
+ : 'ponent Mapping'
+ ELSE IF( CMN_LINE .EQ. 74 ) THEN
+ CARD = 'BEGAST_J= ''WinMap '' / Map one wi'//
+ : 'ndow on to another'
+ ELSE IF( CMN_LINE .EQ. 75 ) THEN
+ CARD = 'NIN_C = 2 / Number of in'//
+ : 'put coordinates'
+ ELSE IF( CMN_LINE .EQ. 76 ) THEN
+ CARD = 'INVERT_B= 0 / Mapping not '//
+ : 'inverted'
+ ELSE IF( CMN_LINE .EQ. 77 ) THEN
+ CARD = 'ISA_C = ''Mapping '' / Mapping be'//
+ : 'tween coordinate systems'
+ ELSE IF( CMN_LINE .EQ. 78 ) THEN
+ CARD = 'SFT1_A = -101.5 / Shift for ax'//
+ : 'is 1'
+ ELSE IF( CMN_LINE .EQ. 79 ) THEN
+ CARD = 'SFT2_A = -201.5 / Shift for ax'//
+ : 'is 2'
+ ELSE IF( CMN_LINE .EQ. 80 ) THEN
+ CARD = 'ENDAST_H= ''WinMap '' / End of obj'//
+ : 'ect definition'
+ ELSE IF( CMN_LINE .EQ. 81 ) THEN
+ CARD = 'ENDAST_I= ''CmpMap '' / End of obj'//
+ : 'ect definition'
+ ELSE IF( CMN_LINE .EQ. 82 ) THEN
+ CARD = 'ENDAST_J= ''FrameSet'' / End of obj'//
+ : 'ect definition'
+ ELSE IF( CMN_LINE .EQ. 83 ) THEN
+ CARD = 'COMMENT AST .................................'//
+ : '...............................'
+ ELSE IF( CMN_LINE .EQ. 84 ) THEN
+ CARD = 'AST'
+ ELSE IF( CMN_LINE .EQ. 85 ) THEN
+ CARD = 'COMMENT AST End of AST data for'//
+ : ' FrameSet object'
+ ELSE IF( CMN_LINE .EQ. 86 ) THEN
+ CARD = 'AST'
+ ELSE IF( CMN_LINE .EQ. 87 ) THEN
+ CARD = 'COMMENT AST ---------------------------------'//
+ : '-------------------------------'
+ ELSE IF( CMN_LINE .EQ. 88 ) THEN
+ CARD = 'AST'
+ REG_SOURCE = 0
+ ELSE
+ REG_SOURCE = 0
+ END IF
+
+
+* FITS headers from scp.head (Tue Jan 29 15:17:50 2002)
+ ELSE IF( CMN_FTEST .EQ. 3 ) THEN
+ IF( CMN_LINE .EQ. 1 ) THEN
+ CARD = 'SIMPLE = T / file does co'//
+ : 'nform to FITS standard'
+ ELSE IF( CMN_LINE .EQ. 2 ) THEN
+ CARD = 'BITPIX = 16 / number of bi'//
+ : 'ts per data pixel'
+ ELSE IF( CMN_LINE .EQ. 3 ) THEN
+ CARD = 'NAXIS = 2 / number of da'//
+ : 'ta axes'
+ ELSE IF( CMN_LINE .EQ. 4 ) THEN
+ CARD = 'NAXIS1 = 1787 / length of da'//
+ : 'ta axis 1'
+ ELSE IF( CMN_LINE .EQ. 5 ) THEN
+ CARD = 'NAXIS2 = 447 / length of da'//
+ : 'ta axis 2'
+ ELSE IF( CMN_LINE .EQ. 6 ) THEN
+ CARD = 'EXTEND = T / FITS dataset'//
+ : ' may contain extensions'
+ ELSE IF( CMN_LINE .EQ. 7 ) THEN
+ CARD = 'COMMENT FITS (Flexible Image Transport Syst'//
+ : 'em) format defined in Astronomy and'
+ ELSE IF( CMN_LINE .EQ. 8 ) THEN
+ CARD = 'COMMENT Astrophysics Supplement Series v44/'//
+ : 'p363, v44/p371, v73/p359, v73/p365.'
+ ELSE IF( CMN_LINE .EQ. 9 ) THEN
+ CARD = 'COMMENT Contact the NASA Science Office of '//
+ : 'Standards and Technology for the'
+ ELSE IF( CMN_LINE .EQ. 10 ) THEN
+ CARD = 'COMMENT FITS Definition document #100 and o'//
+ : 'ther FITS information.'
+ ELSE IF( CMN_LINE .EQ. 11 ) THEN
+ CARD = 'PLATENUM= ''3665 '' / Plate numb'//
+ : 'er'
+ ELSE IF( CMN_LINE .EQ. 12 ) THEN
+ CARD = 'EMULSION= ''IIIaJ '' / Kodak emul'//
+ : 'sion type'
+ ELSE IF( CMN_LINE .EQ. 13 ) THEN
+ CARD = 'FILTER = ''GG395 '' / Schott gla'//
+ : 'ss filter type'
+ ELSE IF( CMN_LINE .EQ. 14 ) THEN
+ CARD = 'PLTSCALE= ''67.14 '' / [arcsec/mm'//
+ : '] plate scale'
+ ELSE IF( CMN_LINE .EQ. 15 ) THEN
+ CARD = 'FIELDNUM= ''1 '' / Sky survey'//
+ : ' field number'
+ ELSE IF( CMN_LINE .EQ. 16 ) THEN
+ CARD = 'EPOCH = 1.977780E+03 / Epoch of obs'//
+ : 'ervation'
+ ELSE IF( CMN_LINE .EQ. 17 ) THEN
+ CARD = 'DATE-OBS= ''1977-10-11'' / [yyyy-mm-d'//
+ : 'd] UT date of observation'
+ ELSE IF( CMN_LINE .EQ. 18 ) THEN
+ CARD = 'TELESCOP= ''UKST '' / Telescope '//
+ : 'on which the plate was taken'
+ ELSE IF( CMN_LINE .EQ. 19 ) THEN
+ CARD = 'TELETYPE= ''SCHM '' / Type of te'//
+ : 'lescope'
+ ELSE IF( CMN_LINE .EQ. 20 ) THEN
+ CARD = 'SITELAT = -5.458410576565E-01 / [radians] la'//
+ : 'titude of telescope'
+ ELSE IF( CMN_LINE .EQ. 21 ) THEN
+ CARD = 'SITELONG= 2.601766194458E+00 / [radians] lo'//
+ : 'ngitude of telescope'
+ ELSE IF( CMN_LINE .EQ. 22 ) THEN
+ CARD = 'LST = ''00:20 '' / [hh:mm] lo'//
+ : 'cal sidereal time at start of obs'
+ ELSE IF( CMN_LINE .EQ. 23 ) THEN
+ CARD = 'MJD-OBS = 4.342657300880E+04 / Modified Jul'//
+ : 'ian Date of observation'
+ ELSE IF( CMN_LINE .EQ. 24 ) THEN
+ CARD = 'INSTRUME= ''SuperCOSMOS I'' / Measuring '//
+ : 'machine'
+ ELSE IF( CMN_LINE .EQ. 25 ) THEN
+ CARD = 'DATE-MES= ''2000-11-04'' / [yyyy-mm-d'//
+ : 'd] Date of this plate measurement'
+ ELSE IF( CMN_LINE .EQ. 26 ) THEN
+ CARD = 'RADECSYS= ''FK5 '' / Reference '//
+ : 'frame for RA/DEC in original file'
+ ELSE IF( CMN_LINE .EQ. 27 ) THEN
+ CARD = 'NHKLINES= 146 / Number of li'//
+ : 'nes from house-keeping file'
+ ELSE IF( CMN_LINE .EQ. 28 ) THEN
+ CARD = 'HKLIN001= ''JOB.JOBNO UKJ001'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 29 ) THEN
+ CARD = 'HKLIN002= ''JOB.DATE-MES 2000:11:'//
+ : '04'' /'
+ ELSE IF( CMN_LINE .EQ. 30 ) THEN
+ CARD = 'HKLIN003= ''JOB.TIME 12:51:09'//
+ : ''' /'
+ ELSE IF( CMN_LINE .EQ. 31 ) THEN
+ CARD = 'HKLIN004= ''JOB.INSTRUME SuperCOS'//
+ : 'MOS I'' /'
+ ELSE IF( CMN_LINE .EQ. 32 ) THEN
+ CARD = 'HKLIN005= ''JOB.ORIGIN Royal Ob'//
+ : 'servatory Edinburgh'' /'
+ ELSE IF( CMN_LINE .EQ. 33 ) THEN
+ CARD = 'HKLIN006= ''JOB.SOFTWARE /home/sc'//
+ : 'osdev/v033'' /'
+ ELSE IF( CMN_LINE .EQ. 34 ) THEN
+ CARD = 'HKLIN007= ''JOB.OPERATOR ebt'' /'
+ ELSE IF( CMN_LINE .EQ. 35 ) THEN
+ CARD = 'HKLIN008= ''JOB.USER htm'' /'
+ ELSE IF( CMN_LINE .EQ. 36 ) THEN
+ CARD = 'HKLIN009= ''JOB.USERREF NONE'' /'
+ ELSE IF( CMN_LINE .EQ. 37 ) THEN
+ CARD = 'HKLIN010= ''JOB.UORIGIN ROE'' /'
+ ELSE IF( CMN_LINE .EQ. 38 ) THEN
+ CARD = 'HKLIN011= ''JOB.UCOUNTRY uk'' /'
+ ELSE IF( CMN_LINE .EQ. 39 ) THEN
+ CARD = 'HKLIN012= ''JOB.COMMENT Digital '//
+ : 'catalogue of the Sky'' /'
+ ELSE IF( CMN_LINE .EQ. 40 ) THEN
+ CARD = 'HKLIN013= ''JOB.IAM_FILE iam.srt''//
+ : '' /'
+ ELSE IF( CMN_LINE .EQ. 41 ) THEN
+ CARD = 'HKLIN014= ''PLATE.TELESCOP UKST'' /'
+ ELSE IF( CMN_LINE .EQ. 42 ) THEN
+ CARD = 'HKLIN015= ''PLATE.TELTYPE SCHM'' /'
+ ELSE IF( CMN_LINE .EQ. 43 ) THEN
+ CARD = 'HKLIN016= ''PLATE.PLATE 3665'' /'
+ ELSE IF( CMN_LINE .EQ. 44 ) THEN
+ CARD = 'HKLIN017= ''PLATE.MATERIAL 3mm glas'//
+ : 's'' /'
+ ELSE IF( CMN_LINE .EQ. 45 ) THEN
+ CARD = 'HKLIN018= ''PLATE.EMULSION IIIaJ'' '//
+ : '/'
+ ELSE IF( CMN_LINE .EQ. 46 ) THEN
+ CARD = 'HKLIN019= ''PLATE.FILTER GG395'' '//
+ : '/'
+ ELSE IF( CMN_LINE .EQ. 47 ) THEN
+ CARD = 'HKLIN020= ''PLATE.PSCALE 67.14'' '//
+ : '/'
+ ELSE IF( CMN_LINE .EQ. 48 ) THEN
+ CARD = 'HKLIN021= ''PLATE.FIELD 1'' /'
+ ELSE IF( CMN_LINE .EQ. 49 ) THEN
+ CARD = 'HKLIN022= ''PLATE.RA_PNT 0'' /'
+ ELSE IF( CMN_LINE .EQ. 50 ) THEN
+ CARD = 'HKLIN023= ''PLATE.DEC_PNT -90'' /'
+ ELSE IF( CMN_LINE .EQ. 51 ) THEN
+ CARD = 'HKLIN024= ''PLATE.RADECSYS FK4'' /'
+ ELSE IF( CMN_LINE .EQ. 52 ) THEN
+ CARD = 'HKLIN025= ''PLATE.EQUINOX 1950'' /'
+ ELSE IF( CMN_LINE .EQ. 53 ) THEN
+ CARD = 'HKLIN026= ''PLATE.TIMESYS BESSELIA'//
+ : 'N'' /'
+ ELSE IF( CMN_LINE .EQ. 54 ) THEN
+ CARD = 'HKLIN027= ''PLATE.EPOCH 1977.78''//
+ : '' /'
+ ELSE IF( CMN_LINE .EQ. 55 ) THEN
+ CARD = 'HKLIN028= ''PLATE.EXPOSURE 75'' /'
+ ELSE IF( CMN_LINE .EQ. 56 ) THEN
+ CARD = 'HKLIN029= ''PLATE.UTDATE 771011'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 57 ) THEN
+ CARD = 'HKLIN030= ''PLATE.LST 0020'' /'
+ ELSE IF( CMN_LINE .EQ. 58 ) THEN
+ CARD = 'HKLIN031= ''PLATE.MJD 43426.57'//
+ : '3008796'' /'
+ ELSE IF( CMN_LINE .EQ. 59 ) THEN
+ CARD = 'HKLIN032= ''PLATE.TELLAT -0.54584'//
+ : '105765654'' /'
+ ELSE IF( CMN_LINE .EQ. 60 ) THEN
+ CARD = 'HKLIN033= ''PLATE.TELLONG 2.601766'//
+ : '1944583'' /'
+ ELSE IF( CMN_LINE .EQ. 61 ) THEN
+ CARD = 'HKLIN034= ''PLATE.TELHT 1145'' /'
+ ELSE IF( CMN_LINE .EQ. 62 ) THEN
+ CARD = 'HKLIN035= ''PLATE.TEMP 273.155''//
+ : '' /'
+ ELSE IF( CMN_LINE .EQ. 63 ) THEN
+ CARD = 'HKLIN036= ''PLATE.ATMOSP 1013.25''//
+ : '' /'
+ ELSE IF( CMN_LINE .EQ. 64 ) THEN
+ CARD = 'HKLIN037= ''PLATE.HUMID 0.5'' /'
+ ELSE IF( CMN_LINE .EQ. 65 ) THEN
+ CARD = 'HKLIN038= ''PLATE.WAVE 4500'' /'
+ ELSE IF( CMN_LINE .EQ. 66 ) THEN
+ CARD = 'HKLIN039= ''PLATE.TROPL 0.0065'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 67 ) THEN
+ CARD = 'HKLIN040= ''CALIBRATION.CALTYPE SPLINE'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 68 ) THEN
+ CARD = 'HKLIN041= ''CALIBRATION.STEPWEDG KPNO'' /'
+ ELSE IF( CMN_LINE .EQ. 69 ) THEN
+ CARD = 'HKLIN042= ''CALIBRATION.NSTEPS 8'' /'
+ ELSE IF( CMN_LINE .EQ. 70 ) THEN
+ CARD = 'HKLIN043= ''MEASUREMENT.ORIENTAT news'' /'
+ ELSE IF( CMN_LINE .EQ. 71 ) THEN
+ CARD = 'HKLIN044= ''MEASUREMENT.EMULPOS UP'' /'
+ ELSE IF( CMN_LINE .EQ. 72 ) THEN
+ CARD = 'HKLIN045= ''MEASUREMENT.SCANFILT 14'' /'
+ ELSE IF( CMN_LINE .EQ. 73 ) THEN
+ CARD = 'HKLIN046= ''MEASUREMENT.SOSP 552'' /'
+ ELSE IF( CMN_LINE .EQ. 74 ) THEN
+ CARD = 'HKLIN047= ''MEASUREMENT.STEPSIZE 10'' /'
+ ELSE IF( CMN_LINE .EQ. 75 ) THEN
+ CARD = 'HKLIN048= ''MEASUREMENT.SCANLEN 1152'' /'
+ ELSE IF( CMN_LINE .EQ. 76 ) THEN
+ CARD = 'HKLIN049= ''MEASUREMENT.A-XMIN 1622000''//
+ : '' /'
+ ELSE IF( CMN_LINE .EQ. 77 ) THEN
+ CARD = 'HKLIN050= ''MEASUREMENT.A-YMIN 1622000''//
+ : '' /'
+ ELSE IF( CMN_LINE .EQ. 78 ) THEN
+ CARD = 'HKLIN051= ''MEASUREMENT.A-XMAX 33878000'//
+ : ''' /'
+ ELSE IF( CMN_LINE .EQ. 79 ) THEN
+ CARD = 'HKLIN052= ''MEASUREMENT.A-YMAX 33878000'//
+ : ''' /'
+ ELSE IF( CMN_LINE .EQ. 80 ) THEN
+ CARD = 'HKLIN053= ''MEASUREMENT.X_PNT 17500000'//
+ : ''' /'
+ ELSE IF( CMN_LINE .EQ. 81 ) THEN
+ CARD = 'HKLIN054= ''MEASUREMENT.Y_PNT 18000000'//
+ : ''' /'
+ ELSE IF( CMN_LINE .EQ. 82 ) THEN
+ CARD = 'HKLIN055= ''ANALYSIS.NPARAMS 32'' /'
+ ELSE IF( CMN_LINE .EQ. 83 ) THEN
+ CARD = 'HKLIN056= ''ANALYSIS.AREACUT 8'' /'
+ ELSE IF( CMN_LINE .EQ. 84 ) THEN
+ CARD = 'HKLIN057= ''ANALYSIS.AP-PARAM 1.07'' /'
+ ELSE IF( CMN_LINE .EQ. 85 ) THEN
+ CARD = 'HKLIN058= ''DEBLEND.DB-PARAM 1.05'' /'
+ ELSE IF( CMN_LINE .EQ. 86 ) THEN
+ CARD = 'HKLIN059= ''DEBLEND.DB-AMIN 16'' /'
+ ELSE IF( CMN_LINE .EQ. 87 ) THEN
+ CARD = 'HKLIN060= ''DEBLEND.DB-AMAX 100000'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 88 ) THEN
+ CARD = 'HKLIN061= ''DEBLEND.DB-ACUT 8'' /'
+ ELSE IF( CMN_LINE .EQ. 89 ) THEN
+ CARD = 'HKLIN062= ''DEBLEND.DB-LEVEL 16'' /'
+ ELSE IF( CMN_LINE .EQ. 90 ) THEN
+ CARD = 'HKLIN063= ''DEBLEND.SELECT PARENT+C'//
+ : 'HILD'' /'
+ ELSE IF( CMN_LINE .EQ. 91 ) THEN
+ CARD = 'HKLIN064= ''SKY.SKYSQUAR 64'' /'
+ ELSE IF( CMN_LINE .EQ. 92 ) THEN
+ CARD = 'HKLIN065= ''SKY.SKYDEFN MEDIAN'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 93 ) THEN
+ CARD = 'HKLIN066= ''SKY.SKYFILTR bdkjunk''//
+ : '' /'
+ ELSE IF( CMN_LINE .EQ. 94 ) THEN
+ CARD = 'HKLIN067= ''SKY.F-THRESH 8'' /'
+ ELSE IF( CMN_LINE .EQ. 95 ) THEN
+ CARD = 'HKLIN068= ''SKY.F-SCLEN 4'' /'
+ ELSE IF( CMN_LINE .EQ. 96 ) THEN
+ CARD = 'HKLIN069= ''THRESHOLDING.PCUT 10'' /'
+ ELSE IF( CMN_LINE .EQ. 97 ) THEN
+ CARD = 'HKLIN070= ''IAMQC.AREAMIN 8'' /'
+ ELSE IF( CMN_LINE .EQ. 98 ) THEN
+ CARD = 'HKLIN071= ''IAMQC.AREAMAX 77346'' '//
+ : '/'
+ ELSE IF( CMN_LINE .EQ. 99 ) THEN
+ CARD = 'HKLIN072= ''IAMQC.MINMAG -30515'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 100 ) THEN
+ CARD = 'HKLIN073= ''IAMQC.MAXMAG -17954'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 101 ) THEN
+ CARD = 'HKLIN074= ''IAMQC.MINELL 0.000415'//
+ : '6232'' /'
+ ELSE IF( CMN_LINE .EQ. 102 ) THEN
+ CARD = 'HKLIN075= ''IAMQC.MAXELL 1'' /'
+ ELSE IF( CMN_LINE .EQ. 103 ) THEN
+ CARD = 'HKLIN076= ''IAMQC.MODELL 0.14'' /'
+ ELSE IF( CMN_LINE .EQ. 104 ) THEN
+ CARD = 'HKLIN077= ''IAMQC.MODOR 91'' /'
+ ELSE IF( CMN_LINE .EQ. 105 ) THEN
+ CARD = 'HKLIN078= ''IAMQC.MIDELL 0.21'' /'
+ ELSE IF( CMN_LINE .EQ. 106 ) THEN
+ CARD = 'HKLIN079= ''IAMQC.MIDOR 93'' /'
+ ELSE IF( CMN_LINE .EQ. 107 ) THEN
+ CARD = 'HKLIN080= ''IAMQC.MEANELL 0.246703'//
+ : '7'' /'
+ ELSE IF( CMN_LINE .EQ. 108 ) THEN
+ CARD = 'HKLIN081= ''IAMQC.MEANOR 91.63474'//
+ : ''' /'
+ ELSE IF( CMN_LINE .EQ. 109 ) THEN
+ CARD = 'HKLIN082= ''IAMQC.NUMOBJ 556985'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 110 ) THEN
+ CARD = 'HKLIN083= ''IAMQC.PARENTS 486656'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 111 ) THEN
+ CARD = 'HKLIN084= ''IAMQC.RANGING TRUE'' /'
+ ELSE IF( CMN_LINE .EQ. 112 ) THEN
+ CARD = 'HKLIN085= ''IAMQC.LANE_1 15571'' '//
+ : '/'
+ ELSE IF( CMN_LINE .EQ. 113 ) THEN
+ CARD = 'HKLIN086= ''IAMQC.LANE_2 33207'' '//
+ : '/'
+ ELSE IF( CMN_LINE .EQ. 114 ) THEN
+ CARD = 'HKLIN087= ''IAMQC.LANE_3 51478'' '//
+ : '/'
+ ELSE IF( CMN_LINE .EQ. 115 ) THEN
+ CARD = 'HKLIN088= ''IAMQC.LANE_4 69944'' '//
+ : '/'
+ ELSE IF( CMN_LINE .EQ. 116 ) THEN
+ CARD = 'HKLIN089= ''IAMQC.LANE_5 89236'' '//
+ : '/'
+ ELSE IF( CMN_LINE .EQ. 117 ) THEN
+ CARD = 'HKLIN090= ''IAMQC.LANE_6 108416'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 118 ) THEN
+ CARD = 'HKLIN091= ''IAMQC.LANE_7 127481'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 119 ) THEN
+ CARD = 'HKLIN092= ''IAMQC.LANE_8 146699'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 120 ) THEN
+ CARD = 'HKLIN093= ''IAMQC.LANE_9 166380'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 121 ) THEN
+ CARD = 'HKLIN094= ''IAMQC.LANE_10 186126'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 122 ) THEN
+ CARD = 'HKLIN095= ''IAMQC.LANE_11 205946'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 123 ) THEN
+ CARD = 'HKLIN096= ''IAMQC.LANE_12 225915'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 124 ) THEN
+ CARD = 'HKLIN097= ''IAMQC.LANE_13 245926'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 125 ) THEN
+ CARD = 'HKLIN098= ''IAMQC.LANE_14 266574'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 126 ) THEN
+ CARD = 'HKLIN099= ''IAMQC.LANE_15 287150'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 127 ) THEN
+ CARD = 'HKLIN100= ''IAMQC.LANE_16 308087'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 128 ) THEN
+ CARD = 'HKLIN101= ''IAMQC.LANE_17 328830'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 129 ) THEN
+ CARD = 'HKLIN102= ''IAMQC.LANE_18 350253'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 130 ) THEN
+ CARD = 'HKLIN103= ''IAMQC.LANE_19 370738'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 131 ) THEN
+ CARD = 'HKLIN104= ''IAMQC.LANE_20 391722'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 132 ) THEN
+ CARD = 'HKLIN105= ''IAMQC.LANE_21 412801'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 133 ) THEN
+ CARD = 'HKLIN106= ''IAMQC.LANE_22 433795'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 134 ) THEN
+ CARD = 'HKLIN107= ''IAMQC.LANE_23 454383'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 135 ) THEN
+ CARD = 'HKLIN108= ''IAMQC.LANE_24 474711'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 136 ) THEN
+ CARD = 'HKLIN109= ''IAMQC.LANE_25 495108'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 137 ) THEN
+ CARD = 'HKLIN110= ''IAMQC.LANE_26 515755'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 138 ) THEN
+ CARD = 'HKLIN111= ''IAMQC.LANE_27 536499'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 139 ) THEN
+ CARD = 'HKLIN112= ''IAMQC.LANE_28 556985'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 140 ) THEN
+ CARD = 'HKLIN113= ''XYTORADEC.STARCAT /sdata/s'//
+ : 'cos/refcats/tycho2.FIT'' /'
+ ELSE IF( CMN_LINE .EQ. 141 ) THEN
+ CARD = 'HKLIN114= ''XYTORADEC.BRIGHTLIM 9'' /'
+ ELSE IF( CMN_LINE .EQ. 142 ) THEN
+ CARD = 'HKLIN115= ''XYTORADEC.C-EQUIN 2000'' /'
+ ELSE IF( CMN_LINE .EQ. 143 ) THEN
+ CARD = 'HKLIN116= ''XYTORADEC.C-EQTSYS JULIAN'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 144 ) THEN
+ CARD = 'HKLIN117= ''XYTORADEC.C-EPOCH 2000'' /'
+ ELSE IF( CMN_LINE .EQ. 145 ) THEN
+ CARD = 'HKLIN118= ''XYTORADEC.C-EPTSYS JULIAN'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 146 ) THEN
+ CARD = 'HKLIN119= ''XYTORADEC.R-EQUIN 2000'' /'
+ ELSE IF( CMN_LINE .EQ. 147 ) THEN
+ CARD = 'HKLIN120= ''XYTORADEC.R-TSYS JULIAN'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 148 ) THEN
+ CARD = 'HKLIN121= ''XYTORADEC.MAXITER 5000'' /'
+ ELSE IF( CMN_LINE .EQ. 149 ) THEN
+ CARD = 'HKLIN122= ''XYTORADEC.RCRITINI 500000'''//
+ : ' /'
+ ELSE IF( CMN_LINE .EQ. 150 ) THEN
+ CARD = 'HKLIN123= ''XYTORADEC.RCRITABS 50000'' '//
+ : '/'
+ ELSE IF( CMN_LINE .EQ. 151 ) THEN
+ CARD = 'HKLIN124= ''XYTORADEC.RCRITREL 1'' /'
+ ELSE IF( CMN_LINE .EQ. 152 ) THEN
+ CARD = 'HKLIN125= ''XYTORADEC.RCRITFIN 3'' /'
+ ELSE IF( CMN_LINE .EQ. 153 ) THEN
+ CARD = 'HKLIN126= ''XYTORADEC.HARDCOPY /scos1/s'//
+ : 'cos/UKJ001/UKJ001.ps'' /'
+ ELSE IF( CMN_LINE .EQ. 154 ) THEN
+ CARD = 'HKLIN127= ''XYTORADEC.REFSMULT 5'' /'
+ ELSE IF( CMN_LINE .EQ. 155 ) THEN
+ CARD = 'HKLIN128= ''XYTORADEC.RESDMULT 1000'' /'
+ ELSE IF( CMN_LINE .EQ. 156 ) THEN
+ CARD = 'HKLIN129= ''XYTORADEC.RACOL RA'' /'
+ ELSE IF( CMN_LINE .EQ. 157 ) THEN
+ CARD = 'HKLIN130= ''XYTORADEC.DECOL DEC'' /'
+ ELSE IF( CMN_LINE .EQ. 158 ) THEN
+ CARD = 'HKLIN131= ''XYTORADEC.RAPMCOL PMRA'' /'
+ ELSE IF( CMN_LINE .EQ. 159 ) THEN
+ CARD = 'HKLIN132= ''XYTORADEC.DECPMCOL PMDE'' /'
+ ELSE IF( CMN_LINE .EQ. 160 ) THEN
+ CARD = 'HKLIN133= ''XYTORADEC.PLXCOL NONE'' /'
+ ELSE IF( CMN_LINE .EQ. 161 ) THEN
+ CARD = 'HKLIN134= ''XYTORADEC.RVCOL NONE'' /'
+ ELSE IF( CMN_LINE .EQ. 162 ) THEN
+ CARD = 'HKLIN135= ''XYTORADEC.MAGCOL VT'' /'
+ ELSE IF( CMN_LINE .EQ. 163 ) THEN
+ CARD = 'HKLIN136= ''XYTORADEC.STARSC 2374'' /'
+ ELSE IF( CMN_LINE .EQ. 164 ) THEN
+ CARD = 'HKLIN137= ''XYTORADEC.STARSU 1727'' /'
+ ELSE IF( CMN_LINE .EQ. 165 ) THEN
+ CARD = 'HKLIN138= ''XYTORADEC.COEFFS_1 17.64034'//
+ : '3856524'' /'
+ ELSE IF( CMN_LINE .EQ. 166 ) THEN
+ CARD = 'HKLIN139= ''XYTORADEC.COEFFS_2 -260.441'//
+ : '51995641'' /'
+ ELSE IF( CMN_LINE .EQ. 167 ) THEN
+ CARD = 'HKLIN140= ''XYTORADEC.COEFFS_3 -163.091'//
+ : '55572601'' /'
+ ELSE IF( CMN_LINE .EQ. 168 ) THEN
+ CARD = 'HKLIN141= ''XYTORADEC.COEFFS_4 17.50423'//
+ : '0442205'' /'
+ ELSE IF( CMN_LINE .EQ. 169 ) THEN
+ CARD = 'HKLIN142= ''XYTORADEC.COEFFS_5 -163.086'//
+ : '76953832'' /'
+ ELSE IF( CMN_LINE .EQ. 170 ) THEN
+ CARD = 'HKLIN143= ''XYTORADEC.COEFFS_6 260.4881'//
+ : '7907668'' /'
+ ELSE IF( CMN_LINE .EQ. 171 ) THEN
+ CARD = 'HKLIN144= ''XYTORADEC.DISTR -0.33333'//
+ : '333333333'' /'
+ ELSE IF( CMN_LINE .EQ. 172 ) THEN
+ CARD = 'HKLIN145= ''XYTORADEC.RA_PNT 0.549249'//
+ : '96662137'' /'
+ ELSE IF( CMN_LINE .EQ. 173 ) THEN
+ CARD = 'HKLIN146= ''XYTORADEC.DEC_PNT -1.56849'//
+ : '31501781'' /'
+ ELSE IF( CMN_LINE .EQ. 174 ) THEN
+ CARD = 'HISTORY = ''SuperCOSMOS image analysis and ma'//
+ : 'pping mode (IAM and MM)'' /'
+ ELSE IF( CMN_LINE .EQ. 175 ) THEN
+ CARD = 'HISTORY = ''data written by xydcomp_ss.'' /'
+ ELSE IF( CMN_LINE .EQ. 176 ) THEN
+ CARD = 'HISTORY = ''Any questions/comments/suggestion'//
+ : 's/bug reports should be sent'' /'
+ ELSE IF( CMN_LINE .EQ. 177 ) THEN
+ CARD = 'HISTORY = ''to N.Hambly@roe.ac.uk'' /'
+ ELSE IF( CMN_LINE .EQ. 178 ) THEN
+ CARD = 'ASTSIGX = 3.700000E-01 / [arcsec] std'//
+ : '. dev. of astrometric fit in X'
+ ELSE IF( CMN_LINE .EQ. 179 ) THEN
+ CARD = 'ASTSIGY = 3.800000E-01 / [arcsec] std'//
+ : '. dev. of astrometric fit in Y'
+ ELSE IF( CMN_LINE .EQ. 180 ) THEN
+ CARD = 'CRVAL1 = 0.000000000000E+00 / Axis 1 refer'//
+ : 'ence value'
+ ELSE IF( CMN_LINE .EQ. 181 ) THEN
+ CARD = 'CRPIX1 = 8.936318379289E+02 / Axis 1 pixel'//
+ : ' value'
+ ELSE IF( CMN_LINE .EQ. 182 ) THEN
+ CARD = 'CTYPE1 = ''RA---TAN'' / Quantity r'//
+ : 'epresented by axis 1'
+ ELSE IF( CMN_LINE .EQ. 183 ) THEN
+ CARD = 'CRVAL2 = -9.000000018364E+01 / Axis 2 refer'//
+ : 'ence value'
+ ELSE IF( CMN_LINE .EQ. 184 ) THEN
+ CARD = 'CRPIX2 = 2.238380193875E+02 / Axis 2 pixel'//
+ : ' value'
+ ELSE IF( CMN_LINE .EQ. 185 ) THEN
+ CARD = 'CTYPE2 = ''DEC--TAN'' / Quantity r'//
+ : 'epresented by axis 2'
+ ELSE IF( CMN_LINE .EQ. 186 ) THEN
+ CARD = 'CD1_1 = -1.864642639667E-04 / Co-ordinate '//
+ : 'transformation matrix'
+ ELSE IF( CMN_LINE .EQ. 187 ) THEN
+ CARD = 'CD1_2 = -9.188369023766E-07 / Co-ordinate '//
+ : 'transformation matrix'
+ ELSE IF( CMN_LINE .EQ. 188 ) THEN
+ CARD = 'CD2_1 = -1.038232462415E-06 / Co-ordinate '//
+ : 'transformation matrix'
+ ELSE IF( CMN_LINE .EQ. 189 ) THEN
+ CARD = 'CD2_2 = 1.866269837741E-04 / Co-ordinate '//
+ : 'transformation matrix'
+ ELSE IF( CMN_LINE .EQ. 190 ) THEN
+ CARD = 'CDELT1 = -1.864665278217E-04 / DEPRECATED -'//
+ : ' Increment per pixel on axis 1'
+ ELSE IF( CMN_LINE .EQ. 191 ) THEN
+ CARD = 'CDELT2 = 1.866298716692E-04 / DEPRECATED -'//
+ : ' Increment per pixel on axis 2'
+ ELSE IF( CMN_LINE .EQ. 192 ) THEN
+ CARD = 'PC001001= 9.999878591881E-01 / DEPRECATED -'//
+ : ' Axis rotation matrix'
+ ELSE IF( CMN_LINE .EQ. 193 ) THEN
+ CARD = 'PC001002= 4.927623810613E-03 / DEPRECATED -'//
+ : ' Axis rotation matrix'
+ ELSE IF( CMN_LINE .EQ. 194 ) THEN
+ CARD = 'PC002001= -5.563056187788E-03 / DEPRECATED -'//
+ : ' Axis rotation matrix'
+ ELSE IF( CMN_LINE .EQ. 195 ) THEN
+ CARD = 'PC002002= 9.999845260832E-01 / DEPRECATED -'//
+ : ' Axis rotation matrix'
+ ELSE IF( CMN_LINE .EQ. 196 ) THEN
+ CARD = 'CROTA2 = 3.005532298491E-01 / DEPRECATED -'//
+ : ' rotation of axis 2'
+ ELSE IF( CMN_LINE .EQ. 197 ) THEN
+ CARD = 'EQUINOX = 2.000000E+03 / Julian refer'//
+ : 'ence frame equinox'
+ ELSE IF( CMN_LINE .EQ. 198 ) THEN
+ CARD = 'DATATYPE= ''INTEGER*2'' / Type of da'//
+ : 'ta'
+ ELSE IF( CMN_LINE .EQ. 199 ) THEN
+ CARD = 'DATUNITS= ''DENSITY '' / Units: tra'//
+ : 'nsmission, density or intensity'
+ ELSE IF( CMN_LINE .EQ. 200 ) THEN
+ CARD = 'XPIXELSZ= 9.997114974000E+00 / [microns] X '//
+ : 'pixel size'
+ ELSE IF( CMN_LINE .EQ. 201 ) THEN
+ CARD = 'YPIXELSZ= 1.000000000000E+01 / [microns] Y '//
+ : 'pixel size'
+ ELSE IF( CMN_LINE .EQ. 202 ) THEN
+ CARD = 'OBJCTRA = '' 0 0 0.000'' / Centre Rig'//
+ : 'ht Ascension (J2000)'
+ ELSE IF( CMN_LINE .EQ. 203 ) THEN
+ CARD = 'OBJCTDEC= ''-90 0 0.00'' / Centre Dec'//
+ : 'lination (J2000)'
+ ELSE IF( CMN_LINE .EQ. 204 ) THEN
+ CARD = 'OBJCTX = 1.636863183793E+04 / [pixels] Cen'//
+ : 'tre X on plate'
+ ELSE IF( CMN_LINE .EQ. 205 ) THEN
+ CARD = 'OBJCTY = 1.474083801939E+04 / [pixels] Cen'//
+ : 'tre Y on plate'
+ ELSE IF( CMN_LINE .EQ. 206 ) THEN
+ CARD = 'END'
+ REG_SOURCE = 0
+ ELSE
+ REG_SOURCE = 0
+ END IF
+
+
+* Insert new header code here.... (create new header code using script
+* "make_regtest" in the AST development archive).
+ ELSE
+ REG_SOURCE = 0
+ STATUS = SAI__ERROR
+ WRITE(*,'(A,I2)') 'REG_SOURCE: No such test: ',CMN_FTEST
+ END IF
+
+ CMN_LINE = CMN_LINE + 1
+
+ END
+
+
diff --git a/ast/ast_tester/regression.out b/ast/ast_tester/regression.out
new file mode 100644
index 0000000..7fcaa9c
--- /dev/null
+++ b/ast/ast_tester/regression.out
@@ -0,0 +1,7630 @@
+ Begin FitsChan # I/O channels to FITS files
+ Card = 1 # Index of current card
+# Encod = "NATIVE" # Encoding system
+# FitsDg = 15 # No. of digits for floating point values
+# DfB1950 = 1 # Default to FK4 B1950
+# CdMat = 0 # Use PC matrix
+# CarLin = 0 # Use full FITS-WCS CAR projections
+# Iwc = 0 # Do not include an IWC Frame
+# Warn = "Tnx Zpx BadCel BadMat BadCTYPE" # Warnings to be reported
+ Nm1 = "NAXIS" # FITS keyword name
+ Ty1 = "integer" # FITS keyword data type
+ Dt1 = 1 # FITS keyword value
+ Nm2 = "NAXIS1" # FITS keyword name
+ Ty2 = "integer" # FITS keyword data type
+ Dt2 = 100 # FITS keyword value
+ Nm3 = "CTYPE1" # FITS keyword name
+ Ty3 = "string" # FITS keyword data type
+ Dt3 = "fred" # FITS keyword value
+ Nm4 = "CDELT1" # FITS keyword name
+ Ty4 = "floating point" # FITS keyword data type
+ Dt4 = 0 # FITS keyword value
+ Nm5 = "CRPIX1" # FITS keyword name
+ Ty5 = "integer" # FITS keyword data type
+ Dt5 = 50 # FITS keyword value
+ Nm6 = "CUNIT1" # FITS keyword name
+ Ty6 = "string" # FITS keyword data type
+ Dt6 = "GHz" # FITS keyword value
+ Nm7 = " " # FITS keyword name
+ Ty7 = "comment" # FITS keyword data type
+ End FitsChan
+ Begin FrameSet # Set of inter-related coordinate systems
+# Title = "IAU (1958) galactic coordinates; zenithal equal area projection" # Title of coordinate system
+# Naxes = 2 # Number of coordinate axes
+# Domain = "SKY" # Coordinate system domain
+# Epoch = 1950 # Besselian epoch of observation
+# Lbl1 = "Galactic longitude" # Label for axis 1
+# Lbl2 = "Galactic latitude" # Label for axis 2
+# System = "GALACTIC" # Coordinate system type
+# Uni1 = "degrees" # Units for axis 1
+# Uni2 = "degrees" # Units for axis 2
+# Bot2 = -1.5707963267949 # Lowest legal axis value
+# Top2 = 1.5707963267949 # Highest legal axis value
+ IsA Frame # Coordinate system description
+ Nframe = 2 # Number of Frames in FrameSet
+ Base = 1 # Index of base Frame
+ Currnt = 2 # Index of current Frame
+ Lnk2 = 1 # Node 2 is derived from node 1
+ Frm1 = # Frame number 1
+ Begin Frame # Coordinate system description
+ Title = "Pixel Coordinates" # Title of coordinate system
+ Naxes = 2 # Number of coordinate axes
+ Domain = "GRID" # Coordinate system domain
+# Lbl1 = "Pixel axis 1" # Label for axis 1
+# Lbl2 = "Pixel axis 2" # Label for axis 2
+ Ax1 = # Axis number 1
+ Begin Axis # Coordinate axis
+ Label = "Pixel axis 1" # Axis Label
+ End Axis
+ Ax2 = # Axis number 2
+ Begin Axis # Coordinate axis
+ Label = "Pixel axis 2" # Axis Label
+ End Axis
+ End Frame
+ Frm2 = # Frame number 2
+ Begin SkyFrame # Description of celestial coordinate system
+ Ident = " " # Permanent Object identification string
+ IsA Object # AST Object
+# Title = "IAU (1958) galactic coordinates; zenithal equal area projection" # Title of coordinate system
+ Naxes = 2 # Number of coordinate axes
+# Domain = "SKY" # Coordinate system domain
+ Epoch = 1950 # Besselian epoch of observation
+# Lbl1 = "Galactic longitude" # Label for axis 1
+# Lbl2 = "Galactic latitude" # Label for axis 2
+ System = "GALACTIC" # Coordinate system type
+# Uni1 = "degrees" # Units for axis 1
+# Uni2 = "degrees" # Units for axis 2
+# Bot2 = -1.5707963267949 # Lowest legal axis value
+# Top2 = 1.5707963267949 # Highest legal axis value
+ Ax1 = # Axis number 1
+ Begin SkyAxis # Celestial coordinate axis
+ End SkyAxis
+ Ax2 = # Axis number 2
+ Begin SkyAxis # Celestial coordinate axis
+ End SkyAxis
+ IsA Frame # Coordinate system description
+ Proj = "zenithal equal area" # Description of sky projection
+ SRefIs = "Ignored" # Not rotated (ref. pos. is ignored)
+ SRef1 = -2.61046557479594 # Ref. pos. l -149.5687
+ SRef2 = -0.344845661720836 # Ref. pos. b -19.7582
+ End SkyFrame
+ Map2 = # Mapping between nodes 1 and 2
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin WinMap # Map one window on to another
+ Nin = 2 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Sft1 = -150.5 # Shift for axis 1
+ Sft2 = -150.5 # Shift for axis 2
+ End WinMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin MatrixMap # Matrix transformation
+ Nin = 2 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ M0 = -0.020943951023932 # Forward matrix value
+ M1 = 0.020943951023932 # Forward matrix value
+ Form = "Diagonal" # Matrix storage form
+ End MatrixMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ InvA = 1 # First Mapping used in inverse direction
+ MapA = # First component Mapping
+ Begin WcsMap # FITS-WCS sky projection
+ Nin = 2 # Number of input coordinates
+ Invert = 1 # Mapping inverted
+ IsA Mapping # Mapping between coordinate systems
+ Type = "ZEA" # Zenithal equal area projection
+ End WcsMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ InvA = 1 # First Mapping used in inverse direction
+ MapA = # First component Mapping
+ Begin SphMap # Cartesian to Spherical mapping
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ Invert = 1 # Mapping inverted
+ IsA Mapping # Mapping between coordinate systems
+ UntRd = 1 # All input vectors have unit length
+ PlrLg = 0 # Polar longitude (rad.s)
+ End SphMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin MatrixMap # Matrix transformation
+ Nin = 3 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ M0 = 0.291480364581799 # Forward matrix value
+ M1 = 0.506505471460186 # AST version 4.3- 0
+PutCards Ncards = 7
+PutCards Card = 1
+PutCards Card = 8
+PutCards Ncards = 7
+PutCards Card = 1
+
+
+
+
+ FITS test number 1
+ ====================
+
+
+
+AST_SHOW:
+
+REG_SINK:
+SIMPLE = T / Written by IDL: 30-Jul-1997 05:35:42.00
+BITPIX = -32 / Bits per pixel.
+NAXIS = 2 / Number of dimensions
+NAXIS1 = 300 / Length of x axis.
+NAXIS2 = 300 / Length of y axis.
+COMMENT
+COMMENT This file was produced by the SkyView survey analysis system from
+COMMENT available astronomical surveys. The data are formatted
+COMMENT as a simple two-dimensional FITS image with the same units as
+COMMENT the orginal survey. A single ASCII table extension may be present
+COMMENT which describes catalog objects found within the field of view.
+COMMENT Copies of relevant copyright notices are included in this file.
+COMMENT
+COMMENT Questions should be directed to:
+COMMENT
+COMMENT scollick@skyview.gsfc.nasa.gov
+COMMENT or
+COMMENT mcglynn@grossc.gsfc.nasa.gov
+COMMENT
+COMMENT SkyView
+COMMENT Code 668.1
+COMMENT Goddard Space Flight Center, Greenbelt, MD 20771
+COMMENT 301-286-7780
+COMMENT
+COMMENT SkyView is supported by NASA ADP grant NAS 5-32068.
+COMMENT
+SURVEY = 'COBE DIRBE'
+BUNITS = 'MJy/sr '
+ORIGIN = 'CDAC ' / Cosmology Data Analysis Center
+TELESCOP= 'COBE ' / COsmic Background Explorer satellite
+INSTRUME= 'DIRBE ' / COBE instrument [DIRBE, DMR, FIRAS]
+PIXRESOL= 9 / Quad tree pixel resolution [6, 9]
+DATE = '27/09/94' / FITS file creation date (dd/mm/yy)
+DATE-MAP= '16/09/94' / Date of original file creation (dd/mm/yy)
+COMMENT COBE specific keywords
+DATE-BEG= '08/12/89' / date of initial data represented (dd/mm/yy)
+DATE-END= '25/09/90' / date of final data represented (dd/mm/yy)
+COMMENT
+COMMENT THE COBE DIRBE map is a combination of the original ten
+COMMENT band passes with the following wavelengths:
+COMMENT Band 1 - 1.25 microns
+COMMENT Band 2 - 2.2 microns
+COMMENT Band 3 - 3.5 microns
+COMMENT Band 4 - 4.9 microns
+COMMENT Band 5 - 12 microns
+COMMENT Band 6 - 25 microns
+COMMENT Band 7 - 60 microns
+COMMENT Band 8 - 100 microns
+COMMENT Band 9 - 140 microns
+COMMENT Band 10 - 240 microns
+COMMENT
+
+Objects written: 1
+
+Native Encoding:
+
+COMMENT AST ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ AST
+COMMENT AST WCS information in AST format AST
+COMMENT AST See http://www.starlink.ac.uk/ast/ AST
+COMMENT AST Beginning of AST data for FrameSet object AST
+COMMENT AST ................................................................ AST
+BEGAST_A= 'FrameSet' / Set of inter-related coordinate systems
+NFRAME_A= 2 / Number of Frames in FrameSet
+BASE_A = 1 / Index of base Frame
+CURRNT_A= 2 / Index of current Frame
+LNK2_A = 1 / Node 2 is derived from node 1
+FRM1_A = ' ' / Frame number 1
+BEGAST_B= 'Frame ' / Coordinate system description
+TITLE_A = 'Pixel Coordinates' / Title of coordinate system
+NAXES_A = 2 / Number of coordinate axes
+DOMAIN_A= 'GRID ' / Coordinate system domain
+AX1_A = ' ' / Axis number 1
+BEGAST_C= 'Axis ' / Coordinate axis
+LABEL_A = 'Pixel axis 1' / Axis Label
+ENDAST_A= 'Axis ' / End of object definition
+AX2_A = ' ' / Axis number 2
+BEGAST_D= 'Axis ' / Coordinate axis
+LABEL_B = 'Pixel axis 2' / Axis Label
+ENDAST_B= 'Axis ' / End of object definition
+ENDAST_C= 'Frame ' / End of object definition
+FRM2_A = ' ' / Frame number 2
+BEGAST_E= 'SkyFrame' / Description of celestial coordinate system
+IDENT_A = '" " ' / Permanent Object identification string
+ISA_A = 'Object ' / AST Object
+NAXES_B = 2 / Number of coordinate axes
+EPOCH_A = 1950.0 / Besselian epoch of observation
+SYSTEM_A= 'GALACTIC' / Coordinate system type
+AX1_B = ' ' / Axis number 1
+BEGAST_F= 'SkyAxis ' / Celestial coordinate axis
+ENDAST_D= 'SkyAxis ' / End of object definition
+AX2_B = ' ' / Axis number 2
+BEGAST_G= 'SkyAxis ' / Celestial coordinate axis
+ENDAST_E= 'SkyAxis ' / End of object definition
+ISA_B = 'Frame ' / Coordinate system description
+PROJ_A = 'zenithal equal area'/ Description of sky projection
+SREFIS_A= 'Ignored ' / Not rotated (ref. pos. is ignored)
+SREF1_A = -2.61046557479594 / Ref. pos. l -149.5687
+SREF2_A = -0.344845661720836 / Ref. pos. b -19.7582
+ENDAST_F= 'SkyFrame' / End of object definition
+MAP2_A = ' ' / Mapping between nodes 1 and 2
+BEGAST_H= 'CmpMap ' / Compound Mapping
+NIN_A = 2 / Number of input coordinates
+ISSIMP_A= 1 / Mapping has been simplified
+ISA_C = 'Mapping ' / Mapping between coordinate systems
+MAPA_A = ' ' / First component Mapping
+BEGAST_I= 'WinMap ' / Map one window on to another
+NIN_B = 2 / Number of input coordinates
+INVERT_A= 0 / Mapping not inverted
+ISA_D = 'Mapping ' / Mapping between coordinate systems
+SFT1_A = -150.5 / Shift for axis 1
+SFT2_A = -150.5 / Shift for axis 2
+ENDAST_G= 'WinMap ' / End of object definition
+MAPB_A = ' ' / Second component Mapping
+BEGAST_J= 'CmpMap ' / Compound Mapping
+NIN_C = 2 / Number of input coordinates
+ISA_E = 'Mapping ' / Mapping between coordinate systems
+MAPA_B = ' ' / First component Mapping
+BEGAST_K= 'MatrixMap' / Matrix transformation
+NIN_D = 2 / Number of input coordinates
+INVERT_B= 0 / Mapping not inverted
+ISA_F = 'Mapping ' / Mapping between coordinate systems
+M0_A = -0.020943951023932 / Forward matrix value
+M1_A = 0.020943951023932 / Forward matrix value
+FORM_A = 'Diagonal' / Matrix storage form
+ENDAST_H= 'MatrixMap' / End of object definition
+MAPB_B = ' ' / Second component Mapping
+BEGAST_L= 'CmpMap ' / Compound Mapping
+NIN_E = 2 / Number of input coordinates
+ISA_G = 'Mapping ' / Mapping between coordinate systems
+INVA_A = 1 / First Mapping used in inverse direction
+MAPA_C = ' ' / First component Mapping
+BEGAST_M= 'WcsMap ' / FITS-WCS sky projection
+NIN_F = 2 / Number of input coordinates
+INVERT_C= 1 / Mapping inverted
+ISA_H = 'Mapping ' / Mapping between coordinate systems
+TYPE_A = 'ZEA ' / Zenithal equal area projection
+ENDAST_I= 'WcsMap ' / End of object definition
+MAPB_C = ' ' / Second component Mapping
+BEGAST_N= 'CmpMap ' / Compound Mapping
+NIN_G = 2 / Number of input coordinates
+ISA_I = 'Mapping ' / Mapping between coordinate systems
+INVA_B = 1 / First Mapping used in inverse direction
+MAPA_D = ' ' / First component Mapping
+BEGAST_O= 'SphMap ' / Cartesian to Spherical mapping
+NIN_H = 3 / Number of input coordinates
+NOUT_A = 2 / Number of output coordinates
+INVERT_D= 1 / Mapping inverted
+ISA_J = 'Mapping ' / Mapping between coordinate systems
+UNTRD_A = 1 / All input vectors have unit length
+PLRLG_A = 0.0 / Polar longitude (rad.s)
+ENDAST_J= 'SphMap ' / End of object definition
+MAPB_D = ' ' / Second component Mapping
+BEGAST_P= 'CmpMap ' / Compound Mapping
+NIN_I = 3 / Number of input coordinates
+NOUT_B = 2 / Number of output coordinates
+ISA_K = 'Mapping ' / Mapping between coordinate systems
+MAPA_E = ' ' / First component Mapping
+BEGAST_Q= 'MatrixMap' / Matrix transformation
+NIN_J = 3 / Number of input coordinates
+INVERT_E= 0 / Mapping not inverted
+ISA_L = 'Mapping ' / Mapping between coordinate systems
+M0_B = 0.291480364581799 / Forward matrix value
+M1_B = 0.506505471460186 / Forward matrix value
+M2_A = -0.811474832908671 / Forward matrix value
+M3_A = 0.171224898552328 / Forward matrix value
+M4_A = -0.862236746712233 / Forward matrix value
+M5_A = -0.476686298035564 / Forward matrix value
+M6_A = -0.941127638091139 / Forward matrix value
+M7_A = 0.0 / Forward matrix value
+M8_A = -0.338051429254475 / Forward matrix value
+FORM_B = 'Full ' / Matrix storage form
+ENDAST_K= 'MatrixMap' / End of object definition
+MAPB_E = ' ' / Second component Mapping
+BEGAST_R= 'SphMap ' / Cartesian to Spherical mapping
+NIN_K = 3 / Number of input coordinates
+NOUT_C = 2 / Number of output coordinates
+INVERT_F= 0 / Mapping not inverted
+ISA_M = 'Mapping ' / Mapping between coordinate systems
+UNTRD_B = 1 / All input vectors have unit length
+PLRLG_B = -2.61046557479594 / Polar longitude (rad.s)
+ENDAST_L= 'SphMap ' / End of object definition
+ENDAST_M= 'CmpMap ' / End of object definition
+ENDAST_N= 'CmpMap ' / End of object definition
+ENDAST_O= 'CmpMap ' / End of object definition
+ENDAST_P= 'CmpMap ' / End of object definition
+ENDAST_Q= 'CmpMap ' / End of object definition
+ENDAST_R= 'FrameSet' / End of object definition
+COMMENT AST ................................................................ AST
+COMMENT AST End of AST data for FrameSet object AST
+COMMENT AST ---------------------------------------------------------------- AST
+
+ATTRIBUTES:
+ Colour(axis1) : 1
+ Font(Stri) : 1
+ Nout : 1
+ Class : 4
+ Tol : 0.100000E-01
+ Gap(1) : 1.04720
+ Border : 0
+ Invert : 0
+ TextLabGap : 0.100000E-01
+ Nin : 2
+ Current : 3
+ Base : 1
+ Nobject : 1
+ RefCOUNT : 1
+
+AST_GRID:
+REG_LINE: 15
+ 25.4 -29.7
+ 31.0 -16.7
+ 35.7 -2.18
+ 39.8 13.5
+ 43.0 30.1
+ 45.5 47.3
+ 47.2 64.8
+ 48.1 82.5
+ 48.2 99.9
+ 47.3 117.
+ 45.5 133.
+ 42.5 149.
+ 38.4 163.
+ 32.8 175.
+ 25.4 185.
+REG_LINE: 15
+ 25.4 -29.7
+ 20.1 -16.6
+ 15.4 -2.03
+ 11.5 13.7
+ 8.35 30.3
+ 5.92 47.5
+ 4.25 65.0
+ 3.39 82.6
+ 3.35 100.
+ 4.19 117.
+ 5.99 133.
+ 8.83 149.
+ 12.9 163.
+ 18.3 175.
+ 25.4 185.
+REG_LINE: 119
+ 25.4 -29.7
+ 24.6 -29.7
+ 23.8 -29.7
+ 22.9 -29.6
+ 22.1 -29.5
+ 21.3 -29.5
+ 20.4 -29.3
+ 19.6 -29.2
+ 18.8 -29.0
+ 17.9 -28.9
+ 17.1 -28.7
+ 16.3 -28.5
+ 15.5 -28.2
+ 14.6 -28.0
+ 13.8 -27.7
+ 13.0 -27.4
+ 12.2 -27.1
+ 11.4 -26.7
+ 10.6 -26.4
+ 9.74 -26.0
+ 8.93 -25.6
+ 8.12 -25.2
+ 7.32 -24.8
+ 6.52 -24.3
+ 5.73 -23.9
+ 4.93 -23.4
+ 4.14 -22.9
+ 3.35 -22.3
+ 2.57 -21.8
+ 1.79 -21.2
+ 1.02 -20.6
+ .247 -20.0
+ -.520 -19.4
+ -1.28 -18.8
+ -2.04 -18.1
+ -2.79 -17.4
+ -3.54 -16.7
+ -4.29 -16.0
+ -5.02 -15.3
+ -5.76 -14.5
+ -6.49 -13.7
+ -7.21 -12.9
+ -7.92 -12.1
+ -17.3 1.12
+ -25.1 17.7
+ -31.1 37.2
+ -34.6 59.1
+ -35.4 82.8
+ -33.1 107.
+ -32.8 109.
+ -32.5 111.
+ -32.2 112.
+ -31.9 114.
+ -31.5 116.
+ -31.1 117.
+ -30.7 119.
+ -30.3 121.
+ -29.9 123.
+ -29.4 124.
+ -28.9 126.
+ -28.5 128.
+ -27.9 129.
+ -27.4 131.
+ -26.9 132.
+ -26.3 134.
+ -25.7 136.
+ -25.2 137.
+ -24.5 139.
+ -23.9 140.
+ -23.3 142.
+ -22.6 143.
+ -21.9 145.
+ -21.2 146.
+ -20.5 148.
+ -19.8 149.
+ -19.0 151.
+ -18.2 152.
+ -17.5 154.
+ -16.7 155.
+ -15.8 156.
+ -15.0 158.
+ -14.2 159.
+ -13.3 160.
+ -12.4 162.
+ -11.5 163.
+ -10.6 164.
+ -9.69 165.
+ -8.75 166.
+ -7.80 167.
+ -6.83 168.
+ -5.85 170.
+ -4.86 171.
+ -3.85 172.
+ -2.83 172.
+ -1.80 173.
+ -.761 174.
+ .293 175.
+ 1.36 176.
+ 2.43 177.
+ 3.52 178.
+ 4.61 178.
+ 5.72 179.
+ 6.83 180.
+ 7.95 180.
+ 9.08 181.
+ 10.2 181.
+ 11.4 182.
+ 12.5 182.
+ 13.7 183.
+ 14.8 183.
+ 16.0 184.
+ 17.2 184.
+ 18.3 184.
+ 19.5 184.
+ 20.7 185.
+ 21.9 185.
+ 23.1 185.
+ 24.3 185.
+ 25.4 185.
+REG_LINE: 171
+ 25.4 -29.7
+ 19.1 -40.9
+ 11.9 -49.9
+ 11.3 -50.4
+ 10.8 -50.9
+ 10.2 -51.4
+ 9.62 -51.9
+ 9.04 -52.4
+ 8.46 -52.8
+ 7.87 -53.3
+ 7.28 -53.7
+ 6.68 -54.1
+ 6.07 -54.5
+ 5.46 -54.9
+ 4.84 -55.2
+ 4.21 -55.6
+ 3.58 -55.9
+ 2.95 -56.2
+ 2.30 -56.5
+ 1.65 -56.7
+ .990 -56.9
+ .325 -57.2
+ -.348 -57.3
+ -1.03 -57.5
+ -1.71 -57.7
+ -2.41 -57.8
+ -3.11 -57.9
+ -3.82 -57.9
+ -4.54 -58.0
+ -5.27 -58.0
+ -6.00 -58.0
+ -6.74 -58.0
+ -7.50 -57.9
+ -8.26 -57.8
+ -9.03 -57.7
+ -9.80 -57.5
+ -10.6 -57.3
+ -11.4 -57.1
+ -12.2 -56.8
+ -13.0 -56.5
+ -13.8 -56.2
+ -14.7 -55.8
+ -15.5 -55.4
+ -16.4 -55.0
+ -17.2 -54.5
+ -18.1 -53.9
+ -19.0 -53.4
+ -19.9 -52.7
+ -20.8 -52.0
+ -21.7 -51.3
+ -22.6 -50.5
+ -23.6 -49.7
+ -24.5 -48.8
+ -25.5 -47.8
+ -26.4 -46.8
+ -27.4 -45.7
+ -28.4 -44.5
+ -29.4 -43.3
+ -30.4 -42.0
+ -31.4 -40.6
+ -32.4 -39.1
+ -33.5 -37.6
+ -34.5 -36.0
+ -35.5 -34.3
+ -36.6 -32.5
+ -37.6 -30.5
+ -38.7 -28.5
+ -39.7 -26.4
+ -40.8 -24.2
+ -41.8 -21.9
+ -42.8 -19.5
+ -43.9 -16.9
+ -44.9 -14.2
+ -45.9 -11.4
+ -46.9 -8.53
+ -47.8 -5.48
+ -48.8 -2.30
+ -49.7 1.01
+ -50.6 4.45
+ -51.4 8.02
+ -52.2 11.7
+ -53.0 15.6
+ -53.7 19.5
+ -54.4 23.6
+ -55.0 27.8
+ -55.5 32.2
+ -56.0 36.6
+ -56.4 41.1
+ -56.7 45.8
+ -56.9 50.5
+ -57.1 55.3
+ -57.1 60.1
+ -57.1 65.1
+ -56.9 70.0
+ -56.7 74.9
+ -56.4 79.9
+ -55.9 84.9
+ -55.4 89.8
+ -54.8 94.7
+ -54.1 99.5
+ -53.3 104.
+ -52.4 109.
+ -51.4 114.
+ -50.3 118.
+ -49.2 122.
+ -48.0 127.
+ -46.7 131.
+ -45.4 135.
+ -44.1 138.
+ -42.7 142.
+ -41.2 146.
+ -39.8 149.
+ -38.3 152.
+ -36.8 155.
+ -35.2 158.
+ -33.7 161.
+ -32.2 164.
+ -30.6 166.
+ -29.1 168.
+ -27.5 171.
+ -26.0 173.
+ -24.5 175.
+ -23.0 176.
+ -21.5 178.
+ -20.0 180.
+ -18.5 181.
+ -17.1 182.
+ -15.7 184.
+ -14.3 185.
+ -12.9 186.
+ -11.5 187.
+ -10.2 188.
+ -8.92 188.
+ -7.64 189.
+ -6.38 190.
+ -5.15 190.
+ -3.94 191.
+ -2.75 191.
+ -1.59 192.
+ -.448 192.
+ .669 193.
+ 1.76 193.
+ 2.83 193.
+ 3.88 193.
+ 4.91 193.
+ 5.92 193.
+ 6.91 193.
+ 7.88 193.
+ 8.82 193.
+ 9.75 193.
+ 10.7 193.
+ 11.6 193.
+ 12.4 193.
+ 13.3 192.
+ 14.1 192.
+ 14.9 192.
+ 15.7 192.
+ 16.5 191.
+ 17.3 191.
+ 18.1 190.
+ 18.8 190.
+ 19.5 190.
+ 20.2 189.
+ 20.9 189.
+ 21.6 188.
+ 22.3 188.
+ 22.9 187.
+ 23.6 187.
+ 24.2 186.
+ 24.8 185.
+ 25.4 185.
+REG_LINE: 171
+ 25.4 -29.7
+ 31.6 -41.1
+ 38.7 -50.2
+ 39.2 -50.7
+ 39.8 -51.2
+ 40.3 -51.8
+ 40.9 -52.3
+ 41.5 -52.8
+ 42.0 -53.2
+ 42.6 -53.7
+ 43.2 -54.1
+ 43.8 -54.6
+ 44.4 -55.0
+ 45.0 -55.4
+ 45.6 -55.7
+ 46.2 -56.1
+ 46.8 -56.4
+ 47.4 -56.7
+ 48.1 -57.0
+ 48.7 -57.3
+ 49.4 -57.6
+ 50.0 -57.8
+ 50.7 -58.0
+ 51.3 -58.2
+ 52.0 -58.4
+ 52.7 -58.5
+ 53.4 -58.6
+ 54.1 -58.7
+ 54.8 -58.8
+ 55.5 -58.8
+ 56.2 -58.9
+ 57.0 -58.8
+ 57.7 -58.8
+ 58.5 -58.7
+ 59.2 -58.6
+ 60.0 -58.5
+ 60.8 -58.3
+ 61.6 -58.2
+ 62.4 -57.9
+ 63.2 -57.7
+ 64.0 -57.4
+ 64.8 -57.0
+ 65.6 -56.6
+ 66.5 -56.2
+ 67.3 -55.8
+ 68.2 -55.2
+ 69.1 -54.7
+ 70.0 -54.1
+ 70.9 -53.4
+ 71.8 -52.7
+ 72.7 -52.0
+ 73.7 -51.2
+ 74.6 -50.3
+ 75.6 -49.4
+ 76.6 -48.4
+ 77.5 -47.3
+ 78.5 -46.2
+ 79.5 -45.0
+ 80.5 -43.7
+ 81.6 -42.4
+ 82.6 -41.0
+ 83.6 -39.5
+ 84.7 -37.9
+ 85.7 -36.2
+ 86.8 -34.4
+ 87.8 -32.5
+ 88.9 -30.5
+ 90.0 -28.5
+ 91.1 -26.3
+ 92.1 -23.9
+ 93.2 -21.5
+ 94.2 -19.0
+ 95.3 -16.3
+ 96.3 -13.5
+ 97.3 -10.6
+ 98.4 -7.51
+ 99.3 -4.31
+ 100. -.976
+ 101. 2.50
+ 102. 6.12
+ 103. 9.88
+ 104. 13.8
+ 105. 17.8
+ 105. 22.0
+ 106. 26.3
+ 106. 30.7
+ 107. 35.2
+ 107. 39.9
+ 108. 44.7
+ 108. 49.5
+ 108. 54.4
+ 108. 59.4
+ 108. 64.5
+ 108. 69.5
+ 108. 74.6
+ 107. 79.7
+ 107. 84.8
+ 106. 89.9
+ 106. 94.9
+ 105. 99.9
+ 104. 105.
+ 103. 110.
+ 102. 114.
+ 101. 119.
+ 100. 123.
+ 98.8 128.
+ 97.5 132.
+ 96.1 136.
+ 94.7 140.
+ 93.3 143.
+ 91.8 147.
+ 90.3 150.
+ 88.8 154.
+ 87.2 157.
+ 85.7 159.
+ 84.1 162.
+ 82.5 165.
+ 80.9 167.
+ 79.4 170.
+ 77.8 172.
+ 76.3 174.
+ 74.7 176.
+ 73.2 177.
+ 71.7 179.
+ 70.2 181.
+ 68.8 182.
+ 67.3 183.
+ 65.9 185.
+ 64.5 186.
+ 63.2 187.
+ 61.8 188.
+ 60.5 188.
+ 59.2 189.
+ 57.9 190.
+ 56.7 191.
+ 55.5 191.
+ 54.3 192.
+ 53.1 192.
+ 51.9 192.
+ 50.8 193.
+ 49.7 193.
+ 48.6 193.
+ 47.6 193.
+ 46.5 193.
+ 45.5 194.
+ 44.5 194.
+ 43.6 194.
+ 42.6 194.
+ 41.7 193.
+ 40.8 193.
+ 39.9 193.
+ 39.0 193.
+ 38.2 193.
+ 37.3 193.
+ 36.5 192.
+ 35.7 192.
+ 34.9 192.
+ 34.2 191.
+ 33.4 191.
+ 32.7 191.
+ 31.9 190.
+ 31.2 190.
+ 30.5 189.
+ 29.8 189.
+ 29.2 188.
+ 28.5 188.
+ 27.9 187.
+ 27.3 187.
+ 26.6 186.
+ 26.0 185.
+ 25.4 185.
+REG_LINE: 119
+ 25.4 -29.7
+ 26.3 -29.7
+ 27.1 -29.7
+ 28.0 -29.7
+ 28.8 -29.6
+ 29.6 -29.5
+ 30.5 -29.4
+ 31.3 -29.3
+ 32.1 -29.2
+ 33.0 -29.0
+ 33.8 -28.8
+ 34.6 -28.6
+ 35.4 -28.4
+ 36.3 -28.2
+ 37.1 -27.9
+ 37.9 -27.6
+ 38.7 -27.3
+ 39.5 -27.0
+ 40.4 -26.7
+ 41.2 -26.3
+ 42.0 -25.9
+ 42.8 -25.5
+ 43.6 -25.1
+ 44.4 -24.7
+ 45.2 -24.2
+ 46.0 -23.7
+ 46.8 -23.2
+ 47.6 -22.7
+ 48.4 -22.2
+ 49.2 -21.6
+ 49.9 -21.1
+ 50.7 -20.5
+ 51.5 -19.8
+ 52.2 -19.2
+ 53.0 -18.6
+ 53.8 -17.9
+ 54.5 -17.2
+ 55.3 -16.5
+ 56.0 -15.8
+ 56.8 -15.0
+ 57.5 -14.3
+ 58.2 -13.5
+ 58.9 -12.7
+ 68.4 .462
+ 76.3 17.0
+ 82.3 36.5
+ 85.9 58.6
+ 86.8 82.4
+ 84.5 107.
+ 84.2 109.
+ 83.9 110.
+ 83.5 112.
+ 83.2 114.
+ 82.8 116.
+ 82.4 117.
+ 82.0 119.
+ 81.6 121.
+ 81.2 122.
+ 80.7 124.
+ 80.2 126.
+ 79.7 128.
+ 79.2 129.
+ 78.7 131.
+ 78.1 132.
+ 77.6 134.
+ 77.0 136.
+ 76.4 137.
+ 75.8 139.
+ 75.1 140.
+ 74.5 142.
+ 73.8 144.
+ 73.1 145.
+ 72.4 147.
+ 71.7 148.
+ 70.9 150.
+ 70.2 151.
+ 69.4 152.
+ 68.6 154.
+ 67.8 155.
+ 67.0 157.
+ 66.1 158.
+ 65.3 159.
+ 64.4 160.
+ 63.5 162.
+ 62.6 163.
+ 61.7 164.
+ 60.8 165.
+ 59.8 166.
+ 58.8 168.
+ 57.9 169.
+ 56.9 170.
+ 55.9 171.
+ 54.9 172.
+ 53.8 173.
+ 52.8 174.
+ 51.8 175.
+ 50.7 175.
+ 49.6 176.
+ 48.5 177.
+ 47.4 178.
+ 46.3 178.
+ 45.2 179.
+ 44.1 180.
+ 43.0 180.
+ 41.8 181.
+ 40.7 182.
+ 39.6 182.
+ 38.4 182.
+ 37.2 183.
+ 36.1 183.
+ 34.9 184.
+ 33.7 184.
+ 32.6 184.
+ 31.4 184.
+ 30.2 185.
+ 29.0 185.
+ 27.8 185.
+ 26.6 185.
+ 25.4 185.
+REG_LINE: 15
+ 25.4 -29.7
+ 31.0 -16.7
+ 35.7 -2.18
+ 39.8 13.5
+ 43.0 30.1
+ 45.5 47.3
+ 47.2 64.8
+ 48.1 82.5
+ 48.2 99.9
+ 47.3 117.
+ 45.5 133.
+ 42.5 149.
+ 38.4 163.
+ 32.8 175.
+ 25.4 185.
+REG_LINE: 197
+ 52.0 -19.4
+ 51.8 -18.1
+ 51.5 -16.9
+ 51.2 -15.6
+ 50.9 -14.4
+ 50.5 -13.2
+ 50.1 -12.1
+ 49.6 -11.0
+ 49.1 -9.89
+ 48.6 -8.84
+ 48.0 -7.82
+ 47.5 -6.84
+ 46.8 -5.89
+ 46.2 -4.97
+ 45.5 -4.09
+ 44.8 -3.25
+ 44.1 -2.44
+ 43.4 -1.67
+ 42.6 -.931
+ 41.8 -.233
+ 41.0 .428
+ 40.2 1.05
+ 39.3 1.64
+ 38.5 2.19
+ 37.6 2.70
+ 36.7 3.17
+ 35.8 3.61
+ 34.9 4.01
+ 34.0 4.37
+ 33.0 4.69
+ 32.1 4.97
+ 31.2 5.22
+ 30.2 5.42
+ 29.2 5.59
+ 28.3 5.72
+ 27.3 5.82
+ 26.3 5.87
+ 25.4 5.89
+ 24.4 5.87
+ 23.4 5.81
+ 22.5 5.71
+ 21.5 5.57
+ 20.5 5.40
+ 19.6 5.18
+ 18.6 4.93
+ 17.7 4.64
+ 16.8 4.31
+ 15.9 3.95
+ 14.9 3.55
+ 14.0 3.10
+ 13.2 2.63
+ 12.3 2.11
+ 11.4 1.55
+ 10.6 .962
+ 9.77 .333
+ 8.97 -.334
+ 8.18 -1.04
+ 7.42 -1.78
+ 6.68 -2.56
+ 5.96 -3.37
+ 5.27 -4.22
+ 4.60 -5.10
+ 3.96 -6.02
+ 3.35 -6.98
+ 2.77 -7.97
+ 2.22 -8.99
+ 1.70 -10.1
+ 1.22 -11.1
+ .767 -12.3
+ .353 -13.4
+ -0.240E-01 -14.6
+ -.362 -15.8
+ -.660 -17.1
+ -.917 -18.3
+ -1.13 -19.6
+ -1.30 -20.9
+ -1.42 -22.3
+ -1.50 -23.6
+ -1.53 -25.0
+ -1.51 -26.4
+ -1.44 -27.8
+ -1.32 -29.3
+ -1.15 -30.7
+ -.921 -32.2
+ -.640 -33.6
+ -.302 -35.1
+ 0.909E-01 -36.5
+ .541 -37.9
+ 1.05 -39.4
+ 1.61 -40.8
+ 2.24 -42.2
+ 2.92 -43.6
+ 3.65 -44.9
+ 4.45 -46.3
+ 5.30 -47.5
+ 6.20 -48.8
+ 7.16 -50.0
+ 8.17 -51.1
+ 9.23 -52.2
+ 10.3 -53.3
+ 11.5 -54.2
+ 12.7 -55.1
+ 13.9 -55.9
+ 15.2 -56.7
+ 16.5 -57.3
+ 17.9 -57.9
+ 19.2 -58.4
+ 20.6 -58.7
+ 22.0 -59.0
+ 23.4 -59.2
+ 24.8 -59.3
+ 26.3 -59.3
+ 27.7 -59.2
+ 29.1 -59.0
+ 30.5 -58.7
+ 31.9 -58.3
+ 33.2 -57.8
+ 34.6 -57.2
+ 35.9 -56.6
+ 37.1 -55.8
+ 38.4 -55.0
+ 39.6 -54.1
+ 40.7 -53.1
+ 41.8 -52.1
+ 42.9 -51.0
+ 43.9 -49.8
+ 44.8 -48.6
+ 45.7 -47.4
+ 46.6 -46.1
+ 47.4 -44.7
+ 48.1 -43.4
+ 48.8 -42.0
+ 49.4 -40.6
+ 49.9 -39.2
+ 50.4 -37.7
+ 50.9 -36.3
+ 51.2 -34.8
+ 51.6 -33.4
+ 51.9 -31.9
+ 52.1 -30.5
+ 52.2 -29.1
+ 52.3 -27.6
+ 52.4 -26.2
+ 52.4 -24.8
+ 52.4 -23.4
+ 52.3 -22.1
+ 52.2 -20.7
+ 52.0 -19.4
+ 51.8 -18.1
+ 51.5 -16.9
+ 51.2 -15.6
+ 50.9 -14.4
+ 50.5 -13.2
+ 50.1 -12.1
+ 49.6 -11.0
+ 49.1 -9.89
+ 48.6 -8.84
+ 48.0 -7.82
+ 47.5 -6.84
+ 46.8 -5.89
+ 46.2 -4.97
+ 45.5 -4.09
+ 44.8 -3.25
+ 44.1 -2.44
+ 43.4 -1.67
+ 42.6 -.931
+ 41.8 -.233
+ 41.0 .428
+ 40.2 1.05
+ 39.3 1.64
+ 38.5 2.19
+ 37.6 2.70
+ 36.7 3.17
+ 35.8 3.61
+ 34.9 4.01
+ 34.0 4.37
+ 33.0 4.69
+ 32.1 4.97
+ 31.2 5.22
+ 30.2 5.42
+ 29.2 5.59
+ 28.3 5.72
+ 27.3 5.82
+ 26.3 5.87
+ 25.4 5.89
+ 24.4 5.87
+ 23.4 5.81
+ 22.5 5.71
+ 21.5 5.57
+ 20.5 5.40
+ 19.6 5.18
+ 18.6 4.93
+ 17.7 4.64
+ 16.8 4.31
+ 15.9 3.95
+ 14.9 3.55
+ 14.0 3.10
+REG_LINE: 197
+ 73.9 11.1
+ 73.1 13.1
+ 72.3 14.9
+ 71.5 16.8
+ 70.6 18.5
+ 69.7 20.2
+ 68.7 21.8
+ 67.7 23.3
+ 66.6 24.8
+ 65.5 26.3
+ 64.4 27.7
+ 63.2 29.0
+ 62.0 30.2
+ 60.7 31.4
+ 59.5 32.6
+ 58.2 33.7
+ 56.9 34.7
+ 55.5 35.7
+ 54.2 36.7
+ 52.8 37.5
+ 51.4 38.4
+ 49.9 39.2
+ 48.5 39.9
+ 47.0 40.6
+ 45.5 41.2
+ 44.0 41.8
+ 42.5 42.3
+ 41.0 42.8
+ 39.5 43.3
+ 37.9 43.7
+ 36.4 44.0
+ 34.8 44.3
+ 33.2 44.6
+ 31.7 44.8
+ 30.1 44.9
+ 28.5 45.0
+ 26.9 45.1
+ 25.3 45.1
+ 23.7 45.1
+ 22.2 45.0
+ 20.6 44.9
+ 19.0 44.7
+ 17.4 44.5
+ 15.9 44.3
+ 14.3 44.0
+ 12.8 43.6
+ 11.2 43.2
+ 9.68 42.8
+ 8.15 42.3
+ 6.65 41.7
+ 5.15 41.1
+ 3.67 40.5
+ 2.20 39.8
+ .758 39.0
+ -.671 38.2
+ -2.08 37.4
+ -3.47 36.5
+ -4.83 35.6
+ -6.17 34.6
+ -7.49 33.5
+ -8.78 32.4
+ -10.0 31.3
+ -11.3 30.0
+ -12.5 28.8
+ -13.6 27.5
+ -14.8 26.1
+ -15.9 24.6
+ -16.9 23.1
+ -17.9 21.6
+ -18.9 19.9
+ -19.8 18.2
+ -20.7 16.5
+ -21.6 14.7
+ -22.3 12.8
+ -23.1 10.8
+ -23.7 8.81
+ -24.4 6.71
+ -24.9 4.55
+ -25.4 2.30
+ -25.8 -0.953E-02
+ -26.1 -2.40
+ -26.4 -4.86
+ -26.6 -7.41
+ -26.7 -10.0
+ -26.7 -12.7
+ -26.6 -15.5
+ -26.4 -18.3
+ -26.0 -21.3
+ -25.6 -24.2
+ -25.0 -27.3
+ -24.4 -30.4
+ -23.5 -33.6
+ -22.6 -36.8
+ -21.4 -40.1
+ -20.2 -43.4
+ -18.7 -46.7
+ -17.1 -49.9
+ -15.3 -53.2
+ -13.3 -56.4
+ -11.1 -59.6
+ -8.73 -62.7
+ -6.17 -65.6
+ -3.42 -68.3
+ -.492 -70.9
+ 2.61 -73.3
+ 5.87 -75.3
+ 9.27 -77.1
+ 12.8 -78.6
+ 16.4 -79.7
+ 20.1 -80.5
+ 23.8 -80.8
+ 27.6 -80.8
+ 31.3 -80.4
+ 35.0 -79.6
+ 38.6 -78.4
+ 42.1 -76.9
+ 45.5 -75.1
+ 48.8 -72.9
+ 51.8 -70.6
+ 54.7 -67.9
+ 57.5 -65.2
+ 60.0 -62.2
+ 62.3 -59.1
+ 64.5 -56.0
+ 66.4 -52.7
+ 68.2 -49.5
+ 69.8 -46.2
+ 71.2 -42.9
+ 72.5 -39.6
+ 73.6 -36.3
+ 74.6 -33.1
+ 75.4 -30.0
+ 76.0 -26.8
+ 76.6 -23.8
+ 77.0 -20.8
+ 77.3 -17.9
+ 77.5 -15.1
+ 77.6 -12.3
+ 77.5 -9.63
+ 77.4 -7.03
+ 77.3 -4.50
+ 77.0 -2.04
+ 76.6 .337
+ 76.2 2.64
+ 75.7 4.87
+ 75.2 7.03
+ 74.5 9.11
+ 73.9 11.1
+ 73.1 13.1
+ 72.3 14.9
+ 71.5 16.8
+ 70.6 18.5
+ 69.7 20.2
+ 68.7 21.8
+ 67.7 23.3
+ 66.6 24.8
+ 65.5 26.3
+ 64.4 27.7
+ 63.2 29.0
+ 62.0 30.2
+ 60.7 31.4
+ 59.5 32.6
+ 58.2 33.7
+ 56.9 34.7
+ 55.5 35.7
+ 54.2 36.7
+ 52.8 37.5
+ 51.4 38.4
+ 49.9 39.2
+ 48.5 39.9
+ 47.0 40.6
+ 45.5 41.2
+ 44.0 41.8
+ 42.5 42.3
+ 41.0 42.8
+ 39.5 43.3
+ 37.9 43.7
+ 36.4 44.0
+ 34.8 44.3
+ 33.2 44.6
+ 31.7 44.8
+ 30.1 44.9
+ 28.5 45.0
+ 26.9 45.1
+ 25.3 45.1
+ 23.7 45.1
+ 22.2 45.0
+ 20.6 44.9
+ 19.0 44.7
+ 17.4 44.5
+ 15.9 44.3
+ 14.3 44.0
+ 12.8 43.6
+ 11.2 43.2
+ 9.68 42.8
+ 8.15 42.3
+ 6.65 41.7
+REG_LINE: 197
+ 85.9 58.6
+ 84.7 60.1
+ 83.5 61.6
+ 82.2 63.1
+ 80.8 64.4
+ 79.5 65.8
+ 78.1 67.0
+ 76.7 68.3
+ 75.2 69.4
+ 73.7 70.6
+ 72.2 71.6
+ 70.7 72.7
+ 69.2 73.6
+ 67.6 74.6
+ 66.0 75.5
+ 64.4 76.3
+ 62.7 77.2
+ 61.1 77.9
+ 59.4 78.7
+ 57.7 79.3
+ 56.0 80.0
+ 54.3 80.6
+ 52.5 81.2
+ 50.8 81.7
+ 49.0 82.2
+ 47.2 82.7
+ 45.5 83.1
+ 43.7 83.5
+ 41.8 83.8
+ 40.0 84.1
+ 38.2 84.4
+ 36.4 84.7
+ 34.5 84.9
+ 32.7 85.0
+ 30.9 85.1
+ 29.0 85.2
+ 27.2 85.3
+ 25.3 85.3
+ 23.5 85.3
+ 21.6 85.2
+ 19.8 85.1
+ 17.9 85.0
+ 16.1 84.8
+ 14.2 84.6
+ 12.4 84.4
+ 10.6 84.1
+ 8.78 83.8
+ 6.97 83.4
+ 5.17 83.0
+ 3.39 82.6
+ 1.61 82.2
+ -.156 81.6
+ -1.91 81.1
+ -3.65 80.5
+ -5.37 79.9
+ -7.08 79.2
+ -8.77 78.6
+ -10.4 77.8
+ -12.1 77.0
+ -13.7 76.2
+ -15.3 75.4
+ -16.9 74.4
+ -18.5 73.5
+ -20.1 72.5
+ -21.6 71.5
+ -23.1 70.4
+ -24.5 69.3
+ -26.0 68.1
+ -27.4 66.9
+ -28.8 65.6
+ -30.1 64.2
+ -31.5 62.9
+ -32.8 61.4
+ -34.0 59.9
+ -35.2 58.4
+ -36.4 56.7
+ -37.6 55.0
+ -38.7 53.3
+ -39.7 51.4
+ -40.7 49.5
+ -41.7 47.5
+ -42.6 45.4
+ -43.5 43.2
+ -44.3 40.9
+ -45.0 38.5
+ -45.7 36.0
+ -46.4 33.4
+ -46.9 30.6
+ -47.4 27.6
+ -47.7 24.5
+ -48.0 21.3
+ -48.2 17.8
+ -48.3 14.1
+ -48.2 10.1
+ -47.9 5.89
+ -47.5 1.37
+ -46.9 -3.46
+ -46.0 -8.66
+ -44.9 -14.2
+ -43.4 -20.2
+ -41.5 -26.7
+ -39.1 -33.6
+ -36.1 -40.9
+ -32.4 -48.6
+ -27.8 -56.6
+ -22.3 -64.7
+ -15.8 -72.6
+ -8.06 -79.8
+ .764 -86.0
+ 10.5 -90.4
+ 20.9 -92.6
+ 31.5 -92.5
+ 41.9 -89.9
+ 51.5 -85.2
+ 60.2 -78.8
+ 67.7 -71.4
+ 74.1 -63.5
+ 79.5 -55.4
+ 83.9 -47.5
+ 87.5 -39.8
+ 90.4 -32.5
+ 92.7 -25.7
+ 94.5 -19.3
+ 96.0 -13.4
+ 97.1 -7.87
+ 97.9 -2.73
+ 98.5 2.06
+ 98.9 6.53
+ 99.1 10.7
+ 99.2 14.6
+ 99.1 18.3
+ 98.9 21.7
+ 98.6 25.0
+ 98.2 28.1
+ 97.7 31.0
+ 97.2 33.8
+ 96.5 36.4
+ 95.8 38.9
+ 95.1 41.3
+ 94.3 43.6
+ 93.4 45.7
+ 92.5 47.8
+ 91.5 49.8
+ 90.5 51.7
+ 89.4 53.5
+ 88.3 55.3
+ 87.1 57.0
+ 85.9 58.6
+ 84.7 60.1
+ 83.5 61.6
+ 82.2 63.1
+ 80.8 64.4
+ 79.5 65.8
+ 78.1 67.0
+ 76.7 68.3
+ 75.2 69.4
+ 73.7 70.6
+ 72.2 71.6
+ 70.7 72.7
+ 69.2 73.6
+ 67.6 74.6
+ 66.0 75.5
+ 64.4 76.3
+ 62.7 77.2
+ 61.1 77.9
+ 59.4 78.7
+ 57.7 79.3
+ 56.0 80.0
+ 54.3 80.6
+ 52.5 81.2
+ 50.8 81.7
+ 49.0 82.2
+ 47.2 82.7
+ 45.5 83.1
+ 43.7 83.5
+ 41.8 83.8
+ 40.0 84.1
+ 38.2 84.4
+ 36.4 84.7
+ 34.5 84.9
+ 32.7 85.0
+ 30.9 85.1
+ 29.0 85.2
+ 27.2 85.3
+ 25.3 85.3
+ 23.5 85.3
+ 21.6 85.2
+ 19.8 85.1
+ 17.9 85.0
+ 16.1 84.8
+ 14.2 84.6
+ 12.4 84.4
+ 10.6 84.1
+ 8.78 83.8
+ 6.97 83.4
+ 5.17 83.0
+ 3.39 82.6
+REG_LINE: 145
+ 82.9 115.
+ 63.7 120.
+ 40.9 123.
+ 16.6 123.
+ -6.79 121.
+ -27.2 116.
+ -28.5 116.
+ -29.8 116.
+ -31.0 115.
+ -32.2 115.
+ -33.4 115.
+ -34.5 114.
+ -35.7 114.
+ -36.7 114.
+ -37.8 114.
+ -38.8 113.
+ -39.8 113.
+ -40.7 113.
+ -41.6 113.
+ -42.5 113.
+ -43.3 113.
+ -44.1 113.
+ -44.8 113.
+ -45.5 114.
+ -46.1 114.
+ -46.7 114.
+ -47.2 115.
+ -47.7 116.
+ -48.1 117.
+ -48.4 118.
+ -48.6 119.
+ -48.7 121.
+ -48.6 123.
+ -48.4 125.
+ -48.0 128.
+ -47.4 132.
+ -46.4 136.
+ -45.0 141.
+ -43.0 147.
+ -40.2 154.
+ -36.3 163.
+ -30.8 173.
+ -23.1 184.
+ -12.5 196.
+ -11.6 197.
+ -10.7 198.
+ -9.78 198.
+ -8.85 199.
+ -7.90 200.
+ -6.94 201.
+ -5.96 201.
+ -4.96 202.
+ -3.94 203.
+ -2.91 203.
+ -1.87 204.
+ -.804 205.
+ .274 205.
+ 1.37 206.
+ 2.47 207.
+ 3.60 207.
+ 4.73 208.
+ 5.88 208.
+ 7.04 209.
+ 8.21 209.
+ 9.40 209.
+ 10.6 210.
+ 11.8 210.
+ 13.0 211.
+ 14.2 211.
+ 15.5 211.
+ 16.7 211.
+ 17.9 212.
+ 19.2 212.
+ 20.4 212.
+ 21.7 212.
+ 23.0 212.
+ 24.2 212.
+ 25.5 212.
+ 26.8 212.
+ 28.0 212.
+ 29.3 212.
+ 30.5 212.
+ 31.8 212.
+ 33.0 212.
+ 34.3 211.
+ 35.5 211.
+ 36.7 211.
+ 38.0 211.
+ 39.2 210.
+ 40.4 210.
+ 41.6 209.
+ 42.8 209.
+ 43.9 209.
+ 45.1 208.
+ 46.2 208.
+ 47.4 207.
+ 48.5 206.
+ 49.6 206.
+ 50.7 205.
+ 51.8 205.
+ 65.1 194.
+ 75.3 183.
+ 82.6 171.
+ 87.9 162.
+ 91.6 153.
+ 94.3 146.
+ 96.1 140.
+ 97.5 135.
+ 98.4 131.
+ 99.0 128.
+ 99.3 125.
+ 99.5 122.
+ 99.5 121.
+ 99.4 119.
+ 99.2 118.
+ 98.9 116.
+ 98.5 116.
+ 98.1 115.
+ 97.5 114.
+ 97.0 114.
+ 96.3 114.
+ 95.6 113.
+ 94.9 113.
+ 94.1 113.
+ 93.3 113.
+ 92.4 113.
+ 91.5 113.
+ 90.5 113.
+ 89.5 113.
+ 88.5 114.
+ 87.5 114.
+ 86.4 114.
+ 85.3 114.
+ 84.1 115.
+ 82.9 115.
+ 81.7 115.
+ 80.5 116.
+ 79.2 116.
+ 77.9 116.
+ 76.6 117.
+ 75.3 117.
+ 73.9 117.
+ 52.6 122.
+ 28.8 124.
+ 4.68 123.
+REG_LINE: 145
+ 61.4 165.
+ 60.9 164.
+ 60.3 163.
+ 59.7 163.
+ 59.0 163.
+ 58.4 162.
+ 57.6 162.
+ 56.9 161.
+ 56.1 161.
+ 55.3 161.
+ 54.5 160.
+ 53.6 160.
+ 52.7 160.
+ 51.8 160.
+ 50.9 159.
+ 49.9 159.
+ 48.9 159.
+ 47.9 159.
+ 46.9 159.
+ 45.9 159.
+ 44.8 158.
+ 43.8 158.
+ 42.7 158.
+ 41.6 158.
+ 40.5 158.
+ 39.4 158.
+ 38.2 158.
+ 37.1 158.
+ 35.9 158.
+ 19.4 158.
+ 3.82 159.
+ 2.81 159.
+ 1.81 159.
+ .836 159.
+ -.119 159.
+ -1.05 160.
+ -1.96 160.
+ -2.85 160.
+ -3.71 160.
+ -4.54 161.
+ -5.35 161.
+ -6.12 161.
+ -6.86 162.
+ -7.57 162.
+ -8.25 163.
+ -8.88 163.
+ -9.48 164.
+ -10.0 164.
+ -10.6 165.
+ -11.0 165.
+ -11.5 166.
+ -11.8 167.
+ -12.2 167.
+ -12.4 168.
+ -12.6 169.
+ -12.8 170.
+ -12.9 171.
+ -12.9 172.
+ -12.9 173.
+ -12.7 174.
+ -12.5 175.
+ -12.3 176.
+ -11.9 177.
+ -11.4 178.
+ -10.9 180.
+ -10.2 181.
+ -9.43 183.
+ -8.55 184.
+ -7.56 186.
+ -6.44 187.
+ -5.21 189.
+ -3.85 190.
+ -2.36 192.
+ -.742 193.
+ 1.01 195.
+ 2.88 196.
+ 4.88 197.
+ 7.00 199.
+ 9.23 200.
+ 11.6 201.
+ 14.0 202.
+ 16.5 202.
+ 19.1 203.
+ 21.7 203.
+ 24.3 203.
+ 27.0 203.
+ 29.6 203.
+ 32.2 203.
+ 34.8 202.
+ 37.3 202.
+ 39.7 201.
+ 42.0 200.
+ 44.2 198.
+ 46.3 197.
+ 48.3 196.
+ 50.2 194.
+ 51.9 193.
+ 53.5 191.
+ 55.0 190.
+ 56.3 188.
+ 57.5 187.
+ 58.6 185.
+ 59.6 184.
+ 60.4 182.
+ 61.2 181.
+ 61.8 180.
+ 62.4 178.
+ 62.8 177.
+ 63.2 176.
+ 63.5 175.
+ 63.7 173.
+ 63.8 172.
+ 63.8 171.
+ 63.8 170.
+ 63.7 170.
+ 63.5 169.
+ 63.3 168.
+ 63.0 167.
+ 62.7 166.
+ 62.3 166.
+ 61.9 165.
+ 61.4 165.
+ 60.9 164.
+ 60.3 163.
+ 59.7 163.
+ 59.0 163.
+ 58.4 162.
+ 57.6 162.
+ 56.9 161.
+ 56.1 161.
+ 55.3 161.
+ 54.5 160.
+ 53.6 160.
+ 52.7 160.
+ 51.8 160.
+ 50.9 159.
+ 49.9 159.
+ 48.9 159.
+ 47.9 159.
+ 46.9 159.
+ 45.9 159.
+ 44.8 158.
+ 43.8 158.
+ 27.7 158.
+ 11.4 158.
+REG_LINE: 2
+ 80.7 64.6
+ 80.8 66.3
+REG_LINE: 2
+ 75.0 69.6
+ 75.1 71.4
+REG_LINE: 2
+ 68.8 73.9
+ 68.8 75.6
+REG_LINE: 2
+ 62.2 77.4
+ 62.2 79.2
+REG_LINE: 2
+ 55.3 80.3
+ 55.3 82.0
+REG_LINE: 2
+ 40.8 84.0
+ 40.8 85.8
+REG_LINE: 2
+ 33.3 85.0
+ 33.3 86.7
+REG_LINE: 2
+ 25.8 85.3
+ 25.8 87.0
+REG_LINE: 2
+ 18.2 85.0
+ 18.2 86.8
+REG_LINE: 2
+ 10.7 84.1
+ 10.7 85.9
+REG_LINE: 2
+ -3.79 80.5
+ -3.83 82.2
+REG_LINE: 2
+ -10.7 77.7
+ -10.8 79.4
+REG_LINE: 2
+ -17.3 74.2
+ -17.4 76.0
+REG_LINE: 2
+ -23.6 70.0
+ -23.6 71.8
+REG_LINE: 2
+ -29.4 65.0
+ -29.5 66.8
+REG_LINE: 2
+ -39.3 52.2
+ -39.4 54.0
+REG_LINE: 2
+ -43.2 44.0
+ -43.4 45.7
+REG_LINE: 2
+ -46.2 34.0
+ -46.4 35.8
+REG_LINE: 2
+ -48.0 21.8
+ -48.3 23.5
+REG_LINE: 2
+ -48.0 6.25
+ -48.3 7.96
+REG_LINE: 2
+ -35.8 -41.5
+ -36.5 -39.9
+REG_LINE: 2
+ -14.6 -73.9
+ -15.8 -72.6
+REG_LINE: 2
+ 23.6 -92.8
+ 22.6 -94.3
+REG_LINE: 2
+ 62.8 -76.5
+ 64.1 -75.2
+REG_LINE: 2
+ 85.5 -44.2
+ 86.2 -42.6
+REG_LINE: 2
+ 98.7 4.70
+ 99.1 6.41
+REG_LINE: 2
+ 99.0 20.6
+ 99.3 22.3
+REG_LINE: 2
+ 97.3 33.1
+ 97.5 34.8
+REG_LINE: 2
+ 94.4 43.2
+ 94.6 44.9
+REG_LINE: 2
+ 90.5 51.6
+ 90.7 53.3
+REG_LINE: 2
+ 80.7 64.6
+ 80.8 66.3
+REG_LINE: 2
+ 75.0 69.6
+ 75.1 71.4
+REG_LINE: 2
+ 68.8 73.9
+ 68.8 75.6
+REG_LINE: 2
+ 62.2 77.4
+ 62.2 79.2
+REG_LINE: 2
+ 55.3 80.3
+ 55.3 82.0
+REG_LINE: 2
+ 40.8 84.0
+ 40.8 85.8
+REG_LINE: 2
+ 33.3 85.0
+ 33.3 86.7
+REG_LINE: 2
+ 25.8 85.3
+ 25.8 87.0
+REG_LINE: 2
+ 18.2 85.0
+ 18.2 86.8
+REG_LINE: 2
+ 10.7 84.1
+ 10.7 85.9
+REG_LINE: 2
+ 23.1 -34.3
+ 21.6 -33.5
+REG_LINE: 2
+ 20.6 -38.6
+ 19.1 -37.7
+REG_LINE: 2
+ 18.0 -42.6
+ 16.5 -41.7
+REG_LINE: 2
+ 15.2 -46.2
+ 13.8 -45.2
+REG_LINE: 2
+ 12.3 -49.4
+ 10.9 -48.4
+REG_LINE: 2
+ 6.00 -54.5
+ 4.63 -53.5
+REG_LINE: 2
+ 2.59 -56.3
+ 1.25 -55.2
+REG_LINE: 2
+ -1.03 -57.5
+ -2.33 -56.3
+REG_LINE: 2
+ -4.86 -58.0
+ -6.12 -56.8
+REG_LINE: 2
+ -8.94 -57.7
+ -10.1 -56.4
+REG_LINE: 2
+ -17.9 -54.1
+ -19.0 -52.7
+REG_LINE: 2
+ -22.8 -50.3
+ -23.9 -48.9
+REG_LINE: 2
+ -28.1 -44.9
+ -29.0 -43.4
+REG_LINE: 2
+ -33.6 -37.4
+ -34.4 -35.9
+REG_LINE: 2
+ -39.3 -27.4
+ -40.0 -25.8
+REG_LINE: 2
+ -50.1 2.52
+ -50.5 4.22
+REG_LINE: 2
+ -54.3 23.2
+ -54.6 24.9
+REG_LINE: 2
+ -56.8 47.3
+ -56.8 49.1
+REG_LINE: 2
+ -56.8 73.8
+ -56.1 75.5
+REG_LINE: 2
+ -53.9 101.
+ -54.0 98.8
+REG_LINE: 2
+ -41.1 146.
+ -41.7 144.
+REG_LINE: 2
+ -32.8 162.
+ -33.7 161.
+REG_LINE: 2
+ -24.5 175.
+ -25.5 173.
+REG_LINE: 2
+ -16.5 183.
+ -17.6 182.
+REG_LINE: 2
+ -9.06 188.
+ -10.4 187.
+REG_LINE: 2
+ 3.65 193.
+ 2.17 192.
+REG_LINE: 2
+ 9.03 193.
+ 7.49 192.
+REG_LINE: 2
+ 13.8 192.
+ 12.2 192.
+REG_LINE: 2
+ 18.1 190.
+ 16.5 190.
+REG_LINE: 2
+ 22.0 188.
+ 20.3 187.
+REG_LINE: 15
+ 48.1 82.5
+ 51.2 81.6
+ 54.3 80.6
+ 57.3 79.5
+ 60.3 78.3
+ 63.2 77.0
+ 66.0 75.5
+ 68.8 73.9
+ 71.5 72.2
+ 74.1 70.3
+ 76.7 68.3
+ 79.1 66.1
+ 81.5 63.8
+ 83.8 61.3
+ 85.9 58.6
+REG_LINE: 15
+ 48.1 82.5
+ 45.0 83.2
+ 41.8 83.8
+ 38.7 84.4
+ 35.5 84.8
+ 32.2 85.0
+ 29.0 85.2
+ 25.8 85.3
+ 22.5 85.3
+ 19.3 85.1
+ 16.1 84.8
+ 12.9 84.4
+ 9.69 83.9
+ 6.52 83.3
+ 3.39 82.6
+REG_LINE: 15
+ 3.39 82.6
+ .284 81.8
+ -2.78 80.8
+ -5.80 79.7
+ -8.77 78.6
+ -11.7 77.2
+ -14.5 75.8
+ -17.3 74.2
+ -20.1 72.5
+ -22.7 70.7
+ -25.3 68.7
+ -27.8 66.5
+ -30.1 64.2
+ -32.4 61.8
+ -34.6 59.1
+REG_LINE: 15
+ -34.6 59.1
+ -36.7 56.3
+ -38.7 53.3
+ -40.5 50.0
+ -42.2 46.5
+ -43.7 42.7
+ -45.0 38.5
+ -46.2 34.0
+ -47.1 29.1
+ -47.8 23.7
+ -48.2 17.8
+ -48.2 11.1
+ -47.8 3.67
+ -46.7 -4.73
+ -44.9 -14.2
+REG_LINE: 93
+ -44.9 -14.2
+ -42.0 -25.0
+ -37.7 -37.2
+ -31.3 -50.6
+ -22.3 -64.7
+ -21.6 -65.7
+ -20.8 -66.7
+ -20.0 -67.7
+ -19.2 -68.7
+ -18.4 -69.7
+ -17.5 -70.7
+ -16.7 -71.6
+ -15.8 -72.6
+ -14.9 -73.5
+ -14.0 -74.5
+ -13.0 -75.4
+ -12.1 -76.3
+ -11.1 -77.2
+ -10.1 -78.1
+ -9.08 -79.0
+ -8.06 -79.8
+ -7.01 -80.7
+ -5.95 -81.5
+ -4.87 -82.3
+ -3.78 -83.1
+ -2.67 -83.8
+ -1.54 -84.6
+ -.395 -85.3
+ .764 -86.0
+ 1.94 -86.6
+ 3.13 -87.2
+ 4.33 -87.8
+ 5.54 -88.4
+ 6.77 -89.0
+ 8.01 -89.5
+ 9.27 -89.9
+ 10.5 -90.4
+ 11.8 -90.8
+ 13.1 -91.2
+ 14.4 -91.5
+ 15.7 -91.8
+ 17.0 -92.1
+ 18.3 -92.3
+ 19.6 -92.5
+ 20.9 -92.6
+ 22.3 -92.8
+ 23.6 -92.8
+ 24.9 -92.9
+ 26.2 -92.9
+ 27.6 -92.8
+ 28.9 -92.7
+ 30.2 -92.6
+ 31.5 -92.5
+ 32.8 -92.3
+ 34.2 -92.0
+ 35.5 -91.8
+ 36.8 -91.4
+ 38.0 -91.1
+ 39.3 -90.7
+ 40.6 -90.3
+ 41.9 -89.9
+ 43.1 -89.4
+ 44.3 -88.9
+ 45.6 -88.3
+ 46.8 -87.7
+ 48.0 -87.1
+ 49.2 -86.5
+ 50.3 -85.8
+ 51.5 -85.2
+ 52.6 -84.4
+ 53.8 -83.7
+ 54.9 -82.9
+ 56.0 -82.2
+ 57.0 -81.4
+ 58.1 -80.5
+ 59.1 -79.7
+ 60.2 -78.8
+ 61.2 -78.0
+ 62.2 -77.1
+ 63.1 -76.2
+ 64.1 -75.2
+ 65.0 -74.3
+ 65.9 -73.4
+ 66.8 -72.4
+ 67.7 -71.4
+ 68.6 -70.5
+ 69.4 -69.5
+ 70.2 -68.5
+ 71.1 -67.5
+ 80.7 -53.4
+ 87.5 -39.8
+ 92.1 -27.4
+ 95.3 -16.3
+REG_LINE: 15
+ 95.3 -16.3
+ 97.3 -6.55
+ 98.5 2.06
+ 99.1 9.69
+ 99.1 16.5
+ 98.8 22.6
+ 98.2 28.1
+ 97.3 33.1
+ 96.2 37.7
+ 94.9 41.9
+ 93.4 45.7
+ 91.7 49.3
+ 89.9 52.6
+ 88.0 55.7
+ 85.9 58.6
+REG_LINE: 15
+ 85.9 58.6
+ 83.8 61.3
+ 81.5 63.8
+ 79.1 66.1
+ 76.7 68.3
+ 74.1 70.3
+ 71.5 72.2
+ 68.8 73.9
+ 66.0 75.5
+ 63.2 77.0
+ 60.3 78.3
+ 57.3 79.5
+ 54.3 80.6
+ 51.2 81.6
+ 48.1 82.5
+REG_LINE: 15
+ 48.1 82.5
+ 45.0 83.2
+ 41.8 83.8
+ 38.7 84.4
+ 35.5 84.8
+ 32.2 85.0
+ 29.0 85.2
+ 25.8 85.3
+ 22.5 85.3
+ 19.3 85.1
+ 16.1 84.8
+ 12.9 84.4
+ 9.69 83.9
+ 6.52 83.3
+ 3.39 82.6
+REG_LINE: 15
+ 48.1 82.5
+ 45.0 83.2
+ 41.8 83.8
+ 38.7 84.4
+ 35.5 84.8
+ 32.2 85.0
+ 29.0 85.2
+ 25.8 85.3
+ 22.5 85.3
+ 19.3 85.1
+ 16.1 84.8
+ 12.9 84.4
+ 9.69 83.9
+ 6.52 83.3
+ 3.39 82.6
+REG_LINE: 15
+ 25.4 -29.7
+ 24.4 -31.7
+ 23.4 -33.7
+ 22.4 -35.6
+ 21.3 -37.4
+ 20.2 -39.2
+ 19.1 -40.9
+ 18.0 -42.6
+ 16.8 -44.2
+ 15.6 -45.7
+ 14.4 -47.2
+ 13.1 -48.6
+ 11.9 -49.9
+ 10.6 -51.1
+ 9.23 -52.2
+REG_LINE: 15
+ 9.23 -52.2
+ 7.87 -53.3
+ 6.48 -54.2
+ 5.05 -55.1
+ 3.58 -55.9
+ 2.08 -56.5
+ .548 -57.1
+ -1.03 -57.5
+ -2.64 -57.8
+ -4.30 -58.0
+ -6.00 -58.0
+ -7.75 -57.9
+ -9.54 -57.6
+ -11.4 -57.1
+ -13.3 -56.4
+REG_LINE: 15
+ -13.3 -56.4
+ -15.2 -55.6
+ -17.2 -54.5
+ -19.3 -53.2
+ -21.4 -51.6
+ -23.6 -49.7
+ -25.8 -47.5
+ -28.1 -44.9
+ -30.4 -42.0
+ -32.8 -38.6
+ -35.2 -34.8
+ -37.6 -30.5
+ -40.1 -25.7
+ -42.5 -20.3
+ -44.9 -14.2
+REG_LINE: 15
+ -44.9 -14.2
+ -47.2 -7.52
+ -49.4 -.109
+ -51.4 8.02
+ -53.3 16.9
+ -54.8 26.4
+ -56.0 36.6
+ -56.8 47.3
+ -57.1 58.5
+ -56.9 70.0
+ -56.2 81.6
+ -55.0 93.1
+ -53.3 104.
+ -51.0 115.
+ -48.4 125.
+REG_LINE: 15
+ -48.4 125.
+ -45.4 135.
+ -42.2 143.
+ -38.8 151.
+ -35.2 158.
+ -31.6 164.
+ -28.0 170.
+ -24.5 175.
+ -21.0 179.
+ -17.6 182.
+ -14.3 185.
+ -11.1 187.
+Forward matrix value
+ M2 = -0.811474832908671 # Forward matrix value
+ M3 = 0.171224898552328 # Forward matrix value
+ M4 = -0.862236746712233 # Forward matrix value
+ M5 = -0.476686298035564 # Forward matrix value
+ M6 = -0.941127638091139 # Forward matrix value
+ M7 = 0 # Forward matrix value
+ M8 = -0.338051429254475 # Forward matrix value
+ Form = "Full" # Matrix storage form
+ End MatrixMap
+ MapB = # Second component Mapping
+ Begin SphMap # Cartesian to Spherical mapping
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ UntRd = 1 # All input vectors have unit length
+ PlrLg = -2.61046557479594 # Polar longitude (rad.s)
+ End SphMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ End FrameSet
+ Begin FrameSet # Set of inter-related coordinate systems
+# Title = "Pixel coordinates; first pixel at (-100.5,-200.5)" # Title of coordinate system
+# Naxes = 2 # Number of coordinate axes
+# Domain = "POLAR" # Coordinate system domain
+# Lbl1 = "Pixel coordinate 1" # Label for axis 1
+# Lbl2 = "Pixel coordinate 2" # Label for axis 2
+# Uni1 = "pixel" # Units for axis 1
+# Uni2 = "pixel" # Units for axis 2
+ IsA Frame # Coordinate system description
+ Nframe = 2 # Number of Frames in FrameSet
+# Base = 1 # Index of base Frame
+ Currnt = 2 # Index of current Frame
+ Nod1 = 2 # Frame 1 is associated with node 2
+ Nod2 = 1 # Frame 2 is associated with node 1
+ Lnk2 = 1 # Node 2 is derived from node 1
+ Frm1 = # Frame number 1
+ Begin Frame # Coordinate system description
+ Title = "Data grid indices; first pixel at (1,1) " # Title of coordinate system
+ Naxes = 2 # Number of coordinate axes
+ Domain = "GRID" # Coordinate system domain
+# Lbl1 = "Data grid index 1" # Label for axis 1
+# Lbl2 = "Data grid index 2" # Label for axis 2
+# Uni1 = "pixel" # Units for axis 1
+# Uni2 = "pixel" # Units for axis 2
+ Ax1 = # Axis number 1
+ Begin Axis # Coordinate axis
+ Label = "Data grid index 1" # Axis Label
+ Symbol = "g1" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ Ax2 = # Axis number 2
+ Begin Axis # Coordinate axis
+ Label = "Data grid index 2" # Axis Label
+ Symbol = "g2" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ End Frame
+ Frm2 = # Frame number 2
+ Begin Frame # Coordinate system description
+ Title = "Pixel coordinates; first pixel at (-100.5,-200.5)" # Title of coordinate system
+ Naxes = 2 # Number of coordinate axes
+ Domain = "POLAR" # Coordinate system domain
+# Lbl1 = "Pixel coordinate 1" # Label for axis 1
+# Lbl2 = "Pixel coordinate 2" # Label for axis 2
+# Uni1 = "pixel" # Units for axis 1
+# Uni2 = "pixel" # Units for axis 2
+ Ax1 = # Axis number 1
+ Begin Axis # Coordinate axis
+ Label = "Pixel coordinate 1" # Axis Label
+ -8.06 189.
+ -5.15 190.
+ -2.36 192.
+REG_LINE: 15
+ -2.36 192.
+ .299 192.
+ 2.83 193.
+ 5.25 193.
+ 7.56 193.
+ 9.75 193.
+ 11.8 193.
+ 13.8 192.
+ 15.7 192.
+ 17.6 191.
+ 19.3 190.
+ 20.9 189.
+ 22.5 188.
+ 24.0 186.
+ 25.4 185.
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '180'
+ 47.5 80.0 TC .248 .969
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '240'
+ 4.00 80.2 TC -.245 .969
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '300'
+ -32.7 57.6 TC -.786 .618
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '0'
+ -42.4 -13.7 BC .976 .217
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '60'
+ 92.9 -15.7 BC -.971 .241
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '120'
+ 84.0 57.1 TC .798 .602
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '-90'
+ 27.7 -30.8 TC -.899 .438
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '-60'
+ 10.8 -54.2 TC -.629 .777
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '-30'
+ -14.2 -58.8 TC .374 .927
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '0'
+ -47.2 -15.1 TC .937 .350
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '30'
+ -50.8 126. BC -.960 .278
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '60'
+ -3.21 194. BC -.341 .940
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '90'
+ 27.2 187. BC .711 .704
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 1
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: ' A FITS test'
+ 31.5 225. BC .000 1.00
+
+
+
+
+ FITS test number 2
+ ====================
+
+
+
+AST_SHOW:
+
+REG_SINK:
+COMMENT AST ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+AST
+COMMENT AST Beginning of AST data for FrameSet object
+AST
+COMMENT AST ................................................................
+AST
+COMMENT AST ................................................................
+AST
+COMMENT AST End of AST data for FrameSet object
+AST
+COMMENT AST ----------------------------------------------------------------
+
+Objects written: 1
+
+Native Encoding:
+
+COMMENT AST ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ AST
+COMMENT AST WCS information in AST format AST
+COMMENT AST See http://www.starlink.ac.uk/ast/ AST
+COMMENT AST Beginning of AST data for FrameSet object AST
+COMMENT AST ................................................................ AST
+BEGAST_A= 'FrameSet' / Set of inter-related coordinate systems
+NFRAME_A= 2 / Number of Frames in FrameSet
+CURRNT_A= 2 / Index of current Frame
+NOD1_A = 2 / Frame 1 is associated with node 2
+NOD2_A = 1 / Frame 2 is associated with node 1
+LNK2_A = 1 / Node 2 is derived from node 1
+FRM1_A = ' ' / Frame number 1
+BEGAST_B= 'Frame ' / Coordinate system description
+TITLE_A = 'Data grid indices; first pixel at (1&'/ Title of coordinate system
+CONTINUE '",1) "'
+NAXES_A = 2 / Number of coordinate axes
+DOMAIN_A= 'GRID ' / Coordinate system domain
+AX1_A = ' ' / Axis number 1
+BEGAST_C= 'Axis ' / Coordinate axis
+LABEL_A = 'Data grid index 1' / Axis Label
+SYMBOL_A= 'g1 ' / Axis symbol
+UNIT_A = 'pixel ' / Axis units
+FORMAT_A= '%3.1f ' / Format specifier
+ENDAST_A= 'Axis ' / End of object definition
+AX2_A = ' ' / Axis number 2
+BEGAST_D= 'Axis ' / Coordinate axis
+LABEL_B = 'Data grid index 2' / Axis Label
+SYMBOL_B= 'g2 ' / Axis symbol
+UNIT_B = 'pixel ' / Axis units
+FORMAT_B= '%3.1f ' / Format specifier
+ENDAST_B= 'Axis ' / End of object definition
+ENDAST_C= 'Frame ' / End of object definition
+FRM2_A = ' ' / Frame number 2
+BEGAST_E= 'Frame ' / Coordinate system description
+TITLE_B = 'Pixel coordinates; first pixel at (-&'/ Title of coordinate system
+CONTINUE '100.5,-200.5)'
+NAXES_B = 2 / Number of coordinate axes
+DOMAIN_B= 'POLAR ' / Coordinate system domain
+AX1_B = ' ' / Axis number 1
+BEGAST_F= 'Axis ' / Coordinate axis
+LABEL_C = 'Pixel coordinate 1' / Axis Label
+SYMBOL_C= 'p1 ' / Axis symbol
+UNIT_C = 'pixel ' / Axis units
+FORMAT_C= '%3.1f ' / Format specifier
+ENDAST_D= 'Axis ' / End of object definition
+AX2_B = ' ' / Axis number 2
+BEGAST_G= 'Axis ' / Coordinate axis
+LABEL_D = 'Pixel coordinate 2' / Axis Label
+SYMBOL_D= 'p2 ' / Axis symbol
+UNIT_D = 'pixel ' / Axis units
+FORMAT_D= '%3.1f ' / Format specifier
+ENDAST_E= 'Axis ' / End of object definition
+ENDAST_F= 'Frame ' / End of object definition
+MAP2_A = ' ' / Mapping between nodes 1 and 2
+BEGAST_H= 'CmpMap ' / Compound Mapping
+NIN_A = 2 / Number of input coordinates
+ISA_A = 'Mapping ' / Mapping between coordinate systems
+INVA_A = 1 / First Mapping used in inverse direction
+INVB_A = 1 / Second Mapping used in inverse direction
+MAPA_A = ' ' / First component Mapping
+BEGAST_I= 'MathMap ' / Transformation using mathematical functions
+NIN_B = 2 / Number of input coordinates
+INVERT_A= 0 / Mapping not inverted
+ISA_B = 'Mapping ' / Mapping between coordinate systems
+FWD1_A = 'r=sqrt(x*x+y*y)' / Forward function 1
+FWD2_A = 'theta=atan2(y,x)' / Forward function 2
+INV1_A = 'x=r*cos(theta)' / Inverse function 1
+INV2_A = 'y=r*sin(theta)' / Inverse function 2
+SIMPFI_A= 1 / Forward-inverse pairs may simplify
+SIMPIF_A= 1 / Inverse-forward pairs may simplify
+ENDAST_G= 'MathMap ' / End of object definition
+MAPB_A = ' ' / Second component Mapping
+BEGAST_J= 'WinMap ' / Map one window on to another
+NIN_C = 2 / Number of input coordinates
+INVERT_B= 0 / Mapping not inverted
+ISA_C = 'Mapping ' / Mapping between coordinate systems
+SFT1_A = -101.5 / Shift for axis 1
+SFT2_A = -201.5 / Shift for axis 2
+ENDAST_H= 'WinMap ' / End of object definition
+ENDAST_I= 'CmpMap ' / End of object definition
+ENDAST_J= 'FrameSet' / End of object definition
+COMMENT AST ................................................................ AST
+COMMENT AST End of AST data for FrameSet object AST
+COMMENT AST ---------------------------------------------------------------- AST
+
+ATTRIBUTES:
+ Colour(axis1) : 1
+ Font(Stri) : 1
+ Nout : 1
+ Class : 4
+ Tol : 0.100000E-01
+ Gap(1) : 50.0000
+ Border : 0
+ Invert : 0
+ TextLabGap : 0.100000E-01
+ Nin : 2
+ Current : 3
+ Base : 1
+ Nobject : 1
+ RefCOUNT : 1
+
+AST_GRID:
+REG_LINE: 197
+ 10.8 124.
+ 10.7 123.
+ 10.5 122.
+ 10.3 121.
+ 10.2 120.
+ 10.1 119.
+ 10.0 118.
+ 9.94 117.
+ 9.89 116.
+ 9.85 115.
+ 9.84 113.
+ 9.85 112.
+ 9.88 111.
+ 9.93 110.
+ 10.0 109.
+ 10.1 108.
+ 10.2 107.
+ 10.3 106.
+ 10.5 105.
+ 10.6 104.
+ 10.8 103.
+ 11.0 102.
+ 11.2 100.
+ 11.5 99.5
+ 11.7 98.5
+ 12.0 97.5
+ 12.3 96.6
+ 12.6 95.6
+ 13.0 94.7
+ 13.3 93.9
+ 13.7 93.0
+ 14.0 92.2
+ 14.4 91.4
+ 14.8 90.6
+ 15.2 89.8
+ 15.7 89.1
+ 16.1 88.4
+ 16.5 87.8
+ 17.0 87.2
+ 17.5 86.6
+ 18.0 86.0
+ 18.5 85.5
+ 19.0 85.0
+ 19.5 84.6
+ 20.0 84.2
+ 20.5 83.8
+ 21.1 83.5
+ 21.6 83.2
+ 22.1 82.9
+ 22.7 82.7
+ 23.2 82.5
+ 23.8 82.4
+ 24.3 82.3
+ 24.9 82.2
+ 25.5 82.2
+ 26.0 82.2
+ 26.6 82.3
+ 27.1 82.4
+ 27.7 82.5
+ 28.2 82.7
+ 28.8 82.9
+ 29.3 83.2
+ 29.9 83.4
+ 30.4 83.8
+ 30.9 84.2
+ 31.4 84.6
+ 32.0 85.0
+ 32.5 85.5
+ 33.0 86.0
+ 33.4 86.6
+ 33.9 87.1
+ 34.4 87.8
+ 34.8 88.4
+ 35.3 89.1
+ 35.7 89.8
+ 36.1 90.6
+ 36.5 91.3
+ 36.9 92.1
+ 37.3 93.0
+ 37.6 93.8
+ 38.0 94.7
+ 38.3 95.6
+ 38.6 96.5
+ 38.9 97.5
+ 39.2 98.5
+ 39.4 99.4
+ 39.7 100.
+ 39.9 101.
+ 40.1 103.
+ 40.3 104.
+ 40.5 105.
+ 40.6 106.
+ 40.7 107.
+ 40.8 108.
+ 40.9 109.
+ 41.0 110.
+ 41.1 111.
+ 41.1 112.
+ 41.1 113.
+ 41.1 115.
+ 41.1 116.
+ 41.0 117.
+ 40.9 118.
+ 40.8 119.
+ 40.7 120.
+ 40.6 121.
+ 40.5 122.
+ 40.3 123.
+ 40.1 124.
+ 39.9 125.
+ 39.7 126.
+ 39.4 127.
+ 39.2 128.
+ 38.9 129.
+ 38.6 130.
+ 38.3 131.
+ 38.0 132.
+ 37.6 133.
+ 37.3 134.
+ 36.9 135.
+ 36.5 136.
+ 36.1 136.
+ 35.7 137.
+ 35.3 138.
+ 34.8 138.
+ 34.4 139.
+ 33.9 140.
+ 33.4 140.
+ 33.0 141.
+ 32.5 141.
+ 32.0 142.
+ 31.4 142.
+ 30.9 143.
+ 30.4 143.
+ 29.9 143.
+ 29.3 144.
+ 28.8 144.
+ 28.2 144.
+ 27.7 144.
+ 27.1 145.
+ 26.6 145.
+ 26.0 145.
+ 25.5 145.
+ 24.9 145.
+ 24.3 145.
+ 23.8 145.
+ 23.2 144.
+ 22.7 144.
+ 22.1 144.
+ 21.6 144.
+ 21.1 143.
+ 20.5 143.
+ 20.0 143.
+ 19.5 142.
+ 19.0 142.
+ 18.5 141.
+ 18.0 141.
+ 17.5 140.
+ 17.0 140.
+ 16.5 139.
+ 16.1 138.
+ 15.7 138.
+ 15.2 137.
+ 14.8 136.
+ 14.4 136.
+ 14.0 135.
+ 13.7 134.
+ 13.3 133.
+ 13.0 132.
+ 12.6 131.
+ 12.3 130.
+ 12.0 129.
+ 11.7 128.
+ 11.5 127.
+ 11.2 126.
+ 11.0 125.
+ 10.8 124.
+ 10.6 123.
+ 10.5 122.
+ 10.3 121.
+ 10.2 120.
+ 10.1 119.
+ 10.0 118.
+ 9.93 117.
+ 9.88 116.
+ 9.85 115.
+ 9.84 113.
+ 9.85 112.
+ 9.89 111.
+ 9.94 110.
+ 10.0 109.
+ 10.1 108.
+ 10.2 107.
+ 10.3 106.
+ 10.5 105.
+ 10.7 104.
+ 10.8 102.
+REG_LINE: 197
+ -3.80 135.
+ -4.17 133.
+ -4.50 131.
+ -4.80 129.
+ -5.06 127.
+ -5.28 125.
+ -5.46 122.
+ -5.60 120.
+ -5.70 118.
+ -5.76 116.
+ -5.78 114.
+ -5.76 111.
+ -5.70 109.
+ -5.61 107.
+ -5.47 105.
+ -5.29 102.
+ -5.07 100.
+ -4.82 98.1
+ -4.53 95.9
+ -4.19 93.8
+ -3.82 91.7
+ -3.42 89.6
+ -2.97 87.5
+ -2.49 85.5
+ -1.97 83.5
+ -1.42 81.6
+ -.838 79.7
+ -.219 77.8
+ .433 76.0
+ 1.12 74.3
+ 1.83 72.6
+ 2.58 70.9
+ 3.35 69.3
+ 4.15 67.7
+ 4.98 66.2
+ 5.84 64.8
+ 6.72 63.4
+ 7.62 62.1
+ 8.55 60.9
+ 9.50 59.7
+ 10.5 58.6
+ 11.5 57.6
+ 12.5 56.6
+ 13.5 55.7
+ 14.5 54.9
+ 15.6 54.2
+ 16.6 53.5
+ 17.7 52.9
+ 18.8 52.4
+ 19.9 51.9
+ 21.0 51.6
+ 22.1 51.3
+ 23.2 51.1
+ 24.3 51.0
+ 25.4 50.9
+ 26.6 51.0
+ 27.7 51.1
+ 28.8 51.3
+ 29.9 51.6
+ 31.0 51.9
+ 32.1 52.4
+ 33.2 52.9
+ 34.3 53.5
+ 35.3 54.1
+ 36.4 54.9
+ 37.4 55.7
+ 38.4 56.6
+ 39.4 57.5
+ 40.4 58.6
+ 41.4 59.7
+ 42.4 60.8
+ 43.3 62.1
+ 44.2 63.4
+ 45.1 64.8
+ 45.9 66.2
+ 46.8 67.7
+ 47.6 69.2
+ 48.3 70.8
+ 49.1 72.5
+ 49.8 74.2
+ 50.5 76.0
+ 51.1 77.8
+ 51.8 79.6
+ 52.3 81.5
+ 52.9 83.5
+ 53.4 85.5
+ 53.9 87.5
+ 54.3 89.5
+ 54.7 91.6
+ 55.1 93.7
+ 55.5 95.8
+ 55.7 98.0
+ 56.0 100.
+ 56.2 102.
+ 56.4 105.
+ 56.5 107.
+ 56.6 109.
+ 56.7 111.
+ 56.7 113.
+ 56.7 116.
+ 56.6 118.
+ 56.5 120.
+ 56.4 122.
+ 56.2 125.
+ 56.0 127.
+ 55.7 129.
+ 55.5 131.
+ 55.1 133.
+ 54.7 135.
+ 54.3 137.
+ 53.9 139.
+ 53.4 141.
+ 52.9 143.
+ 52.3 145.
+ 51.8 147.
+ 51.1 149.
+ 50.5 151.
+ 49.8 153.
+ 49.1 154.
+ 48.3 156.
+ 47.6 158.
+ 46.8 159.
+ 45.9 161.
+ 45.1 162.
+ 44.2 163.
+ 43.3 165.
+ 42.4 166.
+ 41.4 167.
+ 40.4 168.
+ 39.4 169.
+ 38.4 170.
+ 37.4 171.
+ 36.4 172.
+ 35.3 173.
+ 34.3 173.
+ 33.2 174.
+ 32.1 175.
+ 31.0 175.
+ 29.9 175.
+ 28.8 176.
+ 27.7 176.
+ 26.6 176.
+ 25.4 176.
+ 24.3 176.
+ 23.2 176.
+ 22.1 176.
+ 21.0 175.
+ 19.9 175.
+ 18.8 174.
+ 17.7 174.
+ 16.6 173.
+ 15.6 173.
+ 14.5 172.
+ 13.5 171.
+ 12.5 170.
+ 11.5 169.
+ 10.5 168.
+ 9.50 167.
+ 8.55 166.
+ 7.62 165.
+ 6.72 163.
+ 5.84 162.
+ 4.98 161.
+ 4.15 159.
+ 3.35 158.
+ 2.58 156.
+ 1.83 154.
+ 1.12 153.
+ .433 151.
+ -.219 149.
+ -.838 147.
+ -1.42 145.
+ -1.97 143.
+ -2.49 141.
+ -2.97 139.
+ -3.42 137.
+ -3.82 135.
+ -4.19 133.
+ -4.53 131.
+ -4.82 129.
+ -5.07 127.
+ -5.29 124.
+ -5.47 122.
+ -5.61 120.
+ -5.70 118.
+ -5.76 116.
+ -5.78 113.
+ -5.76 111.
+ -5.70 109.
+ -5.60 107.
+ -5.46 104.
+ -5.28 102.
+ -5.06 100.
+ -4.80 97.9
+ -4.50 95.7
+ -4.17 93.6
+ -3.80 91.5
+REG_LINE: 197
+ -18.4 146.
+ -19.0 143.
+ -19.5 140.
+ -19.9 137.
+ -20.3 133.
+ -20.7 130.
+ -20.9 127.
+ -21.1 124.
+ -21.3 120.
+ -21.4 117.
+ -21.4 114.
+ -21.4 110.
+ -21.3 107.
+ -21.1 104.
+ -20.9 100.
+ -20.7 96.9
+ -20.3 93.6
+ -20.0 90.4
+ -19.5 87.1
+ -19.0 83.9
+ -18.5 80.8
+ -17.9 77.7
+ -17.2 74.6
+ -16.5 71.6
+ -15.7 68.6
+ -14.9 65.7
+ -14.0 62.8
+ -13.1 60.0
+ -12.1 57.3
+ -11.1 54.7
+ -9.99 52.1
+ -8.87 49.6
+ -7.71 47.2
+ -6.50 44.9
+ -5.26 42.6
+ -3.98 40.5
+ -2.66 38.4
+ -1.30 36.5
+ 0.922E-01 34.6
+ 1.52 32.9
+ 2.97 31.2
+ 4.45 29.6
+ 5.96 28.2
+ 7.50 26.9
+ 9.05 25.6
+ 10.6 24.5
+ 12.2 23.5
+ 13.8 22.6
+ 15.5 21.8
+ 17.1 21.2
+ 18.8 20.7
+ 20.4 20.2
+ 22.1 19.9
+ 23.8 19.7
+ 25.4 19.7
+ 27.1 19.7
+ 28.8 19.9
+ 30.5 20.2
+ 32.1 20.6
+ 33.8 21.2
+ 35.4 21.8
+ 37.0 22.6
+ 38.7 23.5
+ 40.2 24.5
+ 41.8 25.6
+ 43.4 26.8
+ 44.9 28.1
+ 46.4 29.6
+ 47.9 31.1
+ 49.4 32.8
+ 50.8 34.5
+ 52.2 36.4
+ 53.5 38.4
+ 54.9 40.4
+ 56.2 42.6
+ 57.4 44.8
+ 58.6 47.1
+ 59.8 49.5
+ 60.9 52.0
+ 62.0 54.6
+ 63.0 57.2
+ 64.0 60.0
+ 64.9 62.7
+ 65.8 65.6
+ 66.6 68.5
+ 67.4 71.5
+ 68.1 74.5
+ 68.8 77.5
+ 69.4 80.7
+ 69.9 83.8
+ 70.4 87.0
+ 70.9 90.2
+ 71.3 93.5
+ 71.6 96.8
+ 71.9 100.
+ 72.1 103.
+ 72.2 107.
+ 72.3 110.
+ 72.3 113.
+ 72.3 117.
+ 72.2 120.
+ 72.1 123.
+ 71.9 127.
+ 71.6 130.
+ 71.3 133.
+ 70.9 137.
+ 70.4 140.
+ 69.9 143.
+ 69.4 146.
+ 68.8 149.
+ 68.1 152.
+ 67.4 155.
+ 66.6 158.
+ 65.8 161.
+ 64.9 164.
+ 64.0 167.
+ 63.0 170.
+ 62.0 172.
+ 60.9 175.
+ 59.8 177.
+ 58.6 180.
+ 57.4 182.
+ 56.2 184.
+ 54.9 186.
+ 53.5 189.
+ 52.2 190.
+ 50.8 192.
+ 49.4 194.
+ 47.9 196.
+ 46.4 197.
+ 44.9 199.
+ 43.4 200.
+ 41.8 201.
+ 40.2 202.
+ 38.7 203.
+ 37.0 204.
+ 35.4 205.
+ 33.8 206.
+ 32.1 206.
+ 30.5 207.
+ 28.8 207.
+ 27.1 207.
+ 25.4 207.
+ 23.8 207.
+ 22.1 207.
+ 20.4 207.
+ 18.8 206.
+ 17.1 206.
+ 15.5 205.
+ 13.8 204.
+ 12.2 203.
+ 10.6 202.
+ 9.05 201.
+ 7.50 200.
+ 5.96 199.
+ 4.45 197.
+ 2.97 196.
+ 1.52 194.
+ 0.922E-01 192.
+ -1.30 190.
+ -2.66 188.
+ -3.98 186.
+ -5.26 184.
+ -6.50 182.
+ -7.71 180.
+ -8.87 177.
+ -9.99 175.
+ -11.1 172.
+ -12.1 170.
+ -13.1 167.
+ -14.0 164.
+ -14.9 161.
+ -15.7 158.
+ -16.5 155.
+ -17.2 152.
+ -17.9 149.
+ -18.5 146.
+ -19.0 143.
+ -19.5 140.
+ -20.0 137.
+ -20.3 133.
+ -20.7 130.
+ -20.9 127.
+ -21.1 123.
+ -21.3 120.
+ -21.4 117.
+ -21.4 113.
+ -21.4 110.
+ -21.3 107.
+ -21.1 103.
+ -20.9 100.
+ -20.7 96.7
+ -20.3 93.4
+ -19.9 90.1
+ -19.5 86.9
+ -19.0 83.7
+ -18.4 80.6
+REG_LINE: 197
+ -33.1 157.
+ -33.8 153.
+ -34.5 149.
+ -35.1 145.
+ -35.6 140.
+ -36.0 136.
+ -36.4 131.
+ -36.7 127.
+ -36.9 123.
+ -37.0 118.
+ -37.0 114.
+ -37.0 109.
+ -36.9 105.
+ -36.7 100.
+ -36.4 95.8
+ -36.1 91.4
+ -35.6 87.0
+ -35.1 82.7
+ -34.5 78.4
+ -33.9 74.1
+ -33.1 69.9
+ -32.3 65.7
+ -31.4 61.6
+ -30.5 57.6
+ -29.4 53.6
+ -28.3 49.8
+ -27.1 46.0
+ -25.9 42.3
+ -24.6 38.6
+ -23.2 35.1
+ -21.8 31.7
+ -20.3 28.3
+ -18.8 25.1
+ -17.2 22.0
+ -15.5 19.0
+ -13.8 16.2
+ -12.0 13.4
+ -10.2 10.8
+ -8.37 8.34
+ -6.47 5.99
+ -4.53 3.78
+ -2.55 1.71
+ -.540 -.225
+ 1.51 -2.01
+ 3.58 -3.65
+ 5.69 -5.14
+ 7.82 -6.47
+ 9.97 -7.66
+ 12.1 -8.69
+ 14.3 -9.56
+ 16.5 -10.3
+ 18.7 -10.8
+ 21.0 -11.2
+ 23.2 -11.5
+ 25.4 -11.6
+ 27.7 -11.5
+ 29.9 -11.2
+ 32.1 -10.9
+ 34.3 -10.3
+ 36.5 -9.59
+ 38.7 -8.72
+ 40.9 -7.70
+ 43.0 -6.52
+ 45.2 -5.19
+ 47.3 -3.70
+ 49.4 -2.07
+ 51.4 -.290
+ 53.4 1.63
+ 55.4 3.70
+ 57.3 5.91
+ 59.2 8.25
+ 61.1 10.7
+ 62.9 13.3
+ 64.7 16.1
+ 66.4 18.9
+ 68.0 21.9
+ 69.6 25.0
+ 71.2 28.2
+ 72.7 31.6
+ 74.1 35.0
+ 75.5 38.5
+ 76.8 42.1
+ 78.0 45.8
+ 79.2 49.6
+ 80.3 53.5
+ 81.4 57.5
+ 82.3 61.5
+ 83.2 65.6
+ 84.0 69.7
+ 84.8 73.9
+ 85.4 78.2
+ 86.0 82.5
+ 86.5 86.9
+ 87.0 91.2
+ 87.3 95.6
+ 87.6 100.
+ 87.8 105.
+ 87.9 109.
+ 88.0 113.
+ 87.9 118.
+ 87.8 122.
+ 87.6 127.
+ 87.3 131.
+ 87.0 136.
+ 86.5 140.
+ 86.0 144.
+ 85.4 149.
+ 84.8 153.
+ 84.0 157.
+ 83.2 161.
+ 82.3 165.
+ 81.4 169.
+ 80.3 173.
+ 79.2 177.
+ 78.0 181.
+ 76.8 185.
+ 75.5 188.
+ 74.1 192.
+ 72.7 195.
+ 71.2 199.
+ 69.6 202.
+ 68.0 205.
+ 66.4 208.
+ 64.7 211.
+ 62.9 214.
+ 61.1 216.
+ 59.2 219.
+ 57.3 221.
+ 55.4 223.
+ 53.4 225.
+ 51.4 227.
+ 49.4 229.
+ 47.3 231.
+ 45.2 232.
+ 43.0 233.
+ 40.9 235.
+ 38.7 236.
+ 36.5 236.
+ 34.3 237.
+ 32.1 238.
+ 29.9 238.
+ 27.7 238.
+ 25.4 238.
+ 23.2 238.
+ 21.0 238.
+ 18.7 238.
+ 16.5 237.
+ 14.3 236.
+ 12.1 236.
+ 9.97 235.
+ 7.82 233.
+ 5.69 232.
+ 3.58 231.
+ 1.51 229.
+ -.540 227.
+ -2.55 225.
+ -4.53 223.
+ -6.47 221.
+ -8.37 219.
+ -10.2 216.
+ -12.0 213.
+ -13.8 211.
+ -15.5 208.
+ -17.2 205.
+ -18.8 202.
+ -20.3 199.
+ -21.8 195.
+ -23.2 192.
+ -24.6 188.
+ -25.9 185.
+ -27.1 181.
+ -28.3 177.
+ -29.4 173.
+ -30.5 169.
+ -31.4 165.
+ -32.3 161.
+ -33.1 157.
+ -33.9 153.
+ -34.5 149.
+ -35.1 144.
+ -35.6 140.
+ -36.1 135.
+ -36.4 131.
+ -36.7 127.
+ -36.9 122.
+ -37.0 118.
+ -37.0 113.
+ -37.0 109.
+ -36.9 104.
+ -36.7 99.9
+ -36.4 95.5
+ -36.0 91.1
+ -35.6 86.7
+ -35.1 82.4
+ -34.5 78.1
+ -33.8 73.8
+ -33.1 69.6
+REG_LINE: 197
+ -47.7 168.
+ -48.6 163.
+ -49.5 158.
+ -50.2 152.
+ -50.8 147.
+ -51.4 141.
+ -51.8 136.
+ -52.2 130.
+ -52.4 125.
+ -52.6 119.
+ -52.7 114.
+ -52.6 108.
+ -52.5 102.
+ -52.2 96.9
+ -51.9 91.4
+ -51.4 85.9
+ -50.9 80.4
+ -50.3 75.0
+ -49.5 69.6
+ -48.7 64.3
+ -47.8 59.0
+ -46.7 53.8
+ -45.6 48.7
+ -44.4 43.6
+ -43.1 38.7
+ -41.8 33.8
+ -40.3 29.1
+ -38.8 24.5
+ -37.1 19.9
+ -35.4 15.5
+ -33.6 11.2
+ -31.8 7.08
+ -29.8 3.06
+ -27.8 -.822
+ -25.7 -4.55
+ -23.6 -8.14
+ -21.4 -11.6
+ -19.1 -14.8
+ -16.8 -17.9
+ -14.5 -20.9
+ -12.0 -23.6
+ -9.56 -26.2
+ -7.04 -28.6
+ -4.49 -30.9
+ -1.89 -32.9
+ .740 -34.8
+ 3.40 -36.5
+ 6.09 -37.9
+ 8.81 -39.2
+ 11.5 -40.3
+ 14.3 -41.2
+ 17.1 -41.9
+ 19.8 -42.4
+ 22.6 -42.7
+ 25.4 -42.8
+ 28.2 -42.7
+ 31.0 -42.4
+ 33.8 -41.9
+ 36.5 -41.2
+ 39.3 -40.3
+ 42.0 -39.3
+ 44.7 -38.0
+ 47.4 -36.5
+ 50.1 -34.8
+ 52.7 -33.0
+ 55.3 -30.9
+ 57.9 -28.7
+ 60.4 -26.3
+ 62.9 -23.7
+ 65.3 -21.0
+ 67.7 -18.0
+ 70.0 -14.9
+ 72.3 -11.7
+ 74.5 -8.26
+ 76.6 -4.68
+ 78.7 -.956
+ 80.7 2.92
+ 82.6 6.93
+ 84.5 11.1
+ 86.3 15.4
+ 88.0 19.8
+ 89.6 24.3
+ 91.2 28.9
+ 92.6 33.7
+ 94.0 38.5
+ 95.3 43.5
+ 96.5 48.5
+ 97.6 53.6
+ 98.7 58.8
+ 99.6 64.1
+ 100. 69.4
+ 101. 74.8
+ 102. 80.2
+ 102. 85.7
+ 103. 91.2
+ 103. 96.7
+ 103. 102.
+ 104. 108.
+ 104. 113.
+ 104. 119.
+ 103. 125.
+ 103. 130.
+ 103. 136.
+ 102. 141.
+ 102. 147.
+ 101. 152.
+ 100. 157.
+ 99.6 163.
+ 98.7 168.
+ 97.6 173.
+ 96.5 178.
+ 95.3 183.
+ 94.0 188.
+ 92.6 193.
+ 91.2 198.
+ 89.6 203.
+ 88.0 207.
+ 86.3 212.
+ 84.5 216.
+ 82.6 220.
+ 80.7 224.
+ 78.7 228.
+ 76.6 232.
+ 74.5 235.
+ 72.3 239.
+ 70.0 242.
+ 67.7 245.
+ 65.3 248.
+ 62.9 251.
+ 60.4 253.
+ 57.9 256.
+ 55.3 258.
+ 52.7 260.
+ 50.1 262.
+ 47.4 263.
+ 44.7 265.
+ 42.0 266.
+ 39.3 267.
+ 36.5 268.
+ 33.8 269.
+ 31.0 269.
+ 28.2 270.
+ 25.4 270.
+ 22.6 270.
+ 19.8 269.
+ 17.1 269.
+ 14.3 268.
+ 11.5 267.
+ 8.81 266.
+ 6.09 265.
+ 3.40 263.
+ .740 262.
+ -1.89 260.
+ -4.49 258.
+ -7.04 256.
+ -9.56 253.
+ -12.0 251.
+ -14.5 248.
+ -16.8 245.
+ -19.1 242.
+ -21.4 238.
+ -23.6 235.
+ -25.7 231.
+ -27.8 228.
+ -29.8 224.
+ -31.8 220.
+ -33.6 216.
+ -35.4 211.
+ -37.1 207.
+ -38.8 202.
+ -40.3 198.
+ -41.8 193.
+ -43.1 188.
+ -44.4 183.
+ -45.6 178.
+ -46.7 173.
+ -47.8 168.
+ -48.7 163.
+ -49.5 157.
+ -50.3 152.
+ -50.9 146.
+ -51.4 141.
+ -51.9 135.
+ -52.2 130.
+ -52.5 124.
+ -52.6 119.
+ -52.7 113.
+ -52.6 108.
+ -52.4 102.
+ -52.2 96.5
+ -51.8 91.0
+ -51.4 85.5
+ -50.8 80.0
+ -50.2 74.6
+ -49.5 69.2
+ -48.6 63.9
+ -47.7 58.6
+REG_LINE: 141
+ -62.3 179.
+ -63.4 173.
+ -64.4 167.
+ -65.3 160.
+ -66.1 154.
+ -66.8 147.
+ -67.3 140.
+ -67.7 134.
+ -68.0 127.
+ -68.2 120.
+ -68.3 114.
+ -68.2 107.
+ -68.1 100.
+ -67.8 93.6
+ -67.3 87.0
+ -66.8 80.4
+ -66.2 73.8
+ -65.4 67.3
+ -64.5 60.8
+ -63.5 54.4
+ -62.4 48.1
+ -61.2 41.9
+ -59.9 35.7
+ -58.4 29.7
+ -56.9 23.8
+ -55.2 17.9
+ -53.5 12.2
+ -51.6 6.66
+ -49.6 1.22
+ -47.6 -4.07
+ -45.4 -9.21
+ -43.2 -14.2
+ -40.9 -19.0
+ -38.5 -23.7
+ -36.0 -28.2
+ -33.4 -32.5
+ -30.8 -36.6
+ -28.1 -40.5
+ -25.3 -44.2
+ -22.4 -47.7
+ -19.5 -51.1
+ -16.6 -54.2
+ -13.5 -57.1
+ -10.5 -59.7
+ -7.36 -62.2
+ -4.21 -64.4
+ -1.01 -66.4
+ 2.22 -68.2
+ 5.47 -69.7
+ 8.76 -71.1
+ 12.1 -72.1
+ 15.4 -73.0
+ 18.7 -73.6
+ 22.1 -73.9
+ 25.4 -74.1
+ 28.8 -73.9
+ 32.1 -73.6
+ 35.4 -73.0
+ 38.8 -72.2
+ 42.1 -71.1
+ 45.3 -69.8
+ 48.6 -68.3
+ 51.8 -66.5
+ 55.0 -64.5
+ 58.2 -62.3
+ 61.3 -59.8
+ 64.4 -57.2
+ 67.4 -54.3
+ 70.4 -51.2
+ 73.3 -47.9
+ 76.1 -44.3
+ 78.9 -40.6
+ 81.6 -36.7
+ 84.3 -32.6
+ 86.8 -28.3
+ 89.3 -23.8
+ 91.7 -19.2
+ 94.1 -14.4
+ 96.3 -9.39
+ 98.5 -4.25
+ 101. 1.03
+ 102. 6.46
+ 104. 12.0
+ 106. 17.7
+ 108. 23.5
+ 109. 29.5
+ 111. 35.5
+ 112. 41.7
+ 113. 47.9
+ 114. 54.2
+ 115. 60.6
+ 116. 67.0
+ 117. 73.6
+ 118. 80.1
+ 118. 86.7
+ 119. 93.4
+ 119. 100.
+ 119. 107.
+ 119. 113.
+ 119. 120.
+ 119. 127.
+ 119. 133.
+ 118. 140.
+ 118. 147.
+ 117. 153.
+ 116. 160.
+ 115. 166.
+ 114. 173.
+ 113. 179.
+ 112. 185.
+ 111. 191.
+ 109. 197.
+ 108. 203.
+ 106. 209.
+ 104. 215.
+ 102. 220.
+ 101. 226.
+ 98.5 231.
+ 96.3 236.
+ 94.1 241.
+ 91.7 246.
+ 89.3 251.
+ 86.8 255.
+ 84.3 259.
+ 81.6 264.
+ 78.9 267.
+ 76.1 271.
+ 73.3 275.
+ 70.4 278.
+ 67.4 281.
+ 64.4 284.
+ 61.3 287.
+ 58.2 289.
+ 55.0 291.
+ 51.8 293.
+ 48.6 295.
+ 45.3 297.
+ 42.1 298.
+ 38.8 299.
+ 35.4 300.
+ 34.7 300.
+REG_LINE: 53
+ 16.2 300.
+ 15.4 300.
+ 12.1 299.
+ 8.76 298.
+ 5.47 297.
+ 2.22 295.
+ -1.01 293.
+ -4.21 291.
+ -7.36 289.
+ -10.5 287.
+ -13.5 284.
+ -16.6 281.
+ -19.5 278.
+ -22.4 275.
+ -25.3 271.
+ -28.1 267.
+ -30.8 263.
+ -33.4 259.
+ -36.0 255.
+ -38.5 251.
+ -40.9 246.
+ -43.2 241.
+ -45.4 236.
+ -47.6 231.
+ -49.6 226.
+ -51.6 220.
+ -53.5 215.
+ -55.2 209.
+ -56.9 203.
+ -58.4 197.
+ -59.9 191.
+ -61.2 185.
+ -62.4 179.
+ -63.5 172.
+ -64.5 166.
+ -65.4 160.
+ -66.2 153.
+ -66.8 147.
+ -67.3 140.
+ -67.8 133.
+ -68.1 127.
+ -68.2 120.
+ -68.3 113.
+ -68.2 107.
+ -68.0 99.8
+ -67.7 93.2
+ -67.3 86.5
+ -66.8 79.9
+ -66.1 73.3
+ -65.3 66.8
+ -64.4 60.4
+ -63.4 54.0
+ -62.3 47.7
+REG_LINE: 128
+ -77.0 190.
+ -78.3 183.
+ -79.4 175.
+ -80.5 168.
+ -81.4 160.
+ -82.1 153.
+ -82.8 145.
+ -83.3 137.
+ -83.6 129.
+ -83.8 122.
+ -83.9 114.
+ -83.8 106.
+ -83.6 98.1
+ -83.3 90.3
+ -82.8 82.6
+ -82.2 74.9
+ -81.4 67.2
+ -80.5 59.6
+ -79.5 52.0
+ -78.3 44.6
+ -77.1 37.2
+ -75.6 29.9
+ -74.1 22.8
+ -72.4 15.7
+ -70.6 8.81
+ -68.7 2.01
+ -66.6 -4.64
+ -64.4 -11.1
+ -62.2 -17.5
+ -59.8 -23.7
+ -57.3 -29.7
+ -54.7 -35.5
+ -51.9 -41.1
+ -49.1 -46.5
+ -46.2 -51.8
+ -43.2 -56.8
+ -40.2 -61.6
+ -37.0 -66.1
+ -33.7 -70.5
+ -30.4 -74.6
+ -27.0 -78.5
+ -23.6 -82.1
+ -20.0 -85.5
+ -16.5 -88.6
+ -12.8 -91.5
+ -9.15 -94.1
+ -5.42 -96.4
+ -1.66 -98.5
+ 2.14 -100.
+ 5.97 -102.
+ 9.83 -103.
+ 13.7 -104.
+ 17.6 -105.
+ 21.5 -105.
+ 25.4 -105.
+ 29.3 -105.
+ 33.2 -105.
+ 37.1 -104.
+ 41.0 -103.
+ 44.8 -102.
+ 48.7 -100.
+ 52.5 -98.5
+ 56.2 -96.5
+ 60.0 -94.2
+ 63.6 -91.6
+ 67.3 -88.7
+ 70.9 -85.6
+ 74.4 -82.2
+ 77.8 -78.6
+ 81.2 -74.7
+ 84.6 -70.6
+ 87.8 -66.3
+ 91.0 -61.7
+ 94.1 -56.9
+ 97.1 -51.9
+ 100. -46.7
+ 103. -41.3
+ 105. -35.7
+ 108. -29.9
+ 111. -23.9
+ 113. -17.7
+ 115. -11.4
+ 117. -4.87
+ 120. 1.78
+ 121. 8.56
+ 123. 15.5
+ 125. 22.5
+ 127. 29.7
+ 128. 37.0
+ 129. 44.3
+ 130. 51.8
+ 131. 59.3
+ 132. 66.9
+ 133. 74.6
+ 134. 82.3
+ 134. 90.0
+ 135. 97.8
+ 135. 106.
+ 135. 113.
+ 135. 121.
+ 135. 129.
+ 134. 137.
+ 134. 145.
+ 133. 152.
+ 132. 160.
+ 131. 168.
+ 130. 175.
+ 129. 183.
+ 128. 190.
+ 127. 197.
+ 125. 204.
+ 123. 211.
+ 121. 218.
+ 120. 225.
+ 117. 232.
+ 115. 238.
+ 113. 245.
+ 111. 251.
+ 108. 257.
+ 105. 263.
+ 103. 268.
+ 100. 274.
+ 97.1 279.
+ 94.1 284.
+ 91.0 289.
+ 87.8 293.
+ 84.6 298.
+ 82.5 300.
+REG_LINE: 40
+ -31.6 300.
+ -33.7 297.
+ -37.0 293.
+ -40.2 288.
+ -43.2 284.
+ -46.2 279.
+ -49.1 273.
+ -51.9 268.
+ -54.7 262.
+ -57.3 257.
+ -59.8 251.
+ -62.2 244.
+ -64.4 238.
+ -66.6 232.
+ -68.7 225.
+ -70.6 218.
+ -72.4 211.
+ -74.1 204.
+ -75.6 197.
+ -77.1 190.
+ -78.3 182.
+ -79.5 175.
+ -80.5 167.
+ -81.4 160.
+ -82.2 152.
+ -82.8 144.
+ -83.3 137.
+ -83.6 129.
+ -83.8 121.
+ -83.9 113.
+ -83.8 105.
+ -83.6 97.5
+ -83.3 89.8
+ -82.8 82.0
+ -82.1 74.3
+ -81.4 66.7
+ -80.5 59.0
+ -79.4 51.5
+ -78.3 44.1
+ -77.0 36.7
+REG_LINE: 97
+ -91.6 201.
+ -93.1 193.
+ -94.4 184.
+ -95.6 176.
+ -96.6 167.
+ -97.5 158.
+ -98.2 149.
+ -98.8 140.
+ -99.2 132.
+ -99.4 123.
+ -99.5 114.
+ -99.5 105.
+ -99.2 95.9
+ -98.8 87.0
+ -98.3 78.2
+ -97.6 69.3
+ -96.7 60.6
+ -95.7 51.9
+ -94.5 43.3
+ -93.2 34.8
+ -91.7 26.3
+ -90.1 18.0
+ -88.3 9.83
+ -86.4 1.77
+ -84.3 -6.14
+ -82.1 -13.9
+ -79.8 -21.5
+ -77.3 -28.9
+ -74.7 -36.2
+ -71.9 -43.2
+ -69.1 -50.1
+ -66.1 -56.7
+ -63.0 -63.2
+ -59.8 -69.4
+ -56.5 -75.3
+ -53.1 -81.1
+ -49.5 -86.6
+ -45.9 -91.8
+ -42.2 -96.8
+ -38.4 -101.
+ -34.5 -106.
+ -30.6 -110.
+ -26.5 -114.
+ -22.5 -117.
+ -18.3 -121.
+ -14.1 -124.
+ -9.84 -126.
+ -5.53 -129.
+ -1.19 -131.
+ 3.19 -133.
+ 7.59 -134.
+ 12.0 -135.
+ 16.5 -136.
+ 20.9 -136.
+ 25.4 -137.
+ 29.9 -136.
+ 34.3 -136.
+ 38.8 -135.
+ 43.2 -134.
+ 47.6 -133.
+ 52.0 -131.
+ 56.3 -129.
+ 60.6 -126.
+ 64.9 -124.
+ 69.1 -121.
+ 73.2 -118.
+ 77.3 -114.
+ 81.4 -110.
+ 85.3 -106.
+ 89.2 -102.
+ 93.0 -96.9
+ 96.7 -92.0
+ 100. -86.8
+ 104. -81.3
+ 107. -75.6
+ 111. -69.6
+ 114. -63.4
+ 117. -57.0
+ 120. -50.3
+ 123. -43.5
+ 126. -36.4
+ 128. -29.2
+ 131. -21.8
+ 133. -14.2
+ 135. -6.42
+ 137. 1.49
+ 139. 9.54
+ 141. 17.7
+ 143. 26.0
+ 144. 34.5
+ 145. 43.0
+ 147. 51.6
+ 148. 60.3
+ 148. 69.0
+ 149. 77.8
+ 150. 86.7
+ 150. 92.2
+REG_LINE: 23
+ 150. 135.
+ 150. 140.
+ 149. 149.
+ 148. 158.
+ 148. 167.
+ 147. 175.
+ 145. 184.
+ 144. 192.
+ 143. 201.
+ 141. 209.
+ 139. 217.
+ 137. 225.
+ 135. 233.
+ 133. 241.
+ 131. 249.
+ 128. 256.
+ 126. 263.
+ 123. 270.
+ 120. 277.
+ 117. 284.
+ 114. 290.
+ 111. 296.
+ 109. 300.
+REG_LINE: 35
+ -57.7 300.
+ -59.8 296.
+ -63.0 290.
+ -66.1 284.
+ -69.1 277.
+ -71.9 270.
+ -74.7 263.
+ -77.3 256.
+ -79.8 248.
+ -82.1 241.
+ -84.3 233.
+ -86.4 225.
+ -88.3 217.
+ -90.1 209.
+ -91.7 201.
+ -93.2 192.
+ -94.5 184.
+ -95.7 175.
+ -96.7 166.
+ -97.6 158.
+ -98.3 149.
+ -98.8 140.
+ -99.2 131.
+ -99.5 122.
+ -99.5 113.
+ -99.4 104.
+ -99.2 95.3
+ -98.8 86.4
+ -98.2 77.5
+ -97.5 68.7
+ -96.6 60.0
+ -95.6 51.3
+ -94.4 42.7
+ -93.1 34.2
+ -91.6 25.7
+REG_LINE: 63
+ -100. -13.5
+ -98.0 -21.1
+ -95.5 -29.8
+ -92.9 -38.4
+ -90.1 -46.7
+ -87.2 -54.9
+ -84.1 -62.8
+ -80.9 -70.5
+ -77.5 -78.0
+ -74.1 -85.2
+ -70.5 -92.2
+ -66.7 -98.9
+ -62.9 -105.
+ -58.9 -112.
+ -54.8 -117.
+ -50.7 -123.
+ -46.4 -128.
+ -42.0 -133.
+ -37.6 -138.
+ -33.1 -142.
+ -28.4 -146.
+ -23.8 -150.
+ -19.0 -153.
+ -14.3 -156.
+ -9.41 -159.
+ -4.52 -161.
+ .403 -163.
+ 5.36 -165.
+ 10.3 -166.
+ 15.3 -167.
+ 20.4 -168.
+ 25.4 -168.
+ 30.4 -168.
+ 35.4 -167.
+ 40.4 -166.
+ 45.4 -165.
+ 50.4 -163.
+ 55.3 -161.
+ 60.2 -159.
+ 65.0 -156.
+ 69.8 -153.
+ 74.5 -150.
+ 79.2 -146.
+ 83.8 -142.
+ 88.4 -138.
+ 92.8 -133.
+ 97.2 -129.
+ 101. -123.
+ 106. -118.
+ 110. -112.
+ 114. -106.
+ 118. -99.2
+ 121. -92.5
+ 125. -85.5
+ 128. -78.3
+ 132. -70.8
+ 135. -63.1
+ 138. -55.2
+ 141. -47.0
+ 144. -38.7
+ 146. -30.1
+ 149. -21.4
+ 150. -17.1
+REG_LINE: 9
+ 150. 244.
+ 149. 248.
+ 146. 257.
+ 144. 266.
+ 141. 274.
+ 138. 282.
+ 135. 290.
+ 132. 298.
+ 131. 300.
+REG_LINE: 9
+ -79.7 300.
+ -80.9 297.
+ -84.1 290.
+ -87.2 282.
+ -90.1 274.
+ -92.9 265.
+ -95.5 257.
+ -98.0 248.
+ -100. 240.
+REG_LINE: 54
+ -100. -72.8
+ -99.7 -73.6
+ -96.3 -82.4
+ -92.7 -91.0
+ -89.0 -99.3
+ -85.1 -107.
+ -81.1 -115.
+ -77.0 -123.
+ -72.7 -130.
+ -68.3 -137.
+ -63.8 -143.
+ -59.1 -149.
+ -54.4 -155.
+ -49.5 -161.
+ -44.6 -166.
+ -39.6 -171.
+ -34.4 -175.
+ -29.2 -179.
+ -24.0 -183.
+ -18.7 -186.
+ -13.3 -189.
+ -7.85 -192.
+ -2.38 -194.
+ 3.13 -196.
+ 8.66 -197.
+ 14.2 -198.
+ 19.8 -199.
+ 25.4 -199.
+ 30.9 -199.
+ 36.5 -198.
+ 42.1 -197.
+ 47.6 -196.
+ 53.1 -194.
+ 58.6 -192.
+ 64.0 -189.
+ 69.4 -186.
+ 74.7 -183.
+ 80.0 -179.
+ 85.2 -175.
+ 90.3 -171.
+ 95.3 -166.
+ 100. -161.
+ 105. -155.
+ 110. -150.
+ 115. -143.
+ 119. -137.
+ 123. -130.
+ 128. -123.
+ 132. -115.
+ 136. -108.
+ 140. -99.6
+ 144. -91.3
+ 147. -82.7
+ 150. -75.3
+REG_LINE: 2
+ -99.9 300.
+ -100. 300.
+REG_LINE: 13
+ -100. -121.
+ -96.2 -129.
+ -91.8 -138.
+ -87.2 -146.
+ -82.5 -154.
+ -77.7 -162.
+ -72.7 -169.
+ -67.6 -176.
+ -62.4 -182.
+ -57.0 -188.
+ -51.6 -194.
+ -46.1 -199.
+ -45.1 -200.
+REG_LINE: 13
+ 96.0 -200.
+ 96.8 -199.
+ 102. -194.
+ 108. -188.
+ 113. -182.
+ 118. -176.
+ 123. -169.
+ 128. -162.
+ 133. -154.
+ 138. -146.
+ 143. -138.
+ 147. -130.
+ 150. -123.
+REG_LINE: 6
+ -100. -165.
+ -97.4 -170.
+ -92.3 -178.
+ -87.0 -187.
+ -81.6 -194.
+ -77.4 -200.
+REG_LINE: 6
+ 128. -200.
+ 132. -195.
+ 138. -187.
+ 143. -179.
+ 148. -170.
+ 150. -167.
+REG_LINE: 10
+ 40.9 118.
+ 24.4 113.
+ 7.79 108.
+ -8.78 104.
+ -25.4 98.9
+ -41.9 94.2
+ -58.5 89.5
+ -75.1 84.8
+ -91.7 80.0
+ -100. 77.7
+REG_LINE: 12
+ 38.0 132.
+ 24.6 112.
+ 11.2 92.1
+ -2.25 72.0
+ -15.7 52.0
+ -29.1 31.9
+ -42.5 11.9
+ -55.9 -8.13
+ -69.3 -28.2
+ -82.7 -48.2
+ -96.1 -68.2
+ -100. -74.0
+REG_LINE: 13
+ 32.0 142.
+ 25.0 111.
+ 18.0 81.0
+ 11.1 50.5
+ 4.10 20.1
+ -2.86 -10.4
+ -9.83 -40.8
+ -16.8 -71.3
+ -23.8 -102.
+ -30.7 -132.
+ -37.7 -163.
+ -44.7 -193.
+ -46.3 -200.
+REG_LINE: 12
+ 24.4 145.
+ 25.5 111.
+ 26.7 77.8
+ 27.9 44.4
+ 29.1 11.0
+ 30.3 -22.4
+ 31.5 -55.8
+ 32.7 -89.2
+ 33.8 -123.
+ 35.0 -156.
+ 36.2 -189.
+ 36.6 -200.
+REG_LINE: 14
+ 17.0 140.
+ 26.1 112.
+ 35.1 83.4
+ 44.2 55.2
+ 53.2 27.0
+ 62.3 -1.14
+ 71.3 -29.3
+ 80.3 -57.5
+ 89.4 -85.7
+ 98.4 -114.
+ 107. -142.
+ 117. -170.
+ 126. -198.
+ 126. -200.
+REG_LINE: 11
+ 11.8 128.
+ 26.4 112.
+ 41.1 96.3
+ 55.8 80.3
+ 70.5 64.2
+ 85.2 48.2
+ 99.9 32.1
+ 115. 16.1
+ 129. 0.199E-02
+ 144. -16.1
+ 150. -22.6
+REG_LINE: 10
+ 9.84 113.
+ 26.6 113.
+ 43.3 113.
+ 60.1 113.
+ 76.8 113.
+ 93.5 113.
+ 110. 113.
+ 127. 113.
+ 144. 113.
+ 150. 113.
+REG_LINE: 11
+ 11.8 98.5
+ 26.4 115.
+ 41.1 131.
+ 55.8 147.
+ 70.5 163.
+ 85.2 179.
+ 99.9 195.
+ 115. 211.
+ 129. 227.
+ 144. 243.
+ 150. 250.
+REG_LINE: 9
+ 17.0 87.1
+ 26.1 115.
+ 35.1 143.
+ 44.2 172.
+ 53.2 200.
+ 62.3 228.
+ 71.3 256.
+ 80.3 284.
+ 85.4 300.
+REG_LINE: 8
+ 24.4 82.3
+ 25.5 116.
+ 26.7 149.
+ 27.9 182.
+ 29.1 216.
+ 30.3 249.
+ 31.5 283.
+ 32.1 300.
+REG_LINE: 9
+ 32.0 85.0
+ 25.0 115.
+ 18.0 146.
+ 11.1 176.
+ 4.10 207.
+ -2.86 237.
+ -9.83 268.
+ -16.8 298.
+ -17.2 300.
+REG_LINE: 12
+ 38.0 94.7
+ 24.6 115.
+ 11.2 135.
+ -2.25 155.
+ -15.7 175.
+ -29.1 195.
+ -42.5 215.
+ -55.9 235.
+ -69.3 255.
+ -82.7 275.
+ -96.1 295.
+ -99.4 300.
+REG_LINE: 10
+ 40.9 109.
+ 24.4 114.
+ 7.79 118.
+ -8.78 123.
+ -25.4 128.
+ -41.9 133.
+ -58.5 137.
+ -75.1 142.
+ -91.7 147.
+ -100. 149.
+REG_LINE: 2
+ 18.7 134.
+ 17.7 133.
+REG_LINE: 2
+ 20.4 129.
+ 19.4 128.
+REG_LINE: 2
+ 22.1 124.
+ 21.1 123.
+REG_LINE: 2
+ 23.8 119.
+ 22.8 117.
+REG_LINE: 2
+ 27.2 108.
+ 28.2 110.
+REG_LINE: 2
+ 28.8 103.
+ 29.8 104.
+REG_LINE: 2
+ 30.5 97.7
+ 31.5 99.1
+REG_LINE: 2
+ 32.2 92.4
+ 33.2 93.8
+REG_LINE: 2
+ 35.6 81.9
+ 36.6 83.3
+REG_LINE: 2
+ 37.3 76.6
+ 38.3 78.1
+REG_LINE: 2
+ 39.0 71.4
+ 40.0 72.8
+REG_LINE: 2
+ 40.7 66.1
+ 41.7 67.5
+REG_LINE: 2
+ 44.0 55.6
+ 45.0 57.0
+REG_LINE: 2
+ 45.7 50.3
+ 46.7 51.8
+REG_LINE: 2
+ 47.4 45.1
+ 48.4 46.5
+REG_LINE: 2
+ 49.1 39.8
+ 50.1 41.2
+REG_LINE: 2
+ 52.5 29.3
+ 53.5 30.7
+REG_LINE: 2
+ 54.2 24.0
+ 55.2 25.5
+REG_LINE: 2
+ 55.9 18.8
+ 56.9 20.2
+REG_LINE: 2
+ 57.5 13.5
+ 58.6 14.9
+REG_LINE: 2
+ 60.9 2.99
+ 61.9 4.43
+REG_LINE: 2
+ 62.6 -2.26
+ 63.6 -.831
+REG_LINE: 2
+ 64.3 -7.52
+ 65.3 -6.09
+REG_LINE: 2
+ 66.0 -12.8
+ 67.0 -11.3
+REG_LINE: 2
+ 69.4 -23.3
+ 70.4 -21.9
+REG_LINE: 2
+ 71.1 -28.6
+ 72.1 -27.1
+REG_LINE: 2
+ 72.7 -33.8
+ 73.7 -32.4
+REG_LINE: 2
+ 74.4 -39.1
+ 75.4 -37.6
+REG_LINE: 2
+ 77.8 -49.6
+ 78.8 -48.2
+REG_LINE: 2
+ 79.5 -54.9
+ 80.5 -53.4
+REG_LINE: 2
+ 81.2 -60.1
+ 82.2 -58.7
+REG_LINE: 2
+ 82.9 -65.4
+ 83.9 -63.9
+REG_LINE: 2
+ 86.3 -75.9
+ 87.3 -74.5
+REG_LINE: 2
+ 87.9 -81.2
+ 88.9 -79.7
+REG_LINE: 2
+ 89.6 -86.4
+ 90.6 -85.0
+REG_LINE: 2
+ 91.3 -91.7
+ 92.3 -90.2
+REG_LINE: 2
+ 94.7 -102.
+ 95.7 -101.
+REG_LINE: 2
+ 96.4 -107.
+ 97.4 -106.
+REG_LINE: 2
+ 98.1 -113.
+ 99.1 -111.
+REG_LINE: 2
+ 99.8 -118.
+ 101. -117.
+REG_LINE: 2
+ 103. -128.
+ 104. -127.
+REG_LINE: 2
+ 105. -134.
+ 106. -132.
+REG_LINE: 2
+ 107. -139.
+ 108. -138.
+REG_LINE: 2
+ 108. -144.
+ 109. -143.
+REG_LINE: 2
+ 112. -155.
+ 113. -153.
+REG_LINE: 2
+ 113. -160.
+ 114. -159.
+REG_LINE: 2
+ 115. -165.
+ 116. -164.
+REG_LINE: 2
+ 117. -171.
+ 118. -169.
+REG_LINE: 2
+ 120. -181.
+ 121. -180.
+REG_LINE: 2
+ 122. -186.
+ 123. -185.
+REG_LINE: 2
+ 123. -192.
+ 124. -190.
+REG_LINE: 2
+ 125. -197.
+ 126. -195.
+REG_LINE: 2
+ -80.3 169.
+ -81.8 170.
+REG_LINE: 2
+ -82.5 148.
+ -84.2 148.
+REG_LINE: 2
+ -83.7 126.
+ -85.5 126.
+REG_LINE: 2
+ -83.8 104.
+ -85.6 104.
+REG_LINE: 2
+ -80.7 61.1
+ -82.3 60.3
+REG_LINE: 2
+ -77.6 40.2
+ -79.0 39.1
+REG_LINE: 2
+ -73.4 19.9
+ -74.7 18.7
+REG_LINE: 2
+ -68.3 .672
+ -69.4 -.674
+REG_LINE: 2
+ -55.2 -34.3
+ -56.0 -35.9
+REG_LINE: 2
+ -47.4 -49.7
+ -48.1 -51.3
+REG_LINE: 2
+ -38.9 -63.4
+ -39.5 -65.1
+REG_LINE: 2
+ -29.7 -75.4
+ -30.2 -77.1
+REG_LINE: 2
+ -9.89 -93.6
+ -10.2 -95.3
+REG_LINE: 2
+ .619 -99.6
+ .416 -101.
+REG_LINE: 2
+ 11.4 -103.
+ 11.3 -105.
+REG_LINE: 2
+ 22.3 -105.
+ 22.2 -107.
+REG_LINE: 2
+ 44.1 -102.
+ 44.2 -104.
+REG_LINE: 2
+ 54.7 -97.3
+ 55.0 -99.1
+REG_LINE: 2
+ 65.1 -90.4
+ 65.4 -92.2
+REG_LINE: 2
+ 75.1 -81.5
+ 75.5 -83.2
+REG_LINE: 2
+ 93.5 -57.9
+ 94.1 -59.5
+REG_LINE: 2
+ 102. -43.5
+ 102. -45.1
+REG_LINE: 2
+ 109. -27.5
+ 110. -29.0
+REG_LINE: 2
+ 116. -10.1
+ 117. -11.5
+REG_LINE: 2
+ 126. 28.3
+ 128. 27.1
+REG_LINE: 2
+ 130. 48.8
+ 131. 47.9
+REG_LINE: 2
+ 133. 70.0
+ 134. 69.3
+REG_LINE: 2
+ 134. 91.6
+ 136. 91.3
+REG_LINE: 2
+ 134. 135.
+ 136. 136.
+REG_LINE: 2
+ 133. 157.
+ 134. 158.
+REG_LINE: 2
+ 130. 178.
+ 131. 179.
+REG_LINE: 2
+ 126. 199.
+ 128. 200.
+REG_LINE: 2
+ 116. 237.
+ 117. 238.
+REG_LINE: 2
+ 109. 254.
+ 110. 256.
+REG_LINE: 2
+ 102. 270.
+ 102. 272.
+REG_LINE: 2
+ 93.5 285.
+ 94.1 286.
+REG_LINE: 2
+ -38.9 290.
+ -39.5 292.
+REG_LINE: 2
+ -47.4 277.
+ -48.1 278.
+REG_LINE: 2
+ -55.2 261.
+ -56.0 263.
+REG_LINE: 2
+ -68.3 226.
+ -69.4 228.
+REG_LINE: 2
+ -73.4 207.
+ -74.7 208.
+REG_LINE: 2
+ -77.6 187.
+ -79.0 188.
+REG_LINE: 2
+ -80.7 166.
+ -82.3 167.
+REG_LINE: 2
+ -83.8 123.
+ -85.6 123.
+REG_LINE: 2
+ -83.7 101.
+ -85.5 100.
+REG_LINE: 2
+ -82.5 78.9
+ -84.2 78.4
+REG_LINE: 2
+ -80.3 57.5
+ -81.8 56.7
+REG_LINE: 15
+ 25.5 113.
+ 24.9 115.
+ 24.3 117.
+ 23.7 119.
+ 23.1 121.
+ 22.5 123.
+ 21.9 125.
+ 21.2 127.
+ 20.6 128.
+ 20.0 130.
+ 19.4 132.
+ 18.8 134.
+ 18.2 136.
+ 17.6 138.
+ 17.0 140.
+REG_LINE: 15
+ 25.5 113.
+ 26.1 112.
+ 26.7 110.
+ 27.3 108.
+ 27.9 106.
+ 28.5 104.
+ 29.1 102.
+ 29.7 100.
+ 30.3 98.4
+ 30.9 96.5
+ 31.5 94.7
+ 32.1 92.8
+ 32.7 90.9
+ 33.3 89.0
+ 33.9 87.1
+REG_LINE: 15
+ 33.9 87.1
+ 34.5 85.3
+ 35.1 83.4
+ 35.7 81.5
+ 36.3 79.6
+ 36.9 77.8
+ 37.5 75.9
+ 38.1 74.0
+ 38.7 72.1
+ 39.3 70.2
+ 39.9 68.4
+ 40.5 66.5
+ 41.1 64.6
+ 41.8 62.7
+ 42.4 60.8
+REG_LINE: 15
+ 42.4 60.8
+ 43.0 59.0
+ 43.6 57.1
+ 44.2 55.2
+ 44.8 53.3
+ 45.4 51.5
+ 46.0 49.6
+ 46.6 47.7
+ 47.2 45.8
+ 47.8 43.9
+ 48.4 42.1
+ 49.0 40.2
+ 49.6 38.3
+ 50.2 36.4
+ 50.8 34.5
+REG_LINE: 15
+ 50.8 34.5
+ 51.4 32.7
+ 52.0 30.8
+ 52.6 28.9
+ 53.2 27.0
+ 53.8 25.2
+ 54.4 23.3
+ 55.0 21.4
+ 55.6 19.5
+ 56.2 17.6
+ 56.8 15.8
+ 57.4 13.9
+ 58.0 12.0
+ 58.6 10.1
+ 59.2 8.25
+REG_LINE: 15
+ 59.2 8.25
+ 59.8 6.38
+ 60.4 4.50
+ 61.0 2.62
+ 61.6 .740
+ 62.3 -1.14
+ 62.9 -3.02
+ 63.5 -4.89
+ 64.1 -6.77
+ 64.7 -8.65
+ 65.3 -10.5
+ 65.9 -12.4
+ 66.5 -14.3
+ 67.1 -16.2
+ 67.7 -18.0
+REG_LINE: 15
+ 67.7 -18.0
+ 68.3 -19.9
+ 68.9 -21.8
+ 69.5 -23.7
+ 70.1 -25.6
+ 70.7 -27.4
+ 71.3 -29.3
+ 71.9 -31.2
+ 72.5 -33.1
+ 73.1 -34.9
+ 73.7 -36.8
+ 74.3 -38.7
+ 74.9 -40.6
+ 75.5 -42.5
+ 76.1 -44.3
+REG_LINE: 15
+ 76.1 -44.3
+ 76.7 -46.2
+ 77.3 -48.1
+ 77.9 -50.0
+ 78.5 -51.9
+ 79.1 -53.7
+ 79.7 -55.6
+ 80.3 -57.5
+ 80.9 -59.4
+ 81.5 -61.2
+ 82.2 -63.1
+ 82.8 -65.0
+ 83.4 -66.9
+ 84.0 -68.8
+ 84.6 -70.6
+REG_LINE: 15
+ 84.6 -70.6
+ 85.2 -72.5
+ 85.8 -74.4
+ 86.4 -76.3
+ 87.0 -78.1
+ 87.6 -80.0
+ 88.2 -81.9
+ 88.8 -83.8
+ 89.4 -85.7
+ 90.0 -87.5
+ 90.6 -89.4
+ 91.2 -91.3
+ 91.8 -93.2
+ 92.4 -95.1
+ 93.0 -96.9
+REG_LINE: 15
+ 93.0 -96.9
+ 93.6 -98.8
+ 94.2 -101.
+ 94.8 -103.
+ 95.4 -104.
+ 96.0 -106.
+ 96.6 -108.
+ 97.2 -110.
+ 97.8 -112.
+ 98.4 -114.
+ 99.0 -116.
+ 99.6 -118.
+ 100. -119.
+ 101. -121.
+ 101. -123.
+REG_LINE: 15
+ 101. -123.
+ 102. -125.
+ 103. -127.
+ 103. -129.
+ 104. -131.
+ 104. -133.
+ 105. -134.
+ 106. -136.
+ 106. -138.
+ 107. -140.
+ 107. -142.
+ 108. -144.
+ 109. -146.
+ 109. -148.
+ 110. -150.
+REG_LINE: 15
+ 110. -150.
+ 110. -151.
+ 111. -153.
+ 112. -155.
+ 112. -157.
+ 113. -159.
+ 114. -161.
+ 114. -163.
+ 115. -165.
+ 115. -166.
+ 116. -168.
+ 117. -170.
+ 117. -172.
+ 118. -174.
+ 118. -176.
+REG_LINE: 14
+ 118. -176.
+ 119. -178.
+ 120. -180.
+ 120. -181.
+ 121. -183.
+ 121. -185.
+ 122. -187.
+ 123. -189.
+ 123. -191.
+ 124. -193.
+ 124. -195.
+ 125. -196.
+ 126. -198.
+ 126. -200.
+REG_LINE: 15
+ -82.8 82.6
+ -83.3 90.3
+ -83.6 98.1
+ -83.8 106.
+ -83.9 114.
+ -83.8 122.
+ -83.6 129.
+ -83.3 137.
+ -82.8 145.
+ -82.1 153.
+ -81.4 160.
+ -80.5 168.
+ -79.4 175.
+ -78.3 183.
+ -77.0 190.
+REG_LINE: 15
+ -82.8 82.6
+ -82.2 74.9
+ -81.4 67.2
+ -80.5 59.6
+ -79.5 52.0
+ -78.3 44.6
+ -77.1 37.2
+ -75.6 29.9
+ -74.1 22.8
+ -72.4 15.7
+ -70.6 8.81
+ -68.7 2.01
+ -66.6 -4.64
+ -64.4 -11.1
+ -62.2 -17.5
+REG_LINE: 15
+ -62.2 -17.5
+ -59.8 -23.7
+ -57.3 -29.7
+ -54.7 -35.5
+ -51.9 -41.1
+ -49.1 -46.5
+ -46.2 -51.8
+ -43.2 -56.8
+ -40.2 -61.6
+ -37.0 -66.1
+ -33.7 -70.5
+ -30.4 -74.6
+ -27.0 -78.5
+ -23.6 -82.1
+ -20.0 -85.5
+REG_LINE: 15
+ -20.0 -85.5
+ -16.5 -88.6
+ -12.8 -91.5
+ -9.15 -94.1
+ -5.42 -96.4
+ -1.66 -98.5
+ 2.14 -100.
+ 5.97 -102.
+ 9.83 -103.
+ 13.7 -104.
+ 17.6 -105.
+ 21.5 -105.
+ 25.4 -105.
+ 29.3 -105.
+ 33.2 -105.
+REG_LINE: 15
+ 33.2 -105.
+ 37.1 -104.
+ 41.0 -103.
+ 44.8 -102.
+ 48.7 -100.
+ 52.5 -98.5
+ 56.2 -96.5
+ 60.0 -94.2
+ 63.6 -91.6
+ 67.3 -88.7
+ 70.9 -85.6
+ 74.4 -82.2
+ 77.8 -78.6
+ 81.2 -74.7
+ 84.6 -70.6
+REG_LINE: 15
+ 84.6 -70.6
+ 87.8 -66.3
+ 91.0 -61.7
+ 94.1 -56.9
+ 97.1 -51.9
+ 100. -46.7
+ 103. -41.3
+ 105. -35.7
+ 108. -29.9
+ 111. -23.9
+ 113. -17.7
+ 115. -11.4
+ 117. -4.87
+ 120. 1.78
+ 121. 8.56
+REG_LINE: 15
+ 121. 8.56
+ 123. 15.5
+ 125. 22.5
+ 127. 29.7
+ 128. 37.0
+ 129. 44.3
+ 130. 51.8
+ 131. 59.3
+ 132. 66.9
+ 133. 74.6
+ 134. 82.3
+ 134. 90.0
+ 135. 97.8
+ 135. 106.
+ 135. 113.
+REG_LINE: 15
+ 135. 113.
+ 135. 121.
+ 135. 129.
+ 134. 137.
+ 134. 145.
+ 133. 152.
+ 132. 160.
+ 131. 168.
+ 130. 175.
+ 129. 183.
+ 128. 190.
+ 127. 197.
+ 125. 204.
+ 123. 211.
+ 121. 218.
+REG_LINE: 15
+ 121. 218.
+ 120. 225.
+ 117. 232.
+ 115. 238.
+ 113. 245.
+ 111. 251.
+ 108. 257.
+ 105. 263.
+ 103. 268.
+ 100. 274.
+ 97.1 279.
+ 94.1 284.
+ 91.0 289.
+ 87.8 293.
+ 84.6 298.
+REG_LINE: 2
+ 84.6 298.
+ 82.5 300.
+REG_LINE: 12
+ -31.6 300.
+ -33.7 297.
+ -37.0 293.
+ -40.2 288.
+ -43.2 284.
+ -46.2 279.
+ -49.1 273.
+ -51.9 268.
+ -54.7 262.
+ -57.3 257.
+ -59.8 251.
+ -62.2 244.
+REG_LINE: 15
+ -62.2 244.
+ -64.4 238.
+ -66.6 232.
+ -68.7 225.
+ -70.6 218.
+ -72.4 211.
+ -74.1 204.
+ -75.6 197.
+ -77.1 190.
+ -78.3 182.
+ -79.5 175.
+ -80.5 167.
+ -81.4 160.
+ -82.2 152.
+ -82.8 144.
+REG_LINE: 15
+ -82.8 144.
+ -83.3 137.
+ -83.6 129.
+ -83.8 121.
+ -83.9 113.
+ -83.8 105.
+ -83.6 97.5
+ -83.3 89.8
+ -82.8 82.0
+ -82.1 74.3
+ -81.4 66.7
+ -80.5 59.0
+ -79.4 51.5
+ -78.3 44.1
+ -77.0 36.7
+REG_LINE: 15
+ -82.8 144.
+ -83.3 137.
+ -83.6 129.
+ -83.8 121.
+ -83.9 113.
+ -83.8 105.
+ -83.6 97.5
+ -83.3 89.8
+ -82.8 82.0
+ -82.1 74.3
+ -81.4 66.7
+ -80.5 59.0
+ -79.4 51.5
+ -78.3 44.1
+ -77.0 36.7
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '0.0'
+ 27.8 114. BC .952 .306
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '50.0'
+ 36.3 87.9 BC .952 .306
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '100.0'
+ 44.7 61.6 BC .952 .306
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '150.0'
+ 53.2 35.3 BC .952 .306
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '200.0'
+ 61.6 9.02 BC .952 .306
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '250.0'
+ 70.1 -17.3 BC .952 .306
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '300.0'
+ 78.5 -43.6 BC .952 .306
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '350.0'
+ 86.9 -69.9 BC .952 .306
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '400.0'
+ 95.4 -96.2 BC .952 .306
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '450.0'
+ 104. -122. BC .952 .306
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '500.0'
+ 112. -149. BC .952 .306
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '550.0'
+ 121. -175. BC .952 .306
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+Symbol = "p1" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ Ax2 = # Axis number 2
+ Begin Axis # Coordinate axis
+ Label = "Pixel coordinate 2" # Axis Label
+ Symbol = "p2" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ End Frame
+ Map2 = # Mapping between nodes 1 and 2
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ InvA = 1 # First Mapping used in inverse direction
+ InvB = 1 # Second Mapping used in inverse direction
+ MapA = # First component Mapping
+ Begin MathMap # Transformation using mathematical functions
+ Nin = 2 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Fwd1 = "r=sqrt(x*x+y*y)" # Forward function 1
+ Fwd2 = "theta=atan2(y,x)" # Forward function 2
+ Inv1 = "x=r*cos(theta)" # Inverse function 1
+ Inv2 = "y=r*sin(theta)" # Inverse function 2
+ SimpFI = 1 # Forward-inverse pairs may simplify
+ SimpIF = 1 # Inverse-forward pairs may simplify
+ End MathMap
+ MapB = # Second component Mapping
+ Begin WinMap # Map one window on to another
+ Nin = 2 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Sft1 = -101.5 # Shift for axis 1
+ Sft2 = -201.5 # Shift for axis 2
+ End WinMap
+ End CmpMap
+ End FrameSet
+ Begin FrameSet # Set of inter-related coordinate systems
+# Title = "FK5 equatorial coordinates; mean equinox J2000.0; gnomonic projection" # Title of coordinate system
+# Naxes = 2 # Number of coordinate axes
+# Domain = "SKY" # Coordinate system domain
+# Epoch = 1977.77512999212 # Besselian epoch of observation
+# Lbl1 = "Right ascension" # Label for axis 1
+# Lbl2 = "Declination" # Label for axis 2
+# System = "FK5" # Coordinate system type
+# Uni1 = "hh:mm:ss.s" # Units for axis 1
+# Uni2 = "ddd:mm:ss" # Units for axis 2
+# Dir1 = 0 # Plot axis 1 in reverse direction
+# Bot2 = -1.5707963267949 # Lowest legal axis value
+# Top2 = 1.5707963267949 # Highest legal axis value
+ IsA Frame # Coordinate system description
+ Nframe = 2 # Number of Frames in FrameSet
+ Base = 1 # Index of base Frame
+ Currnt = 2 # Index of current Frame
+ Lnk2 = 1 # Node 2 is derived from node 1
+ Frm1 = # Frame number 1
+ Begin Frame # Coordinate system description
+ Title = "Pixel Coordinates" # Title of coordinate system
+ Naxes = 2 # Number of coordinate axes
+ Domain = "GRID" # Coordinate system domain
+# Lbl1 = "Pixel axis 1" # Label for axis 1
+# Lbl2 = "Pixel axis 2" # Label for axis 2
+ Ax1 = # Axis number 1
+ Begin Axis # Coordinate axis
+ Label = "Pixel axis 1" # Axis Label
+ End Axis
+ Ax2 = # Axis number 2
+ Begin Axis # Coordinate axis
+ Label = "Pixel axis 2" # Axis Label
+ End Axis
+ End Frame
+ Frm2 = # Frame number 2
+ Begin SkyFrame # Description of celestial coordinate system
+ Ident = " " # Permanent Object identification string
+ IsA Object # AST Object
+# Title = "FK5 equatorial coordinates; mean equinox J2000.0; gnomonic projection" # Title of coordinate system
+ Naxes = 2 # Number of coordinate axes
+# Domain = "SKY" # Coordinate system domain
+ Epoch = 1977.77512999212 # Besselian epoch of observation
+# Lbl1 = "Right ascension" # Label for axis 1
+# Lbl2 = "Declination" # Label for axis 2
+ System = "FK5" # Coordinate system type
+# Uni1 = "hh:mm:ss.s" # Units for axis 1
+# Uni2 = "ddd:mm:ss" # Units for axis 2
+# Dir1 = 0 # Plot axis 1 in reverse direction
+# Bot2 = -1.5707963267949 # Lowest legal axis value
+# Top2 = 1.5707963267949 # Highest legal axis value
+ Ax1 = # Axis number 1
+ Begin SkyAxis # Celestial coordinate axis
+ End SkyAxis
+ Ax2 = # Axis number 2
+ Begin SkyAxis # Celestial coordinate axis
+ End SkyAxis
+ IsA Frame # Coordinate system description
+ Proj = "gnomonic" # Description of sky projection
+ Eqnox = 2000 # Julian epoch of mean equinox
+ SRefIs = "Ignored" # Not rotated (ref. pos. is ignored)
+ SRef1 = 0 # Ref. pos. RA 0:00:00.0
+ SRef2 = -1.57079633000002 # Ref. pos. Dec -90:00:00
+ End SkyFrame
+ Map2 = # Mapping between nodes 1 and 2
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin WinMap # Map one window on to another
+ Nin = 2 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Sft1 = -893.6318379289 # Shift for axis 1
+ Sft2 = -223.8380193875 # Shift for axis 2
+ End WinMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin MatrixMap # Matrix transformation
+ Nin = 2 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ M0 = -3.25441534352674e-06 # Forward matrix value
+ M1 = -1.60367292352974e-08 # Forward matrix value
+ M2 = -1.812057487023e-08 # Forward matrix value
+ M3 = 3.25725533992408e-06 # Forward matrix value
+ Form = "Full" # Matrix storage form
+ End MatrixMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ InvA = 1 # First Mapping used in inverse direction
+ MapA = # First component Mapping
+ Begin WcsMap # FITS-WCS sky projection
+ Nin = 2 # Number of input coordinates
+ Invert = 1 # Mapping inverted
+ IsA Mapping # Mapping between coordinate systems
+ Type = "TAN" # Gnomonic projection
+ End WcsMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ InvA = 1 # First Mapping used in inverse direction
+ MapA = # First component Mapping
+ Begin SphMap # Cartesian to Spherical mapping
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ Invert = 1 # Mapping inverted
+ IsA Mapping # Mapping between coordinate systems
+ UntRd = 1 # All input vectors have unit length
+ PlrLg = 0 # Polar longitREG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '-3.0'
+ -80.3 82.7 BC .997 0.724E-01
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '-2.5'
+ -59.8 -16.6 BC .936 .352
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '-2.0'
+ -18.4 -83.6 BC .673 .740
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '-1.5'
+ 32.8 -102. BC -.145 .989
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '-0.5'
+ 119. 9.22 BC -.965 .262
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '0.0'
+ 132. 113. BC -1.00 0.125E-02
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '0.5'
+ 119. 218. TC .964 .265
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '1.0'
+ 82.6 296. TC .787 .617
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '2.5'
+ -59.8 243. TC -.936 .352
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '3.0'
+ -80.3 144. TC -.997 0.724E-01
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 1
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: ' A FITS test'
+ 31.0 313. BC .000 1.00
+
+
+
+
+ FITS test number 3
+ ====================
+
+
+
+AST_SHOW:
+
+REG_SINK:
+SIMPLE = T / file does conform to FITS standard
+BITPIX = 16 / number of bits per data pixel
+NAXIS = 2 / number of data axes
+NAXIS1 = 1787 / length of data axis 1
+NAXIS2 = 447 / length of data axis 2
+EXTEND = T / FITS dataset may contain extensions
+COMMENT FITS (Flexible Image Transport System) format defined in Astronomy and
+COMMENT Astrophysics Supplement Series v44/p363, v44/p371, v73/p359, v73/p365.
+COMMENT Contact the NASA Science Office of Standards and Technology for the
+COMMENT FITS Definition document #100 and other FITS information.
+PLATENUM= '3665 ' / Plate number
+EMULSION= 'IIIaJ ' / Kodak emulsion type
+FILTER = 'GG395 ' / Schott glass filter type
+PLTSCALE= '67.14 ' / [arcsec/mm] plate scale
+FIELDNUM= '1 ' / Sky survey field number
+TELESCOP= 'UKST ' / Telescope on which the plate was taken
+TELETYPE= 'SCHM ' / Type of telescope
+SITELAT = -0.5458410576565 / [radians] latitude of telescope
+SITELONG= 2.601766194458 / [radians] longitude of telescope
+LST = '00:20 ' / [hh:mm] local sidereal time at start of obs
+INSTRUME= 'SuperCOSMOS I' / Measuring machine
+DATE-MES= '2000-11-04' / [yyyy-mm-dd] Date of this plate measurement
+NHKLINES= 146 / Number of lines from house-keeping file
+HKLIN001= 'JOB.JOBNO UKJ001'
+HKLIN002= 'JOB.DATE-MES 2000:11:04'
+HKLIN003= 'JOB.TIME 12:51:09'
+HKLIN004= 'JOB.INSTRUME SuperCOSMOS I'
+HKLIN005= 'JOB.ORIGIN Royal Observatory Edinburgh'
+HKLIN006= 'JOB.SOFTWARE /home/scosdev/v033'
+HKLIN007= 'JOB.OPERATOR ebt'
+HKLIN008= 'JOB.USER htm'
+HKLIN009= 'JOB.USERREF NONE'
+HKLIN010= 'JOB.UORIGIN ROE'
+HKLIN011= 'JOB.UCOUNTRY uk'
+HKLIN012= 'JOB.COMMENT Digital catalogue of the Sky'
+HKLIN013= 'JOB.IAM_FILE iam.srt'/ / ' /
+HKLIN014= 'PLATE.TELESCOP UKST'
+HKLIN015= 'PLATE.TELTYPE SCHM'
+HKLIN016= 'PLATE.PLATE 3665'
+HKLIN017= 'PLATE.MATERIAL 3mm glass'
+HKLIN018= 'PLATE.EMULSION IIIaJ'
+HKLIN019= 'PLATE.FILTER GG395'
+HKLIN020= 'PLATE.PSCALE 67.14'
+HKLIN021= 'PLATE.FIELD 1'
+HKLIN022= 'PLATE.RA_PNT 0'
+HKLIN023= 'PLATE.DEC_PNT -90'
+HKLIN024= 'PLATE.RADECSYS FK4'
+HKLIN025= 'PLATE.EQUINOX 1950'
+HKLIN026= 'PLATE.TIMESYS BESSELIAN'
+HKLIN027= 'PLATE.EPOCH 1977.78'/ / ' /
+HKLIN028= 'PLATE.EXPOSURE 75'
+HKLIN029= 'PLATE.UTDATE 771011'
+HKLIN030= 'PLATE.LST 0020'
+HKLIN031= 'PLATE.MJD 43426.573008796'
+HKLIN032= 'PLATE.TELLAT -0.54584105765654'
+HKLIN033= 'PLATE.TELLONG 2.6017661944583'
+HKLIN034= 'PLATE.TELHT 1145'
+HKLIN035= 'PLATE.TEMP 273.155'/ / ' /
+HKLIN036= 'PLATE.ATMOSP 1013.25'/ / ' /
+HKLIN037= 'PLATE.HUMID 0.5'
+HKLIN038= 'PLATE.WAVE 4500'
+HKLIN039= 'PLATE.TROPL 0.0065'
+HKLIN040= 'CALIBRATION.CALTYPE SPLINE'
+HKLIN041= 'CALIBRATION.STEPWEDG KPNO'
+HKLIN042= 'CALIBRATION.NSTEPS 8'
+HKLIN043= 'MEASUREMENT.ORIENTAT news'
+HKLIN044= 'MEASUREMENT.EMULPOS UP'
+HKLIN045= 'MEASUREMENT.SCANFILT 14'
+HKLIN046= 'MEASUREMENT.SOSP 552'
+HKLIN047= 'MEASUREMENT.STEPSIZE 10'
+HKLIN048= 'MEASUREMENT.SCANLEN 1152'
+HKLIN049= 'MEASUREMENT.A-XMIN 1622000'/ / ' /
+HKLIN050= 'MEASUREMENT.A-YMIN 1622000'/ / ' /
+HKLIN051= 'MEASUREMENT.A-XMAX 33878000'
+HKLIN052= 'MEASUREMENT.A-YMAX 33878000'
+HKLIN053= 'MEASUREMENT.X_PNT 17500000'
+HKLIN054= 'MEASUREMENT.Y_PNT 18000000'
+HKLIN055= 'ANALYSIS.NPARAMS 32'
+HKLIN056= 'ANALYSIS.AREACUT 8'
+HKLIN057= 'ANALYSIS.AP-PARAM 1.07'
+HKLIN058= 'DEBLEND.DB-PARAM 1.05'
+HKLIN059= 'DEBLEND.DB-AMIN 16'
+HKLIN060= 'DEBLEND.DB-AMAX 100000'
+HKLIN061= 'DEBLEND.DB-ACUT 8'
+HKLIN062= 'DEBLEND.DB-LEVEL 16'
+HKLIN063= 'DEBLEND.SELECT PARENT+CHILD'
+HKLIN064= 'SKY.SKYSQUAR 64'
+HKLIN065= 'SKY.SKYDEFN MEDIAN'
+HKLIN066= 'SKY.SKYFILTR bdkjunk'/ / ' /
+HKLIN067= 'SKY.F-THRESH 8'
+HKLIN068= 'SKY.F-SCLEN 4'
+HKLIN069= 'THRESHOLDING.PCUT 10'
+HKLIN070= 'IAMQC.AREAMIN 8'
+HKLIN071= 'IAMQC.AREAMAX 77346'
+HKLIN072= 'IAMQC.MINMAG -30515'
+HKLIN073= 'IAMQC.MAXMAG -17954'
+HKLIN074= 'IAMQC.MINELL 0.0004156232'
+HKLIN075= 'IAMQC.MAXELL 1'
+HKLIN076= 'IAMQC.MODELL 0.14'
+HKLIN077= 'IAMQC.MODOR 91'
+HKLIN078= 'IAMQC.MIDELL 0.21'
+HKLIN079= 'IAMQC.MIDOR 93'
+HKLIN080= 'IAMQC.MEANELL 0.2467037'
+HKLIN081= 'IAMQC.MEANOR 91.63474'
+HKLIN082= 'IAMQC.NUMOBJ 556985'
+HKLIN083= 'IAMQC.PARENTS 486656'
+HKLIN084= 'IAMQC.RANGING TRUE'
+HKLIN085= 'IAMQC.LANE_1 15571'
+HKLIN086= 'IAMQC.LANE_2 33207'
+HKLIN087= 'IAMQC.LANE_3 51478'
+HKLIN088= 'IAMQC.LANE_4 69944'
+HKLIN089= 'IAMQC.LANE_5 89236'
+HKLIN090= 'IAMQC.LANE_6 108416'
+HKLIN091= 'IAMQC.LANE_7 127481'
+HKLIN092= 'IAMQC.LANE_8 146699'
+HKLIN093= 'IAMQC.LANE_9 166380'
+HKLIN094= 'IAMQC.LANE_10 186126'
+HKLIN095= 'IAMQC.LANE_11 205946'
+HKLIN096= 'IAMQC.LANE_12 225915'
+HKLIN097= 'IAMQC.LANE_13 245926'
+HKLIN098= 'IAMQC.LANE_14 266574'
+HKLIN099= 'IAMQC.LANE_15 287150'
+HKLIN100= 'IAMQC.LANE_16 308087'
+HKLIN101= 'IAMQC.LANE_17 328830'
+HKLIN102= 'IAMQC.LANE_18 350253'
+HKLIN103= 'IAMQC.LANE_19 370738'
+HKLIN104= 'IAMQC.LANE_20 391722'
+HKLIN105= 'IAMQC.LANE_21 412801'
+HKLIN106= 'IAMQC.LANE_22 433795'
+HKLIN107= 'IAMQC.LANE_23 454383'
+HKLIN108= 'IAMQC.LANE_24 474711'
+HKLIN109= 'IAMQC.LANE_25 495108'
+HKLIN110= 'IAMQC.LANE_26 515755'
+HKLIN111= 'IAMQC.LANE_27 536499'
+HKLIN112= 'IAMQC.LANE_28 556985'
+HKLIN113= 'XYTORADEC.STARCAT /sdata/scos/refcats/tycho2.FIT'
+HKLIN114= 'XYTORADEC.BRIGHTLIM 9'
+HKLIN115= 'XYTORADEC.C-EQUIN 2000'
+HKLIN116= 'XYTORADEC.C-EQTSYS JULIAN'
+HKLIN117= 'XYTORADEC.C-EPOCH 2000'
+HKLIN118= 'XYTORADEC.C-EPTSYS JULIAN'
+HKLIN119= 'XYTORADEC.R-EQUIN 2000'
+HKLIN120= 'XYTORADEC.R-TSYS JULIAN'
+HKLIN121= 'XYTORADEC.MAXITER 5000'
+HKLIN122= 'XYTORADEC.RCRITINI 500000'
+HKLIN123= 'XYTORADEC.RCRITABS 50000'
+HKLIN124= 'XYTORADEC.RCRITREL 1'
+HKLIN125= 'XYTORADEC.RCRITFIN 3'
+HKLIN126= 'XYTORADEC.HARDCOPY /scos1/scos/UKJ001/UKJ001.ps'
+HKLIN127= 'XYTORADEC.REFSMULT 5'
+HKLIN128= 'XYTORADEC.RESDMULT 1000'
+HKLIN129= 'XYTORADEC.RACOL RA'
+HKLIN130= 'XYTORADEC.DECOL DEC'
+HKLIN131= 'XYTORADEC.RAPMCOL PMRA'
+HKLIN132= 'XYTORADEC.DECPMCOL PMDE'
+HKLIN133= 'XYTORADEC.PLXCOL NONE'
+HKLIN134= 'XYTORADEC.RVCOL NONE'
+HKLIN135= 'XYTORADEC.MAGCOL VT'
+HKLIN136= 'XYTORADEC.STARSC 2374'
+HKLIN137= 'XYTORADEC.STARSU 1727'
+HKLIN138= 'XYTORADEC.COEFFS_1 17.640343856524'
+HKLIN139= 'XYTORADEC.COEFFS_2 -260.44151995641'
+HKLIN140= 'XYTORADEC.COEFFS_3 -163.09155572601'
+HKLIN141= 'XYTORADEC.COEFFS_4 17.504230442205'
+HKLIN142= 'XYTORADEC.COEFFS_5 -163.08676953832'
+HKLIN143= 'XYTORADEC.COEFFS_6 260.48817907668'
+HKLIN144= 'XYTORADEC.DISTR -0.33333333333333'
+HKLIN145= 'XYTORADEC.RA_PNT 0.54924996662137'
+HKLIN146= 'XYTORADEC.DEC_PNT -1.5684931501781'
+HISTORY = 'SuperCOSMOS image analysis and mapping mode (IAM and MM)' /
+HISTORY = 'data written by xydcomp_ss.' /
+HISTORY = 'Any questions/comments/suggestions/bug reports should be sent' /
+HISTORY = 'to N.Hambly@roe.ac.uk' /
+ASTSIGX = 0.37 / [arcsec] std. dev. of astrometric fit in X
+ASTSIGY = 0.38 / [arcsec] std. dev. of astrometric fit in Y
+PC001001= 1.0 / DEPRECATED - Axis rotation matrix
+PC001002= 0.004927623810613 / DEPRECATED - Axis rotation matrix
+PC002001= -0.005563056187788 / DEPRECATED - Axis rotation matrix
+PC002002= 1.0 / DEPRECATED - Axis rotation matrix
+CROTA2 = 0.3005532298491 / DEPRECATED - rotation of axis 2
+DATATYPE= 'INTEGER*2' / Type of data
+DATUNITS= 'DENSITY ' / Units: transmission, density or intensity
+XPIXELSZ= 9.997114974 / [microns] X pixel size
+YPIXELSZ= 10.0 / [microns] Y pixel size
+OBJCTRA = ' 0 0 0.000' / Centre Right Ascension (J2000)
+OBJCTDEC= '-90 0 0.00' / Centre Declination (J2000)
+OBJCTX = 16368.63183793 / [pixels] Centre X on plate
+OBJCTY = 14740.83801939 / [pixels] Centre Y on plate
+
+Objects written: 1
+
+Native Encoding:
+
+COMMENT AST ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ AST
+COMMENT AST WCS information in AST format AST
+COMMENT AST See http://www.starlink.ac.uk/ast/ AST
+COMMENT AST Beginning of AST data for FrameSet object AST
+COMMENT AST ................................................................ AST
+BEGAST_A= 'FrameSet' / Set of inter-related coordinate systems
+NFRAME_A= 2 / Number of Frames in FrameSet
+BASE_A = 1 / Index of base Frame
+CURRNT_A= 2 / Index of current Frame
+LNK2_A = 1 / Node 2 is derived from node 1
+FRM1_A = ' ' / Frame number 1
+BEGAST_B= 'Frame ' / Coordinate system description
+TITLE_A = 'Pixel Coordinates' / Title of coordinate system
+NAXES_A = 2 / Number of coordinate axes
+DOMAIN_A= 'GRID ' / Coordinate system domain
+AX1_A = ' ' / Axis number 1
+BEGAST_C= 'Axis ' / Coordinate axis
+LABEL_A = 'Pixel axis 1' / Axis Label
+ENDAST_A= 'Axis ' / End of object definition
+AX2_A = ' ' / Axis number 2
+BEGAST_D= 'Axis ' / Coordinate axis
+LABEL_B = 'Pixel axis 2' / Axis Label
+ENDAST_B= 'Axis ' / End of object definition
+ENDAST_C= 'Frame ' / End of object definition
+FRM2_A = ' ' / Frame number 2
+BEGAST_E= 'SkyFrame' / Description of celestial coordinate system
+IDENT_A = '" " ' / Permanent Object identification string
+ISA_A = 'Object ' / AST Object
+NAXES_B = 2 / Number of coordinate axes
+EPOCH_A = 1977.77512999212 / Besselian epoch of observation
+SYSTEM_A= 'FK5 ' / Coordinate system type
+AX1_B = ' ' / Axis number 1
+BEGAST_F= 'SkyAxis ' / Celestial coordinate axis
+ENDAST_D= 'SkyAxis ' / End of object definition
+AX2_B = ' ' / Axis number 2
+BEGAST_G= 'SkyAxis ' / Celestial coordinate axis
+ENDAST_E= 'SkyAxis ' / End of object definition
+ISA_B = 'Frame ' / Coordinate system description
+PROJ_A = 'gnomonic' / Description of sky projection
+EQNOX_A = 2000.0 / Julian epoch of mean equinox
+SREFIS_A= 'Ignored ' / Not rotated (ref. pos. is ignored)
+SREF1_A = 0.0 / Ref. pos. RA 0:00:00.0
+SREF2_A = -1.57079633 / Ref. pos. Dec -90:00:00
+ENDAST_F= 'SkyFrame' / End of object definition
+MAP2_A = ' ' / Mapping between nodes 1 and 2
+BEGAST_H= 'CmpMap ' / Compound Mapping
+NIN_A = 2 / Number of input coordinates
+ISSIMP_A= 1 / Mapping has been simplified
+ISA_C = 'Mapping ' / Mapping between coordinate systems
+MAPA_A = ' ' / First component Mapping
+BEGAST_I= 'WinMap ' / Map one window on to another
+NIN_B = 2 / Number of input coordinates
+INVERT_A= 0 / Mapping not inverted
+ISA_D = 'Mapping ' / Mapping between coordinate systems
+SFT1_A = -893.6318379289 / Shift for axis 1
+SFT2_A = -223.8380193875 / Shift for axis 2
+ENDAST_G= 'WinMap ' / End of object definition
+MAPB_A = ' ' / Second component Mapping
+BEGAST_J= 'CmpMap ' / Compound Mapping
+NIN_C = 2 / Number of input coordinates
+ISA_E = 'Mapping ' / Mapping between coordinate systems
+MAPA_B = ' ' / First component Mapping
+BEGAST_K= 'MatrixMap' / Matrix transformation
+NIN_D = 2 / Number of input coordinates
+INVERT_B= 0 / Mapping not inverted
+ISA_F = 'Mapping ' / Mapping between coordinate systems
+M0_A = -3.25441534352674E-6/ Forward matrix value
+M1_A = -1.60367292352974E-8/ Forward matrix value
+M2_A = -1.812057487023E-8 / Forward matrix value
+M3_A = 3.25725533992408E-6 / Forward matrix value
+FORM_A = 'Full ' / Matrix storage form
+ENDAST_H= 'MatrixMap' / End of object definition
+MAPB_B = ' ' / Second component Mapping
+BEGAST_L= 'CmpMap ' / Compound Mapping
+NIN_E = 2 / Number of input coordinates
+ISA_G = 'Mapping ' / Mapping between coordinate systems
+INVA_A = 1 / First Mapping used in inverse direction
+MAPA_C = ' ' / First component Mapping
+BEGAST_M= 'WcsMap ' / FITS-WCS sky projection
+NIN_F = 2 / Number of input coordinates
+INVERT_C= 1 / Mapping inverted
+ISA_H = 'Mapping ' / Mapping between coordinate systems
+TYPE_A = 'TAN ' / Gnomonic projection
+ENDAST_I= 'WcsMap ' / End of object definition
+MAPB_C = ' ' / Second component Mapping
+BEGAST_N= 'CmpMap ' / Compound Mapping
+NIN_G = 2 / Number of input coordinates
+ISA_I = 'Mapping ' / Mapping between coordinate systems
+INVA_B = 1 / First Mapping used in inverse direction
+MAPA_D = ' ' / First component Mapping
+BEGAST_O= 'SphMap ' / Cartesian to Spherical mapping
+NIN_H = 3 / Number of input coordinates
+NOUT_A = 2 / Number of output coordinates
+INVERT_D= 1 / Mapping inverted
+ISA_J = 'Mapping ' / Mapping between coordinate systems
+UNTRD_A = 1 / All input vectors have unit length
+PLRLG_A = 0.0 / Polar longitude (rad.s)
+ENDAST_J= 'SphMap ' / End of object definition
+MAPB_D = ' ' / Second component Mapping
+BEGAST_P= 'CmpMap ' / Compound Mapping
+NIN_I = 3 / Number of input coordinates
+NOUT_B = 2 / Number of output coordinates
+ISA_K = 'Mapping ' / Mapping between coordinate systems
+MAPA_E = ' ' / First component Mapping
+BEGAST_Q= 'MatrixMap' / Matrix transformation
+NIN_J = 3 / Number of input coordinates
+INVERT_E= 0 / Mapping not inverted
+ISA_L = 'Mapping ' / Mapping between coordinate systems
+M0_B = -1.0 / Forward matrix value
+M1_B = 1.0 / Forward matrix value
+M2_B = -1.0 / Forward matrix value
+FORM_B = 'Diagonal' / Matrix storage form
+ENDAST_K= 'MatrixMap' / End of object definition
+MAPB_E = ' ' / Second component Mapping
+BEGAST_R= 'SphMap ' / Cartesian to Spherical mapping
+NIN_K = 3 / Number of input coordinates
+NOUT_C = 2 / Number of output coordinates
+INVERT_F= 0 / Mapping not inverted
+ISA_M = 'Mapping ' / Mapping between coordinate systems
+UNTRD_B = 1 / All input vectors have unit length
+PLRLG_B = 0.0 / Polar longitude (rad.s)
+ENDAST_L= 'SphMap ' / End of object definition
+ENDAST_M= 'CmpMap ' / End of object definition
+ENDAST_N= 'CmpMap ' / End of object definition
+ENDAST_O= 'CmpMap ' / End of object definition
+ENDAST_P= 'CmpMap ' / End of object definition
+ENDAST_Q= 'CmpMap ' / End of object definition
+ENDAST_R= 'FrameSet' / End of object definition
+COMMENT AST ................................................................ AST
+COMMENT AST End of AST data for FrameSet object AST
+COMMENT AST ---------------------------------------------------------------- AST
+
+ATTRIBUTES:
+ Colour(axis1) : 1
+ Font(Stri) : 1
+ Nout : 1
+ Class : 4
+ Tol : 0.100000E-01
+ Gap(1) : .523599
+ Border : 0
+ Invert : 0
+ TextLabGap : 0.100000E-01
+ Nin : 2
+ Current : 3
+ Base : 1
+ Nobject : 1
+ RefCOUNT : 1
+
+AST_GRID:
+REG_LINE: 2
+ 15.5 -136.
+ 15.4 -137.
+REG_LINE: 2
+ 18.6 -144.
+ 18.5 -146.
+REG_LINE: 2
+ 21.8 -149.
+ 21.8 -151.
+REG_LINE: 2
+ 25.1 -150.
+ 25.1 -154.
+REG_LINE: 2
+ 28.3 -149.
+ 28.4 -150.
+REG_LINE: 2
+ 31.5 -143.
+ 31.6 -145.
+REG_LINE: 2
+ 34.6 -135.
+ 34.7 -136.
+REG_LINE: 2
+ 37.6 -123.
+ 37.8 -127.
+REG_LINE: 2
+ 40.3 -108.
+ 40.4 -110.
+REG_LINE: 2
+ 42.7 -91.0
+ 42.9 -92.7
+REG_LINE: 2
+ 44.9 -71.2
+ 45.2 -72.9
+REG_LINE: 2
+ 46.7 -49.3
+ 47.5 -53.0
+REG_LINE: 2
+ 48.1 -25.8
+ 48.6 -27.4
+REG_LINE: 2
+ 49.2 -.928
+ 49.9 -2.51
+REG_LINE: 2
+ 49.8 24.8
+ 51.0 23.5
+REG_LINE: 2
+ 50.0 50.9
+ 53.7 51.1
+REG_LINE: 2
+ 49.7 77.1
+ 50.9 78.4
+REG_LINE: 2
+ 49.1 103.
+ 49.8 104.
+REG_LINE: 2
+ 48.0 127.
+ 48.5 129.
+REG_LINE: 2
+ 46.6 151.
+ 47.3 155.
+REG_LINE: 2
+ 44.7 173.
+ 45.0 174.
+REG_LINE: 2
+ 42.6 192.
+ 42.8 194.
+REG_LINE: 2
+ 40.1 209.
+ 40.2 211.
+REG_LINE: 2
+ 37.4 224.
+ 37.6 228.
+REG_LINE: 2
+ 34.4 235.
+ 34.5 237.
+REG_LINE: 2
+ 31.3 244.
+ 31.4 245.
+REG_LINE: 2
+ 28.1 248.
+ 28.1 250.
+REG_LINE: 2
+ 24.8 250.
+ 24.8 254.
+REG_LINE: 2
+ 21.6 248.
+ 21.5 250.
+REG_LINE: 2
+ 18.4 243.
+ 18.3 245.
+REG_LINE: 2
+ 15.3 234.
+ 15.2 236.
+REG_LINE: 2
+ 12.3 223.
+ 12.1 226.
+REG_LINE: 2
+ 9.62 208.
+ 9.45 210.
+REG_LINE: 2
+ 7.17 191.
+ 6.95 192.
+REG_LINE: 2
+ 5.02 171.
+ 4.74 173.
+REG_LINE: 2
+ 3.22 149.
+ 2.41 153.
+REG_LINE: 2
+ 1.78 125.
+ 1.27 127.
+REG_LINE: 2
+ .747 101.
+ -0.657E-02 102.
+REG_LINE: 2
+ .124 74.8
+ -1.11 76.1
+REG_LINE: 2
+ -0.740E-01 48.7
+ -3.82 48.5
+REG_LINE: 2
+ .156 22.6
+ -1.02 21.3
+REG_LINE: 2
+ .811 -3.08
+ 0.841E-01 -4.67
+REG_LINE: 2
+ 1.88 -27.8
+ 1.38 -29.5
+REG_LINE: 2
+ 3.34 -51.3
+ 2.56 -54.9
+REG_LINE: 2
+ 5.17 -73.0
+ 4.89 -74.7
+REG_LINE: 2
+ 7.34 -92.6
+ 7.13 -94.3
+REG_LINE: 2
+ 9.81 -110.
+ 9.65 -111.
+REG_LINE: 2
+ 12.5 -124.
+ 12.3 -128.
+REG_LINE: 2
+ 15.5 -136.
+ 15.4 -137.
+REG_LINE: 2
+ 18.6 -144.
+ 18.5 -146.
+REG_LINE: 2
+ 21.8 -149.
+ 21.8 -151.
+REG_LINE: 2
+ 25.1 -150.
+ 25.1 -154.
+REG_LINE: 2
+ 28.3 -149.
+ 28.4 -150.
+REG_LINE: 2
+ 31.5 -143.
+ 31.6 -145.
+REG_LINE: 2
+ 34.6 -135.
+ 34.7 -136.
+REG_LINE: 2
+ 24.9 74.8
+ 26.5 75.6
+REG_LINE: 2
+ 24.9 99.9
+ 26.5 101.
+REG_LINE: 2
+ 24.9 125.
+ 26.5 126.
+REG_LINE: 2
+ 24.9 150.
+ 28.3 152.
+REG_LINE: 2
+ 24.9 175.
+ 26.5 176.
+REG_LINE: 2
+ 24.9 200.
+ 26.4 201.
+REG_LINE: 2
+ 24.8 225.
+ 26.4 226.
+REG_LINE: 2
+ 24.8 250.
+ 28.2 252.
+REG_LINE: 2
+ 24.8 275.
+ 26.4 276.
+REG_LINE: 15
+ 25.1 -150.
+ 24.1 -150.
+ 23.2 -150.
+ 22.3 -149.
+ 21.3 -148.
+ 20.4 -147.
+ 19.5 -146.
+ 18.6 -144.
+ 17.7 -142.
+ 16.8 -140.
+ 15.9 -137.
+ 15.1 -134.
+ 14.2 -131.
+ 13.4 -128.
+ 12.5 -124.
+REG_LINE: 15
+ 25.1 -150.
+ 26.0 -150.
+ 26.9 -150.
+ 27.9 -149.
+ 28.8 -148.
+ 29.7 -147.
+ 30.6 -145.
+ 31.5 -143.
+ 32.4 -141.
+ 33.3 -139.
+ 34.2 -136.
+ 35.1 -133.
+ 35.9 -130.
+ 36.7 -127.
+ 37.6 -123.
+REG_LINE: 15
+ 37.6 -123.
+ 38.4 -119.
+ 39.1 -115.
+ 39.9 -111.
+ 40.6 -106.
+ 41.4 -101.
+ 42.1 -96.2
+ 42.7 -91.0
+ 43.4 -85.6
+ 44.0 -79.9
+ 44.6 -74.2
+ 45.2 -68.2
+ 45.7 -62.1
+ 46.2 -55.8
+ 46.7 -49.3
+REG_LINE: 15
+ 46.7 -49.3
+ 47.1 -42.8
+ 47.5 -36.1
+ 47.9 -29.2
+ 48.3 -22.3
+ 48.6 -15.3
+ 48.9 -8.13
+ 49.2 -.928
+ 49.4 6.35
+ 49.6 13.7
+ 49.7 21.1
+ 49.8 28.5
+ 49.9 36.0
+ 50.0 43.4
+ 50.0 50.9
+REG_LINE: 15
+ 50.0 50.9
+ 49.9 58.4
+ 49.9 65.9
+ 49.8 73.3
+ 49.7 80.8
+ 49.5 88.1
+ 49.3 95.5
+ 49.1 103.
+ 48.8 110.
+ 48.5 117.
+ 48.2 124.
+ 47.8 131.
+ 47.4 138.
+ 47.0 144.
+ 46.6 151.
+REG_LINE: 15
+ 46.6 151.
+ 46.1 157.
+ 45.6 164.
+ 45.0 170.
+ 44.4 176.
+ 43.8 181.
+ 43.2 187.
+ 42.6 192.
+ 41.9 197.
+ 41.2 202.
+ 40.5 207.
+ 39.7 212.
+ 38.9 216.
+ 38.2 220.
+ 37.4 224.
+REG_LINE: 15
+ 37.4 224.
+ 36.5 227.
+ 35.7 231.
+ 34.8 234.
+ 34.0 237.
+ 33.1 239.
+ 32.2 241.
+ 31.3 244.
+ 30.4 245.
+ 29.5 247.
+ 28.6 248.
+ 27.6 249.
+ 26.7 250.
+ 25.8 250.
+ 24.8 250.
+REG_LINE: 15
+ 24.8 250.
+ 23.9 250.
+ 23.0 249.
+ 22.0 249.
+ 21.1 248.
+ 20.2 246.
+ 19.3 245.
+ 18.4 243.
+ 17.5 241.
+ 16.6 238.
+ 15.7 236.
+ 14.8 233.
+ 14.0 230.
+ 13.1 226.
+ 12.3 223.
+REG_LINE: 15
+ 12.3 223.
+ 11.5 219.
+ 10.8 215.
+ 9.99 210.
+ 9.25 206.
+ 8.53 201.
+ 7.84 196.
+ 7.17 191.
+ 6.52 185.
+ 5.90 180.
+ 5.31 174.
+ 4.74 168.
+ 4.20 162.
+ 3.70 155.
+ 3.22 149.
+REG_LINE: 15
+ 3.22 149.
+ 2.77 142.
+ 2.35 136.
+ 1.96 129.
+ 1.61 122.
+ 1.29 115.
+ 1.00 108.
+ .747 101.
+ .526 93.3
+ .339 85.9
+ .187 78.6
+ 0.696E-01 71.1
+ -0.132E-01 63.7
+ -0.611E-01 56.2
+ -0.740E-01 48.7
+REG_LINE: 15
+ -0.740E-01 48.7
+ -0.519E-01 41.2
+ 0.519E-02 33.7
+ 0.971E-01 26.3
+ .224 18.9
+ .385 11.5
+ .581 4.18
+ .811 -3.08
+ 1.07 -10.3
+ 1.37 -17.4
+ 1.70 -24.4
+ 2.06 -31.3
+ 2.46 -38.1
+ 2.88 -44.7
+ 3.34 -51.3
+REG_LINE: 15
+ 3.34 -51.3
+ 3.83 -57.7
+ 4.34 -63.9
+ 4.89 -70.0
+ 5.46 -75.9
+ 6.06 -81.6
+ 6.69 -87.2
+ 7.34 -92.6
+ 8.02 -97.7
+ 8.72 -103.
+ 9.44 -107.
+ 10.2 -112.
+ 11.0 -116.
+ 11.7 -120.
+ 12.5 -124.
+REG_LINE: 15
+ 12.5 -124.
+ 13.4 -128.
+ 14.2 -131.
+ 15.1 -134.
+ 15.9 -137.
+ 16.8 -140.
+ 17.7 -142.
+ 18.6 -144.
+ 19.5 -146.
+ 20.4 -147.
+ 21.3 -148.
+ 22.3 -149.
+ 23.2 -150.
+ 24.1 -150.
+ 25.1 -150.
+REG_LINE: 15
+ 25.1 -150.
+ 26.0 -150.
+ 26.9 -150.
+ 27.9 -149.
+ 28.8 -148.
+ 29.7 -147.
+ 30.6 -145.
+ 31.5 -143.
+ 32.4 -141.
+ 33.3 -139.
+ 34.2 -136.
+ 35.1 -133.
+ 35.9 -130.
+ 36.7 -127.
+ 37.6 -123.
+REG_LINE: 15
+ 25.1 -150.
+ 26.0 -150.
+ 26.9 -150.
+ 27.9 -149.
+ 28.8 -148.
+ 29.7 -147.
+ 30.6 -145.
+ 31.5 -143.
+ 32.4 -141.
+ 33.3 -139.
+ 34.2 -136.
+ 35.1 -133.
+ 35.9 -130.
+ 36.7 -127.
+ 37.6 -123.
+REG_LINE: 15
+ 24.9 49.8
+ 24.9 57.0
+ 24.9 64.1
+ 24.9 71.3
+ 24.9 78.4
+ 24.9 85.6
+ 24.9 92.7
+ 24.9 99.9
+ 24.9 107.
+ 24.9 114.
+ 24.9 121.
+ 24.9 128.
+ 24.9 136.
+ 24.9 143.
+ 24.9 150.
+REG_LINE: 15
+ 24.9 150.
+ 24.9 157.
+ 24.9 164.
+ 24.9 171.
+ 24.9 179.
+ 24.9 186.
+ 24.9 193.
+ 24.9 200.
+ 24.9 207.
+ 24.8 214.
+ 24.8 221.
+ 24.8 229.
+ 24.8 236.
+ 24.8 243.
+ 24.8 250.
+REG_LINE: 8
+ 24.8 250.
+ 24.8 257.
+ 24.8 264.
+ 24.8 272.
+ 24.8 279.
+ 24.8 286.
+ 24.8 293.
+ 24.8 300.
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '12'
+ 24.9 -148. BC -0.654E-01 .998
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '14'
+ 35.1 -123. BC -.978 .210
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '16'
+ 44.2 -49.2 BC -.997 0.716E-01
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '18'
+ 47.5 50.9 BC -1.00 -0.942E-03
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '20'
+ 44.1 151. TC .997 0.732E-01
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '22'
+ 34.9 223. TC .977 .213
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '0'
+ 24.9 248. TC -0.236E-01 1.00
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '2'
+ 14.8 222. TC -.978 .210
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '4'
+ 5.71 149. TC -.997 0.716E-01
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '6'
+ 2.43 48.7 BC 1.00 0.288E-03
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '8'
+ 5.83 -51.1 BC .997 0.732E-01
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '10'
+ 15.0 -124. BC .977 .215
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '-90:00'
+ 22.4 49.8 BC -1.00 -0.615E-03
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '59'
+ 22.4 150. BC -1.00 -0.615E-03
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: '-89:58'
+ 22.3 250. BC -1.00 -0.615E-03
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 1
+REG_CAP: 2
+REG_SCALES:
+REG_QCH:
+REG_CAP: 0
+REG_CAP: 0
+REG_TEXT: ' A FITS test'
+ 30.9 313. BC .000 1.00
+ude (rad.s)
+ End SphMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin MatrixMap # Matrix transformation
+ Nin = 3 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ M0 = -1 # Forward matrix value
+ M1 = 1 # Forward matrix value
+ M2 = -1 # Forward matrix value
+ Form = "Diagonal" # Matrix storage form
+ End MatrixMap
+ MapB = # Second component Mapping
+ Begin SphMap # Cartesian to Spherical mapping
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ UntRd = 1 # All input vectors have unit length
+ PlrLg = 0 # Polar longitude (rad.s)
+ End SphMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ End FrameSet
diff --git a/ast/ast_tester/rigby.map b/ast/ast_tester/rigby.map
new file mode 100644
index 0000000..6482149
--- /dev/null
+++ b/ast/ast_tester/rigby.map
@@ -0,0 +1,240 @@
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ InvA = 1 # First Mapping used in inverse direction
+ MapA = # First component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin MatrixMap # Matrix transformation
+ Nin = 2 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ M0 = 0.1 # Forward matrix value
+ M1 = 1 # Forward matrix value
+ Form = "Diagonal" # Matrix storage form
+ End MatrixMap
+ MapB = # Second component Mapping
+ Begin WinMap # Map one window on to another
+ Nin = 2 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Sft1 = -0.0500000000000114 # Shift for axis 1
+ End WinMap
+ End CmpMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin WinMap # Map one window on to another
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ Sft1 = -3129 # Shift for axis 1
+ Sft2 = -8 # Shift for axis 2
+ End WinMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin PermMap # Coordinate permutation
+ Nin = 2 # Number of input coordinates
+ Nout = 3 # Number of output coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Out1 = 1 # Output coordinate 1 = input coordinate 1
+ Out2 = -1 # Output coordinate 2 = constant no. 1
+ Out3 = 2 # Output coordinate 3 = input coordinate 2
+ In1 = 1 # Input coordinate 1 = output coordinate 1
+ In2 = 3 # Input coordinate 2 = output coordinate 3
+ Nconst = 1 # Number of constants
+ Con1 = 232.84 # Constant number 1
+ End PermMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin MatrixMap # Matrix transformation
+ Nin = 3 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ M0 = 0.812968257918776 # Forward matrix value
+ M1 = 0.582308004080753 # Forward matrix value
+ M2 = 0 # Forward matrix value
+ M3 = -0.582308004080753 # Forward matrix value
+ M4 = 0.812968257918776 # Forward matrix value
+ M5 = 0 # Forward matrix value
+ M6 = 0 # Forward matrix value
+ M7 = 0 # Forward matrix value
+ M8 = 1 # Forward matrix value
+ Form = "Full" # Matrix storage form
+ End MatrixMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin WinMap # Map one window on to another
+ Nin = 3 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Sft1 = -1236.82078999603 # Shift for axis 1
+ Scl1 = 0.999999999977888 # Scale factor for axis 1
+ Sft2 = 586.515648677204 # Shift for axis 2
+ Scl2 = 0.999999999985306 # Scale factor for axis 2
+ Sft3 = 330420868230.796 # Shift for axis 3
+ Scl3 = 551361.368168752 # Scale factor for axis 3
+ End WinMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 3 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Series = 0 # Component Mappings applied in parallel
+ MapA = # First component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin MatrixMap # Matrix transformation
+ Nin = 2 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ M0 = -3.28230370472069e-05 # Forward matrix value
+ M1 = -1.68687502681513e-05 # Forward matrix value
+ M2 = -1.68687502681513e-05 # Forward matrix value
+ M3 = 3.28230370472069e-05 # Forward matrix value
+ Form = "Full" # Matrix storage form
+ End MatrixMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ InvA = 1 # First Mapping used in inverse direction
+ MapA = # First component Mapping
+ Begin WcsMap # FITS-WCS sky projection
+ Nin = 2 # Number of input coordinates
+ Invert = 1 # Mapping inverted
+ IsA Mapping # Mapping between coordinate systems
+ Type = "TAN" # Gnomonic projection
+ End WcsMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ InvA = 1 # First Mapping used in inverse direction
+ MapA = # First component Mapping
+ Begin SphMap # Cartesian to Spherical mapping
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ Invert = 1 # Mapping inverted
+ IsA Mapping # Mapping between coordinate systems
+ UntRd = 1 # All input vectors have unit length
+ PlrLg = 0 # Polar longitude (rad.s)
+ End SphMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin MatrixMap # Matrix transformation
+ Nin = 3 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ M0 = 0.0160398354926887 # Forward matrix value
+ M1 = 0.967192049208341 # Forward matrix value
+ M2 = 0.253539471533602 # Forward matrix value
+ M3 = -0.0610660311421554 # Forward matrix value
+ M4 = 0.254046334254542 # Forward matrix value
+ M5 = -0.96526234770262 # Forward matrix value
+ M6 = -0.998004841430097 # Forward matrix value
+ M7 = 0 # Forward matrix value
+ M8 = 0.0631374412063651 # Forward matrix value
+ Form = "Full" # Matrix storage form
+ End MatrixMap
+ MapB = # Second component Mapping
+ Begin SphMap # Cartesian to Spherical mapping
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ UntRd = 1 # All input vectors have unit length
+ PlrLg = 4.96925054084174 # Polar longitude (rad.s)
+ End SphMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ MapB = # Second component Mapping
+ Begin SlaMap # Conversion between sky coordinate systems
+ Nin = 2 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Nsla = 1 # Number of conversion steps
+ Sla1 = "EQGAL" # J2000.0 equatorial (FK5) to galactic (IAU 1958)
+ End SlaMap
+ End CmpMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 1 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin SpecMap # Conversion between spectral coordinate systems
+ Nin = 1 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Nspec = 2 # Number of conversion steps
+ Spec1 = "FRTOVL" # Convert frequency to rel. velocity
+ Spec1a = 330587960100 # Rest frequency (Hz)
+ Spec2 = "VLTOVR" # Convert relativistic to radio velocity
+ End SpecMap
+ MapB = # Second component Mapping
+ Begin ZoomMap # Zoom about the origin
+ Nin = 1 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ Zoom = 0.001 # Zoom factor
+ End ZoomMap
+ End CmpMap
+ End CmpMap
+ MapB = # Second component Mapping
+ Begin PermMap # Coordinate permutation
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ IsA Mapping # Mapping between coordinate systems
+ Out1 = 1 # Output coordinate 1 = input coordinate 1
+ Out2 = 3 # Output coordinate 2 = input coordinate 3
+ In1 = 1 # Input coordinate 1 = output coordinate 1
+ In2 = -1 # Input coordinate 2 = constant no. 1
+ In3 = 2 # Input coordinate 3 = output coordinate 2
+ Nconst = 1 # Number of constants
+ Con1 = -0.000391559614368643 # Constant number 1
+ End PermMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
diff --git a/ast/ast_tester/rigby.simp b/ast/ast_tester/rigby.simp
new file mode 100644
index 0000000..fa78112
--- /dev/null
+++ b/ast/ast_tester/rigby.simp
@@ -0,0 +1,201 @@
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin PermMap # Coordinate permutation
+ Nin = 2 # Number of input coordinates
+ Nout = 3 # Number of output coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Out1 = 1 # Output coordinate 1 = input coordinate 1
+ Out2 = -1 # Output coordinate 2 = constant no. 1
+ Out3 = 2 # Output coordinate 3 = input coordinate 2
+ In1 = 1 # Input coordinate 1 = output coordinate 1
+ In2 = 3 # Input coordinate 2 = output coordinate 3
+ Nconst = 1 # Number of constants
+ Con1 = 232.84 # Constant number 1
+ End PermMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin MatrixMap # Matrix transformation
+ Nin = 3 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ M0 = 8.1296825791877598 # Forward matrix value
+ M1 = 0.58230800408075301 # Forward matrix value
+ M2 = 0 # Forward matrix value
+ M3 = -5.8230800408075298 # Forward matrix value
+ M4 = 0.81296825791877603 # Forward matrix value
+ M5 = 0 # Forward matrix value
+ M6 = 0 # Forward matrix value
+ M7 = 0 # Forward matrix value
+ M8 = 1 # Forward matrix value
+ Form = "Full" # Matrix storage form
+ End MatrixMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin WinMap # Map one window on to another
+ Nin = 3 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Sft1 = -3780.1919848386815 # Shift for axis 1
+ Scl1 = 0.99999999997788802 # Scale factor for axis 1
+ Sft2 = 2408.2662394170707 # Shift for axis 2
+ Scl2 = 0.99999999998530598 # Scale factor for axis 2
+ Sft3 = 330416457339.85065 # Shift for axis 3
+ Scl3 = 551361.36816875194 # Scale factor for axis 3
+ End WinMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 3 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Series = 0 # Component Mappings applied in parallel
+ MapA = # First component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin MatrixMap # Matrix transformation
+ Nin = 2 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ M0 = -3.2823037047206903e-05 # Forward matrix value
+ M1 = -1.6868750268151298e-05 # Forward matrix value
+ M2 = -1.6868750268151298e-05 # Forward matrix value
+ M3 = 3.2823037047206903e-05 # Forward matrix value
+ Form = "Full" # Matrix storage form
+ End MatrixMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ InvA = 1 # First Mapping used in inverse direction
+ MapA = # First component Mapping
+ Begin WcsMap # FITS-WCS sky projection
+ Nin = 2 # Number of input coordinates
+ Invert = 1 # Mapping inverted
+ IsA Mapping # Mapping between coordinate systems
+ Type = "TAN" # Gnomonic projection
+ End WcsMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ InvA = 1 # First Mapping used in inverse direction
+ MapA = # First component Mapping
+ Begin SphMap # Cartesian to Spherical mapping
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ Invert = 1 # Mapping inverted
+ IsA Mapping # Mapping between coordinate systems
+ UntRd = 1 # All input vectors have unit length
+ PlrLg = 0 # Polar longitude (rad.s)
+ End SphMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin MatrixMap # Matrix transformation
+ Nin = 3 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ M0 = 0.016039835492688701 # Forward matrix value
+ M1 = 0.96719204920834101 # Forward matrix value
+ M2 = 0.25353947153360201 # Forward matrix value
+ M3 = -0.061066031142155398 # Forward matrix value
+ M4 = 0.25404633425454198 # Forward matrix value
+ M5 = -0.96526234770261998 # Forward matrix value
+ M6 = -0.99800484143009704 # Forward matrix value
+ M7 = 0 # Forward matrix value
+ M8 = 0.063137441206365094 # Forward matrix value
+ Form = "Full" # Matrix storage form
+ End MatrixMap
+ MapB = # Second component Mapping
+ Begin SphMap # Cartesian to Spherical mapping
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ UntRd = 1 # All input vectors have unit length
+ PlrLg = 4.96925054084174 # Polar longitude (rad.s)
+ End SphMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ MapB = # Second component Mapping
+ Begin SlaMap # Conversion between sky coordinate systems
+ Nin = 2 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Nsla = 1 # Number of conversion steps
+ Sla1 = "EQGAL" # J2000.0 equatorial (FK5) to galactic (IAU 1958)
+ End SlaMap
+ End CmpMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 1 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin SpecMap # Conversion between spectral coordinate systems
+ Nin = 1 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Nspec = 2 # Number of conversion steps
+ Spec1 = "FRTOVL" # Convert frequency to rel. velocity
+ Spec1a = 330587960100 # Rest frequency (Hz)
+ Spec2 = "VLTOVR" # Convert relativistic to radio velocity
+ End SpecMap
+ MapB = # Second component Mapping
+ Begin ZoomMap # Zoom about the origin
+ Nin = 1 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ Zoom = 0.001 # Zoom factor
+ End ZoomMap
+ End CmpMap
+ End CmpMap
+ MapB = # Second component Mapping
+ Begin PermMap # Coordinate permutation
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ IsA Mapping # Mapping between coordinate systems
+ Out1 = 1 # Output coordinate 1 = input coordinate 1
+ Out2 = 3 # Output coordinate 2 = input coordinate 3
+ In1 = 1 # Input coordinate 1 = output coordinate 1
+ In2 = -1 # Input coordinate 2 = constant no. 1
+ In3 = 2 # Input coordinate 3 = output coordinate 2
+ Nconst = 1 # Number of constants
+ Con1 = -0.00039155961436864302 # Constant number 1
+ End PermMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
diff --git a/ast/ast_tester/scp.attr b/ast/ast_tester/scp.attr
new file mode 100644
index 0000000..54434e8
--- /dev/null
+++ b/ast/ast_tester/scp.attr
@@ -0,0 +1 @@
+Grid=1,labelling=int
diff --git a/ast/ast_tester/scp.box b/ast/ast_tester/scp.box
new file mode 100644
index 0000000..76f5ba8
--- /dev/null
+++ b/ast/ast_tester/scp.box
@@ -0,0 +1 @@
+1.0 1.0 1500.0 1300.0
diff --git a/ast/ast_tester/scp.head b/ast/ast_tester/scp.head
new file mode 100644
index 0000000..f35c6f4
--- /dev/null
+++ b/ast/ast_tester/scp.head
@@ -0,0 +1,204 @@
+SIMPLE = T / file does conform to FITS standard
+BITPIX = 16 / number of bits per data pixel
+NAXIS = 2 / number of data axes
+NAXIS1 = 1787 / length of data axis 1
+NAXIS2 = 447 / length of data axis 2
+EXTEND = T / FITS dataset may contain extensions
+COMMENT FITS (Flexible Image Transport System) format defined in Astronomy and
+COMMENT Astrophysics Supplement Series v44/p363, v44/p371, v73/p359, v73/p365.
+COMMENT Contact the NASA Science Office of Standards and Technology for the
+COMMENT FITS Definition document #100 and other FITS information.
+PLATENUM= '3665 ' / Plate number
+EMULSION= 'IIIaJ ' / Kodak emulsion type
+FILTER = 'GG395 ' / Schott glass filter type
+PLTSCALE= '67.14 ' / [arcsec/mm] plate scale
+FIELDNUM= '1 ' / Sky survey field number
+EPOCH = 1.977780E+03 / Epoch of observation
+DATE-OBS= '1977-10-11' / [yyyy-mm-dd] UT date of observation
+TELESCOP= 'UKST ' / Telescope on which the plate was taken
+TELETYPE= 'SCHM ' / Type of telescope
+SITELAT = -5.458410576565E-01 / [radians] latitude of telescope
+SITELONG= 2.601766194458E+00 / [radians] longitude of telescope
+LST = '00:20 ' / [hh:mm] local sidereal time at start of obs
+MJD-OBS = 4.342657300880E+04 / Modified Julian Date of observation
+INSTRUME= 'SuperCOSMOS I' / Measuring machine
+DATE-MES= '2000-11-04' / [yyyy-mm-dd] Date of this plate measurement
+RADECSYS= 'FK5 ' / Reference frame for RA/DEC in original file
+NHKLINES= 146 / Number of lines from house-keeping file
+HKLIN001= 'JOB.JOBNO UKJ001' /
+HKLIN002= 'JOB.DATE-MES 2000:11:04' /
+HKLIN003= 'JOB.TIME 12:51:09' /
+HKLIN004= 'JOB.INSTRUME SuperCOSMOS I' /
+HKLIN005= 'JOB.ORIGIN Royal Observatory Edinburgh' /
+HKLIN006= 'JOB.SOFTWARE /home/scosdev/v033' /
+HKLIN007= 'JOB.OPERATOR ebt' /
+HKLIN008= 'JOB.USER htm' /
+HKLIN009= 'JOB.USERREF NONE' /
+HKLIN010= 'JOB.UORIGIN ROE' /
+HKLIN011= 'JOB.UCOUNTRY uk' /
+HKLIN012= 'JOB.COMMENT Digital catalogue of the Sky' /
+HKLIN013= 'JOB.IAM_FILE iam.srt' /
+HKLIN014= 'PLATE.TELESCOP UKST' /
+HKLIN015= 'PLATE.TELTYPE SCHM' /
+HKLIN016= 'PLATE.PLATE 3665' /
+HKLIN017= 'PLATE.MATERIAL 3mm glass' /
+HKLIN018= 'PLATE.EMULSION IIIaJ' /
+HKLIN019= 'PLATE.FILTER GG395' /
+HKLIN020= 'PLATE.PSCALE 67.14' /
+HKLIN021= 'PLATE.FIELD 1' /
+HKLIN022= 'PLATE.RA_PNT 0' /
+HKLIN023= 'PLATE.DEC_PNT -90' /
+HKLIN024= 'PLATE.RADECSYS FK4' /
+HKLIN025= 'PLATE.EQUINOX 1950' /
+HKLIN026= 'PLATE.TIMESYS BESSELIAN' /
+HKLIN027= 'PLATE.EPOCH 1977.78' /
+HKLIN028= 'PLATE.EXPOSURE 75' /
+HKLIN029= 'PLATE.UTDATE 771011' /
+HKLIN030= 'PLATE.LST 0020' /
+HKLIN031= 'PLATE.MJD 43426.573008796' /
+HKLIN032= 'PLATE.TELLAT -0.54584105765654' /
+HKLIN033= 'PLATE.TELLONG 2.6017661944583' /
+HKLIN034= 'PLATE.TELHT 1145' /
+HKLIN035= 'PLATE.TEMP 273.155' /
+HKLIN036= 'PLATE.ATMOSP 1013.25' /
+HKLIN037= 'PLATE.HUMID 0.5' /
+HKLIN038= 'PLATE.WAVE 4500' /
+HKLIN039= 'PLATE.TROPL 0.0065' /
+HKLIN040= 'CALIBRATION.CALTYPE SPLINE' /
+HKLIN041= 'CALIBRATION.STEPWEDG KPNO' /
+HKLIN042= 'CALIBRATION.NSTEPS 8' /
+HKLIN043= 'MEASUREMENT.ORIENTAT news' /
+HKLIN044= 'MEASUREMENT.EMULPOS UP' /
+HKLIN045= 'MEASUREMENT.SCANFILT 14' /
+HKLIN046= 'MEASUREMENT.SOSP 552' /
+HKLIN047= 'MEASUREMENT.STEPSIZE 10' /
+HKLIN048= 'MEASUREMENT.SCANLEN 1152' /
+HKLIN049= 'MEASUREMENT.A-XMIN 1622000' /
+HKLIN050= 'MEASUREMENT.A-YMIN 1622000' /
+HKLIN051= 'MEASUREMENT.A-XMAX 33878000' /
+HKLIN052= 'MEASUREMENT.A-YMAX 33878000' /
+HKLIN053= 'MEASUREMENT.X_PNT 17500000' /
+HKLIN054= 'MEASUREMENT.Y_PNT 18000000' /
+HKLIN055= 'ANALYSIS.NPARAMS 32' /
+HKLIN056= 'ANALYSIS.AREACUT 8' /
+HKLIN057= 'ANALYSIS.AP-PARAM 1.07' /
+HKLIN058= 'DEBLEND.DB-PARAM 1.05' /
+HKLIN059= 'DEBLEND.DB-AMIN 16' /
+HKLIN060= 'DEBLEND.DB-AMAX 100000' /
+HKLIN061= 'DEBLEND.DB-ACUT 8' /
+HKLIN062= 'DEBLEND.DB-LEVEL 16' /
+HKLIN063= 'DEBLEND.SELECT PARENT+CHILD' /
+HKLIN064= 'SKY.SKYSQUAR 64' /
+HKLIN065= 'SKY.SKYDEFN MEDIAN' /
+HKLIN066= 'SKY.SKYFILTR bdkjunk' /
+HKLIN067= 'SKY.F-THRESH 8' /
+HKLIN068= 'SKY.F-SCLEN 4' /
+HKLIN069= 'THRESHOLDING.PCUT 10' /
+HKLIN070= 'IAMQC.AREAMIN 8' /
+HKLIN071= 'IAMQC.AREAMAX 77346' /
+HKLIN072= 'IAMQC.MINMAG -30515' /
+HKLIN073= 'IAMQC.MAXMAG -17954' /
+HKLIN074= 'IAMQC.MINELL 0.0004156232' /
+HKLIN075= 'IAMQC.MAXELL 1' /
+HKLIN076= 'IAMQC.MODELL 0.14' /
+HKLIN077= 'IAMQC.MODOR 91' /
+HKLIN078= 'IAMQC.MIDELL 0.21' /
+HKLIN079= 'IAMQC.MIDOR 93' /
+HKLIN080= 'IAMQC.MEANELL 0.2467037' /
+HKLIN081= 'IAMQC.MEANOR 91.63474' /
+HKLIN082= 'IAMQC.NUMOBJ 556985' /
+HKLIN083= 'IAMQC.PARENTS 486656' /
+HKLIN084= 'IAMQC.RANGING TRUE' /
+HKLIN085= 'IAMQC.LANE_1 15571' /
+HKLIN086= 'IAMQC.LANE_2 33207' /
+HKLIN087= 'IAMQC.LANE_3 51478' /
+HKLIN088= 'IAMQC.LANE_4 69944' /
+HKLIN089= 'IAMQC.LANE_5 89236' /
+HKLIN090= 'IAMQC.LANE_6 108416' /
+HKLIN091= 'IAMQC.LANE_7 127481' /
+HKLIN092= 'IAMQC.LANE_8 146699' /
+HKLIN093= 'IAMQC.LANE_9 166380' /
+HKLIN094= 'IAMQC.LANE_10 186126' /
+HKLIN095= 'IAMQC.LANE_11 205946' /
+HKLIN096= 'IAMQC.LANE_12 225915' /
+HKLIN097= 'IAMQC.LANE_13 245926' /
+HKLIN098= 'IAMQC.LANE_14 266574' /
+HKLIN099= 'IAMQC.LANE_15 287150' /
+HKLIN100= 'IAMQC.LANE_16 308087' /
+HKLIN101= 'IAMQC.LANE_17 328830' /
+HKLIN102= 'IAMQC.LANE_18 350253' /
+HKLIN103= 'IAMQC.LANE_19 370738' /
+HKLIN104= 'IAMQC.LANE_20 391722' /
+HKLIN105= 'IAMQC.LANE_21 412801' /
+HKLIN106= 'IAMQC.LANE_22 433795' /
+HKLIN107= 'IAMQC.LANE_23 454383' /
+HKLIN108= 'IAMQC.LANE_24 474711' /
+HKLIN109= 'IAMQC.LANE_25 495108' /
+HKLIN110= 'IAMQC.LANE_26 515755' /
+HKLIN111= 'IAMQC.LANE_27 536499' /
+HKLIN112= 'IAMQC.LANE_28 556985' /
+HKLIN113= 'XYTORADEC.STARCAT /sdata/scos/refcats/tycho2.FIT' /
+HKLIN114= 'XYTORADEC.BRIGHTLIM 9' /
+HKLIN115= 'XYTORADEC.C-EQUIN 2000' /
+HKLIN116= 'XYTORADEC.C-EQTSYS JULIAN' /
+HKLIN117= 'XYTORADEC.C-EPOCH 2000' /
+HKLIN118= 'XYTORADEC.C-EPTSYS JULIAN' /
+HKLIN119= 'XYTORADEC.R-EQUIN 2000' /
+HKLIN120= 'XYTORADEC.R-TSYS JULIAN' /
+HKLIN121= 'XYTORADEC.MAXITER 5000' /
+HKLIN122= 'XYTORADEC.RCRITINI 500000' /
+HKLIN123= 'XYTORADEC.RCRITABS 50000' /
+HKLIN124= 'XYTORADEC.RCRITREL 1' /
+HKLIN125= 'XYTORADEC.RCRITFIN 3' /
+HKLIN126= 'XYTORADEC.HARDCOPY /scos1/scos/UKJ001/UKJ001.ps' /
+HKLIN127= 'XYTORADEC.REFSMULT 5' /
+HKLIN128= 'XYTORADEC.RESDMULT 1000' /
+HKLIN129= 'XYTORADEC.RACOL RA' /
+HKLIN130= 'XYTORADEC.DECOL DEC' /
+HKLIN131= 'XYTORADEC.RAPMCOL PMRA' /
+HKLIN132= 'XYTORADEC.DECPMCOL PMDE' /
+HKLIN133= 'XYTORADEC.PLXCOL NONE' /
+HKLIN134= 'XYTORADEC.RVCOL NONE' /
+HKLIN135= 'XYTORADEC.MAGCOL VT' /
+HKLIN136= 'XYTORADEC.STARSC 2374' /
+HKLIN137= 'XYTORADEC.STARSU 1727' /
+HKLIN138= 'XYTORADEC.COEFFS_1 17.640343856524' /
+HKLIN139= 'XYTORADEC.COEFFS_2 -260.44151995641' /
+HKLIN140= 'XYTORADEC.COEFFS_3 -163.09155572601' /
+HKLIN141= 'XYTORADEC.COEFFS_4 17.504230442205' /
+HKLIN142= 'XYTORADEC.COEFFS_5 -163.08676953832' /
+HKLIN143= 'XYTORADEC.COEFFS_6 260.48817907668' /
+HKLIN144= 'XYTORADEC.DISTR -0.33333333333333' /
+HKLIN145= 'XYTORADEC.RA_PNT 0.54924996662137' /
+HKLIN146= 'XYTORADEC.DEC_PNT -1.5684931501781' /
+HISTORY = 'SuperCOSMOS image analysis and mapping mode (IAM and MM)' /
+HISTORY = 'data written by xydcomp_ss.' /
+HISTORY = 'Any questions/comments/suggestions/bug reports should be sent' /
+HISTORY = 'to N.Hambly@roe.ac.uk' /
+ASTSIGX = 3.700000E-01 / [arcsec] std. dev. of astrometric fit in X
+ASTSIGY = 3.800000E-01 / [arcsec] std. dev. of astrometric fit in Y
+CRVAL1 = 0.000000000000E+00 / Axis 1 reference value
+CRPIX1 = 8.936318379289E+02 / Axis 1 pixel value
+CTYPE1 = 'RA---TAN' / Quantity represented by axis 1
+CRVAL2 = -9.000000018364E+01 / Axis 2 reference value
+CRPIX2 = 2.238380193875E+02 / Axis 2 pixel value
+CTYPE2 = 'DEC--TAN' / Quantity represented by axis 2
+CD1_1 = -1.864642639667E-04 / Co-ordinate transformation matrix
+CD1_2 = -9.188369023766E-07 / Co-ordinate transformation matrix
+CD2_1 = -1.038232462415E-06 / Co-ordinate transformation matrix
+CD2_2 = 1.866269837741E-04 / Co-ordinate transformation matrix
+PC001001= 9.999878591881E-01 / DEPRECATED - Axis rotation matrix
+PC001002= 4.927623810613E-03 / DEPRECATED - Axis rotation matrix
+PC002001= -5.563056187788E-03 / DEPRECATED - Axis rotation matrix
+PC002002= 9.999845260832E-01 / DEPRECATED - Axis rotation matrix
+CROTA2 = 3.005532298491E-01 / DEPRECATED - rotation of axis 2
+EQUINOX = 2.000000E+03 / Julian reference frame equinox
+DATATYPE= 'INTEGER*2' / Type of data
+DATUNITS= 'DENSITY ' / Units: transmission, density or intensity
+XPIXELSZ= 9.997114974000E+00 / [microns] X pixel size
+YPIXELSZ= 1.000000000000E+01 / [microns] Y pixel size
+OBJCTRA = ' 0 0 0.000' / Centre Right Ascension (J2000)
+OBJCTDEC= '-90 0 0.00' / Centre Declination (J2000)
+OBJCTX = 1.636863183793E+04 / [pixels] Centre X on plate
+OBJCTY = 1.474083801939E+04 / [pixels] Centre Y on plate
+END
diff --git a/ast/ast_tester/serpens.attr b/ast/ast_tester/serpens.attr
new file mode 100644
index 0000000..496403c
--- /dev/null
+++ b/ast/ast_tester/serpens.attr
@@ -0,0 +1 @@
+border=1
diff --git a/ast/ast_tester/serpens.box b/ast/ast_tester/serpens.box
new file mode 100644
index 0000000..f9576e8
--- /dev/null
+++ b/ast/ast_tester/serpens.box
@@ -0,0 +1 @@
+0.5 0.5 150.5 120.5
diff --git a/ast/ast_tester/serpens.head b/ast/ast_tester/serpens.head
new file mode 100644
index 0000000..0775604
--- /dev/null
+++ b/ast/ast_tester/serpens.head
@@ -0,0 +1,160 @@
+NAXIS1 = 150 / length of data axis 1
+NAXIS2 = 120 / length of data axis 2
+DATE-OBS= '2007-04-30T15:13:53.717'/ Date of observation
+CRPIX1 = 75.910204 / Reference pixel on axis 1
+CRPIX2 = 60.359184 / Reference pixel on axis 2
+CRVAL1 = 1.220833333 / Value at ref. pixel on axis 1
+CRVAL2 = 277.5004167 / Value at ref. pixel on axis 2
+CTYPE1 = 'DEC--TAN' / Type of co-ordinate on axis 1
+CTYPE2 = 'RA---TAN' / Type of co-ordinate on axis 2
+CD1_1 = -0.001831773954 / Transformation matrix element
+CD1_2 = -8.541702226E-4 / Transformation matrix element
+CD2_1 = 0.0008541702226 / Transformation matrix element
+CD2_2 = -0.001831773954 / Transformation matrix element
+RADECSYS= 'FK5 ' / Reference frame for RA/DEC values
+EQUINOX = 2000.0 / Epoch of reference equinox
+DUT1 = -1.145603703E-6 / [d] UT1-UTC correction
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+EXP_TIME= 41.97277069 / [s] Median MAKECUBE exposure time
+EFF_TIME= 11.13561535 / [s] Median MAKECUBE effective integration time
+PROVCNT = 1 / Number of unique OBSIDs
+OBS00001= 'acsis_98_20070430T151247'/ OBSID from component observation
+
+
+HISTORY History structure created 2007 Apr 30 05:52:50.656
+HISTORY Update mode: NORMAL Current record: 8
+
+HISTORY 1: 2007 Apr 30 05:52:53.959 - MAKECUBE (SMURF V0.2.2)
+HISTORY User: operator Host: kolea Width: 72
+HISTORY Dataset: /jcmtdata/reduced/acsis/20070430/a20070430_00098_01_cube
+HISTORY Parameters: AUTOGRID=TRUE CROTA=115 DETECTORS=!
+HISTORY FBL=[4.8435931408225,0.024206080047514]
+HISTORY FBR=[4.8456657339925,0.019762137343435]
+HISTORY FLBND=[4.8407875332009,0.018441755319268,-426.75185625342]
+HISTORY FUBND=[4.8456891772589,0.024229519070352,440.3284772626]
+HISTORY FTL=[4.8408109789176,0.022909013956528]
+HISTORY FTR=[4.8428837776034,0.018465194476559] GENVAR='tsys'
+HISTORY IN=@^/jcmtdata/reduced/acsis/20070430/oractemppV8I2A.lis
+HISTORY INWEIGHT=TRUE LBOUND=[-70,-41,-1024] OUT=@a20070430_00098_01_cube
+HISTORY OUTCAT=! PIXSIZE=7.2761 MSG_FILTER='NORM' REFLAT='1:13:15'
+HISTORY REFLON='18:30:00.1' SPARSE=FALSE SPECBOUNDS='-426.5402 440.1168'
+HISTORY TRIM=TRUE WEIGHTS=FALSE SPREAD='nearest' SYSTEM='TRACKING'
+HISTORY UBOUND=[69,46,1023] USEDETPOS=TRUE
+HISTORY Software: /star/bin/smurf/smurf_mon
+
+HISTORY 2: 2007 Apr 30 05:52:59.952 - NDFCOPY (KAPPA 1.7-2)
+HISTORY User: operator Host: kolea Width: 72
+HISTORY Dataset: /jcmtdata/reduced/acsis/20070430/a20070430_00098_01_em
+HISTORY Parameters: IN=@a20070430_00098_01_cube(,,-820:819) LIKE=!
+HISTORY OUT=@a20070430_00098_01_em TITLE=! TRIM=FALSE
+HISTORY Software: /star/bin/kappa/ndfpack_mon
+
+HISTORY 3: 2007 Apr 30 05:53:04.009 - MFITTREND (KAPPA 1.7-2)
+HISTORY User: operator Host: kolea Width: 72
+HISTORY Dataset: /jcmtdata/reduced/acsis/20070430/a20070430_00098_01_bl
+HISTORY Parameters: ARANGES=[-820,-56,47,819] AUTO=TRUE AXIS=@3 CLIP=[2,2,2.5,3]
+HISTORY IN=@a20070430_00098_01_em MODIFYIN=FALSE ORDER=0
+HISTORY OUT=@a20070430_00098_01_bl RMSCLIP=! SECTION='-70:69,-41:46,'
+HISTORY SUBTRACT=TRUE TITLE=! VARIANCE=TRUE
+HISTORY Software: /star/bin/kappa/kappa_mon
+
+HISTORY 4: 2007 Apr 30 05:53:17.048 - NDFCOPY (KAPPA 1.7-2)
+HISTORY User: operator Host: kolea Width: 72
+HISTORY Dataset: /jcmtdata/reduced/acsis/20070430/ga20070430_98
+HISTORY Parameters: IN=@a20070430_00098_01_bl LIKE=! OUT=@ga20070430_98
+HISTORY TITLE='ga20070430_98' TRIM=FALSE
+HISTORY Software: /star/bin/kappa/ndfpack_mon
+
+HISTORY 5: 2007 Apr 30 06:40:02.994 - WCSMOSAIC (KAPPA 1.7-2)
+HISTORY User: operator Host: kolea Width: 72
+HISTORY Dataset: /jcmtdata/reduced/acsis/20070430/oractemppLv7wv
+HISTORY Parameters: ACC=0.05 GENVAR=FALSE ILEVEL=2
+HISTORY IN=@^/jcmtdata/reduced/acsis/20070430/oractempyopUhZ.lis LBND=!
+HISTORY LBOUND=[-70,-43,-820] MAXPIX=1000 METHOD='nearest'
+HISTORY OUT=@/jcmtdata/reduced/acsis/20070430/oractemppLv7wv REF=! UBND=!
+HISTORY UBOUND=[69,46,819] VARIANCE=TRUE WLIM=1E-10
+HISTORY Software: /star/bin/kappa/kappa_mon
+
+HISTORY 6: 2007 Apr 30 06:40:05.801 - NDFCOPY (KAPPA 1.7-2)
+HISTORY User: operator Host: kolea Width: 72
+HISTORY Dataset: /jcmtdata/reduced/acsis/20070430/ga20070430_98
+HISTORY Parameters: IN=@/jcmtdata/reduced/acsis/20070430/oractemppLv7wv LIKE=!
+HISTORY OUT=@ga20070430_98 TITLE=! TRIM=FALSE
+HISTORY Software: /star/bin/kappa/ndfpack_mon
+
+HISTORY 7: 2007 May 10 10:42:40.627 - WCSMOSAIC (KAPPA 1.7-3)
+HISTORY User: jbuckle Host: scubadev Width: 72
+HISTORY Dataset: /home/jbuckle/data/serpens_cube
+HISTORY Parameters: ACC=0.05 GENVAR=FALSE ILEVEL=2
+HISTORY IN=@ga20070430_98,ga20070502_63_1 LBND=! LBOUND=[-77,-52,-820]
+HISTORY MAXPIX=1000 METHOD='nearest' OUT=@serpens_cube REF=!
+HISTORY UBOUND=[77,54,819] VARIANCE=TRUE WLIM=1E-10
+HISTORY Software: /star/bin/kappa/wcsmosaic
+
+HISTORY 8: 2007 May 17 12:04:41.724 - NDFCOPY (KAPPA 1.7-2)
+HISTORY User: dsb Host: localhost.localdomain Width: 72
+HISTORY Dataset: /stardev/jaccvs/jcmt/scuba2/soft/smurf/makecube/jane
+HISTORY Parameters: IN=@serpens_cube(~150,~120,0) LIKE=! OUT=@jane TITLE=!
+HISTORY TRIM=TRUE TRIMWCS=TRUE USEAXIS=!
+HISTORY Software: /stardev/cvs/star/bin/kappa/ndfcopy
+END
+XTENSION= 'IMAGE ' / IMAGE extension
+BITPIX = -32 / number of bits per data pixel
+NAXIS = 2 / number of data axes
+NAXIS1 = 150 / length of data axis 1
+NAXIS2 = 120 / length of data axis 2
+PCOUNT = 0 / required keyword; must = 0
+GCOUNT = 1 / required keyword; must = 1
+LBOUND1 = -74 / Pixel origin along axis 1
+LBOUND2 = -58 / Pixel origin along axis 2
+OBJECT = 'ga20070430_98' / Title of the dataset
+LABEL = 'T%s60+%v30+A%^50+%<20+*%+ corrected antenna ...'/ Label of the pri
+BUNIT = 'K ' / Units of the primary array
+DATE = '2007-05-17T11:05:09'/ file creation date (YYYY-MM-DDThh:mm:ss UT)
+ORIGIN = 'Starlink Project, U.K.'/ Origin of this FITS file
+BSCALE = 1.0 / True_value = BSCALE * FITS_value + BZERO
+BZERO = 0.0 / True_value = BSCALE * FITS_value + BZERO
+HDUCLAS1= 'NDF ' / Starlink NDF (hierarchical n-dim format)
+HDUCLAS2= 'VARIANCE' / Array component subclass
+EXTNAME = 'VARIANCE' / Array component
+HDSTYPE = 'NDF ' / HDS data type of the component
+
+CRPIX1 = 75.910204 / Reference pixel on axis 1
+CRPIX2 = 60.359184 / Reference pixel on axis 2
+CRVAL1 = 1.220833333 / Value at ref. pixel on axis 1
+CRVAL2 = 277.5004167 / Value at ref. pixel on axis 2
+CTYPE1 = 'DEC--TAN' / Type of co-ordinate on axis 1
+CTYPE2 = 'RA---TAN' / Type of co-ordinate on axis 2
+CD1_1 = -0.001831773954 / Transformation matrix element
+CD1_2 = -8.541702226E-4 / Transformation matrix element
+CD2_1 = 0.0008541702226 / Transformation matrix element
+CD2_2 = -0.001831773954 / Transformation matrix element
+RADECSYS= 'FK5 ' / Reference frame for RA/DEC values
+EQUINOX = 2000.0 / Epoch of reference equinox
+DATE-OBS= '2007-04-30T15:13:53.717'/ Date of observation
+END
diff --git a/ast/ast_tester/simplify.f b/ast/ast_tester/simplify.f
new file mode 100644
index 0000000..063ebd1
--- /dev/null
+++ b/ast/ast_tester/simplify.f
@@ -0,0 +1,123 @@
+ PROGRAM SIMPLIFY
+
+* Usage:
+* simplify <in file> <out file>
+
+* Description:
+* Reads a Mapping from "in file" (as an AST dump), and writes out the
+* simplified Mapping to "out file".
+
+* Parameters:
+* in file
+* A text file containing an AST dump of a Mapping.
+* out file
+* The output file. Contains an AST dump of the simplified Mapping
+* on exit.
+
+
+ IMPLICIT NONE
+ INCLUDE 'AST_PAR'
+ EXTERNAL SOURCE, SINK
+
+ INTEGER STATUS, OBJECT, IARGC, CHAN, CHR_LEN, OC, SMAP
+ CHARACTER FILE*80, OFILE*80, LINE*255
+
+ STATUS = 0
+*
+* Check command line arguments have been supplied.
+*
+ IF( IARGC() .LT. 2 ) THEN
+ WRITE(*,*) 'Usage: simplify <in file> <out file>'
+ RETURN
+ END IF
+
+*
+* Open the name of the input text file.
+*
+ CALL GETARG( 1, FILE )
+
+* Attempt to read an object from the text file as an AST dump.
+ OPEN( UNIT=10, FILE=FILE, STATUS='OLD' )
+ CHAN = AST_CHANNEL( SOURCE, AST_NULL, ' ', STATUS )
+ OBJECT = AST_READ( CHAN, STATUS )
+ CALL AST_ANNUL( CHAN, STATUS )
+ CLOSE( 10 )
+
+*
+* Abort if no object was read.
+*
+ IF( OBJECT .EQ. AST__NULL ) THEN
+ WRITE(*,*) 'simplify: no Mapping could be read from ',
+ : file( : chr_len( file ) )
+ RETURN
+
+*
+* Otherwise write out the simplified Mapping
+*
+ ELSE
+ CALL GETARG( 2, OFILE )
+ CALL DELETEFILE( OFILE )
+
+ SMAP = AST_SIMPLIFY( OBJECT, STATUS )
+
+ OPEN( UNIT=10, FILE=OFILE, STATUS='NEW' )
+ CHAN = AST_CHANNEL( AST_NULL, SINK, ' ', STATUS )
+ IF( AST_WRITE( CHAN, SMAP, STATUS ) .NE. 1 ) THEN
+ WRITE(*,*) 'simplify: Simplified Mapping read from ',
+ : file( : chr_len( file ) ),' could not be '//
+ : 'written out.'
+ END IF
+ CALL AST_ANNUL( CHAN, STATUS )
+ CALL AST_ANNUL( SMAP, STATUS )
+ CLOSE( 10 )
+ END IF
+
+
+ END
+
+
+*
+* Delete a file if it exists.
+*
+ SUBROUTINE DELETEFILE( FILNAM )
+ IMPLICIT NONE
+
+ CHARACTER FILNAM*(*)
+ LOGICAL EXISTS
+
+ INQUIRE ( FILE = FILNAM,
+ : EXIST = EXISTS )
+
+ IF( EXISTS ) THEN
+ OPEN ( UNIT=10, FILE=FILNAM, STATUS='OLD' )
+ CLOSE ( 10, STATUS='DELETE' )
+ END IF
+
+ END
+
+
+*
+* SOURCE FUNCTION FOR AST_CHANNEL.
+*
+ SUBROUTINE SOURCE( STATUS )
+ IMPLICIT NONE
+ INTEGER STATUS
+ CHARACTER BUFFER*200
+ READ( 10, '(A)', END=99 ) BUFFER
+ CALL AST_PUTLINE( BUFFER, LEN( BUFFER ), STATUS )
+ RETURN
+ 99 CALL AST_PUTLINE( BUFFER, -1, STATUS )
+ END
+
+*
+* SINK FUNCTION FOR AST_CHANNEL.
+*
+ SUBROUTINE SINK( STATUS )
+ IMPLICIT NONE
+ INTEGER STATUS, L
+ CHARACTER BUFFER*200
+
+ CALL AST_GETLINE( BUFFER, L, STATUS )
+ IF( L .GT. 0 ) WRITE( 10, '(A)' ) BUFFER( : L )
+
+ END
diff --git a/ast/ast_tester/sip.fits-wcs b/ast/ast_tester/sip.fits-wcs
new file mode 100644
index 0000000..92d29ed
--- /dev/null
+++ b/ast/ast_tester/sip.fits-wcs
@@ -0,0 +1,289 @@
+SIMPLE = T / Fits standard
+BITPIX = -32 / FOUR-BYTE SINGLE PRECISION FLOATING POINT
+NAXIS = 2 / STANDARD FITS FORMAT
+NAXIS1 = 256 / STANDARD FITS FORMAT
+NAXIS2 = 256 / STANDARD FITS FORMAT
+ORIGIN = 'Spitzer Science Center' / Organization generating this FITS file
+CREATOR = 'S16.1.0 ' / SW version used to create this FITS file
+TELESCOP= 'Spitzer ' / SPITZER Space Telescope
+INSTRUME= 'IRAC ' / SPITZER Space Telescope instrument ID
+CHNLNUM = 1 / 1 digit instrument channel number
+EXPTYPE = 'sci ' / Exposure Type
+REQTYPE = 'AOR ' / Request type (AOR, IER, or SER)
+AOT_TYPE= 'IracMap ' / Observation template type
+AORLABEL= '05cs-IRAC-2' / AOR Label
+FOVID = 67 / Field of View ID
+FOVNAME = 'IRAC_Center_of_3.6&5.8umArray' / Field of View Name
+
+ / PROPOSAL INFORMATION
+
+OBSRVR = 'Ben Sugerman' / Observer Name (Last, First)
+OBSRVRID= 14621 / Observer ID of Principal Investigator
+PROCYCL = 6 / Proposal Cycle
+PROGID = 30494 / Program ID
+PROTITLE= 'Supernovae and the Origin of Dust in Galaxies: Follow-Up Observation'
+PROGCAT = 30 / Program Category
+
+ / TIME AND EXPOSURE INFORMATION
+
+DATE_OBS= '2007-06-29T03:15:33.555' / Date & time at DCE start
+MJD_OBS = 54280.136 / [days] MJD at DCE start (,JD-2400000.5)
+UTCS_OBS= 2.3635893E+8 / [sec] J2000 ephem. time at DCE start
+SCLK_OBS= 8.675543E+8 / [sec] SCLK time (since 1/1/1980) at DCE start
+SAMPTIME= 0.2 / [sec] Sample integration time
+FRAMTIME= 12.0 / [sec] Time spent integrating (whole array)
+COMMENT Photons in Well = Flux[photons/sec/pixel] * FRAMTIME
+EXPTIME = 10.4 / [sec] Effective integration time per pixel
+COMMENT DN per pixel = Flux[photons/sec/pixel] / GAIN * EXPTIME
+INTRFDLY= 8.0 / [sec] Inter Frame Delay Time
+AINTBEG = 107646.2 / [Secs since IRAC turn-on] Time of integ. start
+ATIMEEND= 107658.16 / [Secs since IRAC turn-on] Time of integ. end
+AFOWLNUM= 8 / Fowler number
+AWAITPER= 44 / [0.2 sec] Wait period
+ANUMREPS= 1 / Number of repeat integrations
+AREADMOD= 0 / Full (0) or subarray (1)
+HDRMODE = F / DCE taken in High Dynamic Range mode
+ABARREL = 3 / Barrel shift
+APEDSIG = 0 / 0=Normal, 1=Pedestal, 2=Signal
+
+ / TARGET AND POINTING INFORMATION
+
+OBJECT = 'SN 2005cs' / Target Name
+OBJTYPE = 'TargetFixedSingle' / Object Type
+CRVAL1 = 202.48232 / [deg] RA at CRPIX1,CRPIX2 (using Pointing Recon
+CRVAL2 = 47.175119 / [deg] DEC at CRPIX1,CRPIX2 (using Pointing Reco
+RA_HMS = '13h29m55.8s' / [hh:mm:ss.s] CRVAL1 as sexagesimal
+DEC_DMS = '+47d10m30s' / [dd:mm:ss] CRVAL2 as sexagesimal
+RADESYS = 'ICRS ' / International Celestial Reference System
+CD1_1 = 0.00024975688 / Corrected CD matrix element with Pointing Recon
+CD1_2 = 0.00023017781 / Corrected CD matrix element with Pointing Recon
+CD2_1 = 0.00023042852 / Corrected CD matrix element with Pointing Recon
+CD2_2 = -2.4996577E-4 / Corrected CD matrix element with Pointing Reco
+CTYPE1 = 'RA---TAN-SIP' / RA---TAN with distortion in pixel space
+CTYPE2 = 'DEC--TAN-SIP' / DEC--TAN with distortion in pixel space
+CRPIX1 = 128.0 / Reference pixel along axis 1
+CRPIX2 = 128.0 / Reference pixel along axis 2
+MJD-OBS = 51544.499 / Modified Julian Date of observation
+DATE-OBS= '2000-01-01T11:58:55.816' / Date of observation
+PXSCAL1 = -1.2233412 / [arcsec/pix] Scale for axis 1 at CRPIX1,CRPIX2
+PXSCAL2 = 1.2232836 / [arcsec/pix] Scale for axis 2 at CRPIX1,CRPIX2
+CRDER1 = 4.0250976E-5 / [deg] Uncertainty in CRVAL1
+CRDER2 = 3.4274613E-5 / [deg] Uncertainty in CRVAL2
+UNCRTPA = 0.00037878784 / [deg] Uncertainty in position angle
+CSDRADEC= 4.7597178E-7 / [deg] Costandard deviation in RA and Dec
+SIGRA = 0.033948714 / [arcsec] RMS dispersion of RA over DCE
+SIGDEC = 0.063768266 / [arcsec] RMS dispersion of DEC over DCE
+SIGPA = 1.3646427 / [arcsec] RMS dispersion of PA over DCE
+PA = 137.35998 / [deg] Position angle of axis 2 (E of N) (was OR
+RA_RQST = 202.48212 / [deg] Requested RA at CRPIX1, CRPIX2
+DEC_RQST= 47.175079 / [deg] Requested Dec at CRPIX1, CRPIX2
+PM_RA = 0.0 / [arcsec/yr] Proper Motion in RA (J2000)
+PM_DEC = 0.0 / [arcsec/yr] Proper Motion in Dec (J200)
+RMS_JIT = 0.007683034 / [arcsec] RMS jitter during DCE
+RMS_JITY= 0.0051507034 / [arcsec] RMS jitter during DCE along Y
+RMS_JITZ= 0.0057008128 / [arcsec] RMS jitter during DCE along Z
+SIG_JTYZ= 0.0023780641 / [arcsec] Costadard deviation of jitter in YZ
+PTGDIFF = 0.52510652 / [arcsec] Offset btwn actual and rqsted pntng
+PTGDIFFX= 0.46966798 / [pixels] rqsted - actual pntng along axis 1
+PTGDIFFY= -0.2352852 / [pixels] rqsted - actual pntng along axis 2
+RA_REF = 202.47237 / [deg] Commanded RA (J2000) of ref. position
+DEC_REF = 47.1745 / [deg] Commanded Dec (J2000) of ref. position
+USEDBPHF= T / T if Boresight Pointing History File was used
+BPHFNAME= 'SBPHF.0867542400.031.pntg' / Boresight Pointing History Filename
+FOVVERSN= 'BodyFrames_FTU_14a.xls' / FOV/BodyFrames file version used
+RECONFOV= 'IRAC_Center_of_3.6umArray' / Reconstructed Field of View
+RARFND = 202.48232 / [deg] Refined RA
+DECRFND = 47.175121 / [deg] Refined DEC
+CT2RFND = 137.35905 / [deg] Refined CROT2
+ERARFND = 2.332304E-6 / [deg] Error in RARFND value
+EDECRFND= 2.332411E-6 / [deg] Error in DECRFND value
+ECT2RFND= 0.00054069905 / [deg] Error in CT2RFND value
+NASTROM = 12 / Astrometric sources for absolute refinement
+ORIG_RA = 202.48206 / [deg] Original RA from raw BPHF (without pointi
+ORIG_DEC= 47.175072 / [deg] Original Dec from raw BPHF (without point
+ORIGCD11= 0.00024975633 / [deg/pix] Original CD1_1 element (without point
+ORIGCD12= 0.00023017843 / [deg/pix] Original CD1_2 element (without point
+ORIGCD21= 0.00023042914 / [deg/pix] Original CD2_1 element (without point
+ORIGCD22= -2.499652E-4 / [deg/pix] Original CD2_2 element (without point
+
+
+
+ / DISTORTION KEYWORDS
+
+A_ORDER = 3 / polynomial order, axis 1, detector to sky
+A_0_2 = 2.9656E-6 / distortion coefficient
+A_0_3 = 3.7746E-9 / distortion coefficient
+A_1_1 = 2.1886E-5 / distortion coefficient
+A_1_2 = -1.6847E-7 / distortion coefficient
+A_2_0 = -2.3863E-5 / distortion coefficient
+A_2_1 = -8.561E-9 / distortion coefficient
+A_3_0 = -1.4172E-7 / distortion coefficient
+A_DMAX = 1.394 / [pixel] maximum correction
+B_ORDER = 3 / polynomial order, axis 2, detector to sky
+B_0_2 = 2.31E-5 / distortion coefficient
+B_0_3 = -1.6168E-7 / distortion coefficient
+B_1_1 = -2.4386E-5 / distortion coefficient
+B_1_2 = -5.7813E-9 / distortion coefficient
+B_2_0 = 2.1197E-6 / distortion coefficient
+B_2_1 = -1.6583E-7 / distortion coefficient
+B_3_0 = -2.0249E-8 / distortion coefficient
+B_DMAX = 1.501 / [pixel] maximum correction
+AP_ORDER= 3 / polynomial order, axis 1, sky to detector
+AP_0_1 = -6.4275E-7 / distortion coefficient
+AP_0_2 = -2.9425E-6 / distortion coefficient
+AP_0_3 = -3.582E-9 / distortion coefficient
+AP_1_0 = -1.4897E-5 / distortion coefficient
+AP_1_1 = -2.225E-5 / distortion coefficient
+AP_1_2 = 1.7195E-7 / distortion coefficient
+AP_2_0 = 2.4146E-5 / distortion coefficient
+AP_2_1 = 6.709E-9 / distortion coefficient
+AP_3_0 = 1.4492E-7 / distortion coefficient
+BP_ORDER= 3 / polynomial order, axis 2, sky to detector
+BP_0_1 = -1.6588E-5 / distortion coefficient
+BP_0_2 = -2.3424E-5 / distortion coefficient
+BP_0_3 = 1.651E-7 / distortion coefficient
+BP_1_0 = -2.6783E-6 / distortion coefficient
+BP_1_1 = 2.4753E-5 / distortion coefficient
+BP_1_2 = 3.8917E-9 / distortion coefficient
+BP_2_0 = -2.151E-6 / distortion coefficient
+BP_2_1 = 1.7E-7 / distortion coefficient
+BP_3_0 = 2.0482E-8 / distortion coefficient
+
+ / PHOTOMETRY
+
+BUNIT = 'MJy/sr ' / Units of image data
+FLUXCONV= 0.1088 / Flux Conv. factor (MJy/sr per DN/sec)
+GAIN = 3.3 / e/DN conversion
+RONOISE = 9.4 / [Electrons] Readout Noise from Array
+ZODY_EST= 0.05291139 / [MJy/sr] Zodiacal Background Estimate
+ISM_EST = 0.003677277 / [MJy/sr] Interstellar Medium Estimate
+CIB_EST = 0.0 / [MJy/sr] Cosmic Infrared Background Estimate
+SKYDRKZB= 0.044533 / [MJy/sr] Zodiacal Background Est of subracted s
+SKYDKMED= 0.039081 / [MJy/sr] Median of Subtracted Skydark
+SKDKFDLY= 11.554 / [sec] Average Frame Delay Time of Skydark
+SKDKIDLY= 11.554 / [sec] Average Immediate Delay Time of Skydark
+
+ / GENERAL MAPPING KEYWORDS
+
+DITHPOS = 2 / Current dither position
+
+ / IRAC MAPPING KEYWORDS
+
+READMODE= 'FULL ' / Readout mode
+DITHSCAL= 'medium ' / Dither scale (small, medium, large)
+
+ / INSTRUMENT TELEMETRY DATA
+
+ASHTCON = 2 / Shutter condition (1:closed, 2: open)
+AWEASIDE= 0 / WEA side in use (0:B, 1:A)
+ACTXSTAT= 0 / Cmded transcal status
+ATXSTAT = 0 / transcal status
+ACFLSTAT= 0 / Cmded floodcal status
+AFLSTAT = 0 / floodcal status
+AVRSTUCC= -3.5 / [Volts] Cmded VRSTUC Bias
+AVRSTBEG= -3.5114367 / [Volts] VRSTUC Bias at start integration
+AVDETC = -2.75 / [Volts] Cmded VDET Bias
+AVDETBEG= -2.7585216 / [Volts] VDET Bias at start of integration
+AVGG1C = -3.65 / [Volts] Cmded VGG1 Bias
+AVGG1BEG= -3.2078801 / [Volts] VGG1 Bias at start of integration
+AVDDUCC = -3 / [Volts] Cmded VDDUC Bias
+AVDDUBEG= -3 / [Volts] VDDUC Bias at start integration
+AVGGCLC = 1 / [Volts] Cmnded VGGCL clock rail voltage
+AVGGCBEG= 1 / [Volts] VGGCL clock rail voltage
+AHTRIBEG= 204.49722 / [uAmps] Heater current at start of integ
+AHTRVBEG= 2.3936886 / [Volts] Heater Voltage at start integ.
+AFPAT2B = 15.022535 / [Deg_K] FPA Temp sensor #2 at start integ.
+AFPAT2BT= 107644.61 / [Sec] FPA Temp sensor #2 time tag
+AFPAT2E = 15.022535 / [Deg_K] FPA temp sensor #2, end integ.
+AFPAT2ET= 107644.61 / [Sec] FPA temp sensor #2 time tag
+ACTENDT = 20.376773 / [Deg_C] C&T board thermistor
+AFPECTE = 18.3055 / [Deg_C] FPE control board thermistor
+AFPEATE = 21.814696 / [Deg_C] FPE analog board thermistor
+ASHTEMPE= 21.504564 / [Deg_C] Shutter board thermistor
+ATCTEMPE= 22.662835 / [Deg_C] Temp. controller board thermistor
+ACETEMPE= 20.285331 / [Deg_C] Calib. electronics board thermistor
+APDTEMPE= 20.590139 / [Deg_C] PDU board thermistor
+ACATMP1E= 1.3181374 / [Deg_K] CA Temp, end integration for temp1
+ACATMP2E= 1.3011689 / [Deg_K] CA Temp, end integration for temp2
+ACATMP3E= 1.3331941 / [Deg_K] CA Temp, end integration for temp3
+ACATMP4E= 1.3299368 / [Deg_K] CA Temp, end integration for temp4
+ACATMP5E= 1.3280274 / [Deg_K] CA Temp, end integration for temp5
+ACATMP6E= 1.32662 / [Deg_K] CA Temp, end integration for temp6
+ACATMP7E= 1.3253879 / [Deg_K] CA Temp, end integration for temp7
+ACATMP8E= 1.3185339 / [Deg_K] CA Temp, end integration for temp8
+
+ / DATA FLOW KEYWORDS
+
+ORIGIN0 = 'JPL_FOS ' / Site where RAW FITS file was written
+CREATOR0= 'J5.3 ' / SW system that created RAW FITS
+DATE = '2007-07-10T04:40:23' / [YYYY-MM-DDThh:mm:ss UTC] file creation date
+AORKEY = 18279424 / AOR or EIR key. Astrnmy Obs Req/Instr Eng Req
+DS_IDENT= 'ads/sa.spitzer#0018279424' / Data Set Identification for ADS/journals
+EXPID = 14 / Exposure ID (0-9999)
+DCENUM = 0 / DCE number (0-9999)
+TLMGRPS = 1 / expected number of groups
+FILE_VER= 1 / Version of the raw file made by SIS
+RAWFILE = 'IRAC.1.0018279424.0014.0000.01.mipl.fits' / Raw data file name
+CPT_VER = '3.1.11 ' / Channel Param Table FOS versioN
+CTD_VER = '3.0.94S ' / Cmded telemetry data version
+EXPDFLAG= F / (T/F) expedited DCE
+MISS_LCT= 0 / Total Missed Line Cnt in this FITS
+MANCPKT = F / T if this FITS is Missing Ancillary Data
+MISSDATA= F / T if this FITS is Missing Image Data
+CHECKSUM= 0 / MIPL computed checksum
+PAONUM = 2463 / PAO Number
+CAMPAIGN= 'IRAC009800' / Campaign
+DCEID = 80565322 / Data-Collection-Event ID
+DCEINSID= 16981930 / DCE Instance ID
+DPID = 178643698 / Data Product Instance ID
+PIPENUM = 107 / Pipeline Script Number
+SOS_VER = 2 / Data-Product Version
+PLVID = 4 / Pipeline Version ID
+CALID = 6 / CalTrans Version ID
+
+SDRKEPID= 3230182 / Sky Dark ensemble product ID
+
+PMSKFBID= 995 / Pixel mask ID
+LDRKFBID= 836 / Fall-back lab dark ID
+LINCFBID= 357 / Fall-back Linearity correction ID
+FLATFBID= 1011 / Fall-back flat ID
+FLXCFBID= 1025 / Flux conversion ID
+MBLTFBID= 696 / Muxbleed Lookup Table ID
+MBCFFBID= 704 / Muxbleed Coefficients ID
+LBDRKFLE= 'FUL_12s_12sf8d1r1_ch1_v1.2.0_dark.txt' / Labdark File Used
+DDCORR1 = 1.488018 / Darkdrift Correction for Readout Channel 1
+DDCORR2 = -5.919937 / Darkdrift Correction for Readout Channel 2
+DDCORR3 = 2.243147 / Darkdrift Correction for Readout Channel 3
+DDCORR4 = 2.188772 / Darkdrift Correction for Readout Channel 4
+DDBKGND = 68.5909 / arkdrift 'Background' Term
+
+
+
+ / PROCESSING HISTORY
+
+HISTORY job.c ver: 1.50
+HISTORY TRANHEAD v. 12.8, ran Mon Jul 9 21:40:04 2007
+HISTORY CALTRANS v. 4.0, ran Mon Jul 9 21:40:08 2007
+HISTORY INSBPOSDOM v. 1.1, ran Mon Jul 9 21:40:08 2007
+HISTORY cvti2r4 v. 1.31 A61025, generated 7/09/07 at 21:40:09
+HISTORY hdrupd8 v. 1.5 A50126, updated 7/09/07 at 21:40:11
+HISTORY FFC v. 1.0, ran Mon Jul 9 21:40:12 2007
+HISTORY MUXBLEEDCORR v. 1.600, ran Mon Jul 9 21:40:13 2007
+HISTORY FOWLINEARIZE v. 4.900000, ran Mon Jul 9 21:40:13 2007
+HISTORY hdrupd8 v. 1.5 A50126, updated 7/09/07 at 21:40:14
+HISTORY BGMODEL v. 1.0, ran Mon Jul 9 21:40:14 2007
+HISTORY SLREMOVE v. 1.0, ran Mon Jul 9 21:40:14 2007
+HISTORY hdrupd8 v. 1.5 A50126, updated 7/09/07 at 21:40:15
+HISTORY hdrupd8 v. 1.5 A50126, updated 7/09/07 at 21:40:16
+HISTORY hdrupd8 v. 1.5 A50126, updated 7/09/07 at 21:40:16
+HISTORY hdrupd8 v. 1.5 A50126, updated 7/09/07 at 21:40:17
+HISTORY hdrupd8 v. 1.5 A50126, updated 7/09/07 at 21:40:18
+HISTORY DARKSUBNG v. 1.000, ran Mon Jul 9 21:40:18 2007
+HISTORY DARKDRIFT v. 4.0, ran Mon Jul 9 21:40:19 2007
+HISTORY FLATAP v. 1.500 Mon Jul 9 21:40:20 2007
+HISTORY DNTOFLUX v. 4.1, ran Mon Jul 9 21:40:23 2007
+HISTORY CALTRANS v. 4.0, ran Mon Jul 9 21:47:55 2007
+HISTORY PTNTRAN v. 1.4, ran Mon Jul 9 21:47:56 2007
+HISTORY FPGen v. 1.25, ran Mon Jul 9 21:47:58 2007
+HISTORY PTGADJUST v. 1.0, ran Mon Jul 9 21:51:34 2007
+END
diff --git a/ast/ast_tester/sip.head b/ast/ast_tester/sip.head
new file mode 100644
index 0000000..0e9e838
--- /dev/null
+++ b/ast/ast_tester/sip.head
@@ -0,0 +1,288 @@
+SIMPLE = T / Fits standard
+BITPIX = -32 / FOUR-BYTE SINGLE PRECISION FLOATING POINT
+NAXIS = 2 / STANDARD FITS FORMAT
+NAXIS1 = 256 / STANDARD FITS FORMAT
+NAXIS2 = 256 / STANDARD FITS FORMAT
+ORIGIN = 'Spitzer Science Center' / Organization generating this FITS file
+CREATOR = 'S16.1.0 ' / SW version used to create this FITS file
+TELESCOP= 'Spitzer ' / SPITZER Space Telescope
+INSTRUME= 'IRAC ' / SPITZER Space Telescope instrument ID
+CHNLNUM = 1 / 1 digit instrument channel number
+EXPTYPE = 'sci ' / Exposure Type
+REQTYPE = 'AOR ' / Request type (AOR, IER, or SER)
+AOT_TYPE= 'IracMap ' / Observation template type
+AORLABEL= '05cs-IRAC-2' / AOR Label
+FOVID = 67 / Field of View ID
+FOVNAME = 'IRAC_Center_of_3.6&5.8umArray' / Field of View Name
+
+ / PROPOSAL INFORMATION
+
+OBSRVR = 'Ben Sugerman' / Observer Name (Last, First)
+OBSRVRID= 14621 / Observer ID of Principal Investigator
+PROCYCL = 6 / Proposal Cycle
+PROGID = 30494 / Program ID
+PROTITLE= 'Supernovae and the Origin of Dust in Galaxies: Follow-Up Observation'
+PROGCAT = 30 / Program Category
+
+ / TIME AND EXPOSURE INFORMATION
+
+DATE_OBS= '2007-06-29T03:15:33.555' / Date & time at DCE start
+MJD_OBS = 54280.135805 / [days] MJD at DCE start (,JD-2400000.5)
+UTCS_OBS= 236358933.555 / [sec] J2000 ephem. time at DCE start
+SCLK_OBS= 867554299.94 / [sec] SCLK time (since 1/1/1980) at DCE start
+SAMPTIME= 0.2 / [sec] Sample integration time
+FRAMTIME= 12. / [sec] Time spent integrating (whole array)
+COMMENT Photons in Well = Flux[photons/sec/pixel] * FRAMTIME
+EXPTIME = 10.4 / [sec] Effective integration time per pixel
+COMMENT DN per pixel = Flux[photons/sec/pixel] / GAIN * EXPTIME
+INTRFDLY= 8. / [sec] Inter Frame Delay Time
+AINTBEG = 107646.2 / [Secs since IRAC turn-on] Time of integ. start
+ATIMEEND= 107658.16 / [Secs since IRAC turn-on] Time of integ. end
+AFOWLNUM= 8 / Fowler number
+AWAITPER= 44 / [0.2 sec] Wait period
+ANUMREPS= 1 / Number of repeat integrations
+AREADMOD= 0 / Full (0) or subarray (1)
+HDRMODE = F / DCE taken in High Dynamic Range mode
+ABARREL = 3 / Barrel shift
+APEDSIG = 0 / 0=Normal, 1=Pedestal, 2=Signal
+
+ / TARGET AND POINTING INFORMATION
+
+OBJECT = 'SN 2005cs' / Target Name
+OBJTYPE = 'TargetFixedSingle' / Object Type
+CRVAL1 = 202.482322805429 / [deg] RA at CRPIX1,CRPIX2 (using Pointing Recon
+CRVAL2 = 47.1751189300101 / [deg] DEC at CRPIX1,CRPIX2 (using Pointing Reco
+RA_HMS = '13h29m55.8s' / [hh:mm:ss.s] CRVAL1 as sexagesimal
+DEC_DMS = '+47d10m30s' / [dd:mm:ss] CRVAL2 as sexagesimal
+RADESYS = 'ICRS ' / International Celestial Reference System
+EQUINOX = 2000. / Equinox for ICRS celestial coord. system
+CD1_1 = 0.000249756880272355 / Corrected CD matrix element with Pointing Recon
+CD1_2 = 0.000230177809743655 / Corrected CD matrix element with Pointing Recon
+CD2_1 = 0.000230428519265417 / Corrected CD matrix element with Pointing Recon
+CD2_2 = -0.000249965770576587 / Corrected CD matrix element with Pointing Reco
+CTYPE1 = 'RA---TAN-SIP' / RA---TAN with distortion in pixel space
+CTYPE2 = 'DEC--TAN-SIP' / DEC--TAN with distortion in pixel space
+CRPIX1 = 128. / Reference pixel along axis 1
+CRPIX2 = 128. / Reference pixel along axis 2
+PXSCAL1 = -1.22334117768332 / [arcsec/pix] Scale for axis 1 at CRPIX1,CRPIX2
+PXSCAL2 = 1.22328355209902 / [arcsec/pix] Scale for axis 2 at CRPIX1,CRPIX2
+CRDER1 = 4.02509762361481E-05 / [deg] Uncertainty in CRVAL1
+CRDER2 = 3.4274613195288E-05 / [deg] Uncertainty in CRVAL2
+UNCRTPA = 0.000378787843382542 / [deg] Uncertainty in position angle
+CSDRADEC= 4.75971783897902E-07 / [deg] Costandard deviation in RA and Dec
+SIGRA = 0.0339487135007807 / [arcsec] RMS dispersion of RA over DCE
+SIGDEC = 0.0637682657426773 / [arcsec] RMS dispersion of DEC over DCE
+SIGPA = 1.36464273573987 / [arcsec] RMS dispersion of PA over DCE
+PA = 137.359976084299 / [deg] Position angle of axis 2 (E of N) (was OR
+RA_RQST = 202.482116615975 / [deg] Requested RA at CRPIX1, CRPIX2
+DEC_RQST= 47.1750785413522 / [deg] Requested Dec at CRPIX1, CRPIX2
+PM_RA = 0. / [arcsec/yr] Proper Motion in RA (J2000)
+PM_DEC = 0. / [arcsec/yr] Proper Motion in Dec (J200)
+RMS_JIT = 0.00768303401855732 / [arcsec] RMS jitter during DCE
+RMS_JITY= 0.00515070337437348 / [arcsec] RMS jitter during DCE along Y
+RMS_JITZ= 0.00570081279113133 / [arcsec] RMS jitter during DCE along Z
+SIG_JTYZ= 0.00237806410221437 / [arcsec] Costadard deviation of jitter in YZ
+PTGDIFF = 0.525106524659797 / [arcsec] Offset btwn actual and rqsted pntng
+PTGDIFFX= 0.46966798486043 / [pixels] rqsted - actual pntng along axis 1
+PTGDIFFY= -0.235285197422366 / [pixels] rqsted - actual pntng along axis 2
+RA_REF = 202.472375 / [deg] Commanded RA (J2000) of ref. position
+DEC_REF = 47.1745 / [deg] Commanded Dec (J2000) of ref. position
+USEDBPHF= T / T if Boresight Pointing History File was used
+BPHFNAME= 'SBPHF.0867542400.031.pntg' / Boresight Pointing History Filename
+FOVVERSN= 'BodyFrames_FTU_14a.xls' / FOV/BodyFrames file version used
+RECONFOV= 'IRAC_Center_of_3.6umArray' / Reconstructed Field of View
+RARFND = 202.482315063477 / [deg] Refined RA
+DECRFND = 47.175121307373 / [deg] Refined DEC
+CT2RFND = 137.359054565430 / [deg] Refined CROT2
+ERARFND = 0.000002332304 / [deg] Error in RARFND value
+EDECRFND= 0.000002332411 / [deg] Error in DECRFND value
+ECT2RFND= 0.000540699053 / [deg] Error in CT2RFND value
+NASTROM = 12 / Astrometric sources for absolute refinement
+ORIG_RA = 202.482055664062 / [deg] Original RA from raw BPHF (without pointi
+ORIG_DEC= 47.1750717163086 / [deg] Original Dec from raw BPHF (without point
+ORIGCD11= 0.0002497563255 / [deg/pix] Original CD1_1 element (without point
+ORIGCD12= 0.0002301784261 / [deg/pix] Original CD1_2 element (without point
+ORIGCD21= 0.0002304291411 / [deg/pix] Original CD2_1 element (without point
+ORIGCD22= -0.0002499652037 / [deg/pix] Original CD2_2 element (without point
+
+
+
+ / DISTORTION KEYWORDS
+
+A_ORDER = 3 / polynomial order, axis 1, detector to sky
+A_0_2 = 2.9656E-06 / distortion coefficient
+A_0_3 = 3.7746E-09 / distortion coefficient
+A_1_1 = 2.1886E-05 / distortion coefficient
+A_1_2 = -1.6847E-07 / distortion coefficient
+A_2_0 = -2.3863E-05 / distortion coefficient
+A_2_1 = -8.561E-09 / distortion coefficient
+A_3_0 = -1.4172E-07 / distortion coefficient
+A_DMAX = 1.394 / [pixel] maximum correction
+B_ORDER = 3 / polynomial order, axis 2, detector to sky
+B_0_2 = 2.31E-05 / distortion coefficient
+B_0_3 = -1.6168E-07 / distortion coefficient
+B_1_1 = -2.4386E-05 / distortion coefficient
+B_1_2 = -5.7813E-09 / distortion coefficient
+B_2_0 = 2.1197E-06 / distortion coefficient
+B_2_1 = -1.6583E-07 / distortion coefficient
+B_3_0 = -2.0249E-08 / distortion coefficient
+B_DMAX = 1.501 / [pixel] maximum correction
+AP_ORDER= 3 / polynomial order, axis 1, sky to detector
+AP_0_1 = -6.4275E-07 / distortion coefficient
+AP_0_2 = -2.9425E-06 / distortion coefficient
+AP_0_3 = -3.582E-09 / distortion coefficient
+AP_1_0 = -1.4897E-05 / distortion coefficient
+AP_1_1 = -2.225E-05 / distortion coefficient
+AP_1_2 = 1.7195E-07 / distortion coefficient
+AP_2_0 = 2.4146E-05 / distortion coefficient
+AP_2_1 = 6.709E-09 / distortion coefficient
+AP_3_0 = 1.4492E-07 / distortion coefficient
+BP_ORDER= 3 / polynomial order, axis 2, sky to detector
+BP_0_1 = -1.6588E-05 / distortion coefficient
+BP_0_2 = -2.3424E-05 / distortion coefficient
+BP_0_3 = 1.651E-07 / distortion coefficient
+BP_1_0 = -2.6783E-06 / distortion coefficient
+BP_1_1 = 2.4753E-05 / distortion coefficient
+BP_1_2 = 3.8917E-09 / distortion coefficient
+BP_2_0 = -2.151E-06 / distortion coefficient
+BP_2_1 = 1.7E-07 / distortion coefficient
+BP_3_0 = 2.0482E-08 / distortion coefficient
+
+ / PHOTOMETRY
+
+BUNIT = 'MJy/sr ' / Units of image data
+FLUXCONV= 0.1088 / Flux Conv. factor (MJy/sr per DN/sec)
+GAIN = 3.3 / e/DN conversion
+RONOISE = 9.4 / [Electrons] Readout Noise from Array
+ZODY_EST= 0.05291139 / [MJy/sr] Zodiacal Background Estimate
+ISM_EST = 0.003677277 / [MJy/sr] Interstellar Medium Estimate
+CIB_EST = 0. / [MJy/sr] Cosmic Infrared Background Estimate
+SKYDRKZB= 0.044533 / [MJy/sr] Zodiacal Background Est of subracted s
+SKYDKMED= 0.039081 / [MJy/sr] Median of Subtracted Skydark
+SKDKFDLY= 11.554 / [sec] Average Frame Delay Time of Skydark
+SKDKIDLY= 11.554 / [sec] Average Immediate Delay Time of Skydark
+
+ / GENERAL MAPPING KEYWORDS
+
+DITHPOS = 2 / Current dither position
+
+ / IRAC MAPPING KEYWORDS
+
+READMODE= 'FULL ' / Readout mode
+DITHSCAL= 'medium ' / Dither scale (small, medium, large)
+
+ / INSTRUMENT TELEMETRY DATA
+
+ASHTCON = 2 / Shutter condition (1:closed, 2: open)
+AWEASIDE= 0 / WEA side in use (0:B, 1:A)
+ACTXSTAT= 0 / Cmded transcal status
+ATXSTAT = 0 / transcal status
+ACFLSTAT= 0 / Cmded floodcal status
+AFLSTAT = 0 / floodcal status
+AVRSTUCC= -3.5 / [Volts] Cmded VRSTUC Bias
+AVRSTBEG= -3.5114367 / [Volts] VRSTUC Bias at start integration
+AVDETC = -2.75 / [Volts] Cmded VDET Bias
+AVDETBEG= -2.7585216 / [Volts] VDET Bias at start of integration
+AVGG1C = -3.65 / [Volts] Cmded VGG1 Bias
+AVGG1BEG= -3.2078801 / [Volts] VGG1 Bias at start of integration
+AVDDUCC = -3 / [Volts] Cmded VDDUC Bias
+AVDDUBEG= -3 / [Volts] VDDUC Bias at start integration
+AVGGCLC = 1 / [Volts] Cmnded VGGCL clock rail voltage
+AVGGCBEG= 1 / [Volts] VGGCL clock rail voltage
+AHTRIBEG= 204.49722 / [uAmps] Heater current at start of integ
+AHTRVBEG= 2.3936886 / [Volts] Heater Voltage at start integ.
+AFPAT2B = 15.022535 / [Deg_K] FPA Temp sensor #2 at start integ.
+AFPAT2BT= 107644.61 / [Sec] FPA Temp sensor #2 time tag
+AFPAT2E = 15.022535 / [Deg_K] FPA temp sensor #2, end integ.
+AFPAT2ET= 107644.61 / [Sec] FPA temp sensor #2 time tag
+ACTENDT = 20.376773 / [Deg_C] C&T board thermistor
+AFPECTE = 18.3055 / [Deg_C] FPE control board thermistor
+AFPEATE = 21.814696 / [Deg_C] FPE analog board thermistor
+ASHTEMPE= 21.504564 / [Deg_C] Shutter board thermistor
+ATCTEMPE= 22.662835 / [Deg_C] Temp. controller board thermistor
+ACETEMPE= 20.285331 / [Deg_C] Calib. electronics board thermistor
+APDTEMPE= 20.590139 / [Deg_C] PDU board thermistor
+ACATMP1E= 1.3181374 / [Deg_K] CA Temp, end integration for temp1
+ACATMP2E= 1.3011689 / [Deg_K] CA Temp, end integration for temp2
+ACATMP3E= 1.3331941 / [Deg_K] CA Temp, end integration for temp3
+ACATMP4E= 1.3299368 / [Deg_K] CA Temp, end integration for temp4
+ACATMP5E= 1.3280274 / [Deg_K] CA Temp, end integration for temp5
+ACATMP6E= 1.32662 / [Deg_K] CA Temp, end integration for temp6
+ACATMP7E= 1.3253879 / [Deg_K] CA Temp, end integration for temp7
+ACATMP8E= 1.3185339 / [Deg_K] CA Temp, end integration for temp8
+
+ / DATA FLOW KEYWORDS
+
+ORIGIN0 = 'JPL_FOS ' / Site where RAW FITS file was written
+CREATOR0= 'J5.3 ' / SW system that created RAW FITS
+DATE = '2007-07-10T04:40:23' / [YYYY-MM-DDThh:mm:ss UTC] file creation date
+AORKEY = 18279424 / AOR or EIR key. Astrnmy Obs Req/Instr Eng Req
+DS_IDENT= 'ads/sa.spitzer#0018279424' / Data Set Identification for ADS/journals
+EXPID = 14 / Exposure ID (0-9999)
+DCENUM = 0 / DCE number (0-9999)
+TLMGRPS = 1 / expected number of groups
+FILE_VER= 1 / Version of the raw file made by SIS
+RAWFILE = 'IRAC.1.0018279424.0014.0000.01.mipl.fits' / Raw data file name
+CPT_VER = '3.1.11 ' / Channel Param Table FOS versioN
+CTD_VER = '3.0.94S ' / Cmded telemetry data version
+EXPDFLAG= F / (T/F) expedited DCE
+MISS_LCT= 0 / Total Missed Line Cnt in this FITS
+MANCPKT = F / T if this FITS is Missing Ancillary Data
+MISSDATA= F / T if this FITS is Missing Image Data
+CHECKSUM= 0 / MIPL computed checksum
+PAONUM = 2463 / PAO Number
+CAMPAIGN= 'IRAC009800' / Campaign
+DCEID = 80565322 / Data-Collection-Event ID
+DCEINSID= 16981930 / DCE Instance ID
+DPID = 178643698 / Data Product Instance ID
+PIPENUM = 107 / Pipeline Script Number
+SOS_VER = 2 / Data-Product Version
+PLVID = 4 / Pipeline Version ID
+CALID = 6 / CalTrans Version ID
+
+SDRKEPID= 3230182 / Sky Dark ensemble product ID
+
+PMSKFBID= 995 / Pixel mask ID
+LDRKFBID= 836 / Fall-back lab dark ID
+LINCFBID= 357 / Fall-back Linearity correction ID
+FLATFBID= 1011 / Fall-back flat ID
+FLXCFBID= 1025 / Flux conversion ID
+MBLTFBID= 696 / Muxbleed Lookup Table ID
+MBCFFBID= 704 / Muxbleed Coefficients ID
+LBDRKFLE= 'FUL_12s_12sf8d1r1_ch1_v1.2.0_dark.txt' / Labdark File Used
+DDCORR1 = 1.488018 / Darkdrift Correction for Readout Channel 1
+DDCORR2 = -5.919937 / Darkdrift Correction for Readout Channel 2
+DDCORR3 = 2.243147 / Darkdrift Correction for Readout Channel 3
+DDCORR4 = 2.188772 / Darkdrift Correction for Readout Channel 4
+DDBKGND = 68.5909 / arkdrift 'Background' Term
+
+
+
+ / PROCESSING HISTORY
+
+HISTORY job.c ver: 1.50
+HISTORY TRANHEAD v. 12.8, ran Mon Jul 9 21:40:04 2007
+HISTORY CALTRANS v. 4.0, ran Mon Jul 9 21:40:08 2007
+HISTORY INSBPOSDOM v. 1.1, ran Mon Jul 9 21:40:08 2007
+HISTORY cvti2r4 v. 1.31 A61025, generated 7/09/07 at 21:40:09
+HISTORY hdrupd8 v. 1.5 A50126, updated 7/09/07 at 21:40:11
+HISTORY FFC v. 1.0, ran Mon Jul 9 21:40:12 2007
+HISTORY MUXBLEEDCORR v. 1.600, ran Mon Jul 9 21:40:13 2007
+HISTORY FOWLINEARIZE v. 4.900000, ran Mon Jul 9 21:40:13 2007
+HISTORY hdrupd8 v. 1.5 A50126, updated 7/09/07 at 21:40:14
+HISTORY BGMODEL v. 1.0, ran Mon Jul 9 21:40:14 2007
+HISTORY SLREMOVE v. 1.0, ran Mon Jul 9 21:40:14 2007
+HISTORY hdrupd8 v. 1.5 A50126, updated 7/09/07 at 21:40:15
+HISTORY hdrupd8 v. 1.5 A50126, updated 7/09/07 at 21:40:16
+HISTORY hdrupd8 v. 1.5 A50126, updated 7/09/07 at 21:40:16
+HISTORY hdrupd8 v. 1.5 A50126, updated 7/09/07 at 21:40:17
+HISTORY hdrupd8 v. 1.5 A50126, updated 7/09/07 at 21:40:18
+HISTORY DARKSUBNG v. 1.000, ran Mon Jul 9 21:40:18 2007
+HISTORY DARKDRIFT v. 4.0, ran Mon Jul 9 21:40:19 2007
+HISTORY FLATAP v. 1.500 Mon Jul 9 21:40:20 2007
+HISTORY DNTOFLUX v. 4.1, ran Mon Jul 9 21:40:23 2007
+HISTORY CALTRANS v. 4.0, ran Mon Jul 9 21:47:55 2007
+HISTORY PTNTRAN v. 1.4, ran Mon Jul 9 21:47:56 2007
+HISTORY FPGen v. 1.25, ran Mon Jul 9 21:47:58 2007
+HISTORY PTGADJUST v. 1.0, ran Mon Jul 9 21:51:34 2007
+END
diff --git a/ast/ast_tester/sparse.ast b/ast/ast_tester/sparse.ast
new file mode 100644
index 0000000..c28cb4d
--- /dev/null
+++ b/ast/ast_tester/sparse.ast
@@ -0,0 +1,392 @@
+ Begin FrameSet # Set of inter-related coordinate systems
+# Title = "3-d compound coordinate system" # Title of coordinate system
+# Naxes = 3 # Number of coordinate axes
+# Domain = "SKY-DSBSPECTRUM" # Coordinate system domain
+# Epoch = 2007.10664386351 # Julian epoch of observation
+# Lbl1 = "Right ascension" # Label for axis 1
+# Lbl2 = "Declination" # Label for axis 2
+# Lbl3 = "Radio velocity (USB)" # Label for axis 3
+# System = "Compound" # Coordinate system type
+# Uni1 = "hh:mm:ss.sss" # Units for axis 1
+# Uni2 = "ddd:mm:ss.ss" # Units for axis 2
+# Uni3 = "km/s" # Units for axis 3
+# Dig1 = 9 # Individual precision for axis 1
+# Dig2 = 9 # Individual precision for axis 2
+# Digits = 7 # Default formatting precision
+# Fmt1 = "hms.3" # Format specifier for axis 1
+# Fmt2 = "dms.2" # Format specifier for axis 2
+# Dir1 = 0 # Plot axis 1 in reverse direction
+ IsA Frame # Coordinate system description
+ Nframe = 5 # Number of Frames in FrameSet
+# Base = 1 # Index of base Frame
+ Currnt = 5 # Index of current Frame
+ Nnode = 6 # Number of nodes in FrameSet
+ Nod1 = 3 # Frame 1 is associated with node 3
+ Nod2 = 4 # Frame 2 is associated with node 4
+ Nod3 = 5 # Frame 3 is associated with node 5
+ Nod4 = 6 # Frame 4 is associated with node 6
+ Nod5 = 2 # Frame 5 is associated with node 2
+ Lnk2 = 1 # Node 2 is derived from node 1
+ Lnk3 = 1 # Node 3 is derived from node 1
+ Lnk4 = 1 # Node 4 is derived from node 1
+ Lnk5 = 1 # Node 5 is derived from node 1
+ Lnk6 = 1 # Node 6 is derived from node 1
+ Frm1 = # Frame number 1
+ Begin Frame # Coordinate system description
+ Title = "Data grid indices; first pixel at (1,1,1)" # Title of coordinate system
+ Naxes = 3 # Number of coordinate axes
+ Domain = "GRID" # Coordinate system domain
+# Lbl1 = "Data grid index 1" # Label for axis 1
+# Lbl2 = "Data grid index 2" # Label for axis 2
+# Lbl3 = "Data grid index 3" # Label for axis 3
+# Uni1 = "pixel" # Units for axis 1
+# Uni2 = "pixel" # Units for axis 2
+# Uni3 = "pixel" # Units for axis 3
+ Ax1 = # Axis number 1
+ Begin Axis # Coordinate axis
+ Label = "Data grid index 1" # Axis Label
+ Symbol = "g1" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ Ax2 = # Axis number 2
+ Begin Axis # Coordinate axis
+ Label = "Data grid index 2" # Axis Label
+ Symbol = "g2" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ Ax3 = # Axis number 3
+ Begin Axis # Coordinate axis
+ Label = "Data grid index 3" # Axis Label
+ Symbol = "g3" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ End Frame
+ Frm2 = # Frame number 2
+ Begin Frame # Coordinate system description
+ Title = "Pixel coordinates; first pixel at (0.5,0.5,-1024.5)" # Title of coordinate system
+ Naxes = 3 # Number of coordinate axes
+ Domain = "PIXEL" # Coordinate system domain
+# Lbl1 = "Pixel coordinate 1" # Label for axis 1
+# Lbl2 = "Pixel coordinate 2" # Label for axis 2
+# Lbl3 = "Pixel coordinate 3" # Label for axis 3
+# Uni1 = "pixel" # Units for axis 1
+# Uni2 = "pixel" # Units for axis 2
+# Uni3 = "pixel" # Units for axis 3
+ Ax1 = # Axis number 1
+ Begin Axis # Coordinate axis
+ Label = "Pixel coordinate 1" # Axis Label
+ Symbol = "p1" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ Ax2 = # Axis number 2
+ Begin Axis # Coordinate axis
+ Label = "Pixel coordinate 2" # Axis Label
+ Symbol = "p2" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ Ax3 = # Axis number 3
+ Begin Axis # Coordinate axis
+ Label = "Pixel coordinate 3" # Axis Label
+ Symbol = "p3" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ End Frame
+ Frm3 = # Frame number 3
+ Begin Frame # Coordinate system description
+ Title = "Axis coordinates; first pixel at (0.5,0.5,-1024.5)" # Title of coordinate system
+ Naxes = 3 # Number of coordinate axes
+ Domain = "AXIS" # Coordinate system domain
+# Lbl1 = "Axis 1" # Label for axis 1
+# Lbl2 = "Axis 2" # Label for axis 2
+# Lbl3 = "Axis 3" # Label for axis 3
+# Uni1 = "pixel" # Units for axis 1
+# Uni2 = "pixel" # Units for axis 2
+# Uni3 = "pixel" # Units for axis 3
+ Ax1 = # Axis number 1
+ Begin Axis # Coordinate axis
+ Label = "Axis 1" # Axis Label
+ Symbol = "a1" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ Ax2 = # Axis number 2
+ Begin Axis # Coordinate axis
+ Label = "Axis 2" # Axis Label
+ Symbol = "a2" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ Ax3 = # Axis number 3
+ Begin Axis # Coordinate axis
+ Label = "Axis 3" # Axis Label
+ Symbol = "a3" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ End Frame
+ Frm4 = # Frame number 4
+ Begin Frame # Coordinate system description
+ Title = "Normalised pixel coordinates; first pixel at (0.03846154,0.5,0.0002441406)" # Title of coordinate system
+ Naxes = 3 # Number of coordinate axes
+ Domain = "FRACTION" # Coordinate system domain
+# Lbl1 = "Normalised pixel coordinate 1" # Label for axis 1
+# Lbl2 = "Normalised pixel coordinate 2" # Label for axis 2
+# Lbl3 = "Normalised pixel coordinate 3" # Label for axis 3
+ Ax1 = # Axis number 1
+ Begin Axis # Coordinate axis
+ Label = "Normalised pixel coordinate 1" # Axis Label
+ Symbol = "f1" # Axis symbol
+ Unit = "" # Axis units
+ Format = "%5.4f" # Format specifier
+ End Axis
+ Ax2 = # Axis number 2
+ Begin Axis # Coordinate axis
+ Label = "Normalised pixel coordinate 2" # Axis Label
+ Symbol = "f2" # Axis symbol
+ Unit = "" # Axis units
+ Format = "%5.4f" # Format specifier
+ End Axis
+ Ax3 = # Axis number 3
+ Begin Axis # Coordinate axis
+ Label = "Normalised pixel coordinate 3" # Axis Label
+ Symbol = "f3" # Axis symbol
+ Unit = "" # Axis units
+ Format = "%5.4f" # Format specifier
+ End Axis
+ End Frame
+ Frm5 = # Frame number 5
+ Begin CmpFrame # Compound coordinate system description
+# Title = "3-d compound coordinate system" # Title of coordinate system
+# Naxes = 3 # Number of coordinate axes
+# Domain = "SKY-DSBSPECTRUM" # Coordinate system domain
+# Lbl1 = "Right ascension" # Label for axis 1
+# Lbl2 = "Declination" # Label for axis 2
+# Lbl3 = "Radio velocity (USB)" # Label for axis 3
+# Uni1 = "hh:mm:ss.sss" # Units for axis 1
+# Uni2 = "ddd:mm:ss.ss" # Units for axis 2
+# Uni3 = "km/s" # Units for axis 3
+# Dig1 = 9 # Individual precision for axis 1
+# Dig2 = 9 # Individual precision for axis 2
+# Digits = 7 # Default formatting precision
+# Fmt1 = "hms.3" # Format specifier for axis 1
+# Fmt2 = "dms.2" # Format specifier for axis 2
+# Dir1 = 0 # Plot axis 1 in reverse direction
+ IsA Frame # Coordinate system description
+ FrameA = # First component Frame
+ Begin SkyFrame # Description of celestial coordinate system
+ Naxes = 2 # Number of coordinate axes
+ Epoch = 2007.10664386351 # Julian epoch of observation
+ System = "FK5" # Coordinate system type
+ ObsLat = 0.346026069000145 # Observers geodetic latitude (rads)
+ ObsLon = -2.71363307300091 # Observers geodetic longitude (rads)
+ Dut1 = -0.00321845632046122 # UT1-UTC in seconds
+ Ax1 = # Axis number 1
+ Begin SkyAxis # Celestial coordinate axis
+ Digits = 9 # Default formatting precision
+ IsA Axis # Coordinate axis
+ End SkyAxis
+ Ax2 = # Axis number 2
+ Begin SkyAxis # Celestial coordinate axis
+ Digits = 9 # Default formatting precision
+ IsA Axis # Coordinate axis
+ End SkyAxis
+ IsA Frame # Coordinate system description
+ SRef1 = 1.2343627630284 # Ref. pos. RA 4:42:53.706
+ SRef2 = 0.63032350835257 # Ref. pos. Dec 36:06:53.56
+ End SkyFrame
+ FrameB = # Second component Frame
+ Begin DSBSpecFrame # Dual sideband spectral axis
+ Naxes = 1 # Number of coordinate axes
+ Epoch = 2007.10664386353 # Julian epoch of observation
+ System = "VRAD" # Coordinate system type
+ ObsLat = 0.346026069000144 # Observers geodetic latitude (rads)
+ ObsLon = -2.71363307300091 # Observers geodetic longitude (rads)
+ Dut1 = -0.00321845632046122 # UT1-UTC in seconds
+ Ax1 = # Axis number 1
+ Begin Axis # Coordinate axis
+ End Axis
+ IsA Frame # Coordinate system description
+ SoR = "LSRK" # Standard of rest
+ RefRA = 1.23436224892048 # Reference RA (rads, FK5 J2000)
+ RefDec = 0.630323957597852 # Reference Dec (rads, FK5 J2000)
+ RstFrq = 345795989900 # Rest frequency (Hz)
+ SrcVel = -21699.2154029027 # Source velocity (m/s)
+ SrcVRF = "LSRK" # Source velocity rest frame
+ UFreq = "GHz" # Preferred units for frequency
+ IsA SpecFrame # Description of spectral coordinate system
+ DSBCen = 345782054267.698 # Central frequency (Hz topo)
+ IF = -4999999979.60052 # Intermediate frequency (Hz)
+ SideBn = "USB" # Represents upper sideband
+ AlSdBn = 1 # Align sidebands?
+ End DSBSpecFrame
+ End CmpFrame
+ Map2 = # Mapping between nodes 1 and 2
+ Begin CmpMap # Compound Mapping
+ Nin = 3 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ Inv = 0 # Inverse transformation not defined
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 3 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Series = 0 # Component Mappings applied in parallel
+ MapA = # First component Mapping
+ Begin PermMap # Coordinate permutation
+ Nin = 2 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Out1 = 1 # Output coordinate 1 = input coordinate 1
+ Out2 = 1 # Output coordinate 2 = input coordinate 1
+ In1 = 1 # Input coordinate 1 = output coordinate 1
+ In2 = 0 # Input coordinate 2 is "bad"
+ End PermMap
+ MapB = # Second component Mapping
+ Begin WinMap # Map one window on to another
+ Nin = 1 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Sft1 = 2.86538852378726e-05 # Shift for axis 1
+ End WinMap
+ End CmpMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 3 # Number of input coordinates
+ Inv = 0 # Inverse transformation not defined
+ IsA Mapping # Mapping between coordinate systems
+ Series = 0 # Component Mappings applied in parallel
+ MapA = # First component Mapping
+ Begin LutMap # Map 1-d coordinates using a lookup table
+ Nin = 1 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ Inv = 0 # Inverse transformation not defined
+ IsA Mapping # Mapping between coordinate systems
+ Nlut = 13 # Number of lookup table elements
+ Start = 1 # Input value at first element
+# Incr = 1 # Input value increment between elements
+ LutInt = 1 # Interpolation method
+ L1 = 1.23418282732218 # Lookup table elements...
+ L2 = 1.2343639301616
+ L3 = 1.23436339112322
+ L4 = 1.2343628519694
+ L5 = 1.23436231270009
+ L6 = 1.23454235656739
+ L7 = 1.23454287673211
+ L8 = 1.2345433967854
+ L9 = 1.23454391672729
+ L10 = 1.23472390339668
+ L11 = 1.23472340255133
+ L12 = 1.23472290159864
+ L13 = 1.23472240053857
+ End LutMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ Inv = 0 # Inverse transformation not defined
+ IsA Mapping # Mapping between coordinate systems
+ Series = 0 # Component Mappings applied in parallel
+ MapA = # First component Mapping
+ Begin LutMap # Map 1-d coordinates using a lookup table
+ Nin = 1 # Number of input coordinates
+ Inv = 0 # Inverse transformation not defined
+ IsA Mapping # Mapping between coordinate systems
+ Nlut = 13 # Number of lookup table elements
+ Start = 1 # Input value at first element
+# Incr = 1 # Input value increment between elements
+ LutInt = 1 # Interpolation method
+ L1 = 0.630323242601191 # Lookup table elements...
+ L2 = 0.630032824768848
+ L3 = 0.630178255337191
+ L4 = 0.630323685912113
+ L5 = 0.630469116487462
+ L6 = 0.630469544411238
+ L7 = 0.630324113791166
+ L8 = 0.630178683171532
+ L9 = 0.630033252558487
+ L10 = 0.630033664925644
+ L11 = 0.630179095578678
+ L12 = 0.630324526238311
+ L13 = 0.63046995689839
+ End LutMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 1 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin WinMap # Map one window on to another
+ Nin = 1 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Sft1 = 346321451689.665 # Shift for axis 1
+ Scl1 = -488226.2403564 # Scale factor for axis 1
+ End WinMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 1 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin SpecMap # Conversion between spectral coordinate systems
+ Nin = 1 # Number of input coordinates
+ Invert = 1 # Mapping inverted
+ IsA Mapping # Mapping between coordinate systems
+ Nspec = 2 # Number of conversion steps
+ Spec1 = "FRTOVL" # Convert frequency to rel. velocity
+ Spec1a = 345795989900 # Rest frequency (Hz)
+ Spec2 = "VLTOVR" # Convert relativistic to radio velocity
+ End SpecMap
+ MapB = # Second component Mapping
+ Begin ZoomMap # Zoom about the origin
+ Nin = 1 # Number of input coordinates
+ Invert = 1 # Mapping inverted
+ IsA Mapping # Mapping between coordinate systems
+ Zoom = 0.001 # Zoom factor
+ End ZoomMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ Map3 = # Mapping between nodes 1 and 3
+ Begin UnitMap # Unit (null) Mapping
+ Nin = 3 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ IsA Mapping # Mapping between coordinate systems
+ End UnitMap
+ Map4 = # Mapping between nodes 1 and 4
+ Begin WinMap # Map one window on to another
+ Nin = 3 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ IsA Mapping # Mapping between coordinate systems
+ Sft1 = -0.5 # Shift for axis 1
+ Sft2 = -0.5 # Shift for axis 2
+ Sft3 = -1025.5 # Shift for axis 3
+ End WinMap
+ Map5 = # Mapping between nodes 1 and 5
+ Begin WinMap # Map one window on to another
+ Nin = 3 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ IsA Mapping # Mapping between coordinate systems
+ Sft1 = -0.5 # Shift for axis 1
+ Sft2 = -0.5 # Shift for axis 2
+ Sft3 = -1025.5 # Shift for axis 3
+ End WinMap
+ Map6 = # Mapping between nodes 1 and 6
+ Begin WinMap # Map one window on to another
+ Nin = 3 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ IsA Mapping # Mapping between coordinate systems
+ Sft1 = -0.0384615384615385 # Shift for axis 1
+ Scl1 = 0.0769230769230769 # Scale factor for axis 1
+ Sft2 = -0.5 # Shift for axis 2
+ Sft3 = -0.000244140625 # Shift for axis 3
+ Scl3 = 0.00048828125 # Scale factor for axis 3
+ End WinMap
+ End FrameSet
diff --git a/ast/ast_tester/specflux.ast b/ast/ast_tester/specflux.ast
new file mode 100644
index 0000000..0da5fea
--- /dev/null
+++ b/ast/ast_tester/specflux.ast
@@ -0,0 +1,29 @@
+ Begin CmpFrame # Compound coordinate system description
+# Title = "2-d compound coordinate system" # Title of coordinate system
+# Naxes = 2 # Number of coordinate axes
+# Domain = "SPECTRUM-" # Coordinate system domain
+# Lbl1 = "Wavelength" # Label for axis 1
+# Lbl2 = "Axis 2" # Label for axis 2
+# Uni1 = "um" # Units for axis 1
+# Uni2 = "10%^50+%s50+-26%+W/m%^50+%s50+2%+/Angstrom" # Units for axis 2
+ IsA Frame # Coordinate system description
+ FrameA = # First component Frame
+ Begin SpecFrame # Description of spectral coordinate system
+ Naxes = 1 # Number of coordinate axes
+ System = "WAVE" # Coordinate system type
+ Ax1 = # Axis number 1
+ Begin Axis # Coordinate axis
+ Unit = "um" # Axis units
+ End Axis
+ IsA Frame # Coordinate system description
+ UWave = "um" # Preferred units for wavelength
+ End SpecFrame
+ FrameB = # Second component Frame
+ Begin Frame # Coordinate system description
+ Naxes = 1 # Number of coordinate axes
+ Ax1 = # Axis number 1
+ Begin Axis # Coordinate axis
+ Unit = "10%^50+%s50+-26%+W/m%^50+%s50+2%+/Angstrom" # Axis units
+ End Axis
+ End Frame
+ End CmpFrame
diff --git a/ast/ast_tester/specflux.attr b/ast/ast_tester/specflux.attr
new file mode 100644
index 0000000..e00d209
--- /dev/null
+++ b/ast/ast_tester/specflux.attr
@@ -0,0 +1 @@
+system=freq,logplot=1,loggap(1)=100
diff --git a/ast/ast_tester/specflux.box b/ast/ast_tester/specflux.box
new file mode 100644
index 0000000..7c6f180
--- /dev/null
+++ b/ast/ast_tester/specflux.box
@@ -0,0 +1,2 @@
+1 3 1.0E-8 9
+
diff --git a/ast/ast_tester/specflux.head b/ast/ast_tester/specflux.head
new file mode 100644
index 0000000..ac4a035
--- /dev/null
+++ b/ast/ast_tester/specflux.head
@@ -0,0 +1,28 @@
+
+COMMENT AST ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ AST
+COMMENT AST Beginning of AST data for CmpFrame object AST
+COMMENT AST ................................................................ AST
+BEGAST_A= 'CmpFrame' / Compound coordinate system description
+FRAMEA_A= ' ' / First component Frame
+BEGAST_B= 'SpecFrame' / Description of spectral coordinate system
+NAXES_A = 1 / Number of coordinate axes
+SYSTEM_A= 'WAVE ' / Coordinate system type
+AX1_A = ' ' / Axis number 1
+BEGAST_C= 'Axis ' / Coordinate axis
+UNIT_A = 'um ' / Axis units
+ENDAST_A= 'Axis ' / End of object definition
+ISA_A = 'Frame ' / Coordinate system description
+UWAVE_A = 'um ' / Preferred units for wavelength
+ENDAST_B= 'SpecFrame' / End of object definition
+FRAMEB_A= ' ' / Second component Frame
+BEGAST_D= 'Frame ' / Coordinate system description
+NAXES_B = 1 / Number of coordinate axes
+AX1_B = ' ' / Axis number 1
+BEGAST_E= 'Axis ' / Coordinate axis
+UNIT_B = '10%^50+%s50+-26%+W/m%^50+%s50+2%+/Angstrom'/ Axis units
+ENDAST_C= 'Axis ' / End of object definition
+ENDAST_D= 'Frame ' / End of object definition
+ENDAST_E= 'CmpFrame' / End of object definition
+COMMENT AST ................................................................ AST
+COMMENT AST End of AST data for CmpFrame object AST
+COMMENT AST ---------------------------------------------------------------- AST
diff --git a/ast/ast_tester/splittest1.ast b/ast/ast_tester/splittest1.ast
new file mode 100644
index 0000000..9fb1e2f
--- /dev/null
+++ b/ast/ast_tester/splittest1.ast
@@ -0,0 +1,185 @@
+ Begin CmpMap # Compound Mapping
+ Nin = 4 # Number of input coordinates
+ Inv = 0 # Inverse transformation not defined
+ IsA Mapping # Mapping between coordinate systems
+ InvA = 1 # First Mapping used in inverse direction
+ MapA = # First component Mapping
+ Begin UnitMap # Unit (null) Mapping
+ Nin = 4 # Number of input coordinates
+ Invert = 1 # Mapping inverted
+ IsA Mapping # Mapping between coordinate systems
+ End UnitMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 4 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ Inv = 0 # Inverse transformation not defined
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin WinMap # Map one window on to another
+ Nin = 4 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Sft1 = -129 # Shift for axis 1
+ Sft2 = -65 # Shift for axis 2
+ Sft3 = -0.5 # Shift for axis 3
+ Sft4 = -1 # Shift for axis 4
+ End WinMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 4 # Number of input coordinates
+ Inv = 0 # Inverse transformation not defined
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin MatrixMap # Matrix transformation
+ Nin = 4 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ M0 = 0.996194698 # Forward matrix value
+ M1 = 0.087155743 # Forward matrix value
+ M2 = 0 # Forward matrix value
+ M3 = 0 # Forward matrix value
+ M4 = -0.087155743 # Forward matrix value
+ M5 = 0.996194698 # Forward matrix value
+ M6 = 0 # Forward matrix value
+ M7 = 0 # Forward matrix value
+ M8 = 0 # Forward matrix value
+ M9 = 0 # Forward matrix value
+ M10 = 1 # Forward matrix value
+ M11 = 0 # Forward matrix value
+ M12 = 0 # Forward matrix value
+ M13 = 0 # Forward matrix value
+ M14 = 0 # Forward matrix value
+ M15 = 1 # Forward matrix value
+ Form = "Full" # Matrix storage form
+ End MatrixMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 4 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ Inv = 0 # Inverse transformation not defined
+ IsA Mapping # Mapping between coordinate systems
+ Series = 0 # Component Mappings applied in parallel
+ MapA = # First component Mapping
+ Begin WinMap # Map one window on to another
+ Nin = 2 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Sft1 = 136 # Shift for axis 1
+ Sft2 = 76 # Shift for axis 2
+ End WinMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 2 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ Inv = 0 # Inverse transformation not defined
+ IsA Mapping # Mapping between coordinate systems
+ Series = 0 # Component Mappings applied in parallel
+ MapA = # First component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 1 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin WinMap # Map one window on to another
+ Nin = 1 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Sft1 = 0.5 # Shift for axis 1
+ End WinMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 1 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ InvA = 1 # First Mapping used in inverse direction
+ MapA = # First component Mapping
+ Begin LutMap # Map 1-d coordinates using a lookup table
+ Nin = 1 # Number of input coordinates
+ Invert = 1 # Mapping inverted
+ IsA Mapping # Mapping between coordinate systems
+ Nlut = 8 # Number of lookup table elements
+ Start = 1 # Input value at first element
+# Incr = 1 # Input value increment between elements
+ LutInt = 0 # Interpolation method
+ L1 = 0.5 # Lookup table elements...
+ L2 = 1.5
+ L3 = 1.5
+ L4 = 2.5
+ L5 = 2.5
+ L6 = 3.5
+ L7 = 3.5
+ L8 = 4.5
+ End LutMap
+ MapB = # Second component Mapping
+ Begin LutMap # Map 1-d coordinates using a lookup table
+ Nin = 1 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Nlut = 8 # Number of lookup table elements
+ Start = 1 # Input value at first element
+# Incr = 1 # Input value increment between elements
+ LutInt = 0 # Interpolation method
+ L1 = 0.21106114 # Lookup table elements...
+ L2 = 0.21076437
+ L3 = 2e-06
+ L4 = 2.2e-06
+ L5 = 5e-07
+ L6 = 6.5e-07
+ L7 = 1.24e-09
+ L8 = 2.48e-09
+ End LutMap
+ End CmpMap
+ End CmpMap
+ MapB = # Second component Mapping
+ Begin CmpMap # Compound Mapping
+ Nin = 1 # Number of input coordinates
+ IsSimp = 1 # Mapping has been simplified
+ Inv = 0 # Inverse transformation not defined
+ IsA Mapping # Mapping between coordinate systems
+ InvA = 1 # First Mapping used in inverse direction
+ MapA = # First component Mapping
+ Begin LutMap # Map 1-d coordinates using a lookup table
+ Nin = 1 # Number of input coordinates
+ Invert = 1 # Mapping inverted
+ IsA Mapping # Mapping between coordinate systems
+ Nlut = 8 # Number of lookup table elements
+ Start = 1 # Input value at first element
+# Incr = 1 # Input value increment between elements
+ LutInt = 0 # Interpolation method
+ L1 = 0 # Lookup table elements...
+ L2 = 1
+ L3 = 1
+ L4 = 2
+ L5 = 2
+ L6 = 3
+ L7 = 3
+ L8 = 4
+ End LutMap
+ MapB = # Second component Mapping
+ Begin LutMap # Map 1-d coordinates using a lookup table
+ Nin = 1 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ Inv = 0 # Inverse transformation not defined
+ IsA Mapping # Mapping between coordinate systems
+ Nlut = 8 # Number of lookup table elements
+ Start = 1 # Input value at first element
+# Incr = 1 # Input value increment between elements
+ LutInt = 0 # Interpolation method
+ L1 = 1997.84512 # Lookup table elements...
+ L2 = 1997.84631
+ L3 = 1993.28451
+ L4 = 1993.28456
+ L5 = 2001.59234
+ L6 = 2001.59239
+ L7 = 2002.18265
+ L8 = 2002.18301
+ End LutMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
diff --git a/ast/ast_tester/stcschan-test1-doc3-props.ast b/ast/ast_tester/stcschan-test1-doc3-props.ast
new file mode 100644
index 0000000..4ab41aa
--- /dev/null
+++ b/ast/ast_tester/stcschan-test1-doc3-props.ast
@@ -0,0 +1,126 @@
+Begin KeyMap # Map of key/value pairs
+ MapSz = 16 # Size of hash table
+ Key1 = "REDSHIFT_PROPS" # Item name
+ Typ1 = 4 # Item data type (AST Object)
+ Val1 = # Item value
+ Begin KeyMap # Map of key/value pairs
+ MapSz = 16 # Size of hash table
+ Key1 = "PIXSIZE" # Item name
+ Typ1 = 3 # Item data type (string)
+ Val1 = "0.3" # Item value
+ Key2 = "ID" # Item name
+ Typ2 = 3 # Item data type (string)
+ Val2 = "RedshiftInterval" # Item value
+ Key3 = "REFPOS" # Item name
+ Typ3 = 3 # Item data type (string)
+ Val3 = "BARYCENTER" # Item value
+ Key4 = "HILIMIT" # Item name
+ Typ4 = 3 # Item data type (string)
+ Val4 = "2300.0" # Item value
+ Key5 = "TYPE" # Item name
+ Typ5 = 3 # Item data type (string)
+ Val5 = "VELOCITY" # Item value
+ Key6 = "RESOLUTION" # Item name
+ Typ6 = 3 # Item data type (string)
+ Val6 = "0.7" # Item value
+ Key7 = "DOPPLERDEF" # Item name
+ Typ7 = 3 # Item data type (string)
+ Val7 = "OPTICAL" # Item value
+ Key8 = "REDSHIFT" # Item name
+ Typ8 = 3 # Item data type (string)
+ Val8 = "300.0" # Item value
+ Key9 = "LOLIMIT" # Item name
+ Typ9 = 3 # Item data type (string)
+ Val9 = "200.0" # Item value
+ End KeyMap
+ Key2 = "SPACE_PROPS" # Item name
+ Typ2 = 4 # Item data type (AST Object)
+ Val2 = # Item value
+ Begin KeyMap # Map of key/value pairs
+ MapSz = 16 # Size of hash table
+ Key1 = "SIZE" # Item name
+ Typ1 = 3 # Item data type (string)
+ Val1 = "0.000333 0.000278" # Item value
+ Key2 = "FRAME" # Item name
+ Typ2 = 3 # Item data type (string)
+ Val2 = "ICRS" # Item value
+ Key3 = "PIXSIZE" # Item name
+ Typ3 = 3 # Item data type (string)
+ Val3 = "0.000083 0.000083" # Item value
+ Key4 = "ID" # Item name
+ Typ4 = 3 # Item data type (string)
+ Val4 = "Circle" # Item value
+ Key5 = "REFPOS" # Item name
+ Typ5 = 3 # Item data type (string)
+ Val5 = "GEOCENTER" # Item value
+ Key6 = "CENTRE" # Item name
+ Typ6 = 3 # Item data type (string)
+ Val6 = "179.0 -11.5" # Item value
+ Key7 = "RESOLUTION" # Item name
+ Typ7 = 3 # Item data type (string)
+ Val7 = "0.001778" # Item value
+ Key8 = "POSITION" # Item name
+ Typ8 = 3 # Item data type (string)
+ Val8 = "179.0 -11.5" # Item value
+ Key9 = "RADIUS" # Item name
+ Typ9 = 3 # Item data type (string)
+ Val9 = "0.5" # Item value
+ Key10 = "ERROR" # Item name
+ Typ10 = 3 # Item data type (string)
+ Val10 = "0.000889" # Item value
+ End KeyMap
+ Key3 = "SPECTRAL_PROPS" # Item name
+ Typ3 = 4 # Item data type (AST Object)
+ Val3 = # Item value
+ Begin KeyMap # Map of key/value pairs
+ MapSz = 16 # Size of hash table
+ Key1 = "ID" # Item name
+ Typ1 = 3 # Item data type (string)
+ Val1 = "Spectral" # Item value
+ Key2 = "SPECTRAL" # Item name
+ Typ2 = 3 # Item data type (string)
+ Val2 = "1420.4" # Item value
+ Key3 = "REFPOS" # Item name
+ Typ3 = 3 # Item data type (string)
+ Val3 = "BARYCENTER" # Item value
+ Key4 = "UNIT" # Item name
+ Typ4 = 3 # Item data type (string)
+ Val4 = "MHz" # Item value
+ Key5 = "RESOLUTION" # Item name
+ Typ5 = 3 # Item data type (string)
+ Val5 = "10.0" # Item value
+ End KeyMap
+ Key4 = "TIME_PROPS" # Item name
+ Typ4 = 4 # Item data type (AST Object)
+ Val4 = # Item value
+ Begin KeyMap # Map of key/value pairs
+ MapSz = 16 # Size of hash table
+ Key1 = "PIXSIZE" # Item name
+ Typ1 = 3 # Item data type (string)
+ Val1 = "1024.0" # Item value
+ Key2 = "ID" # Item name
+ Typ2 = 3 # Item data type (string)
+ Val2 = "TimeInterval" # Item value
+ Key3 = "START" # Item name
+ Typ3 = 3 # Item data type (string)
+ Val3 = "1996-01-01T00:00:00" # Item value
+ Key4 = "TIME" # Item name
+ Typ4 = 3 # Item data type (string)
+ Val4 = "MJD 50814.0" # Item value
+ Key5 = "REFPOS" # Item name
+ Typ5 = 3 # Item data type (string)
+ Val5 = "GEOCENTER" # Item value
+ Key6 = "RESOLUTION" # Item name
+ Typ6 = 3 # Item data type (string)
+ Val6 = "0.8" # Item value
+ Key7 = "STOP" # Item name
+ Typ7 = 3 # Item data type (string)
+ Val7 = "1996-01-01T00:30:00" # Item value
+ Key8 = "TIMESCALE" # Item name
+ Typ8 = 3 # Item data type (string)
+ Val8 = "TT" # Item value
+ Key9 = "ERROR" # Item name
+ Typ9 = 3 # Item data type (string)
+ Val9 = "1.2" # Item value
+ End KeyMap
+End KeyMap
diff --git a/ast/ast_tester/stcschan-test1-doc3.ast b/ast/ast_tester/stcschan-test1-doc3.ast
new file mode 100644
index 0000000..0758ca7
--- /dev/null
+++ b/ast/ast_tester/stcschan-test1-doc3.ast
@@ -0,0 +1,272 @@
+ Begin Prism # Region extrusion into higher dimensions
+# Title = "5-d compound coordinate system" # Title of coordinate system
+# Naxes = 5 # Number of coordinate axes
+# Domain = "TIME-SKY-SPECTRUM-REDSHIFT" # Coordinate system domain
+# Epoch = 1995.9986310746 # Julian epoch of observation
+# Lbl1 = "Modified Julian Date offset from 1996-01-01 " # Label for axis 1
+# Lbl2 = "Right ascension" # Label for axis 2
+# Lbl3 = "Declination" # Label for axis 3
+# Lbl4 = "Frequency" # Label for axis 4
+# Lbl5 = "Optical velocity" # Label for axis 5
+# System = "Compound" # Coordinate system type
+# Uni1 = "d" # Units for axis 1 (day)
+# Uni2 = "hh:mm:ss.s" # Units for axis 2
+# Uni3 = "ddd:mm:ss" # Units for axis 3
+# Uni4 = "MHz" # Units for axis 4
+# Uni5 = "km/s" # Units for axis 5
+# Dir2 = 0 # Plot axis 2 in reverse direction
+ IsA Frame # Coordinate system description
+ Adapt = 1 # Region adapts to coord sys changes
+ Frm = # Coordinate system
+ Begin CmpFrame # Compound coordinate system description
+# Title = "5-d compound coordinate system" # Title of coordinate system
+# Naxes = 5 # Number of coordinate axes
+# Domain = "TIME-SKY-SPECTRUM-REDSHIFT" # Coordinate system domain
+# Lbl1 = "Modified Julian Date offset from 1996-01-01 " # Label for axis 1
+# Lbl2 = "Right ascension" # Label for axis 2
+# Lbl3 = "Declination" # Label for axis 3
+# Lbl4 = "Frequency" # Label for axis 4
+# Lbl5 = "Optical velocity" # Label for axis 5
+# Uni1 = "d" # Units for axis 1 (day)
+# Uni2 = "hh:mm:ss.s" # Units for axis 2
+# Uni3 = "ddd:mm:ss" # Units for axis 3
+# Uni4 = "MHz" # Units for axis 4
+# Uni5 = "km/s" # Units for axis 5
+# Dir2 = 0 # Plot axis 2 in reverse direction
+ IsA Frame # Coordinate system description
+ FrameA = # First component Frame
+ Begin CmpFrame # Compound coordinate system description
+ FrameA = # First component Frame
+ Begin CmpFrame # Compound coordinate system description
+ FrameA = # First component Frame
+ Begin TimeFrame # Description of time coordinate system
+ Naxes = 1 # Number of coordinate axes
+ Epoch = 1995.9986310746 # Julian epoch of observation
+ Ax1 = # Axis number 1
+ Begin Axis # Coordinate axis
+ End Axis
+ IsA Frame # Coordinate system description
+ TmScl = "TT" # Time scale
+ TmOrg = 50083 # Time offset
+ End TimeFrame
+ FrameB = # Second component Frame
+ Begin SkyFrame # Description of celestial coordinate system
+ Naxes = 2 # Number of coordinate axes
+ Epoch = 1995.9986310746 # Julian epoch of observation
+ System = "ICRS" # Coordinate system type
+ Ax1 = # Axis number 1
+ Begin SkyAxis # Celestial coordinate axis
+ End SkyAxis
+ Ax2 = # Axis number 2
+ Begin SkyAxis # Celestial coordinate axis
+ End SkyAxis
+ IsA Frame # Coordinate system description
+ End SkyFrame
+ End CmpFrame
+ FrameB = # Second component Frame
+ Begin SpecFrame # Description of spectral coordinate system
+ Naxes = 1 # Number of coordinate axes
+ Epoch = 1995.9986310746 # Julian epoch of observation
+ System = "FREQ" # Coordinate system type
+ Ax1 = # Axis number 1
+ Begin Axis # Coordinate axis
+ Unit = "MHz" # Axis units
+ End Axis
+ IsA Frame # Coordinate system description
+ SoR = "Barycentric" # Standard of rest
+ UFreq = "MHz" # Preferred units for frequency
+ End SpecFrame
+ End CmpFrame
+ FrameB = # Second component Frame
+ Begin SpecFrame # Description of spectral coordinate system
+ Naxes = 1 # Number of coordinate axes
+ Domain = "REDSHIFT" # Coordinate system domain
+ Epoch = 1995.9986310746 # Julian epoch of observation
+ System = "VOPT" # Coordinate system type
+ Ax1 = # Axis number 1
+ Begin Axis # Coordinate axis
+ Unit = "km/s" # Axis units
+ End Axis
+ IsA Frame # Coordinate system description
+ SoR = "Barycentric" # Standard of rest
+ UVopt = "km/s" # Preferred units for optical velocity
+ End SpecFrame
+ End CmpFrame
+ RegAxes = 5 # Number of axes spanned by the Region
+ IsA Region # An area within a coordinate system
+ RegionA = # First component Region
+ Begin Prism # Region extrusion into higher dimensions
+# Title = "4-d compound coordinate system" # Title of coordinate system
+# Naxes = 4 # Number of coordinate axes
+# Domain = "TIME-SKY-SPECTRUM" # Coordinate system domain
+# Epoch = 1995.9986310746 # Julian epoch of observation
+# Lbl1 = "Modified Julian Date offset from 1996-01-01 " # Label for axis 1
+# Lbl2 = "Right ascension" # Label for axis 2
+# Lbl3 = "Declination" # Label for axis 3
+# Lbl4 = "Frequency" # Label for axis 4
+# System = "Compound" # Coordinate system type
+# Uni1 = "d" # Units for axis 1 (day)
+# Uni2 = "hh:mm:ss.s" # Units for axis 2
+# Uni3 = "ddd:mm:ss" # Units for axis 3
+# Uni4 = "MHz" # Units for axis 4
+# Dir2 = 0 # Plot axis 2 in reverse direction
+ IsA Frame # Coordinate system description
+ Adapt = 1 # Region adapts to coord sys changes
+ RegAxes = 4 # Number of axes spanned by the Region
+ IsA Region # An area within a coordinate system
+ RegionA = # First component Region
+ Begin Prism # Region extrusion into higher dimensions
+# Title = "3-d compound coordinate system" # Title of coordinate system
+# Naxes = 3 # Number of coordinate axes
+# Domain = "TIME-SKY" # Coordinate system domain
+# Epoch = 1995.9986310746 # Julian epoch of observation
+# Lbl1 = "Modified Julian Date offset from 1996-01-01 " # Label for axis 1
+# Lbl2 = "Right ascension" # Label for axis 2
+# Lbl3 = "Declination" # Label for axis 3
+# System = "Compound" # Coordinate system type
+# Uni1 = "d" # Units for axis 1 (day)
+# Uni2 = "hh:mm:ss.s" # Units for axis 2
+# Uni3 = "ddd:mm:ss" # Units for axis 3
+# Dir2 = 0 # Plot axis 2 in reverse direction
+ IsA Frame # Coordinate system description
+ Adapt = 1 # Region adapts to coord sys changes
+ RegAxes = 3 # Number of axes spanned by the Region
+ IsA Region # An area within a coordinate system
+ RegionA = # First component Region
+ Begin Box # Axis intervals
+# Title = "Modified Julian Date [TT] offset from 1996-01-01 00:00:00" # Title of coordinate system
+# Naxes = 1 # Number of coordinate axes
+# Domain = "TIME" # Coordinate system domain
+# Epoch = 1995.9986310746 # Julian epoch of observation
+# Lbl1 = "Modified Julian Date offset from 1996-01-01 " # Label for axis 1
+# System = "MJD" # Coordinate system type
+# Uni1 = "d" # Units for axis 1 (day)
+ IsA Frame # Coordinate system description
+ Closed = 1 # Boundary is inside
+ Adapt = 1 # Region adapts to coord sys changes
+ Points = # Points defining the shape
+ Begin PointSet # Container for a set of points
+ Npoint = 2 # Number of points
+ Ncoord = 1 # Number of coordinates per point
+ X1 = 0.0104166666678793 # Coordinate values...
+ X2 = 0.0208333333357587
+ End PointSet
+ Unc = # Region defining positional uncertainties.
+ Begin Box # Axis intervals
+# Title = "Modified Julian Date [TT] offset from 1996-01-01 00:00:00" # Title of coordinate system
+# Naxes = 1 # Number of coordinate axes
+# Domain = "TIME" # Coordinate system domain
+# Epoch = 1995.9986310746 # Julian epoch of observation
+# Lbl1 = "Modified Julian Date offset from 1996-01-01 " # Label for axis 1
+# System = "MJD" # Coordinate system type
+# Uni1 = "d" # Units for axis 1 (day)
+ IsA Frame # Coordinate system description
+ Adapt = 1 # Region adapts to coord sys changes
+ Points = # Points defining the shape
+ Begin PointSet # Container for a set of points
+ Npoint = 2 # Number of points
+ Ncoord = 1 # Number of coordinates per point
+ X1 = 0.0104166666678793 # Coordinate values...
+ X2 = 0.0104305555567682
+ End PointSet
+ IsA Region # An area within a coordinate system
+ End Box
+ IsA Region # An area within a coordinate system
+ End Box
+ RegionB = # Second component Region
+ Begin Circle # Circular or spherical region
+# Title = "ICRS coordinates" # Title of coordinate system
+# Naxes = 2 # Number of coordinate axes
+# Domain = "SKY" # Coordinate system domain
+# Epoch = 1995.9986310746 # Julian epoch of observation
+# Lbl1 = "Right ascension" # Label for axis 1
+# Lbl2 = "Declination" # Label for axis 2
+# System = "ICRS" # Coordinate system type
+# Uni1 = "hh:mm:ss.s" # Units for axis 1
+# Uni2 = "ddd:mm:ss" # Units for axis 2
+# Dir1 = 0 # Plot axis 1 in reverse direction
+# Bot2 = -1.5707963267949 # Lowest legal axis value
+# Top2 = 1.5707963267949 # Highest legal axis value
+ IsA Frame # Coordinate system description
+ Adapt = 1 # Region adapts to coord sys changes
+ Points = # Points defining the shape
+ Begin PointSet # Container for a set of points
+ Npoint = 2 # Number of points
+ Ncoord = 2 # Number of coordinates per point
+ X1 = 3.12413936106985 # Coordinate values...
+ X2 = -0.200712863979348
+ X3 = 3.13304478740064
+ X4 = -0.200712708456374
+ End PointSet
+ Unc = # Region defining positional uncertainties.
+ Begin Box # Axis intervals
+# Title = "ICRS coordinates" # Title of coordinate system
+# Naxes = 2 # Number of coordinate axes
+# Domain = "SKY" # Coordinate system domain
+# Epoch = 1995.9986310746 # Julian epoch of observation
+# Lbl1 = "Right ascension" # Label for axis 1
+# Lbl2 = "Declination" # Label for axis 2
+# System = "ICRS" # Coordinate system type
+# Uni1 = "hh:mm:ss.s" # Units for axis 1
+# Uni2 = "ddd:mm:ss" # Units for axis 2
+# Dir1 = 0 # Plot axis 1 in reverse direction
+# Bot2 = -1.5707963267949 # Lowest legal axis value
+# Top2 = 1.5707963267949 # Highest legal axis value
+ IsA Frame # Coordinate system description
+ Adapt = 1 # Region adapts to coord sys changes
+ Points = # Points defining the shape
+ Begin PointSet # Container for a set of points
+ Npoint = 2 # Number of points
+ Ncoord = 2 # Number of coordinates per point
+ X1 = 3.12413936106985 # Coordinate values...
+ X2 = -0.200712863979348
+ X3 = 3.12415519494
+ X4 = -0.200697348002298
+ End PointSet
+ IsA Region # An area within a coordinate system
+ End Box
+ IsA Region # An area within a coordinate system
+ End Circle
+ End Prism
+ RegionB = # Second component Region
+ Begin PointList # Collection of points
+# Title = "Frequency (Barycentric)" # Title of coordinate system
+# Naxes = 1 # Number of coordinate axes
+# Domain = "SPECTRUM" # Coordinate system domain
+# Epoch = 1995.9986310746 # Julian epoch of observation
+# Lbl1 = "Frequency" # Label for axis 1
+# System = "FREQ" # Coordinate system type
+# Uni1 = "MHz" # Units for axis 1
+ IsA Frame # Coordinate system description
+ Adapt = 1 # Region adapts to coord sys changes
+ Points = # Points defining the shape
+ Begin PointSet # Container for a set of points
+ Npoint = 1 # Number of points
+ Ncoord = 1 # Number of coordinates per point
+ X1 = 1420.4 # Coordinate values...
+ End PointSet
+ IsA Region # An area within a coordinate system
+ End PointList
+ End Prism
+ RegionB = # Second component Region
+ Begin Box # Axis intervals
+# Title = "Optical velocity (Barycentric), rest frequency = 100000 GHz" # Title of coordinate system
+# Naxes = 1 # Number of coordinate axes
+# Domain = "REDSHIFT" # Coordinate system domain
+# Epoch = 1995.9986310746 # Julian epoch of observation
+# Lbl1 = "Optical velocity" # Label for axis 1
+# System = "VOPT" # Coordinate system type
+# Uni1 = "km/s" # Units for axis 1
+ IsA Frame # Coordinate system description
+ Closed = 1 # Boundary is inside
+ Adapt = 1 # Region adapts to coord sys changes
+ Points = # Points defining the shape
+ Begin PointSet # Container for a set of points
+ Npoint = 2 # Number of points
+ Ncoord = 1 # Number of coordinates per point
+ X1 = 1250 # Coordinate values...
+ X2 = 2300
+ End PointSet
+ IsA Region # An area within a coordinate system
+ End Box
+ End Prism
diff --git a/ast/ast_tester/testchannel.f b/ast/ast_tester/testchannel.f
new file mode 100644
index 0000000..ac69b2c
--- /dev/null
+++ b/ast/ast_tester/testchannel.f
@@ -0,0 +1,88 @@
+ program testrate
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ include 'AST_ERR'
+
+ integer status, ch, sf, sf2
+ character buff*50
+ status = sai__ok
+
+ call err_begin( status )
+ call ast_begin( status )
+
+
+ call ast_tunec( "hrdel", AST__TUNULLC, buff, status )
+ if( buff .ne. '%-%^50+%s70+h%+' .and. status .eq. sai__ok ) then
+ call stopit( 0, status )
+ endif
+ call ast_tunec( "hrdel", "junk", buff, status )
+ call ast_tunec( "hrdel", AST__TUNULLC, buff, status )
+ if( buff .ne. 'junk' .and. status .eq. sai__ok ) then
+ call stopit( -1, status )
+ endif
+
+ sf = ast_skyframe( ' ', status )
+ ch = ast_channel( AST_NULL, AST_NULL, 'SinkFile=./fred.txt',
+ : status )
+ if( ast_write( ch, sf, status ) .ne. 1 ) then
+ call stopit( 1, status )
+ end if
+
+ call ast_set( ch, 'SourceFile=./fred.txt', status )
+ if( status .eq. SAI__OK ) then
+ sf2 = ast_read( ch, status )
+ if( status .eq. AST__RDERR ) then
+ call err_annul( status )
+ else
+ call stopit( 7, status )
+ end if
+ end if
+
+ call ast_clear( ch, 'SinkFile', status )
+
+ call ast_set( ch, 'SourceFile=./fred.txt', status )
+ sf2 = ast_read( ch, status )
+ if( sf2 .eq. AST__NULL ) call stopit( 2, status )
+ if( .not. ast_equal( sf, sf2, status ) ) then
+ call stopit( 3, status )
+ end if
+
+
+ call ast_set( ch, 'SinkFile=./fred2.txt', status )
+ if( ast_write( ch, sf, status ) .ne. 1 ) then
+ call stopit( 4, status )
+ end if
+ call ast_clear( ch, 'SinkFile', status )
+
+ call ast_set( ch, 'SourceFile=./fred2.txt', status )
+ sf2 = ast_read( ch, status )
+ if( sf2 .eq. AST__NULL ) call stopit( 5, status )
+ if( .not. ast_equal( sf, sf2, status ) ) then
+ call stopit( 6, status )
+ end if
+
+
+ call ast_end( status )
+ call err_end( status )
+
+
+
+ if( status .eq. sai__ok ) then
+ write(*,*) 'All Channel tests passed'
+ else
+ write(*,*) 'Channel tests failed'
+ end if
+
+ end
+
+
+ subroutine stopit( i, status )
+ implicit none
+ include 'SAE_PAR'
+ integer i, status
+ if( status .eq. sai__ok ) then
+ write( *,* ) 'Error ',i
+ status = sai__error
+ end if
+ end
diff --git a/ast/ast_tester/testchebymap.f b/ast/ast_tester/testchebymap.f
new file mode 100644
index 0000000..b0a0bba
--- /dev/null
+++ b/ast/ast_tester/testchebymap.f
@@ -0,0 +1,475 @@
+ program testchebymap
+ implicit none
+
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ include 'PRM_PAR'
+
+ integer status, lstat, cm, cm2, cm3, i, j, nco
+ double precision lbnd( 2 ), ubnd( 2 ), dval, lb, ub, xl(2), xu(2)
+ double precision tlbnd( 2 ), tubnd( 2 ), dlbnd( 2 ), dubnd( 2 )
+
+ double precision coeffs_1( 4*3 ), xin( 5 ), xout( 5 ), xrec( 5 ),
+ : yrec( 5 ), coeffs_4(4*4 ),
+ : work( 5 ), coeffs_2( 2*3 ), coeffs_3( 4*5 ),
+ : yin(5), yout(5), xi, yi, xv, yv, y, a, x,
+ : cofs( 100 )
+
+
+C f(x) = 1.5*T0(x') - 1.0*T2(x') + 2.0*T3(x') - 1.3*T4(x')
+ data coeffs_1 /1.5D0, 1.0D0, 0.0D0,
+ : -1.0D0, 1.0D0, 2.0D0,
+ : 2.0D0, 1.0D0, 3.0D0,
+ : 1.3D0, 1.0D0, 4.0D0 /
+
+C f(x) = 1.0*T0(x') - 2.0*T1(x')
+ data coeffs_2 /1.0D0, 1.0D0, 0.0D0,
+ : -2.0D0, 1.0D0, 1.0D0 /
+
+
+C fx(x,y) = 1.0*T0(x')*T0(y') - 2.0*T1(x')*T2(y') + T1(y')
+C fy(x,y) = 1.5*T0(x')*T0(y') - 2.5*T1(x')*T2(y')
+ data coeffs_3 /1.0D0, 1.0D0, 0.0D0, 0.0D0,
+ : -2.0D0, 1.0D0, 1.0D0, 2.0D0,
+ : 1.0D0, 1.0D0, 0.0D0, 1.0D0,
+ : 1.5D0, 2.0D0, 0.0D0, 0.0D0,
+ : -2.5D0, 2.0D0, 1.0D0, 2.0D0/
+
+C fx(x,y) = T1(x') + T1(y')
+C fy(x,y) = T1(x') - T1(y')
+C
+C This has the property that the coeffs of the inverse transformation are
+C equal to the coeffs of the forward transformation.
+ data coeffs_4 /1.0D0, 1.0D0, 1.0D0, 0.0D0,
+ : 1.0D0, 1.0D0, 0.0D0, 1.0D0,
+ : 1.0D0, 2.0D0, 1.0D0, 0.0D0,
+ : -1.0D0, 2.0D0, 0.0D0, 1.0D0 /
+
+
+ status = sai__ok
+ call ast_begin( status )
+
+C One-dimensional ChebyMaps, order 1: a constant equal to 1.5
+ lbnd( 1 ) = -1.0D0
+ lbnd( 2 ) = -1.0D0
+ ubnd( 1 ) = 1.0D0
+ ubnd( 2 ) = 1.0D0
+
+ cm = ast_chebymap( 1, 1, 1, coeffs_1, 0, 0.0D0, lbnd, ubnd, 1.0D0,
+ : 1.0D0, ' ', status )
+
+ xin( 1 ) = -1.0D0
+ xin( 2 ) = -0.5D0
+ xin( 3 ) = 0.0D0
+ xin( 4 ) = 0.5D0
+ xin( 5 ) = 1.0D0
+
+ call ast_tran1( cm, 5, xin, .true., xout, status )
+ do i = 1, 5
+ if( xout( i ) .ne. 1.5D0 ) call stopit( 0, status )
+ end do
+
+C One-dimensional ChebyMaps, order 3: 2.5 - 2*x*x
+ cm = ast_chebymap( 1, 1, 2, coeffs_1, 0, 0.0D0, lbnd, ubnd, 1.0D0,
+ : 1.0D0, ' ', status )
+ call ast_tran1( cm, 5, xin, .true., xout, status )
+ do i = 1, 5
+ if( xout( i ) .ne. 2.5D0 - 2.0D0*xin( i )**2 )
+ : call stopit( 1, status )
+ end do
+
+C One-dimensional ChebyMaps, order 4: 2.5 - 6*x - 2*x*x + 8*x*x*x
+ cm = ast_chebymap( 1, 1, 3, coeffs_1, 0, 0.0D0, lbnd, ubnd, 1.0D0,
+ : 1.0D0, ' ', status )
+ call ast_tran1( cm, 5, xin, .true., xout, status )
+ do i = 1, 5
+ dval = 2.5D0-6.0D0*xin(i)-2.0D0*xin(i)**2+8.0D0*xin(i)**3
+ if( xout( i ) .ne. dval ) call stopit( 2, status )
+ end do
+
+C One-dimensional ChebyMaps, order 5
+ cm = ast_chebymap( 1, 1, 4, coeffs_1, 0, 0.0D0, lbnd, ubnd, 1.0D0,
+ : 1.0D0, ' ', status )
+ call ast_tran1( cm, 5, xin, .true., xout, status )
+
+ do i = 1, 5
+ work( 1 ) = 1.0D0
+ work( 2 ) = xin( i )
+ do j = 3, 5
+ work( j ) = 2.0D0 * xin( i ) * work( j - 1 )
+ : - work( j - 2 )
+ end do
+
+ if( 1.5D0*work(1) - 1.0D0*work(3) +
+ : 2.0D0*work(4) + 1.3D0*work(5) .ne.
+ : xout( i ) ) call stopit( 3, status )
+
+ end do
+
+C Check the IterInverse attribute is zero.
+ if( ast_getl( cm, 'IterInverse', status ) ) then
+ call stopit( 4, status )
+ end if
+
+c The astPolyTran method on a 1-dimensional ChebyMaps, order 2: 1 - 2*x
+ cm = ast_chebymap( 1, 1, 2, coeffs_2, 0, 0.0D0, lbnd, ubnd, 1.0D0,
+ : 1.0D0, ' ', status )
+ cm2 = ast_polytran( cm, .false., 0.01D0, 0.01D0, 5, lbnd,
+ : ubnd, status )
+ if( cm2 .eq. AST__NULL ) then
+ call stopit( 5, status )
+ else
+ xin( 1 ) = -1.0D0
+ xin( 2 ) = -0.5D0
+ xin( 3 ) = 0.0D0
+ xin( 4 ) = 0.5D0
+ xin( 5 ) = 1.0D0
+ call ast_tran1( cm2, 5, xin, .true., xout, status )
+ call ast_tran1( cm2, 5, xout, .false., xrec, status )
+ do i = 1, 5
+ if( abs( xrec(i) - xin(i) ) .gt. 1.0D-3*abs( xin(i) ) )
+ : call stopit( 6, status )
+ end do
+
+ call ast_chebydomain( cm2, .false., dlbnd, dubnd, status )
+ if( dlbnd(1) .ne. -1.0D0 )
+ : call stopit( 501, status )
+ if( dubnd(1) .ne. 3.0D0 )
+ : call stopit( 502, status )
+
+ call ast_polycoeffs( cm2, .false., 100, cofs, nco, status )
+ if( nco .ne. 1 )
+ : call stopit( 503, status )
+
+ if( abs( cofs(1) + 1.0D0 ) .gt. 1.0D-10 )
+ : call stopit( 504, status )
+ if( abs( cofs(2) - 1.0D0 ) .gt. 1.0D-10 )
+ : call stopit( 505, status )
+ if( abs( cofs(3) - 1.0D0 ) .gt. 1.0D-10 )
+ : call stopit( 506, status )
+
+ end if
+
+c The astPolyTran method on a 1-dimensional ChebyMaps, order 5.
+ lbnd( 1 ) = -100.0D0
+ ubnd( 1 ) = 100.0D0
+ cm = ast_chebymap( 1, 1, 4, coeffs_1, 0, 0.0D0, lbnd, ubnd, 1.0D0,
+ : 1.0D0, ' ', status )
+ cm2 = ast_polytran( cm, .false., 0.01D0, 0.01D0, 10, -5.0D0,
+ : 50.0D0, status )
+
+ if( cm2 .eq. AST__NULL ) then
+ call stopit( 7, status )
+ else
+ xin(1) = 0.0D0;
+ xin(2) = 10.0D0;
+ xin(3) = 20.0D0;
+ xin(4) = 30.0D0;
+ xin(5) = 40.0D0;
+ call ast_tran1( cm2, 5, xin, .true., xout, status )
+ call ast_tran1( cm2, 5, xout, .false., xrec, status )
+
+ do i = 1, 5
+ if( abs( xrec( i ) - xin( i ) ) .gt. 0.01D0 )
+ : call stopit( 8, status )
+ end do
+ end if
+
+c ast_equal and ast_copy
+ cm3 = ast_copy( cm2, status )
+ if( .not. ast_equal( cm2, cm3, status ) ) then
+ call stopit( 9, status )
+ end if
+
+c astDump and astLoadChebyMap
+ call checkdump( cm2, status )
+
+
+c Simple 2d ChebyMap.
+C fx(x,y) = T1(x') + T1(y')
+C fy(x,y) = T1(x') - T1(y')
+
+ lbnd(1) = -1.0D0
+ lbnd(2) = -1.0D0
+ ubnd(1) = 1.0D0
+ ubnd(2) = 1.0D0
+
+ cm = ast_chebymap( 2, 2, 4, coeffs_4, 0, 0.0D0, lbnd, ubnd,
+ : 1.0D0, 1.0D0, ' ', status )
+
+ cm2 = ast_copy( cm, status )
+ call ast_invert( cm2, status )
+ cm3 = ast_simplify( ast_cmpmap( cm, cm2, .TRUE., ' ', status ),
+ : status )
+ if( .not. ast_isaunitmap( cm3, status ) ) then
+ call stopit( 1000, status )
+ end if
+
+ xin(1) = 0.5D0
+ xin(2) = 0.0D0
+ xin(3) = -0.5D0
+ xin(4) = 0.0D0
+
+ yin(1) = 0.0D0
+ yin(2) = 0.5D0
+ yin(3) = 0.0D0
+ yin(4) = -0.5D0
+
+ call ast_tran2( cm, 4, xin, yin, .true., xout, yout, status )
+ do i = 1, 4
+ xv = xin(i) + yin(i)
+ yv = xin(i) - yin(i)
+
+ if( abs( xout(i) - xv ) .gt. 1.0D-6*abs(xv) .or.
+ : abs( yout(i) - yv ) .gt. 1.0D-6*abs(yv) ) then
+ call stopit( 101, status )
+ end if
+ end do
+
+ cm2 = ast_polytran( cm, .false., 0.01D0, 0.01D0, 10, lbnd,
+ : ubnd, status )
+
+ if( cm2 .eq. AST__NULL ) then
+ call stopit( 102, status )
+ else
+ call ast_tran2( cm2, 4, xout, yout, .false., xrec, yrec,
+ : status )
+ do i = 1, 4
+ if( abs( xrec(i) - xin(i) ) .gt. 0.01D0 .or.
+ : abs( yrec(i) - yin(i) ) .gt. 0.01D0 ) then
+ call stopit( 103, status )
+ end if
+ end do
+ end if
+
+ call ast_polycoeffs( cm2, .false., 100, cofs, nco, status )
+ if( nco .ne. 4 ) then
+ call stopit( 104, status )
+ else
+ do i = 1, 16
+ if( abs( cofs(i) - coeffs_4(i) ) .gt. 0.01D0 ) then
+ call stopit( 105, status )
+ end if
+ end do
+ end if
+
+ call ast_chebydomain( cm2, .false., dlbnd, dubnd, status )
+
+ if( dlbnd(1) .ne. -2.0D0 ) then
+ call stopit( 106, status )
+ else if( dlbnd(2) .ne. -2.0D0 ) then
+ call stopit( 107, status )
+ else if( dubnd(1) .ne. 2.0D0 ) then
+ call stopit( 108, status )
+ else if( dubnd(2) .ne. 2.0D0 ) then
+ call stopit( 109, status )
+ end if
+
+* 2-dimensional ChebyMaps: forward transformation
+ lbnd(1) = 0.0D0
+ lbnd(2) = 0.0D0
+ ubnd(1) = 10.0D0
+ ubnd(2) = 10.0D0
+
+ cm = ast_chebymap( 2, 2, 5, coeffs_3, 0, 0.0D0, lbnd, ubnd,
+ : 1.0D0, 1.0D0, ' ', status )
+
+ xin(1) = 0.0D0
+ xin(2) = 2.0D0
+ xin(3) = 6.0D0
+ xin(4) = 10.0D0
+
+ yin(1) = 2.0D0
+ yin(2) = 5.0D0
+ yin(3) = 8.0D0
+ yin(4) = 0.0D0
+
+ call ast_tran2( cm, 4, xin, yin, .true., xout, yout, status )
+ do i = 1, 4
+ xi = 2.0D0*( xin(i) - lbnd(1) )/( ubnd(1) - lbnd(1) ) - 1.0D0
+ yi = 2.0D0*( yin(i) - lbnd(2) )/( ubnd(2) - lbnd(2) ) - 1.0D0
+
+ xv = 1 - 2*xi*(2*yi**2 - 1) + yi
+ yv = 1.5 - 2.5*xi*(2*yi**2 - 1)
+
+ if( abs( xout(i) - xv ) .gt. 1.0D-6*abs(xv) .or.
+ : abs( yout(i) - yv ) .gt. 1.0D-6*abs(yv) ) then
+ call stopit( 10, status )
+ end if
+ end do
+
+
+* 2-dimensional ChebyMaps: fitted inverse transformation
+ tlbnd(1) = 4.0D0
+ tlbnd(2) = 4.0D0
+ tubnd(1) = 6.0D0
+ tubnd(2) = 6.0D0
+ cm2 = ast_polytran( cm, .false., 0.01D0, 0.01D0, 10, tlbnd,
+ : tubnd, status )
+
+ if( cm2 .eq. AST__NULL ) then
+ call stopit( 11, status )
+ else
+ xin(1) = 4.0D0
+ xin(2) = 4.5D0
+ xin(3) = 5.0D0
+ xin(4) = 5.5D0
+
+ yin(1) = 6.0D0
+ yin(2) = 5.5D0
+ yin(3) = 5.0D0
+ yin(4) = 4.5D0
+
+ call ast_tran2( cm2, 4, xin, yin, .true., xout, yout, status )
+ call ast_tran2( cm2, 4, xout, yout, .false., xrec, yrec,
+ : status )
+ do i = 1, 4
+ if( abs( xrec(i) - xin(i) ) .gt. 0.01D0 .or.
+ : abs( yrec(i) - yin(i) ) .gt. 0.01D0 ) then
+ call stopit( 12, status )
+ end if
+ end do
+ end if
+
+
+* Test recovery of coeffs
+ call ast_polycoeffs( cm2, .true., 0, 0.0D0, nco, status )
+ if( nco .ne. 5 ) then
+ call stopit( 13, status )
+ endif
+
+ call ast_polycoeffs( cm2, .true., 100, cofs, nco, status )
+ if( nco .ne. 5 ) then
+ call stopit( 14, status )
+ else
+ do i = 1, 20
+ if( cofs( i ) .ne. coeffs_3( i ) ) then
+ call stopit( 15, status )
+ end if
+ end do
+ endif
+
+ call ast_polycoeffs( cm2, .false., 0, 0.0D0, nco, status )
+ if( nco .ne. 9 ) then
+ call stopit( 16, status )
+ endif
+
+ call ast_polycoeffs( cm2, .false., 100, cofs, nco, status )
+
+ if( nco .ne. 9 ) then
+ call stopit( 17, status )
+ else if( abs( cofs( 1 ) - 5.0000000000000018D0 ) .gt.
+ : 1.0E-6 ) then
+ call stopit( 18, status )
+ else if( abs( cofs( 13 ) - 0.35096188953505458D0 ) .gt.
+ : 1.0E-6 ) then
+ call stopit( 19, status )
+ else if( cofs( 15 ) .ne. 2.0D0 ) then
+ call stopit( 20, status )
+ end if
+
+* Test recovery of domain bounding box
+ call ast_chebydomain( cm, .true., dlbnd, dubnd, status )
+
+ if( dlbnd(1) .ne. lbnd(1) ) then
+ call stopit( 21, status )
+ else if( dlbnd(2) .ne. lbnd(2) ) then
+ call stopit( 22, status )
+ else if( dubnd(1) .ne. ubnd(1) ) then
+ call stopit( 23, status )
+ else if( dubnd(2) .ne. ubnd(2) ) then
+ call stopit( 24, status )
+ end if
+
+ call ast_chebydomain( cm, .false., dlbnd, dubnd, status )
+
+ if( dlbnd(1) .ne. -2.0D0 ) then
+ call stopit( 25, status )
+ else if( dlbnd(2) .ne. -1.0D0 ) then
+ call stopit( 26, status )
+ else if( dubnd(1) .ne. 4.0D0 ) then
+ call stopit( 27, status )
+ else if( dubnd(2) .ne. 4.0D0 ) then
+ call stopit( 28, status )
+ end if
+
+
+ call ast_chebydomain( cm2, .true., dlbnd, dubnd, status )
+
+ if( dlbnd(1) .ne. lbnd(1) ) then
+ call stopit( 29, status )
+ else if( dlbnd(2) .ne. lbnd(2) ) then
+ call stopit( 30, status )
+ else if( dubnd(1) .ne. ubnd(1) ) then
+ call stopit( 31, status )
+ else if( dubnd(2) .ne. ubnd(2) ) then
+ call stopit( 32, status )
+ end if
+
+ call ast_chebydomain( cm2, .false., dlbnd, dubnd, status )
+
+ if( abs( dlbnd(1) - 0.432 ) .gt. 1.0D-6 ) then
+ call stopit( 33, status )
+ else if( abs( dlbnd(2) - 1.000816 ) .gt. 1.0D-6 ) then
+ call stopit( 34, status )
+ else if( abs( dubnd(1) - 1.568D0 ) .gt. 1.0D-6 ) then
+ call stopit( 35, status )
+ else if( abs( dubnd(2) - 1.9991836D0 ) .gt. 1.0D-6 ) then
+ call stopit( 36, status )
+ end if
+
+
+ call ast_end( status )
+ call ast_activememory( 'testchebymap' );
+ call ast_flushmemory( 1 )
+
+ if( status .eq. sai__ok ) then
+ write(*,*) 'All ChebyMap tests passed'
+ else
+ write(*,*) 'ChebyMap tests failed'
+ end if
+
+ end
+
+
+ subroutine stopit( i, status )
+ implicit none
+ include 'SAE_PAR'
+ integer i, status
+ if( status .eq. sai__ok ) then
+ write( *,* ) 'Error ',i
+ status = sai__error
+ end if
+ end
+
+
+ subroutine checkdump( obj, status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ integer obj, status, ch, result
+
+ if( status .ne. sai__ok ) return
+
+ ch = ast_channel( AST_NULL, AST_NULL, ' ', status )
+
+ call ast_set( ch, 'SinkFile=fred.tmp', status )
+ if( ast_write( ch, obj, status ) .ne. 1 ) then
+ call stopit( -1, status )
+ end if
+ call ast_clear( ch, 'SinkFile', status )
+
+ call ast_set( ch, 'SourceFile=fred.tmp', status )
+ result = ast_read( ch, status )
+ if( result .eq. ast__null ) then
+ call stopit( -2, status )
+ end if
+ call ast_clear( ch, 'SourceFile', status )
+
+ if( .not. ast_equal( result, obj, status ) ) then
+ call ast_show( obj, status )
+ call ast_show( result, status )
+ call stopit( -3, status )
+ end if
+
+ end
diff --git a/ast/ast_tester/testcmpmap.f b/ast/ast_tester/testcmpmap.f
new file mode 100644
index 0000000..bd3cad1
--- /dev/null
+++ b/ast/ast_tester/testcmpmap.f
@@ -0,0 +1,149 @@
+ program testcmpmap
+ implicit none
+
+ include 'AST_PAR'
+ include 'SAE_PAR'
+
+ integer m1, m2, m3, m4, m5, status, i, in(7), out(7)
+ double precision x( 7 ), y(7), y2(7), matrix( 3 )
+
+ data matrix /-1.0D0, 1.0D0, 2.0D0 /
+
+ status = sai__ok
+ call err_mark( status )
+ call ast_begin( status )
+
+
+ m1 = ast_UnitMap( 1, ' ', status )
+ m2 = ast_ZoomMap( 2, 2.0D0, ' ', status )
+ m3 = ast_MatrixMap( 3, 3, 1, matrix, ' ', status )
+ m4 = ast_CmpMap( ast_CmpMap( m1, m2, .false., ' ', status ), m3,
+ : .false., ' ', status )
+
+
+ in( 1 ) = 3
+ in( 2 ) = 6
+ in( 3 ) = 4
+ call ast_mapsplit( m4, 3, in, out, m5, status )
+ if( m5 .eq. AST__NULL ) then
+ call stopit( status, 'Error 1' )
+ else if( ast_geti( m5, 'Nin', status ) .ne. 3 ) then
+ call stopit( status, 'Error 2' )
+ else if( ast_geti( m5, 'Nout', status ) .ne. 3 ) then
+ call stopit( status, 'Error 3' )
+ end if
+
+ if( out( 1 ) .ne. 3 ) call stopit( status, 'Error 4' )
+ if( out( 2 ) .ne. 4 ) call stopit( status, 'Error 5' )
+ if( out( 3 ) .ne. 6 ) call stopit( status, 'Error 6' )
+
+
+ call readobj( 'splittest1.ast', m1, status )
+ in(1)= 1
+ call ast_mapsplit( m1, 1, in, out, m2, status )
+ if( m2 .ne. AST__NULL ) call stopit( status, 'Error 7' )
+
+ in(2)= 4
+ in(3)= 2
+ call ast_mapsplit( m1, 3, in, out, m2, status )
+ if( m2 .eq. AST__NULL ) then
+ call stopit( status, 'Error 8' )
+ else if( ast_geti( m2, 'Nin', status ) .ne. 3 ) then
+ call stopit( status, 'Error 9' )
+ else if( ast_geti( m2, 'Nout', status ) .ne. 3 ) then
+ call stopit( status, 'Error 10' )
+ end if
+
+
+
+ x(1) = 1.0D0
+ x(2) = 2.0D0
+ x(3) = 4.0D0
+ x(4) = 8.0D0
+ call ast_trann( m1, 1,4, 1, x, .true., 4, 1, y, status )
+
+ x(1) = 1.0D0
+ x(2) = 8.0D0
+ x(3) = 2.0D0
+ call ast_trann( m2, 1, 3, 1, x, .true., 3, 1, y2, status )
+
+ if( y2( 1 ) .ne. y( 1 ) ) then
+ call stopit( status, 'Error 11' )
+ else if( y2( 2 ) .ne. y( 2 ) ) then
+ call stopit( status, 'Error 12' )
+ else if( y2( 3 ) .ne. y( 4 ) ) then
+ call stopit( status, 'Error 13' )
+ end if
+
+
+
+
+
+
+
+ call ast_end( status )
+ call err_rlse( status )
+
+c call ast_activememory( 'testcmpmap' )
+ call ast_flushmemory( 1 )
+
+ if( status .eq. sai__ok ) then
+ write(*,*) 'All cmpmap tests passed'
+ else
+ write(*,*) 'cmpmap tests failed'
+ end if
+
+ end
+
+
+
+ subroutine stopit( status, text )
+ implicit none
+ include 'SAE_PAR'
+ integer status
+ character text*(*)
+ if( status .ne. sai__ok ) return
+ status = sai__error
+ write(*,*) text
+ end
+
+
+
+ subroutine readobj( file, iobj, status )
+ implicit none
+
+ include 'AST_PAR'
+ include 'SAE_PAR'
+
+ external chsource
+ integer iobj, status, ch
+ character file*(*)
+
+ open( 10, status='old', file=file )
+
+ ch = ast_channel( chsource, AST_NULL, ' ', status )
+ iobj = ast_read( ch, status )
+ call ast_annul( ch, status )
+
+ close( 10 )
+
+ end
+
+ subroutine chsource( status )
+ implicit none
+
+ include 'AST_PAR'
+ include 'SAE_PAR'
+
+ integer status
+ character line*200
+
+ read( 10, '(A)', end=99 ) line
+
+ call ast_putline( line, len( line ), status )
+ return
+
+ 99 call ast_putline( line, -1, status )
+
+ end
+
diff --git a/ast/ast_tester/testconvert.c b/ast/ast_tester/testconvert.c
new file mode 100644
index 0000000..d28c318
--- /dev/null
+++ b/ast/ast_tester/testconvert.c
@@ -0,0 +1,232 @@
+#define astCLASS testconvert
+
+#include "ast_err.h"
+#include "error.h"
+#include "object.h"
+#include "skyframe.h"
+#include "specframe.h"
+#include "cmpframe.h"
+#include "frame.h"
+#include "unitmap.h"
+#include "permmap.h"
+
+int main(){
+ int status_value = 0;
+ int *status = &status_value;
+
+ AstFrameSet *fs;
+
+ AstSkyFrame *sf = astSkyFrame( " ", status );
+ AstSpecFrame *df = astSpecFrame( " ", status );
+ AstCmpFrame *cf = astCmpFrame( df, sf, " ", status );
+ AstFrame *bf = astFrame( 2, "Domain=SKY", status );
+ AstFrame *target, *template;
+
+
+ fs = astConvert( bf, sf, " " );
+ if( fs ) {
+ if( !astEqual( astGetFrame( fs, AST__BASE ), bf ) && astOK ) {
+ astError( AST__INTER, "Error 1\n", status );
+ } else if( !astEqual( astGetFrame( fs, AST__CURRENT ), sf ) && astOK ) {
+ astError( AST__INTER, "Error 2\n", status );
+ } else if( !astIsAUnitMap( astGetMapping( fs, AST__BASE, AST__CURRENT ) ) ) {
+ astError( AST__INTER, "Error 3\n", status );
+ }
+ } else {
+ astError( AST__INTER, "Error 4\n", status );
+ }
+
+ fs = astConvert( sf, bf, " " );
+ if( fs ) {
+ if( !astEqual( astGetFrame( fs, AST__BASE ), sf ) && astOK ) {
+ astError( AST__INTER, "Error 5\n", status );
+ } else if( !astEqual( astGetFrame( fs, AST__CURRENT ), bf ) && astOK ) {
+ astError( AST__INTER, "Error 6\n", status );
+ } else if( !astIsAUnitMap( astGetMapping( fs, AST__BASE, AST__CURRENT ) ) ) {
+ astError( AST__INTER, "Error 7\n", status );
+ }
+ } else {
+ astError( AST__INTER, "Error 8\n", status );
+ }
+
+
+ astSetDomain( bf, "NOTSKY" );
+ fs = astConvert( bf, sf, " " );
+ if( fs ) {
+ astShow( fs );
+ astError( AST__INTER, "Error 9\n", status );
+ }
+
+ fs = astConvert( sf, bf, " " );
+ if( fs ) {
+ astShow( fs );
+ astError( AST__INTER, "Error 10\n", status );
+ }
+
+ astClearDomain( bf );
+
+ fs = astConvert( bf, sf, " " );
+ if( fs ) {
+ if( !astEqual( astGetFrame( fs, AST__BASE ), bf ) && astOK ) {
+ astError( AST__INTER, "Error 11\n", status );
+ } else if( !astEqual( astGetFrame( fs, AST__CURRENT ), sf ) && astOK ) {
+ astError( AST__INTER, "Error 12\n", status );
+ } else if( !astIsAUnitMap( astGetMapping( fs, AST__BASE, AST__CURRENT ) ) ) {
+ astError( AST__INTER, "Error 13\n", status );
+ }
+ } else {
+ astError( AST__INTER, "Error 14\n", status );
+ }
+
+ fs = astConvert( sf, bf, " " );
+ if( fs ) {
+ if( !astEqual( astGetFrame( fs, AST__BASE ), sf ) && astOK ) {
+ astError( AST__INTER, "Error 15\n", status );
+ } else if( !astEqual( astGetFrame( fs, AST__CURRENT ), bf ) && astOK ) {
+ astError( AST__INTER, "Error 16\n", status );
+ } else if( !astIsAUnitMap( astGetMapping( fs, AST__BASE, AST__CURRENT ) ) ) {
+ astError( AST__INTER, "Error 17\n", status );
+ }
+ } else {
+ astError( AST__INTER, "Error 18\n", status );
+ }
+
+
+ fs = astConvert( bf, cf, " " );
+ if( fs ) {
+ if( !astEqual( astGetFrame( fs, AST__BASE ), bf ) && astOK ) {
+ astError( AST__INTER, "Error 19\n", status );
+ } else if( !astEqual( astGetFrame( fs, AST__CURRENT ), cf ) && astOK ) {
+ astError( AST__INTER, "Error 20\n", status );
+ } else if( !astIsAPermMap( astGetMapping( fs, AST__BASE, AST__CURRENT ) ) ) {
+ astError( AST__INTER, "Error 21\n", status );
+ }
+ } else {
+ astError( AST__INTER, "Error 22\n", status );
+ }
+
+ fs = astConvert( cf, bf, " " );
+ if( fs ) {
+ if( !astEqual( astGetFrame( fs, AST__BASE ), cf ) && astOK ) {
+ astError( AST__INTER, "Error 23\n", status );
+ } else if( !astEqual( astGetFrame( fs, AST__CURRENT ), bf ) && astOK ) {
+ astError( AST__INTER, "Error 24\n", status );
+ } else if( !astIsAPermMap( astGetMapping( fs, AST__BASE, AST__CURRENT ) ) ) {
+ astError( AST__INTER, "Error 25\n", status );
+ }
+ } else {
+ astError( AST__INTER, "Error 26\n", status );
+ }
+
+
+ astSetDomain( bf, "NOTSKY" );
+ fs = astConvert( bf, cf, " " );
+ if( fs ) {
+ astShow( fs );
+ astError( AST__INTER, "Error 27\n", status );
+ }
+
+ fs = astConvert( cf, bf, " " );
+ if( fs ) {
+ astShow( fs );
+ astError( AST__INTER, "Error 28\n", status );
+ }
+
+
+ astSetDomain( bf, "SKY" );
+ fs = astConvert( bf, cf, " " );
+ if( fs ) {
+ if( !astEqual( astGetFrame( fs, AST__BASE ), bf ) && astOK ) {
+ astError( AST__INTER, "Error 29\n", status );
+ } else if( !astEqual( astGetFrame( fs, AST__CURRENT ), cf ) && astOK ) {
+ astError( AST__INTER, "Error 30\n", status );
+ } else if( !astIsAPermMap( astGetMapping( fs, AST__BASE, AST__CURRENT ) ) ) {
+ astError( AST__INTER, "Error 31\n", status );
+ }
+ } else {
+ astError( AST__INTER, "Error 32\n", status );
+ }
+
+ fs = astConvert( cf, bf, " " );
+ if( fs ) {
+ if( !astEqual( astGetFrame( fs, AST__BASE ), cf ) && astOK ) {
+ astError( AST__INTER, "Error 33\n", status );
+ } else if( !astEqual( astGetFrame( fs, AST__CURRENT ), bf ) && astOK ) {
+ astError( AST__INTER, "Error 34\n", status );
+ } else if( !astIsAPermMap( astGetMapping( fs, AST__BASE, AST__CURRENT ) ) ) {
+ astError( AST__INTER, "Error 35\n", status );
+ }
+ } else {
+ astError( AST__INTER, "Error 36\n", status );
+ }
+
+
+ fs = astConvert( sf, cf, " " );
+ if( fs ) {
+ if( !astEqual( astGetFrame( fs, AST__BASE ), sf ) && astOK ) {
+ astError( AST__INTER, "Error 37\n", status );
+ } else if( !astEqual( astGetFrame( fs, AST__CURRENT ), cf ) && astOK ) {
+ astError( AST__INTER, "Error 38\n", status );
+ } else if( !astIsAPermMap( astGetMapping( fs, AST__BASE, AST__CURRENT ) ) ) {
+ astError( AST__INTER, "Error 39\n", status );
+ }
+ } else {
+ astError( AST__INTER, "Error 40\n", status );
+ }
+
+ fs = astConvert( cf, sf, " " );
+ if( fs ) {
+ if( !astEqual( astGetFrame( fs, AST__BASE ), cf ) && astOK ) {
+ astError( AST__INTER, "Error 41\n", status );
+ } else if( !astEqual( astGetFrame( fs, AST__CURRENT ), sf ) && astOK ) {
+ astError( AST__INTER, "Error 42\n", status );
+ } else if( !astIsAPermMap( astGetMapping( fs, AST__BASE, AST__CURRENT ) ) ) {
+ astError( AST__INTER, "Error 43\n", status );
+ }
+ } else {
+ astError( AST__INTER, "Error 44\n", status );
+ }
+
+
+ fs = astFindFrame( sf, cf, " " );
+ if( !fs && astOK ) {
+ astError( AST__INTER, "Error 45\n", status );
+ }
+
+ fs = astFindFrame( cf, sf, " " );
+ if( fs && astOK ) {
+ astError( AST__INTER, "Error 46\n", status );
+ }
+
+ astSetMaxAxes( sf, 3 );
+ astSetMinAxes( sf, 1 );
+
+ fs = astFindFrame( cf, sf, " " );
+ if( !fs && astOK ) {
+ astError( AST__INTER, "Error 47\n", status );
+ } else {
+ if( !astEqual( astGetFrame( fs, AST__BASE ), cf ) && astOK ) {
+ astError( AST__INTER, "Error 48\n", status );
+ } else if( !astEqual( astGetFrame( fs, AST__CURRENT ), sf ) && astOK ) {
+ astError( AST__INTER, "Error 49\n", status );
+ } else if( !astIsAPermMap( astGetMapping( fs, AST__BASE, AST__CURRENT ) ) ) {
+ astError( AST__INTER, "Error 50\n", status );
+ }
+ }
+
+ target = astFrame( 2, "Domain=ARDAPP", status );
+ template = (AstFrame *) astSkyFrame( "System=GAPPT", status );
+ fs = astFindFrame( target, template, " " );
+ if( fs && astOK ) {
+ astError( AST__INTER, "Error 51\n", status );
+ }
+
+
+
+
+ if( astOK ) {
+ printf(" All astConvert tests passed\n");
+ } else {
+ printf("astConvert tests failed\n");
+ }
+}
diff --git a/ast/ast_tester/testerror.c b/ast/ast_tester/testerror.c
new file mode 100644
index 0000000..d668879
--- /dev/null
+++ b/ast/ast_tester/testerror.c
@@ -0,0 +1,44 @@
+#include "ast.h"
+
+#define ERRVAL -1234
+static int flag;
+
+void myPutErr( int status_value, const char *message );
+
+int main(){
+ double a[2] = {0.0,0.0};
+
+/* Initialise the flag that indicates if the error handler has been
+ called. */
+ flag = 0;
+
+/* Register the error handler. */
+ astSetPutErr( myPutErr );
+
+/* Generate an error by making a ShiftMap with a negative number of axes.
+ The error handler will set the flag to a special value. */
+ AstShiftMap *map = astShiftMap( -1, a, " " );
+
+/* Clear the error status. */
+ astClearStatus;
+
+/* Clear the error reporter so that the default error reporter is used. */
+ astSetPutErr( NULL );
+
+/* Report an error if the flag was not set to the correct value. */
+ if( flag != ERRVAL ) {
+ astError( AST__INTER, "Error reporting function has not been "
+ "called." );
+ }
+
+ if( astOK ) {
+ printf(" All Error tests passed\n");
+ } else {
+ printf("Error tests failed\n");
+ }
+
+}
+
+void myPutErr( int status_value, const char *message ) {
+ flag = ERRVAL;
+}
diff --git a/ast/ast_tester/testfitschan.f b/ast/ast_tester/testfitschan.f
new file mode 100644
index 0000000..f2816c3
--- /dev/null
+++ b/ast/ast_tester/testfitschan.f
@@ -0,0 +1,988 @@
+ program testfitschan
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+
+ integer status, fs, fc, i, val, iwcfrm, map
+ character cards(10)*80, card*80
+ logical there
+ double precision xin, yin, xout, yout
+
+ status = sai__ok
+
+
+c call ast_watchmemory( 225192 )
+ call ast_begin( status )
+
+* Create a FitsChan that will write its contents out to text file
+* fred.txt when it is deleted.
+ fc = ast_fitschan( AST_NULL, AST_NULL, 'SinkFile=./fred.txt',
+ : status )
+
+ if( .not. ast_getl( fc, 'SipOK', status ) ) then
+ call stopit( 776, ' ', status )
+ end if
+
+* Put a FITS-WCS header into it.
+ cards(1) = 'CRPIX1 = 45'
+ cards(2) = 'CRPIX2 = 45'
+ cards(3) = 'CRVAL1 = 45'
+ cards(4) = 'CRVAL2 = 89.9'
+ cards(5) = 'MYNAME = '
+ cards(6) = 'CDELT1 = -0.01'
+ cards(7) = 'CDELT2 = 0.01'
+ cards(8) = 'CTYPE1 = ''RA---TAN'''
+ cards(9) = 'CTYPE2 = ''DEC--TAN'''
+ do i = 1, 9
+ call ast_putfits( fc, cards(i), .false., status )
+ end do
+
+ call ast_seti( fc, 'Card', 2, status )
+ if( .not. ast_getfitsi( fc, '.', val, status ) ) then
+ call stopit( 777, ' ', status )
+ else if( val .ne. 45 ) then
+ call stopit( 778, ' ', status )
+ endif
+
+ call ast_seti( fc, 'Card', 5, status )
+ if( ast_testfits( fc, '.', there, status ) ) then
+ call stopit( 779, ' ', status )
+ else if( .not. there ) then
+ call stopit( 780, ' ', status )
+ endif
+
+ if( .not. ast_testfits( fc, 'CDELT1', there, status ) ) then
+ call stopit( 781, ' ', status )
+ else if( .not. there ) then
+ call stopit( 782, ' ', status )
+ endif
+
+ if( ast_testfits( fc, 'ABCDEF', there, status ) ) then
+ call stopit( 783, ' ', status )
+ else if( there ) then
+ call stopit( 784, ' ', status )
+ endif
+
+ call ast_seti( fc, 'Card', 10, status )
+ if( ast_testfits( fc, '.', there, status ) ) then
+ call stopit( 785, ' ', status )
+ else if( there ) then
+ call stopit( 786, ' ', status )
+ endif
+
+ card = ast_getc( fc, 'CardName', status )
+ if( card .ne. ' ' ) call stopit( 787, ' ', status )
+
+* Annul the fitschan. Only 1 ref so this should delete it.
+ call ast_annul( fc, status )
+
+* Create another FitsChan and tell it to read headers from fred.txt.
+ fc = ast_fitschan( AST_NULL, AST_NULL, 'SourceFile=./fred.txt',
+ : status )
+
+* Check it looks like the original header.
+ if( ast_geti( fc, 'NCard', status ) .ne. 9 ) then
+ write(*,*) ast_geti( fc, 'NCard', status )
+ call stopit( 1000, ' ', status )
+ endif
+
+ if( ast_geti( fc, 'Nkey', status ) .ne. 9 ) then
+ write(*,*) ast_geti( fc, 'Nkey', status )
+ call stopit( 999, ' ', status )
+ endif
+
+ call ast_clear( fc, 'Card', status )
+ i = 0
+ do while( ast_findfits( fc, '%f', card, .true., status ) )
+ i = i + 1
+ if( card .ne. cards( i ) ) then
+ call stopit( 1001, ' ', status )
+ endif
+ end do
+
+* Annul the fitschan.
+ call ast_annul( fc, status )
+
+* Put a simple FITS-WCS header into a FitsChan.
+ cards(1) = 'CRPIX1 = 45'
+ cards(2) = 'CRPIX2 = 45'
+ cards(3) = 'CRVAL1 = 45'
+ cards(4) = 'CRVAL2 = 89.9'
+ cards(5) = 'CDELT1 = -0.01'
+ cards(6) = 'CDELT2 = 0.01'
+ cards(7) = 'CTYPE1 = ''RA---TAN'''
+ cards(8) = 'CTYPE2 = ''DEC--TAN'''
+
+ fc = ast_fitschan( AST_NULL, AST_NULL, 'Iwc=1', status )
+ do i = 1, 8
+ call ast_putfits( fc, cards(i), .false., status )
+ end do
+
+
+ call ast_clear( fc, 'Card', status )
+ if( ast_geti( fc, 'CardType', status ) .NE. AST__INT ) then
+ write(*,*) ast_geti( fc, 'CardType', status ),' should be ',
+ : AST__STRING
+ call stopit( 993, ' ', status )
+ endif
+
+
+* Indicate that the CTYPE1 card should be retained by ast_read.
+ if( ast_findfits( fc, 'CTYPE1', card, .FALSE., status ) ) then
+ call ast_retainfits( fc, status )
+ endif
+
+* Read a FrameSet from the FitsChan.
+ call ast_clear( fc, 'Card', status )
+ fs = ast_read( fc, status )
+ if( fs .eq. AST__NULL ) then
+ call stopit( 1, 'No FrameSet read from FitsChan', status )
+ end if
+
+* Check the CTYPE1 card is still present in the FitsChan.
+ call ast_clear( fc, 'Card', status )
+ if( .not. ast_findfits( fc, 'CTYPE1', card, .FALSE.,
+ : status ) ) then
+ call stopit( 2, 'CTYPE1 has not been retained', status )
+ end if
+
+* Check the CTYPE2 card is not present in the FitsChan.
+ call ast_clear( fc, 'Card', status )
+ if( ast_findfits( fc, 'CTYPE2', card, .FALSE., status ) ) then
+ call stopit( 3, 'CTYPE2 has been retained', status )
+ end if
+
+* Check the IWC Frame is present and check the reference point
+* transforms to the origin of IWC.
+ if( ast_geti( fs, 'Nframe', status ) .ne. 3 ) then
+ call stopit( 301, 'Wrong number of Frames', status )
+ endif
+ if( ast_geti( fs, 'Current', status ) .ne. 2 ) then
+ call stopit( 302, 'Wrong current Frame', status )
+ endif
+ iwcfrm = ast_getframe( fs, 3, status )
+ if( ast_getc( iwcfrm, 'Domain', status ) .ne. 'IWC' ) then
+ call stopit( 303, 'Wrong Domain in IWC Frame', status )
+ endif
+
+ map = ast_getmapping( fs, 1, 3, status )
+ xin = 45.0D0
+ yin = 45.0D0
+ call ast_tran2( map, 1, xin, yin, .true., xout, yout, status )
+ if( xout .ne. 0.0D0 .or. yout .ne. 0.0D0 ) then
+ call stopit( 304, 'Wrong IWC for CRPIX position', status )
+ endif
+
+ xin = xin + 1.0D0
+ call ast_tran2( map, 1, xin, yin, .true., xout, yout, status )
+ if( xout .ne. -0.01D0 .or. yout .ne. 0.0D0 ) then
+ call stopit( 305, 'Wrong IWC for offset CRPIX position',
+ : status )
+ endif
+
+ map = ast_getmapping( fs, 2, 3, status )
+ xin = 45.0D0*AST__DD2R
+ yin = 89.9D0*AST__DD2R
+ call ast_tran2( map, 1, xin, yin, .true., xout, yout, status )
+ if( abs( xout ) .gt. 1.0D-10 .or. abs( yout ) .gt. 1.0D-10 ) then
+ call stopit( 306, 'Wrong IWC for CRVAL position', status )
+ endif
+
+
+* Do it again, this time with an illegal value for CRPIX2. This will
+* cause ast_read to report an error.
+ cards(1) = 'CRPIX1 = 45'
+ cards(2) = 'CRPIX2 = ''fred'''
+ cards(3) = 'CRVAL1 = 45'
+ cards(4) = 'CRVAL2 = 89.9'
+ cards(5) = 'CDELT1 = -0.01'
+ cards(6) = 'CDELT2 = 0.01'
+ cards(7) = 'CTYPE1 = ''RA---TAN'''
+ cards(8) = 'CTYPE2 = ''DEC--TAN'''
+
+ fc = ast_fitschan( AST_NULL, AST_NULL, ' ', status )
+ do i = 1, 8
+ call ast_putfits( fc, cards(i), .false., status )
+ end do
+
+* Set the Clean attribute to true so that used cards are removed from the
+* FitsChan even if an error occurrs in astRead.
+c call ast_setl( fc, 'Clean', .true., status )
+
+* Indicate that the CTYPE1 card should be retained by ast_read.
+ call ast_clear( fc, 'Card', status )
+ if( ast_findfits( fc, 'CTYPE1', card, .FALSE., status ) ) then
+ call ast_retainfits( fc, status )
+ endif
+
+* Abort if an error has occurred.
+ if( status .ne. sai__ok ) go to 999
+
+* Read a FrameSet from the FitsChan, deferring error reporting. Check an
+* error is reported by ast_read.
+ call ast_clear( fc, 'Card', status )
+
+ call err_begin( status )
+ fs = ast_read( fc, status )
+
+ if( fs .ne. AST__NULL ) then
+ call stopit( 4, 'A FrameSet has been read from the FitsChan',
+ : status )
+
+ else if( status .eq. sai__ok ) then
+ call stopit( 5, 'No error has been reported by ast_read',
+ : status )
+
+ else
+ call err_annul( status )
+ end if
+
+ call err_end( status )
+
+* Check the CTYPE1 card is still present in the FitsChan.
+ call ast_clear( fc, 'Card', status )
+ if( .not. ast_findfits( fc, 'CTYPE1', card, .FALSE.,
+ : status ) ) then
+ call stopit( 6, 'CTYPE1 has not been retained', status )
+ end if
+
+* Check the CTYPE2 card is also still present in the FitsChan (because
+* cards are not removed if an error is reported in ast_read unless the
+* Clean attribute is set true).
+ call ast_clear( fc, 'Card', status )
+ if( .not. ast_findfits( fc, 'CTYPE2', card, .FALSE.,
+ : status ) ) then
+ call stopit( 7, 'CTYPE2 has not been retained', status )
+ end if
+
+
+
+
+
+* Do it again, again with an illegal value for CRPIX2, but this time
+* setting the Clean attribute true.
+ cards(1) = 'CRPIX1 = 45'
+ cards(2) = 'CRPIX2 = ''fred'''
+ cards(3) = 'CRVAL1 = 45'
+ cards(4) = 'CRVAL2 = 89.9'
+ cards(5) = 'CDELT1 = -0.01'
+ cards(6) = 'CDELT2 = 0.01'
+ cards(7) = 'CTYPE1 = ''RA---TAN'''
+ cards(8) = 'CTYPE2 = ''DEC--TAN'''
+
+ fc = ast_fitschan( AST_NULL, AST_NULL, 'Clean=1', status )
+ do i = 1, 8
+ call ast_putfits( fc, cards(i), .false., status )
+ end do
+
+* Indicate that the CTYPE1 card should be retained by ast_read.
+ call ast_clear( fc, 'Card', status )
+ if( ast_findfits( fc, 'CTYPE1', card, .FALSE., status ) ) then
+ call ast_retainfits( fc, status )
+ endif
+
+* Abort if an error has occurred.
+ if( status .ne. sai__ok ) go to 999
+
+* Read a FrameSet from the FitsChan, deferring error reporting. Check an
+* error is reported by ast_read.
+ call ast_clear( fc, 'Card', status )
+
+ call err_begin( status )
+ fs = ast_read( fc, status )
+
+ if( fs .ne. AST__NULL ) then
+ call stopit( 8, 'A FrameSet has been read from the FitsChan',
+ : status )
+
+ else if( status .eq. sai__ok ) then
+ call stopit( 9, 'No error has been reported by ast_read',
+ : status )
+
+ else
+ call err_annul( status )
+ end if
+
+ call err_end( status )
+
+* Check the CTYPE1 card is still present in the FitsChan (because of the
+* call to ast_retainfits).
+ call ast_clear( fc, 'Card', status )
+ if( .not. ast_findfits( fc, 'CTYPE1', card, .FALSE.,
+ : status ) ) then
+ call stopit( 10, 'CTYPE1 has not been retained', status )
+ end if
+
+* Check the CTYPE2 card is no longer present in the FitsChan (because
+* the Clean attribute is set true).
+ call ast_clear( fc, 'Card', status )
+ if( ast_findfits( fc, 'CTYPE2', card, .FALSE., status ) ) then
+ call stopit( 11, 'CTYPE2 has been retained', status )
+ end if
+
+* Test -TAB
+ call checktab( status )
+ call checktab2( status )
+
+* Read a SIP header and then attempt to write it out. It should fail
+* because the SIP header is non-linear.
+ call ast_emptyfits( fc, status )
+ call ast_seti( fc, 'SipOK', 0, status )
+ call ast_set( fc, 'SourceFile=sip.head', status )
+ call ast_clear( fc, 'Card', status )
+ fs = ast_read( fc, status )
+ call ast_set( fc, 'Encoding=FITS-WCS', status )
+ if( fs .eq. AST__NULL ) then
+ call stopit( 12, 'Failed to read SIP header', status )
+ else if( ast_write( fc, fs, status ) .gt. 0 ) then
+ call stopit( 13, 'Test on SIP header non-linearity failed',
+ : status )
+ end if
+
+
+
+
+
+
+
+
+ 999 continue
+
+ call ast_end( status )
+ call ast_activememory( 'testfitschan' )
+ call ast_flushmemory( 1 );
+
+
+ if( status .eq. sai__ok ) then
+ write(*,*) 'All FitsChan tests passed'
+ else
+ write(*,*) 'FitsChan tests failed'
+ end if
+
+ end
+
+
+ subroutine stopit( errnum, text, status )
+ implicit none
+ include 'SAE_PAR'
+ character text*(*)
+ integer errnum, status
+
+ if( status .eq. sai__ok ) then
+ status = sai__error
+ call msg_seti( 'N', errnum )
+ call msg_setc( 'T', text )
+ call err_rep( ' ', 'Error ^N: ^T', status )
+ end if
+
+ end
+
+
+ subroutine checktab( status )
+ implicit none
+
+ external tabsource
+
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ include 'AST_ERR'
+ include 'PRM_PAR'
+ include 'CNF_PAR'
+ integer status, sf, mm, fc, fs,gf, tables, table, size, pntr1,
+ : nelem, pntr2, i, lm, sm, fs2, map, fc2, ncard, fs3
+ character key*20,card*80
+ double precision lut( 100 ), shift, x(3), y(3), y2(3)
+
+ common /tabsrc/ tables
+
+ if( status .ne. sai__ok ) return
+
+ call err_begin( status )
+ call ast_begin( status )
+
+ sf = ast_specframe( 'system=freq,unit=MHz', status )
+ gf = ast_frame( 1, 'domain=GRID', status )
+ mm = ast_mathmap( 1, 1, 1, 'y=1/(x*x)', 1, 'x=1/sqrt(y)', ' ',
+ : status )
+ fs = ast_frameset( gf, ' ', status )
+ call ast_addframe( fs, AST__BASE, mm, sf, status )
+
+ fc = ast_fitschan( ast_null, ast_null, 'Encoding=FITS-WCS',
+ : status )
+ call ast_putfits( fc, 'NAXIS = 1', .false., status )
+ call ast_putfits( fc, 'NAXIS1 = 100', .false., status )
+
+
+ if( ast_write( fc, fs, status ) .ne. 0 ) then
+ call stopit( 1000, ' ', status )
+ else if( ast_gettables( fc, status ) .ne. AST__NULL ) then
+ call stopit( 1001, ' ', status )
+ endif
+
+ call ast_setl( fc, 'TabOK', .true., status )
+
+ if( ast_write( fc, fs, status ) .ne. 1 )
+ : call stopit( 1002, ' ', status )
+
+ tables = ast_gettables( fc, status )
+ if( tables .eq. AST__NULL ) then
+ call stopit( 1003, ' ', status )
+ else if( .not. ast_isakeymap( tables, status ) ) then
+ call stopit( 1004, ' ', status )
+ else if( ast_mapsize( tables, status ) .ne. 1 ) then
+ call stopit( 1005, ' ', status )
+ endif
+
+ key = ast_mapkey( tables, 1, status )
+ if( key .ne. 'WCS-TAB' ) then
+ call stopit( 1006, ' ', status )
+ endif
+
+ if( .not. ast_mapget0a( tables, 'WCS-TAB', table,
+ : status ) ) then
+ call stopit( 1007, ' ', status )
+ else if( .not. ast_isafitstable( table, status ) ) then
+ call stopit( 1004, ' ', status )
+ endif
+
+ if( ast_geti( table, 'NColumn', status ) .ne. 2 ) then
+ call stopit( 1005, ' ', status )
+ else if( ast_geti( table, 'NRow', status ) .ne. 1 ) then
+ call stopit( 1006, ' ', status )
+ else if( ast_geti( table, 'ColumnLength(coords1)', status ) .ne.
+ : 197 ) then
+ call stopit( 1007, ' ', status )
+ else if( ast_geti( table, 'ColumnLength(index1)', status ) .ne.
+ : 197 ) then
+ call stopit( 1008, ' ', status )
+ end if
+
+ size = ast_columnsize( table, 'COORDS1', status )
+ if( size .ne. VAL__NBD*197 ) call stopit( 1009, ' ', status )
+ call psx_malloc( size, pntr1, status )
+ call ast_getcolumndata( table, 'Coords1', 0.0, AST__BAD, size,
+ : %val( cnf_pval( pntr1 ) ), nelem,
+ : status )
+ if( nelem .ne. 197 ) call stopit( 1010, ' ', status )
+
+ size = ast_columnsize( table, 'INDEX1', status )
+ if( size .ne. VAL__NBD*197 ) call stopit( 1011, ' ', status )
+ call psx_malloc( size, pntr2, status )
+ call ast_getcolumndata( table, 'inDex1', 0.0, AST__BAD, size,
+ : %val( cnf_pval( pntr2 ) ), nelem,
+ : status )
+ if( nelem .ne. 197 ) call stopit( 1012, ' ', status )
+
+ call checkft( 197, %val( cnf_pval( pntr1 ) ),
+ : %val( cnf_pval( pntr2 ) ), status )
+
+ call psx_free( pntr1, status )
+ call psx_free( pntr2, status )
+
+c --------------------------------------------------------------------
+ do i = 1, 100
+ lut( i ) = 1.0D0/dble(i*i)
+ end do
+
+ lm = ast_lutmap( 100, lut, -49.0D0, 1.0D0, ' ', status )
+
+ call ast_set( sf, 'System=Wave,Unit=m', status )
+ call ast_removeframe( fs, AST__CURRENT, status )
+ call ast_addframe( fs, AST__BASE, lm, sf, status )
+ call ast_set( fs, 'System=freq', status )
+
+ shift = 50.0D0
+ sm = ast_shiftmap( 1, shift, ' ', status )
+ call ast_remapframe( fs, AST__BASE, sm, status )
+
+ call ast_removetables( fc, 'WCS-TAB', status )
+ call ast_purgewcs( fc, status )
+
+ if( ast_write( fc, fs, status ) .ne. 1 )
+ : call stopit( 1013, ' ', status )
+ tables = ast_gettables( fc, status )
+
+ if( tables .eq. AST__NULL ) then
+ call stopit( 1014, ' ', status )
+ else if( .not. ast_isakeymap( tables, status ) ) then
+ call stopit( 1015, ' ', status )
+ else if( ast_mapsize( tables, status ) .ne. 1 ) then
+ call stopit( 1016, ' ', status )
+ endif
+
+ key = ast_mapkey( tables, 1, status )
+ if( key .ne. 'WCS-TAB' ) then
+ call stopit( 1017, ' ', status )
+ endif
+
+ if( .not. ast_mapget0a( tables, 'WCS-TAB', table,
+ : status ) ) then
+ call stopit( 1018, ' ', status )
+ else if( .not. ast_isafitstable( table, status ) ) then
+ call stopit( 1019, ' ', status )
+ endif
+
+ if( ast_geti( table, 'NColumn', status ) .ne. 1 ) then
+ call stopit( 1020, ' ', status )
+ else if( ast_geti( table, 'NRow', status ) .ne. 1 ) then
+ call stopit( 1021, ' ', status )
+ else if( ast_geti( table, 'ColumnLength(coords1)', status ) .ne.
+ : 100 ) then
+ call stopit( 1022, ' ', status )
+ end if
+
+ size = ast_columnsize( table, 'COORDS1', status )
+ if( size .ne. VAL__NBD*100 ) call stopit( 1024, ' ', status )
+ call psx_malloc( size, pntr1, status )
+ call ast_getcolumndata( table, 'Coords1', 0.0, AST__BAD, size,
+ : %val( cnf_pval( pntr1 ) ), nelem,
+ : status )
+ if( nelem .ne. 100 ) call stopit( 1025, ' ', status )
+
+ call checkft2( 100, %val( cnf_pval( pntr1 ) ), status )
+
+ call psx_free( pntr1, status )
+
+c --------------------------------------------------------------------
+
+ call ast_removetables( fc, ' ', status )
+ fc2 = ast_copy( fc, status )
+ call ast_puttables( fc, tables, status )
+ call ast_clear( fc, 'Card', status )
+
+ fs2 = ast_read( fc, status )
+ if( fs2 .eq. ast__null ) call stopit( 1028, ' ', status )
+
+ if( .not. ast_equal( ast_getframe( fs, ast__current, status ),
+ : ast_getframe( fs2, ast__current, status ),
+ : status ) ) then
+ call stopit( 1029, ' ', status )
+ endif
+
+ map = ast_cmpmap( ast_getmapping( fs, ast__base, ast__current,
+ : status ),
+ : ast_getmapping( fs2, ast__current, ast__base,
+ : status ), .TRUE., ' ', status )
+
+ x(1) = 1.0D0;
+ x(2) = 50.0D0;
+ x(3) = 100.0D0;
+ call ast_tran1( map, 3, x, .true., y, status )
+
+ if( abs( y(1) - x(1) ) .gt. 1.0D-4 .OR.
+ : abs( y(2) - x(2) ) .gt. 1.0D-4 .OR.
+ : abs( y(3) - x(3) ) .gt. 1.0D-4 ) then
+ call stopit( 1030, ' ', status )
+ end if
+
+
+c --------------------------------------------------------------------
+ if( .not. ast_getl( fc2, 'TabOK', status ) ) then
+ call stopit( 1031, ' ', status )
+ endif
+ ncard = ast_geti( fc2, 'Ncard', status )
+
+ call ast_clear( fc2, 'Card', status )
+ fs2 = ast_read( fc2, status )
+ if( status .ne. AST__NOTAB ) then
+ if( status .ne. SAI__OK ) call err_flush( status )
+ call stopit( 1032, ' ', status )
+ else
+ call err_annul( status )
+ end if
+
+ call ast_setl( fc2, 'TabOK', .false., status )
+ call ast_clear( fc2, 'Card', status )
+ fs2 = ast_read( fc2, status )
+ if( status .ne. AST__BDFTS ) then
+ if( status .ne. SAI__OK ) call err_flush( status )
+ call stopit( 1032, ' ', status )
+ else
+ call err_annul( status )
+ end if
+ call ast_setl( fc2, 'TabOK', .true., status )
+
+ if( ncard .ne. ast_geti( fc2, 'Ncard', status ) ) then
+ call stopit( 1034, ' ', status )
+ endif
+
+ call ast_tablesource( fc2, tabsource, status )
+ call ast_clear( fc2, 'Card', status )
+ fs2 = ast_read( fc2, status )
+ if( fs2 .eq. ast__null ) call stopit( 1035, ' ', status )
+
+ if( .not. ast_equal( ast_getframe( fs, ast__current, status ),
+ : ast_getframe( fs2, ast__current, status ),
+ : status ) ) then
+ call stopit( 1036, ' ', status )
+ endif
+
+ map = ast_cmpmap( ast_getmapping( fs, ast__base, ast__current,
+ : status ),
+ : ast_getmapping( fs2, ast__current, ast__base,
+ : status ), .TRUE., ' ', status )
+
+ x(1) = 1.0D0;
+ x(2) = 50.0D0;
+ x(3) = 100.0D0;
+ call ast_tran1( map, 3, x, .true., y, status )
+
+ if( abs( y(1) - x(1) ) .gt. 1.0D-4 .OR.
+ : abs( y(2) - x(2) ) .gt. 1.0D-4 .OR.
+ : abs( y(3) - x(3) ) .gt. 1.0D-4 ) then
+ call stopit( 1037, ' ', status )
+ end if
+
+c --------------------------------------------------------------------
+ call readobj( 'sparse.ast', fs, status )
+
+ fc = ast_fitschan( ast_null, ast_null,
+ : 'Encoding=FITS-WCS,TabOK=1', status )
+
+ call ast_putfits( fc, 'NAXIS = 2', .false., status )
+ call ast_putfits( fc, 'NAXIS1 = 2000', .false., status )
+ call ast_putfits( fc, 'NAXIS2 = 1', .false., status )
+
+ if( ast_write( fc, fs, status ) .ne. 1 ) then
+ call stopit( 1038, ' ', status )
+ end if
+
+ call ast_clear( fc, 'Card', status )
+ fs2 = ast_read( fc, status )
+
+ call ast_invert( fs, status )
+ call ast_invert( fs2, status )
+ fs3 = ast_convert( fs, fs2, 'SKY-DSBSPECTRUM', status )
+ if( fs3 .eq. AST__NULL ) then
+ call stopit( 1039, ' ', status )
+ endif
+
+ if( ast_getc( ast_getframe( fs, AST__BASE, status ), 'Domain',
+ : status ) .ne. 'SKY-DSBSPECTRUM' ) then
+ call stopit( 1040, ' ', status )
+ endif
+
+ if( ast_getc( ast_getframe( fs2, AST__BASE, status ), 'Domain',
+ : status ) .ne. 'SKY-DSBSPECTRUM' ) then
+ call stopit( 1041, ' ', status )
+ endif
+
+ call ast_invert( fs, status )
+ call ast_invert( fs2, status )
+
+ x( 1 ) = 1.0
+ x( 2 ) = 1.0
+ x( 3 ) = 1.0
+ call ast_trann( fs, 1, 3, 1, x, .true., 3, 1, y, status )
+ call ast_trann( fs2, 1, 3, 1, x, .true., 3, 1, y2, status )
+
+ do i = 1, 3
+ if( abs( y(i) - y2(i) ) .gt. 1.0E-8 ) then
+ call stopit( 1042, ' ', status )
+ endif
+ enddo
+
+ x( 1 ) = 10.0
+ x( 2 ) = 1.0
+ x( 3 ) = 1000.0
+ call ast_trann( fs, 1, 3, 1, x, .true., 3, 1, y, status )
+ call ast_trann( fs2, 1, 3, 1, x, .true., 3, 1, y2, status )
+
+ do i = 1, 3
+ if( abs( y(i) - y2(i) ) .gt. 1.0E-8 ) then
+ call stopit( 1042, ' ', status )
+ endif
+ enddo
+
+
+c --------------------------------------------------------------------
+
+ sf = ast_frame( 1, 'domain=voltage,unit=V', status )
+ gf = ast_frame( 1, 'domain=GRID', status )
+ mm = ast_mathmap( 1, 1, 1, 'y=1/(x*x)', 1, 'x=1/sqrt(y)', ' ',
+ : status )
+ fs = ast_frameset( gf, ' ', status )
+ call ast_addframe( fs, AST__BASE, mm, sf, status )
+
+ call ast_emptyfits( fc, status )
+ call ast_putfits( fc, 'NAXIS = 1', .false., status )
+ call ast_putfits( fc, 'NAXIS1 = 100', .false., status )
+
+ if( ast_write( fc, fs, status ) .ne. 1 )
+ : call stopit( 1043, ' ', status )
+
+ if( ast_getfitss( fc, 'CTYPE1', card, status ) ) then
+ if( card .ne. 'VOLT-TAB' ) call stopit( 1059, ' ', status )
+ else
+ call stopit( 1060, ' ', status )
+ endif
+
+ tables = ast_gettables( fc, status )
+ if( tables .eq. AST__NULL ) then
+ call stopit( 1044, ' ', status )
+ else if( .not. ast_isakeymap( tables, status ) ) then
+ call stopit( 1045, ' ', status )
+ else if( ast_mapsize( tables, status ) .ne. 1 ) then
+ call stopit( 1046, ' ', status )
+ endif
+
+ key = ast_mapkey( tables, 1, status )
+ if( key .ne. 'WCS-TAB' ) then
+ call stopit( 1047, ' ', status )
+ endif
+
+ if( .not. ast_mapget0a( tables, 'WCS-TAB', table,
+ : status ) ) then
+ call stopit( 1048, ' ', status )
+ else if( .not. ast_isafitstable( table, status ) ) then
+ call stopit( 1049, ' ', status )
+ endif
+
+ if( ast_geti( table, 'NColumn', status ) .ne. 2 ) then
+ call stopit( 1050, ' ', status )
+ else if( ast_geti( table, 'NRow', status ) .ne. 1 ) then
+ call stopit( 1051, ' ', status )
+ else if( ast_geti( table, 'ColumnLength(coords1)', status ) .ne.
+ : 197 ) then
+ call stopit( 1052, ' ', status )
+ else if( ast_geti( table, 'ColumnLength(index1)', status ) .ne.
+ : 197 ) then
+ call stopit( 1053, ' ', status )
+ end if
+
+ size = ast_columnsize( table, 'COORDS1', status )
+
+ if( size .ne. VAL__NBD*197 ) call stopit( 1054, ' ', status )
+ call psx_malloc( size, pntr1, status )
+ call ast_getcolumndata( table, 'Coords1', 0.0, AST__BAD, size,
+ : %val( cnf_pval( pntr1 ) ), nelem,
+ : status )
+ if( nelem .ne. 197 ) call stopit( 1055, ' ', status )
+
+ size = ast_columnsize( table, 'INDEX1', status )
+ if( size .ne. VAL__NBD*197 ) call stopit( 1056, ' ', status )
+ call psx_malloc( size, pntr2, status )
+ call ast_getcolumndata( table, 'inDex1', 0.0, AST__BAD, size,
+ : %val( cnf_pval( pntr2 ) ), nelem,
+ : status )
+ if( nelem .ne. 197 ) call stopit( 1057, ' ', status )
+
+ call checkft( 197, %val( cnf_pval( pntr1 ) ),
+ : %val( cnf_pval( pntr2 ) ), status )
+
+ call psx_free( pntr1, status )
+ call psx_free( pntr2, status )
+
+
+ call ast_clear( fc, 'Card', status )
+ fs2 = ast_read( fc, status )
+ if( fs2 .eq. AST__NULL )
+ : call stopit( 1058, ' ', status )
+
+ call ast_invert( fs, status )
+ call ast_invert( fs2, status )
+ fs3 = ast_convert( fs2, fs, ' ', status )
+ if( fs3 .eq. AST__NULL ) then
+ call stopit( 1061, ' ', status )
+ endif
+
+ if( ast_getc( ast_getframe( fs, AST__BASE, status ), 'Domain',
+ : status ) .ne. 'VOLTAGE' ) then
+ call stopit( 1062, ' ', status )
+ endif
+
+ if( ast_getc( ast_getframe( fs2, AST__BASE, status ), 'Domain',
+ : status ) .ne. 'VOLTAGE' ) then
+ call stopit( 1063, ' ', status )
+ endif
+
+ x(1) = 1.0
+ x(2) = 10.0
+ x(3) = 100.0
+ call ast_tran1( fs3, 3, x, .true., y, status )
+ if( abs( y(1) - x(1) ) .gt. 1.0D-2 .OR.
+ : abs( y(2) - x(2) ) .gt. 1.0D-2 .OR.
+ : abs( y(3) - x(3) ) .gt. 1.0D-2 ) then
+ call stopit( 1064, ' ', status )
+ end if
+
+
+
+ call ast_end( status )
+ call err_end( status )
+
+ end
+
+
+ subroutine checkft( nelem, coords, indx, status )
+ implicit none
+ include 'SAE_PAR'
+ integer nelem, status
+ double precision coords( nelem ), indx( nelem )
+
+ if( status .ne. sai__ok ) return
+
+ if( indx( 1 ) .ne. 1.0D0 ) then
+ call stopit( 2001, ' ', status )
+
+ else if( coords( 1 ) .ne. 1.0D0 ) then
+ call stopit( 2002, ' ', status )
+
+ else if( indx( nelem ) .ne. 1.0D2 ) then
+ call stopit( 2003, ' ', status )
+
+ else if( coords( nelem ) .ne. 1.0D-4 ) then
+ call stopit( 2004, ' ', status )
+
+ else if( coords( nelem/2 ) .ne.
+ : indx( nelem/2 )**(-2) ) then
+ call stopit( 2005, ' ', status )
+ end if
+
+ end
+
+ subroutine checkft2( nelem, coords, status )
+ implicit none
+ include 'SAE_PAR'
+ integer nelem, status
+ double precision coords( nelem )
+
+ if( status .ne. sai__ok ) return
+
+ if( abs( coords( 1 ) - 299.792458 ) .gt. 1.0D-5 ) then
+ call stopit( 3002, ' ', status )
+
+ else if( abs( coords( nelem ) - 2997924.58 ) .gt. 1.0D-1 ) then
+ call stopit( 3004, ' ', status )
+
+ end if
+
+ end
+
+ subroutine tabsource( fc, extnam, extver, extlevel, status )
+ implicit none
+ include 'AST_PAR'
+
+ integer fc, status, tables, table, extver, extlevel
+ character extnam*(*)
+
+ common /tabsrc/ tables
+
+ if( extnam .ne. 'WCS-TAB' ) then
+ call stopit( 1035, ' ', status )
+
+ else if( .not. ast_mapget0a( tables, extnam, table,
+ : status ) ) then
+ call stopit( 1036, ' ', status )
+
+ else if( .not. ast_isafitstable( table, status ) ) then
+ call stopit( 1037, ' ', status )
+
+ else if( extver .ne. 1 ) then
+ write(*,*) 'EXTVER=',extver
+ call stopit( 1065, ' ', status )
+
+ else if( extlevel .ne. 1 ) then
+ call stopit( 1066, ' ', status )
+
+ else
+ call ast_puttables( fc, tables, status )
+
+ endif
+
+ call ast_annul( table, status )
+
+ end
+
+
+
+ subroutine readobj( file, iobj, status )
+ implicit none
+
+ include 'AST_PAR'
+ include 'SAE_PAR'
+
+ external chsource
+ integer iobj, status, ch
+ character file*(*)
+
+ open( 10, status='old', file=file )
+
+ ch = ast_channel( chsource, AST_NULL, ' ', status )
+ iobj = ast_read( ch, status )
+ call ast_annul( ch, status )
+
+ close( 10 )
+
+ end
+
+ subroutine chsource( status )
+ implicit none
+
+ include 'AST_PAR'
+ include 'SAE_PAR'
+
+ integer status
+ character line*200
+
+ read( 10, '(A)', end=99 ) line
+
+ call ast_putline( line, len( line ), status )
+ return
+
+ 99 call ast_putline( line, -1, status )
+
+ end
+
+
+
+
+ subroutine checktab2( status )
+ implicit none
+
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ integer status, sf, mmm, mm, fc, fs, fs2, gf
+
+ if( status .ne. sai__ok ) return
+
+ call err_begin( status )
+ call ast_begin( status )
+
+ sf = ast_skyframe( ' ', status )
+ call ast_setd( sf, 'SkyRef(1)', 0.0001D0, status )
+ call ast_setd( sf, 'SkyRef(2)', 0.0001D0, status )
+
+ gf = ast_frame( 2, 'domain=GRID', status )
+
+ mm = ast_mathmap( 1, 1, 1, 'y=(x+50)**(-2)', 1, 'x=-50+1/sqrt(y)',
+ : ' ', status )
+ mmm = ast_cmpmap( mm, mm, .false., ' ', status )
+
+ fs = ast_frameset( gf, ' ', status )
+ call ast_addframe( fs, AST__BASE, mmm, sf, status )
+
+ fc = ast_fitschan( ast_null, ast_null, 'Encoding=FITS-WCS,'//
+ : 'TabOK=1', status )
+ call ast_putfits( fc, 'NAXIS = 2', .false., status )
+ call ast_putfits( fc, 'NAXIS1 = 100', .false., status )
+ call ast_putfits( fc, 'NAXIS2 = 100', .false., status )
+
+ if( ast_write( fc, fs, status ) .ne. 1 ) then
+ call stopit( 2000, ' ', status )
+ endif
+
+ call ast_clear( fc, 'Card', status )
+ fs2 = ast_read( fc, status )
+ if( fs2 .eq. AST__NULL )
+ : call stopit( 2001, ' ', status )
+
+ if( abs( ast_getd( fs2, 'SkyRef(1)', status ) - 0.0001 ) .gt.
+ : 1E-7 ) call stopit( 2001, ' ', status )
+ if( abs( ast_getd( fs2, 'SkyRef(2)', status ) - 0.0001 ) .gt.
+ : 1E-7 ) call stopit( 2001, ' ', status )
+
+ call ast_end( status )
+ call err_end( status )
+
+ end
diff --git a/ast/ast_tester/testfitstable.f b/ast/ast_tester/testfitstable.f
new file mode 100644
index 0000000..e85f065
--- /dev/null
+++ b/ast/ast_tester/testfitstable.f
@@ -0,0 +1,590 @@
+ program testfitstable
+ implicit none
+
+ include 'AST_PAR'
+ include 'AST_ERR'
+ include 'SAE_PAR'
+ include 'CNF_PAR'
+
+ integer status, table, table2, dims( 7 ), header, ival, l, nval,
+ : icard, colsize, pntr, head, clen, oldnull, null
+ byte bytes(2,3),bval
+ logical wasset, hasnull
+ real rval
+ character cval*30, text(3)*10, card*70
+ character header1(18)*30
+ character header2(20)*30
+
+ data header1 / 'XTENSION= ''BINTABLE''',
+ : 'BITPIX = 8',
+ : 'NAXIS = 2',
+ : 'NAXIS1 = 10',
+ : 'NAXIS2 = 0',
+ : 'PCOUNT = 0',
+ : 'GCOUNT = 1',
+ : 'TFIELDS = 3',
+ : 'TFORM1 = ''6B ''',
+ : 'TTYPE1 = ''BYTECOL ''',
+ : 'TUNIT1 = ''ADU ''',
+ : 'TDIM1 = ''(2,3) ''',
+ : 'TFORM2 = ''1J ''',
+ : 'TTYPE2 = ''INTCOL ''',
+ : 'TUNIT2 = ''m ''',
+ : 'TFORM3 = ''0A ''',
+ : 'TTYPE3 = ''STRINGCOL''',
+ : 'TDIM3 = ''(0,3) ''' /
+
+
+ data header2 / 'XTENSION= ''BINTABLE''',
+ : 'BITPIX = 8',
+ : 'NAXIS = 2',
+ : 'NAXIS1 = 40',
+ : 'NAXIS2 = 3',
+ : 'PCOUNT = 0',
+ : 'GCOUNT = 1',
+ : 'TFIELDS = 3',
+ : 'TFORM1 = ''6B ''',
+ : 'TTYPE1 = ''BYTECOL ''',
+ : 'TUNIT1 = ''ADU ''',
+ : 'TNULL1 = 254',
+ : 'TDIM1 = ''(2,3) ''',
+ : 'TFORM2 = ''1J ''',
+ : 'TTYPE2 = ''INTCOL ''',
+ : 'TUNIT2 = ''m ''',
+ : 'TNULL2 = 2147483647',
+ : 'TFORM3 = ''30A ''',
+ : 'TTYPE3 = ''STRINGCOL''',
+ : 'TDIM3 = ''(10,3) ''' /
+
+c call ast_watchmemory(483)
+
+ status = sai__ok
+ call err_mark( status )
+ call ast_begin( status )
+
+ table = ast_fitstable( AST__NULL, ' ', status )
+
+ header = ast_gettableheader( table, status )
+ if( ast_geti( header, 'NCard', status ) .ne. 8 ) then
+ call stopit( status, 'FitsTable error 1' )
+ else if( .not. ast_getfitsi( header, 'NAXIS', ival, status )) then
+ call stopit( status, 'FitsTable error 2' )
+ else if( ival .ne. 2 ) then
+ call stopit( status, 'FitsTable error 3' )
+ else if( .not. ast_getfitsi( header, 'NAXIS1', ival, status)) then
+ call stopit( status, 'FitsTable error 4' )
+ else if( ival .ne. 0 ) then
+ call stopit( status, 'FitsTable error 5' )
+ else if( .not. ast_getfitsi( header, 'NAXIS2', ival, status)) then
+ call stopit( status, 'FitsTable error 6' )
+ else if( ival .ne. 0 ) then
+ call stopit( status, 'FitsTable error 7' )
+ endif
+ call ast_annul( header, status )
+
+
+ call ast_addcolumn( table, 'JUNK', AST__OBJECTTYPE, 0, 0, 'm',
+ : status )
+ if( status .eq. AST__NAXIN ) then
+ call err_annul( status )
+ else if( status .eq. sai__ok ) then
+ call stopit( status, 'FitsTable error 8' )
+ endif
+
+ dims( 1 ) = 2
+ dims( 2 ) = 3
+ call ast_addcolumn( table, 'BYTECOL', AST__BYTETYPE, 2, dims,
+ : 'ADU', status )
+
+ call ast_addcolumn( table, 'INTCOL', AST__INTTYPE, 0, 0, 'm',
+ : status )
+
+ dims( 1 ) = 3
+ call ast_addcolumn( table, 'STRINGCOL', AST__STRINGTYPE, 1, dims,
+ : ' ', status )
+
+
+ header = ast_gettableheader( table, status )
+ icard = 0
+ do while( ast_findfits( header, '%f', card, .true., status ) )
+ icard = icard + 1
+ if( icard .gt. 18 ) then
+ call stopit( status, 'FitsTable error 9' )
+ else if( card .ne. header1( icard ) ) then
+ call stopit( status, 'FitsTable error 10' )
+ end if
+ end do
+ if( icard .ne. 18 ) call stopit( status, 'FitsTable error 11' )
+
+
+ table2 = ast_fitstable( header, ' ', status )
+ call ast_annul( header, status )
+
+ if( ast_geti( table2, 'Ncolumn', status ) .ne. 3 ) then
+ call stopit( status, 'FitsTable error 11a' )
+ end if
+
+
+
+ if( ast_geti( table2, 'ColumnLength(bytecol)', status )
+ : .ne. 6 ) then
+ call stopit( status, 'FitsTable error 11b' )
+ endif
+
+ if( ast_geti( table2, 'ColumnNdim(bytecol)', status )
+ : .ne. 2 ) then
+ call stopit( status, 'FitsTable error 11c' )
+ end if
+
+ if( ast_geti( table2, 'ColumnType(bytecol)', status )
+ : .ne. AST__BYTETYPE ) then
+ call stopit( status, 'FitsTable error 11d' )
+ end if
+
+ if( ast_getc( table2, 'ColumnUnit(bytecol)', status )
+ : .ne. 'ADU' ) then
+ call stopit( status, 'FitsTable error 11e' )
+ end if
+
+
+ if( ast_geti( table2, 'ColumnLength(intcol)', status )
+ : .ne. 1 ) then
+ call stopit( status, 'FitsTable error 11f' )
+ endif
+
+ if( ast_geti( table2, 'ColumnNdim(intcol)', status )
+ : .ne. 0 ) then
+ call stopit( status, 'FitsTable error 11g' )
+ end if
+
+ if( ast_geti( table2, 'ColumnType(intcol)', status )
+ : .ne. AST__INTTYPE ) then
+ call stopit( status, 'FitsTable error 11h' )
+ end if
+
+ if( ast_getc( table2, 'ColumnUnit(intcol)', status )
+ : .ne. 'm' ) then
+ call stopit( status, 'FitsTable error 11i' )
+ end if
+
+
+ if( ast_geti( table2, 'ColumnLength(StringCol)', status )
+ : .ne. 3 ) then
+ call stopit( status, 'FitsTable error 11j' )
+ endif
+
+ if( ast_geti( table2, 'ColumnNdim(StringCol)', status )
+ : .ne. 1 ) then
+ call stopit( status, 'FitsTable error 11k' )
+ end if
+
+ if( ast_geti( table2, 'ColumnType(StringCol)', status )
+ : .ne. AST__STRINGTYPE ) then
+ call stopit( status, 'FitsTable error 11l' )
+ end if
+
+ if( ast_getc( table2, 'ColumnUnit(StringCol)', status )
+ : .ne. ' ' ) then
+ call stopit( status, 'FitsTable error 11m' )
+ end if
+
+
+
+ bytes(1,1) = 0
+ bytes(1,2) = 128
+ bytes(1,3) = -127
+ bytes(2,1) = 1
+ bytes(2,2) = 127
+ bytes(2,3) = -1
+ call ast_mapput1b( table, 'BYTECOL(1)', 6, bytes, ' ', status )
+
+ bytes(1,1) = 0
+ bytes(1,2) = 0
+ bytes(1,3) = 0
+ bytes(2,1) = 1
+ bytes(2,2) = 1
+ bytes(2,3) = 1
+ call ast_mapput1b( table, 'BYTECOL(2)', 6, bytes, ' ', status )
+
+ call ast_mapput0i( table, 'INTCOL(2)', 10, ' ', status )
+
+ call ast_mapput0i( table, 'INTCOL(3)', -10, ' ', status )
+
+ text( 1 ) = 'hello'
+ text( 2 ) = ' '
+ text( 3 ) = 'goodbye'
+ call ast_mapput1c( table, 'STRINGCOL(1)', 3, text, ' ', status )
+
+ text( 1 ) = ' '
+ text( 2 ) = ' '
+ text( 3 ) = ' '
+ call ast_mapput1c( table, 'STRINGCOL(3)', 3, text, ' ', status )
+
+ if( ast_geti( table, 'Nrow', status ) .ne. 3 ) then
+ call stopit( status, 'FitsTable error 12' )
+ endif
+
+ if( ast_geti( table, 'Ncolumn', status ) .ne. 3 ) then
+ call stopit( status, 'FitsTable error 13' )
+ endif
+
+ head = ast_gettableheader( table, status )
+ table2 = ast_fitstable( head, ' ', status )
+ call ast_annul( head, status )
+
+ colsize = ast_columnsize( table, 'stringcol', status )
+ if( colsize .ne. 90 ) then
+ call stopit( status, 'FitsTable error 13a' )
+ else
+ call psx_malloc( colsize, pntr, status )
+ call ast_getcolumndata( table, 'StringCol', 0.0, 0.0D0,
+ : colsize, %val( cnf_pval(pntr)),
+ : colsize, status )
+ if( colsize .ne. 9 ) call stopit( status,
+ : 'FitsTable error 13b' )
+ call checkstrings( table, %val( CNF_PVAL( pntr ) ), status )
+
+ clen = ast_geti( table, 'ColumnLenC(StringCol)', status )
+ if( clen .ne. 10 ) call stopit( status,
+ : 'FitsTable error 13c' )
+
+ colsize = 90
+ call ast_putcolumndata( table2, 'StringCol', 10, colsize,
+ : %val( CNF_PVAL( pntr ) ), status )
+ call ast_getcolumndata( table2, 'StringCol', 0.0, 0.0D0,
+ : colsize, %val( cnf_pval(pntr)),
+ : colsize, status )
+
+ if( colsize .ne. 9 ) call stopit( status,
+ : 'FitsTable error 13d' )
+ call checkstrings( table2, %val( CNF_PVAL( pntr ) ), status )
+
+ call psx_free( pntr, status )
+ end if
+
+ colsize = ast_columnsize( table, 'bytecol', status )
+ if( colsize .ne. 18 ) then
+ call stopit( status, 'FitsTable error 13e' )
+ else
+ call psx_malloc( colsize, pntr, status )
+ call ast_getcolumndata( table, 'BYTECOL', 0.0, 0.0D0, colsize,
+ : %val( cnf_pval( pntr ) ), colsize,
+ : status )
+ if( colsize .ne. 18 ) call stopit( status,
+ : 'FitsTable error 13f' )
+
+ null = ast_columnnull( table, 'BYTECOL', .FALSE., 0,
+ : wasset, hasnull, status )
+ call checkbytes( table, %val( CNF_PVAL( pntr ) ), null,
+ : status )
+
+ colsize = 18
+ call ast_putcolumndata( table2, 'byteCol', 0, colsize,
+ : %val( CNF_PVAL( pntr ) ), status )
+ oldnull = ast_columnnull( table2, 'BYTECOL', .TRUE., null,
+ : wasset, hasnull, status )
+ call ast_getcolumndata( table2, 'BYTECOL', 0.0, 0.0D0, colsize,
+ : %val( cnf_pval( pntr ) ), colsize,
+ : status )
+ if( colsize .ne. 18 ) call stopit( status,
+ : 'FitsTable error 13g' )
+ call checkbytes( table2, %val( CNF_PVAL( pntr ) ), null,
+ : status )
+
+ call psx_free( pntr, status )
+ end if
+
+ colsize = ast_columnsize( table, 'intcol', status )
+ if( colsize .ne. 12 ) then
+ call stopit( status, 'FitsTable error 13h' )
+ else
+ call psx_malloc( colsize, pntr, status )
+ call ast_getcolumndata( table, 'INTCOL', 0.0, 0.0D0, colsize,
+ : %val( cnf_pval( pntr ) ), colsize,
+ : status )
+ if( colsize .ne. 3 ) call stopit( status,
+ : 'FitsTable error 13i' )
+ call checkints( table, %val( CNF_PVAL( pntr ) ),
+ : ast_columnnull( table, 'INTCOL', .FALSE., 0,
+ : wasset, hasnull, status ),
+ : status )
+
+ colsize = 12
+ call ast_putcolumndata( table2, 'INTCol', 0, colsize,
+ : %val( CNF_PVAL( pntr ) ), status )
+
+ call ast_getcolumndata( table2, 'INTCOL', 0.0, 0.0D0, colsize,
+ : %val( cnf_pval( pntr ) ), colsize,
+ : status )
+ if( colsize .ne. 3 ) call stopit( status,
+ : 'FitsTable error 13j' )
+ call checkints( table2, %val( CNF_PVAL( pntr ) ),
+ : ast_columnnull( table2, 'INTCOL', .FALSE., 0,
+ : wasset, hasnull, status ),
+ : status )
+
+ call psx_free( pntr, status )
+ end if
+
+
+ call ast_addcolumn( table, 'REALCOL', AST__FLOATTYPE, 0, 0, ' ',
+ : status )
+ call ast_addcolumn( table2, 'REALCOL', AST__FLOATTYPE, 0, 0, ' ',
+ : status )
+ call ast_mapput0r( table, 'REALCOL(1)', -10.0, ' ', status )
+ call ast_mapput0r( table, 'REALCOL(3)', 10.0, ' ', status )
+
+ colsize = ast_columnsize( table, 'realcol', status )
+ if( colsize .ne. 12 ) then
+ call stopit( status, 'FitsTable error 13k' )
+ else
+ call psx_malloc( colsize, pntr, status )
+ call ast_getcolumndata( table, 'REALCOL', -1.0, 0.0D0, colsize,
+ : %val( cnf_pval( pntr ) ), colsize,
+ : status )
+ if( colsize .ne. 3 ) call stopit( status,
+ : 'FitsTable error 13l' )
+ call checkreals( table, %val( CNF_PVAL( pntr ) ), -1.0,
+ : status )
+
+ colsize = 12
+ call ast_putcolumndata( table2, 'realCol', 0, colsize,
+ : %val( CNF_PVAL( pntr ) ), status )
+
+
+ call ast_mapremove( table2, 'REALCOL(2)', status )
+ call ast_getcolumndata( table2, 'REALCOL', AST__NANR, 0.0D0,
+ : colsize,
+ : %val( cnf_pval( pntr ) ), colsize,
+ : status )
+ if( colsize .ne. 3 ) call stopit( status,
+ : 'FitsTable error 13m' )
+ call checkreals( table2, %val( CNF_PVAL( pntr ) ), AST__NANR,
+ : status )
+
+ call psx_free( pntr, status )
+ end if
+
+ call ast_removecolumn( table, 'REALCOL', status )
+
+ call ast_mapremove( table, 'BYTECOL(3)', status )
+ call ast_mapremove( table, 'INTCOL(3)', status )
+ call ast_mapremove( table, 'STRINGCOL(3)', status )
+
+ if( ast_geti( table, 'Nrow', status ) .ne. 3 ) then
+ call stopit( status, 'FitsTable error 14' )
+ endif
+
+ if( ast_geti( table, 'Ncolumn', status ) .ne. 3 ) then
+ call stopit( status, 'FitsTable error 15' )
+ endif
+
+
+
+
+ header = ast_gettableheader( table, status )
+ icard = 0
+ do while( ast_findfits( header, '%f', card, .true., status ) )
+ icard = icard + 1
+ if( icard .gt. 20 ) then
+ call stopit( status, 'FitsTable error 16' )
+ else if( card .ne. header2( icard ) ) then
+ call stopit( status, 'FitsTable error 17' )
+ end if
+ end do
+ call ast_annul( header, status )
+ if( icard .ne. 20 ) call stopit( status, 'FitsTable error 18' )
+
+
+
+ if( ast_columnnull( table, 'BYTECOL', .FALSE., 0, wasset,
+ : hasnull, status ) .ne. 254 ) then
+ call stopit( status, 'FitsTable error 19' )
+ else if( wasset ) then
+ call stopit( status, 'FitsTable error 20' )
+ else if( .not. hasnull ) then
+ call stopit( status, 'FitsTable error 21' )
+ end if
+
+
+
+ call ast_purgerows( table, status )
+ if( ast_geti( table, 'Nrow', status ) .ne. 2 ) then
+ call stopit( status, 'FitsTable error 22' )
+ endif
+
+ if( ast_geti( table, 'Ncolumn', status ) .ne. 3 ) then
+ call stopit( status, 'FitsTable error 23' )
+ endif
+
+ header = ast_gettableheader( table, status )
+ if( ast_getfitsi( header, 'TNULL1', ival, status ) ) then
+ call stopit( status, 'FitsTable error 24' )
+ endif
+ call ast_annul( header, status )
+
+ if( ast_columnnull( table, 'BYTECOL', .TRUE., 11, wasset,
+ : hasnull, status ) .ne. 11 ) then
+ call stopit( status, 'FitsTable error 25' )
+ else if( wasset ) then
+ call stopit( status, 'FitsTable error 26' )
+ else if( hasnull ) then
+ call stopit( status, 'FitsTable error 27' )
+ end if
+
+ if( ast_columnnull( table, 'BYTECOL', .FALSE., 0, wasset,
+ : hasnull, status ) .ne. 11 ) then
+ call stopit( status, 'FitsTable error 28' )
+ else if( .not. wasset ) then
+ call stopit( status, 'FitsTable error 29' )
+ else if( hasnull ) then
+ call stopit( status, 'FitsTable error 30' )
+ end if
+
+
+ table2 = ast_copy( table, status )
+
+ call ast_end( status )
+ call err_rlse( status )
+
+c call ast_activememory( 'testfitstable' )
+ call ast_flushmemory( 1 )
+
+ if( status .eq. sai__ok ) then
+ write(*,*) 'All FitsTable tests passed'
+ else
+ write(*,*) 'FitsTable tests failed'
+ end if
+
+ end
+
+
+
+ subroutine stopit( status, text )
+ implicit none
+ include 'SAE_PAR'
+ integer status
+ character text*(*)
+ if( status .ne. sai__ok ) return
+ status = sai__error
+ write(*,*) text
+ end
+
+
+
+ subroutine checkbytes( table, vals, null, status )
+ implicit none
+ include 'SAE_PAR'
+ integer status, table, null, i
+ byte vals( * ), ans( 12 ), bnull
+
+ data ans / 0, 1, 128, 127, -127, -1, 0, 1, 0, 1, 0, 1 /
+
+ if( status .ne. sai__ok ) return
+
+ do i = 1, 12
+ if( vals( i ) .ne. ans( i ) ) then
+ write(*,*) 'i,vals,ans: ',i,' ',vals(i),' ',ans(i)
+ call stopit( status, 'FitsTable error checkbytes 1' )
+ end if
+ end do
+
+ bnull = null
+ do i = 13, 18
+ if( vals( i ) .ne. bnull ) then
+ call stopit( status, 'FitsTable error checkbytes 2' )
+ end if
+ end do
+
+ end
+
+ subroutine checkints( table, vals, null, status )
+ implicit none
+ include 'SAE_PAR'
+ integer status, table, null
+ integer vals( * )
+
+ if( status .ne. sai__ok ) return
+
+ if( vals( 1 ) .ne. null ) then
+ call stopit( status, 'FitsTable error checkints 1' )
+ end if
+
+ if( vals( 2 ) .ne. 10 ) then
+ call stopit( status, 'FitsTable error checkints 2' )
+ end if
+
+ if( vals( 3 ) .ne. -10 ) then
+ call stopit( status, 'FitsTable error checkints 3' )
+ end if
+
+ end
+
+ subroutine checkreals( table, vals, null, status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ integer status, table
+ real vals( * ), null
+
+ if( status .ne. sai__ok ) return
+
+ if( vals( 1 ) .ne. -10.0 ) then
+ call stopit( status, 'FitsTable error checkreals 1' )
+ end if
+
+ if( null .ne. AST__NANR ) then
+ if( vals( 2 ) .ne. null ) then
+ call stopit( status, 'FitsTable error checkreals 2a' )
+ end if
+ else
+ if( .not. isnan( vals( 2 ) ) ) then
+ call stopit( status, 'FitsTable error checkreals 2b' )
+ end if
+ end if
+
+ if( vals( 3 ) .ne. 10.0 ) then
+ call stopit( status, 'FitsTable error checkreals 3' )
+ end if
+
+ end
+
+ subroutine checkstrings( table, vals, status )
+ implicit none
+ include 'SAE_PAR'
+ integer status, table, i, start, end, j
+ character ans( 9 )*10
+ character vals*( * )
+
+ data ans / 'hello', ' ', 'goodbye', '', '', '', ' ', ' ', ' ' /
+
+ if( status .ne. sai__ok ) return
+
+ start = 1
+ end = 10
+
+ do i = 1, 9
+
+ do j = 1, 11
+ if( vals( start + j - 1 : start + j - 1 ) .lt. ' ' ) then
+ vals( start + j - 1 : start + j - 1 ) = ' '
+ endif
+ end do
+
+ if( vals( start : end ) .ne. ans( i ) ) then
+ write(*,*) 'start,end,i : ',start,' ',end,' ',i
+ write(*,*) 'vals: ',vals( start : end )
+ write(*,*) 'ans: ',ans( i )
+ call stopit( status, 'FitsTable error checkstrings 1' )
+ end if
+
+ start = start + 10
+ end = end + 10
+
+ end do
+
+ end
+
+
+
+
diff --git a/ast/ast_tester/testflux.f b/ast/ast_tester/testflux.f
new file mode 100644
index 0000000..f24629f
--- /dev/null
+++ b/ast/ast_tester/testflux.f
@@ -0,0 +1,354 @@
+ program testflux
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+
+ double precision xin, xout
+ integer status, sf, ff, ff2, mp, fs, sf2
+ status = sai__ok
+
+ sf = ast_specframe( 'system=freq,unit=GHz', status )
+ ff = ast_Fluxframe( 123.0D0, sf, ' ', status )
+
+ if( ast_GetD( ff, 'specval', status ) .ne. 123.0D0 ) then
+ call stopit( status, 'Error 1' )
+ end if
+
+ if( ast_Test( ff, 'specval', status ) ) then
+ call stopit( status, 'Error 2' )
+ end if
+
+ call ast_setd( ff, 'specval', 333.3D0, status )
+ if( ast_GetD( ff, 'specval', status ) .ne. 333.3D0 ) then
+ call stopit( status, 'Error 3' )
+ end if
+
+ if( .not. ast_Test( ff, 'specval', status ) ) then
+ call stopit( status, 'Error 4' )
+ end if
+
+ call ast_clear( ff, 'specval', status )
+
+ if( ast_GetD( ff, 'specval', status ) .ne. 123.0D0 ) then
+ call stopit( status, 'Error 5' )
+ end if
+
+ if( ast_Test( ff, 'specval', status ) ) then
+ call stopit( status, 'Error 6' )
+ end if
+
+
+ call checkDump( ff, 'CheckDump 1', status )
+
+
+ ff2 = ast_Fluxframe( 123.1D0, sf, ' ', status )
+ fs = ast_convert( ff, ff2, ' ', status )
+ if( fs .eq. ast__null ) then
+ call stopit( status, 'error 8' )
+ else
+ mp = ast_getmapping( fs, AST__BASE, AST__CURRENT, status )
+ if( .not. ast_isaunitmap( mp, status ) ) then
+ call stopit( status, 'error 9' )
+ end if
+ end if
+
+
+
+
+
+ ff = ast_Fluxframe( 123.0D0, sf, 'unit=W/m^2/Hz', status )
+ if( ast_GetC( ff, 'System', status ) .ne. 'FLXDN' ) then
+ write(*,*) ast_GetC( ff, 'System', status )
+ call stopit( status, 'error 10' )
+ endif
+
+ ff2 = ast_Fluxframe( 123.0D0, sf, 'unit=W/m^2/GHz', status )
+ if( ast_GetC( ff2, 'System', status ) .ne. 'FLXDN' ) then
+ write(*,*) ast_GetC( ff2, 'System', status )
+ call stopit( status, 'error 11' )
+ endif
+
+ fs = ast_convert( ff2, ff, ' ', status )
+ if( fs .eq. ast__null ) then
+ call stopit( status, 'error 12' )
+ else
+ mp = ast_getmapping( fs, AST__BASE, AST__CURRENT, status )
+ if( .not. ast_isazoommap( mp, status ) ) then
+ call stopit( status, 'error 13' )
+ else if( abs( ast_getd( mp, 'Zoom', status ) - 1.0D-9 )
+ : .gt. 1.0E-24 ) then
+ write(*,*) ast_getd( mp, 'Zoom', status )
+ call stopit( status, 'error 14' )
+ end if
+ end if
+
+
+ ff = ast_Fluxframe( 123.0D0, sf, 'unit=W/m^2/m', status )
+ if( ast_GetC( ff, 'System', status ) .ne. 'FLXDNW' ) then
+ write(*,*) ast_GetC( ff, 'System', status )
+ call stopit( status, 'error 15' )
+ endif
+
+ sf2 = ast_specframe( 'system=freq,unit=Hz', status )
+ ff2 = ast_Fluxframe( 123.0D9, sf2, 'unit=W/m^2/Angstrom', status )
+ if( ast_GetC( ff2, 'System', status ) .ne. 'FLXDNW' ) then
+ write(*,*) ast_GetC( ff2, 'System', status )
+ call stopit( status, 'error 16' )
+ endif
+
+ fs = ast_convert( ff2, ff, ' ', status )
+ if( fs .eq. ast__null ) then
+ call stopit( status, 'error 17' )
+ else
+ mp = ast_getmapping( fs, AST__BASE, AST__CURRENT, status )
+ if( .not. ast_isazoommap( mp, status ) ) then
+ call stopit( status, 'error 18' )
+ else if( ast_getd( mp, 'Zoom', status ) .ne. 1.0D10 ) then
+ write(*,*) ast_getd( mp, 'Zoom', status )
+ call stopit( status, 'error 19' )
+ end if
+ end if
+
+
+
+
+ ff = ast_Fluxframe( 123.0D0, sf, 'unit=W/m^2/m', status )
+ if( ast_GetC( ff, 'System', status ) .ne. 'FLXDNW' ) then
+ write(*,*) ast_GetC( ff, 'System', status )
+ call stopit( status, 'error 20' )
+ endif
+
+ sf2 = ast_specframe( 'system=wave,unit=nm', status )
+ ff2 = ast_Fluxframe( 2437337.06D0, sf2, 'unit=W/m^2/Angstrom',
+ : status )
+ if( ast_GetC( ff2, 'System', status ) .ne. 'FLXDNW' ) then
+ write(*,*) ast_GetC( ff2, 'System', status )
+ call stopit( status, 'error 21' )
+ endif
+
+ fs = ast_convert( ff, ff2, ' ', status )
+ if( fs .eq. ast__null ) then
+ call stopit( status, 'error 22' )
+ else
+ mp = ast_getmapping( fs, AST__BASE, AST__CURRENT, status )
+ if( .not. ast_isazoommap( mp, status ) ) then
+ call stopit( status, 'error 23' )
+ else if( ast_getd( mp, 'Zoom', status ) .ne. 1.0D-10 ) then
+ write(*,*) ast_getd( mp, 'Zoom', status )
+ call stopit( status, 'error 24' )
+ end if
+ end if
+
+
+ sf = ast_specframe( 'system=freq,unit=GHz', status )
+ ff = ast_Fluxframe( 123.0D0, sf, 'unit=W/m^2/Hz', status )
+ sf2 = ast_specframe( 'system=wave,unit=nm', status )
+ ff2 = ast_Fluxframe( 2437337.06D0, sf2, 'unit=W/m^2/m',
+ : status )
+ fs = ast_convert( ff, ff2, ' ', status )
+ if( fs .eq. ast__null ) then
+ call stopit( status, 'error 25' )
+ else
+ xin = 1.0D-13
+ call ast_tran1( fs, 1,xin, 1,xout, status )
+ if( abs( xout - 5.04649119D0 ) .gt. 1.0D-6 ) then
+ call stopit( status, 'error 26' )
+ end if
+ end if
+
+
+ sf = ast_specframe( 'system=freq,unit=GHz', status )
+ ff = ast_Fluxframe( 123.0D0, sf, 'unit=W/m^2/Hz/arcsec**2',
+ : status )
+ if( ast_getc( ff, 'System', status ) .ne. 'SFCBR' )
+ : call stopit( status, 'error 27a' )
+
+ sf2 = ast_specframe( 'system=wave,unit=nm', status )
+ ff2 = ast_Fluxframe( 2437337.06D0, sf2, 'unit=W/m^2/m/deg**2',
+ : status )
+ if( ast_getc( ff2, 'System', status ) .ne. 'SFCBRW' )
+ : call stopit( status, 'error 27b' )
+
+ fs = ast_convert( ff, ff2, ' ', status )
+ if( fs .eq. ast__null ) then
+ call stopit( status, 'error 27' )
+ else
+ xin = 1.0D-13
+ call ast_tran1( fs, 1,xin, 1,xout, status )
+ if( abs( xout - 65402525.8D0 ) .gt. 1.0 ) then
+ write(*,*) xout - 65402525.8D0
+ call stopit( status, 'error 28' )
+ end if
+ end if
+
+
+ ff = ast_Fluxframe( 123.0D0, sf, 'unit=W/m^2/Hz/arcsec**2',
+ : status )
+ ff2 = ast_Fluxframe( 2437337.06D0, sf2, 'unit=W/m^2/m',
+ : status )
+
+ fs = ast_convert( ff, ff2, ' ', status )
+ if( fs .ne. ast__null ) call stopit( status, 'error 29' )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if( status .eq. sai__ok ) then
+ write(*,*) 'All FluxFrame tests passed'
+ else
+ write(*,*) 'FluxFrame tests failed'
+ end if
+
+ end
+
+ subroutine stopit( status, text )
+ implicit none
+ include 'SAE_PAR'
+ integer status
+ character text*(*)
+
+ if( status .ne. sai__ok ) return
+ status = sai__error
+ write(*,*) text
+
+ end
+
+
+ subroutine checkdump( obj, text, status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ character text*(*)
+ integer obj, status, next, end, ch, result, ll, overlap
+ external mysource, mysink
+ character buf*25000
+
+ common /ss1/ buf
+ common /ss2/ next, end, ll
+
+ if( status .ne. sai__ok ) return
+
+ ch = ast_channel( mysource, mysink, ' ', status )
+
+
+ ll = 110
+ next = 1
+ if( ast_write( ch, obj, status ) .ne.1 ) then
+ write(*,*) text
+ call stopit( status, 'Cannot write supplied object to '//
+ : 'channel' )
+ end if
+
+ next = 1
+ result = ast_read( ch, status )
+ if( result .eq. ast__null ) then
+ write(*,*) text
+ call stopit( status, 'Cannot read object from channel' )
+ end if
+
+
+
+ if( ast_getd( obj, 'specval', status ) .ne.
+ : ast_getd( result, 'specval', status ) ) then
+ call ast_Show( obj, status )
+ call ast_Show( result, status )
+ write(*,*) text
+ call stopit( status, 'Object has changed' )
+ end if
+
+ end
+
+ subroutine sink1( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+
+ logical fsfound, done
+ common /sink1com/ fsfound, done
+
+ integer status, l
+ character line*200
+
+ if( status .ne. sai__ok ) return
+ call ast_getline( line, l, status )
+
+ if( index( line( : l ),'Unc =' ) .GT. 0 ) then
+ done = .true.
+
+ else if( .not. done .and.
+ : index( line( : l ),'FrameSet' ) .GT. 0 ) then
+ fsfound= .true.
+ end if
+
+ end
+
+ subroutine mysource( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ integer status, next, end, ll
+ character buf*25000
+
+ common /ss1/ buf
+ common /ss2/ next, end, ll
+
+ if( status .ne. sai__ok ) return
+
+ if( next .ge. end ) then
+ call ast_putline( buf, -1, status )
+ else
+ call ast_putline( buf( next : ), ll, status )
+ endif
+
+ next = next + ll
+
+ end
+
+ subroutine mysink( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ integer status, next, end, f, l, ll
+ character buf*25000
+ character line*1000
+
+ common /ss1/ buf
+ common /ss2/ next, end, ll
+
+ if( status .ne. sai__ok ) return
+
+ line = ' '
+ call ast_getline( line, l, status )
+ call chr_fandl( line( : l ), f, l )
+ buf( next : ) = line( f : l )
+ l = l - f + 1
+
+ if( next + ll - 1 .ge. 25000 ) then
+ write(*,*)
+ call stopit( status, 'Buffer overflow in mysink!!' )
+ else if( l .gt. ll ) then
+ write(*,*)
+ write(*,*) buf( next : next + l)
+ write(*,*) 'Line length ',l
+ call stopit( status, 'Line overflow in mysink!!' )
+ else
+ end = next + l
+ buf( end : next + ll - 1 ) = ' '
+ endif
+
+ next = next + ll
+
+ end
+
+
diff --git a/ast/ast_tester/testframeset.f b/ast/ast_tester/testframeset.f
new file mode 100644
index 0000000..0c9c52e
--- /dev/null
+++ b/ast/ast_tester/testframeset.f
@@ -0,0 +1,391 @@
+ program testframeset
+ implicit none
+
+ include 'AST_PAR'
+ include 'AST_ERR'
+ include 'SAE_PAR'
+
+ integer status, pfrm, ffrm, p2fmap, fs, p2fmap2, result, orig
+ double precision ina(2), inb(2), outa(2), outb(2), xout, yout
+ character text*100
+
+c call ast_watchmemory(100)
+
+
+ status = sai__ok
+ call err_mark( status )
+ call ast_begin( status )
+
+
+ pfrm = ast_frame( 2, "Domain=PIXEL", status )
+ ffrm = ast_frame( 2, "Domain=FPLANE", status )
+
+ ina( 1 ) = 1.0
+ ina( 2 ) = 1.0
+ inb( 1 ) = 100.0
+ inb( 2 ) = 200.0
+
+ outa( 1 ) = -2.5
+ outa( 2 ) = -1.0
+ outb( 1 ) = 2.5
+ outb( 2 ) = 1.0
+ p2fmap = ast_winmap( 2, ina, inb, outa, outb, ' ', status )
+
+ fs = ast_frameset( pfrm, ' ', status )
+ call ast_addframe( fs, AST__CURRENT, p2fmap, ffrm, status )
+
+ call ast_setc( fs, 'Base', 'Fplane', status )
+ if( ast_geti( fs, 'Base', status ) .ne. 2 )
+ : call stopit( status, 'Error -3' )
+
+ call ast_setc( fs, 'Base', 'pixel', status )
+ if( ast_geti( fs, 'Base', status ) .ne. 1 )
+ : call stopit( status, 'Error -2' )
+
+ call ast_setc( fs, 'Current', 'PIXEL', status )
+ if( ast_geti( fs, 'Current', status ) .ne. 1 )
+ : call stopit( status, 'Error -1' )
+
+ call ast_setc( fs, 'Current', 'fplane', status )
+ if( ast_geti( fs, 'Current', status ) .ne. 2 )
+ : call stopit( status, 'Error 0' )
+
+ text = ast_getc( fs, 'AllVariants', status )
+ if( text .ne. 'FPLANE' ) call stopit( status, 'Error 1' )
+
+ text = ast_getc( fs, 'Variant', status )
+ if( text .ne. 'FPLANE' ) call stopit( status, 'Error 2' )
+
+ if( ast_test( fs, 'Variant', status ) ) call stopit( status,
+ : 'Error 3' )
+
+
+ call ast_addvariant( FS, ast__null, 'FP1', status )
+
+ text = ast_getc( fs, 'AllVariants', status )
+ if( text .ne. 'FP1' ) call stopit( status, 'Error 4' )
+
+ text = ast_getc( fs, 'Variant', status )
+ if( text .ne. 'FP1' ) call stopit( status, 'Error 5' )
+
+ if( .not. ast_test( fs, 'Variant', status ) ) call stopit( status,
+ : 'Error 6' )
+
+ call ast_clear( fs, 'Variant', status )
+
+ text = ast_getc( fs, 'AllVariants', status )
+ if( text .ne. 'FPLANE' ) call stopit( status, 'Error 7' )
+
+ text = ast_getc( fs, 'Variant', status )
+ if( text .ne. 'FPLANE' ) call stopit( status, 'Error 8' )
+
+ if( ast_test( fs, 'Variant', status ) ) call stopit( status,
+ : 'Error 9' )
+
+ call ast_addvariant( FS, ast__null, 'FP1', status )
+
+ outa( 1 ) = 100.0
+ outa( 2 ) = 100.0
+ outb( 1 ) = 200.0
+ outb( 2 ) = 200.0
+ p2fmap2 = ast_winmap( 2, ina, inb, outa, outb, ' ', status )
+
+ call ast_invert( p2fmap, status )
+ call ast_addvariant( fs, ast_simplify(
+ : ast_cmpmap( p2fmap, p2fmap2, 1, ' ',
+ : status ), status ),
+ : 'FP2', status )
+
+ text = ast_getc( fs, 'AllVariants', status )
+ if( text .ne. 'FP1 FP2' ) call stopit( status, 'Error 10' )
+
+ text = ast_getc( fs, 'Variant', status )
+ if( text .ne. 'FP2' ) call stopit( status, 'Error 11' )
+
+ if( .not. ast_test( fs, 'Variant', status ) ) call stopit( status,
+ : 'Error 12' )
+ call ast_tran2( fs, 1, 50.5D0, 100.5D0, .TRUE., xout, yout,
+ : status )
+ if( abs( xout - 150.0D0 ) .gt. 1.0E-6 .OR.
+ : abs( yout - 150.0D0 ) .gt. 1.0E-6 ) call stopit( status,
+ : 'Error 13' )
+
+ call ast_setc( fs, 'Variant', 'FP1', status )
+ call ast_tran2( fs, 1, 50.5D0, 100.5D0, .TRUE., xout, yout,
+ : status )
+ if( abs( xout - 0.0D0 ) .gt. 1.0E-6 .OR.
+ : abs( yout - 0.0D0 ) .gt. 1.0E-6 ) call stopit( status,
+ : 'Error 14' )
+
+ outa( 1 ) = -100.0
+ outa( 2 ) = -100.0
+ outb( 1 ) = -200.0
+ outb( 2 ) = -200.0
+ p2fmap2 = ast_winmap( 2, ina, inb, outa, outb, ' ', status )
+
+ p2fmap = ast_getmapping( fs, AST__CURRENT, AST__BASE, status )
+ call ast_addvariant( fs, ast_simplify(
+ : ast_cmpmap( p2fmap, p2fmap2, 1, ' ',
+ : status ), status ),
+ : 'FP3', status )
+
+ text = ast_getc( fs, 'AllVariants', status )
+ if( text .ne. 'FP1 FP2 FP3' ) call stopit( status, 'Error 15' )
+
+ text = ast_getc( fs, 'Variant', status )
+ if( text .ne. 'FP3' ) call stopit( status, 'Error 16' )
+
+ if( .not. ast_test( fs, 'Variant', status ) ) call stopit( status,
+ : 'Error 17' )
+ call ast_tran2( fs, 1, 50.5D0, 100.5D0, .TRUE., xout, yout,
+ : status )
+ if( abs( xout + 150.0D0 ) .gt. 1.0E-6 .OR.
+ : abs( yout + 150.0D0 ) .gt. 1.0E-6 ) call stopit( status,
+ : 'Error 18' )
+
+ call ast_setc( fs, 'Variant', 'FP2', status )
+ call ast_tran2( fs, 1, 50.5D0, 100.5D0, .TRUE., xout, yout,
+ : status )
+ if( abs( xout - 150.0D0 ) .gt. 1.0E-6 .OR.
+ : abs( yout - 150.0D0 ) .gt. 1.0E-6 ) call stopit( status,
+ : 'Error 19' )
+
+ call checkdump( fs, result, status )
+
+ text = ast_getc( result, 'AllVariants', status )
+ if( text .ne. 'FP1 FP2 FP3' ) call stopit( status, 'Error 20' )
+
+ text = ast_getc( result, 'Variant', status )
+ if( text .ne. 'FP2' ) call stopit( status, 'Error 21' )
+
+ call ast_tran2( result, 1, 50.5D0, 100.5D0, .TRUE., xout, yout,
+ : status )
+ if( abs( xout - 150.0D0 ) .gt. 1.0E-6 .OR.
+ : abs( yout - 150.0D0 ) .gt. 1.0E-6 ) call stopit( status,
+ : 'Error 22' )
+
+
+
+ orig = ast_geti( fs, 'Current', status )
+ call ast_addframe( fs, AST__CURRENT, AST_UNITMAP( 2, '', status ),
+ : AST_FRAME( 2, "Domain=DSB", status ), status )
+ call ast_tran2( fs, 1, 50.5D0, 100.5D0, .TRUE., xout, yout,
+ : status )
+ if( abs( xout - 150.0D0 ) .gt. 1.0E-6 .OR.
+ : abs( yout - 150.0D0 ) .gt. 1.0E-6 ) call stopit( status,
+ : 'Error 23' )
+
+ if( status .eq. sai__ok ) then
+ call ast_setc( fs, 'Variant', 'FP1', status )
+ if( status .eq. ast__attin ) then
+ call err_annul( status )
+ else
+ call err_flush( status )
+ call stopit( status, 'Error 24' )
+ end if
+ end if
+
+ text = ast_getc( fs, 'AllVariants', status )
+ if( text .ne. 'DSB' ) call stopit( status, 'Error 25' )
+
+ text = ast_getc( fs, 'Variant', status )
+ if( text .ne. 'DSB' ) call stopit( status, 'Error 26' )
+
+ if( ast_test( fs, 'Variant', status ) ) call stopit( status,
+ : 'Error 27' )
+
+ call ast_mirrorvariants( fs, orig, status )
+
+ text = ast_getc( fs, 'AllVariants', status )
+ if( text .ne. 'FP1 FP2 FP3' ) call stopit( status, 'Error 28' )
+
+ text = ast_getc( fs, 'Variant', status )
+ if( text .ne. 'FP2' ) call stopit( status, 'Error 29' )
+
+ if( .not. ast_test( fs, 'Variant', status ) ) call stopit( status,
+ : 'Error 30' )
+
+ call ast_tran2( fs, 1, 50.5D0, 100.5D0, .TRUE., xout, yout,
+ : status )
+ if( abs( xout - 150.0D0 ) .gt. 1.0E-6 .OR.
+ : abs( yout - 150.0D0 ) .gt. 1.0E-6 ) call stopit( status,
+ : 'Error 31' )
+
+ call ast_set( fs, 'Variant=FP1', status )
+ text = ast_getc( fs, 'Variant', status )
+ if( text .ne. 'FP1' ) call stopit( status, 'Error 32' )
+
+ call ast_tran2( fs, 1, 50.5D0, 100.5D0, .TRUE., xout, yout,
+ : status )
+ if( abs( xout - 0.0D0 ) .gt. 1.0E-6 .OR.
+ : abs( yout - 0.0D0 ) .gt. 1.0E-6 ) call stopit( status,
+ : 'Error 33' )
+
+ call checkdump( fs, result, status )
+
+ text = ast_getc( result, 'AllVariants', status )
+ if( text .ne. 'FP1 FP2 FP3' ) call stopit( status, 'Error 34' )
+
+ text = ast_getc( result, 'Variant', status )
+ if( text .ne. 'FP1' ) call stopit( status, 'Error 35' )
+
+ call ast_tran2( result, 1, 50.5D0, 100.5D0, .TRUE., xout, yout,
+ : status )
+ if( abs( xout - 0.0D0 ) .gt. 1.0E-6 .OR.
+ : abs( yout - 0.0D0 ) .gt. 1.0E-6 ) call stopit( status,
+ : 'Error 36' )
+
+ result = ast_copy( fs, status )
+
+ text = ast_getc( result, 'AllVariants', status )
+ if( text .ne. 'FP1 FP2 FP3' ) call stopit( status, 'Error 37' )
+
+ text = ast_getc( result, 'Variant', status )
+ if( text .ne. 'FP1' ) call stopit( status, 'Error 38' )
+
+ call ast_tran2( result, 1, 50.5D0, 100.5D0, .TRUE., xout, yout,
+ : status )
+ if( abs( xout - 0.0D0 ) .gt. 1.0E-6 .OR.
+ : abs( yout - 0.0D0 ) .gt. 1.0E-6 ) call stopit( status,
+ : 'Error 39' )
+
+ call ast_clear( fs, 'Variant', status )
+ text = ast_getc( fs, 'Variant', status )
+ if( text .ne. 'DSB' ) call stopit( status, 'Error 40' )
+
+
+
+
+
+
+ call ast_end( status )
+ call err_rlse( status )
+
+ call ast_activememory( 'testframeset' )
+ call ast_flushmemory( 1 );
+
+ if( status .eq. sai__ok ) then
+ write(*,*) 'All FrameSet tests passed'
+ else
+ write(*,*) 'FrameSet tests failed'
+ end if
+
+ end
+
+
+
+ subroutine stopit( status, text )
+ implicit none
+ include 'SAE_PAR'
+ integer status
+ character text*(*)
+
+ if( status .ne. sai__ok ) return
+ status = sai__error
+ write(*,*) text
+
+ end
+
+ subroutine checkdump( obj, result, status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ character key*30,txt1*50,txt2*50
+ integer obj, status, next, end, ch, result, ll, overlap, size,
+ : i, type,obj1,obj2,l1,l2,nl,nrow,nrowold
+ external mysource, mysink
+ character buf*400000
+
+ common /ss1/ buf
+ common /ss2/ next, end, ll, nl
+
+ if( status .ne. sai__ok ) return
+
+ ch = ast_channel( mysource, mysink, ' ', status )
+
+ nl = 0
+ ll = 110
+ next = 1
+ if( ast_write( ch, obj, status ) .ne.1 ) then
+ call stopit( status, 'Cannot write supplied object to '//
+ : 'channel' )
+ end if
+
+ next = 1
+ nl = 0
+ result = ast_read( ch, status )
+
+ if( result .eq. ast__null ) then
+ call stopit( status, 'Cannot read object from channel' )
+ end if
+
+ if( .not. ast_isaframeset( result, status ) ) then
+ call stopit( status, 'Object read from channel is not a '//
+ : 'FrameSet')
+ end if
+
+ end
+
+ subroutine mysource( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ integer status, next, end, ll, nl
+ character buf*400000
+
+ common /ss1/ buf
+ common /ss2/ next, end, ll,nl
+
+ if( status .ne. sai__ok ) return
+
+ if( next .ge. end ) then
+ call ast_putline( buf, -1, status )
+ else
+
+c write(*,*) buf( next : next + ll - 1 )
+ call ast_putline( buf( next : ), ll, status )
+ nl = nl + 1
+ endif
+
+ next = next + ll
+
+ end
+
+ subroutine mysink( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ integer status, next, end, f, l, ll, nl
+ character buf*400000
+ character line*1000
+
+ common /ss1/ buf
+ common /ss2/ next, end, ll, nl
+
+ if( status .ne. sai__ok ) return
+
+ line = ' '
+ call ast_getline( line, l, status )
+ call chr_fandl( line( : l ), f, l )
+ buf( next : ) = line( f : l )
+ l = l - f + 1
+
+ if( next + ll - 1 .ge. 400000 ) then
+ write(*,*)
+ call stopit( status, 'Buffer overflow in mysink!!' )
+ else if( l .gt. ll ) then
+ write(*,*)
+ write(*,*) buf( next : next + l)
+ write(*,*) 'Line length ',l
+ call stopit( status, 'Line overflow in mysink!!' )
+ else
+ end = next + l
+ buf( end : next + ll - 1 ) = ' '
+ nl = nl + 1
+ endif
+
+ next = next + ll
+
+ end
+
+
diff --git a/ast/ast_tester/testkeymap.f b/ast/ast_tester/testkeymap.f
new file mode 100644
index 0000000..fcd5d5c
--- /dev/null
+++ b/ast/ast_tester/testkeymap.f
@@ -0,0 +1,1369 @@
+ program testkeymap
+ implicit none
+ include 'AST_PAR'
+ include 'AST_ERR'
+ include 'SAE_PAR'
+ integer status,map,map2,ival,aval,l,ivec(2),avec(4),nval,i,iat,
+ : map1, map3, km2
+ character cval*20,cvec(3)*10,key*20,cval0*40
+ double precision dval, dvec(2)
+ logical gota, gotc, gotd, goti, gotr, gotw, lval
+ real rval
+ integer*2 sval,svec(2)
+
+ status = sai__ok
+ call err_mark( status )
+ call ast_begin( status )
+
+c call ast_watchmemory( 29286 )
+
+ call testcasesens( status )
+ call testsorting( status )
+
+ map = ast_keymap( ' ', status )
+
+ call ast_MapPut0s( map, 'Freds', 1999, 'com 1', status )
+ call ast_MapPut0i( map, 'Fredi', 1999, 'com 1', status )
+ call ast_MapPut0d( map, 'Fredd', 1999.9D0, 'com2 ', status )
+ call ast_MapPut0r( map, 'Fredr', 1999.9, 'com2 ', status )
+ call ast_MapPut0c( map, 'Fredc', 'Hello', ' ', status )
+ call ast_MapPut0A( map, 'Freda', ast_skyframe( ' ', status ),
+ : ' ', status )
+
+ if( .not. ast_mapdefined( map, 'Freda', status ) ) then
+ call stopit( status, 'Error -12' )
+ end if
+
+ if( ast_maplenc( map, 'Fredi', status ) .ne. 4 ) then
+ write(*,*) ast_maplenc( map, 'Fredi', status )
+ call stopit( status, 'Error -11' )
+ end if
+
+ if( ast_maplenc( map, 'Freda', status ) .ne. 0 ) then
+ write(*,*) ast_maplenc( map, 'Freda', status )
+ call stopit( status, 'Error -10' )
+ end if
+
+ if( ast_maplenc( map, 'Fredc', status ) .ne. 5 ) then
+ write(*,*) ast_maplenc( map, 'Fredc', status )
+ call stopit( status, 'Error -9' )
+ end if
+
+ if( ast_maptype( map, 'freda', status ) .ne. AST__BADTYPE) then
+ call stopit( status, 'Error -8' )
+ end if
+
+ if( ast_maptype( map, 'Freda', status ) .ne. AST__OBJECTTYPE) then
+ call stopit( status, 'Error -7' )
+ end if
+
+ if( ast_maptype( map, 'Fredc', status ) .ne. AST__STRINGTYPE) then
+ call stopit( status, 'Error -6' )
+ end if
+
+ if( ast_maptype( map, 'Fredd', status ) .ne. AST__DOUBLETYPE) then
+ call stopit( status, 'Error -5' )
+ end if
+
+ if( ast_maptype( map, 'Fredr', status ) .ne. AST__FLOATTYPE) then
+ call stopit( status, 'Error -5b' )
+ end if
+
+ if( ast_maptype( map, 'Fredi', status ) .ne. AST__INTTYPE ) then
+ call stopit( status, 'Error -4' )
+ end if
+
+ if( ast_maphaskey( map, 'fredi', status ) ) then
+ call stopit( status, 'Error -3' )
+ end if
+
+ if( .not. ast_maphaskey( map, 'Fredi', status ) ) then
+ call stopit( status, 'Error -2' )
+ end if
+
+ map2 = ast_copy( map, status )
+
+
+ if( ast_mapsize( map2, status ) .ne. 6 ) then
+ write(*,*) ast_mapsize( map2, status )
+ call stopit( status, 'Error 0' )
+ end if
+
+ goti = .false.
+ gotd = .false.
+ gotr = .false.
+ gotc = .false.
+ gota = .false.
+ gotw = .false.
+
+ do i = 1, ast_mapsize( map2, status )
+ key = ast_mapkey( map2, i, status )
+ if( .not. goti .and. key .eq. 'Fredi' ) then
+ goti = .true.
+ else if( .not. gotd .and. key .eq. 'Fredd' ) then
+ gotd = .true.
+ else if( .not. gotw .and. key .eq. 'Freds' ) then
+ gotw = .true.
+ else if( .not. gotr .and. key .eq. 'Fredr' ) then
+ gotr = .true.
+ else if( .not. gotc .and. key .eq. 'Fredc' ) then
+ gotc = .true.
+ else if( .not. gota .and. key .eq. 'Freda' ) then
+ gota = .true.
+ else
+ call stopit( status, 'Error badkey' )
+ endif
+ end do
+
+ if( .not. ( goti .AND. gotd .AND. gotc
+ : .AND. gota .and. gotr .and. gotw) ) then
+ call stopit( status, 'Error nokey' )
+ endif
+
+ if( ast_maplength( map2, 'Fredi', status ) .ne. 1 ) then
+ write(*,*) ast_maplength( map2, 'Fredi', status )
+ call stopit( status, 'Error -1' )
+ end if
+
+ if( .not. ast_mapget0i( map2, 'Fredi', ival, status ) ) then
+ call stopit( status, 'Error 1' )
+ else if( ival .ne. 1999 ) then
+ write(*,*) ival
+ call stopit( status, 'Error 2' )
+ end if
+
+ if( .not. ast_mapget0s( map2, 'Freds', sval, status ) ) then
+ call stopit( status, 'Error 1' )
+ else if( sval .ne. 1999 ) then
+ write(*,*) ival
+ call stopit( status, 'Error 2B' )
+ end if
+
+ if( .not. ast_mapget0d( map2, 'Fredd', dval, status ) ) then
+ call stopit( status, 'Error 3' )
+ else if( dval .ne. 1999.9D0 ) then
+ write(*,*) dval - 1999.9D0
+ call stopit( status, 'Error 4' )
+ end if
+
+ if( .not. ast_mapget0r( map2, 'Fredr', rval, status ) ) then
+ call stopit( status, 'Error 3b' )
+ else if( rval .ne. 1999.9 ) then
+ write(*,*) rval - 1999.9
+ call stopit( status, 'Error 4b' )
+ end if
+
+ if( .not. ast_mapget0c( map2, 'Fredc', cval, l, status ) ) then
+ call stopit( status, 'Error 5' )
+ else if( l .ne. 5 ) then
+ write(*,*) l
+ call stopit( status, 'Error 6' )
+ else if( cval( :l ) .ne. 'Hello' ) then
+ write(*,*) cval( :l )
+ call stopit( status, 'Error 7' )
+ end if
+
+ if( .not. ast_mapgetc( map2, 'Fredc', cval, l, status ) ) then
+ call stopit( status, 'Error 5b' )
+ else if( l .ne. 5 ) then
+ write(*,*) l
+ call stopit( status, 'Error 6b' )
+ else if( cval( :l ) .ne. 'Hello' ) then
+ write(*,*) cval( :l )
+ call stopit( status, 'Error 7b' )
+ end if
+
+ if( .not. ast_mapget0a( map2, 'Freda', aval, status ) ) then
+ call stopit( status, 'Error 8' )
+ else if( .not. ast_IsASkyFrame( aval, STATUS ) ) then
+ call stopit( status, 'Error 9' )
+ end if
+
+ if( .not. ast_mapget0d( map2, 'Fredi', dval, status ) ) then
+ call stopit( status, 'Error 10' )
+ else if( dval .ne. 1999 ) then
+ write(*,*) dval
+ call stopit( status, 'Error 11' )
+ end if
+
+ if( .not. ast_mapget0r( map2, 'Fredi', rval, status ) ) then
+ call stopit( status, 'Error 10b' )
+ else if( rval .ne. 1999 ) then
+ call stopit( status, 'Error 11b' )
+ end if
+
+ if( .not. ast_mapget0c( map2, 'Fredi', cval, l, status ) ) then
+ call stopit( status, 'Error 12' )
+ else if( l .ne. 4 ) then
+ write(*,*) l
+ call stopit( status, 'Error 13a' )
+ else if( cval( :l ) .ne. '1999' ) then
+ write(*,*) cval
+ call stopit( status, 'Error 13' )
+ end if
+
+ if( .not. ast_mapget0i( map2, 'Fredd', ival, status ) ) then
+ call stopit( status, 'Error 14' )
+ else if( ival .ne. 2000.0 ) then
+ write(*,*) ival
+ call stopit( status, 'Error 15' )
+ end if
+
+ if( .not. ast_mapget0s( map2, 'Fredd', sval, status ) ) then
+ call stopit( status, 'Error 14b' )
+ else if( sval .ne. 2000.0 ) then
+ write(*,*) sval
+ call stopit( status, 'Error 15b' )
+ end if
+
+ if( .not. ast_mapget0c( map2, 'Fredd', cval, l, status ) ) then
+ call stopit( status, 'Error 16' )
+ else if( l .ne. 6 ) then
+ write(*,*) l
+ call stopit( status, 'Error 17a' )
+ else if( cval( :l ) .ne. '1999.9' ) then
+ write(*,*) cval
+ call stopit( status, 'Error 17' )
+ end if
+
+
+ ivec(1) = -10
+ ivec(2) = -10
+ if( .not. ast_mapget1i( map2, 'Fredi', 2, nval, ivec,
+ : status ) ) then
+ call stopit( status, 'Error 18' )
+ else if( nval .ne. 1 ) then
+ write(*,*) nval
+ call stopit( status, 'Error 19' )
+ else if( ivec( 1 ) .ne. 1999 ) then
+ write(*,*) ivec( 1 )
+ call stopit( status, 'Error 20' )
+ else if( ivec( 2 ) .ne. -10 ) then
+ write(*,*) ivec( 2 )
+ call stopit( status, 'Error 21' )
+ end if
+
+
+ dvec(1) = -10.0D0
+ dvec(2) = -10.0D0
+ if( .not. ast_mapget1d( map2, 'Fredd', 2, nval, dvec,
+ : status ) ) then
+ call stopit( status, 'Error 22' )
+ else if( nval .ne. 1 ) then
+ write(*,*) nval
+ call stopit( status, 'Error 23' )
+ else if( dvec( 1 ) .ne. 1999.9D0 ) then
+ write(*,*) dvec( 1 )
+ call stopit( status, 'Error 24' )
+ else if( dvec( 2 ) .ne. -10.0D0 ) then
+ write(*,*) dvec( 2 )
+ call stopit( status, 'Error 25' )
+ end if
+
+ avec(1) = AST__NULL
+ avec(2) = AST__NULL
+ if( .not. ast_mapget1a( map2, 'Freda', 2, nval, avec,
+ : status ) ) then
+ call stopit( status, 'Error 26' )
+ else if( nval .ne. 1 ) then
+ write(*,*) nval
+ call stopit( status, 'Error 27' )
+ else if( .not. ast_IsASkyFrame( avec( 1 ), STATUS ) ) then
+ write(*,*) ast_getc( avec( 1 ), 'class', status )
+ call stopit( status, 'Error 28' )
+ else if( avec( 2 ) .ne. AST__NULL ) then
+ write(*,*) ast_getc( avec( 2 ), 'class', status )
+ call stopit( status, 'Error 29' )
+ end if
+
+
+ ivec(1)=1999
+ ivec(2)=0
+ call ast_mapput1i( map, 'Fredi', 2, ivec, 'com 1', STATUS )
+
+ if( ast_maplength( map, 'Fredi', status ) .ne. 2 ) then
+ write(*,*) ast_maplength( map, 'Fredi', status )
+ call stopit( status, 'Error 29b' )
+
+ end if
+
+ svec(1)=1999
+ svec(2)=0
+ call ast_mapput1s( map, 'Freds', 2, svec, 'com 1', STATUS )
+
+ if( ast_maplength( map, 'Freds', status ) .ne. 2 ) then
+ write(*,*) ast_maplength( map, 'Freds', status )
+ call stopit( status, 'Error 29c' )
+
+ end if
+
+ dvec(1)=1999.9D0
+ dvec(2)=-0.01D0
+ call ast_mapput1d( map, 'Fredd', 2, dvec, 'com2', STATUS )
+
+ cvec(1)='Hello'
+ cvec(2)=' '
+ cvec(3)=' Hello'
+ call ast_mapput1c( map, 'Fredc', 3, cvec, ' ', STATUS )
+
+ if( ast_maplenc( map, 'Fredc', status ) .ne. len(cvec(3)) ) then
+ write(*,*) ast_maplenc( map, 'Fredc', status )
+ call stopit( status, 'Error 29c' )
+ end if
+
+ avec(1) = ast_skyframe( ' ', status )
+ avec(2) = AST__NULL
+ avec(3) = ast_specframe( ' ', status )
+ avec(4) = AST__NULL
+ call ast_mapput1a( map, 'Freda', 4, avec, ' ', STATUS )
+
+ map2 = ast_copy( map, status )
+
+ if( .not. ast_mapget0i( map2, 'Fredi', ival, status ) ) then
+ call stopit( status, 'Error A1' )
+ else if( ival .ne. 1999 ) then
+ write(*,*) ival
+ call stopit( status, 'Error A2' )
+ end if
+
+ if( .not. ast_mapget0d( map2, 'Fredd', dval, status ) ) then
+ call stopit( status, 'Error A3' )
+ else if( dval .ne. 1999.9D0 ) then
+ write(*,*) dval - 1999.9D0
+ call stopit( status, 'Error A4' )
+ end if
+
+ if( .not. ast_mapget0c( map2, 'Fredc', cval, l, status ) ) then
+ call stopit( status, 'Error A5' )
+ else if( l .ne. 10 ) then
+ write(*,*) l
+ call stopit( status, 'Error A6' )
+ else if( cval( :l ) .ne. 'Hello ' ) then
+ write(*,*) cval( :l )
+ call stopit( status, 'Error A7' )
+ end if
+
+ if( .not. ast_mapget0a( map2, 'Freda', aval, status ) ) then
+ call stopit( status, 'Error A8' )
+ else if( .not. ast_IsASkyFrame( aval, STATUS ) ) then
+ call stopit( status, 'Error A9' )
+ end if
+
+ if( .not. ast_mapget0d( map2, 'Fredi', dval, status ) ) then
+ call stopit( status, 'Error A10' )
+ else if( dval .ne. 1999 ) then
+ write(*,*) dval
+ call stopit( status, 'Error A11' )
+ end if
+
+ if( .not. ast_mapget0c( map2, 'Fredi', cval, l, status ) ) then
+ call stopit( status, 'Error A12' )
+ else if( l .ne. 4 ) then
+ write(*,*) l
+ call stopit( status, 'Error A13a' )
+ else if( cval( :l ) .ne. '1999' ) then
+ write(*,*) cval
+ call stopit( status, 'Error A13' )
+ end if
+
+ if( .not. ast_mapget0i( map2, 'Fredd', ival, status ) ) then
+ call stopit( status, 'Error A14' )
+ else if( ival .ne. 2000.0 ) then
+ write(*,*) ival
+ call stopit( status, 'Error A15' )
+ end if
+
+ if( .not. ast_mapget0c( map2, 'Fredd', cval, l, status ) ) then
+ call stopit( status, 'Error A16' )
+ else if( l .ne. 6 ) then
+ write(*,*) l
+ call stopit( status, 'Error A17a' )
+ else if( cval( :l ) .ne. '1999.9' ) then
+ write(*,*) cval
+ call stopit( status, 'Error A17' )
+ end if
+
+
+c Read vector entries as vectors.
+ if( .not. ast_mapget1i( map2, 'Fredi', 2, nval, ivec,
+ : status ) ) then
+ call stopit( status, 'Error B1' )
+ else if( nval .ne. 2 ) then
+ write(*,*) nval
+ call stopit( status, 'Error B2a' )
+ else if( ivec( 1 ) .ne. 1999 ) then
+ write(*,*) ivec( 1 )
+ call stopit( status, 'Error B2b' )
+ else if( ivec( 2 ) .ne. 0 ) then
+ write(*,*) ivec( 2 )
+ call stopit( status, 'Error B2c' )
+ end if
+
+ if( .not. ast_mapget1d( map2, 'Fredd', 2, nval, dvec,
+ : status ) ) then
+ call stopit( status, 'Error B3' )
+ else if( nval .ne. 2 ) then
+ write(*,*) nval
+ call stopit( status, 'Error B4a' )
+ else if( dvec( 1 ) .ne. 1999.9D0 ) then
+ write(*,*) dvec( 1 )
+ call stopit( status, 'Error B4b' )
+ else if( dvec( 2 ) .ne. -0.01D0 ) then
+ write(*,*) dvec( 2 )
+ call stopit( status, 'Error B4c' )
+ end if
+
+ if( .not. ast_mapget1a( map2, 'Freda', 4, nval, avec,
+ : status ) ) then
+ call stopit( status, 'Error B5' )
+ else if( nval .ne. 4 ) then
+ write(*,*) nval
+ call stopit( status, 'Error B6a' )
+ else if( .not. ast_isaskyframe( avec( 1 ), status ) ) then
+ write(*,*) ast_getc( avec( 1 ), 'class', status )
+ call stopit( status, 'Error B6b' )
+ else if( avec( 2 ) .NE. AST__NULL ) then
+ write(*,*) ast_getc( avec( 2 ), 'class', status )
+ call stopit( status, 'Error B6c' )
+ else if( .not. ast_isaspecframe( avec( 3 ), status ) ) then
+ write(*,*) ast_getc( avec( 3 ), 'class', status )
+ call stopit( status, 'Error B6d' )
+ else if( avec( 4 ) .ne. AST__NULL ) then
+ write(*,*) ast_getc( avec( 4 ), 'class', status )
+ call stopit( status, 'Error B6e' )
+ end if
+
+
+ if( .not. ast_mapget1c( map2, 'Fredc', 3, nval, cvec,
+ : status ) ) then
+ call stopit( status, 'Error B7' )
+ else if( nval .ne. 3 ) then
+ write(*,*) nval
+ call stopit( status, 'Error B8a' )
+ else if( cvec( 1 ) .ne. 'Hello ' ) then
+ write(*,*) cvec( 1 )
+ call stopit( status, 'Error B8b' )
+ else if( cvec( 2 ) .ne. ' ' ) then
+ write(*,*) cvec( 2 )
+ call stopit( status, 'Error B8c' )
+ else if( cvec( 3 ) .ne. ' Hello ' ) then
+ write(*,*) cvec( 2 )
+ call stopit( status, 'Error B8d' )
+ end if
+
+c Read entire vector as a single string.
+ if( .not. ast_mapgetc( map2, 'Fredc', cval0, l, status ) ) then
+ call stopit( status, 'Error BB1' )
+ else if( l .ne. 34 ) then
+ call stopit( status, 'Error BB2' )
+ else if( cval0 .ne. '(Hello , , Hello )' ) then
+ call stopit( status, 'Error BB3' )
+ end if
+
+c Read single elements of vector entries as scalars.
+ if( .not. ast_mapgetelemi( map2, 'Fredi', 1, ivec,
+ : status ) ) then
+ call stopit( status, 'Error B1z' )
+ else if( ivec( 1 ) .ne. 1999 ) then
+ write(*,*) ivec( 1 )
+ call stopit( status, 'Error B2bz' )
+ end if
+
+ if( .not. ast_mapgetelemd( map2, 'Fredd', 2, dvec,
+ : status ) ) then
+ call stopit( status, 'Error B3z' )
+ else if( dvec( 1 ) .ne. -0.01D0 ) then
+ write(*,*) dvec( 1 )
+ call stopit( status, 'Error B4cz' )
+ end if
+
+ if( .not. ast_mapgetelema( map2, 'Freda', 3, avec,
+ : status ) ) then
+ call stopit( status, 'Error B5z' )
+ else if( .not. ast_isaspecframe( avec( 1 ), status ) ) then
+ write(*,*) ast_getc( avec( 1 ), 'class', status )
+ call stopit( status, 'Error B6dz' )
+ end if
+
+
+ if( .not. ast_mapgetelemc( map2, 'Fredc', 3, cval0,
+ : status ) ) then
+ call stopit( status, 'Error B7z' )
+ else if( cval0 .ne. ' Hello ' ) then
+ write(*,*) cval0
+ call stopit( status, 'Error B8dz' )
+ end if
+
+
+ call ast_mapremove( map2, 'Bert', status )
+ call ast_mapremove( map2, 'Fredc', status )
+ if( ast_mapget1c( map2, 'Fredc', 3, nval, cvec, status ) ) then
+ call stopit( status, 'Error C1' )
+ endif
+
+
+ call checkDump( map2, 'checkDump 1 ', status )
+
+ call ast_Annul( map, status )
+ call ast_Annul( map2, status )
+
+
+ map = ast_keymap( ' ', status )
+
+ do i = 1, 500
+ key = 'Fred'
+ iat = 4
+ call chr_puti( i, key, iat )
+ call ast_MapPut0i( map, key, i, ' ', status )
+ end do
+
+ if( ast_mapsize( map, status ) .ne. 500 ) then
+ call stopit( status, 'Error d1 ' )
+ end if
+
+ if( ast_maptype( map, 'Fred123', status ) .ne. AST__INTTYPE ) then
+ call stopit( status, 'Error d2 ' )
+ end if
+
+ if( .not. ast_mapget0c( map, 'Fred489', cval, l, status ) ) then
+ call stopit( status, 'Error d2 ' )
+ else if( cval( : l ) .ne. '489' ) then
+ call stopit( status, 'Error d3 ' )
+ end if
+
+ call checkDump( map, 'checkDump 2 ', status )
+
+
+
+c Test putting single elements into vector entries.
+ map = ast_keymap( ' ', status )
+
+ ivec(1) = 1
+ ivec(2) = 2
+ call ast_mapput1i( map, 'Fredi', 2, ivec, 'com 1', STATUS )
+
+ call ast_mapputelemi( map, 'Fredi', 1, -1, STATUS )
+ if( .not. ast_mapgetelemi( map, 'Fredi', 1, ival,
+ : status ) ) then
+ call stopit( status, 'Error GETELEM_1' )
+ else if( ival .ne. -1 ) then
+ write(*,*) ival
+ call stopit( status, 'Error GETELEM_2' )
+ end if
+
+ call ast_mapputelemi( map, 'Fredi', 10, -2, STATUS )
+ if( .not. ast_mapgetelemi( map, 'Fredi', 3, ival,
+ : status ) ) then
+ call stopit( status, 'Error GETELEM_3' )
+ else if( ival .ne. -2 ) then
+ write(*,*) ival
+ call stopit( status, 'Error GETELEM_4' )
+ end if
+
+ call ast_mapputelemi( map, 'Fredi', 0, -3, STATUS )
+ if( .not. ast_mapgetelemi( map, 'Fredi', 4, ival,
+ : status ) ) then
+ call stopit( status, 'Error GETELEM_5' )
+ else if( ival .ne. -3 ) then
+ write(*,*) ival
+ call stopit( status, 'Error GETELEM_6' )
+ end if
+
+ if( ast_maplength( map, 'Fredi', status ) .ne. 4 ) then
+ write(*,*) ast_maplength( map, 'Fredi', status )
+ call stopit( status, 'Error GETELEM_7' )
+ end if
+
+ map2 = ast_keymap( ' ', status )
+ call ast_mapputelema( map2, 'A A', 1, map, STATUS )
+ if( ast_maplength( map2, 'A A', status ) .ne. 1 ) then
+ write(*,*) ast_maplength( map, 'Fredi', status )
+ call stopit( status, 'Error GETELEM_8' )
+ end if
+
+ if( .not. ast_mapgetelema( map2, 'A A', 1, map3,
+ : status ) ) then
+ call stopit( status, 'Error GETELEM_9' )
+ else if( .not. ast_mapgetelemi( map3, 'Fredi', 4, ival,
+ : status ) ) then
+ call stopit( status, 'Error GETELEM_10' )
+ else if( ival .ne. -3 ) then
+ write(*,*) ival
+ call stopit( status, 'Error GETELEM_11' )
+ end if
+
+ if( status .eq. sai__ok ) then
+ call ast_mapputelema( map2, 'A A', 1, map2, STATUS )
+ if( status .eq. ast__kycir ) then
+ call err_annul( status )
+ else
+ call stopit( status, 'Error GETELEM_12' )
+ end if
+ end if
+
+ call ast_mapput0c( map, ' B', 'Hello', ' ', status )
+
+
+ call ast_setl( map, 'MapLocked', .TRUE., status )
+ if( status .eq. sai__ok ) then
+ call ast_mapput0c( map, ' BZZ', 'Bye Bye', ' ', STATUS )
+ if( status .eq. AST__BADKEY ) then
+ call err_annul( status )
+ call ast_clear( map, 'maplocked', status )
+ else
+ call stopit( status, 'Error GETELEM_12B' )
+ end if
+ end if
+
+ call ast_mapput0c( map, ' BZZ', 'Bye Bye', ' ', STATUS )
+ km2 = ast_keymap( ' ', status )
+ call ast_mapput0a( map, ' BZY', km2, ' ', STATUS )
+ call ast_mapput0c( km2, ' BZZ', 'Bye Bye', ' ', STATUS )
+
+ call ast_setl( map, 'MapLocked', .TRUE., status )
+ call ast_mapput0c( map, ' BZZ', 'You Bye', ' ', STATUS )
+ call ast_mapput0c( km2, ' BZZ', 'You Bye', ' ', STATUS )
+ if( status .eq. sai__ok ) then
+ call ast_mapput0c( km2, ' BZA', 'No Bye', ' ', STATUS )
+ if( status .eq. AST__BADKEY ) then
+ call err_annul( status )
+ call ast_clear( map, 'maplocked', status )
+ call ast_mapput0c( km2, ' BZA', 'No Bye', ' ', STATUS )
+ else
+ call stopit( status, 'Error GETELEM_12C' )
+ end if
+ end if
+
+ if( ast_getl( km2, 'KeyError', status ) ) then
+ call stopit( status, 'Error GETELEM_12D' )
+ end if
+
+ call ast_setl( map, 'KeyError', .TRUE., status )
+
+ if( .not. ast_getl( km2, 'KeyError', status ) ) then
+ call stopit( status, 'Error GETELEM_12E' )
+ end if
+
+ if( status .eq. sai__ok ) then
+ lval = ast_mapget0c( km2, 'FRED', cval, l, status )
+ if( status .eq. AST__MPKER ) then
+ call err_annul( status )
+ call ast_clear( map, 'keyerror', status )
+ lval = ast_mapget0c( km2, 'FRED', cval, l, status )
+ else
+ call stopit( status, 'Error GETELEM_12F' )
+ end if
+ endif
+
+
+
+
+
+
+
+
+ call ast_mapputelemc( map, ' B ', 3, 'YES YES', STATUS )
+
+ if( ast_maplength( map, ' B', status ) .ne. 2 ) then
+ write(*,*) ast_maplength( map, ' B', status )
+ call stopit( status, 'Error GETELEM_13' )
+
+ else if( .not. ast_mapgetelemc( map, ' B ', 2, cval0,
+ : status ) ) then
+ call stopit( status, 'Error GETELEM_14' )
+
+ else if( cval0 .ne. 'YES YES' ) then
+ write(*,*) cval0
+ call stopit( status, 'Error GETELEM_15' )
+ end if
+
+ call ast_annul( map, status )
+
+
+C Test ast_mapcopy
+ map = ast_keymap( ' ', status )
+ map1 = ast_keymap( ' ', status )
+ map2 = ast_keymap( ' ', status )
+ map3 = ast_keymap( ' ', status )
+
+ call ast_mapput0i( map1, 'a1', 1, ' ', status )
+ call ast_mapput0i( map1, 'a2', 2, ' ', status )
+ call ast_mapput0i( map1, 'a3', 3, ' ', status )
+
+ call ast_mapput0c( map, 'aa1', 'Yes', ' ', status )
+ call ast_mapput0i( map, 'aa2', 2, ' ', status )
+ call ast_mapput0a( map, 'aa3', map1, ' ', status )
+
+ call ast_mapput0i( map2, 'b1', 10, ' ', status )
+ call ast_mapput0i( map2, 'b2', 20, ' ', status )
+ call ast_mapput0i( map2, 'b3', 30, ' ', status )
+
+ call ast_mapput0c( map3, 'bb1', 'No', ' ', status )
+ call ast_mapput0i( map3, 'aa2', 20, ' ', status )
+ call ast_mapput0a( map3, 'bb3', map2, ' ', status )
+
+ call ast_mapcopy( map, map3, status )
+
+ if( ast_mapsize( map, status ) .ne. 5 ) then
+ write(*,*) ast_mapsize( map, status )
+ call stopit( status, 'Error MAPCOPY_0' )
+ end if
+
+ if( .not. ast_mapget0c( map, 'aa1', cval, l, status ) ) then
+ call stopit( status, 'Error MAPCOPY_1' )
+ else if( cval .ne. 'Yes' ) then
+ write(*,*) cval
+ call stopit( status, 'Error MAPCOPY_2' )
+ end if
+
+ if( .not. ast_mapget0i( map, 'aa2', ival, status ) ) then
+ call stopit( status, 'Error MAPCOPY_3' )
+ else if( ival .ne. 20 ) then
+ write(*,*) ival
+ call stopit( status, 'Error MAPCOPY_4' )
+ end if
+
+ if( .not. ast_mapget0a( map, 'aa3', aval, status ) ) then
+ call stopit( status, 'Error MAPCOPY_5' )
+ else if( .not. ast_isakeymap( aval, status ) ) then
+ write(*,*) ast_getc( aval, 'Class' )
+ call stopit( status, 'Error MAPCOPY_6' )
+
+ if( .not. ast_mapget0i( aval, 'a1', ival, status ) ) then
+ call stopit( status, 'Error MAPCOPY_7' )
+ else if( ival .ne. 1 ) then
+ write(*,*) ival
+ call stopit( status, 'Error MAPCOPY_8' )
+ end if
+
+ if( .not. ast_mapget0i( aval, 'a2', ival, status ) ) then
+ call stopit( status, 'Error MAPCOPY_9' )
+ else if( ival .ne. 20 ) then
+ write(*,*) ival
+ call stopit( status, 'Error MAPCOPY_10' )
+ end if
+
+ if( .not. ast_mapget0i( aval, 'a3', ival, status ) ) then
+ call stopit( status, 'Error MAPCOPY_11' )
+ else if( ival .ne. 3 ) then
+ write(*,*) ival
+ call stopit( status, 'Error MAPCOPY_12' )
+ end if
+ end if
+
+ if( .not. ast_mapget0c( map, 'bb1', cval, l, status ) ) then
+ call stopit( status, 'Error MAPCOPY_13' )
+ else if( cval .ne. 'No' ) then
+ write(*,*) cval
+ call stopit( status, 'Error MAPCOPY_14' )
+ end if
+
+ if( .not. ast_mapget0a( map, 'bb3', aval, status ) ) then
+ call stopit( status, 'Error MAPCOPY_15' )
+ else if( .not. ast_isakeymap( aval, status ) ) then
+ write(*,*) ast_getc( aval, 'Class' )
+ call stopit( status, 'Error MAPCOPY_16' )
+
+ if( .not. ast_mapget0i( aval, 'b1', ival, status ) ) then
+ call stopit( status, 'Error MAPCOPY_17' )
+ else if( ival .ne. 10 ) then
+ write(*,*) ival
+ call stopit( status, 'Error MAPCOPY_18' )
+ end if
+
+ if( .not. ast_mapget0i( aval, 'b2', ival, status ) ) then
+ call stopit( status, 'Error MAPCOPY_19' )
+ else if( ival .ne. 20 ) then
+ write(*,*) ival
+ call stopit( status, 'Error MAPCOPY_20' )
+ end if
+
+ if( .not. ast_mapget0i( aval, 'b3', ival, status ) ) then
+ call stopit( status, 'Error MAPCOPY_21' )
+ else if( ival .ne. 30 ) then
+ write(*,*) ival
+ call stopit( status, 'Error MAPCOPY_22' )
+ end if
+ end if
+
+
+ map = ast_keymap( ' ', status )
+ map1 = ast_keymap( ' ', status )
+ map2 = ast_keymap( ' ', status )
+ map3 = ast_keymap( ' ', status )
+
+ call ast_mapput0i( map1, 'a1', 1, ' ', status )
+ call ast_mapput0i( map1, 'a2', 2, ' ', status )
+ call ast_mapput0i( map1, 'a3', 3, ' ', status )
+
+ call ast_mapput0c( map, 'aa1', 'Yes', ' ', status )
+ call ast_mapput0i( map, 'aa2', 2, ' ', status )
+ call ast_mapput0a( map, 'aa3', map1, ' ', status )
+
+ call ast_mapput0i( map2, 'b1', 10, ' ', status )
+ call ast_mapput0i( map2, 'b2', 20, ' ', status )
+ call ast_mapput0i( map2, 'b3', 30, ' ', status )
+
+ call ast_mapput0i( map3, 'aa1', 0, ' ', status )
+ call ast_mapput0i( map3, 'aa2', 20, ' ', status )
+ call ast_mapput0a( map3, 'aa3', map2, ' ', status )
+
+ call ast_mapcopy( map, map3, status )
+
+ if( ast_mapsize( map, status ) .ne. 3 ) then
+ write(*,*) ast_mapsize( map, status )
+ call stopit( status, 'Error MAPCOPY_23' )
+ end if
+
+ if( .not. ast_mapget0i( map, 'aa1', ival, status ) ) then
+ call stopit( status, 'Error MAPCOPY_24' )
+ else if( ival .ne. 0 ) then
+ write(*,*) ival
+ call stopit( status, 'Error MAPCOPY_25' )
+ end if
+
+ if( .not. ast_mapget0i( map, 'aa2', ival, status ) ) then
+ call stopit( status, 'Error MAPCOPY_26' )
+ else if( ival .ne. 20 ) then
+ write(*,*) ival
+ call stopit( status, 'Error MAPCOPY_27' )
+ end if
+
+ if( .not. ast_mapget0a( map, 'aa3', aval, status ) ) then
+ call stopit( status, 'Error MAPCOPY_28' )
+ else if( .not. ast_isakeymap( aval, status ) ) then
+ write(*,*) ast_getc( aval, 'Class' )
+ call stopit( status, 'Error MAPCOPY_29' )
+
+ if( .not. ast_mapget0i( aval, 'a1', ival, status ) ) then
+ call stopit( status, 'Error MAPCOPY_30' )
+ else if( ival .ne. 1 ) then
+ write(*,*) ival
+ call stopit( status, 'Error MAPCOPY_31' )
+ end if
+
+ if( .not. ast_mapget0i( aval, 'a2', ival, status ) ) then
+ call stopit( status, 'Error MAPCOPY_32' )
+ else if( ival .ne. 20 ) then
+ write(*,*) ival
+ call stopit( status, 'Error MAPCOPY_33' )
+ end if
+
+ if( .not. ast_mapget0i( aval, 'a3', ival, status ) ) then
+ call stopit( status, 'Error MAPCOPY_34' )
+ else if( ival .ne. 3 ) then
+ write(*,*) ival
+ call stopit( status, 'Error MAPCOPY_35' )
+ end if
+
+ if( .not. ast_mapget0i( aval, 'b1', ival, status ) ) then
+ call stopit( status, 'Error MAPCOPY_36' )
+ else if( ival .ne. 10 ) then
+ write(*,*) ival
+ call stopit( status, 'Error MAPCOPY_37' )
+ end if
+
+ if( .not. ast_mapget0i( aval, 'b2', ival, status ) ) then
+ call stopit( status, 'Error MAPCOPY_38' )
+ else if( ival .ne. 20 ) then
+ write(*,*) ival
+ call stopit( status, 'Error MAPCOPY_39' )
+ end if
+
+ if( .not. ast_mapget0i( aval, 'b3', ival, status ) ) then
+ call stopit( status, 'Error MAPCOPY_40' )
+ else if( ival .ne. 30 ) then
+ write(*,*) ival
+ call stopit( status, 'Error MAPCOPY_41' )
+ end if
+
+ end if
+
+
+ map = ast_keymap( ' ', status )
+ map1 = ast_keymap( ' ', status )
+ map2 = ast_keymap( ' ', status )
+ map3 = ast_keymap( ' ', status )
+
+ call ast_mapput0i( map1, 'a1', 1, ' ', status )
+ call ast_mapput0i( map1, 'a2', 2, ' ', status )
+ call ast_mapput0i( map1, 'a3', 3, ' ', status )
+
+ call ast_mapput0c( map, 'aa1', 'Yes', ' ', status )
+ call ast_mapput0i( map, 'aa2', 2, ' ', status )
+ call ast_mapput0a( map, 'aa3', map1, ' ', status )
+
+ call ast_mapput0i( map2, 'b1', 10, ' ', status )
+ call ast_mapput0i( map2, 'b2', 20, ' ', status )
+ call ast_mapput0i( map2, 'b3', 30, ' ', status )
+
+ call ast_mapput0i( map3, 'aa1', 0, ' ', status )
+ call ast_mapput0i( map3, 'aa2', 20, ' ', status )
+ call ast_mapput0a( map3, 'aa3', map2, ' ', status )
+
+ call ast_setl( map, 'MapLocked', .TRUE., status )
+ if( status .eq. SAI__OK ) then
+ call ast_mapcopy( map, map3, status )
+ if( status .eq. AST__BADKEY ) then
+ call err_annul( status )
+ else
+ call stopit( status, 'Error MAPCOPY_42' )
+ end if
+ end if
+
+
+C Test AST_MAPPUTU and undefined values
+ map = ast_keymap( ' ', status )
+ call ast_mapputu( map, 'GG', 'A comment', status )
+ if( ast_mapdefined( map, 'GG', status ) ) then
+ call stopit( status, 'Error UNDEF_0' )
+ else if( ast_mapget0i( map, 'GG', ival, status ) ) then
+ call stopit( status, 'Error UNDEF_1' )
+ else if( ast_mapget0s( map, 'GG', sval, status ) ) then
+ call stopit( status, 'Error UNDEF_1B' )
+ else if( ast_mapget0c( map, 'GG', cval, l, status ) ) then
+ call stopit( status, 'Error UNDEF_2' )
+ else if( ast_mapget0a( map, 'GG', aval, status ) ) then
+ call stopit( status, 'Error UNDEF_3' )
+ else if( ast_mapget1i( map, 'GG', 2, nval, ivec,
+ : status ) ) then
+ call stopit( status, 'Error UNDEF_4' )
+ else if( ast_mapgetelemc( map, 'gg', 1, cval, status ) ) then
+ call stopit( status, 'Error UNDEF_5' )
+ else if( .not. ast_maphaskey( map, 'GG', status ) ) then
+ call stopit( status, 'Error UNDEF_6' )
+ end if
+
+ if( ast_maptype( map, 'GG', status ) .ne. AST__UNDEFTYPE ) then
+ write(*,*) ast_maptype( map, 'GG', status )
+ call stopit( status, 'Error UNDEF_7' )
+ else if( ast_mapsize( map, status ) .ne. 1 ) then
+ call stopit( status, 'Error UNDEF_8' )
+ end if
+
+ call ast_mapput0i( map, 'GG', 0, ' ', status )
+ if( .not. ast_mapget0i( map, 'GG', ival, status ) ) then
+ call stopit( status, 'Error UNDEF_9' )
+ else if( ival .ne. 0 ) then
+ call stopit( status, 'Error UNDEF_10' )
+ endif
+
+ call ast_maprename( map, 'GG', 'GGNEW', status )
+ if( ast_maphaskey( map, 'GG', status ) ) then
+ call stopit( status, 'Error RENAME_1' )
+ else if( .not. ast_mapget0i( map, 'GGNEW', ival, status ) ) then
+ call stopit( status, 'Error RENAME_2' )
+ else if( ival .ne. 0 ) then
+ call stopit( status, 'Error RENAME_3' )
+ endif
+
+ call ast_maprename( map, 'GGNEW', 'GG', status )
+ if( ast_maphaskey( map, 'GGNEW', status ) ) then
+ call stopit( status, 'Error RENAME_4' )
+ else if( .not. ast_mapget0i( map, 'GG', ival, status ) ) then
+ call stopit( status, 'Error RENAME_5' )
+ else if( ival .ne. 0 ) then
+ call stopit( status, 'Error RENAME_6' )
+ endif
+
+
+
+
+
+
+ call ast_end( status )
+
+ call ast_activememory( ' ' )
+ call ast_flushmemory( 1 );
+
+ call err_rlse( status )
+
+ if( status .eq. sai__ok ) then
+ write(*,*) 'All KeyMap tests passed'
+ else
+ write(*,*) 'KeyMap tests failed'
+ end if
+
+ end
+
+ subroutine stopit( status, text )
+ implicit none
+ include 'SAE_PAR'
+ integer status
+ character text*(*)
+
+ if( status .ne. sai__ok ) return
+ status = sai__error
+ write(*,*) text
+
+ end
+
+ subroutine checkdump( obj, text, status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ character text*(*),key*30,txt1*50,txt2*50
+ integer obj, status, next, end, ch, result, ll, overlap, size,
+ : i, type,obj1,obj2,l1,l2,nl
+ external mysource, mysink
+ character buf*400000
+
+ common /ss1/ buf
+ common /ss2/ next, end, ll, nl
+
+ if( status .ne. sai__ok ) return
+
+ ch = ast_channel( mysource, mysink, ' ', status )
+
+
+ nl = 0
+ ll = 110
+ next = 1
+ if( ast_write( ch, obj, status ) .ne.1 ) then
+ write(*,*) text
+ call stopit( status, 'Cannot write supplied object to '//
+ : 'channel' )
+ end if
+
+ next = 1
+ nl = 0
+ result = ast_read( ch, status )
+
+ if( result .eq. ast__null ) then
+ write(*,*) text
+ call stopit( status, 'Cannot read object from channel' )
+ end if
+
+ size = ast_mapsize( result, status )
+ if( ast_mapsize( obj, status ) .ne. size ) then
+ write(*,*) size, ast_mapsize( obj, status )
+ call stopit( status, 'checkDump 1' )
+ else
+ do i = 1, size
+ key = ast_mapkey( result, i, status )
+ type = ast_maptype( result, key, status )
+ if( ast_maptype( obj, key, status ) .ne. type ) then
+ write(*,*) type, ast_maptype( obj, key, status )
+ call stopit( status, 'checkDump 4' )
+ else
+
+ if( type .eq. AST__OBJECTTYPE ) then
+
+ if( .not. ast_mapGet0A( result, key, obj1,
+ : status ) ) call stopit( status, 'checkDump 5' )
+ if( .not. ast_mapGet0A( obj, key, obj2,
+ : status ) ) call stopit( status, 'checkDump 6' )
+ if( ast_GetC( obj1, 'class', status ) .ne.
+ : ast_GetC( obj2, 'class', status ) ) then
+ call stopit( status, 'checkDump 7' )
+ end if
+
+ else
+
+ if( .not. ast_mapGet0C( result, key, txt1, l1,
+ : status ) ) call stopit( status, 'checkDump 8' )
+ if( .not. ast_mapGet0C( obj, key, txt2, l2,
+ : status ) ) call stopit( status, 'checkDump 9' )
+ if( txt1( : l1 ) .ne. txt2( : l2 ) .or.
+ : l1 .ne. l2 ) then
+ call stopit( status, 'checkDump 10' )
+ end if
+
+ end if
+ end if
+ end do
+ end if
+
+ end
+
+ subroutine mysource( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ integer status, next, end, ll, nl
+ character buf*400000
+
+ common /ss1/ buf
+ common /ss2/ next, end, ll,nl
+
+ if( status .ne. sai__ok ) return
+
+ if( next .ge. end ) then
+ call ast_putline( buf, -1, status )
+ else
+ call ast_putline( buf( next : ), ll, status )
+ nl = nl + 1
+ endif
+
+ next = next + ll
+
+ end
+
+ subroutine mysink( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ integer status, next, end, f, l, ll, nl
+ character buf*400000
+ character line*1000
+
+ common /ss1/ buf
+ common /ss2/ next, end, ll, nl
+
+ if( status .ne. sai__ok ) return
+
+ line = ' '
+ call ast_getline( line, l, status )
+ call chr_fandl( line( : l ), f, l )
+ buf( next : ) = line( f : l )
+ l = l - f + 1
+
+ if( next + ll - 1 .ge. 400000 ) then
+ write(*,*)
+ call stopit( status, 'Buffer overflow in mysink!!' )
+ else if( l .gt. ll ) then
+ write(*,*)
+ write(*,*) buf( next : next + l)
+ write(*,*) 'Line length ',l
+ call stopit( status, 'Line overflow in mysink!!' )
+ else
+ end = next + l
+ buf( end : next + ll - 1 ) = ' '
+ nl = nl + 1
+ endif
+
+ next = next + ll
+
+ end
+
+
+
+ subroutine testsorting( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+
+ integer status, km, i
+ character keys(5)*15
+ character skeys(5)*15
+ character key*( AST__SZCHR )
+
+
+ data keys / 'ABC', 'zzzzzzzzzzz', 'this_is_a_key', 'HE-HE', 'A' /
+ data skeys / 'A', 'ABC', 'HE-HE', 'this_is_a_key', 'zzzzzzzzzzz' /
+
+
+ if( status .ne. sai__ok ) return
+
+C Value Age sorting...
+
+C First test adding entries into an already sorted KeyMap
+
+ km = ast_keymap( 'Sortby=AgeDown', status )
+
+ do i = 1, 5
+ call ast_mapput0i( km, keys(i), i, ' ', status )
+ end do
+
+ do i = 1, 5
+ key = ast_mapkey( km, i, status )
+ if( key .ne. keys(i) .and. status .eq. SAI__OK ) then
+ write(*,*) 'Key ',i,' is ',key,' (should be ',keys(i),')'
+ call stopit( status, 'Error Sort 1' )
+ return
+ end if
+ end do
+
+C Now test sorting existing entries in a KeyMap.
+ call ast_set( km, 'Sortby=AgeUp', status )
+
+ do i = 1, 5
+ key = ast_mapkey( km, i, status )
+ if( key .ne. keys(6-i) .and. status .eq. SAI__OK ) then
+ write(*,*) 'Key ',i,' is ',key,' (should be ',keys(6-i),')'
+ call stopit( status, 'Error Sort 2' )
+ return
+ end if
+ end do
+
+
+C Changing the value of an existing entry should change its position in
+C the list.
+ call ast_mapput0i( km, keys(1), 10, ' ', status )
+ call ast_set( km, 'Sortby=AgeDown', status )
+
+ do i = 1, 5
+ key = ast_mapkey( km, i, status )
+ if( i .eq. 5 ) then
+ if( key .ne. keys(1) .and. status .eq. SAI__OK ) then
+ write(*,*) 'Key ',1,' is ',key,' (should be ',keys(1),')'
+ call stopit( status, 'Error Sort 2b' )
+ return
+ end if
+ else if( key .ne. keys(i+1) .and. status .eq. SAI__OK ) then
+ write(*,*) 'Key ',i+1,' is ',key,' (should be ',keys(i+1),
+ : ')'
+ call stopit( status, 'Error Sort 2c' )
+ return
+ end if
+ end do
+
+ call ast_annul( km, status )
+
+
+C Key Age sorting...
+
+C First test adding entries into an already sorted KeyMap
+
+ km = ast_keymap( 'Sortby=KeyAgeDown', status )
+
+ do i = 1, 5
+ call ast_mapput0i( km, keys(i), i, ' ', status )
+ end do
+
+ do i = 1, 5
+ key = ast_mapkey( km, i, status )
+ if( key .ne. keys(i) .and. status .eq. SAI__OK ) then
+ write(*,*) 'Key ',i,' is ',key,' (should be ',keys(i),')'
+ call stopit( status, 'Error Sort 0' )
+ return
+ end if
+ end do
+
+C Now test sorting existing entries in a KeyMap.
+ call ast_set( km, 'Sortby=KeyAgeUp', status )
+
+ do i = 1, 5
+ key = ast_mapkey( km, i, status )
+ if( key .ne. keys(6-i) .and. status .eq. SAI__OK ) then
+ write(*,*) 'Key ',i,' is ',key,' (should be ',keys(6-i),')'
+ call stopit( status, 'Error Sort -1' )
+ return
+ end if
+ end do
+
+
+C Changing the value of an existing entry should not change its position
+C in the list.
+ call ast_mapput0i( km, keys(1), 10, ' ', status )
+ call ast_set( km, 'Sortby=KeyAgeDown', status )
+
+ do i = 1, 5
+ key = ast_mapkey( km, i, status )
+ if( key .ne. keys(i) .and. status .eq. SAI__OK ) then
+ write(*,*) 'Key ',i,' is ',key,' (should be ',keys(i),')'
+ call stopit( status, 'Error Sort -2' )
+ return
+ end if
+ end do
+
+ call ast_annul( km, status )
+
+
+
+C Key sorting...
+
+C First test adding entries into an already sorted KeyMap
+
+ km = ast_keymap( 'Sortby=KeyUp', status )
+
+ do i = 1, 5
+ call ast_mapput0i( km, keys(i), i, ' ', status )
+ end do
+
+ do i = 1, 5
+ key = ast_mapkey( km, i, status )
+ if( key .ne. skeys(i) .and. status .eq. SAI__OK ) then
+ write(*,*) 'Key ',i,' is ',key,' (should be ',skeys(i),')'
+ call stopit( status, 'Error Sort 3' )
+ return
+ end if
+ end do
+
+C Now test sorting existing entries in a KeyMap.
+ call ast_set( km, 'Sortby=KeyDown', status )
+
+ do i = 1, 5
+ key = ast_mapkey( km, i, status )
+ if( key .ne. skeys(6-i) .and. status .eq. SAI__OK ) then
+ write(*,*) 'Key ',i,' is ',key,' (should be ',skeys(6-i),')'
+ call stopit( status, 'Error Sort 4' )
+ return
+ end if
+ end do
+
+ call ast_annul( km, status )
+
+
+
+
+ end
+
+
+
+
+ subroutine testcasesens( status )
+ implicit none
+ include 'AST_PAR'
+ include 'AST_ERR'
+ include 'SAE_PAR'
+
+ integer status, map, l
+ character sval*( AST__SZCHR )
+
+ if( status .ne. sai__ok ) return
+
+ map = ast_keymap( 'KeyCase=0', status )
+ call ast_mapput0i( map, 'Freds', 1999, 'com 1', status )
+
+ if( .not. ast_maphaskey( map, 'fReDs', status ) ) then
+ call stopit( status, 'Error case 1' )
+ endif
+
+ if( ast_mapkey( map, 1, status ) .ne. 'FREDS' ) then
+ call stopit( status, 'Error case 2' )
+ endif
+
+ if( .not. ast_mapget0c( map, 'freds', sval, l, status ) ) then
+ call stopit( status, 'Error case 3' )
+ else if( sval .ne. '1999' ) then
+ call stopit( status, 'Error case 4' )
+ else if( l .ne. 4 ) then
+ call stopit( status, 'Error case 4b' )
+ end if
+
+ call ast_setl( map, 'KeyCase', 0, status );
+
+ if( status .eq. sai__ok ) then
+ call ast_clear( map, 'KeyCase', status )
+ if( status .eq. AST__NOWRT ) then
+ call err_annul( status )
+ else if( status .eq. sai__ok ) then
+ call stopit( status, 'Error case 5' )
+ end if
+ end if
+
+ if( ast_mapsize( map, status ) .ne. 1 ) then
+ call stopit( status, 'Error case 6' )
+ end if
+
+ call ast_mapremove( map, 'freDs', status )
+
+ if( ast_mapsize( map, status ) .ne. 0 ) then
+ call stopit( status, 'Error case 7' )
+ end if
+
+ call ast_clear( map, 'KeyCase', status )
+ call ast_mapput0i( map, 'Freds', 1999, 'com 1', status )
+ if( ast_maphaskey( map, ' fReDs', status ) ) then
+ call stopit( status, 'Error case 8' )
+ endif
+
+
+ call ast_annul( map, status )
+
+ end
+
+
+
+
diff --git a/ast/ast_tester/testlutmap.f b/ast/ast_tester/testlutmap.f
new file mode 100644
index 0000000..e183375
--- /dev/null
+++ b/ast/ast_tester/testlutmap.f
@@ -0,0 +1,177 @@
+ program testlutmap
+ implicit none
+
+ include 'AST_PAR'
+ include 'SAE_PAR'
+
+ integer lm, status, i
+ double precision lut1( 10 ), x( 7 ), y(7)
+
+ status = sai__ok
+ call err_mark( status )
+ call ast_begin( status )
+
+
+ data lut1/ -1D0, 0D0, 1D0, 2D0, 3D0, 4D0, 5D0, 6D0, 7D0, 8D0 /
+
+
+
+
+ lm = ast_lutmap( 10, lut1, -1.0D0, 1.0D0, ' ', status )
+ x( 1 ) = -2.0D0
+ x( 2 ) = -1.0D0
+ x( 3 ) = -0.5D0
+ x( 4 ) = 3.0D0
+ x( 5 ) = 7.5D0
+ x( 6 ) = 8.0D0
+ x( 7 ) = 8.5D0
+
+ call ast_tran1( lm, 7, x, .TRUE., y, status )
+
+ do i = 1, 7
+ if( x( i ) .ne. y( i ) ) then
+ call stopit( status, "Error 1" );
+ end if
+ end do
+
+ call ast_tran1( lm, 7, y, .FALSE., x, status )
+
+ do i = 1, 7
+ if( x( i ) .ne. y( i ) ) then
+ call stopit( status, "Error 2" );
+ end if
+ end do
+
+
+
+
+ lut1( 1 ) = lut1( 2 )
+ lm = ast_lutmap( 10, lut1, -1.0D0, 1.0D0, ' ', status )
+ x( 1 ) = -2.0D0
+ x( 2 ) = -1.0D0
+ x( 3 ) = -0.5D0
+ x( 4 ) = 0.5D0
+ x( 5 ) = 3.0D0
+ x( 6 ) = 8.0D0
+ x( 7 ) = 8.5D0
+
+ call ast_tran1( lm, 7, x, .TRUE., y, status )
+
+ do i = 1, 3
+ if( y( i ) .ne. 0.0 ) then
+ call stopit( status, "Error 3" );
+ end if
+ end do
+
+ do i = 4, 7
+ if( x( i ) .ne. y( i ) ) then
+ call stopit( status, "Error 4" );
+ end if
+ end do
+
+ call ast_tran1( lm, 7, y, .FALSE., x, status )
+
+ do i = 1, 3
+ if( x( i ) .ne. AST__BAD ) then
+ call stopit( status, "Error 5" );
+ end if
+ end do
+
+ do i = 4, 7
+ if( x( i ) .ne. y( i ) ) then
+ call stopit( status, "Error 6" );
+ end if
+ end do
+
+
+ lut1( 5 ) = AST__BAD
+ lm = ast_lutmap( 10, lut1, -1.0D0, 1.0D0, ' ', status )
+ x( 1 ) = -2.0D0
+ x( 2 ) = -1.0D0
+ x( 3 ) = -0.5D0
+ x( 4 ) = 0.5D0
+ x( 5 ) = 3.0D0
+ x( 6 ) = 8.0D0
+ x( 7 ) = 8.5D0
+
+ call ast_tran1( lm, 7, x, .TRUE., y, status )
+
+ do i = 1, 3
+ if( y( i ) .ne. 0.0 ) then
+ call stopit( status, "Error 7" );
+ end if
+ end do
+
+ if( y( 5 ) .ne. AST__BAD ) then
+ call stopit( status, "Error 8" );
+ end if
+ y(5) = x( 5 )
+
+ do i = 4, 7
+ if( x( i ) .ne. y( i ) ) then
+ call stopit( status, "Error 9" );
+ end if
+ end do
+
+ call ast_tran1( lm, 7, y, .FALSE., x, status )
+
+ do i = 1, 3
+ if( x( i ) .ne. AST__BAD ) then
+ call stopit( status, "Error 10" );
+ end if
+ end do
+
+ if( x( 5 ) .ne. AST__BAD ) then
+ call stopit( status, "Error 11" );
+ end if
+ x(5) = y( 5 )
+
+ do i = 4, 7
+ if( x( i ) .ne. y( i ) ) then
+ call stopit( status, "Error 12" );
+ end if
+ end do
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ call ast_end( status )
+ call err_rlse( status )
+
+c call ast_activememory( 'testlutmap' )
+ call ast_flushmemory( 1 )
+
+ if( status .eq. sai__ok ) then
+ write(*,*) 'All LutMap tests passed'
+ else
+ write(*,*) 'LutMap tests failed'
+ end if
+
+ end
+
+
+
+ subroutine stopit( status, text )
+ implicit none
+ include 'SAE_PAR'
+ integer status
+ character text*(*)
+ if( status .ne. sai__ok ) return
+ status = sai__error
+ write(*,*) text
+ end
+
+
+
diff --git a/ast/ast_tester/testmapping.f b/ast/ast_tester/testmapping.f
new file mode 100644
index 0000000..a02dd5b
--- /dev/null
+++ b/ast/ast_tester/testmapping.f
@@ -0,0 +1,85 @@
+ program testmapping
+ implicit none
+
+ include 'AST_PAR'
+ include 'SAE_PAR'
+
+ integer status, pm
+ double precision coeff(20), fit(6), lbnd(2), ubnd(2)
+
+ data coeff / 1.0, 1.0, 0.0, 0.0,
+ : 2.0, 1.0, 1.0, 0.0,
+ : 1.0, 2.0, 0.0, 0.0,
+ : 3.0, 2.0, 0.0, 1.0,
+ : 3.0, 1.0, 0.0, 2.0 /
+
+
+
+ status = sai__ok
+ call err_mark( status )
+ call ast_begin( status )
+
+ pm = ast_polymap( 2, 2, 4, coeff, 0, coeff, ' ', status )
+
+ lbnd( 1 ) = -1.0D0
+ lbnd( 2 ) = -1.0D0
+ ubnd( 1 ) = 1.0D0
+ ubnd( 2 ) = 1.0D0
+ if( ast_linearapprox(pm, lbnd, ubnd, 0.001D0, fit, status) ) then
+ if( fit(1) .ne. 1.0D0 .or. fit(2) .ne. 1.0D0 .or.
+ : fit(3) .ne. 2.0D0 .or. fit(4) .ne. 0.0D0 .or.
+ : fit(5) .ne. 0.0D0 .or. fit(6) .ne. 3.0D0 ) then
+ call stopit( status, 'Error 0' )
+ end if
+ else
+ call stopit( status, 'Error 1' )
+ end if
+
+ coeff( 13 ) = AST__BAD
+ pm = ast_polymap( 2, 2, 4, coeff, 0, coeff, ' ', status )
+
+ if( ast_linearapprox(pm, lbnd, ubnd, 0.001D0, fit, status) ) then
+ if( fit(1) .ne. 1.0D0 .or. fit(2) .ne. AST__BAD .or.
+ : fit(3) .ne. 2.0D0 .or. fit(4) .ne. 0.0D0 .or.
+ : fit(5) .ne. AST__BAD .or. fit(6) .ne. AST__BAD ) then
+ call stopit( status, 'Error 2' )
+ end if
+ else
+ call stopit( status, 'Error 3' )
+ end if
+
+ pm = ast_polymap( 2, 2, 5, coeff, 0, coeff, ' ', status )
+
+ if( ast_linearapprox(pm, lbnd, ubnd, 0.001D0, fit, status) ) then
+ write(*,*) fit
+ call stopit( status, 'Error 4' )
+ end if
+
+
+
+
+ call ast_end( status )
+ call err_rlse( status )
+
+ if( status .eq. sai__ok ) then
+ write(*,*) 'All Mapping tests passed'
+ else
+ write(*,*) 'Mapping tests failed'
+ end if
+
+ end
+
+
+
+ subroutine stopit( status, text )
+ implicit none
+ include 'SAE_PAR'
+ integer status
+ character text*(*)
+ if( status .ne. sai__ok ) return
+ status = sai__error
+ write(*,*) text
+ end
+
+
+
diff --git a/ast/ast_tester/testnormmap.f b/ast/ast_tester/testnormmap.f
new file mode 100644
index 0000000..2c57ee6
--- /dev/null
+++ b/ast/ast_tester/testnormmap.f
@@ -0,0 +1,94 @@
+ program testnormmap
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ include 'PRM_PAR'
+
+ integer status, m, m2, m3, f, perm(3)
+ double precision at(3), bt(3)
+
+ call ast_begin( status )
+
+
+ status = sai__ok
+
+ f = ast_cmpframe( ast_specframe( ' ', status ),
+ : ast_skyframe( ' ', status ), ' ', status )
+
+ perm( 1 ) = 3
+ perm( 2 ) = 1
+ perm( 3 ) = 2
+ call ast_permaxes( f, perm, status )
+ m = ast_normmap( f, ' ', status )
+
+ if( ast_geti( m, 'nin', status ) .ne. 3 ) call stopit( 1, status )
+ if( ast_geti( m, 'nout', status ) .ne. 3 ) call stopit( 2, status)
+
+ if( .not. ast_getl( m, 'TranForward', status ) ) call stopit( 3,
+ : status )
+ if( .not. ast_getl( m, 'TranInverse', status ) ) call stopit( 4,
+ : status )
+
+
+ m2 = ast_copy( m, status )
+ call ast_invert( m2, status )
+ m3 = ast_simplify( ast_cmpmap( m, m2, .true., ' ', status ),
+ : status )
+ if( .not. ast_isaunitmap( m3, status ) ) call stopit( 5, status )
+
+
+ at( 1 ) = 2.0D0
+ at( 2 ) = 3.0D4
+ at( 3 ) = 1.0D0
+
+ call ast_trann( m, 1, 3, 1, at, 1, 3, 1, bt, status )
+
+ if( abs( bt(1)-1.14159265D0) .gt. 1.0D-6 ) then
+ write(*,*) bt(1)-1.14159265D0
+ call stopit(6,status)
+ end if
+ if( bt(2) .ne. 3.0D4 ) call stopit(7,status)
+ if( abs( bt(3)-4.14159265D0) .gt. 1.0D-6 ) call stopit(8,status)
+
+
+
+
+* Test adjacent identical NormMaps are simplified to a single NormMap.
+ m2 = ast_cmpmap( ast_cmpmap( m, ast_copy( m, status ), .true.,
+ : ' ', status ),
+ : ast_cmpmap( m, ast_copy( m, status ), .true.,
+ : ' ', status ), .true., ' ', status )
+ m3 = ast_simplify( m2, status )
+ if( .not. ast_isanormmap( m3, status ) ) call stopit( 9, status )
+
+* Test NormMap that encapsulate a basic Frame are simplified to a UnitMap.
+ m = ast_normmap( ast_frame(2, ' ', status ), ' ', status )
+ m2 = ast_simplify( m, status )
+ if( .not. ast_isaunitmap( m2, status ) ) call stopit( 10, status )
+
+
+
+
+
+ call ast_end( status )
+
+ call ast_flushmemory( 1 )
+
+ if( status .eq. sai__ok ) then
+ write(*,*) 'All NormMap tests passed'
+ else
+ write(*,*) 'NormMap tests failed'
+ end if
+
+ end
+
+
+ subroutine stopit( i, status )
+ implicit none
+ include 'SAE_PAR'
+ integer i, status
+ if( status .eq. sai__ok ) then
+ write( *,* ) 'Error ',i
+ status = sai__error
+ end if
+ end
diff --git a/ast/ast_tester/testobject.c b/ast/ast_tester/testobject.c
new file mode 100644
index 0000000..c1c1972
--- /dev/null
+++ b/ast/ast_tester/testobject.c
@@ -0,0 +1,120 @@
+#include "ast.h"
+#include <stdio.h>
+#include <string.h>
+
+int main(){
+ const char *routine;
+ const char *file;
+ int i;
+ int line;
+ char *pickle1;
+ char *pickle2;
+ AstSkyFrame *sf = astSkyFrame( " " );
+ AstFrame *bf = astFrame( 2, "Domain=SKY" );
+ AstFrameSet *fs = astConvert( bf, sf, " " );
+ AstKeyMap *km;
+ void *p;
+
+ if( fs ) {
+ pickle1 = astToString( fs );
+ AstFrameSet *fs2 = astFromString( pickle1 );
+ pickle2 = astToString( fs2 );
+ if( pickle1 && pickle2 ) {
+ if( strcmp( pickle1, pickle2 ) && astOK ) {
+ astError( AST__INTER, "Error 1\n" );
+ }
+ } else if( astOK ) {
+ astError( AST__INTER, "Error 2\n" );
+ }
+
+
+ pickle1 = astFree( pickle1 );
+ pickle2 = astFree( pickle2 );
+
+ if( fs2 && !astEqual( fs, fs2 ) && astOK ) {
+ astError( AST__INTER, "Error 3\n" );
+ }
+
+ astCreatedAt( bf, &routine, &file, &line );
+ if( ( !routine || strcmp( routine, "main" ) ) && astOK ) {
+ astError( AST__INTER, "Error 31\n" );
+ }
+ if( ( !file || strcmp( file, "testobject.c" ) ) && astOK ) {
+ astError( AST__INTER, "Error 32\n" );
+ }
+ if( line != 13 && astOK ) {
+ astError( AST__INTER, "Error 33 (line is %d)\n", line );
+ }
+
+
+ km = astActiveObjects( NULL, 0, 0 );
+ if( !km && astOK ) {
+ astError( AST__INTER, "Error 34\n" );
+ } else {
+ int nkey = astMapSize( km );
+ if( nkey != 3 && astOK ) {
+ astError( AST__INTER, "Error 35 (nkey is %d)\n", nkey );
+ }
+
+ astSetC( km, "SortBy", "KeyUp" );
+ for( i=0; i < 3; i++ ){
+ const char *key = astMapKey( km, i );
+ if( i == 0 ) {
+ if( strcmp( key, "Frame" ) && astOK ) {
+ astError( AST__INTER, "Error 36 (key 0 is '%s')\n", key );
+ } else if( astMapLength(km,key) != 1 && astOK ) {
+ astError( AST__INTER, "Error 361 (%d)\n", astMapLength(km,key) );
+ } else if( ( !astMapGetElemP( km, key, 0, &p ) || ( p != bf ) ) && astOK ) {
+ astError( AST__INTER, "Error 362\n" );
+ } else {
+ astCreatedAt( p, &routine, &file, &line );
+ if( ( !routine || strcmp( routine, "main" ) ) && astOK ) {
+ astError( AST__INTER, "Error 363\n" );
+ }
+ if( ( !file || strcmp( file, "testobject.c" ) ) && astOK ) {
+ astError( AST__INTER, "Error 364\n" );
+ }
+ if( line != 13 && astOK ) {
+ astError( AST__INTER, "Error 365 (line is %d)\n", line );
+ }
+ }
+ } else if( i == 1 ) {
+ if( strcmp( key, "FrameSet" ) && astOK ) {
+ astError( AST__INTER, "Error 37 (key 1 is '%s')\n", key );
+ } else if( astMapLength(km,key) != 2 && astOK ) {
+ astError( AST__INTER, "Error 371 (%d)\n", astMapLength(km,key) );
+ } else if( ( !astMapGetElemP( km, key, 1, &p ) || ( p != fs2 ) ) && astOK ) {
+ astError( AST__INTER, "Error 372\n" );
+ } else {
+ astCreatedAt( p, &routine, &file, &line );
+ if( ( !routine || strcmp( routine, "main" ) ) && astOK ) {
+ astError( AST__INTER, "Error 373\n" );
+ }
+ if( ( !file || strcmp( file, "testobject.c" ) ) && astOK ) {
+ astError( AST__INTER, "Error 374\n" );
+ }
+ if( line != 20 && astOK ) {
+ astError( AST__INTER, "Error 375 (line is %d)\n", line );
+ }
+ }
+ } else {
+ if( strcmp( key, "SkyFrame" ) && astOK ) {
+ astError( AST__INTER, "Error 38 (key 2 is '%s')\n", key );
+ } else if( astMapLength(km,key) != 1 && astOK ) {
+ astError( AST__INTER, "Error 381 (%d)\n", astMapLength(km,key) );
+ }
+ }
+ }
+ }
+ km = astAnnul( km );
+
+ } else if( astOK ){
+ astError( AST__INTER, "Error 4\n" );
+ }
+
+ if( astOK ) {
+ printf(" All Object tests passed\n");
+ } else {
+ printf("Object tests failed\n");
+ }
+}
diff --git a/ast/ast_tester/testplot3d.f b/ast/ast_tester/testplot3d.f
new file mode 100644
index 0000000..66a6858
--- /dev/null
+++ b/ast/ast_tester/testplot3d.f
@@ -0,0 +1,1357 @@
+ program testplot3d
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+
+ integer fset, plot3d, status, pgbeg
+ real gbox(6), lbnd(3), ubnd(3)
+ double precision bbox(6)
+ integer readtest
+ logical ok, pg3d_autocamera
+ character device*30
+
+ status = sai__ok
+
+c call ast_watchmemory( 130836 )
+ call ast_begin( status )
+
+ lbnd( 1 ) = -1.0
+ lbnd( 2 ) = -1.0
+ lbnd( 3 ) = -1.0
+ ubnd( 1 ) = 1.0
+ ubnd( 2 ) = 1.0
+ ubnd( 3 ) = 1.0
+
+ if( iargc() .gt. 0 ) then
+ call getarg( 1, device )
+ else
+ device = '/XSERVE'
+ end if
+ ok = ( pgbeg( 0, device, 1, 1 ) .eq. 1 )
+
+ if( .not. ok ) write(*,*) 'PGPLOT OPEN FIALED'
+
+ call pgask( .false. )
+
+ call pgpage
+ call pgwnad( 0.0, 1.0, 0.0, 1.0 )
+
+ ok = pg3d_autocamera( lbnd, ubnd )
+c
+ gbox(1) = lbnd(1)
+ gbox(2) = lbnd(2)
+ gbox(3) = lbnd(3)
+ gbox(4) = ubnd(1)
+ gbox(5) = ubnd(2)
+ gbox(6) = ubnd(3)
+
+ bbox(1) = -1.0
+ bbox(2) = -1.0
+ bbox(3) = -1.0
+ bbox(4) = 1.0
+ bbox(5) = 1.0
+ bbox(6) = 1.0
+
+ plot3d = ast_plot3d( AST__NULL, gbox, bbox, 'minticklen=0',
+ : status )
+ call checkdump( plot3d, 'CheckDump test 1', status )
+ call ast_annul( plot3d, status )
+ bbox(1) = 0.5
+ bbox(2) = 0.5
+ bbox(3) = 0.5
+ bbox(4) = 155.5
+ bbox(5) = 107.5
+ bbox(6) = 1640.5
+ plot3d = ast_plot3d( readtest( "plot3d-test1.ast", status ), gbox,
+ : bbox, ' ' , status )
+c call checkdump( plot3d, 'CheckDump test 2', status )
+c call ast_set( plot3d, "System(1)=galactic,system(3)=freq",
+c : status )
+c call ast_grid( plot3d, status )
+ call explore( plot3d, status )
+ call pgend
+ call ast_end( status )
+ call ast_activememory( 'testplot3d' )
+ call ast_flushmemory( 1 )
+
+ if( status .eq. sai__ok ) then
+ write(*,*) 'All Plot3D tests passed'
+ else
+ write(*,*) 'Plot3D tests failed'
+ end if
+
+ end
+
+ subroutine checkdump( obj, text, status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ character text*(*)
+ integer obj, status, next, end, ch, result, ll, overlap
+ external mysource, mysink, mysink2
+ character buf*400000,buf2*400000
+ common /ss1/ buf
+ common /ss2/ next, end, ll
+ common /ss3/ buf2
+ if( status .ne. sai__ok ) return
+ call ast_begin( status )
+ ch = ast_channel( mysource, mysink, ' ', status )
+ ll = 200
+ next = 1
+ if( ast_write( ch, obj, status ) .ne.1 ) then
+ write(*,*) text
+ call stopit( status, 'Cannot write supplied object to '//
+ : 'channel' )
+ end if
+ next = 1
+ result = ast_read( ch, status )
+ if( result .eq. ast__null ) then
+ write(*,*) text
+ call stopit( status, 'Cannot read object from channel' )
+ end if
+
+ ll = 200
+ next = 1
+ ch = ast_channel( AST_NULL, mysink2, ' ', status )
+ if( ast_write( ch, obj, status ) .ne.1 ) then
+ write(*,*) text
+ call stopit( status, 'Cannot write copied object to '//
+ : 'channel' )
+ end if
+ if( buf .ne. buf2 ) then
+ call ast_Show( obj, status )
+ call ast_Show( result, status )
+ write(*,*) text
+ call stopit( status, 'Object has changed' )
+ end if
+ call ast_end( status )
+ end
+ subroutine mysource( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ integer status, next, end, ll
+ character buf*400000
+ common /ss1/ buf
+ common /ss2/ next, end, ll
+ if( status .ne. sai__ok ) return
+ if( next .ge. end ) then
+ call ast_putline( buf, -1, status )
+ else
+ call ast_putline( buf( next : ), ll, status )
+ endif
+ next = next + ll
+ end
+ subroutine mysink( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ integer status, next, end, f, l, ll
+ character buf*400000
+ character line*1000
+ common /ss1/ buf
+ common /ss2/ next, end, ll
+ if( status .ne. sai__ok ) return
+ line = ' '
+ call ast_getline( line, l, status )
+ call chr_fandl( line( : l ), f, l )
+ buf( next : ) = line( f : l )
+ l = l - f + 1
+ if( next + ll - 1 .ge. 400000 ) then
+ write(*,*)
+ call stopit( status, 'Buffer overflow in mysink!!' )
+ else if( l .gt. ll ) then
+ write(*,*)
+ write(*,*) line( f : l )
+ write(*,*) 'Line length ',l
+ call stopit( status, 'Line overflow in mysink!!' )
+ else
+ end = next + l
+ buf( end : next + ll - 1 ) = ' '
+ endif
+ next = next + ll
+ end
+ subroutine mysink2( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ integer status, next, end, f, l, ll
+ character buf2*400000
+ character line*1000
+ common /ss3/ buf2
+ common /ss2/ next, end, ll
+ if( status .ne. sai__ok ) return
+ line = ' '
+ call ast_getline( line, l, status )
+ call chr_fandl( line( : l ), f, l )
+ buf2( next : ) = line( f : l )
+ l = l - f + 1
+ if( next + ll - 1 .ge. 400000 ) then
+ write(*,*)
+ call stopit( status, 'Buffer overflow in mysink2!!' )
+ else if( l .gt. ll ) then
+ write(*,*)
+ write(*,*) buf2( next : next + l)
+ write(*,*) 'Line length ',l
+ call stopit( status, 'Line overflow in mysink2!!' )
+ else
+ end = next + l
+ buf2( end : next + ll - 1 ) = ' '
+ endif
+ next = next + ll
+ end
+
+ subroutine stopit( status, text )
+ implicit none
+ include 'SAE_PAR'
+ integer status
+ character text*(*)
+ if( status .ne. sai__ok ) return
+ status = sai__error
+ write(*,*) text
+ end
+
+ integer function readtest( name, status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ character name*(*)
+ integer status, ch
+ external mysource3
+ readtest = AST__NULL
+ if( status .ne. sai__ok ) return
+ open( unit=1, file=name, status='old' )
+ ch = ast_channel( mysource3, ast_null, ' ', status )
+ readtest = ast_read( ch, status )
+ call ast_annul( ch, status )
+ close(1)
+ end
+
+ subroutine mysource3( status )
+ integer status
+ character buffer*200
+ read( 1, '(A)', end = 99 ) buffer
+ call ast_putline( buffer, len( buffer ), status )
+ return
+ 99 call ast_putline( buffer, -1, status )
+
+ end
+
+
+ subroutine explore( plot3d, status )
+ implicit none
+ include 'AST_PAR'
+ include 'SAE_PAR'
+
+ real common_par
+ integer common_map
+ logical use_common
+ double precision common_x, common_y
+ common /ss4/ common_par,common_x,common_y,common_map,use_common
+
+ real pi
+ parameter( pi = 3.1415927 )
+ integer diag, plot3d, status, iopt, i, iclose
+ logical more, draw, ok, pg3d_findnearest, lval, pg3d_seteye,
+ : pg3d_setup
+ character settings*40, attr*20, corn(8)*3, text*40,just*4
+ real xc(8), yc(8), zc(8)
+ double precision pos(3),x,y
+ real up(3), eye(3)
+ integer type, map
+ integer readtest
+ data xc /-1, 1, -1, 1, -1, 1, -1, 1 /
+ data yc /-1, -1, 1, 1, -1, -1, 1, 1 /
+ data zc /-1, -1, -1, -1, 1, 1, 1, 1 /
+ data corn/ 'lll', 'ull', 'lul', 'uul',
+ : 'llu', 'ulu', 'luu', 'uuu' /
+ if( status .ne. sai__ok ) return
+ eye( 1 ) = -3
+ eye( 2 ) = 4
+ eye( 3 ) = 3
+ ok = pg3d_seteye( eye )
+ up( 1 ) = 0.0
+ up( 2 ) = -0.03
+ up( 3 ) = 1.0
+ ok = pg3d_setup( up )
+ diag = 1
+ common_x = AST__BAD
+ common_y = AST__BAD
+ common_map = AST__NULL
+ use_common = .false.
+
+ call drawit( diag, plot3d, status )
+ more = .true.
+ do while( more )
+
+ write(*,*) ' 0 - exit'
+ write(*,*) ' 1 - move forward'
+ write(*,*) ' 2 - move backwards'
+ write(*,*) ' 3 - rotate right'
+ write(*,*) ' 4 - rotate left'
+ write(*,*) ' 5 - rotate up'
+ write(*,*) ' 6 - rotate down'
+ write(*,*) ' 7 - rotate right continuous'
+ write(*,*) ' 8 - set attribute values'
+ write(*,*) ' 9 - get an attribute value'
+ write(*,*) ' 10 - clear an attribute value'
+ write(*,*) ' 11 - test an attribute value'
+ write(*,*) ' 12 - show the plot3d (big!)'
+ write(*,*) ' 13 - Draw a border'
+ write(*,*) ' 14 - Draw a marker'
+ write(*,*) ' 15 - Draw a text string'
+ write(*,*) ' 16 - Draw az-el diagram'
+ write(*,*) ' 17 - Draw grid-box diagram'
+ write(*,*) ' 18 - Vary parameter continuously'
+ write(*,*) ' 19 - Next figure'
+ write(*,*) ' 20 - Set Mapping'
+ write(*,*) ' 21 - Mark mapped position'
+ write(*,'(A,$)' ) 'Option: '
+ read(*,*) iopt
+
+ draw = .true.
+ if( iopt .eq. 0 ) then
+ draw = .false.
+ more = .false.
+ else if( iopt .eq. 1 ) then
+ call pg3d_forward( 0.1 )
+ else if( iopt .eq. 2 ) then
+ call pg3d_forward( -0.1 )
+ else if( iopt .eq. 3 ) then
+ call pg3d_rotateeye( 4, 7.0 )
+ else if( iopt .eq. 4 ) then
+ call pg3d_rotateeye( 3, 7.0 )
+ else if( iopt .eq. 5 ) then
+ call pg3d_rotateeye( 1, 7.0 )
+ else if( iopt .eq. 6 ) then
+ call pg3d_rotateeye( 2, 7.0 )
+ else if( iopt .eq. 7 ) then
+ do i = 0, 360, 7
+ call pg3d_rotateeye( 4, 7.0 )
+ call pgpage
+ call drawit( diag, plot3d, status )
+ call pause
+ end do
+ draw = .false.
+ else if( iopt .eq. 8 ) then
+ write( *, '(A,$)' ) 'Attribute settings: '
+ read( *, '(A)' ) settings
+ call ast_set( plot3d, settings, status )
+ else if( iopt .eq. 9 ) then
+ write( *, '(A,$)' ) 'Attribute name to get: '
+ read( *, '(A)' ) attr
+ write(*,*) ast_getc( plot3d, attr, status )
+ draw = .false.
+ else if( iopt .eq. 10 ) then
+ write( *, '(A,$)' ) 'Attribute name to clear: '
+ read( *, '(A)' ) attr
+ call ast_clear( plot3d, attr, status )
+ else if( iopt .eq. 11 ) then
+ write( *, '(A,$)' ) 'Attribute name to test: '
+ read( *, '(A)' ) attr
+ write(*,*) ast_test( plot3d, attr, status )
+ draw = .false.
+ else if( iopt .eq. 12 ) then
+ call ast_show( plot3d, status )
+ draw = .false.
+ else if( iopt .eq. 13 ) then
+ lval = ast_border( plot3d, status )
+ draw = .false.
+ else if( iopt .eq. 14 ) then
+ write(*,'(A,$)') 'Marker X coord: '
+ read(*,*) pos(1)
+ write(*,'(A,$)') 'Marker Y coord: '
+ read(*,*) pos(2)
+ write(*,'(A,$)') 'Marker Z coord: '
+ read(*,*) pos(3)
+ write(*,'(A,$)') 'Marker type: '
+ read(*,*) type
+ call ast_mark( plot3d, 1, 3, 1, pos, type, status )
+ draw = .false.
+ else if( iopt .eq. 15 ) then
+ write(*,'(A,$)') 'Text X coord: '
+ read(*,*) pos(1)
+ write(*,'(A,$)') 'Text Y coord: '
+ read(*,*) pos(2)
+ write(*,'(A,$)') 'Text Z coord: '
+ read(*,*) pos(3)
+ write(*,'(A,$)') 'Text: '
+ read(*,*) text
+ write(*,'(A,$)') 'Justification: '
+ read(*,*) just
+ write(*,'(A,$)') 'Up X: '
+ read(*,*) up(1)
+ write(*,'(A,$)') 'Up Y: '
+ read(*,*) up(2)
+ write(*,'(A,$)') 'Up Z: '
+ read(*,*) up(3)
+ call ast_text( plot3d, text, pos, up, just, status )
+ draw = .false.
+ else if( iopt .eq. 16 ) then
+ diag = 2
+ else if( iopt .eq. 17 ) then
+ diag = 1
+ else if( iopt .eq. 18 ) then
+ use_common = .true.
+ do i = 0, 90, 1
+ common_par = pi*i/180.0;
+ call pgpage
+ call drawit( diag, plot3d, status )
+ call pause
+ end do
+ draw = .false.
+ use_common = .false.
+ else if( iopt .eq. 19 ) then
+ diag = diag + 1
+ write(*,*) 'Drawing diag ',diag
+
+ else if( iopt .eq. 20 ) then
+ write(*,'(A,$)') 'Supply a 2-in, 2-out Mapping (outputs '//
+ : 'are (long,lat)):'
+ read(*,*) text
+ common_map = readtest( text, status )
+ draw = .false.
+
+ else if( iopt .eq. 21 ) then
+ write(*,'(A,$)') 'Value for input 1: '
+ read(*,*) common_x
+ write(*,'(A,$)') 'Value for input 2: '
+ read(*,*) common_y
+
+ else
+ draw = .false.
+ write(*,*) 'Bad option ',iopt
+ end if
+
+ if( draw ) then
+ call pgpage
+c ok = pg3d_findnearest( 8, xc, yc, zc, iclose )
+c call ast_setc( plot3d, 'RootCorner', corn( iclose + 1 ),
+c : status )
+ call drawit( diag, plot3d, status )
+ end if
+
+ if( status .ne. sai__ok ) call err_flush( status )
+ end do
+
+ end
+
+ subroutine pause
+ implicit none
+ integer i
+ double precision a
+ a = 1.0D0
+ do i = 1, 2000000
+ a = tan( a )
+ end do
+ end
+
+ subroutine drawit( diag, plot3d, status )
+ implicit none
+ include 'AST_PAR'
+ include 'SAE_PAR'
+ integer NP
+ parameter ( NP = 50 )
+ integer w1, w2
+ real rd, pi
+ parameter( w1 = 6, w2 = 3, rd = 1.5, pi = 3.1415927 )
+
+ real common_par
+ integer common_map
+ logical use_common
+ double precision common_x, common_y
+ common /ss4/ common_par,common_x,common_y,common_map,use_common
+
+ double precision dlat, dlon, up, north
+ integer diag, plot3d, status, i, j, azelmap
+ real x(NP), y(NP), z(NP), axlen, a1, a2, r(3), u(3), n(3),
+ : ang, k, cen(3), norm(3), start(3), lon, lat, origin(3),
+ : theta,phi
+ if( status .ne. sai__ok ) return
+
+ if( diag .eq. 1 ) then
+ call ast_grid( plot3d, status )
+
+ else
+ axlen = 1.8
+ a1 = 0.1
+ a2 = a1*0.6
+ lon = pi*210.0/180.0
+ if( use_common ) then
+ lat = common_par
+ else
+ lat = pi*25.0/180.0
+ endif
+
+ do while( lat .gt. pi )
+ lat = lat - 2*pi
+ end do
+
+ do while( lat .lt. -pi )
+ lat = lat + 2*pi
+ end do
+
+ if( lat .gt. pi/2 ) then
+ lat = pi - lat
+ lon = lon + pi
+
+ else if( lat .lt. -pi/2 ) then
+ lat = -pi - lat
+ lon = lon + pi
+ end if
+
+ do while( lon .gt. 2*pi )
+ lon = lon - 2*pi
+ end do
+
+ do while( lon .lt. 0 )
+ lon = lon + 2*pi
+ end do
+
+
+c+ Fig1 (part a)
+ if( diag .eq. 2 ) then
+ call pgslw( w2 )
+ cen(1) = 0.0
+ cen(2) = 0.0
+ cen(3) = 0.0
+ call s2c( lon - pi/2, 0.0, 1.0, norm )
+ call s2c( lon, 0.0, rd*0.6, start )
+ call pgsci( 10 )
+ call pgscr( 10, 0.0, 0.0, 1.0 )
+ call arc( cen, norm, start, -lat, -rd*0.1 )
+
+ u(1)=0
+ u(2)=0
+ u(3)=1
+ call s2c( lon, lat/2.2, rd*0.7, r )
+ call g3dtext( 'el', r, 'CL', u, norm )
+
+ norm(1)=0
+ norm(2)=0
+ norm(3)=-1
+ start(1)=rd*0.6
+ start(2)=0
+ start(3)=0
+ call arc( cen, norm, start, lon, rd*0.1 )
+
+ call s2c( 110.0/180.0*PI, 0.0, rd*0.7, r )
+ call g3dtext( 'az', r, 'TC', r, norm )
+
+ call pgsci( 1 )
+ endif
+
+ origin(1) = 0.0
+ origin(2) = 0.0
+ origin(3) = 0.0
+ call axes( origin, axlen, '(north) u', '(east) v',
+ : '(zenith) w', w1, w2, 'X', 0.0, 0.0, 0.0 )
+
+* Quadrant from (0,0,1) to (-1,0,0)
+ cen(1) = 0.0
+ cen(2) = 0.0
+ cen(3) = 0.0
+ call s2c( (int(2*lon/pi)-1)*pi/2, 0.0, 1.0, norm )
+ start(1) = 0.0
+ start(2) = 0.0
+ start(3) = rd
+ call pgslw( w2 )
+ call arc( cen, norm, start, pi/2, 0.0 )
+
+* Quadrant from (0,0,1) to (0,-1,0)
+ call s2c( int(2*lon/pi)*pi/2, 0.0, 1.0, norm )
+ call arc( cen, norm, start, pi/2, 0.0 )
+
+* Quadrant from (-1,0,0) to (0,-1,0)
+ norm(1) = 0.0
+ norm(2) = 0.0
+ norm(3) = 1.0
+ call s2c( (int(2*lon/pi)+1)*pi/2, 0.0, rd, start )
+ call arc( cen, norm, start, pi/2, 0.0 )
+
+* Dashed red quadrant at az = lon degs
+ call s2c( lon-pi/2, 0.0, 1.0, norm )
+ start(1) = 0.0
+ start(2) = 0.0
+ start(3) = rd
+ call pgsci( 10 )
+ call pgscr( 10, 1.0, 0.0, 0.0 )
+ call pgsls( 2 )
+ call pgslw( 2 )
+ call arc( cen, norm, start, pi/2, 0.0 )
+
+* Dashed red line of latitude at el = lat degs
+ cen(1) = 0.0
+ cen(2) = 0.0
+ cen(3) = sin(lat)*rd
+ norm(1) = 0.0
+ norm(2) = 0.0
+ norm(3) = 1.0
+ call s2c( (int(2*lon/pi)+1)*pi/2, lat, rd, start )
+ call arc( cen, norm, start, pi/2, 0.0 )
+
+* Dashed red line from centre to az=lon el=0
+ x( 1 ) = 0.0
+ y( 1 ) = 0.0
+ z( 1 ) = 0.0
+ x( 2 ) = cos(lon)*rd
+ y( 2 ) = sin(lon)*rd
+ z( 2 ) = 0.0
+ call g3dline( 2, x, y, z )
+
+* Solid red line from centre to az=210 el=45
+ x( 1 ) = 0.0
+ y( 1 ) = 0.0
+ z( 1 ) = 0.0
+ call s2c( lon, lat, rd, origin )
+ x( 2 ) = origin(1)
+ y( 2 ) = origin(2)
+ z( 2 ) = origin(3)
+ call pgsls( 1 )
+ call g3dline( 2, x, y, z )
+
+c+ Fig1 - (part b)
+ if( diag .eq. 2 ) then
+ call pgscr( 10, 0.0, 0.6, 0.0 )
+ call s2c( lon, lat, rd, origin )
+ call axes( origin, 0.2*axlen, 'daz', 'del', ' ', w1, w2,
+ : 'ZYZ', lon, (pi/2 - lat), pi/2 )
+ endif
+
+
+c+ Fig2
+ if( diag .eq. 3 ) then
+ call pgscr( 10, 0.6, 0.6, 0.0 )
+ call s2c( lon, lat, rd, origin )
+ call axes( origin, 0.4*axlen, 'UP', 'N', ' ', w1, w2,
+ : 'ZYZ', lon, (pi/2 - lat), lat )
+
+
+ call pgscr( 10, 0.0, 0.0, 1.0 )
+ call s2c( lon+0.22, lat, rd, start )
+ call s2c( lon, lat, rd, cen )
+ call s2c( lon, lat, rd, norm )
+ call arc( cen, norm, start, -(lat-0.05), -rd*0.02 )
+
+ call s2c( lon+0.25, lat*1.1, rd, r )
+ norm(1) = 0
+ norm(2) = 0
+ norm(3) = 0
+ u(1) = 0
+ u(2) = 0
+ u(3) = 1.0
+ call g3dtext( 'el', r, 'CR', u, norm )
+
+ endif
+
+
+c+ Fig3
+ if( diag .eq. 4 ) then
+ call pgscr( 10, 0.0, 0.0, 1.0 )
+ call s2c( lon, lat, rd, origin )
+ do i = 1, 4
+ theta = i*5.0*pi/180.0
+ cen(1) = cos(theta)*origin(1)
+ cen(2) = cos(theta)*origin(2)
+ cen(3) = cos(theta)*origin(3)
+ call s2c( lon + theta, lat, rd, start )
+ call arc( cen, cen, start, 2*pi, 0.05 )
+ end do
+
+
+ cen(1)=0
+ cen(2)=0
+ cen(3)=0
+
+ call s2c( pi, pi/2-pi/2, rd, start )
+ call s2c( pi+pi/2, 0.0, 1.0, norm )
+
+ call rotvec( 'ZYZ', lon, pi/2-lat, lat, norm )
+ call rotvec( 'ZYZ', lon, pi/2-lat, lat, start )
+ call arc( cen, norm, start, pi/2, 0.0 )
+
+
+ call pgscr( 10, 0.0, 1.0, 1.0 )
+ call s2c( lon, lat, rd, origin )
+ call axes( origin, 0.2*axlen, 'y', 'x', ' ', w1, w2,
+ : 'ZYZ', lon, (pi/2 - lat), lat )
+ endif
+
+
+c+ Fig4
+ if( diag .eq. 5 ) then
+ call pgscr( 10, 0.0, 0.0, 1.0 )
+ call s2c( lon, lat, rd, origin )
+ do i = 1, 4
+ theta = i*5.0*pi/180.0
+ cen(1) = cos(theta)*origin(1)
+ cen(2) = cos(theta)*origin(2)
+ cen(3) = cos(theta)*origin(3)
+ call s2c( lon + theta, lat, rd, start )
+ call arc( cen, cen, start, 2*pi, 0.05 )
+ end do
+
+
+ cen(1)=0
+ cen(2)=0
+ cen(3)=0
+
+ call s2c( pi, pi/2-pi/2, rd, start )
+ call s2c( pi+pi/2, 0.0, 1.0, norm )
+
+ call rotvec( 'ZYZ', lon, pi/2-lat, lat, norm )
+ call rotvec( 'ZYZ', lon, pi/2-lat, lat, start )
+ call arc( cen, norm, start, pi/2, 0.0 )
+
+
+ call pgscr( 10, 0.0, 1.0, 1.0 )
+ call s2c( lon, lat, 0.0, origin )
+ call axes( origin, rd, 'b', 'a', 'c', w1, w2,
+ : 'ZYZ', lon, (pi/2 - lat), pi/2 + lat )
+ endif
+
+c+ Fig5
+ if( diag .eq. 6 ) then
+ call pgscr( 10, 0.0, 1.0, 1.0 )
+ call s2c( lon, lat, 0.0, origin )
+ call axes( origin, rd, 'b', 'a', 'c', w1, w2,
+ : 'ZYZ', lon, (pi/2 - lat), pi/2 + lat )
+
+
+ call pgscr( 10, 0.0, 0.0, 1.0 )
+ call axes( origin, rd, 'b''', 'a''', 'c''', w1, w2,
+ : 'ZYZ', lon, (pi/2 - lat), pi/2 )
+
+ call pgsci( 1 )
+ call s2c( lon, lat, 1.0, norm )
+ start(1) = 0.0
+ start(2) = 0.0
+ start(3) = rd*0.5
+ call s2c( lon, lat, 0.0, cen )
+ call arc( cen, norm, start, -lat, 0.0 )
+
+ call pgsci( 1 )
+ call s2c( 0.5*( lon - pi/2), lat/2+0.2, rd*0.55, r )
+ norm(1) = 0
+ norm(2) = 0
+ norm(3) = 0
+ u(1) = 0
+ u(2) = 0
+ u(3) = 1.0
+ call g3dtext( 'el', r, 'CR', u, norm )
+ endif
+
+c+ Fig6
+ if( diag .eq. 7 ) then
+ call s2c( lon, lat, 0.0, origin )
+
+ call pgscr( 10, 0.0, 0.0, 1.0 )
+ call axes( origin, rd, 'b''', 'a''', 'c''', w1, w2,
+ : 'ZYZ', lon, (pi/2 - lat), pi )
+
+ call pgscr( 10, 0.0, 1.0, 0.0 )
+ call axes( origin, rd, 'b''''', 'a''''', 'c''''', w1, w2,
+ : 'ZYZ', lon, 0.0, pi )
+
+ endif
+
+
+
+
+
+ if( diag .eq. 8 ) then
+ call pgscr( 10, 0.0, 1.0, 1.0 )
+ call s2c( lon, lat, 0.0, origin )
+ call axes( origin, rd, 'a', 'b', 'c', w1, w2,
+ : 'ZYZ', 0.0, 0.0, 0.0 )
+ end if
+
+ if( diag .eq. 9 ) then
+ call pgscr( 10, 0.0, 1.0, 1.0 )
+ call s2c( lon, lat, 0.0, origin )
+ call axes( origin, rd, 'a', 'b', 'c', w1, w2,
+ : 'ZYZ', lon, 0.0, 0.0 )
+ end if
+
+ if( diag .eq. 10 ) then
+ call pgscr( 10, 0.0, 1.0, 1.0 )
+ call s2c( lon, lat, 0.0, origin )
+ call axes( origin, rd, 'a', 'b', 'c', w1, w2,
+ : 'ZYZ', lon, pi/2-lat, 0.0 )
+ end if
+
+ if( diag .eq. 11 ) then
+ call pgscr( 10, 0.0, 1.0, 1.0 )
+ call s2c( lon, lat, 0.0, origin )
+ call axes( origin, rd, 'a', 'b', 'c', w1, w2,
+ : 'ZYZ', lon, pi/2-lat, lat )
+ end if
+
+
+
+
+
+
+
+
+
+
+
+c if( common_map .ne. AST__NULL .and.
+c ; common_x .ne. AST__BAD .and.
+c : common_y .ne. AST__BAD ) then
+c call ast_tran2( common_map, 1, common_x, common_y, .true.,
+c : dlon, dlat, status )
+c call s2c( real(dlon), real(dlat), rd, cen )
+c call pgsci( 10 )
+c call pgscr( 10, 1.0, 0.0, 1.0 )
+c call g3dmark( cen, 2 )
+c end if
+
+ call pgsci( 1 )
+ call pgslw( 4 )
+ call pgsls( 1 )
+
+ end if
+
+ end
+
+ subroutine arc( cen, normal, start, ang, arrow )
+ implicit none
+ real cen(3), normal(3), start(3), ang, arrow, ut(3), ur(3)
+ integer np
+ parameter( NP = 50 )
+ integer i
+ real v1(3), v2( 3 ), v1l, v2l, x(NP), y(NP), z(NP), a, ca, sa,
+ : t1(3), t2(3), n(3)
+ call copy( normal, n )
+ call norm( n )
+ call sub( start, cen, v1 )
+ call cross( n, v1, t1 )
+ call cross( t1, n, v1 )
+ call mod( v1, v1l )
+ call cross( v1, n, v2 )
+ call mod( v2, v2l )
+ do i = 1, 3
+ v1( i ) = v1(i)/v1l
+ v2( i ) = v2(i)/v2l
+ end do
+
+ do i = 1, NP
+ a = ang*( i - 1 )/( NP - 1 )
+ ca = cos(a)
+ sa = sin(a)
+ x(i) = v1l*( v1(1)*ca + v2(1)*sa ) + cen(1)
+ y(i) = v1l*( v1(2)*ca + v2(2)*sa ) + cen(2)
+ z(i) = v1l*( v1(3)*ca + v2(3)*sa ) + cen(3)
+ end do
+ call g3dline( NP, x, y, z )
+ if( arrow .ne. 0.0 ) then
+ ca = cos(ang)
+ sa = sin(ang)
+ do i = 1, 3
+ ut(i) = sa*v1(i)-ca*v2(i)
+ ur(i) = ca*v1(i)+sa*v2(i)
+ end do
+ x(1) = x(NP) + arrow*( ut(1) - 0.5*ur(1) )
+ y(1) = y(NP) + arrow*( ut(2) - 0.5*ur(2) )
+ z(1) = z(NP) + arrow*( ut(3) - 0.5*ur(3) )
+ x(2) = x(NP)
+ y(2) = y(NP)
+ z(2) = z(NP)
+ x(3) = x(NP) + arrow*( ut(1) + 0.5*ur(1) )
+ y(3) = y(NP) + arrow*( ut(2) + 0.5*ur(2) )
+ z(3) = z(NP) + arrow*( ut(3) + 0.5*ur(3) )
+ call g3dline( 3, x, y, z )
+ end if
+ end
+ subroutine s2c( lon, lat, r, p )
+ implicit none
+ real lon, lat, r, p(3), k
+ p( 3 ) = r*sin(lat)
+ k = r*cos(lat)
+ p( 1 ) = k*cos(lon)
+ p( 2 ) = k*sin(lon)
+ end
+
+ subroutine axes( origin, axlen, tx, ty, tz, w1, w2, order, phi,
+ : theta, psi )
+ implicit none
+ character order*(*),tx*(*), ty*(*), tz*(*)
+ real phi, theta, psi
+ double precision rmat(3,3),va,vb
+ real axlen, a1, a2, mat(3,3),x(10),y(10),z(10),r(3),u(3),n(3),
+ : origin(3), sn
+ integer w1, w2
+ a1 = 0.05
+ a2 = a1*0.6
+ sn = 0.0
+ call deuler( order, dble(phi), dble(theta), dble(psi), rmat )
+ mat(1,1) = rmat(1,1)
+ mat(1,2) = rmat(1,2)
+ mat(1,3) = rmat(1,3)
+ mat(2,1) = rmat(2,1)
+ mat(2,2) = rmat(2,2)
+ mat(2,3) = rmat(2,3)
+ mat(3,1) = rmat(3,1)
+ mat(3,2) = rmat(3,2)
+ mat(3,3) = rmat(3,3)
+cc* X axis with arrow and label
+ if( tx .ne. ' ' ) then
+ x(1) = axlen
+ y(1) = 0.0
+ z(1) = 0.0
+ x(2) = -axlen
+ y(2) = 0.0
+ z(2) = 0.0
+ call mxv( mat, 2, x, y, z, origin )
+ call pgslw( w1 )
+ call g3dline( 2, x, y, z )
+ x(1) = axlen - a1
+ y(1) = -a2
+ z(1) = 0.0
+ x(2) = axlen
+ y(2) = 0.0
+ z(2) = 0.0
+ x(3) = axlen - a1
+ y(3) = a2
+ z(3) = 0.0
+ call mxv( mat, 3, x, y, z, origin )
+ call g3dline( 3, x, y, z )
+ r(1) = axlen + a1
+ r(2) = 0.0
+ r(3) = a2
+ u(1) = 0.0
+ u(2) = 0.0
+ u(3) = 1.0
+ n(1) = 0.0
+ n(2) = sn
+ n(3) = 0.0
+
+ call pgslw( w2 )
+ call mxv2( mat, r, .true., origin )
+ call g3dtext( tx, r, 'BR', u, n )
+ call pgslw( w1 )
+ end if
+c* Y axis with arrow and label
+ if( ty .ne. ' ' ) then
+ x(1) = 0.0
+ y(1) = -axlen
+ z(1) = 0.0
+ x(2) = 0.0
+ y(2) = axlen
+ z(2) = 0.0
+ call mxv( mat, 2, x, y, z, origin )
+ call g3dline( 2, x, y, z )
+ x(1) = -a2
+ y(1) = axlen - a1
+ z(1) = 0.0
+ x(2) = 0.0
+ y(2) = axlen
+ z(2) = 0.0
+ x(3) = a2
+ y(3) = axlen - a1
+ z(3) = 0.0
+ call mxv( mat, 3, x, y, z, origin )
+ call g3dline( 3, x, y, z )
+ r(1) = 0.0
+ r(2) = axlen + a1
+ r(3) = a2
+ u(1) = 0.0
+ u(2) = 0.0
+ u(3) = 1.0
+ n(1) = sn
+ n(2) = 0.0
+ n(3) = 0.0
+
+ call pgslw( w2 )
+ call mxv2( mat, r, .true., origin )
+ call g3dtext( ty, r, 'BR', u, n )
+ call pgslw( w1 )
+ end if
+c* Z axis with arrow and label
+ if( tz .ne. ' ' ) then
+ x(1) = 0.0
+ y(1) = 0.0
+ z(1) = axlen
+ x(2) = 0.0
+ y(2) = 0.0
+ z(2) = 0.0
+ call mxv( mat, 2, x, y, z, origin )
+ call g3dline( 2, x, y, z )
+ x(1) = -a2
+ y(1) = 0.0
+ z(1) = axlen - a1
+ x(2) = 0.0
+ y(2) = 0.0
+ z(2) = axlen
+ x(3) = a2
+ y(3) = 0.0
+ z(3) = axlen - a1
+ call mxv( mat, 3, x, y, z, origin )
+ call g3dline( 3, x, y, z )
+ r(1) = 0.0
+ r(2) = 0.0
+ r(3) = axlen + a1
+ u(1) = 0.0
+ u(2) = 0.0
+ u(3) = 1.0
+ n(1) = 0.0
+ n(2) = 0.0
+ n(3) = 0.0
+
+ call pgslw( w2 )
+ call mxv2( mat, r, .true., origin )
+ call g3dtext( tz, r, 'CR', u, n )
+ call pgslw( w1 )
+ end if
+ end
+
+ subroutine mxv( mat, n, x, y, z, origin )
+ implicit none
+ integer n, i
+ real x(n), y(n), z(n), mat(3,3), va(3),vb(3),origin(3)
+ do i = 1, n
+ va(1)= x(i)
+ va(2)= y(i)
+ va(3)= z(i)
+ call sla_mxv( mat, va, vb )
+ x(i) = vb(1) + origin(1)
+ y(i) = vb(2) + origin(2)
+ z(i) = vb(3) + origin(3)
+ end do
+ end
+
+ subroutine mxv2( mat, r, move, origin )
+ implicit none
+ real r(3), mat(3,3), vb(3), origin(3)
+ logical move
+ call sla_mxv( mat, r, vb )
+ if( move ) then
+ r(1) = vb(1) + origin(1)
+ r(2) = vb(2) + origin(2)
+ r(3) = vb(3) + origin(3)
+ else
+ r(1) = vb(1)
+ r(2) = vb(2)
+ r(3) = vb(3)
+ end if
+ end
+
+ subroutine deuler( order, phi, theta, psi, rmat )
+ implicit none
+ character order*(*)
+ double precision phi, theta, psi, rmat(3,3), t(3), smat(3,3)
+ double precision ang, v(3), ux(3), uy(3), uz(3), tmat(3,3),
+ : axvec(3)
+ integer n, i, j
+ n = len( order )
+ do i = 1, 3
+ ux(i) = 0.0D0
+ uy(i) = 0.0D0
+ uz(i) = 0.0D0
+ do j = 1, 3
+ rmat(i,j) = 0.0
+ end do
+ rmat(i,i) = 1.0
+ end do
+ ux(1) = 1.0D0
+ uy(2) = 1.0D0
+ uz(3) = 1.0D0
+ do i = 1, 3
+ if( i .le. n ) then
+ if( i .eq. 1 ) then
+ ang = phi
+ else if( i .eq. 2 ) then
+ ang = theta
+ else
+ ang = psi
+ end if
+ if( order( i : i ) .eq. 'X' ) then
+ do j = 1, 3
+ axvec(j) = -ux(j)*ang
+ end do
+ else if( order( i : i ) .eq. 'Y' ) then
+ do j = 1, 3
+ axvec(j) = -uy(j)*ang
+ end do
+ else if( order( i : i ) .eq. 'Z' ) then
+ do j = 1, 3
+ axvec(j) = -uz(j)*ang
+ end do
+ else
+ write(*,*) 'Bad axis label (',order(i:i),') in deuler!!!'
+ end if
+ call sla_dav2m( axvec, tmat )
+ do j = 1, 3
+ smat(1,j) = rmat(1,j)
+ smat(2,j) = rmat(2,j)
+ smat(3,j) = rmat(3,j)
+ end do
+ call sla_dmxm( tmat, smat, rmat )
+ call sla_dmxv( tmat, ux, v )
+ ux(1) = v(1)
+ ux(2) = v(2)
+ ux(3) = v(3)
+ call sla_dmxv( tmat, uy, v )
+ uy(1) = v(1)
+ uy(2) = v(2)
+ uy(3) = v(3)
+ call sla_dmxv( tmat, uz, v )
+ uz(1) = v(1)
+ uz(2) = v(2)
+ uz(3) = v(3)
+ end if
+ end do
+ end
+
+ subroutine rotvec( order, phi, theta, psi, v )
+ implicit none
+ character order*(*)
+ real phi, theta, psi,v(3),vt(3)
+ double precision rmat(3,3)
+ real mat(3,3)
+ call deuler( order, dble(phi), dble(theta), dble(psi), rmat )
+ mat(1,1) = rmat(1,1)
+ mat(1,2) = rmat(1,2)
+ mat(1,3) = rmat(1,3)
+ mat(2,1) = rmat(2,1)
+ mat(2,2) = rmat(2,2)
+ mat(2,3) = rmat(2,3)
+ mat(3,1) = rmat(3,1)
+ mat(3,2) = rmat(3,2)
+ mat(3,3) = rmat(3,3)
+ call sla_mxv( mat, v, vt )
+ v(1) = vt(1)
+ v(2) = vt(2)
+ v(3) = vt(3)
+ end
+
+ subroutine cross( a, b, c )
+ implicit none
+ real a(3), b(3), c(3)
+ c(1) = a(2)*b(3) - a(3)*b(2)
+ c(2) = - a(1)*b(3) + a(3)*b(1)
+ c(3) = a(1)*b(2) - a(2)*b(1)
+ end
+
+ subroutine sub( a, b, c )
+ implicit none
+ real a(3), b(3), c(3)
+ c(1) = a(1) - b(1)
+ c(2) = a(2) - b(2)
+ c(3) = a(3) - b(3)
+ end
+
+ subroutine add( a, b, c )
+ implicit none
+ real a(3), b(3), c(3)
+ c(1) = a(1) + b(1)
+ c(2) = a(2) + b(2)
+ c(3) = a(3) + b(3)
+ end
+
+ subroutine dot( a, b, c )
+ implicit none
+ real a(3), b(3), c
+ c = a(1)*b(1) + a(2)*b(2) + a(3)*b(3)
+ end
+
+ subroutine mod( a, c )
+ implicit none
+ real a(3), c
+ c = sqrt( a(1)*a(1) + a(2)*a(2) + a(3)*a(3) )
+ end
+
+ subroutine copy( a, b )
+ implicit none
+ real a(3), b(3)
+ b(1) = a(1)
+ b(2) = a(2)
+ b(3) = a(3)
+ end
+
+ subroutine norm( a )
+ implicit none
+ real a(3), b
+ call mod( a, b )
+ if( b .ne. 0.0 ) then
+ a(1) = a(1)/b
+ a(2) = a(2)/b
+ a(3) = a(3)/b
+ end if
+ end
+
+ subroutine g3dtext( t, r, j, u, n )
+ implicit none
+ character*(*) t, j
+ real r(3), u(3), n(3), r2(3),u2(3),n2(3)
+ integer junk, ast_g3dtext
+
+ call copy( r, r2 )
+ call copy( u, u2 )
+ call copy( n, n2 )
+ r2(2) = -r2(2)
+ u2(2) = -u2(2)
+ n2(2) = -n2(2)
+
+ junk = ast_g3dtext( t, r2, j, u2, n2 )
+ end
+
+ subroutine g3dline( n, x, y, z )
+ implicit none
+ integer i, n
+ logical junk, ast_g3dline
+ real x(n), y(n), z(n)
+
+ do i = 1, n
+ y(i)=-y(i)
+ end do
+
+ junk = ast_g3dline( n, x, y, z )
+
+ do i = 1, n
+ y(i)=-y(i)
+ end do
+
+ end
+
+ subroutine g3dmark( pos, type )
+ implicit none
+ real pos(3)
+ integer type
+ logical junk, ast_g3dmark
+
+ pos(2) = -pos(2)
+ junk = ast_g3dmark( 1, pos(1), pos(2), pos(3), type, pos )
+ pos(2) = -pos(2)
+
+ end
+
+
+
+
+
+ subroutine maketanmap( new, lon, lat, rot, azelmap, status )
+ implicit none
+
+ include 'SAE_PAR'
+ include 'AST_PAR'
+
+ logical new
+ double precision lon, lat, rot
+ integer azelmap, status
+
+ double precision mmt( 2 ), mat(9), mat1(9), mat2(3)
+ integer tanmap, tmap, sphmap, wcsmap, m1, m2, m3, c0, c1, matmap1,
+ : matmap2
+ double precision pi, piby2
+
+ if( status .ne. sai__ok ) return
+
+ pi = 3.1415927D0
+ piby2 = pi/2.0
+
+ c0 = ast_SphMap( 'UnitRadius=1', status )
+ wcsmap = ast_WcsMap( 2, AST__TAN, 1, 2, ' ', status )
+ call ast_Invert( wcsmap, status )
+ call ast_Invert( c0, status )
+ c1 = ast_CmpMap( wcsmap, c0, .true., ' ', status )
+ call ast_Invert( c0, status )
+
+ if( new ) then
+ mmt( 1 ) = -1.0
+ mmt( 2 ) = -1.0
+ tmap = ast_MatrixMap( 2, 2, 1, mmt, ' ', status )
+
+* Note, sla_deuler groups columns in the returned matrix, but slaDeuler
+* groups rows. AST always expects rows to be grouped, so transpose the
+* matrices returned by sla_deuler.
+ call sla_Deuler( 'Z', -rot, 0.0D0, 0.0D0, mat1 )
+ call trans( mat1 )
+ m1 = ast_MatrixMap( 3, 3, 0, mat1, ' ', status )
+
+ call sla_Deuler( 'Y', (PIBY2-lat), 0.0D0, 0.0D0, mat1 )
+ call trans( mat1 )
+ m2 = ast_MatrixMap( 3, 3, 0, mat1, ' ', status )
+
+ call sla_Deuler( 'Z', (lon-PI), 0.0D0, 0.0D0, mat1 )
+ call trans( mat1 )
+ m3 = ast_MatrixMap( 3, 3, 0, mat1, ' ', status )
+
+ matmap1 = ast_CmpMap( m1, ast_CmpMap( m2, m3, .true., ' ',
+ : status ),
+ : .TRUE., ' ', status )
+
+ mat2( 1 ) = 1.0
+ mat2( 2 ) = -1.0
+ mat2( 3 ) = 1.0
+ matmap2 = ast_MatrixMap( 3, 3, 1, mat2, ' ', status )
+
+ m1 = ast_CmpMap( c1, matmap1, .true., ' ', status )
+ m2 = ast_CmpMap( m1, matmap2, .true., ' ', status )
+ tanmap = ast_CmpMap( m2, c0, .true., ' ', status )
+ azelmap = ast_CmpMap( tmap, tanmap, .true., ' ', status )
+
+ else
+
+* Note, sla_deuler groups columns in the returned matrix, but slaDeuler
+* groups rows. AST always expects rows to be grouped, so transpose the
+* matrices returned by sla_deuler.
+ call sla_Deuler( 'Z', rot, 0.0D0, 0.0D0, mat1 )
+ call trans( mat1 )
+ m1 = ast_MatrixMap( 3, 3, 0, mat1, ' ', status )
+
+ call sla_Deuler( 'Y', -(PIBY2-lat), 0.0D0, 0.0D0, mat1 )
+ call trans( mat1 )
+ m2 = ast_MatrixMap( 3, 3, 0, mat1, ' ', status )
+
+ call sla_Deuler( 'Z', -lon, 0.0D0, 0.0D0, mat1 )
+ call trans( mat1 )
+ m3 = ast_MatrixMap( 3, 3, 0, mat1, ' ', status )
+
+
+ matmap1 = ast_CmpMap( m1, ast_CmpMap( m2, m3, .true., ' ',
+ : status ),
+ : .TRUE., ' ', status )
+
+ m1 = ast_CmpMap( c1, matmap1, .true., ' ', status )
+
+
+
+
+
+
+ mmt( 1 ) = -1.0
+ mmt( 2 ) = 1.0
+ tmap = ast_MatrixMap( 2, 2, 1, mmt, ' ', status )
+ m2 = ast_CmpMap( tmap, m1, .true., ' ', status )
+
+
+
+
+
+
+ azelmap = ast_CmpMap( m2, c0, .true., ' ', status )
+
+ end if
+
+ end
+
+ subroutine trans( mat )
+ implicit none
+ double precision t, mat(9)
+
+ t = mat(8)
+ mat(8) = mat(6)
+ mat(6) = t
+
+ t = mat(3)
+ mat(3) = mat(7)
+ mat(7) = t
+
+ t = mat(2)
+ mat(2) = mat(4)
+ mat(4) = t
+
+ end
diff --git a/ast/ast_tester/testpolymap.f b/ast/ast_tester/testpolymap.f
new file mode 100644
index 0000000..1251894
--- /dev/null
+++ b/ast/ast_tester/testpolymap.f
@@ -0,0 +1,319 @@
+ program testpolymap
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ include 'PRM_PAR'
+
+ integer status, pm, pm2, i, maxord, nco
+ double precision coeff( 16 ), lbnd( 2 ), ubnd( 2 ),
+ : xin(3), yin(3), xout(3), yout(3), errlim,
+ : xin2(3), yin2(3), coeff_1d(6), acc,
+ : coeff2( 24 ), coeff3( 6*4 ), err, maxacc,
+ : cofs( 20 )
+
+ data coeff / 1.0, 1.0, 0.0, 0.0,
+ : 2.0, 1.0, 1.0, 0.0,
+ : 1.0, 2.0, 0.0, 0.0,
+ : 3.0, 2.0, 0.0, 1.0 /
+
+ data coeff2 / 1.0, 1.0, 0.0, 0.0,
+ : 2.0, 1.0, 1.0, 0.0,
+ : 1.0, 1.0, 0.0, 1.0,
+ : 1.0, 2.0, 0.0, 0.0,
+ : 1.0, 2.0, 1.0, 0.0,
+ : 2.0, 2.0, 0.0, 1.0 /
+
+c data coeff3 / -0.1, 1.0, 0.0, 0.0,
+c : 0.99, 1.0, 1.0, 0.0,
+c : 1.0E-4, 1.0, 1.0, 1.0,
+c : -1.0E-9, 1.0, 2.0, 1.0,
+c : -0.1, 2.0, 0.0, 0.0,
+c : 0.99, 2.0, 0.0, 1.0,
+c : 1.0E-4, 2.0, 1.0, 1.0,
+c : -1.0E-9, 2.0, 1.0, 2.0 /
+
+ data coeff3 / -0.1, 1.0, 0.0, 0.0,
+ : 0.99, 1.0, 1.0, 0.0,
+ : 1.0E-4, 1.0, 1.0, 1.0,
+ : -0.1, 2.0, 0.0, 0.0,
+ : 0.99, 2.0, 0.0, 1.0,
+ : 1.0E-4, 2.0, 1.0, 1.0 /
+
+
+ data coeff_1d / 1.0, 1.0, 0.0,
+ : 2.0, 1.0, 1.0 /
+
+ data lbnd / -10.0D2, -10.0D2 /
+ data ubnd / 10.0D2, 10.0D2 /
+
+
+
+ status = sai__ok
+ call ast_begin( status )
+
+c call ast_watchmemory( 131 )
+
+ acc = 1.0D-7
+ errlim = 1000*acc
+ maxacc = 1.0D-3
+ maxord = 10
+
+ pm = ast_polymap( 2, 2, 4, coeff, 0, coeff, ' ', status )
+
+ call ast_polycoeffs( pm, .true., 0, 0.0D0, nco, status )
+ if( nco .ne. 4 ) then
+ call stopit( -1, status )
+ endif
+
+ call ast_polycoeffs( pm, .false., 0, 0.0D0, nco, status )
+ if( nco .ne. 0 ) then
+ call stopit( -2, status )
+ endif
+
+ call ast_polycoeffs( pm, .true., 20, cofs, nco, status )
+ if( nco .ne. 4 ) then
+ call stopit( -3, status )
+ else
+ do i = 1, 16
+ if( cofs( i ) .ne. coeff( i ) ) then
+ call stopit( -4, status )
+ end if
+ end do
+ endif
+
+ pm2 = ast_polytran( pm, .FALSE., acc, maxacc, maxord, lbnd,
+ : ubnd, status )
+
+ xin( 1 ) = 1.0d0
+ xin( 2 ) = 100.0d0
+ xin( 3 ) = -50.0d0
+ yin( 1 ) = 1.0d0
+ yin( 2 ) = 100.0d0
+ yin( 3 ) = -50.0d0
+
+ call ast_tran2( pm2, 3, xin, yin, .true., xout, yout,
+ : status )
+ call ast_tran2( pm2, 3, xout, yout, .false., xin2, yin2,
+ : status )
+
+ do i = 1, 3
+ if( abs( xin( i ) - xin2( i ) ) .gt. errlim ) then
+ call stopit( 1, status )
+ endif
+ if( abs( yin( i ) - yin2( i ) ) .gt. errlim ) then
+ call stopit( 2, status )
+ endif
+ end do
+
+
+
+ call ast_setl( pm2, 'IterInverse', .TRUE., status )
+ call ast_tran2( pm2, 3, xout, yout, .false., xin2, yin2,
+ : status )
+ do i = 1, 3
+ if( abs( xin( i ) - xin2( i ) ) .gt. errlim ) then
+ call stopit( 1001, status )
+ endif
+ if( abs( yin( i ) - yin2( i ) ) .gt. errlim ) then
+ call stopit( 1002, status )
+ endif
+ end do
+
+
+
+
+
+ pm = ast_polymap( 1, 1, 2, coeff_1d, 0, coeff_1d, ' ', status )
+ pm2 = ast_polytran( pm, .FALSE., acc, maxacc, maxord, lbnd,
+ : ubnd, status )
+
+ xin( 1 ) = 1.0d0
+ xin( 2 ) = 100.0d0
+ xin( 3 ) = -50.0d0
+
+ call ast_tran1( pm2, 3, xin, .true., xout, status )
+ call ast_tran1( pm2, 3, xout, .false., xin2, status )
+
+ do i = 1, 3
+ if( abs( xin( i ) - xin2( i ) ) .gt. errlim ) then
+ call stopit( 3, status )
+ endif
+ end do
+
+ call ast_setl( pm2, 'IterInverse', .TRUE., status )
+ call ast_tran1( pm2, 3, xout, .false., xin2, status )
+
+ do i = 1, 3
+ if( abs( xin( i ) - xin2( i ) ) .gt. errlim ) then
+ call stopit( 3001, status )
+ endif
+ end do
+
+
+
+
+ pm = ast_polymap( 2, 2, 6, coeff2, 0, coeff2, ' ', status )
+ pm2 = ast_polytran( pm, .FALSE., acc, maxacc, maxord, lbnd,
+ : ubnd, status )
+
+ xin( 1 ) = 1.0d0
+ xin( 2 ) = 100.0d0
+ xin( 3 ) = -50.0d0
+ yin( 1 ) = 1.0d0
+ yin( 2 ) = 100.0d0
+ yin( 3 ) = -50.0d0
+
+ call ast_tran2( pm2, 3, xin, yin, .true., xout, yout,
+ : status )
+ call ast_tran2( pm2, 3, xout, yout, .false., xin2, yin2,
+ : status )
+
+ do i = 1, 3
+ if( abs( xin( i ) - xin2( i ) ) .gt. errlim ) then
+ call stopit( 4, status )
+ endif
+ if( abs( yin( i ) - yin2( i ) ) .gt. errlim ) then
+ call stopit( 5, status )
+ endif
+ end do
+
+ call ast_setl( pm2, 'IterInverse', .TRUE., status )
+ call ast_tran2( pm2, 3, xout, yout, .false., xin2, yin2,
+ : status )
+
+ do i = 1, 3
+ if( abs( xin( i ) - xin2( i ) ) .gt. errlim ) then
+ call stopit( 4001, status )
+ endif
+ if( abs( yin( i ) - yin2( i ) ) .gt. errlim ) then
+ call stopit( 5001, status )
+ endif
+ end do
+
+
+
+
+
+
+
+ pm = ast_polymap( 2, 2, 6, coeff3, 0, coeff3, ' ', status )
+ pm2 = ast_polytran( pm, .FALSE., acc, maxacc, maxord, lbnd,
+ : ubnd, status )
+
+ xin( 1 ) = 1.0d0
+ xin( 2 ) = 100.0d0
+ xin( 3 ) = -50.0d0
+ yin( 1 ) = 1.0d0
+ yin( 2 ) = 100.0d0
+ yin( 3 ) = -50.0d0
+
+ call ast_tran2( pm2, 3, xin, yin, .true., xout, yout,
+ : status )
+ call ast_tran2( pm2, 3, xout, yout, .false., xin2, yin2,
+ : status )
+
+ do i = 1, 3
+ if( abs( xin( i ) - xin2( i ) ) .gt. errlim ) then
+ write(*,*) i, xin( i ), xin2( i ), errlim
+ call stopit( 6, status )
+ endif
+ if( abs( yin( i ) - yin2( i ) ) .gt. errlim ) then
+ call stopit( 7, status )
+ endif
+ end do
+
+
+ call ast_setl( pm2, 'IterInverse', .TRUE., status )
+ call ast_tran2( pm2, 3, xout, yout, .false., xin2, yin2,
+ : status )
+
+ do i = 1, 3
+ if( abs( xin( i ) - xin2( i ) ) .gt. errlim ) then
+ write(*,*) i, xin( i ), xin2( i ), errlim
+ call stopit( 6001, status )
+ endif
+ if( abs( yin( i ) - yin2( i ) ) .gt. errlim ) then
+ call stopit( 7001, status )
+ endif
+ end do
+
+
+
+ if( .not. ast_getl( pm, 'TranForward', status ) ) then
+ call stopit( 8001, status )
+ else if( .not. ast_getl( pm, 'IterInverse', status ) ) then
+ call stopit( 8002, status )
+ else if( .not. ast_getl( pm, 'TranInverse', status ) ) then
+ call stopit( 8003, status )
+ endif
+
+ call ast_setl( pm, 'IterInverse', .FALSE., status )
+
+ if( .not. ast_getl( pm, 'TranForward', status ) ) then
+ call stopit( 8004, status )
+ else if( ast_getl( pm, 'IterInverse', status ) ) then
+ call stopit( 8005, status )
+ else if( ast_getl( pm, 'TranInverse', status ) ) then
+ call stopit( 8006, status )
+ endif
+
+ call ast_invert( pm, status )
+
+ if( ast_getl( pm, 'TranForward', status ) ) then
+ call stopit( 8007, status )
+ else if( ast_getl( pm, 'IterInverse', status ) ) then
+ call stopit( 8008, status )
+ else if( .not. ast_getl( pm, 'TranInverse', status ) ) then
+ call stopit( 8009, status )
+ endif
+
+ call ast_setl( pm, 'IterInverse', .TRUE., status )
+
+ if( .not. ast_getl( pm, 'TranForward', status ) ) then
+ call stopit( 8010, status )
+ else if( .not. ast_getl( pm, 'IterInverse', status ) ) then
+ call stopit( 8011, status )
+ else if( .not. ast_getl( pm, 'TranInverse', status ) ) then
+ call stopit( 8012, status )
+ endif
+
+ call ast_invert( pm, status )
+
+ if( .not. ast_getl( pm, 'TranForward', status ) ) then
+ call stopit( 8013, status )
+ else if( .not. ast_getl( pm, 'IterInverse', status ) ) then
+ call stopit( 8014, status )
+ else if( .not. ast_getl( pm, 'TranInverse', status ) ) then
+ call stopit( 8015, status )
+ endif
+
+
+
+
+
+
+
+
+
+ call ast_end( status )
+ call ast_activememory( 'testpolymap' );
+ call ast_flushmemory( 1 )
+
+ if( status .eq. sai__ok ) then
+ write(*,*) 'All PolyMap tests passed'
+ else
+ write(*,*) 'PolyMap tests failed'
+ end if
+
+ end
+
+
+ subroutine stopit( i, status )
+ implicit none
+ include 'SAE_PAR'
+ integer i, status
+ if( status .eq. sai__ok ) then
+ write( *,* ) 'Error ',i
+ status = sai__error
+ end if
+ end
diff --git a/ast/ast_tester/testrate.f b/ast/ast_tester/testrate.f
new file mode 100644
index 0000000..4803294
--- /dev/null
+++ b/ast/ast_tester/testrate.f
@@ -0,0 +1,344 @@
+ program testrate
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ include 'PRM_PAR'
+
+ integer status, m, outp(4), inp(4), c1, c2, c3, c4
+ double precision at(4), r, mat(4), b1(2), b2(2), a1(2),
+ : a2(4)
+
+ status = sai__ok
+
+ at(1) = 10.0D0
+ at(2) = 1.2D6
+
+* UnitMap
+ m = ast_unitmap( 2, ' ', status )
+
+ r = ast_rate( m, at, 1, 1, status )
+ if( r .ne. 1.0D0 ) call stopit( 1, r, status )
+ r = ast_rate( m, at, 2, 1, status )
+ if( r .ne. 0.0D0 ) call stopit( 2, r, status )
+
+ call ast_invert( m, status )
+ r = ast_rate( m, at, 1, 1, status )
+ if( r .ne. 1.0D0 ) call stopit( 202, r, status )
+
+* ZoomMap
+ m = ast_zoommap( 2, 2.0D0, ' ', status )
+
+ r = ast_rate( m, at, 1, 1, status )
+ if( r .ne. 2.0D0 ) call stopit( 3, r, status )
+ r = ast_rate( m, at, 2, 1, status )
+ if( r .ne. 0.0D0 ) call stopit( 4, r, status )
+
+ call ast_invert( m, status )
+ r = ast_rate( m, at, 1, 1, status )
+ if( r .ne. 0.5D0 ) call stopit( 402, r, status )
+
+* MatrixMap
+ m = ast_matrixmap( 2, 2, 2, mat, ' ', status )
+
+ r = ast_rate( m, at, 1, 1, status )
+ if( r .ne. 1.0D0 ) call stopit( 5, r, status )
+ r = ast_rate( m, at, 2, 1, status )
+ if( r .ne. 0.0D0 ) call stopit( 6, r, status )
+
+ call ast_invert( m, status )
+ r = ast_rate( m, at, 1, 1, status )
+ if( r .ne. 1.0D0 ) call stopit( 602, r, status )
+ r = ast_rate( m, at, 1, 2, status )
+ if( r .ne. 0.0D0 ) call stopit( 603, r, status )
+
+ mat(1)= -2.0D0
+ mat(2)= 1.5D0
+ m = ast_matrixmap( 2, 2, 1, mat, ' ', status )
+
+ r = ast_rate( m, at, 1, 1, status )
+ if( r .ne. -2.0D0 ) call stopit( 7, r, status )
+ r = ast_rate( m, at, 2, 2, status )
+ if( r .ne. 1.5D0 ) call stopit( 8, r, status )
+ r = ast_rate( m, at, 1, 2, status )
+ if( r .ne. 0.0D0 ) call stopit( 9, r, status )
+ r = ast_rate( m, at, 2, 1, status )
+ if( r .ne. 0.0D0 ) call stopit( 10, r, status )
+
+ call ast_invert( m, status )
+ r = ast_rate( m, at, 1, 1, status )
+ if( r .ne. -0.5D0 ) call stopit( 1002, r, status )
+
+ mat(1)= 1.2D0
+ mat(2)= 1.6D0
+ mat(3)= -1.6D0
+ mat(4)= 2.2D0
+ m = ast_matrixmap( 2, 2, 0, mat, ' ', status )
+
+ r = ast_rate( m, at, 1, 1, status )
+ if( r .ne. 1.2D0 ) call stopit( 11, r, status )
+ r = ast_rate( m, at, 2, 2, status )
+ if( r .ne. 2.2D0 ) call stopit( 12, r, status )
+ r = ast_rate( m, at, 1, 2, status )
+ if( r .ne. 1.6D0 ) call stopit( 13, r, status )
+ r = ast_rate( m, at, 2, 1, status )
+ if( r .ne. -1.6D0 ) call stopit( 14, r, status )
+
+ call ast_invert( m, status )
+
+ r = ast_rate( m, at, 1, 1, status )
+ if( abs( r - 0.423076923 ) .gt. 1.0E-6 ) call stopit( 15, r,
+ : status )
+
+ r = ast_rate( m, at, 2, 2, status )
+ if( abs( r - 0.230769231 ) .gt. 1.0E-6 ) call stopit( 16, r,
+ : status )
+
+ r = ast_rate( m, at, 1, 2, status )
+ if( abs( r + 0.307692308 ) .gt. 1.0E-6 ) call stopit( 17, r,
+ : status )
+
+ r = ast_rate( m, at, 2, 1, status )
+ if( abs( r - 0.307692308 ) .gt. 1.0E-6 ) call stopit( 18, r,
+ : status )
+
+
+* ShiftMap
+ mat(1) = -1.2D0
+ mat(2) = 1.2D0
+ m = ast_shiftmap( 2, mat, ' ', status )
+
+ r = ast_rate( m, at, 1, 1, status )
+ if( r .ne. 1.0D0 ) call stopit( 20, r, status )
+ r = ast_rate( m, at, 2, 1, status )
+ if( r .ne. 0.0D0 ) call stopit( 21, r, status )
+
+ call ast_invert( m, status )
+ r = ast_rate( m, at, 1, 1, status )
+ if( r .ne. 1.0D0 ) call stopit( 23, r, status )
+
+
+* WinMap
+ a1( 1 ) = 0.0D0
+ a1( 2 ) = 0.0D0
+ a2( 1 ) = 1.0D0
+ a2( 2 ) = 1.0D0
+ b1( 1 ) = 0.5D0
+ b1( 2 ) = 0.5D0
+ b2( 1 ) = 2.5D0
+ b2( 2 ) = 2.5D0
+ m = ast_winmap( 2, a1, a2, b1, b2, ' ', status )
+
+ r = ast_rate( m, at, 1, 1, status )
+ if( r .ne. 2.0D0 ) call stopit( 24, r, status )
+ r = ast_rate( m, at, 2, 1, status )
+ if( r .ne. 0.0D0 ) call stopit( 25, r, status )
+
+ r = ast_rate( m, at, 2, 2, status )
+ if( r .ne. 2.0D0 ) call stopit( 26, r, status )
+ r = ast_rate( m, at, 1, 2, status )
+ if( r .ne. 0.0D0 ) call stopit( 27, r, status )
+
+
+ call ast_invert( m, status )
+
+ r = ast_rate( m, at, 1, 1, status )
+ if( r .ne. 0.5D0 ) call stopit( 29, r, status )
+ r = ast_rate( m, at, 2, 1, status )
+ if( r .ne. 0.0D0 ) call stopit( 30, r, status )
+
+ r = ast_rate( m, at, 2, 2, status )
+ if( r .ne. 0.5D0 ) call stopit( 31, r, status )
+ r = ast_rate( m, at, 1, 2, status )
+ if( r .ne. 0.0D0 ) call stopit( 32, r, status )
+
+
+
+* PermMap
+ outp(1)=2
+ outp(2)=1
+ inp(1)=1
+ inp(2)=2
+ m = ast_permmap( 2, inp, 2, outp, 0.0D0, ' ', status )
+
+ r = ast_rate( m, at, 1, 1, status )
+ if( r .ne. 0.0D0 ) call stopit( 34, r, status )
+
+ r = ast_rate( m, at, 2, 1, status )
+ if( r .ne. 1.0D0 ) call stopit( 35, r, status )
+
+ r = ast_rate( m, at, 2, 2, status )
+ if( r .ne. 0.0D0 ) call stopit( 37, r, status )
+
+ r = ast_rate( m, at, 1, 2, status )
+ if( r .ne. 1.0D0 ) call stopit( 38, r, status )
+
+ call ast_invert( m, status )
+
+ r = ast_rate( m, at, 1, 1, status )
+ if( r .ne. 1.0D0 ) call stopit( 40, r, status )
+
+ r = ast_rate( m, at, 2, 1, status )
+ if( r .ne. 0.0D0 ) call stopit( 41, r, status )
+
+ r = ast_rate( m, at, 2, 2, status )
+ if( r .ne. 1.0D0 ) call stopit( 43, r, status )
+
+ r = ast_rate( m, at, 1, 2, status )
+ if( r .ne. 0.0D0 ) call stopit( 44, r, status )
+
+* TranMap
+ a1( 1 ) = 0.0D0
+ a1( 2 ) = 0.0D0
+ a2( 1 ) = 1.0D0
+ a2( 2 ) = 1.0D0
+ b1( 1 ) = 0.5D0
+ b1( 2 ) = 0.5D0
+ b2( 1 ) = 2.5D0
+ b2( 2 ) = 2.5D0
+ c1 = ast_winmap( 2, a1, a2, b1, b2, ' ', status )
+
+ mat(1)= 1.2D0
+ mat(2)= 1.6D0
+ mat(3)= -1.6D0
+ mat(4)= 2.2D0
+ c2 = ast_matrixmap( 2, 2, 0, mat, ' ', status )
+
+ m = ast_tranmap( c1, c2, ' ', status )
+
+ r = ast_rate( m, at, 1, 1, status )
+ if( r .ne. 2.0D0 ) call stopit( 46, r, status )
+ r = ast_rate( m, at, 2, 1, status )
+ if( r .ne. 0.0D0 ) call stopit( 47, r, status )
+
+ r = ast_rate( m, at, 2, 2, status )
+ if( r .ne. 2.0D0 ) call stopit( 48, r, status )
+ r = ast_rate( m, at, 1, 2, status )
+ if( r .ne. 0.0D0 ) call stopit( 49, r, status )
+
+ call ast_invert( m, status )
+
+ r = ast_rate( m, at, 1, 1, status )
+ if( abs( r - 0.423076923 ) .gt. 1.0E-6 ) call stopit( 51, r,
+ : status )
+ r = ast_rate( m, at, 2, 2, status )
+ if( abs( r - 0.230769231 ) .gt. 1.0E-6 ) call stopit( 52, r,
+ : status )
+ r = ast_rate( m, at, 1, 2, status )
+ if( abs( r + 0.307692308 ) .gt. 1.0E-6 ) call stopit( 53, r,
+ : status )
+ r = ast_rate( m, at, 2, 1, status )
+ if( abs( r - 0.307692308 ) .gt. 1.0E-6 ) call stopit( 54, r,
+ : status )
+
+
+* CmpMap
+ mat(1) = -1.0D0
+ mat(2) = 1.0D0
+ c1 = ast_shiftmap( 2, mat, ' ', status )
+ mat(1)= 1.0D0
+ mat(2)= 2.0D0
+ mat(3)= -2.0D0
+ mat(4)= 3.0D0
+ c2 = ast_matrixmap( 2, 2, 0, mat, ' ', status )
+ c3 = ast_cmpmap( c1, c2, 0, ' ', status )
+
+ outp(1) = 3
+ outp(2) = 4
+ outp(3) = 1
+ outp(4) = 2
+ inp(1) = 3
+ inp(2) = 4
+ inp(3) = 1
+ inp(4) = 2
+ c1 = ast_permmap( 4, inp, 4, outp, 0.0D0, ' ', status )
+ c2 = ast_ZoomMap( 4, 0.25D0, ' ', status )
+ call ast_invert( c2, status )
+
+ c4 = ast_cmpmap( c1, c2, 1, ' ', status )
+ call ast_invert( c4, status )
+
+ m = ast_cmpmap( c3, c4, 1, ' ', status )
+
+ call ast_invert( c2, status )
+ call ast_invert( c3, status )
+ call ast_invert( c4, status )
+
+ at(1) = 1.0D0
+ at(2) = 2.0D0
+ at(3) = 3.0D0
+ at(4) = 4.0D0
+ r = ast_rate( m, at, 1, 1, status )
+ if( r .ne. 0.0D0 ) call stopit( 55, r, status )
+
+ r = ast_rate( m, at, 1, 2, status )
+ if( r .ne. 0.0D0 ) call stopit( 56, r, status )
+
+ r = ast_rate( m, at, 1, 3, status )
+ if( abs( r - 0.25D0 ) .gt. 1.0D-6 ) call stopit( 57, r, status )
+
+ r = ast_rate( m, at, 1, 4, status )
+ if( r .ne. 0.5D0 ) call stopit( 58, r, status )
+
+ r = ast_rate( m, at, 3, 1, status )
+ if( r .ne. 0.25D0 ) call stopit( 59, r, status )
+
+ r = ast_rate( m, at, 3, 2, status )
+ if( r .ne. 0.0D0 ) call stopit( 60, r, status )
+
+ r = ast_rate( m, at, 3, 3, status )
+ if( r .ne. 0.0D0 ) call stopit( 61, r, status )
+
+ r = ast_rate( m, at, 3, 4, status )
+ if( r .ne. 0.0D0 ) call stopit( 62, r, status )
+
+
+ call ast_invert( m, status )
+
+ r = ast_rate( m, at, 1, 1, status )
+ if( r .ne. 0.0D0 ) call stopit( 63, r, status )
+
+ r = ast_rate( m, at, 1, 2, status )
+ if( r .ne. 0.0D0 ) call stopit( 64, r, status )
+
+ r = ast_rate( m, at, 1, 3, status )
+ if( r .ne. 4.0D0 ) call stopit( 65, r, status )
+
+ r = ast_rate( m, at, 1, 4, status )
+ if( r .ne. 0.0D0 ) call stopit( 66, r, status )
+
+ r = ast_rate( m, at, 3, 1, status )
+ if( abs( r - 12.0D0/7.0D0 ) .gt. 1.0D-6 )
+ : call stopit( 67, r, status )
+
+ r = ast_rate( m, at, 3, 2, status )
+ if( abs( r - (-8.0D0/7.0D0) ) .gt. 1.0D-6 )
+ : call stopit( 68, r, status )
+
+ r = ast_rate( m, at, 3, 3, status )
+ if( r .ne. 0.0D0 ) call stopit( 69, r, status )
+
+ r = ast_rate( m, at, 3, 4, status )
+ if( r .ne. 0.0D0 ) call stopit( 70, r, status )
+
+
+
+
+ if( status .eq. sai__ok ) then
+ write(*,*) 'All AST_RATE tests passed'
+ else
+ write(*,*) 'AST_RATE tests failed'
+ end if
+
+ end
+
+
+ subroutine stopit( i, r, status )
+ implicit none
+ include 'SAE_PAR'
+ integer i, status
+ double precision r
+ if( status .eq. sai__ok ) then
+ write( *,* ) 'Error ',i,': ',r
+ status = sai__error
+ end if
+ end
diff --git a/ast/ast_tester/testratemap.f b/ast/ast_tester/testratemap.f
new file mode 100644
index 0000000..720a4b9
--- /dev/null
+++ b/ast/ast_tester/testratemap.f
@@ -0,0 +1,148 @@
+ program testratemap
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ include 'PRM_PAR'
+
+ integer status, m, outp(4), inp(4), c1, c2, c3, c4, rm
+ double precision at(4), r, mat(4), b1(2), b2(2), a1(2),
+ : a2(4)
+
+ status = sai__ok
+
+ at(1) = 10.0D0
+ at(2) = 1.2D6
+
+ mat(1) = -1.0D0
+ mat(2) = 1.0D0
+ c1 = ast_shiftmap( 2, mat, ' ', status )
+ mat(1)= 1.0D0
+ mat(2)= 2.0D0
+ mat(3)= -2.0D0
+ mat(4)= 3.0D0
+ c2 = ast_matrixmap( 2, 2, 0, mat, ' ', status )
+ c3 = ast_cmpmap( c1, c2, 0, ' ', status )
+
+ outp(1) = 3
+ outp(2) = 4
+ outp(3) = 1
+ outp(4) = 2
+ inp(1) = 3
+ inp(2) = 4
+ inp(3) = 1
+ inp(4) = 2
+ c1 = ast_permmap( 4, inp, 4, outp, 0.0D0, ' ', status )
+ c2 = ast_ZoomMap( 4, 0.25D0, ' ', status )
+ call ast_invert( c2, status )
+
+ c4 = ast_cmpmap( c1, c2, 1, ' ', status )
+ call ast_invert( c4, status )
+
+ m = ast_cmpmap( c3, c4, 1, ' ', status )
+
+ call ast_invert( c2, status )
+ call ast_invert( c3, status )
+ call ast_invert( c4, status )
+
+ rm = ast_ratemap( m, 1, 1, ' ', status )
+ at(1) = 1.0D0
+ at(2) = 2.0D0
+ at(3) = 3.0D0
+ at(4) = 4.0D0
+ call ast_trann( rm, 1, 4, 1, at, 1, 1, 1, r, status )
+ if( r .ne. 0.0D0 ) call stopit( 1, r, status )
+
+ if( .not. ast_getl( rm, 'TranForward', status ) ) call stopit( 2,
+ : r, status )
+
+ if( ast_getl( rm, 'TranInverse', status ) ) call stopit( 3, r,
+ : status )
+
+ rm = ast_ratemap( m, 1, 2, ' ', status )
+ call ast_trann( rm, 1, 4, 1, at, 1, 1, 1, r, status )
+ if( r .ne. 0.0D0 ) call stopit( 4, r, status )
+
+ rm = ast_ratemap( m, 1, 3, ' ', status )
+ call ast_trann( rm, 1, 4, 1, at, 1, 1, 1, r, status )
+ if( abs( r - 0.25D0 ) .gt. 1.0D-6 ) call stopit( 5, r, status )
+
+ rm = ast_ratemap( m, 1, 4, ' ', status )
+ call ast_trann( rm, 1, 4, 1, at, 1, 1, 1, r, status )
+ if( r .ne. 0.5D0 ) call stopit( 6, r, status )
+
+ rm = ast_ratemap( m, 3, 1, ' ', status )
+ call ast_trann( rm, 1, 4, 1, at, 1, 1, 1, r, status )
+ if( r .ne. 0.25D0 ) call stopit( 7, r, status )
+
+ rm = ast_ratemap( m, 3, 2, ' ', status )
+ call ast_trann( rm, 1, 4, 1, at, 1, 1, 1, r, status )
+ if( r .ne. 0.0D0 ) call stopit( 8, r, status )
+
+ rm = ast_ratemap( m, 3, 3, ' ', status )
+ call ast_trann( rm, 1, 4, 1, at, 1, 1, 1, r, status )
+ if( r .ne. 0.0D0 ) call stopit( 9, r, status )
+
+ rm = ast_ratemap( m, 3, 4, ' ', status )
+ call ast_trann( rm, 1, 4, 1, at, 1, 1, 1, r, status )
+ if( r .ne. 0.0D0 ) call stopit( 10, r, status )
+
+ call ast_invert( m, status )
+
+ rm = ast_ratemap( m, 1, 1, ' ', status )
+ call ast_trann( rm, 1, 4, 1, at, 1, 1, 1, r, status )
+ if( r .ne. 0.0D0 ) call stopit( 11, r, status )
+
+ rm = ast_ratemap( m, 1, 2, ' ', status )
+ call ast_trann( rm, 1, 4, 1, at, 1, 1, 1, r, status )
+ if( r .ne. 0.0D0 ) call stopit( 12, r, status )
+
+ rm = ast_ratemap( m, 1, 3, ' ', status )
+ call ast_trann( rm, 1, 4, 1, at, 1, 1, 1, r, status )
+ if( r .ne. 4.0D0 ) call stopit( 13, r, status )
+
+ rm = ast_ratemap( m, 1, 4, ' ', status )
+ call ast_trann( rm, 1, 4, 1, at, 1, 1, 1, r, status )
+ if( r .ne. 0.0D0 ) call stopit( 14, r, status )
+
+ rm = ast_ratemap( m, 3, 1, ' ', status )
+ call ast_trann( rm, 1, 4, 1, at, 1, 1, 1, r, status )
+ if( abs( r - 12.0D0/7.0D0 ) .gt. 1.0E-6 )
+ : call stopit( 15, r, status )
+
+ rm = ast_ratemap( m, 3, 2, ' ', status )
+ call ast_trann( rm, 1, 4, 1, at, 1, 1, 1, r, status )
+ if( abs( r - (-8.0D0/7.0D0) ) .gt. 1.0E-6 )
+ : call stopit( 16, r, status )
+
+ rm = ast_ratemap( m, 3, 3, ' ', status )
+ call ast_trann( rm, 1, 4, 1, at, 1, 1, 1, r, status )
+ if( r .ne. 0.0D0 ) call stopit( 17, r, status )
+
+ rm = ast_ratemap( m, 3, 4, ' ', status )
+ call ast_trann( rm, 1, 4, 1, at, 1, 1, 1, r, status )
+ if( r .ne. 0.0D0 ) call stopit( 18, r, status )
+
+
+
+
+
+
+ if( status .eq. sai__ok ) then
+ write(*,*) 'All RateMap tests passed'
+ else
+ write(*,*) 'RateMap tests failed'
+ end if
+
+ end
+
+
+ subroutine stopit( i, r, status )
+ implicit none
+ include 'SAE_PAR'
+ integer i, status
+ double precision r
+ if( status .eq. sai__ok ) then
+ write( *,* ) 'Error ',i,': ',r
+ status = sai__error
+ end if
+ end
diff --git a/ast/ast_tester/testrebin.f b/ast/ast_tester/testrebin.f
new file mode 100644
index 0000000..5ec976f
--- /dev/null
+++ b/ast/ast_tester/testrebin.f
@@ -0,0 +1,4176 @@
+ program testrebin
+ implicit none
+ include 'SAE_PAR'
+ external test1, test2, test3, test4, test5, test6, test7, test8,
+ : test9
+ integer status
+ status = sai__ok
+
+ call ast_begin( status )
+
+ call tester( test7, status )
+ call tester( test8, status )
+ call tester( test9, status )
+ call tester( test1, status )
+ call tester( test2, status )
+ call tester( test3, status )
+ call tester( test4, status )
+ call tester( test5, status )
+ call tester( test6, status )
+
+ call ast_end( status )
+ call ast_flushmemory( 1 )
+
+
+ if( status .eq. sai__ok ) then
+ write(*,*) 'All AST_REBIN tests passed'
+ else
+ write(*,*) 'AST_REBIN tests failed'
+ end if
+
+ end
+
+
+
+
+*
+* Do a given test with a all data types and spread functions.
+*
+ subroutine tester( testfun, status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ include 'PRM_PAR'
+ include 'CNF_PAR'
+
+ integer m, lbnd_in(10), ubnd_in(10), ipin, ipin_var,
+ : lbnd_out(10), ubnd_out(10), lbnd(10), ubnd(10), ipout,
+ : ipout_var, status, nin, nout, i, nel_in, nel_out,
+ : spreads(6), j
+ character types(3)*15, name*20
+ double precision tol, params(20)
+ external testfun
+
+ data types/ '_DOUBLE', '_REAL', '_INTEGER' /
+
+ data spreads/ AST__SINC, AST__NEAREST, AST__LINEAR,
+ : AST__SINCSINC, AST__SINCCOS, AST__SINCGAUSS /
+
+
+ if( status .ne. sai__ok ) return
+
+* Get the scalar properties of the test.
+ call testfun( 0, name, types(1),
+ : lbnd_in, ubnd_in, ipin, ipin_var,
+ : lbnd_out, ubnd_out, ipout, ipout_var,
+ : lbnd, ubnd, m, params, tol, j, status )
+
+* Get the number of input and output axes.
+ nin = ast_geti( m, 'Nin', status )
+ nout = ast_geti( m, 'Nout', status )
+
+* Get no. of pixels in entire input array.
+ nel_in = 1
+ do i = 1, nin
+ nel_in = nel_in*( ubnd_in( i ) - lbnd_in( i ) + 1 )
+ end do
+
+* Get no. of pixels in entire output array.
+ nel_out = 1
+ do i = 1, nout
+ nel_out = nel_out*( ubnd_out( i ) - lbnd_out( i ) + 1 )
+ end do
+
+* Loop round all data types.
+ do i = 1, 3
+
+* Allocate memory for input and output data and variance arrays
+ call psx_calloc( nel_in, types(i), ipin, status )
+ call psx_calloc( nel_in, types(i), ipin_var, status )
+
+ call psx_calloc( nel_out, types(i), ipout, status )
+ call psx_calloc( nel_out, types(i), ipout_var, status )
+
+* Loop round all spread functions
+ do j = 1, 6
+
+* Get the scalar properties of the test. This may change the Mapping.
+ call testfun( 0, name, types(i),
+ : lbnd_in, ubnd_in, ipin, ipin_var,
+ : lbnd_out, ubnd_out, ipout, ipout_var,
+ : lbnd, ubnd, m, params, tol, spreads(j), status )
+
+* Fill the input data and variance arrays using the supplied function.
+ call testfun( 1, name, types(i),
+ : lbnd_in, ubnd_in, ipin, ipin_var,
+ : lbnd_out, ubnd_out, ipout, ipout_var,
+ : lbnd, ubnd, m, params, tol, spreads(j),
+ : status )
+
+* Rebin the input data using the AST function appropriate to the
+* supplied data type.
+ if( types(i) .eq. '_REAL' ) then
+ call ast_rebinr( m, 0.0D0, nin, lbnd_in, ubnd_in,
+ : %val( cnf_pval( ipin )), %val( cnf_pval(ipin_var )),
+ : spreads(j), params,
+ : AST__USEBAD+AST__USEVAR, tol, 100, VAL__BADR,
+ : nout, lbnd_out, ubnd_out,
+ : lbnd, ubnd, %val( cnf_pval( ipout )),
+ : %val( cnf_pval( ipout_var )), status )
+
+ else if( types(i) .eq. '_DOUBLE' ) then
+ call ast_rebind( m, 0.0D0, nin, lbnd_in, ubnd_in,
+ : %val( cnf_pval( ipin )), %val( cnf_pval(ipin_var )),
+ : spreads(j), params,
+ : AST__USEBAD+AST__USEVAR, tol, 100, VAL__BADD,
+ : nout, lbnd_out, ubnd_out,
+ : lbnd, ubnd, %val( cnf_pval( ipout ) ),
+ : %val( cnf_pval( ipout_var )), status )
+
+ else if( types(i) .eq. '_INTEGER' ) then
+ call ast_rebini( m, 0.0D0, nin, lbnd_in, ubnd_in,
+ : %val( cnf_pval( ipin )), %val( cnf_pval(ipin_var )),
+ : spreads(j), params,
+ : AST__USEBAD+AST__USEVAR, tol, 100, VAL__BADI,
+ : nout, lbnd_out, ubnd_out,
+ : lbnd, ubnd, %val( cnf_pval( ipout )),
+ : %val( cnf_pval( ipout_var )), status )
+
+ else if( status .eq. sai__ok ) then
+ status = SAI__ERROR
+ call msg_setc( 'T', types(i) )
+ call err_rep( ' ', 'Bad data type (^T) supplied to '//
+ : 'rebin', status )
+ end if
+
+* Call the supplied function to test the results.
+ call testfun( 2, name, types(i),
+ : lbnd_in, ubnd_in, ipin, ipin_var,
+ : lbnd_out, ubnd_out, ipout, ipout_var,
+ : lbnd, ubnd, m, params, tol,
+ : spreads(j), status )
+
+* Report the data type and spread function if an error occurred, and
+* abort.
+ if( status .ne. sai__ok ) then
+ call msg_seti( 'sf', j )
+ call msg_setc( 'dt', types( i ) )
+ call msg_setc( 't', name )
+ call err_rep( ' ', '^t failed: Spread function ^sf '//
+ : 'data type ^dt', status )
+ go to 999
+ end if
+
+ end do
+
+* Free resources.
+ call psx_free( ipout, status )
+ call psx_free( ipout_var, status )
+ call psx_free( ipin, status )
+ call psx_free( ipin_var, status )
+ end do
+
+ 999 continue
+
+ end
+
+ LOGICAL FUNCTION EQUALB( A, B )
+ IMPLICIT NONE
+ BYTE A, B
+ EQUALB = ( A .EQ. B )
+ END
+
+ LOGICAL FUNCTION EQUALD( A, B )
+ IMPLICIT NONE
+ INCLUDE 'PRM_PAR'
+ DOUBLE PRECISION A, B
+ IF( A .NE. 0.0D0 .AND. B .NE. 0.0D0 ) THEN
+ EQUALD = ( ABS( A - B ) .LE. 1.0E9*ABS( A + B )*VAL__EPSD )
+ ELSE
+ EQUALD = ( ABS( A + B ) .LE. 1.0D-11 )
+ END IF
+
+ END
+
+ LOGICAL FUNCTION MYEQUALD( A, B )
+ IMPLICIT NONE
+ DOUBLE PRECISION A, B
+ LOGICAL EQUALD
+ MYEQUALD = EQUALD( A, B )
+ END
+
+ LOGICAL FUNCTION EQUALI( A, B )
+ IMPLICIT NONE
+ INTEGER A, B
+ EQUALI = ( A .EQ. B )
+
+ END
+
+ LOGICAL FUNCTION EQUALR( A, B )
+ IMPLICIT NONE
+ INCLUDE 'PRM_PAR'
+ REAL A, B
+
+ IF( A .NE. 0.0 .AND. B .NE. 0.0 ) THEN
+ EQUALR = ( ABS( A - B ) .LE. 50.0*ABS( A + B )*VAL__EPSR )
+ ELSE
+ EQUALR = ( ABS( A + B ) .LE. 1.0E-11 )
+ END IF
+
+ END
+
+ LOGICAL FUNCTION EQUALW( A, B )
+ IMPLICIT NONE
+ INTEGER*2 A, B
+ EQUALW = ( A .EQ. B )
+ END
+
+
+
+
+* -----------------------------------------------
+* Test 7
+*
+
+ SUBROUTINE TEST7( DO, NAME, TYPE,
+ : LBND_IN, UBND_IN, IPIN, IPIN_VAR,
+ : LBND_OUT, UBND_OUT, IPOUT, IPOUT_VAR,
+ : LBND, UBND, M, PARAMS, TOL, J, STATUS )
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'CNF_PAR'
+
+ INTEGER M, LBND_IN(*), UBND_IN(*), LBND_OUT(*), UBND_OUT(*),
+ : LBND(*), UBND(*), IPIN, IPIN_VAR, IPOUT, IPOUT_VAR,
+ : STATUS, DO, J
+ DOUBLE PRECISION TOL, PARAMS(*)
+ CHARACTER TYPE*(*), NAME*(*)
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ NAME = 'TEST7'
+
+* Fill the input data and variance arrays if required.
+ IF( TYPE .EQ. '_REAL' ) THEN
+ CALL TEST7R( DO, LBND_IN, UBND_IN, %VAL(CNF_PVAL(IPIN)),
+ : %VAL(CNF_PVAL(IPIN_VAR)), LBND_OUT, UBND_OUT,
+ : %VAL(CNF_PVAL(IPOUT)),%VAL(CNF_PVAL(IPOUT_VAR)),
+ : LBND, UBND, M, PARAMS, TOL, J, STATUS )
+
+ ELSE IF( TYPE .EQ. '_DOUBLE' ) THEN
+ CALL TEST7D( DO, LBND_IN, UBND_IN, %VAL(CNF_PVAL(IPIN)),
+ : %VAL(CNF_PVAL(IPIN_VAR)), LBND_OUT, UBND_OUT,
+ : %VAL(CNF_PVAL(IPOUT)),%VAL(CNF_PVAL(IPOUT_VAR)),
+ : LBND, UBND, M, PARAMS, TOL, J, STATUS )
+
+ ELSE IF( TYPE .EQ. '_INTEGER' ) THEN
+ CALL TEST7I( DO, LBND_IN, UBND_IN, %VAL(CNF_PVAL(IPIN)),
+ : %VAL(CNF_PVAL(IPIN_VAR)), LBND_OUT, UBND_OUT,
+ : %VAL(CNF_PVAL(IPOUT)),%VAL(CNF_PVAL(IPOUT_VAR)),
+ : LBND, UBND, M, PARAMS, TOL, J, STATUS )
+
+ ELSE IF( STATUS .EQ. SAI__OK ) then
+ STATUS = SAI__ERROR
+ CALL MSG_SETC( 'T', TYPE )
+ CALL ERR_REP( ' ', 'Bad data type (^T) supplied to TEST7',
+ : STATUS )
+ END IF
+
+ END
+
+
+
+
+ SUBROUTINE TEST7D( DO, LBND_IN, UBND_IN, IN, IN_VAR, LBND_OUT,
+ : UBND_OUT, OUT, OUT_VAR, LBND, UBND, M,
+ : PARAMS, TOL, SPREAD, STATUS )
+
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'PRM_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'NUM_DEC'
+ INCLUDE 'CNF_PAR'
+ INCLUDE 'NUM_DEF'
+
+ INTEGER DO, LBND_IN(*), UBND_IN(*), LBND_OUT(*), UBND_OUT(*),
+ : SPREAD, LBND(*), UBND(*), STATUS, M, I, NZ
+ DOUBLE PRECISION IN(*), IN_VAR(*), OUT(*), OUT_VAR(*), SUM, KT
+ DOUBLE PRECISION TOL, PARAMS(*), K
+ LOGICAL EQUALD, MYEQUALD, GOOD
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ K = MIN( 1000.0D0, NUM_DTOD( VAL__MAXD )/20.0 )
+
+* Return the scalar parameters of the test if required.
+ IF( DO .EQ. 0 ) THEN
+ LBND_IN( 1 ) = 10
+ UBND_IN( 1 ) = 19
+ LBND_OUT( 1 ) = 12
+ UBND_OUT( 1 ) = 20
+ LBND( 1 ) = 11
+ UBND( 1 ) = 17
+ M = AST_SHIFTMAP( 1, 1.5D0, ' ', STATUS )
+ PARAMS(1) = 2.0
+ PARAMS(2) = 2.0
+ TOL = 0.1
+
+* Fill the input data and variance arrays if required.
+ ELSE IF( DO .EQ. 1 ) THEN
+ DO I = LBND_IN(1), UBND_IN(1)
+ IN( I - LBND_IN(1) + 1 ) = 0
+ IN_VAR( I - LBND_IN(1) + 1 ) = K
+ END DO
+ IN( 14 - LBND_IN(1) + 1 ) = K
+
+* Otherwise check output data and variance arrays look right.
+ ELSE
+
+ SUM = 0
+ DO I = LBND_OUT(1), UBND_OUT(1)
+ IF( OUT( I - LBND_OUT(1) + 1) .NE. VAL__BADD ) THEN
+ SUM = SUM + OUT( I - LBND_OUT(1) + 1)
+ END IF
+ END DO
+
+ KT = K
+
+
+ IF( 'D' .EQ. 'R' .OR. 'D' .EQ. 'D' ) THEN
+ GOOD = EQUALD( SUM, KT )
+ ELSE
+ GOOD = ( ABS( SUM - KT ) .LT. 3 )
+ END IF
+
+ IF( .NOT. GOOD ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'K', dble( KT ) )
+ CALL MSG_SETD( 'S', dble( SUM ) )
+ CALL ERR_REP( ' ', 'TEST7D Data sum is ^S should be ^K',
+ : STATUS )
+ END IF
+
+ IF( SPREAD .EQ. AST__NEAREST ) THEN
+ NZ = 0
+ DO I = LBND_OUT(1), UBND_OUT(1)
+ IF( OUT( I - LBND_OUT(1) + 1) .NE. 0 .AND.
+ : OUT( I - LBND_OUT(1) + 1) .NE. VAL__BADD ) THEN
+ IF( NZ .EQ. 0 ) THEN
+ NZ = NZ + 1
+ IF( OUT( I - LBND_OUT(1) + 1) .NE. KT ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', I )
+ CALL MSG_SETD( 'D1',
+ : DBLE( OUT( I - LBND_OUT(1) + 1)))
+ CALL MSG_SETD( 'K', dble( KT ) )
+ CALL ERR_REP( ' ', 'TEST7D ^I: ^D1 ^K',
+ : STATUS )
+ END IF
+ ELSE
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', I )
+ CALL MSG_SETD( 'D1',
+ : DBLE( OUT( I - LBND_OUT(1) + 1)))
+ CALL ERR_REP( ' ', 'TEST7D ^I: ^D1',
+ : STATUS )
+ END IF
+ END IF
+ END DO
+
+ ELSE
+ DO I = 0, 3
+ IF( .NOT. EQUALD( OUT( 15 - I - LBND_OUT(1) + 1 ),
+ : OUT( 16 + I - LBND_OUT(1) + 1 ) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I1', 15 - I )
+ CALL MSG_SETI( 'I2', 16 + I )
+ CALL MSG_SETD( 'D1',
+ : DBLE( OUT( 15 - I - LBND_OUT(1) + 1)))
+ CALL MSG_SETD( 'D2',
+ : DBLE( OUT( 16 + I - LBND_OUT(1) + 1)))
+ CALL ERR_REP( ' ', 'TEST7D ^I1 (^D1) != '//
+ : '^I2 (^D2)', STATUS )
+ END IF
+ END DO
+ END IF
+
+ END IF
+
+ END
+
+
+ SUBROUTINE TEST7I( DO, LBND_IN, UBND_IN, IN, IN_VAR, LBND_OUT,
+ : UBND_OUT, OUT, OUT_VAR, LBND, UBND, M,
+ : PARAMS, TOL, SPREAD, STATUS )
+
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'PRM_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'CNF_PAR'
+ INCLUDE 'NUM_DEC'
+ INCLUDE 'NUM_DEF'
+
+ INTEGER DO, LBND_IN(*), UBND_IN(*), LBND_OUT(*), UBND_OUT(*),
+ : SPREAD, LBND(*), UBND(*), STATUS, M, I, NZ
+ INTEGER IN(*), IN_VAR(*), OUT(*), OUT_VAR(*), SUM, KT
+ DOUBLE PRECISION TOL, PARAMS(*), K
+ LOGICAL EQUALI, MYEQUALD, GOOD
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ K = MIN( 1000.0D0, NUM_ITOD( VAL__MAXI )/20.0 )
+
+* Return the scalar parameters of the test if required.
+ IF( DO .EQ. 0 ) THEN
+ LBND_IN( 1 ) = 10
+ UBND_IN( 1 ) = 19
+ LBND_OUT( 1 ) = 12
+ UBND_OUT( 1 ) = 20
+ LBND( 1 ) = 11
+ UBND( 1 ) = 17
+ M = AST_SHIFTMAP( 1, 1.5D0, ' ', STATUS )
+ PARAMS(1) = 2.0
+ PARAMS(2) = 2.0
+ TOL = 0.1
+
+* Fill the input data and variance arrays if required.
+ ELSE IF( DO .EQ. 1 ) THEN
+ DO I = LBND_IN(1), UBND_IN(1)
+ IN( I - LBND_IN(1) + 1 ) = 0
+ IN_VAR( I - LBND_IN(1) + 1 ) = K
+ END DO
+ IN( 14 - LBND_IN(1) + 1 ) = K
+
+* Otherwise check output data and variance arrays look right.
+ ELSE
+
+ SUM = 0
+ DO I = LBND_OUT(1), UBND_OUT(1)
+ IF( OUT( I - LBND_OUT(1) + 1) .NE. VAL__BADI ) THEN
+ SUM = SUM + OUT( I - LBND_OUT(1) + 1)
+ END IF
+ END DO
+
+ KT = K
+
+
+ IF( 'I' .EQ. 'R' .OR. 'I' .EQ. 'D' ) THEN
+ GOOD = EQUALI( SUM, KT )
+ ELSE
+ GOOD = ( ABS( SUM - KT ) .LT. 3 )
+ END IF
+
+ IF( .NOT. GOOD ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'K', dble( KT ) )
+ CALL MSG_SETD( 'S', dble( SUM ) )
+ CALL ERR_REP( ' ', 'TEST7I Data sum is ^S should be ^K',
+ : STATUS )
+ END IF
+
+ IF( SPREAD .EQ. AST__NEAREST ) THEN
+ NZ = 0
+ DO I = LBND_OUT(1), UBND_OUT(1)
+ IF( OUT( I - LBND_OUT(1) + 1) .NE. 0 .AND.
+ : OUT( I - LBND_OUT(1) + 1) .NE. VAL__BADI ) THEN
+ IF( NZ .EQ. 0 ) THEN
+ NZ = NZ + 1
+ IF( OUT( I - LBND_OUT(1) + 1) .NE. KT ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', I )
+ CALL MSG_SETD( 'D1',
+ : DBLE( OUT( I - LBND_OUT(1) + 1)))
+ CALL MSG_SETD( 'K', dble( KT ) )
+ CALL ERR_REP( ' ', 'TEST7I ^I: ^D1 ^K',
+ : STATUS )
+ END IF
+ ELSE
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', I )
+ CALL MSG_SETD( 'D1',
+ : DBLE( OUT( I - LBND_OUT(1) + 1)))
+ CALL ERR_REP( ' ', 'TEST7I ^I: ^D1',
+ : STATUS )
+ END IF
+ END IF
+ END DO
+
+ ELSE
+ DO I = 0, 3
+ IF( .NOT. EQUALI( OUT( 15 - I - LBND_OUT(1) + 1 ),
+ : OUT( 16 + I - LBND_OUT(1) + 1 ) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I1', 15 - I )
+ CALL MSG_SETI( 'I2', 16 + I )
+ CALL MSG_SETD( 'D1',
+ : DBLE( OUT( 15 - I - LBND_OUT(1) + 1)))
+ CALL MSG_SETD( 'D2',
+ : DBLE( OUT( 16 + I - LBND_OUT(1) + 1)))
+ CALL ERR_REP( ' ', 'TEST7I ^I1 (^D1) != '//
+ : '^I2 (^D2)', STATUS )
+ END IF
+ END DO
+ END IF
+
+ END IF
+
+ END
+
+
+ SUBROUTINE TEST7R( DO, LBND_IN, UBND_IN, IN, IN_VAR, LBND_OUT,
+ : UBND_OUT, OUT, OUT_VAR, LBND, UBND, M,
+ : PARAMS, TOL, SPREAD, STATUS )
+
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'PRM_PAR'
+ INCLUDE 'CNF_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'NUM_DEC'
+ INCLUDE 'NUM_DEF'
+
+ INTEGER DO, LBND_IN(*), UBND_IN(*), LBND_OUT(*), UBND_OUT(*),
+ : SPREAD, LBND(*), UBND(*), STATUS, M, I, NZ
+ REAL IN(*), IN_VAR(*), OUT(*), OUT_VAR(*), SUM, KT
+ DOUBLE PRECISION TOL, PARAMS(*), K
+ LOGICAL EQUALR, MYEQUALD, GOOD
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ K = MIN( 1000.0D0, NUM_RTOD( VAL__MAXR )/20.0 )
+
+* Return the scalar parameters of the test if required.
+ IF( DO .EQ. 0 ) THEN
+ LBND_IN( 1 ) = 10
+ UBND_IN( 1 ) = 19
+ LBND_OUT( 1 ) = 12
+ UBND_OUT( 1 ) = 20
+ LBND( 1 ) = 11
+ UBND( 1 ) = 17
+ M = AST_SHIFTMAP( 1, 1.5D0, ' ', STATUS )
+ PARAMS(1) = 2.0
+ PARAMS(2) = 2.0
+ TOL = 0.1
+
+* Fill the input data and variance arrays if required.
+ ELSE IF( DO .EQ. 1 ) THEN
+ DO I = LBND_IN(1), UBND_IN(1)
+ IN( I - LBND_IN(1) + 1 ) = 0
+ IN_VAR( I - LBND_IN(1) + 1 ) = K
+ END DO
+ IN( 14 - LBND_IN(1) + 1 ) = K
+
+* Otherwise check output data and variance arrays look right.
+ ELSE
+
+ SUM = 0
+ DO I = LBND_OUT(1), UBND_OUT(1)
+ IF( OUT( I - LBND_OUT(1) + 1) .NE. VAL__BADR ) THEN
+ SUM = SUM + OUT( I - LBND_OUT(1) + 1)
+ END IF
+ END DO
+
+ KT = K
+
+
+ IF( 'R' .EQ. 'R' .OR. 'R' .EQ. 'D' ) THEN
+ GOOD = EQUALR( SUM, KT )
+ ELSE
+ GOOD = ( ABS( SUM - KT ) .LT. 3 )
+ END IF
+
+ IF( .NOT. GOOD ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'K', dble( KT ) )
+ CALL MSG_SETD( 'S', dble( SUM ) )
+ CALL ERR_REP( ' ', 'TEST7R Data sum is ^S should be ^K',
+ : STATUS )
+ END IF
+
+ IF( SPREAD .EQ. AST__NEAREST ) THEN
+ NZ = 0
+ DO I = LBND_OUT(1), UBND_OUT(1)
+ IF( OUT( I - LBND_OUT(1) + 1) .NE. 0 .AND.
+ : OUT( I - LBND_OUT(1) + 1) .NE. VAL__BADR ) THEN
+ IF( NZ .EQ. 0 ) THEN
+ NZ = NZ + 1
+ IF( OUT( I - LBND_OUT(1) + 1) .NE. KT ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', I )
+ CALL MSG_SETD( 'D1',
+ : DBLE( OUT( I - LBND_OUT(1) + 1)))
+ CALL MSG_SETD( 'K', dble( KT ) )
+ CALL ERR_REP( ' ', 'TEST7R ^I: ^D1 ^K',
+ : STATUS )
+ END IF
+ ELSE
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', I )
+ CALL MSG_SETD( 'D1',
+ : DBLE( OUT( I - LBND_OUT(1) + 1)))
+ CALL ERR_REP( ' ', 'TEST7R ^I: ^D1',
+ : STATUS )
+ END IF
+ END IF
+ END DO
+
+ ELSE
+ DO I = 0, 3
+ IF( .NOT. EQUALR( OUT( 15 - I - LBND_OUT(1) + 1 ),
+ : OUT( 16 + I - LBND_OUT(1) + 1 ) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I1', 15 - I )
+ CALL MSG_SETI( 'I2', 16 + I )
+ CALL MSG_SETD( 'D1',
+ : DBLE( OUT( 15 - I - LBND_OUT(1) + 1)))
+ CALL MSG_SETD( 'D2',
+ : DBLE( OUT( 16 + I - LBND_OUT(1) + 1)))
+ CALL ERR_REP( ' ', 'TEST7R ^I1 (^D1) != '//
+ : '^I2 (^D2)', STATUS )
+ END IF
+ END DO
+ END IF
+
+ END IF
+
+ END
+
+
+
+
+* -----------------------------------------------
+* Test 8
+*
+
+ SUBROUTINE TEST8( DO, NAME, TYPE,
+ : LBND_IN, UBND_IN, IPIN, IPIN_VAR,
+ : LBND_OUT, UBND_OUT, IPOUT, IPOUT_VAR,
+ : LBND, UBND, M, PARAMS, TOL, J, STATUS )
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'CNF_PAR'
+
+ INTEGER M, LBND_IN(*), UBND_IN(*), LBND_OUT(*), UBND_OUT(*),
+ : LBND(*), UBND(*), IPIN, IPIN_VAR, IPOUT, IPOUT_VAR,
+ : STATUS, DO, J
+ DOUBLE PRECISION TOL, PARAMS(*)
+ CHARACTER TYPE*(*), NAME*(*)
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ NAME = 'TEST8'
+
+* Fill the input data and variance arrays if required.
+ IF( TYPE .EQ. '_REAL' ) THEN
+ CALL TEST8R( DO, LBND_IN, UBND_IN, %VAL(CNF_PVAL(IPIN)),
+ : %VAL(CNF_PVAL(IPIN_VAR)), LBND_OUT, UBND_OUT,
+ : %VAL(CNF_PVAL(IPOUT)),%VAL(CNF_PVAL(IPOUT_VAR)),
+ : LBND, UBND, M, PARAMS, TOL, J, STATUS )
+
+ ELSE IF( TYPE .EQ. '_DOUBLE' ) THEN
+ CALL TEST8D( DO, LBND_IN, UBND_IN, %VAL(CNF_PVAL(IPIN)),
+ : %VAL(CNF_PVAL(IPIN_VAR)), LBND_OUT, UBND_OUT,
+ : %VAL(CNF_PVAL(IPOUT)),%VAL(CNF_PVAL(IPOUT_VAR)),
+ : LBND, UBND, M, PARAMS, TOL, J, STATUS )
+
+ ELSE IF( TYPE .EQ. '_INTEGER' ) THEN
+ CALL TEST8I( DO, LBND_IN, UBND_IN, %VAL(CNF_PVAL(IPIN)),
+ : %VAL(CNF_PVAL(IPIN_VAR)), LBND_OUT, UBND_OUT,
+ : %VAL(CNF_PVAL(IPOUT)),%VAL(CNF_PVAL(IPOUT_VAR)),
+ : LBND, UBND, M, PARAMS, TOL, J, STATUS )
+
+ ELSE IF( STATUS .EQ. SAI__OK ) then
+ STATUS = SAI__ERROR
+ CALL MSG_SETC( 'T', TYPE )
+ CALL ERR_REP( ' ', 'Bad data type (^T) supplied to TEST8',
+ : STATUS )
+ END IF
+
+ END
+
+
+
+
+ SUBROUTINE TEST8D( DO, LBND_IN, UBND_IN, IN, IN_VAR, LBND_OUT,
+ : UBND_OUT, OUT, OUT_VAR, LBND, UBND, M,
+ : PARAMS, TOL, SPREAD, STATUS )
+
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'PRM_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'CNF_PAR'
+ INCLUDE 'NUM_DEC'
+ INCLUDE 'NUM_DEF'
+
+ INTEGER DO, LBND_IN(*), UBND_IN(*), LBND_OUT(*), UBND_OUT(*),
+ : SPREAD, LBND(*), UBND(*), STATUS, M, I, J, K, NZ,
+ : II, JJ, KK
+ DOUBLE PRECISION IN(*), IN_VAR(*), OUT(*), OUT_VAR(*), SUM, KT
+ DOUBLE PRECISION TOL, PARAMS(*), KFAC, SHIFTS(2)
+ LOGICAL EQUALD, GOOD
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ KFAC = MIN( 10000.0D0, NUM_DTOD( VAL__MAXD )/20.0 )
+
+* Return the scalar parameters of the test if required.
+ IF( DO .EQ. 0 ) THEN
+ LBND_IN( 1 ) = -2
+ UBND_IN( 1 ) = 3
+ LBND_OUT( 1 ) = -2
+ UBND_OUT( 1 ) = 3
+ LBND( 1 ) = -2
+ UBND( 1 ) = 3
+ LBND_IN( 2 ) = 0
+ UBND_IN( 2 ) = 5
+ LBND_OUT( 2 ) = 0
+ UBND_OUT( 2 ) = 5
+ LBND( 2 ) = 0
+ UBND( 2 ) = 5
+ SHIFTS(1) = 0.5D0
+ SHIFTS(2) = -0.5D0
+ M = AST_SHIFTMAP( 2, SHIFTS, ' ', STATUS )
+ PARAMS(1) = 2.0
+ PARAMS(2) = 2.0
+ TOL = 0.0
+
+* Fill the input data and variance arrays if required.
+ ELSE IF( DO .EQ. 1 ) THEN
+ K = 1
+ DO J = LBND_IN(2), UBND_IN(2)
+ DO I = LBND_IN(1), UBND_IN(1)
+ IN( K ) = 0
+ IN_VAR( K ) = KFAC
+ K = K + 1
+ END DO
+ END DO
+ IN( 21 ) = KFAC
+
+* Otherwise check output data and variance arrays look right.
+ ELSE
+ K = 0
+ SUM = 0
+ DO J = LBND_OUT(2), UBND_OUT(2)
+ DO I = LBND_OUT(1), UBND_OUT(1)
+ K = K + 1
+ IF( OUT( K ) .NE. VAL__BADD ) THEN
+ SUM = SUM + OUT( K )
+ END IF
+ END DO
+ END DO
+
+ KT = KFAC
+
+ IF( 'D' .EQ. 'R' .OR. 'D' .EQ. 'D' ) THEN
+ GOOD = EQUALD( SUM, KT )
+ ELSE
+ GOOD = ( ABS( SUM - KT ) .LT. 5 )
+ END IF
+
+ IF( .NOT. GOOD ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'K', dble( KT ) )
+ CALL MSG_SETD( 'S', dble( SUM ) )
+ CALL ERR_REP( ' ', 'TEST8D Data sum is ^S should be ^K',
+ : STATUS )
+ GO TO 999
+ END IF
+
+ IF( SPREAD .EQ. AST__NEAREST ) THEN
+ NZ = 0
+ K = 0
+ DO J = LBND_OUT(2), UBND_OUT(2)
+ DO I = LBND_OUT(1), UBND_OUT(1)
+ K = K + 1
+ IF( OUT( K ) .NE. 0 .AND.
+ : OUT( K ) .NE. VAL__BADD ) THEN
+ IF( NZ .EQ. 0 ) THEN
+ NZ = NZ + 1
+ IF( OUT( K ) .NE. KT ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'K', K )
+ CALL MSG_SETD( 'D1', DBLE( OUT( K )))
+ CALL MSG_SETD( 'KT', DBLE( KT ) )
+ CALL ERR_REP( ' ', 'TEST8D ^K: ^D1 ^KT',
+ : STATUS )
+ GO TO 999
+ END IF
+ ELSE
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'K', K )
+ CALL MSG_SETD( 'D1', DBLE( OUT( K )))
+ CALL ERR_REP( ' ', 'TEST8D ^K: ^D1',
+ : STATUS )
+ GO TO 999
+ END IF
+ END IF
+ END DO
+ END DO
+ ELSE
+ K = 0
+ DO J = LBND_OUT(2), UBND_OUT(2)
+ DO I = LBND_OUT(1), UBND_OUT(1)
+ K = K + 1
+ II = 1 - I
+ JJ = 5 - J
+ IF( II .GE. LBND_OUT(1) .AND.
+ : II .LE. UBND_OUT(1) .AND.
+ : JJ .GE. LBND_OUT(2) .AND.
+ : JJ .LE. UBND_OUT(2) ) THEN
+ KK = 6*JJ + ( II + 3 )
+
+ IF( .NOT. EQUALD( OUT( KK ), OUT( K ) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'KK', KK )
+ CALL MSG_SETI( 'K', K )
+ CALL MSG_SETD( 'D1', DBLE( OUT(KK) ) )
+ CALL MSG_SETD( 'D2', DBLE( OUT(K) ) )
+ CALL ERR_REP( ' ', 'TEST8D ^KK (^D1) != '//
+ : '^K (^D2)', STATUS )
+ GO TO 999
+ END IF
+ END IF
+ END DO
+ END DO
+ END IF
+
+ END IF
+
+ 999 CONTINUE
+
+ END
+
+
+
+ SUBROUTINE TEST8I( DO, LBND_IN, UBND_IN, IN, IN_VAR, LBND_OUT,
+ : UBND_OUT, OUT, OUT_VAR, LBND, UBND, M,
+ : PARAMS, TOL, SPREAD, STATUS )
+
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'PRM_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'CNF_PAR'
+ INCLUDE 'NUM_DEC'
+ INCLUDE 'NUM_DEF'
+
+ INTEGER DO, LBND_IN(*), UBND_IN(*), LBND_OUT(*), UBND_OUT(*),
+ : SPREAD, LBND(*), UBND(*), STATUS, M, I, J, K, NZ,
+ : II, JJ, KK
+ INTEGER IN(*), IN_VAR(*), OUT(*), OUT_VAR(*), SUM, KT
+ DOUBLE PRECISION TOL, PARAMS(*), KFAC, SHIFTS(2)
+ LOGICAL EQUALI, GOOD
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ KFAC = MIN( 10000.0D0, NUM_ITOD( VAL__MAXI )/20.0 )
+
+* Return the scalar parameters of the test if required.
+ IF( DO .EQ. 0 ) THEN
+ LBND_IN( 1 ) = -2
+ UBND_IN( 1 ) = 3
+ LBND_OUT( 1 ) = -2
+ UBND_OUT( 1 ) = 3
+ LBND( 1 ) = -2
+ UBND( 1 ) = 3
+ LBND_IN( 2 ) = 0
+ UBND_IN( 2 ) = 5
+ LBND_OUT( 2 ) = 0
+ UBND_OUT( 2 ) = 5
+ LBND( 2 ) = 0
+ UBND( 2 ) = 5
+ SHIFTS(1) = 0.5D0
+ SHIFTS(2) = -0.5D0
+ M = AST_SHIFTMAP( 2, SHIFTS, ' ', STATUS )
+ PARAMS(1) = 2.0
+ PARAMS(2) = 2.0
+ TOL = 0.0
+
+* Fill the input data and variance arrays if required.
+ ELSE IF( DO .EQ. 1 ) THEN
+ K = 1
+ DO J = LBND_IN(2), UBND_IN(2)
+ DO I = LBND_IN(1), UBND_IN(1)
+ IN( K ) = 0
+ IN_VAR( K ) = KFAC
+ K = K + 1
+ END DO
+ END DO
+ IN( 21 ) = KFAC
+
+* Otherwise check output data and variance arrays look right.
+ ELSE
+ K = 0
+ SUM = 0
+ DO J = LBND_OUT(2), UBND_OUT(2)
+ DO I = LBND_OUT(1), UBND_OUT(1)
+ K = K + 1
+ IF( OUT( K ) .NE. VAL__BADI ) THEN
+ SUM = SUM + OUT( K )
+ END IF
+ END DO
+ END DO
+
+ KT = KFAC
+
+ IF( 'I' .EQ. 'R' .OR. 'I' .EQ. 'D' ) THEN
+ GOOD = EQUALI( SUM, KT )
+ ELSE
+ GOOD = ( ABS( SUM - KT ) .LT. 5 )
+ END IF
+
+ IF( .NOT. GOOD ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'K', dble( KT ) )
+ CALL MSG_SETD( 'S', dble( SUM ) )
+ CALL ERR_REP( ' ', 'TEST8I Data sum is ^S should be ^K',
+ : STATUS )
+ GO TO 999
+ END IF
+
+ IF( SPREAD .EQ. AST__NEAREST ) THEN
+ NZ = 0
+ K = 0
+ DO J = LBND_OUT(2), UBND_OUT(2)
+ DO I = LBND_OUT(1), UBND_OUT(1)
+ K = K + 1
+ IF( OUT( K ) .NE. 0 .AND.
+ : OUT( K ) .NE. VAL__BADI ) THEN
+ IF( NZ .EQ. 0 ) THEN
+ NZ = NZ + 1
+ IF( OUT( K ) .NE. KT ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'K', K )
+ CALL MSG_SETD( 'D1', DBLE( OUT( K )))
+ CALL MSG_SETD( 'KT', DBLE( KT ) )
+ CALL ERR_REP( ' ', 'TEST8I ^K: ^D1 ^KT',
+ : STATUS )
+ GO TO 999
+ END IF
+ ELSE
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'K', K )
+ CALL MSG_SETD( 'D1', DBLE( OUT( K )))
+ CALL ERR_REP( ' ', 'TEST8I ^K: ^D1',
+ : STATUS )
+ GO TO 999
+ END IF
+ END IF
+ END DO
+ END DO
+ ELSE
+ K = 0
+ DO J = LBND_OUT(2), UBND_OUT(2)
+ DO I = LBND_OUT(1), UBND_OUT(1)
+ K = K + 1
+ II = 1 - I
+ JJ = 5 - J
+ IF( II .GE. LBND_OUT(1) .AND.
+ : II .LE. UBND_OUT(1) .AND.
+ : JJ .GE. LBND_OUT(2) .AND.
+ : JJ .LE. UBND_OUT(2) ) THEN
+ KK = 6*JJ + ( II + 3 )
+
+ IF( .NOT. EQUALI( OUT( KK ), OUT( K ) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'KK', KK )
+ CALL MSG_SETI( 'K', K )
+ CALL MSG_SETD( 'D1', DBLE( OUT(KK) ) )
+ CALL MSG_SETD( 'D2', DBLE( OUT(K) ) )
+ CALL ERR_REP( ' ', 'TEST8I ^KK (^D1) != '//
+ : '^K (^D2)', STATUS )
+ GO TO 999
+ END IF
+ END IF
+ END DO
+ END DO
+ END IF
+
+ END IF
+
+ 999 CONTINUE
+
+ END
+
+
+
+ SUBROUTINE TEST8R( DO, LBND_IN, UBND_IN, IN, IN_VAR, LBND_OUT,
+ : UBND_OUT, OUT, OUT_VAR, LBND, UBND, M,
+ : PARAMS, TOL, SPREAD, STATUS )
+
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'PRM_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'CNF_PAR'
+ INCLUDE 'NUM_DEC'
+ INCLUDE 'NUM_DEF'
+
+ INTEGER DO, LBND_IN(*), UBND_IN(*), LBND_OUT(*), UBND_OUT(*),
+ : SPREAD, LBND(*), UBND(*), STATUS, M, I, J, K, NZ,
+ : II, JJ, KK
+ REAL IN(*), IN_VAR(*), OUT(*), OUT_VAR(*), SUM, KT
+ DOUBLE PRECISION TOL, PARAMS(*), KFAC, SHIFTS(2)
+ LOGICAL EQUALR, GOOD
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ KFAC = MIN( 10000.0D0, NUM_RTOD( VAL__MAXR )/20.0 )
+
+* Return the scalar parameters of the test if required.
+ IF( DO .EQ. 0 ) THEN
+ LBND_IN( 1 ) = -2
+ UBND_IN( 1 ) = 3
+ LBND_OUT( 1 ) = -2
+ UBND_OUT( 1 ) = 3
+ LBND( 1 ) = -2
+ UBND( 1 ) = 3
+ LBND_IN( 2 ) = 0
+ UBND_IN( 2 ) = 5
+ LBND_OUT( 2 ) = 0
+ UBND_OUT( 2 ) = 5
+ LBND( 2 ) = 0
+ UBND( 2 ) = 5
+ SHIFTS(1) = 0.5D0
+ SHIFTS(2) = -0.5D0
+ M = AST_SHIFTMAP( 2, SHIFTS, ' ', STATUS )
+ PARAMS(1) = 2.0
+ PARAMS(2) = 2.0
+ TOL = 0.0
+
+* Fill the input data and variance arrays if required.
+ ELSE IF( DO .EQ. 1 ) THEN
+ K = 1
+ DO J = LBND_IN(2), UBND_IN(2)
+ DO I = LBND_IN(1), UBND_IN(1)
+ IN( K ) = 0
+ IN_VAR( K ) = KFAC
+ K = K + 1
+ END DO
+ END DO
+ IN( 21 ) = KFAC
+
+* Otherwise check output data and variance arrays look right.
+ ELSE
+ K = 0
+ SUM = 0
+ DO J = LBND_OUT(2), UBND_OUT(2)
+ DO I = LBND_OUT(1), UBND_OUT(1)
+ K = K + 1
+ IF( OUT( K ) .NE. VAL__BADR ) THEN
+ SUM = SUM + OUT( K )
+ END IF
+ END DO
+ END DO
+
+ KT = KFAC
+
+ IF( 'R' .EQ. 'R' .OR. 'R' .EQ. 'D' ) THEN
+ GOOD = EQUALR( SUM, KT )
+ ELSE
+ GOOD = ( ABS( SUM - KT ) .LT. 5 )
+ END IF
+
+ IF( .NOT. GOOD ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'K', dble( KT ) )
+ CALL MSG_SETD( 'S', dble( SUM ) )
+ CALL ERR_REP( ' ', 'TEST8R Data sum is ^S should be ^K',
+ : STATUS )
+ GO TO 999
+ END IF
+
+ IF( SPREAD .EQ. AST__NEAREST ) THEN
+ NZ = 0
+ K = 0
+ DO J = LBND_OUT(2), UBND_OUT(2)
+ DO I = LBND_OUT(1), UBND_OUT(1)
+ K = K + 1
+ IF( OUT( K ) .NE. 0 .AND.
+ : OUT( K ) .NE. VAL__BADR ) THEN
+ IF( NZ .EQ. 0 ) THEN
+ NZ = NZ + 1
+ IF( OUT( K ) .NE. KT ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'K', K )
+ CALL MSG_SETD( 'D1', DBLE( OUT( K )))
+ CALL MSG_SETD( 'KT', DBLE( KT ) )
+ CALL ERR_REP( ' ', 'TEST8R ^K: ^D1 ^KT',
+ : STATUS )
+ GO TO 999
+ END IF
+ ELSE
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'K', K )
+ CALL MSG_SETD( 'D1', DBLE( OUT( K )))
+ CALL ERR_REP( ' ', 'TEST8R ^K: ^D1',
+ : STATUS )
+ GO TO 999
+ END IF
+ END IF
+ END DO
+ END DO
+ ELSE
+ K = 0
+ DO J = LBND_OUT(2), UBND_OUT(2)
+ DO I = LBND_OUT(1), UBND_OUT(1)
+ K = K + 1
+ II = 1 - I
+ JJ = 5 - J
+ IF( II .GE. LBND_OUT(1) .AND.
+ : II .LE. UBND_OUT(1) .AND.
+ : JJ .GE. LBND_OUT(2) .AND.
+ : JJ .LE. UBND_OUT(2) ) THEN
+ KK = 6*JJ + ( II + 3 )
+
+ IF( .NOT. EQUALR( OUT( KK ), OUT( K ) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'KK', KK )
+ CALL MSG_SETI( 'K', K )
+ CALL MSG_SETD( 'D1', DBLE( OUT(KK) ) )
+ CALL MSG_SETD( 'D2', DBLE( OUT(K) ) )
+ CALL ERR_REP( ' ', 'TEST8R ^KK (^D1) != '//
+ : '^K (^D2)', STATUS )
+ GO TO 999
+ END IF
+ END IF
+ END DO
+ END DO
+ END IF
+
+ END IF
+
+ 999 CONTINUE
+
+ END
+
+
+
+
+
+* -----------------------------------------------
+* Test 9
+*
+
+ SUBROUTINE TEST9( DO, NAME, TYPE,
+ : LBND_IN, UBND_IN, IPIN, IPIN_VAR,
+ : LBND_OUT, UBND_OUT, IPOUT, IPOUT_VAR,
+ : LBND, UBND, M, PARAMS, TOL, J, STATUS )
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'CNF_PAR'
+
+ INTEGER M, LBND_IN(*), UBND_IN(*), LBND_OUT(*), UBND_OUT(*),
+ : LBND(*), UBND(*), IPIN, IPIN_VAR, IPOUT, IPOUT_VAR,
+ : STATUS, DO, J
+ DOUBLE PRECISION TOL, PARAMS(*)
+ CHARACTER TYPE*(*), NAME*(*)
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ NAME = 'TEST9'
+
+* Fill the input data and variance arrays if required.
+ IF( TYPE .EQ. '_REAL' ) THEN
+ CALL TEST9R( DO, LBND_IN, UBND_IN, %VAL(CNF_PVAL(IPIN)),
+ : %VAL(CNF_PVAL(IPIN_VAR)), LBND_OUT, UBND_OUT,
+ : %VAL(CNF_PVAL(IPOUT)),%VAL(CNF_PVAL(IPOUT_VAR)),
+ : LBND, UBND, M, PARAMS, TOL, J, STATUS )
+
+ ELSE IF( TYPE .EQ. '_DOUBLE' ) THEN
+ CALL TEST9D( DO, LBND_IN, UBND_IN, %VAL(CNF_PVAL(IPIN)),
+ : %VAL(CNF_PVAL(IPIN_VAR)), LBND_OUT, UBND_OUT,
+ : %VAL(CNF_PVAL(IPOUT)),%VAL(CNF_PVAL(IPOUT_VAR)),
+ : LBND, UBND, M, PARAMS, TOL, J, STATUS )
+
+ ELSE IF( TYPE .EQ. '_INTEGER' ) THEN
+ CALL TEST9I( DO, LBND_IN, UBND_IN, %VAL(CNF_PVAL(IPIN)),
+ : %VAL(CNF_PVAL(IPIN_VAR)), LBND_OUT, UBND_OUT,
+ : %VAL(CNF_PVAL(IPOUT)),%VAL(CNF_PVAL(IPOUT_VAR)),
+ : LBND, UBND, M, PARAMS, TOL, J, STATUS )
+
+ ELSE IF( STATUS .EQ. SAI__OK ) then
+ STATUS = SAI__ERROR
+ CALL MSG_SETC( 'T', TYPE )
+ CALL ERR_REP( ' ', 'Bad data type (^T) supplied to TEST9',
+ : STATUS )
+ END IF
+
+ END
+
+
+
+
+ SUBROUTINE TEST9D( DO, LBND_IN, UBND_IN, IN, IN_VAR, LBND_OUT,
+ : UBND_OUT, OUT, OUT_VAR, LBND, UBND, M,
+ : PARAMS, TOL, SPREAD, STATUS )
+
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'PRM_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'CNF_PAR'
+ INCLUDE 'NUM_DEC'
+ INCLUDE 'NUM_DEF'
+
+ INTEGER DO, LBND_IN(*), UBND_IN(*), LBND_OUT(*), UBND_OUT(*),
+ : SPREAD, LBND(*), UBND(*), STATUS, M, I, J, K, L, K2
+ DOUBLE PRECISION IN(*), IN_VAR(*), OUT(*), OUT_VAR(*), KT, SUM
+ DOUBLE PRECISION TOL, PARAMS(*), KFAC, SHIFTS(3), G(3), W
+ LOGICAL EQUALD, GOOD, MYEQUALD
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ KFAC = MIN( 10000.0D0, NUM_DTOD( VAL__MAXD )/20.0 )
+
+* Return the scalar parameters of the test if required.
+ IF( DO .EQ. 0 ) THEN
+ LBND_IN( 1 ) = 0
+ UBND_IN( 1 ) = 6
+ LBND_OUT( 1 ) = 0
+ UBND_OUT( 1 ) = 6
+ LBND( 1 ) = 0
+ UBND( 1 ) = 6
+ LBND_IN( 2 ) = 0
+ UBND_IN( 2 ) = 6
+ LBND_OUT( 2 ) = 0
+ UBND_OUT( 2 ) = 6
+ LBND( 2 ) = 0
+ UBND( 2 ) = 6
+ LBND_IN( 3 ) = 0
+ UBND_IN( 3 ) = 6
+ LBND_OUT( 3 ) = 0
+ UBND_OUT( 3 ) = 6
+ LBND( 3 ) = 0
+ UBND( 3 ) = 6
+
+ IF( SPREAD .EQ. AST__NEAREST ) THEN
+ SHIFTS(1) = 1.7D0
+ SHIFTS(2) = 2.1D0
+ SHIFTS(3) = -1.2D0
+ ELSE
+ SHIFTS(1) = 0.5D0
+ SHIFTS(2) = 0.0D0
+ SHIFTS(3) = -0.5D0
+ END IF
+
+ M = AST_SHIFTMAP( 3, SHIFTS, ' ', STATUS )
+ PARAMS(1) = 2.0
+ PARAMS(2) = 2.0
+ TOL = 0.0
+
+* Fill the input data and variance arrays if required.
+ ELSE IF( DO .EQ. 1 ) THEN
+ K = 1
+ DO L = LBND_IN(3), UBND_IN(3)
+ DO J = LBND_IN(2), UBND_IN(2)
+ DO I = LBND_IN(1), UBND_IN(1)
+ IN( K ) = 0
+ IN_VAR( K ) = K
+ K = K + 1
+ END DO
+ END DO
+ END DO
+ IN( 172 ) = KFAC
+
+* Otherwise check output data and variance arrays look right.
+ ELSE
+ K = 0
+ SUM = 0
+ DO L = LBND_OUT(3), UBND_OUT(3)
+ DO J = LBND_OUT(2), UBND_OUT(2)
+ DO I = LBND_OUT(1), UBND_OUT(1)
+ K = K + 1
+ IF( OUT( K ) .NE. VAL__BADD ) THEN
+ SUM = SUM + OUT( K )
+ END IF
+ END DO
+ END DO
+ END DO
+
+ KT = KFAC
+
+ IF( 'D' .EQ. 'R' .OR. 'D' .EQ. 'D' ) THEN
+ GOOD = EQUALD( SUM, KT )
+ ELSE
+ GOOD = ( ABS( SUM - KT ) .LT. 5 )
+ END IF
+
+ IF( .NOT. GOOD ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'K', dble( KT ) )
+ CALL MSG_SETD( 'S', dble( SUM ) )
+ CALL ERR_REP( ' ', 'TEST9D Data sum is ^S should be ^K',
+ : STATUS )
+ GO TO 999
+ END IF
+
+ IF( SPREAD .EQ. AST__NEAREST ) THEN
+ K = 0
+ DO L = LBND_OUT(3), UBND_OUT(3)
+ DO J = LBND_OUT(2), UBND_OUT(2)
+ DO I = LBND_OUT(1), UBND_OUT(1)
+ K = K + 1
+ IF( K .EQ. 139 ) THEN
+ IF( .NOT. EQUALD( OUT(K), KT ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'K', DBLE( KT ) )
+ CALL MSG_SETD( 'O', DBLE( OUT(K) ) )
+ CALL ERR_REP( ' ', 'TEST9D El. 139 is '//
+ : '^O should be ^K', STATUS )
+ GO TO 999
+ END IF
+ ELSE
+ IF( .NOT. EQUALD( OUT(K), 0.0D0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'K', K )
+ CALL MSG_SETD( 'O', DBLE( OUT(K) ) )
+ CALL ERR_REP( ' ', 'TEST9D El. ^K is '//
+ : '^O should be zero', STATUS )
+ GO TO 999
+ END IF
+ END IF
+ END DO
+ END DO
+ END DO
+ ELSE
+
+ G(1) = 0.0
+ G(2) = 0.0
+ G(3) = 0.0
+ W = 0.0
+ K = 0
+ DO L = LBND_OUT(3), UBND_OUT(3)
+ DO J = LBND_OUT(2), UBND_OUT(2)
+ DO I = LBND_OUT(1), UBND_OUT(1)
+ K = K + 1
+ G(1) = G(1) + DBLE( I*OUT( k ) )
+ G(2) = G(2) + DBLE( J*OUT( K ) )
+ G(3) = G(3) + DBLE( L*OUT( K ) )
+ W = W + DBLE( OUT( K ) )
+ END DO
+ END DO
+ END DO
+
+ IF( .NOT. MYEQUALD( G(1)/W, 3.5D0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'A', G(1)/W )
+ CALL ERR_REP( ' ', 'TEST9D Mean X is ^A '//
+ : ' should be 3.5', STATUS )
+ GO TO 999
+ ELSE IF( .NOT. MYEQUALD( G(2)/W, 3.0D0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'A', G(2)/W )
+ CALL ERR_REP( ' ', 'TEST9D Mean Y is ^A '//
+ : ' should be 3.0', STATUS )
+ GO TO 999
+ ELSE IF( .NOT. MYEQUALD( G(3)/W, 2.5D0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'A', G(3)/W )
+ CALL ERR_REP( ' ', 'TEST9D Mean Z is ^A '//
+ : ' should be 2.5', STATUS )
+ GO TO 999
+ END IF
+
+ END IF
+ END IF
+
+ 999 CONTINUE
+
+ END
+
+
+
+ SUBROUTINE TEST9I( DO, LBND_IN, UBND_IN, IN, IN_VAR, LBND_OUT,
+ : UBND_OUT, OUT, OUT_VAR, LBND, UBND, M,
+ : PARAMS, TOL, SPREAD, STATUS )
+
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'PRM_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'CNF_PAR'
+ INCLUDE 'NUM_DEC'
+ INCLUDE 'NUM_DEF'
+
+ INTEGER DO, LBND_IN(*), UBND_IN(*), LBND_OUT(*), UBND_OUT(*),
+ : SPREAD, LBND(*), UBND(*), STATUS, M, I, J, K, L, K2
+ INTEGER IN(*), IN_VAR(*), OUT(*), OUT_VAR(*), KT, SUM
+ DOUBLE PRECISION TOL, PARAMS(*), KFAC, SHIFTS(3), G(3), W
+ LOGICAL EQUALI, GOOD, MYEQUALD
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ KFAC = MIN( 10000.0D0, NUM_ITOD( VAL__MAXI )/20.0 )
+
+* Return the scalar parameters of the test if required.
+ IF( DO .EQ. 0 ) THEN
+ LBND_IN( 1 ) = 0
+ UBND_IN( 1 ) = 6
+ LBND_OUT( 1 ) = 0
+ UBND_OUT( 1 ) = 6
+ LBND( 1 ) = 0
+ UBND( 1 ) = 6
+ LBND_IN( 2 ) = 0
+ UBND_IN( 2 ) = 6
+ LBND_OUT( 2 ) = 0
+ UBND_OUT( 2 ) = 6
+ LBND( 2 ) = 0
+ UBND( 2 ) = 6
+ LBND_IN( 3 ) = 0
+ UBND_IN( 3 ) = 6
+ LBND_OUT( 3 ) = 0
+ UBND_OUT( 3 ) = 6
+ LBND( 3 ) = 0
+ UBND( 3 ) = 6
+
+ IF( SPREAD .EQ. AST__NEAREST ) THEN
+ SHIFTS(1) = 1.7D0
+ SHIFTS(2) = 2.1D0
+ SHIFTS(3) = -1.2D0
+ ELSE
+ SHIFTS(1) = 0.5D0
+ SHIFTS(2) = 0.0D0
+ SHIFTS(3) = -0.5D0
+ END IF
+
+ M = AST_SHIFTMAP( 3, SHIFTS, ' ', STATUS )
+ PARAMS(1) = 2.0
+ PARAMS(2) = 2.0
+ TOL = 0.0
+
+* Fill the input data and variance arrays if required.
+ ELSE IF( DO .EQ. 1 ) THEN
+ K = 1
+ DO L = LBND_IN(3), UBND_IN(3)
+ DO J = LBND_IN(2), UBND_IN(2)
+ DO I = LBND_IN(1), UBND_IN(1)
+ IN( K ) = 0
+ IN_VAR( K ) = K
+ K = K + 1
+ END DO
+ END DO
+ END DO
+ IN( 172 ) = KFAC
+
+* Otherwise check output data and variance arrays look right.
+ ELSE
+ K = 0
+ SUM = 0
+ DO L = LBND_OUT(3), UBND_OUT(3)
+ DO J = LBND_OUT(2), UBND_OUT(2)
+ DO I = LBND_OUT(1), UBND_OUT(1)
+ K = K + 1
+ IF( OUT( K ) .NE. VAL__BADI ) THEN
+ SUM = SUM + OUT( K )
+ END IF
+ END DO
+ END DO
+ END DO
+
+ KT = KFAC
+
+ IF( 'I' .EQ. 'R' .OR. 'I' .EQ. 'D' ) THEN
+ GOOD = EQUALI( SUM, KT )
+ ELSE
+ GOOD = ( ABS( SUM - KT ) .LT. 5 )
+ END IF
+
+ IF( .NOT. GOOD ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'K', dble( KT ) )
+ CALL MSG_SETD( 'S', dble( SUM ) )
+ CALL ERR_REP( ' ', 'TEST9I Data sum is ^S should be ^K',
+ : STATUS )
+ GO TO 999
+ END IF
+
+ IF( SPREAD .EQ. AST__NEAREST ) THEN
+ K = 0
+ DO L = LBND_OUT(3), UBND_OUT(3)
+ DO J = LBND_OUT(2), UBND_OUT(2)
+ DO I = LBND_OUT(1), UBND_OUT(1)
+ K = K + 1
+ IF( K .EQ. 139 ) THEN
+ IF( .NOT. EQUALI( OUT(K), KT ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'K', DBLE( KT ) )
+ CALL MSG_SETD( 'O', DBLE( OUT(K) ) )
+ CALL ERR_REP( ' ', 'TEST9I El. 139 is '//
+ : '^O should be ^K', STATUS )
+ GO TO 999
+ END IF
+ ELSE
+ IF( .NOT. EQUALI( OUT(K), 0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'K', K )
+ CALL MSG_SETD( 'O', DBLE( OUT(K) ) )
+ CALL ERR_REP( ' ', 'TEST9I El. ^K is '//
+ : '^O should be zero', STATUS )
+ GO TO 999
+ END IF
+ END IF
+ END DO
+ END DO
+ END DO
+ ELSE
+
+ G(1) = 0.0
+ G(2) = 0.0
+ G(3) = 0.0
+ W = 0.0
+ K = 0
+ DO L = LBND_OUT(3), UBND_OUT(3)
+ DO J = LBND_OUT(2), UBND_OUT(2)
+ DO I = LBND_OUT(1), UBND_OUT(1)
+ K = K + 1
+ G(1) = G(1) + DBLE( I*OUT( k ) )
+ G(2) = G(2) + DBLE( J*OUT( K ) )
+ G(3) = G(3) + DBLE( L*OUT( K ) )
+ W = W + DBLE( OUT( K ) )
+ END DO
+ END DO
+ END DO
+
+ IF( .NOT. MYEQUALD( G(1)/W, 3.5D0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'A', G(1)/W )
+ CALL ERR_REP( ' ', 'TEST9I Mean X is ^A '//
+ : ' should be 3.5', STATUS )
+ GO TO 999
+ ELSE IF( .NOT. MYEQUALD( G(2)/W, 3.0D0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'A', G(2)/W )
+ CALL ERR_REP( ' ', 'TEST9I Mean Y is ^A '//
+ : ' should be 3.0', STATUS )
+ GO TO 999
+ ELSE IF( .NOT. MYEQUALD( G(3)/W, 2.5D0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'A', G(3)/W )
+ CALL ERR_REP( ' ', 'TEST9I Mean Z is ^A '//
+ : ' should be 2.5', STATUS )
+ GO TO 999
+ END IF
+
+ END IF
+ END IF
+
+ 999 CONTINUE
+
+ END
+
+
+
+ SUBROUTINE TEST9R( DO, LBND_IN, UBND_IN, IN, IN_VAR, LBND_OUT,
+ : UBND_OUT, OUT, OUT_VAR, LBND, UBND, M,
+ : PARAMS, TOL, SPREAD, STATUS )
+
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'PRM_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'CNF_PAR'
+ INCLUDE 'NUM_DEC'
+ INCLUDE 'NUM_DEF'
+
+ INTEGER DO, LBND_IN(*), UBND_IN(*), LBND_OUT(*), UBND_OUT(*),
+ : SPREAD, LBND(*), UBND(*), STATUS, M, I, J, K, L, K2
+ REAL IN(*), IN_VAR(*), OUT(*), OUT_VAR(*), KT, SUM
+ DOUBLE PRECISION TOL, PARAMS(*), KFAC, SHIFTS(3), G(3), W
+ LOGICAL EQUALR, GOOD, MYEQUALD
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ KFAC = MIN( 10000.0D0, NUM_RTOD( VAL__MAXR )/20.0 )
+
+* Return the scalar parameters of the test if required.
+ IF( DO .EQ. 0 ) THEN
+ LBND_IN( 1 ) = 0
+ UBND_IN( 1 ) = 6
+ LBND_OUT( 1 ) = 0
+ UBND_OUT( 1 ) = 6
+ LBND( 1 ) = 0
+ UBND( 1 ) = 6
+ LBND_IN( 2 ) = 0
+ UBND_IN( 2 ) = 6
+ LBND_OUT( 2 ) = 0
+ UBND_OUT( 2 ) = 6
+ LBND( 2 ) = 0
+ UBND( 2 ) = 6
+ LBND_IN( 3 ) = 0
+ UBND_IN( 3 ) = 6
+ LBND_OUT( 3 ) = 0
+ UBND_OUT( 3 ) = 6
+ LBND( 3 ) = 0
+ UBND( 3 ) = 6
+
+ IF( SPREAD .EQ. AST__NEAREST ) THEN
+ SHIFTS(1) = 1.7D0
+ SHIFTS(2) = 2.1D0
+ SHIFTS(3) = -1.2D0
+ ELSE
+ SHIFTS(1) = 0.5D0
+ SHIFTS(2) = 0.0D0
+ SHIFTS(3) = -0.5D0
+ END IF
+
+ M = AST_SHIFTMAP( 3, SHIFTS, ' ', STATUS )
+ PARAMS(1) = 2.0
+ PARAMS(2) = 2.0
+ TOL = 0.0
+
+* Fill the input data and variance arrays if required.
+ ELSE IF( DO .EQ. 1 ) THEN
+ K = 1
+ DO L = LBND_IN(3), UBND_IN(3)
+ DO J = LBND_IN(2), UBND_IN(2)
+ DO I = LBND_IN(1), UBND_IN(1)
+ IN( K ) = 0
+ IN_VAR( K ) = K
+ K = K + 1
+ END DO
+ END DO
+ END DO
+ IN( 172 ) = KFAC
+
+* Otherwise check output data and variance arrays look right.
+ ELSE
+ K = 0
+ SUM = 0
+ DO L = LBND_OUT(3), UBND_OUT(3)
+ DO J = LBND_OUT(2), UBND_OUT(2)
+ DO I = LBND_OUT(1), UBND_OUT(1)
+ K = K + 1
+ IF( OUT( K ) .NE. VAL__BADR ) THEN
+ SUM = SUM + OUT( K )
+ END IF
+ END DO
+ END DO
+ END DO
+
+ KT = KFAC
+
+ IF( 'R' .EQ. 'R' .OR. 'R' .EQ. 'D' ) THEN
+ GOOD = EQUALR( SUM, KT )
+ ELSE
+ GOOD = ( ABS( SUM - KT ) .LT. 5 )
+ END IF
+
+ IF( .NOT. GOOD ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'K', dble( KT ) )
+ CALL MSG_SETD( 'S', dble( SUM ) )
+ CALL ERR_REP( ' ', 'TEST9R Data sum is ^S should be ^K',
+ : STATUS )
+ GO TO 999
+ END IF
+
+ IF( SPREAD .EQ. AST__NEAREST ) THEN
+ K = 0
+ DO L = LBND_OUT(3), UBND_OUT(3)
+ DO J = LBND_OUT(2), UBND_OUT(2)
+ DO I = LBND_OUT(1), UBND_OUT(1)
+ K = K + 1
+ IF( K .EQ. 139 ) THEN
+ IF( .NOT. EQUALR( OUT(K), KT ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'K', DBLE( KT ) )
+ CALL MSG_SETD( 'O', DBLE( OUT(K) ) )
+ CALL ERR_REP( ' ', 'TEST9R El. 139 is '//
+ : '^O should be ^K', STATUS )
+ GO TO 999
+ END IF
+ ELSE
+ IF( .NOT. EQUALR( OUT(K), 0.0E0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'K', K )
+ CALL MSG_SETD( 'O', DBLE( OUT(K) ) )
+ CALL ERR_REP( ' ', 'TEST9R El. ^K is '//
+ : '^O should be zero', STATUS )
+ GO TO 999
+ END IF
+ END IF
+ END DO
+ END DO
+ END DO
+ ELSE
+
+ G(1) = 0.0
+ G(2) = 0.0
+ G(3) = 0.0
+ W = 0.0
+ K = 0
+ DO L = LBND_OUT(3), UBND_OUT(3)
+ DO J = LBND_OUT(2), UBND_OUT(2)
+ DO I = LBND_OUT(1), UBND_OUT(1)
+ K = K + 1
+ G(1) = G(1) + DBLE( I*OUT( k ) )
+ G(2) = G(2) + DBLE( J*OUT( K ) )
+ G(3) = G(3) + DBLE( L*OUT( K ) )
+ W = W + DBLE( OUT( K ) )
+ END DO
+ END DO
+ END DO
+
+ IF( .NOT. MYEQUALD( G(1)/W, 3.5D0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'A', G(1)/W )
+ CALL ERR_REP( ' ', 'TEST9R Mean X is ^A '//
+ : ' should be 3.5', STATUS )
+ GO TO 999
+ ELSE IF( .NOT. MYEQUALD( G(2)/W, 3.0D0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'A', G(2)/W )
+ CALL ERR_REP( ' ', 'TEST9R Mean Y is ^A '//
+ : ' should be 3.0', STATUS )
+ GO TO 999
+ ELSE IF( .NOT. MYEQUALD( G(3)/W, 2.5D0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'A', G(3)/W )
+ CALL ERR_REP( ' ', 'TEST9R Mean Z is ^A '//
+ : ' should be 2.5', STATUS )
+ GO TO 999
+ END IF
+
+ END IF
+ END IF
+
+ 999 CONTINUE
+
+ END
+
+
+
+
+
+* -----------------------------------------------
+* Test 1
+*
+
+ SUBROUTINE TEST1( DO, NAME, TYPE,
+ : LBND_IN, UBND_IN, IPIN, IPIN_VAR,
+ : LBND_OUT, UBND_OUT, IPOUT, IPOUT_VAR,
+ : LBND, UBND, M, PARAMS, TOL, J, STATUS )
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'CNF_PAR'
+
+ INTEGER M, LBND_IN(*), UBND_IN(*), LBND_OUT(*), UBND_OUT(*),
+ : LBND(*), UBND(*), IPIN, IPIN_VAR, IPOUT, IPOUT_VAR,
+ : STATUS, DO, J
+ DOUBLE PRECISION TOL, PARAMS(*)
+ CHARACTER TYPE*(*), NAME*(*)
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ NAME = 'TEST1'
+
+* Fill the input data and variance arrays if required.
+ IF( TYPE .EQ. '_REAL' ) THEN
+ CALL TEST1R( DO, LBND_IN, UBND_IN, %VAL(CNF_PVAL(IPIN)),
+ : %VAL(CNF_PVAL(IPIN_VAR)), LBND_OUT, UBND_OUT,
+ : %VAL(CNF_PVAL(IPOUT)),%VAL(CNF_PVAL(IPOUT_VAR)),
+ : LBND, UBND, M, PARAMS, TOL, J, STATUS )
+
+ ELSE IF( TYPE .EQ. '_DOUBLE' ) THEN
+ CALL TEST1D( DO, LBND_IN, UBND_IN, %VAL(CNF_PVAL(IPIN)),
+ : %VAL(CNF_PVAL(IPIN_VAR)), LBND_OUT, UBND_OUT,
+ : %VAL(CNF_PVAL(IPOUT)),%VAL(CNF_PVAL(IPOUT_VAR)),
+ : LBND, UBND, M, PARAMS, TOL, J, STATUS )
+
+ ELSE IF( TYPE .EQ. '_INTEGER' ) THEN
+ CALL TEST1I( DO, LBND_IN, UBND_IN, %VAL(CNF_PVAL(IPIN)),
+ : %VAL(CNF_PVAL(IPIN_VAR)), LBND_OUT, UBND_OUT,
+ : %VAL(CNF_PVAL(IPOUT)),%VAL(CNF_PVAL(IPOUT_VAR)),
+ : LBND, UBND, M, PARAMS, TOL, J, STATUS )
+
+ ELSE IF( STATUS .EQ. SAI__OK ) then
+ STATUS = SAI__ERROR
+ CALL MSG_SETC( 'T', TYPE )
+ CALL ERR_REP( ' ', 'Bad data type (^T) supplied to TEST1',
+ : STATUS )
+ END IF
+
+ END
+
+
+
+
+ SUBROUTINE TEST1D( DO, LBND_IN, UBND_IN, IN, IN_VAR, LBND_OUT,
+ : UBND_OUT, OUT, OUT_VAR, LBND, UBND, M,
+ : PARAMS, TOL, SPREAD, STATUS )
+
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'PRM_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'CNF_PAR'
+ INCLUDE 'NUM_DEC'
+ INCLUDE 'NUM_DEF'
+
+ INTEGER DO, LBND_IN(*), UBND_IN(*), LBND_OUT(*), UBND_OUT(*),
+ : LBND(*), UBND(*), STATUS, M, I, SPREAD
+ DOUBLE PRECISION IN(*), IN_VAR(*), OUT(*), OUT_VAR(*)
+ LOGICAL EQUALD, IGNORE
+ DOUBLE PRECISION TOL, PARAMS(*), K
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ K = MIN( 1000.0D0, NUM_DTOD( VAL__MAXD )/20.0 )
+
+* Return the scalar parameters of the test if required.
+ IF( DO .EQ. 0 ) THEN
+ LBND_IN( 1 ) = 10
+ UBND_IN( 1 ) = 19
+ LBND_OUT( 1 ) = 12
+ UBND_OUT( 1 ) = 20
+ LBND( 1 ) = 11
+ UBND( 1 ) = 17
+ M = AST_UNITMAP( 1, ' ', STATUS )
+ IF( SPREAD .EQ. AST__GAUSS ) THEN
+ PARAMS(1) = 2.0
+ PARAMS(2) = 2.0
+ ELSE
+ PARAMS(1) = 2.0
+ PARAMS(2) = 0.5
+ END IF
+ TOL = 0.1
+
+* Fill the input data and variance arrays if required.
+ ELSE IF( DO .EQ. 1 ) THEN
+ DO I = LBND_IN(1), UBND_IN(1)
+ IN( I - LBND_IN(1) + 1 ) = I*K
+ IN_VAR( I - LBND_IN(1) + 1 ) = I
+ END DO
+
+* Otherwise check output data and variance arrays look right.
+ ELSE
+ DO I = LBND_OUT(1), UBND(1)
+ IGNORE = ( SPREAD .EQ. AST__GAUSS .AND.
+ : ( I .LE. LBND_OUT(1) + 1 .OR.
+ : I .GE. UBND(1) - 1 ) )
+ IF( IGNORE ) THEN
+
+ ELSE IF( .NOT. EQUALD( OUT( I - LBND_OUT(1) + 1 ),
+ : IN( I - LBND_IN(1) + 1 ) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', I )
+ CALL MSG_SETD( 'V', DBLE( OUT( I - LBND_OUT(1) + 1 ) ) )
+ CALL MSG_SETD( 'B', DBLE( IN( I - LBND_IN(1) + 1 ) ) )
+ CALL ERR_REP( ' ', 'TEST1D ^I: data ^V != ^B', STATUS )
+ RETURN
+ ELSE IF( .NOT. EQUALD( OUT_VAR( I - LBND_OUT(1) + 1 ),
+ : IN_VAR( I - LBND_IN(1) + 1 ) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', I )
+ CALL MSG_SETD( 'V', DBLE( OUT_VAR(I-LBND_OUT(1)+1) ) )
+ CALL MSG_SETD( 'B', DBLE( IN_VAR(I-LBND_IN(1)+1) ) )
+ CALL ERR_REP( ' ', 'TEST1D ^I: variance ^V != ^B',
+ : STATUS )
+ RETURN
+ END IF
+ END DO
+ DO I = UBND(1) + 1, UBND_OUT(1)
+ IF( .NOT. EQUALD( OUT( I - LBND_OUT(1) + 1 ),
+ : 0.0D0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', I )
+ CALL MSG_SETD( 'V', DBLE( OUT( I - LBND_OUT(1) + 1)))
+ CALL ERR_REP( ' ', 'TEST1D ^I: ^V != 0.0', STATUS )
+ RETURN
+ ELSE IF( .NOT. EQUALD( OUT_VAR( I - LBND_OUT(1) + 1 ),
+ : 0.0D0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', I )
+ CALL MSG_SETD( 'V', DBLE( OUT_VAR(I-LBND_OUT(1)+1)))
+ CALL ERR_REP( ' ', 'TEST1D ^I: variance ^V != 0.0',
+ : STATUS )
+ RETURN
+ END IF
+ END DO
+
+ END IF
+
+ END
+
+
+
+ SUBROUTINE TEST1I( DO, LBND_IN, UBND_IN, IN, IN_VAR, LBND_OUT,
+ : UBND_OUT, OUT, OUT_VAR, LBND, UBND, M,
+ : PARAMS, TOL, SPREAD, STATUS )
+
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'PRM_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'CNF_PAR'
+ INCLUDE 'NUM_DEC'
+ INCLUDE 'NUM_DEF'
+
+ INTEGER DO, LBND_IN(*), UBND_IN(*), LBND_OUT(*), UBND_OUT(*),
+ : LBND(*), UBND(*), STATUS, M, I, SPREAD
+ INTEGER IN(*), IN_VAR(*), OUT(*), OUT_VAR(*)
+ LOGICAL EQUALI, IGNORE
+ DOUBLE PRECISION TOL, PARAMS(*), K
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ K = MIN( 1000.0D0, NUM_ITOD( VAL__MAXI )/20.0 )
+
+* Return the scalar parameters of the test if required.
+ IF( DO .EQ. 0 ) THEN
+ LBND_IN( 1 ) = 10
+ UBND_IN( 1 ) = 19
+ LBND_OUT( 1 ) = 12
+ UBND_OUT( 1 ) = 20
+ LBND( 1 ) = 11
+ UBND( 1 ) = 17
+ M = AST_UNITMAP( 1, ' ', STATUS )
+ IF( SPREAD .EQ. AST__GAUSS ) THEN
+ PARAMS(1) = 2.0
+ PARAMS(2) = 2.0
+ ELSE
+ PARAMS(1) = 2.0
+ PARAMS(2) = 0.5
+ END IF
+ TOL = 0.1
+
+* Fill the input data and variance arrays if required.
+ ELSE IF( DO .EQ. 1 ) THEN
+ DO I = LBND_IN(1), UBND_IN(1)
+ IN( I - LBND_IN(1) + 1 ) = I*K
+ IN_VAR( I - LBND_IN(1) + 1 ) = I
+ END DO
+
+* Otherwise check output data and variance arrays look right.
+ ELSE
+ DO I = LBND_OUT(1), UBND(1)
+ IGNORE = ( SPREAD .EQ. AST__GAUSS .AND.
+ : ( I .LE. LBND_OUT(1) + 1 .OR.
+ : I .GE. UBND(1) - 1 ) )
+ IF( IGNORE ) THEN
+
+ ELSE IF( .NOT. EQUALI( OUT( I - LBND_OUT(1) + 1 ),
+ : IN( I - LBND_IN(1) + 1 ) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', I )
+ CALL MSG_SETD( 'V', DBLE( OUT( I - LBND_OUT(1) + 1 ) ) )
+ CALL MSG_SETD( 'B', DBLE( IN( I - LBND_IN(1) + 1 ) ) )
+ CALL ERR_REP( ' ', 'TEST1I ^I: data ^V != ^B', STATUS )
+ RETURN
+ ELSE IF( .NOT. EQUALI( OUT_VAR( I - LBND_OUT(1) + 1 ),
+ : IN_VAR( I - LBND_IN(1) + 1 ) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', I )
+ CALL MSG_SETD( 'V', DBLE( OUT_VAR(I-LBND_OUT(1)+1) ) )
+ CALL MSG_SETD( 'B', DBLE( IN_VAR(I-LBND_IN(1)+1) ) )
+ CALL ERR_REP( ' ', 'TEST1I ^I: variance ^V != ^B',
+ : STATUS )
+ RETURN
+ END IF
+ END DO
+ DO I = UBND(1) + 1, UBND_OUT(1)
+ IF( .NOT. EQUALI( OUT( I - LBND_OUT(1) + 1 ),
+ : 0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', I )
+ CALL MSG_SETD( 'V', DBLE( OUT( I - LBND_OUT(1) + 1)))
+ CALL ERR_REP( ' ', 'TEST1I ^I: ^V != 0.0', STATUS )
+ RETURN
+ ELSE IF( .NOT. EQUALI( OUT_VAR( I - LBND_OUT(1) + 1 ),
+ : 0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', I )
+ CALL MSG_SETD( 'V', DBLE( OUT_VAR(I-LBND_OUT(1)+1)))
+ CALL ERR_REP( ' ', 'TEST1I ^I: variance ^V != 0.0',
+ : STATUS )
+ RETURN
+ END IF
+ END DO
+
+ END IF
+
+ END
+
+
+
+ SUBROUTINE TEST1R( DO, LBND_IN, UBND_IN, IN, IN_VAR, LBND_OUT,
+ : UBND_OUT, OUT, OUT_VAR, LBND, UBND, M,
+ : PARAMS, TOL, SPREAD, STATUS )
+
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'PRM_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'CNF_PAR'
+ INCLUDE 'NUM_DEC'
+ INCLUDE 'NUM_DEF'
+
+ INTEGER DO, LBND_IN(*), UBND_IN(*), LBND_OUT(*), UBND_OUT(*),
+ : LBND(*), UBND(*), STATUS, M, I, SPREAD
+ REAL IN(*), IN_VAR(*), OUT(*), OUT_VAR(*)
+ LOGICAL EQUALR, IGNORE
+ DOUBLE PRECISION TOL, PARAMS(*), K
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ K = MIN( 1000.0D0, NUM_RTOD( VAL__MAXR )/20.0 )
+
+* Return the scalar parameters of the test if required.
+ IF( DO .EQ. 0 ) THEN
+ LBND_IN( 1 ) = 10
+ UBND_IN( 1 ) = 19
+ LBND_OUT( 1 ) = 12
+ UBND_OUT( 1 ) = 20
+ LBND( 1 ) = 11
+ UBND( 1 ) = 17
+ M = AST_UNITMAP( 1, ' ', STATUS )
+ IF( SPREAD .EQ. AST__GAUSS ) THEN
+ PARAMS(1) = 2.0
+ PARAMS(2) = 2.0
+ ELSE
+ PARAMS(1) = 2.0
+ PARAMS(2) = 0.5
+ END IF
+ TOL = 0.1
+
+* Fill the input data and variance arrays if required.
+ ELSE IF( DO .EQ. 1 ) THEN
+ DO I = LBND_IN(1), UBND_IN(1)
+ IN( I - LBND_IN(1) + 1 ) = I*K
+ IN_VAR( I - LBND_IN(1) + 1 ) = I
+ END DO
+
+* Otherwise check output data and variance arrays look right.
+ ELSE
+ DO I = LBND_OUT(1), UBND(1)
+ IGNORE = ( SPREAD .EQ. AST__GAUSS .AND.
+ : ( I .LE. LBND_OUT(1) + 1 .OR.
+ : I .GE. UBND(1) - 1 ) )
+ IF( IGNORE ) THEN
+
+ ELSE IF( .NOT. EQUALR( OUT( I - LBND_OUT(1) + 1 ),
+ : IN( I - LBND_IN(1) + 1 ) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', I )
+ CALL MSG_SETD( 'V', DBLE( OUT( I - LBND_OUT(1) + 1 ) ) )
+ CALL MSG_SETD( 'B', DBLE( IN( I - LBND_IN(1) + 1 ) ) )
+ CALL ERR_REP( ' ', 'TEST1R ^I: data ^V != ^B', STATUS )
+ RETURN
+ ELSE IF( .NOT. EQUALR( OUT_VAR( I - LBND_OUT(1) + 1 ),
+ : IN_VAR( I - LBND_IN(1) + 1 ) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', I )
+ CALL MSG_SETD( 'V', DBLE( OUT_VAR(I-LBND_OUT(1)+1) ) )
+ CALL MSG_SETD( 'B', DBLE( IN_VAR(I-LBND_IN(1)+1) ) )
+ CALL ERR_REP( ' ', 'TEST1R ^I: variance ^V != ^B',
+ : STATUS )
+ RETURN
+ END IF
+ END DO
+ DO I = UBND(1) + 1, UBND_OUT(1)
+ IF( .NOT. EQUALR( OUT( I - LBND_OUT(1) + 1 ),
+ : 0.0E0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', I )
+ CALL MSG_SETD( 'V', DBLE( OUT( I - LBND_OUT(1) + 1)))
+ CALL ERR_REP( ' ', 'TEST1R ^I: ^V != 0.0', STATUS )
+ RETURN
+ ELSE IF( .NOT. EQUALR( OUT_VAR( I - LBND_OUT(1) + 1 ),
+ : 0.0E0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', I )
+ CALL MSG_SETD( 'V', DBLE( OUT_VAR(I-LBND_OUT(1)+1)))
+ CALL ERR_REP( ' ', 'TEST1R ^I: variance ^V != 0.0',
+ : STATUS )
+ RETURN
+ END IF
+ END DO
+
+ END IF
+
+ END
+
+
+
+
+
+* -----------------------------------------------
+* Test 2
+*
+
+ SUBROUTINE TEST2( DO, NAME, TYPE,
+ : LBND_IN, UBND_IN, IPIN, IPIN_VAR,
+ : LBND_OUT, UBND_OUT, IPOUT, IPOUT_VAR,
+ : LBND, UBND, M, PARAMS, TOL, J, STATUS )
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'CNF_PAR'
+
+ INTEGER M, LBND_IN(*), UBND_IN(*), LBND_OUT(*), UBND_OUT(*),
+ : LBND(*), UBND(*), IPIN, IPIN_VAR, IPOUT, IPOUT_VAR,
+ : STATUS, DO, J
+ DOUBLE PRECISION TOL, PARAMS(*)
+ CHARACTER TYPE*(*), NAME*(*)
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ NAME = 'TEST2'
+
+* Fill the input data and variance arrays if required.
+ IF( TYPE .EQ. '_REAL' ) THEN
+ CALL TEST2R( DO, LBND_IN, UBND_IN, %VAL(CNF_PVAL(IPIN)),
+ : %VAL(CNF_PVAL(IPIN_VAR)), LBND_OUT, UBND_OUT,
+ : %VAL(CNF_PVAL(IPOUT)),%VAL(CNF_PVAL(IPOUT_VAR)),
+ : LBND, UBND, M, PARAMS, TOL, J, STATUS )
+
+ ELSE IF( TYPE .EQ. '_DOUBLE' ) THEN
+ CALL TEST2D( DO, LBND_IN, UBND_IN, %VAL(CNF_PVAL(IPIN)),
+ : %VAL(CNF_PVAL(IPIN_VAR)), LBND_OUT, UBND_OUT,
+ : %VAL(CNF_PVAL(IPOUT)),%VAL(CNF_PVAL(IPOUT_VAR)),
+ : LBND, UBND, M, PARAMS, TOL, J, STATUS )
+
+ ELSE IF( TYPE .EQ. '_INTEGER' ) THEN
+ CALL TEST2I( DO, LBND_IN, UBND_IN, %VAL(CNF_PVAL(IPIN)),
+ : %VAL(CNF_PVAL(IPIN_VAR)), LBND_OUT, UBND_OUT,
+ : %VAL(CNF_PVAL(IPOUT)),%VAL(CNF_PVAL(IPOUT_VAR)),
+ : LBND, UBND, M, PARAMS, TOL, J, STATUS )
+
+ ELSE IF( STATUS .EQ. SAI__OK ) then
+ STATUS = SAI__ERROR
+ CALL MSG_SETC( 'T', TYPE )
+ CALL ERR_REP( ' ', 'Bad data type (^T) supplied to TEST2',
+ : STATUS )
+ END IF
+
+ END
+
+
+
+
+ SUBROUTINE TEST2D( DO, LBND_IN, UBND_IN, IN, IN_VAR, LBND_OUT,
+ : UBND_OUT, OUT, OUT_VAR, LBND, UBND, M,
+ : PARAMS, TOL, SPREAD, STATUS )
+
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'PRM_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'CNF_PAR'
+ INCLUDE 'NUM_DEC'
+ INCLUDE 'NUM_DEF'
+
+ INTEGER DO, LBND_IN(*), UBND_IN(*), LBND_OUT(*), UBND_OUT(*),
+ : LBND(*), UBND(*), STATUS, M, I, J, K, SPREAD
+ DOUBLE PRECISION IN(*), IN_VAR(*), OUT(*), OUT_VAR(*)
+ DOUBLE PRECISION TOL, PARAMS(*), KFAC
+ LOGICAL EQUALD
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ KFAC = MIN( 1000.0D0, NUM_DTOD( VAL__MAXD )/20.0 )
+
+* Return the scalar parameters of the test if required.
+ IF( DO .EQ. 0 ) THEN
+ LBND_IN( 1 ) = -1
+ UBND_IN( 1 ) = 2
+ LBND_OUT( 1 ) = 0
+ UBND_OUT( 1 ) = 3
+ LBND( 1 ) = -1
+ UBND( 1 ) = 1
+ LBND_IN( 2 ) = 3
+ UBND_IN( 2 ) = 6
+ LBND_OUT( 2 ) = 2
+ UBND_OUT( 2 ) = 5
+ LBND( 2 ) = 3
+ UBND( 2 ) = 6
+ M = AST_UNITMAP( 2, ' ', STATUS )
+ PARAMS(1) = 2.0
+ PARAMS(2) = 2.0
+ TOL = 0.0
+
+* Fill the input data and variance arrays if required.
+ ELSE IF( DO .EQ. 1 ) THEN
+ K = 1
+ DO J = LBND_IN(2), UBND_IN(2)
+ DO I = LBND_IN(1), UBND_IN(1)
+ IN( K ) = K*KFAC
+ IN_VAR( K ) = K
+ K = K + 1
+ END DO
+ END DO
+
+* Otherwise check output data and variance arrays look right.
+ ELSE
+ K = 1
+ DO J = LBND_OUT(2), UBND_OUT(2)
+ DO I = LBND_OUT(1), UBND_OUT(1)
+ IF( K .LE. 4 .OR. MOD( K, 4 ) .EQ. 0 .OR.
+ : MOD( K, 4 ) .EQ. 3 ) THEN
+ IF( .NOT. EQUALD( OUT( K ), 0.0D0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ CALL MSG_SETD( 'V', DBLE( OUT( K ) ) )
+ CALL ERR_REP( ' ', 'TEST2D ^I: ^V != 0',
+ : STATUS )
+ RETURN
+ ELSE IF( .NOT. EQUALD( OUT_VAR( K ), 0.0D0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ CALL MSG_SETD( 'V', DBLE( OUT_VAR( K )))
+ CALL ERR_REP( ' ', 'TEST2D ^I: variance ^V '//
+ : '!= 0', STATUS )
+ RETURN
+ END IF
+ ELSE
+ IF( .NOT. EQUALD( OUT( K ), IN( K - 3 ) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT( K ) .NE. VAL__BADD ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT( K ) ) )
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL MSG_SETD( 'B', DBLE( IN( K - 3 ) ) )
+ CALL ERR_REP( ' ', 'TEST2D ^I: data ^V != ^B',
+ : STATUS )
+ RETURN
+ ELSE IF( .NOT. EQUALD( OUT( K ), IN( K-3 ) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT( K ) .NE. VAL__BADD ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT_VAR( K ) ) )
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL MSG_SETD( 'B', DBLE( IN_VAR( K - 3 ) ) )
+ CALL ERR_REP( ' ',
+ : 'TEST2D ^I: variance ^V != ^B',
+ : STATUS )
+ RETURN
+ END IF
+ END IF
+ K = K + 1
+ END DO
+ END DO
+
+ END IF
+
+ END
+
+
+
+ SUBROUTINE TEST2I( DO, LBND_IN, UBND_IN, IN, IN_VAR, LBND_OUT,
+ : UBND_OUT, OUT, OUT_VAR, LBND, UBND, M,
+ : PARAMS, TOL, SPREAD, STATUS )
+
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'PRM_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'CNF_PAR'
+ INCLUDE 'NUM_DEC'
+ INCLUDE 'NUM_DEF'
+
+ INTEGER DO, LBND_IN(*), UBND_IN(*), LBND_OUT(*), UBND_OUT(*),
+ : LBND(*), UBND(*), STATUS, M, I, J, K, SPREAD
+ INTEGER IN(*), IN_VAR(*), OUT(*), OUT_VAR(*)
+ DOUBLE PRECISION TOL, PARAMS(*), KFAC
+ LOGICAL EQUALI
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ KFAC = MIN( 1000.0D0, NUM_ITOD( VAL__MAXI )/20.0 )
+
+* Return the scalar parameters of the test if required.
+ IF( DO .EQ. 0 ) THEN
+ LBND_IN( 1 ) = -1
+ UBND_IN( 1 ) = 2
+ LBND_OUT( 1 ) = 0
+ UBND_OUT( 1 ) = 3
+ LBND( 1 ) = -1
+ UBND( 1 ) = 1
+ LBND_IN( 2 ) = 3
+ UBND_IN( 2 ) = 6
+ LBND_OUT( 2 ) = 2
+ UBND_OUT( 2 ) = 5
+ LBND( 2 ) = 3
+ UBND( 2 ) = 6
+ M = AST_UNITMAP( 2, ' ', STATUS )
+ PARAMS(1) = 2.0
+ PARAMS(2) = 2.0
+ TOL = 0.0
+
+* Fill the input data and variance arrays if required.
+ ELSE IF( DO .EQ. 1 ) THEN
+ K = 1
+ DO J = LBND_IN(2), UBND_IN(2)
+ DO I = LBND_IN(1), UBND_IN(1)
+ IN( K ) = K*KFAC
+ IN_VAR( K ) = K
+ K = K + 1
+ END DO
+ END DO
+
+* Otherwise check output data and variance arrays look right.
+ ELSE
+ K = 1
+ DO J = LBND_OUT(2), UBND_OUT(2)
+ DO I = LBND_OUT(1), UBND_OUT(1)
+ IF( K .LE. 4 .OR. MOD( K, 4 ) .EQ. 0 .OR.
+ : MOD( K, 4 ) .EQ. 3 ) THEN
+ IF( .NOT. EQUALI( OUT( K ), 0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ CALL MSG_SETD( 'V', DBLE( OUT( K ) ) )
+ CALL ERR_REP( ' ', 'TEST2I ^I: ^V != 0',
+ : STATUS )
+ RETURN
+ ELSE IF( .NOT. EQUALI( OUT_VAR( K ), 0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ CALL MSG_SETD( 'V', DBLE( OUT_VAR( K )))
+ CALL ERR_REP( ' ', 'TEST2I ^I: variance ^V '//
+ : '!= 0', STATUS )
+ RETURN
+ END IF
+ ELSE
+ IF( .NOT. EQUALI( OUT( K ), IN( K - 3 ) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT( K ) .NE. VAL__BADI ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT( K ) ) )
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL MSG_SETD( 'B', DBLE( IN( K - 3 ) ) )
+ CALL ERR_REP( ' ', 'TEST2I ^I: data ^V != ^B',
+ : STATUS )
+ RETURN
+ ELSE IF( .NOT. EQUALI( OUT( K ), IN( K-3 ) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT( K ) .NE. VAL__BADI ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT_VAR( K ) ) )
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL MSG_SETD( 'B', DBLE( IN_VAR( K - 3 ) ) )
+ CALL ERR_REP( ' ',
+ : 'TEST2I ^I: variance ^V != ^B',
+ : STATUS )
+ RETURN
+ END IF
+ END IF
+ K = K + 1
+ END DO
+ END DO
+
+ END IF
+
+ END
+
+
+
+ SUBROUTINE TEST2R( DO, LBND_IN, UBND_IN, IN, IN_VAR, LBND_OUT,
+ : UBND_OUT, OUT, OUT_VAR, LBND, UBND, M,
+ : PARAMS, TOL, SPREAD, STATUS )
+
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'PRM_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'CNF_PAR'
+ INCLUDE 'NUM_DEC'
+ INCLUDE 'NUM_DEF'
+
+ INTEGER DO, LBND_IN(*), UBND_IN(*), LBND_OUT(*), UBND_OUT(*),
+ : LBND(*), UBND(*), STATUS, M, I, J, K, SPREAD
+ REAL IN(*), IN_VAR(*), OUT(*), OUT_VAR(*)
+ DOUBLE PRECISION TOL, PARAMS(*), KFAC
+ LOGICAL EQUALR
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ KFAC = MIN( 1000.0D0, NUM_RTOD( VAL__MAXR )/20.0 )
+
+* Return the scalar parameters of the test if required.
+ IF( DO .EQ. 0 ) THEN
+ LBND_IN( 1 ) = -1
+ UBND_IN( 1 ) = 2
+ LBND_OUT( 1 ) = 0
+ UBND_OUT( 1 ) = 3
+ LBND( 1 ) = -1
+ UBND( 1 ) = 1
+ LBND_IN( 2 ) = 3
+ UBND_IN( 2 ) = 6
+ LBND_OUT( 2 ) = 2
+ UBND_OUT( 2 ) = 5
+ LBND( 2 ) = 3
+ UBND( 2 ) = 6
+ M = AST_UNITMAP( 2, ' ', STATUS )
+ PARAMS(1) = 2.0
+ PARAMS(2) = 2.0
+ TOL = 0.0
+
+* Fill the input data and variance arrays if required.
+ ELSE IF( DO .EQ. 1 ) THEN
+ K = 1
+ DO J = LBND_IN(2), UBND_IN(2)
+ DO I = LBND_IN(1), UBND_IN(1)
+ IN( K ) = K*KFAC
+ IN_VAR( K ) = K
+ K = K + 1
+ END DO
+ END DO
+
+* Otherwise check output data and variance arrays look right.
+ ELSE
+ K = 1
+ DO J = LBND_OUT(2), UBND_OUT(2)
+ DO I = LBND_OUT(1), UBND_OUT(1)
+ IF( K .LE. 4 .OR. MOD( K, 4 ) .EQ. 0 .OR.
+ : MOD( K, 4 ) .EQ. 3 ) THEN
+ IF( .NOT. EQUALR( OUT( K ), 0.0E0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ CALL MSG_SETD( 'V', DBLE( OUT( K ) ) )
+ CALL ERR_REP( ' ', 'TEST2R ^I: ^V != 0',
+ : STATUS )
+ RETURN
+ ELSE IF( .NOT. EQUALR( OUT_VAR( K ), 0.0E0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ CALL MSG_SETD( 'V', DBLE( OUT_VAR( K )))
+ CALL ERR_REP( ' ', 'TEST2R ^I: variance ^V '//
+ : '!= 0', STATUS )
+ RETURN
+ END IF
+ ELSE
+ IF( .NOT. EQUALR( OUT( K ), IN( K - 3 ) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT( K ) .NE. VAL__BADR ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT( K ) ) )
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL MSG_SETD( 'B', DBLE( IN( K - 3 ) ) )
+ CALL ERR_REP( ' ', 'TEST2R ^I: data ^V != ^B',
+ : STATUS )
+ RETURN
+ ELSE IF( .NOT. EQUALR( OUT( K ), IN( K-3 ) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT( K ) .NE. VAL__BADR ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT_VAR( K ) ) )
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL MSG_SETD( 'B', DBLE( IN_VAR( K - 3 ) ) )
+ CALL ERR_REP( ' ',
+ : 'TEST2R ^I: variance ^V != ^B',
+ : STATUS )
+ RETURN
+ END IF
+ END IF
+ K = K + 1
+ END DO
+ END DO
+
+ END IF
+
+ END
+
+
+
+
+
+* -----------------------------------------------
+* Test 3
+*
+
+ SUBROUTINE TEST3( DO, NAME, TYPE,
+ : LBND_IN, UBND_IN, IPIN, IPIN_VAR,
+ : LBND_OUT, UBND_OUT, IPOUT, IPOUT_VAR,
+ : LBND, UBND, M, PARAMS, TOL, J, STATUS )
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'CNF_PAR'
+
+ INTEGER M, LBND_IN(*), UBND_IN(*), LBND_OUT(*), UBND_OUT(*),
+ : LBND(*), UBND(*), IPIN, IPIN_VAR, IPOUT, IPOUT_VAR,
+ : STATUS, DO, J
+ DOUBLE PRECISION TOL, PARAMS(*)
+ CHARACTER TYPE*(*), NAME*(*)
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ NAME = 'TEST3'
+
+* Fill the input data and variance arrays if required.
+ IF( TYPE .EQ. '_REAL' ) THEN
+ CALL TEST3R( DO, LBND_IN, UBND_IN, %VAL(CNF_PVAL(IPIN)),
+ : %VAL(CNF_PVAL(IPIN_VAR)), LBND_OUT, UBND_OUT,
+ : %VAL(CNF_PVAL(IPOUT)),%VAL(CNF_PVAL(IPOUT_VAR)),
+ : LBND, UBND, M, PARAMS, TOL, J, STATUS )
+
+ ELSE IF( TYPE .EQ. '_DOUBLE' ) THEN
+ CALL TEST3D( DO, LBND_IN, UBND_IN, %VAL(CNF_PVAL(IPIN)),
+ : %VAL(CNF_PVAL(IPIN_VAR)), LBND_OUT, UBND_OUT,
+ : %VAL(CNF_PVAL(IPOUT)),%VAL(CNF_PVAL(IPOUT_VAR)),
+ : LBND, UBND, M, PARAMS, TOL, J, STATUS )
+
+ ELSE IF( TYPE .EQ. '_INTEGER' ) THEN
+ CALL TEST3I( DO, LBND_IN, UBND_IN, %VAL(CNF_PVAL(IPIN)),
+ : %VAL(CNF_PVAL(IPIN_VAR)), LBND_OUT, UBND_OUT,
+ : %VAL(CNF_PVAL(IPOUT)),%VAL(CNF_PVAL(IPOUT_VAR)),
+ : LBND, UBND, M, PARAMS, TOL, J, STATUS )
+
+ ELSE IF( STATUS .EQ. SAI__OK ) then
+ STATUS = SAI__ERROR
+ CALL MSG_SETC( 'T', TYPE )
+ CALL ERR_REP( ' ', 'Bad data type (^T) supplied to TEST3',
+ : STATUS )
+ END IF
+
+ END
+
+
+
+
+ SUBROUTINE TEST3D( DO, LBND_IN, UBND_IN, IN, IN_VAR, LBND_OUT,
+ : UBND_OUT, OUT, OUT_VAR, LBND, UBND, M,
+ : PARAMS, TOL, SPREAD, STATUS )
+
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'PRM_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'CNF_PAR'
+ INCLUDE 'NUM_DEC'
+ INCLUDE 'NUM_DEF'
+
+ INTEGER DO, LBND_IN(*), UBND_IN(*), LBND_OUT(*), UBND_OUT(*),
+ : SPREAD, LBND(*), UBND(*), STATUS, M, I, J, K, L, K2
+ DOUBLE PRECISION IN(*), IN_VAR(*), OUT(*), OUT_VAR(*)
+ DOUBLE PRECISION TOL, PARAMS(*), KFAC
+ LOGICAL EQUALD
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ KFAC = MIN( 1000.0D0, NUM_DTOD( VAL__MAXD )/20.0 )
+
+* Return the scalar parameters of the test if required.
+ IF( DO .EQ. 0 ) THEN
+ LBND_IN( 1 ) = -1
+ UBND_IN( 1 ) = 2
+ LBND_OUT( 1 ) = 0
+ UBND_OUT( 1 ) = 3
+ LBND( 1 ) = -1
+ UBND( 1 ) = 1
+ LBND_IN( 2 ) = 3
+ UBND_IN( 2 ) = 6
+ LBND_OUT( 2 ) = 2
+ UBND_OUT( 2 ) = 5
+ LBND( 2 ) = 3
+ UBND( 2 ) = 6
+ LBND_IN( 3 ) = -1
+ UBND_IN( 3 ) = 1
+ LBND_OUT( 3 ) = 0
+ UBND_OUT( 3 ) = 2
+ LBND( 3 ) = -1
+ UBND( 3 ) = 1
+ M = AST_UNITMAP( 3, ' ', STATUS )
+ PARAMS(1) = 2.0
+ PARAMS(2) = 2.0
+ TOL = 0.0
+
+* Fill the input data and variance arrays if required.
+ ELSE IF( DO .EQ. 1 ) THEN
+ K = 1
+ DO L = LBND_IN(3), UBND_IN(3)
+ DO J = LBND_IN(2), UBND_IN(2)
+ DO I = LBND_IN(1), UBND_IN(1)
+ IN( K ) = K*KFAC
+ IN_VAR( K ) = K
+ K = K + 1
+ END DO
+ END DO
+ END DO
+
+* Otherwise check output data and variance arrays look right.
+ ELSE
+ K = 1
+ DO L = LBND_OUT(3), UBND_OUT(3)
+ DO J = LBND_OUT(2), UBND_OUT(2)
+ DO I = LBND_OUT(1), UBND_OUT(1)
+
+ K2 = MOD( K - 1, 16 ) + 1
+ IF( K2 .LE. 4 .OR. MOD( K2, 4 ) .EQ. 0 .OR.
+ : MOD( K2, 4 ) .EQ. 3 .OR.
+ : L .EQ. 2 ) THEN
+ IF( .NOT. EQUALD( OUT( K ), 0.0D0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT( K ) .NE. VAL__BADD ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT( K ) ) )
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL ERR_REP( ' ', 'TEST3D ^I: ^V != 0',
+ : STATUS )
+ RETURN
+ ELSE IF( .NOT. EQUALD( OUT_VAR( K ),
+ ; 0.0D0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT_VAR( K ) .NE. VAL__BADD ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT_VAR( K )))
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL ERR_REP( ' ', 'TEST3D ^I: variance ^V '//
+ : '!= 0', STATUS )
+ RETURN
+ END IF
+ ELSE
+ IF( .NOT. EQUALD( OUT( K ), IN( K + 13 ))) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT( K ) .NE. VAL__BADD ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT( K ) ) )
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL MSG_SETD( 'B', DBLE( IN( K+13 ) ) )
+ CALL ERR_REP( ' ', 'TEST3D ^I: data ^V != ^B',
+ : STATUS )
+ RETURN
+ ELSE IF( .NOT. EQUALD( OUT( K ), IN(K+13) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT( K ) .NE. VAL__BADD ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT_VAR( K ) ) )
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL MSG_SETD( 'B', DBLE( IN_VAR( K+13 ) ) )
+ CALL ERR_REP( ' ',
+ : 'TEST3D ^I: variance ^V != ^B',
+ : STATUS )
+ RETURN
+ END IF
+ END IF
+ K = K + 1
+ END DO
+ END DO
+ END DO
+ END IF
+
+ END
+
+
+
+ SUBROUTINE TEST3I( DO, LBND_IN, UBND_IN, IN, IN_VAR, LBND_OUT,
+ : UBND_OUT, OUT, OUT_VAR, LBND, UBND, M,
+ : PARAMS, TOL, SPREAD, STATUS )
+
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'PRM_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'CNF_PAR'
+ INCLUDE 'NUM_DEC'
+ INCLUDE 'NUM_DEF'
+
+ INTEGER DO, LBND_IN(*), UBND_IN(*), LBND_OUT(*), UBND_OUT(*),
+ : SPREAD, LBND(*), UBND(*), STATUS, M, I, J, K, L, K2
+ INTEGER IN(*), IN_VAR(*), OUT(*), OUT_VAR(*)
+ DOUBLE PRECISION TOL, PARAMS(*), KFAC
+ LOGICAL EQUALI
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ KFAC = MIN( 1000.0D0, NUM_ITOD( VAL__MAXI )/20.0 )
+
+* Return the scalar parameters of the test if required.
+ IF( DO .EQ. 0 ) THEN
+ LBND_IN( 1 ) = -1
+ UBND_IN( 1 ) = 2
+ LBND_OUT( 1 ) = 0
+ UBND_OUT( 1 ) = 3
+ LBND( 1 ) = -1
+ UBND( 1 ) = 1
+ LBND_IN( 2 ) = 3
+ UBND_IN( 2 ) = 6
+ LBND_OUT( 2 ) = 2
+ UBND_OUT( 2 ) = 5
+ LBND( 2 ) = 3
+ UBND( 2 ) = 6
+ LBND_IN( 3 ) = -1
+ UBND_IN( 3 ) = 1
+ LBND_OUT( 3 ) = 0
+ UBND_OUT( 3 ) = 2
+ LBND( 3 ) = -1
+ UBND( 3 ) = 1
+ M = AST_UNITMAP( 3, ' ', STATUS )
+ PARAMS(1) = 2.0
+ PARAMS(2) = 2.0
+ TOL = 0.0
+
+* Fill the input data and variance arrays if required.
+ ELSE IF( DO .EQ. 1 ) THEN
+ K = 1
+ DO L = LBND_IN(3), UBND_IN(3)
+ DO J = LBND_IN(2), UBND_IN(2)
+ DO I = LBND_IN(1), UBND_IN(1)
+ IN( K ) = K*KFAC
+ IN_VAR( K ) = K
+ K = K + 1
+ END DO
+ END DO
+ END DO
+
+* Otherwise check output data and variance arrays look right.
+ ELSE
+ K = 1
+ DO L = LBND_OUT(3), UBND_OUT(3)
+ DO J = LBND_OUT(2), UBND_OUT(2)
+ DO I = LBND_OUT(1), UBND_OUT(1)
+
+ K2 = MOD( K - 1, 16 ) + 1
+ IF( K2 .LE. 4 .OR. MOD( K2, 4 ) .EQ. 0 .OR.
+ : MOD( K2, 4 ) .EQ. 3 .OR.
+ : L .EQ. 2 ) THEN
+ IF( .NOT. EQUALI( OUT( K ), 0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT( K ) .NE. VAL__BADI ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT( K ) ) )
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL ERR_REP( ' ', 'TEST3I ^I: ^V != 0',
+ : STATUS )
+ RETURN
+ ELSE IF( .NOT. EQUALI( OUT_VAR( K ),
+ ; 0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT_VAR( K ) .NE. VAL__BADI ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT_VAR( K )))
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL ERR_REP( ' ', 'TEST3I ^I: variance ^V '//
+ : '!= 0', STATUS )
+ RETURN
+ END IF
+ ELSE
+ IF( .NOT. EQUALI( OUT( K ), IN( K + 13 ))) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT( K ) .NE. VAL__BADI ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT( K ) ) )
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL MSG_SETD( 'B', DBLE( IN( K+13 ) ) )
+ CALL ERR_REP( ' ', 'TEST3I ^I: data ^V != ^B',
+ : STATUS )
+ RETURN
+ ELSE IF( .NOT. EQUALI( OUT( K ), IN(K+13) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT( K ) .NE. VAL__BADI ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT_VAR( K ) ) )
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL MSG_SETD( 'B', DBLE( IN_VAR( K+13 ) ) )
+ CALL ERR_REP( ' ',
+ : 'TEST3I ^I: variance ^V != ^B',
+ : STATUS )
+ RETURN
+ END IF
+ END IF
+ K = K + 1
+ END DO
+ END DO
+ END DO
+ END IF
+
+ END
+
+
+
+ SUBROUTINE TEST3R( DO, LBND_IN, UBND_IN, IN, IN_VAR, LBND_OUT,
+ : UBND_OUT, OUT, OUT_VAR, LBND, UBND, M,
+ : PARAMS, TOL, SPREAD, STATUS )
+
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'PRM_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'CNF_PAR'
+ INCLUDE 'NUM_DEC'
+ INCLUDE 'NUM_DEF'
+
+ INTEGER DO, LBND_IN(*), UBND_IN(*), LBND_OUT(*), UBND_OUT(*),
+ : SPREAD, LBND(*), UBND(*), STATUS, M, I, J, K, L, K2
+ REAL IN(*), IN_VAR(*), OUT(*), OUT_VAR(*)
+ DOUBLE PRECISION TOL, PARAMS(*), KFAC
+ LOGICAL EQUALR
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ KFAC = MIN( 1000.0D0, NUM_RTOD( VAL__MAXR )/20.0 )
+
+* Return the scalar parameters of the test if required.
+ IF( DO .EQ. 0 ) THEN
+ LBND_IN( 1 ) = -1
+ UBND_IN( 1 ) = 2
+ LBND_OUT( 1 ) = 0
+ UBND_OUT( 1 ) = 3
+ LBND( 1 ) = -1
+ UBND( 1 ) = 1
+ LBND_IN( 2 ) = 3
+ UBND_IN( 2 ) = 6
+ LBND_OUT( 2 ) = 2
+ UBND_OUT( 2 ) = 5
+ LBND( 2 ) = 3
+ UBND( 2 ) = 6
+ LBND_IN( 3 ) = -1
+ UBND_IN( 3 ) = 1
+ LBND_OUT( 3 ) = 0
+ UBND_OUT( 3 ) = 2
+ LBND( 3 ) = -1
+ UBND( 3 ) = 1
+ M = AST_UNITMAP( 3, ' ', STATUS )
+ PARAMS(1) = 2.0
+ PARAMS(2) = 2.0
+ TOL = 0.0
+
+* Fill the input data and variance arrays if required.
+ ELSE IF( DO .EQ. 1 ) THEN
+ K = 1
+ DO L = LBND_IN(3), UBND_IN(3)
+ DO J = LBND_IN(2), UBND_IN(2)
+ DO I = LBND_IN(1), UBND_IN(1)
+ IN( K ) = K*KFAC
+ IN_VAR( K ) = K
+ K = K + 1
+ END DO
+ END DO
+ END DO
+
+* Otherwise check output data and variance arrays look right.
+ ELSE
+ K = 1
+ DO L = LBND_OUT(3), UBND_OUT(3)
+ DO J = LBND_OUT(2), UBND_OUT(2)
+ DO I = LBND_OUT(1), UBND_OUT(1)
+
+ K2 = MOD( K - 1, 16 ) + 1
+ IF( K2 .LE. 4 .OR. MOD( K2, 4 ) .EQ. 0 .OR.
+ : MOD( K2, 4 ) .EQ. 3 .OR.
+ : L .EQ. 2 ) THEN
+ IF( .NOT. EQUALR( OUT( K ), 0.0E0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT( K ) .NE. VAL__BADR ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT( K ) ) )
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL ERR_REP( ' ', 'TEST3R ^I: ^V != 0',
+ : STATUS )
+ RETURN
+ ELSE IF( .NOT. EQUALR( OUT_VAR( K ),
+ ; 0.0E0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT_VAR( K ) .NE. VAL__BADR ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT_VAR( K )))
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL ERR_REP( ' ', 'TEST3R ^I: variance ^V '//
+ : '!= 0', STATUS )
+ RETURN
+ END IF
+ ELSE
+ IF( .NOT. EQUALR( OUT( K ), IN( K + 13 ))) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT( K ) .NE. VAL__BADR ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT( K ) ) )
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL MSG_SETD( 'B', DBLE( IN( K+13 ) ) )
+ CALL ERR_REP( ' ', 'TEST3R ^I: data ^V != ^B',
+ : STATUS )
+ RETURN
+ ELSE IF( .NOT. EQUALR( OUT( K ), IN(K+13) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT( K ) .NE. VAL__BADR ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT_VAR( K ) ) )
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL MSG_SETD( 'B', DBLE( IN_VAR( K+13 ) ) )
+ CALL ERR_REP( ' ',
+ : 'TEST3R ^I: variance ^V != ^B',
+ : STATUS )
+ RETURN
+ END IF
+ END IF
+ K = K + 1
+ END DO
+ END DO
+ END DO
+ END IF
+
+ END
+
+
+
+
+
+* -----------------------------------------------
+* Test 4
+*
+
+ SUBROUTINE TEST4( DO, NAME, TYPE,
+ : LBND_IN, UBND_IN, IPIN, IPIN_VAR,
+ : LBND_OUT, UBND_OUT, IPOUT, IPOUT_VAR,
+ : LBND, UBND, M, PARAMS, TOL, J, STATUS )
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'CNF_PAR'
+
+ INTEGER M, LBND_IN(*), UBND_IN(*), LBND_OUT(*), UBND_OUT(*),
+ : LBND(*), UBND(*), IPIN, IPIN_VAR, IPOUT, IPOUT_VAR,
+ : STATUS, DO, J
+ DOUBLE PRECISION TOL, PARAMS(*)
+ CHARACTER TYPE*(*), NAME*(*)
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ NAME = 'TEST4'
+
+* Fill the input data and variance arrays if required.
+ IF( TYPE .EQ. '_REAL' ) THEN
+ CALL TEST4R( DO, LBND_IN, UBND_IN, %VAL(CNF_PVAL(IPIN)),
+ : %VAL(CNF_PVAL(IPIN_VAR)), LBND_OUT, UBND_OUT,
+ : %VAL(CNF_PVAL(IPOUT)),%VAL(CNF_PVAL(IPOUT_VAR)),
+ : LBND, UBND, M, PARAMS, TOL, J, STATUS )
+
+ ELSE IF( TYPE .EQ. '_DOUBLE' ) THEN
+ CALL TEST4D( DO, LBND_IN, UBND_IN, %VAL(CNF_PVAL(IPIN)),
+ : %VAL(CNF_PVAL(IPIN_VAR)), LBND_OUT, UBND_OUT,
+ : %VAL(CNF_PVAL(IPOUT)),%VAL(CNF_PVAL(IPOUT_VAR)),
+ : LBND, UBND, M, PARAMS, TOL, J, STATUS )
+
+ ELSE IF( TYPE .EQ. '_INTEGER' ) THEN
+ CALL TEST4I( DO, LBND_IN, UBND_IN, %VAL(CNF_PVAL(IPIN)),
+ : %VAL(CNF_PVAL(IPIN_VAR)), LBND_OUT, UBND_OUT,
+ : %VAL(CNF_PVAL(IPOUT)),%VAL(CNF_PVAL(IPOUT_VAR)),
+ : LBND, UBND, M, PARAMS, TOL, J, STATUS )
+
+ ELSE IF( STATUS .EQ. SAI__OK ) then
+ STATUS = SAI__ERROR
+ CALL MSG_SETC( 'T', TYPE )
+ CALL ERR_REP( ' ', 'Bad data type (^T) supplied to TEST4',
+ : STATUS )
+ END IF
+
+ END
+
+
+
+
+ SUBROUTINE TEST4D( DO, LBND_IN, UBND_IN, IN, IN_VAR, LBND_OUT,
+ : UBND_OUT, OUT, OUT_VAR, LBND, UBND, M,
+ : PARAMS, TOL, SPREAD, STATUS )
+
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'PRM_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'CNF_PAR'
+ INCLUDE 'NUM_DEC'
+ INCLUDE 'NUM_DEF'
+
+ INTEGER DO, LBND_IN(*), UBND_IN(*), LBND_OUT(*), UBND_OUT(*),
+ : SPREAD, LBND(*), UBND(*), STATUS, M, I
+ DOUBLE PRECISION IN(*), IN_VAR(*), OUT(*), OUT_VAR(*)
+ DOUBLE PRECISION TOL, PARAMS(*), K
+ LOGICAL EQUALD
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ K = MIN( 1000.0D0, NUM_DTOD( VAL__MAXD )/20.0 )
+
+* Return the scalar parameters of the test if required.
+ IF( DO .EQ. 0 ) THEN
+ LBND_IN( 1 ) = 10
+ UBND_IN( 1 ) = 19
+ LBND_OUT( 1 ) = 12
+ UBND_OUT( 1 ) = 20
+ LBND( 1 ) = 11
+ UBND( 1 ) = 17
+ M = AST_SHIFTMAP( 1, 3.0D0, ' ', STATUS )
+ PARAMS(1) = 2.0
+ PARAMS(2) = 2.0
+ TOL = 0.1
+
+* Fill the input data and variance arrays if required.
+ ELSE IF( DO .EQ. 1 ) THEN
+ DO I = LBND_IN(1), UBND_IN(1)
+ IN( I - LBND_IN(1) + 1 ) = I*K
+ IN_VAR( I - LBND_IN(1) + 1 ) = I
+ END DO
+
+* Otherwise check output data and variance arrays look right.
+ ELSE
+
+ DO I = LBND_OUT(1), LBND(1) + 2
+ IF( .NOT. EQUALD( OUT( I - LBND_OUT(1) + 1 ),
+ : 0.0D0) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', I )
+ CALL MSG_SETD( 'V', DBLE( OUT( I - LBND_OUT(1) + 1 ) ) )
+ CALL ERR_REP( ' ', 'TEST4D ^I: ^V != BAD', STATUS )
+ RETURN
+ ELSE IF( .NOT. EQUALD( OUT_VAR( I - LBND_OUT(1) + 1 ),
+ : 0.0D0) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', I )
+ CALL MSG_SETD( 'V', DBLE( OUT_VAR(I-LBND_OUT(1)+1) ) )
+ CALL ERR_REP( ' ', 'TEST4D ^I: variance ^V != BAD',
+ : STATUS )
+ RETURN
+ END IF
+ END DO
+
+ DO I = LBND(1) + 3, UBND_OUT(1)
+ IF( .NOT. EQUALD( OUT( I - LBND_OUT(1) + 1 ),
+ : IN( I - 3 - LBND_IN(1) + 1 ) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', I )
+ IF( OUT( I - LBND_OUT(1) + 1 ) .NE. VAL__BADD ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT( I - LBND_OUT(1) + 1)))
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL MSG_SETD( 'B', DBLE( IN( I -3 - LBND_IN(1) + 1 ) ) )
+ CALL ERR_REP( ' ', 'TEST4D ^I: data ^V != ^B', STATUS )
+ RETURN
+ ELSE IF( .NOT. EQUALD( OUT_VAR( I - LBND_OUT(1) + 1 ),
+ : IN_VAR( I - 3 - LBND_IN(1) + 1 ) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', I )
+ IF( OUT_VAR(I-LBND_OUT(1)+1) .NE. VAL__BADD ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT_VAR(I-LBND_OUT(1)+1)))
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL MSG_SETD( 'B', DBLE( IN_VAR(I-3-LBND_IN(1)+1) ) )
+ CALL ERR_REP( ' ', 'TEST4D ^I: variance ^V != ^B',
+ : STATUS )
+ RETURN
+ END IF
+ END DO
+
+ END IF
+
+ END
+
+ SUBROUTINE TEST4I( DO, LBND_IN, UBND_IN, IN, IN_VAR, LBND_OUT,
+ : UBND_OUT, OUT, OUT_VAR, LBND, UBND, M,
+ : PARAMS, TOL, SPREAD, STATUS )
+
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'PRM_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'CNF_PAR'
+ INCLUDE 'NUM_DEC'
+ INCLUDE 'NUM_DEF'
+
+ INTEGER DO, LBND_IN(*), UBND_IN(*), LBND_OUT(*), UBND_OUT(*),
+ : SPREAD, LBND(*), UBND(*), STATUS, M, I
+ INTEGER IN(*), IN_VAR(*), OUT(*), OUT_VAR(*)
+ DOUBLE PRECISION TOL, PARAMS(*), K
+ LOGICAL EQUALI
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ K = MIN( 1000.0D0, NUM_ITOD( VAL__MAXI )/20.0 )
+
+* Return the scalar parameters of the test if required.
+ IF( DO .EQ. 0 ) THEN
+ LBND_IN( 1 ) = 10
+ UBND_IN( 1 ) = 19
+ LBND_OUT( 1 ) = 12
+ UBND_OUT( 1 ) = 20
+ LBND( 1 ) = 11
+ UBND( 1 ) = 17
+ M = AST_SHIFTMAP( 1, 3.0D0, ' ', STATUS )
+ PARAMS(1) = 2.0
+ PARAMS(2) = 2.0
+ TOL = 0.1
+
+* Fill the input data and variance arrays if required.
+ ELSE IF( DO .EQ. 1 ) THEN
+ DO I = LBND_IN(1), UBND_IN(1)
+ IN( I - LBND_IN(1) + 1 ) = I*K
+ IN_VAR( I - LBND_IN(1) + 1 ) = I
+ END DO
+
+* Otherwise check output data and variance arrays look right.
+ ELSE
+
+ DO I = LBND_OUT(1), LBND(1) + 2
+ IF( .NOT. EQUALI( OUT( I - LBND_OUT(1) + 1 ),
+ : 0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', I )
+ CALL MSG_SETD( 'V', DBLE( OUT( I - LBND_OUT(1) + 1 ) ) )
+ CALL ERR_REP( ' ', 'TEST4I ^I: ^V != BAD', STATUS )
+ RETURN
+ ELSE IF( .NOT. EQUALI( OUT_VAR( I - LBND_OUT(1) + 1 ),
+ : 0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', I )
+ CALL MSG_SETD( 'V', DBLE( OUT_VAR(I-LBND_OUT(1)+1) ) )
+ CALL ERR_REP( ' ', 'TEST4I ^I: variance ^V != BAD',
+ : STATUS )
+ RETURN
+ END IF
+ END DO
+
+ DO I = LBND(1) + 3, UBND_OUT(1)
+ IF( .NOT. EQUALI( OUT( I - LBND_OUT(1) + 1 ),
+ : IN( I - 3 - LBND_IN(1) + 1 ) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', I )
+ IF( OUT( I - LBND_OUT(1) + 1 ) .NE. VAL__BADI ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT( I - LBND_OUT(1) + 1)))
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL MSG_SETD( 'B', DBLE( IN( I -3 - LBND_IN(1) + 1 ) ) )
+ CALL ERR_REP( ' ', 'TEST4I ^I: data ^V != ^B', STATUS )
+ RETURN
+ ELSE IF( .NOT. EQUALI( OUT_VAR( I - LBND_OUT(1) + 1 ),
+ : IN_VAR( I - 3 - LBND_IN(1) + 1 ) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', I )
+ IF( OUT_VAR(I-LBND_OUT(1)+1) .NE. VAL__BADI ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT_VAR(I-LBND_OUT(1)+1)))
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL MSG_SETD( 'B', DBLE( IN_VAR(I-3-LBND_IN(1)+1) ) )
+ CALL ERR_REP( ' ', 'TEST4I ^I: variance ^V != ^B',
+ : STATUS )
+ RETURN
+ END IF
+ END DO
+
+ END IF
+
+ END
+
+ SUBROUTINE TEST4R( DO, LBND_IN, UBND_IN, IN, IN_VAR, LBND_OUT,
+ : UBND_OUT, OUT, OUT_VAR, LBND, UBND, M,
+ : PARAMS, TOL, SPREAD, STATUS )
+
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'PRM_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'CNF_PAR'
+ INCLUDE 'NUM_DEC'
+ INCLUDE 'NUM_DEF'
+
+ INTEGER DO, LBND_IN(*), UBND_IN(*), LBND_OUT(*), UBND_OUT(*),
+ : SPREAD, LBND(*), UBND(*), STATUS, M, I
+ REAL IN(*), IN_VAR(*), OUT(*), OUT_VAR(*)
+ DOUBLE PRECISION TOL, PARAMS(*), K
+ LOGICAL EQUALR
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ K = MIN( 1000.0D0, NUM_RTOD( VAL__MAXR )/20.0 )
+
+* Return the scalar parameters of the test if required.
+ IF( DO .EQ. 0 ) THEN
+ LBND_IN( 1 ) = 10
+ UBND_IN( 1 ) = 19
+ LBND_OUT( 1 ) = 12
+ UBND_OUT( 1 ) = 20
+ LBND( 1 ) = 11
+ UBND( 1 ) = 17
+ M = AST_SHIFTMAP( 1, 3.0D0, ' ', STATUS )
+ PARAMS(1) = 2.0
+ PARAMS(2) = 2.0
+ TOL = 0.1
+
+* Fill the input data and variance arrays if required.
+ ELSE IF( DO .EQ. 1 ) THEN
+ DO I = LBND_IN(1), UBND_IN(1)
+ IN( I - LBND_IN(1) + 1 ) = I*K
+ IN_VAR( I - LBND_IN(1) + 1 ) = I
+ END DO
+
+* Otherwise check output data and variance arrays look right.
+ ELSE
+
+ DO I = LBND_OUT(1), LBND(1) + 2
+ IF( .NOT. EQUALR( OUT( I - LBND_OUT(1) + 1 ),
+ : 0.0E0) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', I )
+ CALL MSG_SETD( 'V', DBLE( OUT( I - LBND_OUT(1) + 1 ) ) )
+ CALL ERR_REP( ' ', 'TEST4R ^I: ^V != BAD', STATUS )
+ RETURN
+ ELSE IF( .NOT. EQUALR( OUT_VAR( I - LBND_OUT(1) + 1 ),
+ : 0.0E0) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', I )
+ CALL MSG_SETD( 'V', DBLE( OUT_VAR(I-LBND_OUT(1)+1) ) )
+ CALL ERR_REP( ' ', 'TEST4R ^I: variance ^V != BAD',
+ : STATUS )
+ RETURN
+ END IF
+ END DO
+
+ DO I = LBND(1) + 3, UBND_OUT(1)
+ IF( .NOT. EQUALR( OUT( I - LBND_OUT(1) + 1 ),
+ : IN( I - 3 - LBND_IN(1) + 1 ) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', I )
+ IF( OUT( I - LBND_OUT(1) + 1 ) .NE. VAL__BADR ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT( I - LBND_OUT(1) + 1)))
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL MSG_SETD( 'B', DBLE( IN( I -3 - LBND_IN(1) + 1 ) ) )
+ CALL ERR_REP( ' ', 'TEST4R ^I: data ^V != ^B', STATUS )
+ RETURN
+ ELSE IF( .NOT. EQUALR( OUT_VAR( I - LBND_OUT(1) + 1 ),
+ : IN_VAR( I - 3 - LBND_IN(1) + 1 ) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', I )
+ IF( OUT_VAR(I-LBND_OUT(1)+1) .NE. VAL__BADR ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT_VAR(I-LBND_OUT(1)+1)))
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL MSG_SETD( 'B', DBLE( IN_VAR(I-3-LBND_IN(1)+1) ) )
+ CALL ERR_REP( ' ', 'TEST4R ^I: variance ^V != ^B',
+ : STATUS )
+ RETURN
+ END IF
+ END DO
+
+ END IF
+
+ END
+
+
+
+* -----------------------------------------------
+* Test 5
+*
+
+ SUBROUTINE TEST5( DO, NAME, TYPE,
+ : LBND_IN, UBND_IN, IPIN, IPIN_VAR,
+ : LBND_OUT, UBND_OUT, IPOUT, IPOUT_VAR,
+ : LBND, UBND, M, PARAMS, TOL, J, STATUS )
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'CNF_PAR'
+
+ INTEGER M, LBND_IN(*), UBND_IN(*), LBND_OUT(*), UBND_OUT(*),
+ : LBND(*), UBND(*), IPIN, IPIN_VAR, IPOUT, IPOUT_VAR,
+ : STATUS, DO, J
+ DOUBLE PRECISION TOL, PARAMS(*)
+ CHARACTER TYPE*(*), NAME*(*)
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ NAME = 'TEST5'
+
+* Fill the input data and variance arrays if required.
+ IF( TYPE .EQ. '_REAL' ) THEN
+ CALL TEST5R( DO, LBND_IN, UBND_IN, %VAL(CNF_PVAL(IPIN)),
+ : %VAL(CNF_PVAL(IPIN_VAR)), LBND_OUT, UBND_OUT,
+ : %VAL(CNF_PVAL(IPOUT)),%VAL(CNF_PVAL(IPOUT_VAR)),
+ : LBND, UBND, M, PARAMS, TOL, J, STATUS )
+
+ ELSE IF( TYPE .EQ. '_DOUBLE' ) THEN
+ CALL TEST5D( DO, LBND_IN, UBND_IN, %VAL(CNF_PVAL(IPIN)),
+ : %VAL(CNF_PVAL(IPIN_VAR)), LBND_OUT, UBND_OUT,
+ : %VAL(CNF_PVAL(IPOUT)),%VAL(CNF_PVAL(IPOUT_VAR)),
+ : LBND, UBND, M, PARAMS, TOL, J, STATUS )
+
+ ELSE IF( TYPE .EQ. '_INTEGER' ) THEN
+ CALL TEST5I( DO, LBND_IN, UBND_IN, %VAL(CNF_PVAL(IPIN)),
+ : %VAL(CNF_PVAL(IPIN_VAR)), LBND_OUT, UBND_OUT,
+ : %VAL(CNF_PVAL(IPOUT)),%VAL(CNF_PVAL(IPOUT_VAR)),
+ : LBND, UBND, M, PARAMS, TOL, J, STATUS )
+
+ ELSE IF( STATUS .EQ. SAI__OK ) then
+ STATUS = SAI__ERROR
+ CALL MSG_SETC( 'T', TYPE )
+ CALL ERR_REP( ' ', 'Bad data type (^T) supplied to TEST5',
+ : STATUS )
+ END IF
+
+ END
+
+
+
+
+ SUBROUTINE TEST5D( DO, LBND_IN, UBND_IN, IN, IN_VAR, LBND_OUT,
+ : UBND_OUT, OUT, OUT_VAR, LBND, UBND, M,
+ : PARAMS, TOL, SPREAD, STATUS )
+
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'PRM_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'CNF_PAR'
+ INCLUDE 'NUM_DEC'
+ INCLUDE 'NUM_DEF'
+
+ INTEGER DO, LBND_IN(*), UBND_IN(*), LBND_OUT(*), UBND_OUT(*),
+ : SPREAD, LBND(*), UBND(*), STATUS, M, I, J, K
+ DOUBLE PRECISION IN(*), IN_VAR(*), OUT(*), OUT_VAR(*)
+ DOUBLE PRECISION TOL, PARAMS(*), KFAC, SHIFTS(2)
+ LOGICAL EQUALD
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ KFAC = MIN( 1000.0D0, NUM_DTOD( VAL__MAXD )/20.0 )
+
+* Return the scalar parameters of the test if required.
+ IF( DO .EQ. 0 ) THEN
+ LBND_IN( 1 ) = -1
+ UBND_IN( 1 ) = 2
+ LBND_OUT( 1 ) = 0
+ UBND_OUT( 1 ) = 3
+ LBND( 1 ) = -1
+ UBND( 1 ) = 1
+ LBND_IN( 2 ) = 3
+ UBND_IN( 2 ) = 6
+ LBND_OUT( 2 ) = 2
+ UBND_OUT( 2 ) = 5
+ LBND( 2 ) = 3
+ UBND( 2 ) = 6
+ SHIFTS(1) = 3.0D0
+ SHIFTS(2) = -1.0D0
+ M = AST_SHIFTMAP( 2, SHIFTS, ' ', STATUS )
+ PARAMS(1) = 2.0
+ PARAMS(2) = 2.0
+ TOL = 0.0
+
+* Fill the input data and variance arrays if required.
+ ELSE IF( DO .EQ. 1 ) THEN
+ K = 1
+ DO J = LBND_IN(2), UBND_IN(2)
+ DO I = LBND_IN(1), UBND_IN(1)
+ IN( K ) = K*KFAC
+ IN_VAR( K ) = K
+ K = K + 1
+ END DO
+ END DO
+
+* Otherwise check output data and variance arrays look right.
+ ELSE
+ K = 1
+ DO J = LBND_OUT(2), UBND_OUT(2)
+ DO I = LBND_OUT(1), UBND_OUT(1)
+ IF( MOD( K - 1, 4 ) .LT. 2 ) THEN
+ IF( .NOT. EQUALD( OUT( K ), 0.0D0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT( K ) .NE. VAL__BADD ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT( K ) ) )
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL ERR_REP( ' ', 'TEST5D ^I: ^V != BAD',
+ : STATUS )
+ RETURN
+ ELSE IF( .NOT. EQUALD( OUT_VAR( K ),
+ : 0.0D0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT_VAR( K ) .NE. VAL__BADD ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT_VAR( K )))
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL ERR_REP( ' ', 'TEST5D ^I: variance ^V '//
+ : '!= BAD', STATUS )
+ RETURN
+ END IF
+ ELSE
+ IF( .NOT. EQUALD( OUT( K ), IN( K - 2 ) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT( K ) .NE. VAL__BADD ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT( K ) ) )
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL MSG_SETD( 'B', DBLE( IN( K - 2 ) ) )
+ CALL ERR_REP( ' ', 'TEST5D ^I: data ^V != ^B',
+ : STATUS )
+ RETURN
+ ELSE IF( .NOT. EQUALD( OUT( K ), IN( K-2 ) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT( K ) .NE. VAL__BADD ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT_VAR( K ) ) )
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL MSG_SETD( 'B', DBLE( IN_VAR( K - 2 ) ) )
+ CALL ERR_REP( ' ',
+ : 'TEST5D ^I: variance ^V != ^B',
+ : STATUS )
+ RETURN
+ END IF
+ END IF
+ K = K + 1
+ END DO
+ END DO
+
+ END IF
+
+ END
+
+
+
+ SUBROUTINE TEST5I( DO, LBND_IN, UBND_IN, IN, IN_VAR, LBND_OUT,
+ : UBND_OUT, OUT, OUT_VAR, LBND, UBND, M,
+ : PARAMS, TOL, SPREAD, STATUS )
+
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'PRM_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'CNF_PAR'
+ INCLUDE 'NUM_DEC'
+ INCLUDE 'NUM_DEF'
+
+ INTEGER DO, LBND_IN(*), UBND_IN(*), LBND_OUT(*), UBND_OUT(*),
+ : SPREAD, LBND(*), UBND(*), STATUS, M, I, J, K
+ INTEGER IN(*), IN_VAR(*), OUT(*), OUT_VAR(*)
+ DOUBLE PRECISION TOL, PARAMS(*), KFAC, SHIFTS(2)
+ LOGICAL EQUALI
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ KFAC = MIN( 1000.0D0, NUM_ITOD( VAL__MAXI )/20.0 )
+
+* Return the scalar parameters of the test if required.
+ IF( DO .EQ. 0 ) THEN
+ LBND_IN( 1 ) = -1
+ UBND_IN( 1 ) = 2
+ LBND_OUT( 1 ) = 0
+ UBND_OUT( 1 ) = 3
+ LBND( 1 ) = -1
+ UBND( 1 ) = 1
+ LBND_IN( 2 ) = 3
+ UBND_IN( 2 ) = 6
+ LBND_OUT( 2 ) = 2
+ UBND_OUT( 2 ) = 5
+ LBND( 2 ) = 3
+ UBND( 2 ) = 6
+ SHIFTS(1) = 3.0D0
+ SHIFTS(2) = -1.0D0
+ M = AST_SHIFTMAP( 2, SHIFTS, ' ', STATUS )
+ PARAMS(1) = 2.0
+ PARAMS(2) = 2.0
+ TOL = 0.0
+
+* Fill the input data and variance arrays if required.
+ ELSE IF( DO .EQ. 1 ) THEN
+ K = 1
+ DO J = LBND_IN(2), UBND_IN(2)
+ DO I = LBND_IN(1), UBND_IN(1)
+ IN( K ) = K*KFAC
+ IN_VAR( K ) = K
+ K = K + 1
+ END DO
+ END DO
+
+* Otherwise check output data and variance arrays look right.
+ ELSE
+ K = 1
+ DO J = LBND_OUT(2), UBND_OUT(2)
+ DO I = LBND_OUT(1), UBND_OUT(1)
+ IF( MOD( K - 1, 4 ) .LT. 2 ) THEN
+ IF( .NOT. EQUALI( OUT( K ), 0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT( K ) .NE. VAL__BADI ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT( K ) ) )
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL ERR_REP( ' ', 'TEST5I ^I: ^V != BAD',
+ : STATUS )
+ RETURN
+ ELSE IF( .NOT. EQUALI( OUT_VAR( K ),
+ : 0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT_VAR( K ) .NE. VAL__BADI ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT_VAR( K )))
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL ERR_REP( ' ', 'TEST5I ^I: variance ^V '//
+ : '!= BAD', STATUS )
+ RETURN
+ END IF
+ ELSE
+ IF( .NOT. EQUALI( OUT( K ), IN( K - 2 ) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT( K ) .NE. VAL__BADI ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT( K ) ) )
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL MSG_SETD( 'B', DBLE( IN( K - 2 ) ) )
+ CALL ERR_REP( ' ', 'TEST5I ^I: data ^V != ^B',
+ : STATUS )
+ RETURN
+ ELSE IF( .NOT. EQUALI( OUT( K ), IN( K-2 ) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT( K ) .NE. VAL__BADI ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT_VAR( K ) ) )
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL MSG_SETD( 'B', DBLE( IN_VAR( K - 2 ) ) )
+ CALL ERR_REP( ' ',
+ : 'TEST5I ^I: variance ^V != ^B',
+ : STATUS )
+ RETURN
+ END IF
+ END IF
+ K = K + 1
+ END DO
+ END DO
+
+ END IF
+
+ END
+
+
+
+ SUBROUTINE TEST5R( DO, LBND_IN, UBND_IN, IN, IN_VAR, LBND_OUT,
+ : UBND_OUT, OUT, OUT_VAR, LBND, UBND, M,
+ : PARAMS, TOL, SPREAD, STATUS )
+
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'PRM_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'CNF_PAR'
+ INCLUDE 'NUM_DEC'
+ INCLUDE 'NUM_DEF'
+
+ INTEGER DO, LBND_IN(*), UBND_IN(*), LBND_OUT(*), UBND_OUT(*),
+ : SPREAD, LBND(*), UBND(*), STATUS, M, I, J, K
+ REAL IN(*), IN_VAR(*), OUT(*), OUT_VAR(*)
+ DOUBLE PRECISION TOL, PARAMS(*), KFAC, SHIFTS(2)
+ LOGICAL EQUALR
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ KFAC = MIN( 1000.0D0, NUM_RTOD( VAL__MAXR )/20.0 )
+
+* Return the scalar parameters of the test if required.
+ IF( DO .EQ. 0 ) THEN
+ LBND_IN( 1 ) = -1
+ UBND_IN( 1 ) = 2
+ LBND_OUT( 1 ) = 0
+ UBND_OUT( 1 ) = 3
+ LBND( 1 ) = -1
+ UBND( 1 ) = 1
+ LBND_IN( 2 ) = 3
+ UBND_IN( 2 ) = 6
+ LBND_OUT( 2 ) = 2
+ UBND_OUT( 2 ) = 5
+ LBND( 2 ) = 3
+ UBND( 2 ) = 6
+ SHIFTS(1) = 3.0D0
+ SHIFTS(2) = -1.0D0
+ M = AST_SHIFTMAP( 2, SHIFTS, ' ', STATUS )
+ PARAMS(1) = 2.0
+ PARAMS(2) = 2.0
+ TOL = 0.0
+
+* Fill the input data and variance arrays if required.
+ ELSE IF( DO .EQ. 1 ) THEN
+ K = 1
+ DO J = LBND_IN(2), UBND_IN(2)
+ DO I = LBND_IN(1), UBND_IN(1)
+ IN( K ) = K*KFAC
+ IN_VAR( K ) = K
+ K = K + 1
+ END DO
+ END DO
+
+* Otherwise check output data and variance arrays look right.
+ ELSE
+ K = 1
+ DO J = LBND_OUT(2), UBND_OUT(2)
+ DO I = LBND_OUT(1), UBND_OUT(1)
+ IF( MOD( K - 1, 4 ) .LT. 2 ) THEN
+ IF( .NOT. EQUALR( OUT( K ), 0.0E0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT( K ) .NE. VAL__BADR ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT( K ) ) )
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL ERR_REP( ' ', 'TEST5R ^I: ^V != BAD',
+ : STATUS )
+ RETURN
+ ELSE IF( .NOT. EQUALR( OUT_VAR( K ),
+ : 0.0E0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT_VAR( K ) .NE. VAL__BADR ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT_VAR( K )))
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL ERR_REP( ' ', 'TEST5R ^I: variance ^V '//
+ : '!= BAD', STATUS )
+ RETURN
+ END IF
+ ELSE
+ IF( .NOT. EQUALR( OUT( K ), IN( K - 2 ) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT( K ) .NE. VAL__BADR ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT( K ) ) )
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL MSG_SETD( 'B', DBLE( IN( K - 2 ) ) )
+ CALL ERR_REP( ' ', 'TEST5R ^I: data ^V != ^B',
+ : STATUS )
+ RETURN
+ ELSE IF( .NOT. EQUALR( OUT( K ), IN( K-2 ) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT( K ) .NE. VAL__BADR ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT_VAR( K ) ) )
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL MSG_SETD( 'B', DBLE( IN_VAR( K - 2 ) ) )
+ CALL ERR_REP( ' ',
+ : 'TEST5R ^I: variance ^V != ^B',
+ : STATUS )
+ RETURN
+ END IF
+ END IF
+ K = K + 1
+ END DO
+ END DO
+
+ END IF
+
+ END
+
+
+
+
+
+* -----------------------------------------------
+* Test 6
+*
+
+ SUBROUTINE TEST6( DO, NAME, TYPE,
+ : LBND_IN, UBND_IN, IPIN, IPIN_VAR,
+ : LBND_OUT, UBND_OUT, IPOUT, IPOUT_VAR,
+ : LBND, UBND, M, PARAMS, TOL, J, STATUS )
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'CNF_PAR'
+
+ INTEGER M, LBND_IN(*), UBND_IN(*), LBND_OUT(*), UBND_OUT(*),
+ : LBND(*), UBND(*), IPIN, IPIN_VAR, IPOUT, IPOUT_VAR,
+ : STATUS, DO, J
+ DOUBLE PRECISION TOL, PARAMS(*)
+ CHARACTER TYPE*(*), NAME*(*)
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ NAME = 'TEST6'
+
+* Fill the input data and variance arrays if required.
+ IF( TYPE .EQ. '_REAL' ) THEN
+ CALL TEST6R( DO, LBND_IN, UBND_IN, %VAL(CNF_PVAL(IPIN)),
+ : %VAL(CNF_PVAL(IPIN_VAR)), LBND_OUT, UBND_OUT,
+ : %VAL(CNF_PVAL(IPOUT)),%VAL(CNF_PVAL(IPOUT_VAR)),
+ : LBND, UBND, M, PARAMS, TOL, J, STATUS )
+
+ ELSE IF( TYPE .EQ. '_DOUBLE' ) THEN
+ CALL TEST6D( DO, LBND_IN, UBND_IN, %VAL(CNF_PVAL(IPIN)),
+ : %VAL(CNF_PVAL(IPIN_VAR)), LBND_OUT, UBND_OUT,
+ : %VAL(CNF_PVAL(IPOUT)),%VAL(CNF_PVAL(IPOUT_VAR)),
+ : LBND, UBND, M, PARAMS, TOL, J, STATUS )
+
+ ELSE IF( TYPE .EQ. '_INTEGER' ) THEN
+ CALL TEST6I( DO, LBND_IN, UBND_IN, %VAL(CNF_PVAL(IPIN)),
+ : %VAL(CNF_PVAL(IPIN_VAR)), LBND_OUT, UBND_OUT,
+ : %VAL(CNF_PVAL(IPOUT)),%VAL(CNF_PVAL(IPOUT_VAR)),
+ : LBND, UBND, M, PARAMS, TOL, J, STATUS )
+
+ ELSE IF( STATUS .EQ. SAI__OK ) then
+ STATUS = SAI__ERROR
+ CALL MSG_SETC( 'T', TYPE )
+ CALL ERR_REP( ' ', 'Bad data type (^T) supplied to TEST6',
+ : STATUS )
+ END IF
+
+ END
+
+
+
+
+ SUBROUTINE TEST6D( DO, LBND_IN, UBND_IN, IN, IN_VAR, LBND_OUT,
+ : UBND_OUT, OUT, OUT_VAR, LBND, UBND, M,
+ : PARAMS, TOL, SPREAD, STATUS )
+
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'PRM_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'CNF_PAR'
+ INCLUDE 'NUM_DEC'
+ INCLUDE 'NUM_DEF'
+
+ INTEGER DO, LBND_IN(*), UBND_IN(*), LBND_OUT(*), UBND_OUT(*),
+ : SPREAD, LBND(*), UBND(*), STATUS, M, I, J, K, L, K2
+ DOUBLE PRECISION IN(*), IN_VAR(*), OUT(*), OUT_VAR(*)
+ DOUBLE PRECISION TOL, PARAMS(*), KFAC, SHIFTS(3)
+ LOGICAL EQUALD
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ KFAC = MIN( 1000.0D0, NUM_DTOD( VAL__MAXD )/20.0 )
+
+* Return the scalar parameters of the test if required.
+ IF( DO .EQ. 0 ) THEN
+ LBND_IN( 1 ) = -1
+ UBND_IN( 1 ) = 2
+ LBND_OUT( 1 ) = 0
+ UBND_OUT( 1 ) = 3
+ LBND( 1 ) = -1
+ UBND( 1 ) = 1
+ LBND_IN( 2 ) = 3
+ UBND_IN( 2 ) = 6
+ LBND_OUT( 2 ) = 2
+ UBND_OUT( 2 ) = 5
+ LBND( 2 ) = 3
+ UBND( 2 ) = 6
+ LBND_IN( 3 ) = -1
+ UBND_IN( 3 ) = 1
+ LBND_OUT( 3 ) = 0
+ UBND_OUT( 3 ) = 2
+ LBND( 3 ) = -1
+ UBND( 3 ) = 1
+ SHIFTS(1) = 3.0D0
+ SHIFTS(2) = -1.0D0
+ SHIFTS(3) = 1.0D0
+ M = AST_SHIFTMAP( 3, SHIFTS, ' ', STATUS )
+ PARAMS(1) = 2.0
+ PARAMS(2) = 2.0
+ TOL = 0.0
+
+* Fill the input data and variance arrays if required.
+ ELSE IF( DO .EQ. 1 ) THEN
+ K = 1
+ DO L = LBND_IN(3), UBND_IN(3)
+ DO J = LBND_IN(2), UBND_IN(2)
+ DO I = LBND_IN(1), UBND_IN(1)
+ IN( K ) = K*KFAC
+ IN_VAR( K ) = K
+ K = K + 1
+ END DO
+ END DO
+ END DO
+
+* Otherwise check output data and variance arrays look right.
+ ELSE
+ K = 1
+ DO L = LBND_OUT(3), UBND_OUT(3)
+ DO J = LBND_OUT(2), UBND_OUT(2)
+ DO I = LBND_OUT(1), UBND_OUT(1)
+
+ K2 = MOD( K - 1, 16 ) + 1
+ IF( MOD( K2 - 1, 4 ) .LT. 2 ) THEN
+ IF( .NOT. EQUALD( OUT( K ), 0.0D0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT( K ) .NE. VAL__BADD ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT( K ) ) )
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL ERR_REP( ' ', 'TEST6D ^I: ^V != BAD',
+ : STATUS )
+ RETURN
+ ELSE IF( .NOT. EQUALD( OUT_VAR( K ),
+ : 0.0D0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT_VAR( K ) .NE. VAL__BADD ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT_VAR( K )))
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL ERR_REP( ' ', 'TEST6D ^I: variance ^V '//
+ : '!= BAD', STATUS )
+ RETURN
+ END IF
+ ELSE
+ IF( .NOT. EQUALD( OUT( K ), IN( K - 2 ))) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT( K ) .NE. VAL__BADD ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT( K ) ) )
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL MSG_SETD( 'B', DBLE( IN( K-2 ) ) )
+ CALL ERR_REP( ' ', 'TEST6D ^I: data ^V != ^B',
+ : STATUS )
+ RETURN
+ ELSE IF( .NOT. EQUALD( OUT( K ), IN(K-2) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT( K ) .NE. VAL__BADD ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT_VAR( K ) ) )
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL MSG_SETD( 'B', DBLE( IN_VAR( K-2 ) ) )
+ CALL ERR_REP( ' ',
+ : 'TEST6D ^I: variance ^V != ^B',
+ : STATUS )
+ RETURN
+ END IF
+ END IF
+ K = K + 1
+ END DO
+ END DO
+ END DO
+ END IF
+
+ END
+
+
+
+ SUBROUTINE TEST6I( DO, LBND_IN, UBND_IN, IN, IN_VAR, LBND_OUT,
+ : UBND_OUT, OUT, OUT_VAR, LBND, UBND, M,
+ : PARAMS, TOL, SPREAD, STATUS )
+
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'PRM_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'CNF_PAR'
+ INCLUDE 'NUM_DEC'
+ INCLUDE 'NUM_DEF'
+
+ INTEGER DO, LBND_IN(*), UBND_IN(*), LBND_OUT(*), UBND_OUT(*),
+ : SPREAD, LBND(*), UBND(*), STATUS, M, I, J, K, L, K2
+ INTEGER IN(*), IN_VAR(*), OUT(*), OUT_VAR(*)
+ DOUBLE PRECISION TOL, PARAMS(*), KFAC, SHIFTS(3)
+ LOGICAL EQUALI
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ KFAC = MIN( 1000.0D0, NUM_ITOD( VAL__MAXI )/20.0 )
+
+* Return the scalar parameters of the test if required.
+ IF( DO .EQ. 0 ) THEN
+ LBND_IN( 1 ) = -1
+ UBND_IN( 1 ) = 2
+ LBND_OUT( 1 ) = 0
+ UBND_OUT( 1 ) = 3
+ LBND( 1 ) = -1
+ UBND( 1 ) = 1
+ LBND_IN( 2 ) = 3
+ UBND_IN( 2 ) = 6
+ LBND_OUT( 2 ) = 2
+ UBND_OUT( 2 ) = 5
+ LBND( 2 ) = 3
+ UBND( 2 ) = 6
+ LBND_IN( 3 ) = -1
+ UBND_IN( 3 ) = 1
+ LBND_OUT( 3 ) = 0
+ UBND_OUT( 3 ) = 2
+ LBND( 3 ) = -1
+ UBND( 3 ) = 1
+ SHIFTS(1) = 3.0D0
+ SHIFTS(2) = -1.0D0
+ SHIFTS(3) = 1.0D0
+ M = AST_SHIFTMAP( 3, SHIFTS, ' ', STATUS )
+ PARAMS(1) = 2.0
+ PARAMS(2) = 2.0
+ TOL = 0.0
+
+* Fill the input data and variance arrays if required.
+ ELSE IF( DO .EQ. 1 ) THEN
+ K = 1
+ DO L = LBND_IN(3), UBND_IN(3)
+ DO J = LBND_IN(2), UBND_IN(2)
+ DO I = LBND_IN(1), UBND_IN(1)
+ IN( K ) = K*KFAC
+ IN_VAR( K ) = K
+ K = K + 1
+ END DO
+ END DO
+ END DO
+
+* Otherwise check output data and variance arrays look right.
+ ELSE
+ K = 1
+ DO L = LBND_OUT(3), UBND_OUT(3)
+ DO J = LBND_OUT(2), UBND_OUT(2)
+ DO I = LBND_OUT(1), UBND_OUT(1)
+
+ K2 = MOD( K - 1, 16 ) + 1
+ IF( MOD( K2 - 1, 4 ) .LT. 2 ) THEN
+ IF( .NOT. EQUALI( OUT( K ), 0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT( K ) .NE. VAL__BADI ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT( K ) ) )
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL ERR_REP( ' ', 'TEST6I ^I: ^V != BAD',
+ : STATUS )
+ RETURN
+ ELSE IF( .NOT. EQUALI( OUT_VAR( K ),
+ : 0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT_VAR( K ) .NE. VAL__BADI ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT_VAR( K )))
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL ERR_REP( ' ', 'TEST6I ^I: variance ^V '//
+ : '!= BAD', STATUS )
+ RETURN
+ END IF
+ ELSE
+ IF( .NOT. EQUALI( OUT( K ), IN( K - 2 ))) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT( K ) .NE. VAL__BADI ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT( K ) ) )
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL MSG_SETD( 'B', DBLE( IN( K-2 ) ) )
+ CALL ERR_REP( ' ', 'TEST6I ^I: data ^V != ^B',
+ : STATUS )
+ RETURN
+ ELSE IF( .NOT. EQUALI( OUT( K ), IN(K-2) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT( K ) .NE. VAL__BADI ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT_VAR( K ) ) )
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL MSG_SETD( 'B', DBLE( IN_VAR( K-2 ) ) )
+ CALL ERR_REP( ' ',
+ : 'TEST6I ^I: variance ^V != ^B',
+ : STATUS )
+ RETURN
+ END IF
+ END IF
+ K = K + 1
+ END DO
+ END DO
+ END DO
+ END IF
+
+ END
+
+
+
+ SUBROUTINE TEST6R( DO, LBND_IN, UBND_IN, IN, IN_VAR, LBND_OUT,
+ : UBND_OUT, OUT, OUT_VAR, LBND, UBND, M,
+ : PARAMS, TOL, SPREAD, STATUS )
+
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'PRM_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'CNF_PAR'
+ INCLUDE 'NUM_DEC'
+ INCLUDE 'NUM_DEF'
+
+ INTEGER DO, LBND_IN(*), UBND_IN(*), LBND_OUT(*), UBND_OUT(*),
+ : SPREAD, LBND(*), UBND(*), STATUS, M, I, J, K, L, K2
+ REAL IN(*), IN_VAR(*), OUT(*), OUT_VAR(*)
+ DOUBLE PRECISION TOL, PARAMS(*), KFAC, SHIFTS(3)
+ LOGICAL EQUALR
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ KFAC = MIN( 1000.0D0, NUM_RTOD( VAL__MAXR )/20.0 )
+
+* Return the scalar parameters of the test if required.
+ IF( DO .EQ. 0 ) THEN
+ LBND_IN( 1 ) = -1
+ UBND_IN( 1 ) = 2
+ LBND_OUT( 1 ) = 0
+ UBND_OUT( 1 ) = 3
+ LBND( 1 ) = -1
+ UBND( 1 ) = 1
+ LBND_IN( 2 ) = 3
+ UBND_IN( 2 ) = 6
+ LBND_OUT( 2 ) = 2
+ UBND_OUT( 2 ) = 5
+ LBND( 2 ) = 3
+ UBND( 2 ) = 6
+ LBND_IN( 3 ) = -1
+ UBND_IN( 3 ) = 1
+ LBND_OUT( 3 ) = 0
+ UBND_OUT( 3 ) = 2
+ LBND( 3 ) = -1
+ UBND( 3 ) = 1
+ SHIFTS(1) = 3.0D0
+ SHIFTS(2) = -1.0D0
+ SHIFTS(3) = 1.0D0
+ M = AST_SHIFTMAP( 3, SHIFTS, ' ', STATUS )
+ PARAMS(1) = 2.0
+ PARAMS(2) = 2.0
+ TOL = 0.0
+
+* Fill the input data and variance arrays if required.
+ ELSE IF( DO .EQ. 1 ) THEN
+ K = 1
+ DO L = LBND_IN(3), UBND_IN(3)
+ DO J = LBND_IN(2), UBND_IN(2)
+ DO I = LBND_IN(1), UBND_IN(1)
+ IN( K ) = K*KFAC
+ IN_VAR( K ) = K
+ K = K + 1
+ END DO
+ END DO
+ END DO
+
+* Otherwise check output data and variance arrays look right.
+ ELSE
+ K = 1
+ DO L = LBND_OUT(3), UBND_OUT(3)
+ DO J = LBND_OUT(2), UBND_OUT(2)
+ DO I = LBND_OUT(1), UBND_OUT(1)
+
+ K2 = MOD( K - 1, 16 ) + 1
+ IF( MOD( K2 - 1, 4 ) .LT. 2 ) THEN
+ IF( .NOT. EQUALR( OUT( K ), 0.0E0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT( K ) .NE. VAL__BADR ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT( K ) ) )
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL ERR_REP( ' ', 'TEST6R ^I: ^V != BAD',
+ : STATUS )
+ RETURN
+ ELSE IF( .NOT. EQUALR( OUT_VAR( K ),
+ : 0.0E0 ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT_VAR( K ) .NE. VAL__BADR ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT_VAR( K )))
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL ERR_REP( ' ', 'TEST6R ^I: variance ^V '//
+ : '!= BAD', STATUS )
+ RETURN
+ END IF
+ ELSE
+ IF( .NOT. EQUALR( OUT( K ), IN( K - 2 ))) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT( K ) .NE. VAL__BADR ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT( K ) ) )
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL MSG_SETD( 'B', DBLE( IN( K-2 ) ) )
+ CALL ERR_REP( ' ', 'TEST6R ^I: data ^V != ^B',
+ : STATUS )
+ RETURN
+ ELSE IF( .NOT. EQUALR( OUT( K ), IN(K-2) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', K )
+ IF( OUT( K ) .NE. VAL__BADR ) THEN
+ CALL MSG_SETD( 'V', DBLE( OUT_VAR( K ) ) )
+ ELSE
+ CALL MSG_SETC( 'V', 'BAD' )
+ END IF
+ CALL MSG_SETD( 'B', DBLE( IN_VAR( K-2 ) ) )
+ CALL ERR_REP( ' ',
+ : 'TEST6R ^I: variance ^V != ^B',
+ : STATUS )
+ RETURN
+ END IF
+ END IF
+ K = K + 1
+ END DO
+ END DO
+ END DO
+ END IF
+
+ END
+
+
+
diff --git a/ast/ast_tester/testrebinseq.f b/ast/ast_tester/testrebinseq.f
new file mode 100644
index 0000000..3ab4e43
--- /dev/null
+++ b/ast/ast_tester/testrebinseq.f
@@ -0,0 +1,1580 @@
+ program testrebin
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+
+ integer status
+ double precision params(2)
+ character ch
+ status = sai__ok
+
+ call ast_begin( status )
+
+ params(1) = 1.5
+ params(2) = 1
+
+ call tests( 1, AST__GAUSS, params, status )
+ call tests( 2, AST__GAUSS, params, status )
+ call tests( 3, AST__GAUSS, params, status )
+ call tests( 1, AST__NEAREST, params, status )
+ call tests( 2, AST__NEAREST, params, status )
+ call tests( 3, AST__NEAREST, params, status )
+ call tests( 1, AST__LINEAR, params, status )
+ call tests( 2, AST__LINEAR, params, status )
+ call tests( 3, AST__LINEAR, params, status )
+
+ call ast_end( status )
+ call ast_flushmemory( 1 )
+
+ if( status .eq. sai__ok ) then
+ write(*,*) 'All AST_REBINSEQ tests passed'
+ else
+ write(*,*) 'AST_REBINSEQ tests failed'
+ end if
+
+ end
+
+ subroutine tests( NDIM, SPREAD, params, status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+
+ integer spread, status, ndim
+ double precision params(2)
+
+ if( status .ne. sai__ok ) return
+
+ call test1( NDIM, SPREAD, params, status )
+ call test2( NDIM, SPREAD, params, status )
+ call test3( NDIM, SPREAD, params, status )
+ call test4( NDIM, SPREAD, params, status )
+ call test5( NDIM, SPREAD, params, status )
+ call test6( NDIM, SPREAD, params, status )
+ call test7( NDIM, SPREAD, params, status )
+ call test8( NDIM, SPREAD, params, status )
+ call test9( NDIM, SPREAD, params, status )
+ call test10( NDIM, SPREAD, params, status )
+ call test11( NDIM, SPREAD, params, status )
+ call test12( NDIM, SPREAD, params, status )
+
+ if( status .ne. SAI__OK ) then
+ call msg_seti( 'N', ndim )
+
+ if( spread .eq. AST__GAUSS ) then
+ call msg_setc( 'S', 'AST__GAUSS' )
+ else if( spread .eq. AST__NEAREST ) then
+ call msg_setc( 'S', 'AST__NEAREST' )
+ else if( spread .eq. AST__LINEAR ) then
+ call msg_setc( 'S', 'AST__LINEAR' )
+ endif
+ call err_rep( ' ', 'Spread=^S (^N-dimensional)', status )
+ endif
+
+ end
+
+
+
+
+ SUBROUTINE ADDNOISE( N, ARRAY, SIGMA, STATUS )
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'PRM_PAR'
+
+ INTEGER BUFSIZE
+ PARAMETER ( BUFSIZE = 100 )
+
+ INTEGER N, STATUS, MM, IAT, NUSED, I
+ DOUBLE PRECISION ARRAY( N )
+ DOUBLE PRECISION SIGMA
+ DOUBLE PRECISION NOISE( BUFSIZE )
+ DOUBLE PRECISION JUNK( BUFSIZE )
+
+ CHARACTER FWD(1)*80
+ CHARACTER INV(1)*80
+
+ DATA JUNK/ BUFSIZE*0.0D0 /
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+
+ FWD(1) = 'Y=Gauss(0.0,'
+ IAT = 12
+ CALL CHR_PUTD( SIGMA, FWD(1), IAT )
+ CALL CHR_APPND( ')', FWD(1), IAT )
+ INV(1) = 'X'
+
+ MM = AST_MATHMAP( 1, 1, 1, FWD, 1, INV, ' ', STATUS )
+
+ NUSED = BUFSIZE
+ DO I = 1, N
+ IF( NUSED .EQ. BUFSIZE ) THEN
+ CALL AST_TRAN1( MM, BUFSIZE, JUNK, .TRUE., NOISE, STATUS )
+ NUSED = 0
+ END IF
+ NUSED = NUSED + 1
+ ARRAY( I ) = ARRAY( I ) + NOISE( NUSED )
+ END DO
+
+ CALL AST_ANNUL( MM, STATUS )
+
+ END
+
+
+
+
+
+
+ SUBROUTINE TEST1( NDIM, SPREAD, PARAMS, STATUS )
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'PRM_PAR'
+
+ INTEGER SPREAD, STATUS, NDIM
+
+ INTEGER NX, NY, JHI
+ PARAMETER( NX = 100 )
+ PARAMETER( NY = 200 )
+
+
+ REAL IN( NX, NY )
+ REAL OUT( NX, NY )
+ DOUBLE PRECISION PARAMS(2), WEIGHTS( NX, NY )
+ INTEGER MAP, LBND_IN(3), UBND_IN(3), LBND_OUT(3), UBND_OUT(3),
+ : FLAGS, I, J
+ INTEGER*8 NUSED
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+ CALL AST_BEGIN( STATUS )
+
+ DO I = 1, NX
+ DO J = 1, NY
+ IN( I, J ) = 1.0
+ END DO
+ END DO
+
+ LBND_IN( 1 ) = 0
+ LBND_IN( 2 ) = 1
+ LBND_IN( 3 ) = 1
+ UBND_IN( 1 ) = NX - 1
+ UBND_IN( 2 ) = NY
+ UBND_IN( 3 ) = 1
+
+ LBND_OUT( 1 ) = 0
+ LBND_OUT( 2 ) = 1
+ LBND_OUT( 3 ) = 1
+ UBND_OUT( 1 ) = NX - 1
+ UBND_OUT( 2 ) = NY
+ UBND_OUT( 3 ) = 1
+
+ FLAGS = AST__REBININIT + AST__REBINEND
+
+ MAP = AST_UNITMAP( NDIM, ' ', STATUS )
+ CALL AST_REBINSEQR( MAP, 0.0D0, NDIM, LBND_IN, UBND_IN, IN, IN,
+ : spread, PARAMS, FLAGS, 0.01D0, 50, VAL__BADR,
+ : NDIM, LBND_OUT, UBND_OUT, LBND_IN, UBND_IN,
+ : out, OUT, WEIGHTS, NUSED, STATUS )
+
+ IF( NDIM .EQ. 1 ) THEN
+ JHI = 1
+ ELSE
+ JHI = ny
+ ENDIF
+
+ DO I = 1, NX
+ DO J = 1, JHI
+ IF( ABS( OUT( I, J ) - 1.0 ) .GT. 1.0E-6 .AND.
+ : STATUS .EQ. SAI__OK ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', I )
+ CALL MSG_SETI( 'J', J )
+ CALL MSG_SETR( 'V', OUT(I,J) )
+ CALL ERR_REP( ' ', 'Output pixel (^I,^J) should be '//
+ : '1.0 but is ^V', status )
+ END IF
+ END DO
+ END DO
+
+ CALL AST_END( STATUS )
+ IF( STATUS .NE. SAI__OK ) THEN
+ CALL ERR_REP( ' ', 'test1 failed', STATUS )
+ END IF
+
+ END
+
+
+
+ SUBROUTINE TEST2( NDIM, SPREAD, PARAMS, STATUS )
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'PRM_PAR'
+
+ INTEGER SPREAD, STATUS, NDIM
+
+ INTEGER NX, NY, JHI
+ PARAMETER( NX = 100 )
+ PARAMETER( NY = 200 )
+
+
+ DOUBLE PRECISION IN( NX, NY )
+ DOUBLE PRECISION OUT( NX, NY )
+ DOUBLE PRECISION PARAMS(2), WEIGHTS( NX, NY )
+ INTEGER MAP, LBND_IN(3), UBND_IN(3), LBND_OUT(3), UBND_OUT(3),
+ : FLAGS, I, J
+ INTEGER*8 NUSED
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+ CALL AST_BEGIN( STATUS )
+
+ DO I = 1, NX
+ DO J = 1, NY
+ IN( I, J ) = 1.0D0
+ END DO
+ END DO
+
+ LBND_IN( 1 ) = 0
+ LBND_IN( 2 ) = 1
+ UBND_IN( 1 ) = NX - 1
+ UBND_IN( 2 ) = NY
+
+ LBND_OUT( 1 ) = 0
+ LBND_OUT( 2 ) = 1
+ UBND_OUT( 1 ) = NX - 1
+ UBND_OUT( 2 ) = NY
+
+ LBND_IN( 3 ) = 1
+ UBND_IN( 3 ) = 1
+ LBND_OUT( 3 ) = 1
+ UBND_OUT( 3 ) = 1
+
+ FLAGS = AST__REBININIT
+
+ MAP = AST_UNITMAP( NDIM, ' ', STATUS )
+
+ DO I = 1, 3
+ IF( I .EQ. 3 ) FLAGS = AST__REBINEND
+ CALL AST_REBINSEQD( MAP, 0.0D0, ndim, LBND_IN, UBND_IN, IN, IN,
+ : spread, PARAMS, FLAGS, 0.01D0, 50, VAL__BADD,
+ : ndim, LBND_OUT, UBND_OUT, LBND_IN, UBND_IN,
+ : OUT, OUT, WEIGHTS, NUSED, STATUS )
+ END DO
+
+ IF( NDIM .EQ. 1 ) THEN
+ JHI = 1
+ ELSE
+ JHI = ny
+ ENDIF
+
+ DO I = 1, NX
+ DO J = 1, JHI
+ IF( ABS( OUT( I, J ) - 1.0D0 ) .GT. 1.0E-6 ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', I )
+ CALL MSG_SETI( 'J', J )
+ CALL MSG_SETD( 'V', OUT(I,J) )
+ CALL ERR_REP( ' ', 'Output pixel (^I,^J) should be '//
+ : '1.0 but is ^V', status )
+ END IF
+ END DO
+ END DO
+
+ CALL AST_END( STATUS )
+ IF( STATUS .NE. SAI__OK ) THEN
+ CALL ERR_REP( ' ', 'test2 failed', STATUS )
+ END IF
+
+ END
+
+
+
+
+
+ SUBROUTINE TEST3( NDIM, SPREAD, PARAMS, STATUS )
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'PRM_PAR'
+
+ INTEGER SPREAD, STATUS, NDIM
+
+ INTEGER NX, NY
+ PARAMETER( NX = 100 )
+ PARAMETER( NY = 200 )
+
+ INTEGER IN( NX, NY )
+ INTEGER OUT( NX, NY )
+ DOUBLE PRECISION PARAMS(2), WEIGHTS( NX, NY )
+ INTEGER MAP, LBND_IN(3), UBND_IN(3), LBND_OUT(3), UBND_OUT(3),
+ : FLAGS, I, J, JHI
+ INTEGER*8 NUSED
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+ CALL AST_BEGIN( STATUS )
+
+ DO I = 1, NX
+ DO J = 1, NY
+ IN( I, J ) = 1.0D0
+ END DO
+ END DO
+
+ LBND_IN( 1 ) = 0
+ LBND_IN( 2 ) = 1
+ UBND_IN( 1 ) = NX - 1
+ UBND_IN( 2 ) = NY
+
+ LBND_OUT( 1 ) = 0
+ LBND_OUT( 2 ) = 1
+ UBND_OUT( 1 ) = NX - 1
+ UBND_OUT( 2 ) = NY
+
+ LBND_IN( 3 ) = 1
+ UBND_IN( 3 ) = 1
+ LBND_OUT( 3 ) = 1
+ UBND_OUT( 3 ) = 1
+
+ FLAGS = AST__REBININIT + AST__NONORM
+
+ MAP = AST_UNITMAP( NDIM, ' ', STATUS )
+
+ DO I = 1, 3
+ CALL AST_REBINSEQI( MAP, 0.0D0, ndim, LBND_IN, UBND_IN, IN, IN,
+ : spread, PARAMS, FLAGS, 0.01D0, 50, VAL__BADI,
+ : ndim, LBND_OUT, UBND_OUT, LBND_IN, UBND_IN,
+ : OUT, OUT, WEIGHTS, NUSED, STATUS )
+ FLAGS = AST__NONORM
+ END DO
+
+ IF( NDIM .EQ. 1 ) THEN
+ JHI = 1
+ ELSE
+ JHI = ny
+ ENDIF
+
+ DO I = 1, NX
+ DO J = 1, JHI
+ IF( OUT( I, J ) .NE. 3 ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', I )
+ CALL MSG_SETI( 'J', J )
+ CALL MSG_SETI( 'V', OUT(I,J) )
+ CALL ERR_REP( ' ', 'Output pixel (^I,^J) should be '//
+ : '3 but is ^V', status )
+ END IF
+ END DO
+ END DO
+
+ CALL AST_END( STATUS )
+ IF( STATUS .NE. SAI__OK ) THEN
+ CALL ERR_REP( ' ', 'test3 failed', STATUS )
+ END IF
+
+ END
+
+
+
+
+
+
+ SUBROUTINE TEST4( NDIM, SPREAD, PARAMS, STATUS )
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'PRM_PAR'
+
+ INTEGER SPREAD, STATUS, NDIM
+
+ INTEGER NX, NY
+ PARAMETER( NX = 100 )
+ PARAMETER( NY = 200 )
+
+ REAL IN( NX, NY )
+ REAL OUT( NX, NY )
+ DOUBLE PRECISION PARAMS(2), WEIGHTS( NX, NY ), INA(3),
+ : INB(3), OUTA(3), OUTB(3), SUM, ANSWER
+ INTEGER MAP, LBND_IN(3), UBND_IN(3), LBND_OUT(3), UBND_OUT(3),
+ : FLAGS, I, J, LBOXG(3), UBOXG(3), JHI
+ INTEGER*8 NUSED
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+ CALL AST_BEGIN( STATUS )
+
+ DO I = 1, NX
+ DO J = 1, NY
+ IN( I, J ) = 1.0
+ END DO
+ END DO
+
+ LBND_IN( 1 ) = 0
+ LBND_IN( 2 ) = 1
+ UBND_IN( 1 ) = NX - 1
+ UBND_IN( 2 ) = NY
+
+ LBND_OUT( 1 ) = 0
+ LBND_OUT( 2 ) = 1
+ UBND_OUT( 1 ) = NX - 1
+ UBND_OUT( 2 ) = NY
+
+ LBND_IN( 3 ) = 1
+ UBND_IN( 3 ) = 1
+ LBND_OUT( 3 ) = 1
+ UBND_OUT( 3 ) = 1
+
+ FLAGS = AST__REBININIT + AST__REBINEND + AST__CONSERVEFLUX
+
+ INA( 1 ) = LBND_IN( 1 )
+ INA( 2 ) = LBND_IN( 2 )
+ INA( 3 ) = LBND_IN( 3 )
+ INB( 1 ) = UBND_IN( 1 )
+ INB( 2 ) = UBND_IN( 2 )
+ INB( 3 ) = UBND_IN( 3 ) + 1.0D0
+
+ OUTA( 1 ) = 0.75*LBND_OUT( 1 ) + 0.25*UBND_OUT( 1 )
+ OUTA( 2 ) = 0.75*LBND_OUT( 2 ) + 0.25*UBND_OUT( 2 )
+ OUTA( 3 ) = INA( 3 )
+ OUTB( 1 ) = 0.25*LBND_OUT( 1 ) + 0.75*UBND_OUT( 1 )
+ OUTB( 2 ) = 0.25*LBND_OUT( 2 ) + 0.75*UBND_OUT( 2 )
+ OUTB( 3 ) = INB( 3 )
+
+ MAP = AST_WINMAP( NDIM, INA, INB, OUTA, OUTB, ' ', STATUS )
+ CALL AST_REBINSEQR( MAP, 0.0D0, ndim, LBND_IN, UBND_IN, IN, IN,
+ : spread, PARAMS, FLAGS, 0.01D0, 1000,
+ : VAL__BADR,
+ : ndim, LBND_OUT, UBND_OUT, LBND_IN, UBND_IN,
+ : OUT, OUT, WEIGHTS, NUSED, STATUS )
+
+ LBOXG( 1 ) = VAL__MAXI
+ LBOXG( 2 ) = VAL__MAXI
+ UBOXG( 1 ) = VAL__MINI
+ UBOXG( 2 ) = VAL__MINI
+
+ SUM = 0.0D0
+
+ IF( NDIM .EQ. 1 ) THEN
+ JHI = 1
+ ELSE
+ JHI = ny
+ ENDIF
+
+ DO I = 1, NX
+ DO J = 1, JHI
+
+ IF( OUT(I,J) .NE. VAL__BADR ) THEN
+ SUM = SUM + OUT(I,J)
+ IF( I .LT. LBOXG(1) ) THEN
+ LBOXG(1) = I
+ ELSE IF( I .GT. UBOXG(1) ) THEN
+ UBOXG(1) = I
+ ENDIF
+ IF( J .LT. LBOXG(2) ) THEN
+ LBOXG(2) = J
+ ELSE IF( J .GT. UBOXG(2) ) THEN
+ UBOXG(2) = J
+ ENDIF
+ ENDIF
+ END DO
+ END DO
+
+ IF( NDIM .EQ. 1 ) THEN
+
+ IF( ( ( SPREAD .EQ. AST__GAUSS ) .AND. (
+ : LBOXG( 1 ) .NE. 24 .OR.
+ : UBOXG( 1 ) .NE. 77 )) .OR. (
+ : ( SPREAD .EQ. AST__NEAREST ) .AND. (
+ : LBOXG( 1 ) .NE. 26 .OR.
+ : UBOXG( 1 ) .NE. 75 )) .OR. (
+ : ( SPREAD .EQ. AST__LINEAR ) .AND. (
+ : LBOXG( 1 ) .NE. 25 .OR.
+ : UBOXG( 1 ) .NE. 76 ) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL ERR_REP( ' ', 'Good pixel bounding box is wrong',
+ : STATUS )
+ write(*,*) LBOXG, UBOXG
+ END IF
+
+ IF( SPREAD .EQ. AST__NEAREST ) THEN
+ ANSWER = 100.0
+ ELSE IF( SPREAD .EQ. AST__GAUSS ) THEN
+ ANSWER = 108.0
+ ELSE IF( SPREAD .EQ. AST__LINEAR ) THEN
+ ANSWER = 104.0
+ ELSE
+ ANSWER = -1
+ END IF
+
+ else
+
+ IF( ( ( SPREAD .EQ. AST__GAUSS ) .AND. (
+ : LBOXG( 1 ) .NE. 24 .OR.
+ : LBOXG( 2 ) .NE. 49 .OR.
+ : UBOXG( 1 ) .NE. 77 .OR.
+ : UBOXG( 2 ) .NE. 152 ) ) .OR. (
+ : ( SPREAD .EQ. AST__NEAREST ) .AND. (
+ : LBOXG( 1 ) .NE. 26 .OR.
+ : LBOXG( 2 ) .NE. 51 .OR.
+ : UBOXG( 1 ) .NE. 75 .OR.
+ : UBOXG( 2 ) .NE. 150 ) ) .OR. (
+ : ( SPREAD .EQ. AST__LINEAR ) .AND. (
+ : LBOXG( 1 ) .NE. 25 .OR.
+ : LBOXG( 2 ) .NE. 50 .OR.
+ : UBOXG( 1 ) .NE. 76 .OR.
+ : UBOXG( 2 ) .NE. 151 ) ) ) THEN
+ STATUS = SAI__ERROR
+ CALL ERR_REP( ' ', 'Good pixel bounding box is wrong',
+ : STATUS )
+ write(*,*) LBOXG, UBOXG
+ END IF
+
+ IF( SPREAD .EQ. AST__NEAREST ) THEN
+ ANSWER = 20000.0
+ ELSE IF( SPREAD .EQ. AST__GAUSS ) THEN
+ ANSWER = 22464.0
+ ELSE IF( SPREAD .EQ. AST__LINEAR ) THEN
+ ANSWER = 21216.0
+ ELSE
+ ANSWER = -1
+ END IF
+ endif
+
+ IF( ABS( SUM - ANSWER ) .GT. 0.01 ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'V', SUM )
+ CALL MSG_SETD( 'W', ANSWER )
+ CALL ERR_REP( ' ', 'Total output data sum is ^V (should '//
+ : 'be ^W).', STATUS )
+ END IF
+
+ CALL AST_END( STATUS )
+ IF( STATUS .NE. SAI__OK ) THEN
+ CALL ERR_REP( ' ', 'test4 failed', STATUS )
+ END IF
+
+ END
+
+
+
+ SUBROUTINE TEST5( NDIM, SPREAD, PARAMS, STATUS )
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'PRM_PAR'
+
+ INTEGER SPREAD, STATUS, NDIM
+
+ INTEGER NX_IN, NY_IN
+ PARAMETER( NX_IN = 100 )
+ PARAMETER( NY_IN = 200 )
+
+ INTEGER BORDER_OUT
+ PARAMETER( BORDER_OUT = 10 )
+
+ INTEGER NX_OUT, NY_OUT
+ PARAMETER( NX_OUT = NX_IN + 2*BORDER_OUT )
+ PARAMETER( NY_OUT = NY_IN + 2*BORDER_OUT )
+
+ DOUBLE PRECISION IN( NX_IN, NY_IN )
+ DOUBLE PRECISION OUT( NX_OUT, NY_OUT )
+ DOUBLE PRECISION PARAMS(2), WEIGHTS( NX_OUT, NY_OUT ), INA(3),
+ : INB(3), OUTA(3), OUTB(3), SUM, VA, VB
+ INTEGER MAP, LBND_IN(3), UBND_IN(3), LBND_OUT(3), UBND_OUT(3),
+ : K, FLAGS, I, J, LBOXG(3), UBOXG(3), JHI
+ INTEGER*8 NUSED
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+ CALL AST_BEGIN( STATUS )
+
+ LBND_IN( 1 ) = 0
+ LBND_IN( 2 ) = 1
+ UBND_IN( 1 ) = NX_IN - 1
+ UBND_IN( 2 ) = NY_IN
+
+ LBND_OUT( 1 ) = LBND_IN( 1 ) - BORDER_OUT
+ LBND_OUT( 2 ) = LBND_IN( 2 ) - BORDER_OUT
+ UBND_OUT( 1 ) = UBND_IN( 1 ) + BORDER_OUT
+ UBND_OUT( 2 ) = UBND_IN( 2 ) + BORDER_OUT
+
+ LBND_IN( 3 ) = 1
+ UBND_IN( 3 ) = 1
+ LBND_OUT( 3 ) = 1
+ UBND_OUT( 3 ) = 1
+
+ FLAGS = AST__REBININIT + AST__NONORM
+
+ INA( 1 ) = LBND_IN( 1 )
+ INA( 2 ) = LBND_IN( 2 )
+ INA( 3 ) = LBND_IN( 3 )
+ INB( 1 ) = UBND_IN( 1 )
+ INB( 2 ) = UBND_IN( 2 )
+ INB( 3 ) = UBND_IN( 3 ) + 1.0D0
+
+ DO K = 1, 3
+
+ DO I = 1, NX_IN
+ DO J = 1, NY_IN
+ IN( I, J ) = K
+ END DO
+ END DO
+
+ VA = (k-1)*0.25
+ VB = VA + 0.5
+
+ OUTA( 1 ) = VB*LBND_IN( 1 ) + VA*UBND_IN( 1 )
+ OUTA( 2 ) = VB*LBND_IN( 2 ) + VA*UBND_IN( 2 )
+ OUTB( 1 ) = VA*LBND_IN( 1 ) + VB*UBND_IN( 1 )
+ OUTB( 2 ) = VA*LBND_IN( 2 ) + VB*UBND_IN( 2 )
+ OUTA( 3 ) = INA( 3 )
+ OUTB( 3 ) = INB( 3 )
+
+ MAP = AST_WINMAP( NDIM, INA, INB, OUTA, OUTB, ' ', STATUS )
+ CALL AST_REBINSEQD( MAP, 0.0D0, ndim, LBND_IN, UBND_IN, IN, IN,
+ : spread, PARAMS, FLAGS, 0.01D0, 50, VAL__BADD,
+ : ndim, LBND_OUT, UBND_OUT, LBND_IN, UBND_IN,
+ : OUT, OUT, WEIGHTS, NUSED, STATUS )
+
+ FLAGS = AST__NONORM
+ END DO
+
+ IF( NDIM .EQ. 1 ) THEN
+ JHI = 1
+ ELSE
+ JHI = ny_out
+ ENDIF
+
+ SUM = 0.0D0
+
+ DO I = 1, NX_OUT
+ DO J = 1, JHI
+ IF( OUT(I,J) .NE. VAL__BADR ) THEN
+ SUM = SUM + OUT(I,J)
+ ENDIF
+ END DO
+ END DO
+
+ IF( NDIM .EQ. 1 ) THEN
+ IF( ABS( SUM - 600 ) .GT. 1.0E-3 ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'V', SUM )
+ CALL ERR_REP( ' ', 'Total output data sum is ^V (should '//
+ : 'be 600).', STATUS )
+
+ END IF
+
+ IF( ABS( OUT(20,1) - 2.0 ) .GT. 1.0E-6 ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'V', OUT(20,1) )
+ CALL ERR_REP( ' ', 'Output pixel (20) should be 2, '//
+ : 'is ^V', STATUS )
+
+ ELSE IF( ABS( OUT(50,1) - 6.0 ) .GT. 1.0E-6 ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'V', OUT(50,1) )
+ CALL ERR_REP( ' ', 'Output pixel (50) should be 6, '//
+ : 'is ^V', STATUS )
+
+ ELSE IF( ABS( OUT(70,1) - 10.0 ) .GT. 1.0E-6 ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'V', OUT(70,1) )
+ CALL ERR_REP( ' ', 'Output pixel (70) should be 10, '//
+ : 'is ^V', STATUS )
+
+ ELSE IF( ABS( OUT(100,1) - 6.0 ) .GT. 1.0E-6 ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'V', OUT(100,1) )
+ CALL ERR_REP( ' ', 'Output pixel (100) should be 6, '//
+ : 'is ^V', STATUS )
+ END IF
+
+ ELSE IF( NDIM .EQ. 2 ) THEN
+ IF( ABS( SUM - 120000 ) .GT. 1.0E-3 ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'V', SUM )
+ CALL ERR_REP( ' ', 'Total output data sum is ^V (should '//
+ : 'be 120000).', STATUS )
+
+ END IF
+
+ IF( ABS( OUT(40,40) - 4.0 ) .GT. 1.0E-6 ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'V', OUT(40,40) )
+ CALL ERR_REP( ' ', 'Output pixel (40,40) should be 4, '//
+ : 'is ^V', STATUS )
+
+ ELSE IF( ABS( OUT(50,90) - 12.0 ) .GT. 1.0E-6 ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'V', OUT(50,90) )
+ CALL ERR_REP( ' ', 'Output pixel (50,90) should be 12, '//
+ : 'is ^V', STATUS )
+
+ ELSE IF( ABS( OUT(70,80) - 8.0 ) .GT. 1.0E-6 ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'V', OUT(70,80) )
+ CALL ERR_REP( ' ', 'Output pixel (70,80) should be 8, '//
+ : 'is ^V', STATUS )
+
+ ELSE IF( ABS( OUT(70,130) - 20.0 ) .GT. 1.0E-6 ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'V', OUT(70,130) )
+ CALL ERR_REP( ' ', 'Output pixel (70,130) should be 20, '//
+ : 'is ^V', STATUS )
+
+ ELSE IF( ABS( OUT(20,130) - 0.0 ) .GT. 1.0E-6 ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'V', OUT(20,130) )
+ CALL ERR_REP( ' ', 'Output pixel (20,130) should be 0, '//
+ : 'is ^V', STATUS )
+
+ END IF
+ END IF
+
+ CALL AST_END( STATUS )
+ IF( STATUS .NE. SAI__OK ) THEN
+ CALL ERR_REP( ' ', 'test5 failed', STATUS )
+ END IF
+
+ END
+
+
+
+
+ SUBROUTINE TEST6( NDIM, SPREAD, PARAMS, STATUS )
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'PRM_PAR'
+
+ INTEGER SPREAD, STATUS, NDIM
+
+ INTEGER NK
+ PARAMETER( NK = 3 )
+
+ INTEGER NX_IN, NY_IN
+ PARAMETER( NX_IN = 100 )
+ PARAMETER( NY_IN = 200 )
+
+ INTEGER BORDER_OUT
+ PARAMETER( BORDER_OUT = 10 )
+
+ INTEGER NX_OUT, NY_OUT
+ PARAMETER( NX_OUT = NX_IN + 2*BORDER_OUT )
+ PARAMETER( NY_OUT = NY_IN + 2*BORDER_OUT )
+
+ DOUBLE PRECISION IN( NX_IN, NY_IN ), ANSWER
+ DOUBLE PRECISION OUT( NX_OUT, NY_OUT ), MNVAL, MXVAL
+ DOUBLE PRECISION PARAMS(2), WEIGHTS( NX_OUT, NY_OUT ), INA(3),
+ : INB(3), OUTA(3), OUTB(3), SUM, VA, VB
+ INTEGER MAP, LBND_IN(3), UBND_IN(3), LBND_OUT(3), UBND_OUT(3),
+ : K, FLAGS, I, J, LBOXG(3), UBOXG(3), JHI
+ INTEGER*8 NUSED
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+ CALL AST_BEGIN( STATUS )
+
+ LBND_IN( 1 ) = 0
+ LBND_IN( 2 ) = 1
+ UBND_IN( 1 ) = NX_IN - 1
+ UBND_IN( 2 ) = NY_IN
+
+ LBND_OUT( 1 ) = LBND_IN( 1 ) - BORDER_OUT
+ LBND_OUT( 2 ) = LBND_IN( 2 ) - BORDER_OUT
+ UBND_OUT( 1 ) = UBND_IN( 1 ) + BORDER_OUT
+ UBND_OUT( 2 ) = UBND_IN( 2 ) + BORDER_OUT
+
+ LBND_IN( 3 ) = 1
+ UBND_IN( 3 ) = 1
+ LBND_OUT( 3 ) = 1
+ UBND_OUT( 3 ) = 1
+
+ INA( 1 ) = LBND_IN( 1 )
+ INA( 2 ) = LBND_IN( 2 )
+ INA( 3 ) = LBND_IN( 3 )
+ INB( 1 ) = UBND_IN( 1 )
+ INB( 2 ) = UBND_IN( 2 )
+ INB( 3 ) = UBND_IN( 3 ) + 1.0D0
+
+ DO K = 1, NK
+
+ FLAGS = AST__CONSERVEFLUX
+ IF( K .EQ. 1 ) FLAGS = FLAGS + AST__REBININIT
+ IF( K .EQ. NK ) FLAGS = FLAGS + AST__REBINEND
+
+ DO I = 1, NX_IN
+ DO J = 1, NY_IN
+ IN( I, J ) = K
+ END DO
+ END DO
+
+ VA = (k-1)*0.25
+ VB = VA + 0.5
+
+ OUTA( 1 ) = VB*LBND_IN( 1 ) + VA*UBND_IN( 1 )
+ OUTA( 2 ) = VB*LBND_IN( 2 ) + VA*UBND_IN( 2 )
+ OUTB( 1 ) = VA*LBND_IN( 1 ) + VB*UBND_IN( 1 )
+ OUTB( 2 ) = VA*LBND_IN( 2 ) + VB*UBND_IN( 2 )
+ OUTA( 3 ) = INA( 3 )
+ OUTB( 3 ) = INB( 3 )
+
+ MAP = AST_WINMAP( NDIM, INA, INB, OUTA, OUTB, ' ', STATUS )
+ CALL AST_REBINSEQD( MAP, 0.0D0, ndim, LBND_IN, UBND_IN, IN, IN,
+ : spread, PARAMS, FLAGS, 0.01D0, 50, VAL__BADD,
+ : ndim, LBND_OUT, UBND_OUT, LBND_IN, UBND_IN,
+ : OUT, OUT, WEIGHTS, NUSED, STATUS )
+
+ END DO
+
+ IF( NDIM .EQ. 1 ) THEN
+ JHI = 1
+ ELSE
+ JHI = ny_out
+ ENDIF
+
+ SUM = 0.0D0
+ MXVAL = VAL__MIND
+ MNVAL = VAL__MAXD
+ DO I = 1, NX_OUT
+ DO J = 1, JHI
+ IF( OUT(I,J) .NE. VAL__BADD ) THEN
+ SUM = SUM + OUT(I,J)
+ IF( OUT(I,J) .GT. MXVAL ) MXVAL = OUT(I,J)
+ IF( OUT(I,J) .lT. MnVAL ) MNVAL = OUT(I,J)
+ ENDIF
+ END DO
+ END DO
+
+ IF( NDIM .eq. 1 ) THEN
+ IF( SPREAD .EQ. AST__GAUSS ) THEN
+ ANSWER = 414.0D0
+ ELSE IF( SPREAD .EQ. AST__NEAREST ) THEN
+ ANSWER = 399.4D0
+ ELSE IF( SPREAD .EQ. AST__LINEAR ) THEN
+ ANSWER = 400.0D0
+ ELSE
+ ANSWER = -1.0
+ END IF
+
+ IF( ABS( SUM - ANSWER ) .GT. 1.0D-3 ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'V', SUM )
+ CALL MSG_SETD( 'W', ANSWER )
+ CALL ERR_REP( ' ', 'Total output data sum is ^V (should '//
+ : 'be ^W).', STATUS )
+
+ ELSE IF( ABS( MXVAL - 6 ) .GT. 1.0E-6 ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'V', MXVAL )
+ CALL ERR_REP( ' ', 'Max value is ^V (should be 6).',
+ : STATUS )
+
+ ELSE IF( ABS( MNVAL - 2 ) .GT. 1.0E-6 ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'V', MNVAL )
+ CALL ERR_REP( ' ', 'Min value is ^V (should be 2).',
+ : STATUS )
+
+ END IF
+
+ ELSE IF( NDIM .eq. 2 ) THEN
+ IF( SPREAD .EQ. AST__GAUSS ) THEN
+ ANSWER = 109011.729592723D0
+ ELSE IF( SPREAD .EQ. AST__NEAREST ) THEN
+ ANSWER = 100716.666666667D0
+ ELSE IF( SPREAD .EQ. AST__LINEAR ) THEN
+ ANSWER = 102816.0D0
+ ELSE
+ ANSWER = -1.0
+ END IF
+
+ IF( ABS( SUM - ANSWER ) .GT. 1.0D-3 ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'V', SUM )
+ CALL MSG_SETD( 'W', ANSWER )
+ CALL ERR_REP( ' ', 'Total output data sum is ^V (should '//
+ : 'be ^W).', STATUS )
+
+ ELSE IF( ABS( MXVAL - 12 ) .GT. 1.0E-6 ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'V', MXVAL )
+ CALL ERR_REP( ' ', 'Max value is ^V (should be 12).',
+ : STATUS )
+
+ ELSE IF( ABS( MNVAL - 4 ) .GT. 1.0E-6 ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'V', MNVAL )
+ CALL ERR_REP( ' ', 'Min value is ^V (should be 4).',
+ : STATUS )
+
+ END IF
+ END IF
+
+ CALL AST_END( STATUS )
+ IF( STATUS .NE. SAI__OK ) THEN
+ CALL ERR_REP( ' ', 'test6 failed', STATUS )
+ END IF
+
+ END
+
+
+ SUBROUTINE TEST7( NDIM, SPREAD, PARAMS, STATUS )
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'PRM_PAR'
+
+ INTEGER SPREAD, STATUS, NDIM
+
+ INTEGER NX, NY
+ PARAMETER( NX = 100 )
+ PARAMETER( NY = 200 )
+
+
+ REAL IN( NX, NY )
+ REAL OUT( NX, NY )
+ DOUBLE PRECISION PARAMS(2), WEIGHTS( NX, NY )
+ INTEGER MAP, LBND_IN(3), UBND_IN(3), LBND_OUT(3), UBND_OUT(3),
+ : JHI, FLAGS, I, J
+ INTEGER*8 NUSED
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+ CALL AST_BEGIN( STATUS )
+
+ DO I = 1, NX
+ DO J = 1, NY
+ IN( I, J ) = 1.0
+ END DO
+ END DO
+
+ LBND_IN( 1 ) = 0
+ LBND_IN( 2 ) = 1
+ UBND_IN( 1 ) = NX - 1
+ UBND_IN( 2 ) = NY
+
+ LBND_OUT( 1 ) = 0
+ LBND_OUT( 2 ) = 1
+ UBND_OUT( 1 ) = NX - 1
+ UBND_OUT( 2 ) = NY
+
+ LBND_IN( 3 ) = 1
+ UBND_IN( 3 ) = 1
+ LBND_OUT( 3 ) = 1
+ UBND_OUT( 3 ) = 1
+
+ FLAGS = AST__REBININIT + AST__REBINEND
+
+ MAP = AST_ZOOMMAP( NDIM, 0.5D0, ' ', STATUS )
+ CALL AST_REBINSEQR( MAP, 0.0D0, ndim, LBND_IN, UBND_IN, IN, IN,
+ : spread, PARAMS, FLAGS, 0.01D0, 50, VAL__BADR,
+ : ndim, LBND_OUT, UBND_OUT, LBND_IN, UBND_IN,
+ : OUT, OUT, WEIGHTS, NUSED, STATUS )
+
+ IF( NDIM .EQ. 1 ) THEN
+ JHI = 1
+ ELSE
+ JHI = ny
+ ENDIF
+
+ DO I = 1, NX
+ DO J = 1, JHI
+ IF( ABS( OUT( I, J ) - 1.0 ) .GT. 1.0E-6 .AND.
+ : OUT( I, J ) .NE. VAL__BADR ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETI( 'I', I )
+ CALL MSG_SETI( 'J', J )
+ CALL MSG_SETR( 'V', OUT(I,J) )
+ CALL ERR_REP( ' ', 'Output pixel (^I,^J) should be '//
+ : '1.0 but is ^V', status )
+ END IF
+ END DO
+ END DO
+
+ CALL AST_END( STATUS )
+ IF( STATUS .NE. SAI__OK ) THEN
+ CALL ERR_REP( ' ', 'test7 failed', STATUS )
+ END IF
+
+ END
+
+
+ SUBROUTINE TEST8( NDIM, SPREAD, PARAMS, STATUS )
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'PRM_PAR'
+
+ INTEGER SPREAD, STATUS, NDIM
+
+ INTEGER NX, NY
+ PARAMETER( NX = 100 )
+ PARAMETER( NY = 200 )
+
+
+ REAL IN( NX, NY )
+ REAL OUT( NX, NY )
+ DOUBLE PRECISION PARAMS(2), WEIGHTS( NX, NY ), SHIFTS(3), SUM
+ INTEGER MAP, LBND_IN(3), UBND_IN(3), LBND_OUT(3), UBND_OUT(3),
+ : FLAGS, I, J, JHI
+ INTEGER*8 NUSED
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+ CALL AST_BEGIN( STATUS )
+
+ DO I = 1, NX
+ DO J = 1, NY
+ IN( I, J ) = 1.0
+ END DO
+ END DO
+
+ LBND_IN( 1 ) = 0
+ LBND_IN( 2 ) = 1
+ UBND_IN( 1 ) = NX - 1
+ UBND_IN( 2 ) = NY
+
+ LBND_OUT( 1 ) = 0
+ LBND_OUT( 2 ) = 1
+ UBND_OUT( 1 ) = NX - 1
+ UBND_OUT( 2 ) = NY
+
+ LBND_IN( 3 ) = 1
+ UBND_IN( 3 ) = 1
+ LBND_OUT( 3 ) = 1
+ UBND_OUT( 3 ) = 1
+
+ FLAGS = AST__REBININIT + AST__REBINEND + AST__NONORM
+
+ SHIFTS(1) = 5.0D0
+ SHIFTS(2) = 5.0D0
+
+ if( ndim .lt. 3 ) then
+ MAP = AST_CMPMAP( AST_ZOOMMAP( NDIM, 0.5D0, ' ', STATUS ),
+ : AST_SHIFTMAP( NDIM, SHIFTS, ' ', STATUS ),
+ : .TRUE., ' ', STATUS )
+ else
+ MAP = AST_CMPMAP( AST_CMPMAP( AST_ZOOMMAP( 2, 0.5D0, ' ',
+ : STATUS ),
+ : AST_SHIFTMAP( 2, SHIFTS, ' ',
+ : STATUS ),
+ : .TRUE., ' ', STATUS ),
+ : AST_UNITMAP( 1, ' ', STATUS ), .FALSE.,
+ : ' ', STATUS )
+ endif
+
+ CALL AST_REBINSEQR( MAP, 0.0D0, ndim, LBND_IN, UBND_IN, IN, IN,
+ : spread, PARAMS, FLAGS, 0.01D0, 50, VAL__BADR,
+ : ndim, LBND_OUT, UBND_OUT, LBND_IN, UBND_IN,
+ : OUT, OUT, WEIGHTS, NUSED, STATUS )
+
+ IF( NDIM .EQ. 1 ) THEN
+ JHI = 1
+ ELSE
+ JHI = ny
+ ENDIF
+
+ SUM = 0.0D0
+ DO I = 1, NX
+ DO J = 1, JHI
+ if( out(i,j) .ne. VAL__BADR ) then
+ SUM = SUM + DBLE(OUT(I,J))
+ end if
+ END DO
+ END DO
+
+ IF( SUM .NE. SUM ) THEN
+ STATUS = SAI__ERROR
+ CALL ERR_REP( ' ', 'Total output data sum is NaN', STATUS )
+
+ ELSE IF( ABS( SUM - NX*JHI ) .GT. SUM*1.0D-7 ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'V', SUM )
+ CALL MSG_SETD( 'W', DBLE( NX*JHI) )
+ CALL ERR_REP( ' ', 'Total output data sum is ^V (should '//
+ : 'be ^W).', STATUS )
+ END IF
+
+ CALL AST_END( STATUS )
+ IF( STATUS .NE. SAI__OK ) THEN
+ CALL ERR_REP( ' ', 'test8 failed', STATUS )
+ END IF
+
+ END
+
+
+ SUBROUTINE TEST9( NDIM, SPREAD, PARAMS, STATUS )
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'PRM_PAR'
+
+ INTEGER SPREAD, STATUS, NDIM
+
+ INTEGER SIZE
+ PARAMETER( SIZE = 20000 )
+
+ INTEGER NX1, NY1
+ PARAMETER( NX1 = SIZE )
+ PARAMETER( NY1 = 1 )
+
+ INTEGER NX2, NY2
+ PARAMETER( NX2 = SIZE/200 )
+ PARAMETER( NY2 = 200 )
+
+ DOUBLE PRECISION SIGMA
+ PARAMETER ( SIGMA = 0.1 )
+
+ REAL*8 IN( size ), VIN( size )
+ REAL*8 OUT( size ), VOUT( size )
+ DOUBLE PRECISION PARAMS(2), WEIGHTS( size )
+ DOUBLE PRECISION REALVAR,MEANVAR,SUM,SUM2,SUM3
+ INTEGER MAP, LBND_IN(3), UBND_IN(3), LBND_OUT(3), UBND_OUT(3),
+ : FLAGS, I, J, NVAL, JHI, JLO, NX, NY, ILO, IHI, k
+ INTEGER*8 NUSED
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+ CALL AST_BEGIN( STATUS )
+
+ DO I = 1, size
+ IN( I ) = 1.0D0
+ VIN( I ) = SIGMA**2
+ END DO
+
+ CALL ADDNOISE( size, IN, SIGMA, STATUS )
+
+ IF( NDIM .EQ. 1 ) THEN
+ NX = NX1
+ Ny = NY1
+ ELSE
+ NX = NX2
+ Ny = NY2
+ END IF
+
+ LBND_IN( 1 ) = 0
+ LBND_IN( 2 ) = 1
+ UBND_IN( 1 ) = NX - 1
+ UBND_IN( 2 ) = NY
+
+ LBND_OUT( 1 ) = 0
+ LBND_OUT( 2 ) = 1
+ UBND_OUT( 1 ) = NX - 1
+ UBND_OUT( 2 ) = NY
+
+ LBND_IN( 3 ) = 1
+ UBND_IN( 3 ) = 1
+ LBND_OUT( 3 ) = 1
+ UBND_OUT( 3 ) = 1
+
+ FLAGS = AST__REBININIT + AST__REBINEND + AST__NONORM + AST__USEVAR
+
+ MAP = AST_ZOOMMAP( NDIM, 0.5D0, ' ', STATUS )
+ CALL AST_REBINSEQD( MAP, 0.0D0, ndim, LBND_IN, UBND_IN, IN, VIN,
+ : spread, PARAMS, FLAGS, 0.01D0, 50, VAL__BADD,
+ : ndim, LBND_OUT, UBND_OUT, LBND_IN, UBND_IN,
+ : OUT, VOUT, WEIGHTS, NUSED, STATUS )
+
+ IF( NDIM .EQ. 1 ) THEN
+ ILO = 6
+ IHI = NINT(0.45*NX1)
+ JLO = 1
+ JHI = 1
+ ELSE
+ ILO = 6
+ IHI = 41
+ JLO = 8
+ JHI = 91
+ ENDIF
+
+ SUM = 0.0D0
+ SUM2 = 0.0D0
+ SUM3 = 0.0D0
+ NVAL = 0
+
+ DO I = ILO, IHI
+ DO J = JLO, JHI
+ K = ( J - 1 )*NX + I
+ IF( OUT(K) .NE. VAL__BADD ) THEN
+ SUM = SUM + OUT(K)
+ SUM2 = SUM2 + OUT(K)**2
+ SUM3 = SUM3 + VOUT(K)
+ NVAL = NVAL + 1
+ END IF
+ END DO
+ END DO
+
+ SUM = SUM/NVAL
+ REALVAR = SUM2/NVAL - SUM*SUM
+ MEANVAR = SUM3/NVAL
+ IF( ABS( REALVAR - MEANVAR ) .GT.
+ : 0.05*( REALVAR + MEANVAR ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'V', REALVAR )
+ CALL MSG_SETD( 'W', MEANVAR )
+ CALL ERR_REP( ' ', 'Real variance is ^V - estimate is ^W.',
+ : STATUS )
+ END IF
+
+ CALL AST_END( STATUS )
+ IF( STATUS .NE. SAI__OK ) THEN
+ CALL ERR_REP( ' ', 'test9 failed', STATUS )
+ END IF
+
+ END
+
+
+ SUBROUTINE TEST10( NDIM, SPREAD, PARAMS, STATUS )
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'PRM_PAR'
+
+ INTEGER SPREAD, STATUS, NDIM
+
+ INTEGER SIZE
+ PARAMETER( SIZE = 20000 )
+
+ INTEGER NX1, NY1
+ PARAMETER( NX1 = SIZE )
+ PARAMETER( NY1 = 1 )
+
+ INTEGER NX2, NY2
+ PARAMETER( NX2 = SIZE/200 )
+ PARAMETER( NY2 = 200 )
+
+ DOUBLE PRECISION SIGMA
+ PARAMETER ( SIGMA = 0.1 )
+
+ REAL*8 IN( size ), VIN( size )
+ REAL*8 OUT( size ), VOUT( size )
+ DOUBLE PRECISION PARAMS(2), WEIGHTS( size )
+ DOUBLE PRECISION REALVAR,MEANVAR,SUM,SUM2,SUM3
+ INTEGER MAP, LBND_IN(3), UBND_IN(3), LBND_OUT(3), UBND_OUT(3),
+ : FLAGS, I, J, NVAL, JHI, JLO, ILO, IHI, NX, NY, K
+ INTEGER*8 NUSED
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+ CALL AST_BEGIN( STATUS )
+
+ DO I = 1, SIZE
+ IN( I ) = 1.0D0
+ VIN( I ) = SIGMA**2
+ END DO
+
+ CALL ADDNOISE( SIZE, IN, SIGMA, STATUS )
+
+ IF( NDIM .EQ. 1 ) THEN
+ NX = NX1
+ Ny = NY1
+ ELSE
+ NX = NX2
+ Ny = NY2
+ END IF
+
+ LBND_IN( 1 ) = 0
+ LBND_IN( 2 ) = 1
+ UBND_IN( 1 ) = NX - 1
+ UBND_IN( 2 ) = NY
+
+ LBND_OUT( 1 ) = 0
+ LBND_OUT( 2 ) = 1
+ UBND_OUT( 1 ) = NX - 1
+ UBND_OUT( 2 ) = NY
+
+ LBND_IN( 3 ) = 1
+ UBND_IN( 3 ) = 1
+ LBND_OUT( 3 ) = 1
+ UBND_OUT( 3 ) = 1
+
+ FLAGS = AST__REBININIT + AST__REBINEND + AST__CONSERVEFLUX
+ : + AST__USEVAR
+
+ MAP = AST_ZOOMMAP( NDIM, 0.5D0, ' ', STATUS )
+ CALL AST_REBINSEQD( MAP, 0.0D0, ndim, LBND_IN, UBND_IN, IN, VIN,
+ : spread, PARAMS, FLAGS, 0.01D0, 50, VAL__BADD,
+ : ndim, LBND_OUT, UBND_OUT, LBND_IN, UBND_IN,
+ : OUT, VOUT, WEIGHTS, NUSED, STATUS )
+
+ IF( NDIM .EQ. 1 ) THEN
+ ILO = 6
+ IHI = NINT(0.45*NX1)
+ JLO = 1
+ JHI = 1
+ ELSE
+ ILO = 6
+ IHI = 41
+ JLO = 8
+ JHI = 91
+ ENDIF
+
+ SUM = 0.0D0
+ SUM2 = 0.0D0
+ SUM3 = 0.0D0
+ NVAL = 0
+
+ DO I = ILO,IHI
+ DO J = JLO, JHI
+ K = ( J - 1 )*NX + I
+ IF( OUT(K) .NE. VAL__BADD ) THEN
+ SUM = SUM + OUT(K)
+ SUM2 = SUM2 + OUT(K)**2
+ SUM3 = SUM3 + VOUT(K)
+ NVAL = NVAL + 1
+ END IF
+ END DO
+ END DO
+
+ SUM = SUM/NVAL
+ REALVAR = SUM2/NVAL - SUM*SUM
+ MEANVAR = SUM3/NVAL
+
+ IF( ABS( REALVAR - MEANVAR ) .GT.
+ : 0.05*( REALVAR + MEANVAR ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'V', REALVAR )
+ CALL MSG_SETD( 'W', MEANVAR )
+ CALL ERR_REP( ' ', 'Real variance is ^V - estimate is ^W.',
+ : STATUS )
+ END IF
+
+ CALL AST_END( STATUS )
+ IF( STATUS .NE. SAI__OK ) THEN
+ CALL ERR_REP( ' ', 'test10 failed', STATUS )
+ END IF
+
+ END
+
+ SUBROUTINE TEST11( NDIM, SPREAD, PARAMS, STATUS )
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'PRM_PAR'
+
+ INTEGER SPREAD, STATUS, NDIM
+
+ INTEGER SIZE
+ PARAMETER( SIZE = 20000 )
+
+ INTEGER NX1, NY1
+ PARAMETER( NX1 = SIZE )
+ PARAMETER( NY1 = 1 )
+
+ INTEGER NX2, NY2
+ PARAMETER( NX2 = SIZE/200 )
+ PARAMETER( NY2 = 200 )
+
+ DOUBLE PRECISION SIGMA
+ PARAMETER ( SIGMA = 0.1 )
+
+ REAL*8 IN( SIZE ), VIN( SIZE )
+ REAL*8 OUT( SIZE ), VOUT( SIZE )
+ DOUBLE PRECISION PARAMS(2), WEIGHTS( SIZE, 2 )
+ DOUBLE PRECISION REALVAR,MEANVAR,SUM,SUM2,SUM3
+ INTEGER MAP, LBND_IN(3), UBND_IN(3), LBND_OUT(3), UBND_OUT(3),
+ : FLAGS, I, J, NVAL, JLO, JHI, NX, NY, ILO, IHI, K
+ INTEGER*8 NUSED
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+ CALL AST_BEGIN( STATUS )
+
+ DO I = 1, SIZE
+ IN( I ) = 1.0D0
+ VIN( I ) = SIGMA**2
+ END DO
+
+ CALL ADDNOISE( SIZE, IN, SIGMA, STATUS )
+
+ IF( NDIM .EQ. 1 ) THEN
+ NX = NX1
+ Ny = NY1
+ ELSE
+ NX = NX2
+ Ny = NY2
+ END IF
+
+ LBND_IN( 1 ) = 0
+ LBND_IN( 2 ) = 1
+ UBND_IN( 1 ) = NX - 1
+ UBND_IN( 2 ) = NY
+
+ LBND_OUT( 1 ) = 0
+ LBND_OUT( 2 ) = 1
+ UBND_OUT( 1 ) = NX - 1
+ UBND_OUT( 2 ) = NY
+
+ LBND_IN( 3 ) = 1
+ UBND_IN( 3 ) = 1
+ LBND_OUT( 3 ) = 1
+ UBND_OUT( 3 ) = 1
+
+ FLAGS = AST__REBININIT + AST__REBINEND + AST__GENVAR
+
+ MAP = AST_ZOOMMAP( NDIM, 0.5D0, ' ', STATUS )
+ CALL AST_REBINSEQD( MAP, 0.0D0, ndim, LBND_IN, UBND_IN, IN, VIN,
+ : spread, PARAMS, FLAGS, 0.01D0, 50, VAL__BADD,
+ : ndim, LBND_OUT, UBND_OUT, LBND_IN, UBND_IN,
+ : OUT, VOUT, WEIGHTS, NUSED, STATUS )
+
+ IF( NDIM .EQ. 1 ) THEN
+ ILO = 6
+ IHI = NINT(0.45*NX1)
+ JLO = 1
+ JHI = 1
+ ELSE
+ ILO = 6
+ IHI = 41
+ JLO = 8
+ JHI = 91
+ ENDIF
+
+ SUM = 0.0D0
+ SUM2 = 0.0D0
+ SUM3 = 0.0D0
+ NVAL = 0
+
+ DO I = ILO,IHI
+ DO J = JLO, JHI
+ K = ( J - 1 )*NX + I
+ IF( OUT(K) .NE. VAL__BADD ) THEN
+ SUM = SUM + OUT(K)
+ SUM2 = SUM2 + OUT(K)**2
+ SUM3 = SUM3 + VOUT(K)
+ NVAL = NVAL + 1
+ END IF
+ END DO
+ END DO
+
+ SUM = SUM/NVAL
+ REALVAR = SUM2/NVAL - SUM*SUM
+ MEANVAR = SUM3/NVAL
+ IF( ABS( REALVAR - MEANVAR ) .GT.
+ : 0.05*( REALVAR + MEANVAR ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'V', REALVAR )
+ CALL MSG_SETD( 'W', MEANVAR )
+ CALL ERR_REP( ' ', 'Real variance is ^V - estimate is ^W.',
+ : STATUS )
+ END IF
+
+ CALL AST_END( STATUS )
+ IF( STATUS .NE. SAI__OK ) THEN
+ CALL ERR_REP( ' ', 'test11 failed', STATUS )
+ END IF
+
+ END
+
+
+ SUBROUTINE TEST12( NDIM, SPREAD, PARAMS, STATUS )
+ IMPLICIT NONE
+ INCLUDE 'SAE_PAR'
+ INCLUDE 'AST_PAR'
+ INCLUDE 'PRM_PAR'
+
+ INTEGER SPREAD, STATUS, NDIM
+
+ INTEGER SIZE
+ PARAMETER( SIZE = 20000 )
+
+ INTEGER NX1, NY1
+ PARAMETER( NX1 = SIZE )
+ PARAMETER( NY1 = 1 )
+
+ INTEGER NX2, NY2
+ PARAMETER( NX2 = SIZE/200 )
+ PARAMETER( NY2 = 200 )
+
+ DOUBLE PRECISION SIGMA
+ PARAMETER ( SIGMA = 0.1 )
+
+ REAL*8 IN( SIZE ), VIN( SIZE )
+ REAL*8 OUT( SIZE ), VOUT( SIZE )
+ DOUBLE PRECISION PARAMS(2), WEIGHTS( SIZE, 2 )
+ DOUBLE PRECISION REALVAR,MEANVAR,SUM,SUM2,SUM3
+ INTEGER MAP, LBND_IN(3), UBND_IN(3), LBND_OUT(3), UBND_OUT(3),
+ : FLAGS, I, J, NVAL,jlo, jhi,NX, NY, ILO, IHI, K
+ INTEGER*8 NUSED
+
+ IF( STATUS .NE. SAI__OK ) RETURN
+ CALL AST_BEGIN( STATUS )
+
+ DO I = 1, SIZE
+ IN( I ) = 1.0D0
+ VIN( I ) = SIGMA**2
+ END DO
+
+ CALL ADDNOISE( SIZE, IN, SIGMA, STATUS )
+
+ IF( NDIM .EQ. 1 ) THEN
+ NX = NX1
+ Ny = NY1
+ ELSE
+ NX = NX2
+ Ny = NY2
+ END IF
+
+ LBND_IN( 1 ) = 0
+ LBND_IN( 2 ) = 1
+ UBND_IN( 1 ) = NX - 1
+ UBND_IN( 2 ) = NY
+
+ LBND_OUT( 1 ) = 0
+ LBND_OUT( 2 ) = 1
+ UBND_OUT( 1 ) = NX - 1
+ UBND_OUT( 2 ) = NY
+
+ LBND_IN( 3 ) = 1
+ UBND_IN( 3 ) = 1
+ LBND_OUT( 3 ) = 1
+ UBND_OUT( 3 ) = 1
+
+ FLAGS = AST__REBININIT + AST__REBINEND + AST__GENVAR +
+ : AST__CONSERVEFLUX + AST__VARWGT
+
+ MAP = AST_ZOOMMAP( NDIM, 0.5D0, ' ', STATUS )
+ CALL AST_REBINSEQD( MAP, 0.0D0, ndim, LBND_IN, UBND_IN, IN, VIN,
+ : spread, PARAMS, FLAGS, 0.01D0, 50, VAL__BADD,
+ : ndim, LBND_OUT, UBND_OUT, LBND_IN, UBND_IN,
+ : OUT, VOUT, WEIGHTS, NUSED, STATUS )
+
+ IF( NDIM .EQ. 1 ) THEN
+ ILO = 6
+ IHI = NINT(0.45*NX1)
+ JLO = 1
+ JHI = 1
+ ELSE
+ ILO = 6
+ IHI = 41
+ JLO = 8
+ JHI = 91
+ ENDIF
+
+ SUM = 0.0D0
+ SUM2 = 0.0D0
+ SUM3 = 0.0D0
+ NVAL = 0
+
+ DO I = ILO,IHI
+ DO J = JLO, JHI
+ K = ( J - 1 )*NX + I
+ IF( OUT(K) .NE. VAL__BADD ) THEN
+ SUM = SUM + OUT(K)
+ SUM2 = SUM2 + OUT(K)**2
+ SUM3 = SUM3 + VOUT(K)
+ NVAL = NVAL + 1
+ END IF
+ END DO
+ END DO
+
+ SUM = SUM/NVAL
+ REALVAR = SUM2/NVAL - SUM*SUM
+ MEANVAR = SUM3/NVAL
+ IF( ABS( REALVAR - MEANVAR ) .GT.
+ : 0.05*( REALVAR + MEANVAR ) ) THEN
+ STATUS = SAI__ERROR
+ CALL MSG_SETD( 'V', REALVAR )
+ CALL MSG_SETD( 'W', MEANVAR )
+ CALL ERR_REP( ' ', 'Real variance is ^V - estimate is ^W.',
+ : STATUS )
+ END IF
+
+ CALL AST_END( STATUS )
+ IF( STATUS .NE. SAI__OK ) THEN
+ CALL ERR_REP( ' ', 'test12 failed', STATUS )
+ END IF
+
+ END
+
+
diff --git a/ast/ast_tester/testregions.f b/ast/ast_tester/testregions.f
new file mode 100644
index 0000000..201ab17
--- /dev/null
+++ b/ast/ast_tester/testregions.f
@@ -0,0 +1,4032 @@
+ program testregions
+ implicit none
+ include 'SAE_PAR'
+ integer status
+
+ status = sai__ok
+
+c call ast_watchmemory( 282905 )
+
+ call ast_begin( status )
+ call checkConvex( status )
+ call checkRemoveRegions( status )
+ call checkInterval( status )
+ call checkEllipse( status )
+ call checkPrism( status )
+ call checkPolygon( status )
+ call checkCircle( status )
+ call checkBox( status )
+ call checkNullRegion( status )
+ call generalChecks( status )
+ call checkCmpRegion( status )
+ call checkPointList( status )
+
+ call ast_end( status )
+
+c call ast_activememory( 'testregions' )
+
+ if( status .eq. sai__ok ) then
+ write(*,*) 'All Region tests passed'
+ else
+ write(*,*) 'Region tests failed'
+ end if
+
+ end
+
+
+ subroutine generalChecks( status )
+ implicit none
+ include 'AST_PAR'
+ include 'PRM_PAR'
+ include 'SAE_PAR'
+
+ integer status, frm1, frm2, frm3, reg1, reg2, reg3, reg4, reg5
+ double precision lbnd(3), ubnd(3), p1(2), p2(2)
+
+ if( status .ne.sai__ok ) return
+
+ call ast_begin( status )
+
+
+
+ lbnd(1) = 0.0D0
+ lbnd(2) = AST__BAD
+ ubnd(1) = AST__BAD
+ ubnd(2) = 0.0D0
+ frm1 = ast_frame( 2, ' ', status )
+ reg1 = ast_interval( frm1, lbnd, ubnd, AST__NULL, ' ', status )
+
+ call ast_getregionbounds( reg1, lbnd, ubnd, status )
+ if( lbnd(1) .ne. 0.0D0 ) call stopit( status, 'General 1' )
+ if( lbnd(2) .gt. 0.99*val__mind ) call stopit( status,
+ : 'General 2' )
+ if( ubnd(1) .lt. 0.99*val__maxd ) call stopit( status,
+ : 'General 3' )
+ if( ubnd(2) .ne. 0.0D0 ) call stopit( status, 'General 4' )
+
+
+
+ p1(1) = 0.0D0
+ p1(2) = 0.0D0
+ p2(1) = 1.0D0
+ reg2 = ast_circle( frm1, 1, p1, p2, AST__NULL, ' ', status )
+
+ call ast_getregionbounds( reg2, lbnd, ubnd, status )
+ if( lbnd(1) .ne. -1.0D0 ) call stopit( status, 'General 5' )
+ if( lbnd(2) .ne. -1.0D0 ) call stopit( status, 'General 6' )
+ if( ubnd(1) .ne. 1.0D0 ) call stopit( status, 'General 7' )
+ if( ubnd(2) .ne. 1.0D0 ) call stopit( status, 'General 8' )
+
+
+
+ reg3 = ast_cmpregion( reg1, reg2, AST__OR, ' ', status )
+
+ call ast_getregionbounds( reg3, lbnd, ubnd, status )
+ if( lbnd(1) .ne. -1.0D0 ) call stopit( status, 'General 9' )
+ if( lbnd(2) .gt. 0.99*val__mind ) call stopit( status,
+ : 'General 10' )
+ if( ubnd(1) .lt. 0.99*val__maxd ) call stopit( status,
+ : 'General 11' )
+ if( ubnd(2) .ne. 1.0D0 ) call stopit( status, 'General 12' )
+
+
+
+ lbnd(1) = -1.0D0
+ ubnd(1) = 1.0D0
+ frm2 = ast_frame( 1, ' ', status )
+ reg4 = ast_interval( frm2, lbnd, ubnd, AST__NULL, ' ', status )
+
+ call ast_getregionbounds( reg4, lbnd, ubnd, status )
+ if( lbnd(1) .ne. -1.0D0 ) call stopit( status, 'General 13' )
+ if( ubnd(1) .ne. 1.0D0 ) call stopit( status, 'General 14' )
+
+
+
+ reg5 = ast_prism( reg3, reg4, ' ', status )
+
+ call ast_getregionbounds( reg5, lbnd, ubnd, status )
+ if( lbnd(1) .ne. -1.0D0 ) call stopit( status, 'General 15' )
+ if( lbnd(2) .gt. 0.99*val__mind ) call stopit( status,
+ : 'General 16' )
+ if( ubnd(1) .lt. 0.99*val__maxd ) call stopit( status,
+ : 'General 17' )
+ if( ubnd(2) .ne. 1.0D0 ) call stopit( status, 'General 18' )
+ if( lbnd(3) .ne. -1.0D0 ) call stopit( status, 'General 19' )
+ if( ubnd(3) .ne. 1.0D0 ) call stopit( status, 'General 20' )
+
+
+
+ call ast_negate( reg2, status )
+ reg3 = ast_cmpregion( reg1, reg2, AST__OR, ' ', status )
+
+ call ast_getregionbounds( reg3, lbnd, ubnd, status )
+ if( lbnd(1) .gt. 0.99*val__mind ) call stopit( status,
+ : 'General 21' )
+ if( lbnd(2) .gt. 0.99*val__mind ) call stopit( status,
+ : 'General 22' )
+ if( ubnd(1) .lt. 0.99*val__maxd ) call stopit( status,
+ : 'General 23' )
+ if( ubnd(2) .lt. 0.99*val__maxd ) call stopit( status,
+ : 'General 24' )
+
+
+ reg5 = ast_prism( reg3, reg4, ' ', status )
+
+ call ast_getregionbounds( reg5, lbnd, ubnd, status )
+ if( lbnd(1) .gt. 0.99*val__mind ) call stopit( status,
+ : 'General 25' )
+ if( lbnd(2) .gt. 0.99*val__mind ) call stopit( status,
+ : 'General 26' )
+ if( ubnd(1) .lt. 0.99*val__maxd ) call stopit( status,
+ : 'General 27' )
+ if( ubnd(2) .lt. 0.99*val__maxd ) call stopit( status,
+ : 'General 28' )
+ if( lbnd(3) .ne. -1.0D0 ) call stopit( status, 'General 29' )
+ if( ubnd(3) .ne. 1.0D0 ) call stopit( status, 'General 30' )
+
+
+ reg3 = ast_cmpregion( reg1, reg2, AST__AND, ' ', status )
+
+ call ast_getregionbounds( reg3, lbnd, ubnd, status )
+ if( lbnd(1) .ne. 0.0D0 ) call stopit( status, 'General 31' )
+ if( lbnd(2) .gt. 0.99*val__mind ) call stopit( status,
+ : 'General 32' )
+ if( ubnd(1) .lt. 0.99*val__maxd ) call stopit( status,
+ : 'General 33' )
+ if( ubnd(2) .ne. 0.0D0 ) call stopit( status, 'General 34' )
+
+
+
+ reg5 = ast_prism( reg3, reg4, ' ', status )
+
+ call ast_getregionbounds( reg5, lbnd, ubnd, status )
+ if( lbnd(1) .ne. 0.0D0 ) call stopit( status, 'General 35' )
+ if( lbnd(2) .gt. 0.99*val__mind ) call stopit( status,
+ : 'General 36' )
+ if( ubnd(1) .lt. 0.99*val__maxd ) call stopit( status,
+ : 'General 37' )
+ if( ubnd(2) .ne. 0.0D0 ) call stopit( status, 'General 38' )
+ if( lbnd(3) .ne. -1.0D0 ) call stopit( status, 'General 39' )
+ if( ubnd(3) .ne. 1.0D0 ) call stopit( status, 'General 40' )
+
+
+ call ast_end( status )
+ if( status .ne. sai__ok ) write(*,*) 'General tests failed'
+
+ end
+
+
+
+
+ subroutine checkInterval( status )
+ implicit none
+ include 'AST_PAR'
+ include 'SAE_PAR'
+
+ integer status, frm1, frm2, frm3, unc, int1, int2, int3, int4,
+ : int5, frm4, map, outperm(6), inperm(6), pm, reg
+ double precision lbnd(3), ubnd(3), p(5,3), q(5,3),in(4,3),out(4,3)
+ double precision xin(9), yin(9), xout(9), yout(9)
+
+ logical hasframeset
+
+ if( status .ne.sai__ok ) return
+
+ call ast_begin( status )
+
+ frm1 = ast_skyframe( ' ', status )
+ frm2 = ast_specframe( 'Unit=Angstrom', status )
+ frm3 = ast_cmpframe( frm1, frm2, ' ', status )
+
+ if( ast_getc( frm1, 'InternalUnit(1)', status ) .ne. 'rad' )
+ : call stopit( status, 'InternalUnit 1' )
+ if( ast_getc( frm1, 'InternalUnit(2)', status ) .ne. 'rad' )
+ : call stopit( status, 'InternalUnit 2' )
+ if( ast_getc( frm2, 'InternalUnit(1)', status ) .ne. 'Angstrom' )
+ : call stopit( status, 'InternalUnit 3' )
+ if( ast_getc( frm3, 'InternalUnit(1)', status ) .ne. 'rad' )
+ : call stopit( status, 'InternalUnit 4' )
+ if( ast_getc( frm3, 'InternalUnit(2)', status ) .ne. 'rad' )
+ : call stopit( status, 'InternalUnit 5' )
+ if( ast_getc( frm3, 'InternalUnit(3)', status ) .ne. 'Angstrom' )
+ : call stopit( status, 'InternalUnit 6' )
+
+ lbnd( 1 ) = AST__BAD
+ lbnd( 2 ) = AST__BAD
+ lbnd( 3 ) = 5000.0
+ ubnd( 1 ) = AST__BAD
+ ubnd( 2 ) = AST__BAD
+ ubnd( 3 ) = 6000.0
+
+ int1 = ast_interval( frm3, lbnd, ubnd, AST__NULL, ' ', status )
+ call checkdump( int1, 'checkdump int1', status )
+
+ p(1,1) = 0.0 ! On boundary
+ p(1,2) = 0.0
+ p(1,3) = 5000.0
+ p(2,1) = 2.0 ! On boundary
+ p(2,2) = -1.0
+ p(2,3) = 6000.0
+ p(3,1) = -2.0 ! Inside
+ p(3,2) = 1.0
+ p(3,3) = 5999.0
+ p(4,1) = 2.0 ! Outside
+ p(4,2) = -2.0
+ p(4,3) = 6010.0
+ p(5,1) = 1.0 ! Outside
+ p(5,2) = -1.0
+ p(5,3) = 4910.0
+
+ call ast_trann( int1, 5, 3, 5, p, .true., 3, 5, q, status )
+ if( q(1,1) .ne. p(1,1)) call stopit( status, 'Interval 1' )
+ if( q(1,2) .ne. p(1,2)) call stopit( status, 'Interval 1b' )
+ if( q(1,3) .ne. p(1,3)) call stopit( status, 'Interval 1c' )
+ if( q(2,1) .ne. p(2,1)) call stopit( status, 'Interval 2' )
+ if( q(2,2) .ne. p(2,2)) call stopit( status, 'Interval 2b' )
+ if( q(2,3) .ne. p(2,3)) call stopit( status, 'Interval 2c' )
+ if( q(3,1) .ne. p(3,1)) call stopit( status, 'Interval 3' )
+ if( q(3,2) .ne. p(3,2)) call stopit( status, 'Interval 3b' )
+ if( q(3,3) .ne. p(3,3)) call stopit( status, 'Interval 3c' )
+ if( q(4,1) .ne. AST__BAD ) call stopit( status, 'Interval 4' )
+ if( q(4,2) .ne. AST__BAD ) call stopit( status, 'Interval 4b' )
+ if( q(4,3) .ne. AST__BAD ) call stopit( status, 'Interval 4c' )
+ if( q(5,1) .ne. AST__BAD ) call stopit( status, 'Interval 5' )
+ if( q(5,2) .ne. AST__BAD ) call stopit( status, 'Interval 5b' )
+ if( q(5,3) .ne. AST__BAD ) call stopit( status, 'Interval 5c' )
+
+ call ast_negate( int1, status )
+ call ast_trann( int1, 5, 3, 5, p, .true., 3, 5, q, status )
+ if( q(1,1) .ne. p(1,1)) call stopit( status, 'Interval 6' )
+ if( q(1,2) .ne. p(1,2)) call stopit( status, 'Interval 6b' )
+ if( q(1,3) .ne. p(1,3)) call stopit( status, 'Interval 6c' )
+ if( q(2,1) .ne. p(2,1)) call stopit( status, 'Interval 7' )
+ if( q(2,2) .ne. p(2,2)) call stopit( status, 'Interval 7b' )
+ if( q(2,3) .ne. p(2,3)) call stopit( status, 'Interval 7c' )
+ if( q(3,1) .ne. AST__BAD) call stopit( status, 'Interval 8' )
+ if( q(3,2) .ne. AST__BAD) call stopit( status, 'Interval 8b' )
+ if( q(3,3) .ne. AST__BAD) call stopit( status, 'Interval 8c' )
+ if( q(4,1) .ne. p(4,1) ) call stopit( status, 'Interval 9' )
+ if( q(4,2) .ne. p(4,2) ) call stopit( status, 'Interval 9b' )
+ if( q(4,3) .ne. p(4,3) ) call stopit( status, 'Interval 9c' )
+ if( q(5,1) .ne. p(5,1) ) call stopit( status, 'Interval 10' )
+ if( q(5,2) .ne. p(5,2) ) call stopit( status, 'Interval 10b' )
+ if( q(5,3) .ne. p(5,3) ) call stopit( status, 'Interval 10c' )
+
+ call ast_set( int1, 'closed=0,negated=0', status )
+ call ast_trann( int1, 5, 3, 5, p, .true., 3, 5, q, status )
+ if( q(1,1) .ne. AST__BAD ) call stopit( status, 'Interval 11' )
+ if( q(1,2) .ne. AST__BAD ) call stopit( status, 'Interval 11b' )
+ if( q(1,3) .ne. AST__BAD ) call stopit( status, 'Interval 11c' )
+ if( q(2,1) .ne. AST__BAD ) call stopit( status, 'Interval 12' )
+ if( q(2,2) .ne. AST__BAD ) call stopit( status, 'Interval 12b' )
+ if( q(2,3) .ne. AST__BAD ) call stopit( status, 'Interval 12c' )
+ if( q(3,1) .ne. p(3,1)) call stopit( status, 'Interval 13' )
+ if( q(3,2) .ne. p(3,2)) call stopit( status, 'Interval 13b' )
+ if( q(3,3) .ne. p(3,3)) call stopit( status, 'Interval 13c' )
+ if( q(4,1) .ne. AST__BAD ) call stopit( status, 'Interval 14' )
+ if( q(4,2) .ne. AST__BAD ) call stopit( status, 'Interval 14b' )
+ if( q(4,3) .ne. AST__BAD ) call stopit( status, 'Interval 14c' )
+ if( q(5,1) .ne. AST__BAD ) call stopit( status, 'Interval 15' )
+ if( q(5,2) .ne. AST__BAD ) call stopit( status, 'Interval 15b' )
+ if( q(5,3) .ne. AST__BAD ) call stopit( status, 'Interval 15c' )
+
+ call ast_negate( int1, status )
+ call ast_trann( int1, 5, 3, 5, p, .true., 3, 5, q, status )
+ if( q(1,1) .ne. AST__BAD) call stopit( status, 'Interval 16' )
+ if( q(1,2) .ne. AST__BAD) call stopit( status, 'Interval 16b' )
+ if( q(1,3) .ne. AST__BAD) call stopit( status, 'Interval 16c' )
+ if( q(2,1) .ne. AST__BAD) call stopit( status, 'Interval 17' )
+ if( q(2,2) .ne. AST__BAD) call stopit( status, 'Interval 17b' )
+ if( q(2,3) .ne. AST__BAD) call stopit( status, 'Interval 17c' )
+ if( q(3,1) .ne. AST__BAD) call stopit( status, 'Interval 18' )
+ if( q(3,2) .ne. AST__BAD) call stopit( status, 'Interval 18b' )
+ if( q(3,3) .ne. AST__BAD) call stopit( status, 'Interval 18c' )
+ if( q(4,1) .ne. p(4,1) ) call stopit( status, 'Interval 19' )
+ if( q(4,2) .ne. p(4,2) ) call stopit( status, 'Interval 19b' )
+ if( q(4,3) .ne. p(4,3) ) call stopit( status, 'Interval 19c' )
+ if( q(5,1) .ne. p(5,1) ) call stopit( status, 'Interval 11' )
+ if( q(5,2) .ne. p(5,2) ) call stopit( status, 'Interval 11b' )
+ if( q(5,3) .ne. p(5,3) ) call stopit( status, 'Interval 11c' )
+
+
+ lbnd( 1 ) = AST__BAD
+ lbnd( 2 ) = AST__BAD
+ lbnd( 3 ) = 6000.0
+ ubnd( 1 ) = AST__BAD
+ ubnd( 2 ) = AST__BAD
+ ubnd( 3 ) = 5000.0
+
+ int2 = ast_interval( frm3, lbnd, ubnd, AST__NULL, ' ', status )
+ call checkdump( int2, 'checkdump int2', status )
+
+ p(1,1) = 0.0 ! On boundary
+ p(1,2) = 0.0
+ p(1,3) = 5000.0
+ p(2,1) = 2.0 ! On boundary
+ p(2,2) = -1.0
+ p(2,3) = 6000.0
+ p(3,1) = -2.0 ! Outside
+ p(3,2) = 1.0
+ p(3,3) = 5999.0
+ p(4,1) = 2.0 ! Inside
+ p(4,2) = -2.0
+ p(4,3) = 6010.0
+ p(5,1) = 1.0 ! Inside
+ p(5,2) = -1.0
+ p(5,3) = 4910.0
+
+ call ast_negate( int2, status )
+ call ast_trann( int2, 5, 3, 5, p, .true., 3, 5, q, status )
+ if( q(1,1) .ne. p(1,1)) call stopit( status, 'Interval B 1' )
+ if( q(1,2) .ne. p(1,2)) call stopit( status, 'Interval B 1b' )
+ if( q(1,3) .ne. p(1,3)) call stopit( status, 'Interval B 1c' )
+ if( q(2,1) .ne. p(2,1)) call stopit( status, 'Interval B 2' )
+ if( q(2,2) .ne. p(2,2)) call stopit( status, 'Interval B 2b' )
+ if( q(2,3) .ne. p(2,3)) call stopit( status, 'Interval B 2c' )
+ if( q(3,1) .ne. p(3,1)) call stopit( status, 'Interval B 3' )
+ if( q(3,2) .ne. p(3,2)) call stopit( status, 'Interval B 3b' )
+ if( q(3,3) .ne. p(3,3)) call stopit( status, 'Interval B 3c' )
+ if( q(4,1) .ne. AST__BAD ) call stopit( status, 'Interval B 4' )
+ if( q(4,2) .ne. AST__BAD ) call stopit( status, 'Interval B 4b' )
+ if( q(4,3) .ne. AST__BAD ) call stopit( status, 'Interval B 4c' )
+ if( q(5,1) .ne. AST__BAD ) call stopit( status, 'Interval B 5' )
+ if( q(5,2) .ne. AST__BAD ) call stopit( status, 'Interval B 5b' )
+ if( q(5,3) .ne. AST__BAD ) call stopit( status, 'Interval B 5c' )
+
+ call ast_negate( int2, status )
+ call ast_trann( int2, 5, 3, 5, p, .true., 3, 5, q, status )
+ if( q(1,1) .ne. p(1,1)) call stopit( status, 'Interval B 6' )
+ if( q(1,2) .ne. p(1,2)) call stopit( status, 'Interval B 6b' )
+ if( q(1,3) .ne. p(1,3)) call stopit( status, 'Interval B 6c' )
+ if( q(2,1) .ne. p(2,1)) call stopit( status, 'Interval B 7' )
+ if( q(2,2) .ne. p(2,2)) call stopit( status, 'Interval B 7b' )
+ if( q(2,3) .ne. p(2,3)) call stopit( status, 'Interval B 7c' )
+ if( q(3,1) .ne. AST__BAD) call stopit( status, 'Interval B 8' )
+ if( q(3,2) .ne. AST__BAD) call stopit( status, 'Interval B 8b' )
+ if( q(3,3) .ne. AST__BAD) call stopit( status, 'Interval B 8c' )
+ if( q(4,1) .ne. p(4,1) ) call stopit( status, 'Interval B 9' )
+ if( q(4,2) .ne. p(4,2) ) call stopit( status, 'Interval B 9b' )
+ if( q(4,3) .ne. p(4,3) ) call stopit( status, 'Interval B 9c' )
+ if( q(5,1) .ne. p(5,1) ) call stopit( status, 'Interval B 10' )
+ if( q(5,2) .ne. p(5,2) ) call stopit( status, 'Interval B 10b' )
+ if( q(5,3) .ne. p(5,3) ) call stopit( status, 'Interval B 10c' )
+
+ call ast_set( int2, 'closed=0,negated=1', status )
+ call ast_trann( int2, 5, 3, 5, p, .true., 3, 5, q, status )
+ if( q(1,1) .ne. AST__BAD ) call stopit( status, 'Interval B 11' )
+ if( q(1,2) .ne. AST__BAD ) call stopit( status, 'Interval B 11b' )
+ if( q(1,3) .ne. AST__BAD ) call stopit( status, 'Interval B 11c' )
+ if( q(2,1) .ne. AST__BAD ) call stopit( status, 'Interval B 12' )
+ if( q(2,2) .ne. AST__BAD ) call stopit( status, 'Interval B 12b' )
+ if( q(2,3) .ne. AST__BAD ) call stopit( status, 'Interval B 12c' )
+ if( q(3,1) .ne. p(3,1)) call stopit( status, 'Interval B 13' )
+ if( q(3,2) .ne. p(3,2)) call stopit( status, 'Interval B 13b' )
+ if( q(3,3) .ne. p(3,3)) call stopit( status, 'Interval B 13c' )
+ if( q(4,1) .ne. AST__BAD ) call stopit( status, 'Interval B 14' )
+ if( q(4,2) .ne. AST__BAD ) call stopit( status, 'Interval B 14b' )
+ if( q(4,3) .ne. AST__BAD ) call stopit( status, 'Interval B 14c' )
+ if( q(5,1) .ne. AST__BAD ) call stopit( status, 'Interval B 15' )
+ if( q(5,2) .ne. AST__BAD ) call stopit( status, 'Interval B 15b' )
+ if( q(5,3) .ne. AST__BAD ) call stopit( status, 'Interval B 15c' )
+
+ call ast_negate( int2, status )
+ call ast_trann( int2, 5, 3, 5, p, .true., 3, 5, q, status )
+ if( q(1,1) .ne. AST__BAD) call stopit( status, 'Interval B 16' )
+ if( q(1,2) .ne. AST__BAD) call stopit( status, 'Interval B 16b' )
+ if( q(1,3) .ne. AST__BAD) call stopit( status, 'Interval B 16c' )
+ if( q(2,1) .ne. AST__BAD) call stopit( status, 'Interval B 17' )
+ if( q(2,2) .ne. AST__BAD) call stopit( status, 'Interval B 17b' )
+ if( q(2,3) .ne. AST__BAD) call stopit( status, 'Interval B 17c' )
+ if( q(3,1) .ne. AST__BAD) call stopit( status, 'Interval B 18' )
+ if( q(3,2) .ne. AST__BAD) call stopit( status, 'Interval B 18b' )
+ if( q(3,3) .ne. AST__BAD) call stopit( status, 'Interval B 18c' )
+ if( q(4,1) .ne. p(4,1) ) call stopit( status, 'Interval B 19' )
+ if( q(4,2) .ne. p(4,2) ) call stopit( status, 'Interval B 19b' )
+ if( q(4,3) .ne. p(4,3) ) call stopit( status, 'Interval B 19c' )
+ if( q(5,1) .ne. p(5,1) ) call stopit( status, 'Interval B 11' )
+ if( q(5,2) .ne. p(5,2) ) call stopit( status, 'Interval B 11b' )
+ if( q(5,3) .ne. p(5,3) ) call stopit( status, 'Interval B 11c' )
+
+
+
+
+ lbnd( 1 ) = AST__BAD
+ lbnd( 2 ) = AST__BAD
+ lbnd( 3 ) = 5000.0
+ ubnd( 1 ) = 0.5
+ ubnd( 2 ) = AST__BAD
+ ubnd( 3 ) = AST__BAD
+
+ int3 = ast_interval( frm3, lbnd, ubnd, AST__NULL, ' ', status )
+
+ call checkdump( int3, 'checkdump int3', status )
+
+ p(1,1) = 0.0 ! On boundary
+ p(1,2) = 0.0
+ p(1,3) = 5000.0
+ p(2,1) = 0.5 ! On boundary
+ p(2,2) = -1.0
+ p(2,3) = 6000.0
+ p(3,1) = -2.0 ! Inside
+ p(3,2) = 0.4
+ p(3,3) = 5999.0
+ p(4,1) = 2.0 ! Outside
+ p(4,2) = -2.0
+ p(4,3) = 6010.0
+ p(5,1) = 0.0 ! Outside
+ p(5,2) = -3.0
+ p(5,3) = 4910.0
+
+ call ast_trann( int3, 5, 3, 5, p, .true., 3, 5, q, status )
+ if( q(1,1) .ne. p(1,1)) call stopit( status, 'Interval C 1' )
+ if( q(1,2) .ne. p(1,2)) call stopit( status, 'Interval C 1b' )
+ if( q(1,3) .ne. p(1,3)) call stopit( status, 'Interval C 1c' )
+ if( q(2,1) .ne. p(2,1)) call stopit( status, 'Interval C 2' )
+ if( q(2,2) .ne. p(2,2)) call stopit( status, 'Interval C 2b' )
+ if( q(2,3) .ne. p(2,3)) call stopit( status, 'Interval C 2c' )
+ if( q(3,1) .ne. p(3,1)) call stopit( status, 'Interval C 3' )
+ if( q(3,2) .ne. p(3,2)) call stopit( status, 'Interval C 3b' )
+ if( q(3,3) .ne. p(3,3)) call stopit( status, 'Interval C 3c' )
+ if( q(4,1) .ne. AST__BAD ) call stopit( status, 'Interval C 4' )
+ if( q(4,2) .ne. AST__BAD ) call stopit( status, 'Interval C 4b' )
+ if( q(4,3) .ne. AST__BAD ) call stopit( status, 'Interval C 4c' )
+ if( q(5,1) .ne. AST__BAD ) call stopit( status, 'Interval C 5' )
+ if( q(5,2) .ne. AST__BAD ) call stopit( status, 'Interval C 5b' )
+ if( q(5,3) .ne. AST__BAD ) call stopit( status, 'Interval C 5c' )
+
+ call ast_negate( int3, status )
+ call ast_trann( int3, 5, 3, 5, p, .true., 3, 5, q, status )
+ if( q(1,1) .ne. p(1,1)) call stopit( status, 'Interval C 6' )
+ if( q(1,2) .ne. p(1,2)) call stopit( status, 'Interval C 6b' )
+ if( q(1,3) .ne. p(1,3)) call stopit( status, 'Interval C 6c' )
+ if( q(2,1) .ne. p(2,1)) call stopit( status, 'Interval C 7' )
+ if( q(2,2) .ne. p(2,2)) call stopit( status, 'Interval C 7b' )
+ if( q(2,3) .ne. p(2,3)) call stopit( status, 'Interval C 7c' )
+ if( q(3,1) .ne. AST__BAD) call stopit( status, 'Interval C 8' )
+ if( q(3,2) .ne. AST__BAD) call stopit( status, 'Interval C 8b' )
+ if( q(3,3) .ne. AST__BAD) call stopit( status, 'Interval C 8c' )
+ if( q(4,1) .ne. p(4,1) ) call stopit( status, 'Interval C 9' )
+ if( q(4,2) .ne. p(4,2) ) call stopit( status, 'Interval C 9b' )
+ if( q(4,3) .ne. p(4,3) ) call stopit( status, 'Interval C 9c' )
+ if( q(5,1) .ne. p(5,1) ) call stopit( status, 'Interval C 10' )
+ if( q(5,2) .ne. p(5,2) ) call stopit( status, 'Interval C 10b' )
+ if( q(5,3) .ne. p(5,3) ) call stopit( status, 'Interval C 10c' )
+
+ call ast_set( int3, 'closed=0,negated=0', status )
+ call ast_trann( int3, 5, 3, 5, p, .true., 3, 5, q, status )
+ if( q(1,1) .ne. AST__BAD ) call stopit( status, 'Interval C 11' )
+ if( q(1,2) .ne. AST__BAD ) call stopit( status, 'Interval C 11b' )
+ if( q(1,3) .ne. AST__BAD ) call stopit( status, 'Interval C 11c' )
+ if( q(2,1) .ne. AST__BAD ) call stopit( status, 'Interval C 12' )
+ if( q(2,2) .ne. AST__BAD ) call stopit( status, 'Interval C 12b' )
+ if( q(2,3) .ne. AST__BAD ) call stopit( status, 'Interval C 12c' )
+ if( q(3,1) .ne. p(3,1)) call stopit( status, 'Interval C 13' )
+ if( q(3,2) .ne. p(3,2)) call stopit( status, 'Interval C 13b' )
+ if( q(3,3) .ne. p(3,3)) call stopit( status, 'Interval C 13c' )
+ if( q(4,1) .ne. AST__BAD ) call stopit( status, 'Interval C 14' )
+ if( q(4,2) .ne. AST__BAD ) call stopit( status, 'Interval C 14b' )
+ if( q(4,3) .ne. AST__BAD ) call stopit( status, 'Interval C 14c' )
+ if( q(5,1) .ne. AST__BAD ) call stopit( status, 'Interval C 15' )
+ if( q(5,2) .ne. AST__BAD ) call stopit( status, 'Interval C 15b' )
+ if( q(5,3) .ne. AST__BAD ) call stopit( status, 'Interval C 15c' )
+
+ call ast_negate( int3, status )
+ call ast_trann( int3, 5, 3, 5, p, .true., 3, 5, q, status )
+ if( q(1,1) .ne. AST__BAD) call stopit( status, 'Interval C 16' )
+ if( q(1,2) .ne. AST__BAD) call stopit( status, 'Interval C 16b' )
+ if( q(1,3) .ne. AST__BAD) call stopit( status, 'Interval C 16c' )
+ if( q(2,1) .ne. AST__BAD) call stopit( status, 'Interval C 17' )
+ if( q(2,2) .ne. AST__BAD) call stopit( status, 'Interval C 17b' )
+ if( q(2,3) .ne. AST__BAD) call stopit( status, 'Interval C 17c' )
+ if( q(3,1) .ne. AST__BAD) call stopit( status, 'Interval C 18' )
+ if( q(3,2) .ne. AST__BAD) call stopit( status, 'Interval C 18b' )
+ if( q(3,3) .ne. AST__BAD) call stopit( status, 'Interval C 18c' )
+ if( q(4,1) .ne. p(4,1) ) call stopit( status, 'Interval C 19' )
+ if( q(4,2) .ne. p(4,2) ) call stopit( status, 'Interval C 19b' )
+ if( q(4,3) .ne. p(4,3) ) call stopit( status, 'Interval C 19c' )
+ if( q(5,1) .ne. p(5,1) ) call stopit( status, 'Interval C 11' )
+ if( q(5,2) .ne. p(5,2) ) call stopit( status, 'Interval C 11b' )
+ if( q(5,3) .ne. p(5,3) ) call stopit( status, 'Interval C 11c' )
+
+
+
+ lbnd( 1 ) = AST__BAD
+ lbnd( 2 ) = 0.0
+ lbnd( 3 ) = AST__BAD
+ ubnd( 1 ) = AST__BAD
+ ubnd( 2 ) = -1.0
+ ubnd( 3 ) = 6000.0
+
+ call ast_setl( int3, 'Negated', .false., status )
+ int4 = ast_interval( frm3, lbnd, ubnd, AST__NULL, ' ', status )
+ if( ast_overlap( int3, int4, status ) .ne. 4 )
+ : call stopit( status, 'Interval overlap 1' )
+
+ call ast_negate( int3, status )
+ if( ast_overlap( int3, int4, status ) .ne. 4 )
+ : call stopit( status, 'Interval overlap 2' )
+
+ call ast_negate( int4, status )
+ if( ast_overlap( int3, int4, status ) .ne. 4 )
+ : call stopit( status, 'Interval overlap 3' )
+
+ call ast_negate( int3, status )
+ if( ast_overlap( int3, int4, status ) .ne. 4 )
+ : call stopit( status, 'Interval overlap 4' )
+
+
+ lbnd( 1 ) = 0.6
+ lbnd( 2 ) = 0.0
+ lbnd( 3 ) = AST__BAD
+ ubnd( 1 ) = AST__BAD
+ ubnd( 2 ) = -1.0
+ ubnd( 3 ) = 6000.0
+
+ int4 = ast_interval( frm3, lbnd, ubnd, AST__NULL, ' ', status )
+ if( ast_overlap( int3, int4, status ) .ne. 1 )
+ : call stopit( status, 'Interval overlap 5' )
+
+ call ast_negate( int3, status )
+ if( ast_overlap( int3, int4, status ) .ne. 3 )
+ : call stopit( status, 'Interval overlap 6' )
+
+ call ast_negate( int4, status )
+ if( ast_overlap( int3, int4, status ) .ne. 4 )
+ : call stopit( status, 'Interval overlap 7' )
+
+ call ast_negate( int3, status )
+ if( ast_overlap( int3, int4, status ) .ne. 2 )
+ : call stopit( status, 'Interval overlap 8' )
+
+
+ int4 = ast_copy( int3, status )
+ if( ast_overlap( int3, int4, status ) .ne. 5 )
+ : call stopit( status, 'Interval overlap 9' )
+
+ call ast_negate( int4, status )
+ if( ast_overlap( int3, int4, status ) .ne. 6 )
+ : call stopit( status, 'Interval overlap 10' )
+
+
+
+* Changing the number of axes in the Interval.
+
+ frm1 = ast_frame( 2, 'Domain=A', status )
+
+ lbnd(1) = 0.0
+ lbnd(2) = 0.0
+ ubnd(1) = 0.01
+ ubnd(2) = 0.01
+ unc = ast_box( frm1, 0, lbnd, ubnd, AST__NULL, ' ', status )
+
+ lbnd(1) = -2.0
+ lbnd(2) = 0.5
+ ubnd(1) = 0.0
+ ubnd(2) = AST__BAD
+ int1 = ast_interval( frm1, lbnd, ubnd, unc, ' ', status )
+
+ outperm(1) = 2
+ outperm(2) = -1
+ outperm(3) = 1
+
+ inperm(1) = 3
+ inperm(2) = 1
+
+ pm = ast_permmap( 2, inperm, 3, outperm, 0.0D0, ' ', status )
+
+ frm2 = ast_frame( 3, 'Domain=B', status )
+ reg = ast_mapregion( int1, pm, frm2, status )
+
+ if( .not. ast_isainterval( reg, status ) ) call stopit( status,
+ : 'Int: perm check 1' )
+ if( hasFrameSet( reg, status ) ) call stopit( status,
+ : 'Int: perm check 2' )
+ if( ast_geti( reg, 'naxes', status ) .ne. 3 ) call stopit( status,
+ : 'Int: perm check 3' )
+
+ in( 1, 1 ) = 0.0 ! Outside
+ in( 1, 2 ) = 0.0
+ in( 1, 3 ) = -0.5
+ in( 2, 1 ) = 20.0 ! Inside
+ in( 2, 2 ) = 0.0
+ in( 2, 3 ) = -0.5
+ in( 3, 1 ) = 20.0 ! Outside
+ in( 3, 2 ) = -10.0
+ in( 3, 3 ) = 0.5
+ in( 4, 1 ) = 20.0 ! Boundary
+ in( 4, 2 ) = 0.0
+ in( 4, 3 ) = -2.0
+
+ call ast_trann( reg, 4, 3, 4, in, .true., 3, 4, out, status )
+
+ if( out( 1, 1 ) .ne. AST__BAD ) call stopit( status, 'Int: pc 1' )
+ if( out( 1, 2 ) .ne. AST__BAD ) call stopit( status, 'Int: pc 2' )
+ if( out( 1, 3 ) .ne. AST__BAD ) call stopit( status, 'Int: pc 3' )
+
+ if( out( 2, 1 ) .ne. in( 2,1 )) call stopit( status, 'Int: pc 4' )
+ if( out( 2, 2 ) .ne. in( 2,2 )) call stopit( status, 'Int: pc 5' )
+ if( out( 2, 3 ) .ne. in( 2,3 )) call stopit( status, 'Int: pc 6' )
+
+ if( out( 3, 1 ) .ne. AST__BAD ) call stopit( status, 'Int: pc 7' )
+ if( out( 3, 2 ) .ne. AST__BAD ) call stopit( status, 'Int: pc 8' )
+ if( out( 3, 3 ) .ne. AST__BAD ) call stopit( status, 'Int: pc 9' )
+
+ if( out( 4, 1 ) .ne. in( 4,1 )) call stopit( status, 'Int: pc 10')
+ if( out( 4, 2 ) .ne. in( 4,2 )) call stopit( status, 'Int: pc 11')
+ if( out( 4, 3 ) .ne. in( 4,3 )) call stopit( status, 'Int: pc 12')
+
+
+
+ outperm(1) = 2
+ outperm(2) = -1
+ outperm(3) = 1
+
+ inperm(1) = 3
+ inperm(2) = 1
+
+ pm = ast_permmap( 2, inperm, 3, outperm, 1.5D0, ' ', status )
+
+ frm2 = ast_frame( 3, 'Domain=B', status )
+ reg = ast_mapregion( int1, pm, frm2, status )
+
+ if( .not. ast_isainterval( reg, status ) ) call stopit( status,
+ : 'Int: perm check 4' )
+ if( hasFrameSet( reg, status ) ) call stopit( status,
+ : 'Int: perm check 5' )
+ if( ast_geti( reg, 'naxes', status ) .ne. 3 ) call stopit( status,
+ : 'Int: perm check 6' )
+
+ in( 1, 1 ) = 20.0 ! Outside
+ in( 1, 2 ) = 0.0
+ in( 1, 3 ) = -0.5
+ in( 2, 1 ) = 20.0 ! Inside
+ in( 2, 2 ) = 1.5
+ in( 2, 3 ) = -0.5
+ in( 3, 1 ) = 20.0 ! Outside
+ in( 3, 2 ) = 1.6
+ in( 3, 3 ) = -0.5
+ in( 4, 1 ) = 0.5 ! Boundary
+ in( 4, 2 ) = 1.5
+ in( 4, 3 ) = 0.0
+
+ call ast_trann( reg, 4, 3, 4, in, .true., 3, 4, out, status )
+
+ if( out( 1, 1 ) .ne. AST__BAD ) call stopit( status, 'Int: pc 13')
+ if( out( 1, 2 ) .ne. AST__BAD ) call stopit( status, 'Int: pc 14')
+ if( out( 1, 3 ) .ne. AST__BAD ) call stopit( status, 'Int: pc 15')
+
+ if( out( 2, 1 ) .ne. in( 2,1 )) call stopit( status, 'Int: pc 16')
+ if( out( 2, 2 ) .ne. in( 2,2 )) call stopit( status, 'Int: pc 17')
+ if( out( 2, 3 ) .ne. in( 2,3 )) call stopit( status, 'Int: pc 18')
+
+ if( out( 3, 1 ) .ne. AST__BAD ) call stopit( status, 'Int: pc 19')
+ if( out( 3, 2 ) .ne. AST__BAD ) call stopit( status, 'Int: pc 20')
+ if( out( 3, 3 ) .ne. AST__BAD ) call stopit( status, 'Int: pc 21')
+
+ if( out( 4, 1 ) .ne. in( 4,1 )) call stopit( status, 'Int: pc 22')
+ if( out( 4, 2 ) .ne. in( 4,2 )) call stopit( status, 'Int: pc 23')
+ if( out( 4, 3 ) .ne. in( 4,3 )) call stopit( status, 'Int: pc 24')
+
+
+
+ call ast_negate( int1, status )
+ call ast_set( int1, 'closed=0', status )
+ reg = ast_mapregion( int1, pm, frm2, status )
+ call ast_negate( int1, status )
+ call ast_set( int1, 'closed=1', status )
+
+ if( .not. ast_isainterval( reg, status ) ) call stopit( status,
+ : 'Int: perm check 7' )
+ if( hasFrameSet( reg, status ) ) call stopit( status,
+ : 'Int: perm check 8' )
+ if( ast_geti( reg, 'naxes', status ) .ne. 3 ) call stopit( status,
+ : 'Int: perm check 9' )
+
+ in( 1, 1 ) = 20.0 ! Inside
+ in( 1, 2 ) = 0.0
+ in( 1, 3 ) = -0.5
+ in( 2, 1 ) = 20.0 ! Outside
+ in( 2, 2 ) = 1.5
+ in( 2, 3 ) = -0.5
+ in( 3, 1 ) = 20.0 ! Inside
+ in( 3, 2 ) = 1.6
+ in( 3, 3 ) = -0.5
+ in( 4, 1 ) = 0.5 ! Outside
+ in( 4, 2 ) = 1.5
+ in( 4, 3 ) = 0.0
+
+ call ast_trann( reg, 4, 3, 4, in, .true., 3, 4, out, status )
+
+ if( out( 1, 1 ) .ne. in( 1,1 )) call stopit( status, 'Int: pc 25')
+ if( out( 1, 2 ) .ne. in( 1,2 )) call stopit( status, 'Int: pc 26')
+ if( out( 1, 3 ) .ne. in( 1,3 )) call stopit( status, 'Int: pc 27')
+
+ if( out( 2, 1 ) .ne. AST__BAD ) call stopit( status, 'Int: pc 28')
+ if( out( 2, 2 ) .ne. AST__BAD ) call stopit( status, 'Int: pc 29')
+ if( out( 2, 3 ) .ne. AST__BAD ) call stopit( status, 'Int: pc 30')
+
+ if( out( 3, 1 ) .ne. in( 3,1 )) call stopit( status, 'Int: pc 31')
+ if( out( 3, 2 ) .ne. in( 3,2 )) call stopit( status, 'Int: pc 32')
+ if( out( 3, 3 ) .ne. in( 3,3 )) call stopit( status, 'Int: pc 33')
+
+ if( out( 4, 1 ) .ne. AST__BAD ) call stopit( status, 'Int: pc 34')
+ if( out( 4, 2 ) .ne. AST__BAD ) call stopit( status, 'Int: pc 35')
+ if( out( 4, 3 ) .ne. AST__BAD ) call stopit( status, 'Int: pc 36')
+
+
+
+
+ frm1 = ast_frame( 3, 'Domain=A', status )
+
+
+ lbnd(1) = 0.0
+ lbnd(2) = 0.0
+ lbnd(3) = 0.0
+ ubnd(1) = 0.01
+ ubnd(2) = 0.01
+ ubnd(3) = 0.01
+ unc = ast_box( frm1, 0, lbnd, ubnd, AST__NULL, ' ', status )
+
+ lbnd(1) = 0.5
+ lbnd(2) = -1.0
+ lbnd(3) = -2.0
+ ubnd(1) = AST__BAD
+ ubnd(2) = AST__BAD
+ ubnd(3) = 0.0
+
+ int1 = ast_interval( frm1, lbnd, ubnd, unc, ' ', status )
+
+ outperm(1) = 1
+ outperm(2) = 3
+
+ inperm(1) = 1
+ inperm(2) = -1
+ inperm(3) = 2
+
+ pm = ast_permmap( 3, inperm, 2, outperm, 1.0D0, ' ', status )
+
+ frm2 = ast_frame( 2, 'Domain=B', status )
+ reg = ast_mapregion( int1, pm, frm2, status )
+
+ if( .not. ast_isainterval( reg, status ) ) call stopit( status,
+ : 'Int: perm check 10' )
+ if( hasFrameSet( reg, status ) ) call stopit( status,
+ : 'Int: perm check 11' )
+ if( ast_geti( reg, 'naxes', status ) .ne. 2 ) call stopit( status,
+ : 'Int: perm check 12' )
+
+ xin( 1 ) = 0.4 ! Out
+ yin( 1 ) = -1.0
+ xin( 2 ) = 1.0 ! Out
+ yin( 2 ) = 0.1
+ xin( 3 ) = 1.0 ! Out
+ yin( 3 ) = -2.1
+ xin( 4 ) = 0.5 ! Boundary
+ yin( 4 ) = -1.0
+ xin( 5 ) = 10.0 ! In
+ yin( 5 ) = -0.1
+ xin( 6 ) = 0.55 ! Boundary
+ yin( 6 ) = -2.0
+
+
+ call ast_tran2( reg, 6, xin, yin, .true., xout, yout, status )
+
+ if( xout( 1 ) .ne. AST__BAD ) call stopit( status, 'Int: pc 37')
+ if( yout( 1 ) .ne. AST__BAD ) call stopit( status, 'Int: pc 38')
+ if( xout( 2 ) .ne. AST__BAD ) call stopit( status, 'Int: pc 39')
+ if( yout( 2 ) .ne. AST__BAD ) call stopit( status, 'Int: pc 40')
+ if( xout( 3 ) .ne. AST__BAD ) call stopit( status, 'Int: pc 41')
+ if( yout( 3 ) .ne. AST__BAD ) call stopit( status, 'Int: pc 42')
+ if( xout( 4 ) .ne. xin( 4 ) ) call stopit( status, 'Int: pc 43')
+ if( yout( 4 ) .ne. yin( 4 ) ) call stopit( status, 'Int: pc 44')
+ if( xout( 5 ) .ne. xin( 5 ) ) call stopit( status, 'Int: pc 45')
+ if( yout( 5 ) .ne. yin( 5 ) ) call stopit( status, 'Int: pc 46')
+ if( xout( 6 ) .ne. xin( 6 ) ) call stopit( status, 'Int: pc 47')
+ if( yout( 6 ) .ne. yin( 6 ) ) call stopit( status, 'Int: pc 48')
+
+
+ pm = ast_permmap( 3, inperm, 2, outperm, -2.0D0, ' ', status )
+ reg = ast_mapregion( int1, pm, frm2, status )
+
+ if( .not. ast_isanullregion( reg, status ) ) call stopit( status,
+ : 'Int: perm check 13' )
+ if( hasFrameSet( reg, status ) ) call stopit( status,
+ : 'Int: perm check 14' )
+ if( ast_geti( reg, 'naxes', status ) .ne. 2 ) call stopit( status,
+ : 'Int: perm check 15' )
+ if( ast_getl( reg, 'negated', status ) ) call stopit( status,
+ : 'Int: perm check 16' )
+
+
+ call ast_negate( int1, status )
+ reg = ast_mapregion( int1, pm, frm2, status )
+
+ if( .not. ast_isanullregion( reg, status ) ) call stopit( status,
+ : 'Int: perm check 17' )
+ if( hasFrameSet( reg, status ) ) call stopit( status,
+ : 'Int: perm check 18' )
+ if( ast_geti( reg, 'naxes', status ) .ne. 2 ) call stopit( status,
+ : 'Int: perm check 19' )
+ if( .NOT.ast_getl( reg, 'negated', status ) ) call stopit( status,
+ : 'Int: perm check 20' )
+
+
+
+
+ call ast_end( status )
+ if( status .ne. sai__ok ) write(*,*) 'Interval tests failed'
+
+ end
+
+
+ subroutine checkPolygon( status )
+ implicit none
+ include 'AST_PAR'
+ include 'SAE_PAR'
+
+ integer status, frm, unc, pol1, pol2, f2, r2, r3, r4
+ double precision pi, p(5,2), q(5,2), p1(2), p2(2)
+ double precision xin(2), yin(2), xout(2), yout(2), lbnd(5),
+ : ubnd(5)
+ logical hasframeset
+
+
+ if( status .ne.sai__ok ) return
+
+ call ast_begin( status )
+
+ pi = acos( -1.0d0 )
+
+ frm = ast_SkyFrame( ' ', status )
+
+ p1(1) = 0.0
+ p1(2) = 0.5*pi
+ p2(1) = 0.01
+ unc = ast_circle( frm, 1, p1, p2, AST__NULL, ' ', status )
+
+ p(1,1) = 0.0
+ p(1,2) = 0.0
+ p(2,1) = 1.0
+ p(2,2) = 0.5*pi
+ p(3,1) = 0.5*pi
+ p(3,2) = 0.25*pi
+ p(4,1) = 0.25*pi
+ p(4,2) = 0.0
+ p(5,1) = 0.25*pi
+ p(5,2) = 0.25*pi
+
+ pol1 = ast_polygon( frm, 5, 5, p, unc, 'closed=0', status )
+
+ call checkdump( pol1, 'checkdump pol1', status )
+
+
+ p(1,1) = 0.0 ! On boundary
+ p(1,2) = 0.0
+ p(2,1) = 1.0 ! Outside
+ p(2,2) = 0.5*pi + 0.1
+ p(3,1) = 0.5*pi - 0.1 ! Inside
+ p(3,2) = 0.25*pi
+ p(4,1) = 0.0 ! On boundary
+ p(4,2) = 0.1
+ p(5,1) = 0.25*pi ! Inside
+ p(5,2) = 0.25*pi + 0.1
+
+ call ast_trann( pol1, 5, 2, 5, p, .true., 2, 5, q, status )
+
+ if( q(1,1) .ne. AST__BAD ) call stopit( status, 'Poly 1' )
+ if( q(1,2) .ne. AST__BAD ) call stopit( status, 'Poly 1b' )
+ if( q(2,1) .ne. AST__BAD ) call stopit( status, 'Poly 2' )
+ if( q(2,2) .ne. AST__BAD ) call stopit( status, 'Poly 2b' )
+ if( q(3,1) .ne. p(3,1) ) call stopit( status, 'Poly 3' )
+ if( q(3,2) .ne. p(3,2) ) call stopit( status, 'Poly 3b' )
+ if( q(4,1) .ne. AST__BAD ) call stopit( status, 'Poly 4' )
+ if( q(4,2) .ne. AST__BAD ) call stopit( status, 'Poly 4b' )
+ if( q(5,1) .ne. p(5,1) ) call stopit( status, 'Poly 5' )
+ if( q(5,2) .ne. p(5,2) ) call stopit( status, 'Poly 5b' )
+
+
+ call ast_setl( pol1, 'closed', .true., status )
+ call ast_trann( pol1, 5, 2, 5, p, .true., 2, 5, q, status )
+ if( q(1,1) .ne. p(1,1) ) call stopit( status, 'Poly 6' )
+ if( q(1,2) .ne. p(1,2) ) call stopit( status, 'Poly 6b' )
+ if( q(2,1) .ne. AST__BAD ) call stopit( status, 'Poly 7' )
+ if( q(2,2) .ne. AST__BAD ) call stopit( status, 'Poly 7b' )
+ if( q(3,1) .ne. p(3,1) ) call stopit( status, 'Poly 8' )
+ if( q(3,2) .ne. p(3,2) ) call stopit( status, 'Poly 8b' )
+ if( q(4,1) .ne. p(4,1) ) call stopit( status, 'Poly 9' )
+ if( q(4,2) .ne. p(4,2) ) call stopit( status, 'Poly 9b' )
+ if( q(5,1) .ne. p(5,1) ) call stopit( status, 'Poly 10' )
+ if( q(5,2) .ne. p(5,2) ) call stopit( status, 'Poly 10b' )
+
+ call ast_setl( pol1, 'negated', .true., status )
+ call ast_trann( pol1, 5, 2, 5, p, .true., 2, 5, q, status )
+ if( q(1,1) .ne. p(1,1) ) call stopit( status, 'Poly 11' )
+ if( q(1,2) .ne. p(1,2) ) call stopit( status, 'Poly 11b' )
+ if( q(2,1) .ne. p(2,1) ) call stopit( status, 'Poly 12' )
+ if( q(2,2) .ne. p(2,2) ) call stopit( status, 'Poly 12b' )
+ if( q(3,1) .ne. AST__BAD ) call stopit( status, 'Poly 13' )
+ if( q(3,2) .ne. AST__BAD ) call stopit( status, 'Poly 13b' )
+ if( q(4,1) .ne. p(4,1) ) call stopit( status, 'Poly 14' )
+ if( q(4,2) .ne. p(4,2) ) call stopit( status, 'Poly 14b' )
+ if( q(5,1) .ne. AST__BAD ) call stopit( status, 'Poly 15' )
+ if( q(5,2) .ne. AST__BAD ) call stopit( status, 'Poly 15b' )
+
+ call ast_setl( pol1, 'closed', .false., status )
+ call ast_trann( pol1, 5, 2, 5, p, .true., 2, 5, q, status )
+ if( q(1,1) .ne. AST__BAD ) call stopit( status, 'Poly 16' )
+ if( q(1,2) .ne. AST__BAD ) call stopit( status, 'Poly 16b' )
+ if( q(2,1) .ne. p(2,1) ) call stopit( status, 'Poly 17' )
+ if( q(2,2) .ne. p(2,2) ) call stopit( status, 'Poly 17b' )
+ if( q(3,1) .ne. AST__BAD ) call stopit( status, 'Poly 18' )
+ if( q(3,2) .ne. AST__BAD ) call stopit( status, 'Poly 18b' )
+ if( q(4,1) .ne. AST__BAD ) call stopit( status, 'Poly 19' )
+ if( q(4,2) .ne. AST__BAD ) call stopit( status, 'Poly 19b' )
+ if( q(5,1) .ne. AST__BAD ) call stopit( status, 'Poly 20' )
+ if( q(5,2) .ne. AST__BAD ) call stopit( status, 'Poly 20b' )
+
+
+ if( hasframeset( pol1, status ) ) then
+ call stopit( status, 'pol1 has FrameSet' )
+ end if
+
+ call ast_setc( pol1, 'system', 'fk5', status )
+ call checkdump( pol1, 'checkdump pol2', status )
+
+ if( .not. hasframeset( pol1, status ) ) then
+ call stopit( status, 'pol1 does not have FrameSet' )
+ end if
+
+ call ast_seti( pol1, 'meshsize', 30, status )
+
+ pol2 = ast_simplify( pol1, status )
+
+ if( hasframeset( pol2, status ) ) then
+ call stopit( status, 'pol2 has FrameSet' )
+ end if
+
+
+
+ frm = ast_SkyFrame( ' ', status )
+
+ p1(1) = 0.0
+ p1(2) = 0.5*pi
+ p2(1) = 0.01
+ unc = ast_circle( frm, 1, p1, p2, AST__NULL, ' ', status )
+
+ p(1,1) = 1.5*pi
+ p(1,2) = 0.4*pi
+ p(2,1) = pi
+ p(2,2) = 0.4*pi
+ p(3,1) = 0.5*pi
+ p(3,2) = 0.4*pi
+ p(4,1) = 0.0
+ p(4,2) = 0.4*pi
+
+ pol1 = ast_polygon( frm, 4, 5, p, unc, ' ', status )
+
+ xin(1) = 0.0
+ yin(1) = 0.5*pi
+ call ast_tran2( pol1, 1, xin, yin, .true., xout, yout, status )
+
+ if( xout(1) .ne. xin(1) ) call stopit( status, 'Poly 21' )
+ if( yout(1) .ne. yin(1) ) call stopit( status, 'Poly 22' )
+
+ call ast_getregionbounds( pol1, lbnd, ubnd, status )
+ if( abs( lbnd(1) ) .gt. 1.0E-10 ) call stopit( status, 'Poly 23' )
+ if( abs( lbnd(2) - 1.25663708 ) .gt. 1.0E-6 )
+ : call stopit( status, 'Poly 24' )
+ if( abs( ubnd(1) - 6.28318531 ) .gt. 1.0E-6 )
+ : call stopit( status, 'Poly 25' )
+ if( abs( ubnd(2) - 1.57079633 ) .gt. 1.0E-6 )
+ : call stopit( status, 'Poly 26' )
+
+
+ f2 = ast_specframe( 'Unit=Angstrom', status )
+ lbnd( 1 ) = 5000.0
+ ubnd( 1 ) = 6000.0
+ r2 = ast_interval( f2, lbnd, ubnd, AST__NULL, ' ', status )
+ r3 = ast_prism( pol1, r2, ' ', status )
+ r4 = ast_Simplify( r3, status )
+
+ call ast_getregionbounds( r4, lbnd, ubnd, status )
+ if( abs( lbnd(1) ) .gt. 1.0E-10 ) call stopit( status, 'Poly 27' )
+ if( abs( lbnd(2) - 1.25663708 ) .gt. 1.0E-6 )
+ : call stopit( status, 'Poly 28' )
+ if( abs( ubnd(1) - 6.28318531 ) .gt. 1.0E-6 )
+ : call stopit( status, 'Poly 29' )
+ if( abs( ubnd(2) - 1.57079633 ) .gt. 1.0E-6 )
+ : call stopit( status, 'Poly 30' )
+ if( abs( lbnd(3) - 5000.0 ) .gt. 1.0E-10 )
+ : call stopit( status, 'Poly 31' )
+ if( abs( ubnd(3) - 6000.0 ) .gt. 1.0E-6 )
+ : call stopit( status, 'Poly 32' )
+
+
+
+
+
+
+
+ call ast_end( status )
+ if( status .ne. sai__ok ) write(*,*) 'Polygon tests failed'
+
+ end
+
+
+
+
+
+ subroutine checkBox( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ include 'PRM_PAR'
+
+ integer status, box1, frm1, i, fc, fs, map1, perm(3), frm2, box3,
+ : box2, frm3, map2, res, j, bfrm, cfrm, reg1, map,
+ : npoint
+ double precision p1(3), p2(3), v2, xin(9), yin(9), xout(9),
+ : yout(9),in(4,3),out(4,3),matrix(9),grid(250,2)
+ character*(AST__SZCHR) t1, t2, cards(9)*80
+ logical hasframeset
+
+ integer lbnd_in(2), ubnd_in(2)
+ real rin(5,5),image(50,50)
+ integer outperm(3), inperm(3),pm, reg, unc
+
+
+ data cards /'CTYPE1 = ''RA---TAN''',
+ : 'CTYPE2 = ''DEC--TAN''',
+ : 'CRPIX1 = 100',
+ : 'CRPIX2 = 100',
+ : 'CRVAL1 = 71.619724',
+ : 'CRVAL2 = 42.971835',
+ : ' ',
+ : 'CDELT1 = 0.6',
+ : 'CDELT2 = 0.6' /
+
+ if( status .ne. sai__ok ) return
+
+ call ast_begin( status )
+
+ fc = ast_fitschan( ast_null, ast_null, ' ', status )
+ do i = 1, 9
+ call ast_putfits( fc, cards(i), .false., status )
+ end do
+ call ast_clear( fc, 'card', status )
+ fs = ast_read( fc, status )
+
+ frm1 = ast_getframe( fs, ast__current, status )
+ call ast_seti( frm1, 'digits(1)', 12, status )
+
+ p1( 1 ) = 1.25
+ p1( 2 ) = 0.75
+ p2( 1 ) = 1.5
+ p2( 2 ) = 0.5
+
+ box1 = ast_box( frm1, 0, p1, p2, AST__NULL, ' ', status )
+ call checkdump( box1, 'checkdump box1', status )
+
+ if( ast_getc( box1, 'system', status ) .ne. 'ICRS' )
+ : call stopit( status, 'box1 system is not ICRS' )
+
+ call ast_setc( box1, 'system', 'galactic', status )
+
+ perm(1)=2
+ perm(2)=1
+ call ast_permaxes( box1, perm, status )
+
+ box3 = ast_copy( box1, status )
+
+ yin(1) = 2.82175432250852
+ xin(1) = -0.0269096590283195
+ yin(2) = 2.70798275154741
+ xin(2) = 0.2467384819891
+
+ call ast_tran2( box1, 2, xin, yin, .true., xout, yout, status )
+
+ if( abs( yout(1)-2.82175422 ) .gt. 1.0E-6 )
+ : call stopit( status, 'error 1' )
+ if( abs( xout(1)+0.0269096587 ) .gt. 1.0E-7 )
+ : call stopit( status, 'error 2' )
+ if( yout(2) .ne. AST__BAD ) call stopit( status, 'error 3' )
+ if( xout(2) .ne. AST__BAD ) call stopit( status, 'error 4' )
+
+
+ if( .not. ast_getl( box3, 'Adaptive', status ) )
+ : call stopit( status, 'error 4a' )
+
+ call ast_setl( box3, 'Adaptive', .false., status )
+ call ast_setc( box3, 'system', 'icrs', status )
+
+ yin(1) = 2.82175432250852
+ xin(1) = -0.0269096590283195
+ yin(2) = 2.70798275154741
+ xin(2) = 0.2467384819891
+
+ call ast_tran2( box3, 2, xin, yin, .true., xout, yout, status )
+
+ if( abs( yout(1)-2.82175422 ) .gt. 1.0E-8 )
+ : call stopit( status, 'error 1' )
+ if( abs( xout(1)+0.0269096587 ) .gt. 1.0E-8 )
+ : call stopit( status, 'error 2' )
+ if( yout(2) .ne. AST__BAD ) call stopit( status, 'error 4b' )
+ if( xout(2) .ne. AST__BAD ) call stopit( status, 'error 4c' )
+
+ call ast_clear( box3, 'system', status )
+
+ yin(1) = 2.82175432250852
+ xin(1) = -0.0269096590283195
+ yin(2) = 2.70798275154741
+ xin(2) = 0.2467384819891
+
+ call ast_tran2( box3, 2, xin, yin, .true., xout, yout, status )
+
+ if( abs( yout(1)-2.82175422 ) .gt. 1.0E-8 )
+ : call stopit( status, 'error 1' )
+ if( abs( xout(1)+0.0269096587 ) .gt. 1.0E-8 )
+ : call stopit( status, 'error 2' )
+ if( yout(2) .ne. AST__BAD ) call stopit( status, 'error 4d' )
+ if( xout(2) .ne. AST__BAD ) call stopit( status, 'error 4e' )
+
+ box2 = ast_simplify( box1, status )
+
+ call ast_setc( box1, 'system', 'icrs', status )
+ call ast_permaxes( box1, perm, status )
+
+ t1 = ast_format( frm1, 1, 0.25D0, status )
+ call ast_annul( frm1, status )
+ t2 = ast_format( box1, 1, 0.25D0, status )
+ if( t1 .ne. t2 ) call stopit( status,
+ : 'ast_format is different for frm1 and box1' )
+
+ i = ast_unformat( box1, 1, t2, v2, status )
+ if( abs( v2 - 0.25 ) .GT. 1.0E-10 ) then
+ call stopit( status, 'ast_unformat failed for box1' )
+ end if
+
+ if( ast_getc( box1, 'System', status ) .ne. 'ICRS' ) then
+ call stopit( status, 'Box1(b) system is not ICRS' )
+ end if
+
+ if( ast_getc( box1, 'Equinox', status ) .ne. '2000.0' ) then
+ call stopit( status, 'Box1 equinox is not 2000.0' )
+ end if
+
+ if( .not. ast_getl( box1, 'Closed', status ) ) then
+ call stopit( status, 'Box1 closed is not .true.' )
+ end if
+
+ xin( 1 ) = 1.25
+ yin( 1 ) = 0.75
+ xin( 2 ) = 1.0
+ yin( 2 ) = 1.0
+ xin( 3 ) = 1.0
+ yin( 3 ) = 0.5
+ xin( 4 ) = 1.5
+ yin( 4 ) = 0.5
+ xin( 5 ) = 1.5
+ yin( 5 ) = 1.0
+ xin( 6 ) = 1.0
+ yin( 6 ) = 1.2
+ xin( 7 ) = 0.8
+ yin( 7 ) = 0.5
+ xin( 8 ) = 1.5
+ yin( 8 ) = 0.45
+ xin( 9 ) = 1.501
+ yin( 9 ) = 1.0
+
+ call ast_tran2( BOX1, 9, xin, yin, .true., xout, yout, status )
+
+ if( xout( 1 ) .ne. 1.25 ) call stopit( status, 'error A1' )
+ if( yout( 1 ) .ne. 0.75 ) call stopit( status, 'error A2' )
+ if( xout( 2 ) .ne. 1.0 ) call stopit( status, 'error A3' )
+ if( yout( 2 ) .ne. 1.0 ) call stopit( status, 'error A4' )
+ if( xout( 3 ) .ne. 1.0 ) call stopit( status, 'error A5' )
+ if( yout( 3 ) .ne. 0.5 ) call stopit( status, 'error A6' )
+ if( xout( 4 ) .ne. 1.5 ) call stopit( status, 'error A7' )
+ if( yout( 4 ) .ne. 0.5 ) call stopit( status, 'error A8' )
+ if( xout( 5 ) .ne. 1.5 ) call stopit( status, 'error A9' )
+ if( yout( 5 ) .ne. 1.0 ) call stopit( status, 'error A10' )
+ if( xout( 6 ) .ne. AST__BAD ) call stopit( status, 'error A11' )
+ if( yout( 6 ) .ne. AST__BAD ) call stopit( status, 'error A12' )
+ if( xout( 7 ) .ne. AST__BAD ) call stopit( status, 'error A13' )
+ if( yout( 7 ) .ne. AST__BAD ) call stopit( status, 'error A14' )
+ if( xout( 8 ) .ne. AST__BAD ) call stopit( status, 'error A15' )
+ if( yout( 8 ) .ne. AST__BAD ) call stopit( status, 'error A16' )
+ if( xout( 9 ) .ne. AST__BAD ) call stopit( status, 'error A17' )
+ if( yout( 9 ) .ne. AST__BAD ) call stopit( status, 'error A18' )
+
+ call ast_tran2( box1, 9, xin, yin, .false., xout, yout, status )
+
+ if( xout( 1 ) .ne. 1.25 ) call stopit( status, 'error B1' )
+ if( yout( 1 ) .ne. 0.75 ) call stopit( status, 'error B2' )
+ if( xout( 2 ) .ne. 1.0 ) call stopit( status, 'error B3' )
+ if( yout( 2 ) .ne. 1.0 ) call stopit( status, 'error B4' )
+ if( xout( 3 ) .ne. 1.0 ) call stopit( status, 'error B5' )
+ if( yout( 3 ) .ne. 0.5 ) call stopit( status, 'error B6' )
+ if( xout( 4 ) .ne. 1.5 ) call stopit( status, 'error B7' )
+ if( yout( 4 ) .ne. 0.5 ) call stopit( status, 'error B8' )
+ if( xout( 5 ) .ne. 1.5 ) call stopit( status, 'error B9' )
+ if( yout( 5 ) .ne. 1.0 ) call stopit( status, 'error B10' )
+ if( xout( 6 ) .ne. AST__BAD ) call stopit( status, 'error B11' )
+ if( yout( 6 ) .ne. AST__BAD ) call stopit( status, 'error B12' )
+ if( xout( 7 ) .ne. AST__BAD ) call stopit( status, 'error B13' )
+ if( yout( 7 ) .ne. AST__BAD ) call stopit( status, 'error B14' )
+ if( xout( 8 ) .ne. AST__BAD ) call stopit( status, 'error B15' )
+ if( yout( 8 ) .ne. AST__BAD ) call stopit( status, 'error B16' )
+ if( xout( 9 ) .ne. AST__BAD ) call stopit( status, 'error B17' )
+ if( yout( 9 ) .ne. AST__BAD ) call stopit( status, 'error B18' )
+
+ call ast_negate( box1, status )
+ call ast_tran2( box1, 9, xin, yin, .true., xout, yout, status )
+
+ if( xout( 1 ) .ne. AST__BAD ) call stopit( status, 'error C1' )
+ if( yout( 1 ) .ne. AST__BAD ) call stopit( status, 'error C2' )
+ if( xout( 2 ) .ne. 1.0 ) call stopit( status, 'error C3' )
+ if( yout( 2 ) .ne. 1.0 ) call stopit( status, 'error C4' )
+ if( xout( 3 ) .ne. 1.0 ) call stopit( status, 'error C5' )
+ if( yout( 3 ) .ne. 0.5 ) call stopit( status, 'error C6' )
+ if( xout( 4 ) .ne. 1.5 ) call stopit( status, 'error C7' )
+ if( yout( 4 ) .ne. 0.5 ) call stopit( status, 'error C8' )
+ if( xout( 5 ) .ne. 1.5 ) call stopit( status, 'error C9' )
+ if( yout( 5 ) .ne. 1.0 ) call stopit( status, 'error C10' )
+ if( xout( 6 ) .ne. 1.0 ) call stopit( status, 'error C11' )
+ if( yout( 6 ) .ne. 1.2 ) call stopit( status, 'error C12' )
+ if( xout( 7 ) .ne. 0.8 ) call stopit( status, 'error C13' )
+ if( yout( 7 ) .ne. 0.5 ) call stopit( status, 'error C14' )
+ if( xout( 8 ) .ne. 1.5 ) call stopit( status, 'error C15' )
+ if( yout( 8 ) .ne. 0.45 ) call stopit( status, 'error C16' )
+ if( xout( 9 ) .ne. 1.501 ) call stopit( status, 'error C17' )
+ if( yout( 9 ) .ne. 1.0 ) call stopit( status, 'error C18' )
+
+ call ast_setl( box1, 'closed', .false., status )
+ call ast_negate( box1, status )
+ call ast_tran2( box1, 9, xin, yin, .true., xout, yout, status )
+
+ if( xout( 1 ) .ne. 1.25 ) call stopit( status, 'error D1' )
+ if( yout( 1 ) .ne. 0.75 ) call stopit( status, 'error D2' )
+ if( xout( 2 ) .ne. AST__BAD ) call stopit( status, 'error D3' )
+ if( yout( 2 ) .ne. AST__BAD ) call stopit( status, 'error D4' )
+ if( xout( 3 ) .ne. AST__BAD ) call stopit( status, 'error D5' )
+ if( yout( 3 ) .ne. AST__BAD ) call stopit( status, 'error D6' )
+ if( xout( 4 ) .ne. AST__BAD ) call stopit( status, 'error D7' )
+ if( yout( 4 ) .ne. AST__BAD ) call stopit( status, 'error D8' )
+ if( xout( 5 ) .ne. AST__BAD ) call stopit( status, 'error D9' )
+ if( yout( 5 ) .ne. AST__BAD ) call stopit( status, 'error D10' )
+ if( xout( 6 ) .ne. AST__BAD ) call stopit( status, 'error D11' )
+ if( yout( 6 ) .ne. AST__BAD ) call stopit( status, 'error D12' )
+ if( xout( 7 ) .ne. AST__BAD ) call stopit( status, 'error D13' )
+ if( yout( 7 ) .ne. AST__BAD ) call stopit( status, 'error D14' )
+ if( xout( 8 ) .ne. AST__BAD ) call stopit( status, 'error D15' )
+ if( yout( 8 ) .ne. AST__BAD ) call stopit( status, 'error D16' )
+ if( xout( 9 ) .ne. AST__BAD ) call stopit( status, 'error D17' )
+ if( yout( 9 ) .ne. AST__BAD ) call stopit( status, 'error D18' )
+
+ call ast_setl( box1, 'Negated', .true., status )
+ call ast_tran2( box1, 9, xin, yin, .true., xout, yout, status )
+
+ if( xout( 1 ) .ne. AST__BAD ) call stopit( status, 'error E1' )
+ if( yout( 1 ) .ne. AST__BAD ) call stopit( status, 'error E2' )
+ if( xout( 2 ) .ne. AST__BAD ) call stopit( status, 'error E3' )
+ if( yout( 2 ) .ne. AST__BAD ) call stopit( status, 'error E4' )
+ if( xout( 3 ) .ne. AST__BAD ) call stopit( status, 'error E5' )
+ if( yout( 3 ) .ne. AST__BAD ) call stopit( status, 'error E6' )
+ if( xout( 4 ) .ne. AST__BAD ) call stopit( status, 'error E7' )
+ if( yout( 4 ) .ne. AST__BAD ) call stopit( status, 'error E8' )
+ if( xout( 5 ) .ne. AST__BAD ) call stopit( status, 'error E9' )
+ if( yout( 5 ) .ne. AST__BAD ) call stopit( status, 'error E10' )
+ if( xout( 6 ) .ne. 1.0 ) call stopit( status, 'error E11' )
+ if( yout( 6 ) .ne. 1.2 ) call stopit( status, 'error E12' )
+ if( xout( 7 ) .ne. 0.8 ) call stopit( status, 'error E13' )
+ if( yout( 7 ) .ne. 0.5 ) call stopit( status, 'error E14' )
+ if( xout( 8 ) .ne. 1.5 ) call stopit( status, 'error E15' )
+ if( yout( 8 ) .ne. 0.45 ) call stopit( status, 'error E16' )
+ if( xout( 9 ) .ne. 1.501 ) call stopit( status, 'error E17' )
+ if( yout( 9 ) .ne. 1.0 ) call stopit( status, 'error E18' )
+
+ call ast_clear( box1, 'Negated', status )
+ call ast_clear( box1, 'Closed', status )
+
+ call ast_addframe( fs, ast__current, ast_unitmap(2,' ',status),
+ : box1, status )
+
+
+
+ map1 = ast_getmapping( fs, ast__current, ast__current, status )
+
+ if( .not.ast_isaregion( map1, status ) )
+ : call stopit( status, 'map1 is not a Region' )
+
+ call ast_setl( fs, 'Negated', .true., status )
+ if( ast_getl( box1, 'Negated', status ) )
+ : call stopit( status,
+ : 'FrameSet Negated attribute reflected in box1' )
+ call ast_clear( fs, 'Negated', status )
+
+ map1 = ast_getmapping( fs, ast__base, ast__current, status )
+
+ call ast_tran2( map1, 9, xin, yin, .false., xout, yout, status )
+
+ if( xout( 1 ) .eq. AST__BAD ) call stopit( status, 'error F1' )
+ if( yout( 1 ) .eq. AST__BAD ) call stopit( status, 'error F2' )
+ if( xout( 2 ) .eq. AST__BAD ) call stopit( status, 'error F3' )
+ if( yout( 2 ) .eq. AST__BAD ) call stopit( status, 'error F4' )
+ if( xout( 3 ) .eq. AST__BAD ) call stopit( status, 'error F5' )
+ if( yout( 3 ) .eq. AST__BAD ) call stopit( status, 'error F6' )
+ if( xout( 4 ) .eq. AST__BAD ) call stopit( status, 'error F7' )
+ if( yout( 4 ) .eq. AST__BAD ) call stopit( status, 'error F8' )
+ if( xout( 5 ) .eq. AST__BAD ) call stopit( status, 'error F9' )
+ if( yout( 5 ) .eq. AST__BAD ) call stopit( status, 'error F10' )
+ if( xout( 6 ) .ne. AST__BAD ) call stopit( status, 'error F11' )
+ if( yout( 6 ) .ne. AST__BAD ) call stopit( status, 'error F12' )
+ if( xout( 7 ) .ne. AST__BAD ) call stopit( status, 'error F13' )
+ if( yout( 7 ) .ne. AST__BAD ) call stopit( status, 'error F14' )
+ if( xout( 8 ) .ne. AST__BAD ) call stopit( status, 'error F15' )
+ if( yout( 8 ) .ne. AST__BAD ) call stopit( status, 'error F16' )
+ if( xout( 9 ) .ne. AST__BAD ) call stopit( status, 'error F17' )
+ if( yout( 9 ) .ne. AST__BAD ) call stopit( status, 'error F18' )
+
+ call ast_tran2( map1, 9, xout, yout, .true., xout, yout, status )
+
+ if( abs( xout( 1 ) - 1.25 ) .gt. 1.0D-7 ) call stopit( status,
+ : 'error G1' )
+ if( abs( yout( 1 ) - 0.75 ) .gt. 1.0D-7 ) call stopit( status,
+ : 'error G2' )
+ if( xout( 6 ) .ne. AST__BAD ) call stopit( status, 'error G11' )
+ if( yout( 6 ) .ne. AST__BAD ) call stopit( status, 'error G12' )
+ if( xout( 7 ) .ne. AST__BAD ) call stopit( status, 'error G13' )
+ if( yout( 7 ) .ne. AST__BAD ) call stopit( status, 'error G14' )
+ if( xout( 8 ) .ne. AST__BAD ) call stopit( status, 'error G15' )
+ if( yout( 8 ) .ne. AST__BAD ) call stopit( status, 'error G16' )
+ if( xout( 9 ) .ne. AST__BAD ) call stopit( status, 'error G17' )
+ if( yout( 9 ) .ne. AST__BAD ) call stopit( status, 'error G18' )
+
+
+
+
+ frm2 = ast_specframe( 'Unit=Angstrom', status )
+ p1( 1 ) = 1000.0
+ p2( 1 ) = 1100.0
+ box2 = ast_box( frm2, 0, p1, p2, AST__NULL, ' ', status )
+ frm3 = ast_cmpframe( box1, box2, ' ', status )
+
+ perm(1)=2
+ perm(2)=3
+ perm(3)=1
+ call ast_permaxes( frm3, perm, status )
+ call ast_setc( frm3, 'system(1)', 'galactic', status )
+ call ast_setc( frm3, 'system(2)', 'Freq', status )
+
+ in( 1, 1 ) = -0.0269096590283195 ! In both boxes
+ in( 1, 2 ) = 2997924.58
+ in( 1, 3 ) = 2.82175432250852
+ in( 2, 1 ) = 0.2467384819891 ! In spec box, out sky box
+ in( 2, 2 ) = 2997924.58
+ in( 2, 3 ) = 2.70798275154741
+ in( 3, 1 ) = -0.0269096590283195 ! Out spec box in sky box
+ in( 3, 2 ) = 4000000.0
+ in( 3, 3 ) = 2.82175432250852
+ in( 4, 1 ) = 0.2467384819891 ! Out spec box, out sky box
+ in( 4, 2 ) = 4000000.0
+ in( 4, 3 ) = 2.70798275154741
+ call ast_trann( frm3, 4, 3, 4, in, .true., 3, 4, out, status )
+
+ if( abs( out(1,1)+0.0269096587 ) .gt. 1.0E-8 )
+ : call stopit( status, 'error H1' )
+ if( abs( out(1,2)-2997924.5 ) .gt. 1.0E-1 )
+ : call stopit( status, 'error H2' )
+ if( abs( out(1,3)-2.82175422 ) .gt. 1.0E-6 )
+ : call stopit( status, 'error H3' )
+
+ if( out(2,1) .ne. ast__bad ) call stopit( status, 'error H4' )
+ if( abs( out(2,2)-2997924.5 ) .gt. 1.0E-1 )
+ : call stopit( status, 'error H5' )
+ if( out(2,3) .ne. ast__bad ) call stopit( status, 'error H6' )
+
+ if( abs( out(3,1)+0.0269096587 ) .gt. 1.0E-8 )
+ : call stopit( status, 'error H7' )
+ if( out(3,2) .ne. ast__bad ) call stopit( status, 'error H8' )
+ if( abs( out(3,3)-2.82175422 ) .gt. 1.0E-6 )
+ : call stopit( status, 'error H9' )
+
+ if( out(4,1) .ne. ast__bad ) call stopit( status, 'error H10' )
+ if( out(4,2) .ne. ast__bad ) call stopit( status, 'error H11' )
+ if( out(4,3) .ne. ast__bad ) call stopit( status, 'error H12' )
+
+ if( .not. ast_getl( frm3, 'closed(1)', status ) )
+ : call stopit( status, 'compound frame region is not closed' )
+
+
+
+
+C
+C Testing astMapRegion
+C
+
+ frm1 = ast_frame( 3, 'Domain=A', status )
+ p1(1) = 100
+ p1(2) = 200
+ p1(3) = 300
+ p2(1) = 0
+ p2(2) = 400
+ p2(3) = 250
+ box1 = ast_box( frm1, 0, p1, p2, AST__NULL, ' ', status )
+
+ frm2 = ast_frame( 3, 'Domain=B', status )
+
+ matrix(1) = 2.0
+ matrix(2) = 0.0
+ matrix(3) = 0.0
+ matrix(4) = 0.0
+ matrix(5) = 4.0
+ matrix(6) = 0.0
+ matrix(7) = 0.0
+ matrix(8) = 0.0
+ matrix(9) = 6.0
+
+ map2 = ast_matrixmap( 3, 3, 0, matrix, ' ', status )
+ box2 = ast_mapregion( box1, map2, frm2, status )
+
+ if( ast_getc( box2, 'Domain', status ) .ne. 'B' ) then
+ call stopit( status, 'ast_mapregion1: Box2 domain is not B' )
+ end if
+
+ if( hasframeset( box2, status ) ) then
+ call stopit( status, 'ast_mapregion2: Box2 has FrameSet' )
+ end if
+
+ matrix(1) = 2.0
+ matrix(2) = .1
+ matrix(3) = 0.0
+ matrix(4) = 0.0
+ matrix(5) = 4.0
+ matrix(6) = 0.0
+ matrix(7) = 0.0
+ matrix(8) = 0.0
+ matrix(9) = 6.0
+
+ map2 = ast_matrixmap( 3, 3, 0, matrix, ' ', status )
+
+ box2 = ast_mapregion( box1, map2, frm2, status )
+
+ if( ast_getc( box2, 'Domain', status ) .ne. 'B' ) then
+ call stopit( status, 'ast_mapregion3: Box2 domain is not B' )
+ end if
+
+ if( hasframeset( box2, status ) ) then
+ call stopit( status, 'ast_mapregion4: Box2 has FrameSet' )
+ end if
+
+ call checkdump( box2, 'checkdump box2', status )
+
+ frm1 = ast_frame( 1, 'Domain=A', status )
+ p1(1) = 100
+ p2(1) = 0
+ box1 = ast_box( frm1, 0, p1, p2, AST__NULL, ' ', status )
+
+ frm2 = ast_frame( 1, 'Domain=B', status )
+
+ map2 = ast_zoommap( 1, 2.0D0, ' ', status )
+ box2 = ast_mapregion( box1, map2, frm2, status )
+
+ if( ast_getc( box2, 'Domain', status ) .ne. 'B' ) then
+ call stopit( status, 'ast_mapregion5: Box2 domain is not B' )
+ end if
+
+ if( hasframeset( box2, status ) ) then
+ call stopit( status, 'ast_mapregion6: Box2 has FrameSet (B)' )
+ end if
+
+ frm1 = ast_skyframe( ' ', status )
+ p1(1) = 0
+ p1(2) = 0
+ p2(1) = 0.001
+ p2(2) = 0.001
+ box1 = ast_box( frm1, 0, p1, p2, AST__NULL, ' ', status )
+
+ frm2 = ast_copy( frm1, status )
+ call ast_setd( frm2, 'skyref(1)', 0.0005D0, status )
+ call ast_setc( frm2, 'skyrefis', 'origin', status )
+
+ fs = ast_convert( frm1, frm2, ' ', status )
+
+ box2 = ast_mapregion( box1, fs, frm2, status )
+
+ if( hasframeset( box2, status ) ) then
+ call stopit( status, 'ast_mapregion7: Box2 has FrameSet (C)' )
+ end if
+
+ xin( 1 ) = 0.00049
+ yin( 1 ) = 0.0009
+ xin( 2 ) = 0.00051
+ yin( 2 ) = 0.0009
+ xin( 3 ) = -0.0016
+ yin( 3 ) = 0.0
+ xin( 4 ) = -0.0014
+ yin( 4 ) = 0.0
+ xin( 5 ) = 6.2815853
+ yin( 5 ) = 0.0
+ xin( 6 ) = 6.2817853
+ yin( 6 ) = 0.0
+
+ call ast_tran2( box2, 6, xin, yin, .true., xout, yout, status )
+
+ if( abs( xout( 1 ) - xin( 1 ) ) .gt. 1D-10 ) call stopit( status,
+ : 'error I1' )
+ if( abs( yout( 1 ) - yin( 1 ) ) .gt. 1D-10 ) call stopit( status,
+ : 'error I2' )
+
+ if( xout(2) .ne. AST__BAD ) call stopit( status, 'error I3' )
+ if( yout(2) .ne. AST__BAD ) call stopit( status, 'error I4' )
+ if( xout(5) .ne. AST__BAD ) call stopit( status, 'error I5' )
+ if( yout(5) .ne. AST__BAD ) call stopit( status, 'error I6' )
+ if( xout(3) .ne. AST__BAD ) call stopit( status, 'error I7' )
+ if( yout(3) .ne. AST__BAD ) call stopit( status, 'error I8' )
+
+ if( abs( xout( 4 ) - xin( 4 ) ) .gt. 1D-10 ) call stopit( status,
+ : 'error I9' )
+ if( abs( yout( 4 ) - yin( 4 ) ) .gt. 1D-10 ) call stopit( status,
+ : 'error I10' )
+ if( abs( xout( 6 ) - xin( 6 ) ) .gt. 1D-10 ) call stopit( status,
+ : 'error I11' )
+ if( abs( yout( 6 ) - yin( 6 ) ) .gt. 1D-10 ) call stopit( status,
+ : 'error I12' )
+
+
+ call ast_setc( box2, 'skyrefis', 'pole', status )
+ box2 = ast_Simplify( box2, status )
+
+ if( hasframeset( box2, status ) ) then
+ call stopit( status, 'ast_mapregion8: Box2 has '//
+ : 'FrameSet (B)' )
+ end if
+
+C
+C Testing astOverlap
+C
+
+ frm1 = ast_frame( 3, 'Domain=A', status )
+ p1(1) = 100
+ p1(2) = 200
+ p1(3) = 300
+ p2(1) = 0
+ p2(2) = 400
+ p2(3) = 250
+ box1 = ast_box( frm1, 0, p1, p2, AST__NULL, 'closed=1', status )
+
+ frm2 = ast_frame( 3, 'Domain=B', status )
+ box2 = ast_box( frm2, 0, p1, p2, AST__NULL, 'closed=0', status )
+
+ if( ast_overlap( box1, box2, status ) .ne. 0 ) then
+ call stopit( status, 'ast_overlap A: result should be zero' )
+ end if
+
+ if( ast_overlap( box1, box1, status ) .ne. 5 ) then
+ call stopit( status, 'ast_overlap B: result should be 5' )
+ end if
+
+ if( ast_overlap( box2, box2, status ) .ne. 5 ) then
+ call stopit( status, 'ast_overlap C: result should be 5' )
+ end if
+
+ call ast_setc( frm2, 'Domain', 'A', status )
+ p1(1) = 100
+ p1(2) = 200
+ p1(3) = 300
+ p2(1) = -100
+ p2(2) = 600
+ p2(3) = 400
+ box2 = ast_box( frm2, 0, p1, p2, AST__NULL, ' ', status )
+
+ if( ast_overlap( box1, box2, status ) .ne. 2 ) then
+ write(*,*) 'Result is ',ast_overlap( box1, box2, status )
+ call stopit( status, 'ast_overlap D: result should be 2' )
+ end if
+
+ if( ast_overlap( box2, box1, status ) .ne. 3 ) then
+ write(*,*) 'Result is ',ast_overlap( box2, box1, status )
+ call stopit( status, 'ast_overlap E: result should be 3' )
+ end if
+
+ p1(1) = 300
+ p1(2) = 200
+ p1(3) = 300
+ p2(1) = 201
+ p2(2) = 400
+ p2(3) = 250
+ box2 = ast_box( frm2, 0, p1, p2, AST__NULL, ' ', status )
+
+ if( ast_overlap( box1, box2, status ) .ne. 1 ) then
+ call stopit( status, 'ast_overlap F: result should be 1' )
+ end if
+
+ if( ast_overlap( box2, box1, status ) .ne. 1 ) then
+ call stopit( status, 'ast_overlap G: result should be 1' )
+ end if
+
+ p1(1) = 150
+ p1(2) = 200
+ p1(3) = 300
+ p2(1) = 50
+ p2(2) = 400
+ p2(3) = 250
+ box2 = ast_box( frm2, 0, p1, p2, AST__NULL, ' ', status )
+
+ if( ast_overlap( box1, box2, status ) .ne. 4 ) then
+ call stopit( status, 'ast_overlap H: result should be 4' )
+ end if
+
+ if( ast_overlap( box2, box1, status ) .ne. 4 ) then
+ call stopit( status, 'ast_overlap I: result should be 4' )
+ end if
+
+
+* Pixel masks
+ frm1 = ast_frame( 2, 'Domain=A', status )
+ p1(1) = 1.0
+ p1(2) = 1.0
+ p2(1) = 3.1
+ p2(2) = 4.1
+ box1 = ast_box( frm1, 0, p1, p2, AST__NULL, ' ', status )
+
+ lbnd_in(1) = 1
+ lbnd_in(2) = 1
+ ubnd_in(1) = 5
+ ubnd_in(2) = 5
+
+ do i =1, 5
+ do j = 1, 5
+ rin( j,i)=1.0
+ end do
+ end do
+
+ res = ast_maskr( box1, AST__NULL, .false., 2, lbnd_in, ubnd_in,
+ : rin, VAL__BADR, status )
+
+ if( res .ne. 13 ) then
+ write(*,*) 'Res is ',res
+ call stopit( status, 'res should be 13' )
+ end if
+
+ do i =1, 5
+ do j = 1, 5
+ if( j .le. 3 .and. i .le. 4 ) then
+ if( rin(j,i) .NE. 1.0 ) then
+ write(*,*) 'rin(',j,',',i,') = ',rin(j,i)
+ call stopit( status, 'Above value should be 1.0' )
+ end if
+ else
+ if( rin(j,i) .NE. VAL__BADR ) then
+ write(*,*) 'rin(',j,',',i,') = ',rin(j,i)
+ call stopit( status, 'Above value should be '//
+ : 'VAL__BADR' )
+ end if
+ endif
+ end do
+ end do
+
+ cards(3) = 'CRPIX1 = 20'
+ cards(4) = 'CRPIX2 = 20'
+ cards(5) = 'CRVAL1 = 0.0'
+ cards(6) = 'CRVAL2 = 0.0'
+ cards(7) = ' '
+ cards(8) = 'CDELT1 = 1.6'
+ cards(9) = 'CDELT2 = 1.6'
+
+ fc = ast_fitschan( ast_null, ast_null, ' ', status )
+ do i = 1, 9
+ call ast_putfits( fc, cards(i), .false., status )
+ end do
+ call ast_clear( fc, 'card', status )
+ fs = ast_read( fc, status )
+
+ p1( 1 ) = 0.13089969 ! RA at centre = 0h30m
+ p1( 2 ) = 0.17453293 ! Dec at centre = 10d
+ p2( 1 ) = -0.13089971 ! RA at corner = 23h30m
+ p2( 2 ) = -0.17453293 ! Dec at corner = -10d
+
+ box1 = ast_box( fs, 0, p1, p2, AST__NULL, ' ', status )
+
+ do i =1, 50
+ do j = 1, 50
+ image( j,i)=1.0
+ end do
+ end do
+
+ lbnd_in(1) = 1
+ lbnd_in(2) = 1
+ ubnd_in(1) = 50
+ ubnd_in(2) = 50
+
+ call ast_negate( box1, status )
+ call ast_invert( fs, status )
+ res = ast_maskr( box1, fs, .false., 2, lbnd_in, ubnd_in,
+ : image, VAL__BADR, status )
+
+ if( res .ne. 522 ) then
+ write(*,*) 'Res is ',res
+ call stopit( status, 'res should be 522' )
+ end if
+
+ if( image(34,42) .ne. VAL__BADR ) then
+ write(*,*) 'image(34,42) = ',image(34,42)
+ call stopit( status, 'Above value should be VAL__BADR' )
+ end if
+
+ if( image(33,42) .ne. 1.0 ) then
+ write(*,*) 'image(33,42) = ',image(33,42)
+ call stopit( status, 'Above value should be 1.0' )
+ end if
+
+ if( image(16,14) .ne. VAL__BADR ) then
+ write(*,*) 'image(16,14) = ',image(16,14)
+ call stopit( status, 'Above value should be VAL__BADR' )
+ end if
+
+ if( image(15,13) .ne. 1.0 ) then
+ write(*,*) 'image(15,13) = ',image(15,13)
+ call stopit( status, 'Above value should be 1.0' )
+ end if
+
+
+* Changing the number of axes in the Region
+
+ frm1 = ast_frame( 2, 'Domain=A', status )
+
+ p1(1) = 0.0
+ p1(2) = 0.0
+ p2(1) = 0.01
+ unc = ast_circle( frm1, 1, p1, p2, AST__NULL, ' ', status )
+
+ p1(1) = -1.0
+ p1(2) = 1.0
+ p2(1) = -2.0
+ p2(2) = 1.5
+ box1 = ast_box( frm1, 0, p1, p2, unc, ' ', status )
+
+
+ outperm(1) = 2
+ outperm(2) = -1
+ outperm(3) = 1
+
+ inperm(1) = 3
+ inperm(2) = 1
+
+ pm = ast_permmap( 2, inperm, 3, outperm, 0.0D0, ' ', status )
+
+ frm2 = ast_frame( 3, 'Domain=B', status )
+ reg = ast_mapregion( box1, pm, frm2, status )
+
+ if( .not. ast_isabox( reg, status ) ) call stopit( status,
+ : 'Box: perm check 1' )
+ if( hasFrameSet( reg, status ) ) call stopit( status,
+ : 'Box: perm check 2' )
+ if( ast_geti( reg, 'naxes', status ) .ne. 3 ) call stopit( status,
+ : 'Box: perm check 3' )
+
+ in( 1, 1 ) = 0.0 ! Outside
+ in( 1, 2 ) = 0.0
+ in( 1, 3 ) = 0.0
+ in( 2, 1 ) = 0.7 ! Inside
+ in( 2, 2 ) = 0.0
+ in( 2, 3 ) = -0.5
+ in( 3, 1 ) = 2.0 ! Outside
+ in( 3, 2 ) = 0.0
+ in( 3, 3 ) = -1.0
+ in( 4, 1 ) = 1.5 ! Boundary
+ in( 4, 2 ) = 0.0
+ in( 4, 3 ) = 0.0
+
+ call ast_trann( reg, 4, 3, 4, in, .true., 3, 4, out, status )
+
+ if( out( 1, 1 ) .ne. AST__BAD ) call stopit( status, 'box: pc 1' )
+ if( out( 1, 2 ) .ne. AST__BAD ) call stopit( status, 'box: pc 2' )
+ if( out( 1, 3 ) .ne. AST__BAD ) call stopit( status, 'box: pc 3' )
+
+ if( out( 2, 1 ) .ne. in( 2,1 )) call stopit( status, 'box: pc 4' )
+ if( out( 2, 2 ) .ne. in( 2,2 )) call stopit( status, 'box: pc 5' )
+ if( out( 2, 3 ) .ne. in( 2,3 )) call stopit( status, 'box: pc 6' )
+
+ if( out( 3, 1 ) .ne. AST__BAD ) call stopit( status, 'box: pc 7' )
+ if( out( 3, 2 ) .ne. AST__BAD ) call stopit( status, 'box: pc 8' )
+ if( out( 3, 3 ) .ne. AST__BAD ) call stopit( status, 'box: pc 9' )
+
+ if( out( 4, 1 ) .ne. in( 4,1 )) call stopit( status, 'box: pc 10')
+ if( out( 4, 2 ) .ne. in( 4,2 )) call stopit( status, 'box: pc 11')
+ if( out( 4, 3 ) .ne. in( 4,3 )) call stopit( status, 'box: pc 12')
+
+
+ outperm(1) = 2
+ outperm(2) = -1
+ outperm(3) = 1
+
+ inperm(1) = 3
+ inperm(2) = 1
+
+ pm = ast_permmap( 2, inperm, 3, outperm, 1.0D0, ' ', status )
+
+ frm2 = ast_frame( 3, 'Domain=B', status )
+ reg = ast_mapregion( box1, pm, frm2, status )
+
+ if( .not. ast_isabox( reg, status ) ) call stopit( status,
+ : 'Box: perm check 4' )
+ if( hasFrameSet( reg, status ) ) call stopit( status,
+ : 'Box: perm check 5' )
+ if( ast_geti( reg, 'naxes', status ) .ne. 3 ) call stopit( status,
+ : 'Box: perm check 6' )
+
+ in( 1, 1 ) = 0.0 ! Outside
+ in( 1, 2 ) = 0.0
+ in( 1, 3 ) = 0.0
+ in( 2, 1 ) = 0.7 ! boundary
+ in( 2, 2 ) = 1.0
+ in( 2, 3 ) = -0.5
+ in( 3, 1 ) = 0.7 ! outside
+ in( 3, 2 ) = 1.1
+ in( 3, 3 ) = -0.5
+ in( 4, 1 ) = 0.7 ! outside
+ in( 4, 2 ) = 0.9
+ in( 4, 3 ) = -0.5
+
+ call ast_trann( reg, 4, 3, 4, in, .true., 3, 4, out, status )
+
+ if( out( 1, 1 ) .ne. AST__BAD ) call stopit( status, 'box: pc 11')
+ if( out( 1, 2 ) .ne. AST__BAD ) call stopit( status, 'box: pc 12')
+ if( out( 1, 3 ) .ne. AST__BAD ) call stopit( status, 'box: pc 13')
+
+ if( out( 2, 1 ) .ne. in( 2,1 )) call stopit( status, 'box: pc 14')
+ if( out( 2, 2 ) .ne. in( 2,2 )) call stopit( status, 'box: pc 15')
+ if( out( 2, 3 ) .ne. in( 2,3 )) call stopit( status, 'box: pc 16')
+
+ if( out( 3, 1 ) .ne. AST__BAD ) call stopit( status, 'box: pc 17')
+ if( out( 3, 2 ) .ne. AST__BAD ) call stopit( status, 'box: pc 18')
+ if( out( 3, 3 ) .ne. AST__BAD ) call stopit( status, 'box: pc 19')
+
+ if( out( 4, 1 ) .ne. AST__BAD ) call stopit( status, 'box: pc 17')
+ if( out( 4, 2 ) .ne. AST__BAD ) call stopit( status, 'box: pc 18')
+ if( out( 4, 3 ) .ne. AST__BAD ) call stopit( status, 'box: pc 19')
+
+
+
+ outperm(1) = 1
+
+ inperm(1) = 1
+ inperm(2) = -1
+
+ pm = ast_permmap( 2, inperm, 1, outperm, 1.4D0, ' ', status )
+
+ frm2 = ast_frame( 1, 'Domain=B', status )
+ reg = ast_mapregion( box1, pm, frm2, status )
+
+ if( .not. ast_isabox( reg, status ) ) call stopit( status,
+ : 'Box: perm check 7' )
+ if( hasFrameSet( reg, status ) ) call stopit( status,
+ : 'Box: perm check 8' )
+ if( ast_geti( reg, 'naxes', status ) .ne. 1 ) call stopit( status,
+ : 'Box: perm check 9' )
+
+ xin( 1 ) = -2.5 ! Outside
+ xin( 2 ) = -1.9 ! Inside
+ xin( 3 ) = 0.0 ! boundary
+ xin( 4 ) = 0.5 ! outside
+
+ call ast_tran1( reg, 4, xin, .true., xout, status )
+
+ if( xout( 1 ) .ne. AST__BAD ) call stopit( status, 'box: pc 20')
+ if( xout( 2 ) .ne. xin(2) ) call stopit( status, 'box: pc 21')
+ if( xout( 3 ) .ne. xin(3) ) call stopit( status, 'box: pc 22')
+ if( xout( 4 ) .ne. AST__BAD ) call stopit( status, 'box: pc 23')
+
+
+
+ outperm(1) = 1
+
+ inperm(1) = 1
+ inperm(2) = -1
+
+ pm = ast_permmap( 2, inperm, 1, outperm, 1.6D0, ' ', status )
+ frm2 = ast_frame( 1, 'Domain=B', status )
+ reg = ast_mapregion( box1, pm, frm2, status )
+ if( .not. ast_isanullregion( reg, status ) ) call stopit( status,
+ : 'Box: perm check 10' )
+
+
+ if( hasFrameSet( reg, status ) ) call stopit( status,
+ : 'Box: perm check 11' )
+ if( ast_geti( reg, 'naxes', status ) .ne. 1 ) call stopit( status,
+ : 'Box: perm check 12' )
+
+ xin( 1 ) = -2.5
+ xin( 2 ) = -1.9
+ xin( 3 ) = 0.0
+ xin( 4 ) = 0.5
+
+ call ast_tran1( reg, 4, xin, .true., xout, status )
+
+ if( xout( 1 ) .ne. AST__BAD ) call stopit( status, 'box: pc 24')
+ if( xout( 2 ) .ne. AST__BAD ) call stopit( status, 'box: pc 25')
+ if( xout( 3 ) .ne. AST__BAD ) call stopit( status, 'box: pc 26')
+ if( xout( 4 ) .ne. AST__BAD ) call stopit( status, 'box: pc 27')
+
+
+ frm1 = ast_frame( 3, 'Domain=A', status )
+
+ p1(1) = 0.5
+ p1(2) = -1.0
+ p1(3) = -2.0
+ p2(1) = 30.0
+ p2(2) = 5.0
+ p2(3) = 0.0
+
+ box1 = ast_box( frm1, 1, p1, p2, AST__NULL, ' ', status )
+
+ outperm(1) = 1
+ outperm(2) = 3
+
+ inperm(1) = 1
+ inperm(2) = -1
+ inperm(3) = 2
+
+ pm = ast_permmap( 3, inperm, 2, outperm, 1.0D0, ' ', status )
+
+ frm2 = ast_frame( 2, 'Domain=B', status )
+ reg = ast_mapregion( box1, pm, frm2, status )
+
+ if( .not. ast_isabox( reg, status ) ) call stopit( status,
+ : 'Box: perm check 13' )
+
+ if( hasFrameSet( reg, status ) ) call stopit( status,
+ : 'Box: perm check 14' )
+ if( ast_geti( reg, 'naxes', status ) .ne. 2 ) call stopit( status,
+ : 'Box: perm check 15' )
+
+ xin( 1 ) = 0.4 ! Out
+ yin( 1 ) = -1.0
+ xin( 2 ) = 1.0 ! Out
+ yin( 2 ) = 0.1
+ xin( 3 ) = 1.0 ! Out
+ yin( 3 ) = -2.1
+ xin( 4 ) = 0.5 ! Boundary
+ yin( 4 ) = -1.0
+ xin( 5 ) = 10.0 ! In
+ yin( 5 ) = -0.1
+ xin( 6 ) = 0.55 ! Boundary
+ yin( 6 ) = -2.0
+
+
+ call ast_tran2( reg, 6, xin, yin, .true., xout, yout, status )
+
+ if( xout( 1 ) .ne. AST__BAD ) call stopit( status, 'Box: pc 37')
+ if( yout( 1 ) .ne. AST__BAD ) call stopit( status, 'Box: pc 38')
+ if( xout( 2 ) .ne. AST__BAD ) call stopit( status, 'Box: pc 39')
+ if( yout( 2 ) .ne. AST__BAD ) call stopit( status, 'Box: pc 40')
+ if( xout( 3 ) .ne. AST__BAD ) call stopit( status, 'Box: pc 41')
+ if( yout( 3 ) .ne. AST__BAD ) call stopit( status, 'Box: pc 42')
+ if( xout( 4 ) .ne. xin( 4 ) ) call stopit( status, 'Box: pc 43')
+ if( yout( 4 ) .ne. yin( 4 ) ) call stopit( status, 'Box: pc 44')
+ if( xout( 5 ) .ne. xin( 5 ) ) call stopit( status, 'Box: pc 45')
+ if( yout( 5 ) .ne. yin( 5 ) ) call stopit( status, 'Box: pc 46')
+ if( xout( 6 ) .ne. xin( 6 ) ) call stopit( status, 'Box: pc 47')
+ if( yout( 6 ) .ne. yin( 6 ) ) call stopit( status, 'Box: pc 48')
+
+ cards(1) = 'CTYPE1 = ''RA---TAN'''
+ cards(2) = 'CTYPE2 = ''DEC--TAN'''
+ cards(3) = 'CRPIX1 = 20'
+ cards(4) = 'CRPIX2 = 20'
+ cards(5) = 'CRVAL1 = 0.0'
+ cards(6) = 'CRVAL2 = 0.0'
+ cards(7) = 'CROTA1 = 30.0'
+ cards(8) = 'CDELT1 = -0.00001'
+ cards(9) = 'CDELT2 = 0.00001'
+
+ fc = ast_fitschan( ast_null, ast_null, ' ', status )
+ do i = 1, 9
+ call ast_putfits( fc, cards(i), .false., status )
+ end do
+ call ast_clear( fc, 'card', status )
+ fs = ast_read( fc, status )
+
+ bfrm = ast_getFrame( fs, AST__BASE, status )
+
+ p1(1) = 0.0
+ p1(2) = 0.0
+ p2(1) = 0.1
+ unc = ast_circle( bfrm, 1, p1, p2, AST__NULL, ' ', status )
+
+ p1( 1 ) = 100.0 ! Pix_X at centre
+ p1( 2 ) = 150.0 ! Pix_Y at centre
+ p2( 1 ) = 150.0 ! Pix_X at corner
+ p2( 2 ) = 170.0 ! Pix_Y at corner
+
+ box1 = ast_box( bfrm, 0, p1, p2, AST__NULL, ' ', status )
+
+
+ call ast_getregionmesh( box1, .false., 250, 2, npoint, grid,
+ : status )
+
+ if( npoint .ne. 176 ) then
+ write(*,*) npoint
+ call stopit( status, 'Box: Error mesh 3' )
+ endif
+
+ if( status .ne. SAI__OK ) go to 991
+
+ do i = 1, npoint
+ if( abs( grid(i,1) - 100 ) .gt. 50.0D0 ) then
+ call stopit( status, 'Box: Error mesh 1' )
+ else if( abs( grid(i,2) - 150 ) .gt. 20.0D0 ) then
+ call stopit( status, 'Box: Error mesh 2' )
+ endif
+ enddo
+
+ call ast_getregionmesh( box1, .true., 250, 2, npoint, grid,
+ : status )
+ if( npoint .ne. 198 )
+ : call stopit( status, 'Box: Error mesh 4' )
+
+ if( status .ne. SAI__OK ) go to 991
+
+ do i = 1, npoint
+ if( grid(i,1) .ne. 50.0D0 .and. grid(i,1) .ne. 150.0D0 .and.
+ : grid(i,2) .ne. 130.0D0 .and. grid(i,2) .ne. 170.0D0 ) then
+ call stopit( status, 'Box: Error mesh 5' )
+ endif
+ enddo
+
+ cfrm = ast_getFrame( fs, AST__CURRENT, status )
+ map = ast_getmapping( fs, AST__BASE, AST__CURRENT, status )
+ reg1 = ast_mapregion( box1, map, cfrm, status )
+
+ if( hasFrameSet( reg1, status ) ) call stopit( status,
+ : 'Box: poly simp 1' )
+ if( .not. ast_isapolygon( reg1, status) ) call stopit( status,
+ : 'Box: poly simp 2' )
+
+ 991 continue
+
+ call ast_end( status )
+ if( status .ne. sai__ok ) write(*,*) 'Box tests failed'
+
+ end
+
+
+ subroutine stopit( status, text )
+ implicit none
+ include 'SAE_PAR'
+ integer status
+ character text*(*)
+
+ if( status .ne. sai__ok ) return
+ status = sai__error
+ write(*,*) text
+
+ end
+
+
+
+ logical function hasframeset( reg, status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ integer reg, status, ch,nw
+
+ logical fsfound, done
+ common /sink1com/ fsfound, done
+ external sink1
+
+ hasframeset = .false.
+ if( status .ne. sai__ok ) return
+
+
+ fsfound = .false.
+ done = .false.
+ ch = ast_channel( AST_NULL, sink1, ' ', STATUS )
+ nw = ast_write( ch, reg, status )
+ call ast_annul( ch, status )
+
+ hasframeset = fsfound
+
+ end
+
+ subroutine sink1( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+
+ logical fsfound, done
+ common /sink1com/ fsfound, done
+
+ integer status, l
+ character line*200
+
+ if( status .ne. sai__ok ) return
+ call ast_getline( line, l, status )
+
+ if( index( line( : l ),'Unc =' ) .GT. 0 ) then
+ done = .true.
+
+ else if( .not. done .and.
+ : index( line( : l ),'FrameSet' ) .GT. 0 ) then
+ fsfound= .true.
+ end if
+
+ end
+
+
+
+ subroutine checkPointList( status )
+ implicit none
+ include 'AST_PAR'
+ include 'SAE_PAR'
+
+ character fwd(1)*30,inv(1)*30
+ integer status, frm, reg, reg2, reg3, reg4, mm, map
+ integer mdata(-1:15),lbnd,ubnd,nbad,unc
+ double precision pnts( 3 ), xin(3),xout(3), acc, ina, inb, outa,
+ : outb
+ data mdata /17*0/
+
+ if( status .ne.sai__ok ) return
+
+ call ast_begin( status )
+ frm = ast_specframe( ' ', status )
+
+ pnts(1)=0.0
+ pnts(2)=1.0E-5
+ unc = ast_box( frm, 0, pnts(1), pnts(2), AST__NULL, ' ', status )
+
+ pnts(1)=1.0
+ pnts(2)=1.1
+ reg = ast_pointlist( frm, 2, 1, 3, pnts, unc, ' ', status )
+ call checkdump( reg, 'checkdump reg', status )
+
+ if( ast_overlap( reg, reg, status ) .ne. 5 ) then
+ call stopit( status,
+ : 'PointList: self is not identical with self' )
+ end if
+
+ reg2 = ast_copy( reg, status )
+ call ast_negate( reg2, status )
+ call checkdump( reg2, 'checkdump reg2', status )
+
+ if( ast_overlap( reg, reg2, status ) .ne. 6 ) then
+ call stopit( status,
+ : 'PointList: overlap with self-exclusion' )
+ end if
+
+
+ xin( 1 ) = 1.0
+ xin( 2 ) = 1.05
+ xin( 3 ) = 1.1
+ call ast_tran1( reg, 3, xin, .true., xout, status )
+
+ if( xout( 1 ) .ne. 1.0 ) then
+ call stopit( status, 'PointList: Error 1' )
+ else if( xout( 2 ) .ne. AST__BAD ) then
+ call stopit( status, 'PointList: Error 2' )
+ else if( xout( 3 ) .ne. 1.1 ) then
+ call stopit( status, 'PointList: Error 3' )
+ end if
+
+
+ call ast_tran1( reg2, 3, xin, .true., xout, status )
+ if( xout( 1 ) .ne. AST__BAD ) then
+ call stopit( status, 'PointList: Error 4' )
+ else if( xout( 2 ) .ne. 1.05 ) then
+ call stopit( status, 'PointList: Error 5' )
+ else if( xout( 3 ) .ne. AST__BAD ) then
+ call stopit( status, 'PointList: Error 6' )
+ end if
+
+ fwd(1) = 'y=x**2'
+ inv(1) = 'x=y**0.5'
+ mm = ast_mathmap( 1, 1, 1, fwd, 1, inv, ' ', status )
+ reg3 = ast_mapregion( reg, mm, ast_frame(1,' ', status ), status )
+ reg4 = ast_simplify( reg3, status )
+ call checkdump( reg4, 'checkdump reg4', status )
+
+ xin( 1 ) = 1.21
+ xin( 2 ) = 1.5
+ call ast_tran1( reg4, 2, xin, .true., xout, status )
+ if( xout( 1 ) .ne. 1.21 ) then
+ write(*,*) xout(1), ' (should be 1.21)'
+ call stopit( status, 'PointList: Error 7' )
+ else if( xout( 2 ) .ne. AST__BAD ) then
+ write(*,*) xout(2), ' (should be bad)'
+ call stopit( status, 'PointList: Error 8' )
+ end if
+
+
+ lbnd = -1
+ ubnd = 15
+
+ ina = 1.01
+ inb = 1.11
+ outa = 2.0
+ outb = 7.0
+ map = ast_winmap( 1, ina, inb, outa, outb, ' ', status )
+
+ nbad = ast_maski( reg, map, .true., 1, lbnd, ubnd, mdata, 2,
+ : status )
+
+ if( nbad .ne. 2 ) then
+ write(*,*) 'nbad = ',nbad
+ call stopit( status, 'Above value should be 2' )
+ end if
+
+ if( mdata(1) .ne. 0 ) then
+ write(*,*) 'mdata(1) = ',mdata(1)
+ call stopit( status, 'Above value should be 0' )
+ end if
+
+ if( mdata(2) .ne. 2 ) then
+ write(*,*) 'mdata(2) = ',mdata(2)
+ call stopit( status, 'Above value should be 2' )
+ end if
+
+ if( mdata(3) .ne. 0 ) then
+ write(*,*) 'mdata(3) = ',mdata(3)
+ call stopit( status, 'Above value should be 0' )
+ end if
+
+ if( mdata(6) .ne. 0 ) then
+ write(*,*) 'mdata(6) = ',mdata(6)
+ call stopit( status, 'Above value should be 0' )
+ end if
+
+ if( mdata(7) .ne. 2 ) then
+ write(*,*) 'mdata(7) = ',mdata(7)
+ call stopit( status, 'Above value should be 2' )
+ end if
+
+ if( mdata(8) .ne. 0 ) then
+ write(*,*) 'mdata(8) = ',mdata(8)
+ call stopit( status, 'Above value should be 0' )
+ end if
+
+
+
+
+ call ast_end( status )
+ if( status .ne. sai__ok ) write(*,*) 'PointList tests failed'
+
+ end
+
+
+
+
+
+
+
+
+ subroutine checkCircle( status )
+ implicit none
+ include 'AST_PAR'
+ include 'SAE_PAR'
+
+ integer status, cir1, cir2, fc, i, fs, frm1,unc,f1,f2,f3,
+ : npoint, j
+ double precision p1(4),p2(4),xin(2),yin(2),xout(2),yout(2),
+ : p3(3),rad,zin(2),zout(2),pp1(3),pp2(3),
+ : lbnd(2),ubnd(2), mesh(250,3)
+ character cards(8)*80, sys*40
+ logical hasframeset
+
+ double precision in( 2, 3 ), out( 2, 3 )
+
+
+ data cards /'CTYPE1 = ''RA---TAN''',
+ : 'CTYPE2 = ''DEC--TAN''',
+ : 'CRPIX1 = 100',
+ : 'CRPIX2 = 100',
+ : 'CRVAL1 = 70.0',
+ : 'CRVAL2 = 80.0',
+ : 'CDELT1 = 0.6',
+ : 'CDELT2 = 0.6' /
+
+
+ if( status .ne.sai__ok ) return
+ call ast_begin( status )
+
+* Test 2D circles.
+
+ fc = ast_fitschan( ast_null, ast_null, ' ', status )
+ do i = 1, 8
+ call ast_putfits( fc, cards(i), .false., status )
+ end do
+ call ast_clear( fc, 'card', status )
+ fs = ast_read( fc, status )
+
+ frm1 = ast_getframe( fs, ast__current, status )
+
+ p1( 1 ) = 0.0
+ p1( 2 ) = 1.0
+ p2( 1 ) = 0.01
+
+ cir1 = ast_circle( frm1, 1, p1, p2, AST__NULL, ' ', status )
+ call ast_getregionbounds( cir1, lbnd, ubnd, status )
+
+ if( abs(lbnd(1)-(-0.01850666061475259)) .gt. 1.0E-6 )
+ : call stopit( status, 'Circle: Error AA1' )
+ if( abs(lbnd(2)-(0.9900000002235173)) .gt. 1.0E-6 )
+ : call stopit( status, 'Circle: Error AA2' )
+ if( abs(ubnd(1)-(0.01850666061475276)) .gt. 1.0E-6 )
+ : call stopit( status, 'Circle: Error AA3' )
+ if( abs(ubnd(2)-(1.009994987166073)) .gt. 1.0E-6 )
+ : call stopit( status, 'Circle: Error AA4' )
+
+ p1( 1 ) = 0.0
+ p1( 2 ) = 1.57
+ p2( 1 ) = 0.01
+
+ cir1 = ast_circle( frm1, 1, p1, p2, AST__NULL, ' ', status )
+ call ast_getregionbounds( cir1, lbnd, ubnd, status )
+
+ if( abs(lbnd(1)-(0.0)) .gt. 1.0E-6 )
+ : call stopit( status, 'Circle: Error AA5' )
+ if( abs(lbnd(2)-(1.560000052675599)) .gt. 1.0E-6 )
+ : call stopit( status, 'Circle: Error AA6' )
+ if( abs(ubnd(1)-(6.283185307179586)) .gt. 1.0E-6 )
+ : call stopit( status, 'Circle: Error AA7' )
+ if( abs(ubnd(2)-(1.5707963267948966)) .gt. 1.0E-6 )
+ : call stopit( status, 'Circle: Error AA8' )
+
+ call ast_getregionmesh( cir1, .true., 0, 0, npoint, 0, status )
+ if( npoint .ne. 200 )
+ : call stopit( status, 'Circle: Error mesh 1' )
+
+ call ast_getregionmesh( cir1, .true., 250, 3, npoint, mesh,
+ : status )
+
+ do i = 1, npoint
+ p2(1) = mesh(i,1)
+ p2(2) = mesh(i,2)
+ if( abs( ast_distance( frm1, p1, p2, status ) - 0.01 ) .gt.
+ : 1.0E-6 ) call stopit( status, 'Circle: Error mesh 2' )
+ enddo
+
+ call ast_getregionmesh( cir1, .false., 250, 3, npoint, mesh,
+ : status )
+
+ if( npoint .ne. 201 ) then
+ write(*,*) npoint
+ call stopit( status, 'Circle: Error mesh 3' )
+ endif
+
+ do i = 1, npoint
+ p2(1) = mesh(i,1)
+ p2(2) = mesh(i,2)
+ if( ast_distance( frm1, p1, p2, status ) .gt. 0.01 )
+ : call stopit( status, 'Circle: Error mesh 4' )
+ enddo
+
+ p1( 1 ) = 1.2217305
+ p1( 2 ) = 1.3962634
+ p2( 1 ) = 0.8
+ p2( 2 ) = 0.8
+
+ cir1 = ast_circle( frm1, 0, p1, p2, AST__NULL, ' ', status )
+ call checkdump( cir1, 'checkdump cir1', status )
+
+ rad = ast_distance( cir1, p1, p2, status )
+
+ call ast_offset( frm1, p1, p2, rad*0.999, p3, status )
+ xin(1) = p3(1)
+ yin(1) = p3(2)
+ call ast_offset( frm1, p1, p2, rad*1.001, p3, status )
+ xin(2) = p3(1)
+ yin(2) = p3(2)
+
+ call ast_tran2( cir1, 2, xin, yin, .true., xout, yout, status )
+ if( xout(1) .ne. xin(1) ) call stopit( status, 'Circle: Error 1' )
+ if( yout(1) .ne. yin(1) ) call stopit( status, 'Circle: Error 2' )
+ if( xout(2) .ne. AST__BAD ) call stopit( status,
+ : 'Circle: Error 3' )
+ if( yout(2) .ne. AST__BAD ) call stopit( status,
+ : 'Circle: Error 4' )
+
+
+ xin(1) = 0.0
+ yin(1) = 1.5707963
+ call ast_tran2( cir1, 1, xin, yin, .true., xout, yout, status )
+ if( xout(1) .ne. xin(1) ) call stopit( status, 'Circle: Error 1b')
+ if( yout(1) .ne. yin(1) ) call stopit( status, 'Circle: Error 2b')
+
+ p2(1)=0.0
+ p2(2)=0.0
+ call ast_offset( frm1, p1, p2, rad*0.999, p3, status )
+ xin(1) = p3(1)
+ yin(1) = p3(2)
+ call ast_offset( frm1, p1, p2, rad*1.001, p3, status )
+ xin(2) = p3(1)
+ yin(2) = p3(2)
+
+ call ast_tran2( cir1, 2, xin, yin, .true., xout, yout, status )
+ if( xout(1) .ne. xin(1) ) call stopit( status, 'Circle: Error 5' )
+ if( yout(1) .ne. yin(1) ) call stopit( status, 'Circle: Error 6' )
+ if( xout(2) .ne. AST__BAD ) call stopit( status,
+ : 'Circle: Error 7' )
+ if( yout(2) .ne. AST__BAD ) call stopit( status,
+ : 'Circle: Error 8' )
+
+
+ call ast_setc( cir1, 'system', 'galactic', status )
+ cir1 = ast_simplify( cir1, status )
+ if( .not. hasframeset( cir1,status ) ) call stopit( status,
+ : 'Circle: error 9' )
+
+
+ pp1( 1 ) = 0.0
+ pp1( 2 ) = 0.0
+ pp2( 1 ) = 1.0D-6
+ pp2( 2 ) = 1.0D-6
+ unc = ast_box( frm1, 0, pp1, pp2, AST__NULL, ' ', status )
+
+ p1( 1 ) = 1.2217305
+ p1( 2 ) = 1.3962634
+ p2( 1 ) = 1.2218
+ p2( 2 ) = 1.3963
+ cir1 = ast_circle( frm1, 0, p1, p2, unc, ' ', status )
+
+ rad = ast_distance( cir1, p1, p2, status )
+
+ call ast_offset( frm1, p1, p2, rad*0.999, p3, status )
+ xin(1) = p3(1)
+ yin(1) = p3(2)
+ call ast_offset( frm1, p1, p2, rad*1.001, p3, status )
+ xin(2) = p3(1)
+ yin(2) = p3(2)
+
+ call ast_tran2( cir1, 2, xin, yin, .true., xout, yout, status )
+ if( xout(1) .ne. xin(1) ) call stopit( status, 'Circle: Error 1b')
+ if( yout(1) .ne. yin(1) ) call stopit( status, 'Circle: Error 2b')
+ if( xout(2) .ne. AST__BAD ) call stopit( status,
+ : 'Circle: Error 3b' )
+ if( yout(2) .ne. AST__BAD ) call stopit( status,
+ : 'Circle: Error 4b' )
+
+ p2(1)=0.0
+ p2(2)=0.0
+ call ast_offset( frm1, p1, p2, rad*0.999, p3, status )
+ xin(1) = p3(1)
+ yin(1) = p3(2)
+ call ast_offset( frm1, p1, p2, rad*1.001, p3, status )
+ xin(2) = p3(1)
+ yin(2) = p3(2)
+
+ call ast_tran2( cir1, 2, xin, yin, .true., xout, yout, status )
+ if( xout(1) .ne. xin(1) ) call stopit( status, 'Circle: Error 5b')
+ if( yout(1) .ne. yin(1) ) call stopit( status, 'Circle: Error 6b')
+ if( xout(2) .ne. AST__BAD ) call stopit( status,
+ : 'Circle: Error 7b' )
+ if( yout(2) .ne. AST__BAD ) call stopit( status,
+ : 'Circle: Error 8b' )
+
+ cir2 = ast_copy( cir1, status )
+ call ast_setc( cir2, 'system', 'galactic', status )
+ call checkdump( cir2, 'checkdump cir2', status )
+
+ cir2 = ast_simplify( cir2, status )
+
+ if( hasframeset( cir2,status ) ) call stopit( status,
+ : 'Circle: error 9b' )
+
+ if( ast_overlap( cir1, cir2, status ) .ne. 5 ) call stopit(status,
+ : 'Circle: Error 10' )
+ if( ast_overlap( cir2, cir1, status ) .ne. 5 ) call stopit(status,
+ : 'Circle: Error 11' )
+
+ p1( 1 ) = 1.2217305
+ p1( 2 ) = 1.3964
+ p2( 1 ) = 1.2218
+ p2( 2 ) = 1.3963
+ cir2 = ast_circle( frm1, 0, p1, p2, unc, ' ', status )
+ if( ast_overlap( cir1, cir2, status ) .ne. 4 ) call stopit(status,
+ : 'Circle: Error 12' )
+ if( ast_overlap( cir2, cir1, status ) .ne. 4 ) call stopit(status,
+ : 'Circle: Error 13' )
+
+ p1( 1 ) = 1.2217305
+ p1( 2 ) = 1.3962634
+ p2( 1 ) = 1.221731
+ p2( 2 ) = 1.396268
+ cir2 = ast_circle( frm1, 0, p1, p2, unc, ' ', status )
+ if( ast_overlap( cir1, cir2, status ) .ne. 3 ) call stopit(status,
+ : 'Circle: Error 14' )
+ if( ast_overlap( cir2, cir1, status ) .ne. 2 ) call stopit(status,
+ : 'Circle: Error 15' )
+
+ p1( 1 ) = 0.8
+ p1( 2 ) = 1.0
+ p2( 1 ) = 0.88
+ p2( 2 ) = 1.05
+ cir2 = ast_circle( frm1, 0, p1, p2, unc, ' ', status )
+ if( ast_overlap( cir1, cir2, status ) .ne. 1 ) call stopit(status,
+ : 'Circle: Error 16' )
+
+
+ p1( 1 ) = 0.8
+ p1( 2 ) = 1.5707963
+ p2( 1 ) = 0.1
+ cir2 = ast_circle( frm1, 1, p1, p2, unc, ' ', status )
+ call ast_getregionbounds( cir2, lbnd, ubnd, status )
+ if( lbnd(1) .ne. 0.0D0 ) call stopit( status,
+ : 'Circle: Error 16a' )
+ if( abs( lbnd(2) - 1.47079625 ) .gt. 1.0E-6 ) call stopit( status,
+ : 'Circle: Error 16b' )
+ if( abs( ubnd(1) - 6.28318531 ) .gt. 1.0E-6 ) call stopit( status,
+ : 'Circle: Error 16c' )
+ if( abs( ubnd(2) - 1.57079633 ) .gt. 1.0E-6 ) call stopit( status,
+ : 'Circle: Error 16d' )
+
+
+ frm1 = ast_frame(2,"domain=aa",status)
+
+ pp1( 1 ) = 0.0
+ pp1( 2 ) = 0.0
+ pp2( 1 ) = 1.0D-6
+ pp2( 2 ) = 1.0D-6
+ unc = ast_box( frm1, 0, pp1, pp2, AST__NULL, ' ', status )
+
+ p1( 1 ) = 1.2217305
+ p1( 2 ) = 1.3962634
+ p2( 1 ) = 1.2218
+ p2( 2 ) = 1.3963
+ cir2 = ast_circle( frm1, 0, p1, p2, unc, ' ', status )
+
+ if( ast_overlap( cir1, cir2, status ) .ne. 0 ) call stopit(status,
+ : 'Circle: Error 17' )
+ if( ast_overlap( cir2, cir1, status ) .ne. 0 ) call stopit(status,
+ : 'Circle: Error 18' )
+
+
+ f1 = ast_skyframe( ' ', status )
+ f2 = ast_frame( 2, ' ', status )
+ f3 = ast_cmpframe( f1, f2, ' ', status )
+
+ p1( 1 ) = 1.0
+ p1( 2 ) = 1.0
+ p1( 3 ) = 3.0
+ p1( 4 ) = 3.0
+ p2( 1 ) = 1.01
+ p2( 2 ) = 1.02
+ p2( 3 ) = 3.01
+ p2( 4 ) = 3.01
+ cir2 = ast_circle( f3, 0, p1, p2, AST__NULL, ' ', status )
+ if( ast_overlap( cir2, cir2, status ) .ne. 5 ) call stopit(status,
+ : 'Circle: Error 18b' )
+
+* Test 3D spheres
+
+ frm1 = ast_frame( 3, ' ', status )
+
+ pp1( 1 ) = 0.0
+ pp1( 2 ) = 0.0
+ pp1( 3 ) = 0.0
+ pp2( 1 ) = 1.0E-6
+ pp2( 2 ) = 2.0E-6
+ pp2( 3 ) = 2.0E-6
+ unc = ast_box( frm1, 0, pp1, pp2, AST__NULL, ' ', status )
+
+ p1( 1 ) = 1.0
+ p1( 2 ) = 2.0
+ p1( 3 ) = 3.0
+ p2( 1 ) = 0.0
+ p2( 2 ) = -1.0
+ p2( 3 ) = -2.0
+ cir1 = ast_circle( frm1, 0, p1, p2, unc, ' ', status )
+ call checkdump( cir1, 'checkdump sph1', status )
+
+ rad = ast_distance( cir1, p1, p2, status )
+
+ call ast_offset( frm1, p1, p2, rad*0.999, p3, status )
+ in(1,1) = p3(1)
+ in(1,2) = p3(2)
+ in(1,3) = p3(3)
+ call ast_offset( frm1, p1, p2, rad*1.001, p3, status )
+ in(2,1) = p3(1)
+ in(2,2) = p3(2)
+ in(2,3) = p3(3)
+
+
+ call ast_trann( cir1, 2, 3, 2, in, .true., 3, 2, out, status )
+
+ if( out(1,1) .ne. in(1,1) ) call stopit( status,
+ : 'Sphere: Error 1' )
+ if( out(1,2) .ne. in(1,2) ) call stopit( status,
+ : 'Sphere: Error 2' )
+ if( out(1,3) .ne. in(1,3) ) call stopit( status,
+ : 'Sphere: Error 2z')
+ if( out(2,1) .ne. AST__BAD ) call stopit( status,
+ : 'Sphere: Error 3' )
+ if( out(2,2) .ne. AST__BAD ) call stopit( status,
+ : 'Sphere: Error 4' )
+ if( out(2,3) .ne. AST__BAD ) call stopit( status,
+ : 'Sphere: Error 4z' )
+
+ p2(1)=0.0
+ p2(2)=0.0
+ p2(3)=0.0
+ call ast_offset( frm1, p1, p2, rad*0.999, p3, status )
+ in(1,1) = p3(1)
+ in(1,2) = p3(2)
+ in(1,3) = p3(3)
+ call ast_offset( frm1, p1, p2, rad*1.001, p3, status )
+ in(2,1) = p3(1)
+ in(2,2) = p3(2)
+ in(2,3) = p3(3)
+
+ call ast_trann( cir1, 2, 3, 2, in, .true., 3, 2, out, status )
+ if( out(1,1) .ne. in(1,1) ) call stopit( status,
+ : 'Sphere: Error 5' )
+ if( out(1,2) .ne. in(1,2) ) call stopit( status,
+ : 'Sphere: Error 6' )
+ if( out(1,3) .ne. in(1,3) ) call stopit( status,
+ : 'Sphere: Error 6z')
+ if( out(2,1) .ne. AST__BAD ) call stopit( status,
+ : 'Sphere: Error 7' )
+ if( out(2,2) .ne. AST__BAD ) call stopit( status,
+ : 'Sphere: Error 8' )
+ if( out(2,3) .ne. AST__BAD ) call stopit( status,
+ : 'Sphere: Error 8z' )
+
+
+ if( ast_overlap( cir1, cir1, status ) .ne. 5 ) call stopit(status,
+ : 'Sphere: Error 10' )
+
+
+
+
+ p1( 1 ) = 1.0
+ p1( 2 ) = 2.0
+ p1( 3 ) = 3.0
+ p2( 1 ) = 0.5
+ p2( 2 ) = 0.0
+ p2( 3 ) = -1.0
+ cir2 = ast_circle( frm1, 0, p1, p2, unc, ' ', status )
+ call checkdump( cir2, 'checkdump sph2', status )
+
+ if( ast_overlap( cir2, cir1, status ) .ne. 2 ) call stopit(status,
+ : 'Sphere: Error 11' )
+
+ if( ast_overlap( cir1, cir2, status ) .ne. 3 ) call stopit(status,
+ : 'Sphere: Error 12' )
+
+
+
+ p1( 1 ) = 1.0
+ p1( 2 ) = 0.0
+ p1( 3 ) = 3.0
+ p2( 1 ) = 0.0
+ p2( 2 ) = -1.0
+ p2( 3 ) = -2.0
+ cir2 = ast_circle( frm1, 0, p1, p2, unc, ' ', status )
+ if( ast_overlap( cir1, cir2, status ) .ne. 4 ) call stopit(status,
+ : 'Sphere: Error 13' )
+
+ p1( 1 ) = 1.0
+ p1( 2 ) = 102.0
+ p1( 3 ) = 3.0
+ p2( 1 ) = 0.0
+ p2( 2 ) = 99.0
+ p2( 3 ) = -2.0
+ cir2 = ast_circle( frm1, 0, p1, p2, unc, ' ', status )
+ if( ast_overlap( cir1, cir2, status ) .ne. 1 ) call stopit(status,
+ : 'Sphere: Error 14' )
+
+
+ p1( 1 ) = 0.0
+ p1( 2 ) = 0.0
+ p1( 3 ) = 0.0
+ p2( 1 ) = 0.0
+ p2( 2 ) = 0.0
+ p2( 3 ) = 1.0
+ cir1 = ast_circle( frm1, 0, p1, p2, unc, ' ', status )
+
+ p1( 1 ) = 2.0000001
+ p1( 2 ) = 0.0
+ p1( 3 ) = 0.0
+ p2( 1 ) = 2.000001
+ p2( 2 ) = 1.0
+ p2( 3 ) = 0.0
+ cir2 = ast_circle( frm1, 0, p1, p2, unc, ' ', status )
+
+ if( ast_overlap( cir1, cir2, status ) .ne. 4 ) then
+ write(*,*) ast_overlap( cir1, cir2, status ),' should be 4 '
+ call stopit(status, 'Sphere: Error 15' )
+ end if
+
+ p1( 1 ) = 2.000001
+ p1( 2 ) = 0.0
+ p1( 3 ) = 0.0
+ p2( 1 ) = 2.000001
+ p2( 2 ) = 1.0
+ p2( 3 ) = 0.0
+ cir2 = ast_circle( frm1, 0, p1, p2, unc, ' ', status )
+
+ if( ast_overlap( cir1, cir2, status ) .ne. 4 ) call stopit(status,
+ : 'Sphere: Error 16' )
+
+ cir2 = ast_circle( frm1, 0, p1, p2, unc, ' ', status )
+
+ call ast_setl( cir1, 'Closed', .false., status )
+ call ast_setl( cir2, 'Closed', .false., status )
+ if( ast_overlap( cir1, cir2, status ) .ne. 1 ) call stopit(status,
+ : 'Sphere: Error 17' )
+ call ast_clear( cir1, 'Closed', status )
+ call ast_clear( cir2, 'Closed', status )
+
+ p1( 1 ) = 2.000004
+ p1( 2 ) = 0.0
+ p1( 3 ) = 0.0
+ p2( 1 ) = 2.000004
+ p2( 2 ) = 1.0
+ p2( 3 ) = 0.0
+ cir2 = ast_circle( frm1, 0, p1, p2, unc, ' ', status )
+
+ if( ast_overlap( cir1, cir2, status ) .ne. 1 ) call stopit(status,
+ : 'Sphere: Error 18' )
+
+ call ast_end( status )
+ if( status .ne. sai__ok ) write(*,*) 'Circle tests failed'
+
+ end
+
+
+
+
+
+
+
+ subroutine checkEllipse( status )
+ implicit none
+ include 'AST_PAR'
+ include 'SAE_PAR'
+
+ integer status, ell1, ell2, fc, i, fs, frm1, fs2,mm,ell3,ell4,
+ : reg, unc, f1, f2, f3, f4, f5, map, perm(2)
+ double precision p1(2),p2(2),p3(2),p4(2),pp1(2),pp2(2)
+ double precision q1(2),q2(2),q3(2),q4(2),lbnd(2),ubnd(2)
+ double precision q1b(2),q2b(2),q3b(2),q4b(2)
+ double precision p1b(2),p2b(2),p3b(2),p4b(2),matrix(4)
+ character cards(10)*80
+ double precision xin(4),yin(4),xout(4),yout(4),rad
+ logical hasframeset
+
+ data cards /'NAXIS1 = 300',
+ : 'NAXIS2 = 300',
+ : 'CTYPE1 = ''RA---TAN''',
+ : 'CTYPE2 = ''DEC--TAN''',
+ : 'CRPIX1 = 100',
+ : 'CRPIX2 = 100',
+ : 'CRVAL1 = 0.0',
+ : 'CRVAL2 = 90.0',
+ : 'CDELT1 = 0.6',
+ : 'CDELT2 = 0.6' /
+
+
+ if( status .ne.sai__ok ) return
+ call ast_begin( status )
+
+ f1 = ast_SkyFrame( 'system=fk4', status )
+ f3 = ast_cmpframe( ast_pickaxes( f1, 1, 1, map, status ),
+ : ast_specframe( 'system=wave,unit=um', status ),
+ : ' ', status )
+ perm(1)=2
+ perm(2)=1
+ call ast_permaxes( f3, perm, status )
+ p1(1) = 0.0
+ p1(2) = 0.0
+ p2(1) = 0.001
+ p2(2) = 0.001
+ p3(1) = -0.001
+ p3(2) = 0.001
+ ell1 = ast_ellipse( f3, 0, p1, p2, p3, AST__NULL, ' ', status )
+
+ xin(1) = 0.0
+ yin(1) = 0.00141421
+ xin(2) = 0.0
+ yin(2) = 0.00141422
+ xin(3) = -0.000999
+ yin(3) = 0.0009999
+ xin(4) = -0.001001
+ yin(4) = 0.001001
+ call ast_tran2( ell1, 4, xin, yin, .true., xout, yout, status )
+
+ if( xout(1) .ne. xin(1) ) call stopit( status, 'Ellipse: Cmp 1')
+ if( yout(1) .ne. yin(1) ) call stopit( status, 'Ellipse: Cmp 2')
+ if( xout(2) .ne. AST__BAD ) call stopit( status,
+ : 'Ellipse: Cmp 3' )
+ if( yout(2) .ne. AST__BAD ) call stopit( status,
+ : 'Ellipse: Cmp 4' )
+ if( xout(3) .ne. xin(3) ) call stopit( status, 'Ellipse: Cmp 5')
+ if( yout(3) .ne. yin(3) ) call stopit( status, 'Ellipse: Cmp 6')
+ if( xout(4) .ne. AST__BAD ) call stopit( status,
+ : 'Ellipse: Cmp 7' )
+ if( yout(4) .ne. AST__BAD ) call stopit( status,
+ : 'Ellipse: Cmp 8' )
+
+ call checkdump( ell1, 'checkdump ell1 cmp', status )
+ ell2 = ast_simplify( ell1, status )
+ call checkdump( ell2, 'checkdump ell2 cmp', status )
+ if( ast_overlap( ell1, ell2, status ) .ne. 5 ) call stopit(status,
+ : 'ellipse: Error 5 cmp' )
+
+ fc = ast_fitschan( ast_null, ast_null, ' ', status )
+ do i = 1, 10
+ call ast_putfits( fc, cards(i), .false., status )
+ end do
+ call ast_clear( fc, 'card', status )
+ fs = ast_read( fc, status )
+
+ frm1 = ast_getframe( fs, ast__current, status )
+
+ p1( 1 ) = 1.2217305
+ p1( 2 ) = 1.570796
+ p2( 1 ) = 0.9
+ p2( 2 ) = 1.470796
+ p3( 1 ) = 2.9217305
+ p3( 2 ) = 1.370796
+
+ ell1 = ast_ellipse( frm1, 0, p1, p2, p3, AST__NULL, ' ', status )
+ call checkdump( ell1, 'checkdump ell1', status )
+
+
+ call ast_getregionbounds( ell1, lbnd, ubnd, status )
+ if( abs( lbnd(1) ) .gt. 1.0E-10 ) call stopit( status,
+ : 'Error b1' )
+ if( abs( lbnd(2) - 1.19059777 ) .gt. 1.0E-6 )
+ : call stopit( status, 'Error b2' )
+ if( abs( ubnd(1) - 6.28318531 ) .gt. 1.0E-6 )
+ : call stopit( status, 'Error b3' )
+ if( abs( ubnd(2) - 1.57079633 ) .gt. 1.0E-6 )
+ : call stopit( status, 'Error b4' )
+
+ rad = ast_distance( ell1, p1, p2, status )
+
+ call ast_offset( frm1, p1, p2, rad*0.999, p4, status )
+ xin(1) = p4(1)
+ yin(1) = p4(2)
+ call ast_offset( frm1, p1, p2, rad*1.001, p4, status )
+ xin(2) = p4(1)
+ yin(2) = p4(2)
+
+ call ast_tran2( ell1, 2, xin, yin, .true., xout, yout, status )
+ if( xout(1) .ne. xin(1) ) call stopit( status, 'Ellipse: Error 1')
+ if( yout(1) .ne. yin(1) ) call stopit( status, 'Ellipse: Error 2')
+ if( xout(2) .ne. AST__BAD ) call stopit( status,
+ : 'Ellipse: Error 3' )
+ if( yout(2) .ne. AST__BAD ) call stopit( status,
+ : 'Ellipse: Error 4' )
+
+
+ call ast_offset( frm1, p1, p2, -rad*0.999, p4, status )
+ xin(1) = p4(1)
+ yin(1) = p4(2)
+ call ast_offset( frm1, p1, p2, -rad*1.001, p4, status )
+ xin(2) = p4(1)
+ yin(2) = p4(2)
+
+ call ast_tran2( ell1, 2, xin, yin, .true., xout, yout, status )
+ if( xout(1) .ne. xin(1) ) call stopit( status,
+ : 'Ellipse: Error 1b')
+ if( yout(1) .ne. yin(1) ) call stopit( status,
+ : 'Ellipse: Error 2b')
+ if( xout(2) .ne. AST__BAD ) call stopit( status,
+ : 'Ellipse: Error 3b' )
+ if( yout(2) .ne. AST__BAD ) call stopit( status,
+ : 'Ellipse: Error 4b' )
+
+
+ rad = ast_distance( ell1, p1, p3, status )
+
+ call ast_offset( frm1, p1, p3, rad*0.999, p4, status )
+ xin(1) = p4(1)
+ yin(1) = p4(2)
+ call ast_offset( frm1, p1, p3, rad*1.001, p4, status )
+ xin(2) = p4(1)
+ yin(2) = p4(2)
+
+ call ast_tran2( ell1, 2, xin, yin, .true., xout, yout, status )
+ if( xout(1) .ne. xin(1) ) call stopit( status,
+ : 'Ellipse: Error 1c')
+ if( yout(1) .ne. yin(1) ) call stopit( status,
+ : 'Ellipse: Error 2c')
+ if( xout(2) .ne. AST__BAD ) call stopit( status,
+ : 'Ellipse: Error 3c' )
+ if( yout(2) .ne. AST__BAD ) call stopit( status,
+ : 'Ellipse: Error 4c' )
+
+ call ast_offset( frm1, p1, p3, -rad*0.999, p4, status )
+ xin(1) = p4(1)
+ yin(1) = p4(2)
+ call ast_offset( frm1, p1, p3, -rad*1.001, p4, status )
+ xin(2) = p4(1)
+ yin(2) = p4(2)
+
+ call ast_tran2( ell1, 2, xin, yin, .true., xout, yout, status )
+ if( xout(1) .ne. xin(1) ) call stopit( status,
+ : 'Ellipse: Error 1d')
+ if( yout(1) .ne. yin(1) ) call stopit( status,
+ : 'Ellipse: Error 2d')
+ if( xout(2) .ne. AST__BAD ) call stopit( status,
+ : 'Ellipse: Error 3d' )
+ if( yout(2) .ne. AST__BAD ) call stopit( status,
+ : 'Ellipse: Error 4d' )
+
+
+ ell2 = ast_copy( ell1, status )
+
+ if( ast_overlap( ell1, ell2, status ) .ne. 5 ) call stopit(status,
+ : 'ellipse: Error 5' )
+ if( ast_overlap( ell2, ell1, status ) .ne. 5 ) call stopit(status,
+ : 'ellipse: Error 6' )
+
+ call ast_set( ell2, 'system=galactic', status )
+ if( ast_overlap( ell1, ell2, status ) .ne. 5 ) call stopit(status,
+ : 'ellipse: Error 7' )
+ if( ast_overlap( ell2, ell1, status ) .ne. 5 ) call stopit(status,
+ : 'ellipse: Error 8' )
+
+
+
+
+ xin(1) = p1( 1 )
+ yin(1) = p1( 2 )
+ xin(2) = p2( 1 )
+ yin(2) = p2( 2 )
+ xin(3) = p3( 1 )
+ yin(3) = p3( 2 )
+ call ast_tran2( fs, 3, xin, yin, .false., xout, yout, status )
+ q1(1) = xout(1)
+ q1(2) = yout(1)
+ q2(1) = xout(2)
+ q2(2) = yout(2)
+ q3(1) = xout(3)
+ q3(2) = yout(3)
+
+ frm1 = ast_GetFrame( fs, AST__BASE, status )
+
+ rad = ast_distance( frm1, q1, q2, status )
+
+ call ast_offset( frm1, q1, q2, rad*1.95, q1b, status )
+
+ q2b( 1 ) = q2( 1 ) + ( q1b( 1 ) - q1( 1 ) )
+ q2b( 2 ) = q2( 2 ) + ( q1b( 2 ) - q1( 2 ) )
+
+ q3b( 1 ) = q3( 1 ) + ( q1b( 1 ) - q1( 1 ) )
+ q3b( 2 ) = q3( 2 ) + ( q1b( 2 ) - q1( 2 ) )
+
+ xout(1) = q1b(1)
+ yout(1) = q1b(2)
+ xout(2) = q2b(1)
+ yout(2) = q2b(2)
+ xout(3) = q3b(1)
+ yout(3) = q3b(2)
+ call ast_tran2( fs, 3, xout, yout, .true., xin, yin, status )
+ p1b( 1 ) = xin(1)
+ p1b( 2 ) = yin(1)
+ p2b( 1 ) = xin(2)
+ p2b( 2 ) = yin(2)
+ p3b( 1 ) = xin(3)
+ p3b( 2 ) = yin(3)
+
+ frm1 = ast_GetFrame( fs, AST__CURRENT, status )
+
+ pp1( 1 ) = 0.0
+ pp1( 2 ) = 0.0
+ pp2( 1 ) = 1.0D-7
+ pp2( 2 ) = 1.0D-7
+ unc = ast_box( frm1, 0, pp1, pp2, AST__NULL, ' ', status )
+ ell2 = ast_ellipse( frm1, 0, p1b, p2b, p3b, unc, ' ', status )
+ if( ast_overlap( ell2, ell1, status ) .ne. 4 ) call stopit(status,
+ : 'ellipse: Error 9' )
+ if( ast_overlap( ell1, ell2, status ) .ne. 4 ) call stopit(status,
+ : 'ellipse: Error 10' )
+
+
+ call ast_offset( frm1, q1, q2, rad*2.05, q1b, status )
+
+ q2b( 1 ) = q2( 1 ) + ( q1b( 1 ) - q1( 1 ) )
+ q2b( 2 ) = q2( 2 ) + ( q1b( 2 ) - q1( 2 ) )
+
+ q3b( 1 ) = q3( 1 ) + ( q1b( 1 ) - q1( 1 ) )
+ q3b( 2 ) = q3( 2 ) + ( q1b( 2 ) - q1( 2 ) )
+
+ xout(1) = q1b(1)
+ yout(1) = q1b(2)
+ xout(2) = q2b(1)
+ yout(2) = q2b(2)
+ xout(3) = q3b(1)
+ yout(3) = q3b(2)
+ call ast_tran2( fs, 3, xout, yout, .true., xin, yin, status )
+ p1b( 1 ) = xin(1)
+ p1b( 2 ) = yin(1)
+ p2b( 1 ) = xin(2)
+ p2b( 2 ) = yin(2)
+ p3b( 1 ) = xin(3)
+ p3b( 2 ) = yin(3)
+
+ frm1 = ast_GetFrame( fs, AST__CURRENT, status )
+ pp1( 1 ) = 0.0
+ pp1( 2 ) = 0.0
+ pp2( 1 ) = 1.0D-7
+ pp2( 2 ) = 1.0D-7
+ unc = ast_box( frm1, 0, pp1, pp2, AST__NULL, ' ', status )
+ ell2 = ast_ellipse( frm1, 0, p1b, p2b, p3b, unc, ' ', status )
+ if( ast_overlap( ell2, ell1, status ) .ne. 1 ) call stopit(status,
+ : 'ellipse: Error 11' )
+ if( ast_overlap( ell1, ell2, status ) .ne. 1 ) call stopit(status,
+ : 'ellipse: Error 12' )
+
+ p1b( 1 ) = p1( 1 )
+ p1b( 2 ) = p1( 2 )
+ p2b( 1 ) = p2( 1 )
+ p2b( 2 ) = 0.9*p2( 2 ) + 0.1*p1( 2 )
+ p3b( 1 ) = p3( 1 )
+ p3b( 2 ) = 0.9*p3( 2 ) + 0.1*p1( 2 )
+
+ ell2 = ast_ellipse( frm1, 0, p1b, p2b, p3b, unc, ' ', status )
+ if( ast_overlap( ell2, ell1, status ) .ne. 2 ) call stopit(status,
+ : 'ellipse: Error 13' )
+ if( ast_overlap( ell1, ell2, status ) .ne. 3 ) call stopit(status,
+ : 'ellipse: Error 14' )
+
+
+
+
+
+
+ frm1 = ast_frame( 2, ' ', status )
+
+ pp1( 1 ) = 0.0
+ pp1( 2 ) = 0.0
+ pp2( 1 ) = 1.0D-7
+ pp2( 2 ) = 1.0D-7
+ unc = ast_box( frm1, 0, pp1, pp2, AST__NULL, ' ', status )
+
+ p1(1)=0.0
+ p1(2)=0.0
+ p2(1)=1.0
+ p2(2)=0.0
+ p3(1)=0.0
+ p3(2)=0.5
+ ell1 = ast_ellipse( frm1, 0, p1, p2, p3, unc, ' ', status )
+
+
+ matrix(1) = 1.73
+ matrix(2) = 0.5003
+ matrix(3) = -1.0006
+ matrix(4) = 0.866
+ mm = ast_matrixmap( 2, 2, 0, matrix, ' ', status )
+
+ ell2 = ast_mapregion( ell1, mm, frm1, status )
+ call checkdump( ell2, 'checkdump ell2', status )
+ if( hasframeset( ell2, status ) ) call stopit( status,
+ : 'Ellipse: error 15' )
+ call ast_invert( mm, status )
+ ell3 = ast_mapregion( ell2, mm, frm1, status )
+ if( hasframeset( ell3,status ) ) call stopit( status,
+ : 'Ellipse: error 16' )
+ if( ast_overlap( ell1, ell3, status ) .ne. 5 ) call stopit(status,
+ : 'ellipse: Error 17' )
+
+
+ frm1 = ast_frame( 2, ' ', status )
+ pp1( 1 ) = 0.0
+ pp1( 2 ) = 0.0
+ pp2( 1 ) = 1.0D-7
+ pp2( 2 ) = 1.0D-7
+ unc = ast_box( frm1, 0, pp1, pp2, AST__NULL, ' ', status )
+
+ p1(1)=0.0
+ p1(2)=0.0
+ p2(1)=1.0
+ p2(2)=0.0
+ p3(1)=0.0
+ p3(2)=1.0
+ ell1 = ast_ellipse( frm1, 0, p1, p2, p3, unc, ' ', status )
+ reg = ast_simplify( ell1, status )
+ if( .not. ast_IsACircle( reg, status ) ) call stopit(status,
+ : 'ellipse: Error 18' )
+
+ ell1 = ast_circle( frm1, 0, p1, p2, AST__NULL, ' ', status )
+ if( ast_overlap( reg, ell1, status ) .ne. 5 ) call stopit(status,
+ : 'Ellipse: Error 19' )
+
+
+
+ frm1 = ast_skyframe( ' ', status )
+ p1(1)=0.0D0
+ p1(2)=0.0D0
+ p2(1)=0.01D0
+ p2(2)=0.01D0
+ p3(1)=0.0D0
+ p3(2)=0.0D0
+ ell1 = ast_ellipse( frm1, 1, p1, p2, p3, AST__NULL, ' ', status )
+
+ p1(1)=-0.015D0
+ p1(2)=0.0D0
+ p2(1)=0.01D0
+ p2(2)=0.01D0
+ p3(1)=0.0D0
+ p3(2)=0.0D0
+ ell2 = ast_ellipse( frm1, 1, p1, p2, p3, AST__NULL, ' ', status )
+
+ if( ast_overlap( ell1, ell2, status ) .ne. 4 ) call stopit(status,
+ : 'Ellipse: Error 20' )
+
+ p1(1)=6.2681853D0
+ p1(2)=0.0D0
+ p2(1)=0.01D0
+ p2(2)=0.01D0
+ p3(1)=0.0D0
+ p3(2)=0.0D0
+ ell2 = ast_ellipse( frm1, 1, p1, p2, p3, AST__NULL, ' ', status )
+
+ if( ast_overlap( ell1, ell2, status ) .ne. 4 ) call stopit(status,
+ : 'Ellipse: Error 21' )
+
+ p1(1)=-0.015D0
+ p1(2)=0.0D0
+ p2(1)=0.01D0
+ p2(2)=0.01D0
+ p3(1)=0.0D0
+ p3(2)=0.0D0
+ ell1 = ast_ellipse( frm1, 1, p1, p2, p3, AST__NULL, ' ', status )
+
+ if( ast_overlap( ell1, ell2, status ) .ne. 5 ) call stopit(status,
+ : 'Ellipse: Error 22' )
+
+
+
+
+ call ast_end( status )
+ if( status .ne. sai__ok ) write(*,*) 'Ellipse tests failed'
+
+ end
+
+
+ subroutine checkNullRegion( status )
+ implicit none
+ include 'AST_PAR'
+ include 'SAE_PAR'
+ include 'PRM_PAR'
+
+ integer status, f1, f2, f3, nr, cir, i, j, lbnd_in(2), ubnd_in(2),
+ : nr2, res
+ double precision p1(4),p2(4),rin(5,5)
+ logical hasframeset
+
+ if( status .ne.sai__ok ) return
+
+ call ast_begin( status )
+
+ f1 = ast_skyframe( ' ', status )
+ f2 = ast_frame( 2, ' ', status )
+ f3 = ast_cmpframe( f1, f2, ' ', status )
+ nr = ast_NullRegion( f3, AST__NULL, ' ', status )
+
+ call checkdump( nr, 'checkdump NullRegion:nr', status )
+
+ p1( 1 ) = 1.0
+ p1( 2 ) = 1.0
+ p1( 3 ) = 3.0
+ p1( 4 ) = 3.0
+ p2( 1 ) = 1.01
+ p2( 2 ) = 1.02
+ p2( 3 ) = 3.01
+ p2( 4 ) = 3.01
+ cir = ast_circle( nr, 0, p1, p2, AST__NULL, ' ', status )
+ call checkdump( cir, 'checkdump NullRegion:cir', status )
+
+ if( ast_overlap( cir, nr, status ) .ne. 1 ) call stopit(status,
+ : 'NullRegion: Error 1' )
+
+ if( ast_overlap( nr, cir, status ) .ne. 1 ) call stopit(status,
+ : 'NullRegion: Error 2' )
+
+ if( ast_overlap( nr, nr, status ) .ne. 5 ) call stopit(status,
+ : 'NullRegion: Error 3' )
+
+ call ast_negate( nr, status )
+
+ if( ast_overlap( cir, nr, status ) .ne. 2 ) call stopit(status,
+ : 'NullRegion: Error 4' )
+
+ if( ast_overlap( nr, cir, status ) .ne. 3 ) call stopit(status,
+ : 'NullRegion: Error 5' )
+
+ if( ast_overlap( nr, nr, status ) .ne. 5 ) call stopit(status,
+ : 'NullRegion: Error 6' )
+
+ call ast_set( nr, 'system(1)=FK4', status )
+ nr2 = ast_simplify( nr, status )
+ call ast_set( nr2, 'system(1)=ICRS', status )
+ nr = ast_simplify( nr2, status )
+ if( hasframeset( nr, status ) ) call stopit( status,
+ : 'NullRegion: error 7' )
+
+ lbnd_in(1) = 1
+ lbnd_in(2) = 1
+ ubnd_in(1) = 5
+ ubnd_in(2) = 5
+
+ do i =1, 5
+ do j = 1, 5
+ rin( j,i)=1.0
+ end do
+ end do
+
+ nr = ast_NullRegion( f2, AST__NULL, 'negated=1', status )
+ res = ast_maskd( nr, AST__NULL, .false., 2, lbnd_in, ubnd_in,
+ : rin, VAL__BADD, status )
+
+ if( res .ne. 0 ) then
+ write(*,*) 'NullRegion:Res is ',res
+ call stopit( status, 'res should be 0' )
+ end if
+
+ do i =1, 5
+ do j = 1, 5
+ if( rin(j,i) .NE. 1.0 ) then
+ write(*,*) 'rin(',j,',',i,') = ',rin(j,i)
+ call stopit( status, 'Above value should be 1.0' )
+ end if
+ end do
+ end do
+
+ call ast_negate( nr, status )
+ res = ast_maskd( nr, AST__NULL, .false., 2, lbnd_in, ubnd_in,
+ : rin, VAL__BADD, status )
+
+ if( res .ne. 25 ) then
+ write(*,*) 'NullRegion:Res is ',res
+ call stopit( status, 'res should be 25' )
+ end if
+
+ do i =1, 5
+ do j = 1, 5
+ if( rin(j,i) .NE. VAL__BADD ) then
+ write(*,*) 'rin(',j,',',i,') = ',rin(j,i)
+ call stopit( status, 'Above value should be BAD' )
+ end if
+ end do
+ end do
+
+
+
+
+
+ call ast_end( status )
+ if( status .ne. sai__ok ) write(*,*) 'NullRegion tests failed'
+
+ end
+
+
+
+
+ subroutine checkCmpRegion( status )
+ implicit none
+ include 'AST_PAR'
+ include 'SAE_PAR'
+ include 'PRM_PAR'
+
+ integer status, r1, r2, r3, cr, f1, f2, cr2, cr3, frm, map, fs
+ double precision p1(2),p2(2),xout(4),yout(4),xin(4),yin(4)
+ logical hasframeset
+
+ if( status .ne.sai__ok ) return
+
+ call ast_begin( status )
+
+
+ f1 = ast_skyframe( 'system=fk5', status )
+ p1(1) = 0.0
+ p1(2) = 0.0
+ p2(1) = 1.0E-4
+ p2(2) = 1.0E-4
+ r1 = ast_box( f1, 0, p1, p2, AST__NULL, ' ', status )
+
+ f2 = ast_skyframe( 'system=galactic', status )
+
+ p1(1) = 1.68166715892457
+ p1(2) = -1.050436507472
+ p2(1) = 1.68140254777194
+ p2(2) = -1.05048840003467
+ r2 = ast_circle( f2, 0, p1, p2, AST__NULL, ' ', status )
+
+ if( ast_overlap( r1, r2, status ) .ne. 4 ) call stopit(status,
+ : 'CmpRegion: Error 0' )
+
+ cr = ast_cmpregion( r1, r2, AST__AND, ' ', status )
+ cr = ast_Copy( cr, status )
+ if( ast_overlap( cr, cr, status ) .ne. 5 ) call stopit(status,
+ : 'CmpRegion: Error 1' )
+
+ xin( 1 ) = 0.5E-4! In both r1 and r2
+ xin( 2 ) = 1.5E-4! In r2 but not r1
+ xin( 3 ) = -0.5E-4! In r1 but not r2
+ xin( 4 ) = 1.1E-4! In neither
+
+ yin( 1 ) = 0.5E-4
+ yin( 2 ) = 1.5E-4
+ yin( 3 ) = -0.5E-4
+ yin( 4 ) = -1.1E-4
+
+ call ast_tran2( cr, 4, xin, yin, .true., xout, yout, status )
+
+ if( xout(1) .ne. xin(1) ) call stopit( status,
+ : 'CmpRegion: AND Error 1x')
+ if( yout(1) .ne. yin(1) ) call stopit( status,
+ : 'CmpRegion: AND Error 1y')
+ if( xout(2) .ne. AST__BAD ) call stopit( status,
+ : 'CmpRegion: AND Error 2x')
+ if( yout(2) .ne. AST__BAD ) call stopit( status,
+ : 'CmpRegion: AND Error 2y')
+ if( xout(3) .ne. AST__BAD ) call stopit( status,
+ : 'CmpRegion: AND Error 3x')
+ if( yout(3) .ne. AST__BAD ) call stopit( status,
+ : 'CmpRegion: AND Error 3y')
+ if( xout(4) .ne. AST__BAD ) call stopit( status,
+ : 'CmpRegion: AND Error 4x')
+ if( yout(4) .ne. AST__BAD ) call stopit( status,
+ : 'CmpRegion: AND Error 4y')
+
+ cr = ast_cmpregion( r1, r2, AST__OR, ' ', status )
+ call ast_tran2( cr, 4, xin, yin, .true., xout, yout, status )
+
+ if( xout(1) .ne. xin(1) ) call stopit( status,
+ : 'CmpRegion: OR Error 1x')
+ if( yout(1) .ne. yin(1) ) call stopit( status,
+ : 'CmpRegion: OR Error 1y')
+ if( xout(2) .ne. xin(2) ) call stopit( status,
+ : 'CmpRegion: OR Error 2x')
+ if( yout(2) .ne. yin(2) ) call stopit( status,
+ : 'CmpRegion: OR Error 2y')
+ if( xout(3) .ne. xin(3) ) call stopit( status,
+ : 'CmpRegion: OR Error 3x')
+ if( yout(3) .ne. yin(3) ) call stopit( status,
+ : 'CmpRegion: OR Error 3y')
+ if( xout(4) .ne. AST__BAD ) call stopit( status,
+ : 'CmpRegion: OR Error 4x')
+ if( yout(4) .ne. AST__BAD ) call stopit( status,
+ : 'CmpRegion: OR Error 4y')
+
+
+ call ast_negate( r2, status )
+ cr = ast_cmpregion( r1, r2, AST__AND, ' ', status )
+ call ast_tran2( cr, 4, xin, yin, .true., xout, yout, status )
+
+ if( xout(1) .ne. AST__BAD ) call stopit( status,
+ : 'CmpRegion: ANDb Error 1x')
+ if( yout(1) .ne. AST__BAD ) call stopit( status,
+ : 'CmpRegion: ANDb Error 1y')
+ if( xout(2) .ne. AST__BAD ) call stopit( status,
+ : 'CmpRegion: ANDb Error 2x')
+ if( yout(2) .ne. AST__BAD ) call stopit( status,
+ : 'CmpRegion: ANDb Error 2y')
+ if( xout(3) .ne. xin(3) ) call stopit( status,
+ : 'CmpRegion: ANDb Error 3x')
+ if( yout(3) .ne. yin(3) ) call stopit( status,
+ : 'CmpRegion: ANDb Error 3y')
+ if( xout(4) .ne. AST__BAD ) call stopit( status,
+ : 'CmpRegion: ANDb Error 4x')
+ if( yout(4) .ne. AST__BAD ) call stopit( status,
+ : 'CmpRegion: ANDb Error 4y')
+
+ call ast_negate( r1, status )
+ cr = ast_cmpregion( r1, r2, AST__AND, ' ', status )
+ call ast_tran2( cr, 4, xin, yin, .true., xout, yout, status )
+
+ if( xout(1) .ne. AST__BAD ) call stopit( status,
+ : 'CmpRegion: ANDc Error 1x')
+ if( yout(1) .ne. AST__BAD ) call stopit( status,
+ : 'CmpRegion: ANDc Error 1y')
+ if( xout(2) .ne. AST__BAD ) call stopit( status,
+ : 'CmpRegion: ANDc Error 2x')
+ if( yout(2) .ne. AST__BAD ) call stopit( status,
+ : 'CmpRegion: ANDc Error 2y')
+ if( xout(3) .ne. AST__BAD ) call stopit( status,
+ : 'CmpRegion: ANDc Error 3x')
+ if( yout(3) .ne. AST__BAD ) call stopit( status,
+ : 'CmpRegion: ANDc Error 3y')
+ if( xout(4) .ne. xin(4) ) call stopit( status,
+ : 'CmpRegion: ANDc Error 4x')
+ if( yout(4) .ne. yin(4) ) call stopit( status,
+ : 'CmpRegion: ANDc Error 4y')
+
+
+ cr = ast_cmpregion( r1, r2, AST__AND, ' ', status )
+ call ast_negate( cr, status )
+ call ast_tran2( cr, 4, xin, yin, .true., xout, yout, status )
+
+ if( xout(1) .ne. xin(1) ) call stopit( status,
+ : 'CmpRegion: ANDd Error 1x')
+ if( yout(1) .ne. yin(1) ) call stopit( status,
+ : 'CmpRegion: ANDd Error 1y')
+ if( xout(2) .ne. xin(2) ) call stopit( status,
+ : 'CmpRegion: ANDd Error 2x')
+ if( yout(2) .ne. yin(2) ) call stopit( status,
+ : 'CmpRegion: ANDd Error 2y')
+ if( xout(3) .ne. xin(3) ) call stopit( status,
+ : 'CmpRegion: ANDd Error 3x')
+ if( yout(3) .ne. yin(3) ) call stopit( status,
+ : 'CmpRegion: ANDd Error 3y')
+ if( xout(4) .ne. AST__BAD ) call stopit( status,
+ : 'CmpRegion: ANDd Error 4x')
+ if( yout(4) .ne. AST__BAD ) call stopit( status,
+ : 'CmpRegion: ANDd Error 4y')
+
+
+ cr2 = ast_cmpregion( r2, r1, AST__AND, ' ', status )
+
+ fs = ast_convert( cr, cr2, ' ', status )
+ if( fs .eq. AST__NULL ) call stopit( status,
+ : 'CmpRegion: Error 5')
+ map = ast_getmapping( fs, AST__BASE, AST__CURRENT, status )
+ frm = ast_getframe( fs, AST__CURRENT, status )
+ cr3 = ast_mapRegion( cr, map, frm, status )
+ if( ast_overlap( cr3, cr2, status ) .ne. 6 ) call stopit(status,
+ : 'CmpRegion: Error 6' )
+
+ cr = ast_Copy( cr, status )
+ call checkdump( cr, 'checkdump CmpRegion: cr', status )
+
+
+ cr2 = ast_Copy( cr, status )
+ call ast_negate( cr2, status )
+
+ cr3 = ast_cmpregion( cr2, cr, AST__OR, ' ', status )
+ cr3 = ast_Simplify( cr3, status )
+ if( .not. ast_isanullregion( cr3, status ) ) then
+ call stopit(status, 'CmpRegion: Error 7' )
+ else if( .not. ast_getl( cr3, 'negated', status ) ) then
+ call stopit(status, 'CmpRegion: Error 8' )
+ end if
+
+ cr3 = ast_cmpregion( cr2, cr, AST__AND, ' ', status )
+ cr3 = ast_Simplify( cr3, status )
+ if( .not. ast_isanullregion( cr3, status ) ) then
+ call stopit(status, 'CmpRegion: Error 9' )
+ else if( ast_getl( cr3, 'negated', status ) ) then
+ call stopit(status, 'CmpRegion: Error 10' )
+ end if
+
+
+
+ f1 = ast_frame( 2, ' ', status )
+ p1(1) = 0.0
+ p1(2) = 0.0
+ p2(1) = 1.0
+ p2(2) = 1.0
+ r1 = ast_box( f1, 0, p1, p2, AST__NULL, ' ', status )
+
+ p1(1) = -1.0
+ p1(2) = 0.0
+ p2(1) = 0.0
+ p2(2) = 0.0
+ r2 = ast_circle( f1, 0, p1, p2, AST__NULL, ' ', status )
+
+ p1(1) = 1.0
+ p1(2) = 0.0
+ p2(1) = 0.0
+ p2(2) = 0.0
+ r3 = ast_circle( f1, 0, p1, p2, AST__NULL, ' ', status )
+
+ cr = ast_cmpregion( r2, r3, AST__OR, ' ', status )
+ call checkdump( cr, 'checkdump CmpRegion: cr', status )
+
+ call ast_negate( cr, status )
+ cr2 = ast_cmpregion( cr, r1, AST__AND, ' ', status )
+ call checkdump( cr2, 'checkdump CmpRegion: cr2', status )
+
+ cr2 = ast_simplify( cr2, status )
+
+ xin( 1 ) = 0.0
+ xin( 2 ) = 0.2
+ xin( 3 ) = 0.5
+ xin( 4 ) = -0.5
+
+ yin( 1 ) = 0.5
+ yin( 2 ) = 1.5
+ yin( 3 ) = 0.5
+ yin( 4 ) = 0.5
+
+ call ast_tran2( cr2, 4, xin, yin, .true., xout, yout, status )
+
+ if( xout(1) .ne. xin(1) ) call stopit( status,
+ : 'CmpRegion:Error 11')
+ if( yout(1) .ne. yin(1) ) call stopit( status,
+ : 'CmpRegion:Error 12')
+ if( xout(2) .ne. AST__BAD ) call stopit( status,
+ : 'CmpRegion:Error 13')
+ if( yout(2) .ne. AST__BAD ) call stopit( status,
+ : 'CmpRegion:Error 14')
+ if( xout(3) .ne. AST__BAD ) call stopit( status,
+ : 'CmpRegion:Error 15')
+ if( yout(3) .ne. AST__BAD ) call stopit( status,
+ : 'CmpRegion:Error 16')
+ if( xout(4) .ne. AST__BAD ) call stopit( status,
+ : 'CmpRegion:Error 17')
+ if( yout(4) .ne. AST__BAD ) call stopit( status,
+ : 'CmpRegion:Error 18')
+
+
+
+ call ast_negate( cr2, status )
+ cr2 = ast_simplify( cr2, status )
+ call ast_tran2( cr2, 4, xin, yin, .true., xout, yout, status )
+
+ if( xout(1) .ne. AST__BAD ) call stopit( status,
+ : 'CmpRegion:Error 19')
+ if( yout(1) .ne. AST__BAD ) call stopit( status,
+ : 'CmpRegion:Error 20')
+ if( xout(2) .ne. xin(2) ) call stopit( status,
+ : 'CmpRegion:Error 21')
+ if( yout(2) .ne. yin(2) ) call stopit( status,
+ : 'CmpRegion:Error 22')
+ if( xout(3) .ne. xin(3) ) call stopit( status,
+ : 'CmpRegion:Error 23')
+ if( yout(3) .ne. yin(3) ) call stopit( status,
+ : 'CmpRegion:Error 24')
+ if( xout(4) .ne. xin(4) ) call stopit( status,
+ : 'CmpRegion:Error 25')
+ if( yout(4) .ne. yin(4) ) call stopit( status,
+ : 'CmpRegion:Error 26')
+
+
+
+
+
+ call ast_end( status )
+ if( status .ne. sai__ok ) write(*,*) 'CmpRegion tests failed'
+
+ end
+
+
+
+
+
+
+
+*
+* Tests the dump function, the loader, and the astOverlap method.
+*
+ subroutine checkdump( obj, text, status )
+
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ character text*(*)
+ integer obj, status, next, end, ch, result, ll, overlap
+ external mysource, mysink
+ character buf*45000
+
+ common /ss1/ buf
+ common /ss2/ next, end, ll
+
+ if( status .ne. sai__ok ) return
+
+* Create a Channel which reads and writes to an internal string buffer.
+ ch = ast_channel( mysource, mysink, ' ', status )
+
+* Write the supplied Region out to this Channel.
+ ll = 160
+ next = 1
+ if( ast_write( ch, obj, status ) .ne.1 ) then
+ write(*,*) text
+ call stopit( status, 'Cannot write supplied object to '//
+ : 'channel' )
+ end if
+
+* Read an Object back from this Channel.
+ next = 1
+ result = ast_read( ch, status )
+ if( result .eq. ast__null ) then
+ write(*,*) text
+ call stopit( status, 'Cannot read object from channel' )
+ end if
+
+* Check that it is a Region and its boundary is identical to the supplied
+* Region.
+ overlap = ast_overlap( obj, result, status )
+ if( overlap .ne. 5 ) then
+ write(*,*) 'obj result Overlap: ', overlap
+ write(*,*) 'obj self-Overlap: ', ast_overlap( obj, obj,
+ : status )
+ write(*,*) 'result self-Overlap: ', ast_overlap( result,
+ : result, status )
+ call ast_Show( obj, status )
+ call ast_Show( result, status )
+ write(*,*) text
+ call stopit( status, 'Object has changed' )
+ end if
+
+ end
+
+ subroutine mysource( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ integer status, next, end, ll
+ character buf*45000
+
+ common /ss1/ buf
+ common /ss2/ next, end, ll
+
+ if( status .ne. sai__ok ) return
+
+ if( next .ge. end ) then
+ call ast_putline( buf, -1, status )
+ else
+ call ast_putline( buf( next : ), ll, status )
+ endif
+
+ next = next + ll
+
+ end
+
+ subroutine mysink( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ integer status, next, end, f, l, ll
+ character buf*45000
+ character line*1000
+
+ common /ss1/ buf
+ common /ss2/ next, end, ll
+
+ if( status .ne. sai__ok ) return
+
+ line = ' '
+ call ast_getline( line, l, status )
+ call chr_fandl( line( : l ), f, l )
+ buf( next : ) = line( f : l )
+ l = l - f + 1
+
+ if( next + ll - 1 .ge. 45000 ) then
+ write(*,*)
+ call stopit( status, 'Buffer overflow in mysink!!' )
+ else if( l .gt. ll ) then
+ write(*,*)
+ write(*,*) buf( next : next + l)
+ write(*,*) 'Line length ',l,' greater than ',ll
+ call stopit( status, 'Line overflow in mysink!!' )
+ else
+ end = next + l
+ buf( end : next + ll - 1 ) = ' '
+ endif
+
+ next = next + ll
+
+ end
+
+
+
+
+ subroutine checkPrism( status )
+ implicit none
+ include 'AST_PAR'
+ include 'SAE_PAR'
+
+ integer f1, f2, r1, r2, r3, r4, status
+ double precision lbnd(5),ubnd(5),p1(5),p2(5)
+ logical hasframeset
+
+ if( status .ne.sai__ok ) return
+
+ call ast_begin( status )
+
+ f1 = ast_skyframe( 'system=fk5', status )
+ p1(1) = 0.0
+ p1(2) = 0.0
+ p2(1) = 1.0E-4
+ p2(2) = 1.0E-4
+ r1 = ast_box( f1, 0, p1, p2, AST__NULL, ' ', status )
+
+ f2 = ast_specframe( 'Unit=Angstrom', status )
+ lbnd( 1 ) = 5000.0
+ ubnd( 1 ) = 6000.0
+ r2 = ast_interval( f2, lbnd, ubnd, AST__NULL, ' ', status )
+ r3 = ast_prism( r1, r2, ' ', status )
+
+ call checkdump( r3, 'checkdump Prism 1', status )
+
+ if( ast_overlap( r3, r3, status ) .ne. 5 ) call stopit( status,
+ : 'Prism 1' )
+
+ r4 = ast_Simplify( r3, status )
+ if( .not. ast_isabox( r4, status ) ) call stopit( status,
+ : 'Prism 1b' )
+ if( hasframeset( r4, status ) ) call stopit( status, 'Prism 1c' )
+ if( ast_overlap( r3, r4, status ) .ne. 5 ) call stopit( status,
+ : 'Prism 1d' )
+
+
+ lbnd( 1 ) = 5500.0
+ ubnd( 1 ) = 5800.0
+ r2 = ast_interval( f2, lbnd, ubnd, AST__NULL, ' ', status )
+ r4 = ast_prism( r1, r2, ' ', status )
+
+ if( ast_overlap( r3, r4, status ) .ne. 3 ) call stopit( status,
+ : 'Prism 2' )
+ if( ast_overlap( r4, r3, status ) .ne. 2 ) then
+ write(*,*) ast_overlap( r4, r3, status ),' should be 2'
+ call stopit( status, 'Prism 3' )
+ end if
+
+ lbnd( 1 ) = 5500.0
+ ubnd( 1 ) = 6500.0
+ r2 = ast_interval( f2, lbnd, ubnd, AST__NULL, ' ', status )
+ r4 = ast_prism( r1, r2, ' ', status )
+ if( ast_overlap( r3, r4, status ) .ne. 4 ) call stopit( status,
+ : 'Prism 4' )
+ if( ast_overlap( r4, r3, status ) .ne. 4 ) call stopit( status,
+ : 'Prism 5' )
+
+ lbnd( 1 ) = 6500.0
+ ubnd( 1 ) = 7500.0
+ r2 = ast_interval( f2, lbnd, ubnd, AST__NULL, ' ', status )
+ r4 = ast_prism( r1, r2, ' ', status )
+ if( ast_overlap( r3, r4, status ) .ne. 1 ) call stopit( status,
+ : 'Prism 6' )
+ if( ast_overlap( r4, r3, status ) .ne. 1 ) call stopit( status,
+ : 'Prism 7' )
+
+ r4 = ast_copy( r3, status )
+ call ast_Negate( r4, status )
+ if( ast_overlap( r4, r3, status ) .ne. 6 ) call stopit( status,
+ : 'Prism 8' )
+
+
+ p1(1) = 2.0E-4
+ p1(2) = 2.0E-4
+ p2(1) = 1.1E-4
+ p2(2) = 1.0E-4
+ r1 = ast_box( f1, 0, p1, p2, AST__NULL, ' ', status )
+ lbnd( 1 ) = 5000.0
+ ubnd( 1 ) = 6000.0
+ r2 = ast_interval( f2, lbnd, ubnd, AST__NULL, ' ', status )
+ r4 = ast_prism( r1, r2, ' ', status )
+ if( ast_overlap( r3, r4, status ) .ne. 1 ) call stopit( status,
+ : 'Prism 9' )
+
+ p1(1) = 2.0E-4
+ p1(2) = 2.0E-4
+ p2(1) = 1.0E-4
+ p2(2) = 1.0E-4
+ r1 = ast_box( f1, 0, p1, p2, AST__NULL, ' ', status )
+ r4 = ast_prism( r1, r2, ' ', status )
+ if( ast_overlap( r3, r4, status ) .ne. 4 ) call stopit( status,
+ : 'Prism 10' )
+
+ call ast_setl( r3, 'Closed', .false., status )
+ call ast_setl( r4, 'Closed', .false., status )
+ if( ast_overlap( r3, r4, status ) .ne. 1 ) call stopit( status,
+ : 'Prism 11' )
+
+
+
+ f1 = ast_skyframe( 'system=fk5', status )
+ p1(1) = 0.0
+ p1(2) = 0.0
+ p2(1) = 1.0E-4
+ p2(2) = 1.0E-4
+ r1 = ast_box( f1, 0, p1, p2, AST__NULL, ' ', status )
+
+ f2 = ast_specframe( 'System=Wavelen,Unit=Angstrom', status )
+ lbnd( 1 ) = 5000.0
+ ubnd( 1 ) = AST__BAD
+ r2 = ast_interval( f2, lbnd, ubnd, AST__NULL, ' ', status )
+ r3 = ast_prism( r1, r2, ' ', status )
+
+ lbnd( 1 ) = 6000.0
+ ubnd( 1 ) = AST__BAD
+ r2 = ast_interval( f2, lbnd, ubnd, AST__NULL, ' ', status )
+ r4 = ast_prism( r1, r2, ' ', status )
+
+ call ast_setc( r3, 'system(1)', 'galactic', status )
+
+ if( ast_overlap( r3, r4, status ) .ne. 3 ) call stopit( status,
+ : 'Prism 12' )
+
+ ubnd( 1 ) = 6000.0
+ lbnd( 1 ) = AST__BAD
+ r2 = ast_interval( f2, lbnd, ubnd, AST__NULL, ' ', status )
+ r4 = ast_prism( r1, r2, ' ', status )
+
+ if( ast_overlap( r3, r4, status ) .ne. 4 ) call stopit( status,
+ : 'Prism 13' )
+
+ ubnd( 1 ) = 5000.0
+ lbnd( 1 ) = AST__BAD
+ r2 = ast_interval( f2, lbnd, ubnd, AST__NULL, ' ', status )
+ r4 = ast_prism( r1, r2, ' ', status )
+ call ast_setc( r4, 'system(3)', 'freq', status )
+ if( ast_overlap( r3, r4, status ) .ne. 4 ) call stopit( status,
+ : 'Prism 14' )
+
+ call ast_setl( r4, 'closed', .false., status )
+ if( ast_overlap( r3, r4, status ) .ne. 1 ) call stopit( status,
+ : 'Prism 15' )
+
+
+ f1 = ast_skyframe( 'system=fk5', status )
+ p1(1) = 0.0
+ p1(2) = -1.57
+ p2(1) = 0.8
+ p2(2) = -1.5
+ r1 = ast_box( f1, 0, p1, p2, AST__NULL, ' ', status )
+
+ f2 = ast_specframe( 'Unit=Angstrom', status )
+ lbnd( 1 ) = 5000.0
+ ubnd( 1 ) = 6000.0
+ r2 = ast_interval( f2, lbnd, ubnd, AST__NULL, ' ', status )
+ r3 = ast_prism( r1, r2, ' ', status )
+ r4 = ast_Simplify( r3, status )
+
+ call ast_getregionbounds( r4, lbnd, ubnd, status )
+ if( abs( lbnd(1) + 0.8D0 ) .gt. 1.0E-6 ) call stopit( status,
+ : 'Prism 16' )
+ if( abs( lbnd(2) + 1.64D0 ) .gt. 1.0E-6 )
+ : call stopit( status, 'Prism 17' )
+ if( abs( ubnd(1) - 0.8D0 ) .gt. 1.0E-6 )
+ : call stopit( status, 'Prism 18' )
+ if( abs( ubnd(2) + 1.5 ) .gt. 1.0E-6 )
+ : call stopit( status, 'Prism 19' )
+ if( abs( lbnd(3) - 5000.0 ) .gt. 1.0E-10 )
+ : call stopit( status, 'Prism 20' )
+ if( abs( ubnd(3) - 6000.0 ) .gt. 1.0E-6 )
+ : call stopit( status, 'Prism 21' )
+
+ call ast_end( status )
+ if( status .ne. sai__ok ) write(*,*) 'Prism tests failed'
+
+ end
+
+
+
+ subroutine checkRemoveRegions( status )
+ implicit none
+
+ include 'SAE_PAR'
+ include 'AST_PAR'
+
+ integer status, sf1, sf2, reg, fs, map, fs2
+ double precision cen(2), ixin(2), iyin(2), gxin(2), gyin(2),
+ : xout(2), yout(2)
+
+ if( status .ne. sai__ok ) return
+
+ call ast_begin( status )
+
+ sf1 = ast_skyframe( 'System=ICRS', status )
+ cen(1) = 0.0
+ cen(2) = 0.0
+ reg = ast_circle( sf1, 1, cen, 0.001D0, AST__NULL, ' ', status )
+
+ ixin(1) = 0.0
+ iyin(1) = 0.0
+ ixin(2) = 0.01
+ iyin(2) = 0.01
+
+ call ast_tran2( reg, 2, ixin, iyin, .true., xout, yout, status )
+
+ if( xout(1) .eq. AST__BAD .or. yout(1) .eq. AST__BAD ) then
+ call stopit( status, 'RemoveRegions test 1 failed' )
+
+ else if( abs( xout(1) - ixin(1) ) .gt. 1.0E-10 .or.
+ : abs( yout(1) - iyin(1) ) .gt. 1.0E-10 ) then
+ call stopit( status, 'RemoveRegions test 2 failed' )
+
+ else if( xout(2) .ne. AST__BAD .or. yout(2) .ne. AST__BAD ) then
+ write(*,*) xout(2), ixin(2)
+ write(*,*) yout(2), iyin(2)
+ call stopit( status, 'RemoveRegions test 3 failed' )
+ end if
+
+
+
+
+ sf2 = ast_skyframe( 'System=Galactic', status )
+ fs = ast_convert( sf1, sf2, ' ', status )
+ call ast_tran2( fs, 2, ixin, iyin, .true., gxin, gyin, status )
+
+ fs2 = ast_frameset( sf2, ' ', status )
+ call ast_addframe( fs2, AST__BASE, ast_unitmap( 2, ' ', status ),
+ : sf2, status )
+
+
+ fs = ast_convert( fs2, reg, ' ', status )
+
+
+ map = ast_getmapping( fs, AST__BASE, AST__CURRENT, status )
+ call ast_tran2( map, 2, gxin, gyin, .true., xout, yout, status )
+
+ if( xout(1) .eq. AST__BAD .or. yout(1) .eq. AST__BAD ) then
+ call stopit( status, 'RemoveRegions test 4 failed' )
+
+ else if( abs( xout(1) - ixin(1) ) .gt. 1.0E-10 .or.
+ : abs( yout(1) - iyin(1) ) .gt. 1.0E-10 ) then
+ call stopit( status, 'RemoveRegions test 5 failed' )
+
+ else if( xout(2) .ne. AST__BAD .or. yout(2) .ne. AST__BAD ) then
+ write(*,*) xout(2), ixin(2)
+ write(*,*) yout(2), iyin(2)
+ call stopit( status, 'RemoveRegions test 6 failed' )
+ end if
+
+
+
+ fs2 = ast_removeregions( fs, status )
+
+ map = ast_getmapping( fs2, AST__BASE, AST__CURRENT, status )
+ call ast_tran2( map, 2, gxin, gyin, .true., xout, yout, status )
+
+ if( xout(1) .eq. AST__BAD .or. yout(1) .eq. AST__BAD ) then
+ call stopit( status, 'RemoveRegions test 7 failed' )
+
+ else if( abs( xout(1) - ixin(1) ) .gt. 1.0E-10 .or.
+ : abs( yout(1) - iyin(1) ) .gt. 1.0E-10 ) then
+ call stopit( status, 'RemoveRegions test 8 failed' )
+
+ else if( abs( xout(2) - ixin(2) ) .gt. 1.0E-10 .or.
+ : abs( yout(2) - iyin(2) ) .gt. 1.0E-10 ) then
+ call stopit( status, 'RemoveRegions test 9 failed' )
+ end if
+
+
+
+ call ast_end( status )
+
+ end
+
+
+
+
+
+ subroutine checkConvex( status )
+ implicit none
+
+ include 'SAE_PAR'
+ include 'AST_PAR'
+
+ integer nx, ny, nel
+ parameter( nx = 8 )
+ parameter( ny = 7 )
+ parameter( nel = nx*ny )
+
+ integer status, poly, lbnd(2), ubnd(2), npoint
+ real array( nx, ny )
+ double precision points( 10, 2 )
+
+ data array / nel*0.0 /
+ data lbnd / -10, 3 /
+
+ if( status .ne. sai__ok ) return
+
+ call ast_begin( status )
+
+ ubnd( 1 ) = lbnd( 1 ) + nx- 1
+ ubnd( 2 ) = lbnd( 2 ) + ny- 1
+
+ array( 6, 1 ) = 1.0
+ array( 7, 1 ) = 1.0
+ array( 8, 1 ) = 1.0
+ array( 7, 2 ) = 1.0
+ array( 8, 2 ) = 1.0
+ array( 2, 3 ) = 1.0
+ array( 8, 3 ) = 1.0
+ array( 1, 4 ) = 1.0
+ array( 1, 6 ) = 1.0
+ array( 2, 6 ) = 1.0
+ array( 6, 6 ) = 1.0
+
+ poly = ast_convexr( 1.0, AST__EQ, array, lbnd, ubnd, .FALSE.,
+ : status )
+
+ call ast_getregionpoints( poly, 10, 2, npoint, points, status )
+
+ if( npoint .ne. 7 ) call stopit( status, 'Convex 1' )
+ if( points( 1, 1 ) .ne. -3) call stopit( status, 'Convex 2' )
+ if( points( 1, 2 ) .ne. 3) call stopit( status, 'Convex 3' )
+ if( points( 2, 1 ) .ne. -3) call stopit( status, 'Convex 4' )
+ if( points( 2, 2 ) .ne. 5) call stopit( status, 'Convex 5' )
+ if( points( 3, 1 ) .ne. -5) call stopit( status, 'Convex 6' )
+ if( points( 3, 2 ) .ne. 8) call stopit( status, 'Convex 7' )
+ if( points( 4, 1 ) .ne. -10) call stopit( status, 'Convex 8' )
+ if( points( 4, 2 ) .ne. 8) call stopit( status, 'Convex 9' )
+ if( points( 5, 1 ) .ne. -10) call stopit( status, 'Convex 10' )
+ if( points( 5, 2 ) .ne. 6) call stopit( status, 'Convex 11' )
+ if( points( 6, 1 ) .ne. -9) call stopit( status, 'Convex 12' )
+ if( points( 6, 2 ) .ne. 5) call stopit( status, 'Convex 13' )
+ if( points( 7, 1 ) .ne. -5) call stopit( status, 'Convex 14' )
+ if( points( 7, 2 ) .ne. 3) call stopit( status, 'Convex 15' )
+
+ call ast_end( status )
+
+ end
+
diff --git a/ast/ast_tester/testskyframe.f b/ast/ast_tester/testskyframe.f
new file mode 100644
index 0000000..6359d63
--- /dev/null
+++ b/ast/ast_tester/testskyframe.f
@@ -0,0 +1,89 @@
+ program testskyframe
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+
+ integer status, sf1, sf2, fs
+ double precision vals(5)
+
+ status = sai__ok
+
+ sf1 = ast_skyframe( 'system=fk5,epoch=2015.0', status )
+ sf2 = ast_skyframe( 'system=fk5,epoch=2015.1', status )
+ fs = ast_convert( sf1, sf2, 'SKY', status )
+ if( fs .eq. AST__NULL ) then
+ call stopit( status, 'Error 0' )
+ end if
+
+ if( .not. ast_isaunitmap( ast_getmapping( fs, ast__base,
+ : ast__current, status ),
+ : status ) ) then
+ call stopit( status, 'Error 1' )
+ end if
+
+ if( ast_getd( sf1, 'SkyTol', status ) .ne. 0.001D0 ) then
+ call stopit( status, 'Error 2' )
+ end if
+
+ call ast_setd( sf2, 'SkyTol', 1.0D-6, status )
+ fs = ast_convert( sf1, sf2, 'SKY', status )
+
+ if( ast_isaunitmap( ast_getmapping( fs, ast__base,
+ : ast__current, status ),
+ : status ) ) then
+ call stopit( status, 'Error 3' )
+ end if
+
+ sf2 = ast_skyframe( 'system=fk5,epoch=2016.6', status )
+ fs = ast_convert( sf1, sf2, 'SKY', status )
+ if( ast_isaunitmap( ast_getmapping( fs, ast__base,
+ : ast__current, status ),
+ : status ) ) then
+ call stopit( status, 'Error 4' )
+ end if
+
+
+ vals(1) = 6.1D0
+ vals(2) = 6.15D0
+ vals(3) = 6.2D0
+ vals(4) = 6.25D0
+ vals(5) = 6.3D0
+ call ast_axnorm( sf1, 1, 0, 5, vals, status )
+ if( vals(1) .ne. 6.1D0 .or.
+ : vals(2) .ne. 6.15D0 .or.
+ : vals(3) .ne. 6.2D0 .or.
+ : vals(4) .ne. 6.25D0 .or.
+ : vals(5) .ne. 6.3D0 - 2*AST__DPI ) then
+ call stopit( status, 'Error 5' )
+ end if
+
+ call ast_axnorm( sf1, 1, 1, 5, vals, status )
+ if( vals(1) .ne. 6.1D0 - 2*AST__DPI .or.
+ : vals(2) .ne. 6.15D0 - 2*AST__DPI .or.
+ : vals(3) .ne. 6.2D0 - 2*AST__DPI .or.
+ : vals(4) .ne. 6.25D0 - 2*AST__DPI .or.
+ : vals(5) .ne. 6.3D0 - 2*AST__DPI ) then
+ call stopit( status, 'Error 6' )
+ end if
+
+ if( status .eq. sai__ok ) then
+ write(*,*) 'All SkyFrame tests passed'
+ else
+ write(*,*) 'SkyFrame tests failed'
+ end if
+
+ end
+
+ subroutine stopit( status, text )
+ implicit none
+ include 'SAE_PAR'
+ integer status
+ character text*(*)
+
+ if( status .ne. sai__ok ) return
+ status = sai__error
+ write(*,*) text
+
+ end
+
+
diff --git a/ast/ast_tester/testspecflux.f b/ast/ast_tester/testspecflux.f
new file mode 100644
index 0000000..ba19984
--- /dev/null
+++ b/ast/ast_tester/testspecflux.f
@@ -0,0 +1,331 @@
+ program testspecflux
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+
+ double precision xin, xout,yin, yout
+ integer status, sff, sff2, sf, ff, ff2, mp, fs, sf2,perm(2),csff
+ status = sai__ok
+
+ sf = ast_specframe( 'system=freq,unit=GHz', status )
+ ff = ast_Fluxframe( 123.0D0, sf, 'Unit=Jy', status )
+ sff = ast_specfluxframe( sf, ff, ' ', status )
+
+
+ if( ast_GetC( sff, 'class', status ) .ne. 'SpecFluxFrame' ) then
+ call stopit( status, 'Error 0' )
+ end if
+
+ if( ast_GetD( sff, 'specval', status ) .ne. 123.0D0 ) then
+ call stopit( status, 'Error 1' )
+ end if
+
+ if( ast_Test( sff, 'specval', status ) ) then
+ call stopit( status, 'Error 2' )
+ end if
+
+ call ast_setd( sff, 'specval', 333.3D0, status )
+ if( ast_GetD( sff, 'specval', status ) .ne. 333.3D0 ) then
+ call stopit( status, 'Error 3' )
+ end if
+
+ if( .not. ast_Test( sff, 'specval', status ) ) then
+ call stopit( status, 'Error 4' )
+ end if
+
+ call ast_clear( sff, 'specval', status )
+
+ if( ast_GetD( sff, 'specval', status ) .ne. 123.0D0 ) then
+ call stopit( status, 'Error 5' )
+ end if
+
+ if( ast_Test( sff, 'specval', status ) ) then
+ call stopit( status, 'Error 6' )
+ end if
+
+
+ call checkDump( sff, 'CheckDump 1', status )
+
+
+ ff2 = ast_Fluxframe( 123.1D0, sf, 'System=flxdnw', status )
+
+ if( ast_getc( ff2, 'unit', status ) .ne. 'W/m^2/Angstrom' )
+ : call stopit( status, 'Error 6B' )
+ if( ast_getc( ff2, 'system', status ) .ne. 'FLXDNW' )
+ : call stopit( status, 'error 6C' )
+
+ sff2 = ast_specfluxframe( sf, ff2, ' ', status )
+ if( ast_GetC( sff2, 'class', status ) .ne. 'SpecFluxFrame' ) then
+ call stopit( status, 'Error 7' )
+ end if
+
+ csff = ast_copy( sff,status )
+ fs = ast_convert( sff, sff2, ' ', status )
+ if( fs .eq. ast__null ) call stopit( status, 'error 8' )
+
+ yin = 1.0D0
+ xin = 2.0D0
+ call ast_tran2( fs, 1, xin, yin, .true., xout, yout, status )
+
+ if( abs(yout - 1.33425638D-26) .gt. 1.0D-32 )
+ : call stopit( status, 'error 9' )
+
+ if( xout .ne. 2.0D0 ) call stopit( status, 'error 10' )
+
+ perm(1)=2
+ perm(2)=1
+ call ast_PermAxes( sff2, perm, status )
+
+ fs = ast_convert( sff, sff2, ' ', status )
+ if( fs .eq. ast__null ) call stopit( status, 'error 11' )
+ call ast_tran2( fs, 1, xin, yin, .true., xout, yout, status )
+
+ if( abs(xout - 1.33425638D-26) .gt. 1.0D-32 )
+ : call stopit( status, 'error 12' )
+
+ if( yout .ne. 2.0D0 ) call stopit( status, 'error 13' )
+
+ perm(1)=2
+ perm(2)=1
+ call ast_PermAxes( sff, perm, status )
+
+ fs = ast_convert( sff, sff2, ' ', status )
+ if( fs .eq. ast__null ) call stopit( status, 'error 14' )
+
+ yin = 2.0D0
+ xin = 1.0D0
+ call ast_tran2( fs, 1, xin, yin, .true., xout, yout, status )
+
+ if( abs(xout - 1.33425638D-26) .gt. 1.0D-32 )
+ : call stopit( status, 'error 15' )
+
+ if( yout .ne. 2.0D0 ) call stopit( status, 'error 16' )
+
+
+
+ ff2 = ast_Fluxframe( AST__BAD, AST__NULL, 'Unit=log(W/m2/nm)',
+ : status )
+ if( ast_getc( ff2, 'system', status ) .ne. 'FLXDNW' )
+ : call stopit( status, 'error 17' )
+ sff2 = ast_specfluxframe( sf, ff2, ' ', status )
+
+ fs = ast_convert( csff, sff2, ' ', status )
+ if( fs .eq. ast__null ) call stopit( status, 'error 18' )
+
+ yin = 1.0D0
+ xin = 2.0D0
+ call ast_tran2( fs, 1, xin, yin, .true., xout, yout, status )
+
+ if( abs(yout + 24.8747607 ) .gt. 0.000001 ) then
+ write(*,*) yout + 24.8747607
+ call stopit( status, 'error 19' )
+ endif
+
+ if( xout .ne. 2.0D0 ) call stopit( status, 'error 20' )
+
+
+ call ast_tran2( fs, 1, xout, yout, .false., xin, yin, status )
+
+ if( abs( xin - 2.0D0 ) .gt. 1.0D-9 ) call stopit( status,
+ : 'error 21' )
+ if( abs( yin - 1.0D0 ) .gt. 1.0D-9 ) call stopit( status,
+ : 'error 22' )
+
+
+
+
+
+ ff2 = ast_Fluxframe( AST__BAD, AST__NULL, 'Unit=log(W/m2/nm/sr)',
+ : status )
+ if( ast_getc( ff2, 'system', status ) .ne. 'SFCBRW' )
+ : call stopit( status, 'error 23' )
+ sff2 = ast_specfluxframe( sf, ff2, ' ', status )
+
+ sf = ast_specframe( 'system=freq,unit=GHz', status )
+ ff = ast_Fluxframe( 123.0D0, sf, 'Unit=Jy/deg**2', status )
+ if( ast_getc( ff, 'system', status ) .ne. 'SFCBR' )
+ : call stopit( status, 'error 24' )
+ sff = ast_specfluxframe( sf, ff, ' ', status )
+
+ fs = ast_convert( sff, sff2, ' ', status )
+ if( fs .eq. ast__null ) call stopit( status, 'error 25' )
+
+ yin = 1.0D0
+ xin = 2.0D0
+ call ast_tran2( fs, 1, xin, yin, .true., xout, yout, status )
+
+ if( abs(yout + 21.3585154D0 ) .gt. 0.000001 )
+ : call stopit( status, 'error 26' )
+
+ if( xout .ne. 2.0D0 ) call stopit( status, 'error 27' )
+
+ call ast_tran2( fs, 1, xout, yout, .false., xin, yin, status )
+ if( abs( xin - 2.0D0 ) .gt. 1.0D-9 ) call stopit( status,
+ : 'error 28' )
+ if( abs( yin - 1.0D0 ) .gt. 1.0D-9 ) call stopit( status,
+ : 'error 29' )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if( status .eq. sai__ok ) then
+ write(*,*) 'All SpecFluxFrame tests passed'
+ else
+ write(*,*) 'SpecFluxFrame tests failed'
+ end if
+
+ end
+
+ subroutine stopit( status, text )
+ implicit none
+ include 'SAE_PAR'
+ integer status
+ character text*(*)
+
+ if( status .ne. sai__ok ) return
+ status = sai__error
+ write(*,*) text
+
+ end
+
+
+ subroutine checkdump( obj, text, status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ character text*(*)
+ integer obj, status, next, end, ch, result, ll, overlap
+ external mysource, mysink
+ character buf*25000
+
+ common /ss1/ buf
+ common /ss2/ next, end, ll
+
+ if( status .ne. sai__ok ) return
+
+ ch = ast_channel( mysource, mysink, ' ', status )
+
+
+ ll = 110
+ next = 1
+ if( ast_write( ch, obj, status ) .ne.1 ) then
+ write(*,*) text
+ call stopit( status, 'Cannot write supplied object to '//
+ : 'channel' )
+ end if
+
+ next = 1
+ result = ast_read( ch, status )
+ if( result .eq. ast__null ) then
+ write(*,*) text
+ call stopit( status, 'Cannot read object from channel' )
+ end if
+
+
+
+ if( ast_getd( obj, 'specval', status ) .ne.
+ : ast_getd( result, 'specval', status ) ) then
+ call ast_Show( obj, status )
+ call ast_Show( result, status )
+ write(*,*) text
+ call stopit( status, 'Object has changed' )
+ end if
+
+ end
+
+ subroutine sink1( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+
+ logical fsfound, done
+ common /sink1com/ fsfound, done
+
+ integer status, l
+ character line*200
+
+ if( status .ne. sai__ok ) return
+ call ast_getline( line, l, status )
+
+ if( index( line( : l ),'Unc =' ) .GT. 0 ) then
+ done = .true.
+
+ else if( .not. done .and.
+ : index( line( : l ),'FrameSet' ) .GT. 0 ) then
+ fsfound= .true.
+ end if
+
+ end
+
+ subroutine mysource( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ integer status, next, end, ll
+ character buf*25000
+
+ common /ss1/ buf
+ common /ss2/ next, end, ll
+
+ if( status .ne. sai__ok ) return
+
+ if( next .ge. end ) then
+ call ast_putline( buf, -1, status )
+ else
+ call ast_putline( buf( next : ), ll, status )
+ endif
+
+ next = next + ll
+
+ end
+
+ subroutine mysink( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ integer status, next, end, f, l, ll
+ character buf*25000
+ character line*1000
+
+ common /ss1/ buf
+ common /ss2/ next, end, ll
+
+ if( status .ne. sai__ok ) return
+
+ line = ' '
+ call ast_getline( line, l, status )
+ call chr_fandl( line( : l ), f, l )
+ buf( next : ) = line( f : l )
+ l = l - f + 1
+
+ if( next + ll - 1 .ge. 25000 ) then
+ write(*,*)
+ call stopit( status, 'Buffer overflow in mysink!!' )
+ else if( l .gt. ll ) then
+ write(*,*)
+ write(*,*) buf( next : next + l)
+ write(*,*) 'Line length ',l
+ call stopit( status, 'Line overflow in mysink!!' )
+ else
+ end = next + l
+ buf( end : next + ll - 1 ) = ' '
+ endif
+
+ next = next + ll
+
+ end
+
+
diff --git a/ast/ast_tester/testspecframe.f b/ast/ast_tester/testspecframe.f
new file mode 100644
index 0000000..4af2606
--- /dev/null
+++ b/ast/ast_tester/testspecframe.f
@@ -0,0 +1,251 @@
+ program testspecframe
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+
+ double precision rf, x, y
+ integer status, sf, sf1, sf2, fs
+ status = sai__ok
+
+ sf = ast_specframe( 'system=freq,unit=Hz', status )
+ if( ast_GetD( sf, 'SpecOrigin', status ) .ne. 0.0 ) then
+ call stopit( status, 'Error 0' )
+ end if
+
+ rf = ast_GetD( sf, 'RestFreq', status )
+ call ast_SetD( sf, 'SpecOrigin', rf*1.0D9, status )
+ if( abs( ast_GetD( sf, 'SpecOrigin', status ) - rf*1.0D9 )
+ : .gt. 0.1 ) then
+ call stopit( status, 'Error 1' )
+ end if
+
+ call ast_setc( sf, 'Unit(1)', 'GHz', status )
+ if( ast_GetD( sf, 'SpecOrigin', status ) .ne. rf ) then
+ call stopit( status, 'Error 2' )
+ end if
+
+ call checkdump( sf, 'Error 3', status )
+
+ call ast_setc( sf, 'System', 'vrad', status )
+ if( abs( ast_GetD( sf, 'SpecOrigin', status ) ) .gt. 1.0D-8 ) then
+ write(*,*) ast_GetD( sf, 'SpecOrigin', status )
+ call stopit( status, 'Error 4' )
+ end if
+
+ call ast_setc( sf, 'System', 'freq', status )
+ call ast_setc( sf, 'Unit(1)', 'Hz', status )
+
+ if( abs( ast_GetD( sf, 'SpecOrigin', status ) - rf*1.0D9 )
+ : .gt. 0.1 ) then
+ write(*,*) ast_GetD( sf, 'SpecOrigin', status )
+ call stopit( status, 'Error 5' )
+ end if
+
+ call ast_setc( sf, 'StdOfRest', 'LSRD', status )
+ if( abs( ast_GetD( sf, 'SpecOrigin', status ) -
+ : rf*1.00000212890848D9 ) .gt. 10.0 ) then
+ write(*,*) ast_GetD( sf, 'SpecOrigin', status )
+ write(*,*) 'Should be ',rf*1.00000212890848D9
+ call stopit( status, 'Error 6' )
+ end if
+
+
+ sf1 = ast_specframe( 'system=freq,unit=Hz', status )
+ call ast_setd( sf1, 'SpecOrigin', 1.0D20, status )
+ sf2 = ast_specframe( 'system=freq,unit=Hz', status )
+ call ast_setd( sf2, 'SpecOrigin', 1.01D20, status )
+ fs = ast_convert( sf1, sf2, "", status );
+
+ x = 0.03D20
+ call ast_tran1( fs, 1, x, .true., y, status )
+ if( abs( y - 0.02D20 ) .gt. 0.0 ) then
+ write(*,*) y, y - 0.02D20
+ call stopit( status, 'Error 7' )
+ end if
+
+ if( ast_getl( sf1, 'AlignSpecOffset', status ) ) then
+ call stopit( status, 'Error 8' )
+ end if
+ call ast_setl( sf1, 'AlignSpecOffset', .true., status )
+ call ast_setl( sf2, 'AlignSpecOffset', .true., status )
+
+ fs = ast_convert( sf1, sf2, "", status );
+
+ x = 0.03D20
+ call ast_tran1( fs, 1, x, .true., y, status )
+ if( abs( y - x ) .gt. 0.0 ) then
+ write(*,*) y, y - x
+ call stopit( status, 'Error 9' )
+ end if
+
+ sf = ast_specframe( 'system=freq,unit=Hz', status )
+ call ast_setc( sf, 'SourceVRF', 'LSRK', status )
+ call ast_setd( sf, 'SourceVel', 1000.0D0, status )
+
+ call ast_setc( sf, 'SourceVRF', 'BARY', status )
+ call ast_setc( sf, 'SourceSys', 'ZOPT', status )
+
+ if( abs( ast_getd( sf, 'SourceVel', status ) -
+ : 0.00334028336870307D0 ) .gt. 1.0D-10 ) then
+ write(*,*) ast_getd( sf, 'SourceVel', status )
+ call stopit( status, 'Error 11' )
+ end if
+
+ call checkdump( sf, 'Error 10', status )
+ call ast_setc( sf, 'SourceVRF', 'LSRK', status )
+ call ast_setc( sf, 'SourceSys', 'VREL', status )
+
+ if( abs( ast_getd( sf, 'SourceVel', status ) -
+ : 1000.0D0 ) .gt. 1.0D-6 ) then
+ write(*,*) ast_getd( sf, 'SourceVel', status )
+ call stopit( status, 'Error 12' )
+ end if
+
+ if( status .eq. sai__ok ) then
+ write(*,*) 'All SpecFrame tests passed'
+ else
+ write(*,*) 'SpecFrame tests failed'
+ end if
+
+ end
+
+ subroutine stopit( status, text )
+ implicit none
+ include 'SAE_PAR'
+ integer status
+ character text*(*)
+
+ if( status .ne. sai__ok ) return
+ status = sai__error
+ write(*,*) text
+
+ end
+
+
+ subroutine checkdump( obj, text, status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ character text*(*)
+ integer obj, status, next, end, ch, result, ll, overlap
+ external mysource, mysink
+ character buf*25000
+
+ common /ss1/ buf
+ common /ss2/ next, end, ll
+
+ if( status .ne. sai__ok ) return
+
+ ch = ast_channel( mysource, mysink, ' ', status )
+
+
+ ll = 110
+ next = 1
+ if( ast_write( ch, obj, status ) .ne.1 ) then
+ write(*,*) text
+ call stopit( status, 'Cannot write supplied object to '//
+ : 'channel' )
+ end if
+
+ next = 1
+ result = ast_read( ch, status )
+ if( result .eq. ast__null ) then
+ write(*,*) text
+ call stopit( status, 'Cannot read object from channel' )
+ end if
+
+
+
+ if( ast_getd( obj, 'specorigin', status ) .ne.
+ : ast_getd( result, 'specorigin', status ) ) then
+ call ast_Show( obj, status )
+ call ast_Show( result, status )
+ write(*,*) text
+ call stopit( status, 'Object has changed' )
+ end if
+
+ end
+
+ subroutine sink1( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+
+ logical fsfound, done
+ common /sink1com/ fsfound, done
+
+ integer status, l
+ character line*200
+
+ if( status .ne. sai__ok ) return
+ call ast_getline( line, l, status )
+
+ if( index( line( : l ),'Unc =' ) .GT. 0 ) then
+ done = .true.
+
+ else if( .not. done .and.
+ : index( line( : l ),'FrameSet' ) .GT. 0 ) then
+ fsfound= .true.
+ end if
+
+ end
+
+ subroutine mysource( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ integer status, next, end, ll
+ character buf*25000
+
+ common /ss1/ buf
+ common /ss2/ next, end, ll
+
+ if( status .ne. sai__ok ) return
+
+ if( next .ge. end ) then
+ call ast_putline( buf, -1, status )
+ else
+ call ast_putline( buf( next : ), ll, status )
+ endif
+
+ next = next + ll
+
+ end
+
+ subroutine mysink( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ integer status, next, end, f, l, ll
+ character buf*25000
+ character line*1000
+
+ common /ss1/ buf
+ common /ss2/ next, end, ll
+
+ if( status .ne. sai__ok ) return
+
+ line = ' '
+ call ast_getline( line, l, status )
+ call chr_fandl( line( : l ), f, l )
+ buf( next : ) = line( f : l )
+ l = l - f + 1
+
+ if( next + ll - 1 .ge. 25000 ) then
+ write(*,*)
+ call stopit( status, 'Buffer overflow in mysink!!' )
+ else if( l .gt. ll ) then
+ write(*,*)
+ write(*,*) buf( next : next + l)
+ write(*,*) 'Line length ',l
+ call stopit( status, 'Line overflow in mysink!!' )
+ else
+ end = next + l
+ buf( end : next + ll - 1 ) = ' '
+ endif
+
+ next = next + ll
+
+ end
+
+
diff --git a/ast/ast_tester/teststc.f b/ast/ast_tester/teststc.f
new file mode 100644
index 0000000..47c3c02
--- /dev/null
+++ b/ast/ast_tester/teststc.f
@@ -0,0 +1,1858 @@
+ program teststc
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ include 'PRM_PAR'
+
+
+
+ integer status
+
+ status = sai__ok
+
+
+c call ast_SetWatchId( 565300 )
+
+ call ast_begin( status )
+ call Example5( status )
+ call Example1( status )
+ call Example1b( status )
+ call Example4( status )
+ call misc( status )
+ call Example3( status )
+ call Example2( status )
+ call ast_end( status )
+
+c call ast_listissued( 'teststc' )
+
+
+ if( status .eq. sai__ok ) then
+ write(*,*) 'All Stc tests passed'
+ else
+ write(*,*) 'Stc tests failed'
+ end if
+
+ end
+
+
+ subroutine misc( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ include 'AST_ERR'
+
+
+ integer status, obj1, obj2, overlap
+ double precision x, y, xo, yo
+
+ if( status .ne. sai__ok ) return
+
+ call ast_begin( status )
+
+ call puteg( 'teststc_eg6', 1, status )
+ call xmlread( 1, obj1, ' ', status )
+ obj1 = ast_simplify( obj1, status )
+ call checkdump( obj1, 'checkdump 1', status )
+
+ call puteg( 'teststc_eg7', 1, status )
+ call xmlread( 1, obj2, ' ', status )
+ obj2 = ast_simplify( obj2, status )
+ call checkdump( obj2, 'checkdump 2', status )
+
+ overlap = ast_overlap( obj1, obj2, status )
+ if( overlap .ne. 4 .and.status .eq. sai__ok ) then
+ write(*,*) 'Overlap is ',overlap,' (should be 4)'
+ call stopit( status, 'Error 1' )
+ endif
+
+ call puteg( 'teststc_eg8', 1, status )
+ call xmlread( 1, obj2, ' ', status )
+ obj2 = ast_simplify( obj2, status )
+ call checkdump( obj2, 'checkdump 3', status )
+
+ overlap = ast_overlap( obj1, obj2, status )
+ if( overlap .ne. 3 .and.status .eq. sai__ok ) then
+ write(*,*) 'Overlap is ',overlap,' (should be 3)'
+ call stopit( status, 'Error 2' )
+ endif
+
+ overlap = ast_overlap( obj2, obj1, status )
+ if( overlap .ne. 2 .and.status .eq. sai__ok ) then
+ write(*,*) 'Overlap is ',overlap,' (should be 2)'
+ call stopit( status, 'Error 3' )
+ endif
+
+ call puteg( 'teststc_eg9', 1, status )
+ call xmlread( 1, obj2, ' ', status )
+
+ overlap = ast_overlap( obj1, obj2, status )
+ if( overlap .ne. 1 .and.status .eq. sai__ok ) then
+ write(*,*) 'Overlap is ',overlap,' (should be 1)'
+ call stopit( status, 'Error 4' )
+ endif
+
+
+ call puteg( 'teststc_eg10', 1, status )
+ call xmlread( 1, obj2, ' ', status )
+
+ x = 2.4958208
+ y = 0.73303829
+ call ast_tran2( obj2, 1, x, y, .true., xo, yo, status )
+ if( xo .ne. 2.4958208 .or. yo .ne. 0.73303829 ) then
+ call stopit( status, 'Error 5' )
+ end if
+
+ x = 2.4958208
+ y = -0.73303829
+ call ast_tran2( obj2, 1, x, y, .true., xo, yo, status )
+ if( xo .ne. AST__BAD .or. yo .ne. AST__BAD ) then
+ call stopit( status, 'Error 6' )
+ end if
+
+
+
+
+ call ast_end( status )
+
+ if( status .ne. sai__ok ) write(*,*) 'teststc: miscellaneous '//
+ : 'tests failed'
+
+ end
+
+ subroutine Example1( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ include 'AST_ERR'
+
+ integer status, obj2, obj, i, j, unc, km, nval, fs, m, r, f,
+ : axes(2), map
+ double precision in(8,4), out(8,4), lbnd(5), ubnd(5)
+ character cvals(10)*30
+
+ if( status .ne. sai__ok ) return
+
+ call ast_begin( status )
+
+* Put an example of an STCResourceProfile into file 1.
+ call puteg( 'teststc_eg1', 1, status )
+
+* Use a new XmlChan to read an object from file 1,and simplify it.
+ call xmlread( 1, obj, ' ', status )
+ obj = ast_simplify( obj, status )
+
+* Write out the object through a Channel and read it back.
+ call checkdump( obj, 'checkdump 1', status )
+
+* Test simplify by negating and simplifying twice.
+ call ast_negate( obj, status )
+ obj = ast_simplify( obj, status )
+ call ast_negate( obj, status )
+ obj = ast_simplify( obj, status )
+
+* Check it is a STCResourceProfile
+ if( .not. ast_isastcresourceprofile( obj, status ) )
+ : call stopit( status, 'Error 1' )
+
+* Check it contains an Interval.
+ if( .not. ast_isainterval( ast_getstcregion( obj, status ),
+ : status ) )
+ : call stopit( status, 'Error 1a' )
+
+* Timescale should be tt. Try changing it to TAI.
+ if( ast_getc( obj, 'timescale', status ) .ne. 'TT' )
+ : call stopit( status, 'Error 0a' )
+
+ if( abs( ast_getd(obj,'TimeOrigin',status)-51382.6666666D0 )
+ : .gt. 1.0D-7 ) call stopit( status, 'Error 0b' )
+
+ call ast_getregionbounds( obj, lbnd, ubnd, status )
+ if( lbnd(3) .ne. 0.0 ) call stopit( status, 'Error 0c' )
+
+ call ast_set( obj, 'timescale=tai', status )
+ if( ast_getc( obj, 'timescale', status ) .ne. 'TAI' )
+ : call stopit( status, 'Error 0d' )
+
+ if( abs( ast_getd(obj,'TimeOrigin',status)-51382.6662941667D0 )
+ : .gt. 1.0D-7 ) call stopit( status, 'Error 0e' )
+
+ call ast_getregionbounds( obj, lbnd, ubnd, status )
+ if( abs( lbnd(3) ) .gt. 1.0D-6 ) THEN
+ write(*,*) lbnd(3)
+ call stopit( status, 'Error 0f' )
+ END IF
+
+
+ call ast_set( obj, 'timescale=tt', status )
+ obj = ast_Simplify( obj, status )
+ if( ast_getc( obj, 'timescale', status ) .ne. 'TT' )
+ : call stopit( status, 'Error 0g' )
+
+ if( abs( ast_getd(obj,'TimeOrigin',status)-51382.6666666D0 )
+ : .gt. 1.0D-7 ) call stopit( status, 'Error 0h' )
+
+ call ast_getregionbounds( obj, lbnd, ubnd, status )
+ if( abs( lbnd(3) ) .gt. 1.0D-6 )
+ : call stopit( status, 'Error 0i' )
+
+
+
+* Other tests
+ if( ast_getd( obj, 'fillfactor', status ) .ne. 0.02D0 )
+ : call stopit( status, 'Error 1b' )
+
+ if( ast_getc( obj, 'ident', status ) .ne. 'AllSky-CXO' )
+ : call stopit( status, 'Error 1c' )
+
+ if( ast_getc( obj, 'domain(3)', status ) .ne. 'TIME' )
+ : call stopit( status, 'Error 2' )
+
+ if( ast_getc( obj, 'title(3)', status ) .ne. 'Time' )
+ : call stopit( status, 'Error 2a' )
+
+ if( ast_getc( obj, 'label(3)', status ) .ne.
+ : 'Modified Julian Date offset from 1999-07-23 16:00:00' ) THEN
+ call stopit( status, 'Error 2b' )
+ end if
+
+ if( ast_getc( obj, 'domain(1)', status ) .ne. 'SKY' )
+ : call stopit( status, 'Error 3' )
+
+ if( ast_getc( obj, 'system(1)', status ) .ne. 'ICRS' )
+ : call stopit( status, 'Error 3a' )
+
+ if( ast_getc( obj, 'label(1)', status ) .ne. 'Right ascension' )
+ : call stopit( status, 'Error 3b' )
+
+ if( ast_getc( obj, 'label(2)', status ) .ne. 'Declination' )
+ : call stopit( status, 'Error 3c' )
+
+ if( ast_getc( obj, 'title(2)', status ) .ne. 'Space' )
+ : call stopit( status, 'Error 3d' )
+
+ if( ast_getc( obj, 'domain(2)', status ) .ne. 'SKY' )
+ : call stopit( status, 'Error 4' )
+
+ if( ast_getc( obj, 'domain(4)', status ) .ne. 'SPECTRUM' )
+ : call stopit( status, 'Error 5' )
+
+ if( ast_getc( obj, 'system(4)', status ) .ne. 'ENER' )
+ : call stopit( status, 'Error 5a' )
+
+ if( ast_getc( obj, 'stdofrest', status ) .ne. 'Topocentric' )
+ : call stopit( status, 'Error 5b' )
+
+ if( ast_getc( obj, 'title(4)', status ) .ne.
+ : 'Energy (Topocentric)' ) call stopit( status, 'Error 5c' )
+
+ if( ast_getc( obj, 'unit(4)', status ) .ne. 'keV' )
+ : call stopit( status, 'Error 5d' )
+
+ if( ast_geti( obj, 'naxes', status ) .ne. 4 )
+ : call stopit( status, 'Error 6' )
+
+ in(1,1) = 10.0
+ in(1,2) = 10.0
+ in(1,3) = -0.1
+ in(1,4) = 0.11
+
+ in(2,1) = -10.0
+ in(2,2) = 10.0
+ in(2,3) = 0.1
+ in(2,4) = 0.11
+
+ in(3,1) = 0.0 ! inside
+ in(3,2) = 0.0
+ in(3,3) = 100.0
+ in(3,4) = 0.13
+
+ in(4,1) = -1.0
+ in(4,2) = 1.0
+ in(4,3) = -100.0
+ in(4,4) = 0.13
+
+ in(5,1) = 10.0
+ in(5,2) = 10.0
+ in(5,3) = -1000.0
+ in(5,4) = 9.9
+
+ in(6,1) = -10.0 ! inside
+ in(6,2) = 10.0
+ in(6,3) = 1000.0
+ in(6,4) = 9.9
+
+ in(7,1) = 0.0
+ in(7,2) = 0.0
+ in(7,3) = 10.0
+ in(7,4) = 10.1
+
+ in(8,1) = -1.0
+ in(8,2) = 1.0
+ in(8,3) = -10.0
+ in(8,4) = 10.1
+
+ call ast_trann( obj, 8, 4, 8, in, .true., 4, 8, out, status )
+
+ do i = 1, 8
+ if( i .eq. 3 .or. i .eq. 6 ) then
+ do j = 1, 4
+ if( out(i,j) .ne. in(i,j) ) then
+ if( status .eq. sai__ok ) then
+ write(*,*) i,j,out(i,j),in(i,j)
+ call stopit( status, 'Error 7' )
+ end if
+ end if
+ end do
+ else
+ do j = 1, 4
+ if( out(i,j) .ne. AST__BAD ) then
+ if( status .eq. sai__ok ) then
+ write(*,*) i,j,out(i,j),in(i,j)
+ call stopit( status, 'Error 8' )
+ end if
+ end if
+ end do
+ end if
+ end do
+
+* AstroCoords
+ if( ast_getstcncoord( obj, status ) .ne. 1 ) then
+ call stopit( status, 'Error 25' )
+ end if
+ km = ast_getstccoord( obj, 1, status )
+
+ if( ast_mapsize( km, status ) .ne. 4 ) then
+ call stopit( status, 'Error 25b' )
+ endif
+
+ if( .not. ast_mapget0A( km, AST__STCERROR, r, status ) ) then
+ call stopit( status, 'Error 26' )
+ else if( .not.ast_isabox( r, status ) ) then
+ call stopit( status, 'Error 27' )
+ else if( ast_geti( r, 'naxes', status ) .ne. 4 ) then
+ call stopit( status, 'Error 28' )
+ else
+ fs = ast_convert( obj, r, ' ', status )
+ if( fs .eq. AST__NULL ) then
+ call stopit( status, 'Error 29' )
+ else
+ m = ast_getMapping( fs, AST__BASE, AST__CURRENT, status )
+ m = ast_simplify( m, status )
+ if( .not. ast_isaunitmap( m, status ) ) then
+ call stopit( status, 'Error 30' )
+ endif
+ end if
+
+
+ call ast_getregionbounds( r, lbnd, ubnd, status )
+
+ if( abs( lbnd(1)+2.42406841E-06 ) .gt. 0.0001E-6 )
+ : call stopit( status, 'Error 31a' )
+ if( abs( ubnd(1)-2.42406841E-06 ) .gt. 0.0001E-6 )
+ : call stopit( status, 'Error 31b' )
+ if( abs( lbnd(2)+2.42406841E-06 ) .gt. 0.0001E-6 )
+ : call stopit( status, 'Error 31c' )
+ if( abs( ubnd(2)-2.42406841E-06 ) .gt. 0.0001E-6 )
+ : call stopit( status, 'Error 31d' )
+ if( abs( 0.5*(ubnd(3)+lbnd(3)) ) .gt. 1.0E-10)
+ : call stopit( status, 'Error 31e' )
+ if( abs( 0.5*(ubnd(3)-lbnd(3))-0.578703703718D-09 ) .gt.
+ : 1.0E-15 ) call stopit( status, 'Error 31e2' )
+ if( abs( lbnd(4)-5.01 ) .gt. 0.00001 )
+ : call stopit( status, 'Error 31g' )
+ if( abs( ubnd(4)-5.11 ) .gt. 0.00001 )
+ : call stopit( status, 'Error 31h' )
+
+ end if
+
+
+ if( .not. ast_mapget1C( km, AST__STCNAME, 6, nval, cvals,
+ : status ) ) then
+ call stopit( status, 'Error 32' )
+
+ else if( nval .ne. 4 ) then
+ call stopit( status, 'Error 33' )
+ else
+ if( cvals(1) .ne. 'Position' )
+ : call stopit( status, 'Error 34a' )
+ if( cvals(2) .ne. 'Position' )
+ : call stopit( status, 'Error 34b' )
+ if( cvals(3) .ne. 'Time' )
+ : call stopit( status, 'Error 34c' )
+ if( cvals(4) .ne. 'Energy' )
+ : call stopit( status, 'Error 34d' )
+ end if
+
+ if( .not. ast_mapget0A( km, AST__STCRES, r, status ) ) then
+ call stopit( status, 'Error 35' )
+ else if( .not.ast_isabox( r, status ) ) then
+ call stopit( status, 'Error 36' )
+ else if( ast_geti( r, 'naxes', status ) .ne. 4 ) then
+ call stopit( status, 'Error 37' )
+ else
+ fs = ast_convert( obj, r, ' ', status )
+ if( fs .eq. AST__NULL ) then
+ call stopit( status, 'Error 38' )
+ else
+ m = ast_getMapping( fs, AST__BASE, AST__CURRENT, status )
+ m = ast_simplify( m, status )
+ if( .not. ast_isaunitmap( m, status ) ) then
+ call stopit( status, 'Error 39' )
+ endif
+ end if
+
+ call ast_getregionbounds( r, lbnd, ubnd, status )
+
+ if( abs( lbnd(1)+1.2120342E-06 ) .gt. 0.0001E-6 )
+ : call stopit( status, 'Error 40a' )
+ if( abs( ubnd(1)-1.2120342E-06 ) .gt. 0.0001E-6 )
+ : call stopit( status, 'Error 40b' )
+ if( abs( lbnd(2)+1.2120342E-06 ) .gt. 0.0001E-6 )
+ : call stopit( status, 'Error 40c' )
+ if( abs( ubnd(2)-1.2120342E-06 ) .gt. 0.0001E-6 )
+ : call stopit( status, 'Error 40d' )
+
+ if( abs( 86400.0D0*(ubnd(3)-lbnd(3))-1.6D-5 ) .gt. 1.0E-10 )
+ : call stopit( status, 'Error 40e' )
+ if( abs( 0.5*(ubnd(3)+lbnd(3)) ) .gt. 1.0E-10 )
+ : call stopit( status, 'Error 40f' )
+ if( abs( lbnd(4)-5.05 ) .gt. 0.00001 )
+ : call stopit( status, 'Error 40g' )
+ if( abs( ubnd(4)-5.07 ) .gt. 0.00001 )
+ : call stopit( status, 'Error 40h' )
+
+ end if
+
+ if( .not. ast_mapget0A( km, AST__STCSIZE, r, status ) ) then
+ call stopit( status, 'Error 41' )
+ else if( .not.ast_isabox( r, status ) ) then
+ call stopit( status, 'Error 42' )
+ else if( ast_geti( r, 'naxes', status ) .ne. 4 ) then
+ call stopit( status, 'Error 43' )
+ else
+ fs = ast_convert( obj, r, ' ', status )
+ if( fs .eq. AST__NULL ) then
+ call stopit( status, 'Error 44' )
+ else
+ m = ast_getMapping( fs, AST__BASE, AST__CURRENT, status )
+ m = ast_simplify( m, status )
+ if( .not. ast_isaunitmap( m, status ) ) then
+ call stopit( status, 'Error 45' )
+ endif
+ end if
+
+ call ast_getregionbounds( r, lbnd, ubnd, status )
+
+ if( abs( lbnd(1)+0.00242406841 ) .gt. 0.01E-6 )
+ : call stopit( status, 'Error 46a' )
+ if( abs( ubnd(1)-0.00242406841 ) .gt. 0.01E-6 )
+ : call stopit( status, 'Error 46b' )
+ if( abs( lbnd(2)+0.00242406841 ) .gt. 0.01E-6 )
+ : call stopit( status, 'Error 46c' )
+ if( abs( ubnd(2)-0.00242406841 ) .gt. 0.01E-6 )
+ : call stopit( status, 'Error 46d' )
+ if( abs( 86400.0D0*(ubnd(3)-lbnd(3))- 1000.0 ) .gt. 1.0E-10 )
+ : call stopit( status, 'Error 46e' )
+ if( abs( 0.5*(ubnd(3)+lbnd(3)) ) .gt. 1.0E-10 )
+ : call stopit( status, 'Error 46f' )
+ if( abs( lbnd(4)-4.06 ) .gt. 0.001 )
+ : call stopit( status, 'Error 46g' )
+ if( abs( ubnd(4)-6.06 ) .gt. 0.001 )
+ : call stopit( status, 'Error 46h' )
+
+ end if
+
+
+
+
+
+
+ obj2 = ast_Copy( obj, status )
+
+ call ast_setl( obj2, 'Adaptive', .false., status )
+ call ast_setc( obj2, 'epoch', '2005', status )
+ call ast_clear( obj2, 'Adaptive', status )
+
+ call ast_setc( obj2, 'system(1)', 'galactic', status )
+
+ if( ast_getstcncoord( obj2, status ) .ne. 1 ) then
+ call stopit( status, 'Error 25b' )
+ end if
+ km = ast_getstccoord( obj2, 1, status )
+
+ if( ast_mapsize( km, status ) .ne. 3 ) then
+ call stopit( status, 'Error 25bb' )
+ end if
+
+ if( .not. ast_mapget0A( km, AST__STCERROR, r, status ) ) then
+ call stopit( status, 'Error 26b' )
+ else if( .not.ast_isaprism( r, status ) ) then
+ call stopit( status, 'Error 27b' )
+ else if( ast_geti( r, 'naxes', status ) .ne. 4 ) then
+ call stopit( status, 'Error 28b' )
+ else
+ fs = ast_convert( obj2, r, ' ', status )
+ if( fs .eq. AST__NULL ) then
+ call stopit( status, 'Error 29b' )
+ else
+ m = ast_getMapping( fs, AST__BASE, AST__CURRENT, status )
+ m = ast_simplify( m, status )
+ if( .not. ast_isaunitmap( m, status ) ) then
+ call stopit( status, 'Error 30b' )
+ endif
+ end if
+
+ call ast_getregionbounds( r, lbnd, ubnd, status )
+
+ if( abs( lbnd(1)-1.68139639 ) .gt. 1.0E-7 )
+ : call stopit( status, 'Error 31ab' )
+ if( abs( ubnd(1)-1.68140922 ) .gt. 1.0E-7 )
+ : call stopit( status, 'Error 31bb' )
+ if( abs( lbnd(2)+1.05049161 ) .gt. 1.0E-7 )
+ : call stopit( status, 'Error 31cb' )
+ if( abs( ubnd(2)+1.05048523 ) .gt. 1.0E-7 )
+ : call stopit( status, 'Error 31db' )
+ if( abs( 0.5*86400.0D0*(ubnd(3)-lbnd(3))- 5.0D-5) .gt. 1.0E-10)
+ : call stopit( status, 'Error 31eb' )
+ if( abs( 0.5*86400.0D0*(ubnd(3)+lbnd(3))) .gt. 1.0E-10 )
+ : call stopit( status, 'Error 31fb' )
+ if( abs( lbnd(4)-5.01 ) .gt. 0.000001 )
+ : call stopit( status, 'Error 31gb' )
+ if( abs( ubnd(4)-5.11 ) .gt. 0.000001 )
+ : call stopit( status, 'Error 31hb' )
+
+ end if
+
+
+ if( ast_mapget1C( km, AST__STCNAME, 6, nval, cvals, status ))
+ : call stopit( status, 'Error 32b' )
+
+
+* Uncertainty tests
+
+ unc = ast_getunc( obj, .true., status )
+
+ if( unc .eq. AST__NULL ) call stopit( status, 'Error 9' )
+ if( ast_getunc( unc, .false., status ) .ne. AST__NULL )
+ : call stopit( status, 'Error 9a' )
+
+ call ast_getregionbounds( unc, lbnd, ubnd, status )
+
+
+ if( abs( lbnd(1) + 2.42406841E-06 ) .gt. 0.0000001E-06 )
+ : call stopit( status, 'Error 10' )
+
+ if( abs( lbnd(2) + 2.42406841E-06 ) .gt. 0.0000001E-06 )
+ : call stopit( status, 'Error 11' )
+
+c if( abs( 86400.0D0*lbnd(3) + 4.9662776D-5 ) .gt. 0.1E-10 )
+c : call stopit( status, 'Error 12' )
+ if( abs( lbnd(4) - 0.07 ) .gt. 0.0001 )
+ : call stopit( status, 'Error 13' )
+ if( abs( ubnd(1) - 2.42406841E-06 ) .gt. 0.0000001E-06 )
+ : call stopit( status, 'Error 14' )
+ if( abs( ubnd(2) - 2.42406841E-06 ) .gt. 0.0000001E-06 )
+ : call stopit( status, 'Error 15' )
+c if( abs( 86400.0D0*ubnd(3) - 4.9662776D-5 ) .gt. 0.1E-10 )
+c : call stopit( status, 'Error 16' )
+ if( abs( ubnd(4) - 0.17 ) .gt. 0.0001 )
+ : call stopit( status, 'Error 17' )
+
+
+* UseDefs tests.
+c if( status .eq. SAI__OK ) then
+c obj2 = ast_copy( obj, status )
+c call err_begin( status )
+c call ast_set( obj2, 'System=FK4', status )
+c if( status .ne. AST__NOVAL ) then
+c write(*,*) 'status is ',status,': should be ',AST__NOVAL
+c if( status .ne. sai__ok ) call err_annul( status )
+c call stopit( status, 'Error 18' )
+c else
+c call err_annul( status )
+c end if
+c call err_end( status )
+c call ast_annul( obj2, status )
+c end if
+c
+c if( status .eq. SAI__OK ) then
+c obj2 = ast_copy( obj, status )
+c call err_begin( status )
+c call ast_set( obj2, 'System=velo', status )
+c if( status .ne. AST__NOVAL ) then
+c write(*,*) 'status is ',status,': should be ',AST__NOVAL
+c if( status .ne. sai__ok ) call err_annul( status )
+c call stopit( status, 'Error 19' )
+c else
+c call err_annul( status )
+c end if
+c call err_end( status )
+c call ast_annul( obj2, status )
+c end if
+
+ call ast_set( obj, 'Unit(4)=J', status )
+
+ if( status .ne. SAI__OK ) call stopit( status, 'Error 20' )
+
+* Tests on reference values
+ if( ast_test( obj, 'RefRA(4)', status ) ) then
+ call stopit( status, 'Error 21' )
+ end if
+
+ if( ast_test( obj, 'RefDec(4)', status ) ) then
+ call stopit( status, 'Error 22' )
+ end if
+
+c if( ast_test( obj, 'Epoch(4)', status ) ) then
+c call stopit( status, 'Error 22' )
+c end if
+
+c if( ast_test( obj, 'Epoch(1)', status ) ) then
+c call stopit( status, 'Error 23' )
+c end if
+
+c if( ast_test( obj, 'Epoch(2)', status ) ) then
+c call stopit( status, 'Error 24' )
+c end if
+
+
+
+
+ call ast_end( status )
+
+ if( status .ne. sai__ok ) write(*,*) 'teststc: example 1 '//
+ : 'tests failed'
+
+ end
+
+
+ subroutine Example1b( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ include 'AST_ERR'
+
+ include 'teststc_com'
+
+ integer status, obj, i, l
+ character value*200
+
+ if( status .ne. sai__ok ) return
+
+ call ast_begin( status )
+
+* Test the Strict attribute.
+ call puteg( 'teststc_eg1', 1, status )
+
+ call err_mark
+ call xmlread( 1, obj, 'Strict=1', status )
+
+ if( status .ne. ast__badin ) then
+ if( status .ne. sai__ok ) call err_flush( status )
+ call stopit( status, 'Error 1' )
+ else
+ call err_annul( status )
+ end if
+ call err_rlse
+
+* Test the ast_warnings function.
+ call xmlread( 1, obj, 'Strict=0', status )
+ if( warns .EQ. AST__NULL ) then
+ call stopit( status, 'Error 2' )
+
+ else if( ast_mapsize( warns, status ) .ne. 5 ) then
+ call stopit( status, 'Error 3' )
+
+ else if( .not. ast_mapget0c( warns, 'Warning_1', value, l,
+ : status ) ) then
+ call stopit( status, 'Error 4' )
+
+ else if( value(:l) .ne. 'astRead(XmlChan): Warning whilst '//
+ : 'reading a Position2D element: contains more than '//
+ : 'one <Size> element. AST can only use the first' ) then
+ call stopit( status, 'Error 5' )
+ end if
+
+
+ call ast_end( status )
+
+ if( status .ne. sai__ok ) write(*,*) 'teststc: example 1b '//
+ : 'tests failed'
+
+ end
+
+
+ subroutine Example2( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+
+ integer status, obj, i, j
+ double precision in(12,5), out(12,5)
+
+ if( status .ne. sai__ok ) return
+
+ call ast_begin( status )
+
+* Put an example of a CatalogEntryLocation into file 1.
+ call puteg( 'teststc_eg2', 1, status )
+
+* Use a new XmlChan to read an object from file 1,and simplify it.
+ call xmlread( 1, obj, ' ', status )
+ obj = ast_simplify( obj, status )
+
+* Test simplify by negating and simplifying twice.
+ call ast_negate( obj, status )
+ obj = ast_simplify( obj, status )
+ call ast_negate( obj, status )
+ obj = ast_simplify( obj, status )
+ call checkdump( obj, 'checkdump 1', status )
+
+* Check it is a StcCatalogEntryLocation
+ if( .not. ast_isastcCatalogEntryLocation( obj, status ) )
+ : call stopit( status, 'Error 1' )
+
+* Check it is an Interval.
+ if( .not. ast_isainterval( ast_getstcregion( obj, status ),
+ : status ) )
+ : call stopit( status, 'Error 1a' )
+
+* Check it has no uncertainty
+ if( ast_getunc( obj, .false., status ) .NE. AST__NULL )
+ : call stopit( status, 'Error 1b' )
+
+* Other tests
+ if( ast_geti( obj, 'naxes', status ) .ne. 5 )
+ : call stopit( status, 'Error 1ab' )
+
+ if( ast_getd( obj, 'fillfactor', status ) .ne. 1.0D0 )
+ : call stopit( status, 'Error 1b' )
+
+ if( ast_getc( obj, 'ident', status ) .ne. 'RA6-18hDec20-70deg' )
+ : call stopit( status, 'Error 1c' )
+
+ if( ast_getc( obj, 'domain(3)', status ) .ne. 'TIME' )
+ : call stopit( status, 'Error 2' )
+
+ if( ast_getc( obj, 'title(3)', status ) .ne.
+ : 'Julian Date [TT] offset from 1968-05-23 12:00:00' )
+ : call stopit( status, 'Error 2a' )
+
+ if( ast_getc( obj, 'label(3)', status ) .ne.
+ : 'Julian Date offset from 1968-05-23 12:00:00' ) THEN
+ call stopit( status, 'Error 2b' )
+ endif
+
+ if( ast_getc( obj, 'domain(1)', status ) .ne. 'SKY' )
+ : call stopit( status, 'Error 3' )
+
+ if( ast_getc( obj, 'system(1)', status ) .ne. 'FK4' )
+ : call stopit( status, 'Error 3a' )
+
+ if( ast_getc( obj, 'label(1)', status ) .ne. 'Right ascension' )
+ : call stopit( status, 'Error 3b' )
+
+ if( ast_getc( obj, 'label(2)', status ) .ne. 'Declination' )
+ : call stopit( status, 'Error 3c' )
+
+ if( ast_getc( obj, 'title(2)', status ) .ne. 'PosEq' )
+ : call stopit( status, 'Error 3d' )
+
+ if( ast_getd( obj, 'Equinox', status ) .ne. 1950D0 )
+ : call stopit( status, 'Error 3d' )
+
+ if( ast_getc( obj, 'domain(2)', status ) .ne. 'SKY' )
+ : call stopit( status, 'Error 4' )
+
+ if( ast_getc( obj, 'domain(4)', status ) .ne. 'SPECTRUM' )
+ : call stopit( status, 'Error 5' )
+
+ if( ast_getc( obj, 'system(4)', status ) .ne. 'WAVE' )
+ : call stopit( status, 'Error 5a' )
+
+ if( ast_getc( obj, 'stdofrest', status ) .ne. 'Topocentric' )
+ : call stopit( status, 'Error 5b' )
+
+ if( ast_test( obj, 'title(4)', status ) )
+ : call stopit( status, 'Error 5c' )
+
+ if( ast_geti( obj, 'naxes', status ) .ne. 5 )
+ : call stopit( status, 'Error 6' )
+
+ if( ast_getc( obj, 'domain(5)', status ) .ne. 'REDSHIFT' )
+ : call stopit( status, 'Error 6a' )
+
+ if( ast_getc( obj, 'system(5)', status ) .ne. 'VOPT' )
+ : call stopit( status, 'Error 6b' )
+
+ if( ast_getc( obj, 'label(5)', status ) .ne. 'Optical velocity' )
+ : call stopit( status, 'Error 6c' )
+
+ if( ast_getc( obj, 'unit(5)', status ) .ne. 'km/s' )
+ : call stopit( status, 'Error 6d' )
+
+ if( ast_getc( obj, 'unit(4)', status ) .ne. 'Angstrom' )
+ : call stopit( status, 'Error 6e' )
+
+
+ in(1,1) = 4.71238 ! inside
+ in(1,2) = 1.2216
+ in(1,3) = 1
+ in(1,4) = 6499.9
+ in(1,5) = 9999.9
+
+ in(2,1) = 4.71240 ! outside
+ in(2,2) = 1.2216
+ in(2,3) = 1
+ in(2,4) = 6499.9
+ in(2,5) = 9999.9
+
+ in(3,1) = 4.71238 ! outside
+ in(3,2) = 1.2218
+ in(3,3) = 1
+ in(3,4) = 6499.9
+ in(3,5) = 9999.9
+
+ in(4,1) = 4.71238 ! outside
+ in(4,2) = 1.2216
+ in(4,3) = -0.6
+ in(4,4) = 6499.9
+ in(4,5) = 9999.9
+
+ in(5,1) = 4.71238 ! outside
+ in(5,2) = 1.2216
+ in(5,3) = 1
+ in(5,4) = 6500.1
+ in(5,5) = 9999.9
+
+ in(6,1) = 4.71238 ! outside
+ in(6,2) = 1.2216
+ in(6,3) = 1
+ in(6,4) = 6499.9
+ in(6,5) = 10000.1
+
+ in(7,1) = 1.5709 ! inside
+ in(7,2) = 0.3492
+ in(7,3) = 999.6
+ in(7,4) = 5000.1
+ in(7,5) = 5000
+
+ in(8,1) = 1.5707 ! outside
+ in(8,2) = 0.3492
+ in(8,3) = 999.6
+ in(8,4) = 5000.1
+ in(8,5) = 5000
+
+ in(9,1) = 1.5709 ! outside
+ in(9,2) = 0.3490
+ in(9,3) = 999.6
+ in(9,4) = 5000.1
+ in(9,5) = 5000
+
+ in(10,1) = 1.5709 ! outside
+ in(10,2) = 0.3492
+ in(10,3) = 1000.4
+ in(10,4) = 5000.1
+ in(10,5) = 5000
+
+ in(11,1) = 1.5709 ! outside
+ in(11,2) = 0.3492
+ in(11,3) = 999.6
+ in(11,4) = 4999.9
+ in(11,5) = 5000
+
+ in(12,1) = 1.5709 ! inside
+ in(12,2) = 0.3492
+ in(12,3) = 999.6
+ in(12,4) = 5000.1
+ in(12,5) = 1000
+
+ call ast_trann( obj, 12, 5, 12, in, .true., 5, 12, out, status )
+
+ do i = 1, 12
+ if( i .eq. 1 .or. i .eq. 7 .or. i .eq. 12 ) then ! inside points
+ do j = 1, 5
+ if( out(i,j) .ne. in(i,j) ) then
+ if( status .eq. sai__ok ) then
+ write(*,*) i,j,out(i,j),in(i,j)
+ call stopit( status, 'Error 7' )
+ end if
+ end if
+ end do
+ else ! outside points
+ do j = 1, 5
+ if( out(i,j) .ne. AST__BAD ) then
+ if( status .eq. sai__ok ) then
+ write(*,*) i,j,out(i,j),in(i,j)
+ call stopit( status, 'Error 8' )
+ end if
+ end if
+ end do
+ end if
+ end do
+
+* Tests on reference values
+ if( ast_test( obj, 'RefRA(4)', status ) ) then
+ call stopit( status, 'Error 9' )
+ end if
+
+ if( ast_test( obj, 'RefDec(4)', status ) ) then
+ call stopit( status, 'Error 10' )
+ end if
+
+c if( ast_test( obj, 'Epoch(4)', status ) ) then
+c call stopit( status, 'Error 11' )
+c end if
+
+c if( ast_test( obj, 'Epoch(1)', status ) ) then
+c call stopit( status, 'Error 12' )
+c end if
+
+c if( ast_test( obj, 'Epoch(2)', status ) ) then
+c call stopit( status, 'Error 13' )
+c end if
+
+ if( ast_test( obj, 'RestFreq(5)', status ) ) then
+ call stopit( status, 'Error 14' )
+ end if
+
+
+
+
+
+
+ call ast_end( status )
+
+ if( status .ne. sai__ok ) write(*,*) 'teststc: example 2 '//
+ : 'tests failed'
+
+ end
+
+
+
+
+
+
+
+ subroutine Example3( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+
+ integer status, obj, i, j
+ double precision in(12,5), out(12,5)
+
+ if( status .ne. sai__ok ) return
+
+ call ast_begin( status )
+
+* Put an example of a CatalogEntryLocation into file 1.
+ call puteg( 'teststc_eg3', 1, status )
+
+* Use a new XmlChan to read an object from file 1,and simplify it.
+ call xmlread( 1, obj, ' ', status )
+ obj = ast_simplify( obj, status )
+
+* Test simplify by negating and simplifying twice.
+ call ast_negate( obj, status )
+ obj = ast_simplify( obj, status )
+ call ast_negate( obj, status )
+ obj = ast_simplify( obj, status )
+ call checkdump( obj, 'checkdump 1', status )
+
+* Check it is a StcCatalogEntryLocation
+ if( .not. ast_isastcCatalogEntryLocation( obj, status ) )
+ : call stopit( status, 'Error 1' )
+
+* Check it is an Interval.
+ if( .not. ast_isainterval( ast_getstcregion( obj, status ),
+ : status ) ) then
+ write(*,*) ast_GetC( ast_getstcregion( obj, status ), 'Class',
+ : status )
+ call stopit( status, 'Error 1a' )
+ end if
+
+* Check it has no uncertainty
+ if( ast_getunc( obj, .false., status ) .NE. AST__NULL )
+ : call stopit( status, 'Error 1b' )
+
+* Check it has 5 axes.
+ if( ast_geti( obj, 'naxes', status ) .ne. 5 )
+ : call stopit( status, 'Error 1ab' )
+
+* Check the rest frequency for axis 5 (redshift) is 5000 Angstrom
+ if( abs( ast_getd( obj, 'restfreq(5)', status ) - 599584.916D0 )
+ : .gt. 0.001D0 ) call stopit( status, 'Error A1' )
+
+* Check the epoch for allaxes is JD 2440000
+ if( abs( ast_getd( obj, 'epoch(1)', status ) - 1968.39212D0 ) .gt.
+ : 0.00001D0 ) call stopit( status, 'Error B1' )
+ if( abs( ast_getd( obj, 'epoch(2)', status ) - 1968.39212D0 ) .gt.
+ : 0.00001D0 ) call stopit( status, 'Error B2' )
+ if( abs( ast_getd( obj, 'epoch(3)', status ) - 1968.39212D0 ) .gt.
+ : 0.00001D0 ) call stopit( status, 'Error B3' )
+ if( abs( ast_getd( obj, 'epoch(4)', status ) - 1968.39212D0 ) .gt.
+ : 0.00001D0 ) call stopit( status, 'Error B4' )
+ if( abs( ast_getd( obj, 'epoch(5)', status ) - 1968.39212D0 ) .gt.
+ : 0.00001D0 ) call stopit( status, 'Error B5' )
+
+* Other tests
+ if( ast_getd( obj, 'fillfactor', status ) .ne. 1.0D0 )
+ : call stopit( status, 'Error 1b' )
+
+ if( ast_getc( obj, 'ident', status ) .ne. 'RA6-18hDec20-70deg' )
+ : call stopit( status, 'Error 1c' )
+
+ if( ast_getc( obj, 'domain(3)', status ) .ne. 'TIME' )
+ : call stopit( status, 'Error 2' )
+
+ if( ast_getc( obj, 'label(3)', status ) .ne.
+ : 'Julian Date offset from 1968-05-23 12:00:00' ) THEN
+ call stopit( status, 'Error 2b' )
+ end if
+
+ if( ast_getc( obj, 'domain(1)', status ) .ne. 'SKY' )
+ : call stopit( status, 'Error 3' )
+
+ if( ast_getc( obj, 'system(1)', status ) .ne. 'FK4' )
+ : call stopit( status, 'Error 3a' )
+
+ if( ast_getc( obj, 'label(1)', status ) .ne. 'Right ascension' )
+ : call stopit( status, 'Error 3b' )
+
+ if( ast_getc( obj, 'label(2)', status ) .ne. 'Declination' )
+ : call stopit( status, 'Error 3c' )
+
+ if( ast_getc( obj, 'title(2)', status ) .ne. 'PosEq' )
+ : call stopit( status, 'Error 3d' )
+
+ if( ast_getd( obj, 'Equinox', status ) .ne. 1950D0 )
+ : call stopit( status, 'Error 3d' )
+
+ if( ast_getc( obj, 'domain(2)', status ) .ne. 'SKY' )
+ : call stopit( status, 'Error 4' )
+
+ if( ast_getc( obj, 'domain(4)', status ) .ne. 'SPECTRUM' )
+ : call stopit( status, 'Error 5' )
+
+ if( ast_getc( obj, 'system(4)', status ) .ne. 'WAVE' )
+ : call stopit( status, 'Error 5a' )
+
+ if( ast_getc( obj, 'stdofrest', status ) .ne. 'Topocentric' )
+ : call stopit( status, 'Error 5b' )
+
+ if( ast_test( obj, 'title(4)', status ) )
+ : call stopit( status, 'Error 5c' )
+
+ if( ast_geti( obj, 'naxes', status ) .ne. 5 )
+ : call stopit( status, 'Error 6' )
+
+ if( ast_getc( obj, 'domain(5)', status ) .ne. 'REDSHIFT' )
+ : call stopit( status, 'Error 6a' )
+
+ if( ast_getc( obj, 'system(5)', status ) .ne. 'VOPT' )
+ : call stopit( status, 'Error 6b' )
+
+ if( ast_getc( obj, 'label(5)', status ) .ne. 'Optical velocity' )
+ : call stopit( status, 'Error 6c' )
+
+ if( ast_getc( obj, 'unit(5)', status ) .ne. 'km/s' )
+ : call stopit( status, 'Error 6d' )
+
+ if( ast_getc( obj, 'unit(4)', status ) .ne. 'Angstrom' )
+ : call stopit( status, 'Error 6e' )
+
+
+ in(1,1) = 4.71238 ! inside
+ in(1,2) = 1.2216
+ in(1,3) = 0.0D0
+ in(1,4) = 5000
+ in(1,5) = 9999.9
+
+ in(2,1) = 4.71240 ! outside
+ in(2,2) = 1.2216
+ in(2,3) = 0.0D0
+ in(2,4) = 5000
+ in(2,5) = 9999.9
+
+ in(3,1) = 4.71238 ! outside
+ in(3,2) = 1.2218
+ in(3,3) = 0.0D0
+ in(3,4) = 5000
+ in(3,5) = 9999.9
+
+ in(4,1) = 4.71238 ! outside
+ in(4,2) = 1.2216
+ in(4,3) = 0.5D0
+ in(4,4) = 5000
+ in(4,5) = 9999.9
+
+ in(5,1) = 4.71238 ! outside
+ in(5,2) = 1.2216
+ in(5,3) = 0.0D0
+ in(5,4) = 6500.1
+ in(5,5) = 9999.9
+
+ in(6,1) = 4.71238 ! outside
+ in(6,2) = 1.2216
+ in(6,3) = 0.0D0
+ in(6,4) = 5000
+ in(6,5) = 10000.1
+
+ in(7,1) = 1.5709 ! inside
+ in(7,2) = 0.3492
+ in(7,3) = 0.0D0
+ in(7,4) = 5000
+ in(7,5) = 5000
+
+ in(8,1) = 1.5707 ! outside
+ in(8,2) = 0.3492
+ in(8,3) = 0.0D0
+ in(8,4) = 5000
+ in(8,5) = 5000
+
+ in(9,1) = 1.5709 ! outside
+ in(9,2) = 0.3490
+ in(9,3) = 0.0D0
+ in(9,4) = 5000
+ in(9,5) = 5000
+
+ in(10,1) = 1.5709 ! outside
+ in(10,2) = 0.3492
+ in(10,3) = 39999.4D0
+ in(10,4) = 5000
+ in(10,5) = 5000
+
+ in(11,1) = 1.5709 ! outside
+ in(11,2) = 0.3492
+ in(11,3) = 0.0D0
+ in(11,4) = 4999.9
+ in(11,5) = 5000
+
+ in(12,1) = 1.5709 ! inside
+ in(12,2) = 0.3492
+ in(12,3) = 0.0D0
+ in(12,4) = 5000
+ in(12,5) = 1000
+
+ call ast_trann( obj, 12, 5, 12, in, .true., 5, 12, out, status )
+
+ do i = 1, 12
+ if( i .eq. 1 .or. i .eq. 7 .or. i .eq. 12 ) then ! inside points
+ do j = 1, 5
+ if( out(i,j) .ne. in(i,j) ) then
+ if( status .eq. sai__ok ) then
+ write(*,*) i,j,out(i,j),in(i,j)
+ call stopit( status, 'Error 7' )
+ end if
+ end if
+ end do
+ else ! outside points
+ do j = 1, 5
+ if( out(i,j) .ne. AST__BAD ) then
+ if( status .eq. sai__ok ) then
+ write(*,*) i,j,out(i,j),in(i,j)
+ call stopit( status, 'Error 8' )
+ end if
+ end if
+ end do
+ end if
+ end do
+
+* Tests on reference values
+ if( ast_test( obj, 'RefRA(4)', status ) ) then
+ call stopit( status, 'Error 9' )
+ end if
+
+ if( ast_test( obj, 'RefDec(4)', status ) ) then
+ call stopit( status, 'Error 10' )
+ end if
+
+ if( .not. ast_test( obj, 'Epoch(4)', status ) ) then
+ call stopit( status, 'Error 11' )
+ end if
+
+ if( .not. ast_test( obj, 'Epoch(1)', status ) ) then
+ call stopit( status, 'Error 12' )
+ end if
+
+ if( .not. ast_test( obj, 'Epoch(2)', status ) ) then
+ call stopit( status, 'Error 13' )
+ end if
+
+ if( .not. ast_test( obj, 'RestFreq(5)', status ) ) then
+ call stopit( status, 'Error 14' )
+ end if
+
+
+
+
+
+
+ call ast_end( status )
+
+ if( status .ne. sai__ok ) write(*,*) 'teststc: example 3 '//
+ : 'tests failed'
+
+ end
+
+
+
+
+
+
+ subroutine Example4( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ include 'AST_ERR'
+
+ integer status, obj2, obj, i, j, unc, frm
+ double precision in(12,4), out(12,4), lbnd(4), ubnd(4)
+
+ if( status .ne. sai__ok ) return
+
+ call ast_begin( status )
+
+* Put an example of an STCSearchLocation into file 1.
+ call puteg( 'teststc_eg4', 1, status )
+
+* Use a new XmlChan to read an object from file 1,and simplify it.
+ call xmlread( 1, obj, ' ', status )
+ obj = ast_simplify( obj, status )
+
+* Test simplify by negating and simplifying twice.
+ call ast_negate( obj, status )
+ obj = ast_simplify( obj, status )
+ call ast_negate( obj, status )
+ obj = ast_simplify( obj, status )
+ call checkdump( obj, 'checkdump 1', status )
+
+
+* Check it is a STCSearchLocation
+ if( .not. ast_isastcsearchlocation( obj, status ) )
+ : call stopit( status, 'Error 1' )
+
+* Check it is a Prism.
+ if( .not. ast_isaprism( ast_getstcregion( obj, status ),
+ : status ) )
+ : call stopit( status, 'Error 1a' )
+
+* Check it has no uncertainty
+ if( ast_getunc( obj, .false., status ) .NE. AST__NULL )
+ : call stopit( status, 'Error 1b' )
+
+* Other tests
+ if( ast_geti( obj, 'naxes', status ) .ne. 4 )
+ : call stopit( status, 'Error 1ab' )
+
+ if( ast_getd( obj, 'fillfactor', status ) .ne. 1.0D0 )
+ : call stopit( status, 'Error 1b' )
+
+ if( ast_getc( obj, 'ident', status ) .ne. 'M81' )
+ : call stopit( status, 'Error 1c' )
+
+ if( ast_getc( obj, 'domain(3)', status ) .ne. 'TIME' )
+ : call stopit( status, 'Error 2' )
+
+ if( ast_getc( obj, 'label(3)', status ) .ne.
+ : 'Modified Julian Date offset from 1900-01-01' ) THEN
+ call stopit( status, 'Error 2b' )
+ end if
+
+ if( ast_getc( obj, 'domain(1)', status ) .ne. 'SKY' )
+ : call stopit( status, 'Error 3' )
+
+ if( ast_getc( obj, 'system(1)', status ) .ne. 'ICRS' )
+ : call stopit( status, 'Error 3a' )
+
+ if( ast_getc( obj, 'label(1)', status ) .ne. 'Right ascension' )
+ : call stopit( status, 'Error 3b' )
+
+ if( ast_getc( obj, 'label(2)', status ) .ne. 'Declination' )
+ : call stopit( status, 'Error 3c' )
+
+ if( ast_getc( obj, 'title(2)', status ) .ne. 'Equatorial' )
+ : call stopit( status, 'Error 3d' )
+
+ if( ast_test( obj, 'Equinox', status ) )
+ : call stopit( status, 'Error 3d2' )
+
+ if( ast_getc( obj, 'domain(2)', status ) .ne. 'SKY' )
+ : call stopit( status, 'Error 4' )
+
+ if( ast_getc( obj, 'domain(4)', status ) .ne. 'SPECTRUM' )
+ : call stopit( status, 'Error 5' )
+
+ if( ast_getc( obj, 'system(4)', status ) .ne. 'WAVE' )
+ : call stopit( status, 'Error 5a' )
+
+ if( ast_getc( obj, 'stdofrest', status ) .ne. 'Barycentric' )
+ : call stopit( status, 'Error 5b' )
+
+ if( ast_getc( obj, 'title(4)', status ) .ne. 'Wavelength' )
+ : call stopit( status, 'Error 5c' )
+
+ if( ast_geti( obj, 'naxes', status ) .ne. 4 )
+ : call stopit( status, 'Error 6' )
+
+ if( ast_getc( obj, 'unit(4)', status ) .ne. 'Angstrom' )
+ : call stopit( status, 'Error 6e' )
+
+ frm = ast_getregionframe( obj, status )
+ if( ast_getc( frm, 'Ident', status ) .ne. 'ICRS-TT-BARY' )
+ : call stopit( status, 'Error 7' )
+
+
+
+* Tests on reference values
+ if( ast_test( obj, 'RefRA(4)', status ) ) then
+ call stopit( status, 'Error 9' )
+ end if
+
+ if( ast_test( obj, 'RefDec(4)', status ) ) then
+ call stopit( status, 'Error 10' )
+ end if
+
+c if( ast_test( obj, 'Epoch(4)', status ) ) then
+c call stopit( status, 'Error 11' )
+c end if
+
+c if( ast_test( obj, 'Epoch(1)', status ) ) then
+c call stopit( status, 'Error 12' )
+c end if
+
+c if( ast_test( obj, 'Epoch(2)', status ) ) then
+c call stopit( status, 'Error 13' )
+c end if
+
+ if( ast_test( obj, 'RestFreq(4)', status ) ) then
+ call stopit( status, 'Error 14' )
+ end if
+
+ if( abs( ast_getd( obj, 'Epoch(3)', status ) - 1900.00051056532 )
+ : .gt. 0.0001 ) then
+ call stopit( status, 'Error 12b' )
+ end if
+
+ if( abs( ast_getd( obj, 'TimeOrigin', status ) - 15020.0D0 )
+ : .gt. 0.0001 ) then
+ call stopit( status, 'Error 12c' )
+ end if
+
+
+
+
+ in(1,1) = 2.51126532207628 ! inside
+ in(1,2) = 1.22218015796595
+ in(1,3) = 0.01
+ in(1,4) = 4001
+
+ in(2,1) = 2.5094191311777 ! outside
+ in(2,2) = 1.22248014367694
+ in(2,3) = 0.01
+ in(2,4) = 4001
+
+ in(3,1) = 2.51126532207628 ! outside
+ in(3,2) = 1.22218015796595
+ in(3,3) = 0.01
+ in(3,4) = 3999
+
+ in(4,1) = 2.51126532207628 ! outside
+ in(4,2) = 1.22218015796595
+ in(4,3) = -0.2
+ in(4,4) = 4001
+
+ in(5,1) = 2.5094191311777 ! outside
+ in(5,2) = 1.22248014367694
+ in(5,3) = -0.2
+ in(5,4) = 4001
+
+ in(6,1) = 2.51126532207628 ! outside
+ in(6,2) = 1.22218015796595
+ in(6,3) = -0.2
+ in(6,4) = 3999
+
+ in(7,1) = 2.51682141503858 ! inside
+ in(7,2) = 1.18868060989363
+ in(7,3) = 0.01
+ in(7,4) = 6999
+
+ in(8,1) = 2.51524001365674 ! outside
+ in(8,2) = 1.18830732379242
+ in(8,3) = 0.01
+ in(8,4) = 6999
+
+ in(9,1) = 2.51682141503858 ! outside
+ in(9,2) = 1.18868060989363
+ in(9,3) = 0.01
+ in(9,4) = 7001
+
+ in(10,1) = 2.51682141503858 ! outside
+ in(10,2) = 1.18868060989363
+ in(10,3) = -0.2
+ in(10,4) = 6999
+
+ in(11,1) = 2.51524001365674 ! outside
+ in(11,2) = 1.18830732379242
+ in(11,3) = -0.2
+ in(11,4) = 6999
+
+ in(12,1) = 2.51682141503858 ! outside
+ in(12,2) = 1.18868060989363
+ in(12,3) = -0.2
+ in(12,4) = 7001
+
+ call ast_trann( obj, 12, 4, 12, in, .true., 4, 12, out, status )
+
+ do i = 1, 12
+ if( i .eq. 1 .or. i .eq. 7 ) then ! inside points
+ do j = 1, 4
+ if( out(i,j) .ne. in(i,j) ) then
+ if( status .eq. sai__ok ) then
+ write(*,*) i,j,out(i,j),in(i,j)
+ call stopit( status, 'Error 13c' )
+ end if
+ end if
+ end do
+ else ! outside points
+ do j = 1, 4
+ if( out(i,j) .ne. AST__BAD ) then
+ if( status .eq. sai__ok ) then
+ write(*,*) i,j,out(i,j),in(i,j)
+ call stopit( status, 'Error 14c' )
+ end if
+ end if
+ end do
+ end if
+ end do
+
+
+ call ast_end( status )
+
+ if( status .ne. sai__ok ) write(*,*) 'teststc: example 4 '//
+ : 'tests failed'
+
+ end
+
+
+
+
+ subroutine Example5( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ include 'AST_ERR'
+
+ integer status, obj2, obj, i, j, unc, frm
+ double precision in(12,4), out(12,4), lbnd(4), ubnd(4)
+
+ if( status .ne. sai__ok ) return
+
+ call ast_begin( status )
+
+* Put an example of an STCSearchLocation into file 1.
+ call puteg( 'teststc_eg5', 1, status )
+
+* Use a new XmlChan to read an object from file 1,and simplify it.
+ call xmlread( 1, obj, ' ', status )
+ call checkdump( obj, 'checkdump 2', status )
+ obj = ast_simplify( obj, status )
+
+* Test simplify by negating and simplifying twice.
+ call ast_negate( obj, status )
+ obj = ast_simplify( obj, status )
+ call ast_negate( obj, status )
+ obj = ast_simplify( obj, status )
+ call checkdump( obj, 'checkdump 1', status )
+
+* Check it is a STCObsDataLocation
+ if( .not. ast_isastcobsdatalocation( obj, status ) )
+ : call stopit( status, 'Error 1' )
+
+* Check it contains a Prism.
+ if( .not. ast_isaprism( ast_getstcregion( obj, status ),
+ : status ) )
+ : call stopit( status, 'Error 1a' )
+
+* Other tests
+ if( ast_getd( obj, 'fillfactor', status ) .ne. 1.0D0 )
+ : call stopit( status, 'Error 1b' )
+
+ if( ast_getc( obj, 'ident', status ) .ne. 'M81' )
+ : call stopit( status, 'Error 1c' )
+
+ if( ast_getc( obj, 'domain(3)', status ) .ne. 'TIME' )
+ : call stopit( status, 'Error 2' )
+
+ if( ast_getc( obj, 'label(3)', status ) .ne.
+ : 'Modified Julian Date offset from 2004-07-15 08:23:56' ) then
+ call stopit( status, 'Error 2b' )
+ end if
+
+ if( ast_getc( obj, 'domain(1)', status ) .ne. 'SKY' )
+ : call stopit( status, 'Error 3' )
+
+ if( ast_getc( obj, 'system(1)', status ) .ne. 'ICRS' )
+ : call stopit( status, 'Error 3a' )
+
+ if( ast_getc( obj, 'label(1)', status ) .ne. 'Right ascension' )
+ : call stopit( status, 'Error 3b' )
+
+ if( ast_getc( obj, 'label(2)', status ) .ne. 'Declination' )
+ : call stopit( status, 'Error 3c' )
+
+ if( ast_getc( obj, 'title(2)', status ) .ne. 'Equatorial' )
+ : call stopit( status, 'Error 3d' )
+
+ if( ast_getc( obj, 'domain(2)', status ) .ne. 'SKY' )
+ : call stopit( status, 'Error 4' )
+
+ if( ast_getc( obj, 'domain(4)', status ) .ne. 'SPECTRUM' )
+ : call stopit( status, 'Error 5' )
+
+ if( ast_getc( obj, 'system(4)', status ) .ne. 'WAVE' )
+ : call stopit( status, 'Error 5a' )
+
+ if( ast_getc( obj, 'stdofrest', status ) .ne. 'Topocentric' )
+ : call stopit( status, 'Error 5b' )
+
+ if( ast_getc( obj, 'title(4)', status ) .ne.
+ : 'Wavelength' ) call stopit( status, 'Error 5c' )
+
+ if( ast_getc( obj, 'unit(4)', status ) .ne. 'Angstrom' )
+ : call stopit( status, 'Error 5d' )
+
+ if( ast_geti( obj, 'naxes', status ) .ne. 4 )
+ : call stopit( status, 'Error 6' )
+
+ call ast_getregionbounds( obj, lbnd, ubnd, status )
+
+
+
+ lbnd(1) = 0.5*(lbnd(1) + ubnd(1))
+ lbnd(2) = 0.5*(lbnd(2) + ubnd(2))
+ lbnd(3) = 0.5*(lbnd(3) + ubnd(3))
+ lbnd(4) = 0.5*(lbnd(4) + ubnd(4))
+
+ if( abs( lbnd(1) - 2.59858948190075 ) .gt. 1E-06 )
+ : call stopit( status, 'Error 10' )
+ if( abs( lbnd(2) - 1.20541670934471 ) .gt. 1E-06 )
+ : call stopit( status, 'Error 11' )
+ if( abs( lbnd(3) ) .gt. 1E-5 )
+ : call stopit( status, 'Error 12' )
+ if( abs( lbnd(4) - 4600 ) .gt. 0.0001 )
+ : call stopit( status, 'Error 13' )
+ if( abs( ubnd(1) - 2.61080678666471 ) .gt. 1E-06 )
+ : call stopit( status, 'Error 14' )
+ if( abs( ubnd(2) - 1.2097800324747 ) .gt. 1E-06 )
+ : call stopit( status, 'Error 15' )
+ if( abs( ubnd(3) - 380.0D0 ) .gt. 1E-5 )
+ : call stopit( status, 'Error 16' )
+ if( abs( ubnd(4) - 4800 ) .gt. 0.0001 )
+ : call stopit( status, 'Error 17' )
+ if( ast_getc( obj, 'ObsLon', status ) .ne. 'W111:35:39.84' )
+ : call stopit( status, 'Error 18' )
+ if( ast_getc( obj, 'ObsLat', status ) .ne. 'N31:57:30.96' )
+ : call stopit( status, 'Error 19' )
+
+ unc = ast_getunc( obj, .true., status )
+ if( unc .eq. AST__NULL ) call stopit( status, 'Error 20' )
+
+ call ast_getregionbounds( unc, lbnd, ubnd, status )
+
+ lbnd(1) = 0.5*(lbnd(1) + ubnd(1))
+ lbnd(2) = 0.5*(lbnd(2) + ubnd(2))
+ lbnd(3) = 0.5*(lbnd(3) + ubnd(3))
+ lbnd(4) = 0.5*(lbnd(4) + ubnd(4))
+
+ if( abs( lbnd(1) - 2.59858948190075D0) .gt. 1E-05 )
+ : call stopit( status, 'Error 21' )
+ if( abs( lbnd(2) - 1.20541670934471D0) .gt. 1E-05 )
+ : call stopit( status, 'Error 22' )
+ if( abs( lbnd(3) ) .gt. 1.0D-05 )
+ : call stopit( status, 'Error 23' )
+ if( abs( lbnd(4) - 4600.0D0) .gt. 0.0001 )
+ : call stopit( status, 'Error 24' )
+ if( abs( ubnd(1) - 2.59859209989462D0) .gt. 1E-05 )
+ : call stopit( status, 'Error 25' )
+
+ if( abs( ubnd(2) - 1.20541932733859D0) .gt. 1E-05 )
+ : call stopit( status, 'Error 26' )
+ if( abs( ubnd(3) - 0.3803143212621760D-03 ) .gt. 1E-05 )
+ : call stopit( status, 'Error 27' )
+ if( abs( ubnd(4) - 4600.0002D0) .gt. 0.000001 )
+ : call stopit( status, 'Error 28' )
+
+ if( status .ne. sai__ok ) write(*,*) 'teststc: example 5 '//
+ : 'tests failed'
+
+ end
+
+
+
+
+
+
+
+
+
+
+
+
+
+ subroutine stopit( status, text )
+ implicit none
+ include 'SAE_PAR'
+ integer status
+ character text*(*)
+
+ if( status .ne. sai__ok ) return
+ status = sai__error
+ write(*,*) text
+
+ end
+
+
+
+
+
+*
+* Read an object out of the specified internal file using an XmlChan.
+*
+ subroutine xmlread( ifil, obj, opts, status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+
+ include 'teststc_com'
+
+ external xmlSource
+ integer obj, ifil, status, ch
+ character opts*(*)
+
+ if( status .ne. sai__ok ) return
+
+ ifile = ifil
+ iline = 1
+
+ ch = ast_xmlchan( xmlSource, ast_null, opts, status )
+ obj = ast_read( ch, status )
+ if( obj .eq. ast__null ) then
+ call stopit( status, 'checkXmlChan: Failed to read STC '//
+ : 'object from XmlChan.' )
+ end if
+
+ warns = ast_warnings( ch, status )
+ call ast_annul( ch, status )
+
+ end
+
+
+
+
+*
+* Reads line "iline" from internal file "ifile" and returns it to AST using
+* the AST_PUTLINE routine. Then increments "iline" ready for next time.
+*
+ subroutine xmlSource( status )
+ implicit none
+
+ include 'teststc_com'
+
+ integer status, l, chr_len
+
+ if( iline .le. filelen( ifile ) ) then
+ l = chr_len( files(ifile,iline) )
+ call ast_putline( files(ifile,iline), l, status )
+ iline = iline + 1
+ else
+ call ast_putline( ' ', -1, status )
+ end if
+
+ end
+
+*
+* Append a line obtained using ast_getline function to the end of the
+* internal file indicated by "ifile", and increment the file length.
+*
+ subroutine xmlSink( status )
+ implicit none
+
+ include 'teststc_com'
+
+ integer status, l
+ character line*(linelen)
+
+ call ast_getline( line, l, status )
+ if( l .gt. 0 ) then
+
+ if( filelen( ifile ) .ge. mxline ) then
+ call stopit( status, 'checkXmlChan: Too many lines sent '//
+ : 'to sink function' )
+
+ else if( l .gt. linelen ) then
+ call stopit( status, 'checkXmlChan: Text truncated in '//
+ : 'sink function' )
+
+ else
+ filelen( ifile ) = filelen( ifile ) + 1
+ files( ifile, filelen( ifile ) ) = line(:l)
+ end if
+
+ end if
+
+ end
+
+
+ subroutine puteg( flnam, ifl, status )
+ implicit none
+
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ include 'teststc_com'
+
+ integer status, ifl
+ character flnam*(*)
+
+ if( status .ne. sai__ok ) return
+
+ open( file=flnam, status='old', unit=10 )
+
+ iline = 1
+ 10 continue
+ if( iline .gt. mxline ) call stopit( status,
+ : 'mxline exceeded in puteg' )
+ read( 10, '(A)', end=20 ) files( ifl, iline )
+
+ if( files( ifl, iline )( linelen : linelen ) .ne. ' ' ) then
+ call stopit( status, 'linelen exceeded in puteg' )
+ end if
+
+ iline = iline + 1
+ go to 10
+
+ 20 continue
+ close( 10 )
+ filelen( ifl ) = iline - 1
+
+ end
+
+
+*
+* Tests the dump function, the loader, and the astOverlap method.
+*
+ subroutine checkdump( obj, text, status )
+
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ character text*(*)
+ integer obj, status, next, end, ch, result, ll, overlap
+ external mysource, mysink
+ character buf*190000
+
+ common /ss1/ buf
+ common /ss2/ next, end, ll
+
+ if( status .ne. sai__ok ) return
+
+* Create a Channel which reads and writes to an internal string buffer.
+ ch = ast_channel( mysource, mysink, ' ', status )
+
+* Write the supplied Region out to this Channel.
+ ll = 160
+ next = 1
+ if( ast_write( ch, obj, status ) .ne.1 ) then
+ write(*,*) text
+ call stopit( status, 'Cannot write supplied object to '//
+ : 'channel' )
+ end if
+
+* Read an Object back from this Channel.
+ next = 1
+ result = ast_read( ch, status )
+ if( result .eq. ast__null ) then
+ write(*,*) text
+ call stopit( status, 'Cannot read object from channel' )
+ end if
+
+* Check that it is a Region and its boundary is identical to the supplied
+* Region.
+ overlap = ast_overlap( obj, result, status )
+ if( overlap .ne. 5 ) then
+ write(*,*) 'obj result Overlap: ', overlap
+ write(*,*) 'obj self-Overlap: ', ast_overlap( obj, obj,
+ : status )
+ write(*,*) 'result self-Overlap: ', ast_overlap( result,
+ : result, status )
+ call ast_Show( obj, status )
+ call ast_Show( result, status )
+ write(*,*) text
+ call stopit( status, 'Object has changed' )
+ end if
+
+* Return the new Region pointer in place of the old.
+ obj = result
+
+ end
+
+ subroutine mysource( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ integer status, next, end, ll
+ character buf*190000
+
+ common /ss1/ buf
+ common /ss2/ next, end, ll
+
+ if( status .ne. sai__ok ) return
+
+ if( next .ge. end ) then
+ call ast_putline( buf, -1, status )
+ else
+ call ast_putline( buf( next : ), ll, status )
+ endif
+
+ next = next + ll
+
+ end
+
+ subroutine mysink( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ integer status, next, end, f, l, ll
+ character buf*190000
+ character line*1000
+
+ common /ss1/ buf
+ common /ss2/ next, end, ll
+
+ if( status .ne. sai__ok ) return
+
+ line = ' '
+ call ast_getline( line, l, status )
+ call chr_fandl( line( : l ), f, l )
+ buf( next : ) = line( f : l )
+ l = l - f + 1
+
+ if( next + ll - 1 .ge. 190000 ) then
+ write(*,*) buf
+ call stopit( status, 'Buffer overflow in mysink!!' )
+ else if( l .gt. ll ) then
+ write(*,*)
+ write(*,*) buf( next : next + l)
+ write(*,*) 'Line length ',l,' greater than ',ll
+ call stopit( status, 'Line overflow in mysink!!' )
+ else
+ end = next + l
+ buf( end : next + ll - 1 ) = ' '
+ endif
+
+ next = next + ll
+
+ end
+
+
diff --git a/ast/ast_tester/teststc_com b/ast/ast_tester/teststc_com
new file mode 100644
index 0000000..f9a7fb1
--- /dev/null
+++ b/ast/ast_tester/teststc_com
@@ -0,0 +1,13 @@
+*
+* Common block declaration used by teststc.f for storing internal
+* files and associated info.
+*
+ integer mxline
+ parameter ( mxline = 500 )
+
+ integer linelen
+ parameter ( linelen = 3000 )
+
+ character files( 3, mxline )*(linelen)
+ integer ifile,iline,filelen( 3 ),warns
+ common /files/ files, ifile, iline, filelen, warns
diff --git a/ast/ast_tester/teststc_eg1 b/ast/ast_tester/teststc_eg1
new file mode 100644
index 0000000..b1044c6
--- /dev/null
+++ b/ast/ast_tester/teststc_eg1
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- edited with XMLSpy v2005 sp2 U (http://www.altova.com) by Arnold Rots (Smithsonian Observatory) -->
+<!-- edited with XMLSPY v2004 rel. 3 U (http://www.xmlspy.com) by Arnold Rots (Smithsonian Observatory) -->
+<!--Sample XML file generated by XMLSPY v2004 rel. 3 U (http://www.xmlspy.com)-->
+<STCResourceProfile xmlns="http://www.ivoa.net/xml/STC/stc-v1.20.xsd" xmlns:crd="http://www.ivoa.net/xml/STC/STCcoords/v1.20" xmlns:reg="http://www.ivoa.net/xml/STC/STCregion/v1.20" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ivoa.net/xml/STC/stc-v1.20.xsd stc-v1.20.xsd">
+ <AstroCoordSystem ID="ICRS-TT-CXO">
+ <TimeFrame>
+ <Name>Time</Name>
+ <TimeScale>TT</TimeScale>
+ <TOPOCENTER/>
+ </TimeFrame>
+ <SpaceFrame>
+ <Name>Space</Name>
+ <ICRS/>
+ <TOPOCENTER/>
+ <SPHERICAL coord_naxes="2"/>
+ </SpaceFrame>
+ <SpectralFrame>
+ <Name>Energy</Name>
+ <TOPOCENTER/>
+ </SpectralFrame>
+ </AstroCoordSystem>
+ <crd:AstroCoords coord_system_id="ICRS-TT-CXO">
+ <crd:Time unit="s">
+ <crd:Name>Time</crd:Name>
+ <crd:Error>0.0001</crd:Error>
+ <crd:Resolution>0.000016</crd:Resolution>
+ <crd:Resolution>3.0</crd:Resolution>
+ <crd:Size>1000</crd:Size>
+ <crd:Size>170000</crd:Size>
+ </crd:Time>
+ <crd:Position2D unit="arcsec">
+ <crd:Name>Position</crd:Name>
+ <crd:Error2>
+ 1.0 1.0
+ </crd:Error2>
+ <crd:Resolution2>
+ 0.5 0.5
+ </crd:Resolution2>
+ <crd:Size2>
+ 1000 1000
+ </crd:Size2>
+ <crd:Size2>
+ 4000 4000
+ </crd:Size2>
+ </crd:Position2D>
+ <crd:Spectral unit="keV">
+ <crd:Name>Energy</crd:Name>
+ <crd:Error>0.1</crd:Error>
+ <crd:Resolution>0.02</crd:Resolution>
+ <crd:Resolution>2.0</crd:Resolution>
+ <crd:Size>2</crd:Size>
+ <crd:Size>10</crd:Size>
+ </crd:Spectral>
+ </crd:AstroCoords>
+ <AstroCoordArea ID="AllSky-CXO" coord_system_id="ICRS-TT-CXO">
+ <TimeInterval>
+ <StartTime>
+ <crd:TimeScale>TT</crd:TimeScale>
+ <crd:ISOTime>1999-07-23T16:00:00</crd:ISOTime>
+ </StartTime>
+ </TimeInterval>
+ <Region>
+ <reg:AllSky fill_factor="0.02"/>
+ </Region>
+ <SpectralInterval unit="keV">
+ <LoLimit>0.12</LoLimit>
+ <HiLimit>10.0</HiLimit>
+ </SpectralInterval>
+ </AstroCoordArea>
+</STCResourceProfile>
diff --git a/ast/ast_tester/teststc_eg10 b/ast/ast_tester/teststc_eg10
new file mode 100644
index 0000000..977fa57
--- /dev/null
+++ b/ast/ast_tester/teststc_eg10
@@ -0,0 +1,18 @@
+<STCResourceProfile xmlns="http://www.ivoa.net/xml/STC/stc-v1.20.xsd">
+ <AstroCoordSystem ID="ICRS-TT-CXO">
+ <SpaceFrame>
+ <Name>Space</Name>
+ <GALACTIC_II/>
+ <TOPOCENTER/>
+ <SPHERICAL coord_naxes="2"/>
+ </SpaceFrame>
+ </AstroCoordSystem>
+ <AstroCoordArea ID="AllSky-CXO" coord_system_id="ICRS-TT-CXO">
+ <Region>
+ <reg:Box unit="deg">
+ <reg:Center>143.0 42.0</reg:Center>
+ <reg:Size>1.0 1.0</reg:Size>
+ </reg:Box>
+ </Region>
+ </AstroCoordArea>
+</STCResourceProfile>
diff --git a/ast/ast_tester/teststc_eg2 b/ast/ast_tester/teststc_eg2
new file mode 100644
index 0000000..6665676
--- /dev/null
+++ b/ast/ast_tester/teststc_eg2
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- edited with XMLSpy v2005 sp1 U (http://www.xmlspy.com) by Arnold Rots (Smithsonian Observatory) -->
+<!-- edited with XMLSPY v2004 rel. 3 U (http://www.xmlspy.com) by Arnold Rots (Smithsonian Observatory) -->
+<!--Sample XML file generated by XMLSPY v2004 rel. 3 U (http://www.xmlspy.com)-->
+<CatalogEntryLocation xmlns="http://www.ivoa.net/xml/STC/stc-v1.20.xsd" xmlns:crd="http://www.ivoa.net/xml/STC/STCcoords/v1.20" xmlns:reg="http://www.ivoa.net/xml/STC/STCregion/v1.20" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ivoa.net/xml/STC/stc-v1.20.xsd stc-v1.20.xsd">
+ <AstroCoordSystem ID="B1950-OPTICAL-ET">
+ <TimeFrame>
+ <TimeScale>ET</TimeScale>
+ <TOPOCENTER/>
+ </TimeFrame>
+ <SpaceFrame>
+ <Name>PosEq</Name>
+ <FK4>
+ <Equinox>B1950.0</Equinox>
+ </FK4>
+ <TOPOCENTER/>
+ <SPHERICAL coord_naxes="2"/>
+ </SpaceFrame>
+ <SpectralFrame>
+ <TOPOCENTER/>
+ </SpectralFrame>
+ <RedshiftFrame>
+ <Name>DopplerVelocity</Name>
+ <DopplerDefinition>OPTICAL</DopplerDefinition>
+ <BARYCENTER/>
+ </RedshiftFrame>
+
+ </AstroCoordSystem>
+ <AstroCoordSystem ID="SGC-OPTICAL-ET">
+ <TimeFrame>
+ <Name>Time</Name>
+ <TimeScale>ET</TimeScale>
+ <TOPOCENTER/>
+ </TimeFrame>
+ <SpaceFrame>
+ <Name>SGC</Name>
+ <SUPER_GALACTIC/>
+ <BARYCENTER/>
+ <SPHERICAL coord_naxes="2" />
+ </SpaceFrame>
+ <SpectralFrame>
+ <Name>Optical</Name>
+ <TOPOCENTER/>
+ </SpectralFrame>
+ <RedshiftFrame>
+ <Name>DopplerVelocity</Name>
+ <DopplerDefinition>OPTICAL</DopplerDefinition>
+ <GALACTIC_CENTER/>
+ </RedshiftFrame>
+ </AstroCoordSystem>
+ <crd:AstroCoords coord_system_id="B1950-OPTICAL-ET">
+ <crd:Position2D unit="deg">
+ <crd:Name>RA,Dec</crd:Name>
+ <crd:Value2Ref>Column3</crd:Value2Ref>
+ <crd:Error2Ref>Column4</crd:Error2Ref>
+ <crd:Size2Ref>Column5</crd:Size2Ref>
+ </crd:Position2D>
+ <crd:Redshift unit="km" vel_time_unit="s">
+ <crd:Name>Vrad(barycenter)</crd:Name>
+ <crd:ValueRef>Column6</crd:ValueRef>
+ <crd:ErrorRef>Column7</crd:ErrorRef>
+ </crd:Redshift>
+ </crd:AstroCoords>
+ <crd:AstroCoords coord_system_id="SGC-OPTICAL-ET">
+ <crd:Position2D unit="deg">
+ <crd:Name>SGLong,SGLat</crd:Name>
+ <crd:Value2Ref>Column8</crd:Value2Ref>
+ <crd:Error2Ref>Column9</crd:Error2Ref>
+ <crd:Size2Ref>Column10</crd:Size2Ref>
+ </crd:Position2D>
+ <crd:Redshift unit="km" vel_time_unit="s">
+ <crd:Name>Vrad(Galcenter)</crd:Name>
+ <crd:ValueRef>Column11</crd:ValueRef>
+ <crd:ErrorRef>Column12</crd:ErrorRef>
+ </crd:Redshift>
+ </crd:AstroCoords>
+ <AstroCoordArea coord_system_id="B1950-OPTICAL-ET" ID="RA6-18hDec20-70deg">
+ <TimeInterval>
+ <StartTime>
+ <crd:TimeScale>ET</crd:TimeScale>
+ <crd:JDTime>2440000</crd:JDTime>
+ </StartTime>
+ <StopTime>
+ <crd:TimeScale>ET</crd:TimeScale>
+ <crd:JDTime>2441000</crd:JDTime>
+ </StopTime>
+ </TimeInterval>
+ <Region>
+ <reg:Polygon unit="deg">
+ <reg:Vertex>
+ <reg:Position>270 20</reg:Position>
+ </reg:Vertex>
+ <reg:Vertex>
+ <reg:Position>90 20</reg:Position>
+ <reg:SmallCircle/>
+ </reg:Vertex>
+ <reg:Vertex>
+ <reg:Position>90 70</reg:Position>
+ </reg:Vertex>
+ <reg:Vertex>
+ <reg:Position>270 70</reg:Position>
+ <reg:SmallCircle/>
+ </reg:Vertex>
+ </reg:Polygon>
+ </Region>
+ <SpectralInterval unit="Angstrom">
+ <LoLimit>5000</LoLimit>
+ <HiLimit>6500</HiLimit>
+ </SpectralInterval>
+ <RedshiftInterval unit="km" vel_time_unit="s">
+ <HiLimit>10000</HiLimit>
+ </RedshiftInterval>
+ </AstroCoordArea>
+</CatalogEntryLocation>
diff --git a/ast/ast_tester/teststc_eg3 b/ast/ast_tester/teststc_eg3
new file mode 100644
index 0000000..028d484
--- /dev/null
+++ b/ast/ast_tester/teststc_eg3
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- edited with XMLSpy v2005 sp1 U (http://www.xmlspy.com) by Arnold Rots (Smithsonian Observatory) -->
+<!-- edited with XMLSPY v2004 rel. 3 U (http://www.xmlspy.com) by Arnold Rots (Smithsonian Observatory) -->
+<!--Sample XML file generated by XMLSPY v2004 rel. 3 U (http://www.xmlspy.com)-->
+<CatalogEntryLocation xmlns="http://www.ivoa.net/xml/STC/stc-v1.20.xsd" xmlns:crd="http://www.ivoa.net/xml/STC/STCcoords/v1.20" xmlns:reg="http://www.ivoa.net/xml/STC/STCregion/v1.20" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ivoa.net/xml/STC/stc-v1.20.xsd stc-v1.20.xsd">
+ <AstroCoordSystem ID="B1950-OPTICAL-ET">
+ <TimeFrame>
+ <TimeScale>ET</TimeScale>
+ <TOPOCENTER/>
+ </TimeFrame>
+ <SpaceFrame>
+ <Name>PosEq</Name>
+ <FK4>
+ <Equinox>B1950.0</Equinox>
+ </FK4>
+ <TOPOCENTER/>
+ <SPHERICAL coord_naxes="2"/>
+ </SpaceFrame>
+ <SpectralFrame>
+ <TOPOCENTER/>
+ </SpectralFrame>
+ <RedshiftFrame>
+ <Name>DopplerVelocity</Name>
+ <DopplerDefinition>OPTICAL</DopplerDefinition>
+ <BARYCENTER/>
+ </RedshiftFrame>
+ </AstroCoordSystem>
+ <AstroCoordSystem ID="SGC-OPTICAL-ET">
+ <TimeFrame>
+ <Name>Time</Name>
+ <TimeScale>ET</TimeScale>
+ <TOPOCENTER/>
+ </TimeFrame>
+ <SpaceFrame>
+ <Name>SGC</Name>
+ <SUPER_GALACTIC/>
+ <BARYCENTER/>
+ <SPHERICAL coord_naxes="2" />
+ </SpaceFrame>
+ <SpectralFrame>
+ <Name>Optical</Name>
+ <TOPOCENTER/>
+ </SpectralFrame>
+ <RedshiftFrame>
+ <Name>DopplerVelocity</Name>
+ <DopplerDefinition>OPTICAL</DopplerDefinition>
+ <GALACTIC_CENTER/>
+ </RedshiftFrame>
+ </AstroCoordSystem>
+ <crd:AstroCoords coord_system_id="B1950-OPTICAL-ET">
+ <crd:Position2D unit="deg">
+ <crd:Name>RA,Dec</crd:Name>
+ <crd:Value2Ref>Column3</crd:Value2Ref>
+ <crd:Error2Ref>Column4</crd:Error2Ref>
+ <crd:Size2Ref>Column5</crd:Size2Ref>
+ </crd:Position2D>
+ <crd:Redshift unit="km" vel_time_unit="s">
+ <crd:Name>Vrad(barycenter)</crd:Name>
+ <crd:ValueRef>Column6</crd:ValueRef>
+ <crd:ErrorRef>Column7</crd:ErrorRef>
+ </crd:Redshift>
+ </crd:AstroCoords>
+ <crd:AstroCoords coord_system_id="SGC-OPTICAL-ET">
+ <crd:Position2D unit="deg">
+ <crd:Name>SGLong,SGLat</crd:Name>
+ <crd:Value2Ref>Column8</crd:Value2Ref>
+ <crd:Error2Ref>Column9</crd:Error2Ref>
+ <crd:Size2Ref>Column10</crd:Size2Ref>
+ </crd:Position2D>
+ <crd:Redshift unit="km" vel_time_unit="s">
+ <crd:Name>Vrad(Galcenter)</crd:Name>
+ <crd:ValueRef>Column11</crd:ValueRef>
+ <crd:ErrorRef>Column12</crd:ErrorRef>
+ </crd:Redshift>
+ </crd:AstroCoords>
+ <AstroCoordArea coord_system_id="B1950-OPTICAL-ET" ID="RA6-18hDec20-70deg">
+ <TimeInterval>
+ <StartTime>
+ <crd:TimeScale>ET</crd:TimeScale>
+ <crd:JDTime>2440000</crd:JDTime>
+ </StartTime>
+ <StopTime>
+ <crd:TimeScale>ET</crd:TimeScale>
+ <crd:JDTime>2440000</crd:JDTime>
+ </StopTime>
+ </TimeInterval>
+ <Region>
+ <reg:Polygon unit="deg">
+ <reg:Vertex>
+ <reg:Position>270 20</reg:Position>
+ </reg:Vertex>
+ <reg:Vertex>
+ <reg:Position>90 20</reg:Position>
+ <reg:SmallCircle/>
+ </reg:Vertex>
+ <reg:Vertex>
+ <reg:Position>90 70</reg:Position>
+ </reg:Vertex>
+ <reg:Vertex>
+ <reg:Position>270 70</reg:Position>
+ <reg:SmallCircle/>
+ </reg:Vertex>
+ </reg:Polygon>
+ </Region>
+ <SpectralInterval unit="Angstrom">
+ <LoLimit>5000</LoLimit>
+ <HiLimit>5000</HiLimit>
+ </SpectralInterval>
+ <RedshiftInterval unit="km" vel_time_unit="s">
+ <HiLimit>10000</HiLimit>
+ </RedshiftInterval>
+ </AstroCoordArea>
+</CatalogEntryLocation>
diff --git a/ast/ast_tester/teststc_eg4 b/ast/ast_tester/teststc_eg4
new file mode 100644
index 0000000..5b9d8ab
--- /dev/null
+++ b/ast/ast_tester/teststc_eg4
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<SearchLocation xmlns="http://www.ivoa.net/xml/STC/stc-v1.20.xsd" xmlns:crd="http://www.ivoa.net/xml/STC/STCcoords/v1.20" xmlns:reg="http://www.ivoa.net/xml/STC/STCregion/v1.20" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ivoa.net/xml/STC/stc-v1.20.xsd stc-v1.20.xsd">
+ <AstroCoordSystem ID="ICRS-TT-BARY">
+ <TimeFrame>
+ <Name>Time</Name>
+ <TimeScale>TT</TimeScale>
+ <BARYCENTER/>
+ </TimeFrame>
+ <SpaceFrame>
+ <Name>Equatorial</Name>
+ <ICRS/>
+ <TOPOCENTER/>
+ <SPHERICAL coord_naxes="2"/>
+ </SpaceFrame>
+ <SpectralFrame>
+ <Name>Wavelength</Name>
+ <BARYCENTER/>
+ </SpectralFrame>
+ </AstroCoordSystem>
+ <crd:AstroCoords coord_system_id="ICRS-TT-BARY">
+ <crd:Position2D unit="deg">
+ <crd:Name>RA,Dec</crd:Name>
+ <crd:Resolution2>0.0001 0.0001</crd:Resolution2>
+ <crd:Resolution2>0.0003 0.0003</crd:Resolution2>
+ <crd:Size2>0.5 0.5</crd:Size2>
+ <crd:Size2>0.67 0.67</crd:Size2>
+ <crd:PixSize2>0.00005 0.00005</crd:PixSize2>
+ <crd:PixSize2>0.00015 0.00015</crd:PixSize2>
+ </crd:Position2D>
+ <crd:Spectral unit="Angstrom">
+ <crd:Name>Lambda</crd:Name>
+ <crd:Resolution>300</crd:Resolution>
+ <crd:Resolution>600</crd:Resolution>
+ </crd:Spectral>
+ </crd:AstroCoords>
+ <AstroCoordArea ID="M81" coord_system_id="ICRS-TT-BARY">
+ <TimeInterval>
+ <StartTime>
+ <crd:TimeScale>TT</crd:TimeScale>
+ <crd:ISOTime>1900-01-01T00:00:00</crd:ISOTime>
+ </StartTime>
+ </TimeInterval>
+ <Region>
+ <reg:Circle unit="deg">
+ <reg:Center>148.9 69.1</reg:Center>
+ <reg:Radius>2</reg:Radius>
+ </reg:Circle>
+ </Region>
+ <SpectralInterval unit="Angstrom">
+ <LoLimit>4000</LoLimit>
+ <HiLimit>7000</HiLimit>
+ </SpectralInterval>
+ </AstroCoordArea>
+</SearchLocation>
+
diff --git a/ast/ast_tester/teststc_eg5 b/ast/ast_tester/teststc_eg5
new file mode 100644
index 0000000..97aad97
--- /dev/null
+++ b/ast/ast_tester/teststc_eg5
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ObsDataLocation xmlns="http://www.ivoa.net/xml/STC/stc-v1.20.xsd" xmlns:crd="http://www.ivoa.net/xml/STC/STCcoords/v1.20" xmlns:reg="http://www.ivoa.net/xml/STC/STCregion/v1.20" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ivoa.net/xml/STC/stc-v1.20.xsd stc-v1.20.xsd">
+ <ObservatoryLocation ID="KPNO">
+ <AstroCoordSystem ID="ICRS-TT-TOPO">
+ <TimeFrame>
+ <Name>Time</Name>
+ <TimeScale>TT</TimeScale>
+ <TOPOCENTER/>
+ </TimeFrame>
+ <SpaceFrame>
+ <Name>GeoLongLatElev</Name>
+ <GEO_D/>
+ <TOPOCENTER/>
+ <SPHERICAL coord_naxes="3"/>
+ </SpaceFrame>
+ </AstroCoordSystem>
+ <crd:AstroCoords coord_system_id="ICRS-TT-TOPO">
+ <crd:Position3D unit="deg deg m">
+ <crd:Name>LongLatElev</crd:Name>
+ <crd:Value3>248.4056 31.9586 2158</crd:Value3>
+ </crd:Position3D>
+ </crd:AstroCoords>
+ </ObservatoryLocation>
+ <ObservationLocation ID="M81">
+ <AstroCoordSystem ID="ICRS-TT-WAVELENGTH-TOPO">
+ <TimeFrame>
+ <Name>Time</Name>
+ <TimeScale>TT</TimeScale>
+ <TOPOCENTER/>
+ </TimeFrame>
+ <SpaceFrame>
+ <Name>Equatorial</Name>
+ <ICRS/>
+ <TOPOCENTER/>
+ <SPHERICAL coord_naxes="2"/>
+ </SpaceFrame>
+ <SpectralFrame>
+ <Name>Wavelength</Name>
+ <TOPOCENTER/>
+ </SpectralFrame>
+ </AstroCoordSystem>
+ <crd:AstroCoords coord_system_id="ICRS-TT-WAVELENGTH-TOPO">
+ <crd:Time unit="s">
+ <crd:Name>Time</crd:Name>
+ <crd:TimeInstant>
+ <crd:TimeScale>TT</crd:TimeScale>
+ <crd:ISOTime>2004-07-15T08:23:56 </crd:ISOTime>
+ </crd:TimeInstant>
+ <crd:PixSize>1000</crd:PixSize>
+ </crd:Time>
+ <crd:Position2D unit="deg">
+ <crd:Name>RA,Dec</crd:Name>
+ <crd:Value2>148.88821 69.06529</crd:Value2>
+ <crd:Error2>0.0003 0.0003</crd:Error2>
+ <crd:Resolution2>0.00025 0.00025 </crd:Resolution2>
+ <crd:PixSize2>0.0001 0.0001</crd:PixSize2>
+ </crd:Position2D>
+ <crd:Spectral unit="Angstrom">
+ <crd:Name>Lambda</crd:Name>
+ <crd:Value>4600</crd:Value>
+ <crd:Resolution>400</crd:Resolution>
+ <crd:PixSize>400</crd:PixSize>
+ </crd:Spectral>
+ </crd:AstroCoords>
+ <AstroCoordArea ID="M81Image" coord_system_id="ICRS-TT-WAVELENGTH-TOPO">
+ <TimeInterval>
+ <StartTime>
+ <crd:TimeScale>TT</crd:TimeScale>
+ <crd:ISOTime>2004-07-15T08:17:36 </crd:ISOTime>
+ </StartTime>
+ <StopTime>
+ <crd:TimeScale>TT</crd:TimeScale>
+ <crd:ISOTime>2004-07-15T08:30:16 </crd:ISOTime>
+ </StopTime>
+ </TimeInterval>
+ <PositionInterval unit="deg">
+ <Coord2VecInterval>
+ <LoLimit2Vec>148.18821 68.81529 </LoLimit2Vec>
+ <HiLimit2Vec>149.58821 69.31529 </HiLimit2Vec>
+ </Coord2VecInterval>
+ </PositionInterval>
+ <SpectralInterval unit="Angstrom">
+ <LoLimit>4400</LoLimit>
+ <HiLimit>4800</HiLimit>
+ </SpectralInterval>
+ </AstroCoordArea>
+ </ObservationLocation>
+ <PixelSpace>
+ <PixelCoordSystem ID="M81Pix">
+ <PixelCoordFrame>
+ <Name>X</Name>
+ </PixelCoordFrame>
+ <PixelCoordFrame>
+ <Name>Y</Name>
+ </PixelCoordFrame>
+ </PixelCoordSystem>
+ <PixelCoordArea coord_system_id="M81Pix" ID="M81PixImage">
+ <CoordScalarInterval>
+ <LoLimit>1</LoLimit>
+ <HiLimit>1024</HiLimit>
+ </CoordScalarInterval>
+ <CoordScalarInterval>
+ <LoLimit>1</LoLimit>
+ <HiLimit>1024</HiLimit>
+ </CoordScalarInterval>
+ </PixelCoordArea>
+ </PixelSpace>
+</ObsDataLocation>
+
diff --git a/ast/ast_tester/teststc_eg6 b/ast/ast_tester/teststc_eg6
new file mode 100644
index 0000000..7a291f6
--- /dev/null
+++ b/ast/ast_tester/teststc_eg6
@@ -0,0 +1,49 @@
+<STCResourceProfile xmlns="http://www.ivoa.net/xml/STC/stc-v1.20.xsd">
+ <AstroCoordSystem ID="ICRS-TT-CXO">
+ <TimeFrame>
+ <Name>Time</Name>
+ <TimeScale>TAI</TimeScale>
+ <TOPOCENTER/>
+ </TimeFrame>
+ <SpaceFrame>
+ <Name>Space</Name>
+ <ICRS/>
+ <TOPOCENTER/>
+ <SPHERICAL coord_naxes="2"/>
+ </SpaceFrame>
+ <SpectralFrame>
+ <Name>Energy</Name>
+ <TOPOCENTER/>
+ </SpectralFrame>
+ </AstroCoordSystem>
+ <AstroCoords coord_system_id="ICRS-TT-CXO">
+ <Time unit="s">
+ <Name>Time</Name>
+ <Error>0.0001</Error>
+ </Time>
+ <Position2D unit="arcsec">
+ <Name>Position</Name>
+ <Error2>
+ 1.0 1.0
+ </Error2>
+ </Position2D>
+ <Spectral unit="keV">
+ <Name>Energy</Name>
+ <Error>0.1</Error>
+ </Spectral>
+ </AstroCoords>
+ <AstroCoordArea ID="AllSky-CXO" coord_system_id="ICRS-TT-CXO">
+ <TimeInterval>
+ <StartTime>
+ <ISOTime>1999-07-23T16:00:00</ISOTime>
+ </StartTime>
+ </TimeInterval>
+ <Region>
+ <reg:AllSky fill_factor="0.02"/>
+ </Region>
+ <SpectralInterval unit="keV">
+ <LoLimit>0.12</LoLimit>
+ <HiLimit>10.0</HiLimit>
+ </SpectralInterval>
+ </AstroCoordArea>
+</STCResourceProfile>
diff --git a/ast/ast_tester/teststc_eg7 b/ast/ast_tester/teststc_eg7
new file mode 100644
index 0000000..0106c85
--- /dev/null
+++ b/ast/ast_tester/teststc_eg7
@@ -0,0 +1,52 @@
+<STCResourceProfile xmlns="http://www.ivoa.net/xml/STC/stc-v1.20.xsd">
+ <AstroCoordSystem ID="ICRS-TT-CXO">
+ <TimeFrame>
+ <Name>Time</Name>
+ <TOPOCENTER/>
+ <TimeScale>TAI</TimeScale>
+ </TimeFrame>
+ <SpaceFrame>
+ <Name>Space</Name>
+ <ICRS/>
+ <TOPOCENTER/>
+ <SPHERICAL coord_naxes="2"/>
+ </SpaceFrame>
+ <SpectralFrame>
+ <Name>Energy</Name>
+ <TOPOCENTER/>
+ </SpectralFrame>
+ </AstroCoordSystem>
+ <AstroCoords coord_system_id="ICRS-TT-CXO">
+ <Time unit="s">
+ <Name>Time</Name>
+ <Error>0.0001</Error>
+ </Time>
+ <Position2D unit="arcsec">
+ <Name>Position</Name>
+ <Error2>
+ 1.0 1.0
+ </Error2>
+ </Position2D>
+ <Spectral unit="keV">
+ <Name>Energy</Name>
+ <Error>0.1</Error>
+ </Spectral>
+ </AstroCoords>
+ <AstroCoordArea ID="AllSky-CXO" coord_system_id="ICRS-TT-CXO">
+ <TimeInterval>
+ <StartTime>
+ <ISOTime>1998-07-23T16:00:00</ISOTime>
+ </StartTime>
+ </TimeInterval>
+ <Region>
+ <reg:Circle unit="deg deg">
+ <Center>0.0 90.0</Center>
+ <Radius>2.0</Radius>
+ </reg:Circle>
+ </Region>
+ <SpectralInterval unit="keV">
+ <LoLimit>8.0</LoLimit>
+ <HiLimit>11.0</HiLimit>
+ </SpectralInterval>
+ </AstroCoordArea>
+</STCResourceProfile>
diff --git a/ast/ast_tester/teststc_eg8 b/ast/ast_tester/teststc_eg8
new file mode 100644
index 0000000..17c6574
--- /dev/null
+++ b/ast/ast_tester/teststc_eg8
@@ -0,0 +1,52 @@
+<STCResourceProfile xmlns="http://www.ivoa.net/xml/STC/stc-v1.20.xsd">
+ <AstroCoordSystem ID="ICRS-TT-CXO">
+ <TimeFrame>
+ <Name>Time</Name>
+ <TimeScale>UTC</TimeScale>
+ <TOPOCENTER/>
+ </TimeFrame>
+ <SpaceFrame>
+ <Name>Space</Name>
+ <ICRS/>
+ <TOPOCENTER/>
+ <SPHERICAL coord_naxes="2"/>
+ </SpaceFrame>
+ <SpectralFrame>
+ <Name>Energy</Name>
+ <TOPOCENTER/>
+ </SpectralFrame>
+ </AstroCoordSystem>
+ <AstroCoords coord_system_id="ICRS-TT-CXO">
+ <Time unit="s">
+ <Name>Time</Name>
+ <Error>0.0001</Error>
+ </Time>
+ <Position2D unit="arcsec">
+ <Name>Position</Name>
+ <Error2>
+ 1.0 1.0
+ </Error2>
+ </Position2D>
+ <Spectral unit="keV">
+ <Name>Energy</Name>
+ <Error>0.1</Error>
+ </Spectral>
+ </AstroCoords>
+ <AstroCoordArea ID="AllSky-CXO" coord_system_id="ICRS-TT-CXO">
+ <TimeInterval>
+ <StartTime>
+ <ISOTime>1999-09-23T16:00:00</ISOTime>
+ </StartTime>
+ </TimeInterval>
+ <Region>
+ <reg:Circle unit="deg deg">
+ <Center>0.0 90.0</Center>
+ <Radius>2.0</Radius>
+ </reg:Circle>
+ </Region>
+ <SpectralInterval unit="keV">
+ <LoLimit>8.0</LoLimit>
+ <HiLimit>9.0</HiLimit>
+ </SpectralInterval>
+ </AstroCoordArea>
+</STCResourceProfile>
diff --git a/ast/ast_tester/teststc_eg9 b/ast/ast_tester/teststc_eg9
new file mode 100644
index 0000000..195adb7
--- /dev/null
+++ b/ast/ast_tester/teststc_eg9
@@ -0,0 +1,49 @@
+<STCResourceProfile xmlns="http://www.ivoa.net/xml/STC/stc-v1.20.xsd">
+ <AstroCoordSystem ID="ICRS-TT-CXO">
+ <TimeFrame>
+ <Name>Time</Name>
+ <TimeScale>TCB</TimeScale>
+ <TOPOCENTER/>
+ </TimeFrame>
+ <SpaceFrame>
+ <Name>Space</Name>
+ <ICRS/>
+ <TOPOCENTER/>
+ <SPHERICAL coord_naxes="2"/>
+ </SpaceFrame>
+ <SpectralFrame>
+ <Name>Energy</Name>
+ <TOPOCENTER/>
+ </SpectralFrame>
+ </AstroCoordSystem>
+ <AstroCoords coord_system_id="ICRS-TT-CXO">
+ <Time unit="s">
+ <Name>Time</Name>
+ <Error>0.0001</Error>
+ </Time>
+ <Position2D unit="arcsec">
+ <Name>Position</Name>
+ <Error2>
+ 1.0 1.0
+ </Error2>
+ </Position2D>
+ <Spectral unit="keV">
+ <Name>Energy</Name>
+ <Error>0.1</Error>
+ </Spectral>
+ </AstroCoords>
+ <AstroCoordArea ID="AllSky-CXO" coord_system_id="ICRS-TT-CXO">
+ <TimeInterval>
+ <StopTime>
+ <ISOTime>1999-06-23T16:00:00</ISOTime>
+ </StopTime>
+ </TimeInterval>
+ <Region>
+ <reg:AllSky fill_factor="0.02"/>
+ </Region>
+ <SpectralInterval unit="keV">
+ <LoLimit>0.12</LoLimit>
+ <HiLimit>10.0</HiLimit>
+ </SpectralInterval>
+ </AstroCoordArea>
+</STCResourceProfile>
diff --git a/ast/ast_tester/teststcschan.f b/ast/ast_tester/teststcschan.f
new file mode 100755
index 0000000..928b301
--- /dev/null
+++ b/ast/ast_tester/teststcschan.f
@@ -0,0 +1,654 @@
+ program teststcschan
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+
+ integer status
+
+ status = sai__ok
+
+ call ast_begin( status )
+
+c call ast_watchmemory( 209814 );
+
+ call test2( status )
+ call test1( status )
+
+
+
+
+ call ast_end( status )
+c call ast_activememory( ' ' )
+c call ast_flushmemory( 1 )
+
+ if( status .eq. sai__ok ) then
+ call msg_out( ' ', ' All StcsChan tests passed', status )
+ else
+ call err_rep( ' ', 'StcsChan tests failed', status )
+ end if
+
+ end
+
+
+
+
+
+ subroutine test1( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ include 'AST_ERR'
+ include 'PRM_PAR'
+
+ integer iwrite
+ character buff(30)*300
+ common /bbb/ iwrite, buff
+
+ integer iread, idoc
+ common /aaa/ iread, idoc
+
+ integer status, ch, obj, km, i, sb, iobj, nobj
+ external source, sink
+
+ double precision lbnd(4), ubnd(4)
+ if( status .ne. sai__ok ) return
+
+ call ast_begin( status )
+
+ ch = ast_stcschan( source, sink, 'ReportLevel=3', status )
+
+
+ idoc = 4
+ iread = 0
+ obj = ast_read( ch, status )
+
+ idoc = 1
+ iread = 0
+
+ call err_mark
+ obj = ast_read( ch, status )
+ if( status .eq. AST__BADIN ) then
+ call err_annul( status )
+ call err_rlse
+ else
+ call err_rlse
+ call error( 'Failed to report error about "fred"', status )
+ end if
+
+
+ idoc = 2
+ iread = 0
+ obj = ast_read( ch, status )
+
+ km = ast_warnings( ch, status )
+ if( km .eq. AST__NULL ) call error( 'No Warnings keymap', status )
+ call asserti( 'Warnings mapsize', ast_mapsize( km, status ), 4,
+ : status )
+
+ call asserta( obj, 'Class', 'Prism', status )
+ call asserta( obj, 'Naxes', '4', status )
+ call asserta( obj, 'Label(1)', 'Modified Julian Date offset '//
+ : 'from 1900-01-01', status )
+ call asserta( obj, 'Label(2)', 'Right ascension', status )
+ call asserta( obj, 'Label(3)', 'Declination', status )
+ call asserta( obj, 'Label(4)', 'Wavelength', status )
+ call asserta( obj, 'Unit(1)', 'd', status )
+ call asserta( obj, 'Unit(4)', 'Angstrom', status )
+
+ call ast_GetRegionBounds( obj, lbnd, ubnd, status )
+ call ast_setc( obj, 'Format(1)', 'iso.2', status )
+ call assertd( 'Time upper bounds', ubnd(1), VAL__MAXD, status )
+ call assertc( 'Time lower bound',
+ : ast_format( obj, 1, lbnd(1), status ),
+ : '1900-01-01 00:00:00.00', status )
+ call assertd( 'RA lower bound', lbnd(2), 2.50080939227851D0,
+ : status )
+ call assertd( 'RA upper bound', ubnd(2), 2.6967811201606D0,
+ : status )
+ call assertd( 'Dec lower bound', lbnd(3), 1.171115928088195D0,
+ : status )
+ call assertd( 'Dec upper bound', ubnd(3), 1.24091013301998D0,
+ : status )
+ call assertd( 'Wavelength lower bound', lbnd(4), 4000.0D0,
+ : status )
+ call assertd( 'Wavelength upper bound', ubnd(4), 7000.0D0,
+ : status )
+
+
+
+ idoc = 3
+ iread = 0
+ obj = ast_read( ch, status )
+
+ call readast( 'stcschan-test1-doc3.ast', sb, status )
+ if( .not. ast_equal( obj, sb, status ) ) then
+ call error( 'Object read from doc3 is not equal to the '//
+ : 'object read from file stcschan-test1-doc3.ast.',
+ : status )
+ end if
+
+
+ call ast_setl( ch, 'StcsCoords', .true., status )
+ call ast_setl( ch, 'StcsProps', .true., status )
+
+ idoc = 3
+ iread = 0
+ obj = ast_read( ch, status )
+
+ call asserta( obj, 'Class', 'KeyMap', status )
+ call assert( 'Has PROPS entry', AST_MAPHASKEY( obj, 'PROPS',
+ : status ), status )
+ call assert( 'Has COORDS entry', AST_MAPHASKEY( obj, 'COORDS',
+ : status ), status )
+
+ if( ast_mapget0a( obj, 'AREA', iobj, status ) ) then
+ call readast( 'stcschan-test1-doc3.ast', sb, status )
+ if( .not. ast_equal( iobj, sb, status ) ) then
+ call error( 'AREA read from doc3 is not equal to the '//
+ : 'object read from file stcschan-test1-doc3.ast',
+ : status )
+ end if
+ else
+ call error( 'No AREA entry found', status )
+ end if
+
+ if( ast_mapget0a( obj, 'PROPS', iobj, status ) ) then
+ call readast( 'stcschan-test1-doc3-props.ast', sb, status )
+ if( .not. ast_equal( iobj, sb, status ) ) then
+ call error( 'PROPS read from doc3 is not equal to the '//
+ : 'object read from file stcschan-test1-doc3-props.ast',
+ : status )
+ end if
+ else
+ call error( 'No PROPS entry found', status )
+ end if
+
+
+
+ idoc = 5
+ iread = 0
+
+ call ast_setl( ch, 'Indent', .true., status )
+
+ obj = ast_read( ch, status )
+
+ iwrite = 0
+ nobj = ast_write( ch, obj, status )
+ call asserti( 'N obj', nobj, 1, status )
+
+ call assertc( 'line 1 3', buff(1),
+ : 'TimeInterval TT geocenter 1996-01-01T00:00:00 '//
+ : '1996-01-01T00:30:00', status )
+ call assertc( 'line 2 3', buff(2),
+ : ' Time MJD 50814.0 Error 1.2 Resolution 0.8 '//
+ : 'PixSize 1024.0', status )
+ call assertc( 'line 3 3', buff(3),
+ : 'Union ICRS GEOCENTER ( ', status )
+ call assertc( 'line 4 3', buff(4),
+ : ' Circle 180 10 20 ', status )
+ call assertc( 'line 5 3', buff(5),
+ : ' Circle 190 10 20 ', status )
+ call assertc( 'line 6 3', buff(6),
+ : ' Intersection ( ', status )
+ call assertc( 'line 7 3', buff(7),
+ : ' Circle 120 -10 20 ', status )
+ call assertc( 'line 8 3', buff(8),
+ : ' Difference ( ', status )
+ call assertc( 'line 9 3', buff(9),
+ : ' Circle 130 -10 20 ', status )
+ call assertc( 'line 10 3', buff(10),
+ : ' Circle 115 -10 10 ', status )
+ call assertc( 'line 11 3', buff(11),
+ : ' ) ', status )
+ call assertc( 'line 12 3', buff(12),
+ : ' ) ', status )
+ call assertc( 'line 13 3', buff(13),
+ : ' ) ', status )
+ call assertc( 'line 14 3', buff(14),
+ : ' Position 179.0 -11.5 Error 0.000889 0.000889 '//
+ : 'Resolution 0.001778', status )
+ call assertc( 'line 15 3', buff(15),
+ : ' Size 0.000333 0.000278 PixSize 0.000083 '//
+ : '0.000083', status )
+ call assertc( 'line 16 3', buff(16),
+ : 'Spectral BARYCENTER 1420.4 unit MHz Resolution '//
+ : '10.0 ', status )
+ call assertc( 'line 17 3', buff(17),
+ : 'RedshiftInterval BARYCENTER VELOCITY OPTICAL '//
+ : '200 2300 Redshift 300', status )
+
+ call ast_end( status )
+
+ if( status .ne. sai__ok ) call err_rep( ' ', 'test1 failed.',
+ : status )
+
+ end
+
+
+ subroutine test2( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ include 'AST_ERR'
+ include 'PRM_PAR'
+
+ integer iwrite
+ character buff(30)*300
+ common /bbb/ iwrite, buff
+
+ integer iread, idoc
+ common /aaa/ iread, idoc
+
+
+
+ external source, sink
+
+ integer status, ch, sf, unc, reg, nobj, obj, chr_len
+ double precision p1(2), p2(2), p3(3), lbnd(2), ubnd(2)
+
+ if( status .ne. sai__ok ) return
+
+
+ call ast_begin( status )
+ ch = ast_stcschan( source, sink, 'ReportLevel=3',status )
+ call ast_setl( ch, 'Indent', .true., status )
+ call ast_seti( ch, 'StcsLength', 60, status )
+
+ sf = ast_skyframe( ' ', status );
+ p1( 1 ) = 0.0
+ p1( 2 ) = 1.3
+ p2( 1 ) = 0.01
+
+ unc = ast_circle( sf, 1, p1, p2, AST__NULL, ' ', status )
+
+ p1( 1 ) = 1.3
+ p1( 2 ) = 0.5
+ p2( 1 ) = 0.3
+ p2( 2 ) = 0.1
+ p3( 1 ) = 1.0
+ reg = ast_ellipse( sf, 1, p1, p2, p3, unc, ' ', status )
+
+ iwrite = 0
+ nobj = ast_write( ch, reg, status )
+ call asserti( 'N obj', nobj, 1, status )
+ call asserti( 'iwrite', iwrite, 2, status )
+ call assertc( 'line 1', buff(1), 'Ellipse ICRS TOPOCENTER '//
+ : '74.48451 28.64789 17.18873 5.729578', status )
+ call assertc( 'line 2', buff(2), ' 57.29578 Error 0.5729514 '//
+ : '0.5726735', status )
+
+ call ast_set( ch, 'StcsCoords=1,StcsProps=1', status )
+
+ idoc = 3
+ iread = 0
+ obj = ast_read( ch, status )
+
+ if( obj .ne. AST__NULL ) then
+ iwrite = 0
+ nobj = ast_write( ch, obj, status )
+ call asserti( 'N obj 2', nobj, 1, status )
+
+ call assertc( 'line 1 2', buff(1), 'TimeInterval TT '//
+ : 'GEoCENTER 1996-01-01T00:00:00', status )
+
+ call assertc( 'line 2 2', buff(2), ' 1996-01-01T00:30:00 '//
+ : 'Time MJD 50814.0 Error 1.2', status );
+
+ call assertc( 'line 3 2', buff(3), ' Resolution 0.8 '//
+ : 'PixSize 1024.0', status )
+
+ call assertc( 'line 4 2', buff(4), 'Circle ICRS GEOCENTER '//
+ : '179.0 -11.5 0.5 Position 179.0 -11.5', status )
+
+ call assertc( 'line 5 2', buff(5), ' Error 0.000889 '//
+ : '0.000889 Resolution 0.001778 Size 0.000333',
+ : status )
+
+ call assertc( 'line 6 2', buff(6), ' 0.000278 PixSize '//
+ : '0.000083 0.000083', status )
+
+ call assertc( 'line 7 2', buff(7), 'Spectral BARYCENTER '//
+ : '1420.4 unit MHz Resolution 10.0', status )
+
+ call assertc( 'line 8 2', buff(8), 'RedshiftInterval '//
+ : 'BARYCENTER VELOCITY OPTICAL 200 2300 ',
+ : status )
+
+ call assertc( 'line 9 2', buff(9), ' Redshift 300 '//
+ : 'Resolution 0.7 PixSize 0.3', status )
+
+ else
+ write(*,*) 'No object read from doc 3'
+ end if
+
+
+ call ast_end( status )
+
+ if( status .ne. sai__ok ) call err_rep( ' ', 'test2 failed.',
+ : status )
+
+ end
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ subroutine source( status )
+ implicit none
+
+ integer iread, idoc
+ common /aaa/ iread, idoc
+
+ logical done
+ integer status, l, chr_len
+ character c*80
+
+ c = ' '
+ done = .false.
+
+ if( idoc .eq. 1 ) then
+ if( iread .eq. 0 ) then
+ c = 'StartTime 1900-01-01 Circle ICRS 148.9 69.1 2.0 fred'
+ else if( iread .eq. 1 ) then
+ c = 'SpectralInterval 4000 7000 unit Angstrom'
+ else
+ done = .true.
+ end if
+
+ else if( idoc .eq. 2 ) then
+ if( iread .eq. 0 ) then
+ c = 'StartTime 1900-01-01 Circle ICRS 148.9 69.1 2.0 '
+ else if( iread .eq. 1 ) then
+ c = 'SpeCtralInterval 4000 7000 unit Angstrom'
+ else
+ done = .true.
+ end if
+
+ else if( idoc .eq. 3 ) then
+ if( iread .eq. 0 ) then
+ c = 'TimeInterVal TT GEoCENTER'
+ else if( iread .eq. 1 ) then
+ c = '1996-01-01T00:00:00 1996-01-01T00:30:00'
+ else if( iread .eq. 2 ) then
+ c = 'Time MJD 50814.0 Error 1.2'
+ else if( iread .eq. 3 ) then
+ c = 'Resolution 0.8 PixSize 1024.0'
+ else if( iread .eq. 4 ) then
+ c = 'Circle ICRS GEOCENTER 179.0 -11.5 0.5'
+ else if( iread .eq. 5 ) then
+ c = 'Position 179.0 -11.5 Error 0.000889'
+ else if( iread .eq. 6 ) then
+ c = 'Resolution 0.001778 Size 0.000333 0.000278'
+ else if( iread .eq. 7 ) then
+ c = 'PixSIZE 0.000083 0.000083'
+ else if( iread .eq. 8 ) then
+ c = 'Spectral BARYCENTER 1420.4 unit MHz'
+ else if( iread .eq. 9 ) then
+ c = 'Resolution 10.0'
+ else if( iread .eq. 10 ) then
+ c = 'RedshiftInterval BARYCENTER VELOCITY OPTICAL'
+ else if( iread .eq. 11 ) then
+ c = '200.0 2300.0 Redshift 300.0'
+ else if( iread .eq. 12 ) then
+ c = 'Resolution 0.7 PixSize 0.3'
+ else
+ done = .true.
+ end if
+
+ else if( idoc .eq. 4 ) then
+ if( iread .eq. 0 ) then
+ c = 'TimeInterval TT GEOCENTER'
+ else if( iread .eq. 1 ) then
+ c = '1996-01-01T00:00:00 1996-01-01T00:30:00'
+ else if( iread .eq. 2 ) then
+ c = 'Time mjd 50814.0 ERROR 1.2'
+ else if( iread .eq. 3 ) then
+ c = 'Resolution 0.8 PixSize 1024.0'
+ else if( iread .eq. 4 ) then
+ c = 'Spectral barycenter 1420.4 UNIT MHz'
+ else if( iread .eq. 5 ) then
+ c = 'Resolution 10.0'
+ else
+ done = .true.
+ end if
+
+* Like doc 3 but with a compound spatial region
+ else if( idoc .eq. 5 ) then
+ if( iread .eq. 0 ) then
+ c = 'tIMEiNTERVAL tt geocenter'
+ else if( iread .eq. 1 ) then
+ c = '1996-01-01T00:00:00 1996-01-01T00:30:00'
+ else if( iread .eq. 2 ) then
+ c = 'Time MJD 50814.0 Error 1.2'
+ else if( iread .eq. 3 ) then
+ c = 'Resolution 0.8 PixSize 1024.0'
+ else if( iread .eq. 4 ) then
+ c = ' '
+ else if( iread .eq. 5 ) then
+ c = 'Union ICRS GEOCENTER'
+ else if( iread .eq. 6 ) then
+ c = ' (Circle 180 10 20'
+ else if( iread .eq. 7 ) then
+ c = ' Circle 190 10 20'
+ else if( iread .eq. 8 ) then
+ c = ' Intersection ('
+ else if( iread .eq. 9 ) then
+ c = ' cIRCLE 120 -10 20 dIFFERENCE '
+ else if( iread .eq. 10 ) then
+ c = ' ( Circle 130 -10 20 '
+ else if( iread .eq. 11 ) then
+ c = ' Circle 115 -10 10 '
+ else if( iread .eq. 12 ) then
+ c = ' )'
+ else if( iread .eq. 13 ) then
+ c = ' Not (Circle 118 -8 3)'
+ else if( iread .eq. 14 ) then
+ c = ' )'
+ else if( iread .eq. 15 ) then
+ c = ' )'
+ else if( iread .eq. 16 ) then
+ c = 'Position 179.0 -11.5 Error 0.000889'
+ else if( iread .eq. 17 ) then
+ c = 'Resolution 0.001778 Size 0.000333 0.000278'
+ else if( iread .eq. 18 ) then
+ c = 'PixSize 0.000083 0.000083'
+ else if( iread .eq. 19 ) then
+ c = 'Spectral BARYCENTER 1420.4 unit MHz'
+ else if( iread .eq. 20 ) then
+ c = 'rESOLUTION 10.0'
+ else if( iread .eq. 21 ) then
+ c = 'rEDSHIFTiNTERVAL barycenter velocity optical'
+ else if( iread .eq. 22 ) then
+ c = '200.0 2300.0 rEDSHIFT 300.0'
+ else if( iread .eq. 23 ) then
+ c = 'Resolution 0.7 PixSize 0.3'
+ else
+ done = .true.
+ end if
+
+ end if
+
+ l = max( chr_len( c ), 1 )
+ if( .not. done ) then
+ call ast_putline( c, l, status )
+ iread = iread + 1
+ else
+ call ast_putline( ' ', -1, status )
+ end if
+
+ end
+
+
+
+
+
+
+
+ subroutine sink( status )
+ implicit none
+
+ integer iwrite
+ character buff(30)*300
+ common /bbb/ iwrite, buff
+
+ integer status, l
+ character line*300
+
+ call ast_getline( line, l, status )
+ if( l .gt. 0 ) then
+ if( iwrite .lt. 0 ) then
+ write(*,*) line( : l )
+ else
+ iwrite = iwrite + 1
+ buff( iwrite ) = ' '
+ buff( iwrite ) = line( : l )
+ end if
+ end if
+
+ end
+
+
+ subroutine asserta( obj, anam, asb, status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ integer obj, status
+ character anam*(*), asb*(*), aval*80
+
+ aval = ast_GetC( obj, anam, status )
+
+ if( aval .ne. asb ) then
+ call msg_setc( 'A', anam )
+ call msg_setc( 'B', aval )
+ call msg_setc( 'C', asb )
+ call error( '^A (^B) should be "^C".', status )
+ end if
+
+ end
+
+ subroutine assertc( name, val, sb, status )
+ implicit none
+ include 'SAE_PAR'
+ integer status, i
+ character name*(*), val*(*), sb*(*)
+ character blank*500
+
+ if( val .ne. sb .and. status .eq. sai__ok ) then
+ call msg_setc( 'A', name )
+ call msg_setc( 'B', val )
+ call error( '^A (^B) should be:', status )
+
+ i = 1
+ blank = ' '
+ do while( val( i : i ) .eq. sb( i : i ) )
+ i = i + 1
+ end do
+ blank( i : i ) = '^'
+
+ write(*,*) sb
+ write(*,*) blank( : i + 2 )
+
+ end if
+
+ end
+
+ subroutine asserti( name, val, sb, status )
+ implicit none
+ include 'SAE_PAR'
+ integer status
+ character name*(*)
+ integer val, sb
+
+ if( val .ne. sb ) then
+ call msg_setc( 'A', name )
+ call msg_seti( 'B', val )
+ call msg_seti( 'C', sb )
+ call error( '^A (^B) should be ^C.', status )
+ end if
+
+ end
+
+ subroutine assert( name, val, status )
+ implicit none
+ include 'SAE_PAR'
+ integer status
+ character name*(*)
+ logical val
+
+ if( .not. val ) then
+ call msg_setc( 'A', name )
+ call error( '^A is not true.', status )
+ end if
+
+ end
+
+ subroutine assertd( name, val, sb, status )
+ implicit none
+ include 'SAE_PAR'
+ integer status
+ character name*(*)
+ double precision val, sb
+
+ if( abs( val - sb ) .gt. 0.5E-8*( val + sb ) ) then
+ call msg_setc( 'A', name )
+ call msg_setd( 'B', val )
+ call msg_setd( 'C', sb )
+ call error( '^A (^B) should be ^C.', status )
+ end if
+
+ end
+
+ subroutine error( text, status )
+ implicit none
+ include 'SAE_PAR'
+ integer status
+ character text*(*)
+
+ if( status .eq. sai__ok ) then
+ status = sai__error
+ call err_rep( ' ', text, status )
+ end if
+
+ end
+
+
+ subroutine readast( file, obj, status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ integer obj, status, channel
+ character file*(*)
+ external rsource
+
+ if( status .ne. sai__ok ) return
+
+ open( 10, file=file, status='old' )
+ channel = ast_channel( rsource, ast_null, ' ', status )
+ obj = ast_read( channel, status )
+ call ast_annul( channel, status )
+ close( 10 )
+
+ end
+
+
+ subroutine rsource( status )
+ integer status
+ character buffer*200
+
+ read( 10, '(a)', end = 99 ) buffer
+ call ast_putline( buffer, len( buffer ), status )
+ return
+
+ 99 call ast_putline( buffer, -1, status )
+ end
+
+
diff --git a/ast/ast_tester/testswitchmap.f b/ast/ast_tester/testswitchmap.f
new file mode 100644
index 0000000..401447b
--- /dev/null
+++ b/ast/ast_tester/testswitchmap.f
@@ -0,0 +1,794 @@
+ program testswitchmap
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+
+ integer status, outperm(2), inperm(2), wm1, wm2, pm1, pm2, rm(2),
+ : fs, is, swm, i, swm2, cm, cm2, sm, oc, mc, fc,
+ : box(2), gridframe
+ double precision x1, x2, l1, l2, in(4,2), out(4,2), at(2), r,
+ : p1(2),p2(2), rmout(4,2), r1, r2
+ character text*10, fwd(1)*40, inv(2)*40, card(10)*80
+
+ status = sai__ok
+
+ call ast_begin( status )
+
+c call ast_watchmemory(22617)
+
+ oc = ast_tune( 'ObjectCaching', 1, status )
+ mc = ast_tune( 'MemoryCaching', 1, status )
+
+
+
+* A 2D input grid has 2 rows and 101 columns. Each row contains a spectrum.
+* The two spectra cover overlaping regions of wavelength. The spectrum in
+* row 1 has "wavelength = (gridx - 1)*10+1000", whilst the spectrum in
+* row 2 has "wavelength = (gridx - 1)*11+1600". We use a (Nin=2,Nout=1)
+* SwitchMap to describe the Mapping from grid (x,y) to wavelength. This
+* SwitchMap contains 2 route Mappings, one for each row of the grid.
+* --------------------------------------------------------------------
+
+* Produce a 1D Mapping from gridx to wavelength for row 1.
+ x1 = 1.0
+ x2 = 101.0
+ l1 = 1000.0
+ l2 = 2000.0
+ wm1 = ast_winmap( 1, x1, x2, l1, l2, ' ', status )
+
+* Since the SwicthMap has 2 inputs, each of the route Mappings must also
+* have 2 inputs. Produce a PermMap which passes on its 1st input to its
+* (one and only) output. The inverse transformation supplied a value of
+* 1.0 for the missing 2nd input (1.0 is the grid Y value for the first
+* row).
+ outperm( 1 ) = 1
+ inperm( 1 ) = 1
+ inperm( 2 ) = -1
+ pm1 = ast_permmap( 2, inperm, 1, outperm, 1.0D0, ' ', status )
+
+* Combine the PermMap and WinMap in series to get the total route
+* Mapping for the first row.
+ rm(1) = ast_cmpmap( pm1, wm1, .true., ' ', status )
+
+* Likewise, produce the route Mapping for the second row. The grid y
+* value for the second row is 2.0, so use this as the constant in the
+* PermMap (i.e. the value which the inverse transformation supplies for
+* the missing second input).
+ l1 = 1600.0
+ l2 = 2700.0
+ wm2 = ast_winmap( 1, x1, x2, l1, l2, ' ', status )
+ pm2 = ast_permmap( 2, inperm, 1, outperm, 2.0D0, ' ', status )
+ rm(2) = ast_cmpmap( pm2, wm2, .true., ' ', status )
+
+* The forward selector Mapping just uses the second input (the grid Y
+* value) as the selector value (i.e. gridy=1 selects the first route
+* Mapping and gridy=2 selects the second route Mapping). The inverse
+* transformation of this Mapping is never used and so does not matter.
+ outperm( 1 ) = 2
+ inperm( 2 ) = 1
+ inperm( 1 ) = 0
+ fs = ast_permmap( 2, inperm, 1, outperm, 0.0D0, ' ', status )
+
+* The inverse selector function needs to decide which route Mapping to
+* use for any supplied ("output") wavelength value. We arbitrarily
+* decide to to use the first row for wavelengths less than or equal to
+* 1800, and the second row for wavelengths larger than 1800 (1800 is the
+* mid-point of the overlap between the two spectra). We use a MathMap to
+* implement this transformation, which must be the *inverse*
+* transformation of the MathMap. The forward transformation of the
+* inverse slector Mapping is never used and so is left unspecified in
+* the MathMap constructor.
+ is = ast_mathmap( 1, 1, 1, 'y', 1, 'x=qif(y>1800,2,1)', ' ',
+ : status )
+
+* Now create the SwitchMap.
+ swm = ast_switchmap( fs, is, 2, rm, ' ', status )
+
+* Test the forward transformation of the SwitchMap. To add complication,
+* we first invert the SwitchMap and then use ast_trann in the inverse
+* direction (the two inversions cancel resulting in the forward
+* transformation being used).
+ call ast_invert( swm, status )
+
+ in(1,1) = 1.0
+ in(1,2) = 1.0
+ in(2,1) = 101.0
+ in(2,2) = 2.0
+ in(3,1) = 1.0
+ in(3,2) = 2.0
+ in(4,1) = 101.0
+ in(4,2) = 1.0
+ call ast_trann( swm, 4, 2, 4, in, .false., 1, 4, out, status )
+
+ do i = 1, 4
+ if( out(i,1) .eq. ast__bad ) then
+ call stopit( i, out(i,1), status )
+ end if
+ end do
+
+ if( abs( out(1,1) - 1000.0 ) .gt. 1.0E-5 ) then
+ call stopit( 5, out(1,1), status )
+ else if( abs( out(2,1) - 2700.0 ) .gt. 1.0E-5 ) then
+ call stopit( 6, out(2,1), status )
+ else if( abs( out(3,1) - 1600.0 ) .gt. 1.0E-5 ) then
+ call stopit( 7, out(3,1), status )
+ else if( abs( out(4,1) - 2000.0 ) .gt. 1.0E-5 ) then
+ call stopit( 8, out(4,1), status )
+ end if
+
+* Test the inverse transformation of the SwitchMap.
+ call ast_trann( swm, 4, 1, 4, out, .true., 2, 4, in, status )
+
+ do i = 1, 4
+ if( in(i,1) .eq. ast__bad ) then
+ call stopit( 7 + 2*i, in(i,1), status )
+ else if( in(i,2) .eq. ast__bad ) then
+ call stopit( 8 + 2*i, in(i,2), status )
+ end if
+ end do
+
+ if( abs( in(1,1) - 1.0 ) .gt. 1.0E-5 ) then
+ call stopit( 17, in(1,1), status )
+ else if( abs( in(1,2) - 1.0 ) .gt. 1.0E-5 ) then
+ call stopit( 18, in(1,2), status )
+ else if( abs( in(2,1) - 101.0 ) .gt. 1.0E-5 ) then
+ call stopit( 19, in(2,1), status )
+ else if( abs( in(2,2) - 2.0 ) .gt. 1.0E-5 ) then
+ call stopit( 20, in(2,2), status )
+ else if( abs( in(3,1) - 61.0 ) .gt. 1.0E-5 ) then
+ call stopit( 21, in(3,1), status )
+ else if( abs( in(3,2) - 1.0 ) .gt. 1.0E-5 ) then
+ call stopit( 22, in(3,2), status )
+ else if( abs( in(4,1) - 37.3636364 ) .gt. 1.0E-5 ) then
+ call stopit( 23, in(4,1), status )
+ else if( abs( in(4,2) - 2.0 ) .gt. 1.0E-5 ) then
+ call stopit( 24, in(4,2), status )
+ end if
+
+* Check no simplification is done on a single non-inverted SwicthMap.
+ call ast_setl( swm, 'Invert', .false., status )
+ swm2 = ast_simplify( swm, status )
+ call compare( swm, swm2, 'ast_equal 1', status )
+
+* Check an inverted SwitchMap simplies to an non-inverted switchmap.
+ call ast_setl( swm, 'Invert', .true., status )
+ swm2 = ast_simplify( swm, status )
+ if( ast_getl( swm2, 'Invert', status ) ) then
+ call stopit( 25, 1.0D0, status )
+ end if
+
+* Check two adjacent opposite SwitchMaps cancel.
+ swm2 = ast_copy( swm, status )
+ call ast_invert( swm2, status )
+ cm = ast_cmpmap( swm, swm2, .true., ' ', status )
+ cm2 = ast_simplify( cm, status )
+ if( .not. ast_isaunitmap( cm2, status ) ) then
+ call stopit( 26, 1.0D0, status )
+ end if
+
+ cm = ast_cmpmap( swm2, swm, .true., ' ', status )
+ cm2 = ast_simplify( cm, status )
+ if( .not. ast_isaunitmap( cm2, status ) ) then
+ call stopit( 27, 1.0D0, status )
+ end if
+
+* Check that the SwitchMap can be written out to a AstChannel and read
+* back again succesfully.
+ call checkdump( swm, 'Channel test 1', status )
+
+* Check the ast_rate function works OK.
+ call ast_setl( swm, 'Invert', .false., status )
+
+ at(1) = 20.0
+ at(2) = 1.0
+ r = ast_rate( swm, at, 1, 1, status )
+ if( abs( r - 10.0 ) .gt. 1.0E-6 ) call stopit( 28, r, status )
+
+ at(1) = 20.0
+ at(2) = 2.0
+ r = ast_rate( swm, at, 1, 1, status )
+ if( abs( r - 11.0 ) .gt. 1.0E-6 ) call stopit( 29, r, status )
+
+ call ast_setl( swm, 'Invert', .true., status )
+
+ at(1) = 1700.0
+ r = ast_rate( swm, at, 1, 1, status )
+ if( abs( r - 1.0/10.0 ) .gt. 1.0E-6 ) call stopit( 30, r, status )
+
+ at(1) = 1900.0
+ r = ast_rate( swm, at, 1, 1, status )
+ if( abs( r - 1.0/11.0 ) .gt. 1.0E-6 ) call stopit( 31, r, status )
+
+ call ast_setl( swm, 'Invert', .false., status )
+
+
+* A 1D input grid has 1 rows and 202 columns. Each half of the row
+* (1:101 and 102:202) contains a spectrum. The two spectra cover
+* overlaping regions of wavelength. The spectrum in thw lower half has
+* "wavelength = (gridx - 1)*10+1000", whilst the spectrum in the upper
+* half has "wavelength = (gridx - 1)*11+1600". We use a (Nin=1,Nout=1)
+* SwitchMap to describe the Mapping from grid (x) to wavelength. This
+* SwitchMap contains 2 route Mappings, one for each half of the row.
+* --------------------------------------------------------------------
+
+* Produce a 1D Mapping from gridx to wavelength for the lower half.
+ x1 = 1.0
+ x2 = 101.0
+ l1 = 1000.0
+ l2 = 2000.0
+ rm(1) = ast_winmap( 1, x1, x2, l1, l2, ' ', status )
+
+* Likewise, produce a 1D Mapping from gridx to wavelength for the upper half.
+ x1 = 102.0
+ x2 = 202.0
+ l1 = 1600.0
+ l2 = 2700.0
+ rm(2) = ast_winmap( 1, x1, x2, l1, l2, ' ', status )
+
+* We can use a single MathMap for both selector Mappings - the forward
+* transformation (used as the forward selector) gives 1 for all gridx less
+* than 101.5 and 2 for all gridx greater than 101.5. The inverse
+* transformation (used as the inverse selector) gives 1 for all
+* wavelengths les than 1800 and 2 for all wavelength greater than 1800
+* (1800 is the mid point of the overlap region).
+ sm = ast_mathmap( 1, 1, 1, 'y=qif(x>101.5,2,1)',
+ : 1, 'x=qif(y>1800,2,1)',
+ : ' ', status )
+
+* Now create the SwitchMap.
+ swm = ast_switchmap( sm, sm, 2, rm, ' ', status )
+
+* Test the forward transformation of the SwitchMap. To add complication,
+* we first invert the SwitchMap and then use ast_trann in the inverse
+* direction (the two inversions cancel resulting in the forward
+* transformation being used). We alo invert the selector mapping (this
+* should have no effect on the SwitchMap).
+ call ast_invert( swm, status )
+ call ast_invert( sm, status )
+
+ in(1,1) = 1.0
+ in(2,1) = 202.0
+ in(3,1) = 102.0
+ in(4,1) = 101.0
+ call ast_trann( swm, 4, 1, 4, in, .false., 1, 4, out, status )
+
+ do i = 1, 4
+ if( out(i,1) .eq. ast__bad ) then
+ call stopit( 100+i, out(i,1), status )
+ end if
+ end do
+
+ if( abs( out(1,1) - 1000.0 ) .gt. 1.0E-5 ) then
+ call stopit( 105, out(1,1), status )
+ else if( abs( out(2,1) - 2700.0 ) .gt. 1.0E-5 ) then
+ call stopit( 106, out(2,1), status )
+ else if( abs( out(3,1) - 1600.0 ) .gt. 1.0E-5 ) then
+ call stopit( 107, out(3,1), status )
+ else if( abs( out(4,1) - 2000.0 ) .gt. 1.0E-5 ) then
+ call stopit( 108, out(4,1), status )
+ end if
+
+* Test the inverse transformation of the SwitchMap.
+ call ast_trann( swm, 4, 1, 4, out, .true., 1, 4, in, status )
+
+ do i = 1, 4
+ if( in(i,1) .eq. ast__bad ) then
+ call stopit( 107 + 2*i, in(i,1), status )
+ end if
+ end do
+
+ if( abs( in(1,1) - 1.0 ) .gt. 1.0E-5 ) then
+ call stopit( 117, in(1,1), status )
+ else if( abs( in(2,1) - 202.0 ) .gt. 1.0E-5 ) then
+ call stopit( 119, in(2,1), status )
+ else if( abs( in(3,1) - 61.0 ) .gt. 1.0E-5 ) then
+ call stopit( 121, in(3,1), status )
+ else if( abs( in(4,1) - 138.3636364 ) .gt. 1.0E-5 ) then
+ call stopit( 123, in(4,1), status )
+ end if
+
+* Check no simplification is done on a single non-inverted SwicthMap.
+ call ast_setl( swm, 'Invert', .false., status )
+ swm2 = ast_simplify( swm, status )
+ call compare( swm, swm2, 'ast_equal 2', status )
+
+* Check an inverted SwitchMap simplies to an non-inverted switchmap.
+ call ast_setl( swm, 'Invert', .true., status )
+ swm2 = ast_simplify( swm, status )
+ if( ast_getl( swm2, 'Invert', status ) ) then
+ call stopit( 125, 1.0D0, status )
+ end if
+
+* Check two adjacent opposite SwitchMaps cancel.
+ swm2 = ast_copy( swm, status )
+ call ast_invert( swm2, status )
+ cm = ast_cmpmap( swm, swm2, .true., ' ', status )
+ cm2 = ast_simplify( cm, status )
+ if( .not. ast_isaunitmap( cm2, status ) ) then
+ call stopit( 126, 1.0D0, status )
+ end if
+
+ cm = ast_cmpmap( swm2, swm, .true., ' ', status )
+ cm2 = ast_simplify( cm, status )
+ if( .not. ast_isaunitmap( cm2, status ) ) then
+ call stopit( 127, 1.0D0, status )
+ end if
+
+* Check that the SwitchMap can be written out to a AstChannel and read
+* back again succesfully.
+ call checkdump( swm, 'Channel test 2', status )
+
+* Check the ast_rate function works OK.
+ call ast_setl( swm, 'Invert', .false., status )
+
+ at(1) = 20.0
+ r = ast_rate( swm, at, 1, 1, status )
+ if( abs( r - 10.0 ) .gt. 1.0E-6 ) call stopit( 128, r, status )
+
+ at(1) = 120.0
+ r = ast_rate( swm, at, 1, 1, status )
+ if( abs( r - 11.0 ) .gt. 1.0E-6 ) call stopit( 129, r, status )
+
+ call ast_setl( swm, 'Invert', .true., status )
+
+ at(1) = 1700.0
+ r = ast_rate( swm, at, 1, 1, status )
+ if( abs( r - 1.0/10.0 ) .gt. 1.0E-6 ) call stopit( 130, r,
+ : status )
+
+ at(1) = 1900.0
+ r = ast_rate( swm, at, 1, 1, status )
+ if( abs( r - 1.0/11.0 ) .gt. 1.0E-6 ) call stopit( 131, r,
+ : status )
+
+ call ast_setl( swm, 'Invert', .false., status )
+
+
+* A 2D input grid has bounds (1:180,1:100). The area (10:80,10:80)
+* and the area (100:170,10:80) both contain images of a fixed part of
+* the sky (e.g. in different polarisations). The WCS for each sub-region
+* is derived from a single FITS-WCS header,with suitably shifted origin.
+* --------------------------------------------------------------------
+ card(1) = 'CRPIX1 = 45'
+ card(2) = 'CRPIX2 = 45'
+ card(3) = 'CRVAL1 = 45'
+ card(4) = 'CRVAL2 = 89.9'
+ card(5) = 'CDELT1 = -0.01'
+ card(6) = 'CDELT2 = 0.01'
+ card(7) = 'CTYPE1 = ''RA---TAN'''
+ card(8) = 'CTYPE2 = ''DEC--TAN'''
+
+ fc = ast_fitschan( AST_NULL, AST_NULL, ' ', status )
+ do i = 1, 8
+ call ast_putfits( fc, card(i), .false., status )
+ end do
+ call ast_clear( fc, 'Card', status )
+ fs = ast_read( fc, status )
+ rm(1) = ast_getMapping( fs, ast__base, ast__current, status )
+
+ card(1) = 'CRPIX1 = 135'
+ call ast_clear( fc, 'Card', status )
+ do i = 1, 8
+ call ast_putfits( fc, card(i), .true., status )
+ end do
+ call ast_clear( fc, 'Card', status )
+ fs = ast_read( fc, status )
+ rm(2) = ast_getMapping( fs, ast__base, ast__current, status )
+
+* Forward Selector Mapping: A SelectorMap which encapsulates the two Box
+* Regions in GRID coords.
+ gridframe = ast_getframe( fs, AST__BASE, status )
+
+ p1(1) = 10
+ p1(2) = 10
+ p2(1) = 80
+ p2(2) = 80
+ box(1) = ast_box( gridframe, 1, p1, p2, AST__NULL, ' ', status )
+
+ p1(1) = 100
+ p1(2) = 10
+ p2(1) = 170
+ p2(2) = 80
+ box(2) = ast_box( gridframe, 1, p1, p2, AST__NULL, ' ', status )
+
+ fs = ast_selectormap( 2, box, AST__BAD, ' ', status )
+
+* Inverse Selector Mapping: A PermMap which has an inverse transformation
+* which gives an input value of 1 for all output values. This means that the
+* inverse transformation of the SwitchMap always returns a GRID position in
+* the lower (left-hand) of the two images.
+ inperm(1) = -1
+ outperm(1) = 0
+ outperm(2) = 0
+ is = ast_permmap( 1, inperm, 2, outperm, 1.0D0, ' ', status )
+
+* Now create the SwitchMap.
+ swm = ast_switchmap( fs, is, 2, rm, ' ', status )
+
+* Test the forward transformation of the SwitchMap. To add complication,
+* we first invert the SwitchMap and then use ast_trann in the inverse
+* direction (the two inversions cancel resulting in the forward
+* transformation being used). We alo invert the selector mapping (this
+* should have no effect on the SwitchMap).
+ call ast_invert( swm, status )
+ call ast_invert( fs, status )
+
+ in(1,1) = 5.0
+ in(1,2) = 5.0
+
+ in(2,1) = 50.0
+ in(2,2) = 50.0
+
+ in(3,1) = 90.0
+ in(3,2) = 50.0
+
+ in(4,1) = 140.0
+ in(4,2) = 50.0
+
+ call ast_trann( swm, 4, 2, 4, in, .false., 2, 4, out, status )
+
+* Transform these same positions using the Mapping for the left hand
+* image obtained from the FITS header
+ call ast_trann( rm(1), 4, 2, 4, in, .true., 2, 4, rmout, status )
+
+* Check the SwitchMap results. Points 1 and 3 should be bad because they
+* fall outside either image. points 2 and 4 should both be equal to the
+* result of transforming point 2 using the FITS-WCS mapping.
+
+ if( out(1,1) .ne. AST__BAD ) then
+ call stopit( 132, out(1,1), status )
+
+ else if( out(1,2) .ne. AST__BAD ) then
+ call stopit( 133, out(1,1), status )
+
+ else if( out(2,1) .ne. rmout(2,1) ) then
+ call stopit( 134, out(2,1), status )
+
+ else if( out(2,2) .ne. rmout(2,2) ) then
+ call stopit( 135, out(2,2), status )
+
+ else if( out(3,1) .ne. AST__BAD ) then
+ call stopit( 136, out(1,1), status )
+
+ else if( out(3,2) .ne. AST__BAD ) then
+ call stopit( 137, out(1,1), status )
+
+ else if( abs( out(4,1) - rmout(2,1) ) .gt.
+ : 1.0D-6*abs( rmout(2,1) ) ) then
+ call stopit( 138, out(2,1), status )
+
+ else if( abs( out(4,2) - rmout(2,2) ) .gt.
+ : 1.0D-6*abs( rmout(2,2) ) ) then
+ call stopit( 139, out(2,2), status )
+
+ end if
+
+
+* Test the inverse transformation of the SwitchMap.
+ call ast_trann( swm, 4, 2, 4, out, .true., 2, 4, in, status )
+
+ if( in(1,1) .ne. AST__BAD ) then
+ call stopit( 140, in(1,1), status )
+
+ else if( in(1,2) .ne. AST__BAD ) then
+ call stopit( 141, in(1,1), status )
+
+ else if( abs( in(2,1) - 50.0 ) .gt. 1.0E-6 ) then
+ call stopit( 142, in(2,1), status )
+
+ else if( abs( in(2,2) - 50.0 ) .gt. 1.0E-6 ) then
+ call stopit( 143, in(2,2), status )
+
+ else if( in(3,1) .ne. AST__BAD ) then
+ call stopit( 144, in(1,1), status )
+
+ else if( in(3,2) .ne. AST__BAD ) then
+ call stopit( 145, in(1,1), status )
+
+ else if( abs( in(4,1) - 50.0 ) .gt. 1.0E-6 ) then
+ call stopit( 146, in(2,1), status )
+
+ else if( abs( in(4,2) - 50.0 ) .gt. 1.0E-6 ) then
+ call stopit( 147, in(2,2), status )
+
+ end if
+
+* Check no simplification is done on a single non-inverted SwicthMap.
+ call ast_setl( swm, 'Invert', .false., status )
+ swm2 = ast_simplify( swm, status )
+ call compare( swm, swm2, 'ast_equal 3', status )
+
+* Check an inverted SwitchMap simplies to an non-inverted switchmap.
+ call ast_setl( swm, 'Invert', .true., status )
+ swm2 = ast_simplify( swm, status )
+ if( ast_getl( swm2, 'Invert', status ) ) then
+ call stopit( 148, 1.0D0, status )
+ end if
+
+* Check two adjacent opposite SwitchMaps cancel.
+ swm2 = ast_copy( swm, status )
+ call ast_invert( swm2, status )
+ cm = ast_cmpmap( swm, swm2, .true., ' ', status )
+ cm2 = ast_simplify( cm, status )
+ if( .not. ast_isaunitmap( cm2, status ) ) then
+ call stopit( 149, 1.0D0, status )
+ end if
+
+ cm = ast_cmpmap( swm2, swm, .true., ' ', status )
+ cm2 = ast_simplify( cm, status )
+ if( .not. ast_isaunitmap( cm2, status ) ) then
+ call stopit( 150, 1.0D0, status )
+ end if
+
+* Check that the SwitchMap can be written out to a AstChannel and read
+* back again succesfully.
+ call checkdump( swm, 'Channel test 3', status )
+
+* Check the ast_rate function works OK.
+ call ast_setl( swm, 'Invert', .false., status )
+
+ at(1) = 140.0
+ at(2) = 50.0
+ r1 = ast_rate( swm, at, 1, 1, status )
+
+ at(1) = 50.0
+ r2 = ast_rate( rm(1), at, 1, 1, status )
+
+ if( abs( r1 - r2 ) .gt. abs( 1.0E-6*r2 ) ) call stopit( 151, r1,
+ : status )
+
+ at(1) = 140.0
+ r1 = ast_rate( swm, at, 2, 2, status )
+
+ at(1) = 50.0
+ r2 = ast_rate( rm(1), at, 2, 2, status )
+
+ if( abs( r1 - r2 ) .gt. abs( 1.0E-6*r2 ) ) call stopit( 152, r1,
+ : status )
+
+ at(1) = 140.0
+ r1 = ast_rate( swm, at, 1, 2, status )
+
+ at(1) = 50.0
+ r2 = ast_rate( rm(1), at, 1, 2, status )
+
+ if( abs( r1 - r2 ) .gt. abs( 1.0E-6*r2 ) ) call stopit( 153, r1,
+ : status )
+
+ at(1) = 140.0
+ r1 = ast_rate( swm, at, 2, 1, status )
+
+ at(1) = 50.0
+ r2 = ast_rate( rm(1), at, 2, 1, status )
+
+ if( abs( r1 - r2 ) .gt. abs( 1.0E-6*r2 ) ) call stopit( 154, r1,
+ : status )
+
+
+
+
+ mc = ast_tune( 'MemoryCaching', mc, status )
+ oc = ast_tune( 'ObjectCaching', oc, status )
+ call ast_end( status )
+
+ call ast_activememory( 'testswitchmap' )
+ call ast_flushmemory( 1 )
+
+ if( status .eq. sai__ok ) then
+ write(*,*) 'All SwitchMap tests passed'
+ else
+ write(*,*) 'SwitchMap tests failed'
+ end if
+
+ end
+
+
+ subroutine stopit( i, r, status )
+ implicit none
+ include 'SAE_PAR'
+ integer i, status
+ double precision r
+ if( status .eq. sai__ok ) then
+ write( *,* ) 'Error ',i,': ',r
+ status = sai__error
+ end if
+ end
+
+
+
+ subroutine checkdump( obj, text, status )
+
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ character text*(*)
+ integer obj, status, next, end, ch, result, ll, overlap, ibuf,
+ : len1, len2
+ external mysource, mysink
+ character buf1*45000
+ character buf2*45000
+
+ common /ss1/ buf1
+ common /ss3/ buf2
+ common /ss2/ next, end, ll, ibuf
+
+ if( status .ne. sai__ok ) return
+
+* Create a Channel which reads and writes to an internal string buffer.
+ ch = ast_channel( mysource, mysink, ' ', status )
+
+* Write the supplied Object out to this Channel.
+ ll = 160
+ next = 1
+ ibuf = 1
+ if( ast_write( ch, obj, status ) .ne.1 ) then
+ write(*,*) text
+ call stopit( 1000, 1.0D0, status )
+ end if
+ len1 = next
+
+* Read an Object back from this Channel.
+ next = 1
+ result = ast_read( ch, status )
+ if( result .eq. ast__null ) then
+ write(*,*) text
+ call stopit( 1001, 1.0D0, status )
+ end if
+
+* Check that it is of the same class as the supplied object.
+ if( ast_getc( result, 'Class', status ) .ne.
+ : ast_getc( obj, 'Class', status ) ) then
+ write(*,*) text
+ call stopit( 1002, 1.0D0, status )
+ end if
+
+* Compare it to the suuplied object.
+ call compare( obj, result, text, status )
+
+ end
+
+
+
+
+ subroutine compare( obj1, obj2, text, status )
+
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ character text*(*)
+ integer obj1, status, next, end, ch, result, ll, overlap, ibuf,
+ : len1, len2, obj2
+ external mysource, mysink
+ character buf1*45000
+ character buf2*45000
+
+ common /ss1/ buf1
+ common /ss3/ buf2
+ common /ss2/ next, end, ll, ibuf
+
+ if( status .ne. sai__ok ) return
+
+* Create a Channel which reads and writes to an internal string buffer.
+ ch = ast_channel( mysource, mysink, ' ', status )
+
+* Write the first supplied Object out to this Channel, using buf1
+ ll = 160
+ next = 1
+ ibuf = 1
+ if( ast_write( ch, obj1, status ) .ne.1 ) then
+ write(*,*) text
+ call stopit( 2000, 1.0D0, status )
+ end if
+ len1 = next
+
+* Write the second object out to the second buffer.
+ ll = 160
+ next = 1
+ ibuf = 2
+ if( ast_write( ch, obj2, status ) .ne.1 ) then
+ write(*,*) text
+ call stopit( 2001, 1.0D0, status )
+ end if
+ len2 = next
+
+* Compare the contents of the two buffers.
+ if( buf1( : len1 ) .ne. buf2( : len2 ) ) then
+ write(*,*) text
+ write(*,*) len1, len2
+ call ast_show( obj1, status )
+ call ast_show( obj2, status )
+ call stopit( 2002, 1.0D0, status )
+
+ end if
+
+ end
+
+ subroutine mysource( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ integer status, next, end, ll, ibuf
+ character buf1*45000
+ character buf2*45000
+
+ common /ss1/ buf1
+ common /ss3/ buf2
+ common /ss2/ next, end, ll, ibuf
+
+ if( status .ne. sai__ok ) return
+
+ if( next .ge. end ) then
+ if( ibuf .eq. 1 ) then
+ call ast_putline( buf1, -1, status )
+ else
+ call ast_putline( buf2, -1, status )
+ endif
+ else
+ if( ibuf .eq. 1 ) then
+ call ast_putline( buf1( next : ), ll, status )
+ else
+ call ast_putline( buf2( next : ), ll, status )
+ endif
+ endif
+
+ next = next + ll
+
+ end
+
+ subroutine mysink( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ integer status, next, end, f, l, ll, ibuf
+ character line*1000
+ character buf1*45000
+ character buf2*45000
+
+ common /ss1/ buf1
+ common /ss3/ buf2
+ common /ss2/ next, end, ll, ibuf
+
+ if( status .ne. sai__ok ) return
+
+ line = ' '
+ call ast_getline( line, l, status )
+ call chr_fandl( line( : l ), f, l )
+
+ if( ibuf .eq. 1 ) then
+ buf1( next : ) = line( f : l )
+ else
+ buf2( next : ) = line( f : l )
+ end if
+
+ l = l - f + 1
+
+ if( next + ll - 1 .ge. 45000 ) then
+ write(*,*) 'Buffer overflow in mysink!!'
+ status = SAI__ERROR
+
+ else if( l .gt. ll ) then
+ write(*,*)
+ if( ibuf .eq. 1 ) then
+ write(*,*) buf1( next : next + l)
+ else
+ write(*,*) buf2( next : next + l)
+ end if
+ write(*,*) 'Line length ',l,' greater than ',ll
+ write(*,*) 'Line overflow in mysink!!'
+ status = SAI__ERROR
+ else
+ end = next + l
+ if( ibuf .eq. 1 ) then
+ buf1( end : next + ll - 1 ) = ' '
+ else
+ buf2( end : next + ll - 1 ) = ' '
+ end if
+ endif
+
+ next = next + ll
+
+ end
+
+
+
+
diff --git a/ast/ast_tester/testtable.f b/ast/ast_tester/testtable.f
new file mode 100644
index 0000000..907dd66
--- /dev/null
+++ b/ast/ast_tester/testtable.f
@@ -0,0 +1,537 @@
+ program testtable
+ implicit none
+
+ include 'AST_PAR'
+ include 'AST_ERR'
+ include 'SAE_PAR'
+
+ integer status, table, table2, dims( 7 ), ival, l, nval
+ byte bytes(1,2),bval
+ real rval
+ character cval*30, text(2,2)*10
+
+
+c call ast_watchmemory(483)
+
+
+ status = sai__ok
+ call err_mark( status )
+ call ast_begin( status )
+
+ table = ast_table( ' ', status )
+
+ call ast_mapput0i( table, 'Fred', 123, 'com 1', status )
+ if( status .eq. AST__BADKEY ) then
+ call err_annul( status )
+ else
+ if( status .ne. sai__ok ) call err_annul( status )
+ call stopit( status, 'Table error 1' )
+ endif
+
+ call ast_mapput0i( table, 'Fred(2)', 123, 'com 1', status )
+ if( status .eq. AST__BADKEY ) then
+ call err_annul( status )
+ else
+ if( status .ne. sai__ok ) call err_annul( status )
+ call stopit( status, 'Table error 2' )
+ endif
+
+ dims( 1 ) = 5
+ dims( 2 ) = 2
+ call ast_addcolumn( table, 'Fred', AST__FLOATTYPE, 2, dims,
+ : ' ', status )
+
+ if( ast_geti( table, 'NColumn', status ) .ne. 1 ) then
+ call stopit( status, 'Table error 2b' )
+ endif
+
+ if( ast_columnname( table, 1, status ) .ne. 'FRED' ) then
+ call stopit( status, 'Table error 2c' )
+ endif
+
+ if( ast_geti( table, 'ColumnType(Fred)', status ) .ne.
+ : AST__FLOATTYPE ) then
+ call stopit( status, 'Table error 2d' )
+ endif
+
+ call ast_columnshape( table, 'Fred', 2, nval, dims, status )
+ if( nval .ne. 2 ) then
+ call stopit( status, 'Table error 2e' )
+ else if( dims( 1 ) .ne. 5 ) then
+ call stopit( status, 'Table error 2f' )
+ else if( dims( 2 ) .ne. 2 ) then
+ call stopit( status, 'Table error 2g' )
+ endif
+
+ if( ast_getc( table, 'ColumnUnit(Fred)', status ) .ne. ' ' ) then
+ call stopit( status, 'Table error 2h' )
+ endif
+
+ call ast_mapput0i( table, 'Fred(2)', 123, 'com 1', status )
+ if( status .eq. AST__BADTYP ) then
+ call err_annul( status )
+ else if( status .eq. sai__ok ) then
+ call stopit( status, 'Table error 3' )
+ endif
+
+ call ast_mapput0r( table, 'Fred(2)', 123, 'com 1', status )
+ if( status .eq. AST__BADTYP ) then
+ call err_annul( status )
+ else if( status .eq. sai__ok ) then
+ call stopit( status, 'Table error 4' )
+ endif
+
+ call ast_addcolumn( table, 'Fred', AST__FLOATTYPE, 0, 0,
+ : 'pW', status )
+ if( status .eq. AST__OLDCOL ) then
+ call err_annul( status )
+ else if( status .eq. sai__ok ) then
+ call stopit( status, 'Table error 5' )
+ endif
+
+ call ast_removecolumn( table, 'Fred', status )
+
+ if( ast_geti( table, 'NColumn', status ) .ne. 0 ) then
+ call stopit( status, 'Table error 5b' )
+ endif
+
+ call ast_addcolumn( table, 'Fred', AST__FLOATTYPE, 0, 0,
+ : 'pW', status )
+
+ call ast_mapput0r( table, 'Fred(1)', -123.0, 'com 1', status )
+ call ast_mapput0r( table, 'Fred(2)', 123.0, 'com 2', status )
+
+ if( ast_mapget0r( table, 'Fred(2)', rval, status ) ) then
+ if( rval .ne. 123.0 ) call stopit( status, 'Table error 6' )
+ else
+ call stopit( status, 'Table error 7' )
+ endif
+
+ if( ast_getc( table, 'ColumnUnit(Fred)', status ) .ne. 'pW' ) then
+ call stopit( status, 'Table error 7b' )
+ endif
+
+ call ast_addcolumn( table, 'Dick', AST__OBJECTTYPE, 0, 0,
+ : 'W/m**2', status )
+ call ast_mapput0a( table, 'Dick(1)', table, 'com 1', status )
+ if( status .eq. AST__KYCIR ) then
+ call err_annul( status )
+ else if( status .eq. sai__ok ) then
+ call stopit( status, 'Table error 8' )
+ endif
+
+ if( ast_geti( table, 'NColumn', status ) .ne. 2 ) then
+ call stopit( status, 'Table error 8b' )
+ endif
+
+ if( ast_columnname( table, 1, status ) .ne. 'FRED' ) then
+ call stopit( status, 'Table error 8c' )
+ endif
+
+ if( ast_columnname( table, 2, status ) .ne. 'DICK' ) then
+ call stopit( status, 'Table error 8d' )
+ endif
+
+ call ast_removecolumn( table, 'Dick', status )
+
+ if( ast_geti( table, 'NRow', status ) .ne. 2 ) then
+ call stopit( status, 'Table error 9' )
+ endif
+
+ if( ast_mapget0r( table, 'Fred(3)', rval, status ) ) then
+ call stopit( status, 'Table error 10' )
+ endif
+
+ if( ast_mapget0i( table, 'Fred(2)', ival, status ) ) then
+ if( ival .ne. 123 ) call stopit( status, 'Table error 11' )
+ else
+ call stopit( status, 'Table error 12' )
+ endif
+
+ if( ast_mapget0c( table, 'Fred(2)', cval, l, status ) ) then
+ if( cval .ne. '123' ) call stopit( status, 'Table error 13' )
+ if( l .ne. 3 ) call stopit( status, 'Table error 14' )
+ else
+ call stopit( status, 'Table error 15' )
+ endif
+
+ call ast_removerow( table, 3, status )
+ if( ast_geti( table, 'NRow', status ) .ne. 2 ) then
+ call stopit( status, 'Table error 16' )
+ endif
+
+ call ast_removerow( table, 2, status )
+ if( ast_geti( table, 'NRow', status ) .ne. 1 ) then
+ call stopit( status, 'Table error 17' )
+ endif
+
+ if( ast_mapget0r( table, 'Fred(2)', rval, status ) ) then
+ call stopit( status, 'Table error 18' )
+ endif
+
+ call ast_addparameter( table, 'COLOUR', status )
+ if( .not. ast_hasparameter( table, 'COLOUR', status ) ) then
+ call stopit( status, 'Table error 18_1' )
+ endif
+
+ call ast_mapput0C( table, 'COLOUR', 'Red', ' ', status )
+ if( ast_mapget0c( table, 'COLOUR', cval, l, status ) ) then
+ if( cval .ne. 'Red' ) call stopit( status, 'Table error 18_3' )
+ if( l .ne. 3 ) call stopit( status, 'Table error 18_4' )
+ else
+ call stopit( status, 'Table error 18_5' )
+ endif
+
+ call ast_removeparameter( table, 'COLOUR', status )
+ if( ast_hasparameter( table, 'COLOUR', status ) ) then
+ call stopit( status, 'Table error 18_2' )
+ endif
+
+ call checkDump( table, 'checkDump 1 ', status )
+
+ table2 = ast_copy( table, status )
+
+ if( ast_mapget0c( table2, 'Fred(1)', cval, l, status ) ) then
+ if( cval .ne. '-123' ) call stopit( status, 'Table error 19' )
+ if( l .ne. 4 ) call stopit( status, 'Table error 20' )
+ else
+ call stopit( status, 'Table error 21' )
+ endif
+
+ dims( 1 ) = 2
+ dims( 2 ) = 2
+ call ast_addcolumn( table, 'Dick', AST__STRINGTYPE, 2, dims,
+ : ' ', status )
+
+ text(1,1) = 'One'
+ text(2,1) = 'two'
+ text(1,2) = 'three'
+ text(2,2) = 'FouR'
+
+ call ast_mapput1c( table, 'Dick(4)', 4, text, 'jjjj', status )
+ if( ast_mapget1c( table, 'Dick(4)', 4, nval, text, status ) ) then
+
+ if( text(1,1) .ne. 'One' )
+ : call stopit( status, 'Table error 22' )
+ if( text(2,1) .ne. 'two' )
+ : call stopit( status, 'Table error 23' )
+ if( text(1,2) .ne. 'three' )
+ : call stopit( status, 'Table error 24' )
+ if( text(2,2) .ne. 'FouR' )
+ : call stopit( status, 'Table error 25' )
+
+ if( nval .ne. 4 ) call stopit( status, 'Table error 26' )
+ else
+ call stopit( status, 'Table error 27' )
+ endif
+
+ call ast_mapputelemc( table, 'Dick(4)', 3, 'OHOHOHOH', status )
+ if( ast_mapgetelemc( table, 'Dick(4)', 3, cval, status ) ) then
+ if( cval .ne. 'OHOHOHOH' )
+ : call stopit( status, 'Table error 28' )
+ else
+ call stopit( status, 'Table error 29' )
+ endif
+
+ if( ast_geti( table, 'columnlenc(Dick)', status ) .ne. 10 ) then
+ call stopit( status, 'Table error 29b' )
+ endif
+
+ dims( 1 ) = 1
+ dims( 2 ) = 2
+ call ast_addcolumn( table, 'HeHe', AST__BYTETYPE, 2, dims,
+ : ' ', status )
+ bytes(1,1) = 127
+ bytes(1,2) = 255
+ call ast_mapput1b( table, 'HeHe(2)', 2, bytes, 'jjjj', status )
+ if( ast_mapget1b( table, 'HeHe(2)', 2, nval, bytes,
+ : status ) ) then
+ if( nval .ne. 2 ) call stopit( status, 'Table error 30' )
+ if( bytes(1,1) .ne. 127 ) call stopit( status,
+ : 'Table error 31' )
+ if( bytes(1,2) .ne. -1 ) call stopit( status,
+ : 'Table error 32' )
+ else
+ call stopit( status, 'Table error 33' )
+ endif
+
+ call ast_addcolumn( table, 'GoGo', AST__BYTETYPE, 0, 0,
+ : ' ', status )
+ call ast_mapput0b( table, 'GoGo(2)', -10, ' ', status )
+ if( ast_mapget0b( table, 'GoGo(2)', bval, status ) ) then
+ if( bval .ne. -10 ) call stopit( status, 'Table error 33' )
+ else
+ call stopit( status, 'Table error 34' )
+ endif
+
+ call checkpurge( status )
+
+ if( .not. ast_hascolumn( table, 'GoGo', status ) ) then
+ call stopit( status, 'Table error 35' )
+ else if( ast_hascolumn( table, 'dodo', status ) ) then
+ call stopit( status, 'Table error 36' )
+ endif
+
+ call ast_removecolumn( table, 'GoGo', status )
+ if( ast_hascolumn( table, 'GoGo', status ) ) then
+ call stopit( status, 'Table error 37' )
+ endif
+
+
+
+ call ast_end( status )
+ call err_rlse( status )
+
+c call ast_activememory( 'testtable' )
+ call ast_flushmemory( 1 );
+
+ if( status .eq. sai__ok ) then
+ write(*,*) 'All Table tests passed'
+ else
+ write(*,*) 'Table tests failed'
+ end if
+
+ end
+
+
+
+ subroutine stopit( status, text )
+ implicit none
+ include 'SAE_PAR'
+ integer status
+ character text*(*)
+
+ if( status .ne. sai__ok ) return
+ status = sai__error
+ write(*,*) text
+
+ end
+
+ subroutine checkdump( obj, text, status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ character text*(*),key*30,txt1*50,txt2*50
+ integer obj, status, next, end, ch, result, ll, overlap, size,
+ : i, type,obj1,obj2,l1,l2,nl,nrow,nrowold
+ external mysource, mysink
+ character buf*400000
+
+ common /ss1/ buf
+ common /ss2/ next, end, ll, nl
+
+ if( status .ne. sai__ok ) return
+
+ ch = ast_channel( mysource, mysink, ' ', status )
+
+
+
+ nl = 0
+ ll = 110
+ next = 1
+ if( ast_write( ch, obj, status ) .ne.1 ) then
+ write(*,*) text
+ call stopit( status, 'Cannot write supplied object to '//
+ : 'channel' )
+ end if
+
+ next = 1
+ nl = 0
+ result = ast_read( ch, status )
+
+
+
+
+ if( result .eq. ast__null ) then
+ write(*,*) text
+ call stopit( status, 'Cannot read object from channel' )
+ end if
+
+ if( .not. ast_isatable( result, status ) ) then
+ call stopit( status, 'Object read from channel is not a table')
+ end if
+
+ nrowold = ast_geti( obj, 'NRow', status )
+ nrow = ast_geti( result, 'NRow', status )
+ if( nrow .ne. nrowold ) then
+ write(*,*) nrow, nrowold
+ call stopit( status, 'checkDump 0' )
+ endif
+
+ size = ast_mapsize( result, status )
+ if( ast_mapsize( obj, status ) .ne. size ) then
+ write(*,*) size, ast_mapsize( obj, status )
+ call stopit( status, 'checkDump 1' )
+ else
+ do i = 1, size
+ key = ast_mapkey( result, i, status )
+ type = ast_maptype( result, key, status )
+ if( ast_maptype( obj, key, status ) .ne. type ) then
+ write(*,*) type, ast_maptype( obj, key, status )
+ call stopit( status, 'checkDump 4' )
+ else
+
+ if( type .eq. AST__OBJECTTYPE ) then
+
+ if( .not. ast_mapGet0A( result, key, obj1,
+ : status ) ) call stopit( status, 'checkDump 5' )
+ if( .not. ast_mapGet0A( obj, key, obj2,
+ : status ) ) call stopit( status, 'checkDump 6' )
+ if( ast_GetC( obj1, 'class', status ) .ne.
+ : ast_GetC( obj2, 'class', status ) ) then
+ call stopit( status, 'checkDump 7' )
+ end if
+
+ else
+
+ if( .not. ast_mapGet0C( result, key, txt1, l1,
+ : status ) ) call stopit( status, 'checkDump 8' )
+ if( .not. ast_mapGet0C( obj, key, txt2, l2,
+ : status ) ) call stopit( status, 'checkDump 9' )
+ if( txt1( : l1 ) .ne. txt2( : l2 ) .or.
+ : l1 .ne. l2 ) then
+ call stopit( status, 'checkDump 10' )
+ end if
+
+ end if
+ end if
+ end do
+ end if
+
+ end
+
+ subroutine mysource( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ integer status, next, end, ll, nl
+ character buf*400000
+
+ common /ss1/ buf
+ common /ss2/ next, end, ll,nl
+
+ if( status .ne. sai__ok ) return
+
+ if( next .ge. end ) then
+ call ast_putline( buf, -1, status )
+ else
+
+c write(*,*) buf( next : next + ll - 1 )
+ call ast_putline( buf( next : ), ll, status )
+ nl = nl + 1
+ endif
+
+ next = next + ll
+
+ end
+
+ subroutine mysink( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ integer status, next, end, f, l, ll, nl
+ character buf*400000
+ character line*1000
+
+ common /ss1/ buf
+ common /ss2/ next, end, ll, nl
+
+ if( status .ne. sai__ok ) return
+
+ line = ' '
+ call ast_getline( line, l, status )
+ call chr_fandl( line( : l ), f, l )
+ buf( next : ) = line( f : l )
+ l = l - f + 1
+
+ if( next + ll - 1 .ge. 400000 ) then
+ write(*,*)
+ call stopit( status, 'Buffer overflow in mysink!!' )
+ else if( l .gt. ll ) then
+ write(*,*)
+ write(*,*) buf( next : next + l)
+ write(*,*) 'Line length ',l
+ call stopit( status, 'Line overflow in mysink!!' )
+ else
+ end = next + l
+ buf( end : next + ll - 1 ) = ' '
+ nl = nl + 1
+ endif
+
+ next = next + ll
+
+ end
+
+
+ subroutine checkpurge( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ integer status, table, ival
+
+ if( status .ne. sai__ok ) return
+
+ table = ast_table( ' ', status )
+
+ call ast_addcolumn( table, 'Fred', AST__INTTYPE, 0, 0, ' ',
+ : status )
+ call ast_addcolumn( table, 'Tom', AST__INTTYPE, 0, 0, ' ',
+ : status )
+
+ call ast_mapput0i( table, 'Fred(2)', 123, ' ', status )
+ call ast_mapput0i( table, 'Fred(4)', 456, ' ', status )
+ call ast_mapput0i( table, 'Tom(1)', -123, ' ', status )
+ call ast_mapput0i( table, 'Tom(2)', -456, ' ', status )
+ call ast_mapput0i( table, 'Tom(6)', 0, ' ', status )
+
+ if( ast_geti( table, 'NRow', status ) .ne. 6 ) then
+ call stopit( status, 'Table error purge-1' )
+ endif
+
+ call ast_mapremove( table, 'Tom(6)', status )
+ if( ast_geti( table, 'NRow', status ) .ne. 6 ) then
+ call stopit( status, 'Table error purge-2' )
+ endif
+
+ call ast_purgerows( table, status )
+ if( ast_geti( table, 'NRow', status ) .ne. 3 ) then
+ write(*,*) 'ZZ: ',ast_geti( table, 'NRow', status )
+ call stopit( status, 'Table error purge-3' )
+ endif
+
+ if( ast_mapget0i( table, 'Tom(1)', ival, status ) ) then
+ if( ival .ne. -123 ) call stopit( status,
+ : 'Table error purge-4' )
+ else
+ call stopit( status, 'Table error purge-5' )
+ endif
+
+ if( ast_mapget0i( table, 'Tom(2)', ival, status ) ) then
+ if( ival .ne. -456 ) call stopit( status,
+ : 'Table error purge-6' )
+ else
+ call stopit( status, 'Table error purge-7' )
+ endif
+
+ if( ast_mapget0i( table, 'Fred(1)', ival, status ) ) then
+ call stopit( status, 'Table error purge-8' )
+ endif
+
+ if( ast_mapget0i( table, 'Fred(2)', ival, status ) ) then
+ if( ival .ne. 123 ) call stopit( status,
+ : 'Table error purge-9' )
+ else
+ call stopit( status, 'Table error purge-10' )
+ endif
+
+ if( ast_mapget0i( table, 'Fred(3)', ival, status ) ) then
+ if( ival .ne. 456 ) call stopit( status,
+ : 'Table error purge-11' )
+ else
+ call stopit( status, 'Table error purge-12' )
+ endif
+
+ call ast_annul( table, status )
+
+ end
+
diff --git a/ast/ast_tester/testtime.f b/ast/ast_tester/testtime.f
new file mode 100644
index 0000000..39c4b9a
--- /dev/null
+++ b/ast/ast_tester/testtime.f
@@ -0,0 +1,979 @@
+ program testtime
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ include 'AST_ERR'
+
+ character txt*40
+ double precision xin, xout, xout2, ct, ctl, origin
+ integer status, tf, tf1, tf2, fs, n, chr_len, nc
+ status = sai__ok
+
+ call ast_begin( status )
+
+c call ast_SetWatchId( 740050 )
+
+c
+c Test default attribute values
+c
+ tf = ast_timeframe( ' ', status )
+
+ if( ast_getc( tf, 'System', status ) .ne. 'MJD' ) then
+ write(*,*) ast_getc( tf, 'System', status )
+ call stopit( status, 'error 1' )
+ endif
+
+ if( ast_getd( tf, 'TimeOrigin', status ) .ne. 0.0 ) then
+ write(*,*) ast_getd( tf, 'TimeOrigin', status )
+ call stopit( status, 'error 2' )
+ endif
+
+ if( ast_getc( tf, 'ObsLon', status ) .ne. 'E0:00:00.00' ) then
+ write(*,*) ast_getc( tf, 'ObsLon', status )
+ call stopit( status, 'error 3' )
+ endif
+
+ if( ast_getc( tf, 'ObsLat', status ) .ne. 'N0:00:00.00' ) then
+ write(*,*) ast_getc( tf, 'ObsLat', status )
+ call stopit( status, 'error 4' )
+ endif
+
+ if( ast_getc( tf, 'TimeScale', status ) .ne. 'TAI' ) then
+ write(*,*) ast_getc( tf, 'TimeScale', status )
+ call stopit( status, 'error 5' )
+ endif
+
+ if( ast_getc( tf, 'AlignTimeScale', status ) .ne. 'TAI' ) then
+ write(*,*) ast_getc( tf, 'AlignTimeScale', status )
+ call stopit( status, 'error 6' )
+ endif
+
+ if( ast_geti( tf, 'naxes', status ) .ne. 1 ) then
+ write(*,*) ast_getc( tf, 'Naxes', status )
+ call stopit( status, 'error 7' )
+ endif
+
+ if( ast_getd( tf, 'Epoch', status ) .ne. 2000.0 ) then
+ write(*,*) ast_getd( tf, 'Epoch', status )
+ call stopit( status, 'error 8' )
+ endif
+
+ if( ast_getc( tf, 'Label', status ) .ne.
+ : 'Modified Julian Date' ) then
+ write(*,*) ast_getc( tf, 'Label', status )
+ call stopit( status, 'error 9' )
+ endif
+
+ if( ast_getc( tf, 'Symbol', status ) .ne. 'MJD' ) then
+ write(*,*) ast_getc( tf, 'Symbol', status )
+ call stopit( status, 'error 10' )
+ endif
+
+ if( ast_getc( tf, 'Title', status ) .ne.
+ : 'Modified Julian Date' ) then
+ write(*,*) ast_getc( tf, 'Title', status )
+ call stopit( status, 'error 11' )
+ endif
+
+ if( ast_getc( tf, 'unit', status ) .ne. 'd' ) then
+ write(*,*) ast_getc( tf, 'unit', status )
+ call stopit( status, 'error 12' )
+ endif
+
+ if( ast_getc( tf, ' domain ', status ) .ne. 'TIME' ) then
+ write(*,*) ast_getc( tf, ' domain ', status )
+ call stopit( status, 'error 13' )
+ endif
+
+ if( ast_getc( tf, 'alignSystem', status ) .ne. 'MJD' ) then
+ write(*,*) ast_getc( tf, 'alignSystem', status )
+ call stopit( status, 'error 14' )
+ endif
+
+c
+c Test dependency of default attribute values on System
+c
+ call ast_setc( tf, 'system', 'jd', status )
+
+ if( ast_getc( tf, 'System', status ) .ne. 'JD' ) then
+ write(*,*) ast_getc( tf, 'System', status )
+ call stopit( status, 'error 1b' )
+ endif
+
+ if( ast_getd( tf, 'TimeOrigin', status ) .ne. 0.0 ) then
+ write(*,*) ast_getd( tf, 'TimeOrigin', status )
+ call stopit( status, 'error 2b' )
+ endif
+
+ if( ast_getc( tf, 'ObsLon', status ) .ne. 'E0:00:00.00' ) then
+ write(*,*) ast_getc( tf, 'ObsLon', status )
+ call stopit( status, 'error 3b' )
+ endif
+
+ if( ast_getc( tf, 'ObsLat', status ) .ne. 'N0:00:00.00' ) then
+ write(*,*) ast_getc( tf, 'ObsLat', status )
+ call stopit( status, 'error 4b' )
+ endif
+
+ if( ast_getc( tf, 'TimeScale', status ) .ne. 'TAI' ) then
+ write(*,*) ast_getc( tf, 'TimeScale', status )
+ call stopit( status, 'error 5b' )
+ endif
+
+ if( ast_getc( tf, 'AlignTimeScale', status ) .ne. 'TAI' ) then
+ write(*,*) ast_getc( tf, 'AlignTimeScale', status )
+ call stopit( status, 'error 6b' )
+ endif
+
+ if( ast_geti( tf, 'naxes', status ) .ne. 1 ) then
+ write(*,*) ast_getc( tf, 'Naxes', status )
+ call stopit( status, 'error 7b' )
+ endif
+
+ if( ast_getd( tf, 'Epoch', status ) .ne. 2000.0 ) then
+ write(*,*) ast_getd( tf, 'Epoch', status )
+ call stopit( status, 'error 8b' )
+ endif
+
+ if( ast_getc( tf, 'Label', status ) .ne.
+ : 'Julian Date' ) then
+ write(*,*) ast_getc( tf, 'Label', status )
+ call stopit( status, 'error 9b' )
+ endif
+
+ if( ast_getc( tf, 'Symbol', status ) .ne. 'JD' ) then
+ write(*,*) ast_getc( tf, 'Symbol', status )
+ call stopit( status, 'error 10b' )
+ endif
+
+ if( ast_getc( tf, 'Title', status ) .ne.
+ : 'Julian Date' ) then
+ write(*,*) ast_getc( tf, 'Title', status )
+ call stopit( status, 'error 11b' )
+ endif
+
+ if( ast_getc( tf, 'unit', status ) .ne. 'd' ) then
+ write(*,*) ast_getc( tf, 'unit', status )
+ call stopit( status, 'error 12b' )
+ endif
+
+ if( ast_getc( tf, ' domain ', status ) .ne. 'TIME' ) then
+ write(*,*) ast_getc( tf, ' domain ', status )
+ call stopit( status, 'error 13b' )
+ endif
+
+ if( ast_getc( tf, 'alignSystem', status ) .ne. 'MJD' ) then
+ write(*,*) ast_getc( tf, 'alignSystem', status )
+ call stopit( status, 'error 14b' )
+ endif
+
+
+
+ call ast_setc( tf, 'system', 'jepoch', status )
+
+ if( ast_getc( tf, 'System', status ) .ne. 'JEPOCH' ) then
+ write(*,*) ast_getc( tf, 'System', status )
+ call stopit( status, 'error 1c' )
+ endif
+
+ if( ast_getd( tf, 'TimeOrigin', status ) .ne. 0.0 ) then
+ write(*,*) ast_getd( tf, 'TimeOrigin', status )
+ call stopit( status, 'error 2c' )
+ endif
+
+ if( ast_getc( tf, 'ObsLon', status ) .ne. 'E0:00:00.00' ) then
+ write(*,*) ast_getc( tf, 'ObsLon', status )
+ call stopit( status, 'error 3c' )
+ endif
+
+ if( ast_getc( tf, 'ObsLat', status ) .ne. 'N0:00:00.00' ) then
+ write(*,*) ast_getc( tf, 'ObsLat', status )
+ call stopit( status, 'error 4c' )
+ endif
+
+ if( ast_getc( tf, 'TimeScale', status ) .ne. 'TAI' ) then
+ write(*,*) ast_getc( tf, 'TimeScale', status )
+ call stopit( status, 'error 5c' )
+ endif
+
+ if( ast_getc( tf, 'AlignTimeScale', status ) .ne. 'TAI' ) then
+ write(*,*) ast_getc( tf, 'AlignTimeScale', status )
+ call stopit( status, 'error 6c' )
+ endif
+
+ if( ast_geti( tf, 'naxes', status ) .ne. 1 ) then
+ write(*,*) ast_getc( tf, 'Naxes', status )
+ call stopit( status, 'error 7c' )
+ endif
+
+ if( ast_getd( tf, 'Epoch', status ) .ne. 2000.0 ) then
+ write(*,*) ast_getd( tf, 'Epoch', status )
+ call stopit( status, 'error 8c' )
+ endif
+
+ if( ast_getc( tf, 'Label', status ) .ne.
+ : 'Julian Epoch' ) then
+ write(*,*) ast_getc( tf, 'Label', status )
+ call stopit( status, 'error 9c' )
+ endif
+
+ if( ast_getc( tf, 'Symbol', status ) .ne. 'JEP' ) then
+ write(*,*) ast_getc( tf, 'Symbol', status )
+ call stopit( status, 'error 10c' )
+ endif
+
+ if( ast_getc( tf, 'Title', status ) .ne.
+ : 'Julian Epoch' ) then
+ write(*,*) ast_getc( tf, 'Title', status )
+ call stopit( status, 'error 11c' )
+ endif
+
+ if( ast_getc( tf, 'unit', status ) .ne. 'yr' ) then
+ write(*,*) ast_getc( tf, 'unit', status )
+ call stopit( status, 'error 12c' )
+ endif
+
+ if( ast_getc( tf, ' domain ', status ) .ne. 'TIME' ) then
+ write(*,*) ast_getc( tf, ' domain ', status )
+ call stopit( status, 'error 13c' )
+ endif
+
+ if( ast_getc( tf, 'alignSystem', status ) .ne. 'MJD' ) then
+ write(*,*) ast_getc( tf, 'alignSystem', status )
+ call stopit( status, 'error 14c' )
+ endif
+
+
+ call ast_setc( tf, 'system', 'bepoch', status )
+
+ if( ast_getc( tf, 'System', status ) .ne. 'BEPOCH' ) then
+ write(*,*) ast_getc( tf, 'System', status )
+ call stopit( status, 'error 1d' )
+ endif
+
+ if( ast_getd( tf, 'TimeOrigin', status ) .ne. 0.0 ) then
+ write(*,*) ast_getd( tf, 'TimeOrigin', status )
+ call stopit( status, 'error 2d' )
+ endif
+
+ if( ast_getc( tf, 'ObsLon', status ) .ne. 'E0:00:00.00' ) then
+ write(*,*) ast_getc( tf, 'ObsLon', status )
+ call stopit( status, 'error 3d' )
+ endif
+
+ if( ast_getc( tf, 'ObsLat', status ) .ne. 'N0:00:00.00' ) then
+ write(*,*) ast_getc( tf, 'ObsLat', status )
+ call stopit( status, 'error 4d' )
+ endif
+
+ if( ast_getc( tf, 'TimeScale', status ) .ne. 'TT' ) then
+ write(*,*) ast_getc( tf, 'TimeScale', status )
+ call stopit( status, 'error 5d' )
+ endif
+
+ if( ast_getc( tf, 'AlignTimeScale', status ) .ne. 'TAI' ) then
+ write(*,*) ast_getc( tf, 'AlignTimeScale', status )
+ call stopit( status, 'error 6d' )
+ endif
+
+ if( ast_geti( tf, 'naxes', status ) .ne. 1 ) then
+ write(*,*) ast_getc( tf, 'Naxes', status )
+ call stopit( status, 'error 7d' )
+ endif
+
+ if( ast_getd( tf, 'Epoch', status ) .ne. 2000.0 ) then
+ write(*,*) ast_getd( tf, 'Epoch', status )
+ call stopit( status, 'error 8d' )
+ endif
+
+ if( ast_getc( tf, 'Label', status ) .ne.
+ : 'Besselian Epoch' ) then
+ write(*,*) ast_getc( tf, 'Label', status )
+ call stopit( status, 'error 9d' )
+ endif
+
+ if( ast_getc( tf, 'Symbol', status ) .ne. 'BEP' ) then
+ write(*,*) ast_getc( tf, 'Symbol', status )
+ call stopit( status, 'error 10d' )
+ endif
+
+ if( ast_getc( tf, 'Title', status ) .ne.
+ : 'Besselian Epoch' ) then
+ write(*,*) ast_getc( tf, 'Title', status )
+ call stopit( status, 'error 11d' )
+ endif
+
+ if( ast_getc( tf, 'unit', status ) .ne. 'yr' ) then
+ write(*,*) ast_getc( tf, 'unit', status )
+ call stopit( status, 'error 12d' )
+ endif
+
+ if( ast_getc( tf, ' domain ', status ) .ne. 'TIME' ) then
+ write(*,*) ast_getc( tf, ' domain ', status )
+ call stopit( status, 'error 13d' )
+ endif
+
+ if( ast_getc( tf, 'alignSystem', status ) .ne. 'MJD' ) then
+ write(*,*) ast_getc( tf, 'alignSystem', status )
+ call stopit( status, 'error 14d' )
+ endif
+
+c
+c Test dump and load
+c
+ call checkDump( tf, 'CheckDump 1', status )
+
+c
+c Test CurrentTime method.
+c
+ call ast_set( tf, 'system=jepoch,unit=yr,timescale=utc,'//
+ : 'timeorigin=0', status )
+ n = 0
+
+ write(*,*) ' Testing astCurrentTime: approx 1 second pause '//
+ : 'following...'
+ ctl = ast_currenttime( tf, status ) + 1.0D0/(86400.0D0*365.25D0)
+ do while( ast_currenttime( tf, status ) .lt. ctl )
+ n = n + 1
+ if( n .gt. 2000000 ) then
+ call stopit( status, 'error 15' )
+ return
+ end if
+ end do
+ write(*,*) ' 1 second pause finished.'
+
+
+c
+c Test behaviour of TimeOrigin attribute
+c
+ tf = ast_timeframe( 'timescale=utc', status )
+ origin = ast_currenttime( tf, status )
+ call ast_setd( tf, 'TimeOrigin', origin, status )
+ write(*,*) ' Testing TimeOrigin: approx 1 second pause '//
+ : 'following...'
+ n = 0
+ do while( ast_currenttime( tf, status ) .lt.
+ : 1.0D0/(86400.0D0*364.25D0) )
+ n = n + 1
+ if( n .gt. 2000000 ) then
+ call stopit( status, 'error 16' )
+ return
+ end if
+ end do
+ write(*,*) ' 1 second pause finished.'
+
+ call ast_set( tf, 'unit=s', status )
+ if( abs( ast_getd( tf, 'TimeOrigin', status ) -
+ : origin*86400.0D0 ) .gt. 0.01 ) then
+ write(*,*) abs( ast_getd( tf, 'TimeOrigin', status ) -
+ : origin*86400.0D0 )
+ call stopit( status, 'error 17' )
+ end if
+
+
+c
+c Test conversions between basic systems with arbitrary offsets
+c
+ tf1 = ast_timeframe( 'system=mjd,timeorigin=53000', status )
+ tf2 = ast_timeframe( 'system=jd,timeorigin=2453000.5', status )
+ fs = ast_convert( tf1, tf2, ' ', status )
+ if( fs .eq. AST__NULL ) then
+ call stopit( status, 'error 18' )
+ else if( .not. ast_isaunitmap( ast_getMapping( fs, AST__BASE,
+ : AST__CURRENT,
+ : status ), status ) ) then
+ call stopit( status, 'error 19' )
+ end if
+
+
+
+ tf1 = ast_timeframe( 'system=mjd,timescale=UTC,timeorigin=53000',
+ : status )
+ tf2 = ast_timeframe( 'system=bepoch,timeorigin=2004', status )
+ fs = ast_convert( tf1, tf2, ' ', status )
+ if( fs .eq. AST__NULL ) then
+ call stopit( status, 'error 20' )
+ else
+ xin = 100.0D0
+ call ast_tran1( fs, 1, xin, .true., xout, status )
+ if( abs( xout - 0.2600974092354136D0 ) .gt. 1.0D-10 ) then
+ call stopit( status, 'error 21' )
+ end if
+ call ast_tran1( fs, 1, xout, .false., xin, status )
+ if( abs( xin - 100.0D0 ) .gt. 1.0D-6 ) then
+ call stopit( status, 'error 21b' )
+ end if
+ end if
+
+
+ tf1 = ast_timeframe( 'system=bepoch,timeorigin=0', status )
+ if( status .eq.sai__OK ) then
+ call err_mark
+ call ast_set( tf1, 'TimeScale=TAI', status )
+ if( status .eq. AST__ATTIN ) then
+ call err_annul( status )
+ else
+ call stopit( status, 'error 21b' );
+ endif
+
+ call ast_set( tf1, 'Unit=s', status )
+ if( status .eq. AST__ATTIN ) then
+ call err_annul( status )
+ else
+ call stopit( status, 'error 21c' );
+ endif
+ call err_rlse
+ endif
+
+ tf2 = ast_timeframe( 'system=jepoch,timescale=tai,'//
+ : 'timeorigin=100.0', status )
+ call ast_set( tf2, 'unit=d', status )
+ fs = ast_convert( tf1, tf2, ' ', status )
+ if( fs .eq. AST__NULL ) then
+ call stopit( status, 'error 22' )
+ else
+ xin = 100.0D0
+ call ast_tran1( fs, 1, xin, .true., xout, status )
+ if( abs( xout - 14.35534169996282 ) .gt. 1.0D-6 ) then
+ call stopit( status, 'error 23' )
+ end if
+ call ast_tran1( fs, 1, xout, .false., xin, status )
+ if( abs( xin - 100.0D0 ) .gt. 1.0D-6 ) then
+ call stopit( status, 'error 23b' )
+ end if
+ end if
+
+c Besselian epoch offset from B2000 [TT, yr]
+ call ast_set( tf1, 'timeorigin=2000', status )
+
+c Julian date offset from 2450000.5 days [TDB, h]
+ call ast_set( tf2, 'system=JD,timescale=TDB,unit=h,'//
+ : 'timeorigin=2450000.5 d', status )
+
+ fs = ast_convert( tf1, tf2, ' ', status )
+ if( fs .eq. AST__NULL ) then
+ call stopit( status, 'error 24' )
+ else
+ xin = 0.1
+ call ast_tran1( fs, 1, xin, .true., xout, status )
+ if( abs( xout - 37933.38284478387D0) .gt. 1.0D-5 ) then
+ call stopit( status, 'error 25' )
+ end if
+ call ast_tran1( fs, 1, xout, .false., xin, status )
+ if( abs( xin - 0.1 ) .gt. 1.0D-10 ) then
+ call stopit( status, 'error 25b' )
+ end if
+ end if
+
+
+c
+c Test Formatting and unformatting
+c
+ tf1 = ast_timeframe( 'system=jepoch,timeorigin=2005.0', status )
+
+ txt = ast_format( tf1, 1, 100.0D0, status )
+ if( txt .ne. '100' ) then
+ write(*,*) ast_format( tf1, 1, 100.0D0, status )
+ call stopit( status, 'error 26' )
+ end if
+ nc = ast_unformat( tf1, 1, txt, xout, status )
+ if( nc .ne. len( txt ) .or. xout .ne. 100.0D0 ) then
+ write(*,*) nc, xout
+ call stopit( status, 'error 26b' )
+ end if
+
+
+
+ call ast_set( tf1, 'format=iso', status )
+ txt = ast_format( tf1, 1, 1.0D0, status )
+ if( txt .ne. '2006-01-01' ) then
+ write(*,*) ast_format( tf1, 1, 1.0D0, status )
+ call stopit( status, 'error 27' )
+ end if
+
+ nc = ast_unformat( tf1, 1, txt, xout, status )
+ if( nc .ne. len( txt ) .or. xout .ne. 1.0D0 ) then
+ write(*,*) nc, xout
+ call stopit( status, 'error 27b' )
+ end if
+
+
+
+ call ast_set( tf1, 'format=iso.0', status )
+ txt = ast_format( tf1, 1, 1.0D0, status )
+ if( txt .ne. '2006-01-01 00:00:00' ) then
+ write(*,*) ast_format( tf1, 1, 1.0D0, status )
+ call stopit( status, 'error 28' )
+ end if
+
+ nc = ast_unformat( tf1, 1, txt, xout, status )
+ if( nc .ne. len( txt ) .or. xout .ne. 1.0D0 ) then
+ write(*,*) nc, xout
+ call stopit( status, 'error 28b' )
+ end if
+
+
+
+ call ast_set( tf1, 'unit=s,format=iso.2', status )
+ txt = ast_format( tf1, 1, 10.0D0, status )
+ if( txt .ne. '2004-12-31 18:00:10.00' ) then
+ write(*,*) ast_format( tf1, 1, 10.0D0, status )
+ call stopit( status, 'error 29' )
+ end if
+
+ nc = ast_unformat( tf1, 1, txt, xout, status )
+ if( nc .ne. len( txt ) .or.
+ : abs( xout - 10.0D0 ) .gt. 1.0E-3 ) then
+ write(*,*) nc, xout
+ call stopit( status, 'error 29b' )
+ end if
+
+
+
+ txt = ast_format( tf1, 1, 10.12D0, status )
+ if( txt .ne. '2004-12-31 18:00:10.12' ) then
+ write(*,*) ast_format( tf1, 1, 10.12D0, status )
+ call stopit( status, 'error 30' )
+ end if
+
+ nc = ast_unformat( tf1, 1, txt, xout, status )
+ if( nc .ne. len( txt ) .or.
+ : abs( xout - 10.12D0 ) .gt. 1.0E-3 ) then
+ write(*,*) nc, xout
+ call stopit( status, 'error 30b' )
+ end if
+
+
+ call ast_set( tf1, 'timescale=utc', status )
+ xin = ast_currenttime( tf1, status )
+ txt = ast_format( tf1, 1, xin, status )
+ write(*,*) ' Current system time (UTC): ',
+ : txt( : chr_len( txt ) )
+ nc = ast_unformat( tf1, 1, txt(:20), xout, status )
+ if( nc .ne. 20 .or. abs( xout - xin ) .gt. 1.0E-3 ) then
+ write(*,*) nc, xout
+ call stopit( status, 'error 30c' )
+ end if
+
+ tf1 = ast_timeframe( 'system=jepoch,timeorigin=2005.0', status )
+ nc = ast_unformat( tf1, 1, 'J2005.0', xout, status )
+ if( nc .ne. 7 .or. xout .ne. 0.0D0 ) then
+ write(*,*) nc, xout
+ call stopit( status, 'error 31' )
+ end if
+
+ nc = ast_unformat( tf1, 1, 'J2010.0', xout, status )
+ if( nc .ne. 7 .or. xout .ne. 5.0D0 ) then
+ write(*,*) nc, xout
+ call stopit( status, 'error 32' )
+ end if
+
+ nc = ast_unformat( tf1, 1, '2005-jun-1 12:30 lunch time', xout,
+ : status )
+ if( nc .ne. 17 .or. abs( xout - 0.415525896D0 ) .gt. 1.0E-7 ) then
+ write(*,*) nc, xout
+ call stopit( status, 'error 33' )
+ end if
+
+ call ast_set( tf1, 'timescale=utc', status )
+ nc = ast_unformat( tf1, 1, 'B2001.5 lunch time', xout,
+ : status )
+ if( nc .ne. 8 .or.
+ : abs( xout + 3.50131054408916D0 ) .gt. 1.0E-10 ) then
+ write(*,*) nc, xout, abs( xout + 3.50131054408916D0 )
+ call stopit( status, 'error 34' )
+ end if
+
+
+
+
+
+
+ tf1 = ast_timeframe( 'system=mjd,timescale=tai', status )
+ nc = ast_unformat( tf1, 1, "1977-01-01 00:00:00", xin, status )
+
+
+ tf2 = ast_timeframe( 'system=mjd,timescale=tai,format=iso.6',
+ : status )
+ fs = ast_convert( tf1, tf2, ' ', status )
+ if( fs .eq. AST__NULL ) then
+ call stopit( status, 'error 35' )
+ else
+ call ast_tran1( fs, 1, xin, .true., xout, status )
+ txt = ast_format( tf2, 1, xout, status )
+ if( txt .ne. '1977-01-01 00:00:00.000000' ) then
+ write(*,*) txt( :chr_len(txt) )
+ call stopit( status, 'error 36' )
+ end if
+ end if
+
+ tf2 = ast_timeframe( 'system=mjd,timescale=utc,format=iso.6',
+ : status )
+ fs = ast_convert( tf1, tf2, ' ', status )
+ if( fs .eq. AST__NULL ) then
+ call stopit( status, 'error 37' )
+ else
+ call ast_tran1( fs, 1, xin, .true., xout, status )
+ txt = ast_format( tf2, 1, xout, status )
+ if( txt .ne. '1976-12-31 23:59:45.000000' ) then
+ write(*,*) txt( :chr_len(txt) )
+ call stopit( status, 'error 38' )
+ end if
+ end if
+
+ tf2 = ast_timeframe( 'system=mjd,timescale=tt,format=iso.6',
+ : status )
+ fs = ast_convert( tf1, tf2, ' ', status )
+ if( fs .eq. AST__NULL ) then
+ call stopit( status, 'error 39' )
+ else
+ call ast_tran1( fs, 1, xin, .true., xout, status )
+ txt = ast_format( tf2, 1, xout, status )
+ if( txt .ne. '1977-01-01 00:00:32.184000' ) then
+ write(*,*) txt( :chr_len(txt) )
+ call stopit( status, 'error 40' )
+ end if
+ end if
+
+ tf2 = ast_timeframe( 'system=mjd,timescale=tdb,format=iso.6',
+ : status )
+ fs = ast_convert( tf1, tf2, ' ', status )
+ if( fs .eq. AST__NULL ) then
+ call stopit( status, 'error 41' )
+ else
+ call ast_tran1( fs, 1, xin, .true., xout, status )
+ txt = ast_format( tf2, 1, xout, status )
+ if( txt .ne. '1977-01-01 00:00:32.183935' ) then
+ write(*,*) txt( :chr_len(txt) )
+ call stopit( status, 'error 42' )
+ end if
+ end if
+
+ tf2 = ast_timeframe( 'system=mjd,timescale=tcb,format=iso.6',
+ : status )
+ fs = ast_convert( tf1, tf2, ' ', status )
+ if( fs .eq. AST__NULL ) then
+ call stopit( status, 'error 43' )
+ else
+ call ast_tran1( fs, 1, xin, .true., xout, status )
+ txt = ast_format( tf2, 1, xout, status )
+ if( txt .ne. '1977-01-01 00:00:32.184000' ) then
+ write(*,*) txt( :chr_len(txt) )
+ call stopit( status, 'error 44' )
+ end if
+ end if
+
+ tf2 = ast_timeframe( 'system=mjd,timescale=tcg,format=iso.6',
+ : status )
+ fs = ast_convert( tf1, tf2, ' ', status )
+ if( fs .eq. AST__NULL ) then
+ call stopit( status, 'error 45' )
+ else
+ call ast_tran1( fs, 1, xin, .true., xout, status )
+ txt = ast_format( tf2, 1, xout, status )
+ if( txt .ne. '1977-01-01 00:00:32.184000' ) then
+ write(*,*) txt( :chr_len(txt) )
+ call stopit( status, 'error 46' )
+ end if
+ end if
+
+
+
+
+ tf1 = ast_timeframe( 'system=mjd,timescale=gmst,ObsLon=90,'//
+ : 'ObsLat=0,timeorigin=53000.0', status )
+ tf2 = ast_timeframe( 'system=mjd,timescale=lmst,ObsLon=90,'//
+ : 'ObsLat=0,timeorigin=53000.0', status )
+ fs = ast_convert( tf1, tf2, ' ', status )
+ if( fs .eq. AST__NULL ) then
+ call stopit( status, 'error 47' )
+ else
+ xin = 1.0D0
+ call ast_tran1( fs, 1, xin, .true., xout, status )
+ if( xout .ne. 1.25D0 ) then
+ write(*,*) xout
+ call stopit( status, 'error 48' )
+ end if
+ call ast_tran1( fs, 1, xout, .false., xin, status )
+ if( xin .ne. 1.0D0 ) then
+ write(*,*) xin
+ call stopit( status, 'error 48b' )
+ end if
+ end if
+
+
+* Test use of DUT1
+ tf1 = ast_timeframe( 'system=mjd,timescale=tdb,dut1=0.1', status )
+ tf2 = ast_timeframe( 'system=mjd,timescale=last,dut1=0.1',
+ : status )
+ fs = ast_convert( tf1, tf2, ' ', status )
+ if( fs .eq. AST__NULL ) then
+ call stopit( status, 'error 49' )
+ else
+ xin = 53991.675D0
+ call ast_tran1( fs, 1, xin, .true., xout, status )
+ if( abs(xout - 53998.65344633732D0) .gt. 1.0D-8 ) then
+ write(*,*) xout
+ call stopit( status, 'error 50' )
+ end if
+ call ast_tran1( fs, 1, xout, .false., xin, status )
+ if( abs( xin - 53991.675D0 ) .gt. 1.0D-8 ) then
+ write(*,*) xin
+ call stopit( status, 'error 51' )
+ end if
+ end if
+
+
+* Test use of DTAI
+ tf1 = ast_timeframe( 'system=mjd,timescale=tai', status )
+ tf2 = ast_timeframe( 'system=mjd,timescale=utc', status )
+
+ fs = ast_convert( tf1, tf2, ' ', status )
+
+ xin = 57844.0D0
+
+ if (fs .eq. AST__NULL ) then
+ call stopit( status, 'error 52' )
+ else
+ call ast_tran1( fs, 1, xin, .true., xout, status)
+ if (abs(((xin - xout) * 86400.0D0) - 37.0D0) .gt. 1.0D-3) then
+ write(*,*) xout
+ call stopit( status, 'error 53' )
+ endif
+ call checkdump( fs, 'CheckDump 2', status )
+ end if
+
+ call ast_setd( tf2, 'dtai', 40.0D0, status )
+
+ fs = ast_convert( tf1, tf2, ' ', status )
+
+ if (fs .eq. AST__NULL ) then
+ call stopit( status, 'error 54' )
+ else
+ call ast_tran1( fs, 1, xin, .true., xout, status)
+ if (abs(((xin - xout) * 86400.0D0) - 40.0D0) .gt. 1.0D-3) then
+ write(*,*) xout
+ call stopit( status, 'error 55' )
+ endif
+ call checkdump( fs, 'CheckDump 3', status )
+ end if
+
+
+
+ tf1 = ast_timeframe( 'system=mjd,timescale=tt', status )
+ tf2 = ast_timeframe( 'system=mjd,timescale=tdb,dtai=37.0',
+ : status )
+
+ fs = ast_convert( tf1, tf2, ' ', status )
+
+ if (fs .eq. AST__NULL ) then
+ call stopit( status, 'error 56' )
+ else
+ call ast_tran1( fs, 1, xin, .true., xout, status)
+ call checkdump( fs, 'CheckDump 4', status )
+ end if
+
+ call ast_clear( tf2, 'dtai', status )
+
+ fs = ast_convert( tf1, tf2, ' ', status )
+
+ if (fs .eq. AST__NULL ) then
+ call stopit( status, 'error 57' )
+ else
+ call ast_tran1( fs, 1, xin, .true., xout2, status)
+ if( xout .ne. xout2 ) then
+ call stopit( status, 'error 58' )
+ end if
+ end if
+
+
+
+
+
+
+ call ast_end( status )
+c call ast_listissued( 'testtime' )
+
+
+
+ if( status .eq. sai__ok ) then
+ write(*,*) 'All timeFrame tests passed'
+ else
+ write(*,*) 'timeFrame tests failed'
+ end if
+
+ end
+
+ subroutine stopit( status, text )
+ implicit none
+ include 'SAE_PAR'
+ integer status
+ character text*(*)
+
+ if( status .ne. sai__ok ) return
+ status = sai__error
+ write(*,*) text
+
+ end
+
+
+ subroutine checkdump( obj, text, status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ character text*(*)
+ integer obj, status, next, end, ch, result, ll, overlap, map,
+ : map1, map2
+ external mysource, mysink
+ character buf*25000
+
+ common /ss1/ buf
+ common /ss2/ next, end, ll
+
+ if( status .ne. sai__ok ) return
+
+ ch = ast_channel( mysource, mysink, ' ', status )
+
+
+ ll = 110
+ next = 1
+ if( ast_write( ch, obj, status ) .ne.1 ) then
+ write(*,*) text
+ call stopit( status, 'Cannot write supplied object to '//
+ : 'channel' )
+ end if
+
+ next = 1
+ result = ast_read( ch, status )
+ if( result .eq. ast__null ) then
+ write(*,*) text
+ call stopit( status, 'Cannot read object from channel' )
+ end if
+
+
+ if( ast_isatimeframe( obj, status ) ) then
+ if( ast_getd( obj, 'timeorigin', status ) .ne.
+ : ast_getd( result, 'timeorigin', status ) .or.
+ : ast_getc( obj, 'timescale', status ) .ne.
+ : ast_getc( result, 'timescale', status ) .or.
+ : ast_getc( obj, 'ObsLon', status ) .ne.
+ : ast_getc( result, 'ObsLon', status ) .or.
+ : ast_getc( obj, 'ObsLat', status ) .ne.
+ : ast_getc( result, 'ObsLat', status ) .or.
+ : ast_getc( obj, 'Dtai', status ) .ne.
+ : ast_getc( result, 'Dtai', status ) ) then
+ call ast_Show( obj, status )
+ call ast_Show( result, status )
+ write(*,*) text
+ call stopit( status, 'Object has changed' )
+ end if
+ else if( ast_isamapping( obj, status ) ) then
+ if( ast_isaframeset( obj, status ) ) then
+ map1 = ast_getmapping( obj, ast__base, ast__current,
+ : status )
+ map2 = ast_getmapping( result, ast__base, ast__current,
+ : status )
+ else
+ map1 = ast_clone( obj, status )
+ map2 = ast_clone( result, status )
+ end if
+
+ call ast_invert( map2, status )
+ map = ast_simplify( ast_cmpmap( map1, map2, .true., ' ',
+ : status ),
+ : status )
+ if( .not. ast_isaunitmap( map, status ) ) then
+ write(*,*) text
+ call ast_show( map1, status )
+ call ast_invert( map2, status )
+ call ast_show( map2, status )
+
+ call stopit( status, 'Mapping has changed' )
+ endif
+ end if
+
+ end
+
+ subroutine sink1( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+
+ logical fsfound, done
+ common /sink1com/ fsfound, done
+
+ integer status, l
+ character line*200
+
+ if( status .ne. sai__ok ) return
+ call ast_getline( line, l, status )
+
+ if( index( line( : l ),'Unc =' ) .GT. 0 ) then
+ done = .true.
+
+ else if( .not. done .and.
+ : index( line( : l ),'FrameSet' ) .GT. 0 ) then
+ fsfound= .true.
+ end if
+
+ end
+
+ subroutine mysource( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ integer status, next, end, ll
+ character buf*25000
+
+ common /ss1/ buf
+ common /ss2/ next, end, ll
+
+ if( status .ne. sai__ok ) return
+
+ if( next .ge. end ) then
+ call ast_putline( buf, -1, status )
+ else
+ call ast_putline( buf( next : ), ll, status )
+ endif
+
+ next = next + ll
+
+ end
+
+ subroutine mysink( status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ integer status, next, end, f, l, ll
+ character buf*25000
+ character line*1000
+
+ common /ss1/ buf
+ common /ss2/ next, end, ll
+
+ if( status .ne. sai__ok ) return
+
+ line = ' '
+ call ast_getline( line, l, status )
+ call chr_fandl( line( : l ), f, l )
+ buf( next : ) = line( f : l )
+ l = l - f + 1
+
+ if( next + ll - 1 .ge. 25000 ) then
+ write(*,*)
+ call stopit( status, 'Buffer overflow in mysink!!' )
+ else if( l .gt. ll ) then
+ write(*,*)
+ write(*,*) buf( next : next + l)
+ write(*,*) 'Line length ',l
+ call stopit( status, 'Line overflow in mysink!!' )
+ else
+ end = next + l
+ buf( end : next + ll - 1 ) = ' '
+ endif
+
+ next = next + ll
+
+ end
+
+
diff --git a/ast/ast_tester/testtrangrid.f b/ast/ast_tester/testtrangrid.f
new file mode 100644
index 0000000..b867291
--- /dev/null
+++ b/ast/ast_tester/testtrangrid.f
@@ -0,0 +1,276 @@
+ program testtrangrid
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ include 'PRM_PAR'
+
+ integer status, i, m, outp(4), inp(4), c1, c2, c3, c4, fc, fs
+ double precision at(4), r, mat(4), b1(2), b2(2), a1(2),
+ : a2(4)
+ character cards(9)*80
+
+ status = sai__ok
+
+ at(1) = 10.0D0
+ at(2) = 1.2D6
+
+* UnitMap
+ m = ast_unitmap( 2, ' ', status )
+ call testmap( m, 1, 0.5D0, status )
+
+* ZoomMap
+ m = ast_zoommap( 2, 2.0D0, ' ', status )
+ call testmap( m, 2, 0.5D0, status )
+
+* MatrixMap
+ m = ast_matrixmap( 2, 2, 2, mat, ' ', status )
+ call testmap( m, 3, 0.5D0, status )
+
+* PermMap
+ outp(1)=2
+ outp(2)=1
+ inp(1)=2
+ inp(2)=1
+ m = ast_permmap( 2, inp, 2, outp, 0.0D0, ' ', status )
+ call testmap( m, 4, 0.5D0, status )
+
+* TranMap
+ a1( 1 ) = 0.0D0
+ a1( 2 ) = 0.0D0
+ a2( 1 ) = 1.0D0
+ a2( 2 ) = 1.0D0
+ b1( 1 ) = 0.5D0
+ b1( 2 ) = 0.5D0
+ b2( 1 ) = 2.5D0
+ b2( 2 ) = 2.5D0
+ c1 = ast_winmap( 2, a1, a2, b1, b2, ' ', status )
+ c2 = ast_copy( c1, status )
+
+ m = ast_tranmap( c1, c2, ' ', status )
+ call testmap( m, 5, 0.5D0, status )
+
+* 3D CmpMap
+ mat(1) = -1.0D0
+ c1 = ast_shiftmap( 1, mat, ' ', status )
+ mat(1)= 1.0D0
+ mat(2)= 2.0D0
+ mat(3)= -2.0D0
+ mat(4)= 3.0D0
+ c2 = ast_matrixmap( 2, 2, 0, mat, ' ', status )
+ c3 = ast_cmpmap( c1, c2, 0, ' ', status )
+
+ outp(1) = 3
+ outp(2) = 2
+ outp(3) = 1
+ inp(1) = 3
+ inp(2) = 2
+ inp(3) = 1
+ c1 = ast_permmap( 3, inp, 3, outp, 0.0D0, ' ', status )
+ c2 = ast_ZoomMap( 3, 0.25D0, ' ', status )
+ call ast_invert( c2, status )
+
+ c4 = ast_cmpmap( c1, c2, 1, ' ', status )
+ call ast_invert( c4, status )
+
+ m = ast_cmpmap( c3, c4, 1, ' ', status )
+ call testmap( m, 6, 0.5D0, status )
+
+
+
+* 1D non-linear Mapping
+ m = ast_mathmap( 1, 1, 1, 'y=x**3', 1,
+ : 'x=sign((abs(y)**(1/3)),y)', ' ', status )
+ call testmap( m, 7, 0.0001D0, status )
+
+
+
+* A FITS-WCS pixel->sky mapping
+ cards(1) = 'CTYPE1 = ''RA---TAN'''
+ cards(2) = 'CTYPE2 = ''DEC--TAN'''
+ cards(3) = 'CRPIX1 = 20'
+ cards(4) = 'CRPIX2 = 20'
+ cards(5) = 'CRVAL1 = 0.0'
+ cards(6) = 'CRVAL2 = 0.0'
+ cards(7) = 'CROTA1 = 30.0'
+ cards(8) = 'CDELT1 = -0.001'
+ cards(9) = 'CDELT2 = 0.001'
+
+ fc = ast_fitschan( ast_null, ast_null, ' ', status )
+ do i = 1, 9
+ call ast_putfits( fc, cards(i), .false., status )
+ end do
+ call ast_clear( fc, 'card', status )
+ fs = ast_read( fc, status )
+
+ call testmap( fs, 8, 0.0001D0, status )
+
+
+
+
+
+
+
+
+
+ if( status .eq. sai__ok ) then
+ write(*,*) 'All AST_TRANGRID tests passed'
+ else
+ write(*,*) 'AST_TRANGRID tests failed'
+ end if
+
+ end
+
+
+
+
+
+ subroutine testmap( map, itest, tol, status )
+ implicit none
+ include 'SAE_PAR'
+
+ integer status, maxpix, itest, map
+ double precision tol
+
+ if( status .ne. sai__ok ) return
+
+ maxpix = 100
+ call testgridpair( map, tol, maxpix, itest*10, status )
+ call testgridpair( map, 0.0D0, maxpix, itest*10+2, status )
+
+ maxpix = 4
+ call testgridpair( map, tol, maxpix, itest*10+4, status )
+ call testgridpair( map, 0.0D0, maxpix, itest*10+6, status )
+
+ end
+
+
+
+
+ subroutine testgridpair( map, tol, maxpix, itest, status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+
+ integer status, lbnd( 3 ), ubnd( 3 ), nin, nout, i, outdim,
+ : maxpix, itest, size, pos(3), j, map, lbndi(3), ubndi(3)
+ logical fwd
+ double precision tol, xl(3), xu(3), dlbndi(3), dubndi(3),
+ : dlbnd(3), dubnd(3)
+
+ data lbnd / -6, 0, 10 /
+ data ubnd / 15, 30, 40/
+
+ if( status .ne. sai__ok ) return
+
+
+ nin = ast_geti( map, 'nin', status )
+ nout = ast_geti( map, 'nout', status )
+
+ outdim = 1
+ do i = 1, nin
+ outdim = outdim*( ubnd( i ) - lbnd( i ) + 1 )
+ dlbnd( i ) = lbnd( i )
+ dubnd( i ) = ubnd( i )
+ end do
+
+ call testgrid( map, nin, lbnd, ubnd, tol, maxpix, .true., nout,
+ : outdim, itest, status )
+
+ outdim = 1
+ do i = 1, nout
+ call ast_mapbox( map, dlbnd, dubnd, .true., i, dlbndi(i),
+ : dubndi(i), xl, xu, status )
+ lbndi( i ) = dlbndi( i )
+ ubndi( i ) = dubndi( i )
+ outdim = outdim*( ubndi( i ) - lbndi( i ) + 1 )
+ end do
+
+ call testgrid( map, nout, lbndi, ubndi, tol, maxpix, .false., nin,
+ : outdim, itest + 1, status )
+
+
+ end
+
+
+
+
+
+ subroutine testgrid( map, nin, lbnd, ubnd, tol, maxpix, fwd, nout,
+ : outdim, itest, status )
+ implicit none
+ include 'SAE_PAR'
+
+ integer MAXPNT
+ parameter( MAXPNT = 50000 )
+
+ integer status, lbnd( 3 ), ubnd( 3 ), nin, nout, i, outdim,
+ : maxpix, itest, pos(3), j, map
+ logical fwd
+ double precision tol, out( MAXPNT, 3 ), in( MAXPNT, 3 )
+
+ if( status .ne. sai__ok ) return
+
+* Check arrays are not over full
+ if( outdim .gt. MAXPNT ) then
+ status = sai__error
+ write(*,*) 'Array length exceeded in TESTTRANGRID:TESTGRID'
+ return
+ end if
+
+* Create a regular grid of positions within the input space of the
+* Mapping, and transform it to the output space of the Mapping.
+ call ast_trangrid( map, nin, lbnd, ubnd, tol, maxpix, fwd,
+ : nout, MAXPNT, out, status )
+
+* Convert the transformed output positions back into the input space.
+ call ast_trann( map, outdim, nout, MAXPNT, out, .not. fwd, nin,
+ : MAXPNT, in, status )
+
+* Check the input space positions are close to a regular grid.
+ if( status .eq. sai__ok ) then
+
+ do i = 1, nin
+ pos( i ) = lbnd( i )
+ end do
+
+ do j = 1, outdim
+
+ do i = 1, nin
+
+ if( pos( i ) .ne. 0 ) then
+ if( abs( in( j, i ) - pos( i ) ) .gt.
+ : 1.0E-6*abs( 0.5*( in( j, i ) + pos( i ) ) ) ) then
+ status = sai__error
+ write(*,*) 'Test ',itest,' failed at point ',j,
+ : ' axis ',i,': ',in( j, i ),
+ : ' should be ',pos(1)
+ return
+ end if
+ else
+ if( abs( in( j, i ) ) .gt. 1.0E-5 ) then
+ status = sai__error
+ write(*,*) 'Test ',itest,' failed at point ',j,
+ : ' axis ',i,': ',in( j, i ),
+ : ' should be ', pos(i)
+ return
+ end if
+ end if
+ end do
+
+ pos( 1 ) = pos( 1 ) + 1
+ if( pos( 1 ) .gt. ubnd( 1 ) ) then
+ pos( 1 ) = lbnd( 1 )
+ if( nin .gt. 1 ) then
+ pos( 2 ) = pos( 2 ) + 1
+ if( pos( 2 ) .gt. ubnd( 2 ) ) then
+ pos( 2 ) = lbnd( 2 )
+ if( nin .gt. 2 ) then
+ pos( 3 ) = pos( 3 ) + 1
+ end if
+ end if
+ end if
+ end if
+ end do
+ end if
+
+ end
diff --git a/ast/ast_tester/testunitnormmap.f b/ast/ast_tester/testunitnormmap.f
new file mode 100644
index 0000000..4437f2c
--- /dev/null
+++ b/ast/ast_tester/testunitnormmap.f
@@ -0,0 +1,324 @@
+ program testunitnormmap
+ implicit none
+
+ include 'AST_PAR'
+ include 'SAE_PAR'
+
+ integer status, map, cmpmap, smap, invmap, nin, i
+ logical good, differ
+ double precision norm, frompos(3), centre(3), topos(4)
+
+ data centre /-1.0D0, 1.0D0, 2.0D0 /,
+ : frompos /-22.0D0, 3.0D0, 0.5D0/
+
+
+ status = sai__ok
+ call err_mark( status )
+ call ast_begin( status )
+
+ do nin = 1, 3
+ map = ast_unitnormmap( nin, centre, ' ', status )
+
+ if( .not. ast_isaunitnormmap( map, status ) )
+ : call stopit( status, 'Error 1' )
+ if( .not. ast_isamapping( map, status ) )
+ : call stopit( status, 'Error 2' )
+ if( ast_geti( map, 'Nin', status ) .ne. nin )
+ : call stopit( status, 'Error 3' )
+ if( ast_geti( map, 'Nout', status ) .ne. nin+1 )
+ : call stopit( status, 'Error 4' )
+ if( ast_getl( map, 'IsLinear', status ) )
+ : call stopit( status, 'Error 5' )
+
+ call checkdump( map, status )
+
+ call checkroundtrip( map, frompos, good, status )
+ if( .not. good ) call stopit( status, 'Error 6' )
+
+ call checkroundtrip( map, centre, good, status )
+ if( .not. good ) call stopit( status, 'Error 6' )
+
+ invmap = ast_copy( map, status )
+ call ast_invert( invmap, status )
+ cmpmap = ast_cmpmap( map, invmap, .true., ' ', status )
+ smap = ast_simplify( cmpmap, status )
+ if( .not. ast_isaunitmap( smap, status ) )
+ : call stopit( status, 'Error 7' )
+ if( ast_geti( smap, 'Nin', status ) .ne. nin )
+ : call stopit( status, 'Error 8' )
+
+ cmpmap = ast_cmpmap( invmap, map, .true., ' ', status )
+ smap = ast_simplify( cmpmap, status )
+ if( .not. ast_isaunitmap( smap, status ) )
+ : call stopit( status, 'Error 9' )
+ if( ast_geti( smap, 'Nin', status ) .ne. nin+1 )
+ : call stopit( status, 'Error 10' )
+
+
+ call ast_trann( map, 1, nin, 1, frompos, .true., nin+1,
+ : 1, topos, status );
+
+ norm = 0.0D0
+ do i = 1, nin
+ norm = norm + (frompos(i)-centre(i))**2
+ end do
+ norm = sqrt( norm )
+
+ if( differ( norm, topos(nin+1) ) )
+ : call stopit( status, 'Error 11' )
+
+ do i = 1, nin
+ if( differ( norm*topos(i), frompos(i)-centre(i) ) )
+ : call stopit( status, 'Error 12' )
+ end do
+
+ end do
+
+ call testsimplify( status )
+
+ call ast_end( status )
+ call err_rlse( status )
+
+c call ast_activememory( 'testunitnormmap' )
+ call ast_flushmemory( 1 )
+
+ if( status .eq. sai__ok ) then
+ write(*,*) 'All UnitNormMap tests passed'
+ else
+ write(*,*) 'UnitNormMap tests failed'
+ end if
+
+ end
+
+
+
+ subroutine stopit( status, text )
+ implicit none
+ include 'SAE_PAR'
+ integer status
+ character text*(*)
+ if( status .ne. sai__ok ) return
+ status = sai__error
+ write(*,*) text
+ end
+
+
+
+
+
+ subroutine checkdump( obj, status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ integer obj, status, stat, ch, result, nin, i
+ logical differ
+ double precision in(3), out1(3), out2(3)
+
+ data in /10.0D0, 5.0D0, -12.0D0 /
+
+ if( status .ne. sai__ok ) return
+
+ ch = ast_channel( AST_NULL, AST_NULL, 'SinkFile=testdmp', status )
+
+ if( ast_write( ch, obj, status ) .ne.1 ) then
+ call stopit( status, 'Cannot write supplied object to '//
+ : 'channel' )
+ end if
+
+ call ast_clear( ch, 'SinkFile', status )
+ call ast_setc( ch, 'SourceFile', 'testdmp', status )
+ result = ast_read( ch, status )
+
+ if( result .eq. ast__null ) then
+ call stopit( status, 'Cannot read object from channel' )
+ end if
+
+ if( .not. ast_isaunitnormmap( result, status ) ) then
+ call stopit( status, 'Object read from channel is not a '//
+ : 'UnitNormMap')
+ else if( ast_geti( result, 'Nin', status ) .ne.
+ : ast_geti( obj, 'Nin', status ) ) then
+ call stopit( status, 'UnitNormMap have different Nin values' )
+
+ else
+ nin = ast_geti( result, 'Nin', status )
+ call ast_trann( result, 1, nin, 1, in, .TRUE., nin+1, 1, out1,
+ : status );
+ call ast_trann( obj, 1, nin, 1, in, .TRUE., nin+1, 1, out2,
+ : status );
+
+ do i = 1, nin
+ if( differ( out2(i), out1(i) ) )
+ : call stopit( status, 'Error - Recovered UnitNormMap '//
+ : 'differs from suppled UnitNormMap' )
+ end do
+
+ end if
+
+ call ast_annul( result, status )
+
+ open( unit=1234, iostat=stat, file='testdmp', status='old')
+ if (stat == 0) close(1234, status='delete')
+
+ end
+
+
+
+ subroutine checkroundtrip( map, pos, good, status )
+
+ implicit none
+
+ include 'SAE_PAR'
+ include 'AST_PAR'
+
+ logical good, differ
+ integer status, map, mapinv, cmp, i, nin, nout
+ double precision pos(*), rtol, atol, out(7), in(7)
+
+ good = .true.
+
+ if( status .ne. sai__ok ) return
+
+ nin = ast_geti( map, 'Nin', status )
+ nout = ast_geti( map, 'Nout', status )
+ call ast_trann( map, 1, nin, 1, pos, .TRUE., nout, 1, out,
+ : status );
+ call ast_trann( map, 1, nout, 1, out, .FALSE., nin, 1, in,
+ : status );
+ do i = 1, nin
+ if( differ( in(i), pos(i) ) ) good = .false.
+ end do
+
+ mapinv = ast_copy( map, status )
+ call ast_invert( mapinv, status )
+ cmp = ast_cmpmap( map, mapinv, .TRUE., ' ', status )
+
+ call ast_trann( cmp, 1, nin, 1, pos, .true., nin, 1, in,
+ : status );
+ do i = 1, nin
+ if( differ( in(i), pos(i) ) ) good = .false.
+ end do
+
+ end
+
+
+
+ subroutine testsimplify( status )
+ implicit none
+
+ include 'SAE_PAR'
+ include 'AST_PAR'
+
+ integer status, unm1, unm1inv, unm2, unm2inv, shiftmap,
+ : winmap1, winmap2, i, j, k, nin, nout, cmpmap,
+ : cmpmap_simp
+ double precision centre1(3)
+ double precision centre2(3)
+ double precision shift(3)
+ double precision zeros(3)
+ double precision ones(3)
+ double precision a(3)
+ double precision testpoints(3,4)
+ double precision outpoints(3,4)
+ double precision outpoints_simp(3,4)
+
+ integer map1(7), map2(7)
+ character class(7)*30
+ logical differ
+
+ data centre1 /2.0D0, -1.0D0, 0.0D0/,
+ : centre2 /-1.0D0, 6.0D0, 4.0D0/,
+ : shift /3.0D0, 7.0D0, -9.0D0/,
+ : zeros /0.0D0, 0.0D0, 0.0D0/,
+ : ones /1.0D0, 1.0D0, 1.0D0/,
+ : testpoints / 1.0D0, 3.0D0, -5.0D0, 2.0D0, 3.0D0, 99.0D0,
+ : -6.0D0, -5.0D0, -7.0D0, 30.0D0, 21.0D0, 37.0D0 /
+
+ if( status .ne. sai__ok ) return
+
+ unm1 = ast_unitnormmap( 3, centre1, ' ', status )
+ unm1inv = ast_copy( unm1, status )
+ call ast_setl( unm1inv, 'Invert', .TRUE., status )
+
+ unm2 = ast_unitnormmap( 3, centre2, ' ', status )
+ unm2inv = ast_copy( unm2, status )
+ call ast_setl( unm2inv, 'Invert', .TRUE., status )
+
+ shiftmap = ast_shiftmap(3, shift, ' ', status )
+
+ do i = 1, 3
+ a(i) = ones(i) + shift(i)
+ end do
+ winmap1 = ast_winmap( 3, zeros, shift, ones, a, ' ', status )
+
+ do i = 1, 3
+ a(i) = 2*ones(i) + shift(i)
+ end do
+ winmap2 = ast_winmap( 3, zeros, shift, ones, a, ' ', status )
+
+ map1(1) = unm1
+ map2(1) = unm2inv
+ class(1) = 'WinMap'
+
+ map1(2) = shiftmap
+ map2(2) = unm2
+ class(2) = 'UnitNormMap'
+
+ map1(3) = winmap1
+ map2(3) = unm1
+ class(3) = 'UnitNormMap'
+
+ map1(4) = winmap2
+ map2(4) = unm1
+ class(4) = 'CmpMap'
+
+ map1(5) = unm1inv
+ map2(5) = shiftmap
+ class(5) = 'UnitNormMap'
+
+ map1(6) = unm1inv
+ map2(6) = winmap1
+ class(6) = 'UnitNormMap'
+
+ map1(7) = unm1inv
+ map2(7) = winmap2
+ class(7) = 'CmpMap'
+
+ do i = 1, 7
+ cmpmap = ast_cmpmap( map1(i), map2(i), .true., ' ', status )
+ cmpmap_simp = ast_simplify( cmpmap, status )
+
+ if( ast_getc( cmpmap_simp, 'Class', status ) .ne. class(i) )
+ : call stopit( status, 'Simplify error 1' )
+
+ nin = ast_geti( cmpmap, 'Nin', status )
+ if( nin .ne. ast_geti( cmpmap_simp, 'Nin', status ) )
+ : call stopit( status, 'Simplify error 2' )
+
+ nout = ast_geti( cmpmap, 'Nout', status )
+ if( nout .ne. ast_geti( cmpmap_simp, 'Nout', status ) )
+ : call stopit( status, 'Simplify error 3' )
+
+ call ast_trann( cmpmap, 3, nin, 3, testpoints, .true., nout,
+ : 3, outpoints, status )
+ call ast_trann( cmpmap_simp, 3, nin, 3, testpoints, .true.,
+ : nout, 3, outpoints_simp, status )
+
+ do j = 1, nout
+ do k = 1, 3
+ if( differ( outpoints(k,j), outpoints_simp(k,j) ) )
+ : call stopit( status, 'Simplify error 4' )
+ end do
+ end do
+ end do
+
+ end
+
+
+ logical function differ( aa, bb )
+ implicit none
+ double precision aa, bb, diff
+ differ = abs( (aa) - (bb) ) .gt.
+ : abs( 0.5D0*( (aa) + (bb) ) )*1.0D-14
+
+ end
diff --git a/ast/ast_tester/testxmlchan.f b/ast/ast_tester/testxmlchan.f
new file mode 100644
index 0000000..51e58ec
--- /dev/null
+++ b/ast/ast_tester/testxmlchan.f
@@ -0,0 +1,246 @@
+ program testxmlchan
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ include 'testxmlchan_com'
+
+ integer status, obj, i, ifmt, nfmt
+ character fmt(2)*30
+ logical ok
+
+ data nfmt /2/,
+ : fmt / 'native', 'quoted' /
+
+ status = sai__ok
+
+ call ast_begin( status )
+
+*
+* Create an AST object.
+*
+ call makeobject( obj, status )
+
+*
+* Create a normal Channel and write the object out to file1
+*
+ call chanwrite( obj, 1, status )
+
+*
+* Test each XML format in turn.
+ do ifmt = 1, nfmt
+
+*
+* Create an XmlChan and write the object out to file2 using the current
+* format.
+*
+ call xmlwrite( obj, 2, fmt( ifmt ), status )
+
+*
+* Use a new XmlChan to read an object from file2
+*
+ call xmlread( 2, obj, status )
+
+*
+* Write this object out to file 3 using a simple Channel.
+*
+ call chanwrite( obj, 3, status )
+
+*
+* Report an error if the contents of files 1 and 3 differ.
+*
+ ok = .true.
+ if( filelen( 1 ) .ne. filelen( 3 ) ) then
+ write(*,*) 'TestXmlChan: files 1 and 3 have different '//
+ : 'lengths (',filelen( 1 ),',',filelen( 3 ),').'
+ ok =.false.
+ else
+ do i = 1, filelen( 1 )
+ if( files( 1, i ) .ne. files( 3, i ) ) then
+ write(*,*) 'TestXmlChan: Line ',i,' differs in '//
+ : 'files 1 and 3:'
+ write(*,*) files( 1, i )
+ write(*,*) files( 3, i )
+ ok = .false.
+ go to 10
+ end if
+ end do
+ end if
+
+ 10 continue
+
+ if( .not. ok ) then
+ write(*,*) 'TestXmlChan: Test failed on XmlFormat ''',
+ : fmt(ifmt),'''.'
+ go to 20
+ end if
+
+ end do
+
+ 20 continue
+
+ call ast_end( status )
+
+ if( ok ) then
+ write(*,*) 'All XmlChan tests passed'
+ else
+ write(*,*) 'XmlChan tests failed'
+ end if
+
+ end
+
+*
+* Reads line "iline" from internal file "ifile" and returns it to AST using
+* the AST_PULINE routine. Then increments "iline" ready for next time.
+*
+ subroutine source( status )
+ implicit none
+
+ include 'testxmlchan_com'
+
+ integer status, l, chr_len
+
+ if( iline .le. filelen( ifile ) ) then
+ l = chr_len( files(ifile,iline) )
+ call ast_putline( files(ifile,iline), l, status )
+ iline = iline + 1
+ else
+ call ast_putline( ' ', -1, status )
+ end if
+
+ end
+
+*
+* Append a line obtained using ast_getline function to the end of the
+* internal file indicated by "ifile", and increment the file length.
+*
+ subroutine sink( status )
+ implicit none
+
+ include 'testxmlchan_com'
+
+ integer status, l
+ character line*(linelen)
+
+ call ast_getline( line, l, status )
+ if( l .gt. 0 ) then
+
+ if( filelen( ifile ) .ge. mxline ) then
+ stop 'TestXmlChan: Too many lines sent to sink function'
+
+ else if( l .gt. linelen ) then
+ stop 'TestXmlChan: Text truncated in sink function'
+
+ else
+ filelen( ifile ) = filelen( ifile ) + 1
+ files( ifile, filelen( ifile ) ) = line(:l)
+ end if
+
+ end if
+
+ end
+
+*
+* Create an AST object to be used as the test object.
+*
+ subroutine makeobject( obj, status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+ integer obj, sf, f, m, status
+
+ obj = ast__null
+ if( status .ne. sai__ok ) return
+
+ sf = Ast_SkyFrame( ' ', status )
+ f = Ast_Frame( 2, ' ', status )
+ call ast_setc( f, 'title', 'A new title', status )
+ m = ast_UnitMap( 2, ' ', status )
+ obj = ast_FrameSet( f, ' ', status )
+ call ast_addFrame( obj, 1, m, sf, status )
+
+ end
+
+*
+* Write the supplied object out to the specified internal file using a
+* basic Channel.
+*
+ subroutine chanwrite( obj, ifil, status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+
+ include 'testxmlchan_com'
+
+ external sink
+ integer obj, ifil, status, ch
+
+ if( status .ne. sai__ok ) return
+
+ ifile = ifil
+ filelen( ifil ) = 0
+
+ ch = ast_channel( ast_null, sink, ' ', status )
+ if( ast_write( ch, obj, status ) .ne. 1 ) then
+ stop 'TestXmlChan: Failed to write object to Channel.'
+ end if
+ call ast_annul( ch, status )
+
+ end
+
+*
+* Write the supplied object out to the specified internal file using an
+* XmlChan.
+*
+ subroutine xmlwrite( obj, ifil, fmt, status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+
+ include 'testxmlchan_com'
+
+ external sink
+ integer obj, ifil, status, ch
+ character fmt*(*)
+
+ if( status .ne. sai__ok ) return
+
+ ifile = ifil
+ filelen( ifil ) = 0
+
+ ch = ast_xmlchan( ast_null, sink, 'indent=1,comment=1',
+ : status )
+ call ast_seti( ch, 'xmllength', linelen, status )
+ call ast_setc( ch, 'xmlformat', fmt, status )
+ if( ast_write( ch, obj, status ) .ne. 1 ) then
+ stop 'TestXmlChan: Failed to write object to XmlChan.'
+ end if
+ call ast_annul( ch, status )
+
+ end
+
+*
+* Read an object out of the specified internal file using an XmlChan.
+*
+ subroutine xmlread( ifil, obj, status )
+ implicit none
+ include 'SAE_PAR'
+ include 'AST_PAR'
+
+ include 'testxmlchan_com'
+
+ external source
+ integer obj, ifil, status, ch
+
+ if( status .ne. sai__ok ) return
+
+ ifile = ifil
+ iline = 1
+
+ ch = ast_xmlchan( source, ast_null, ' ', status )
+ obj = ast_read( ch, status )
+ if( obj .eq. ast__null ) then
+ stop 'TestXmlChan: Failed to read object from XmlChan.'
+ end if
+ call ast_annul( ch, status )
+
+ end
diff --git a/ast/ast_tester/testxmlchan_com b/ast/ast_tester/testxmlchan_com
new file mode 100644
index 0000000..3b7500e
--- /dev/null
+++ b/ast/ast_tester/testxmlchan_com
@@ -0,0 +1,13 @@
+*
+* Common block declaration used by testxmlchan.f for storing internal
+* files and associated info.
+*
+ integer mxline
+ parameter ( mxline = 500 )
+
+ integer linelen
+ parameter ( linelen = 100 )
+
+ character files( 3, mxline )*(linelen)
+ integer ifile,iline,filelen( 3 )
+ common /files/ files, ifile, iline, filelen
diff --git a/ast/ast_tester/testzoommap.f b/ast/ast_tester/testzoommap.f
new file mode 100644
index 0000000..0c2afd7
--- /dev/null
+++ b/ast/ast_tester/testzoommap.f
@@ -0,0 +1,91 @@
+ program testzoommap
+ implicit none
+
+ include 'AST_PAR'
+ include 'AST_ERR'
+ include 'SAE_PAR'
+
+ integer zm, cm, status
+
+ status = sai__ok
+ call ast_begin( status )
+
+ zm = ast_zoommap( 1, -1.0D0, ' ', status )
+ if( .not. ast_test( zm, 'Zoom', status ) ) then
+ call stopit( status, "Error 1" );
+ else if( ast_getd( zm, 'Zoom', status ) .ne. -1.0D0 ) then
+ call stopit( status, "Error 2" );
+ end if
+
+ call ast_clear( zm, 'Zoom', status )
+ if( ast_test( zm, 'Zoom', status ) ) then
+ call stopit( status, "Error 3" );
+ else if( ast_getd( zm, 'Zoom', status ) .ne. 1.0D0 ) then
+ call stopit( status, "Error 4" );
+ end if
+
+ call ast_setd( zm, 'Zoom', 2.5D0, status )
+ if( .not. ast_test( zm, 'Zoom', status ) ) then
+ call stopit( status, "Error 5" );
+ else if( ast_getd( zm, 'Zoom', status ) .ne. 2.5D0 ) then
+ call stopit( status, "Error 6" );
+ end if
+
+ cm = ast_cmpmap( zm, ast_unitmap( 1, ' ', status ), .TRUE.,
+ : ' ', status )
+
+ if( .not. ast_test( zm, 'Zoom', status ) ) then
+ call stopit( status, "Error 7" );
+ else if( ast_getd( zm, 'Zoom', status ) .ne. 2.5D0 ) then
+ call stopit( status, "Error 8" );
+ end if
+
+ call err_mark
+
+ call ast_setd( zm, 'Zoom', 1.5D0, status )
+ if( status .eq. ast__immut ) then
+ call err_annul( status )
+ else if( status .eq. sai__ok ) then
+ call stopit( status, "Error 9" );
+ else
+ call stopit( status, "Error 10" );
+ end if
+
+ call ast_clear( zm, 'Zoom', status )
+ if( status .eq. ast__immut ) then
+ call err_annul( status )
+ else if( status .eq. sai__ok ) then
+ call stopit( status, "Error 11" );
+ else
+ call stopit( status, "Error 12" );
+ end if
+
+ call err_rlse
+
+ call ast_end( status )
+
+c call ast_activememory( 'testzoommap' )
+ call ast_flushmemory( 1 )
+
+ if( status .eq. sai__ok ) then
+ write(*,*) 'All ZoomMap tests passed'
+ else
+ write(*,*) 'ZoomMap tests failed'
+ end if
+
+ end
+
+
+
+ subroutine stopit( status, text )
+ implicit none
+ include 'SAE_PAR'
+ integer status
+ character text*(*)
+ if( status .ne. sai__ok ) return
+ status = sai__error
+ write(*,*) text
+ end
+
+
+
diff --git a/ast/ast_tester/timeplot.attr b/ast/ast_tester/timeplot.attr
new file mode 100644
index 0000000..5b43238
--- /dev/null
+++ b/ast/ast_tester/timeplot.attr
@@ -0,0 +1 @@
+minticklen=0.02,majticklen=0.05,gap(2)=0.1,NumLabGap=0.05,textlabgap=0.1,size=0.9
diff --git a/ast/ast_tester/timeplot.box b/ast/ast_tester/timeplot.box
new file mode 100644
index 0000000..c2351b4
--- /dev/null
+++ b/ast/ast_tester/timeplot.box
@@ -0,0 +1 @@
+0.046 3.0 1.008 3.3
diff --git a/ast/ast_tester/timeplot.head b/ast/ast_tester/timeplot.head
new file mode 100644
index 0000000..95ea8d5
--- /dev/null
+++ b/ast/ast_tester/timeplot.head
@@ -0,0 +1,34 @@
+
+COMMENT AST ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ AST
+COMMENT AST Beginning of AST data for CmpFrame object AST
+COMMENT AST ................................................................ AST
+BEGAST_A= 'CmpFrame' / Compound coordinate system description
+DOMAIN_A= 'DATAPLOT' / Coordinate system domain
+ACTUNT_A= 1 / Unit strings affects alignment
+ISA_A = 'Frame ' / Coordinate system description
+FRAMEA_A= ' ' / First component Frame
+BEGAST_B= 'TimeFrame' / Description of time coordinate system
+TITLE_A = 'KAPPA - Trandat' / Title of coordinate system
+NAXES_A = 1 / Number of coordinate axes
+AX1_A = ' ' / Axis number 1
+BEGAST_C= 'Axis ' / Coordinate axis
+FORMAT_A= 'iso.0 ' / Format specifier
+ENDAST_A= 'Axis ' / End of object definition
+ISA_B = 'Frame ' / Coordinate system description
+TMORG_A = 57128.585856 / Time offset
+ENDAST_B= 'TimeFrame' / End of object definition
+FRAMEB_A= ' ' / Second component Frame
+BEGAST_D= 'Frame ' / Coordinate system description
+NAXES_B = 1 / Number of coordinate axes
+ACTUNT_B= 1 / Unit strings affects alignment
+AX1_B = ' ' / Axis number 1
+BEGAST_E= 'Axis ' / Coordinate axis
+LABEL_A = 'Data up-loaded' / Axis Label
+SYMBOL_A= 'Data ' / Axis symbol
+UNIT_A = 'GB ' / Axis units
+ENDAST_C= 'Axis ' / End of object definition
+ENDAST_D= 'Frame ' / End of object definition
+ENDAST_E= 'CmpFrame' / End of object definition
+COMMENT AST ................................................................ AST
+COMMENT AST End of AST data for CmpFrame object AST
+COMMENT AST ---------------------------------------------------------------- AST
diff --git a/ast/ast_tester/timj.ast b/ast/ast_tester/timj.ast
new file mode 100644
index 0000000..ed011dd
--- /dev/null
+++ b/ast/ast_tester/timj.ast
@@ -0,0 +1,234 @@
+ Begin FrameSet
+# Title = "FK5 equatorial coordinates; mean equinox J2000.0; gnomonic projection" # Title of coordinate system
+# Naxes = 2 # Number of coordinate axes
+# Domain = "SKY" # Coordinate system domain
+# Lbl1 = "Right ascension" # Label for axis 1
+# Lbl2 = "Declination" # Label for axis 2
+# Uni1 = "hh:mm:ss.s" # Units for axis 1
+# Uni2 = "ddd:mm:ss" # Units for axis 2
+# Dir1 = 0 # Plot axis 1 in reverse direction
+ IsA Frame # Coordinate system description
+ Nframe = 4 # Number of Frames in FrameSet
+# Base = 1 # Index of base Frame
+ Currnt = 4 # Index of current Frame
+ Nnode = 5 # Number of nodes in FrameSet
+ Nod1 = 3 # Frame 1 is associated with node 3
+ Nod2 = 4 # Frame 2 is associated with node 4
+ Nod3 = 5 # Frame 3 is associated with node 5
+ Nod4 = 2 # Frame 4 is associated with node 2
+ Lnk2 = 1 # Node 2 is derived from node 1
+ Lnk3 = 1 # Node 3 is derived from node 1
+ Lnk4 = 1 # Node 4 is derived from node 1
+ Lnk5 = 1 # Node 5 is derived from node 1
+ Frm1 = # Frame number 1
+ Begin Frame
+ Title = "Data grid indices; first pixel at (1,1)" # Title of coordinate system
+ Naxes = 2 # Number of coordinate axes
+ Domain = "GRID" # Coordinate system domain
+# Lbl1 = "Data grid index 1" # Label for axis 1
+# Lbl2 = "Data grid index 2" # Label for axis 2
+# Uni1 = "pixel" # Units for axis 1
+# Uni2 = "pixel" # Units for axis 2
+ Ax1 = # Axis number 1
+ Begin Axis
+ Label = "Data grid index 1" # Axis Label
+ Symbol = "g1" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ Ax2 = # Axis number 2
+ Begin Axis
+ Label = "Data grid index 2" # Axis Label
+ Symbol = "g2" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ End Frame
+ Frm2 = # Frame number 2
+ Begin Frame
+ Title = "Pixel coordinates; first pixel at (-128.5,-127.5)" # Title of coordinate system
+ Naxes = 2 # Number of coordinate axes
+ Domain = "PIXEL" # Coordinate system domain
+# Lbl1 = "Pixel coordinate 1" # Label for axis 1
+# Lbl2 = "Pixel coordinate 2" # Label for axis 2
+# Uni1 = "pixel" # Units for axis 1
+# Uni2 = "pixel" # Units for axis 2
+ Ax1 = # Axis number 1
+ Begin Axis
+ Label = "Pixel coordinate 1" # Axis Label
+ Symbol = "p1" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ Ax2 = # Axis number 2
+ Begin Axis
+ Label = "Pixel coordinate 2" # Axis Label
+ Symbol = "p2" # Axis symbol
+ Unit = "pixel" # Axis units
+ Format = "%3.1f" # Format specifier
+ End Axis
+ End Frame
+ Frm3 = # Frame number 3
+ Begin Frame
+ Title = "Axis coordinates; first pixel at (384,-381)" # Title of coordinate system
+ Naxes = 2 # Number of coordinate axes
+ Domain = "AXIS" # Coordinate system domain
+# Lbl1 = "R.A. offset" # Label for axis 1
+# Lbl2 = "Declination offset" # Label for axis 2
+# Uni1 = "arcsec" # Units for axis 1
+# Uni2 = "arcsec" # Units for axis 2
+ Ax1 = # Axis number 1
+ Begin Axis
+ Label = "R.A. offset" # Axis Label
+ Symbol = "a1" # Axis symbol
+ Unit = "arcsec" # Axis units
+ End Axis
+ Ax2 = # Axis number 2
+ Begin Axis
+ Label = "Declination offset" # Axis Label
+ Symbol = "a2" # Axis symbol
+ Unit = "arcsec" # Axis units
+ End Axis
+ End Frame
+ Frm4 = # Frame number 4
+ Begin SkyFrame
+# Title = "FK5 equatorial coordinates; mean equinox J2000.0; gnomonic projection" # Title of coordinate system
+ Naxes = 2 # Number of coordinate axes
+# Domain = "SKY" # Coordinate system domain
+# Lbl1 = "Right ascension" # Label for axis 1
+# Lbl2 = "Declination" # Label for axis 2
+# Uni1 = "hh:mm:ss.s" # Units for axis 1
+# Uni2 = "ddd:mm:ss" # Units for axis 2
+# Dir1 = 0 # Plot axis 1 in reverse direction
+ Ax1 = # Axis number 1
+ Begin SkyAxis
+ End SkyAxis
+ Ax2 = # Axis number 2
+ Begin SkyAxis
+ End SkyAxis
+ IsA Frame # Coordinate system description
+ System = "FK5" # Celestial coordinate system type
+ Proj = "gnomonic" # Description of sky projection
+ Epoch = 2002.3821786502 # Julian epoch of observation
+ Eqnox = 2000 # Julian epoch of mean equinox
+ End SkyFrame
+ Map2 = # Mapping between nodes 1 and 2
+ Begin CmpMap
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin WinMap
+ Nin = 2 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ Sft1 = -129 # Shift for axis 1
+ Sft2 = -128 # Shift for axis 2
+ End WinMap
+ MapB = # Second component Mapping
+ Begin CmpMap
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin MatrixMap
+ Nin = 2 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ M0 = -1.45444097695548e-05 # Forward matrix value
+ M1 = 1.45444097695548e-05 # Forward matrix value
+ Form = "Diagonal" # Matrix storage form
+ End MatrixMap
+ MapB = # Second component Mapping
+ Begin CmpMap
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ InvA = 1 # First Mapping used in inverse direction
+ MapA = # First component Mapping
+ Begin WcsMap
+ Nin = 2 # Number of input coordinates
+ Invert = 1 # Mapping inverted
+ IsA Mapping # Mapping between coordinate systems
+ Type = "TAN" # Gnomonic projection
+ End WcsMap
+ MapB = # Second component Mapping
+ Begin CmpMap
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ InvA = 1 # First Mapping used in inverse direction
+ MapA = # First component Mapping
+ Begin SphMap
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ UntRd = 1 # All input vectors have unit length
+ End SphMap
+ MapB = # Second component Mapping
+ Begin CmpMap
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin MatrixMap
+ Nin = 3 # Number of input coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ M0 = 0.425569982779421 # Forward matrix value
+ M1 = 0.773738866158297 # Forward matrix value
+ M2 = 0.469274287334386 # Forward matrix value
+ M3 = -0.519775230563316 # Forward matrix value
+ M4 = 0.633504670066506 # Forward matrix value
+ M5 = -0.573154030516038 # Forward matrix value
+ M6 = -0.740759002274002 # Forward matrix value
+ M7 = 0 # Forward matrix value
+ M8 = 0.671770869084113 # Forward matrix value
+ Form = "Full" # Matrix storage form
+ End MatrixMap
+ MapB = # Second component Mapping
+ Begin CmpMap
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ IsA Mapping # Mapping between coordinate systems
+ MapA = # First component Mapping
+ Begin SphMap
+ Nin = 3 # Number of input coordinates
+ Nout = 2 # Number of output coordinates
+ Invert = 0 # Mapping not inverted
+ IsA Mapping # Mapping between coordinate systems
+ UntRd = 1 # All input vectors have unit length
+ End SphMap
+ MapB = # Second component Mapping
+ Begin SlaMap
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ Nsla = 1 # Number of conversion steps
+ Sla1 = "FK45Z" # FK4 to FK5 J2000.0 (no PM or parallax)
+ Sla1a = 2002.38350704493 # Besselian epoch of FK4 coordinates
+ End SlaMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ End CmpMap
+ Map3 = # Mapping between nodes 1 and 3
+ Begin UnitMap
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ End UnitMap
+ Map4 = # Mapping between nodes 1 and 4
+ Begin WinMap
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ Sft1 = -129.5 # Shift for axis 1
+ Sft2 = -128.5 # Shift for axis 2
+ End WinMap
+ Map5 = # Mapping between nodes 1 and 5
+ Begin WinMap
+ Nin = 2 # Number of input coordinates
+ IsA Mapping # Mapping between coordinate systems
+ Sft1 = 387 # Shift for axis 1
+ Scl1 = -3 # Scale factor for axis 1
+ Sft2 = -384 # Shift for axis 2
+ Scl2 = 3 # Scale factor for axis 2
+ End WinMap
+ End FrameSet
diff --git a/ast/ast_tester/timj.fits-aips b/ast/ast_tester/timj.fits-aips
new file mode 100644
index 0000000..4fdd94b
--- /dev/null
+++ b/ast/ast_tester/timj.fits-aips
@@ -0,0 +1,11 @@
+CRPIX1 = 129.0 / Reference pixel on axis 1
+CRPIX2 = 128.0 / Reference pixel on axis 2
+CRVAL1 = 309.75469 / Value at ref. pixel on axis 1
+CRVAL2 = 42.381032 / Value at ref. pixel on axis 2
+CTYPE1 = 'RA---TAN' / Type of co-ordinate on axis 1
+CTYPE2 = 'DEC--TAN' / Type of co-ordinate on axis 2
+CDELT1 = -8.3333273E-4 / Pixel size
+CDELT2 = 0.00083333273 / Pixel size
+CROTA2 = 0.29013902 / Axis rotation
+EPOCH = 2000.0 / Epoch of reference equinox
+DATE-OBS= '2002-05-20T14:09:36.786' / Date of observation
diff --git a/ast/ast_tester/timj.fits-iraf b/ast/ast_tester/timj.fits-iraf
new file mode 100644
index 0000000..88c3d94
--- /dev/null
+++ b/ast/ast_tester/timj.fits-iraf
@@ -0,0 +1,13 @@
+CRPIX1 = 129.0 / Reference pixel on axis 1
+CRPIX2 = 128.0 / Reference pixel on axis 2
+CRVAL1 = 309.75469 / Value at ref. pixel on axis 1
+CRVAL2 = 42.381032 / Value at ref. pixel on axis 2
+CTYPE1 = 'RA---TAN' / Type of co-ordinate on axis 1
+CTYPE2 = 'DEC--TAN' / Type of co-ordinate on axis 2
+CD1_1 = -8.3332205E-4 / Transformation matrix element
+CD1_2 = -4.2198799E-6 / Transformation matrix element
+CD2_1 = -4.2198799E-6 / Transformation matrix element
+CD2_2 = 0.00083332205 / Transformation matrix element
+RADECSYS= 'FK5 ' / Reference frame for RA/DEC values
+EQUINOX = 2000.0 / Epoch of reference equinox
+DATE-OBS= '2002-05-20T14:09:36.786' / Date of observation
diff --git a/ast/ast_tester/timj.fits-pc b/ast/ast_tester/timj.fits-pc
new file mode 100644
index 0000000..f3bfc6f
--- /dev/null
+++ b/ast/ast_tester/timj.fits-pc
@@ -0,0 +1,16 @@
+PC001001= 1.0
+PC001002= 0.0050638595
+PC002001= -0.0050638595
+PC002002= 1.0
+CDELT1 = -8.3333273E-4 / Pixel scale on axis 1
+CDELT2 = 0.00083333273 / Pixel scale on axis 2
+CRPIX1 = 129.0 / Reference pixel on axis 1
+CRPIX2 = 128.0 / Reference pixel on axis 2
+CRVAL1 = 309.75469 / Value at ref. pixel on axis 1
+CRVAL2 = 42.381032 / Value at ref. pixel on axis 2
+CTYPE1 = 'RA---TAN' / Type of co-ordinate on axis 1
+CTYPE2 = 'DEC--TAN' / Type of co-ordinate on axis 2
+RADECSYS= 'FK5 ' / Reference frame for RA/DEC values
+EQUINOX = 2000.0 / Epoch of reference equinox
+MJD-OBS = 52414.59 / Modified Julian Date of observation
+DATE-OBS= '2002-05-20T14:09:36.786' / Date of observation
diff --git a/ast/ast_tester/timj.fits-wcs b/ast/ast_tester/timj.fits-wcs
new file mode 100644
index 0000000..f8b3e8a
--- /dev/null
+++ b/ast/ast_tester/timj.fits-wcs
@@ -0,0 +1,39 @@
+WCSAXES = 2 / Number of WCS axes
+CRPIX1 = 129.0 / Reference pixel on axis 1
+CRPIX2 = 128.0 / Reference pixel on axis 2
+CRVAL1 = 309.75469 / Value at ref. pixel on axis 1
+CRVAL2 = 42.381032 / Value at ref. pixel on axis 2
+CTYPE1 = 'RA---TAN' / Type of co-ordinate on axis 1
+CTYPE2 = 'DEC--TAN' / Type of co-ordinate on axis 2
+CD1_1 = -8.3332205E-4 / Transformation matrix element
+CD1_2 = -4.2198799E-6 / Transformation matrix element
+CD2_1 = -4.2198799E-6 / Transformation matrix element
+CD2_2 = 0.00083332205 / Transformation matrix element
+MJD-OBS = 52414.59 / Modified Julian Date of observation
+DATE-OBS= '2002-05-20T14:09:36.786' / Date of observation
+RADESYS = 'FK5 ' / Reference frame for RA/DEC values
+EQUINOX = 2000.0 / [yr] Epoch of reference equinox
+WCSAXESA= 2 / Number of WCS axes
+WCSNAMEA= 'PIXEL ' / Reference name for the coord. frame
+CRPIX1A = 1.0 / Reference pixel on axis 1
+CRPIX2A = 1.0 / Reference pixel on axis 2
+CRVAL1A = -128.5 / Value at ref. pixel on axis 1
+CRVAL2A = -127.5 / Value at ref. pixel on axis 2
+CTYPE1A = 'p1 ' / Pixel coordinate 1
+CTYPE2A = 'p2 ' / Pixel coordinate 2
+CD1_1A = 1.0 / Transformation matrix element
+CD2_2A = 1.0 / Transformation matrix element
+CUNIT1A = 'pixel ' / Units for axis 1
+CUNIT2A = 'pixel ' / Units for axis 2
+WCSAXESB= 2 / Number of WCS axes
+WCSNAMEB= 'AXIS ' / Reference name for the coord. frame
+CRPIX1B = 1.0 / Reference pixel on axis 1
+CRPIX2B = 1.0 / Reference pixel on axis 2
+CRVAL1B = 384.0 / Value at ref. pixel on axis 1
+CRVAL2B = -381.0 / Value at ref. pixel on axis 2
+CTYPE1B = 'a1 ' / R.A. offset
+CTYPE2B = 'a2 ' / Declination offset
+CD1_1B = -3.0 / Transformation matrix element
+CD2_2B = 3.0 / Transformation matrix element
+CUNIT1B = 'arcsec ' / Units for axis 1
+CUNIT2B = 'arcsec ' / Units for axis 2
diff --git a/ast/ast_tester/timj.native b/ast/ast_tester/timj.native
new file mode 100644
index 0000000..fb54315
--- /dev/null
+++ b/ast/ast_tester/timj.native
@@ -0,0 +1,217 @@
+
+COMMENT AST ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ AST
+COMMENT AST WCS information in AST format AST
+COMMENT AST See http://www.starlink.ac.uk/ast/ AST
+COMMENT AST Beginning of AST data for FrameSet object AST
+COMMENT AST ................................................................ AST
+BEGAST_A= 'FrameSet' / Set of inter-related coordinate systems
+NFRAME_A= 4 / Number of Frames in FrameSet
+CURRNT_A= 4 / Index of current Frame
+NNODE_A = 5 / Number of nodes in FrameSet
+NOD1_A = 3 / Frame 1 is associated with node 3
+NOD2_A = 4 / Frame 2 is associated with node 4
+NOD3_A = 5 / Frame 3 is associated with node 5
+NOD4_A = 2 / Frame 4 is associated with node 2
+LNK2_A = 1 / Node 2 is derived from node 1
+LNK3_A = 1 / Node 3 is derived from node 1
+LNK4_A = 1 / Node 4 is derived from node 1
+LNK5_A = 1 / Node 5 is derived from node 1
+FRM1_A = ' ' / Frame number 1
+BEGAST_B= 'Frame ' / Coordinate system description
+TITLE_A = 'Data grid indices; first pixel at (1&' / Title of coordinate system
+CONTINUE ',1) '
+NAXES_A = 2 / Number of coordinate axes
+DOMAIN_A= 'GRID ' / Coordinate system domain
+AX1_A = ' ' / Axis number 1
+BEGAST_C= 'Axis ' / Coordinate axis
+LABEL_A = 'Data grid index 1' / Axis Label
+SYMBOL_A= 'g1 ' / Axis symbol
+UNIT_A = 'pixel ' / Axis units
+FORMAT_A= '%3.1f ' / Format specifier
+ENDAST_A= 'Axis ' / End of object definition
+AX2_A = ' ' / Axis number 2
+BEGAST_D= 'Axis ' / Coordinate axis
+LABEL_B = 'Data grid index 2' / Axis Label
+SYMBOL_B= 'g2 ' / Axis symbol
+UNIT_B = 'pixel ' / Axis units
+FORMAT_B= '%3.1f ' / Format specifier
+ENDAST_B= 'Axis ' / End of object definition
+ENDAST_C= 'Frame ' / End of object definition
+FRM2_A = ' ' / Frame number 2
+BEGAST_E= 'Frame ' / Coordinate system description
+TITLE_B = 'Pixel coordinates; first pixel at (-&' / Title of coordinate system
+CONTINUE '128.5,-127.5)'
+NAXES_B = 2 / Number of coordinate axes
+DOMAIN_B= 'PIXEL ' / Coordinate system domain
+AX1_B = ' ' / Axis number 1
+BEGAST_F= 'Axis ' / Coordinate axis
+LABEL_C = 'Pixel coordinate 1' / Axis Label
+SYMBOL_C= 'p1 ' / Axis symbol
+UNIT_C = 'pixel ' / Axis units
+FORMAT_C= '%3.1f ' / Format specifier
+ENDAST_D= 'Axis ' / End of object definition
+AX2_B = ' ' / Axis number 2
+BEGAST_G= 'Axis ' / Coordinate axis
+LABEL_D = 'Pixel coordinate 2' / Axis Label
+SYMBOL_D= 'p2 ' / Axis symbol
+UNIT_D = 'pixel ' / Axis units
+FORMAT_D= '%3.1f ' / Format specifier
+ENDAST_E= 'Axis ' / End of object definition
+ENDAST_F= 'Frame ' / End of object definition
+FRM3_A = ' ' / Frame number 3
+BEGAST_H= 'Frame ' / Coordinate system description
+TITLE_C = 'Axis coordinates; first pixel at (38&' / Title of coordinate system
+CONTINUE '4,-381) '
+NAXES_C = 2 / Number of coordinate axes
+DOMAIN_C= 'AXIS ' / Coordinate system domain
+AX1_C = ' ' / Axis number 1
+BEGAST_I= 'Axis ' / Coordinate axis
+LABEL_E = 'R.A. offset' / Axis Label
+SYMBOL_E= 'a1 ' / Axis symbol
+UNIT_E = 'arcsec ' / Axis units (arc-second)
+ENDAST_G= 'Axis ' / End of object definition
+AX2_C = ' ' / Axis number 2
+BEGAST_J= 'Axis ' / Coordinate axis
+LABEL_F = 'Declination offset' / Axis Label
+SYMBOL_F= 'a2 ' / Axis symbol
+UNIT_F = 'arcsec ' / Axis units (arc-second)
+ENDAST_H= 'Axis ' / End of object definition
+ENDAST_I= 'Frame ' / End of object definition
+FRM4_A = ' ' / Frame number 4
+BEGAST_K= 'SkyFrame' / Description of celestial coordinate system
+NAXES_D = 2 / Number of coordinate axes
+EPOCH_A = 2002.3822 / Julian epoch of observation
+SYSTEM_A= 'FK5 ' / Coordinate system type
+AX1_D = ' ' / Axis number 1
+BEGAST_L= 'SkyAxis ' / Celestial coordinate axis
+ENDAST_J= 'SkyAxis ' / End of object definition
+AX2_D = ' ' / Axis number 2
+BEGAST_M= 'SkyAxis ' / Celestial coordinate axis
+ENDAST_K= 'SkyAxis ' / End of object definition
+ISA_A = 'Frame ' / Coordinate system description
+PROJ_A = 'gnomonic' / Description of sky projection
+EQNOX_A = 2000.0 / Julian epoch of mean equinox
+ENDAST_L= 'SkyFrame' / End of object definition
+MAP2_A = ' ' / Mapping between nodes 1 and 2
+BEGAST_N= 'CmpMap ' / Compound Mapping
+NIN_A = 2 / Number of input coordinates
+ISA_B = 'Mapping ' / Mapping between coordinate systems
+MAPA_A = ' ' / First component Mapping
+BEGAST_O= 'WinMap ' / Map one window on to another
+NIN_B = 2 / Number of input coordinates
+INVERT_A= 0 / Mapping not inverted
+ISA_C = 'Mapping ' / Mapping between coordinate systems
+SFT1_A = -129.0 / Shift for axis 1
+SFT2_A = -128.0 / Shift for axis 2
+ENDAST_M= 'WinMap ' / End of object definition
+MAPB_A = ' ' / Second component Mapping
+BEGAST_P= 'CmpMap ' / Compound Mapping
+NIN_C = 2 / Number of input coordinates
+ISA_D = 'Mapping ' / Mapping between coordinate systems
+MAPA_B = ' ' / First component Mapping
+BEGAST_Q= 'MatrixMap' / Matrix transformation
+NIN_D = 2 / Number of input coordinates
+INVERT_B= 0 / Mapping not inverted
+ISA_E = 'Mapping ' / Mapping between coordinate systems
+M0_A = -1.454441E-5 / Forward matrix value
+M1_A = 1.454441E-5 / Forward matrix value
+FORM_A = 'Diagonal' / Matrix storage form
+ENDAST_N= 'MatrixMap' / End of object definition
+MAPB_B = ' ' / Second component Mapping
+BEGAST_R= 'CmpMap ' / Compound Mapping
+NIN_E = 2 / Number of input coordinates
+ISA_F = 'Mapping ' / Mapping between coordinate systems
+INVA_A = 1 / First Mapping used in inverse direction
+MAPA_C = ' ' / First component Mapping
+BEGAST_S= 'WcsMap ' / FITS-WCS sky projection
+NIN_F = 2 / Number of input coordinates
+INVERT_C= 1 / Mapping inverted
+ISA_G = 'Mapping ' / Mapping between coordinate systems
+TYPE_A = 'TAN ' / Gnomonic projection
+ENDAST_O= 'WcsMap ' / End of object definition
+MAPB_C = ' ' / Second component Mapping
+BEGAST_T= 'CmpMap ' / Compound Mapping
+NIN_G = 2 / Number of input coordinates
+ISA_H = 'Mapping ' / Mapping between coordinate systems
+INVA_B = 1 / First Mapping used in inverse direction
+MAPA_D = ' ' / First component Mapping
+BEGAST_U= 'SphMap ' / Cartesian to Spherical mapping
+NIN_H = 3 / Number of input coordinates
+NOUT_A = 2 / Number of output coordinates
+INVERT_D= 0 / Mapping not inverted
+ISA_I = 'Mapping ' / Mapping between coordinate systems
+UNTRD_A = 1 / All input vectors have unit length
+ENDAST_P= 'SphMap ' / End of object definition
+MAPB_D = ' ' / Second component Mapping
+BEGAST_V= 'CmpMap ' / Compound Mapping
+NIN_I = 3 / Number of input coordinates
+NOUT_B = 2 / Number of output coordinates
+ISA_J = 'Mapping ' / Mapping between coordinate systems
+MAPA_E = ' ' / First component Mapping
+BEGAST_W= 'MatrixMap' / Matrix transformation
+NIN_J = 3 / Number of input coordinates
+INVERT_E= 0 / Mapping not inverted
+ISA_K = 'Mapping ' / Mapping between coordinate systems
+M0_B = 0.42556998 / Forward matrix value
+M1_B = 0.77373887 / Forward matrix value
+M2_A = 0.46927429 / Forward matrix value
+M3_A = -0.51977523 / Forward matrix value
+M4_A = 0.63350467 / Forward matrix value
+M5_A = -0.57315403 / Forward matrix value
+M6_A = -0.740759 / Forward matrix value
+M7_A = 0.0 / Forward matrix value
+M8_A = 0.67177087 / Forward matrix value
+FORM_B = 'Full ' / Matrix storage form
+ENDAST_Q= 'MatrixMap' / End of object definition
+MAPB_E = ' ' / Second component Mapping
+BEGAST_X= 'CmpMap ' / Compound Mapping
+NIN_K = 3 / Number of input coordinates
+NOUT_C = 2 / Number of output coordinates
+ISA_L = 'Mapping ' / Mapping between coordinate systems
+MAPA_F = ' ' / First component Mapping
+BEGAST_Y= 'SphMap ' / Cartesian to Spherical mapping
+NIN_L = 3 / Number of input coordinates
+NOUT_D = 2 / Number of output coordinates
+INVERT_F= 0 / Mapping not inverted
+ISA_M = 'Mapping ' / Mapping between coordinate systems
+UNTRD_B = 1 / All input vectors have unit length
+ENDAST_R= 'SphMap ' / End of object definition
+MAPB_F = ' ' / Second component Mapping
+BEGAST_Z= 'SlaMap ' / Conversion between sky coordinate systems
+NIN_M = 2 / Number of input coordinates
+ISA_N = 'Mapping ' / Mapping between coordinate systems
+NSLA_A = 1 / Number of conversion steps
+SLA1_A = 'FK45Z ' / FK4 to FK5 J2000.0 (no PM or parallax)
+SLA1A_A = 2002.3835 / Besselian epoch of FK4 coordinates
+ENDAST_S= 'SlaMap ' / End of object definition
+ENDAST_T= 'CmpMap ' / End of object definition
+ENDAST_U= 'CmpMap ' / End of object definition
+ENDAST_V= 'CmpMap ' / End of object definition
+ENDAST_W= 'CmpMap ' / End of object definition
+ENDAST_X= 'CmpMap ' / End of object definition
+ENDAST_Y= 'CmpMap ' / End of object definition
+MAP3_A = ' ' / Mapping between nodes 1 and 3
+BEGASTA_= 'UnitMap ' / Unit (null) Mapping
+NIN_N = 2 / Number of input coordinates
+ISA_O = 'Mapping ' / Mapping between coordinate systems
+ENDAST_Z= 'UnitMap ' / End of object definition
+MAP4_A = ' ' / Mapping between nodes 1 and 4
+BEGASTAA= 'WinMap ' / Map one window on to another
+NIN_O = 2 / Number of input coordinates
+ISA_P = 'Mapping ' / Mapping between coordinate systems
+SFT1_B = -129.5 / Shift for axis 1
+SFT2_B = -128.5 / Shift for axis 2
+ENDASTA_= 'WinMap ' / End of object definition
+MAP5_A = ' ' / Mapping between nodes 1 and 5
+BEGASTAB= 'WinMap ' / Map one window on to another
+NIN_P = 2 / Number of input coordinates
+ISA_Q = 'Mapping ' / Mapping between coordinate systems
+SFT1_C = 387.0 / Shift for axis 1
+SCL1_A = -3.0 / Scale factor for axis 1
+SFT2_C = -384.0 / Shift for axis 2
+SCL2_A = 3.0 / Scale factor for axis 2
+ENDASTAA= 'WinMap ' / End of object definition
+ENDASTAB= 'FrameSet' / End of object definition
+COMMENT AST ................................................................ AST
+COMMENT AST End of AST data for FrameSet object AST
+COMMENT AST ---------------------------------------------------------------- AST
diff --git a/ast/ast_tester/tnx.attr b/ast/ast_tester/tnx.attr
new file mode 100644
index 0000000..e5498b5
--- /dev/null
+++ b/ast/ast_tester/tnx.attr
@@ -0,0 +1 @@
+Grid=1,textlabgap=0.1,border=0
diff --git a/ast/ast_tester/tnx.box b/ast/ast_tester/tnx.box
new file mode 100644
index 0000000..f69daff
--- /dev/null
+++ b/ast/ast_tester/tnx.box
@@ -0,0 +1 @@
+0.0 0.0 2048.0 4096.0
diff --git a/ast/ast_tester/tnx.head b/ast/ast_tester/tnx.head
new file mode 100644
index 0000000..58c6aa0
--- /dev/null
+++ b/ast/ast_tester/tnx.head
@@ -0,0 +1,180 @@
+SIMPLE = T / Fits standard
+BITPIX = 16 / Bits per pixel
+NAXIS = 2 / Number of axes
+NAXIS1 = 2048 / Axis length
+NAXIS2 = 4096 / Axis length
+EXTEND = F / File may contain extensions
+ORIGIN = 'NOAO-IRAF FITS Image Kernel July 1999' / FITS file originator
+DATE = '2001-11-20T16:52:11' / Date FITS file was generated
+IRAF-TLM= '16:52:09 (20/11/2001)' / Time of last modification
+OBJECT = 'A576 R ' / Name of the object observed
+NEXTEND = 8 / Number of extensions
+FILENAME= 'obj214r ' / Original host filename
+OBSTYPE = 'object ' / Observation type
+EXPTIME = 350.000 / Exposure time (sec)
+DARKTIME= 351.888 / Dark time (sec)
+PREFLASH= 0.000000 / Preflash time (sec)
+RADECSYS= 'FK5 ' / Default coordinate system
+RA = '07:21:44.00 ' / RA of observation (hr)
+DEC = '55:53:16.99 ' / DEC of observation (deg)
+EQUINOX = 1.9998000490000E+03 / Equinox of coordinate system
+
+TIMESYS = 'UTC approximate' / Time system
+DATE-OBS= '1999-10-09' / Date of observation start (UTC approximate)
+TIME-OBS= '12:08:33.0' / Time of observation start
+MJD-OBS = 51460.50593750 / MJD of observation start
+MJDHDR = 51460.50591435 / MJD of header creation
+LSTHDR = '05:52:50.00 ' / LST of header creation
+
+OBSERVAT= 'KPNO ' / Observatory
+TELESCOP= 'KPNO 0.9 meter telescope' / Telescope
+ZD = 2.8469999000000E+01 / Zenith distance
+AIRMASS = 1.1400000000000E+00 / Airmass
+TELFOCUS= 4414 / Telescope focus
+CORRCTOR= 'KPNO 0.9m Corrector' / Corrector Identification
+ADC = 'none ' / ADC Identification
+
+DETECTOR= 'CCDMosaThin1' / Detector
+DETSIZE = '[1:8176,1:8192]' / Detector size for DETSEC
+NCCDS = 8 / Number of CCDs
+NAMPS = 8 / Number of Amplifiers
+PIXSIZE1= 15. / Pixel size for axis 1 (microns)
+PIXSIZE2= 15. / Pixel size for axis 2 (microns)
+PIXSCAL1= 0.423 / Pixel scale for axis 1 (arcsec/pixel)
+PIXSCAL2= 0.423 / Pixel scale for axis 2 (arcsec/pixel)
+RAPANGL = 0. / Position angle of RA axis (deg)
+DECPANGL= 270. / Position angle of DEC axis (deg)
+FILPOS = 4 / Filter position
+FILTER = 'R ' / Filter name(s)
+SHUTSTAT= 'guide ' / Shutter status
+TV1FOC = -5.9600000000000E-01 / North TV Camera focus position
+TV2FOC = -1.6230000000000E+00 / South Camera focus position
+ENVTEM = 1.7299999000000E+01 / Ambient temperature (C)
+DEWAR = 'CCDMosaThin1 Dewar' / Dewar identification
+DEWTEM1 = -1.7060000600000E+02 / Dewar temperature (C)
+DEWTEM2 = -4.7000000000000E+00 / Fill Neck temperature (C)
+CCDTEM = -9.5000000000000E+01 / CCD temperature (C)
+
+CONTROLR= 'Mosaic Arcon' / Controller identification
+CONSWV = '2.000 13Feb96 (add mode and group to hdrs)' / Controller softwar
+AMPINTEG= 3000 / (ns) Double Correlated Sample time
+READTIME= 13200 / (ns) unbinned pixel read time
+ARCONWD = 'Obs Thu Aug 19 10:45:52 1999' / Date waveforms last compiled
+ARCONWM = 'OverlapXmit EarlyReset SplitShift ' / Waveform mode switches on
+ARCONGI = 1 / Gain selection (index into Gain Table)
+
+OBSERVER= 'G.Wegner,M.Hudson' / Observer(s)
+PROPOSER= '<unknown>' / Proposer(s)
+PROPOSAL= '<unknown>' / Proposal title
+PROPID = '99B-0020' / Proposal identification
+OBSID = 'kp09m.19991009T120833' / Observation ID
+
+IMAGESWV= 'mosdca (Aug99), CCDMosaThin1V8.tcl (Aug99)' / Image creation software
+KWDICT = 'MosaicV1.dic (Sep97)' / Keyword dictionary
+
+CHECKSUM= '<unknown>' / Header checksum
+DATASUM = '<unknown>' / Data checksum
+CHECKVER= '<unknown>' / Checksum version
+RECNO = 0 / NOAO archive sequence number
+IMAGEID = 5 / Image identification
+
+TELRA = '07:21:44.00 ' / RA of observation (hr)
+TELDEC = '55:53:16.99 ' / DEC of observation (deg)
+TELEQUIN= 1.9998000490000E+03 / Equinox of coordinate system
+TELRADEC= 'FK5 ' / Default coordinate system
+
+CCDNAME = 'SITe #7061FBR03-02 (NOAO 02)' / CCD name
+AMPNAME = 'SITe #7061FBR03-02 (NOAO 02), upper left (Amp321)' / Amplifier name
+GAIN = 2.3 / gain for amp 321 (e-/ADU)
+RDNOISE = 9.5 / read noise for amp 321 (e-)
+SATURATE= 22000 / Maximum good data value (ADU)
+CONHWV = 'ACEB003_AMP21' / Controller hardware version
+ARCONG = 2.3 / gain expected for amp 321 (e-/ADU)
+ARCONRN = 5.1 / read noise expected for amp 321 (e-)
+BPM = 'mscdb$noao/CCDMosaThin1/bpm_im5' / Bad pixel mask
+CCDSIZE = '[1:2048,1:4096]' / CCD size
+CCDSUM = '1 1 ' / CCD pixel summing
+CCDSEC = '[1:2048,1:4096]' / CCD section
+AMPSEC = '[1:2048,4096:1]' / Amplifier section
+DETSEC = '[1:2048,4097:8192]' / Detector section
+
+ATM1_1 = 1. / CCD to amplifier transformation
+ATM2_2 = -1. / CCD to amplifier transformation
+ATV1 = 0. / CCD to amplifier transformation
+ATV2 = 4097. / CCD to amplifier transformation
+LTM1_1 = 1.0 / CCD to image transformation
+LTM2_2 = 1.0 / CCD to image transformation
+DTM1_1 = 1. / CCD to detector transformation
+DTM2_2 = 1. / CCD to detector transformation
+DTV1 = 0. / CCD to detector transformation
+DTV2 = 4096. / CCD to detector transformation
+
+WCSASTRM= 'kp09m.19980909T031418 (Tr 37 V Mosaic) by L. Davis 1998-09-09' / WCS
+WCSDIM = 2 / WCS dimensionality
+CTYPE1 = 'RA---TNX' / Coordinate type
+CTYPE2 = 'DEC--TNX' / Coordinate type
+CRVAL1 = 110.52095558563 / Coordinate reference value
+CRVAL2 = 55.842849490386 / Coordinate reference value
+CRPIX1 = 4189.77390083542 / Coordinate reference pixel
+CRPIX2 = -30.0894072403876 / Coordinate reference pixel
+CD1_1 = -7.5733524638274E-7 / Coordinate matrix
+CD2_1 = -1.1748235187739E-4 / Coordinate matrix
+CD1_2 = 1.17677003379415E-4 / Coordinate matrix
+CD2_2 = -1.2623022560872E-6 / Coordinate matrix
+WAT0_001= 'system=image' / Coordinate system
+WAT1_001= 'wtype=tnx axtype=ra lngcor = "3. 4. 4. 2. 0.005280549145776419 0.488'
+WAT1_002= '7181432338267 0.2464122630921897 0.4920677651238937 -0.23529018838'
+WAT1_003= '0298 0.004720134828570101 -0.001121960789613695 -0.01414958280730338'
+WAT1_004= ' 0.01246754057675834 1.048124909467771E-4 0.007168575568475281 -0.02'
+WAT1_005= '778217836490202 -0.01675668830707639 0.02500648596542957 "'
+WAT2_001= 'wtype=tnx axtype=dec latcor = "3. 4. 4. 2. 0.005280549145776419 0.48'
+WAT2_002= '87181432338267 0.2464122630921897 0.4920677651238937 0.1531926820'
+WAT2_003= '595278 -0.002539369349529043 6.454692689700324E-4 4.863689582871599E-'
+WAT2_004= '4 0.003549715563706861 -0.002061136945766966 -0.01644646641299351 0.'
+WAT2_005= '009061645978984397 0.005570842598401512 -0.02240395721775152 "'
+XTALKCOR= '03-Oct-2000 21:33:16 No crosstalk correction'
+TRIM = 'Oct 3 21:34 Trim is [1:2048,1:4096]'
+FIXPIX = 'Oct 3 21:35 Pixel mask is mscdb$noao/CCDMosaThin1/bpm_im5'
+OVERSCAN= 'Oct 3 21:34 Overscan is [2063:2112,1:4096], mean 993.5216'
+ZEROCOR = 'Oct 3 21:35 Zero is Zeromed[im5]'
+FLATCOR = 'Oct 3 21:35 Flat is FlatR.fits[im5], scale 5081.475'
+CCDMEAN = 255.7904
+CCDMEANT= 655076137
+CCDPROC = 'Oct 3 21:35 CCD processing done'
+CHIPNUM = 5
+FZEROPT = 22.040344
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+END
diff --git a/ast/ast_tester/tsc.attr b/ast/ast_tester/tsc.attr
new file mode 100644
index 0000000..496403c
--- /dev/null
+++ b/ast/ast_tester/tsc.attr
@@ -0,0 +1 @@
+border=1
diff --git a/ast/ast_tester/tsc.box b/ast/ast_tester/tsc.box
new file mode 100644
index 0000000..45cc65e
--- /dev/null
+++ b/ast/ast_tester/tsc.box
@@ -0,0 +1 @@
+1 1 1600 1600
diff --git a/ast/ast_tester/tsc.head b/ast/ast_tester/tsc.head
new file mode 100644
index 0000000..e41aefb
--- /dev/null
+++ b/ast/ast_tester/tsc.head
@@ -0,0 +1,116 @@
+SIMPLE = T
+BITPIX = -32 / IEEE (big-endian) 32-bit floating point data
+NAXIS = 2
+NAXIS1 = 1600
+NAXIS2 = 1600
+BUNIT = 'JY/BEAM '
+CTYPE1 = 'RA---TSC'
+CRPIX1 = 1000
+CDELT1 = -3.666666666667E-01
+CRVAL1 = 0.000000000000E+00
+CTYPE2 = 'DEC--TSC'
+CRPIX2 = 800
+CDELT2 = 3.666666666667E-01
+CRVAL2 = -9.000000000000E+01
+LONPOLE = 1.800000000000E+02 / Native longitude of celestial pole
+LATPOLE = 0.000000000000E+00 / Native latitude of celestial pole
+EQUINOX = 2.000000000000E+03 / Equinox of equatorial coordinates
+BMAJ = 2.399999936422E-01 / Beam major axis in degrees
+BMIN = 2.399999936422E-01 / Beam minor axis in degrees
+BPA = 0.000000000000E+00 / Beam position angle in degrees
+RESTFREQ= 1.420405750000E+09 / Line rest frequency, Hz
+HISTORY Parkes Multibeam continuum map
+HISTORY Formed on Mon 2004/02/09 02:23:02 GMT by "pksgridzilla" which was
+HISTORY compiled on Feb 9 2004 12:08:02 (local time) within
+HISTORY AIPS++ version 19.405.00 dated .
+HISTORY Polarization mode: A and B aggregated
+HISTORY Gridding parameters:
+HISTORY Method: WGTMED
+HISTORY Clip fraction: 0.000
+HISTORY Tsys weighting: applied
+HISTORY Beam weight order: 1
+HISTORY Beam FWHM: 14.4 arcmin
+HISTORY Beam normalization: applied
+HISTORY Smoothing kernel type: TOP-HAT
+HISTORY Kernel FWHM: 12.0 arcmin
+HISTORY Cutoff radius: 6.0 arcmin
+HISTORY Beam RSS cutoff: 0.0
+HISTORY Input data sets:
+HISTORY 97-10-09_0356_193558-66_206a.sdfits
+HISTORY 97-10-12_0142_182123-66_193a.sdfits
+HISTORY 97-10-12_0151_182707-66_194a.sdfits
+HISTORY 97-10-12_0200_183252-66_195a.sdfits
+HISTORY 97-11-07_0510_183836-66_196a.sdfits
+HISTORY 97-11-07_0519_184420-66_197a.sdfits
+HISTORY 97-11-07_0528_185004-66_198a.sdfits
+HISTORY 97-11-07_0537_185548-66_199a.sdfits
+HISTORY 97-11-07_0546_190132-66_200a.sdfits
+HISTORY 97-11-07_0556_190717-66_201a.sdfits
+HISTORY 97-11-07_0645_191301-66_202a.sdfits
+HISTORY 97-11-07_0654_191845-66_203a.sdfits
+HISTORY 97-11-07_0703_192429-66_204a.sdfits
+HISTORY 97-11-07_0712_193013-66_205a.sdfits
+HISTORY 97-11-07_0724_194142-66_207a.sdfits
+HISTORY 97-11-18_0256_193815-66_206c.sdfits
+HISTORY 97-11-18_0306_194359-66_207c.sdfits
+HISTORY 97-11-19_0447_182341-66_193c.sdfits
+HISTORY 97-11-19_0456_182925-66_194c.sdfits
+HISTORY 97-11-19_0507_190350-66_200c.sdfits
+HISTORY 97-11-19_0516_190934-66_201c.sdfits
+HISTORY 97-11-19_0525_191519-66_202c.sdfits
+HISTORY 97-11-19_0534_192103-66_203c.sdfits
+HISTORY 97-11-19_0544_192647-66_204c.sdfits
+HISTORY 97-11-19_0553_193231-66_205c.sdfits
+HISTORY 97-11-19_0602_183509-66_195c.sdfits
+HISTORY 97-11-19_0612_184053-66_196c.sdfits
+HISTORY 97-11-19_0622_184638-66_197c.sdfits
+HISTORY 97-11-19_0631_185222-66_198c.sdfits
+HISTORY 97-11-19_0640_185806-66_199c.sdfits
+HISTORY 98-03-24_2107_193706-66_206b.sdfits
+HISTORY 98-03-24_2116_194251-66_207b.sdfits
+HISTORY 98-03-25_2020_190826-66_201b.sdfits
+HISTORY 98-03-25_2029_191410-66_202b.sdfits
+HISTORY 98-03-25_2038_191954-66_203b.sdfits
+HISTORY 98-03-25_2047_192538-66_204b.sdfits
+HISTORY 98-03-25_2056_193122-66_205b.sdfits
+HISTORY 98-03-26_2048_190459-66_200d.sdfits
+HISTORY 98-03-27_2034_191627-66_202d.sdfits
+HISTORY 98-03-27_2043_192212-66_203d.sdfits
+HISTORY 98-03-27_2052_192756-66_204d.sdfits
+HISTORY 98-03-27_2102_193340-66_205d.sdfits
+HISTORY 98-03-27_2111_193924-66_206d.sdfits
+HISTORY 98-03-27_2120_194508-66_207d.sdfits
+HISTORY 98-03-27_2130_191043-66_201d.sdfits
+HISTORY 98-05-10_2123_182232-66_193b.sdfits
+HISTORY 98-05-10_2133_182816-66_194b.sdfits
+HISTORY 98-05-10_2142_183400-66_195b.sdfits
+HISTORY 98-05-10_2151_183945-66_196b.sdfits
+HISTORY 98-05-10_2200_184529-66_197b.sdfits
+HISTORY 98-05-10_2209_185113-66_198b.sdfits
+HISTORY 98-05-10_2219_185657-66_199b.sdfits
+HISTORY 98-05-10_2228_190241-66_200b.sdfits
+HISTORY 98-05-13_2132_182450-66_193d.sdfits
+HISTORY 98-05-13_2151_183034-66_194d.sdfits
+HISTORY 98-05-13_2200_183618-66_195d.sdfits
+HISTORY 98-05-13_2210_184202-66_196d.sdfits
+HISTORY 98-05-13_2219_184746-66_197d.sdfits
+HISTORY 98-05-13_2228_185331-66_198d.sdfits
+HISTORY 98-05-13_2237_185915-66_199d.sdfits
+HISTORY 98-05-25_1711_182559-66_193e.sdfits
+HISTORY 98-05-25_1720_183143-66_194e.sdfits
+HISTORY 98-05-25_1729_183727-66_195e.sdfits
+HISTORY 98-05-25_1738_184311-66_196e.sdfits
+HISTORY 98-05-25_1747_184855-66_197e.sdfits
+HISTORY 98-05-25_1756_185439-66_198e.sdfits
+HISTORY 98-05-25_1806_190024-66_199e.sdfits
+HISTORY 98-05-25_1815_190608-66_200e.sdfits
+HISTORY 98-05-25_1824_191152-66_201e.sdfits
+HISTORY 98-05-25_1833_191736-66_202e.sdfits
+HISTORY 98-05-25_1842_192320-66_203e.sdfits
+HISTORY 98-05-25_1851_192905-66_204e.sdfits
+HISTORY 98-05-25_1901_193449-66_205e.sdfits
+HISTORY 98-05-25_1910_194033-66_206e.sdfits
+HISTORY 98-05-25_1919_194617-66_207e.sdfits
+HISTORY Original FITS filename "1904-66_TSC.continuum.fits".
+HISTORY Noise level of continuum map: 61 mJy (RMS)
+END
diff --git a/ast/ast_tester/wcsconverter.f b/ast/ast_tester/wcsconverter.f
new file mode 100644
index 0000000..9af2e30
--- /dev/null
+++ b/ast/ast_tester/wcsconverter.f
@@ -0,0 +1,222 @@
+ PROGRAM WCSCONVERTER
+
+* Usage:
+* WCSCONVERTER <in file> <encoding> <out file> <attrs>
+
+* Description:
+* Reads a FrameSet from "in file" (as a FITS header if possible,
+* otherwise as an AST dump of a FrameSet), and writes out the
+* FrameSet to "out file" using the specified encoding.
+
+* Parameters:
+* in file
+* A text file containing fits headers or an AST dump of a FrameSet.
+* encoding
+* The name of a FITS encoding (e.g. "FITS-WCS", "NATIVE", etc), or
+* "AST".
+* out file
+* The output file. Contains an AST dump of the FrameSet if
+* "encoding" is "AST", or a set of FITS header cards otherwise.
+* attrs
+* A list of attribute settings to apply to the FitsChan before
+* reading the input headers.
+
+
+ IMPLICIT NONE
+ INCLUDE 'AST_PAR'
+ EXTERNAL SOURCE, SINK
+
+ INTEGER STATUS, FC, OBJECT, IARGC, CHAN, CHR_LEN, OC
+ CHARACTER FILE*80, OFILE*80, LINE*255, ENCODING*50
+ CHARACTER ATTRS*200
+ LOGICAL CDM
+
+ STATUS = 0
+*
+* Check command line arguments have been supplied.
+*
+ IF( IARGC() .LT. 3 ) THEN
+ WRITE(*,*) 'Usage: wcsconverter <in file> <encoding> '//
+ : '<out file> <attrs>'
+ RETURN
+ END IF
+
+*
+* Use object caching to minimise allocation of new memory
+*
+ OC = AST_TUNE( 'ObjectCaching', 1, STATUS )
+ IF( OC .NE. 0 ) THEN
+ WRITE(*,'(A,I6)') 'Default ObjectCaching VALUE is ',OC
+ END IF
+
+ IF( AST_TUNE( 'ObjectCaching', AST__TUNULL, STATUS ) .NE. 1 ) THEN
+ WRITE(*,'(A,I6)') 'Set ObjectCaching VALUE is ',OC
+ END IF
+
+*
+* Create a FitsChan to store the FITS headers.
+*
+ FC = AST_FITSCHAN( AST_NULL, AST_NULL, ' ', STATUS )
+
+*
+* Apply any attribute settings to the FitsChan.
+*
+ IF( IARGC() .EQ. 4 ) THEN
+ CALL GETARG( 4, ATTRS )
+ CALL AST_SET( FC, ATTRS, STATUS )
+ ELSE
+ ATTRS = ' '
+ END IF
+
+*
+* Open the input text file.
+*
+ CALL GETARG( 1, FILE )
+ OPEN( UNIT=10, FILE=FILE, STATUS='OLD' )
+
+*
+* Read each line out of the text file and store it in the FitsChan.
+*
+ CALL ERR_MARK
+ DO WHILE( .TRUE. )
+ READ( 10, '(A)', END = 10 ) LINE
+ CALL AST_PUTFITS( FC, LINE, 0, STATUS )
+ END DO
+
+ 10 CLOSE( 10 )
+
+*
+* Set the value of CDMatrix, unless it has already been set.
+*
+ IF( .NOT. AST_TEST( FC, 'CDMATRIX', STATUS ) ) THEN
+ CDM = AST_GETL( FC, 'CDMATRIX', STATUS )
+ CALL AST_SETL( FC, 'CDMATRIX', CDM, status )
+ END IF
+
+*
+* Attempt to read an Object form the FitsChan.
+*
+ CALL AST_CLEAR( FC, 'CARD', STATUS )
+ OBJECT = AST_READ( FC, STATUS )
+
+ IF( STATUS .NE. 0 ) CALL ERR_ANNUL( STATUS )
+ CALL ERR_RLSE
+
+* If no object was read, attempt to read an object from the text file as
+* an AST dump.
+ IF( OBJECT .EQ. AST__NULL ) THEN
+ CALL AST_ANNUL( FC, STATUS )
+ OPEN( UNIT=10, FILE=FILE, STATUS='OLD' )
+ CHAN = AST_CHANNEL( SOURCE, AST_NULL, ' ', STATUS )
+ OBJECT = AST_READ( CHAN, STATUS )
+ CALL AST_ANNUL( CHAN, STATUS )
+ CLOSE( 10 )
+ END IF
+
+*
+* Abort if no object was read.
+*
+ IF( OBJECT .EQ. AST__NULL ) THEN
+ WRITE(*,*) 'wcsconverter: no WCS could be read from ',
+ : file( : chr_len( file ) )
+ RETURN
+
+
+*
+* Otherwise write out the object using the specified encoding.
+*
+ ELSE
+ CALL GETARG( 3, OFILE )
+ CALL DELETEFILE( OFILE )
+
+ CALL GETARG( 2, ENCODING )
+ IF( ENCODING .EQ. 'AST' .OR. ENCODING .EQ. 'ast' ) THEN
+ OPEN( UNIT=10, FILE=OFILE, STATUS='NEW' )
+ CHAN = AST_CHANNEL( AST_NULL, SINK, ' ', STATUS )
+ IF( AST_WRITE( CHAN, OBJECT, STATUS ) .NE. 1 ) THEN
+ WRITE(*,*) 'wcsconverter: WCS read from ',
+ : file( : chr_len( file ) ),' could not be '//
+ : 'converted to ',
+ : encoding( : chr_len(encoding ) ),' format.'
+ END IF
+ CALL AST_ANNUL( CHAN, STATUS )
+ CLOSE( 10 )
+
+ ELSE
+ OPEN( UNIT=10, FILE=OFILE, STATUS='NEW' )
+ IF( FC .EQ. AST__NULL ) THEN
+ FC = AST_FITSCHAN( AST_NULL, AST_NULL, ATTRS, STATUS )
+ END IF
+ CALL AST_SETC( FC, 'ENCODING', ENCODING, STATUS )
+ CALL AST_CLEAR( FC, 'CARD', STATUS )
+
+ IF( AST_WRITE( FC, OBJECT, STATUS ) .NE. 1 ) THEN
+ WRITE(*,*) 'wcsconverter: WCS read from ',
+ : file( : chr_len( file ) ),' could not be '//
+ : 'converted to ',
+ : encoding( : chr_len(encoding ) ),' format.'
+ ELSE
+ CALL AST_CLEAR( FC, 'CARD', STATUS )
+ DO WHILE( AST_FINDFITS( FC, '%f', LINE, .TRUE.,
+ : STATUS ) )
+ WRITE(10,'(A)') LINE( : 80 )
+ END DO
+ END IF
+ CLOSE( 10 )
+
+ CALL AST_ANNUL( FC, STATUS )
+
+
+ END IF
+ CALL AST_ANNUL( OBJECT, STATUS )
+ END IF
+
+
+ END
+
+
+*
+* Delete a file if it exists.
+*
+ SUBROUTINE DELETEFILE( FILNAM )
+ IMPLICIT NONE
+
+ CHARACTER FILNAM*(*)
+ LOGICAL EXISTS
+
+ INQUIRE ( FILE = FILNAM,
+ : EXIST = EXISTS )
+
+ IF( EXISTS ) THEN
+ OPEN ( UNIT=10, FILE=FILNAM, STATUS='OLD' )
+ CLOSE ( 10, STATUS='DELETE' )
+ END IF
+
+ END
+
+
+*
+* SOURCE FUNCTION FOR AST_CHANNEL.
+*
+ SUBROUTINE SOURCE( STATUS )
+ IMPLICIT NONE
+ INTEGER STATUS
+ CHARACTER BUFFER*200
+ READ( 10, '(A)', END=99 ) BUFFER
+ CALL AST_PUTLINE( BUFFER, LEN( BUFFER ), STATUS )
+ RETURN
+ 99 CALL AST_PUTLINE( BUFFER, -1, STATUS )
+ END
+
+*
+* SINK FUNCTION FOR AST_CHANNEL.
+*
+ SUBROUTINE SINK( STATUS )
+ IMPLICIT NONE
+ INTEGER STATUS, L
+ CHARACTER BUFFER*200
+
+ CALL AST_GETLINE( BUFFER, L, STATUS )
+ IF( L .GT. 0 ) WRITE( 10, '(A)' ) BUFFER( : L )
+
+ END
diff --git a/ast/ast_tester/zpn.attr b/ast/ast_tester/zpn.attr
new file mode 100644
index 0000000..d74badf
--- /dev/null
+++ b/ast/ast_tester/zpn.attr
@@ -0,0 +1 @@
+tol=0.0001
diff --git a/ast/ast_tester/zpn.box b/ast/ast_tester/zpn.box
new file mode 100644
index 0000000..ee14a3a
--- /dev/null
+++ b/ast/ast_tester/zpn.box
@@ -0,0 +1 @@
+1 1 200.0 200.0
diff --git a/ast/ast_tester/zpn.head b/ast/ast_tester/zpn.head
new file mode 100644
index 0000000..a5e90af
--- /dev/null
+++ b/ast/ast_tester/zpn.head
@@ -0,0 +1,136 @@
+SIMPLE = T
+BITPIX = -32 / IEEE (big-endian) 32-bit floating point data
+NAXIS = 2
+NAXIS1 = 200
+NAXIS2 = 200
+BUNIT = 'JY/BEAM '
+CTYPE1 = 'RA---ZPN'
+CRPIX1 = 100
+CDELT1 = -6.666666666667E-02
+CRVAL1 = 0.000000000000E+00
+CTYPE2 = 'DEC--ZPN'
+CRPIX2 = 100
+CDELT2 = 6.666666666667E-02
+CRVAL2 = -9.000000000000E+01
+LONPOLE = 1.800000000000E+02 / Native longitude of celestial pole
+LATPOLE = -9.000000000000E+01 / Native latitude of celestial pole
+PV2_0 = 10.000000000000E-02 / Projection parameter 0
+PV2_1 = 9.750000000000E-01 / Projection parameter 1
+COMMENT PV2_2 = -8.070000000000E-01 / Projection parameter 2
+COMMENT PV2_3 = 3.370000000000E-01 / Projection parameter 3
+COMMENT PV2_4 = -6.500000000000E-02 / Projection parameter 4
+COMMENT PV2_5 = 1.000000000000E-02 / Projection parameter 5
+COMMENT PV2_6 = 3.000000000000E-03 / Projection parameter 6
+COMMENT PV2_7 = -1.000000000000E-03 / Projection parameter 7
+COMMENT PV2_8 = 0.000000000000E+00 / Projection parameter 8
+COMMENT PV2_9 = 0.000000000000E+00 / Projection parameter 9
+COMMENT PV2_10 = 0.000000000000E+00 / Projection parameter 10
+COMMENT PV2_11 = 0.000000000000E+00 / Projection parameter 11
+COMMENT PV2_12 = 0.000000000000E+00 / Projection parameter 12
+COMMENT PV2_13 = 0.000000000000E+00 / Projection parameter 13
+COMMENT PV2_14 = 0.000000000000E+00 / Projection parameter 14
+COMMENT PV2_15 = 0.000000000000E+00 / Projection parameter 15
+COMMENT PV2_16 = 0.000000000000E+00 / Projection parameter 16
+COMMENT PV2_17 = 0.000000000000E+00 / Projection parameter 17
+COMMENT PV2_18 = 0.000000000000E+00 / Projection parameter 18
+COMMENT PV2_19 = 0.000000000000E+00 / Projection parameter 19
+EQUINOX = 2.000000000000E+03 / Equinox of equatorial coordinates
+BMAJ = 2.399999936422E-01 / Beam major axis in degrees
+BMIN = 2.399999936422E-01 / Beam minor axis in degrees
+BPA = 0.000000000000E+00 / Beam position angle in degrees
+RESTFREQ= 1.420405750000E+09 / Line rest frequency, Hz
+HISTORY Parkes Multibeam continuum map
+HISTORY Formed on Mon 2004/02/09 01:38:20 GMT by "pksgridzilla" which was
+HISTORY compiled on Feb 9 2004 12:08:02 (local time) within
+HISTORY AIPS++ version 19.405.00 dated .
+HISTORY Polarization mode: A and B aggregated
+HISTORY Gridding parameters:
+HISTORY Method: WGTMED
+HISTORY Clip fraction: 0.000
+HISTORY Tsys weighting: applied
+HISTORY Beam weight order: 1
+HISTORY Beam FWHM: 14.4 arcmin
+HISTORY Beam normalization: applied
+HISTORY Smoothing kernel type: TOP-HAT
+HISTORY Kernel FWHM: 12.0 arcmin
+HISTORY Cutoff radius: 6.0 arcmin
+HISTORY Beam RSS cutoff: 0.0
+HISTORY Input data sets:
+HISTORY 97-10-09_0356_193558-66_206a.sdfits
+HISTORY 97-10-12_0142_182123-66_193a.sdfits
+HISTORY 97-10-12_0151_182707-66_194a.sdfits
+HISTORY 97-10-12_0200_183252-66_195a.sdfits
+HISTORY 97-11-07_0510_183836-66_196a.sdfits
+HISTORY 97-11-07_0519_184420-66_197a.sdfits
+HISTORY 97-11-07_0528_185004-66_198a.sdfits
+HISTORY 97-11-07_0537_185548-66_199a.sdfits
+HISTORY 97-11-07_0546_190132-66_200a.sdfits
+HISTORY 97-11-07_0556_190717-66_201a.sdfits
+HISTORY 97-11-07_0645_191301-66_202a.sdfits
+HISTORY 97-11-07_0654_191845-66_203a.sdfits
+HISTORY 97-11-07_0703_192429-66_204a.sdfits
+HISTORY 97-11-07_0712_193013-66_205a.sdfits
+HISTORY 97-11-07_0724_194142-66_207a.sdfits
+HISTORY 97-11-18_0256_193815-66_206c.sdfits
+HISTORY 97-11-18_0306_194359-66_207c.sdfits
+HISTORY 97-11-19_0447_182341-66_193c.sdfits
+HISTORY 97-11-19_0456_182925-66_194c.sdfits
+HISTORY 97-11-19_0507_190350-66_200c.sdfits
+HISTORY 97-11-19_0516_190934-66_201c.sdfits
+HISTORY 97-11-19_0525_191519-66_202c.sdfits
+HISTORY 97-11-19_0534_192103-66_203c.sdfits
+HISTORY 97-11-19_0544_192647-66_204c.sdfits
+HISTORY 97-11-19_0553_193231-66_205c.sdfits
+HISTORY 97-11-19_0602_183509-66_195c.sdfits
+HISTORY 97-11-19_0612_184053-66_196c.sdfits
+HISTORY 97-11-19_0622_184638-66_197c.sdfits
+HISTORY 97-11-19_0631_185222-66_198c.sdfits
+HISTORY 97-11-19_0640_185806-66_199c.sdfits
+HISTORY 98-03-24_2107_193706-66_206b.sdfits
+HISTORY 98-03-24_2116_194251-66_207b.sdfits
+HISTORY 98-03-25_2020_190826-66_201b.sdfits
+HISTORY 98-03-25_2029_191410-66_202b.sdfits
+HISTORY 98-03-25_2038_191954-66_203b.sdfits
+HISTORY 98-03-25_2047_192538-66_204b.sdfits
+HISTORY 98-03-25_2056_193122-66_205b.sdfits
+HISTORY 98-03-26_2048_190459-66_200d.sdfits
+HISTORY 98-03-27_2034_191627-66_202d.sdfits
+HISTORY 98-03-27_2043_192212-66_203d.sdfits
+HISTORY 98-03-27_2052_192756-66_204d.sdfits
+HISTORY 98-03-27_2102_193340-66_205d.sdfits
+HISTORY 98-03-27_2111_193924-66_206d.sdfits
+HISTORY 98-03-27_2120_194508-66_207d.sdfits
+HISTORY 98-03-27_2130_191043-66_201d.sdfits
+HISTORY 98-05-10_2123_182232-66_193b.sdfits
+HISTORY 98-05-10_2133_182816-66_194b.sdfits
+HISTORY 98-05-10_2142_183400-66_195b.sdfits
+HISTORY 98-05-10_2151_183945-66_196b.sdfits
+HISTORY 98-05-10_2200_184529-66_197b.sdfits
+HISTORY 98-05-10_2209_185113-66_198b.sdfits
+HISTORY 98-05-10_2219_185657-66_199b.sdfits
+HISTORY 98-05-10_2228_190241-66_200b.sdfits
+HISTORY 98-05-13_2132_182450-66_193d.sdfits
+HISTORY 98-05-13_2151_183034-66_194d.sdfits
+HISTORY 98-05-13_2200_183618-66_195d.sdfits
+HISTORY 98-05-13_2210_184202-66_196d.sdfits
+HISTORY 98-05-13_2219_184746-66_197d.sdfits
+HISTORY 98-05-13_2228_185331-66_198d.sdfits
+HISTORY 98-05-13_2237_185915-66_199d.sdfits
+HISTORY 98-05-25_1711_182559-66_193e.sdfits
+HISTORY 98-05-25_1720_183143-66_194e.sdfits
+HISTORY 98-05-25_1729_183727-66_195e.sdfits
+HISTORY 98-05-25_1738_184311-66_196e.sdfits
+HISTORY 98-05-25_1747_184855-66_197e.sdfits
+HISTORY 98-05-25_1756_185439-66_198e.sdfits
+HISTORY 98-05-25_1806_190024-66_199e.sdfits
+HISTORY 98-05-25_1815_190608-66_200e.sdfits
+HISTORY 98-05-25_1824_191152-66_201e.sdfits
+HISTORY 98-05-25_1833_191736-66_202e.sdfits
+HISTORY 98-05-25_1842_192320-66_203e.sdfits
+HISTORY 98-05-25_1851_192905-66_204e.sdfits
+HISTORY 98-05-25_1901_193449-66_205e.sdfits
+HISTORY 98-05-25_1910_194033-66_206e.sdfits
+HISTORY 98-05-25_1919_194617-66_207e.sdfits
+HISTORY Original FITS filename "1904-66_ZPN.continuum.fits".
+HISTORY Noise level of continuum map: 61 mJy (RMS)
+END
diff --git a/ast/ast_tester/zpx.attr b/ast/ast_tester/zpx.attr
new file mode 100644
index 0000000..f073d5c
--- /dev/null
+++ b/ast/ast_tester/zpx.attr
@@ -0,0 +1 @@
+Grid=1,style(grid1)=2,size(textlab2)=2
diff --git a/ast/ast_tester/zpx.head b/ast/ast_tester/zpx.head
new file mode 100644
index 0000000..a69353a
--- /dev/null
+++ b/ast/ast_tester/zpx.head
@@ -0,0 +1,153 @@
+SIMPLE = T / Fits standard
+BITPIX = 16 / Bits per pixel
+NAXIS = 2 / Number of axes
+NAXIS1 = 2048 / Axis length
+NAXIS2 = 4100 / Axis length
+BSCALE = 1.145669E0 / REAL = TAPE*BSCALE + BZERO
+BZERO = 3.793600E4 /
+EXTEND = F / File may contain extensions
+IRAF-TLM= '14:31:18 (18/05/1999)' / Time of last modification
+OBJECT = 'VIRGO311' /
+ORIGIN = 'KPNO-IRAF' /
+DATE = '19/05/99' /
+IRAFNAME= 'iraf3432b' / NAME OF IRAF IMAGE FILE
+IRAF-MAX= 7.546810E4 / DATA MAX
+IRAF-MIN= 4.038996E2 / DATA MIN
+IRAF-BPX= 64 / DATA BITS/PIXEL
+IRAFTYPE= 'DOUBLE ' / PIXEL TYPE
+ORIGIN = 'NOAO-IRAF FITS Image Kernel Aug 1 1997' / FITS file originator
+DATE = '18/05/99' / Date FITS file was generated
+RUN = 158500 / Run number
+SYSVER = 's7-1 ' / Version of observing system
+OBSERVAT= 'LAPALMA ' / Name of observatory (IRAF style)
+OBSTYPE = 'TARGET ' / Type of observation, eg. ARC
+IMAGETYP= 'TARGET ' / Type of observation, eg. ARC
+CTYPE1 = 'RA---ZPX' / Type of coordinate on axis 1
+CTYPE2 = 'DEC--ZPX' / Type of coordinate on axis 2
+CRPIX1 = -319.077517318151 / Reference pixel on axis 1
+CRPIX2 = 3035.64982635572 / Reference pixel on axis 2
+CRVAL1 = 187.8708 / Value at ref. pixel on axis 1
+CRVAL2 = 12.40001 / Value at ref. pixel on axis 2
+CD1_1 = -1.5845078730445E-6 / Transformation matrix
+CD1_2 = -9.2521190078722E-5 / Transformation matrix
+CD2_1 = -9.2538856101295E-5 / Transformation matrix
+CD2_2 = 1.63254208024377E-6 / Transformation matrix
+LATITUDE= 28.762000 / Telescope latitude (degrees), +28:45:43.2
+LONGITUD= 17.877639 / Telescope longitude (degrees), +17:52:39.5
+HEIGHT = 2348 / [m] Height above sea level.
+SLATEL = 'LPO2.5 ' / Telescope name known to SLALIB
+TELESCOP= 'INT ' / 2.5m Isaac Newton Telescope
+TELSTAT = 'GUIDING ' / Telescope status: TRACKING or GUIDING normally.
+RA = ' 12:31:28.998' / RA (187.8708261822271200 degrees)
+DEC = '+12:24:00.04' / DEC ( 12.4000109941873690 degrees)
+EQUINOX = '2000. ' / Equinox of coordinates
+RADECSYS= 'FK5 ' / mean place new (after the 1976 IAU) system
+XAPNOM = 0.0000000000 / nominal aperture in x (0.00 arcsec)
+YAPNOM = 0.0000000000 / nominal aperture in y (0.00 arcsec)
+XAPOFF = 0.0000000000 / total aperture offset in x (0.00 arcsec)
+YAPOFF = 0.0000000000 / total aperture offset in y (0.00 arcsec)
+MJD-OBS = 51277.9941545 / Modified Julian Date of midtime of observation
+JD = 2451278.4941545 / Julian Date of midtime of observation
+STSTART = ' 11:44:54.8' / Local sidereal time at start of observation
+ST = ' 11:44:54.8' / Local sidereal time at start of observation
+AZIMUTH = 148.155505 / Mean azimuth of observation (degrees)
+ZD = 18.907242 / Mean zenith-distance of observation (degrees)
+FSTATION= 'PRIME ' / Focal station of observation
+PLATESCA= 6.856013 / [d/m] Platescale ( 24.68arcsec/mm)
+TELFOCUS= 0.045998 / Telescope focus (metres)
+ROTTRACK= T / Rotator always tracks sky on equatorial mount
+ROTSKYPA= 179.899970 / Turntable position angle (degrees)
+PARANGLE= 331.834373 / Parallactic angle at observation midpoint
+VIGNETTE= F / Can we see out?
+DOMEAZ = 147.089879 / Mean dome azimuth during observation
+AIRMASS = 1.056698 / Effective mean airmass
+TEMPTUBE= 9.005279 / Truss Temperature (degrees Celsius)
+CAT-NAME= 'VIRGO311' / Target input-catalogue name
+CAT-RA = ' 12:31:29.000' / Target Right Ascension
+CAT-DEC = '+12:24:00.00' / Target Declination
+CAT-EQUI= 'J2000.00' / Equinox of target coordinates
+CAT-EPOC= 2000.00 / Target epoch of proper motions
+PM-RA = 0.000000 / Target proper-motion RA (sec time/year)
+PM-DEC = 0.000000 / Target proper-motion (sec arc/year)
+PARALLAX= 0.000000 / Target Parallax (arcsec)
+RADVEL = 0.000000 / Target radial velocity (km/s)
+RATRACK = 0.000000 / Differential-tracking rate RA (arcsec/sec)
+DECTRACK= 0.000000 / Differential-tracking rate Dec (arcsec/sec)
+INSTRUME= 'WFC ' / INT wide-field camera is in use.
+WFFPOS = 1 / Position-number of deployed filter
+WFFBAND = 'B ' / Waveband of filter
+WFFPSYS = 'Kitt Peak ' / Photometric system of filter
+WFFID = '210 ' / Unique identifier of filter
+SECPPIX = 0.333 / Arcseconds per pixel
+UTSTART = '23:45:20.1 ' / UTC of start of observation
+ELAPSED = 749.340 / Length of observation including pauses
+DARKTIME= 749.340 / Length of observation including pauses
+EXPOSED = 749.340 / Length of observation excluding pauses
+EXPTIME = 749.340 / Length of observation excluding pauses
+DATE-OBS= '1999-04-09 ' / UTC date start of observation
+DETECTOR= 'MOS1 ' / Name of the detector
+PREFLASH= 0.000 / Length of Preflash in seconds
+BUNIT = 'ADU ' / Unit of the array of image data
+GAIN = 2.900 / Electrons per ADU
+READNOIS= 12.000 / Readout noise in electrons per pix
+CCDSPEED= 'TURBO ' / Readout speed of the CCD
+CCDNCHIP= 1 / Number of CCDs in this head
+CCDCHIP = 1 / Head number of this CCD
+CCDTYPE = 'EEV42 ' / Type of CCD used in this detector
+CCDXSIZE= 2148 / X Size in pixels of digitised frame
+CCDYSIZE= 4128 / Y Size in pixels of digitised frame
+CCDXIMSI= 2048 / X Size of useful imaging area
+CCDYIMSI= 4100 / Y Size of useful imaging area
+CCDXIMST= 50 / X Start pixel of useful imaging area
+CCDYIMST= 0 / Y Start pixel of useful imaging area
+CCDWMODE= F / True is windows are enabled
+CCDWXO1 = 0 / Offset of window 1 in X
+CCDWYO1 = 0 / Offset of window 1 in Y
+CCDWXS1 = 0 / Size of window 1 in X
+CCDWYS1 = 0 / Size of window 1 in Y
+CCDWXO2 = 0 / Offset of window 2 in X
+CCDWYO2 = 0 / Offset of window 2 in Y
+CCDWXS2 = 0 / Size of window 2 in X
+CCDWYS2 = 0 / Size of window 2 in Y
+CCDWXO3 = 0 / Offset of window 3 in X
+CCDWYO3 = 0 / Offset of window 3 in Y
+CCDWXS3 = 0 / Size of window 3 in X
+CCDWYS3 = 0 / Size of window 3 in Y
+CCDWXO4 = 0 / Offset of window 4 in X
+CCDWYO4 = 0 / Offset of window 4 in Y
+CCDWXS4 = 0 / Size of window 4 in X
+CCDWYS4 = 0 / Size of window 4 in Y
+CCDXPIXE= 1.350000e-05 / Size in meters of the pixels, in X
+CCDYPIXE= 1.350000e-05 / Size in meters of the pixels, in Y
+CCDXBIN = 1 / Binning factor, in X
+CCDYBIN = 1 / Binning factor, in Y
+CCDSTEMP= 153 / Required temperature of CCD, in Kevlin
+CCDATEMP= 154 / Actual temperature of CCD, in Kevlin
+CHIPNAME= 'A5506-4 ' / Name of CCD chip
+DASCHAN = 1 / DAS channel
+WINSEC1 = '[0:0,0:0] ' / Readout window 1
+WINSEC2 = '[0:0,0:0] ' / Readout window 2
+WINSEC3 = '[0:0,0:0] ' / Readout window 3
+WINSEC4 = '[0:0,0:0] ' / Readout window 4
+HISTORY This is the end of the header written by the ING observing-system.
+WAT0_001= 'system=image'
+WAT1_001= 'wtype=zpx axtype=ra projp1=6.0 projp2=100.0 projp3=2059.8'
+WAT2_001= 'wtype=zpx axtype=dec projp1=1.0 projp3=-1000.8'
+WFCWCS = 'Done '
+IMDTOI = 'Done '
+WCSDIM = 2
+LTM1_1 = 1.
+LTM2_2 = 1.
+TRIM = 'May 18 13:12 Trim data section is [51:2098,1:4100]'
+BP-FLAG = 'May 18 13:12 Bad pixel file is /home/jrl/wfcred/stds/A5506-4.bad'
+BT-FLAG = 'May 18 13:12 Overscan section is [1:50,1:4128] with mean=1501.636'
+BI-FLAG = 'May 18 13:12 Zero level correction image is /data/cass03a/was/mframe'
+FF-FLAG = 'May 18 13:12 Flat field image is /data/cass03c/was/mframes/B_9269342'
+ILLUMCOR= 'May 18 13:12 Illumination image is tmpill.pl with scale=0.9314932'
+CCDSEC = '[51:2098,1:4100]'
+LTV1 = -50.
+CCDPROC = 'May 18 13:12 CCD processing done'
+XIRMS = 0.3418021
+ETARMS = 0.2019652
+WFCREDVR= 'v0.1 '
+END