Qu'est-ce qu'un script ?
1. Définition d'un script
Un script Tcl est un fichier texte contenant des lignes de commandes à exécuter. Par exemple, on peut effectuer un enchaînement de plusieurs fonctions sans intervenir manuellement:
for {set k 1} {$k<=10} {incr k} {
acq 20 2
saveima "image-$k"
}
Pour devenir un script Tcl, ce texte doit être écrit dans un fichier (édité avec Notepad, Wordpad, kwrite, etc.). Audela, et l'interface Audace en particulier, permettent de lire ce fichier et exécutent les commandes. L'exemple ci-dessus, exécuté par l'interface Audace, permet de réaliser l'acquisition de 10 images de 20 secondes de pose en binning 2x2. A la fin de chaque pose, l'image est sauvée sur le disque avec un numéro qui s'incrémente à chaque pose. La syntaxe exacte de ce script peut vous paraître obscure pour le moment. C'est normal. Cette page est destinée à éclaircir la situation. De toute façon, la plupart des scripts utiles pour observer, avec l'interface Audace, n'utilisent qu'un petit nombre de fonctions dont nous donnons ici une liste utile pour l'acquisition et le traitement des images :
- acq : acquisition d'une image (de la caméra 1) et affichage de l'image à la fin de la pose
- visu : visualisation de l'image en mémoire (dans le buffer 1)
- saveima : enregistre une image sur le disque en format FITS
- loadima : charge une image en mémoire à partir d'un fichier au format FITS
- sub : soustraction d'une image à celle qui est en mémoire (ex: correction du dark)
- opt : optimisation de la correction du dark à l'image qui est en mémoire (ex: correction optimale du dark)
- div : division de l'image en mémoire par une autre (ex: correction du flat)
- ngain : normalisation du gain d'une image par rapport à une autre (ex: synthèse du flat)
- noffset : normalisation du fond de ciel de l'image par rapport à une autre (ex: compositage médian)
- register : recalage d'une image par rapport à une autre (ex: registration avant compositage)
- add : addition d'une image à celle qui est en mémoire (ex: compositage d'images)
- smedian2 : pile médiane d'images (ex: compositage médian)
- for : effectue une boucle en incrémentant une variable
Noter que la plupart des fonctions de traitement d'images (sub, opt, etc.) peuvent être appliquées sur un lot d'images si on termine la fonction par le chiffre 2 (ex: sub2, opt2, etc.).
Revenons à nos scripts. Ils servent donc à simplifier les tâches d'observation, aussi bien pour l'acquisition des images que pour leur traitement. L'utilisation de scripts ne nécessite aucune connaissance en programmation. On peut donc utiliser des scripts très compliqués, écrits par d'autres, et avoir une méthode d'observation très performante sans être soit même programmeur. Néanmoins, si vous souhaitez personnaliser un script ou bien en écrire un nouveau, il faut savoir programmer. Si vous ne savez pas programmer, il est temps de commencer avec les scripts Audela. En effet, au cours de ces pages, nous allons vous guider pour comprendre la syntaxe des scripts utilisés par Audela.
Audela utilise des scripts écrits en langage Tcl. De cette façon, les scripts de Audela bénéficient des multiples champs d'action du langage Tcl. A noter que la syntaxe Tcl ne dépend pas du type de système d'exploitation présent sur l'ordinateur. Un script écrit par un utilisateur Linux est compatible Windows et vice versa.
On trouvera la syntaxe complète du langage Tcl/Tk dans la page débuter en langage Tcl.
2. Démarrer un script
L'interface Audace permet de lancer les scripts à partir d'un menu :
Cette façon de procéder est spécifique à l'interface Audace. Dans un cadre plus général, n'importe qu'elle interface du logiciel Audela permet de lancer un script à condition d'être équipée d'une ligne commande. C'est le cas aussi de l'interface Audace par l'intermédiaire de sa console. Dans ce cas, si le fichier de script Tcl s'appelle test1.tcl (placé dans le dossier audela), il suffit de valider la ligne de suivante dans la ligne de commande :
source test1.tcl
3. Quelques scripts pour débuter
Nous allons nous attacher à décrire les grandes familles de scripts utiles pour observer. On distingue habituellement les familles suivantes:
- Suite de fonctions
- Définition de nouvelles fonctions
- Interaction avec l'interface utilisateur
Ces trois familles sont présentées dans l'ordre de difficulté croissante. Nous allons passer rapidement en revue ces familles en donnant quelques exemples. Bien entendu, il est possible de mélanger ces trois familles. Pour le moment, nous allons les étudier séparément pour comprendre le rôle de chacune d'elle.
3.1. Enchaîner automatiquement l'exécution des commandes
Il s'agit des scripts les plus communs. Ils servent généralement à résoudre un problème donné. Par exemple, on a un lot d'images brutes dans les fichiers b1.fit, b2.fit, ..., b10.fit et veut soustraire l'image dark.fit à chacune de ces dix images. Faire cela manuellement pour chaque image est très vite fastidieux, avec un risque d'erreur non négligeable. On préférera donc écrire un petit script qui va réaliser une boucle sur les 10 images :
# remarque : fichier subdark.tcl
for {set k 1} {$k<=10} {incr k} {
loadima b$k
sub dark.fit 0
saveima b$k
}
La syntaxe peut s'expliquer ainsi :
- # annonce un simple commentaire (équivalent au REM du langage Basic)
- La boucle for est classique. Les trois premières accolades définissent l'initialisation, la condition de sortie et l'incrément de la variable de la boucle.
- loadima sert à charger l'image en mémoire (c'est à dire dans le buffer numéro 1, encore appelé buf1).
- sub est une fonction de l'interface aud'ACE qui permet de faire une opération de soustraction d'image à l'image contenue dans le buf1. Le fichier de l'image soustraite s'appelle ici dark.fit. Le zero final signifie que l'on ne rajoute pas de valeur à ce qui est soustrait.
- saveima sert à sauver l'image en mémoire (buf1) sur le disque. Si une image du même nom est déjà présente sur le disque, elle est remplacée sans avertissement par cette nouvelle image.
3.2. Définition de nouvelles fonctions
Ce genre de script a pour vocation d'ajouter de nouvelles fonctions à l'interpréteur de commandes. Celui-ci ne les exécutera que si on les appelle utltérieurement. On peut donc créer ainsi des "macros", c'est à dire des suites de fonctions que l'on appelle souvent. Par exemple, l'interface Audace utilise de tels scripts pour créer des macros qui simplifient l'écriture. La fonction loadima est ainsi faite (cf. sa définition dans le fichier aud1.tcl).
Si l'on trouve qu'il est trop long d'écrire "sub dark.fit 0" (par exemple, on considère que l'extension du fichier est toujours .fit et que la constante est toujours zéro) et qu'on voudrait remplacer cela par la syntaxe "sb dark", nous devons écrire le script suivant :
# remarque : fichier newproc.tcl
proc sb { nom_fichier } {
sub ${nom_fichier}.fit 0
}
Dans ce script, nous avons créé une nouvelle fonction dont le nom est "sb".
- proc est la fonction Tcl qui permet de définir une nouvelle fonction. Le mot qui suit proc correspond au nom de la fonction (sb dans ce cas). Elle accepte 1 paramètre qui s'appelle "nom_fichier".
- sub est la fonction de l'interface aud'ACE qui permet de faire une opération de soustraction d'image à l'image contenue dans le buf1. Le fichier à soustraire est ici crée en remplaçant la variable "nom_fichier" par sa valeur (le $ indique à Tcl qu'il faut remplacer ce qui suit). Ainsi le nom du fichier à soustraire correspond à ce que l'utilisateur de la fonction sb va indiquer comme paramètre.
Ainsi, le script de suite de fonctions correspondant à la soustraction du dark aux 10 images peut se simplifier :
# remarque : fichier subdark.tcl
source newproc.tcl
for {set k 1} {$k<=10} {incr k} {
loadima b$k
sb dark
saveima b$k
}
Dans ce script, on commence à exécuter le script qui définit la nouvelle fonction sb (dans le fichier newproc.tcl). On voit bien ici que le script newproc.tcl ne fait rien à proprement parler. Il enrichit simplement les fonctions disponibles.
Il est intéressant de se confectionner une série de petites fonctions utilitaires : réalisation d'un dark médian, d'un bias médian, extraction d'un flat, etc.
3.3. Intéraction avec l'interface utilisateur
Cette famille de scripts présente de plus ou moins grandes complexités. En tout état de cause, cette interaction est un point fort du logiciel Audela et permet de constituer une véritable interface personnalisée. Voici un exemple très simple en trois lignes :
# remarque : fichier startdark.tcl
toplevel .mywin
button .mywin.but1 -text "soustraire le dark" -command { source subdark.tcl
}
pack .mywin.but1
Les trois fonctions utilisées (toplevel, button et pack) proviennent de la librairie Tk, le complément graphique de Tcl. Voici quelques explications :
- toplevel : Création d'une nouvelle fenêtre que l'on nomme .mywin
- button : Création d'un bouton nommé .but1 dans la fenêtre .mywin. Dans le bouton, le texte "soustraire le dark" est affiché. Lorsque l'on appui sur le bouton, on exécute le script subdark.tcl.
- pack : Affiche le bouton dans la fenêtre .mywin. En effet, la fonction button, crée le bouton mais ne l'affiche pas à l'écran. Tk dissocie les propriétés intrinsèques aux widgets (button est un windget, diminutif de Window Gadget) des propriétés de positionnement d'affichage des ces widgets.
L'interface Audace est entièrement créée sous la forme de scripts qui construisent l'interface utilisateur. Ainsi, il est possible de modifier l'interface Audace à volonté.
4. Quelques exemples simples
Quelques exemples suivants permettent de comprendre comment fonctionnent les scripts dans des applications concrètes. Tous les exemples suivants doivent être exécutés dans l'interface Audace.
4.1. Images de noirs et réalisation du noir médian
Le prétraitement des images brutes impose la réalisation d'une image de calibration appelée "noir" (dark en anglais). Cette image doit être réalisée dans des conditions très voisines des images brutes : même binning, même temps de pose mais avec l'obturateur fermé. Enfin, on peut montrer que l'on peut éviter de perdre de la qualité dans l'image prétraitée si l'image de noir résulte d'une pile médiane de plusieurs images noires.
Nous allons donc supposer que vous ayez déclaré votre caméra dans l'interface Audace (menu Réglages->Caméra) et qu'elle possède un obturateur. Voici un script qui permet de prendre 5 poses de noirs (temps de pose 60 secondes, binning 2x2) puis d'en extraire l'image du noir médian :
# - début du script
cam1 shutter closed
acq 60 2
saveima noir-1
acq 60 2
saveima noir-2
acq 60 2
saveima noir-3
acq 60 2
saveima noir-4
acq 60 2
saveima noir-5
cam1 shutter synchro
smedian noir- noirmedian 5
# - fin du script
Analysons le contenu du script ligne par ligne :
- La première ligne commence par le symbole #. Cela signifie que le reste de la ligne contient un commentaire qui ne sera pas analysé par l'interpréteur de commandes. On peut ainsi commenter son script afin de faciliter les corrections ultérieures.
- La ligne cam1 shutter closed : envoie l'ordre de fermeture de l'obturateur de la caméra. Audela permet de piloter, éventuellement, plusieurs caméras en même temps. C'est la raison pour laquelle la fonction cam doit toujours être suivie d'un numéro identifiant à quelle caméra on veut appliquer l'ordre. Avec l'interface Audace, toute caméra déclarée par le menu de réglage porte le numéro 1. La fonction cam1 est suivie du mot shutter. Ce mot (shutter signifie obturateur en anglais) est un paramètre qui permet de préciser l'élément de la caméra concerné par la commande. Enfin, le troisième mot, closed (signifie fermé en anglais) assigne l'ordre de fermer l'obturateur. La fonction cam1 shutter closed permet donc de garder l'obturateur de la caméra toujours fermé. C'est bien utile pour réaliser les images noires.
- La ligne acq 60 2 : envoie l'ordre de réaliser une pose de 60 secondes en binning 2x2. Avant de passer à la ligne suivante du script, l'interpréteur de commandes attendra que la pose soit terminée. Il faudra donc attendre environ une minute pour continuer.
- La ligne saveima noir-1 : donne l'ordre sauver l'image sur le disque sous la forme d'un fichier FITS qui portera le nom noir-1.fit. Noter que ".fit", c'est à dire l'extension du fichier, est ajoutée automatiquement à la fin du nom.
- La ligne acq 60 2 : envoie à nouveau l'ordre de réaliser une pose de 60 secondes en binning 2x2.
- La ligne saveima noir-2 : donne l'ordre de sauver l'image sous le nom noir-2.fit. De la même façon, les six lignes suivantes du script vont permettre d'acquérir encore trois autres images qui seront enregistrées sur le disque. Finalement, ces cinq images portent le nom noir-1.fit, noir-2.fit, noir-3.fit, noir-4.fit, noir-5.fit.
- La ligne cam1 shutter synchro : envoie l'ordre à la caméra de synchroniser l'ouverture et la fermeture de l'obturateur avec la réalisation des poses. De cette façon, les poses suivantes seront effectuées normalement, c'est à dire avec l'obturateur ouvert pendant la pose.
- La ligne smedian noir- noirmedian 5 : permet de réaliser la synthèse de l'image noir médiane à partir des 5 images acquises précédemment. La fonction smedian doit être suivie du mot noir- qui est le nom "générique" des images noires acquises. Le mot suivant est le nom du fichier FITS qui contiendra l'image médiane. Le dernier mot est le nombre d'images de noir à assembler dans l'image médiane.
Si l'on souhaite réaliser 10 images de noir au lieu de 5, il faut ajouter des lignes au script. Il devient vite pénible d'ajouter des lignes, d'autant qu'elles se ressemblent toutes à cela prêt que l'indice varie. Le langage script Tcl permet d'écrire des boucles. Ces boucles permettent de répéter un ensemble de fonctions autant de fois que l'on souhaite. Dans notre cas, il suffit de changer le nombre de boucles à effectuer pour prendre 5 ou 10 ou un tout autre nombre d'images. La boucle contient donc une variable appelée compteur et qui va être incrémentée à chaque tour. Lorsque le compteur dépasse la consigne du nombre de poses, le script arrête de boucler et continue avec l'instruction suivante du script. Le script suivant fait donc la même chose que le précédent mais avec une telle boucle :
# - début du script
cam1 shutter closed
for {set k 1} {$k<=5} {incr k} {
acq 60 2
saveima noir-$k
}
cam1 shutter synchro
smedian noir- noirmedian 5
# - fin du script
- Les deux premières lignes du script sont identiques.
- La ligne for {set k 1} {$k<=5} {incr k} { : commence par le mot for. Ce mot est une commande du langage Tcl qui permet d'effectuer des boucles. L'ensemble des fonctions à répéter suit la dernière accolade ouvrante de la ligne jusqu'à la prochaine accolade fermante (qui se situe trois lignes plus bas). La syntaxe de la boucle for est assez complexe mais on peut la résumer de la façon suivante : le premier jeu d'accolades contient l'initialisation du compteur, le deuxième jeu d'accolades contient la condition de sortie de boucle et le troisième jeu d'accolades contient la façon dont on souhaite incrémenter le compteur. La variable k est le compteur de notre boucle. La syntaxe de la ligne signifie d'initialiser k à 1, puis de boucler tant que la valeur de k est inférieure ou égale à 5. La variable k sera incrémentée de 1 à chaque tour.
- La ligne acq 60 2 : permet de prendre une pose de 60 secondes en binning 2x2. Notons qu'il n'est plus nécessaire d'écrire 5 fois cette ligne puisqu'elle sera répétée le nombre de fois nécessaire par la boucle for.
- La ligne saveima noir-$k : permet de sauver l'image sous un nom qui va changer en fonction de la valeur du compteur de boucle. La syntaxe $k signifie à l'interpréteur Tcl de remplacer $k par la valeur courante de la variable k. Comme k est notre compteur de boucles, les images prendront un nom différent à chaque incrément.
- La ligne } : contient l'accolade qui "ferme" la boucle. Les lignes suivantes seront effectuées lorsque la boucle sera terminée.
- Les lignes suivantes sont identiques au script précédent.
Nous venons ainsi de modifier le script en le réduisant de volume et en augmentant ses capacités puisque l'on peut changer le nombre d'images noires en changeant simplement 5 par une autre valeur. Cependant, remarquons qu'il faut changer le chiffre 5 deux fois dans le script. Ceci est source d'erreur si l'on oublie de changer l'une des deux valeurs. Pour éviter l'erreur, on peut initialiser le nombre total de boucles à effectuer au début du script et assigner cette variable pour la synthèse de la médiane. Cela donne le script suivant :
# - début du script
set n 5
cam1 shutter closed
for {set k 1} {$k<=$n} {incr k} {
acq 60 2
saveima noir-$k
}
cam1 shutter synchro
smedian noir- noirmedian $n
# - fin du script
La ligne set n 5, assigne la valeur 5 à la variable n. Ensuite, nous avons simplement remplacé les deux chiffres 5 par le mot $n. Le symbole $, placé devant la variable, signifie que l'on remplace $n par la valeur de la variable n. Il suffit de changer 5 par 10 dans la ligne "set n 5" pour qu'on réalise 10 images. Nous venons donc de voir qu'une même opération peut être générée par des scripts différents. Heureusement, la réalisation de "beaux" scripts n'est pas nécessaire pour parvenir à réaliser le but fixé. Néanmoins, à force d'écrire des scripts, on apprend à les améliorer.
4.2. Tri automatique d'images avec une WebCam
La technique classique d'acquisition d'images WebCam consiste à enregistrer une scène d'environ 100 images que l'on cherche ensuite à trier pour extraire les meilleures images. Nous allons écrire un petit script qui réalise un tri automatique des images par un critère de contraste. L'idée est de diviser l'acquisition en deux phases : la première consiste à prendre 20 images et à en déduire le critère de contraste qui permettra la sélection. La seconde phase consiste à prendre les images et à ne garder que celles qui sont meilleures que le critère de contraste de la sélection. Le critère de contraste est calculé en effectuant la somme, sur tous les pixels, de l'opposée de la valeur absolue de la différente de deux pixels adjacents. Il est tout à fait possible de changer facilement ce critère par autre dans le script proposé ici.
# - début du script
# === fonction d'acquisition couleur pour WebCam
proc acq_couleur {} {
cam1 snap_rgb
rgb_split 1 -rgb bgr
}
# == cherche le critere de contraste
set n 20
set meilleur_contraste 0
for {set k 1} {$k<=$n} {incr k} {
acq_couleur
set resultat [buf1001 stat]
set contraste [lindex $resultat 8]
if {$constraste<$meilleur_contraste} {
set meilleur_contraste $constraste
}
}
# == acquisition et enregistre uniquement les meilleurs images
set ntot 3000 ; # on fait 3000 images dans le pire des cas
set nselec 100 ; # on enregistre les 100 premières meilleurs
images
set km 0
for {set k 1} {$k<=$ntot} {incr k} {
acq_couleur
set resultat [buf1001 stat]
set contraste [lindex $resultat 8]
if {$constraste<=$meilleur_contraste} {
incr km
rgb_save jupiter-$km
}
if {$km>=$nselec} {
break
}
}
# - fin du script
Ce script est beaucoup plus complexe que les précédents. Il se divise en trois parties:
- Définition d'une acquisition d'image en couleur. Pour cela on a écrit la proc acq_couleur qui va acquérir une image complète dans laquelle les trois plans couleurs occupent le même buffer image. Ensuite, ce buffer est divisé en trois autres qui vont contenir les plans rouge, vert et bleu.
- La phase d'apprentissage. Réalisée essentiellement par une boucle for. En sortie, la variable meilleur_contraste contient le contraste seuil en dessous du quel on considère que les images sont de bonne qualité. En effet, de par sa déifnition, le critère de qualité utilisé ici est d'autant plus négatif que le contraste est fort.
- La phase d'acquisition sélectionnée. Réalisée par une boucle for. On effectue ntot images mais on ne garde que les nselec premières qui satisfassent au critère de qualité. Lorsque les nselec images sont acquises, on sort de la boucle, même si elle n'est terminée (fonction break).
Analysons en détail ce script :
- La ligne proc acq_couleur {} { : signifie que les lignes suivantes vont définir la nouvelle fonction acq_couleur.
- La ligne cam1 snap_rgb : effectue une pose et restitue l'image numérique dans le buffer numéro 1 de Audace. La fonction snap_rgb n'existe que pour les WebCam. L'image dans le buffer contient exactement l'ensemble des pixels de la matrice CCD de la WebCam. Cette matrice est divisée en colonnes dont la première est "bleue", la deuxième est "verte", la troisième est "rouge", la quatrième est "bleue" et ainsi de suite. Cette image n'est pas très exploitable en tant que telle.
- La ligne rgb_split 1 -rgb bgr : signifie que l'image du buffer numéro 1 va générer trois nouveaux buffers numérotés 1001, 1002 et 1003, qui contiennent respectivement les images rouge, verte et bleue. On sépare ainsi les couleurs.
- La ligne } : signifie que la définition de la fonction est finie. A ce niveau l'interpréteur Tcl va l'enregistrer comme une nouvelle fonction utilisable par tout le monde.
- La ligne set n 20 : assigne 20 à la variable n.
- La ligne set meilleur_contraste 0 : assigne zéro à la variable meilleur_contraste.
- La ligne for {set k 1} {$k<=$n} {incr k} { : permet de réaliser 20 boucles
- La ligne acq_couleur : appelle la fonction d'acquistion que nous avons définie précédemment.
- La ligne set resultat [buf1001 stat] : effectue une analyse statistique de l'image contenue dans le buffer 1001. C'est l'image rouge. Les crochets signifient qu'il faut d'abord effectuer la fonction buf1001 stat avant d'assigner sa valeur de retour dans la variable resultat. Cette variable resultat va contenir une liste de valeurs dont la signification est précisée dans la définition de la fonction stat.
- La ligne set contraste [lindex $resultat 8] : Chaque élément de la liste resultat est accessible via un indice qui commence à zéro pour le premier élément. Dans le cas présent, la valeur de contraste correspond à l'indice numéro 8 (c'est donc le neuvième élément de la liste puisque l'on commence à zéro !). C'est la fonction lindex de Tcl qui permet d'extraire la valeur correspondante à un indice dans une liste. La valeur de retour est assignée à la variable contraste. Rappelons que les crochets permettent d'obliger l'interpréteur Tcl à évaluer la fonction lindex $resultat 8, avant d'assigner sa valeur de retour à la variable contraste.
- La ligne if {$constraste<$meilleur_contraste} { : est une condition. Le mot if (signifie si en français) permet d'évaluer les lignes suivantes seulement si la condition entre les accolades est vraie. La condition actuelle est que si la valeur de contraste est plus petite que la valeur de meilleur_contraste, alors l'interpréteur va évaluer les lignes présentes entre les deux accolades suivantes.
- La ligne set meilleur_contraste $constraste : assigne à la variable meilleur_contraste la valeur de contraste. Une telle façon de procéder permet, en sortie de boucle, que la variable meilleur_contraste soit égale à la plus petite valeur de contraste trouvée sur les 20 images.
- Les lignes suivantes ont des significations déjà expliquées.
- La ligne incr km : singifie que la valeur de la variable km va augmenter de 1.
- La ligne rgb_save jupiter-$km : signifie de sauver l'image acquise sous le nom de fichier jupiter- suivi de l'indice courant $km. La fonction rgb_save va, en fait, enregistrer les trois images rouge, vert, bleue des buffers 1001, 1002 et 1003 dans un seul fichier FITS. Pour relire ultérieurement ce fichier FITS couleur, il faudra utiliser la fonction rgb_load. A l'aide de l'interface Audace, on peut accéder à une interface conviviale pour afficher en couleur les images : menu Panneau->CCD Couleur. Choisir WebCam. Appuyer sur le bouton "ouvrir".
- Les lignes if {$km>=$nselec} { break } : signifient que si l'on a enregistré nselec images sur le disque alors il faut quitter la boucle for (fonction break pour interrompre une boucle).
Ce script de moins de quarante lignes montre les puissantes possiblités qu'offrent les scripts de Audela. De nombreuses tâches répétitives peuvent ainsi être automatisées et permettent d'observer plus vite et plus confortablement.
5. Compatibilité d'écriture des scripts
L'interface Audace utilise la fonction proc pour ajouter de nombreuses fonctions supplémentaires à Audela. Il est possible de créer une nouvelle interface qui fonctionnera en dehors du contexte Audace, mais alors de nombreuses fonctions décrites ci dessus ne sont plus accessibles. La liste complète des fonctions spécifiques à l'interface Audace sont repérées par le sigle [AC] dans la page consacrée à l'inventaire de toutes les fonctions disponibles.
Une documentation complète sur la compatibilité d'écriture des scripts peut être consultée. Dans le cas spécifique de l'interface aud'ACE, il est important de consulter la page dédiée aux règles à respecter pour que le script soit compaticle avec les variables d'environnements définies pdans Audace.