STAFILEIF(UW)                                       STAFILEIF(UW)



NAME
       stafileif - package for station information access

SYNOPSIS
       #include "stafileif.h"
       load with library: ~snaps/Src/Utils/libutils.a


GENERAL
       This package provides the general interface to the station
       file data in the UW station  file  table(s).   UW  station
       tables  contain station latitude, longitude, elevation and
       possibly other data in the form described below.  P and  S
       station delay information are kept in separate files which
       can also be loaded with the station table data.  The pack-
       age also includes utility functions for manipulating coor-
       dinate and distance  information.   All  of  the  external
       callable  functions in this package have names of the form
       STA...  For example, STAinit_default() loads  the  default
       station table(s).  STAget_latlon() will return the station
       lat, lon, elev information for a specified station.  Stor-
       age  for station data is dynamically allocated, so size of
       the station table(s) is(are)  not  generally  of  concern.
       The  package  also  uses  a hash table for efficient table
       access.  In  the  following  section,  the  individual  C-
       callable functions are described.


UW STATION FILE FORMAT AND CONVENTIONS
          The  UW  station  file format is basically very simple.
       The files are interpreted free field by this package,  and
       so  lines  in the station file consist of tokens separated
       by white space.  Lines beginning with a pound sign (#) are
       interpreted  as  comments and ignored.  Station files con-
       tain zero or more data lines of the following form:

       STANAME LATDEG LATMIN LATSEC LONDEG LONMIN LONSEC ELEV < +
       optional info >

       The  data fields are self explanatory, and all fields must
       be present.  For example, if the  latitude  and  longitude
       are  given  as  decimal degrees only, the then minutes and
       seconds fields must be present and represent zero  values.

       The  UW  station  file  format has the following important
       limitations.  It does not adhere to the usual sign conven-
       tions  for  geographic coordinates (normally, west longti-
       tudes and south latitutdes are  negative).   However,  the
       coordinate  retrieval routines correct for these deficien-
       cies internally and return coordinates  with  the  correct
       (usual)  sign  conventions.  This is done through the fol-
       lowing hack.  The coordinates are stored  internally  just
       as  they  are given in the station table(s).  When coordi-
       nates are returned, they are multiplied by  the  auxiliary
       definitions:  LATSIGN  and LONSIGN that are defined in the
       stafileif_defaults.h header file.   Note  that  signs  are
       associated  with  all  three quantities: degrees, minutes,
       and seconds.  Therefore the user has  two  basic  choices:
       (1) follow the UW convention and do not put signs directly
       in the table, and then set LATSIGN and  LONSIGN  correctly
       (they  are +1. and -1.0 respectively for the UW tables for
       the Washington network); or (2) Put  signs  in  the  table
       directly  (remember that the appropriate signs must be put
       on degress, minutes, and seconds) and then set  both  LAT-
       SIGN  and  LONSIGN  to  +1.0 which means that they have no
       effect.  If your tables should span zero  latitude  and/or
       zero  longitude,  then  you  have  no choice but to follow
       choice #2 since the LATSIGN and LONSIGN  corrections  must
       apply to all values in the table.

       Special  channel  names, such as TCG (time code generator)
       and WWVB (WWVB time channel) may be put into the table  to
       designate  channels that are not real seismic channels and
       to keep the applications happy.  For these  channels,  put
       in  zero  latitude  and  zero longitude, which are invalid
       locations (i.e., off  the  coast  of  west  Africa).   The
       stafileif  recognized  these  zero  locations as "special"
       channels and returns a query for  status.   Alternatively,
       the  users  application  program can recognize these bogus
       station locations as special channels.

STATIONFILE PROTOTYPE FILE
       Below is a list of the prototype  file  that  is  included
       with  the  users  program through the header: stafileif.h.
       The prototype gives a convenient  list  of  the  functions
       available  in  the package with their argument syntax, and
       provides a convenient summary list of  the  functions  for
       the  programmer.   Detailed function descriptions are pro-
       vided in the next section.

       /*
        *   This file was automatically generated by version 1.7 of cextract.
        *   Manual editing not recommended.
        *
        *   Created: Tue Mar  8 17:33:24 1994
        */
       #ifndef __STAFILEIF_PROTO__
       #define __STAFILEIF_PROTO__
       #if __STDC__

       int STAarcdistkm ( double, double, double, double, double *, double * );
       int STAazdist ( double, double, double, double, double *, double *, double * );
       int STAchange_loc ( char *, struct Gpoint, float );
       int STAcoord2 ( double, double, double, double, double *, double * );
       int STAget_declatlon ( char *, double *, double *, float * );
       int STAget_latlon ( char *, float [], float [], float * );
       int STAget_psdel ( char *, float *, float * );
       int STAinit_default ( void );
       int STAinit_del ( char * );
       int STAinit_table ( char * );
       int STAisInTable ( char * );
       int STAisSeisChan ( char * );
       int STAtable_loaded ( void );

       #endif /* __STDC__ */
       #endif /* __STAFILEIF_PROTO__ */

FUNCTION DESCRIPTIONS
       Function: STAarcdistkm
              /*
                  This utility function returns the arc distance in kilometers (r) and the
                  azimuth (az; degrees clockwise from north) between two points: the "evt"
                  and the "sta".  The event and station positions are specified by lat/lon
                  pairs which are given as the floating point (double) values evtlat/evlon,
                  and stlat/stlon.  The azimuth returned is from the event to the
                  station (position 1 to position 2).
              */
              int STAarcdistkm ( double  evtlat,  double  evtlon,
              double  stlat,  double stlon, double *r, double *az
              );


       Function: STAazdist
              /*
                  Utility function returns the arc distance in degrees (delta),
                  the azimuth from event to station (az; degress clockwise from north),
                  and the backazimuth from station to event (baz; degrees clockwise from
                  north) between two points: the "evt" and "sta". The event and station
                  positions are specified by lat/lon pairs which are given as the
                  decimal (double) values evtlat, evtlon, and stlat, stlon.
                  The azimuth returned is from the event to the station (position 1
                  to position 2).
              */
              int STAazdist ( double evtlat, double evtlon,  dou-
              ble  stalat,  double  stalon, double *delta, double
              *az, double *baz );


       Function: STAchange_loc
              /*
                  Allows user to change values in the station table.  The input values
                  are station "location" as the structure gpoint (see definition in
                  "stafileif.h"), and the elevation.  Note that these are passed by
                  value, not by name.  If station is not in table, FALSE is returned.
              */
              int STAchange_loc ( char *name, struct Gpoint loca-
              tion, float elev );


       Function: STAcoord2
              /*
                  Utility function to compute a second lat/lon coordinate position given an
                  origin point as a lat/lon pair (origlat & origlon), plus an azimuth (az)
                  and a distance (delta; in degrees).  The coordinates of the second
                  position are returned in pt2lat, pt2lon.
              */
              int  STAcoord2  (  double  origlat, double origlon,
              double delta, double  az,  double  *pt2lat,  double
              *pt2lon );


       Function: STAget_declatlon
              /*
                  Returns station coordinates, but as single decimal (double) values
                  for lat and lon.  Otherwise, identical to STAget_latlon().
              */
              int  STAget_declatlon  (  char  *name, double *lat,
              double *lon, float *elev );


       Function: STAget_latlon
              /*
                  Returns station coordinates for station specified by string "name"
                  in float arrays lat[] and lon[], and float value elev.  If station
                  is not found, returns FALSE value.
              */
              int STAget_latlon ( char *name, float lat[],  float
              lon[], float *elev );


       Function: STAget_psdel
              /*
                  Returns station delay values for station specified by string "name".
                  If station is not found, returns FALSE value.
              */
              int  STAget_psdel  ( char *name, float *pdel, float
              *sdel );


       Function: STAinit_default
              /*
                  Initializes the default station table(s).
                  Either STAinit_default or STAinit_table MUST be called prior to
                  accessing any station table data.
                  Station tables are read, storage space is allocated, and a
                  hash table is created.  The default station table(s) is found
                  by (1) first looking for an environment variable called
                  DEFAULT_STA_TABLE_DIR, and, if this is not found, using (2) the
                  path defined by the default user and default path information
                  set in the stafileif_defaults.h file in the stafileif source directory.
                  The path established by either the environment variable or by
                  the hard wired defaults, is actually a directory containing one
                  or more station tables.  It is assumed that ALL files in this
                  directory are station files; therefore DO NOT includes extraneous
                  description or other files in this directory.  Station table files
                  must be in the UW (i.e., wash.sta) standard format.
              */
              int STAinit_default ( void );


       Function: STAinit_del
              /*
                  Loads station delay table information into memory from file specified
                  by the path string "del_file_name".  Produces FALSE return value if
                  delay file cannot be found.  Message will be issued to standard
                  error for stations that are not found in the current station table.
              */
              int STAinit_del ( char *del_file_name );


       Function: STAinit_table
              /*
                  Alternate direct method of initializing station table.  This loads
                  a single station table with a specific path given by the string
                  "sta_file_name".  Additional station tables may be loaded (added)
                  by repeated calls to STAinit_table.   Message is issued to
                  standard error if file is not found.
              */
              int STAinit_table ( char *sta_file_name );


       Function: STAisInTable
              /*
                  Returns TRUE if station is in currently loaded table; otherwise
                  returns FALSE.
              */
              int STAisInTable ( char *name );


       Function: STAisSeisChan
              /*
                  Returns TRUE if station is both in currently loaded table and is
                  seismic channel (e.g., not a special channel).  Otherwise returns
                  FALSE.
              */
              int STAisSeisChan ( char *name );


       Function: STAtable_loaded
              /*
                  Query if station table is loaded.  Returns TRUE if station
                  table is currently loaded; otherwise returns FALSE.
              */
              int STAtable_loaded ( void );


                      LITERAL INCLUDE FILES
INCLUDE FILE: stafileif.h
       /*
        * LATSIGN & LONSIGN are hack to correct for inadequate sign convention
        * in station table.  The UW station table has no sign convention
        * for longitudes, so we must force one.  The correct convention is
        * longitude (+ east, - west), latitude (+ north, - south).  If (as
        * is true for UW convention) longitudes are given without sign, set
        * the LONSIGN to -1.0 for stations in west longitudes, +1.0 for
        * station in east longitudes.  Similarly, set LATSIGN to -1.0
        * for stations in south latitudes without sign; +1.0 otherwise.
        * Note that this cannot handle stations split between W & E
        * longitudes; or stations split between N & S latitudes.  Such a
        * situation requires a fix to the code and the station table to read
        * the sign correctly for each coordinates.
        */
       #ifndef __STAFILEIF_H__
       #define __STAFILEIF_H__

       #ifndef BOOL
       #define BOOL int
       #endif

       struct gcoord { /* geographic coordinates */
           float deg, min, sec;
       };

       struct Gpoint { /* point in geographic coordinate space */
           struct gcoord lat, lon;
       };
       #include "stafileif_proto.h"

       #endif /* __STAFILEIF_H__ */



INCLUDE FILE: stafileif_defaults.h
       /*
        * Set up default path for station table(s) here. owner string
        * must be a valid user name on the current system with a home directory.
        * Path must be a path relative to the owners home directory containing
        * one or more station tables in standard UW (wash.sta) table format.
        * Note that all station tables in this directory will be loaded.
        * This allows the easy addition or deletion of working station tables
        * by dropping them into, or removing them from, the station table
        * directory.  If duplicate stations entries are encountered (in one
        * or more tables, a warning message is issued - the first entry encountered
        * holds and successive duplicate entries are ignored.
        */
       #define DEFAULT_STA_TABLE_OWNER "lees"
       #define DEFAULT_STA_TABLE_PATH "/home/lees/snaps/Tables/ActiveStas"

       /*
        * Set the sign conventions for the UW style station table
        * LATSIGN = +1.0 since we are correct in northern hemisphere
        * LONSIGN = -1.0 since we are reversed in western hemisphere
        */
       #define LATSIGN 1.0 /* OK for UW since unsigned equiv. to + for N */
       #define LONSIGN -1.0 /* UW convention */


AUTHOR
       Bob Crosson (bob@geophys.washington.edu)


BUGS
       Report bugs to author.



                                                    STAFILEIF(UW)