; for help: IDL> uvilook,/help ; for version number: IDL> uvilook,/vers ; Ancillary routines ------------------------------------ FUNCTION atan2d,x1,x2 RETURN,DOUBLE(ATAN(x1,x2) * 57.2958) END FUNCTION sind,x RETURN,DOUBLE(sin(x/57.2958)) END FUNCTION cosd,x RETURN,DOUBLE(cos(x/57.2958)) END FUNCTION dfmag,x1,x2,x3 RETURN,double(SQRT(x1*x1+x2*x2+x3*x3)) END PRO dunit,vector,uvector uvector = DBLARR(3) dmag=dfmag(vector[0],vector[1],vector[2]) IF (dmag NE 0) THEN BEGIN uvector=vector/dmag ENDIF ELSE BEGIN uvector[*]=0.0 ENDELSE END PRO vector_to_ra_dec,x,y,z,ra,dec IF((x EQ y) AND (x EQ 0)) THEN BEGIN dec = 90.*z/ABS(z) ra = 0 ENDIF ELSE BEGIN dec = atan2d(z,SQRT(x*x+y*y)) ra = atan2d(y,x) ENDELSE IF(ra LT 0) THEN ra=ra+360 END PRO get_rotm,axis,angle,m ;routine to calculate rotation matrix about an arbitrary axis ;inputs ; axis 3 element vector defining the axis of rotation ; angle scalar giving the angle of rotation ;outputs ; m 3x3 array containing the rotation matrix ; REF: Spacecraft Attitude Determination and Control, ; J.R.Wertz, ed., 1991, eq (E-6). m = DBLARR(3,3) s=DOUBLE(sind(angle)) c=DOUBLE(cosd(angle)) c1=1-c e1=axis[0] e2=axis[1] e3=axis[2] m[0,0] = c1*e1*e1 + c m[1,0] = c1*e1*e2 + e3*s m[2,0] = c1*e1*e3 - e2*s m[0,1] = c1*e1*e2 - e3*s m[1,1] = c1*e2*e2 + c m[2,1] = c1*e2*e3 + e1*s m[0,2] = c1*e1*e3 + e2*s m[1,2] = c1*e2*e3 - e1*s m[2,2] = c1*e3*e3 + c END ; Main routine --------------------------------------------------- PRO uvilook,time,o_gci,a_gci3,dsp_angle,filter,versStr,l0,ra,dec $ ,system=system,help=help,vers=vers ; ;Copyright 1996-2013 United States Government as represented by the ;Administrator of the National Aeronautics and Space Administration. ;All Rights Reserved. ; ;------------------------------------------------------------------ IF(KEYWORD_SET(help)) THEN BEGIN PRINT,'' PRINT,' PRO uvilook,time,o_gci,a_gci3,dsp_angle,filter $ PRINT,' versStr,10,ra,dec PRINT,'' PRINT,' routine calculates central look direction of uvi PRINT,' field of view (in gci coordinates). PRINT,' PRINT,' input PRINT,' time obsolete variable, not used PRINT,' o_gci orbital position vector PRINT,' a_gci3 s/c attitude vector (gci) PRINT,' dsp_angle despun nadir offset angle PRINT,' filter filter index (see below) PRINT,' PRINT,' output PRINT,' versStr sw version string PRINT,' 10 look direction of uvi fov PRINT,' ra right ascension of look direction PRINT,' dec declination of look direction PRINT,' PRINT,' keywords PRINT,' system (in) detector in use PRINT,' PRINT,' library routines PRINT,' dcross_product PRINT,' dunit PRINT,' dmmult PRINT,' vector_to_ra_dec PRINT,' get_rotm PRINT,' PRINT,' PRINT,' notes: PRINT,' filter = 0 BKG PRINT,' = 1 1304 PRINT,' = 2 1356 PRINT,' = 3 LBHS PRINT,' = 4 LBHL PRINT,' = 5 SOLR PRINT,' PRINT,' system =1 PRI, =2 SEC PRINT,' RETURN ENDIF ;Notes ;2/03 Along-track corrections added by Yeh-Kai Tung versStr = 'v1.2a 2/03' IF(kEYWORD_SET(vers)) THEN BEGIN PRINT,'' PRINT, versStr PRINT,'' RETURN ENDIF primary = 1 & secondary = 2 IF(NOT KEYWORD_SET(system)) THEN BEGIN MESSAGE,/INFO,'Assuming primary detector in use.' system=primary ENDIF ELSE BEGIN CASE system OF primary : secondary : ELSE : MESSAGE,'ERROR: Unsupported system value: ' $ +STRTRIM(STRING(system),2) ENDCASE ENDELSE ; calculate look direction in spacecraft frame (lsc). ; defined as a unit vector positioned at the spacecraft, ; perpendicular to the attitude vector, coplanar with ; the attitude and position vectors, and pointing in ; the opposite sense of the position vector. the ; position vector is assumed to point from the center ; of the earth to the spacecraft. the look vector will ; be converted to a unit vector and positioned at the ; spacecraft after it has been converted to the image ; reference frame. ; lsc = (r x a) x a dtemp = DOUBLE(CROSSP(o_gci,a_gci3)) lsc = DOUBLE(CROSSP(dtemp,a_gci3)) ; calculate look direction in despun platform frame (ldsp). ; defined as look direction in spaceraft frame rotated ; about the z-axis by the despun offset angle. get_rotm,a_gci3,dsp_angle,m ldsp = TRANSPOSE(TRANSPOSE(m) # lsc) ldsp = REFORM(ldsp) ; transform from dsp reference frame to uvi reference frame. ; this corresponds to the alignment cube placement relative ; to the dsp. this is the mean pointing error relative to ; the dsp, but does not include the filter-dependent pointing ; error. ;conversion to change from pixels to degrees ;pix_conv = 8.0D/228. ;mean cross track error in pixels ;CASE system OF ; primary : mean_cross_track = 7.0 ; secondary : mean_cross_track = 41.6 ; ELSE : MESSAGE,'ERROR: Unknown system value: '+STRTRIM(STRING(system),2) ;ENDCASE CASE system OF primary : BEGIN mean_cross_track = 7.0 pix_conv = 0.03380D END secondary : BEGIN mean_cross_track = 41.6 pix_conv = 0.03511D END ELSE : MESSAGE,'ERROR: Unknown system value: '+STRTRIM(STRING(system),2) ENDCASE dtemp=DOUBLE(CROSSP(a_gci3,ldsp)) dunit,dtemp,y_img_axis get_rotm,y_img_axis,mean_cross_track*pix_conv,m NOTE_PT_1: ;see comment at end of code luvi = TRANSPOSE(TRANSPOSE(m) # ldsp) luvi = REFORM(luvi) ; transform from uvi reference frame to image plane reference frame. ; the corresponds to the look direction for the center of the image ; plane and is different for each detector and filter combination. ; cross track error in pixels ; along track error in pixels Y-K Tung 2/7/03 ; SOLR cross-track value from J. Spann calibration notes G. Germany 2/18/03 ; NOTE: All cross track values, except for SOLR, were determined from on-orbit ; calibrations. All other values were taken from Jim Spann's ground ; calibration notes. CASE system OF primary : BEGIN CASE filter OF 0 : BEGIN cross_track = 0.0 ;bkg along_track = 0.0 END 1 : BEGIN cross_track = 0.9 ;1304 (2 & 1 from ground calibrations) along_track = -1.0 END 2 : BEGIN cross_track = 2.1 ;1356 (3) along_track = 0.0 END 3 : BEGIN cross_track = 0.0 ;LBHS along_track = 0.0 END 4 : BEGIN cross_track = -5.3 ;LBHL (-5) along_track = 2.0 END 5 : BEGIN cross_track = 6.0 ;SOLR (6) along_track = 8.0 END ELSE: BEGIN cross_track = 0.0 along_track = 0.0 END ENDCASE END secondary : BEGIN CASE filter OF 0 : BEGIN cross_track = 0.0 ;bkg along_track = 0.0 END 1 : BEGIN cross_track = 0.7 ;1304 (1 from ground calibration) along_track = -2.0 END 2 : BEGIN cross_track = 2.7 ;1356 (3) along_track = -1.0 END 3 : BEGIN cross_track = 0.0 ;LBHS along_track = 0.0 END 4 : BEGIN cross_track = -5.3 ;LBHL (-5) along_track = 2.0 END 5 : BEGIN cross_track = 6.0 ;SOLR (6) along_track = 7.0 END ELSE: BEGIN cross_track = 0.0 along_track = 0.0 END ENDCASE END ELSE : MESSAGE,'ERROR: Unknown system value: '+STRTRIM(STRING(system),2) ENDCASE ; Cross-track correction ; NOTE: These two lines commented out for efficiency. ; Y_IMG_AXIS is unchanged by previous rotation ; at NOTE_PT_1 above ; dtemp=DOUBLE(CROSSP(a_gci3,luvi)) ; dunit,dtemp,y_img_axis get_rotm,y_img_axis,cross_track*pix_conv,m limg = TRANSPOSE(TRANSPOSE(m) # luvi) limg = REFORM(limg) ; Along-track correction Y-K Tung 2/7/03 get_rotm, a_gci3, along_track*pix_conv, m2 limg = TRANSPOSE(TRANSPOSE(m2) # limg) limg = REFORM(limg) ; convert look direction to unit vector dunit,limg,l0 ; calculate right ascension & declination (gci) vector_to_ra_dec,l0[0],l0[1],l0[2],ra,dec END