FERRET


Ferret est un outil de visualisation et d'analyse de données très utilisé par les océanographes et les météorologues.

Il fonctionne par lignes de commandes ou par scripts (enchaînement de commandes) sans interface graphique. Il a été développé dans le cadre d’un projet porté par le laboratoire PMEL (Pacific Marine Environnemental Laboratory) de la NOAA



FERRET

Ferret : ses usages

Ferret est un outil ouvert (open source) qui permet notamment :

  • d'analyser des ensembles de données volumineux et complexes ou des sorties de modèles océaniques numériques et les comparer avec des données d'observation en grille.
  • d'accéder à des sources de données Internet distantes en utilisant OPeNDAP,
  • de manipuler ces données avec de des capacités de calcul et de création de graphiques avancées. Il peut “facilement” manipuler des jeux de données de plusieurs gigaoctets avec des variables multidimensionnelles mixtes définies sur des grilles échelonnées

Ferret s'exécute sur des systèmes Unix et Mac récents & Windows en utilisant le “Windows Subsystem for Linux”.

PyFerret, introduit en 2012, est un module Python qui englobe (rétro compatible) et améliore Ferret dans ses capacités d’analyse et de connexion avec Python. Ferret est largement utilisé dans la communauté océanographique en raison de ses fonctionnalités.

Ferret : Installation

Il existe deux versions principales de l'outil Ferret.

  • Une version en C ferret_c et
  • une version en Python pyferret plus récente qui encapsule la version en C et permet plus d'interactions avec l'écosystème Python.

Version en C : ferret_c

Dans le cadre de nos exercices, nous allons utiliser la version en C de ferret que l'on peut installer facilement sur une machine Linux Ubuntu ou Debian via la commande apt-get install. Cette installation donne accès à la version C de ferret : ferret_c

sudo apt-get install ferret-vis ferret-datasets

On trouvera ensuite un fichier d'initialisation des variables d'environnement sous /usr/share/ferret-vis/bin/ferret_paths_bash_template. Il faudra modifier ce contenu pour adapter les variables à votre environnement. Un exemple de contenu adapté sur la machine de manipulation installée en Ubuntu 22.04 qu'il faut "sourcer" manuellement

$ source ~/tp/ferret/ferret_paths_bash_template

ou inclure dans son fichier .bashrc par exemple avant toute manipulation.

export FER_DIR=/usr/lib/ferret-vis
export FER_SHA=/usr/share/ferret-vis
export FER_DSETS="$FER_DIR/fer_dsets"
export PATH="$PATH:$FER_DIR/bin"
export FER_EXTERNAL_FUNCTIONS="$FER_DIR/external_functions"
export FER_GO=". $FER_DIR/go $FER_DIR/examples $FER_DIR/contrib"
export FER_DATA=". $FER_DSETS/data $FER_DIR/go $FER_DIR/examples $FER_DIR/contrib /data/ncep"
export FER_DESCR=". $FER_DSETS/descr"
export FER_GRIDS=". $FER_DSETS/grids"
export PLOTFONTS="$FER_SHA/ppl/fonts"
export FER_FONTS="$FER_SHA/ppl/fonts"
export SPECTRA="$FER_SHA/ppl"         # for old ferret versions
export FER_PALETTE=". $FER_SHA/ppl/palettes"   # palette search list

Version Python : pyferret

Cependant, aujourd'hui, ferret est surtout utilisé à travers sa version pyferret et s'installe via l'environnement "anaconda". Un exemple d'installation via Anaconda3 début 2024 :

    * bash Anaconda3-2024.02-1-Linux-x86_64.sh, 
    * conda create -n FERRETPY39 -c conda-forge pyferret ferret_datasets python=3.9 --yes / (Bug en cours sur Python > 3.9 : https://github.com/conda-forge/pyferret-feedstock/issues/94)
    * alias mypyferret='conda activate FERRET && pyferret'

De nombreux problèmes sont liés à des variables d'environnement mal positionnées. Par ailleurs, la version C est moins suivie que celle en Python et certains bugs peuvent exister dans la version en C et pas sur celle en Python. Pour les manipulations proposés ici, il n'y a normalement pas de soucis particuliers quelque soit la version utilisé. cependant, gardez à l'esprit que Ferret n'est pas sans bugs :-) et il est aussi puissant que complexe...:-)

TP : Un peu de manipulation de Ferret sur des séries temporelles

Ce que nous allons découvir ici est en règle générale valable également pour les visualisation plus complexes (SHADE et VECTOR). Tout ce qui touche aux fenêtres, aux options des graphes, la syntaxe générale est identique. On verra dans une deuxième partie moins approfondie comment visualiser des données spatialisés, mais gardez à l'esprit que la plupart des informations de cette partie sont transposables ou réutilisables. Nous ne verrons pas tout ici, l'idée est de ne plus avoir peur du prompt de Ferret yes?.

**ATTENTION** : Ferret ne distingue pas la casse des caractères et les commandes sont du type *COMMANDE/option1/…/optionN nomVariable*

* # Mettre les variables nécessaires à Ferret : 
* cd tp/ferret
* source ferret_paths_bash_template
  • Lancer ferret : ferret_c
ferret_c
    NOAA/PMEL TMAP
    FERRET v7.6 (optimized)
    Linux 4.15.0-162-generic - 11/23/21
    11-Mar-24 15:37     

yes? 
  • Pour charger un fichier NetCDF et son contenu : use file.nc

    • use PortCros_Data_2024-01.nc
  • Pour supprimer un jeu de données,

    • cancel data_set i avec i=numéro du data_set*
    • cancel data/all supprime tout les jeux de données chargés dans ferret
  • Pour lancer des commandes bash, quand on est déjà sous le prompt ferret yes? (interaction entre ferret_c et linux)

    • spawn "ls -l"
    • spawn date

On peut charger plusieurs fichiers en même temps; Chaque fichier est identifié par un "data set" numéroté de 1 à N; on accèdera aux variables de chaque dataset avec l'option [d=numéro du dataset]

  • Pour prendre connaissance des variables qui sont présentes dans le fichier importé : show data ou sh d pour les intimes)
  • show grid var permet de donner plus d'informations sur une variable particulière.

Exemple :

yes? use PortCros_Data_2024-02.nc
           *** NOTE: Ignoring non-DSG FeatureType: TimeSeries ;
yes? use Giens_Data_2024-02.nc
           *** NOTE: Ignoring non-DSG FeatureType: TimeSeries ;
yes? sh d

     currently SET data sets:
    1> ./PortCros_Data_2024-01.nc
 name     title                             I         J         K         L
 AIRTEMP  Air Temperature                  ...       ...       ...       1:18930
 QC_AIRTEMP
          Air Temperature Quality Control  ...       ...       ...       1:18930
 WATERTEMP
          Water Temperature - SST          ...       ...       ...       1:18930
 QC_WATERTEMP
          Water Temperature Quality Contr  ...       ...       ...       1:18930
 AIRPRESSURE
          Air Pressure                     ...       ...       ...       1:18930
 QC_AIRPRESSURE
          Air Pressure Quality Control Fl  ...       ...       ...       1:18930
 SEAWATERPRESSURE
          1m Water Pressure                ...       ...       ...       1:18930
 QC_SEAWATERPRESSURE
          1m Water Pressure Quality Contr  ...       ...       ...       1:18930

    2> ./PortCros_Data_2024-02.nc  (default)
 name     title                             I         J         K         L
 AIRTEMP  Air Temperature                  ...       ...       ...       1:16528
 QC_AIRTEMP
          Air Temperature Quality Control  ...       ...       ...       1:16528
 WATERTEMP
          Water Temperature - SST          ...       ...       ...       1:16528
 QC_WATERTEMP
          Water Temperature Quality Contr  ...       ...       ...       1:16528
 AIRPRESSURE
          Air Pressure                     ...       ...       ...       1:16528
 QC_AIRPRESSURE
          Air Pressure Quality Control Fl  ...       ...       ...       1:16528
 SEAWATERPRESSURE
          1m Water Pressure                ...       ...       ...       1:16528
 QC_SEAWATERPRESSURE
          1m Water Pressure Quality Contr  ...       ...       ...       1:16528


yes? show grid AIRTEMP[d=1]
    GRID GMW1
 name       axis              # pts   start                end                 subset
 normal    X
 normal    Y
 normal    Z
 TIME      TIME             18930 i   01-JAN-2024 00:01    31-JAN-2024 23:59   full

yes? show grid AIRTEMP[d=2]
    GRID GOR1
 name       axis              # pts   start                end                 subset
 normal    X
 normal    Y
 normal    Z
 TIME1     TIME             16528 i   01-FEB-2024 00:01    29-FEB-2024 23:59   full


Dans cet exemple, I,J,K représentent les dimensions de grille et L la dimension temporelle.

Ferret distingue les informations spatiales (X,Y et Z qui sont en fait des informations latitude, longitude et altitude ou profondeur, d'une vision sous forme de grille régulière qui est sous la forme I,J,K (en général c'est ce qu'on retrouve dans les sorties des modèles).

Attention, car la conversion de l'un à l'autre dépend du repère utilisé. Si rien n'est indiqué, on a une information grillé et I,J,K et X,Y,Z sont identiques. Sinon, il y a des conversions qui seront faites.

show grid permet de visualiser une variable plus spécifique et nous voyons ici par exemple que nous avons affaire à de simples séries temporelles sans aucune information géographique.

  • On peut définir la référence de la fenêtre d'affichage du graphique que l'on va réaliser : set window ID
  • Pour faire une visualisation toute simple en 1D, on utilise la commande plot nom_variable

  • Pour fermer la fenêtre graphique, il FAUT faire, cancel window ID et NE PAS CLIQUER SUR LA CROIX de la fenêtre...

set window 1
plot airtemp[d=2]

  • On peut tracer plusieurs variables en même temps. Lorsqu'on ne précise pas le dataset, il utilise le "default", c'est à dire le dernir chargé :
plot airtemp,watertemp

  • On peut définir des zones dans la fenêtre de visualisation avec la commande set viewport.
yes? set viewport upper
yes? plot airtemp[d=1]
yes? set viewport lower
yes? plot airtemp[d=2]

cancel viewport : Permet d'annuler l'organisation de la fenetre mise en place

  • On peut définir 4 zones dans la fenêtre de visualisation avec la commande set viewport.
set viewport ul # upper left
plot airtemp[d=1]
set viewport ur # upper right
plot airtemp[d=2]
set viewport ll # lower left
plot airpressure[d=1]
set viewport lr # lower right
plot airpressure[d=2]
! cancel viewport ! Permet d'annuler l'organisation de la fenetre mise en place

  • On peut également effectuer des opérations mathématiques simples (ou plus complexes) ; Par exemple, visualiser la hauteur d'eau en faisant la soustraction entre la pression dans l'eau et dans l'air (normalement, il faut aussi tenir compte de la salinité pour cette opération) :
cancel window 1
set window 1
plot seawaterpressure[d=1]-airpressure[d=1]


  • On peut aussi appeler une commande linux depuis Ferret : spawn (sp en raccourci) ; exemple : sp ncdump -h PortCros_Data_2024 vous permettra de visualiser le header de ce fichier NetCDF grace à la commande ncdump.
  • On peut aussi assez facilement aggréger des contenus qui se suivent temporellement pour en faire une série unique. Cette concaténation se passe sur les fichiers sources (liste ici obtenue avec la commande spawn) et fabrique un dataset supplémentaire nommé ici listAgg :
let file_list = SPAWN("ls -1 ./Giens*.nc")
TSERIES listAgg = file_list
sh d

    3> listAgg  (default)
 name     title                             I         J         K         L
 AIRTEMP  Air Temperature                  ...       ...       ...       1:29318
 QC_AIRTEMP
          Air Temperature Quality Control  ...       ...       ...       1:29318
 WATERTEMP
          Water Temperature - SST          ...       ...       ...       1:29318
 QC_WATERTEMP
          Water Temperature Quality Contr  ...       ...       ...       1:29318
 AIRPRESSURE
          Air Pressure                     ...       ...       ...       1:29318
 QC_AIRPRESSURE
          Air Pressure Quality Control Fl  ...       ...       ...       1:29318
 SEAWATERPRESSURE
          1m Water Pressure                ...       ...       ...       1:29318
 QC_SEAWATERPRESSURE
          1m Water Pressure Quality Contr  ...       ...       ...       1:29318

plot airtemp[d=3] ! Trace le résultat de la concaténation

cancel data/all
sh d
     currently SET data sets:

Quelques commandes utiles complémentaires pour travailler sur les données et les tracés; La plupart du temps, ces options restent actives jusqu'à leur modification ou leur annulation.

  • set region/L=1:1000 ! Limite l'espace temporel de 1 à 1000 ;
  • cancel region! permet de revenir à l'ensemble complet des données


  • Quelques options de tracé :
    • plot/thick=2 ! 3 options possibles, (1,2,3) et permet de tracer en gras
    • plot/dash ! utilise des tirets pour le tracé
    • plot/symbol=dot ! trace des points
    • plot/color=green ! Affiche en vert (autres couleurs disponibles Black, Red, Green, Blue, LightBlue, Purple, and White :-)
    • hlimits=min:max:pas ou vlimits=min:max:pas permettent de spécifier les limites des axes horizontaux et verticaux
    • plot/vs watertemp,airtemp ! permet d'afficher la température de l'eau en fonction de celle de l'air
    • plot/vs/nolabel watertemp,airtemp ! la même chose en supprimant tout les titres et labels
    • plot/vs/title="Mon titre" watertemp,airtemp ! Rajoute le titre "Mon titre" --> ACCENTS INTERDITS ; Si nolabel est indiqué, le titre n'apparaît pas.

un peu de 2D

Dans le répertoire tp/ferret, on trouvera deux fichiers sst.mon.ltm.1981-2010.nc et sst.mon.ltm.1991-2020.nc. Ces fichiers proviennent du site de la NOAA et sont issus du programme de surveillance de la température de surface de la mer (SST). Ces données sont des données mensuelles sur plueirus années et peuvent se visualiser facilement avec Ferret.

La commande de visualisation pour ce type d'images est SHADE (CONTOUR oproduira un graphe avec contour, et FILL remplira les contours). On peut ainsi rapidement visualiser le contenu de ce fichier. Il faudra soit fixer une variable temporelle, soit créer une boucle de visualisation qui va parcourir les différents steps temporels :

yes ? ! Cas simple
yes ? use sst.mon.ltm.1981-2010.nc 
yes ? sh d
    1> ./sst.mon.ltm.1981-2010.nc  (default)
 name     title                             I         J         K         L
 CLIMATOLOGY_BOUNDS
          Climate Time Boundaries          1:2       ...       ...       1:12
 SST      Long Term Mean Monthly Means of  1:360     1:180     ...       1:12
 VALID_YR_COUNT
          count of non-missing values use  1:360     1:180     ...       1:12

yes ? shade/L=1 sst ! produit un remplissage sans les contours
yes? contour/over/L=1 sst ! produira un graphe en contour
yes? fill/L=1 sst ! produira un graphe en contour et rempli

! cas avec boucle
use sst.mon.ltm.1981-2010.nc 
repeat/l=1:12/loop=2 shade sst
! Affiche les images pour L allant de 1 à 12, et repete 2 fois la séquence.

Ferret et les scripts

Un des intérêt de Ferret est sa capacité à exécuter des scripts au format .jnl que l'on appelle des fichiers GO.

  • Le commentaire est le signe point d'exclamation : !

Un exemple de script GO : mettre le contenu suivant dans un fichier monJNL.jnl

Tout ce que vous tapez dans ferret est disponible dans le répertoire local dans un fichier ferret.jnl qui est sauvegardé à chaque nouvelle exécution dans un ferret.jnl.~x~ x étant une valeur numérique.

Le 1 est le plus ancien fichier sauvegardé. Vous pouvez retrouver vos commandes dans ces fichiers et vous servir de ce fichier comme base à vos propres traitements.

Un exemple de script GO : mettre le contenu suivant dans un fichier monJNL.jnl

\CANCEL MODE VERIFY ! Supprime l'affichage des commandes du script pendant l'execution
cancel data/all ! Efface les autres jeux présents
use Giens_Data_2024-01.nc
use PortCros_Data_2024-01.nc
set viewport ul # upper left
plot airtemp[d=1],watertemp[d=1]
set viewport ur # upper right
plot airtemp[d=2],watertemp[d=2]
set viewport ll # upper left
plot airpressure[d=1]
set viewport lr # upper right
plot airpressure[d=2]
FRAME /FILE=GiensAllDataJanuary.gif
  • Lancer ferret_c
  • Puis, go monJNL.jnl et hop, vous avez un magnifique résultat en une seule commande :-)
  • La commande FRAME /FILE=GiensAllDataJanuary.gif permet de sauvegarder l'image générée de la fenêtre active dans un fichier au format .gif

  • quitter Ferret : quit, exit ou q

Conclusion et pour en savoir plus

  • Ce petit tour reste très largement non exhaustif mais vous a permis de voir que Ferret malgré son coté un peu austère reste accessible et utilisable pour traiter de manière rapide et efficace des données NetCDF et en tirer avec assez peu de programmation des graphes esthétiques et pertinents. C'est un outil parmi d'autres mais c'est aussi un incontournable pour manipuler le netCDF, très en vogue dans la communauté Océanographique. A vous de voir en fonction de vos besoins l'outil qui vous sera le plus adapté.

  • Pour tout connaître sur Ferret, le User's guide et toute la documentation

Licence de Ferret

FERRETLicense