Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions fhd_core/setup_metadata/fhd_path_setup.pro
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ FUNCTION fhd_path_setup,file_path_vis,data_directory=data_directory,filename=fil
IF Keyword_Set(file_path_vis) THEN BEGIN
filename=file_basename(file_path_vis,'.sav',/fold_case) ;visibilities may be stored in an IDL save file, instead of uvfits
filename=file_basename(filename,'.uvfits',/fold_case)
filename=file_basename(filename,'.h5',/fold_case)
filename=file_basename(filename,'_cal',/fold_case) ;sometimes "_cal" is present, sometimes not.
data_directory=file_dirname(file_path_vis)
ENDIF
Expand Down
11 changes: 5 additions & 6 deletions fhd_core/setup_metadata/fhd_struct_init_obs.pro
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,11 @@ FUNCTION fhd_struct_init_obs,file_path_vis,hdr,params,layout,dimension=dimension
grid_nfreq_avg=grid_nfreq_avg,_Extra=extra
;initializes the structure containing frequently needed parameters relating to the observation
IF N_Elements(instrument) EQ 0 THEN instrument='mwa' ELSE instrument=StrLowCase(instrument)
obsname=file_basename(file_basename(file_path_vis,'.uvfits',/fold_case),'_cal',/fold_case)
obsname=file_basename(file_basename(file_path_vis,'.uvfits',/fold_case),'.h5',/fold_case)
git,'describe',result=code_version,repo_path=rootdir('fhd'),args='--long --dirty'
IF N_Elements(code_version) GT 0 THEN code_version=code_version[0] ELSE code_version=''

IF N_Elements(n_pol) EQ 0 THEN n_pol=hdr.n_pol
pol_names=['XX','YY','XY','YX','I','Q','U','V']

IF Tag_exist(layout, "n_antenna") THEN BEGIN
n_tile=layout.n_antenna
ENDIF ELSE BEGIN
Expand Down Expand Up @@ -162,7 +160,7 @@ params.antenna1 = tile_A
params.antenna2 = tile_B

meta=fhd_struct_init_meta(file_path_vis,hdr,params,layout,degpix=degpix,dimension=dimension,elements=elements,$
n_tile=n_tile,instrument=instrument,pol_names=pol_names,meta_data=meta_data,meta_hdr=meta_hdr,_Extra=extra)
n_tile=n_tile,instrument=instrument,meta_data=meta_data,meta_hdr=meta_hdr,_Extra=extra)

IF N_Elements(meta_data) EQ 0 THEN meta_data=Ptr_new() ELSE meta_data=Ptr_new(meta_data)
IF N_Elements(meta_hdr) EQ 0 THEN meta_hdr=Ptr_new() ELSE meta_hdr=Ptr_new(meta_hdr)
Expand All @@ -181,6 +179,7 @@ FOR ti=0,N_Elements(time_cut)<2-1 DO BEGIN
IF ti_end GE ti_start THEN time_use[ti_start:ti_end]=0
ENDFOR
n_time_cut = n_time - Total(time_use)

tile_use1=intarr(n_tile)
FOR pol_i=0,n_pol-1 DO BEGIN
tile_use_i=where(*(meta.tile_flag[pol_i]) EQ 0,n_use)
Expand All @@ -206,7 +205,7 @@ IF dimension GT 4096 THEN BEGIN
double_precision=1
ENDIF
ENDIF

pol_names=['XX','YY','XY','YX','I','Q','U','V']
healpix={nside:Long(nside),ind_list:String(ind_list),n_pix:Long(n_hpx),n_zero:Long(n_zero_hpx)}

arr={tile_A:Long(tile_A),tile_B:Long(tile_B),bin_offset:Long(bin_offset),Jdate:meta.Jdate,freq:Double(frequency_array),fbin_i:Long(freq_bin_i),$
Expand All @@ -216,7 +215,7 @@ struct={code_version:String(code_version),instrument:String(instrument),obsname:
kpix:Float(kbinsize),degpix:Float(degpix),obsaz:meta.obsaz,obsalt:meta.obsalt,obsra:meta.obsra,obsdec:meta.obsdec,$
zenra:meta.zenra,zendec:meta.zendec,obsx:meta.obsx,obsy:meta.obsy,zenx:meta.zenx,zeny:meta.zeny,$
phasera:meta.phasera,phasedec:meta.phasedec,orig_phasera:meta.orig_phasera,orig_phasedec:meta.orig_phasedec,$
n_pol:Fix(n_pol,type=2),n_tile:Long(n_tile),n_tile_flag:Long(n_flag),n_freq:Long(n_freq),n_freq_flag:0L,n_time:Long(n_time),n_time_flag:Long(n_time_cut),$
n_pol:Fix(n_pol,type=2),n_tile:Long(n_tile),n_tile_flag:Long(n_flag),n_freq:Long(n_freq),n_freq_flag:0L,n_time:Long(n_time),n_time_flag:n_time_cut,$
n_vis:Long(n_vis),n_vis_in:Long(n_vis_in),n_vis_raw:Long(n_vis_raw),nf_vis:Long(n_vis_arr),primary_beam_area:Ptrarr(4),primary_beam_sq_area:Ptrarr(4),pol_names:pol_names,$
jd0:meta.jd0,max_baseline:Double(max_baseline),min_baseline:Double(min_baseline),delays:meta.delays,lon:meta.lon,lat:meta.lat,alt:meta.alt,$
freq_center:Float(freq_center),freq_res:Float(freq_res),time_res:Float(meta.time_res),astr:meta.astr,alpha:Float(spectral_index),$
Expand Down
48 changes: 48 additions & 0 deletions fhd_core/setup_metadata/uvh5_read_layout.pro
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
FUNCTION uvh5_read_dataset, fid, path
did = H5D_OPEN(fid, path)
data = H5D_READ(did)
H5D_CLOSE, did
RETURN, data
END

FUNCTION uvh5_read_layout, file_path_vis, _EXTRA=extra

fid = H5F_OPEN(file_path_vis)

ant_names = uvh5_read_dataset(fid, '/Header/antenna_names')
ant_numbers = uvh5_read_dataset(fid, '/Header/antenna_numbers')
ant_positions = uvh5_read_dataset(fid, '/Header/antenna_positions')

latitude = uvh5_read_dataset(fid, '/Header/latitude')
longitude = uvh5_read_dataset(fid, '/Header/longitude')
altitude = uvh5_read_dataset(fid, '/Header/altitude')

telescope_name = uvh5_read_dataset(fid, '/Header/telescope_name')

H5F_CLOSE, fid

nant = N_ELEMENTS(ant_numbers)

; IDL/HDF5 dimension order can be reversed, so make sure positions are [3, nant].
pos_dims = SIZE(ant_positions, /DIMENSIONS)
IF pos_dims[0] NE 3 THEN ant_positions = TRANSPOSE(ant_positions)

; Build a layout structure with the fields FHD usually needs.
; UVH5 antenna_positions are ECEF positions relative to the telescope location,
; not an AIPS AN binary table. pyuvdata documents that telescope.antenna_positions
; are ECEF positions relative to telescope.location. :contentReference[oaicite:2]{index=2}

layout = { $
n_antenna: nant, $
antenna_names: ant_names, $
antenna_numbers: ant_numbers, $
antenna_positions: ant_positions, $
latitude: latitude, $
longitude: longitude, $
altitude: altitude, $
telescope_name: telescope_name $
}

RETURN, layout

END
40 changes: 27 additions & 13 deletions fhd_core/visibility_manipulation/uvfits_read.pro
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
PRO uvfits_read,hdr,params,layout,vis_arr,vis_weights,file_path_vis=file_path_vis,n_pol=n_pol,silent=silent,$
restore_vis_savefile=restore_vis_savefile,reorder_visibilities=reorder_visibilities,$
vis_time_average=vis_time_average,vis_freq_average=vis_freq_average,error=error,$
uvfits_spectral_dimension=uvfits_spectral_dimension,_Extra=extra
uvfits_spectral_dimension=uvfits_spectral_dimension,freq_split=freq_split,_Extra=extra
;set n_pol=0 to not return any data, only header and parameters

IF Strpos(file_path_vis,'.sav') EQ -1 THEN file_path_vis_sav=file_path_vis+".sav" ELSE file_path_vis_sav=file_path_vis
Expand All @@ -24,16 +24,28 @@ ENDIF ELSE BEGIN
ENDIF

t_readfits=Systime(1)
lun = fxposit(file_path_vis, 0,/readonly)
data_struct=mrdfits(lun,0,data_header0,/silent)
ext = STRLOWCASE(FILE_BASENAME(file_path_vis))
if STRMATCH(ext, '*.uvh5') OR STRMATCH(ext, '*.h5') THEN BEGIN
if N_elements(freq_split) EQ 0 THEN BEGIN
data_struct = uvh5_mrdfits(file_path_vis, data_header0)
endif else begin
chan0=freq_split*2
data_struct = uvh5_mrdfits(file_path_vis, data_header0, chan0=chan0, num_chans=2, freq_ref=freq_ref)
freq_split = freq_ref
endelse
ENDIF ELSE BEGIN
lun = fxposit(file_path_vis, 0,/readonly)
data_struct=mrdfits(lun,0,data_header0,/silent)
ENDELSE

hdr=vis_header_extract(data_header0, params = data_struct.params,error=error,_Extra=extra)
IF Keyword_Set(error) THEN RETURN
IF N_Elements(n_pol) EQ 0 THEN n_pol=hdr.n_pol ELSE n_pol=n_pol<hdr.n_pol

params=vis_param_extract(data_struct.params,hdr,_Extra=extra)
t_readfits=Systime(1)-t_readfits
print,"Time reading UVFITS files and extracting header: "+Strn(t_readfits)

data_array=Temporary(data_struct.array)
data_struct=0. ;free memory

Expand Down Expand Up @@ -87,12 +99,16 @@ ENDIF ELSE BEGIN

;; now read extensions one by one until we find the antenna table
t_read_ant=Systime(1)
ext_name = ''
while ext_name ne 'AIPS AN' do begin
ext_data = mrdfits(lun, 0, ext_header)
ext_name=strtrim(sxpar(ext_header, 'extname'))
endwhile
layout = fhd_struct_init_layout(ext_header, ext_data,_Extra=extra)
IF STRMATCH(ext, '*.uvh5') OR STRMATCH(ext, '*.h5') THEN BEGIN
layout = uvh5_read_layout(file_path_vis, _Extra=extra)
ENDIF ELSE BEGIN
ext_name = ''
while ext_name ne 'AIPS AN' do begin
ext_data = mrdfits(lun, 0, ext_header)
ext_name=strtrim(sxpar(ext_header, 'extname'))
endwhile
layout = fhd_struct_init_layout(ext_header, ext_data,_Extra=extra)
ENDELSE
t_read_ant=Systime(1)-t_read_ant
print,"Time finding and reading antenna table in UVFITS file and extracting header: "+Strn(t_read_ant)

Expand All @@ -108,8 +124,6 @@ ENDIF ELSE BEGIN
vis_average,vis_arr,vis_weights,params,hdr,vis_time_average=vis_time_average,vis_freq_average=vis_freq_average,timing=t_averaging
IF ~Keyword_Set(silent) THEN print,"Visibility averaging time: "+Strtrim(String(t_averaging),2)
ENDIF




ENDELSE
END
Loading