AMSU-A Sample Read Program
/* $Id$ */ 
/*****************************************************************************/ 
/* Name: amsuareader.c - Read AMSU-A swath data in HDF-EOS format */ 
/* */ 
/* Usage: amsuareader filename [N] */ 
/* filename - Name of AMSU-A data file */ 
/* N - Scan line to read, 1-#scans in file */ 
/* */ 
/* Description: */ 
/* Read the Nth scan line from the given file, or the first if "N" is */ 
/* not specified. This file contains the following routines: */ 
/* */ 
/* main - Main program */ 
/* */ 
/* Notes: */ 
/* Makes a lot of assumptions about the file's format. */ 
/* */ 
/* Revision history: */ 
/* 99-02-10 BEB Written */ 
/* 00-08-07 BEB Updated to new format */ 
/*****************************************************************************/ 
#include <stdio.h> 
  #include <strings.h> 
  #include <stdlib.h> 
  #include <df.h> 
  #include <HdfEosDef.h> 
  #include "SDP_Utilities.h" 
#define XTRACK 30 /* Cross-track dimension */ 
  #define NDATAS 15 /* Number of data fields */ 
/* Static data */
static float64 Time; /* Time value */ 
  static float32 Latitude[XTRACK]; /* Latitude values */ 
  static float32 Longitude[XTRACK]; /* Longitude values */ 
  static float32 Data[NDATAS][XTRACK]; /* Data values */ 
/* Data field names */
static char *Datanames[NDATAS] = { 
"23800.37 MHz", 
"31400.42 MHz", 
"50299.91 MHz", 
"52799.39 MHz", 
"53595.41 +- 115 MHz", 
"54399.53 MHz", 
"54940.64 MHz", 
"55498.70 MHz", 
"57290.33 MHz", 
"57290.33 +- 217 MHz", 
"57290.33 +- 322.2 +- 48 MHz", 
"57290.33 +- 322.2 +- 22 MHz", 
"57290.33 +- 322.2 +- 10 MHz", 
"57290.33 +- 322.2 +- 4.5 MHz", 
"88997.00 MHz" 
  }; 
/* Local functions */
static int readAMSUA(char *name, int n); 
  static void writeAMSUA(int n); 
/*---------------------------------------------------------------------------*/ 
  /* Name: main - Main program for AMSU-A reader */ 
  /* */ 
  /* Usage: int result = main(int argc, char *argv[]); */ 
  /* argc - Count of arguments */ 
  /* argv - Array of arguments */ 
  /* result - Exit status */ 
  /* */ 
  /* Description: */ 
  /* Parse the command-line arguments and pass them to the reader. */ 
  /* */ 
  /* Notes: */ 
  /* None. */ 
  /* */ 
  /* Revision history: */ 
  /* 99-02-10 BEB Written */ 
  /*---------------------------------------------------------------------------*/ 
int 
  main(int argc, char *argv[]) { 
 int n; /* Desired scan number */ 
  /* Check the calling sequence */ 
 if (argc < 2 || argc > 3) { 
  printf("Usage is amsuareader filename [N]\n"); 
  return (0); 
  } 
/* Get the scan number, if any */
 if (argc == 3) { 
  if (sscanf(argv[2], "0", &n) != 1 || n < 1) { 
  printf("Scan number is invalid\n"); 
  return (1); 
  } 
  } else { 
  n = 1; 
  } 
/* Call the reader */
 if (readAMSUA(argv[1], n) != 0) 
  return (1); 
/* Display the results */
 writeAMSUA(n); 
  return (0); 
  } 
/*---------------------------------------------------------------------------*/ 
  /* Name: readAMSUA - Read one scan line of AMSU-A data */ 
  /* */ 
  /* Usage: int result = readAMSUA(char *name, int n); */ 
  /* name - Name of file to read */ 
  /* n - Number of scan line */ 
  /* result - Non-zero on errors */ 
  /* */ 
  /* Description: */ 
  /* Read scan line "n" (1-#scans) from "name" and store it into the */ 
  /* global variables. */ 
  /* */ 
  /* Notes: */ 
  /* None. */ 
  /* */ 
  /* Revision history: */ 
  /* 99-02-10 BEB Written */ 
  /*---------------------------------------------------------------------------*/ 
static int 
  readAMSUA(char *name, int n) { 
 int32 fid; /* File identifier */ 
  int32 swid; /* Swath identifier */ 
  int32 size; /* Size of things */ 
  int32 start[2]; /* Start index array */ 
  int32 edge[2]; /* Edge count array */ 
  int f; /* Loop counter */ 
  char swname[64]; /* Swath name */ 
/* Open the file */
 if ((fid = SWopen(name, DFACC_READ)) == -1) { 
  printf("Unable to open '' for reading", name); 
  return (-1); 
  } 
/* Retrieve the name of the swath within the file */
 if (SWinqswath(name, swname, &size) != 1) { 
  printf("Wrong number of swath objects in ''\n", name); 
  return (-1); 
  } 
/* Attach to the swath */
 if ((swid = SWattach(fid, swname)) == -1) { 
  printf("Unable to attach to ''\n", swname); 
  return (-1); 
  } 
/* See how many scan lines in this file */
 if ((size = SWdiminfo(swid, "Track")) == -1) { 
  printf("Unable to determine the value of 'Track'\n"); 
  return (-1); 
  } 
/* Check the user's value */
 if (n > size) { 
  printf("Sorry, there are only 0 scans in this file\n", size); 
  return (-1); 
  } 
/* Read in the data */
 start[0] = n - 1; 
  edge[0] = 1; 
 start[1] = 0; 
  edge[1] = XTRACK; 
 if (SWreadfield(swid, "Time", start, NULL, edge, &Time) != 0) { 
  printf("Error reading 'Time' value\n"); 
  return (-1); 
  } 
 if (SWreadfield(swid, "Latitude", start, NULL, edge, Latitude) != 0) { 
  printf("Error reading 'Latitude' values\n"); 
  return (-1); 
  } 
 if (SWreadfield(swid, "Longitude", start, NULL, edge, Longitude) != 0) { 
  printf("Error reading 'Longitude' values\n"); 
  return (-1); 
  } 
 for (f = 0; f < NDATAS; f++) { 
  if (SWreadfield(swid, Datanames[f], start, NULL, edge, Data[f]) != 0) { 
  printf("Error reading '' values\n", Datanames[f]); 
  return (-1); 
  } 
  } 
/* All OK */
 (void) SWdetach(swid); 
  (void) SWclose(fid); 
  return (0); 
  } 
/*---------------------------------------------------------------------------*/ 
  /* Name: writeAMSUA - Output data from globals */ 
  /* */ 
  /* Usage: writeAMSUA(int n); */ 
  /* n - Scan number */ 
  /* */ 
  /* Description: */ 
  /* Display the data assembled in the global variables. */ 
  /* */ 
  /* Notes: */ 
  /* None. */ 
  /* */ 
  /* Revision history: */ 
  /* 99-02-10 BEB Written */ 
  /*---------------------------------------------------------------------------*/ 
static void 
  writeAMSUA(int n) { 
 char utc[28]; /* Time stamp */ 
  int i; /* Local index */ 
  int f; /* Local index */ 
/* Convert the TAI value to UTC */
(void) SDP_TD_TAItoUTC((float64) Time, utc);
/* Write out the first line */
printf("Scan 0 at \n\n", n, utc);
/* Header */
 printf(" Field 1 Field 2 Field 3 Field 4 Field 5\n"); 
  printf(" Field 6 Field 7 Field 8 Field 9 Field 10\n"); 
  printf(" Lat. Lon. Field 11 Field 12 Field 13 Field 14 Field 15\n"); 
  printf("-- ------ ------- -------- -------- -------- -------- --------\n"); 
/* Loop through the data */
 for (i = 0; i < XTRACK; i++) { 
  printf(" 0", i + 1); 
  printf(" 0.00", Latitude[i]); 
  printf(" 0.00", Longitude[i]); 
  for (f = 0; f < NDATAS; f++) { 
  if (f > 0 && f % 5 == 0) 
  printf("\n "); 
  printf(" 0.00", Data[i][f]); 
  } 
  printf("\n"); 
  } 
  }