Beispiel #1
0
    def avail(self, options=False, internal=False):
        """
        Get the list of available variables and variable paths from the input data product

        Examples
        --------
        >>> reg_a = ipx.Query('ATL06',[-55, 68, -48, 71],['2019-02-20','2019-02-28'], version='5') # doctest: +SKIP
        >>> reg_a.earthdata_login(user_id,user_email) # doctest: +SKIP
        Earthdata Login password:  ········
        >>> reg_a.order_vars.avail() # doctest: +SKIP
        ['ancillary_data/atlas_sdp_gps_epoch',
        'ancillary_data/control',
        'ancillary_data/data_end_utc',
        'ancillary_data/data_start_utc',
        .
        .
        .
        'quality_assessment/gt3r/signal_selection_source_fraction_3']
        """
        # if hasattr(self, '_avail'):
        #         return self._avail
        # else:
        if not hasattr(self, "_avail") or self._avail == None:
            if self._vartype == "order":
                self._avail = is2ref._get_custom_options(
                    self._session, self.product, self._version)["variables"]

            elif self._vartype == "file":
                import h5py

                self._avail = []

                def visitor_func(name, node):
                    if isinstance(node, h5py.Group):
                        # node is a Group
                        pass
                    else:
                        # node is a Dataset
                        self._avail.append(name)

                with h5py.File(self.path, "r") as h5f:
                    h5f.visititems(visitor_func)

        if options == True:
            vgrp, paths = self.parse_var_list(self._avail)
            allpaths = []
            [
                allpaths.extend(np.unique(np.array(paths[p])))
                for p in range(len(paths))
            ]
            allpaths = np.unique(allpaths)
            if internal == False:
                print("var_list inputs: " + ", ".join(vgrp.keys()))
                print("keyword_list and beam_list inputs: " +
                      ", ".join(allpaths))
            elif internal == True:
                return vgrp, allpaths
        else:
            return self._avail
Beispiel #2
0
    def avail(self, options=False, internal=False):
        """
        Get the list of available variables and variable paths from the input dataset

        Examples
        --------
        >>> reg_a = icepyx.icesat2data.Icesat2Data('ATL06',[-55, 68, -48, 71],['2019-02-20','2019-02-28'], version='1')
        >>> reg_a.earthdata_login(user_id,user_email)
        Earthdata Login password:  ········
        >>> reg_a.order_vars.avail()
       ['ancillary_data/atlas_sdp_gps_epoch',
        'ancillary_data/control',
        'ancillary_data/data_end_utc',
        'ancillary_data/data_start_utc',
        .
        .
        .
        'quality_assessment/gt3r/signal_selection_source_fraction_3']
        """
        # if hasattr(self, '_avail'):
        #         return self._avail
        # else:
        if not hasattr(self, '_avail') or self._avail == None:
            if self._vartype == 'order':
                self._avail = is2ref._get_custom_options(
                    self._session, self.dataset, self._version)['variables']

            elif self._vartype == 'file':
                self._avail = None

        if options == True:
            vgrp, paths = self.parse_var_list(self._avail)
            allpaths = []
            [
                allpaths.extend(np.unique(np.array(paths[p])))
                for p in range(len(paths))
            ]
            allpaths = np.unique(allpaths)
            if internal == False:
                print('var_list inputs: ' + ', '.join(vgrp.keys()))
                print('keyword_list and beam_list inputs: ' +
                      ', '.join(allpaths))
            elif internal == True:
                return vgrp, allpaths
        else:
            return self._avail
Beispiel #3
0
    def show_custom_options(self, dictview=False):
        """
        Display customization/subsetting options available for this product.

        Parameters
        ----------
        dictview : boolean, default False
            Show the variable portion of the custom options list as a dictionary with key:value
            pairs representing variable:paths-to-variable rather than as a long list of full
            variable paths.

        Examples
        --------
        >>> reg_a = ipx.Query('ATL06',[-55, 68, -48, 71],['2019-02-20','2019-02-28']) # doctest: +SKIP
        >>> reg_a.earthdata_login(user_id,user_email) # doctest: +SKIP
        Earthdata Login password:  ········
        >>> reg_a.show_custom_options(dictview=True) # doctest: +SKIP
        Subsetting options
        [{'id': 'ICESAT2',
        'maxGransAsyncRequest': '2000',
        'maxGransSyncRequest': '100',
        'spatialSubsetting': 'true',
        'spatialSubsettingShapefile': 'true',
        'temporalSubsetting': 'true',
        'type': 'both'}]
        Data File Formats (Reformatting Options)
        ['TABULAR_ASCII', 'NetCDF4-CF', 'Shapefile', 'NetCDF-3']
        Reprojection Options
        []
        Data File (Reformatting) Options Supporting Reprojection
        ['TABULAR_ASCII', 'NetCDF4-CF', 'Shapefile', 'NetCDF-3', 'No reformatting']
        Data File (Reformatting) Options NOT Supporting Reprojection
        []
        Data Variables (also Subsettable)
        ['ancillary_data/atlas_sdp_gps_epoch',
        'ancillary_data/control',
        'ancillary_data/data_end_utc',
        .
        .
        .
        'quality_assessment/gt3r/signal_selection_source_fraction_3']
        """
        headers = [
            "Subsetting options",
            "Data File Formats (Reformatting Options)",
            "Reprojection Options",
            "Data File (Reformatting) Options Supporting Reprojection",
            "Data File (Reformatting) Options NOT Supporting Reprojection",
            "Data Variables (also Subsettable)",
        ]
        keys = [
            "options",
            "fileformats",
            "reprojectionONLY",
            "formatreproj",
            "noproj",
            "variables",
        ]

        try:
            all(key in self._cust_options.keys() for key in keys)
        except AttributeError or KeyError:
            self._cust_options = is2ref._get_custom_options(
                self._session, self.product, self._version
            )

        for h, k in zip(headers, keys):
            print(h)
            if k == "variables" and dictview:
                vgrp, paths = Variables.parse_var_list(self._cust_options[k])
                pprint.pprint(vgrp)
            else:
                pprint.pprint(self._cust_options[k])
def test_get_custom_options_output(session):
    obs = is2ref._get_custom_options(session, "ATL06", "004")
    with open("./ATL06v04_options.json", "r") as exp:
        assert all(keys in obs.keys() for keys in exp.keys())
        assert all(obs[key] == exp[key] for key in exp.keys())
Beispiel #5
0
def test_get_custom_options_output(session):
    obs = is2ref._get_custom_options(session, 'ATL06','002')
    exp = {'options' : [{'id': 'ICESAT2',
        'maxGransAsyncRequest': '2000',
        'maxGransSyncRequest': '100',
        'spatialSubsetting': 'true',
        'spatialSubsettingShapefile': 'true',
        'temporalSubsetting': 'true',
        'type': 'both'}],
        'fileformats' : ['TABULAR_ASCII', 'NetCDF4-CF', 'Shapefile', 'NetCDF-3'],
        'formatreproj' : [],
        'reprojectionONLY' : ['TABULAR_ASCII', 'NetCDF4-CF', 'Shapefile', 'NetCDF-3', 'No reformatting'],
        'noproj' : [],
        'variables' :
        ['ancillary_data/atlas_sdp_gps_epoch',
        'ancillary_data/control',
        'ancillary_data/data_end_utc',
        'ancillary_data/data_start_utc',
        'ancillary_data/end_cycle',
        'ancillary_data/end_delta_time',
        'ancillary_data/end_geoseg',
        'ancillary_data/end_gpssow',
        'ancillary_data/end_gpsweek',
        'ancillary_data/end_orbit',
        'ancillary_data/end_region',
        'ancillary_data/end_rgt',
        'ancillary_data/granule_end_utc',
        'ancillary_data/granule_start_utc',
        'ancillary_data/qa_at_interval',
        'ancillary_data/release',
        'ancillary_data/start_cycle',
        'ancillary_data/start_delta_time',
        'ancillary_data/start_geoseg',
        'ancillary_data/start_gpssow',
        'ancillary_data/start_gpsweek',
        'ancillary_data/start_orbit',
        'ancillary_data/start_region',
        'ancillary_data/start_rgt',
        'ancillary_data/version',
        'ancillary_data/land_ice/dt_hist',
        'ancillary_data/land_ice/fit_maxiter',
        'ancillary_data/land_ice/fpb_maxiter',
        'ancillary_data/land_ice/maxiter',
        'ancillary_data/land_ice/max_res_ids',
        'ancillary_data/land_ice/min_dist',
        'ancillary_data/land_ice/min_gain_th',
        'ancillary_data/land_ice/min_n_pe',
        'ancillary_data/land_ice/min_n_sel',
        'ancillary_data/land_ice/min_signal_conf',
        'ancillary_data/land_ice/n_hist',
        'ancillary_data/land_ice/nhist_bins',
        'ancillary_data/land_ice/n_sigmas',
        'ancillary_data/land_ice/proc_interval',
        'ancillary_data/land_ice/rbin_width',
        'ancillary_data/land_ice/sigma_beam',
        'ancillary_data/land_ice/sigma_tx',
        'ancillary_data/land_ice/t_dead',
        'ancillary_data/land_ice/win_nsig',
        'gt1l/land_ice_segments/atl06_quality_summary',
        'gt1l/land_ice_segments/delta_time',
        'gt1l/land_ice_segments/h_li',
        'gt1l/land_ice_segments/h_li_sigma',
        'gt1l/land_ice_segments/latitude',
        'gt1l/land_ice_segments/longitude',
        'gt1l/land_ice_segments/segment_id',
        'gt1l/land_ice_segments/sigma_geo_h',
        'gt1l/land_ice_segments/bias_correction/fpb_mean_corr',
        'gt1l/land_ice_segments/bias_correction/fpb_mean_corr_sigma',
        'gt1l/land_ice_segments/bias_correction/fpb_med_corr',
        'gt1l/land_ice_segments/bias_correction/fpb_med_corr_sigma',
        'gt1l/land_ice_segments/bias_correction/fpb_n_corr',
        'gt1l/land_ice_segments/bias_correction/med_r_fit',
        'gt1l/land_ice_segments/bias_correction/tx_mean_corr',
        'gt1l/land_ice_segments/bias_correction/tx_med_corr',
        'gt1l/land_ice_segments/dem/dem_flag',
        'gt1l/land_ice_segments/dem/dem_h',
        'gt1l/land_ice_segments/dem/geoid_h',
        'gt1l/land_ice_segments/fit_statistics/dh_fit_dx',
        'gt1l/land_ice_segments/fit_statistics/dh_fit_dx_sigma',
        'gt1l/land_ice_segments/fit_statistics/dh_fit_dy',
        'gt1l/land_ice_segments/fit_statistics/h_expected_rms',
        'gt1l/land_ice_segments/fit_statistics/h_mean',
        'gt1l/land_ice_segments/fit_statistics/h_rms_misfit',
        'gt1l/land_ice_segments/fit_statistics/h_robust_sprd',
        'gt1l/land_ice_segments/fit_statistics/n_fit_photons',
        'gt1l/land_ice_segments/fit_statistics/n_seg_pulses',
        'gt1l/land_ice_segments/fit_statistics/sigma_h_mean',
        'gt1l/land_ice_segments/fit_statistics/signal_selection_source',
        'gt1l/land_ice_segments/fit_statistics/signal_selection_source_status',
        'gt1l/land_ice_segments/fit_statistics/snr',
        'gt1l/land_ice_segments/fit_statistics/snr_significance',
        'gt1l/land_ice_segments/fit_statistics/w_surface_window_final',
        'gt1l/land_ice_segments/geophysical/bckgrd',
        'gt1l/land_ice_segments/geophysical/bsnow_conf',
        'gt1l/land_ice_segments/geophysical/bsnow_h',
        'gt1l/land_ice_segments/geophysical/bsnow_od',
        'gt1l/land_ice_segments/geophysical/cloud_flg_asr',
        'gt1l/land_ice_segments/geophysical/cloud_flg_atm',
        'gt1l/land_ice_segments/geophysical/dac',
        'gt1l/land_ice_segments/geophysical/e_bckgrd',
        'gt1l/land_ice_segments/geophysical/msw_flag',
        'gt1l/land_ice_segments/geophysical/neutat_delay_total',
        'gt1l/land_ice_segments/geophysical/r_eff',
        'gt1l/land_ice_segments/geophysical/solar_azimuth',
        'gt1l/land_ice_segments/geophysical/solar_elevation',
        'gt1l/land_ice_segments/geophysical/tide_earth',
        'gt1l/land_ice_segments/geophysical/tide_equilibrium',
        'gt1l/land_ice_segments/geophysical/tide_load',
        'gt1l/land_ice_segments/geophysical/tide_ocean',
        'gt1l/land_ice_segments/geophysical/tide_pole',
        'gt1l/land_ice_segments/ground_track/ref_azimuth',
        'gt1l/land_ice_segments/ground_track/ref_coelv',
        'gt1l/land_ice_segments/ground_track/seg_azimuth',
        'gt1l/land_ice_segments/ground_track/sigma_geo_at',
        'gt1l/land_ice_segments/ground_track/sigma_geo_xt',
        'gt1l/land_ice_segments/ground_track/x_atc',
        'gt1l/land_ice_segments/ground_track/y_atc',
        'gt1l/residual_histogram/bckgrd_per_bin',
        'gt1l/residual_histogram/count',
        'gt1l/residual_histogram/delta_time',
        'gt1l/residual_histogram/dh',
        'gt1l/residual_histogram/ds_segment_id',
        'gt1l/residual_histogram/lat_mean',
        'gt1l/residual_histogram/lon_mean',
        'gt1l/residual_histogram/pulse_count',
        'gt1l/residual_histogram/segment_id_list',
        'gt1l/residual_histogram/x_atc_mean',
        'gt1l/segment_quality/delta_time',
        'gt1l/segment_quality/record_number',
        'gt1l/segment_quality/reference_pt_lat',
        'gt1l/segment_quality/reference_pt_lon',
        'gt1l/segment_quality/segment_id',
        'gt1l/segment_quality/signal_selection_source',
        'gt1l/segment_quality/signal_selection_status/signal_selection_status_all',
        'gt1l/segment_quality/signal_selection_status/signal_selection_status_backup',
        'gt1l/segment_quality/signal_selection_status/signal_selection_status_confident',
        'gt1r/land_ice_segments/atl06_quality_summary',
        'gt1r/land_ice_segments/delta_time',
        'gt1r/land_ice_segments/h_li',
        'gt1r/land_ice_segments/h_li_sigma',
        'gt1r/land_ice_segments/latitude',
        'gt1r/land_ice_segments/longitude',
        'gt1r/land_ice_segments/segment_id',
        'gt1r/land_ice_segments/sigma_geo_h',
        'gt1r/land_ice_segments/bias_correction/fpb_mean_corr',
        'gt1r/land_ice_segments/bias_correction/fpb_mean_corr_sigma',
        'gt1r/land_ice_segments/bias_correction/fpb_med_corr',
        'gt1r/land_ice_segments/bias_correction/fpb_med_corr_sigma',
        'gt1r/land_ice_segments/bias_correction/fpb_n_corr',
        'gt1r/land_ice_segments/bias_correction/med_r_fit',
        'gt1r/land_ice_segments/bias_correction/tx_mean_corr',
        'gt1r/land_ice_segments/bias_correction/tx_med_corr',
        'gt1r/land_ice_segments/dem/dem_flag',
        'gt1r/land_ice_segments/dem/dem_h',
        'gt1r/land_ice_segments/dem/geoid_h',
        'gt1r/land_ice_segments/fit_statistics/dh_fit_dx',
        'gt1r/land_ice_segments/fit_statistics/dh_fit_dx_sigma',
        'gt1r/land_ice_segments/fit_statistics/dh_fit_dy',
        'gt1r/land_ice_segments/fit_statistics/h_expected_rms',
        'gt1r/land_ice_segments/fit_statistics/h_mean',
        'gt1r/land_ice_segments/fit_statistics/h_rms_misfit',
        'gt1r/land_ice_segments/fit_statistics/h_robust_sprd',
        'gt1r/land_ice_segments/fit_statistics/n_fit_photons',
        'gt1r/land_ice_segments/fit_statistics/n_seg_pulses',
        'gt1r/land_ice_segments/fit_statistics/sigma_h_mean',
        'gt1r/land_ice_segments/fit_statistics/signal_selection_source',
        'gt1r/land_ice_segments/fit_statistics/signal_selection_source_status',
        'gt1r/land_ice_segments/fit_statistics/snr',
        'gt1r/land_ice_segments/fit_statistics/snr_significance',
        'gt1r/land_ice_segments/fit_statistics/w_surface_window_final',
        'gt1r/land_ice_segments/geophysical/bckgrd',
        'gt1r/land_ice_segments/geophysical/bsnow_conf',
        'gt1r/land_ice_segments/geophysical/bsnow_h',
        'gt1r/land_ice_segments/geophysical/bsnow_od',
        'gt1r/land_ice_segments/geophysical/cloud_flg_asr',
        'gt1r/land_ice_segments/geophysical/cloud_flg_atm',
        'gt1r/land_ice_segments/geophysical/dac',
        'gt1r/land_ice_segments/geophysical/e_bckgrd',
        'gt1r/land_ice_segments/geophysical/msw_flag',
        'gt1r/land_ice_segments/geophysical/neutat_delay_total',
        'gt1r/land_ice_segments/geophysical/r_eff',
        'gt1r/land_ice_segments/geophysical/solar_azimuth',
        'gt1r/land_ice_segments/geophysical/solar_elevation',
        'gt1r/land_ice_segments/geophysical/tide_earth',
        'gt1r/land_ice_segments/geophysical/tide_equilibrium',
        'gt1r/land_ice_segments/geophysical/tide_load',
        'gt1r/land_ice_segments/geophysical/tide_ocean',
        'gt1r/land_ice_segments/geophysical/tide_pole',
        'gt1r/land_ice_segments/ground_track/ref_azimuth',
        'gt1r/land_ice_segments/ground_track/ref_coelv',
        'gt1r/land_ice_segments/ground_track/seg_azimuth',
        'gt1r/land_ice_segments/ground_track/sigma_geo_at',
        'gt1r/land_ice_segments/ground_track/sigma_geo_xt',
        'gt1r/land_ice_segments/ground_track/x_atc',
        'gt1r/land_ice_segments/ground_track/y_atc',
        'gt1r/residual_histogram/bckgrd_per_bin',
        'gt1r/residual_histogram/count',
        'gt1r/residual_histogram/delta_time',
        'gt1r/residual_histogram/dh',
        'gt1r/residual_histogram/ds_segment_id',
        'gt1r/residual_histogram/lat_mean',
        'gt1r/residual_histogram/lon_mean',
        'gt1r/residual_histogram/pulse_count',
        'gt1r/residual_histogram/segment_id_list',
        'gt1r/residual_histogram/x_atc_mean',
        'gt1r/segment_quality/delta_time',
        'gt1r/segment_quality/record_number',
        'gt1r/segment_quality/reference_pt_lat',
        'gt1r/segment_quality/reference_pt_lon',
        'gt1r/segment_quality/segment_id',
        'gt1r/segment_quality/signal_selection_source',
        'gt1r/segment_quality/signal_selection_status/signal_selection_status_all',
        'gt1r/segment_quality/signal_selection_status/signal_selection_status_backup',
        'gt1r/segment_quality/signal_selection_status/signal_selection_status_confident',
        'gt2l/land_ice_segments/atl06_quality_summary',
        'gt2l/land_ice_segments/delta_time',
        'gt2l/land_ice_segments/h_li',
        'gt2l/land_ice_segments/h_li_sigma',
        'gt2l/land_ice_segments/latitude',
        'gt2l/land_ice_segments/longitude',
        'gt2l/land_ice_segments/segment_id',
        'gt2l/land_ice_segments/sigma_geo_h',
        'gt2l/land_ice_segments/bias_correction/fpb_mean_corr',
        'gt2l/land_ice_segments/bias_correction/fpb_mean_corr_sigma',
        'gt2l/land_ice_segments/bias_correction/fpb_med_corr',
        'gt2l/land_ice_segments/bias_correction/fpb_med_corr_sigma',
        'gt2l/land_ice_segments/bias_correction/fpb_n_corr',
        'gt2l/land_ice_segments/bias_correction/med_r_fit',
        'gt2l/land_ice_segments/bias_correction/tx_mean_corr',
        'gt2l/land_ice_segments/bias_correction/tx_med_corr',
        'gt2l/land_ice_segments/dem/dem_flag',
        'gt2l/land_ice_segments/dem/dem_h',
        'gt2l/land_ice_segments/dem/geoid_h',
        'gt2l/land_ice_segments/fit_statistics/dh_fit_dx',
        'gt2l/land_ice_segments/fit_statistics/dh_fit_dx_sigma',
        'gt2l/land_ice_segments/fit_statistics/dh_fit_dy',
        'gt2l/land_ice_segments/fit_statistics/h_expected_rms',
        'gt2l/land_ice_segments/fit_statistics/h_mean',
        'gt2l/land_ice_segments/fit_statistics/h_rms_misfit',
        'gt2l/land_ice_segments/fit_statistics/h_robust_sprd',
        'gt2l/land_ice_segments/fit_statistics/n_fit_photons',
        'gt2l/land_ice_segments/fit_statistics/n_seg_pulses',
        'gt2l/land_ice_segments/fit_statistics/sigma_h_mean',
        'gt2l/land_ice_segments/fit_statistics/signal_selection_source',
        'gt2l/land_ice_segments/fit_statistics/signal_selection_source_status',
        'gt2l/land_ice_segments/fit_statistics/snr',
        'gt2l/land_ice_segments/fit_statistics/snr_significance',
        'gt2l/land_ice_segments/fit_statistics/w_surface_window_final',
        'gt2l/land_ice_segments/geophysical/bckgrd',
        'gt2l/land_ice_segments/geophysical/bsnow_conf',
        'gt2l/land_ice_segments/geophysical/bsnow_h',
        'gt2l/land_ice_segments/geophysical/bsnow_od',
        'gt2l/land_ice_segments/geophysical/cloud_flg_asr',
        'gt2l/land_ice_segments/geophysical/cloud_flg_atm',
        'gt2l/land_ice_segments/geophysical/dac',
        'gt2l/land_ice_segments/geophysical/e_bckgrd',
        'gt2l/land_ice_segments/geophysical/msw_flag',
        'gt2l/land_ice_segments/geophysical/neutat_delay_total',
        'gt2l/land_ice_segments/geophysical/r_eff',
        'gt2l/land_ice_segments/geophysical/solar_azimuth',
        'gt2l/land_ice_segments/geophysical/solar_elevation',
        'gt2l/land_ice_segments/geophysical/tide_earth',
        'gt2l/land_ice_segments/geophysical/tide_equilibrium',
        'gt2l/land_ice_segments/geophysical/tide_load',
        'gt2l/land_ice_segments/geophysical/tide_ocean',
        'gt2l/land_ice_segments/geophysical/tide_pole',
        'gt2l/land_ice_segments/ground_track/ref_azimuth',
        'gt2l/land_ice_segments/ground_track/ref_coelv',
        'gt2l/land_ice_segments/ground_track/seg_azimuth',
        'gt2l/land_ice_segments/ground_track/sigma_geo_at',
        'gt2l/land_ice_segments/ground_track/sigma_geo_xt',
        'gt2l/land_ice_segments/ground_track/x_atc',
        'gt2l/land_ice_segments/ground_track/y_atc',
        'gt2l/residual_histogram/bckgrd_per_bin',
        'gt2l/residual_histogram/count',
        'gt2l/residual_histogram/delta_time',
        'gt2l/residual_histogram/dh',
        'gt2l/residual_histogram/ds_segment_id',
        'gt2l/residual_histogram/lat_mean',
        'gt2l/residual_histogram/lon_mean',
        'gt2l/residual_histogram/pulse_count',
        'gt2l/residual_histogram/segment_id_list',
        'gt2l/residual_histogram/x_atc_mean',
        'gt2l/segment_quality/delta_time',
        'gt2l/segment_quality/record_number',
        'gt2l/segment_quality/reference_pt_lat',
        'gt2l/segment_quality/reference_pt_lon',
        'gt2l/segment_quality/segment_id',
        'gt2l/segment_quality/signal_selection_source',
        'gt2l/segment_quality/signal_selection_status/signal_selection_status_all',
        'gt2l/segment_quality/signal_selection_status/signal_selection_status_backup',
        'gt2l/segment_quality/signal_selection_status/signal_selection_status_confident',
        'gt2r/land_ice_segments/atl06_quality_summary',
        'gt2r/land_ice_segments/delta_time',
        'gt2r/land_ice_segments/h_li',
        'gt2r/land_ice_segments/h_li_sigma',
        'gt2r/land_ice_segments/latitude',
        'gt2r/land_ice_segments/longitude',
        'gt2r/land_ice_segments/segment_id',
        'gt2r/land_ice_segments/sigma_geo_h',
        'gt2r/land_ice_segments/bias_correction/fpb_mean_corr',
        'gt2r/land_ice_segments/bias_correction/fpb_mean_corr_sigma',
        'gt2r/land_ice_segments/bias_correction/fpb_med_corr',
        'gt2r/land_ice_segments/bias_correction/fpb_med_corr_sigma',
        'gt2r/land_ice_segments/bias_correction/fpb_n_corr',
        'gt2r/land_ice_segments/bias_correction/med_r_fit',
        'gt2r/land_ice_segments/bias_correction/tx_mean_corr',
        'gt2r/land_ice_segments/bias_correction/tx_med_corr',
        'gt2r/land_ice_segments/dem/dem_flag',
        'gt2r/land_ice_segments/dem/dem_h',
        'gt2r/land_ice_segments/dem/geoid_h',
        'gt2r/land_ice_segments/fit_statistics/dh_fit_dx',
        'gt2r/land_ice_segments/fit_statistics/dh_fit_dx_sigma',
        'gt2r/land_ice_segments/fit_statistics/dh_fit_dy',
        'gt2r/land_ice_segments/fit_statistics/h_expected_rms',
        'gt2r/land_ice_segments/fit_statistics/h_mean',
        'gt2r/land_ice_segments/fit_statistics/h_rms_misfit',
        'gt2r/land_ice_segments/fit_statistics/h_robust_sprd',
        'gt2r/land_ice_segments/fit_statistics/n_fit_photons',
        'gt2r/land_ice_segments/fit_statistics/n_seg_pulses',
        'gt2r/land_ice_segments/fit_statistics/sigma_h_mean',
        'gt2r/land_ice_segments/fit_statistics/signal_selection_source',
        'gt2r/land_ice_segments/fit_statistics/signal_selection_source_status',
        'gt2r/land_ice_segments/fit_statistics/snr',
        'gt2r/land_ice_segments/fit_statistics/snr_significance',
        'gt2r/land_ice_segments/fit_statistics/w_surface_window_final',
        'gt2r/land_ice_segments/geophysical/bckgrd',
        'gt2r/land_ice_segments/geophysical/bsnow_conf',
        'gt2r/land_ice_segments/geophysical/bsnow_h',
        'gt2r/land_ice_segments/geophysical/bsnow_od',
        'gt2r/land_ice_segments/geophysical/cloud_flg_asr',
        'gt2r/land_ice_segments/geophysical/cloud_flg_atm',
        'gt2r/land_ice_segments/geophysical/dac',
        'gt2r/land_ice_segments/geophysical/e_bckgrd',
        'gt2r/land_ice_segments/geophysical/msw_flag',
        'gt2r/land_ice_segments/geophysical/neutat_delay_total',
        'gt2r/land_ice_segments/geophysical/r_eff',
        'gt2r/land_ice_segments/geophysical/solar_azimuth',
        'gt2r/land_ice_segments/geophysical/solar_elevation',
        'gt2r/land_ice_segments/geophysical/tide_earth',
        'gt2r/land_ice_segments/geophysical/tide_equilibrium',
        'gt2r/land_ice_segments/geophysical/tide_load',
        'gt2r/land_ice_segments/geophysical/tide_ocean',
        'gt2r/land_ice_segments/geophysical/tide_pole',
        'gt2r/land_ice_segments/ground_track/ref_azimuth',
        'gt2r/land_ice_segments/ground_track/ref_coelv',
        'gt2r/land_ice_segments/ground_track/seg_azimuth',
        'gt2r/land_ice_segments/ground_track/sigma_geo_at',
        'gt2r/land_ice_segments/ground_track/sigma_geo_xt',
        'gt2r/land_ice_segments/ground_track/x_atc',
        'gt2r/land_ice_segments/ground_track/y_atc',
        'gt2r/residual_histogram/bckgrd_per_bin',
        'gt2r/residual_histogram/count',
        'gt2r/residual_histogram/delta_time',
        'gt2r/residual_histogram/dh',
        'gt2r/residual_histogram/ds_segment_id',
        'gt2r/residual_histogram/lat_mean',
        'gt2r/residual_histogram/lon_mean',
        'gt2r/residual_histogram/pulse_count',
        'gt2r/residual_histogram/segment_id_list',
        'gt2r/residual_histogram/x_atc_mean',
        'gt2r/segment_quality/delta_time',
        'gt2r/segment_quality/record_number',
        'gt2r/segment_quality/reference_pt_lat',
        'gt2r/segment_quality/reference_pt_lon',
        'gt2r/segment_quality/segment_id',
        'gt2r/segment_quality/signal_selection_source',
        'gt2r/segment_quality/signal_selection_status/signal_selection_status_all',
        'gt2r/segment_quality/signal_selection_status/signal_selection_status_backup',
        'gt2r/segment_quality/signal_selection_status/signal_selection_status_confident',
        'gt3l/land_ice_segments/atl06_quality_summary',
        'gt3l/land_ice_segments/delta_time',
        'gt3l/land_ice_segments/h_li',
        'gt3l/land_ice_segments/h_li_sigma',
        'gt3l/land_ice_segments/latitude',
        'gt3l/land_ice_segments/longitude',
        'gt3l/land_ice_segments/segment_id',
        'gt3l/land_ice_segments/sigma_geo_h',
        'gt3l/land_ice_segments/bias_correction/fpb_mean_corr',
        'gt3l/land_ice_segments/bias_correction/fpb_mean_corr_sigma',
        'gt3l/land_ice_segments/bias_correction/fpb_med_corr',
        'gt3l/land_ice_segments/bias_correction/fpb_med_corr_sigma',
        'gt3l/land_ice_segments/bias_correction/fpb_n_corr',
        'gt3l/land_ice_segments/bias_correction/med_r_fit',
        'gt3l/land_ice_segments/bias_correction/tx_mean_corr',
        'gt3l/land_ice_segments/bias_correction/tx_med_corr',
        'gt3l/land_ice_segments/dem/dem_flag',
        'gt3l/land_ice_segments/dem/dem_h',
        'gt3l/land_ice_segments/dem/geoid_h',
        'gt3l/land_ice_segments/fit_statistics/dh_fit_dx',
        'gt3l/land_ice_segments/fit_statistics/dh_fit_dx_sigma',
        'gt3l/land_ice_segments/fit_statistics/dh_fit_dy',
        'gt3l/land_ice_segments/fit_statistics/h_expected_rms',
        'gt3l/land_ice_segments/fit_statistics/h_mean',
        'gt3l/land_ice_segments/fit_statistics/h_rms_misfit',
        'gt3l/land_ice_segments/fit_statistics/h_robust_sprd',
        'gt3l/land_ice_segments/fit_statistics/n_fit_photons',
        'gt3l/land_ice_segments/fit_statistics/n_seg_pulses',
        'gt3l/land_ice_segments/fit_statistics/sigma_h_mean',
        'gt3l/land_ice_segments/fit_statistics/signal_selection_source',
        'gt3l/land_ice_segments/fit_statistics/signal_selection_source_status',
        'gt3l/land_ice_segments/fit_statistics/snr',
        'gt3l/land_ice_segments/fit_statistics/snr_significance',
        'gt3l/land_ice_segments/fit_statistics/w_surface_window_final',
        'gt3l/land_ice_segments/geophysical/bckgrd',
        'gt3l/land_ice_segments/geophysical/bsnow_conf',
        'gt3l/land_ice_segments/geophysical/bsnow_h',
        'gt3l/land_ice_segments/geophysical/bsnow_od',
        'gt3l/land_ice_segments/geophysical/cloud_flg_asr',
        'gt3l/land_ice_segments/geophysical/cloud_flg_atm',
        'gt3l/land_ice_segments/geophysical/dac',
        'gt3l/land_ice_segments/geophysical/e_bckgrd',
        'gt3l/land_ice_segments/geophysical/msw_flag',
        'gt3l/land_ice_segments/geophysical/neutat_delay_total',
        'gt3l/land_ice_segments/geophysical/r_eff',
        'gt3l/land_ice_segments/geophysical/solar_azimuth',
        'gt3l/land_ice_segments/geophysical/solar_elevation',
        'gt3l/land_ice_segments/geophysical/tide_earth',
        'gt3l/land_ice_segments/geophysical/tide_equilibrium',
        'gt3l/land_ice_segments/geophysical/tide_load',
        'gt3l/land_ice_segments/geophysical/tide_ocean',
        'gt3l/land_ice_segments/geophysical/tide_pole',
        'gt3l/land_ice_segments/ground_track/ref_azimuth',
        'gt3l/land_ice_segments/ground_track/ref_coelv',
        'gt3l/land_ice_segments/ground_track/seg_azimuth',
        'gt3l/land_ice_segments/ground_track/sigma_geo_at',
        'gt3l/land_ice_segments/ground_track/sigma_geo_xt',
        'gt3l/land_ice_segments/ground_track/x_atc',
        'gt3l/land_ice_segments/ground_track/y_atc',
        'gt3l/residual_histogram/bckgrd_per_bin',
        'gt3l/residual_histogram/count',
        'gt3l/residual_histogram/delta_time',
        'gt3l/residual_histogram/dh',
        'gt3l/residual_histogram/ds_segment_id',
        'gt3l/residual_histogram/lat_mean',
        'gt3l/residual_histogram/lon_mean',
        'gt3l/residual_histogram/pulse_count',
        'gt3l/residual_histogram/segment_id_list',
        'gt3l/residual_histogram/x_atc_mean',
        'gt3l/segment_quality/delta_time',
        'gt3l/segment_quality/record_number',
        'gt3l/segment_quality/reference_pt_lat',
        'gt3l/segment_quality/reference_pt_lon',
        'gt3l/segment_quality/segment_id',
        'gt3l/segment_quality/signal_selection_source',
        'gt3l/segment_quality/signal_selection_status/signal_selection_status_all',
        'gt3l/segment_quality/signal_selection_status/signal_selection_status_backup',
        'gt3l/segment_quality/signal_selection_status/signal_selection_status_confident',
        'gt3r/land_ice_segments/atl06_quality_summary',
        'gt3r/land_ice_segments/delta_time',
        'gt3r/land_ice_segments/h_li',
        'gt3r/land_ice_segments/h_li_sigma',
        'gt3r/land_ice_segments/latitude',
        'gt3r/land_ice_segments/longitude',
        'gt3r/land_ice_segments/segment_id',
        'gt3r/land_ice_segments/sigma_geo_h',
        'gt3r/land_ice_segments/bias_correction/fpb_mean_corr',
        'gt3r/land_ice_segments/bias_correction/fpb_mean_corr_sigma',
        'gt3r/land_ice_segments/bias_correction/fpb_med_corr',
        'gt3r/land_ice_segments/bias_correction/fpb_med_corr_sigma',
        'gt3r/land_ice_segments/bias_correction/fpb_n_corr',
        'gt3r/land_ice_segments/bias_correction/med_r_fit',
        'gt3r/land_ice_segments/bias_correction/tx_mean_corr',
        'gt3r/land_ice_segments/bias_correction/tx_med_corr',
        'gt3r/land_ice_segments/dem/dem_flag',
        'gt3r/land_ice_segments/dem/dem_h',
        'gt3r/land_ice_segments/dem/geoid_h',
        'gt3r/land_ice_segments/fit_statistics/dh_fit_dx',
        'gt3r/land_ice_segments/fit_statistics/dh_fit_dx_sigma',
        'gt3r/land_ice_segments/fit_statistics/dh_fit_dy',
        'gt3r/land_ice_segments/fit_statistics/h_expected_rms',
        'gt3r/land_ice_segments/fit_statistics/h_mean',
        'gt3r/land_ice_segments/fit_statistics/h_rms_misfit',
        'gt3r/land_ice_segments/fit_statistics/h_robust_sprd',
        'gt3r/land_ice_segments/fit_statistics/n_fit_photons',
        'gt3r/land_ice_segments/fit_statistics/n_seg_pulses',
        'gt3r/land_ice_segments/fit_statistics/sigma_h_mean',
        'gt3r/land_ice_segments/fit_statistics/signal_selection_source',
        'gt3r/land_ice_segments/fit_statistics/signal_selection_source_status',
        'gt3r/land_ice_segments/fit_statistics/snr',
        'gt3r/land_ice_segments/fit_statistics/snr_significance',
        'gt3r/land_ice_segments/fit_statistics/w_surface_window_final',
        'gt3r/land_ice_segments/geophysical/bckgrd',
        'gt3r/land_ice_segments/geophysical/bsnow_conf',
        'gt3r/land_ice_segments/geophysical/bsnow_h',
        'gt3r/land_ice_segments/geophysical/bsnow_od',
        'gt3r/land_ice_segments/geophysical/cloud_flg_asr',
        'gt3r/land_ice_segments/geophysical/cloud_flg_atm',
        'gt3r/land_ice_segments/geophysical/dac',
        'gt3r/land_ice_segments/geophysical/e_bckgrd',
        'gt3r/land_ice_segments/geophysical/msw_flag',
        'gt3r/land_ice_segments/geophysical/neutat_delay_total',
        'gt3r/land_ice_segments/geophysical/r_eff',
        'gt3r/land_ice_segments/geophysical/solar_azimuth',
        'gt3r/land_ice_segments/geophysical/solar_elevation',
        'gt3r/land_ice_segments/geophysical/tide_earth',
        'gt3r/land_ice_segments/geophysical/tide_equilibrium',
        'gt3r/land_ice_segments/geophysical/tide_load',
        'gt3r/land_ice_segments/geophysical/tide_ocean',
        'gt3r/land_ice_segments/geophysical/tide_pole',
        'gt3r/land_ice_segments/ground_track/ref_azimuth',
        'gt3r/land_ice_segments/ground_track/ref_coelv',
        'gt3r/land_ice_segments/ground_track/seg_azimuth',
        'gt3r/land_ice_segments/ground_track/sigma_geo_at',
        'gt3r/land_ice_segments/ground_track/sigma_geo_xt',
        'gt3r/land_ice_segments/ground_track/x_atc',
        'gt3r/land_ice_segments/ground_track/y_atc',
        'gt3r/residual_histogram/bckgrd_per_bin',
        'gt3r/residual_histogram/count',
        'gt3r/residual_histogram/delta_time',
        'gt3r/residual_histogram/dh',
        'gt3r/residual_histogram/ds_segment_id',
        'gt3r/residual_histogram/lat_mean',
        'gt3r/residual_histogram/lon_mean',
        'gt3r/residual_histogram/pulse_count',
        'gt3r/residual_histogram/segment_id_list',
        'gt3r/residual_histogram/x_atc_mean',
        'gt3r/segment_quality/delta_time',
        'gt3r/segment_quality/record_number',
        'gt3r/segment_quality/reference_pt_lat',
        'gt3r/segment_quality/reference_pt_lon',
        'gt3r/segment_quality/segment_id',
        'gt3r/segment_quality/signal_selection_source',
        'gt3r/segment_quality/signal_selection_status/signal_selection_status_all',
        'gt3r/segment_quality/signal_selection_status/signal_selection_status_backup',
        'gt3r/segment_quality/signal_selection_status/signal_selection_status_confident',
        'orbit_info/crossing_time',
        'orbit_info/cycle_number',
        'orbit_info/lan',
        'orbit_info/orbit_number',
        'orbit_info/rgt',
        'orbit_info/sc_orient',
        'orbit_info/sc_orient_time',
        'quality_assessment/qa_granule_fail_reason',
        'quality_assessment/qa_granule_pass_fail',
        'quality_assessment/gt1l/delta_time',
        'quality_assessment/gt1l/lat_mean',
        'quality_assessment/gt1l/lon_mean',
        'quality_assessment/gt1l/signal_selection_source_fraction_0',
        'quality_assessment/gt1l/signal_selection_source_fraction_1',
        'quality_assessment/gt1l/signal_selection_source_fraction_2',
        'quality_assessment/gt1l/signal_selection_source_fraction_3',
        'quality_assessment/gt1r/delta_time',
        'quality_assessment/gt1r/lat_mean',
        'quality_assessment/gt1r/lon_mean',
        'quality_assessment/gt1r/signal_selection_source_fraction_0',
        'quality_assessment/gt1r/signal_selection_source_fraction_1',
        'quality_assessment/gt1r/signal_selection_source_fraction_2',
        'quality_assessment/gt1r/signal_selection_source_fraction_3',
        'quality_assessment/gt2l/delta_time',
        'quality_assessment/gt2l/lat_mean',
        'quality_assessment/gt2l/lon_mean',
        'quality_assessment/gt2l/signal_selection_source_fraction_0',
        'quality_assessment/gt2l/signal_selection_source_fraction_1',
        'quality_assessment/gt2l/signal_selection_source_fraction_2',
        'quality_assessment/gt2l/signal_selection_source_fraction_3',
        'quality_assessment/gt2r/delta_time',
        'quality_assessment/gt2r/lat_mean',
        'quality_assessment/gt2r/lon_mean',
        'quality_assessment/gt2r/signal_selection_source_fraction_0',
        'quality_assessment/gt2r/signal_selection_source_fraction_1',
        'quality_assessment/gt2r/signal_selection_source_fraction_2',
        'quality_assessment/gt2r/signal_selection_source_fraction_3',
        'quality_assessment/gt3l/delta_time',
        'quality_assessment/gt3l/lat_mean',
        'quality_assessment/gt3l/lon_mean',
        'quality_assessment/gt3l/signal_selection_source_fraction_0',
        'quality_assessment/gt3l/signal_selection_source_fraction_1',
        'quality_assessment/gt3l/signal_selection_source_fraction_2',
        'quality_assessment/gt3l/signal_selection_source_fraction_3',
        'quality_assessment/gt3r/delta_time',
        'quality_assessment/gt3r/lat_mean',
        'quality_assessment/gt3r/lon_mean',
        'quality_assessment/gt3r/signal_selection_source_fraction_0',
        'quality_assessment/gt3r/signal_selection_source_fraction_1',
        'quality_assessment/gt3r/signal_selection_source_fraction_2',
        'quality_assessment/gt3r/signal_selection_source_fraction_3']}
    assert all(keys in obs.keys() for keys in exp.keys())
    assert obs[key] == exp[key] for key in exp.keys()