The National Virtual Observatory
2006 Summer School

IDL Mini-tutorial (C. Miller 09/07/06)

In this mini-tutorial session, we briefly describe how an astronomer can use IDL in a variety research environments, from image analysis to theoretical modelling, to phenomenological studies.

Documentation for IDL (6.2) is provided online here.
Documentation for IDL (6.3) is provided online by NASA Goddard.

GDL is the Gnu Data Language. It has a syntax identical to IDL.
GDL has functionality equivalent (in theory) to IDL 6.0. However,
it has not been fully tested. In all of the examples below, GDL
has been tested and works unless otherwise specified (noted in red).

Install:

Install IDL from the internet (~150Mb download) or from the CDs provided. The final installation is ~250MB.
INSTALL directions are provided on the CDROM in the WINDOWS, LINUX or MACOSX directory.
LINUX users can (safely?) ignore the symbolic link errors and web server locations. Follow the install directions.
It is easier from the superuser or ROOT account.
WINDOWS users: make sure the JAVA_BRIDGE option is selected.

If you want/need a license key, see C. Miller for instructions.

Import the LICENSE KEY and expiration date using the RSI License Manager :
LINUX: rsi/idl_6.3/bin/rsilicense   You might have to set the IDL_DIR environment
   (csh type== setenv IDL_DIR /idl_install_location or bash type IDL_DIR=/idl_install_location; export IDL_DIR)
OSX: rsi/idl_6.3/RSILicense.app
WINDOWS:

Select Evaluation License
Select (from Pulldown) IDL 6.3
Enter Date and KEY provided on the CDROM (or via email)

If you are using GDL, uncomment the line which contains the GDL_NEEDS dependencies.

Before using any of the IDL VO Libraries, users must type:
unix>source setup_idljava.csh (or .sh or .cmd for Windows).www.google.

Contents:

The Command-line
    Some Datatypes
    Some Built-in Functions
    Some Mathematical Relations
    Arrays/Matrices
    Some Commonly Used Commands
    Data I/O

The GUI (IDLDE)

Astronomy IDL Libraries/Resources
    Data I/O (again)
    Objects and Structures
    What Does that Routine Do?

Plot/Display
    Data
    Images

Programing Methods
    Batch
    Procedures
    Functions
    FOR Loops
    WHILE Loops
    IF THEN ELSE
    External Compiled Libraries

IDL and the VO
   SQL queries
   VOLib
   


The Command-line

To install IDL, download from www.rsinc.com and follow these instructions to install the NVOSS 2005 license.
To start IDL, type "idl" and any UNIX/Linux prompt, or start the IDL GUI (e.g., for Windows users). If you are using the GUI, the "command-line" is at the bottom of the window.

Datatypes

IDL supports more than a dozen of datatypes, including integers, long integers, floats, doubles, strings, etc.
Try the following examples. Note that IDL ignores capitalization.


IDL> A = 3*5
IDL> print, a
15
IDL> a = 2020
IDL> a = double(a); or a = float(a), or a = long(a), etc.
IDL> print, a
2020.0000
IDL> filename = '/home/user/nvoss05/root' + string(fix(a)) + '.fit'
IDL> print, filename
/home/user/idl/root 2020.fit
IDL> filename = '/home/user/nvoss05/cluster' + strtrim(string(fix(a)),2) + '.fit'
IDL> print, filename
/home/user/idl/cluster2020.fit


Some Built-in Mathematical Functions

These include: -,+,/,*,sin(), cos(), asin(), cosh(), sqrt(), a^2, alog10(), alog(), exp(), abs(). Note the datatype of the returned value.

Some IDL relations

<, <=, >, >=, =, != translate to lt, le, gt, ge, eq, ne (FORTANish)

Arrays and Matrices

IDL is row-major (like FORTRAN)

IDL> a = fltarr(2); or intarr(2), or dblarr(2), or strarr(2,2), etc
IDL> a = [5,3]
IDL> print, a[0]
5
IDL> a = fltarr(2)
IDL> a[1] = 2
IDL> print, a
0.00000 2.00000
IDL> a = [[2,2],[2,2]]
IDL> b = [[0.5,0.5],[0.5,0.5]]
IDL> print, a#b
2.00000 2.00000
2.00000 2.00000
IDL> print, a##b
2.00000 2.00000
2.00000 2.00000
IDL> d = [[1,5],[2,2]]

IDL> print, d##a; COLUMN-MAJOR
12 12
8 8
IDL> print, d#a; ROW-MAJOR
6 14
6 14


An example of IDL provide matrix manipulation is the ability to solve for Eignenvalues (and vectors) in a simple command line call:
IDL> evals = Eigenql(covar, Eigenvectors=evecs)

Some Commonly Used Commands

There are a number of commands that regular IDL users re-use often.

IDL> ra = findgen(360) & dec = findgen(360)/2.0 - 90.0 & z = findgen(360)/1800.0 & eps = 10
IDL> print, size(ra); # elements, size of each dimension, datatype, # elements
1 360 4 360
IDL> print, n_elements(ra)
360
IDL> result = where( (abs(ra - 180) le eps) and (abs(dec - 0) le eps) and z ge 0.05 and z le 0.095)
IDL> print, ra[result[0:1]], dec[result[0:1]], z[result[0:1]], format = '(6(1x,f12.8))'
170.00000000 171.00000000 -5.00000000 -4.50000000 0.09444445 0.09500000
IDL> result = randomu(seed, 100)
IDL> print, result[0:5]
0.139039 0.481758 0.594192 0.431110 0.854777 0.585114
IDL> result = randomn(seed, 100); or randomu(seed, 100, /normal)
IDL> print, mean(result)


Data Input/Output

IDL contains many methods to ready many types of data formats.
Common techniques include readf, readcol, rdfloat, and fits binary table readers (discussed below).

Similarly, IDL outputs data in a variety of formats using a variety of methods.
Common techniques include printf and fits table writers (discussed below).
IDL>$vi ascii_datafile.dat ; or $emacs ascii_datafile.dat
1 2 3 4 5 6 7 8 9 10
10 9 8 7 6 5 4 3 2 1
5 6 7 8 9 10 4 3 2 1
4 3 2 1 5 6 7 8 9 10
1 1 1 1 1 1 1 1 1 10
10 2 2 2 2 2 2 2 2 2
2 1 2 1 2 1 2 1 2 1
10 10 10 10 10 10 10 10 10 10
10 5 2 10 4 2 10 8 4 1
1 1 1 1 1 1 1 1 1 1
:wq ; or ctrl-q
IDL> openr, 1, 'ascii_datafile.dat'
IDL> delvarx, a
IDL> readf,1, a
IDL> print, a
IDL> 1.00000
IDL> close, 1
IDL> openr, 1, 'ascii_datafile.dat'
IDL> a = intarr(10, 10)
IDL> readf,1, a
IDL> print, a
1 2 3 4 5 6 7 8 9 10
10 9 8 7 6 5 4 3 2 1
5 6 7 8 9 10 4 3 2 1
4 3 2 1 5 6 7 8 9 10
1 1 1 1 1 1 1 1 1 10
10 2 2 2 2 2 2 2 2 2
2 1 2 1 2 1 2 1 2 1
10 10 10 10 10 10 10 10 10 10
10 5 2 10 4 2 10 8 4 1
1 1 1 1 1 1 1 1 1 1
IDL> close,1 ; or close, /all
IDL> openw,1, 'test_write.txt'
IDL> printf,1, 'Test for IDL file writing with PRINTF'
IDL> $more test_write.txt
Test for IDL file writing with PRINTF


The IDL GUI (IDLDE)


The Astronomy Libraries and Resources

The NASA Goddard Space Flight Center (GSFC) IDL astronomy libary (astrolib) is widely used.
For detailed descriptions of the available routines, please see:

http://idlastro.gsfc.nasa.gov/contents.html

For these to work, make sure your IDL_PATH contains the correct location of your ASTROLIB.

setenv IDL_PATH ${IDL_PATH}:+/Users/chrism/idl/astron_lib/pro


Below are some highlights of routines in ASTROLIB (you'll need this file in your working directory:( sdss_c4_dr2_published.fit)

IDL> tabledata = mrdfits('sdss_c4_dr2_published.fit',1,hdr, structyp='c4data'); NOTE structyp nneded for GDL
% Compiled module: VALID_NUM.
% Compiled module: REPCHR.
% Compiled module: GETTOK.
% Compiled module: FXPAR.
% Compiled module: FXMOVE.
% Compiled module: MRDFITS.
% Compiled module: EXPAND_TILDE.
% Compiled module: REPSTR.
% Compiled module: FXPOSIT.
% Compiled module: MRD_HREAD.
% Compiled module: MRD_SKIP.
% Compiled module: MATCH.
% Compiled module: IDL_VALIDNAME.
% Compiled module: MRD_STRUCT.
% Compiled module: LMGR.
% Compiled module: STRSPLIT.
MRDFITS: Binary table. 126 columns by 748 rows.
% Compiled module: IS_IEEE_BIG.
% Compiled module: IEEE_TO_HOST.
IDL> spawn, "echo $NVOSS_HOME", nvoss_home ;Puts the NVOSS home directory into a variable
IDL> image = readfits(nvoss_home+'/java/data/testr.fits',hdr)
IDL> hprint, hdr
IDL> extast, hdr, astr
IDL> help, /str,astr
** Structure <38d6c10>, 8 tags, length=112, data length=108, refs=1:
CD DOUBLE Array[2, 2]
CDELT DOUBLE Array[2]
CRPIX FLOAT Array[2]
CRVAL DOUBLE Array[2]
CTYPE STRING Array[2]
LONGPOLE FLOAT 180.000
PROJP1 FLOAT -1.00000
PROJP2 FLOAT -2.00000
IDL> print, lumdist()
% Compiled module: LUMDIST.
Syntax: result = lumdist(z, H0 = ,k=, Lambda0 = ])
Returns luminosity distance in Mpc
IDL> print, zang()
% Compiled module: ZANG.
Sytnax - angsiz = zang( dl, z, [H0 =, Omega_m =, Lambda0 = , q0 = , k =, /SILENT])
IDL> tabledata = mrdfits('sdss_c4_dr2_published.fit',1,hdr, structyp='c4data'); NOTE structyp nneded for GDL
IDL> result = robust_linefit(alog10(tabledata.lum_r), alog10(tabledata.biwt1500), $
IDL> yfit, sig, coef_sig)
IDL> plot, alog10(tabledata.lum_r), yfit, psym=-3
IDL> oplot, alog10(tabledata.lum_r), alog10(tabledata.biwt1500), psym=3
IDL> h = histogram(tabledata.z, binsize=0.004, omin=omin, max=0.4, min=0.)
IDL> plothist,tabledata.z,bin=0.004

The following ASTROLIB libraries are given as examples. These are just a sampling of what is
available. All of these libraries work with IDL 6.0+. Those libraries in RED DO NOT work in GDL.

  • Astronomical Utilities
    A_b() Compute B band interstellar extinction as a function of Galactic coords.
    ADSTRING() Format RA and DEC as a character string
    DAYCNV Convert from Julian Date to calendar date.
    PREMAT() Returns precession matrix from equinox 1 to equinox 2
    SUNPOS Compute the RA and Dec of the Sun at a given date
    ZANG() Compute angular size as a function of redshift in a Friedman cosmology

  • DAOPHOT-Type Photometry Procedures
    APER Circular APERture photometry
    GETPSF Obtain a PSF (Gaussian + residuals) from isolated stars.
    MMM (Mean, Median, Mode) sophisticated sky background computation
    SKY Compute image sky level using MMM

  • FITS Astrometry and Calibration
    ADXY Use FITS header to convert celestial (RA,Dec) to pixel coordinates
    EXTAST EXTract ASTrometry parameters from a FITS header into an IDL structure
    HASTROM Rotate, Congrid, and/or shift an image until astrometry matches that in a reference FITS header. Used to align images.
    HREBIN REBIN an image and update the astrometry in a FITS header
    WCSSPH2XY Convert between longitude,latitude to X,Y angular coordinates for 25 different map projection types

  • FITS I/O
    MRDFITS() Read FITS file mapping table columns into IDL structure  (needs structyp='name')
    MWRFITS Write a FITS file from a IDL array or structure (needs /create keyword)
    READFITS() Read a disk FITS file into an IDL data and header array.

  • Image Manipulation
    CONVOLVE() Convolve an image with a PSF using the product of Fourier Transforms
    FILTER_IMAGE() Like MEDIAN or SMOOTH but handles edges & allows iteration

  • Math and Statistics
    MEAN() Return the average value of an array or 1 dimension of an array.
    KSTWO Compute the two-sided Kolmogorov-Smirnov statistic
    PCA Perform a principal component analysis (Karhunen-Loeve expansion)

  • Plotting Procedures
    PLOTHIST Plot the histogram of an array
    PLOTSYM Define useful plotting symbols not in the standard PSYM definition

  • Robust Statistics Procedures
    ROBUST_LINEFIT Robust fit of Y vs X (or bisector of Y vs X and X vs Y)

  • IDL Structure procedures
    CREATE_STRUCT Create an IDL structure from a list of tag types and dimensions (use "a = create_struct" native GDL function)
    BIWEIGHT_MEAN Iterative biweighted determination of mean and std. dev.

  • Web Socket Procedures
    QUERYUSNO() Query the USNO-A2.0 Catalog at the ESO/ST-ECF Archive by position
    WEBGET() Use the IDL SOCKET procedure to get data from http servers

  • TV Display Procedures
    BLINK Blink two or more windows in an image display
    CURVAL Interactive display of image intensities and astronomical coordinates

  • Miscellaneous (Non-Astronomy) Procedures
    HPRINT Pretty terminal display of a FITS header (or other string array)
    READCOL Read a file of free-format ASCII data into IDL vectors
    RDFLOAT Quickly read an ASCII file with columns of data into IDL vectors

  • Structures: an aside

    In the above example where we read in tabledata, we have created an IDL structure. Structures are important data "types" in IDL in that they compactly store highly complex data. For example, read in the table again and follow these steps:


    IDL> tabledata = mrdfits('sdss_c4_dr2_published.fit',1,hdr, structyp='name')
    IDL> hprint, hdr
    XTENSION= 'BINTABLE' /Binary table written by MWRFITS v1.4a
    BITPIX = 8 /Required value
    NAXIS = 2 /Required value
    NAXIS1 = 1030 /Number of bytes per row
    NAXIS2 = 748 /Number of rows
    PCOUNT = 0 /Normally 0 (no varying arrays)
    GCOUNT = 1 /Required value
    TFIELDS = 126 /Number of columns in table
    COMMENT
    COMMENT *** End of mandatory fields ***
    .
    .
    .
    COMMENT *** Column names ***
    COMMENT
    TTYPE1 = 'RA_BCG ' /
    TTYPE2 = 'DEC_BCG ' /
    TTYPE3 = 'RA_BCGPHOT ' /
    TTYPE4 = 'DEC_BCGPHOT ' /
    TTYPE5 = 'Z_BCG ' /
    TTYPE6 = 'ZERR_BCG ' /
    TTYPE7 = 'RA_MEAN ' /
    TTYPE8 = 'DEC_MEAN ' /
    .
    .
    .
    COMMENT *** Column formats ***
    COMMENT
    TFORM1 = 'D ' /
    TFORM2 = 'D ' /
    TFORM3 = 'D ' /
    TFORM4 = 'D ' /
    TFORM5 = 'D ' /
    TFORM6 = 'D ' /
    TFORM7 = 'D ' /
    TFORM8 = 'D ' /
    TFORM9 = 'D ' /
    TFORM10 = 'D ' /
    TFORM11 = 'D ' /
    TFORM12 = 'D ' /
    TFORM13 = 'I ' /

    IDL> help, /str, tabledata
    ** Structure <8287a54>, 126 tags, length=996, data length=992, refs=1:
    RA_BCG DOUBLE 258.12006
    DEC_BCG DOUBLE 64.060760
    RA_BCGPHOT DOUBLE 258.12006
    DEC_BCGPHOT DOUBLE 64.060760
    Z_BCG DOUBLE 0.073402300
    ZERR_BCG DOUBLE 0.00020854300
    RA_MEAN DOUBLE 258.12720
    DEC_MEAN DOUBLE 64.016602
    RA_GEOM DOUBLE 258.13622
    DEC_GEOM DOUBLE 64.018345
    Z DOUBLE 0.080783151
    Z2 DOUBLE 0.080979899
    NC4 INT 203
    RADC4 DOUBLE 0.47838822
    BIWT500 DOUBLE 1342.1189
    .
    .
    .

    IDL> print, size(tabledata)
    1 748 8 748
    IDL> print, tabledata[0].(0), tabledata[0].(1)
    258.12006 64.060760
    IDL> print, tabledata[0:10].(0)
    258.12006 213.74054 133.95474 229.21742 257.73026 240.34569 255.63577 228.82294 202.79596
    358.55704 234.12422
    IDL> print, tabledata[0].ra_bcg, tabledata[0].dec_bcg
    258.12006 64.060760

    Understanding all these routines: an aside

    When IDL are properly written, users have access to the documentation provided by the individual who wrote the function/procedure.

    The following only works within the IDL environment. NOT GDL.

    IDL> doc_library, 'readcol'
    ----- Documentation for /home/chrism/idl/astron_lib/pro/readcol.pro -----

    NAME:
    READCOL
    PURPOSE:
    Read a free-format ASCII file with columns of data into IDL vectors
    EXPLANATION:
    Lines of data not meeting the specified format (e.g. comments) are
    ignored. Columns may be separated by commas or spaces.

    Use READFMT to read a fixed-format ASCII file. Use RDFLOAT for
    much faster I/O (but less flexibility). Use FORPRINT to write
    columns of data (inverse of READCOL).

    CALLING SEQUENCE:
    READCOL, name, v1, [ v2, v3, v4, v5, ... v25 , COMMENT=
    DELIMITER= ,FORMAT = , /DEBUG , /SILENT , SKIPLINE = , NUMLINE = ]
    .
    .
    .
    IDL> doc_library, 'zang'
    ----- Documentation for /home/chrism/idl/astron_lib/pro/zang.pro -----

    NAME:
    ZANG
    PURPOSE:
    Determine the angular size of an object as a function of redshift
    EXPLANATION:
    Requires an input size in kpc and returns an angular size in arc seconds
    Default cosmology has a Hubble constant of 70 km/s/Mpc, Omega (matter)
    =0.3 and a normalized cosmological constant Lambda = 0.7; however these
    values can be changed with apropriate keywords.

    CALLING SEQUENCE:
    angsiz = zang( dl, [ z, H0 =, Omega_m =, Lambda0 = , q0 = , k =,
    /SILENT] )
    .
    .
    .

    Plotting/Display

    IDL provides numerous techniques to display data and images. The ones shown here are only the tip of the iceberg.
    First, let's make figures and display data.

    Data display

    Here, we include simple and publication quality figures, histograms, and contour plots.
    For a nice IDL library to interactively make plots, try PUBPLOT.


    IDL> a = findgen(100) & b = findgen(100)
    IDL> plot, a,b
    IDL> a = sin(a*!PI/180 + !PI/2) & b = cos(b*!PI/180 +!PI/2)
    IDL> c = dblarr(2,100)
    IDL> c[0,*] = a & c[1,*] = b
    IDL> contour, c
    IDL> surface, c, zr=[-0.5,0.5]
    IDL> w = where(tabledata.sub le 1)
    IDL> plot, tabledata[w].lum_r,tabledata[w].biwt1500, psym=3, /xlog, /ylog, xrange=[5d10,4d12], yrange=[100,2200], xstyle=1,ystyle=1,$
    ytitle = 'Velocity Disp. within 1.5Mpc (km/s)', xtitle='r-band luminosity (solar)'

    Image display

    IDL comes standard with some simple image display routines.
    For fancier and more useful libraries, try ATV, LOOK, etc.

    The following only works within the IDL environment. NOT GDL.
    Image DISPLAY in GDL is nearly non-functional at the 0.9pre-release.

    IDL> spawn, "echo $NVOSS_HOME", nvoss_home ;Puts the NVOSS home directory into a variable
    IDL> image = readfits(nvoss_home+'/java/data/testr.fits',hdr)
    IDL> tv, image
    IDL> loadct
    % Compiled module: LOADCT.
    % Compiled module: PATH_SEP.
    0- B-W LINEAR 14- STEPS 28- Hardcandy
    1- BLUE/WHITE 15- STERN SPECIAL 29- Nature
    2- GRN-RED-BLU-WHT 16- Haze 30- Ocean
    3- RED TEMPERATURE 17- Blue - Pastel - R 31- Peppermint
    4- BLUE/GREEN/RED/YE 18- Pastels 32- Plasma
    5- STD GAMMA-II 19- Hue Sat Lightness 33- Blue-Red
    6- PRISM 20- Hue Sat Lightness 34- Rainbow
    7- RED-PURPLE 21- Hue Sat Value 1 35- Blue Waves
    8- GREEN/WHITE LINEA 22- Hue Sat Value 2 36- Volcano
    9- GRN/WHT EXPONENTI 23- Purple-Red + Stri 37- Waves
    10- GREEN-PINK 24- Beach 38- Rainbow18
    11- BLUE-RED 25- Mac Style 39- Rainbow + white
    12- 16 LEVEL 26- Eos A 40- Rainbow + black
    13- RAINBOW 27- Eos B
    Enter table number:
    13
    IDL> tv,image
    IDL> atv,image
    IDL> imdisp, image
    IDL> image24 = TVRD(True=1)
    IDL> image2d = Color_Quan(image24,1,r,g,b,Cube=6)
    IDL> write_jpeg, 'cluster.jpg', image2d
    idl> read_jpeg, 'cluster.jpg', image
    idl> tvscl, image


    Programming Methods

    While the command-line provides simple and immediate access to IDL, programs (procedures and functions) written by the user are a more powerful technique.

    SUBROUTINES/PROCEDURES:

    Consider the file separ.pro

    PRO SEPAR, separ, ra1,ra2,dec1,dec2
    ;Returns the separation of 2 points on the sky
    ;(in RA,DEC) in arcminutes. Uses spherical trig.
    phi1 = ra1/57.29578
    theta1 = (90.0 - dec1)/57.29578
    phi2 = ra2/57.29578
    theta2 = (90.0 - dec2)/57.29578
    costh3=cos(theta1)*cos(theta2)+sin(theta1)*sin(theta2)*cos(phi2-phi1)
    separ = (acos(costh3)*57.296)*60.0
    RETURN
    END

    IDL> .com separ
    IDL> separ, sep,180,179,45,45
    % Compiled module: SEPAR.
    IDL> print, sep
    42.4159
    IDL> separ, sep,180,179,0,0
    IDL> print, sep
    59.9973


    FUNCTIONS:

    Consider the file directory.pro
     
    FUNCTION DIRECTORY, t
    name = STRUPCASE(t) ;Convert to uppercase
    CASE name OF
    'JANE': d='555-1212'
    'BILL': d='555-2121'
    ELSE: d='Not Found'
    ENDCASE
    RETURN,D
    END

    IDL> number = directory('jane')
    IDL> print, number
    555-1212


    FOR Loops:

    The following only works within the IDL environment. NOT GDL.
    GDL DOES NOT support inline loops from the command-line.
    IDL> testme = findgen(15) & zran = dblarr(100,n_elements(testme)) & probd=zran
    IDL> FOR I = 0, 99 DO BEGIN zran[I,*] = randomu(iseed, n_elements(testme))*15.0
    IDL> FOR I = 0, 99 DO BEGIN kstwo, testme, zran[I,*],d,prob & probd[I] = prob
    IDL> print, avg(probd)

    The following works within both IDL and GDL.

    PRO MAKE_BCG_DATA

    c4data = mrdfits('sdss_c4_dr2_published.fit',1,hdr, structyp='c4data')
    openw,1,'bcg_data.dat'
    FOR I = 0, n_elements(c4data.ra_mean)- 1 DO BEGIN
    printf,1, c4data[I].ra_bcg, c4data[I].dec_bcg, c4data[I].z_bcg, $
    format = '(3(1x, f16.10))'
    ENDFOR
    close, 1

    END

    IDL> make_bcg_data
    IDL> $ls

    WHILE Loops:

    The following only works within the IDL environment. NOT GDL.
    GDL DOES NOT support inline loops from the command-line.

    IDL> openr,1,'bcg_data.dat'
    IDL> WHILE NOT(EOF(1)) DO BEGIN READF,1,a,b,c & print,a,b,c


    IF THEN ELSE

    The following only works within the IDL environment. NOT GDL.
    GDL DOES NOT support inline loops from the command-line.

    IDL> openr,1,'bcg_data.dat'
    IDL> WHILE NOT(EOF(1)) DO BEGIN READF,1,a,b,c & IF (c gt 0.15) THEN PRINT, a,b,c
    260.042 26.6256 0.159325
    196.274 62.2164 0.169516
    15.2565 -9.95473 0.150398
    348.409 14.8376 0.163154

    The following works within both IDL and GDL.

    PRO SEPAR, separ, ra1,ra2,dec1,dec2
    ;Returns the separation of 2 points on the sky
    ;(in RA,DEC) in arcminutes. Uses spherical trig.
    IF (n_elements(ra1) eq 0 or n_elements(ra2) eq 0 or n_elements(dec1) eq 0 or n_elements(dec2) eq 0) THEN BEGIN
    PRINT, 'Error: invalid coordinates'
    RETURN
    ENDIF ELSE BEGIN
    phi1 = ra1/57.29578
    theta1 = (90.0 - dec1)/57.29578
    phi2 = ra2/57.29578
    theta2 = (90.0 - dec2)/57.29578
    costh3=cos(theta1)*cos(theta2)+sin(theta1)*sin(theta2)*cos(phi2-phi1)
    separ = (acos(costh3)*57.296)*60.0
    ENDELSE
    RETURN
    END

    IDL> .com separ
    IDL> separ, sep
    Error: invalid coordinates




    IDL and the VO

    SQL Queries

    Mark Buie has provided the ability to query MYSQL servers from within IDL.
    To use this feature, you will need to download the BUIE libraries at:
    ftp://ftp.lowell.edu/pub/buie/idl/buie_idlv62.tar.gz

    Install this library (by unzipping and untarring in your IDL programs directory (e.g., /Users/chrism/idl).

    Make sure your IDL_PATH includes this new library:
    setenv IDL_PATH ${IDL_PATH}:+/Users/chrism/idl/buie_62

    Make sure you have a ".my.cnf" file in your home directory. It should look something like this;:


    [client]
    user=root
    host = localhost

    [mysql]
    database = SPOCS

    Now, start up IDL (type idl or start the idlde GUI editor). This assumes you also have the astron_lib libraries as well.


    IDL> openmysql, lun, 'spocs'
    % Compiled module: OPENMYSQL.
    % Compiled module: BADPAR.
    IDL> mysqlquery, lun, 'SELECT s.Teff, s.Logg, S.Fe FROM spocs s;', v1,v2,v3, format = '(f,f,f)'
    % Compiled module: MYSQLQUERY
    % Compiled module: MYSQLCMD
    % Compiled module: STRSPLIT
    % Compiled module: ZPARCHECK
    % Compiled module: REMCHAR
    % Compiled module: GETTOK
    % Compiled module: STRNUMBER
    IDL> print, avg(v1), avg(v2), avg(v3)
    % Compiled module: AVG.
    5693.82 4.36144 -0.00614423



    The IDL VO Libraries

    The NVOSS 2006 software distribution contains a directory nvoss2006/idl/  which in turn contains a sub-directory containing a registry calling procedure (G. Greene) and another sub-directory containing a number of VO libraries (VOLib_0.2 --C. Miller). The VOLib contains procedures to read VOTables, SIAP calls, Cone Searches, Open Sky Query calls, Registry calls, and WESIX calls. These will be discussed in more detail in the Lessons Learned talk (Monday) after we're all a little more comfortable with some of these Standards.