]> Pileus Git - ~andy/rsl/blobdiff - examples/qlook.c
RSL v1.44
[~andy/rsl] / examples / qlook.c
index dc767f68379331eb629a046aa9b0c71bcf82bf64..cf85a63d384f668ef2a5ab6314b9017ddb5f222e 100644 (file)
@@ -5,25 +5,42 @@
 #include <string.h>
 #include <stdlib.h>
 #include <unistd.h>
+#include <libgen.h>
+#define USE_RSL_VARS
 #include "rsl.h"
 
 #define ZDR_WIDTH 10
 int         verbose;
 
-void rebin_ray(Ray *r, int width);
-void rebin_sweep(Sweep *s, int width);
-void rebin_volume(Volume *v, int width);
+void RSL_rebin_ray(Ray *r, int width);
+void RSL_rebin_sweep(Sweep *s, int width);
+void RSL_rebin_volume(Volume *v, int width);
 void adjust_gate_size(Radar *radar, float gate_size_adjustment);
 
 void process_args(int argc, char **argv, char *in_file, int *verbose,
-                                 char *site_id, char *tape_id,
-                                 int *qc_reflectivity, int *total_reflectivity,
-                                 int *differential_reflectivity, 
-                                 int *velocity, int *spectral_width,
-                                 int *make_gif, int *make_pgm, int *make_bscan, int *make_uf,
-                                 int *num_sweeps, float *dbz_offset,
-                                 int *xdim, int *ydim, float *range,
-                                 float *gate_size_adjustment, int *print_azim);
+                  char *site_id, char *tape_id,
+                  int *qc_reflectivity, int *total_reflectivity,
+                  int *differential_reflectivity, 
+                  int *velocity, int *spectral_width,
+                  int *make_gif, int *make_pgm, int *make_bscan, int *make_uf,
+                  int *num_sweeps, float *dbz_offset,
+                  int *xdim, int *ydim, float *range,
+                  float *gate_size_adjustment, int *print_azim,
+                  char *gifdir, char *pgmdir, char *ufdir);
+
+void make_pathname(char *filename, char *dir, char *pathname)
+{
+    /* Make pathname by combining directory name, if given, with filename. */
+
+    if (!dir || !dir[0]) {
+        strcpy(pathname, filename);
+    }
+    else {
+        strcpy(pathname, dir);
+        strcat(pathname, "/");
+        strcat(pathname, filename);
+    }
+}
 
 /***********************************************************************/
 /* This program uses the NASA TRMM Office Radar Software Library (RSL) */
@@ -32,77 +49,90 @@ void process_args(int argc, char **argv, char *in_file, int *verbose,
 /***********************************************************************/
 main(int argc, char **argv) {
 
-       Radar       *radar;
-       Volume          *dz_volume, *vr_volume;
-       Volume      *dr_volume, *zt_volume;
-       Volume          *sw_volume, *qc_volume, *volume;
-
-       Sweep       *sweep;
-       Sweep           *dz_sweep, *qc_sweep;
-       Sweep       *dr_sweep, *zt_sweep;
-       Sweep       *vr_sweep, *sw_sweep;
-
-       Ray         *ray;
-       int         reflectivity, qc_reflectivity, nvolumes;
-       int         differential_reflectivity, total_reflectivity;
-       int         velocity, spectral_width;
-       int         make_catalog, make_gif, make_pgm; 
-       int         make_uf, make_bscan;
-       int         xdim, ydim, num_sweeps;
-       int             i,j,k,l,n, verbose, kk;
-       int                     month, day, year, hour, min;
-       int         ncbins, width;
-       int         print_azim;
-       float       scale, dbz_offset;
-       float       latitude, longitude;
-
-       float           sec;
-       float       maxr;
-       float       nyquist, max_range, gate_size_adjustment;
-
-       char        tape_id[100];
-       char            in_file[100], site_id[100];
-       char            filename[100], outfile[100], nexfile[100];
-       char        command[100], file_prefix[100], file_suffix[3];
-       char            dir_string[100], red[120], grn[120], blu[120];
-       char        time_string[14], site_string[10],img_base[20];
-       FILE            *fp;
+    Radar       *radar;
+    Volume      *dz_volume, *vr_volume;
+    Volume      *dr_volume, *zt_volume;
+    Volume      *sw_volume, *qc_volume, *volume;
+
+    Sweep       *sweep;
+    Sweep       *dz_sweep, *qc_sweep;
+    Sweep       *dr_sweep, *zt_sweep;
+    Sweep       *vr_sweep, *sw_sweep;
+
+    Ray         *ray;
+    int         reflectivity, qc_reflectivity, nvolumes;
+    int         differential_reflectivity, total_reflectivity;
+    int         velocity, spectral_width;
+    int         make_catalog, make_gif, make_pgm; 
+    int         make_uf, make_bscan;
+    int         xdim, ydim, num_sweeps;
+    int         i,j,k,l,n, verbose, kk;
+    int         month, day, year, hour, min;
+    int         ncbins, width;
+    int         print_azim;
+    float       scale, dbz_offset;
+    float       latitude, longitude;
+
+    float       sec;
+    float       maxr;
+    float       nyquist, max_range, gate_size_adjustment;
+
+    char        tape_id[100];
+    char        in_file[100], site_id[100];
+    char        filename[100], outfile[100], nexfile[100];
+    char        command[100], file_prefix[100], file_suffix[3];
+    char        dir_string[100], red[120], grn[120], blu[120];
+    char        time_string[14], site_string[10],img_base[20];
+    char        pathname[256], gifdir[100], pgmdir[100], ufdir[100];
+    char        *inpath;
+    FILE        *fp;
 
 /* Set default values */
 
-       strcpy(site_id, "KMLB");
-       strcpy(tape_id, "WSR88D");
-
-       verbose         = FALSE;
-       reflectivity    = TRUE;
-       qc_reflectivity = FALSE;
-       total_reflectivity = FALSE;
-       differential_reflectivity = FALSE;
-       velocity        = FALSE;
-       spectral_width  = FALSE;
-       make_gif        = FALSE;
-       make_pgm        = FALSE;
-       make_catalog    = FALSE;
-       make_uf         = FALSE;
-       print_azim      = FALSE;
-       num_sweeps      = 1;
-       xdim = ydim     = 400;
-       maxr            = 200.;
-       dbz_offset      = 0.0;
-       gate_size_adjustment = 1.0;
-       
+    /*strcpy(site_id, "KMLB");*/
+    strcpy(tape_id, "WSR88D");
+
+    verbose         = FALSE;
+    reflectivity    = TRUE;
+    qc_reflectivity = FALSE;
+    total_reflectivity = FALSE;
+    differential_reflectivity = FALSE;
+    velocity        = FALSE;
+    spectral_width  = FALSE;
+    make_gif        = FALSE;
+    make_pgm        = FALSE;
+    make_catalog    = FALSE;
+    make_uf         = FALSE;
+    print_azim      = FALSE;
+    num_sweeps      = 1;
+    xdim = ydim     = 400;
+    maxr            = 200.;
+    dbz_offset      = 0.0;
+    gate_size_adjustment = 1.0;
+    *gifdir = *pgmdir = *ufdir = '\0';
+    *site_id = '\0';
+    
 /* Process command_line arguments */
 
-       process_args(argc, argv, in_file, &verbose, 
-                                site_id, tape_id, 
-                                &qc_reflectivity, &total_reflectivity,
-                                &differential_reflectivity, 
-                                &velocity, &spectral_width,
-                                &make_gif, &make_pgm, &make_bscan, &make_uf,  
-                                &num_sweeps, &dbz_offset,
-                                &xdim, &ydim, &maxr, &gate_size_adjustment,
-                                &print_azim);
-       
+    process_args(argc, argv, in_file, &verbose, 
+                 site_id, tape_id, 
+                 &qc_reflectivity, &total_reflectivity,
+                 &differential_reflectivity, 
+                 &velocity, &spectral_width,
+                 &make_gif, &make_pgm, &make_bscan, &make_uf,  
+                 &num_sweeps, &dbz_offset,
+                 &xdim, &ydim, &maxr, &gate_size_adjustment,
+                 &print_azim, gifdir, pgmdir, ufdir);
+    
+/* If site_id empty, use first 4 characters of file name. */
+
+    if (*site_id == 0) {
+       inpath = strdup(in_file);
+       strncpy(site_id, basename(inpath), 4);
+       site_id[4] = '\0';
+       if (strcmp(site_id, "KWA0") == 0) strcpy(site_id, "KWAJ");
+    }
+
 /* Be a chatty Kathy? */
 
     if(verbose)
@@ -112,129 +142,133 @@ main(int argc, char **argv) {
 
 /* Read data into radar */
 
-       if(verbose) printf("Calling any_format_to_radar\n");
-       radar = RSL_anyformat_to_radar(in_file, site_id);
-       if(verbose) printf("Called any_format_to_radar\n");
-       if(radar==NULL) {
-         if (verbose)
-               printf("No radar loaded, bye\n");
-         exit(-1);
-       }
+    if(verbose) printf("Calling any_format_to_radar\n");
+    radar = RSL_anyformat_to_radar(in_file, site_id);
+    if(verbose) printf("Called any_format_to_radar\n");
+    if(radar==NULL) {
+      if (verbose)
+        printf("No radar loaded, bye\n");
+      exit(-1);
+    }
 
 /* Print command line parameters */
 
-       if(verbose) {
-               printf("Site ID            = %s\n",site_id);
-               printf("Tape ID            = %s\n",tape_id);
-               printf("Do reflectivity    = %d\n",reflectivity);
-               printf("Do qc_reflectivity = %d\n",qc_reflectivity);
-               printf("Do differential_reflectivity = %d\n",
-                          differential_reflectivity);
-               printf("Do total_reflectivity = %d\n",
-                          total_reflectivity);
-               printf("Do qc_reflectivity = %d\n",qc_reflectivity);
-               printf("Do velocity        = %d\n",velocity);
-               printf("Do spectral_width  = %d\n",spectral_width);
-               printf("Make gif           = %d\n",make_gif);
-               printf("Make pgm           = %d\n",make_pgm);
-               printf("Make UF file       = %d\n",make_uf);
-               printf("dBZ Offset         = %.2f\n",dbz_offset);
-               printf("Gate Size Adjust   = %.2f\n",gate_size_adjustment);
-               printf("Print Azimuths     = %d\n",print_azim);
-       } 
+    if(verbose) {
+        printf("Site ID            = %s\n",site_id);
+        printf("Tape ID            = %s\n",tape_id);
+        printf("Do reflectivity    = %d\n",reflectivity);
+        printf("Do qc_reflectivity = %d\n",qc_reflectivity);
+        printf("Do differential_reflectivity = %d\n",
+               differential_reflectivity);
+        printf("Do total_reflectivity = %d\n",
+               total_reflectivity);
+        printf("Do qc_reflectivity = %d\n",qc_reflectivity);
+        printf("Do velocity        = %d\n",velocity);
+        printf("Do spectral_width  = %d\n",spectral_width);
+        printf("Make gif           = %d\n",make_gif);
+        printf("Make pgm           = %d\n",make_pgm);
+        printf("Make UF file       = %d\n",make_uf);
+        if (ufdir  != NULL) printf("UF output dir      = %s\n",ufdir);
+        if (gifdir != NULL) printf("GIF output dir     = %s\n",gifdir);
+        if (pgmdir != NULL) printf("PGM output dir     = %s\n",pgmdir);
+        printf("dBZ Offset         = %.2f\n",dbz_offset);
+        printf("Gate Size Adjust   = %.2f\n",gate_size_adjustment);
+        printf("Print Azimuths     = %d\n",print_azim);
+    } 
 
 
 /*
   If Gate Size Adjustment is not unity, then we must change the
   following:
       old_gs = radar->v[i]->sweep[sweepIndex]->ray[rayIndex=]->h.gate_size
-         radar->v[i]->sweep[sweepIndex]->ray[rayIndex=]->h.gate_size = 
-             old_gs*gate_size_adjustment
+      radar->v[i]->sweep[sweepIndex]->ray[rayIndex=]->h.gate_size = 
+          old_gs*gate_size_adjustment
 
    Here are some comments from Sandra Yuter on the necessity of this fix.
    > I dug into the revelant code and it looks like we can do a relatively
-       > simple workaround for the SIGMET raw product file range bin size
-       > errors for the RHB data pulses widths of 0.5 usec and 2.0 usec as follows.
-       
-       > Since we are all converting from sigmet to UF I suggest we resize 
-       > the range bin size values in the ray headers in the qlook step
-       > where the sigmet to UF conversion occurs.
-       
-       > The resize requires only 1 additional line of code (I have included
-       > a few others for context) in qlook.c
-       
-       > rangeToFirstGate = 0.001 *
-       >                radar->v[i]->sweep[sweepIndex]->ray[rayIndex]->h.range_bin1;
-       >             gateSize = 0.001 *
-       >                radar->v[i]->sweep[sweepIndex]->ray[rayIndex]->h.gate_size;
-       >             radar->v[i]->sweep[sweepIndex]->ray[rayIndex]->h.gate_size=
-       >               gateSize*0.6*1000;
-       
-       > I have used 0.6 adjustment factor since that is 75/125 which corresponds
-       > to the error in my 0.5 usec data, for the SUR scans, this adjustment
-       > factor is 133.33/125 or 1.067.
-       
-       The following is from Joe Holmes from SIGMET
-       
-       
-       > I think you have experienced a problem with the RVP7 range resolution
-       > configuration.  Both in IRIS and in the RVP7 you manually type in
-       > the range resolution.  The RVP7 allows a separate resolution for
-       > each pulsewidth, while IRIS only allows 1 value.  There is no feedback
-       > if these values are not typed in the same.  Based on setup information
-       > we have here from the RH Brown from Oct 23, 1998, you had the following
-       > configuration:
-       
-       > RVP7:
-       > 0   0.50 usec   75.0m
-       > 1   0.80 usec  125.0m
-       > 2   1.39 usec  125.0m
-       > 3   2.00 usec  133.3m
-       
-       > IRIS: 125.0 meters
-       
-       > I think the error at PW#0 was corrected a while back, but
-       > the error  in PW#3 was never corrected.  Next time someone is
-       > at the ship, they should check this, fix the long pulse, and remake
-       > the bandpass filter for the long pulse.
-       
-       > In the short term, you can correct the error by taking all your
-       > long pulse data and changing the header to correctly document the
-       > range resolution.  We have a program to do this, it is called "change_raw".
-       > The source is on any IRIS system, which was installed with the
-       > source, headers, and objects turned on.  It is in the
-       > ${IRIS_ROOT}utils/examples directory.  We can supply you with
-       > a compiled version of this program, if you want.  Available platforms
-       > are Linux, HP-UX, and IRIX.
+    > simple workaround for the SIGMET raw product file range bin size
+    > errors for the RHB data pulses widths of 0.5 usec and 2.0 usec as follows.
+    > 
+    > Since we are all converting from sigmet to UF I suggest we resize 
+    > the range bin size values in the ray headers in the qlook step
+    > where the sigmet to UF conversion occurs.
+    > 
+    > The resize requires only 1 additional line of code (I have included
+    > a few others for context) in qlook.c
+    > 
+    > rangeToFirstGate = 0.001 *
+    >            radar->v[i]->sweep[sweepIndex]->ray[rayIndex]->h.range_bin1;
+    >         gateSize = 0.001 *
+    >            radar->v[i]->sweep[sweepIndex]->ray[rayIndex]->h.gate_size;
+    >         radar->v[i]->sweep[sweepIndex]->ray[rayIndex]->h.gate_size=
+    >       gateSize*0.6*1000;
+    > 
+    > I have used 0.6 adjustment factor since that is 75/125 which corresponds
+    > to the error in my 0.5 usec data, for the SUR scans, this adjustment
+    > factor is 133.33/125 or 1.067.
+    
+    The following is from Joe Holmes from SIGMET
+    
+    > 
+    > I think you have experienced a problem with the RVP7 range resolution
+    > configuration.  Both in IRIS and in the RVP7 you manually type in
+    > the range resolution.  The RVP7 allows a separate resolution for
+    > each pulsewidth, while IRIS only allows 1 value.  There is no feedback
+    > if these values are not typed in the same.  Based on setup information
+    > we have here from the RH Brown from Oct 23, 1998, you had the following
+    > configuration:
+    > 
+    > RVP7:
+    > 0   0.50 usec   75.0m
+    > 1   0.80 usec  125.0m
+    > 2   1.39 usec  125.0m
+    > 3   2.00 usec  133.3m
+    > 
+    > IRIS: 125.0 meters
+    > 
+    > I think the error at PW#0 was corrected a while back, but
+    > the error  in PW#3 was never corrected.  Next time someone is
+    > at the ship, they should check this, fix the long pulse, and remake
+    > the bandpass filter for the long pulse.
+    > 
+    > In the short term, you can correct the error by taking all your
+    > long pulse data and changing the header to correctly document the
+    > range resolution.  We have a program to do this, it is called "change_raw".
+    > The source is on any IRIS system, which was installed with the
+    > source, headers, and objects turned on.  It is in the
+    > ${IRIS_ROOT}utils/examples directory.  We can supply you with
+    > a compiled version of this program, if you want.  Available platforms
+    > are Linux, HP-UX, and IRIX.
 
 */
-         
-       if(gate_size_adjustment != 1.0) {
-         printf("Adjusting Gate Size by Factor: %.3f\n",gate_size_adjustment);
-         adjust_gate_size(radar, gate_size_adjustment);
-       }
-       
+      
+    if(gate_size_adjustment != 1.0) {
+      printf("Adjusting Gate Size by Factor: %.3f\n",gate_size_adjustment);
+      adjust_gate_size(radar, gate_size_adjustment);
+    }
+    
  /*
    Create the filename prefix. Consists of the Site ID,
    and time string (YYMMDD_hhmm).  The file suffix is 
    like MIME type (e.g, .gif, .pgm, .uf, etc.)
 */
-       sprintf(time_string,"%4d/%2.2d%2.2d %2.2d:%2.2d UTC", 
-                   radar->h.year, radar->h.month, radar->h.day, 
-                   radar->h.hour, radar->h.minute);
+    sprintf(time_string,"%4d/%2.2d%2.2d %2.2d:%2.2d UTC", 
+            radar->h.year, radar->h.month, radar->h.day, 
+            radar->h.hour, radar->h.minute);
 /*
   Determine the location (lat/lon) of the radar.
  */
-       latitude = radar->h.latd + radar->h.latm/60. + radar->h.lats/3600.;
-       longitude = radar->h.lond + radar->h.lonm/60. + radar->h.lons/3600.;
+    latitude = radar->h.latd + radar->h.latm/60. + radar->h.lats/3600.;
+    longitude = radar->h.lond + radar->h.lonm/60. + radar->h.lons/3600.;
 
-       printf("%s %s %s %.6f %.6f \n",
-              in_file, radar->h.radar_name, time_string, longitude, latitude);
+    printf("%s %s %s %.6f %.6f \n",
+           in_file, radar->h.radar_name, time_string, longitude, latitude);
 
-       sprintf(time_string,"%4d_%2.2d%2.2d_%2.2d%2.2d", 
-                   radar->h.year, radar->h.month, radar->h.day, 
-                   radar->h.hour, radar->h.minute);
+    sprintf(time_string,"%4d_%2.2d%2.2d_%2.2d%2.2d", 
+            radar->h.year, radar->h.month, radar->h.day, 
+            radar->h.hour, radar->h.minute);
 
+    if (radar->h.vcp > 0) printf("VCP %d\n", radar->h.vcp);
 /* 
    Print the radar/volume info.
 */
@@ -317,153 +351,153 @@ main(int argc, char **argv) {
 */
 
 
-       if(verbose) {
-         for(i=0; i< radar->h.nvolumes; i++) {
-           if(radar->v[i] != NULL) {
-             printf("Vol[%2.2d] has %d sweeps\n",i,radar->v[i]->h.nsweeps);
-           } else {
-             printf("Vol[%2.2d] == NULL\n",i);
-           }
-         }
-         printf("--------------------------------------------\n");
-         printf("Number of volumes in radar: %d\n",radar->h.nvolumes);
-       }
-       
-       /* DZ_INDEX */
-       if(radar->v[DZ_INDEX] == NULL) {
-               printf("DZ_INDEX == NULL\n");
-               reflectivity = FALSE;
-       } else {
-               dz_volume = radar->v[DZ_INDEX];
-               if(verbose) printf("Number of sweeps in dz_volume = %d\n",
-                          dz_volume->h.nsweeps);
-       }
-       
-       /* CZ_INDEX */
-       if(radar->v[CZ_INDEX] == NULL) {
-               if(verbose) printf("CZ_INDEX == NULL\n");
-               qc_reflectivity = FALSE;
-       } else {
-               qc_volume = radar->v[CZ_INDEX];
-               if(verbose) printf("Number of sweeps in qc_volume = %d\n",
-                          qc_volume->h.nsweeps);
-       }
-       
-       /* ZT_INDEX */
-       if(radar->v[ZT_INDEX] == NULL) {
-               if(verbose) printf("ZT_INDEX == NULL\n");
-               total_reflectivity = FALSE;
-       } else {
-               zt_volume = radar->v[ZT_INDEX];
-               if(verbose) printf("Number of sweeps in zt_volume = %d\n", 
-                          zt_volume->h.nsweeps);
-       }
-       /* ZD_INDEX */
-       if(radar->v[ZD_INDEX] == NULL) {
-               if(verbose) printf("ZD_INDEX == NULL\n");
-               differential_reflectivity = FALSE;
-       } else {
-               dr_volume = radar->v[ZD_INDEX];
-               if(verbose) printf("Number of sweeps in dr_volume = %d\n", 
-                          dr_volume->h.nsweeps);
-       }
-       /* VR_INDEX */
-       if(radar->v[VR_INDEX] == NULL) {
-               if(verbose) printf("VR_INDEX == NULL\n");
-               velocity = FALSE;
-       } else {
-               vr_volume = radar->v[VR_INDEX];
-               if(verbose) printf("Number of sweeps in vr_volume = %d\n",
-                          vr_volume->h.nsweeps);
-       }
-               
-       /* SW_INDEX */
-       if(radar->v[SW_INDEX] == NULL) {
-               if(verbose) printf("SW_INDEX == NULL\n");
-               spectral_width = FALSE;
-       } else {
-               sw_volume = radar->v[SW_INDEX];
-               if(verbose) printf("Number of sweeps in sw_volume = %d\n",
-                          sw_volume->h.nsweeps);
-       }
-       if(verbose) printf("--------------------------------------------\n");
+    if(verbose) {
+      for(i=0; i< radar->h.nvolumes; i++) {
+        if(radar->v[i] != NULL) {
+          printf("Vol[%2.2d] has %d sweeps\n",i,radar->v[i]->h.nsweeps);
+        } else {
+          printf("Vol[%2.2d] == NULL\n",i);
+        }
+      }
+      printf("--------------------------------------------\n");
+      printf("Number of volumes in radar: %d\n",radar->h.nvolumes);
+    }
+    
+    /* DZ_INDEX */
+    if(radar->v[DZ_INDEX] == NULL) {
+        printf("DZ_INDEX == NULL\n");
+        reflectivity = FALSE;
+    } else {
+        dz_volume = radar->v[DZ_INDEX];
+        if(verbose) printf("Number of sweeps in dz_volume = %d\n",
+               dz_volume->h.nsweeps);
+    }
+    
+    /* CZ_INDEX */
+    if(radar->v[CZ_INDEX] == NULL) {
+        if(verbose) printf("CZ_INDEX == NULL\n");
+        qc_reflectivity = FALSE;
+    } else {
+        qc_volume = radar->v[CZ_INDEX];
+        if(verbose) printf("Number of sweeps in qc_volume = %d\n",
+               qc_volume->h.nsweeps);
+    }
+    
+    /* ZT_INDEX */
+    if(radar->v[ZT_INDEX] == NULL) {
+        if(verbose) printf("ZT_INDEX == NULL\n");
+        total_reflectivity = FALSE;
+    } else {
+        zt_volume = radar->v[ZT_INDEX];
+        if(verbose) printf("Number of sweeps in zt_volume = %d\n", 
+               zt_volume->h.nsweeps);
+    }
+    /* DR_INDEX */
+    if(radar->v[DR_INDEX] == NULL) {
+        if(verbose) printf("DR_INDEX == NULL\n");
+        differential_reflectivity = FALSE;
+    } else {
+        dr_volume = radar->v[DR_INDEX];
+        if(verbose) printf("Number of sweeps in dr_volume = %d\n", 
+               dr_volume->h.nsweeps);
+    }
+    /* VR_INDEX */
+    if(radar->v[VR_INDEX] == NULL) {
+        if(verbose) printf("VR_INDEX == NULL\n");
+        velocity = FALSE;
+    } else {
+        vr_volume = radar->v[VR_INDEX];
+        if(verbose) printf("Number of sweeps in vr_volume = %d\n",
+               vr_volume->h.nsweeps);
+    }
+        
+    /* SW_INDEX */
+    if(radar->v[SW_INDEX] == NULL) {
+        if(verbose) printf("SW_INDEX == NULL\n");
+        spectral_width = FALSE;
+    } else {
+        sw_volume = radar->v[SW_INDEX];
+        if(verbose) printf("Number of sweeps in sw_volume = %d\n",
+               sw_volume->h.nsweeps);
+    }
+    if(verbose) printf("--------------------------------------------\n");
 
 /*
    Print out the elevation angles
 */
-       if(verbose) {
-         if(reflectivity) {
-           printf("Reflectivity Tilts\n");
-           printf("----------------------\n");
-           if(dz_volume != NULL) {
-             for(i=0; i<dz_volume->h.nsweeps; i++) {
-               sweep = dz_volume->sweep[i];
-               if(sweep == NULL) {
-                 printf("sweep[%d]==NULL\n",i);
-                 continue;
-               }
-               printf("Tilt %2d, Elev=%4.1f\n",i,sweep->h.elev);
-             }
-             printf("----------------------\n");
-           }
-         }
-       }
-         /*
-           Print out the values of the rays in each sweep requsted
-         */
-         
-       if(print_azim) {
-         printf("Ray angles\n");
-         if(reflectivity) {
-           for(i=0; i<dz_volume->h.nsweeps; i++) {
-             if(dz_volume->sweep[i] != NULL) sweep = dz_volume->sweep[i];
-             printf("Elevation angle: %f\n",sweep->h.elev);
-             printf("Number of rays in sweep[%d] = %d\n",i,sweep->h.nrays);
-             
-             for(j=0; j<sweep->h.nrays-1; j++) {
-               if(sweep->ray[j] != NULL) {
-                 ray = sweep->ray[j];
-                 printf("%d: %7.2f\n  ",j,sweep->ray[j]->h.azimuth);
-               }
-             }
-           }
-         }
-       }
+    if(verbose) {
+      if(reflectivity) {
+        printf("Reflectivity Tilts\n");
+        printf("----------------------\n");
+        if(dz_volume != NULL) {
+          for(i=0; i<dz_volume->h.nsweeps; i++) {
+        sweep = dz_volume->sweep[i];
+        if(sweep == NULL) {
+          printf("sweep[%d]==NULL\n",i);
+          continue;
+        }
+        printf("Tilt %2d, Elev=%4.1f\n",i,sweep->h.elev);
+          }
+          printf("----------------------\n");
+        }
+      }
+    }
+      /*
+        Print out the values of the rays in each sweep requsted
+      */
+      
+    if(print_azim) {
+      printf("Ray angles\n");
+      if(reflectivity) {
+        for(i=0; i<dz_volume->h.nsweeps; i++) {
+          if(dz_volume->sweep[i] != NULL) sweep = dz_volume->sweep[i];
+          printf("Elevation angle: %f\n",sweep->h.elev);
+          printf("Number of rays in sweep[%d] = %d\n",i,sweep->h.nrays);
+          
+          for(j=0; j<sweep->h.nrays-1; j++) {
+        if(sweep->ray[j] != NULL) {
+          ray = sweep->ray[j];
+          printf("%d: %7.2f\n  ",j,sweep->ray[j]->h.azimuth);
+        }
+          }
+        }
+      }
+    }
 /* 
    Write out some volume statistics
 */
-       if(verbose) {
-         printf("******************* Volume Statistics *******************\n");
-         if(reflectivity) {
-               sweep = RSL_get_first_sweep_of_volume(dz_volume);
-               if(sweep != NULL) {
-                 printf("Number rays        = %d\n", sweep->h.nrays);
-                 printf("Beam width         = %.2f deg\n", sweep->h.beam_width);
-                 ray = RSL_get_first_ray_of_sweep(sweep);
-                 if(ray!= NULL) {
-                       max_range = ray->h.range_bin1/1000.0 + 
-                         ray->h.nbins*ray->h.gate_size/1000.0;
-                       printf("Number of bins     = %d\n",ray->h.nbins);
-                       printf("Max range          = %.1f km\n", max_range);
-                       printf("Range to first bin = %d m\n",ray->h.range_bin1);
-                       printf("Gate size          = %d m\n",ray->h.gate_size);
-                       printf("Pulse Rep. Freq.   = %d Hz\n",ray->h.prf);
-                       printf("Pulse width        = %.2f us\n",ray->h.pulse_width);
-                       printf("Wavelength         = %.2f m\n",ray->h.wavelength);
-                       printf("Frequency          = %.2f \n",ray->h.frequency);
-                 }
-               }
-         }
-       }
+    if(verbose) {
+      printf("******************* Volume Statistics *******************\n");
+      if(reflectivity) {
+        sweep = RSL_get_first_sweep_of_volume(dz_volume);
+        if(sweep != NULL) {
+          printf("Number rays        = %d\n", sweep->h.nrays);
+          printf("Beam width         = %.2f deg\n", sweep->h.beam_width);
+          ray = RSL_get_first_ray_of_sweep(sweep);
+          if(ray!= NULL) {
+            max_range = ray->h.range_bin1/1000.0 + 
+              ray->h.nbins*ray->h.gate_size/1000.0;
+            printf("Number of bins     = %d\n",ray->h.nbins);
+            printf("Max range          = %.1f km\n", max_range);
+            printf("Range to first bin = %d m\n",ray->h.range_bin1);
+            printf("Gate size          = %d m\n",ray->h.gate_size);
+            printf("Pulse Rep. Freq.   = %d Hz\n",ray->h.prf);
+            printf("Pulse width        = %.2f us\n",ray->h.pulse_width);
+            printf("Wavelength         = %.2f m\n",ray->h.wavelength);
+            printf("Frequency          = %.2f \n",ray->h.frequency);
+          }
+        }
+      }
+    }
 
 /*  
-       Add a dBZ offset if requested. The offset can be positive or negative.
-       if(dbz_offset != 0.0) {
-         printf("Adding dbz_offset to dz_volume: %.2f\n", dbz_offset);
-         RSL_add_dbzoffset_to_volume(dz_volume, dbz_offset);
-         printf("Added dbz_offset to dz_volume: %.2f\n", dbz_offset);
-         exit(0);
-       }
+    Add a dBZ offset if requested. The offset can be positive or negative.
+    if(dbz_offset != 0.0) {
+      printf("Adding dbz_offset to dz_volume: %.2f\n", dbz_offset);
+      RSL_add_dbzoffset_to_volume(dz_volume, dbz_offset);
+      printf("Added dbz_offset to dz_volume: %.2f\n", dbz_offset);
+      exit(0);
+    }
 */
 
 /* 
@@ -473,215 +507,234 @@ main(int argc, char **argv) {
 */
 
 
-       /* CZ_INDEX */
-       if(qc_reflectivity) {
-         if(verbose) printf("Loading refl colortable...\n");
-         RSL_load_refl_color_table();
-         for(i=0; i<num_sweeps; i++) {
-           sweep = qc_volume->sweep[i];
-           if(sweep == NULL) {
-             printf("sweep[%d]==NULL\n",i);
-             continue;
-           }
-           if(make_pgm) {
-             sprintf(file_suffix,"pgm");
-             sprintf(filename,"qc_%s_%2.2d.%s", time_string,i,file_suffix);
-             printf("Creating: %s\n", filename);
-             RSL_sweep_to_pgm(sweep, filename, xdim, ydim, maxr);
-           }
-           if(make_gif) {
-             sprintf(file_suffix,"gif");
-             sprintf(filename,"qc_%s_%2.2d.%s", time_string,i,file_suffix);
-             printf("Creating: %s\n", filename);
-             RSL_sweep_to_gif(sweep,filename,xdim, ydim, maxr);
-           }
-         }
-       }
-
-       /* DZ_INDEX */
-       if(reflectivity) {
-         if(verbose) printf("Loading refl colortable...\n");
-         RSL_load_refl_color_table();
-         for(i=0; i<num_sweeps; i++) {
-           sweep = dz_volume->sweep[i];
-           if(sweep == NULL) {
-             printf("sweep[%d]==NULL\n",i);
-             continue;
-           }
-           if(make_pgm) {
-             sprintf(file_suffix,"pgm");
-             sprintf(filename,"dz_%s_%2.2d.%s", 
-                     time_string,i,file_suffix);
-             printf("Creating: %s\n", filename);
-             RSL_sweep_to_pgm(sweep, filename, xdim, ydim, maxr);
-           }
-           if(make_gif) {
-             sprintf(file_suffix,"gif");
-             sprintf(filename,"dz_%s_%2.2d.%s", time_string,i,file_suffix); 
-/*               
-                 sprintf(filename,"dz_%s.%s.%s", time_string,in_file,file_suffix); 
+    /* CZ_INDEX */
+    if(qc_reflectivity) {
+      if(verbose) printf("Loading refl colortable...\n");
+      RSL_load_refl_color_table();
+      for(i=0; i<num_sweeps; i++) {
+        sweep = qc_volume->sweep[i];
+        if(sweep == NULL) {
+          printf("sweep[%d]==NULL\n",i);
+          continue;
+        }
+        if(make_pgm) {
+          sprintf(file_suffix,"pgm");
+          sprintf(filename,"qc_%s_%2.2d.%s", time_string,i,file_suffix);
+          printf("Creating: %s\n", filename);
+          make_pathname(filename, pgmdir, pathname);
+          RSL_sweep_to_pgm(sweep, pathname, xdim, ydim, maxr);
+        }
+        if(make_gif) {
+          sprintf(file_suffix,"gif");
+          sprintf(filename,"qc_%s_%2.2d.%s", time_string,i,file_suffix);
+          printf("Creating: %s\n", filename);
+          make_pathname(filename, gifdir, pathname);
+          RSL_sweep_to_gif(sweep,pathname,xdim, ydim, maxr);
+        }
+      }
+    }
+
+    /* DZ_INDEX */
+    if(reflectivity) {
+      if(verbose) printf("Loading refl colortable...\n");
+      RSL_load_refl_color_table();
+      for(i=0; i<num_sweeps; i++) {
+        sweep = dz_volume->sweep[i];
+        if(sweep == NULL) {
+          printf("sweep[%d]==NULL\n",i);
+          continue;
+        }
+        if(make_pgm) {
+          sprintf(file_suffix,"pgm");
+          sprintf(filename,"dz_%s_%2.2d.%s", 
+              time_string,i,file_suffix);
+          printf("Creating: %s\n", filename);
+          make_pathname(filename, pgmdir, pathname);
+          RSL_sweep_to_pgm(sweep, pathname, xdim, ydim, maxr);
+        }
+        if(make_gif) {
+          sprintf(file_suffix,"gif");
+          sprintf(filename,"dz_%s_%2.2d.%s", time_string,i,file_suffix); 
+/*        
+          sprintf(filename,"dz_%s.%s.%s", time_string,in_file,file_suffix); 
 */
-             printf("Creating: %s\n", filename);
-             RSL_sweep_to_gif(sweep,filename,xdim, ydim, maxr);
-           }
-         }
-       }
-       
-       /* ZT_INDEX */
-       if(total_reflectivity) {
-         if(verbose) printf("Loading refl colortable...\n");
-         RSL_load_refl_color_table();
-         for(i=0; i<num_sweeps; i++) {
-               sweep = zt_volume->sweep[i];
-               if(sweep == NULL) {
-                 printf("sweep[%d]==NULL\n",i);
-                 continue;
-               }
-               if(make_pgm) {
-                 sprintf(file_suffix,"pgm");
-                 sprintf(filename,"zt_%s_%2.2d.%s", 
-                                 time_string,i,file_suffix);
-                 printf("Creating: %s\n", filename);
-                 RSL_sweep_to_pgm(sweep, filename, xdim, ydim, maxr);
-               }
-               if(make_gif) {
-                 sprintf(file_suffix,"gif");
-                 sprintf(filename,"zt_%s_%2.2d.%s", 
-                                 time_string,i,file_suffix);
-                 printf("Creating: %s\n", filename);
-                 RSL_sweep_to_gif(sweep,filename,xdim, ydim, maxr);
-               }
-         }
-       }
-       
-       /* DR_INDEX */
-       if(differential_reflectivity) {
-               scale = 0.5;
-               ncbins = 21;
-               width = 10;
-               printf("Calling RSL_rebin, %d %d %.2f\n", width);
-               RSL_rebin_volume(dr_volume, width);
-               if(verbose) printf("Loading zdr colortable...\n");
-               RSL_load_zdr_color_table(); 
-               for(i=0; i<num_sweeps; i++) {
-                 sweep = dr_volume->sweep[i];
-                 if(sweep == NULL) {
-                       printf("sweep[%d]==NULL\n",i);
-                       continue;
-                 }
-                 if(make_pgm) {
-                       sprintf(file_suffix,"pgm");
-                       sprintf(filename,"dr_%s_%2.2d.%s", 
-                                       time_string,i,file_suffix);
-                       printf("Creating: %s\n", filename);
-                       RSL_sweep_to_pgm(sweep, filename, xdim, ydim, maxr);
-                 }
-                 if(make_gif) {
-                       sprintf(file_suffix,"gif");
-                       sprintf(filename,"dr_%s_%2.2d.%s", 
-                                       time_string,i,file_suffix);
-                       printf("Creating: %s\n", filename);
-                       RSL_sweep_to_gif(sweep,filename,xdim, ydim, maxr);
-                 }
-               }
-       }
-
-       
-       /* VR_INDEX */
-       if(velocity) {
-         if(verbose) printf("Loading vel colortable...\n");
-         RSL_load_vel_color_table();
-         for(i=0; i<num_sweeps; i++) {
-               sweep = vr_volume->sweep[i];
-               if(sweep == NULL) {
-                 printf("sweep[%d]==NULL\n",i);
-                 continue;
-               }
-               if(make_pgm) {
-                 sprintf(file_suffix,"pgm");
-                 sprintf(filename,"vr_%s_%2.2d.%s", time_string,i,file_suffix);
-                 printf("Creating: %s\n", filename);
-                 RSL_sweep_to_pgm(sweep, filename, xdim, ydim, maxr);
-               }
-               if(make_gif) {
-                 sprintf(file_suffix,"gif");
-                 sprintf(filename,"vr_%s_%2.2d.%s", time_string,i,file_suffix);
-                 printf("Creating: %s\n", filename);
-                 RSL_sweep_to_gif(sweep,filename,xdim, ydim, maxr);
-               }
-         }
-       }
-       
-       /* SW_INDEX */
-       if(spectral_width) {
-         if(verbose) printf("Loading sw colortable...\n");
-         RSL_load_sw_color_table();
-         for(i=0; i<num_sweeps; i++) {
-               sweep = sw_volume->sweep[i];
-               if(sweep == NULL) {
-                 printf("sweep[%d]==NULL\n",i);
-                 continue;
-               }
-               if(make_pgm) {
-                 sprintf(file_suffix,"pgm");
-                 sprintf(filename,"sw_%s_%2.2d.%s", 
-                                 time_string,i,file_suffix);
-                 printf("Creating: %s\n", filename);
-                 RSL_sweep_to_pgm(sweep, filename, xdim, ydim, maxr);
-               }
-               if(make_gif) {
-                 sprintf(file_suffix,"gif");
-                 sprintf(filename,"sw_%s_%2.2d.%s", 
-                                 time_string,i,file_suffix);
-                 printf("Creating: %s\n", filename);
-                 RSL_sweep_to_gif(sweep,filename,xdim, ydim, maxr);
-               }
-         }
-       }
-       
+          printf("Creating: %s\n", filename);
+          make_pathname(filename, gifdir, pathname);
+          RSL_sweep_to_gif(sweep,pathname,xdim, ydim, maxr);
+        }
+      }
+    }
+    
+    /* ZT_INDEX */
+    if(total_reflectivity) {
+      if(verbose) printf("Loading refl colortable...\n");
+      RSL_load_refl_color_table();
+      for(i=0; i<num_sweeps; i++) {
+        sweep = zt_volume->sweep[i];
+        if(sweep == NULL) {
+          printf("sweep[%d]==NULL\n",i);
+          continue;
+        }
+        if(make_pgm) {
+          sprintf(file_suffix,"pgm");
+          sprintf(filename,"zt_%s_%2.2d.%s", 
+                  time_string,i,file_suffix);
+          printf("Creating: %s\n", filename);
+          make_pathname(filename, pgmdir, pathname);
+          RSL_sweep_to_pgm(sweep, pathname, xdim, ydim, maxr);
+        }
+        if(make_gif) {
+          sprintf(file_suffix,"gif");
+          sprintf(filename,"zt_%s_%2.2d.%s", 
+                  time_string,i,file_suffix);
+          printf("Creating: %s\n", filename);
+          make_pathname(filename, gifdir, pathname);
+          RSL_sweep_to_gif(sweep,pathname,xdim, ydim, maxr);
+        }
+      }
+    }
+    
+    /* DR_INDEX */
+    if(differential_reflectivity) {
+        scale = 0.5;
+        ncbins = 21;
+        width = 10;
+        printf("Calling RSL_rebin, %d\n", width);
+        RSL_rebin_volume(dr_volume, width);
+        if(verbose) printf("Loading zdr colortable...\n");
+        RSL_load_zdr_color_table(); 
+        for(i=0; i<num_sweeps; i++) {
+          sweep = dr_volume->sweep[i];
+          if(sweep == NULL) {
+            printf("sweep[%d]==NULL\n",i);
+            continue;
+          }
+          if(make_pgm) {
+            sprintf(file_suffix,"pgm");
+            sprintf(filename,"dr_%s_%2.2d.%s", 
+                    time_string,i,file_suffix);
+            printf("Creating: %s\n", filename);
+            make_pathname(filename, pgmdir, pathname);
+            RSL_sweep_to_pgm(sweep, pathname, xdim, ydim, maxr);
+          }
+          if(make_gif) {
+            sprintf(file_suffix,"gif");
+            sprintf(filename,"dr_%s_%2.2d.%s", 
+                    time_string,i,file_suffix);
+            printf("Creating: %s\n", filename);
+            make_pathname(filename, gifdir, pathname);
+            RSL_sweep_to_gif(sweep,pathname,xdim, ydim, maxr);
+          }
+        }
+    }
+
+    
+    /* VR_INDEX */
+    if(velocity) {
+      if(verbose) printf("Loading vel colortable...\n");
+      RSL_load_vel_color_table();
+      for(i=0; i<num_sweeps; i++) {
+        sweep = vr_volume->sweep[i];
+        if(sweep == NULL) {
+          printf("sweep[%d]==NULL\n",i);
+          continue;
+        }
+        if(make_pgm) {
+          sprintf(file_suffix,"pgm");
+          sprintf(filename,"vr_%s_%2.2d.%s", time_string,i,file_suffix);
+          printf("Creating: %s\n", filename);
+          make_pathname(filename, pgmdir, pathname);
+          RSL_sweep_to_pgm(sweep, pathname, xdim, ydim, maxr);
+        }
+        if(make_gif) {
+          sprintf(file_suffix,"gif");
+          sprintf(filename,"vr_%s_%2.2d.%s", time_string,i,file_suffix);
+          printf("Creating: %s\n", filename);
+          make_pathname(filename, gifdir, pathname);
+          RSL_sweep_to_gif(sweep,pathname,xdim, ydim, maxr);
+        }
+      }
+    }
+    
+    /* SW_INDEX */
+    if(spectral_width) {
+      if(verbose) printf("Loading sw colortable...\n");
+      RSL_load_sw_color_table();
+      for(i=0; i<num_sweeps; i++) {
+        sweep = sw_volume->sweep[i];
+        if(sweep == NULL) {
+          printf("sweep[%d]==NULL\n",i);
+          continue;
+        }
+        if(make_pgm) {
+          sprintf(file_suffix,"pgm");
+          sprintf(filename,"sw_%s_%2.2d.%s", 
+                  time_string,i,file_suffix);
+          printf("Creating: %s\n", filename);
+          make_pathname(filename, pgmdir, pathname);
+          RSL_sweep_to_pgm(sweep, pathname, xdim, ydim, maxr);
+        }
+        if(make_gif) {
+          sprintf(file_suffix,"gif");
+          sprintf(filename,"sw_%s_%2.2d.%s", 
+                  time_string,i,file_suffix);
+          printf("Creating: %s\n", filename);
+          make_pathname(filename, gifdir, pathname);
+          RSL_sweep_to_gif(sweep,pathname,xdim, ydim, maxr);
+        }
+      }
+    }
+    
 /*
    Write uf file if requested
 */
-       if(make_uf) {
-               sprintf(file_suffix,"uf.gz");
-               sprintf(filename,"%s_%s.%s",site_id, time_string,file_suffix);
-               printf("Creating UF file: %s\n", filename);
-               RSL_radar_to_uf_gzip(radar, filename);
-       }
-
-       printf("-->> FIELDS: [ ");
-       if(radar->v[0] != NULL) printf("DZ ");
-       if(radar->v[1] != NULL) printf("VR ");
-       if(radar->v[2] != NULL) printf("SW ");
-       if(radar->v[3] != NULL) printf("CZ ");
-       if(radar->v[4] != NULL) printf("ZT ");
-       if(radar->v[5] != NULL) printf("DR ");
-       if(radar->v[6] != NULL) printf("LR ");
-       if(radar->v[7] != NULL) printf("ZD ");
-       if(radar->v[8] != NULL) printf("DM ");
-       if(radar->v[9] != NULL) printf("RH ");
-       if(radar->v[10] != NULL) printf("PH ");
-       if(radar->v[11] != NULL) printf("XZ ");
-       if(radar->v[12] != NULL) printf("CR ");
-       if(radar->v[13] != NULL) printf("MZ ");
-       if(radar->v[14] != NULL) printf("MR ");
-       if(radar->v[15] != NULL) printf("ZE ");
-       if(radar->v[16] != NULL) printf("VE ");
-       if(radar->v[17] != NULL) printf("KD ");
-       if(radar->v[18] != NULL) printf("TI ");
-       if(radar->v[19] != NULL) printf("DX ");
-       if(radar->v[20] != NULL) printf("CH ");
-       if(radar->v[21] != NULL) printf("AH ");
-       if(radar->v[22] != NULL) printf("CV ");
-       if(radar->v[23] != NULL) printf("AV ");
-       if(radar->v[24] != NULL) printf("SQ ");
-       printf("] \n\n");
+    if(make_uf) {
+        sprintf(filename,"%s_%s.%s",site_id, time_string,"uf.gz");
+        printf("Creating UF file: %s\n", filename);
+        make_pathname(filename, ufdir, pathname);
+        RSL_radar_to_uf_gzip(radar, pathname);
+    }
+
+    printf("-->> FIELDS: [ ");
+    /* Modified to use RSL_ftype from rsl.h (#define USE_RSL_VARS) and to
+     * loop through volumes. 10/16/2009, BLK
+     */
+    for (i=0; i < MAX_RADAR_VOLUMES; i++) 
+        if (radar->v[i] != NULL) printf("%s ", RSL_ftype[i]);
+     /* 
+    if(radar->v[0] != NULL) printf("DZ ");
+    if(radar->v[1] != NULL) printf("VR ");
+    if(radar->v[2] != NULL) printf("SW ");
+    if(radar->v[3] != NULL) printf("CZ ");
+    if(radar->v[4] != NULL) printf("ZT ");
+    if(radar->v[5] != NULL) printf("DR ");
+    if(radar->v[6] != NULL) printf("LR ");
+    if(radar->v[7] != NULL) printf("ZD ");
+    if(radar->v[8] != NULL) printf("DM ");
+    if(radar->v[9] != NULL) printf("RH ");
+    if(radar->v[10] != NULL) printf("PH ");
+    if(radar->v[11] != NULL) printf("XZ ");
+    if(radar->v[12] != NULL) printf("CR ");
+    if(radar->v[13] != NULL) printf("MZ ");
+    if(radar->v[14] != NULL) printf("MR ");
+    if(radar->v[15] != NULL) printf("ZE ");
+    if(radar->v[16] != NULL) printf("VE ");
+    if(radar->v[17] != NULL) printf("KD ");
+    if(radar->v[18] != NULL) printf("TI ");
+    if(radar->v[19] != NULL) printf("DX ");
+    if(radar->v[20] != NULL) printf("CH ");
+    if(radar->v[21] != NULL) printf("AH ");
+    if(radar->v[22] != NULL) printf("CV ");
+    if(radar->v[23] != NULL) printf("AV ");
+    if(radar->v[24] != NULL) printf("SQ ");
+      */
+    printf("] \n\n");
 /*
    Wrap it up!
 */
 
     if(verbose)
-           printf("Finished!\n");
+        printf("Finished!\n");
     exit (0);
 
 } /* End of main */