Commit 9819524c authored by Marco Stangalini's avatar Marco Stangalini
Browse files

Upload New File

parent 629104d8
;+
; SHARH@LBT simulation tool
;
; This code simulates the coronographic psf of LBT/SHARK in real seeing conditions.
; A param file in the same working directory is used to configure the code.
; The code works with either simulated or measured AO phase residuals
; See param file for more information on the setup of the code and a complete list of input parameters
;
; HISTORY:
; Sept 2013 added configuration file easy setup (param)
; Sept 2013 telescope jitter simulation added
; Oct 2013 FLAO mode: measured AO residuals (good up to the R=200 mas)
; Nov 2013 LBT interferometric mode
; Nov 2013
; -- LBTI Code by F. Pedichini implemented and integrated
; -- New configuration file added
; -- Sim report file added
; -- Bugs fixed
; Dec 2013
; -- A nasty bug affecting the pixel scale in LBTI mode fixed
; -- pix variable introduced. It contains the pixel scale in mas as obtained from the prop lib
; after the propagation of the beam using the function prop_get_sampling()
; -- brief and incomplete description in the save file added
; -- LBT Focal plane PSF estimation added
;
; Feb 2014
; -- Added possibility to assess occulter off axis displacement. This is done in both single and interferometric mode.
; -- Report filename fixed
; --
;
; Sept 2017
; -- SOUL LBT AO Upgrade added
;
; Jul 2018
; -- Long time series phase screens capabilities added
;
; Author: Marco Stangalini marco.stangalini@inaf.it
;First release August 2013
; May 2017 Bug fixed - Working version
;-
@param
label='SHARK_'
HWRS=0
PRINT, '--------------------------------'
PRINT, 'SHARK SIMULATION RUN...
PRINT, '--------------------------------'
PRINT, SYSTIME()
IF FLAO eq 1 THEN begin
PRINT, 'FLAO ON SKY MODE '
label=label+'FLAO_'
ENDIF
PRINT, 'LAMBDA [MU]', LAMBDA0
PRINT, 'LYOT STOP [%]', RAGGIO_LYOT
PRINT, 'OCCULTER [MU]', RAGGIO_OCCULTER
PRINT, 'OCC. OFF AXIS DISPLACEMENT [mm]', XOFF, YOFF
IF SWING EQ 1 THEN begin
PRINT, 'TELESCOPE SWING YES'
ENDIF
PRINT, '# STEP', NSTEP
PRINT, 'PHASE RESIDUALS', PATH0
print, 'PUPIL SAMPLING [m/pixel]', 8.4/(beam_ratio*lsize)
PRINT, 'BEAM RATIO ', BEAM_RATIO
IF interfmode eq 1 then begin
label=label+'LBTI_'
print, 'LBT INTERFEROMETRIC MODE ACTIVE'
print, 'PUPIL SAMPLING [m/pixel]', Dtot/(beam_ratio*lsize)
print, 'Effective beam ratio = ', (8.4/Dtot)*beam_ratio
s_sampling=Dtot/(beam_ratio*lsize)
npix_pupil=round(8.4d/s_sampling)
if (2*(npix_pupil/2) ne npix_pupil) then begin
npix_pupil=npix_pupil+1
endif
print, 'NPIX PUPIL', NPIX_PUPIL, '(it must be close to 150)'
print, 'WIND SPEED ', WIND_SPEED
PRINT, 'AO LOOP TIME ', phase_sampling, '[ms]
delta_step=round((Cent2Cent_SEP/wind_speed)/(PHASE_SAMPLING))
PRINT, 'WFs step difference ', delta_Step
IF tot_screens lt (step0+nstep+delta_step) then begin
print, '-- WARNING -- number of steps exceeds the number of phase screens available'
print, 'Increase the number of phase screens or reduce the wind speed'
stop
ENDIF
endif
PRINT, '--------------------------------'
PRINT, '--------------------------------'
openw, 33, path+'Report.dat'
PRINTf,33, '--------------------------------'
PRINTf,33, 'SHARK SIMULATION RUN...
PRINTf,33, '--------------------------------'
PRINTf,33, SYSTIME()
PRINTF,33,'FLAO', flao
PRINTf,33, 'LAMBDA [MU]', LAMBDA0
PRINTf,33,'LYOT STOP [%]', RAGGIO_LYOT
PRINTf,33, 'OCCULTER [MU]', RAGGIO_OCCULTER
PRINTF,33, 'OCC. OFF AXIS DISPLACEMENT [mm]', XOFF, YOFF
PRINTF,33, 'LYOT OFF AXIS DISPLACEMENT [mm]', LYOT_XOFF, LYOT_YOFF
printf,33, 'SWING', swing
PRINTf,33, '# STEP', NSTEP
PRINTf,33, 'PHASE RESIDUALS', PATH0
printf,33, 'PUPIL SAMPLING [m/pixel]', 8.4/(beam_ratio*lsize)
PRINTf,33, 'BEAM RATIO ', BEAM_RATIO
printf, 33,'LBT INTERFEROMETRIC MODE', interfmode
printf,33, 'PUPIL SAMPLING [m/pixel]', Dtot/(beam_ratio*lsize)
printf,33, 'Effective beam ratio = ', (8.4/Dtot)*beam_ratio
s_sampling=Dtot/(beam_ratio*lsize)
printf, 33,'WIND SPEED ', WIND_SPEED
PRINTf, 33,'AO LOOP TIME ', phase_sampling, '[ms]
delta_step=round((Cent2Cent_SEP/wind_speed)/(PHASE_SAMPLING))
PRINTf,33, 'WFs step difference ', delta_Step
PRINTf, 33,'--------------------------------'
PRINTf,33, '--------------------------------'
close, 33
;SWING FREQUENCY
AMPLITUDE_TILT_CALIBRATION=0.045e-6
t=FINDGEN(TOT_SCREENS)*PHASE_SAMPLING
MODULATION=AMPLITUDE_TILT_CALIBRATION*(SWING_AMPL/4.12)*SIN(2.*!PI*SWING_FREQ*T)
pupil_distance=Cent2Cent_SEP/2.
pix=0.
XOFF=XOFF/1000. ;CONVERSIONE IN METRI
YOFF=YOFF/1000. ;CONVERSIONE IN METRI
LYOT_XOFF=LYOT_XOFF/1000. ;CONVERSIONE IN METRI
LYOT_YOFF=LYOT_YOFF/1000. ;CONVERSIONE IN METRI
shortcount=0
nframes=fix(inttime/(PHASE_SAMPLING*1000))
nframe_count=0
psf_short=fltarr(lsize,lsize)
psfao_short=fltarr(lsize,lsize)
;prop_run, 'psd_error_map', psf0, lambda0(0), lsize, dx, passvalue=passval_speckle
;print, 'Error map created'
if SOUL eq 1 then begin
WFS_DATA=readfits(path0)
maschera=shift(dist(220,220), 110,110)
maschera=maschera lt 107
endif
if FLAO eq 1 then begin
restore, path0, /v
endif
if SYNTH_FFT eq 1 then begin
paths=file_search(path0+'*.fits')
WFS_DATA=readfits(paths(0))
maschera=shift(dist(220,220), 110,110)
maschera=maschera lt 107
endif
FOR OFF=0,N_ELEMENTS(XOFF)-1 DO BEGIN
for j=0,n_elements(raggio_lyot)-1 do begin
for k=0,N_elements(raggio_occulter)-1 do begin
FOR LAM=0,N_ELEMENTS(LAMBDA0)-1 DO BEGIN
lyot_r=raggio_lyot(j)
occrad=raggio_occulter(k)
print, lyot_r, ' %', occrad, ' lambda/D', lambda0, ' nm'
WFLambda=750. ;nm
WFLambda=wflambda *1e-9 ; in meters
occrad=occrad*1.e-6
WF_res=fltarr(220,200)
WF_turb=fltarr(220,200)
psf_shark=fltarr(lsize,lsize)
psf_AO=fltarr(lsize,lsize)
psf_fp=fltarr(lsize,lsize)
count=0
counter=0
device, decomposed=0
loadct, 5
psf_shark_8th=fltarr(lsize,lsize)
psf_shark_gauss=fltarr(lsize,lsize)
cnt_synth_blocknum=0
cnt_synth=0
;Time LOOP =======================================================
for index = step0, step0+nstep-1 do begin
lambda=lambda0(LAM)*1000*1e-9 ;in meters
if SOUL eq 1 then begin
wf_res = maschera*WFS_data[index,*,*]*1e-9 ;in Dlambda [nm]
endif else begin
cnt_synth_blocknum++
if cnt_synth_blocknum eq 5000 then begin
cnt_synth++
WFS_DATA=readfits(paths(cnt_synth))
cnt_synth_blocknum=1
endif
wf_res = maschera*WFS_data[*,*,cnt_synth_blocknum-1]*1e-9 ;in Dlambda [nm]
endelse
phase_error_res=reform(wf_Res);/(2.*!pi)
temp=dblarr(lsize, lsize)
phase_error_res=congrid(phase_error_res, lsize*beam_ratio, lsize*beam_ratio, cubic=-0.5)
size_temp=lsize*beam_ratio
temp[lsize/2-size_temp/2:lsize/2+size_temp/2-1, lsize/2-size_temp/2:lsize/2+size_temp/2-1]=phase_error_res
phase_error_res=temp
print,index-step0, lyot_r, ' %', occrad, ' lambda/D', lambda0(LAM), ' nm'
passval={beam_ratio:beam_ratio, fase:phase_error_res, occulter:occrad, lyotstop:lyot_R, OSCILLATION:SWING, SWING_a:MODULATION(INDEX),$
pupil_sep:pupil_distance, D0:Dtot, sampl:pix, sampl_fp:pix, SUPPRESSOR:raggio_suppressor, xoff:xoff(OFF), yoff:yoff(OFF),$
LYOT_XOFF:LYOT_XOFF, LYOT_YOFF:LYOT_YOFF, Zer_val:Zer_val, occtype:occtype,$
HWRS:HWRS, zer_num:zer_num}
;prop_run,'psf_lbt_single', psffp, lambda0(LAM), lsize, dx_fp, passvalue=passval,/quiet
prop_run,'pisces_on_axe_phased', psf0, lambda0(LAM), lsize, dx, passvalue=passval,/quiet
prop_run,'pisces_on_axe_mask_2', psf_cor, lambda0(LAM), lsize, dx, passvalue=passval,/quiet
tvframe, psf0^0.3, /asp
M=MAX(PSF0, MA)
psf_shark=psf_shark+psf_cor
psf_AO=psf_AO+psf0
count=count+1
counter=counter+1.
mas=indgen(lsize)*passval.sampl
nframe_count=1+nframe_count
psf_short=psf_short+psf_cor
psfao_short=psfao_short+psf0
if nframe_count eq nframes then begin
IF SHORT_EXP EQ 1 THEN BEGIN
;tvframe, psfao_short^0.5
if occtype eq 'gauss' or occtype eq 'Gauss' then begin
save, filename=path+SUBDIR+label+strtrim(fix(lambda0(0)*1000),1)+'nm_'+'_NSTEP_'+strtrim(shortcount,1)+$
'_Gauss_Occulter_'+strtrim(occrad,1)+'_OFF_AXIS_DISPL_'+strtrim(XOFF(OFF),1)+'_STOP_'+strtrim(lyot_r,1)+'_STOP_DISPL_'+strtrim(lyot_XOFF,1)+'.sav', $
psf_short, psfAO_short, LSIZE, DX, mas,$
description='mas = array [marcsec] -- dx=pixel scal in m -- pix=pixel scale in mas, occrad=occulter R in mu'
endif else begin
save, filename=path+SUBDIR+label+strtrim(fix(lambda0(0)*1000),1)+'nm_'+'_NSTEP_'+strtrim(shortcount,1)+$
'_Lyot_Occulter_'+strtrim(occrad,1)+'_OFF_AXIS_DISPL_'+strtrim(XOFF(OFF),1)+'_STOP_'+strtrim(lyot_r,1)+'_STOP_DISPL_'+strtrim(lyot_XOFF,1)+'.sav', $
psf_short, psfAO_short, LSIZE, DX, mas,$
description='mas = array [marcsec] -- dx=pixel scal in m -- pix=pixel scale in mas, occrad=occulter R in mu'
endelse
shortcount++
psf_short=psf_short*0.
psfao_short=psfao_short*0.
nframe_count=0
ENDIF
endif
endfor
print,'pixel=',passval.sampl,' marcsec'
mas=indgen(lsize)*passval.sampl
mas_fp=indgen(lsize)*passval.sampl_fp
device, decomposed=0
psf_AO=psf_AO/(counter)
psf_shark_lyot=psf_shark/counter
cartop, psf_AO, lsize/2, lsize/2,lsize/2,findgen(lsize/2), 2.*!pi*findgen(360)/360,frt
siz=size(frt)
psf_AO_prof=total(frt,2)/siz(2)
cartop, psf_SHARK_lyot, lsize/2, lsize/2,lsize/2,findgen(lsize/2), 2.*!pi*findgen(360)/360,frt
siz=size(frt)
psf_SHARK_LYOT_prof=total(frt,2)/siz(2)
pix=passval.sampl
pix_fp=passval.sampl_fp
PSF_AO=psf_AO
PSF_CORO=psf_SHARK_LYOT
PSF_CORO_PROF=PSF_SHARK_LYOT_prof
PSF_AO_PROF=psf_ao_prof
plot, psf_ao_prof/max(psf_ao_prof), /ylog, yr=[1e-7,1]
oplot, psf_coro_prof/max(psf_ao_prof), thick=4
if occtype eq 'gauss' or occtype eq 'Gauss' then begin
save, filename=path+label+strtrim(fix(lambda0(LAM)*1000),1)+'nm_'+'_NSTEP_'+strtrim(nstep,1)+$
'_Gauss_Occulter_'+strtrim(occrad,1)+'_OFF_AXIS_DISPL_'+strtrim(XOFF(OFF),1)+'_STOP_'+strtrim(lyot_r,1)+'_STOP_DISPL_'+strtrim(lyot_XOFF,1)+'.sav', $
PSF_AO, nstep, mas, PSF_CORO, dx, PIX, lambda0, PSF_CORO_PROF, occrad, LYOT_R, PSF_AO_PROF,$
description='mas = array [marcsec] -- dx=pixel scal in m -- pix=pixel scale in mas, occrad=occulter R in mu'
endif else begin
save, filename=path+label+strtrim(fix(lambda0(LAM)*1000),1)+'nm_'+'_NSTEP_'+strtrim(nstep,1)+$
'_Lyot_Occulter_'+strtrim(occrad,1)+'_OFF_AXIS_DISPL_'+strtrim(XOFF(OFF),1)+'_STOP_'+strtrim(lyot_r,1)+'_STOP_DISPL_'+strtrim(lyot_XOFF,1)+'.sav', $
PSF_AO, nstep, mas, PSF_CORO, dx, PIX, lambda0, PSF_CORO_PROF, occrad, LYOT_R, PSF_AO_PROF,$
description='mas = array [marcsec] -- dx=pixel scal in m -- pix=pixel scale in mas, occrad=occulter R in mu'
endelse
print, occrad, Lyot_r, lambda
ENDFOR
endfor
endfor
ENDFOR
end
Supports Markdown
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