(3) Spectral estimation and xy-plots

In this example we will show how to use the GMT programs fitcircle, project, sample1d, spectrum1d, plot, and text. Suppose you have (lon, lat, gravity) along a satellite track in a file called sat.xyg, and (lon, lat, gravity) along a ship track in a file called ship.xyg. You want to make a cross-spectral analysis of these data. First, you will have to get the two data sets into equidistantly sampled time-series form. To do this, it will be convenient to project these along the great circle that best fits the sat track. We must use fitcircle to find this great circle and choose the L2 estimates of best pole. We project the data using project to find out what their ranges are in the projected coordinate. The gmtinfo utility will report the minimum and maximum values for multi-column ASCII tables. Use this information to select the range of the projected distance coordinate they have in common. The script prompts you for that information after reporting the values. We decide to make a file of equidistant sampling points spaced 1 km apart from -1167 to +1169, and use the UNIX utility awk to accomplish this step. We can then resample the projected data, and carry out the cross-spectral calculations, assuming that the ship is the input and the satellite is the output data. There are several intermediate steps that produce helpful plots showing the effect of the various processing steps (example_03[a-f].ps), while the final plot example_03.ps shows the ship and sat power in one diagram and the coherency on another diagram, both on the same page. Note the extended use of text and plot to put labels and legends directly on the plots. For that purpose we often use -Jx1i and specify positions in inches directly. Thus, the complete automated script reads:

#!/usr/bin/env bash
#		GMT EXAMPLE 03
#
# Purpose:	Resample track data, do spectral analysis, and plot
# GMT modules:	filter1d, fitcircle, gmtconvert, gmtinfo, project, sample1d
# 		spectrum1d, plot, subplot, legend, math
# Unix progs:	rm
#
# This example begins with data files "ship_03.txt" and "sat_03.txt" which
# are measurements of a quantity "g" (a "gravity anomaly" which is an
# anomalous increase or decrease in the magnitude of the acceleration
# of gravity at sea level).  g is measured at a sequence of points "x,y"
# which in this case are "longitude,latitude".  The "sat_03.txt" data were
# obtained by a satellite and the sequence of points lies almost along
# a great circle.  The "ship_03.txt" data were obtained by a ship which
# tried to follow the satellite's path but deviated from it in places.
# Thus the two data sets are not measured at the same of points,
# and we use various GMT tools to facilitate their comparison.
#

gmt begin ex03
  gmt set GMT_FFT kiss
  # First, we use "gmt fitcircle" to find the parameters of a great circle
  # most closely fitting the x,y points in "sat_03.txt":
  cpos=`gmt fitcircle @sat_03.txt -L2 -Fm --IO_COL_SEPARATOR=/`
  ppos=`gmt fitcircle @sat_03.txt -L2 -Fn --IO_COL_SEPARATOR=/`
  # Now we use "gmt project" to project the data in both sat_03.txt and ship_03.txt
  # into data.pg, where g is the same and p is the oblique longitude around
  # the great circle.  We use -Q to get the p distance in kilometers, and -S
  # to sort the output into increasing p values.
  gmt project  @sat_03.txt -C$cpos -T$ppos -S -Fpz -Q > sat.pg
  gmt project @ship_03.txt -C$cpos -T$ppos -S -Fpz -Q > ship.pg
  bounds=`gmt info ship.pg sat.pg -I1 -Af -L -C -i0  --IO_COL_SEPARATOR=/`
  # Now we can use $bounds in gmt math to make a sampling points file for gmt sample1d:
  gmt math -T$bounds/1 -N1/0 T = samp.x
  # Now we can resample the gmt projected satellite data:
  gmt sample1d sat.pg -Tsamp.x > samp_sat.pg
  # For reasons above, we use gmt filter1d to pre-treat the ship data.  We also need to sample
  # it because of the gaps > 1 km we found.  So we use gmt filter1d | gmt sample1d.  We also
  # use the -E on gmt filter1d to use the data all the way out to bounds :
  gmt filter1d ship.pg -Fm1 -T$bounds/1 -E | gmt sample1d -Tsamp.x > samp_ship.pg
  # Now to do the cross-spectra, assuming that the ship is the input and the sat is the output
  # data, we do this:
  gmt convert -A samp_ship.pg samp_sat.pg -o1,3 | gmt spectrum1d -S256 -D1 -W -C -T
  # Time to plot spectra
  gmt set FONT_TAG 18p,Helvetica-Bold
  gmt subplot begin 2x1 -M0.1i -SCb+l"Wavelength (km)" -T"Ship and Satellite Gravity" -Fs4i/3.75i -A+jTR+o0.1i -BWeSn+g240/255/240 -X2i -Y1.5i
    gmt subplot set 0,0 -A"Input Power"
    gmt plot spectrum.xpower -JX-?l/?l -Bxa1f3p -Bya1f3p+l"Power (mGal@+2@+km)" -Gred -ST0.07i -R1/1000/0.1/10000 -Ey+p0.5p
    gmt plot spectrum.ypower -Gblue -Sc0.07i -Ey+p0.5p
    gmt legend -DjBL+w1.2i+o0.25i -F+gwhite+pthicker --FONT_ANNOT_PRIMARY=14p,Helvetica-Bold <<- EOF
	S 0.1i T 0.07i red  - 0.3i Ship
	S 0.1i c 0.07i blue - 0.3i Satellite
	EOF
    gmt subplot set 1,0 -A"Coherency@+2@+"
    gmt plot spectrum.coh -JX-?l/? -Bxa1f3p -Bya0.25f0.05+l"Coherency@+2@+" -R1/1000/0/1 -Sc0.07i -Gpurple -Ey+p0.5p
  gmt subplot end
gmt end
rm -f samp* *.pg spectrum.*

The final illustration shows that the ship gravity anomalies have more power than altimetry derived gravity for short wavelengths and that the coherency between the two signals improves dramatically for wavelengths > 20 km.

../_images/ex03.png

Spectral estimation and x=y-plots.