Catalogue de la base de données

La bibliothèque PyCTOH utilise un système de catalogues pour gérer sa base de données. La classe Catalogue permet d’accéder à la description des produits du catalogue et au contenu des produits.

>>> from pyctoh.db.catalogue import Catalogue
>>> import os
>>> catalogue_filepath = os.environ['ALT_CATALOGUE'] # Variable d'environnement catalogue PyCTOH
>>> cat = Catalogue(filepath=catalogue_filepath)

CTOH_SHARED_DATA

Il y se produit une erreur si la variable d’evironnement CTOH_SHARED_DATA n’est pas défini. Cette variable est necessaire pour le module Orbit de PyCTOH. Elle définit le répertoire où sont défini les données d’orbite de chaque mission altimétriques. Sur les serveurs LEGOS, elle est initialisée:

> export CTOH_SHARED_DATA=/ctoh/data/shared

Environnement PyCTOH

Renvoie un dictionnaire contenant les paramètres de configuration de la bibliothèque PyCTOH:

>>> cat.env()
{'catalogue': '/ctoh/data/db/catalogue_yml/ctoh_products_base.yml',
 'metadata_directory': '/ctoh/data/db/catalogue_yml/metadb',
 'mode': 'yml',
 'CTOH_SHARED_DATA': '/ctoh/data/shared'}

Définition d’un nouveau catalgue

Il est possible de créer votre propre catalogue et de le définir.

>>> catalogue_filepath = '/user/db/catalogue/products_base.yml'
>>> cat = Catalogue(catalogue_filepath)

Répertoire de la base de données

>>> cat.get_default_path()
'/ctoh/data/db/products'

Liste des produits

Liste les produits disponibles dans le catalogue:

>>> cat.cat_product_list()
[['cs2_b_gop_c_gdr', 'Cryosat-2', 'cs2', 'b', 'gop', 'c', 'gdr'],
 ['cs2_b_ice_d_gdr', 'Cryosat-2', 'cs2', 'b', 'ice', 'd', 'gdr'],
 ['env_a_ctoh_v0210_gdr', 'Envisat', 'env', 'a', 'ctoh', 'v0210', 'gdr'],
 ['env_a_esa_v0300_sgdr', 'Envisat', 'env', 'a', 'esa', 'v0300', 'sgdr'],
 ['env_b_ctoh_v0210_gdr', 'Envisat', 'env', 'b', 'ctoh', 'v0210', 'gdr'],
 ['env_b_esa_v0300_sgdr', 'Envisat', 'env', 'b', 'esa', 'v0300', 'sgdr'],
 ['ers2_a_ctoh_v0100_gdr', 'ERS-2', 'ers2', 'a', 'ctoh', 'v0100', 'gdr'],
 ['ers2_a_reaper_v0108_gdr', 'ERS-2', 'ers2', 'a', 'reaper', 'v0108', 'gdr'],
 ['ers2_a_reaper_v0108_sgdr', 'ERS-2', 'ers2', 'a', 'reaper', 'v0108', 'sgdr'],
 ['ja1_a_cnes_e_gdr', 'Jason-1', 'ja1', 'a', 'cnes', 'e', 'gdr'],
 ['ja1_b_cnes_e_gdr', 'Jason-1', 'ja1', 'b', 'cnes', 'e', 'gdr'],
 ['ja1_c_cnes_e_gdr', 'Jason-1', 'ja1', 'c', 'cnes', 'e', 'gdr'],
 ['ja2_a_cnes_d_gdr', 'Jason-2', 'ja2', 'a', 'cnes', 'd', 'gdr'],
 ['ja2_a_cnes_d_sgdr', 'Jason-2', 'ja2', 'a', 'cnes', 'd', 'sgdr'],
 ['ja2_b_cnes_d_gdr', 'Jason-2', 'ja2', 'b', 'cnes', 'd', 'gdr'],
 ['ja2_b_cnes_d_sgdr', 'Jason-2', 'ja2', 'b', 'cnes', 'd', 'sgdr'],
 ['ja2_c_cnes_d_sgdr', 'Jason-2', 'ja2', 'c', 'cnes', 'd', 'sgdr'],
 ['ja2_d_cnes_d_sgdr', 'Jason-2', 'ja2', 'd', 'cnes', 'd', 'sgdr'],
 ['ja3_a_cnes_%_sgdr', 'Jason-3', 'ja3', 'a', 'cnes', '%', 'sgdr'],
 ['ja3_a_cnes_%_sigdr', 'Jason-3', 'ja3', 'a', 'cnes', '%', 'sigdr'],
 ['ja3_a_cnes_f_sgdr', 'Jason-3', 'ja3', 'a', 'cnes', 'f', 'sgdr'],
 ['s3a_a_lan_%_sgdr', 'Sentinel-3A', 's3a', 'a', 'lan', '%', 'sgdr'],
 ['s3a_a_wat_%_sgdr', 'Sentinel-3A', 's3a', 'a', 'wat', '%', 'sgdr'],
 ['s3b_a_lan_%_sgdr', 'Sentinel-3B', 's3b', 'a', 'lan', '%', 'sgdr'],
 ['s3b_a_wat_%_sgdr', 'Sentinel-3B', 's3b', 'a', 'wat', '%', 'sgdr'],
 ['s3b_b_lan_%_sgdr', 'Sentinel-3B', 's3b', 'b', 'lan', '%', 'sgdr'],
 ['s3b_b_wat_%_sgdr', 'Sentinel-3B', 's3b', 'b', 'wat', '%', 'sgdr'],
 ['s6a_a_lrm_%_gdr', 'Sentinel-6A', 's6a', 'a', 'lrm', '%', 'gdr'],
 ['s6a_a_sar_%_gdr', 'Sentinel-6A', 's6a', 'a', 'sar', '%', 'gdr'],
 ['srl_a_cnes_%_sgdr', 'Saral', 'srl', 'a', 'cnes', '%', 'sgdr'],
 ['srl_a_cnes_f_sgdr', 'Saral', 'srl', 'a', 'cnes', 'f', 'sgdr'],
 ['srl_b_cnes_%_sgdr', 'Saral', 'srl', 'b', 'cnes', '%', 'sgdr'],
 ['srl_b_cnes_%_sigdr', 'Saral', 'srl', 'b', 'cnes', '%', 'sigdr'],
 ['srl_b_cnes_f_sgdr', 'Saral', 'srl', 'b', 'cnes', 'f', 'sgdr'],
 ['tpx_a_cash_v0100_gdr', 'Topex', 'tpx', 'a', 'cash', 'v0100', 'gdr']]

Information du produit

Liste les attributs du produit demandé. Ici un exemple avec le produit “srl_a_cnes_%_sgdr” :

>>> cat.product_info('srl_a_cnes_f_sgdr')
{'name': 'srl_a_cnes_f_sgdr',
 'product_type': 'saral_t',
 'mission': 'Saral',
 'orbit_phase': 'A',
 'provider': 'CNES',
 'product_version': 'GDR-E, GDR-F, SGDR',
 'doc': 'Saral S-GDR product',
 'product_prefix': 'srl_a_cnes_%_sgdr/',
 'cycle_prefix': 'cycle_\\d{3}/',
 'gdrtype_prefix': {'gdr': 'gdr/',
  'ctoh1': 'ctoh1/ctoh_addons1_',
  'ctoh2': 'ctoh2/ctoh_addons2_',
  'fes14': 'fes14/fes14l-',
  'normpass': 'normpass/normpass_',
  'gpd': 'gpd/gpd_',
  'gpdv2': 'gpdv2/gpd_'},
 'file_postfix': '.*(?P<mission>SRL)_GPS_2P(?P<baseline_collection>[a-zA-Z])P(?P<cycle>\\d{3})_(?P<pass>\\d{4})_(\\d{4}[01]\\d[0-3]\\d)_([0-2]\\d[0-5]\\d[0-5]\\d)_(\\d{4}[01]\\d[0-3]\\d)_([0-2]\\d[0-5]\\d[0-5]\\d).(?P<supplier>CNES).nc',
 'ref_gdr': 'gdr',
 'meanpass_dir': None,
 'orbit': 'ers',
 'ellipsoid': {'name': 'TP', 'a': 6378136.3, 'f': '1/298.257'}}

Liste des cycles du produit

>>> cat.cycle_list('srl_a_cnes_f_sgdr')
[1,
 2,
 3,
 4,
 5,
 6,
 ...
 30,
 31,
 32,
 33,
 34,
 35]

Numéros de cycle et trace du produit

Renvoie un dictionnaire {cycle : liste de trace} du produit demandé. Ici un exemple avec le produit “srl_a_cnes_%_sgdr” :

>>> cat.product_cycle_track('srl_a_cnes_%_sgdr')
{1:[1,2,...,1002],
 2:[3,...1000],
 ...
 107:[8,...890],
 108:[3,...1000],
 109:[3,...1000],}

Numéro de cycle et date du produit

Renvoie un dictionnaire {cycle : [start_date, end_date]} du produit demandé. Ici un exemple avec le produit “srl_a_cnes_%_sgdr” :

>>> cat.product_cycle_date('srl_a_cnes_%_sgdr')
{1:[1999-05-07T10:05:07.321,1999-06-09T10:05:07.321],
 2:[1999-05-07T10:05:07.321,1999-05-09T10:05:07.321],
 ...
 107:[1999-05-07T10:05:07.321,1999-05-09T10:05:07.321],
 108:[1999-05-07T10:05:07.321,1999-05-09T10:05:07.321],
 109:[1999-05-07T10:05:07.321,1999-05-09T10:05:07.321],}

Liste des fichiers

>>> cat.file_list('srl_a_cnes_f_sgdr')
('/ctoh/data/db/products/srl_a_cnes_f_sgdr/',
 array([( 1, 'sgdr',   1, 'SRL_GPS_2PfP001_0001_20130314_053927_20130314_062945.CNES.nc'),
        ( 1, 'sgdr',   2, 'SRL_GPS_2PfP001_0002_20130314_062945_20130314_072003.CNES.nc'),
        ( 1, 'sgdr',   3, 'SRL_GPS_2PfP001_0003_20130314_072003_20130314_081021.CNES.nc'),
        ...,
        (35, 'sgdr', 520, 'SRL_GPS_2PfP035_0520_20160704_084127_20160704_093145.CNES.nc'),
        (35, 'sgdr', 521, 'SRL_GPS_2PfP035_0521_20160704_093145_20160704_102203.CNES.nc'),
        (35, 'sgdr', 522, 'SRL_GPS_2PfP035_0522_20160704_102203_20160704_111221.CNES.nc')],
       dtype=[('cycle', '<i4'), ('gdrtype', '<U10'), ('track', '<i4'), ('filename', '<U150')]))

Création d’un objet Track

>>> # Requête trace 200 cycle 150 du produit 'ja3_a_cnes_f_sgdr'
>>> track_obj = cat.query_product('ja3_a_cnes_f_sgdr', 200, 150)

Création d’un objet Grid

>>> # Requête trace 200 cycle 150 du produit 'ja3_a_cnes_f_sgdr'
>>> grid_obj = cat.query_product('ja3_a_cnes_f_sgdr', None, 150)

Création d’un objet TimeSeries

>>> # Requête trace 200 cycle 150 du produit 'ja3_a_cnes_f_sgdr'
>>> timeseries_obj = cat.query_product('ja3_a_cnes_f_sgdr', 200, None)