Commit 82c95640 authored by Alexis Carlotti's avatar Alexis Carlotti
Browse files

Merge branch 'avigan' into 'development'

Merge branch avigan into development

See merge request !2
parents 1aa1cf8a 1ec96875
# misc
hrm-hc/HC_seeing=*
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
env/
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*,cover
.hypothesis/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
target/
# Jupyter Notebook
.ipynb_checkpoints
# pyenv
.python-version
# celery beat schedule file
celerybeat-schedule
# dotenv
.env
# virtualenv
.venv/
venv/
ENV/
# Spyder project settings
.spyderproject
# Rope project settings
.ropeproject
*_flymake.py
......@@ -14,10 +14,10 @@ from utils_basic import minterp2d, DISPER, VECT, VECT1, BEAMSHIFT, ELEVATION, PA
start_time = time.time()
#HARMONI_DIR = '/Users/avigan/data/HARMONI-HC/'
#COM_DIR = '/Users/avigan/data/HARMONI-HC/COMMON_FILES/'
# HARMONI_DIR = '/Users/avigan/Work/HARMONI/Simulations/harmoni-hc/hrm-hc/'
# COM_DIR = '/Users/avigan/Work/HARMONI/Simulations/harmoni-hc/hrm-hc/COMMON_FILES/'
HARMONI_DIR = '/Users/carlotal/harmoni-hc/hrm-hc'
COM_DIR = '/Users/carlotal/harmoni-hc/hrm-hc/common_files/'
COM_DIR = '/Users/carlotal/harmoni-hc/hrm-hc/COMMON_FILES/'
# Artifical dispersion corrector (dispersion is gamma times what it should be)
gamma = 1#%0.1;%1;
......@@ -297,10 +297,10 @@ else:
#MASK = fits.getdata(COM_DIR + 'FPM_HK_SP2_ADC.fits')
# Science wavelength vector
if N_LD==1:
lambda_vect = np.array([np.mean((LBD_min,LBD_max))])
if N_LD == 1:
lambda_vect = np.array([np.mean((LBD_min, LBD_max))])
else:
lambda_vect = np.linspace(LBD_min,LBD_max,N_LD)
lambda_vect = np.linspace(LBD_min, LBD_max, N_LD)
#On sky field rotation necessary for ADI ; NOT A PLANET SIMULATION
Rho_planet = 100
......@@ -397,10 +397,10 @@ N = len(EELT_phase)
PUP = 1-1*(EELT_phase == 0)
if (APODIZER=='SP_1'):
if (APODIZER == 'SP_1'):
IWA_SP = 5
A = fits.getdata(COM_DIR + 'HSP1.fits')
elif (APODIZER=='SP_2'):
elif (APODIZER == 'SP_2'):
IWA_SP = 7
A = fits.getdata(COM_DIR + 'HSP2.fits')
else:
......@@ -409,7 +409,7 @@ else:
log.info('Apodizer: ' + APODIZER)
log.info('Band: ' + BAND)
log.info('FPM: ' + FPM) # this parameter is set as a function of the apodizer & band choice
log.info('FPM: ' + FPM) # this parameter is set as a function of the apodizer & band choice
#EA = ft(A, 1, 1132/1024, 1132/1024, 566/2, 566/2, 1, 566, 566)
#A_big = -np.real(ft(EA, 1, 566/2, 566/2, 1132/1024, 1132/1024, 1, 1132, 1132))
......@@ -484,31 +484,31 @@ OWA_W = 64
D_tel=D
if (CONFIG=='Ideal'):
if (CONFIG == 'Ideal'):
RMS_opt_vect = 10e-9#rms_main[0]
D_opt_vect = D #;%[D, D, D, D, D, D, D, D];
Z_opt_vect = 218e3 #;%[218e3];%[500e3, 500e3, 500e3, 500e3, 500e3, 500e3, 500e3, 500e3];
rot_vect = 1 #;%[0 0 0 1 0 0 0 0];
com_vect = 1 #;%[1 1 1 1 0 0 0 0];
elif (CONFIG=='Relay_PDR_ZELDA_REQUIREMENT'):
elif (CONFIG == 'Relay_PDR_ZELDA_REQUIREMENT'):
RMS_opt_vect = RMS_gamma*[82.1, 20.5, 30.0, 76.9, 615.4, 95.7, 49.2, 13.7, 12.1, 12.7, 13.7, 14.8, 6.1, 6.1, 6.1, 6.1]
D_opt_vect = [D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D]
Z_opt_vect = [120.9e3, 478e3, 323e3, 129.5e3, 12.3e3, 104.9e3, 197.2e3, 713e3, 814e3, 768e3, 716e3, 656e3, 2.1e3, 744e3, 892e3, 2460e3]
rot_vect = [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
com_vect = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0]
elif (CONFIG=='Relay_PDR_ZELDA_GOAL'):
elif (CONFIG == 'Relay_PDR_ZELDA_GOAL'):
RMS_opt_vect = RMS_gamma*[43.6, 10.9, 15.9, 40.9, 326.9, 50.3, 26.2, 7.3, 6.4, 6.7, 7.3, 7.9, 2.9, 2.9, 2.9, 2.9]
D_opt_vect = [D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D]
Z_opt_vect = [120.9e3, 478e3, 323e3, 129.5e3, 12.3e3, 104.9e3, 197.2e3, 713e3, 814e3, 768e3, 716e3, 656e3, 2.1e3, 744e3, 892e3, 2460e3]
rot_vect = [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
com_vect = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0]
elif (CONFIG=='Relay_PDR_ZELDA_OLD'): #%Last optics reprensent SCAO dichroic, whose conj. height is unknown for the moment, but should be a bit higher than the last fold (505 km)
elif (CONFIG == 'Relay_PDR_ZELDA_OLD'): # %Last optics reprensent SCAO dichroic, whose conj. height is unknown for the moment, but should be a bit higher than the last fold (505 km)
RMS_opt_vect = RMS_gamma*[36.6, 11.49, 15.91, 35, 59.72, 39.88, 25.31, 8.1, 7.21, 7.57, 8.06, 8.72, 5, 11, 5, 5]
D_opt_vect = [D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D]
Z_opt_vect = [120.9e3, 478e3, 323e3, 129.5e3, 12.3e3, 104.9e3, 197.2e3, 713e3, 814e3, 768e3, 716e3, 656e3, 2.1e3, 744e3, 892e3, 2460e3]
rot_vect = [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
com_vect = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0]
elif (CONFIG=='Relay_PDR_BASIC_REQUIREMENT'):
elif (CONFIG == 'Relay_PDR_BASIC_REQUIREMENT'):
RMS_opt_vect = RMS_gamma*[25.1, 6.4, 9.5, 23.7, 246.2, 29.3, 15.6, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30]
D_opt_vect = [D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D]
Z_opt_vect = [120.9e3, 478e3, 323e3, 129.5e3, 12.3e3, 104.9e3, 197.2e3, 713e3, 2460e3, 1000e3, 1000e3, 1000e3, 1000e3, 1000e3, 1000e3, 1000e3, 1000e3]
......@@ -563,7 +563,7 @@ dsp_array= dsp
DiamFTO = 2#4
dim = 200#size_dsp/DiamFTO
fmax = (1024/1132)*size_dsp/2 # size_dsp/2
f1D,Xf,Yf,Rf,Tf = VECT(size_dsp,2*fmax)
f1D, Xf, Yf, Rf, Tf = VECT(size_dsp, 2*fmax)
fudge_df = 1#(1024/1132)**2
df = np.abs(f1D[1]-f1D[0])*fudge_df
......@@ -574,8 +574,7 @@ df = np.abs(f1D[1]-f1D[0])*fudge_df
# ____) |_| |_| | | | |__| | |____ / ____ \| | _| |_| |\ | |__| | | |____ / . \| | | |__| |____) | |__| | | \ \| |____ ____) |
# |_____/|_____|_| |_|\____/|______/_/ \_\_| |_____|_| \_|\_____| |______/_/ \_\_| \____/|_____/ \____/|_| \_\______|_____/
#
SR = np.zeros((len(HA_vect),N_LD))
SR = np.zeros((len(HA_vect), N_LD))
log.info('Computing the different exposures...')
for i in range(len(HA_vect)):
......@@ -616,7 +615,7 @@ for i in range(len(HA_vect)):
WF_opt_sensing_0 = np.squeeze(WF_opt_sensing_0)
WF_opt_sensing_NCPA_0 = np.squeeze(WF_opt_sensing_NCPA_0)
WF_corr_0=np.real(M4Magic(COM_DIR,EELT_phase_0+WF_opt_sensing_0, PUPILLE_0, -pix_shift_0[0], -pix_shift_0[1]))
WF_corr_0 = np.real(M4Magic(COM_DIR, EELT_phase_0+WF_opt_sensing_0, PUPILLE_0, -pix_shift_0[0], -pix_shift_0[1]))
#DSP_V, DSP_I = DSP(EELT_phase_0+WF_opt_sensing_0-WF_corr_0+WF_opt_sensing_NCPA_0, 1132/1024, PUPILLE_0, 2, 30)
#log.info('Residual aberrations at HA={0} h: {1} nm'.format(HA_0, 1e9*DSP_V))
......@@ -651,7 +650,7 @@ for i in range(len(HA_vect)):
WF_NCPA_0 = np.squeeze(WF_NCPA_0)
WF_0=(WF_CP_0-WF_corr_0+EELT_phase_0+WF_NCPA_0)
DSP_V,DSP_I = DSP(WF_0,BigD/D,np.transpose(ORIGINAL_PUPIL),0,1000)
DSP_V, DSP_I = DSP(WF_0, BigD/D, np.transpose(ORIGINAL_PUPIL), 0, 1000)
log.info('HA={0}: Aberration level (0-1000 lambda/D) at {1} nm: {2} nm'.format(HA_0, lambda_vect[k]*1e9, 1e9*DSP_V))
#DSP_V, DSP_I = DSP(WF_CP_0+EELT_phase_0+WF_NCPA_0, 1132/1024, PUPILLE_0, 2, 30)
......@@ -662,11 +661,11 @@ for i in range(len(HA_vect)):
OWA = MAS2LD(FOV, 38.542, lambda_vect[k])/2
if ADC_flag == 1:
#alpha_disp_0 = MAS2LD(1000*DISPER_ADC(1.45,lambda_vect[k]*1e6,90-ELEVATION(DEC,HA_0),z_min,z_max),38.542,lambda_vect[k])-MAS2LD(1000*DISPER_ADC(1.45,lambda_vect[-1]*1e6,90-ELEVATION(DEC,HA_0),z_min,z_max),38.542,lambda_vect[k])
alpha_disp_0 = MAS2LD(1000*DISPER_ADC(lambda_vect[0]*1e6,lambda_vect[k]*1e6,90-ELEVATION(DEC,HA_0),z_min,z_max),38.542,lambda_vect[k])
#alpha_disp_0 = MAS2LD(1000*DISPER_ADC(1.45, lambda_vect[k]*1e6, 90-ELEVATION(DEC, HA_0), z_min, z_max), 38.542, lambda_vect[k])-MAS2LD(1000*DISPER_ADC(1.45, lambda_vect[-1]*1e6, 90-ELEVATION(DEC, HA_0), z_min, z_max), 38.542, lambda_vect[k])
alpha_disp_0 = MAS2LD(1000*DISPER_ADC(lambda_vect[0]*1e6, lambda_vect[k]*1e6, 90-ELEVATION(DEC, HA_0), z_min, z_max), 38.542, lambda_vect[k])
else:
#alpha_disp_0 = MAS2LD(1000*DISPER(1.45,lambda_vect[k]*1e6,90-ELEVATION(DEC,HA_0)),38.542,lambda_vect[k])-MAS2LD(1000*DISPER(1.45,lambda_vect[-1]*1e6,90-ELEVATION(DEC,HA_0)),38.542,lambda_vect[k])
alpha_disp_0 = MAS2LD(1000*DISPER(lambda_vect[0]*1e6,lambda_vect[k]*1e6,90-ELEVATION(DEC,HA_0)),38.542,lambda_vect[k])
#alpha_disp_0 = MAS2LD(1000*DISPER(1.45, lambda_vect[k]*1e6, 90-ELEVATION(DEC, HA_0)), 38.542, lambda_vect[k])-MAS2LD(1000*DISPER(1.45, lambda_vect[-1]*1e6, 90-ELEVATION(DEC, HA_0)), 38.542, lambda_vect[k])
alpha_disp_0 = MAS2LD(1000*DISPER(lambda_vect[0]*1e6, lambda_vect[k]*1e6, 90-ELEVATION(DEC, HA_0)), 38.542, lambda_vect[k])
#log.info('Differential dispersion angle with 2.45um: {0}'.format(alpha_disp_0))
x, X, Y, R, T = VECT(len(SP), 1132/1024)
......@@ -674,17 +673,17 @@ for i in range(len(HA_vect)):
E_0 = ft(np.transpose(SP)*(1-MISSSEG)*np.exp(2*1j*pi*WF_0/lambda_vect[k])*np.exp(-2*1j*pi*alpha_disp_0*Y), 1, BigD/D, BigD/D, 2*OWA, 2*OWA, 1, N_im, N_im)
#Commented to save time ; halo only
I_0=np.abs(E_0)**2
I_0 = np.abs(E_0)**2
#HALO
FT2DSP_norm=1e-18*(2*pi/lambda_vect[k])**2
FT2DSP_norm = 1e-18*(2*pi/lambda_vect[k])**2
# Normalisation by maximum of phase autocorrelation (in 0) = phase variance
# then PHASE STRUCTURE FUNCTION (Roddier) = 2*(autocol(0, 0) - autocol(u, v))
# then Atmospheric Optical Transfert function
FT_PST = RENORM_FT_DSP*FT2DSP_norm
#Rotation of FT_PST to simulate changing wind direction
FT_PST = rotate(FT_PST, Wind_Angle, order=1, reshape = False)
FT_PST = rotate(FT_PST, Wind_Angle, order=1, reshape=False)
PH_STR = 2*(FT_PST[int(size_dsp//2+1), int(size_dsp//2+1)]-FT_PST)
......@@ -702,12 +701,12 @@ for i in range(len(HA_vect)):
FTO_tel_0 = ft(I_s_0, 1, 2*OWA, 2*OWA, DiamFTO, DiamFTO, 1, len(dsp), len(dsp))
I_s_post_0 = np.abs(ft(FTO_tel_0*FTO_atm, 1, DiamFTO, DiamFTO, 2*OWA, 2*OWA, 1, N_im, N_im))
I_s_0_ForSR = np.abs(ft(np.transpose(ORIGINAL_PUPIL),1,BigD/D,BigD/D,2*OWA,2*OWA,1,len(dsp),len(dsp)))**2
FTO_tel_0_ForSR = ft(I_s_0_ForSR,1,2*OWA,2*OWA,DiamFTO,DiamFTO,1,len(dsp),len(dsp))
SR[i,k] = np.sum(np.abs(FTO_tel_0_ForSR*FTO_atm))/np.sum(np.abs(FTO_tel_0_ForSR))
I_s_0_ForSR = np.abs(ft(np.transpose(ORIGINAL_PUPIL), 1, BigD/D, BigD/D, 2*OWA, 2*OWA, 1, len(dsp), len(dsp)))**2
FTO_tel_0_ForSR = ft(I_s_0_ForSR, 1, 2*OWA, 2*OWA, DiamFTO, DiamFTO, 1, len(dsp), len(dsp))
SR[i, k] = np.sum(np.abs(FTO_tel_0_ForSR*FTO_atm))/np.sum(np.abs(FTO_tel_0_ForSR))
log.info('Wavelength {:4d}/{:4d} - {:.2f} min left'.format(k+1, N_LD, t_left))
log.info(' => Strehl at {:4.2f}nm: {:4.2f}'.format(lambda_vect[k]*1e9,SR[i,k]))
log.info(' => Strehl at {:4.2f}nm: {:4.2f}'.format(lambda_vect[k]*1e9, SR[i, k]))
#Normalization of I_s_post_0 to reflect a unit energy arriving on
#the pupil, i.e., we just have to multiply the PSF by the number of
......@@ -747,9 +746,9 @@ for i in range(len(HA_vect)):
I_temp = APPLY_CROSSTALK(I_temp)
if ADC_flag == 1:
shift_pix_FPM = 0.5*(LD2MAS(IWA_SP,38.542,lambda_vect[N_LD-1])-LD2MAS(IWA_SP,38.542,lambda_vect[0]) + 1000*DISPER_ADC(lambda_vect[0]*1e6,lambda_vect[N_LD-1]*1e6,z_max,z_min,z_max))
DISPER_MAX = DISPER_ADC(lambda_vect[0]*1e6,lambda_vect[N_LD-1]*1e6,z_max,z_min,z_max)
DISPER_Z = DISPER_ADC(lambda_vect[0]*1e6,lambda_vect[N_LD-1]*1e6,90-ELEVATION(DEC,HA_0),z_min,z_max)
shift_pix_FPM = 0.5*(LD2MAS(IWA_SP, 38.542, lambda_vect[N_LD-1])-LD2MAS(IWA_SP, 38.542, lambda_vect[0]) + 1000*DISPER_ADC(lambda_vect[0]*1e6, lambda_vect[N_LD-1]*1e6, z_max, z_min, z_max))
DISPER_MAX = DISPER_ADC(lambda_vect[0]*1e6, lambda_vect[N_LD-1]*1e6, z_max, z_min, z_max)
DISPER_Z = DISPER_ADC(lambda_vect[0]*1e6, lambda_vect[N_LD-1]*1e6, 90-ELEVATION(DEC, HA_0), z_min, z_max)
shift_pix_FPM *= (DISPER_MAX-DISPER_Z)/DISPER_MAX
# Mask offset ; non-zero when mask is *not* the one that should be ideally be used (required because of limited number of slots in FPM wheel)
......@@ -758,31 +757,31 @@ for i in range(len(HA_vect)):
# Conversion from mas to pixel
shift_pix_FPM /= MASperPIXEL
else:
shift_pix_FPM = 0.5*(LD2MAS(IWA_SP,38.542,lambda_vect[N_LD-1])-LD2MAS(IWA_SP,38.542,lambda_vect[0]) + 1000*DISPER(lambda_vect[0]*1e6,lambda_vect[N_LD-1]*1e6,z_max))
DISPER_MAX = DISPER(lambda_vect[0]*1e6,lambda_vect[N_LD-1]*1e6,z_max)
DISPER_Z = DISPER(lambda_vect[0]*1e6,lambda_vect[N_LD-1]*1e6,90-ELEVATION(DEC,HA_0))
shift_pix_FPM = 0.5*(LD2MAS(IWA_SP, 38.542, lambda_vect[N_LD-1])-LD2MAS(IWA_SP, 38.542, lambda_vect[0]) + 1000*DISPER(lambda_vect[0]*1e6, lambda_vect[N_LD-1]*1e6, z_max))
DISPER_MAX = DISPER(lambda_vect[0]*1e6, lambda_vect[N_LD-1]*1e6, z_max)
DISPER_Z = DISPER(lambda_vect[0]*1e6, lambda_vect[N_LD-1]*1e6, 90-ELEVATION(DEC, HA_0))
shift_pix_FPM *= (DISPER_MAX-DISPER_Z)/DISPER_MAX
shift_pix_FPM /= MASperPIXEL
#print('FPM offset: {:f}'.format(shift_pix_FPM))
#MASK_temp = MASK
MASK_temp = shift(MASK, [-shift_pix_FPM,0], output=None, order=1, mode='constant', cval=0.0, prefilter=True)
MASK_temp = shift(MASK, [-shift_pix_FPM, 0], output=None, order=1, mode='constant', cval=0.0, prefilter=True)
for k in range(N_LD):
if ADC_flag == 1:
shift_value = 1000*DISPER_ADC(lambda_vect[0]*1e6,lambda_vect[k]*1e6,90-ELEVATION(DEC,HA_0),z_min,z_max)
shift_value = 1000*DISPER_ADC(lambda_vect[0]*1e6, lambda_vect[k]*1e6, 90-ELEVATION(DEC, HA_0), z_min, z_max)
shift_value /= MASperPIXEL
else:
shift_value = 1000*DISPER(lambda_vect[0]*1e6,lambda_vect[k]*1e6,90-ELEVATION(DEC,HA_0))
shift_value = 1000*DISPER(lambda_vect[0]*1e6, lambda_vect[k]*1e6, 90-ELEVATION(DEC, HA_0))
shift_value /= MASperPIXEL
#print(shift_value*MASperPIXEL)
I_temp[k,:,:] = I_temp[k,:,:]*np.flipud(MASK_temp)
I_temp[k, :, :] = I_temp[k, :, :]*np.flipud(MASK_temp)
I_temp[k,:,:] = shift(I_temp[k,:,:], [shift_value,0], output=None, order=1, mode='constant', cval=0.0, prefilter=True)
I_temp[k, :, :] = shift(I_temp[k, :, :], [shift_value, 0], output=None, order=1, mode='constant', cval=0.0, prefilter=True)
image_filename = path_directory + 'PSF_HALO_ON_masked_centered_Nexp{0:04d}.fits'.format(i)
image_filename_nomask = path_directory + 'PSF_HALO_ON_notmasked_centered_Nexp{0:04d}.fits'.format(i)
......@@ -792,7 +791,7 @@ for i in range(len(HA_vect)):
fits.setval(image_filename, 'TELESCOP', value='ESO-ELT')
fits.setval(image_filename, 'INSTRUME', value='HARMONI')
fits.setval(image_filename, 'EXPTIME', value='{:.3f}'.format(T_exp*3600))
fits.setval(image_filename, 'AIRMASS', value='{:.3f}'.format(1/np.cos(np.pi/180*(90-ELEVATION(DEC*1.0,HA_0)))))
fits.setval(image_filename, 'AIRMASS', value='{:.3f}'.format(1/np.cos(np.pi/180*(90-ELEVATION(DEC*1.0, HA_0)))))
fits.setval(image_filename, 'PI-COI', value='NIRANJAN')
fits.setval(image_filename, 'DISPELEM', value=BAND)
fits.setval(image_filename, 'APODIZER', value=APODIZER)
......@@ -803,7 +802,7 @@ for i in range(len(HA_vect)):
fits.setval(image_filename_nomask, 'TELESCOP', value='ESO-ELT')
fits.setval(image_filename_nomask, 'INSTRUME', value='HARMONI')
fits.setval(image_filename_nomask, 'EXPTIME', value='{:.3f}'.format(T_exp*3600))
fits.setval(image_filename_nomask, 'AIRMASS', value='{:.3f}'.format(1/np.cos(np.pi/180*(90-ELEVATION(DEC*1.0,HA_0)))))
fits.setval(image_filename_nomask, 'AIRMASS', value='{:.3f}'.format(1/np.cos(np.pi/180*(90-ELEVATION(DEC*1.0, HA_0)))))
fits.setval(image_filename_nomask, 'PI-COI', value='NIRANJAN')
fits.setval(image_filename_nomask, 'DISPELEM', value=BAND)
fits.setval(image_filename_nomask, 'APODIZER', value=APODIZER)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment