Audela
Audela

Créer un nouveau panneau d'observation

Créer un nouveau panneau d'observation

L'interface Audace n'est pas figée et il est tout à fait possible d'y ajouter des fonctionnalités. Nous allons aborder ici la façon de créer un nouveau panneau d'observation afin de pouvoir réaliser des opérations pour une application spécifique. La réalisation d'un tel panneau nécessite une connaissance préalable du langage script Tcl/Tk utilisé par Audela. Afin de parler concret, nous allons nous appuyer sur un exemple. Nous nous proposons de créer un panneau qui va permettre de réaliser l'acquisition et le prétraitement d'une image du ciel profond par une méthode très précise :

Nous voulons réaliser les images en binning 2x2 (moyenne définition)

Les images seront posées 30 secondes

Un télescope automatique est relié à Audace et nous voulons utiliser la méthode du shift & add. Cette méthode consiste à prendre plusieurs images du champ légèrement décalées les unes par rapport aux autres. Nous réaliserons 5 images au foyer F=1,20 mètre.

Un flat sera réalisé en faisant des images du ciel nocturne à côté de l'objet. Nous réaliserons 5 images de flat pour réaliser un flat de synthèse.

Nous supposons qu'une image bias et une image de dark existent sur le disque dur. L'image du bias s'appelle c:\audela\d0b2.fit et l'image de dark s'appelle d30b2.fit. 

Le prétraitement sera automatiquement réalisé juste après les poses.

Le but du panneau est de paramétrer le nom des fichiers bias et dark et de lancer la pose et d'avoir un retour sur l'état du script (status). On souhaite donc réaliser un panneau comme ci dessous :

Le script se présente sous la forme d'une seul fichier (mon_acq2.tcl dans notre exemple) placé dans le dossier audela/audace/panneau. Au démarrage, l'interface Audace va trouver le fichier dans ce dossier et va ajouter automatiquement un intitulé (Mon acquisition dans cet exemple) au menu Panneau :

La suite de cette page expose le contenu complet du fichier script définissant le panneau. Pour le comprendre il faut connaître le langage Tcl/Tk et donc pratiquer les scripts de Audela. Nous avons écrit, en italique, le texte propre aux spécificités de ce panneau. Le reste du texte constitue la charpente sur laquelle on construit un nouveau panneau. Enfin, signalons qu'il est important de respecter un certain nombre de règles d'écriture pour que le panneau puisse être facilement intégré de façon standard dans l'interface Audace.

# fichier : mon_acq2.tcl
# description : panneau de methode d'observation personnelle.
# auteur : Alain KLOTZ
# date de MAJ : 19 Sep 2000
#
namespace eval ::Monacq {
# ============================================================
# === definition du namespace Monacq pour créer un panneau
    ===
# ============================================================
   # =======================================================================
   # === definition des fonctions de construction automatique
    du panneau ===
   # =======================================================================
   variable This
   proc init {{in ""}} {
      createPanel $in.monacq
   }
   proc createPanel {this} {
      variable This
      global panneau
      set This $this
      set panneau(menu_name,Monacq) "Mon acquistion"
      set panneau(Monacq,label_bias) "Fichier bias"
      set panneau(Monacq,bias) "c:/audela/d0b2"
      set panneau(Monacq,label_dark) "Fichier dark"
      set panneau(Monacq,dark) "c:/audela/d30b2"
      set panneau(Monacq,label_nom) "Fichier objet"
      set panneau(Monacq,nom) "c:/audela/obj"
      set panneau(Monacq,go) "GO"
      set panneau(Monacq,label_status) "Status"
      set panneau(Monacq,status) "Appuyer sur GO"
      MonacqBuildIF $This
   }
   proc pack {} {
       global unpackFunction
      variable This
      set unpackFunction ::Monacq::unpack
      set a_executer "pack $This -anchor center -expand 0 -fill y -side left"
      uplevel #0 $a_executer
   }
   proc unpack {} {
      # --- ne pas toucher cette proc
      variable This
      set a_executer "pack forget $This"
      uplevel #0 $a_executer
   }
   # ===========================================================
   # === definition des fonctions a executer dans le panneau ===
   # ===========================================================
   proc cmdGo {} {
      # --- fonction appelee par appui sur le bouton GO
      variable This
      global panneau
      if {[::tel::list]!=""} {
         set radec0 [tel1 coord]
      } else {
         # --- infos status
         set panneau(Monacq,status) "Pb pas de tel"
         $This.fra3.lab2 configure -text $panneau(Monacq,status) 
         update
         return
      }
      if {[::cam::list]!=""} {
         # --- calcule 5 positions legerement décalées autour de l'objet
         set list_radec [mc_listradec [list optic naxis1 384 naxis2 256 foclen 1.2 \
            pixsize1 18e-6 pixsize2 18e-6 crota2 0 \ 
            ra  [mc_angle2deg [lindex $radec0 0]] \
            dec[mc_angle2deg [lindex $radec0 1]] ] \
            {random 5} 20 ]
         # --- effectue les 5 poses sur l'objet
         for {set i 1} {$i<=5} {incr i} {
            # --- infos status
            set panneau(Monacq,status) "Flat $i /5"
            $This.fra3.lab2 configure -text $panneau(Monacq,status) 
            update
            # --- mise en forme des coordonnees a pointer
            set ii [expr $i-1]
            set radec [lindex $list_radec $ii]
            ra  [mc_angle2hms [lindex $radec 0]]
            dec [mc_angle2dms [lindex $radec 1] dec]
            set radec [list $ra $dec]
            # --- pointage du telescope
            tel1 goto $radec
            # --- acquistion de l'image
            acq 30 2
            # --- sauvegarde de l'image sur le disque
            saveima $panneau(Monacq,nom)-$i
         }
         # --- calcule 1 position hors champ a coté de l'objet pour le flat
         set list_radec [mc_listradec [list optic naxis1 384 naxis2 256 foclen 1.2 \
            pixsize1 18e-6 pixsize2 18e-6 crota2 0 \ 
            ra  [mc_angle2deg [lindex $radec0 0]] \
            dec[mc_angle2deg [lindex $radec0 1]] ] \
            {random 2} 1000 ]
         set radec [lindex $list_radec 1]
         set ra  [lindex $radec 0]
         set dec [lindex $radec 1]
         # --- calcule 5 positions tres décalées autour de ce champ
         set list_radec [ mc_listradec [list optic naxis1 384 naxis2 256 foclen 1.2 \
            pixsize1 18e-6 pixsize2 18e-6 crota2 0 \ 
            ra  $ra \
            dec $dec ] \
            {random 5} 500 ]
         # --- effectue les 5 poses sur le champ de flat
         for {set i 1} {$i<=5} {incr i} {
            # --- infos status
            set panneau(Monacq,status) "Objet $i /5"
            $This.fra3.lab2 configure -text $panneau(Monacq,status) 
            update
            # --- mise en forme des coordonnees a pointer
            set ii [expr $i-1]
            set radec [lindex $list_radec $ii]
            ra  [mc_angle2hms [lindex $radec 0]]
            dec [mc_angle2dms [lindex $radec 1] dec]
            set radec [list $ra $dec]
            # --- pointage du telescope
            tel1 goto $radec
            # --- acquistion de l'image
            acq 30 2
            # --- sauvegarde de l'image sur le disque
            saveima f$panneau(Monacq,nom)-$i
         }
         # --- infos status
         set panneau(Monacq,status) "Pretraitement"
         $This.fra3.lab2 configure -text $panneau(Monacq,status) 
         update
         # --- pretraitement : synthèse du flat
         opt2 f$panneau(nom)- $panneau(Monacq,dark) $panneau(Monacq,bias) i 5
         ngain2 i i 1000 5
         smedian i f$panneau(Monacq,nom) 5
         # --- pretraitement : corrections et compositage des images
         opt2 $panneau(nom)- $panneau(Monacq,dark) $panneau(Monacq,bias) i 5
         div2 i f$panneau(Monacq,nom) i 1000 5
         noffset2 i i 200 5
         register2 i j 5
         smedian j $panneau(Monacq,nom) 5
         # --- infos status
         set panneau(Monacq,status) "Fini"
         $This.fra3.lab2 configure -text $panneau(Monacq,status) 
         update
      }
   }
}
 
proc MonacqBuildIF {This} {
# ============================
# === graphisme du panneau ===
# ============================
   global audace
   global panneau
   #--- Frame du panneau
   frame $This -borderwidth 2 -height 75 -width 101 -bg $audace(color,backColor) \
      -borderwidth 2 -relief groove
      #--- Frame du titre du panneau
      frame $This.fra1 -borderwidth 2 -height 75 -relief groove -width 92 \
         -bg $audace(color,backColor2)
         #--- Label du titre
         label $This.fra1.lab1 -borderwidth 1 -text $panneau(menu_name,Monacq) \
            -bg $audace(color,backColor2)
         pack $This.fra1.lab1 -in $This.fra1 -anchor center -expand 1 -fill both -side top
      place $This.fra1 -x 4 -y 4 -width 92 -height 22 -anchor nw -bordermode ignore
      #--- Frame general
      frame $This.fra2 -borderwidth 1 -height 77 -relief groove -bg $audace(color,backColor2)
         #--- Label pour le nom du bias
         label  $This.fra2.lab1 -text $panneau(Monacq,label_bias) \
            -bg $audace(color,backColor2) -relief flat
         pack   $This.fra2.lab1 -in $This.fra2 -anchor center -fill none -padx 4 -pady 1
         #--- Entry pour le nom du bias
         entry  $This.fra2.ent1 -font {{Arial} 8 bold} -textvariable panneau(Monacq,bias) \
            -bg $audace(color,entryColor2) -relief groove
         pack   $This.fra2.ent1 -in $This.fra2 -anchor center -fill none -pady 2 -padx 4
         #--- Label pour le nom du dark
         label  $This.fra2.lab2 -text $panneau(Monacq,label_dark) \
            -bg $audace(color,backColor2) -relief flat
         pack   $This.fra2.lab2 -in $This.fra2 -anchor center -fill none -padx 4 -pady 1
         #--- Entry pour le nom du dark
         entry  $This.fra2.ent2 -font {{Arial} 8 bold} -textvariable panneau(Monacq,dark) \
            -bg $audace(color,entryColor2) -relief groove
         pack   $This.fra2.ent2 -in $This.fra2 -anchor center -fill none -pady 2 -padx 4
         #--- Label pour le nom de l'objet
         label  $This.fra2.lab3 -text $panneau(Monacq,label_nom) \
            -bg $audace(color,backColor2) -relief flat
         pack   $This.fra2.lab3 -in $This.fra2 -anchor center -fill none -padx 4 -pady 1
         #--- Entry pour le nom du bias
         entry  $This.fra2.ent3 -font {{Arial} 8 bold} -textvariable panneau(Monacq,nom) \
            -bg $audace(color,entryColor2) -relief groove
         pack   $This.fra2.ent3 -in $This.fra2 -anchor center -fill none -pady 2 -padx 4
         #--- Bouton GO
         button $This.fra2.but1 -borderwidth 1 -text $panneau(Monacq,go) \
            -bg $audace(color,backColor2) -command { ::Monacq::cmdGo }
         pack   $This.fra2.but1 -in $This.fra2 -anchor center -fill none -pady 8 \
            -ipadx 25 -ipady 8
     place $This.fra2 -x 4 -y 32 -width 92 -height 198 -anchor nw -bordermode ignore
      #--- Frame des status
      frame $This.fra3 -borderwidth 1 -height 77 -relief groove -bg $audace(color,backColor2)
         #--- Label pour la designation du status
         label  $This.fra3.lab1 -text $panneau(Monacq,label_status) \
            -bg $audace(color,backColor2) -relief flat
         pack   $This.fra3.lab1 -in $This.fra3 -anchor center -fill none -padx 4 -pady 1
         #--- Label pour le status
         label  $This.fra3.lab2 -text $panneau(Monacq,status) \
            -bg $audace(color,backColor2) -relief flat
         pack   $This.fra3.lab2 -in $This.fra3 -anchor center -fill none -padx 4 -pady 1
     place $This.fra3 -x 4 -y 236 -width 92 -height 50 -anchor nw -bordermode ignore
}
# ================================
# === intialisation du panneau ===
# ================================
global audace
::Monacq::init $audace(base)
# === fin du fichier mon_acq2.tcl ===

| English Version | Mailing List Audela | ©2004 Audela | Design TechnoSpeak