
NOAA GVI GUIDEAppendix K |
Introduction Page,
GVI Guide TOC, Acronyms
This appendix contains a variety of software that can be used to read the Third Generation Weekly Composite GVI header record. The source code for a FORTRAN and a C program are provided to read the header record and output the contents. Job control language is provided (for IBM users) to help the user set up a job using the FORTRAN code. Subroutine Q9EI32 is also included in Assembly language which is called from the FORTRAN program CONVERT.
The FORTRAN code provided (CONVERT) will read the first 512 bytes of any given Third Generation Weekly Composite GVI image and output the contents of the header. The information that is contained in one file header will be different from another file. In other words, the Channel 1 header information will be different from the Channel 2, Channel 4, Channel 5, solar zenith angle, scan angle, precipitable water index, and NDVI files.
The FORTRAN program can either be run interactively or in batch mode. Instructions follow for running the program in either way.
To run the FORTRAN program interactively, the input file should be set to unit 10. Then type: nforvclg, and link the load module, 'nmc.prod.v77w3lib.load' along with the source code. (The load module contains the assembly code for the subroutine Q9EI32 which is provided later in this appendix). The output is sent to standard output, unit 6. All the important information is given. All other bytes in the header are blank and should be ignored.
To run the FORTRAN program in batch mode, use the job control language "header.jcl" as an example. This code sets up the input file as unit 10, and links the appropriate load module to convert the floating point number, "IEEE", into the IBM floating point equivalent.
The Third Generation weekly composite GVI dataset was created using C language on a UNIX workstation. The header is actually a mixed-mode header, containing character, integer and real variables. The header was designed to be read across all platforms, because each variable occurs on a full word boundary. C is an ideal language to read/write this mixed-mode header, because of the benefit of using structures. The following C source code uses the same structure that was used to create the Third Generation Weekly Composite GVI datasets.
PROGRAM CONVRT
C
C PURPOSE: TO CONVERT A 512 BYTE HEADER (MIXED-MODE, WRITTEN IN C) TO
C ITS REAL AND INTEGER ELEMENTS.
C
REAL*4 EQT,LLLAT,URLAT,LLLON,URLON,RESOL,SLOPE,RNTERC
REAL*4 C4SLP,C4INT,C5SLP,C5INT,RCALIN,RCALSL
REAL*4 REQT
INTEGER*4 IEQT,ILLLAT,IURLAT,ILLLON,IURLON,IRESOL,ISLOPE,INTERC
INTEGER*4 IC4SLP,IC4INT,IC5SLP,IC5INT,ICALIN,ICALSL
INTEGER*2 PLATF,SATID,SENSOR,IMTYPE,ORBIT,SATINC,SATRA
INTEGER*2 SATALT,SATNOD,SATSCL,SATSCA,SATCHA,YEAR,MONTH
INTEGER*2 JDAY,BITPIX,NCOLS,NROWS,INTERL,MAPPRO
INTEGER*2 ORIENT,SATULX,SATULY,OVLAY,OLBP,DUMMY,VALUE
INTEGER*2 ICHVAL
CHARACTER*1 HDR(512),DUMMY1,PSTATE
EQUIVALENCE(HDR(1),PLATF)
EQUIVALENCE(HDR(3),SATID)
EQUIVALENCE(HDR(5),SENSOR)
EQUIVALENCE(HDR(7),IMTYPE)
EQUIVALENCE(HDR(9),ORBIT)
EQUIVALENCE(HDR(11),SATINC)
EQUIVALENCE(HDR(13),SATRA)
EQUIVALENCE(HDR(15),SATALT)
EQUIVALENCE(HDR(17),SATNOD)
EQUIVALENCE(HDR(19),SATSCL)
EQUIVALENCE(HDR(21),SATSCA)
EQUIVALENCE(HDR(23),SATCHA)
EQUIVALENCE(HDR(25),YEAR)
EQUIVALENCE(HDR(27),MONTH)
EQUIVALENCE(HDR(29),JDAY)
EQUIVALENCE(HDR(31),DUMMY)
EQUIVALENCE(HDR(33),IEQT)
EQUIVALENCE(HDR(37),PSTATE)
EQUIVALENCE(HDR(41),BITPIX)
EQUIVALENCE(HDR(43),NCOLS)
EQUIVALENCE(HDR(45),NROWS)
EQUIVALENCE(HDR(47),INTERL)
EQUIVALENCE(HDR(49),MAPPRO)
EQUIVALENCE(HDR(51),ORIENT)
EQUIVALENCE(HDR(53),SATULX)
EQUIVALENCE(HDR(55),SATULY)
EQUIVALENCE(HDR(57),ILLLAT)
EQUIVALENCE(HDR(61),IURLAT)
EQUIVALENCE(HDR(65),ILLLON)
EQUIVALENCE(HDR(69),IURLON)
EQUIVALENCE(HDR(73),IRESOL)
EQUIVALENCE(HDR(77),ISLOPE)
EQUIVALENCE(HDR(81),INTERC)
EQUIVALENCE(HDR(85),IC4SLP)
EQUIVALENCE(HDR(89),IC4INT)
EQUIVALENCE(HDR(93),IC5SLP)
EQUIVALENCE(HDR(97),IC5INT)
EQUIVALENCE(HDR(101),ICALSL)
EQUIVALENCE(HDR(105),ICALIN)
EQUIVALENCE(HDR(109),OVLAY)
EQUIVALENCE(HDR(111),OLBP)
REWIND(10)
READ(10,'(512(A1))') HDR
C
C* THE ROUTINE Q9EI32 WILL CONVERT THE INTEGER VARIABLE, CREATED IN
C IEEE ON A UNIX WORKSTATION, INTO ITS IBM FLOATING POINT EQUIVALENT.
C
CALL Q9EI32(IEQT,REQT,1,ISTAT,0)
CALL Q9EI32(ILLLAT,LLLAT,1,ISTAT,0)
CALL Q9EI32(ILLLON,LLLON,1,ISTAT,0)
CALL Q9EI32(IURLAT,URLAT,1,ISTAT,0)
CALL Q9EI32(IURLON,URLON,1,ISTAT,0)
CALL Q9EI32(IRESOL,RESOL,1,ISTAT,0)
CALL Q9EI32(ISLOPE,SLOPE,1,ISTAT,0)
CALL Q9EI32(INTERC,RNTERC,1,ISTAT,0)
CALL Q9EI32(IC4SLP,C4SLP,1,ISTAT,0)
CALL Q9EI32(IC4INT,C4INT,1,ISTAT,0)
CALL Q9EI32(IC5SLP,C5SLP,1,ISTAT,0)
CALL Q9EI32(IC5INT,C5INT,1,ISTAT,0)
CALL Q9EI32(ICALSL,RCALSL,1,ISTAT,0)
CALL Q9EI32(ICALIN,RCALIN,1,ISTAT,0)
WRITE(6,20) 'PLATFORM= ',PLATF
WRITE(6,20) 'SATELLITE ID= ',SATID
WRITE(6,20) 'SENSOR TYPE= ', SENSOR
WRITE(6,20) 'IMAGE TYPE= ', IMTYPE
WRITE(6,20) 'ORBIT NUMBER= ', ORBIT
WRITE(6,20) 'SATELLITE INCLINATION (DEG)= ', SATINC
WRITE(6,20) 'RIGHT ASCENSION OF ACSENDING NODE= ', SATRA
WRITE(6,20) 'SATELLITE ALTITUDE (KM)= ', SATALT
WRITE(6,20) 'NODE OF SATELLITE= ', SATNOD
WRITE(6,20) 'NUMBER OF SCANS LINES/ORBIT= ', SATSCL
WRITE(6,20) 'NUMBER OF SCANS/SCAN LINE= ', SATSCA
WRITE(6,20) 'CHANNEL NUMBER= ', SATCHA
WRITE(6,20) 'YEAR OF DATA= ', YEAR
WRITE(6,20) 'MONTH OF DATA= ', MONTH
WRITE(6,20) 'JULIAN DATE= ', JDAY
WRITE(6,50) 'EQUATORIAL CROSSING TIME (GMT)= ', REQT
WRITE(6,20) 'PROCESSING STATE= ', PSTATE
WRITE(6,20) 'NUMBER OF BITS IN IMAGE PIXEL= ', BITPIX
WRITE(6,20) 'NUMBER OF COLUMNS IN IMAGE FILE= ', NCOLS
WRITE(6,20) 'NUMBER OF ROWS IN IMAGE FILE= ', NROWS
WRITE(6,20) 'STORAGE INTERLEAF= ', INTERL
WRITE(6,20) 'MAP PROJECTION= ', MAPPRO
WRITE(6,20) 'ORIENTATION= ', ORIENT
WRITE(6,20) 'SATELLITE COORD. UPPER LEFT X= ', SATULX
WRITE(6,20) 'SATELLITE COORD. UPPER LEFT Y= ', SATULY
WRITE(6,50) 'LOWER LEFT LATITUDE (DEG)= ', LLLAT
WRITE(6,50) 'UPPER RIGHT LATITUDE (DEG)= ', URLAT
WRITE(6,50) 'LOWER LEFT LONGITUDE (DEG)= ', LLLON
WRITE(6,50) 'UPPER RIGHT LONGITUDE (DEG)= ', URLON
WRITE(6,50) 'RESOLUTION OF DATA(M)= ', RESOL
WRITE(6,50) 'SLOPE FOR CHANNEL (PRE-LAUNCH)= ', SLOPE
WRITE(6,50) 'INTERCEPT FOR CHANNEL (PRE-LAUNCH)= ', RNTERC
WRITE(6,50) 'CHANNEL 4 SLOPE FOR COUNT > 177= ', C4SLP
WRITE(6,50) 'CHANNEL 4 INTERCEPT FOR COUNT > 177= ', C4INT
WRITE(6,50) 'CHANNEL 5 SLOPE FOR COUNT >= 177= ', C5SLP
WRITE(6,50) 'CHANNEL 5 INTERCEPT FOR COUNT >= 177= ', C5INT
WRITE(6,50) 'RECALIB SLOPE FOR CHANNEL (HOLBEN/KAUFMAN)= ', RCALSL
WRITE(6,50) 'RECALIB INTER FOR CHANNEL (HOLBEN/KAUFMAN)= ', RCALIN
WRITE(6,20) 'IS THERE AN OVERLAY?= ', OVLAY
WRITE(6,20) 'NUMBER OF OVERLAY COLORS= ', OLBP
20 FORMAT(A60,1X,I4)
50 FORMAT(A60,1X,F10.2)
END
//WWDOIT JOB (XXXXXXXXXXXXXXX,WWB07,SO),'STEVE:WTDISK',REGION=0K, // TIME=(30,),MSGCLASS=T,MSGLEVEL=(0,0),NOTIFY=$ED12SO //*MAIN CLASS=XACHK,LINES=60,ORG=WWBCK,FAILURE=CANCEL //STEP2 EXEC NFORVCLG,PARM.FORT='XREF' //FORT.SYSPRINT DD SYSOUT=T //FORT.SYSIN DD DSN=CONVERT,DISP=SHR //LKED.SYSPRINT DD SYSOUT=T //LKED.SYSLIB DD // DD // DD DSN=NSS.STNSNIUT.COMMONX.LOAD,DISP=SHR // DD DSN=IMS.COMMON.XLOAD,DISP=SHR // DD DSN=IMS.MVS.CLUE,DISP=SHR // DD DSN=NMC.PROD.V77W3LIB.LOAD,DISP=SHR //LKED.SYSLIN DD DCB=BLKSIZE=3120 //* //GO.FT06F001 DD SYSOUT=T //FT10F001 DD DSN=$ED12SO.CH1,DISP=SHR //GO.SYSIN DD * /* //
Q9EI32 START 0
*$$$ SUBPROGRAM DOCUMENTATION BLOCK
*
* SUBPROGRAM: W3AI49 IEEE 32 BIT F.P. TO IBM370 32 BIT F.P.
* PRGMMR: REJONES ORG: NMC421 DATE:88-06-23
*
* ABSTRACT: FORTRAN CALLABLE SUBROUTINE TO CONVERT 32 BIT IEEE
* FLOATING POINT NUMBERS TO IBM370 32 BIT FLOATING POINT NUMBERS. A
* 32 BIT IEEE FLOATING POINT NUMBER HAS A SIGN BIT,AN 8 BIT EXPONENT,
* AND A 23 BIT FRACTION. THE 1ST BIT OF THE FRACTION IS IMPLICIT
* AND IS NOT STORED. A 32 BIT IBM370 FLOATING POINT NUMBER HAS A 1
* BIT SIGN,A 7 BIT EXPONENT, AND A 24 BIT FRACTION.THE IEEE EXPONENT
* HAS A BASE 2, THE IBM370 BASE 16, THIS CAUSES A DIFFERENCE IN THE
* WAY THE NUMBERS ARE NORMALIZED. WHEN A IEEE FLOATING POINT
* NUMBER IS NORMALIZED THE BIT NEXT TO THE EXPONENT WILL HAVE A 1 IN
* IT. AN IBM370 FLOATING NUMBER CAN HAVE UP TO 3 ZERO BITS AFTER
* THE EXPONENT WHEN THE NUMBER IS NORMALIZED. THESE 3 BITS HAVE TO
* BE COMPUTED AND SUBTRACTED FROM THE IEEE EXPONENT, AND THE
* FRACTION SHIFTED LEFT FOR THE NUMBER OF ZERO BITS. ALL 32 BIT IEEE
* FLOATING POINT NUMBERS WILL CONVERT TO IBM370 FLOATING POINT
* NUMBERS, EXCEPT INFINITY AND NAN NUMBERS WILL BE SET TO ZERO. ONE
* WILL BE ADDED TO ISTAT FOR EACH NAN OR INFINITY NUMBER FOUND.
* DENORMALIZED NUMBERS WILL BE SET TO ZERO, BUT WILL NOT BE
* COUNTED IN ISTAT. UP TO THREE BITS OF PRECISION MAY BE TRUNCATED
* DOING THE CONVERSION.
*
* PROGRAM HISTORY LOG:
* 85-08-03 R.E.JONES
* 88-06-17 R.E.JONES ADDED 5TH PARAMETER FOR ORDER OF BYTES
* IN MEMORY.
*
* USAGE: CALL Q9EI32(A,B,N,ISTAT,IORDER)
* OR CALL W3AI49(A,B,N,ISTAT,IORDER) ALIAS
*
* INPUT VARIABLES:
* NAMES INTERFACE DESCRIPTION OF VARIABLES AND TYPES
* --------- ---------------- -----------------------------------------------
* A ARG LIST REAL*4 IEEE 32 BIT FLOATING POINT NUMBERS,
* BYTES ARE IN 4,3,2,1 ORDER IF IORDER = 1.
* N ARG LIST NUMBER OF IEEE 32 BIT FLOATING POINT NUMBERS.
* IORDER ARG LIST = 0 , BYTES ARE IN 1,2,3,4 ORDER (BIG ENDIAN)
* FROM SUN, APOLLO, MC68881, MC68882, ETC.
* = 1 , BYTES ARE IN 4,3,2,1 ORDER (LITTLE
* ENDIAN) FROM INTEL 8087, 80287, 80387,
* WEITEK 1167, 3167, 4167 COPROCESSORS.
*
* OUTPUT VARIABLES:
* NAMES INTERFACE DESCRIPTION OF VARIABLES & TYPE
* --------- ----------------- -----------------------------------------------
* B ARG LIST ARRAY OF IBM370 32 BIT FLOATING POINT NUMBERS.
* ISTAT ARG LIST 0 , IF ALL IEEE NUMBERS CONVERTED
* +L L IS THE NUMBER OF NAN OR INFINITY NUMBERS
* SET TO ZERO
* -1 IF N IS ZERO OR LESS THEN ZERO
*
* REMARKS: EXECUTION RATES, 20 INSTRUCTIONS FOR ENTRY, SETTING UP
* MAIN LOOP AND EXIT, 10 INSTRUCTIONS FOR ZERO, 30 FOR A POSITIVE
* NUMBER, 32 FOR A NEGATIVE NUMBER. FOR A LARGE ARRAY IT WILL
* TAKE ABOUT 31 INSTRUCTIONS TO CONVERT EACH FLOATING POINT
* NUMBER.
* THE NAS-9050 WILL TAKE ABOUT 1.7 SEC TO CONVERT ONE MILLION
* IEEE 32 BIT FLOATING POINT NUMBERS TO IBM370 FLOATING POINT
* IF IORDER = 1, IT WILL TAKE ABOUT 41 INSTRUCTIONS TO CONVERT
* EACH NUMBER, AND ABOUT 2.0 SEC TO CONVERT ONE MILLION NUMBERS.
*
* IBM SYSTEM/370 PRINCIPLES OF OPERATIONS GA22-7000-9 APPENDIX A.
* FLOATING POINT NUMBERS A5-7.
*
* IEEE TASK 754 STANDARD FLOATING POINT ARITHMETIC.
*
* FORMATS: (BINARY)
* IEEE SEEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF
* IBM370 SEEEEEEE FFFFFFFFFFFFFFFFFFFFFFFF
*
* THE FOLLOWING ARE EXAMPLES OF IEEE AND IBM 32 BIT FLOATING POINT
* IEEE (HEX) IBM (HEX)
* 0 00000000 00 000000
* -0 80000000 N/A
* 1 3F800000 41 100000
* 2 40000000 41 200000
* 3 40400000 41 300000
* 4 40800000 41 400000
* 8 41000000 41 800000
* 15 41700000 41 F00000
* 16 41800000 42 100000
* 32 42000000 42 200000
* -32 C2000000 C2 200000
* -NAN FF8XXXXX N/A FRACTION > 0
* +NAN 7F8XXXXX N/A FRACTION > 0
* -INFINITY FF800000 N/A FRACTION = 0
* +INFINITY 7F800000 N/A FRACTION = 0
* -DENORMALIZE 804XXXXX N/A FRACTION > 0
* +DENORMALIZE 004XXXXX N/A FRACTION > 0
*
* ATTRIBUTES:
* LANGUAGE: IBM ASSEMBLER H V 02
* MACHINE: NAS
*
*$$$
*
GOTO EQU 15 UNCONDITIONAL TRANSFER
PLUS EQU 2
R0 EQU 0
R1 EQU 1
R2 EQU 2
R3 EQU 3
R4 EQU 4
R5 EQU 5
R6 EQU 6
R7 EQU 7
R8 EQU 8
R9 EQU 9
R10 EQU 10
R11 EQU 11
R12 EQU 12
R13 EQU 13
R14 EQU 14
R15 EQU 15
ZERO EQU 8
*
ENTRY Q9EI32
Q9EI32 BC GOTO,12(R15)
DC X'7'
DC CL7'W3AI49'
STM R14,R12,12(R13)
USING W3AI49,R15
L R12,0(R1) PUT ADDRESS OF 1ST PARAM IN R12
L R11,8(R1) PUT ADDRESS OF 3RD PARAM IN R11
L R11,0(R11) PUT N IN R11
L R9,12(R1) PUT ADDRESS OF 4TH PARAM IN R9
SR R0,R0 ZERO R0 FOR ISTAT
LTR R11,R11 TEST N FOR PLUS
BC PLUS,CONT
BCTR R0,0 SET 4TH PARAM TO -1
BC GOTO,EXIT N IS ZERO OR NEGATIVE, EXIT
CONT DS 0H
L R10,16(R1) PUT ADDRESS OF 5TH PARAM IN R10
L R10,0(R10) LOAD IORDER INTO R10
LA R6,3(0,0) LOAD 3 INTO R6
L R1,4(R1) PUT ADDRESS OF 2ND PARAM IN R1
L R7,FRACTION LOAD MASK FOR FRACTION
LA R8,133(0,0) LOAD BIAS IN R8
*
LOOP DS 0H
L R2,0(R12) LOAD 32 BIT F.P. NO. INTO R2
LTR R10,R10 TEST IORDER FOR ZERO
BC ZERO,NREVERSE DO NOT REVERSE ORDER OF BYTES
LR R3,R2 LOAD COPY OF R2 INTO R3
N R3,BYTEMASK MASK OUT BYTES 1 AND 3
SLL R3,8 SHIFT R3 LEFT 8 BITS
SRL R2,8 SHIFT R2 RIGHT 8 BITS
N R2,BYTEMASK MASK OUT BYTES 2 AND 4
OR R2,R3 OR, BYTES ARE IN 2,1,4,3 ORDER
LR R3,R2 LOAD COPY OF R2 INTO R3
SLL R3,16 SHIFT R3 LEFT 16 BITS ,,2,1
SRL R2,16 SHIFT R2 RIGHT 16 BITS 4,3,,
OR R2,R3 OR, BYTES ARE IN 4,3,2,1 ORDER
NREVERSE DS 0H
SR R3,R3 ZERO R3 FOR SIGN BIT
LTR R2,R2 TEST R2 FOR 0
BC ZERO,STORE BRANCH ON ZERO
BC PLUS,GOPLUS BRANCH ON PLUS
L R3,ISIGN PUT SIGN BIT IN R3
N R2,SIGNMASK AND OUT SIGN BIT
GOPLUS DS 0H
LR R4,R2 PUT COPY OF WORD IN R4
O R2,TBIT8 PUT IN MISSING BIT
NR R2,R7 MASK, KEEP FRACTION
SRL R4,23 SHIFT EXPONENT TO RIGHT
LTR R4,R4 TEST R4 FOR 0
BC ZERO,STZERO BRANCH ON EXPONENT ZERO
LA R5,255(0,0) LOAD 255 IN R5
CR R4,R5 TEST FOR NAN AND INFINITY
BC ZERO,OVERFLOW EXPONENT EQUAL TO 255
AR R4,R8 ADD 133 TO EXPONENT
LR R5,R4 LOAD EXPONENT IN R5
NR R5,R6 EXPONENT . AND . 3
XR R4,R5 EXCLUSIVE OR R4 AND R5
SLL R4,22 SHIFT IBM EXPONENT 22 BIT
XR R5,R6 EXCLUSIVE OR R5 AND 3
SRL R2,0(R5) SHIFT INTO POSITION FRACTION
OR R2,R4 OR EXPONENT AND FRACTION
OR R2,R3 OR IN SIGN BIT
BC GOTO,STORE GO STORE IBM F.P. NUMBER
OVERFLOW DS 0H
A R0,ONE ADD 1 TO ISTAT
STZERO DS 0H
SR R2,R2 ZERO R2, FOR IBM F.P ZERO
STORE DS 0H
ST R2,0(R1) STORE 32 BIT F.P. NUMBER IN B
LA R12,4(0,R12) ADD 4 TO ADDRESS OF A
LA R1,4(0,R1) ADD 4 TO ADDRESS OF B
BCT R11,LOOP
*
EXIT DS 0H
ST R0,0(R9) STORE ISTAT IN 4TH PARAM
LM R2,R12,28(R13) RESTORE REGISTERS
MVI 12(R13),X'FF' SET COMPLETION BITS
BCR GOTO,R14 RETURN
*
ADUMMY DC H'0000'
BYTEMASK DC X'00FF00FF'
FRACTION DC X'00FFFFFF'
ISIGN DC X'80000000'
ONE DC X'00000001'
SIGNMASK DC X'7FFFFFFF'
TBIT8 DC X'00800000'
END
#include >stdio.h<
#include >math.h<
#include >malloc.h<
#include >stdlib.h<
/***** The purpose of the C source code is to provide software to read the 512-byte
header at the beginning of every Third Generation GVI Weekly Composite dataset. *****/
static FILE *fp1, *fp2;
struct image_header_desc
{
/***** Satellite Information *****/
short platform; /* 0=tiros-n, 1=noaa, 2=goes, 3=meteosat,
4=landsat, 5=gms, 6=insat */
short sat_id; /* 0=tiros-n, 0=noaa6, 1=noaa7, 2=noaa8,
3=noaa9, 4=noaa10, 5=noaa11, 6=noaa12,
0=goes4, 1=goes5, 2=goes6, 3=goes7,
0=meteosat3, 1=meteosat4, 2=meteosat5
0=landsat4 */
short sensor; /* 0=avhrr, 1=vissr, 2=mss */
short im_type; /* 0=1b avhrr gac, 1=1b lac, 2=gvi daily,
3=gvi weekly, 4=hrpt, 5=apt, 6=ssm/i */
short orbit; /* # of orbits */
short sat_inc; /* Satellite inclination */
short sat_raan; /* Right Ascension of the ascending node */
short sat_alt; /* Satellite altitude */
short sat_node; /* 0=daytime ascending 1=daytime descending*/
short sat_scline; /* # of scan lines/orbit */
short sat_scan; /* # of scans/scan line */
short sat_chan; /* # of channels associated with satellite,
sensor, and image type */
/***** Ancillary/Image data information *****/
short year; /* Year of dataset */
short month; /* Month of dataset */
short jul_date; /* Julian date of dataset */
short pad; /* fill with padding */
float time; /* Time of dataset (eqt x'ing time) */
char data_type; /* Processing state (raw, calibrated,
angular corrected) */
char padd[3]; /* padding */
/***** Image Characteristics *****/
short nbyte_pixl; /* # of bytes per image pixel */
short ncols; /* # of columns in image file */
short nrows; /* # of rows in image file */
short interl; /* Storage interleaf 0=scan,1=pixel,2=chan */
/***** Navigation *****/
short map_proj; /* Map proj. 0=unmapped,1=mercator,2=Polar,
3=Plate Carree */
short orient; /* if polar stereo, provide orientation */
short sat_ulx; /* if mercator, sat. coord upper left x */
short sat_uly; /* if mercator, sat. coord upper left y */
float ll_lat; /* lower left lat. */
float ur_lat; /* upper right lat. */
float ll_lon; /* lower left lon. */
float ur_lon; /* upper right lon. */
float resol; /* resolution */
float slope; /* channel slope */
float intercept; /* channel intercept */
float bt[4]; /* channel 4,5 bt conversion */
float sendeg[2]; /* sensor degradation */
/***** Display *****/
short ovlay; /* overlay? 0=no, 1=yes */
short olbp; /* # of overlay colors */
char padding[400];
}header;
void main(int argc, char *argv[])
{
if (argc != 3)
{
printf("usage -- readheader inputfile outputfile\n");
exit(EXIT_FAILURE);
}
if (!(fp1=fopen(argv[1],"rb")))
{
printf("Cannot open file %s to read\n",argv[1]);
exit(EXIT_FAILURE);
}
if (!(fp2=fopen(argv[2],"w")))
{
printf("Cannot open file %s to write\n",argv[2]);
exit(EXIT_FAILURE);
}
fread(&header,512,1,fp1);
/* Write output to user-defined file */
fprintf(fp2,"platforn = %d\n", header.platform);
fprintf(fp2,"sat_id = %d\n", header.sat_id);
fprintf(fp2,"sensor = %d\n", header.sensor);
fprintf(fp2,"in_type = %d\n", header.im_type);
fprintf(fp2,"orbit = %d\n", header.orbit);
fprintf(fp2,"sat_inc = %d\n", header.sat_inc);
fprintf(fp2,"sat_raan = %d\n", header.sat_raan);
fprintf(fp2,"sat_alt = %d\n", header.sat_alt);
fprintf(fp2,"sat_node = %d\n", header.sat_node);
fprintf(fp2,"sat_scline = %d\n", header.sat_scline);
fprintf(fp2,"sat_scan = %d\n", header.sat_scan);
fprintf(fp2,"sat_chan = %d\n", header.sat_chan);
fprintf(fp2,"year = %d\n", header.year);
fprintf(fp2,"month = %d\n", header.month);
fprintf(fp2,"jul_date = %d\n", header.jul_date);
fprintf(fp2,"time = %f\n", header.time);
fprintf(fp2,"data_type = %d\n", header.data_type);
fprintf(fp2,"nbyte_pixl = %d\n", header.nbyte_pixl);
fprintf(fp2,"ncols = %d\n", header.ncols);
fprintf(fp2,"nrows = %d\n", header.nrows);
fprintf(fp2,"interl = %d\n", header.interl);
fprintf(fp2,"map_proj = %d\n", header.map_proj);
fprintf(fp2,"orient = %d\n", header.orient);
fprintf(fp2,"sat_ulx = %d\n", header.sat_ulx);
fprintf(fp2,"sat_uly = %d\n", header.sat_uly);
fprintf(fp2,"ll_lat = %f\n", header.ll_lat);
fprintf(fp2,"ur_lat = %f\n", header.ur_lat);
fprintf(fp2,"ll_lon = %f\n", header.ll_lon);
fprintf(fp2,"ur_lon = %f\n", header.ur_lon);
fprintf(fp2,"resol = %2f\n", header.resol);
fprintf(fp2,"slope for calibration = %f\n", header.slope);
fprintf(fp2,"intercept for calibration = %f\n", header.intercept);
fprintf(fp2,"Brightness temp. slope for channel 4/5 for count > 177 = %f\n", header.bt[0]);
fprintf(fp2,"Brightness temp. intercept for channel 4/5 for count > 177 = %f\n",
header.bt[1]);
fprintf(fp2,"Brightness temp. slope for channel 4/5 for count >= 177 = %f\n", header.bt[2]);
fprintf(fp2,"Brightness temp. intercept for channel 4/5 for count >= 177 = %f\n",
header.bt[3]);
fprintf(fp2,"Kaufman/Holben sensor degradation slope for channel = %f\n",
header.sendeg[2]);
fprintf(fp2,"Kaufman/Holben sensor degradation slope for channel = %f\n",
header.sendeg[2]);
fprintf(fp2,"ovlay = %d\n", header.ovlay);
fprintf(fp2,"olbp = %d\n", header.olbp);
}
| Previous Section | Top of Page | Next Section |