diff --git a/icesat2_toolkit/io/ATL03.py b/icesat2_toolkit/io/ATL03.py index a799a46..545a7d1 100644 --- a/icesat2_toolkit/io/ATL03.py +++ b/icesat2_toolkit/io/ATL03.py @@ -1,6 +1,6 @@ #!/usr/bin/env python u""" -ATL03.py (12/2022) +ATL03.py (11/2023) Read ICESat-2 ATL03 and ATL09 data files to calculate average segment surfaces ATL03 datasets: Global Geolocated Photons ATL09 datasets: Atmospheric Characteristics @@ -15,6 +15,7 @@ https://www.h5py.org/ UPDATE HISTORY: + Updated 11/2023: drop DIMENSION_LIST, CLASS and NAME attributes Updated 12/2022: place some imports behind try/except statements refactor ICESat-2 data product read programs under io Updated 04/2022: updated docstrings to numpy documentation format @@ -127,27 +128,32 @@ def read_granule(FILENAME, ATTRIBUTES=False, **kwargs): IS2_atl03_attrs[gtx]['geophys_corr'] = {} # Global Group Attributes for att_name,att_val in fileID[gtx].attrs.items(): - IS2_atl03_attrs[gtx][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl03_attrs[gtx][att_name] = att_val # ICESat-2 Measurement Group for key,val in fileID[gtx]['heights'].items(): IS2_atl03_attrs[gtx]['heights'][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl03_attrs[gtx]['heights'][key][att_name]=att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl03_attrs[gtx]['heights'][key][att_name]=att_val # ICESat-2 Geolocation Group for key,val in fileID[gtx]['geolocation'].items(): IS2_atl03_attrs[gtx]['geolocation'][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl03_attrs[gtx]['geolocation'][key][att_name]=att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl03_attrs[gtx]['geolocation'][key][att_name]=att_val # ICESat-2 Background Photon Rate Group for key,val in fileID[gtx]['bckgrd_atlas'].items(): IS2_atl03_attrs[gtx]['bckgrd_atlas'][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl03_attrs[gtx]['bckgrd_atlas'][key][att_name]=att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl03_attrs[gtx]['bckgrd_atlas'][key][att_name]=att_val # ICESat-2 Geophysical Corrections Group for key,val in fileID[gtx]['geophys_corr'].items(): IS2_atl03_attrs[gtx]['geophys_corr'][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl03_attrs[gtx]['geophys_corr'][key][att_name]=att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl03_attrs[gtx]['geophys_corr'][key][att_name]=att_val # ICESat-2 spacecraft orientation at time IS2_atl03_mds['orbit_info'] = {} @@ -158,11 +164,13 @@ def read_granule(FILENAME, ATTRIBUTES=False, **kwargs): if ATTRIBUTES: # Global Group Attributes for att_name,att_val in fileID['orbit_info'].attrs.items(): - IS2_atl03_attrs['orbit_info'][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl03_attrs['orbit_info'][att_name] = att_val # Variable Attributes IS2_atl03_attrs['orbit_info'][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl03_attrs['orbit_info'][key][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl03_attrs['orbit_info'][key][att_name] = att_val # information ancillary to the data product # number of GPS seconds between the GPS epoch (1980-01-06T00:00:00Z UTC) @@ -185,7 +193,8 @@ def read_granule(FILENAME, ATTRIBUTES=False, **kwargs): # Variable Attributes IS2_atl03_attrs['ancillary_data'][key] = {} for att_name,att_val in fileID['ancillary_data'][key].attrs.items(): - IS2_atl03_attrs['ancillary_data'][key][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl03_attrs['ancillary_data'][key][att_name] = att_val # transmit-echo-path (tep) parameters IS2_atl03_mds['ancillary_data']['tep'] = {} @@ -198,7 +207,8 @@ def read_granule(FILENAME, ATTRIBUTES=False, **kwargs): # Variable Attributes IS2_atl03_attrs['ancillary_data']['tep'][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl03_attrs['ancillary_data']['tep'][key][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl03_attrs['ancillary_data']['tep'][key][att_name] = att_val # channel dead time and first photon bias derived from ATLAS calibration cal1,cal2 = ('ancillary_data','calibrations') @@ -218,12 +228,14 @@ def read_granule(FILENAME, ATTRIBUTES=False, **kwargs): # Variable Attributes IS2_atl03_attrs[cal1][var][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl03_attrs[cal1][var][key][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl03_attrs[cal1][var][key][att_name] = att_val if isinstance(val, h5py.Group): for k,v in val.items(): IS2_atl03_attrs[cal1][var][key][k] = {} for att_name,att_val in val.attrs.items(): - IS2_atl03_attrs[cal1][var][key][k][att_name]=att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl03_attrs[cal1][var][key][k][att_name]=att_val # get ATLAS impulse response variables for the transmitter echo path (TEP) tep1,tep2 = ('atlas_impulse_response','tep_histogram') @@ -239,21 +251,24 @@ def read_granule(FILENAME, ATTRIBUTES=False, **kwargs): if ATTRIBUTES: # Global Group Attributes for att_name,att_val in fileID[tep1][pce][tep2].attrs.items(): - IS2_atl03_attrs[tep1][pce][tep2][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl03_attrs[tep1][pce][tep2][att_name] = att_val # Variable Attributes IS2_atl03_attrs[tep1][pce][tep2][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl03_attrs[tep1][pce][tep2][key][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl03_attrs[tep1][pce][tep2][key][att_name] = att_val # Global File Attributes if ATTRIBUTES: for att_name,att_val in fileID.attrs.items(): - IS2_atl03_attrs[att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl03_attrs[att_name] = att_val # Closing the HDF5 file fileID.close() # Return the datasets and variables - return (IS2_atl03_mds,IS2_atl03_attrs,IS2_atl03_beams) + return (IS2_atl03_mds, IS2_atl03_attrs, IS2_atl03_beams) # PURPOSE: read ICESat-2 ATL09 HDF5 data file for specific variables def interpolate_ATL09(FILENAME, pfl, dtime, ATTRIBUTES=True, **kwargs): @@ -311,22 +326,25 @@ def interpolate_ATL09(FILENAME, pfl, dtime, ATTRIBUTES=True, **kwargs): IS2_atl09_attrs[pfl] = dict(high_rate={}) # Global Group Attributes for att_name,att_val in fileID[pfl].attrs.items(): - IS2_atl09_attrs[pfl][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl09_attrs[pfl][att_name] = att_val # Variable Attributes for key in high_rate_keys: IS2_atl09_attrs[pfl]['high_rate'][key] = {} for att_name,att_val in fileID[pfl]['high_rate'][key].attrs.items(): - IS2_atl09_attrs[pfl]['high_rate'][key][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl09_attrs[pfl]['high_rate'][key][att_name] = att_val # Global File Attributes if ATTRIBUTES: for att_name,att_val in fileID.attrs.items(): - IS2_atl09_attrs[att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl09_attrs[att_name] = att_val # Closing the HDF5 file fileID.close() # Return the datasets and variables - return (IS2_atl09_mds,IS2_atl09_attrs) + return (IS2_atl09_mds, IS2_atl09_attrs) # PURPOSE: find valid beam groups within ICESat-2 ATL03 HDF5 data files def find_beams(FILENAME, **kwargs): @@ -425,11 +443,13 @@ def read_main(FILENAME, ATTRIBUTES=False, **kwargs): if ATTRIBUTES: # Global Group Attributes for att_name,att_val in fileID['orbit_info'].attrs.items(): - IS2_atl03_attrs['orbit_info'][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl03_attrs['orbit_info'][att_name] = att_val # Variable Attributes IS2_atl03_attrs['orbit_info'][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl03_attrs['orbit_info'][key][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl03_attrs['orbit_info'][key][att_name] = att_val # information ancillary to the data product # number of GPS seconds between the GPS epoch (1980-01-06T00:00:00Z UTC) @@ -452,7 +472,8 @@ def read_main(FILENAME, ATTRIBUTES=False, **kwargs): # Variable Attributes IS2_atl03_attrs['ancillary_data'][key] = {} for att_name,att_val in fileID['ancillary_data'][key].attrs.items(): - IS2_atl03_attrs['ancillary_data'][key][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl03_attrs['ancillary_data'][key][att_name] = att_val # transmit-echo-path (tep) parameters IS2_atl03_mds['ancillary_data']['tep'] = {} @@ -465,7 +486,8 @@ def read_main(FILENAME, ATTRIBUTES=False, **kwargs): # Variable Attributes IS2_atl03_attrs['ancillary_data']['tep'][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl03_attrs['ancillary_data']['tep'][key][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl03_attrs['ancillary_data']['tep'][key][att_name] = att_val # channel dead time and first photon bias derived from ATLAS calibration cal1,cal2 = ('ancillary_data','calibrations') @@ -485,12 +507,14 @@ def read_main(FILENAME, ATTRIBUTES=False, **kwargs): # Variable Attributes IS2_atl03_attrs[cal1][var][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl03_attrs[cal1][var][key][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl03_attrs[cal1][var][key][att_name] = att_val if isinstance(val, h5py.Group): for k,v in val.items(): IS2_atl03_attrs[cal1][var][key][k] = {} for att_name,att_val in val.attrs.items(): - IS2_atl03_attrs[cal1][var][key][k][att_name]=att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl03_attrs[cal1][var][key][k][att_name]=att_val # get ATLAS impulse response variables for the transmitter echo path (TEP) tep1,tep2 = ('atlas_impulse_response','tep_histogram') @@ -506,21 +530,24 @@ def read_main(FILENAME, ATTRIBUTES=False, **kwargs): if ATTRIBUTES: # Global Group Attributes for att_name,att_val in fileID[tep1][pce][tep2].attrs.items(): - IS2_atl03_attrs[tep1][pce][tep2][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl03_attrs[tep1][pce][tep2][att_name] = att_val # Variable Attributes IS2_atl03_attrs[tep1][pce][tep2][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl03_attrs[tep1][pce][tep2][key][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl03_attrs[tep1][pce][tep2][key][att_name] = att_val # Global File Attributes if ATTRIBUTES: for att_name,att_val in fileID.attrs.items(): - IS2_atl03_attrs[att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl03_attrs[att_name] = att_val # Closing the HDF5 file fileID.close() # Return the datasets and variables - return (IS2_atl03_mds,IS2_atl03_attrs,IS2_atl03_beams) + return (IS2_atl03_mds, IS2_atl03_attrs, IS2_atl03_beams) # PURPOSE: read ICESat-2 ATL03 HDF5 data files for beam variables def read_beam(FILENAME, gtx, ATTRIBUTES=False, **kwargs): @@ -595,29 +622,34 @@ def read_beam(FILENAME, gtx, ATTRIBUTES=False, **kwargs): IS2_atl03_attrs['Atlas_impulse_response'] = {} # Global Group Attributes for att_name,att_val in fileID[gtx].attrs.items(): - IS2_atl03_attrs[att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl03_attrs[att_name] = att_val # ICESat-2 Measurement Group for key,val in fileID[gtx]['heights'].items(): IS2_atl03_attrs['heights'][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl03_attrs['heights'][key][att_name]=att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl03_attrs['heights'][key][att_name]=att_val # ICESat-2 Geolocation Group for key,val in fileID[gtx]['geolocation'].items(): IS2_atl03_attrs['geolocation'][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl03_attrs['geolocation'][key][att_name]=att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl03_attrs['geolocation'][key][att_name]=att_val # ICESat-2 Background Photon Rate Group for key,val in fileID[gtx]['bckgrd_atlas'].items(): IS2_atl03_attrs['bckgrd_atlas'][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl03_attrs['bckgrd_atlas'][key][att_name]=att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl03_attrs['bckgrd_atlas'][key][att_name]=att_val # ICESat-2 Geophysical Corrections Group for key,val in fileID[gtx]['geophys_corr'].items(): IS2_atl03_attrs['geophys_corr'][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl03_attrs['geophys_corr'][key][att_name]=att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl03_attrs['geophys_corr'][key][att_name]=att_val # Closing the HDF5 file fileID.close() # Return the datasets and variables - return (IS2_atl03_mds,IS2_atl03_attrs) + return (IS2_atl03_mds, IS2_atl03_attrs) diff --git a/icesat2_toolkit/io/ATL06.py b/icesat2_toolkit/io/ATL06.py index fa823f7..f3d691f 100644 --- a/icesat2_toolkit/io/ATL06.py +++ b/icesat2_toolkit/io/ATL06.py @@ -1,6 +1,6 @@ #!/usr/bin/env python u""" -ATL06.py (05/2023) +ATL06.py (11/2023) Read ICESat-2 ATL06 (Land Ice Along-Track Height Product) data files OPTIONS: @@ -16,6 +16,7 @@ https://www.h5py.org/ UPDATE HISTORY: + Updated 11/2023: drop DIMENSION_LIST, CLASS and NAME attributes Updated 05/2023: extract more ancillary data from ATL06 files Updated 12/2022: place some imports behind try/except statements refactor ICESat-2 data product read programs under io @@ -142,16 +143,19 @@ def read_granule(FILENAME, ATTRIBUTES=False, HISTOGRAM=False, IS2_atl06_attrs[gtx]['land_ice_segments']['ground_track'] = {} # Global Group Attributes for ATL06 beam for att_name,att_val in fileID[gtx].attrs.items(): - IS2_atl06_attrs[gtx][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl06_attrs[gtx][att_name] = att_val for key,val in fileID[gtx]['land_ice_segments'].items(): IS2_atl06_attrs[gtx]['land_ice_segments'][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl06_attrs[gtx]['land_ice_segments'][key][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl06_attrs[gtx]['land_ice_segments'][key][att_name] = att_val if isinstance(val, h5py.Group): for k,v in val.items(): IS2_atl06_attrs[gtx]['land_ice_segments'][key][k] = {} for att_name,att_val in v.attrs.items(): - IS2_atl06_attrs[gtx]['land_ice_segments'][key][k][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl06_attrs[gtx]['land_ice_segments'][key][k][att_name] = att_val # Getting attributes of histogram variables if ATTRIBUTES and HISTOGRAM: # ICESat-2 residual_histogram Group @@ -159,7 +163,8 @@ def read_granule(FILENAME, ATTRIBUTES=False, HISTOGRAM=False, for key,val in fileID[gtx]['residual_histogram'].items(): IS2_atl06_attrs[gtx]['residual_histogram'][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl06_attrs[gtx]['residual_histogram'][key][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl06_attrs[gtx]['residual_histogram'][key][att_name] = att_val # Getting attributes of quality variables if ATTRIBUTES and QUALITY: # ICESat-2 segment_quality Group @@ -168,12 +173,14 @@ def read_granule(FILENAME, ATTRIBUTES=False, HISTOGRAM=False, for key,val in fileID[gtx]['segment_quality'].items(): IS2_atl06_attrs[gtx]['segment_quality'][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl06_attrs[gtx]['segment_quality'][key][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl06_attrs[gtx]['segment_quality'][key][att_name] = att_val if isinstance(val, h5py.Group): for k,v in val.items(): IS2_atl06_attrs[gtx]['segment_quality'][key][k] = {} for att_name,att_val in v.attrs.items(): - IS2_atl06_attrs[gtx]['segment_quality'][key][k][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl06_attrs[gtx]['segment_quality'][key][k][att_name] = att_val # ICESat-2 orbit_info Group IS2_atl06_mds['orbit_info'] = {} @@ -209,7 +216,8 @@ def read_granule(FILENAME, ATTRIBUTES=False, HISTOGRAM=False, # Variable Attributes IS2_atl06_attrs['ancillary_data'][key] = {} for att_name,att_val in fileID['ancillary_data'][key].attrs.items(): - IS2_atl06_attrs['ancillary_data'][key][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl06_attrs['ancillary_data'][key][att_name] = att_val # land ice ancillary information (first photon bias and statistics) cal1,cal2 = ('ancillary_data','land_ice') @@ -223,35 +231,40 @@ def read_granule(FILENAME, ATTRIBUTES=False, HISTOGRAM=False, # Variable Attributes IS2_atl06_attrs[cal1][cal2][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl06_attrs[cal1][cal2][key][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl06_attrs[cal1][cal2][key][att_name] = att_val # get each global attribute and the attributes for orbit and quality if ATTRIBUTES: # ICESat-2 HDF5 global attributes for att_name,att_val in fileID.attrs.items(): - IS2_atl06_attrs[att_name] = att_name + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl06_attrs[att_name] = att_name # ICESat-2 orbit_info Group IS2_atl06_attrs['orbit_info'] = {} for key,val in fileID['orbit_info'].items(): IS2_atl06_attrs['orbit_info'][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl06_attrs['orbit_info'][key][att_name]= att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl06_attrs['orbit_info'][key][att_name]= att_val # ICESat-2 quality_assessment Group IS2_atl06_attrs['quality_assessment'] = {} for key,val in fileID['quality_assessment'].items(): IS2_atl06_attrs['quality_assessment'][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl06_attrs['quality_assessment'][key][att_name]= att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl06_attrs['quality_assessment'][key][att_name]= att_val if isinstance(val, h5py.Group): for k,v in val.items(): IS2_atl06_attrs['quality_assessment'][key][k] = {} for att_name,att_val in v.attrs.items(): - IS2_atl06_attrs['quality_assessment'][key][k][att_name]= att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl06_attrs['quality_assessment'][key][k][att_name]= att_val # Closing the HDF5 file fileID.close() # Return the datasets and variables - return (IS2_atl06_mds,IS2_atl06_attrs,IS2_atl06_beams) + return (IS2_atl06_mds, IS2_atl06_attrs, IS2_atl06_beams) # PURPOSE: find valid beam groups within ICESat-2 ATL06 HDF5 data files def find_beams(FILENAME, **kwargs): @@ -366,18 +379,21 @@ def read_beam(FILENAME, gtx, ATTRIBUTES=False, **kwargs): IS2_atl06_attrs[gtx]['land_ice_segments']['ground_track'] = {} # Global Group Attributes for ATL06 beam for att_name,att_val in fileID[gtx].attrs.items(): - IS2_atl06_attrs[gtx][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl06_attrs[gtx][att_name] = att_val for key,val in fileID[gtx]['land_ice_segments'].items(): IS2_atl06_attrs[gtx]['land_ice_segments'][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl06_attrs[gtx]['land_ice_segments'][key][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl06_attrs[gtx]['land_ice_segments'][key][att_name] = att_val if isinstance(val, h5py.Group): for k,v in val.items(): IS2_atl06_attrs[gtx]['land_ice_segments'][key][k] = {} for att_name,att_val in v.attrs.items(): - IS2_atl06_attrs[gtx]['land_ice_segments'][key][k][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl06_attrs[gtx]['land_ice_segments'][key][k][att_name] = att_val # Closing the HDF5 file fileID.close() # Return the datasets and variables - return (IS2_atl06_mds,IS2_atl06_attrs) + return (IS2_atl06_mds, IS2_atl06_attrs) diff --git a/icesat2_toolkit/io/ATL07.py b/icesat2_toolkit/io/ATL07.py index e61caf3..a26d3db 100644 --- a/icesat2_toolkit/io/ATL07.py +++ b/icesat2_toolkit/io/ATL07.py @@ -1,6 +1,6 @@ #!/usr/bin/env python u""" -ATL07.py (05/2023) +ATL07.py (11/2023) Read ICESat-2 ATL07 (Sea Ice Height) data files PYTHON DEPENDENCIES: @@ -11,6 +11,7 @@ https://www.h5py.org/ UPDATE HISTORY: + Updated 11/2023: drop DIMENSION_LIST, CLASS and NAME attributes Updated 05/2023: extract more ancillary data from ATL07 files Updated 12/2022: place some imports behind try/except statements refactor ICESat-2 data product read programs under io @@ -111,16 +112,19 @@ def read_granule(FILENAME, ATTRIBUTES=False, **kwargs): IS2_atl07_attrs[gtx]['sea_ice_segments']['stats'] = {} # Global Group Attributes for ATL07 beam for att_name,att_val in fileID[gtx].attrs.items(): - IS2_atl07_attrs[gtx][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl07_attrs[gtx][att_name] = att_val for key,val in fileID[gtx]['sea_ice_segments'].items(): IS2_atl07_attrs[gtx]['sea_ice_segments'][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl07_attrs[gtx]['sea_ice_segments'][key][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl07_attrs[gtx]['sea_ice_segments'][key][att_name] = att_val if isinstance(val, h5py.Group): for k,v in val.items(): IS2_atl07_attrs[gtx]['sea_ice_segments'][key][k] = {} for att_name,att_val in v.attrs.items(): - IS2_atl07_attrs[gtx]['sea_ice_segments'][key][k][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl07_attrs[gtx]['sea_ice_segments'][key][k][att_name] = att_val # ICESat-2 orbit_info Group IS2_atl07_mds['orbit_info'] = {} @@ -156,7 +160,8 @@ def read_granule(FILENAME, ATTRIBUTES=False, **kwargs): # Variable Attributes IS2_atl07_attrs['ancillary_data'][key] = {} for att_name,att_val in fileID['ancillary_data'][key].attrs.items(): - IS2_atl07_attrs['ancillary_data'][key][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl07_attrs['ancillary_data'][key][att_name] = att_val # sea ice ancillary information (processing flags and parameters) for cal in ('fine_surface_finding','sea_ice','surface_classification'): @@ -170,35 +175,40 @@ def read_granule(FILENAME, ATTRIBUTES=False, **kwargs): # Variable Attributes IS2_atl07_attrs['ancillary_data'][cal][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl07_attrs['ancillary_data'][cal][key][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl07_attrs['ancillary_data'][cal][key][att_name] = att_val # get each global attribute and the attributes for orbit and quality if ATTRIBUTES: # ICESat-2 HDF5 global attributes for att_name,att_val in fileID.attrs.items(): - IS2_atl07_attrs[att_name] = att_name + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl07_attrs[att_name] = att_name # ICESat-2 orbit_info Group IS2_atl07_attrs['orbit_info'] = {} for key,val in fileID['orbit_info'].items(): IS2_atl07_attrs['orbit_info'][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl07_attrs['orbit_info'][key][att_name]= att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl07_attrs['orbit_info'][key][att_name]= att_val # ICESat-2 quality_assessment Group IS2_atl07_attrs['quality_assessment'] = {} for key,val in fileID['quality_assessment'].items(): IS2_atl07_attrs['quality_assessment'][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl07_attrs['quality_assessment'][key][att_name]= att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl07_attrs['quality_assessment'][key][att_name]= att_val if isinstance(val, h5py.Group): for k,v in val.items(): IS2_atl07_attrs['quality_assessment'][key][k] = {} for att_name,att_val in v.attrs.items(): - IS2_atl07_attrs['quality_assessment'][key][k][att_name]= att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl07_attrs['quality_assessment'][key][k][att_name]= att_val # Closing the HDF5 file fileID.close() # Return the datasets and variables - return (IS2_atl07_mds,IS2_atl07_attrs,IS2_atl07_beams) + return (IS2_atl07_mds, IS2_atl07_attrs, IS2_atl07_beams) # PURPOSE: find valid beam groups within ICESat-2 ATL07 HDF5 data files def find_beams(FILENAME, **kwargs): @@ -305,18 +315,21 @@ def read_beam(FILENAME, gtx, ATTRIBUTES=False, **kwargs): IS2_atl07_attrs[gtx]['sea_ice_segments']['stats'] = {} # Global Group Attributes for ATL07 beam for att_name,att_val in fileID[gtx].attrs.items(): - IS2_atl07_attrs[gtx][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl07_attrs[gtx][att_name] = att_val for key,val in fileID[gtx]['sea_ice_segments'].items(): IS2_atl07_attrs[gtx]['sea_ice_segments'][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl07_attrs[gtx]['sea_ice_segments'][key][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl07_attrs[gtx]['sea_ice_segments'][key][att_name] = att_val if isinstance(val, h5py.Group): for k,v in val.items(): IS2_atl07_attrs[gtx]['sea_ice_segments'][key][k] = {} for att_name,att_val in v.attrs.items(): - IS2_atl07_attrs[gtx]['sea_ice_segments'][key][k][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl07_attrs[gtx]['sea_ice_segments'][key][k][att_name] = att_val # Closing the HDF5 file fileID.close() # Return the datasets and variables - return (IS2_atl07_mds,IS2_atl07_attrs) + return (IS2_atl07_mds, IS2_atl07_attrs) diff --git a/icesat2_toolkit/io/ATL10.py b/icesat2_toolkit/io/ATL10.py index f4e4541..a2afd06 100644 --- a/icesat2_toolkit/io/ATL10.py +++ b/icesat2_toolkit/io/ATL10.py @@ -1,6 +1,6 @@ #!/usr/bin/env python u""" -ATL10.py (05/2023) +ATL10.py (11/2023) Read ICESat-2 ATL10 (Sea Ice Freeboard) data files PYTHON DEPENDENCIES: @@ -11,6 +11,7 @@ https://www.h5py.org/ UPDATE HISTORY: + Updated 11/2023: drop DIMENSION_LIST, CLASS and NAME attributes Updated 05/2023: extract more ancillary data from ATL10 files Updated 12/2022: place some imports behind try/except statements refactor ICESat-2 data product read programs under io @@ -108,17 +109,20 @@ def read_granule(FILENAME, ATTRIBUTES=False, **kwargs): IS2_atl10_attrs[gtx]['leads'] = {} # Global Group Attributes for ATL10 beam for att_name,att_val in fileID[gtx].attrs.items(): - IS2_atl10_attrs[gtx][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl10_attrs[gtx][att_name] = att_val for group in ['freeboard_beam_segment','leads']: for key,val in fileID[gtx][group].items(): IS2_atl10_attrs[gtx][group][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl10_attrs[gtx][group][key][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl10_attrs[gtx][group][key][att_name] = att_val if isinstance(val, h5py.Group): for k,v in val.items(): IS2_atl10_attrs[gtx][group][key][k] = {} for att_name,att_val in v.attrs.items(): - IS2_atl10_attrs[gtx][group][key][k][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl10_attrs[gtx][group][key][k][att_name] = att_val # ICESat-2 orbit_info Group IS2_atl10_mds['orbit_info'] = {} @@ -154,7 +158,8 @@ def read_granule(FILENAME, ATTRIBUTES=False, **kwargs): # Variable Attributes IS2_atl10_attrs['ancillary_data'][key] = {} for att_name,att_val in fileID['ancillary_data'][key].attrs.items(): - IS2_atl10_attrs['ancillary_data'][key][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl10_attrs['ancillary_data'][key][att_name] = att_val # sea ice ancillary information (processing flags and parameters) for cal in ('freeboard_estimation',): @@ -168,35 +173,40 @@ def read_granule(FILENAME, ATTRIBUTES=False, **kwargs): # Variable Attributes IS2_atl10_attrs['ancillary_data'][cal][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl10_attrs['ancillary_data'][cal][key][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl10_attrs['ancillary_data'][cal][key][att_name] = att_val # get each global attribute and the attributes for orbit and quality if ATTRIBUTES: # ICESat-2 HDF5 global attributes for att_name,att_val in fileID.attrs.items(): - IS2_atl10_attrs[att_name] = att_name + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl10_attrs[att_name] = att_name # ICESat-2 orbit_info Group IS2_atl10_attrs['orbit_info'] = {} for key,val in fileID['orbit_info'].items(): IS2_atl10_attrs['orbit_info'][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl10_attrs['orbit_info'][key][att_name]= att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl10_attrs['orbit_info'][key][att_name]= att_val # ICESat-2 quality_assessment Group IS2_atl10_attrs['quality_assessment'] = {} for key,val in fileID['quality_assessment'].items(): IS2_atl10_attrs['quality_assessment'][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl10_attrs['quality_assessment'][key][att_name]= att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl10_attrs['quality_assessment'][key][att_name]= att_val if isinstance(val, h5py.Group): for k,v in val.items(): IS2_atl10_attrs['quality_assessment'][key][k] = {} for att_name,att_val in v.attrs.items(): - IS2_atl10_attrs['quality_assessment'][key][k][att_name]= att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl10_attrs['quality_assessment'][key][k][att_name]= att_val # Closing the HDF5 file fileID.close() # Return the datasets and variables - return (IS2_atl10_mds,IS2_atl10_attrs,IS2_atl10_beams) + return (IS2_atl10_mds, IS2_atl10_attrs, IS2_atl10_beams) # PURPOSE: find valid beam groups within ICESat-2 ATL10 HDF5 data files def find_beams(FILENAME, **kwargs): @@ -305,19 +315,22 @@ def read_beam(FILENAME, gtx, ATTRIBUTES=False, **kwargs): IS2_atl10_attrs[gtx]['leads'] = {} # Global Group Attributes for ATL10 beam for att_name,att_val in fileID[gtx].attrs.items(): - IS2_atl10_attrs[gtx][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl10_attrs[gtx][att_name] = att_val for group in ['freeboard_beam_segment','leads']: for key,val in fileID[gtx][group].items(): IS2_atl10_attrs[gtx][group][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl10_attrs[gtx][group][key][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl10_attrs[gtx][group][key][att_name] = att_val if isinstance(val, h5py.Group): for k,v in val.items(): IS2_atl10_attrs[gtx][group][key][k] = {} for att_name,att_val in v.attrs.items(): - IS2_atl10_attrs[gtx][group][key][k][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl10_attrs[gtx][group][key][k][att_name] = att_val # Closing the HDF5 file fileID.close() # Return the datasets and variables - return (IS2_atl10_mds,IS2_atl10_attrs) + return (IS2_atl10_mds, IS2_atl10_attrs) diff --git a/icesat2_toolkit/io/ATL11.py b/icesat2_toolkit/io/ATL11.py index 991d0c9..b9cdcb2 100644 --- a/icesat2_toolkit/io/ATL11.py +++ b/icesat2_toolkit/io/ATL11.py @@ -1,6 +1,6 @@ #!/usr/bin/env python u""" -ATL11.py (05/2023) +ATL11.py (11/2023) Read ICESat-2 ATL11 (Annual Land Ice Height) data files OPTIONS: @@ -18,6 +18,7 @@ https://www.h5py.org/ UPDATE HISTORY: + Updated 11/2023: drop DIMENSION_LIST, CLASS and NAME attributes Updated 05/2023: extract more ancillary data from ATL11 files Updated 12/2022: place some imports behind try/except statements refactor ICESat-2 data product read programs under io @@ -134,12 +135,14 @@ def read_granule(FILENAME, GROUPS=['cycle_stats'], ATTRIBUTES=False, IS2_atl11_attrs[ptx] = {} # Global Group Attributes for ATL11 beam pair for att_name,att_val in fileID[ptx].attrs.items(): - IS2_atl11_attrs[ptx][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl11_attrs[ptx][att_name] = att_val # getting attributes of main level ATL11 variables for key,val in fileID[ptx].items(): IS2_atl11_attrs[ptx][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl11_attrs[ptx][key][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl11_attrs[ptx][key][att_name] = att_val # get fill value attributes if applicable if hasattr(val,'fillvalue'): IS2_atl11_attrs[ptx][key]['_FillValue'] = \ @@ -151,7 +154,8 @@ def read_granule(FILENAME, GROUPS=['cycle_stats'], ATTRIBUTES=False, for key,val in fileID[ptx][group].items(): IS2_atl11_attrs[ptx][group][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl11_attrs[ptx][group][key][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl11_attrs[ptx][group][key][att_name] = att_val # get fill value attributes if applicable if hasattr(val,'fillvalue'): IS2_atl11_attrs[ptx][group][key]['_FillValue'] = \ @@ -189,30 +193,34 @@ def read_granule(FILENAME, GROUPS=['cycle_stats'], ATTRIBUTES=False, # Variable Attributes IS2_atl11_attrs['ancillary_data'][key] = {} for att_name,att_val in fileID['ancillary_data'][key].attrs.items(): - IS2_atl11_attrs['ancillary_data'][key][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl11_attrs['ancillary_data'][key][att_name] = att_val # get each global attribute and the attributes for orbit and quality if ATTRIBUTES: # ICESat-2 HDF5 global attributes for att_name,att_val in fileID.attrs.items(): - IS2_atl11_attrs[att_name] = att_name + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl11_attrs[att_name] = att_name # ICESat-2 orbit_info Group IS2_atl11_attrs['orbit_info'] = {} for key,val in fileID['orbit_info'].items(): IS2_atl11_attrs['orbit_info'][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl11_attrs['orbit_info'][key][att_name]= att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl11_attrs['orbit_info'][key][att_name]= att_val # ICESat-2 quality_assessment Group IS2_atl11_attrs['quality_assessment'] = {} for key,val in fileID['quality_assessment'].items(): IS2_atl11_attrs['quality_assessment'][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl11_attrs['quality_assessment'][key][att_name]= att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl11_attrs['quality_assessment'][key][att_name]= att_val # Closing the HDF5 file fileID.close() # Return the datasets and variables - return (IS2_atl11_mds,IS2_atl11_attrs,IS2_atl11_pairs) + return (IS2_atl11_mds, IS2_atl11_attrs, IS2_atl11_pairs) # PURPOSE: find valid beam pair groups within ICESat-2 ATL11 HDF5 data files def find_pairs(FILENAME, **kwargs): @@ -333,12 +341,14 @@ def read_pair(FILENAME, ptx, GROUPS=['cycle_stats'], IS2_atl11_attrs[ptx] = {} # Global Group Attributes for ATL11 beam pair for att_name,att_val in fileID[ptx].attrs.items(): - IS2_atl11_attrs[ptx][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl11_attrs[ptx][att_name] = att_val # getting attributes of main level ATL11 variables for key,val in fileID[ptx].items(): IS2_atl11_attrs[ptx][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl11_attrs[ptx][key][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl11_attrs[ptx][key][att_name] = att_val # get fill value attributes if applicable if hasattr(val,'fillvalue'): IS2_atl11_attrs[ptx][key]['_FillValue'] = \ @@ -350,7 +360,8 @@ def read_pair(FILENAME, ptx, GROUPS=['cycle_stats'], for key,val in fileID[ptx][group].items(): IS2_atl11_attrs[ptx][group][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl11_attrs[ptx][group][key][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl11_attrs[ptx][group][key][att_name] = att_val # get fill value attributes if applicable if hasattr(val,'fillvalue'): IS2_atl11_attrs[ptx][group][key]['_FillValue'] = \ @@ -361,4 +372,4 @@ def read_pair(FILENAME, ptx, GROUPS=['cycle_stats'], # Closing the HDF5 file fileID.close() # Return the datasets and variables - return (IS2_atl11_mds,IS2_atl11_attrs) + return (IS2_atl11_mds, IS2_atl11_attrs) diff --git a/icesat2_toolkit/io/ATL12.py b/icesat2_toolkit/io/ATL12.py index 3e258c6..d423b5c 100644 --- a/icesat2_toolkit/io/ATL12.py +++ b/icesat2_toolkit/io/ATL12.py @@ -1,6 +1,6 @@ #!/usr/bin/env python u""" -ATL12.py (05/2023) +ATL12.py (11/2023) Read ICESat-2 ATL12 (Ocean Surface Height) data files PYTHON DEPENDENCIES: @@ -11,6 +11,7 @@ https://www.h5py.org/ UPDATE HISTORY: + Updated 11/2023: drop DIMENSION_LIST, CLASS and NAME attributes Updated 05/2023: extract more ancillary data from ATL12 files Updated 12/2022: place some imports behind try/except statements refactor ICESat-2 data product read programs under io @@ -106,16 +107,19 @@ def read_granule(FILENAME, ATTRIBUTES=False, **kwargs): IS2_atl12_attrs[gtx]['ssh_segments']['stats'] = {} # Global Group Attributes for ATL12 beam for att_name,att_val in fileID[gtx].attrs.items(): - IS2_atl12_attrs[gtx][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl12_attrs[gtx][att_name] = att_val for key,val in fileID[gtx]['ssh_segments'].items(): IS2_atl12_attrs[gtx]['ssh_segments'][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl12_attrs[gtx]['ssh_segments'][key][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl12_attrs[gtx]['ssh_segments'][key][att_name] = att_val if isinstance(val, h5py.Group): for k,v in val.items(): IS2_atl12_attrs[gtx]['ssh_segments'][key][k] = {} for att_name,att_val in v.attrs.items(): - IS2_atl12_attrs[gtx]['ssh_segments'][key][k][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl12_attrs[gtx]['ssh_segments'][key][k][att_name] = att_val # ICESat-2 orbit_info Group IS2_atl12_mds['orbit_info'] = {} @@ -151,7 +155,8 @@ def read_granule(FILENAME, ATTRIBUTES=False, **kwargs): # Variable Attributes IS2_atl12_attrs['ancillary_data'][key] = {} for att_name,att_val in fileID['ancillary_data'][key].attrs.items(): - IS2_atl12_attrs['ancillary_data'][key][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl12_attrs['ancillary_data'][key][att_name] = att_val # ocean height ancillary information (processing flags and parameters) IS2_atl12_mds['ancillary_data']['ocean'] = {} @@ -164,35 +169,40 @@ def read_granule(FILENAME, ATTRIBUTES=False, **kwargs): # Variable Attributes IS2_atl12_attrs['ancillary_data']['ocean'][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl12_attrs['ancillary_data']['ocean'][key][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl12_attrs['ancillary_data']['ocean'][key][att_name] = att_val # get each global attribute and the attributes for orbit and quality if ATTRIBUTES: # ICESat-2 HDF5 global attributes for att_name,att_val in fileID.attrs.items(): - IS2_atl12_attrs[att_name] = att_name + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl12_attrs[att_name] = att_name # ICESat-2 orbit_info Group IS2_atl12_attrs['orbit_info'] = {} for key,val in fileID['orbit_info'].items(): IS2_atl12_attrs['orbit_info'][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl12_attrs['orbit_info'][key][att_name]= att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl12_attrs['orbit_info'][key][att_name]= att_val # ICESat-2 quality_assessment Group IS2_atl12_attrs['quality_assessment'] = {} for key,val in fileID['quality_assessment'].items(): IS2_atl12_attrs['quality_assessment'][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl12_attrs['quality_assessment'][key][att_name]= att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl12_attrs['quality_assessment'][key][att_name]= att_val if isinstance(val, h5py.Group): for k,v in val.items(): IS2_atl12_attrs['quality_assessment'][key][k] = {} for att_name,att_val in v.attrs.items(): - IS2_atl12_attrs['quality_assessment'][key][k][att_name]= att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl12_attrs['quality_assessment'][key][k][att_name]= att_val # Closing the HDF5 file fileID.close() # Return the datasets and variables - return (IS2_atl12_mds,IS2_atl12_attrs,IS2_atl12_beams) + return (IS2_atl12_mds, IS2_atl12_attrs, IS2_atl12_beams) # PURPOSE: find valid beam groups within ICESat-2 ATL12 HDF5 data files def find_beams(FILENAME, **kwargs): @@ -295,18 +305,21 @@ def read_beam(FILENAME, gtx, ATTRIBUTES=False, **kwargs): IS2_atl12_attrs[gtx]['ssh_segments']['stats'] = {} # Global Group Attributes for ATL12 beam for att_name,att_val in fileID[gtx].attrs.items(): - IS2_atl12_attrs[gtx][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl12_attrs[gtx][att_name] = att_val for key,val in fileID[gtx]['ssh_segments'].items(): IS2_atl12_attrs[gtx]['ssh_segments'][key] = {} for att_name,att_val in val.attrs.items(): - IS2_atl12_attrs[gtx]['ssh_segments'][key][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl12_attrs[gtx]['ssh_segments'][key][att_name] = att_val if isinstance(val, h5py.Group): for k,v in val.items(): IS2_atl12_attrs[gtx]['ssh_segments'][key][k] = {} for att_name,att_val in v.attrs.items(): - IS2_atl12_attrs[gtx]['ssh_segments'][key][k][att_name] = att_val + if att_name not in ('DIMENSION_LIST','CLASS','NAME'): + IS2_atl12_attrs[gtx]['ssh_segments'][key][k][att_name] = att_val # Closing the HDF5 file fileID.close() # Return the datasets and variables - return (IS2_atl12_mds,IS2_atl12_attrs) + return (IS2_atl12_mds, IS2_atl12_attrs)