Ada : documentation IDL

Présentation

IDL Interactive Data Language est un environnement de programmation pour la visualisation scientifique. En quelques instructions avec une syntaxe proche du Fortran il permet la réalisation d'applications graphiques. IDL est disponible sur rlabxxx@ada336.

Les principales fonctionnalités sont :

  • Langage de programmation structuré.
  • Fonctions mathématiques et statistiques.
  • Tracé 2D,3D.
  • Représentation de surfaces et contours.
  • Représentation cartographiques.
  • Fonction de traitement d'image.
  • Création et visualisation de séquences animées.
  • Visualisation de volume.
  • Lecture/écriture de nombreux formats graphiques.
  • Création de widget.

IDL est disponible sur de multiples systemes : UNIX,PC,MAC.

Programmer avec IDL

IDL est un langage simple et puissant, il offre :

  • Un appel de programmes C ou Fortran.
  • Une exécution interactive.
  • Une structure de données pour la manipulation de scalaire et de tableaux.
  • Des opérateurs, procédures et fonctions peuvent manipuler directement scalaires, vecteurs et tableaux.
  • Une définition de fonctions et procédures.
  • Une aide hypertext en ligne.
  • Des types de données multiples :bytes, entier,réel,complexe,chaîne de caractères.

Exemple de session IDL

Voici un exemple de session IDL, l'explication est précédée de ; qui indique un commentaire en IDL.

$ idl
IDL> ?				; appel du help en ligne

Pour sortir d'IDL il suffit de taper exit ou Ctrl-D. La sortie du help s'obtient avec la commande :

$ idlhelp -command shutdown

Cette présentation et les exemples qui suivent ne constituent qu'une brève introduction, on pourra se référer au help qui contient un grand nombre d'informations sur les fonctions, les opérateurs accessibles en mode hypertext.

IDL>A=[1,2,3,4]          ;création d'un tableau
IDL>print,a              ;impression du tableau a
IDL>b=sqrt(a)            ;sqrt s'applique au tableau a
IDL>help,a,b             ;affichage du type de a et b
IDL>a=fltarr(100)        ;a=tableau de 100 élements
IDL>for i=0,99 do a(i)=i ;initialisation de a
IDL>print,a(10:19);impression de a(10) à a(19)

IDL>b=sin(a)/exp(a/50)   ;création du tabeau b
IDL>plot,b               ;tracé du tableau b

Dans l'exemple suivant, on crée un tableau a de 50 éléments avec la procédure findgen qui affecte à chaque élément la valeur de son indice en réel. Le tableau z sera représenté en mode surface.

Tracé 2D

Création des données

Création d'un tableau T de 100 valeurs, findgen renvoie un tableau avec pour chaque élément du tableau t la valeur réelle de son indice t(1)=1,t(2)=2… Le caractère ^ représente l'opérateur élévation à la puissance.

Pour connaître le type de t après affectation, il suffit d'utiliser la fonction help. IDL accepte les majuscules ou minuscules.

t=sin((findgen(100)/35)^2.5)
help,t
T               FLOAT     = Array(100)
plot,t

Création d'un tableau T1 à partir de T par génération de bruit par la fonction randomu qui fournit des nombres aléatoires entre 0 et 1.

t1=t+((randomu(s,100)-0.5)/2)

Lissage des données

t2=smooth(t1,5)

Tracé

Tracé du tableau T avec des libellés sur les axes.

plot ,t,xtitle=''Axe X'',ytitle=''Axe Y''

Tracés multiples

La variable !P.multi permet de définir le nombre et l'emplacement des tracés sur une page, ici, on utilise un carré 2×2.

!P.multi=[0,2,2]
plot,t
plot,t1
plot,t2

Représentation de surface et contours

Création des données

Création d'un tableau z(40,40) où chaque élément contient une valeur égale à la distance euclidienne par rapport aux côtés du tableau puis, décalage de l'origine au centre du tableau, enfin calcul d'une distribution gaussienne.

z=shift(dist(40),20,20)
z=exp(-(z/10)^2)

Tracé d'une surface

Représentation en mode “fil de fer” de z

surface,z

Représentation en mode surface,aprés chargement d'une table de couleur prédéfinie numéro 3 et rotation de la surface autour de X de 45 degrés et 20 degrés autour de Z.

loadct,3
shade_surf,z,ax=45,az=20

Il est également possible de superposer plusieurs tracés grâce au paramètre /noerase qui permet la superposition du mode fil de fer sur le mode surface.

shade_surf,z
surface ,z,/noerase

Tracé de contours

Représentation de z par des contours, ici 8 et en mode surface(paramètre /fill), on réalise la superposition de contours “fil de fer” sur la surface par le paramètre /overplot.

contour,z,nlevels=8,/fill
contour,z,nlevels=8,/overplot

Tracé de surfaces et contours

La procédure show3 permet de faire un tracé superposé de surfaces et contours.

show3,z

Représentation cartographique

Projection orthographique

IDL fournit avec la procédure map_set un certain nombre de projections cartographiques (azimuthale, conique, orthographique…) ,des options de présentation, le choix de l'origine du point de vue, l'orientation, les limites de la zone à représenter.

map_set,/orthographic,/grid,/continent,/label

Tracé avec choix du point de vue

Il est possible de choisir le point de vue de la projection (latitude,longitude et rotation), l'exemple suivant est une projection orthographique avec un point de vue ayant une latitude=39 degrés, une longitude=30 et une orientation=20.

map_set,39,-30,20,/ortho,/isotropic,/grid,/cont,/label

Tracé avec choix des limites

Il est possible de limiter la zone à représenter grâce au paramètre limit qui définit les limites minimum et maximum en latitude et longitude.

map_set,/mercator,/continent,limit=[010,50,60,-60]

Lecture de la latitude et longitude pointée par le curseur

Si une projection est affichée,IDL peut retouner les coordonnées X et Y représentant la longitude et la latitude pointées par le curseur, le caractère & permet de séparer plusieurs instructions sur une même ligne.

cursor,lon,lat&print,lat,lon

Traitement d'image

Affichage d'une image

Lecture et affichage d'une image 512×512 dans une fenêtre 400×400 . La procédure tvscl affiche l'image avec la totalité de la table des couleurs disponibles alors que le procédure tv réalise un affichage simple de l'image.

openr,1,'~/image/lena';ouverture du fichier
image=bytarr(512,512)  ;création d'un tableau
readu, 1, image
window,0,xsize=400,ysize=400
tv,image
tvscl,image

Amélioration du contraste

Les opérateurs EQ, NE, GE, GT, LE et LT peuvent être utilisés pour modifier le contraste de l'image. Dans l'exemple suivant on affiche les pixels de l'image ayant une valeur > 110, puis on réalise une égalisation d'histogramme.

tvscl,image GT 110
tv,hist_equal(image)

Filtrage

La fonction smooth permet un lissage en prenant la moyenne des pixels adjacents, on utilise smooth avec un carré 7×7.

tvscl,smooth(image,7)

Sélection d'une partie de l'image

On peut définir la partie d'image à sélectionner à partir des indices du tableau contenant l'image.

erase
image1=image(200:400,200:400);
tv,image1

Rotation

i=rotate(image,1)					;rotation de
90 degrés

Traitement divers

Extraction des valeurs des pixels d'une ligne ou d'une colonne de l'image sélectionnée par le curseur.

profiles,image

Séquences animées

Affichage d'une suite d'images

IDL offre la possibilité de visualiser des séquences animées qui sont stockées sous forme de tableau 3D. Dans l'exemple suivant, on lit un fichier abnorm.dat comprenant 16 images 64×64. On affiche la première image puis après multiplication par 4 de la taille, la totalité de la séquence animée.

openr,1,filepath(`abnorm.dat',subdir=[`example
s','data'])
h=bytarr(64,64,16)
readu,1,h
close,1
loadct,3
erase
tv,h(*,*,h)           ;afficher la 1ere image
h=rebin(h,256,256,16) ;multiplication par 4
tv,h(*,*,0)
movie,h,order=0       ;séquence animée

Animation en mode filaire

La même série d'images peut être visulisée en mode fil de fer. On crée un tableau S comprenant la séquence avec une résolution réduite 32x32x16 qui sera affichée pas à pas sur l'écran puis relue directement á l'écran par la fonction tvrd dans un tableau frames. Le tableau frames 300x300x16 correspond aux dimensions de l'image affichée par la commande window.

s=rebin(h,32,32,16)
surface,s(*,*,0)           ;affichage de la 1ere image
frames=bytarr(300,300,16)  ;création du
tableau frames
window,1,title='Animation',xsize=300,ysize=300
for i=0,15 do begin
surface,s(*,*,i),zrange=[0,250]$
& frames(0,0,i)=tvrd() &end
movie,frames,order=0       ;visualisation de l'animation

Le caractère $ est le caractère de continuation et le caractère & indique les présence de plusieurs commande sur la même ligne.

Animation avec XINTERANIMATE

Xinteranimate est un widget IDL qui permet des animations. On sauvegarde le tableau s et on l'affiche en mode fil de fer avec la procédure surface

a=s(*,*,0)
surface,a,xstyle=4,ystyle=4,zstyle=4

On réalise ensuite une animation par rotation de la figure avec la fonction scale3 ,le paramètre az défini l'angle de rotation autour de z. L'utilisation de xinteranimate se fait en 3 appels, le premier initialise la séquence d'animation de 40 images 300×300,le second enregistre la séquence à l'aide d'une boucle, enfin le dernier visualise l'animation.

scale3,xrange=[0,31],yrange=[0,31],zrange=[0,250]
xinteranimate,set=[300,300,40]
for  i=0,39 do begin scale3,az=-i*9 &
surface,a,/t3d,$
xst=4,yst=4,zst=4 &
xinteranimate,frame=i,win=1 &end
xinteranimate

Lecture/écriture

Ecriture de données

Création d'un tableau data 3×4 et impression.

data=findgen(4,3)
print,data

Valeurs obtenues

0.00000      1.00000      2.00000      3.00000
4.00000      5.00000      6.00000      7.00000
8.00000      9.00000      10.0000      11.000

Ecriture de fichier

L'écriture de données formatées dans un fichier nécessite l'ouverture de fichier avec l'assignation d'un numéro d'unité logique.

openw,1,'mon_fichier' ;ouverture
dufichiermon_fichier
printf,1,data ;écriture sur l'unité 1
close,1       ; fermeture

Lecture de fichier

On obtient

.00000      1.00000      2.00000      3.00000
4.00000      5.00000      6.00000      7.00000
8.00000      9.00000      10.0000      11.0000

Format de fichier

IDL dispose de fonctions pour lire/écrire différents formats graphiques (GIF,TIFF,XWD,JPEG,etc …) ansi que des formats scientifiques (HDF,CDF, netCDF).

Tracé de données irrégulières

Création de données irrégulières

On crée un ensemble de 32 valeurs irrégulières par la procédure randomu qui seront tracés sous forme de points par plots.

n=32
seed=1            ;seed représente la racine
pour la x=randomu(seed,n) ;génération des valeurs aléatoires
y=randomu(seed,n)
z=exp(-3*((x-0.5)^2+(Y-0.5)^2))
plot,x,y,psym=1

Triangulation

La procédure triangulate construit une triangulation de Delaunay à partir des points précédents. Le résultat de la triangulation 3×54 éléments est stocké dans la variable tr.

triangulate, x,y,tr
for i=0,n_elements(tr)/3-1 do begin &$
t=[tr(*,i),tr(0,i)] &$
plots,x(t),y(t) &endfor

Création d'une grille regulière

La procédure trigrid permet d'obtenir une grille régulière à partir de la triangulation tr et des valeurs Z interpolées.

Tracé simple de la grille régulière avec la procédure surface.

surface,trigrid(x,y,z,tr)

Tracé avec lissage

surface,trigrid(x,y,z,tr,/smooth)

Visualisation de volumes

IDL permet la visualisation de volumes, d'isosurface ainsi que des coupes avec le widget slicer.,

Visualisation élémentaire

Dans l'exemple suivant, on crée un tableau 3D (20x20x20) avec pour valeur de chaque point la distance au centre du volume (10,10,10). A partir de ce volume, shade_volume crée une liste de verticales et de polygones qui définissent une isosurface avec une densité de 8 stockée dans v et p. Scale3 effectue les transformations 3D et définit les valeurs minimum et maximum des axes. Enfin polyshade réalise la visualisation à partir de v et p. L'argument /t3d indique à polyshade qu'il faut utiliser la transformation 3D précédemment définie.

sphere=fltarr(20,20,20)
for x=0,19 do begin for y=0,19 do begin $E
for z=0,19 do sphere(x,y,z)= $
sqrt((x-10)^2+(y-10)^2+(z-10)^2)
shade_volume,sphere,8,v,p
scale3,xrange=[0,20],yrange=[0,20],zrange=[0,20]
window,0,xsize=600,ysize=600
tv,polyshade(v,p,/t3d)

Visualisation d'une isosurface

On applique au volume sphère une transformation trigonométrique. Dans l'exemple suivant on visualise l'isosurface définie à la valeur 0.6, en modifiant cette valeur, on peut ainsi voir différents niveaux.

s=cos(sin(sphere))
shade_volume,s,0.6,v,p
tv,polyshade(v,p,/t3d)

Visualisation avec le widget slicer

Le widget slicer permet le tracé d'isosurface et de réaliser des coupes dans une représentation volumique. La communication des données au slicer se fait par un bloc common volume_data.

common volume_data,a
a=s
slicer

Tracé d'isosurface avec le slicer

Tracé de coupes avec le slicer

Widget

IDL fournit des widgets qui peuvent être utilisés ou crées dans des applications graphiques.

Utilisation de widget prédéfini

xloadct est un widget qui permet de choisir la table des couleurs d'affichage.

tvscl,dist(512)   ;affichage d'une image
xloadct

z=dist(40)
xsurface,z        ;widget de tracé de surface

Création de widget

On peut créer des widgets avec quelques instructions,comme dans l'exemple suivant :

xmenu,sindgen(10),base=base,buttons=b
widget_control,base,/realize
event = widget_event(base)
print, `Bouton numero : `, where(B eq
event.id)
widget_control, base, /destroy

Un générateur de widget : wided

IDL dispose également d'un générateur de widget wided.

Quelques commandes utiles

HELP

L'appel du help se fait par ?,on peut également demander des informations sur une variable par :

help,variable

Communication entre IDL et UNIX

Les commandes UNIX sont accessibles sous IDL en les faisant précéder de $.

$pwd
$ ls

Il est possible de suspendre temporairement une session IDL par spawn pour aller sous UNIX,on peut ensuite revenir dans la session IDL en tapant sous UNIX exit.

Sauvegarde/restauration de session IDL

Les procédures save et restore permettent de sauvegarder la session IDL en cours pour la reprendre ultérieurement.

save,filename='mon_fichier',/variables
restore,mon_fichier

Un fichier idlsave.dat est crée en l'absence de nom de fichier.

Journal

La commande journal permet d'enregistrer toute les commandes passées lors d'une session IDL.

journal,'mon_journal'

Un fichier idlsave.pro est crée en l'absence de nom de fichier. Pour terminer l'enregistrement du journal il suffit de retaper la commande journal.On peut réutiliser les commandes sauvegardées au sein d'une session IDL en faisant précéder le fichier sauvegardé par @ .

@mon_journal

Soumission batch

On peut soumettre un programme IDL en batch via la commande llsubmit job1. Il suffit de positionner l'environnement IDL et la fenêtre d'affichage si nécessaire.

Voici le script de soumission job1 :

job1.ll
# Temps Elapsed max. d'une requete hh:mm:ss (1h30mn ici)
# @ wall_clock_limit = 1:30:00
# Nom du travail LoadLeveler
# @ job_name   = job_idl
# Fichier de sortie standard du travail
# @ output     = $(job_name).$(jobid)
# Fichier de sortie d'erreur du travail
# @ error      =  $(job_name).$(jobid)
# pour recevoir un mail en cas de depassement du temps Elapsed (ou autre pb.)
# @ notification = error
# @ queue
 
module load idl
 
export DISPLAY=ma.station.fr:0
 
cat > file << 'EOF'
z=shift(dist(40),20,20)
z=exp(-(z/10)^2)
surface,z
surface,z,ax=70,az=25
loadct,3
shade_surf,z
contour,z,nlevels=8,/follow
EOF
idl < file

On peut également utiliser un programme IDL existant ainsi qu'ouvrir une XTERM si besoin.

Voici le script de soumission job2 :

job2.ll
# Temps Elapsed max. d'une requete hh:mm:ss (1h30mn ici)
# @ wall_clock_limit = 1:30:00
# Nom du travail LoadLeveler
# @ job_name   = job_idl
# Fichier de sortie standard du travail
# @ output     = $(job_name).$(jobid)
# Fichier de sortie d'erreur du travail
# @ error      =  $(job_name).$(jobid)
# pour recevoir un mail en cas de depassement du temps Elapsed (ou autre pb.)
# @ notification = error
# @ queue
 
module load idl
 
export DISPLAY=ma.station.fr:0  
 
cat > file << 'EOF'
.r /home/rech/lab/rab001/idl/surf1.pro
surf1
EOF
xterm