E-post: salg@linmag.no



11.2.2012 - 8:50
 • Nyheter
 • Om Linux
 • Linuxskolen
 • Spørrespalte
 • Vitsespalte
 • LINUXmagasinet
 • Spill
 • WEBSHOP
 • Diskusjonsforum
 • Linker
 • For annonsører
 • English
 • Om oss
developer.ez.no
www.online4u.no

0

Programmering i IDL – del 2 - et første praktisk eksempel


Linuxskolen del 18 (Linuxmagasinet 2/2005)

I forrige artikkel så vi på installasjon og konfigurasjon av IDL. Denne gangen skal vi ta for oss et praktisk eksempel på bruken av dette visualiseringsspråket.

IDL inneholder to grensesnitt – ett grafisk og ett terminalbasert. I det følgende vil jeg benytte det grafiske, men jeg vil senere vise at man ikke behøver å kjøre IDL-rutinene i det grafiske miljøet om man ønsker det.
Om du har en egen lisensserver starter du nå denne med kommandoen '/etc/rc.d/init.d/sys5_idl_lmgrd start'. Om du har en fast lisens behøver du ikke gjøre dette. Deretter kan du starte opp IDL fra kommandolinjen med kommandoen 'idlde'. Når grensesnittet er oppe og kjører bør vi trimme det litt for å forenkle vårt fremtidige arbeide. Dette innebærer blant annet å legge til stier til spesielle rutiner som ikke følger med IDL, men som er produsert av deg selv eller andre og som du ønsker å benytte deg av uten å måtte skrive stiene inn i alle etterfølgende programmer. Du kan også justere utseendet på IDLs grafiske grensesnitt slik at det passer deg bedre enn originalen. Alt dette gjøres under «File – Preferences». Lag deg en katalog i filsystemet hvor du ønsker å jobbe med – og bevare dine kommende IDL-rutiner. I mitt tilfelle er dette /data/ALOMAR/idl. Hos deg kan det være hva som helst.

oppsett
Nå ønsker jeg at IDL skal starte opp i denne mappen hver gang, og det gjør jeg ved å sette inn «/data/Kontor/ALOMAR/idl» i «Select Working Directory». Dette medfører blant annet at «File – Open» vil starte i denne mappen automatisk og du slipper en masse katalogbytting for å kunne åpne dine egne filer. Trykk «Apply – Save» og velg deretter fanen «Paths». Klikk «Insert» og bla deg frem til mappen du ønsker skal inneholde de rutinene du ønsker å benytte deg av, men som ikke ligger i IDLs egen bibliotek-mappe. Jeg gjør det enkelt her og lar alt ligge i samme mappe! Klikk «Apply – Save» og restart IDL for å iverksette de forandringene du har gjort.

hjelpesystemet
IDL har et meget godt innebygget «Hjelpesystem» som er tilgjenglig både fra kommandolinjen og via menyen i det grafiske. Det forutsetter dog at Acrobat Reader er installert og at 'acroread' finnes i PATH på Linux'en. Under Fedora installeres Acrobat Reader enkelt gjennom kommandoen 'yum -y install mozilla-acroread' om du benytter deg av yum. Jeg har gjort det slik, og da fungerer også hjelpe-funksjonen i IDL som forventet. Du kan, alternativt gjøre et lite «hack» ved å lage en link fra 'xpdf' til 'acroread' om du har denne installert og ikke ønsker å legge inn Acrobat.

oppgavene
Det jeg har tenkt at vi skal gjøre i denne runden er to ting:
1.Lage en enkel IDL-rutine som plotter data laget av rutinen (IDL) selv.
2.Gjøre om rutinen til å få et lite tilsnitt av interaktivitet over seg, samt at vi skal se hvordan du kan lage png-bilder direkte fra din egen rutine.

Først litt om strukturen i en IDL-rutine. Den må her, som i alle andre dataspråk ha en struktur som må holdes for at ting skal fungere som forventet. De fleste IDL-rutiner starter derfor med linjen «pro rutine_navn» og slutter vanligvis med en «end». *.pro er også den vanlige filbenevnelsen for idl-rutiner. I de rutinene jeg skriver vil du se at jeg bestandig tar med en ekstra linje med kode:

device, true=24, decomposed = 0, retain=2

Dette er noe jeg må gjøre for å holde fargebehandlingen mellom X og IDL i sjakk. Om jeg ikke gjør dette vil jeg kunne oppleve at fargene på desktoppen blir helt «på trynet» hver gang jeg beveger muspekeren inn/ut av vinduet for den aktuelle IDL-rutinen jeg kjørte. Jeg forteller mao IDL at jeg ønsker å benytte 24 bits farger iht mitt X-oppsett og at dette skal tolkes som «True Color» i IDL. Det er her kjernen til problemet ligger, men vi skal ikke gå nærmere inn på dette nå. Du vil også kunne oppleve at fargene i plot produsert i IDL er rare om du ikke bruker de ekstra parametrene. Så derfor: Sett opp X til å vise 24 bit farger i XF86Config eller xorg.config, og sett inn device-linjen i alle dine plotte-rutiner der du ønsker å produsere plot på skjerm eller som *png etc. «retain» sørger for at plottet som dukker opp på skjermen ikke blir «visket ut» om du legger et annet vindu over det vinduet som inneholder plottet. Du må restarte IDL etter å ha lagt inn dette i en rutine du har kjørt tidligere uten.

en dempet sinus
Den første rutinen vi skal se på er en enkel sinus-variant. Vi benytter oss av en innebygget funskjon i IDL som heter «findgen». Denne lar oss generere en flyttalls-tabell (floating point array) på et angitt antall punkter. I vårt tilfelle 100, og det fra 0-99. Videre skal vi så utføre en enkel matematisk operasjon på hvert tall fhvor vi lar y-skalaen være sinus-verdien av en funksjon hvor x fra tabelleninngår. Deretter plotter vi resultatet av x og y i svart mot hvit bakgrunn. Her er rutinen vi skal se på:

pro damped_sin
device, true=24, decomposed = 0, retain=2
x = findgen(100)
print, x
y = sin(6*!pi/100*x)/exp(x/50)
plot, background=255, color=0, y
end

Nå kan du starte med å skrive inn de få linjene over i editor-vinduet i IDL. Når dette er gjort og du er sikker på at det er rett, trykker du Ctrl+F5 for å kompilere koden din. HUSK at etter hver forandring du gjør i koden må du LAGRE og RE-KOMPILERE! Om du ønsker å se x- eller y-verdiene som plottes kan du legge til kommandoen «print, x» i koden i linjen etter at x er generert av findgen. Samme for y. Du vil da se verdiene i det grafiske grensesnittet. Du ser nå at IDL oppfatter «plot» som en kommando for å lage en grafisk fremvisning, mens «print» fremviser tall etc. som du ønsker å vise som en del av rutinen. Ok, jeg antar at du endte opp med samme plot som meg? Da er vi klare til å gå videre!

litt interaktivitet
Vi skal nå prøve å gjøre rutinen litt mer interaktiv ved at vi skal kunne klikke på punkter i grafen og IDL skal så plotte koordinatene på det aktuelle punktet. La oss se på en ny variant av rutinen over:

pro damped_sin
device, true=24, decomposed = 0, retain=2
x = findgen(100)
y = sin(6*!pi/100*x)/exp(x/50)
plot, background=255, color=0, y
while !mouse.button ne 4 do begin
cursor, xp, yp, /down, /data
print, xp, yp
str_var = '' + strmid(strtrim(xp,2), 0, 4) +' ' + strmid(strtrim(yp,2), 0, 4)
xyouts, color=0, xp, yp, str_var, /data
plots, color=0, xp, yp, psym=1
endwhile
!mouse.button = 0
write_png, '/data/Kontor/ALOMAR/idl/damped_sin.png', tvrd(/true)
wdelete, 0
end

Det som skjer her er at du i tillegg til det du gjorde sist tilfører rutinen din evnen til å oppfatte museklikk. Det skiller også mellom fra hvilken knapp klikket kom fra. Det jeg har gjort er å si at så lenge klikket ikke kommer fra høyre muskanpp (while !mouse.button ne 4) skal programmet logge verdien (cursor, xp, yp, /down, /data) på de enkelte punktene jeg klikker på med venstre musknapp, disse verdiene skal så formatteres (str_var = '' + strmid) med gitt antall desimaler, deles opp og plottes (xyouts for tallene og plots for symbolet) på riktig plass i bildet sammen med et lite tegn (psym=1). Deretter skal rutinen gjenta seg selv med eventuelle nye klikk jeg har foretatt. Om jeg klikker høyre mustast (!mouse.button = 0) skal programmet først lage et png-bilde (write_png) av plottet, lagre det i angitte katalog og til sist lukke det aktuelle vinduet (wdelete, 0). Rutinen er avsluttet.

Om du ønsker å være en god programmerer for dine etterfølgere skal du benytte deg av kommentarer i koden slik:

!mouse.button = 0 ; om høyre musknapp trykkes ned
wdelete, 0 ; lukk aktuelt vindu og avslutt rutinen

Som du ser brukes semi-kolon til å tilføye kommentarer, eller rett og slett kommentere ut linjer i koden som du ikke vil slette, men bare ikke bruke nå. Dette kan se slik ut:

while !mouse.button ne 4 do begin
cursor, xp, yp, /down, /data
;print, xp, yp

Her har jeg kommentert ut print-linjen og jeg vil ikke kunne se koordinatene i det grafiske grensesnittet etterhvert som jeg klikker i plottet.

på kommandolinjen
For å kjøre rutinen på kommandolinjen i stedet for i IDLs grafiske grensesnitt gjør du slik:
1.Ta opp en terminal
2.Sørg for at lisensserver kjører som vanlig og at det grafiske grensesnittet er avsluttet slik at lisensen er tilgjengelig.
3.Hopp inn i den katalogen hvor rutinen din ligger
4.Kjør kommandoen 'idl' for å starte IDL
5.På IDLs kommandolinje som du nå har fått tilgang til «IDL>» skriver du '.R damped_sin.pro'
6.Etter dette skriver du kun 'damped_sin' uten pro-ending!

Nå skulle plottet dukke opp igjen, og du skal igjen kunne markere punkter langs kurven. Når du er ferdig høyreklikker du som tidligere. Plottet blir borte og rutinen avsluttes med at IDL> blir frigitt for nye kommandoer. Se under for hvordan dette ser ut hos meg:

[kolbjorn@messiah ~]$ cd /data/Kontor/ALOMAR/idl/
[kolbjorn@messiah idl]$ idl
IDL Version 5.6 (linux x86 m32). (c) 2002, Research Systems, Inc.
Installation number: 403225.
Licensed for use by: Andoya Rocket Range

IDL> .R damped_sin.pro
% Compiled module: DAMPED_SIN.
IDL> damped_sin
24.554590 -0.60620602
7.6506761 0.84512140
16.725409 0.0044134443
41.102633 0.43361698
58.006547 -0.31417062
74.020781 0.22122760
91.992311 -0.15930337
18.326832 -0.10620602
IDL>

Dette avslutter denne rundens IDL-innføring. Jeg håper jeg har fått tent en liten gnist av interesse for dette meget anvendelige verktøyet for visualisering av data. I neste nummer skal vi se på et mer avansert plot hvor vi skal plotte reelle data fra ALOMARs værstasjon. Dette skal vi gjøre i forskjellige farger, med flere plot i samme bilde og vi skal plotte max- og min-verdier i plottene for å gjøre dem mer informative. I tillegg skal jeg vise deg hvordan du kan automatisere plottingen slik at du slipper å hente inn data manuelt, men heller overlate dette til IDL og Linux selv. Vel møtt da!



0







0 0