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)