1.6.3.2. merge_profiles.py¶
Ce script est destiné à agréger des fichiers de profils verticaux plus ou moins homogènes dans l’organisation des fichiers NetCDF (convention, nom des variables et attributs).
Initialement les profils exploités sont issus des bases CORIOLIS et SISMER.
1.6.3.2.1. Préalables¶
Les profils pris en charge doivent respecter les conditions suivantes:
- avoir les dimensions ou variables représentant le code plateforme, le temps, la position et la profondeur.
- les variables à traiter doivent être représentées sur deux dimensions, la première correspondant au profil, la seconde à la profondeur.
- en option, des variables de code qualité peuvent être utilisées et servir de filtres.
1.6.3.2.2. Fonctionnement¶
Le script effectue les actions suivantes:
- chargement des fichiers de profils.
- exclusion des profils ne répondant pas aux critères de qualité des données.
- exclusion des données masquées.
- détection des dates partielles (heure manquante).
- détection des duplicats.
- homogénéisation du format des profils.
- enregistrement d’un fichier de profils. uniques et un fichier de profils dupliqués.
Les types de profils sont déterminés automatiquement à partir des noms de fichiers.
Le script fonctionne avec un type générique de profil, qui peut être spécialisé pour les cas particuliers.
Les codes plateforme sont déterminés soit par une variable associée, un attribut global, ou le nom de fichier.
La sélection de variables à traiter est réalisée par alias; une table de correspondance est définie dans le code source.
Ex: en spécifiant comme variable “temperature”, la première recherche dans les fichiers sera sur une variable nommée TEMP.
Filtrage qualité
Si une liste de codes qualité valides est renseignée, les profils pour lesquels les informations de temps, position ou profondeurs ne correspondent pas à l’un des codes sont exclus.
Détection de dates partielles
Certains profils peuvent contenir une information partielle en temps, la partie horaire étant indéterminée. Dans ce cas la partie horaire est fixée à 12H et le script cherchera à remplacer ce profil par un profil avec une date complète si disponible, sinon le profil est conservé avec cette date ajustée.
Détection des duplicats
Les critères de duplicité de deux profils sont:
- codes plateforme égaux.
- dates et heures égales.
- positions égales.
Si tous ces critères sont vérifiés, tous les profils correspondant sont ajoutés au fichier de duplicats, le premier profil est quand à lui ajouté au fichier profils uniques.
Homogénéisation des profils
Le script adapte les données des profils pour un format commun en sortie.
Les informations temporelles, issus de variables de type chaîne de caractères, ou numérique avec unité sont converties en valeurs numérique avec unité (par défaut “seconds since 1900-01-01 00:00:00”).
Les informations de profondeurs, issues de variables de profondeur ou de pression sont converties si nécessaire en profondeur.
1.6.3.2.3. Utilisation¶
Le paramétrage peut être réalisé soit par la ligne de commande, par un fichier de configuration ou les deux.
Par exemple, la configuration profiles.cfg
:
[ProfilesMerger]
input-files = profile1.nc,profile2.nc
[[load]]
variables = temperature,salinity
Ce fichier de configuration profiles.cfg
: serait utilisé de la manière suivante:
Cela équivaut à la ligne de commande:
merge_profiles.py --ProfilesMerger-load-variables temperature --ProfilesMerger-load-variables salinity --ProfilesMerger-input-files profile1.nc --ProfilesMerger-input-files profile2.nc
Ou encore:
merge_profiles.py --ProfilesMerger-load-variables temperature --ProfilesMerger-load-variables salinity profile1.nc profile2.nc
Pour une utilisation en ligne de commande:
Le choix des variables à traiter peut être spécifié avec l’option –ProfilesMerger-load-variables (option à répeter pour chaque variable)
Le choix du filtre des codes qualité (des profils à conserver) peut être spécifié avec l’option –ProfilesMerger-load-qualities (option à répeter pour chaque code qualité)
Exemple si on veut garder les profils ayant les codes qualité 1 ou 2:
merge_profiles.py --cfgfile profiles.cfg --ProfilesMerger-load-qualities 1 --ProfilesMerger-load-qualities 2
Le nom du fichier de profils uniques en sortie est déterminé par –ProfilesMerger-merge-filter-file
Le noom du fichier de profils dupliqués en sortie est déterminé par –ProfilesMerger-merge-reject-file
- Le choix des fichiers de profils en entrée à agréger peut être réalisé de trois manières différentes, pouvant être combinées:
- un fichier par argument de la ligne de commande
- un fichier par option “–ProfilesMerger-input-files” de la ligne de commande ou de la configuration
- par recherche de fichier en utilisant les options –ProfilesMerger-find-* de la ligne de commande ou de la configuration
- Si la méthode de recherche de fichier est utilisée, deux modes sont disponibles selon l’utilisation de l’une ou l’autre des options/configurations:
- –ProfilesMerger-find-regex / regex: utilisation d’une expression régulière (ex: ‘.*PR_(BA|CT).*.nc’)
- –ProfilesMerger-find-pattern / pattern: utilisation d’une expression wildcard (ex: (‘PR_BA.nc’, ‘PR_CT.nc’))
1.6.3.2.3.1. Usage¶
Usage: merge_profiles.py [options] [profilesA.nc] [profilesB.nc] [...]
Merge various vertical profiles into a netcdf file
Options:
--version show program's version number and exit
-h, --help show this help message and exit
--nonetcdf3 Do not force saving files in NetCDF version 3
--nonumpywarnings Hide all numpy warnings
--debug Set logging level to DEBUG
--verbose Set logging level to VERBOSE
--loglevel=level Set logging level, available levels are: NOTSET,
DEBUG, VERBOSE, INFO, NOTICE, WARNING, ERROR,
CRITICAL. You may restrict this level for specific
class with filters:
--loglevel=MyBuggedClass=debug,MyVerbose Class=warning
--logformat=format Set logging format. Can also use filters.
--logdateformat=format
Set logging date format. Can also use filters.
--lognocolor Disable logging colors
--cfgfile=CFGFILE Configuration file [default: "none"]
Merger configuration:
--ProfilesMerger-find-path=PROFILESMERGER_FIND_PATH
Root directory. [default: "None"]
--ProfilesMerger-find-regex=PROFILESMERGER_FIND_REGEX
File inclusion regular expression. This is mutually
exclusive with the pattern option. [default: "None"]
--ProfilesMerger-find-pattern=PROFILESMERGER_FIND_PATTERN
File inclusion wildcard pattern(s). This is mutually
exclusive with the regex option. [default: ""]
--ProfilesMerger-find-matchall=PROFILESMERGER_FIND_MATCHALL
Evaluate whole files paths (True) or only files names
(False). [default: "False"]
--ProfilesMerger-find-depth=PROFILESMERGER_FIND_DEPTH
Maximum recursive search depth (None: no limit, 0:
direct children, N: N subdirectories). [default: "0"]
--ProfilesMerger-load-safe=PROFILESMERGER_LOAD_SAFE
Use generic profile on unknown profile type.
[default: "False"]
--ProfilesMerger-load-variables=PROFILESMERGER_LOAD_VARIABLES
Variable filter. [default: ""]
--ProfilesMerger-load-qualities=PROFILESMERGER_LOAD_QUALITIES
Quality code filter applied to time, position and
depth. [default: "1 2"]
--ProfilesMerger-merge-filter=PROFILESMERGER_MERGE_FILTER
Filter class name. [default:
"ProfilesDuplicatesFilter"]
--ProfilesMerger-merge-filter-file=PROFILESMERGER_MERGE_FILTER_FILE
Filtered outputs file. [default:
"merged_profiles.nc"]
--ProfilesMerger-merge-filter-sort=PROFILESMERGER_MERGE_FILTER_SORT
Sort filtered (currently 'time' or None). [default:
"time"]
--ProfilesMerger-merge-reject-file=PROFILESMERGER_MERGE_REJECT_FILE
Rejected outputs file. [default:
"duplicated_profiles.nc"]
--ProfilesMerger-merge-reject-sort=PROFILESMERGER_MERGE_REJECT_SORT
Sort filtered (currently 'time' or None). [default:
"time"]
1.6.3.2.4. Format des sorties:¶
Les sorties sont au format NetCDF.
Pour chaque profil, la variable filename donne le nom de fichier d’origine du profil et la dimension profile donne l’indice du profil dans ce fichier d’origine.
La structure des fichiers générés suit celle de l’exemple suivant:
netcdf merged_profiles {
dimensions:
profile = 826 ;
filename_string = 18 ;
platform_code_string = 4 ;
level = 511 ;
variables:
int profile(profile) ;
profile:description = "Index of profile in original file" ;
double time(profile) ;
time:long_name = "Time" ;
time:standard_name = "time" ;
time:units = "seconds since 1900-01-01 00:00:00" ;
time:missing_value = 1.e+20 ;
time:axis = "T" ;
int filename_string(filename_string) ;
char filename(profile, filename_string) ;
filename:missing_value = "N/A" ;
filename:description = "File name of the original file" ;
double latitude(profile) ;
latitude:standard_name = "latitude" ;
latitude:long_name = "Latitude" ;
latitude:valid_min = -90. ;
latitude:units = "degree_north" ;
latitude:missing_value = 1.e+20 ;
latitude:valid_max = 90. ;
latitude:axis = "Y" ;
double longitude(profile) ;
longitude:standard_name = "longitude" ;
longitude:long_name = "Longitude" ;
longitude:valid_min = -180. ;
longitude:units = "degree_east" ;
longitude:missing_value = 1.e+20 ;
longitude:valid_max = 180. ;
longitude:axis = "X" ;
int platform_code_string(platform_code_string) ;
char platform_code(profile, platform_code_string) ;
platform_code:missing_value = "N/A" ;
int level(level) ;
level:long_name = "Level" ;
level:standard_name = "level" ;
level:axis = "Z" ;
double depth(profile, level) ;
depth:standard_name = "depth" ;
depth:long_name = "Depth" ;
depth:valid_min = -4453.39918618524 ;
depth:positive = "down" ;
depth:units = "m" ;
depth:missing_value = 1.e+20 ;
depth:valid_max = 0. ;
depth:axis = "Z" ;
double temperature(profile, level) ;
temperature:long_name = "sea water temperature" ;
temperature:standard_name = "sea_water_temperature" ;
temperature:units = "degree_Celsius" ;
temperature:missing_value = 1.e+20 ;
double salinity(profile, level) ;
salinity:long_name = "sea water salinity" ;
salinity:standard_name = "sea_water_salinity" ;
salinity:units = "PSU" ;
salinity:missing_value = 1.e+20 ;
// global attributes:
:Conventions = "CF-1.0" ;
:software_version = "merge_profiles.py 2012-11-22" ;
:creation_date = "2012-12-07T17:33:56Z" ;
:history = "2012-12-07T17:33:56Z : Creation" ;
:title = "Profiles" ;
:southernmost_latitude = 43. ;
:northernmost_latitude = 50. ;
:westernmost_longitude = -15. ;
:easternmost_longitude = -1. ;
1.6.3.2.5. Exemple¶
Les profils actuels sont:
1.6.3.2.5.1. Emprise manche-gascogne¶
La racine de ces données se trouve ici:
/home11/caparmor/mars/VALID/DATA/MANGA
Description | Localisation |
---|---|
Profils BATHY provenant du GTS | HYDRO_CORIOLIS/MANGA_CORIOLIS_PR_BA |
Profils CTD | HYDRO_CORIOLIS/MANGA_CORIOLIS_PR_CT |
Profils flotteurs Argo | HYDRO_CORIOLIS/MANGA_CORIOLIS_PR_PF |
Recopesca | HYDRO_CORIOLIS/MANGA_CORIOLIS_PR_RE |
Profils TESAC provenant du GTS | HYDRO_CORIOLIS/MANGA_CORIOLIS_PR_TE |
Profils XBT ou XCTD | HYDRO_CORIOLIS/MANGA_CORIOLIS_PR_XB |
Profils possiblement en double avec les données SISMER | HYDRO_CORIOLIS_DOUBLES_POTENTIELS |
Profils Bouteilles | HYDRO_SISMER/MANGA_SISMER_PR_BO.nc |
Profils CTD | HYDRO_SISMER/MANGA_SISMER_PR_CT.nc HYDRO_SISMER/MANGA_SISMER_PR_CT_DEPTH.nc |
Profils XBT | HYDRO_SISMER/MANGA_SISMER_PR_XB.nc |
1.6.3.2.5.2. Emprise méditéranée nord occidentale¶
La racine de ces données se trouve ici:
/home11/caparmor/mars/VALID/DATA/MANGA
Description | Localisation |
---|---|
Profils BATHY provenant du GTS | HYDRO_CORIOLIS/MENOR_CORIOLIS_PR_BA |
Profils CTD | HYDRO_CORIOLIS/MENOR_CORIOLIS_PR_CT |
Profils flotteurs Argo | HYDRO_CORIOLIS/MENOR_CORIOLIS_PR_PF |
Profils TESAC provenant du GTS | HYDRO_CORIOLIS/MENOR_CORIOLIS_PR_TE |
Profils XBT ou XCTD | HYDRO_CORIOLIS/MENOR_CORIOLIS_PR_XB |
Profils possiblement en double avec les données SISMER | HYDRO_CORIOLIS_DOUBLES_POTENTIELS |
Profils Bouteilles | HYDRO_SISMER/MENOR_SISMER_PR_BO.nc |
Profils CTD | HYDRO_SISMER/MENOR_SISMER_PR_CT.nc |