C+ C NAME: C NicHdr C PURPOSE: C Converts SMEI double precision header to binary trailer for Nic file C and v.v C CALLING SEQUENCE: subroutine NicHdr(id,hdr,cTrailer) C INPUTS: C id integer 0: convert to binary C 1: convert from binary C INCLUDE: include 'filparts.h' include 'smei_frm_hdr.h' include 'smei_frm_layout.h' C CALLS: C Say, Time2Str, Str2Str, Time2Day8,Time2JD, Time2YDoy, Time2Delta C Time2HMS, ArrR8Zero, cInt2Str C MODIFICATION HISTORY: C JUN-2004, Paul Hick (UCSD/CASS) C MAR-2005, Paul Hick (UCSD/CASS; pphick@ucsd.edu) C Fixed bug in constructing hdr array from cTrailer. itrim was used C to shorten cTrailer before processing. This can erase a trailing C blank space (32B). Very bad. C- integer id double precision hdr(*) character cTrailer*(*) character cSay*6 /'NicHdr'/ real*8 dStr( 64) real fStr(128) integer nStr(128) integer*2 iStr(256) integer*1 bStr(512) character cStr*512 equivalence (dStr, fStr, nStr, iStr, bStr, cStr) real*8 dGet real fGet(2) integer nGet(2) integer*2 iGet(4) equivalence (dGet, fGet, nGet, iGet) integer tt (2) integer uu (2) integer tt0(2) integer hms(4) double precision dtime integer Time2Str integer Str2Str character cInt2Str*14 character cOut*(FIL__LENGTH) if (id .eq. 0) then do I=1,len(cStr) ! Trailing chars should be null char cStr(I:I) = char(0) end do nStr( 1) = nint( hdr(SMEI__HDR_FRAME_NR ) ) ! Frame number bStr( 5) = nint( hdr(SMEI__HDR_CAMERA ) ) ! Camera bStr( 6) = nint( hdr(SMEI__HDR_ROI_MAP ) ) ! ROI map used bStr( 7) = nint( hdr(SMEI__HDR_MODE ) ) ! Mode bStr( 8) = nint( hdr(SMEI__HDR_TAGMODE ) ) ! Tagging mode iStr( 5) = nint( hdr(SMEI__HDR_BITPIX ) ) ! Bits per pixels bStr( 11) = nint( hdr(SMEI__HDR_FULL_FRAME ) ) ! Full frame representation bStr( 12) = nint( hdr(SMEI__HDR_SHUTTER ) ) ! Shutter open flag nStr( 4) = nint( hdr(SMEI__HDR_NAXES ) ) ! Hor frame size nStr( 5) = nint( hdr(SMEI__HDR_NAXES+1 ) ) ! Vert frame size nStr( 6) = nint( hdr(SMEI__HDR_N_DATA ) ) ! Total # pixels tt0(1) = 1 tt0(2) = 86400000/2 call Time2YDoy(1,tt0,2000,tt0) ! Noon, Jan 1, 2000 tt(1) = nint( hdr(SMEI__HDR_TIME ) ) tt(2) = nint( hdr(SMEI__HDR_TIME+1) ) call Time2Delta(tt,tt0,uu) call Time2Day8(0,uu,dtime) ! Days since noon, Jan 1, 2000 dtime = nint(dtime*86400d0) dStr( 4) = dtime ! Frame start s/c time dtime = nint(dtime+hdr(SMEI__HDR_EXPOSURE)) dStr( 5) = dtime ! Frame stop s/c time call Time2JD(0,tt,uu) call Time2Day8(0,uu,dtime) dStr( 6) = dtime ! Frame start Julian date call Time2YDoy(0,tt,iyr,uu) iStr( 25) = iyr ! Frame start Year iStr( 26) = uu(1) ! Frame start Doy call Time2HMS(0,uu,hms) iStr( 27) = hms(1) ! Frame start Hour iStr( 28) = hms(2) ! Frame start Minute fStr( 15) = sngl( hms(3)+hms(4)/1000d0 ) ! Frame start Seconds fStr( 16) = sngl( hdr(SMEI__HDR_RA ) ) ! RA of frame center fStr( 17) = sngl( hdr(SMEI__HDR_DEC ) ) ! Decl of frame center fStr( 18) = sngl( hdr(SMEI__HDR_ANGLE ) ) ! Position angle, clockwise from north (deg) dStr( 10) = hdr(SMEI__HDR_QUAT ) ! Quaternion dStr( 11) = hdr(SMEI__HDR_QUAT+1 ) ! Quaternion dStr( 12) = hdr(SMEI__HDR_QUAT+2 ) ! Quaternion dStr( 13) = hdr(SMEI__HDR_QUAT+3 ) ! Quaternion dStr( 14) = hdr(SMEI__HDR_RQUAT ) ! Quaternion dStr( 15) = hdr(SMEI__HDR_RQUAT+1 ) ! Quaternion dStr( 16) = hdr(SMEI__HDR_RQUAT+2 ) ! Quaternion dStr( 17) = hdr(SMEI__HDR_RQUAT+3 ) ! Quaternion fStr( 35) = sngl( hdr(SMEI__HDR_SUN ) ) ! Sun fStr( 36) = sngl( hdr(SMEI__HDR_SUN+1 ) ) ! Sun fStr( 37) = sngl( hdr(SMEI__HDR_SUN+2 ) ) ! Sun fStr( 38) = sngl( hdr(SMEI__HDR_MOON ) ) ! Moon fStr( 39) = sngl( hdr(SMEI__HDR_MOON+1 ) ) ! Moon fStr( 40) = sngl( hdr(SMEI__HDR_MOON+2 ) ) ! Moon bStr(161) = nint( hdr(SMEI__HDR_DARK_OFFSET ) ) ! Dark offset performed bStr(162) = nint( hdr(SMEI__HDR_FLATFIELD ) ) ! Flatfield performed bStr(163) = nint( hdr(SMEI__HDR_COSMIC_RAYS ) ) ! Cosmic rays removed bStr(164) = nint( hdr(SMEI__HDR_CALIBRATION ) ) ! Radiance calibration dGet = hdr(SMEI__HDR_BAD_DATA) ! Blank value for double fStr( 42) = fGet(1) fStr( 43) = fGet(2) fStr( 44) = -999.0 ! Blank value for float nStr( 45) = -65535 ! Blank value for long integer iStr( 91) = -1 ! Blank value for short integer nGet(1) = nint( hdr(SMEI__HDR_OBS_FRAME ) ) ! Frame sequence number iStr(92) = iGet(1) iStr(93) = iGet(2) bStr(187) = nint( hdr(SMEI__HDR_FLAT_ENABLED) ) ! Onboard flatfield on bStr(188) = nint( hdr(SMEI__HDR_LED_ENABLED ) ) ! LED on bStr(189) = nint( hdr(SMEI__HDR_BOS_ALERT ) ) ! Brigh-object sensor alert bStr(190) = nint( hdr(SMEI__HDR_BOS_CHANGE ) ) ! BOS change state counter bStr(191) = nint( hdr(SMEI__HDR_FIXED_BITS ) ) ! Bits fixed from parity checking bStr(192) = nint( hdr(SMEI__HDR_CORRUPT_PIX ) ) ! Corrupted pixels at end of data bStr(193) = nint( hdr(SMEI__HDR_CR_HITS ) ) ! Pixels blanked in CR detection bStr(194) = 0 ! Quality flag fGet(1) = sngl( hdr(SMEI__HDR_ATTITUDE_DT ) ) ! Quat time discrepancy (sec) iStr(98) = iGet(1) iStr(99) = iGet(2) fGet(1) = sngl( hdr(SMEI__HDR_CCD_TEMP ) ) ! CCD temperature iStr(100) = iGet(1) iStr(101) = iGet(2) ! UCSD extensions ! 2*60 bytes for TLM and L1A file names do I=0,14 dStr(32+1+I) = hdr(SMEI__HDR_TLM_FILE+I) end do nStr(64+31) = nint( hdr(SMEI__HDR_L1A_PNTR ) ) ! Pointer into L1A file cTrailer = cStr else cStr = cTrailer do I=len(cTrailer)+1,len(cStr) ! Trailing chars should be null char cStr(I:I) = char(0) end do call ArrR8Zero(SMEI__HDR_N,hdr) hdr(SMEI__HDR_FRAME_NR) = dble( nStr( 1) ) ! Frame number hdr(SMEI__HDR_CAMERA ) = dble( bStr( 5) ) ! Camera hdr(SMEI__HDR_ROI_MAP ) = dble( bStr( 6) ) ! ROI map used hdr(SMEI__HDR_MODE ) = dble( bStr( 7) ) ! Mode hdr(SMEI__HDR_TAGMODE ) = dble( bStr( 8) ) ! Tagging mode hdr(SMEI__HDR_BITPIX ) = dble( iStr( 5) ) ! Bits per pixels hdr(SMEI__HDR_FULL_FRAME ) = dble( bStr( 11) ) ! Full frame representation hdr(SMEI__HDR_SHUTTER ) = dble( bStr( 12) ) ! Shutter open flag hdr(SMEI__HDR_NAXES ) = dble( nStr( 4) ) ! Hor frame size hdr(SMEI__HDR_NAXES+1 ) = dble( nStr( 5) ) ! Vert frame size hdr(SMEI__HDR_N_DATA ) = dble( nStr( 6) ) ! Total # pixels hms(1) = iStr(27) ! Frame start Hour hms(2) = iStr(28) ! Frame start Minute hms(3) = int(fStr(15)) ! Frame start Seconds hms(4) = nint((fStr(15)-hms(3))*1000) ! Frame start mSec (always 0) call Time2HMS(1,tt,hms) tt(1) = tt(1)+iStr(26) ! Frame start Doy+Time of Day i = iStr(25) ! Year; i2 -> i4 call Time2YDoy(1,tt,i,tt) ! Frame start time hdr(SMEI__HDR_TIME ) = dble( tt(1) ) ! Frame start time hdr(SMEI__HDR_TIME+1 ) = dble( tt(2) ) ! The time in START_UT is the same time (start of frame) as stored in YR,DOY,HOUR,MINUTE ! and SECOND field. Check to make sure that they are; stop if not. tt0(1) = 1 tt0(2) = 43200000 call Time2YDoy(1,tt0,2000,tt0) ! Noon, Jan 1, 2000 call Time2Delta(tt,tt0,uu) ! Time difference with 1 Jan 2000, 12 UT i = uu(1)*86400+uu(2)/1000 if (i .ne. nint(dStr(4))) then j = 0 j = j+Str2Str('inconsistent start_ut in',cOut(i+1:))+1 j = j+Time2Str(SMEI__UT_FORMAT,tt,cOut(i+1:)) call Say(cSay,'E','start_ut', cOut) end if call Time2JD(0,tt,uu) call Time2Day8(0,uu,dtime) if (dtime .ne. dStr(6)) then j = 0 j = j+Str2Str('inconsistent julian date in',cOut(i+1:))+1 j = j+Time2Str(SMEI__UT_FORMAT,tt,cOut(i+1:)) call Say(cSay,'E','julian', cOut) end if i = nint(dStr(5)-dStr(4)) if (i .ne. 4) call Say(cSay,'W','exposure','time in seconds is '//cInt2Str(i)) hdr(SMEI__HDR_EXPOSURE ) = dble(i) ! Frame exposure time in seconds hdr(SMEI__HDR_RA ) = dble( fStr( 16) ) ! RA of frame center hdr(SMEI__HDR_DEC ) = dble( fStr( 17) ) ! Decl of frame center hdr(SMEI__HDR_ANGLE ) = dble( fStr( 18) ) ! Position angle, clockwise from north (deg) hdr(SMEI__HDR_QUAT ) = dStr( 10) ! Quaternion hdr(SMEI__HDR_QUAT+1 ) = dStr( 11) ! Quaternion hdr(SMEI__HDR_QUAT+2 ) = dStr( 12) ! Quaternion hdr(SMEI__HDR_QUAT+3 ) = dStr( 13) ! Quaternion hdr(SMEI__HDR_RQUAT ) = dStr( 14) ! Quaternion hdr(SMEI__HDR_RQUAT+1 ) = dStr( 15) ! Quaternion hdr(SMEI__HDR_RQUAT+2 ) = dStr( 16) ! Quaternion hdr(SMEI__HDR_RQUAT+3 ) = dStr( 17) ! Quaternion hdr(SMEI__HDR_SUN ) = dble( fStr( 35) ) ! Sun hdr(SMEI__HDR_SUN+1 ) = dble( fStr( 36) ) ! Sun hdr(SMEI__HDR_SUN+2 ) = dble( fStr( 37) ) ! Sun hdr(SMEI__HDR_MOON ) = dble( fStr( 38) ) ! Moon hdr(SMEI__HDR_MOON+1 ) = dble( fStr( 39) ) ! Moon hdr(SMEI__HDR_MOON+2 ) = dble( fStr( 40) ) ! Moon hdr(SMEI__HDR_VENUS ) = 0d0 hdr(SMEI__HDR_VENUS+1 ) = 0d0 hdr(SMEI__HDR_VENUS+2 ) = 0d0 hdr(SMEI__HDR_DARK_OFFSET ) = dble( bStr(161) ) ! Dark offset performed hdr(SMEI__HDR_FLATFIELD ) = dble( bStr(162) ) ! Flatfield performed hdr(SMEI__HDR_COSMIC_RAYS ) = dble( bStr(163) ) ! Cosmic rays removed hdr(SMEI__HDR_CALIBRATION ) = dble( bStr(164) ) ! Radiance cal fGet(1) = fStr( 42) fGet(2) = fStr( 43) hdr(SMEI__HDR_BAD_DATA ) = dble( dGet ) ! Blank value for double iGet(1) = iStr(92) iGet(2) = iStr(93) hdr(SMEI__HDR_OBS_FRAME ) = dble( nGet( 1) ) ! Frame sequence number hdr(SMEI__HDR_FLAT_ENABLED ) = dble( bStr(187) ) ! Onboard flatfield on hdr(SMEI__HDR_LED_ENABLED ) = dble( bStr(188) ) ! LED on hdr(SMEI__HDR_BOS_ALERT ) = dble( bStr(189) ) ! Brigh-object sensor alert hdr(SMEI__HDR_BOS_CHANGE ) = dble( bStr(190) ) ! BOS change state counter hdr(SMEI__HDR_FIXED_BITS ) = dble( bStr(191) ) ! Bits fixed from parity checking hdr(SMEI__HDR_CORRUPT_PIX ) = dble( bStr(192) ) ! Corrupted pixels at end of data hdr(SMEI__HDR_CR_HITS ) = dble( bStr(193) ) ! Pixels blanked in CR detection iGet(1) = iStr(98) iGet(2) = iStr(99) hdr(SMEI__HDR_ATTITUDE_DT ) = dble( fGet(1) ) ! Quat time discrepancy (sec) iGet(1) = iStr(100) iGet(2) = iStr(101) hdr(SMEI__HDR_CCD_TEMP ) = dble( fGet(1) ) ! CCD temperature ! UCSD extensions do i=0,14 ! 2 60-char file names hdr(SMEI__HDR_TLM_FILE+i) = dStr(32+1+i) ! TLM and L1A file end do hdr(SMEI__HDR_L1A_PNTR) = dble( nStr(64+31) ) ! Pointer into L1A file end if return end