Skip to content
Snippets Groups Projects
Select Git revision
  • 33caa804e99f090f9adb5d076a316cbad5760620
  • main default protected
  • Kelvinrr-patch-3
  • radius_update
  • revert-616-apollo_pan
  • vims
  • 0.10
  • Kelvinrr-patch-2
  • revert-563-minirf_fix
  • Kelvinrr-patch-1
  • 0.9
  • acpaquette-patch-3
  • acpaquette-patch-2
  • acpaquette-patch-1
  • spiceql
  • ci-coverage
  • 0.10.0
  • 0.9.1
  • 0.9.0
  • 0.8.7
  • 0.8.8
  • 0.8.6
  • 0.8.3
  • 0.8.4
  • 0.8.5
  • 0.8.2
  • 0.8.1
  • 0.8.0
  • 0.7.3
  • 0.7.2
  • 0.7.1
  • 0.7.0
  • 0.6.5
  • 0.6.4
  • 0.6.3
  • 0.6.2
36 results

gtest.cmake

Blame
  • metis_wcs.pro 7.20 KiB
    function metis_wcs, header, cal_pack, ref_detector = ref_detector
    
    	if header.filter.contains('VL', /fold) then $
    		channel = cal_pack.vl_channel else $
    		channel = cal_pack.uv_channel
    
    	boresight = channel.boresight[0]
    	detector_size = channel.detector_size.value
    
    	; compute correct boresight parameters to account for image orientation, binning, and fits convention
    
    	; plate scale
    
    	cdelt1 = boresight.plate_scale.value * header.nbin1
    	cdelt2 = boresight.plate_scale.value * header.nbin2
    	cdelt = [cdelt1, cdelt2]
    
    	; old definitions if boresight parameters in pixel units are used
    
    	; pntpix1 = boresight.pntpix1.value + (nominal_size - 1)/2.
    	; pntpix1 = (pntpix1 + 0.5)/header.nbin1 + 0.5
    	; pntpix2 = boresight.pntpix2.value + (nominal_size - 1)/2.
    	; pntpix2 = (pntpix2 + 0.5)/header.nbin2 + 0.5
    
    	; new definitions if boresight parameters in arcsec units are used
    
    	detector_size = detector_size/sqrt(header.nbin)
    	xcen = (detector_size + 1)/2.
    	ycen = (detector_size + 1)/2.
    
    	; boresight, i.e., io center
    
    	borpix1 = boresight.borpix1.value/cdelt1 + xcen
    	borpix2 = boresight.borpix2.value/cdelt2 + ycen
    	borpix = [borpix1, borpix2]
    
    	; s/c pointing
    
    	pntpix1 = boresight.pntpix1.value/cdelt1 + xcen
    	pntpix2 = boresight.pntpix2.value/cdelt2 + ycen
    	pntpix = [pntpix1, pntpix2]
    
    	; determine spacecract pointing information in the hpc reference frame using the spice kernels
    
    	pointing = solo_get_pointing(header.date_avg, /degrees, /arcsec)
    
    	; NOTE - values are defined as follows:
    	; pointing[0] = yaw (arcsec)
    	; pointing[1] = pitch (arcsec)
    	; pointing[2] = roll (deg)
    
    	; physical coordinates of s/c pointing (i.e., yaw and pitch) in the hpc reference frame
    
    	pntval1 = pointing[0]
    	pntval2 = pointing[1]
    	pntval = [pntval1, pntval2]
    
    	; correct the roll angle value for metis misalignment
    
    	roll = (pointing[2] + boresight.delta_roll.value) * !dtor
    	
    	; wcs rotation matrix in the hpc reference frame
    
    	pc = [[cos(roll), -sin(roll)], [sin(roll), cos(roll)]]
    
    	ctype1 = 'HPLN-TAN'
    	ctype2 = 'HPLT-TAN'
    
    	; if requested, transform the wcs matrix to the detector reference frame and adjust the boresight and spacecraft pointing parameters
    
    	if keyword_set(ref_detector) then begin
    		if header.filter.contains('UV', /fold) then begin
    			borpix_prime = borpix
    			borpix[0] = detector_size - (borpix_prime[1] - 1.)
    			borpix[1] = detector_size - (borpix_prime[0] - 1.)
    			pntpix_prime = pntpix
    			pntpix[0] = detector_size - (pntpix_prime[1] - 1.)
    			pntpix[1] = detector_size - (pntpix_prime[0] - 1.)
    			pc = -reverse(pc, 1)
    			pc = transpose(pc)
    		endif
    		if header.filter.contains('VL', /fold) then begin
    			borpix_prime = borpix
    			borpix[0] = borpix_prime[1]
    			borpix[1] = detector_size - (borpix_prime[0] - 1.)
    			pntpix_prime = pntpix
    			pntpix[0] = pntpix_prime[1]
    			pntpix[1] = detector_size - (pntpix_prime[0] - 1.)
    			roll = roll + !dpi/2.
    			pc = [[cos(roll), -sin(roll)], [sin(roll), cos(roll)]]
    		endif
    	endif
    	
    	; get sun's center pixel
    
    	sunval = [0., 0.]
    	sunpix = (invert(pc) ## (sunval - pntval))/cdelt + pntpix
    
    	; get coordinates of the image center pixel
    
    	crpix = [xcen, ycen]
    	crval = (pc ## (crpix - pntpix)) * cdelt + pntval
    
    	; create the wcs list
    
    	wcs = list()
    
    	wcs.add, { $
    		name: 'WCSNAME', $
    		value: 'Helioprojective-Cartesian', $
    		comment: 'Name of coordinate system'}
    	wcs.add, { $
    		name: 'CTYPE1', $
    		value: ctype1, $
    		comment: ctype1 eq 'HPLT-TAN' ? 'Helioprojective latitude (Solar Y)' : 'Helioprojective longitude (Solar X)'}
    	wcs.add, { $
    		name: 'CTYPE2', $
    		value: ctype2, $
    		comment: ctype2 eq 'HPLT-TAN' ? 'Helioprojective latitude (Solar Y)' : 'Helioprojective longitude (Solar X)'}
    	wcs.add, { $
    		name: 'CUNIT1', $
    		value: 'arcsec', $
    		comment: 'Units along axis 1'}
    	wcs.add, { $
    		name: 'CUNIT2', $
    		value: 'arcsec', $
    		comment: 'Units along axis 2'}
    	wcs.add, { $
    		name: 'PC1_1', $
    		value: pc[0, 0], $
    		comment: 'WCS coordinate transformation matrix'}
    	wcs.add, { $
    		name: 'PC1_2', $
    		value: pc[1, 0], $
    		comment: 'WCS coordinate transformation matrix'}
    	wcs.add, { $
    		name: 'PC2_1', $
    		value: pc[0, 1], $
    		comment: 'WCS coordinate transformation matrix'}
    	wcs.add, { $
    		name: 'PC2_2', $
    		value: pc[1, 1], $
    		comment: 'WCS coordinate transformation matrix'}
    	wcs.add, { $
    		name: 'CDELT1', $
    		value: cdelt[0], $
    		comment: '[arcsec] Pixel scale along axis 1'}
    	wcs.add, { $
    		name: 'CDELT2', $
    		value: cdelt[1], $
    		comment: '[arcsec] Pixel scale along axis 2'}
    	wcs.add, { $
    		name: 'CROTA', $
    		value: atan(pc[0, 1], pc[0, 0]) * !radeg, $
    		comment: '[deg] Rotation angle'}
    	wcs.add, { $
    		name: 'CRVAL1', $
    		value: crval[0], $
    		comment: '[arcsec] Value of reference pixel along axis 1'}
    	wcs.add, { $
    		name: 'CRVAL2', $
    		value: crval[1], $
    		comment: '[arcsec] Value of reference pixel along axis 2'}
    	wcs.add, { $
    		name: 'CRPIX1', $
    		value: crpix[0], $
    		comment: '[pixel] Reference pixel location along axis 1'}
    	wcs.add, { $
    		name: 'CRPIX2', $
    		value: crpix[1], $
    		comment: '[pixel] Reference pixel location along axis 2'}
    	wcs.add, { $
    		name: 'SUN_XCEN', $
    		value: sunpix[0], $
    		comment: '[pixel] Sun center location along axis 1'}
    	wcs.add, { $
    		name: 'SUN_YCEN', $
    		value: sunpix[1], $
    		comment: '[pixel] Sun center location along axis 2'}
    	wcs.add, { $
    		name: 'SUNPIX1', $
    		value: sunpix[0], $
    		comment: '[pixel] Sun center location along axis 1'}
    	wcs.add, { $
    		name: 'SUNPIX2', $
    		value: sunpix[1], $
    		comment: '[pixel] Sun center location along axis 2'}
    	wcs.add, { $
    		name: 'IO_XCEN', $
    		value: borpix[0], $
    		comment: '[pixel] Metis IO center location along axis 1'}
    	wcs.add, { $
    		name: 'IO_YCEN', $
    		value: borpix[1], $
    		comment: '[pixel] Metis IO center location along axis 2'}
    	wcs.add, { $
    		name: 'IOPIX1', $
    		value: borpix[0], $
    		comment: '[pixel] Metis IO center location along axis 1'}
    	wcs.add, { $
    		name: 'IOPIX2', $
    		value: borpix[1], $
    		comment: '[pixel] Metis IO center location along axis 2'}
    	wcs.add, { $
    		name: 'FS_XCEN', $
    		value: crpix[0], $
    		comment: '[pixel] Metis field-stop center location along axis 1'}
    	wcs.add, { $
    		name: 'FS_YCEN', $
    		value: crpix[1], $
    		comment: '[pixel] Metis field-stop center location along axis 2'}
    	wcs.add, { $
    		name: 'FSPIX1', $
    		value: crpix[0], $
    		comment: '[pixel] Metis field-stop center location along axis 1'}
    	wcs.add, { $
    		name: 'FSPIX2', $
    		value: crpix[1], $
    		comment: '[pixel] Metis field-stop center location along axis 2'}
    	wcs.add, { $
    		name: 'SC_XCEN', $
    		value: pntpix[0], $
    		comment: '[pixel] S/C pointing location along axis 1'}
    	wcs.add, { $
    		name: 'SC_YCEN', $
    		value: pntpix[1], $
    		comment: '[pixel] S/C pointing location along axis 2'}
    	wcs.add, { $
    		name: 'SCPIX1', $
    		value: pntpix[0], $
    		comment: '[pixel] S/C pointing location along axis 1'}
    	wcs.add, { $
    		name: 'SCPIX2', $
    		value: pntpix[1], $
    		comment: '[pixel] S/C pointing location along axis 2'}
    	wcs.add, { $
    		name: 'SC_YAW', $
    		value: pointing[0], $
    		comment: '[arcsec] S/C HPC yaw'}
    	wcs.add, { $
    		name: 'SC_PITCH', $
    		value: pointing[1], $
    		comment: '[arcsec] S/C HPC pitch'}
    	wcs.add, { $
    		name: 'SC_ROLL', $
    		value: pointing[2], $
    		comment: '[deg] S/C HPC roll angle'}
    	wcs.add, { $
    		name: 'INN_FOV', $
    		value: 1.6, $
    		comment: '[deg] Inner Metis FOV'}
    	wcs.add, { $
    		name: 'OUT_FOV', $
    		value: 3.4, $
    		comment: '[deg] Outer Metis FOV'}
    
    	return, wcs
    end