diff --git a/fhd_core/setup_metadata/fhd_path_setup.pro b/fhd_core/setup_metadata/fhd_path_setup.pro index f7d6edd8..c5383678 100644 --- a/fhd_core/setup_metadata/fhd_path_setup.pro +++ b/fhd_core/setup_metadata/fhd_path_setup.pro @@ -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 diff --git a/fhd_core/setup_metadata/fhd_struct_init_obs.pro b/fhd_core/setup_metadata/fhd_struct_init_obs.pro index eb6fab54..3e832239 100644 --- a/fhd_core/setup_metadata/fhd_struct_init_obs.pro +++ b/fhd_core/setup_metadata/fhd_struct_init_obs.pro @@ -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 @@ -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) @@ -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) @@ -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),$ @@ -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),$ diff --git a/fhd_core/setup_metadata/uvh5_read_layout.pro b/fhd_core/setup_metadata/uvh5_read_layout.pro new file mode 100644 index 00000000..3943b756 --- /dev/null +++ b/fhd_core/setup_metadata/uvh5_read_layout.pro @@ -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 \ No newline at end of file diff --git a/fhd_core/visibility_manipulation/uvfits_read.pro b/fhd_core/visibility_manipulation/uvfits_read.pro index c455477d..b9ac7abb 100644 --- a/fhd_core/visibility_manipulation/uvfits_read.pro +++ b/fhd_core/visibility_manipulation/uvfits_read.pro @@ -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 @@ -24,8 +24,20 @@ 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