NOAA GVI GUIDE

Appendix K

Introduction Page, GVI Guide TOC, Acronyms
Previous Section, Next Section

APPENDIX K: Software for Reading the Third Generation Weekly Composite GVI Header

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.

K.1 FORTRAN Source code:

        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                                                             


K.2 Sample JCL (Header.jcl):

//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 * /* //

K.3 Subroutine Q9EI32 (Assembly language):

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

K.4 Source code for C module:

#include #include #include #include /***** 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