📄 zern_save.pro
字号:
; $Id: zern_save.pro,v 1.1.1.1 2002/03/12 11:53:46 riccardi Exp $
;
; A. Riccardi, Dipartimento di Astronomia di Firenze (Italy).
; e-mail address: riccardi@arcetri.astro.it
; Please, send me a message if you modify this code.
function ref_symm, j_even, m_even, m
refs = [1, 1]
if (m eq 0) then return, refs
if (j_even xor m_even) then refs(0)=-1
if (not j_even) then refs(1)=-1
return, refs
end
function cen_symm, m_even
if (m_even) then return, 1 else return, -1
end
pro zern_save, sampling, jmax, filename, JMIN=jmin, RATIO=ratio, $
COMP_DOUBLE=comp_double, SAVE_DOUBLE=save_double, PUPIL=pupil, INFOS=infos, $
VERBOSE=verbose
;+
; ZERN_SAVE, Sampling, Jmax, Filename
;
; KEYWORDS:
; JMIN: integer scalar. Minimum value of polynomial index.
; JMIN=1 if undefined.
; RATIO: real scalar. If undefined is set to 1.
; COMP_DOUBLE: set it to compute data as double (float default).
; SAVE_DOUBLE: set it to save data as double (float default).
; INFOS: array of info structures (see ZERN_INFOS). If is defined
; info structures are used (faster). Be carefull that infos
; data have the same type as specified by COMP_FLOAT.
; PUPIL: array, same dim's as R. Pupil to store. If undefined
; R<=1. is used.
; VERBOSE:if set uses verbose style
;
; save an array of Zernike polynomial images into a file
; First image is always the pupil.
;
; The file have the following structure:
;
; HEADER: 2+8+2+2+2 = 16 byte
; { zern_header,
; sampling: integer; dim of polynomial array (only a quarter saved)
; ratio: double; x max (y max) sampled (see MAKE_XY)
; jmin: integer; min value of polynomial index
; jmax: integer; max value of polynomial index
; is_double: integer; true if polymial are saved as double typed
; }
;
; DATA: structured as:
; { zern_data,
; j: integer; polynomial index
; n: integer; radial degree
; m: integer; azimuthal frequency
; ref_symm: 2 elements integer vector (values: +/-1); reflection
; symm's, ref_symm(0): x(y?) reflection, ref_symm(1): y ref.
; cen_symm: integer (value: +/-1); center symmetry
; poly: sampling/2 x sampling/2 array, if SAVE_DOUBLE is true
; then array is double type, else is float type.
; }
;
;-
if (n_elements(jmin) eq 0) then $
jmin = 1
if (n_elements(ratio) eq 0) then $
ratio = 1.
make_xy, sampling, ratio, r, theta, /polar, double=comp_double, /quarter
header = $
{ zern_header, $
sampling : fix(sampling), $
ratio : double(ratio), $
jmin : fix(jmin), $
jmax : fix(jmax), $
is_double : fix(keyword_set(save_double)) $
}
header_len = n_tags(header,/LEN)
;;;openw, unit, filename, /get_lun
openw, unit, filename, /get_lun
zern = assoc(unit, header)
zern(0)=header
close, unit
if (keyword_set(save_double)) then $
data = $
{ zern_data, $
j : 0, $
n : 0, $
m : 0, $
ref_symm : [1, 1], $
cen_symm : 1, $
poly : double(r) $
} $
else $
data = $
{ zern_data, $
j : 0, $
n : 0, $
m : 0, $
ref_symm : [1, 1], $
cen_symm : 1, $
poly : float(r) $
}
openu, unit, filename, /get_lun
zern = assoc(unit, {zern_data}, header_len)
if (n_elements(pupil) eq 0) then $
data.poly = (r le 1.) $
else $
data.poly = pupil
zern(0)=data
is_verbose = keyword_set(verbose)
if (n_elements(infos) eq 0) then begin
jz=1
for j=jmin,jmax do begin
if (is_verbose) then begin
print, j
flush,-1
endif
zern_degree, j, n, m
j_even = is_even(j)
m_even = is_even(m)
data.j = j
data.n = n
data.m = m
data.ref_symm = ref_symm(j_even, m_even, m)
data.cen_symm = cen_symm(m_even)
data.poly = zern_polar(j, r, theta)
zern(jz) = data
jz=jz+1
endfor
endif else begin
n_infos=n_elements(infos)
jz=1
for i=0,n_infos-1 do begin
j=infos(i).j
if ((infos(i).j ge jmin) and (infos(i).j le jmax)) then begin
if (is_verbose) then begin
print, j
flush,-1
endif
data.j=infos(i).j
data.n=infos(i).n
data.m=infos(i).m
j_even = is_even(infos(i).j)
m_even = is_even(infos(i).m)
data.ref_symm = ref_symm(j_even, m_even, infos(i).m)
data.cen_symm = cen_symm(m_even)
data.poly = zern_ipolar(infos(i), r, theta)
zern(jz) = data
jz=jz+1
endif
endfor
endelse
close, unit
return
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -