AIVO

Cum laude approbatur -työprojekti

 

PROJEKTIKÄSIKIRJA

15.6.1997

 

työryhmä:

Sami Kärkkäinen

Tommi Lahtonen

Marko Minkkinen

 

 

 

 

Tiivistelmä

 

AIVO-projekti toteutti Windows 95 -ympäristöön sovelluksen, jolla luodaan graafisesti NMR-sekvenssi ja muutetaan se SMIS-C-kielelle (Pulse Programming Language (PPL)). Tämän Graphical SMIS-C Generator v1.0 beta -sovelluksen toimeksiantajana toimi A.I.Virtanen -instituutti Kuopiosta.

 

SISÄLLYSLUETTELO

 

 

1. Johdanto………………………………………………………… 1

 

2. Käytetyt termit………………………………………………….. 1

 

3. Tausta ja tavoitteet……………………………………………… 2

3.1 Tehtävän tausta………………………………………………………………. 2

3.2 NMR-sekvenssi……………………………………………………………….. 2

3.3 Tavoitteet……………………………………………………………………… 2

 

  1. Tehtävän selkiytyminen työstettäväksi………………………… 3

 

  1. Ohjelman sisäinen rakenne…………………………………….. 3

 

  1. Käyttöliittymän kuvaus…………………………………………. 5

6.1 Pääikkuna…………………………………………………………….………. 5

6.1.1 Alasvetovalikot……………………………………………..………. 6

6.1.2 Parametrilistadialogi………………………………………………. 6

6.2 Editointi-ikkuna……………………………………………………………… 9

6.2.1 Alasvetovalikot…………………………………………………….. 10

6.2.2 Pulssidialogi………………………………………………………… 12

 

  1. Ylläpitäjän tarvitsemat tiedot ja ohjeet………………………… 13

 

    1. Konfigurointitiedosto…………………………….………………………….. 13
    2. RF-pulssien määrittelytiedosto…..………………………………………….. 13

7.3 Parametrilistaeditorin konfigurointitiedosto………..……………………… 14

7.4 Pulssien perusrunkojen määrittelemiseen tarvittavat tiedostot…………… 15

7.5 Koodin tunnistamiseen tarvittava tiedosto…………………………………. 16

8. Testaus ja tulokset………………………………………………. 17

 

9. Sovelluksen kaatuminen………………………………………… 17

 

10. Projektiryhmä ja työnjako…………………………………….. 17

 

11. Tavoitteiden toteutuminen…………………………………….. 17

 

12. Projektin todellinen aikataulu…………………………………. 18

12.1 Projektin viikottainen aikataulu…………………………………………… 18

12.2 Projektilaisten henkilökohtainen ajankäyttö……………………………… 19

 

13. Vastaantulleet ongelmat ja niiden ratkaiseminen…………….. 21

 

14. Ohjelman edelleenkehittäminen….…………………………… 22

 

15. Mitä opimme?………………………………………………… 22

 

16. Projektilaisten mielipiteit䅅………………………………. 23

16.1 Sami Kärkkäinen…………………………………………………………… 23

16.2 Tommi Lahtonen…………………………………………………………… 23

16.3 Marko Minkkinen………………………………………………………….. 23

 

17. Lähdeluettelo………………………………………………….. 24

1. Johdanto

 

Tässä projektikäsikirjassa pyritään antamaan lukijalle käsitys projektin etenemisestä, rakenteesta sekä toiminnasta. Myös projektilaisten ajatuksia on liitetty projektikäsikirjan yhteyteen.

 

Projektilaiset haluavat kiittää matematiikan laitoksen osalta projektissa toiminutta ohjaajaa Jukka-Pekka Santasta sekä A.I.Virtanen -instituutin yhteyshenkilönä toiminutta Johanna Silvennoista. Kiitokset myös epäviralliselle ohjaajalle Jonne Itkoselle olio-ohjelmoinnin saralla sekä Tapani Tarvaiselle toisen tietokoneemme toimintakuntoon saattamisesta.

 

 

2. Käytetyt termit

 

Tässä luvussa selvennetään käsikirjassa käytettyjä termejä.

 

NMR eli ydinmagneettinen resonanssi (NUCLEAR MAGNETIC RESONANCE) tarkoittaa ytimien pyörimisakselien (spinien) yhdensuuntaistumista voimakkaassa magneettikentässä. Magneettikuvaus- ja spektroskopia perustuvat tähän ilmiöön.

 

Sekvenssi on mittauslaitteistoa ohjaava "suunnitelma". Sekvenssistä kovergoitu koodi siis ohjaa koko mittauslaitteistoa kuvan aikaansaamiseksi kudoksesta.

 

SMIS-C-kieli on syntaksiltaan C-kieltä, mutta huomattavasti rajoittuneempaa (mm. tietorakenteina ovat vain kokonaisluvut ja yksi-ulotteiset "taulukot").

 

PARSETUP-ohjelma lukee suoraan SMIS-C-koodia (sen kommentteja). Tällä erillisellä ohjelmalla voidaan muuttaa mittausparametreiksi määriteltyjen muuttujien arvoja.

 

RF-pulssi on radiotaajuuspulssi, joilla ohjataan ytimien pyörimistä (ks. NMR-sekvenssi).

 

Gradienttipulssin avulla sekvenssissä saadaan paikkaerotus. Slice-, read- ja phase-kanavat vastaavat x-, y- ja z-akseleita.

 

Paikkaerotus (kohdistus) saadaan aikaan x-, y- ja z-suuntaisilla gradienttikeloilla. Näin saadaan kuvaus kohdistettua haluttuun paikkaan.

 

HTML eli HyperTEXT Markup Language on sivunkuvauskieli, jolla on toteutettu mm.ohjelman opastusosa.

 

 

 

 

 

 

 

 

3. Tausta ja tavoitteet

 

Seuraavissa alaluvuissa selvitetään lyhyesti toteutetun projektin taustaa, tehtävänantoa sekä sovelluksen tilaajaa.

 

3.1 Tehtävän tausta

 

Kuopion yliopiston A.I.Virtanen -instituutissa on käytössä NMR-kuvantamis- ja spektroskopialaitteita. niiden pulssisekvenssien ohjelmointi tapahtuu laitevalmistajan omalla, rakenteellisesta yksinkertaistetulla SMIS-C-kielellä. Pulssisekvenssillä tarkoitetaan NMR-kuvan tai -spektrin mittaamisessa käytettävien radiotaajuuspulssien ja kenttägradienttien ajastusta. Nämä esiintyvät koodissa tavallisimmin moduleina ohjelmoituna neljälle eri radiotaajuuskanavalle. Tällä hetkellä sekvenssit ohjelmoidaan suoraan SMIS-C:tä käyttäen, joka on usein hidasta ja hankalaa.

 

Projektissa toteutettiin sovellus sekvenssikehityksen visuaaliseen rakentamiseen. Tällöin pulssisekvenssejä voidaan kirjoittaa ja/tai editoida graafisesti, esimerkiksi asettamalla sekvenssin elementit aika-akselille oikeille paikoilleen. Ohjelmatyökalu koodaa näin rakennetun graafisen NMR-sekvenssin SMIS-C-kielelle. Vastaavasti ohjelma lukee SMIS-C-koodia ja esittää sen graafisesti.

 

3.2 NMR-sekvenssi

 

Magneettikuvaus- ja spektroskopia perustuvat ydinmagneettiseen resonanssiin (NMR), joka tarkoittaa ytimien pyörimisakselien (spinien) yhdensuuntaistumista voimakkaassa magneettikentässä. Pyörimistä voidaan "ohjata" radiotaajuisilla pulsseilla, jolloin ytimien palautuessa tasapainotilaansa emittoituu radiotaajuista säteilyä. Tämä säteily mitataan. Lisäksi näytteestä voidaan valita tiettyjä tasoja (slice), joihin viritys kohdistuu, sekä käydä tason pisteikkö läpi kuvan muodostamiseksi. Paikkaerotus (kohdistus) saadaan aikaan erillisillä ns. gradienttikeloilla, joita käytetään myös herkistämään signaalia erilaisille dynaamisille ilmiöille, kuten diffuusiolle. Gradientteja on kolme eli x-, y- ja z-suuntaiset kelat.

Kuvan tai spektrin aikaansaamiseksi tarvitaan siis keskenään oikein ajastettuja radio- ja gradienttipulsseja yhteensä neljällä eri kanavalla (RF, x, y, z) käynnistettyjä ja sammutettuja elementtejä. Lisäksi usein mitataan useita tasoja (slice), käytetään keskiarvoistusta ja niin edelleen. Koko mittausta ohjaavaa ajojonoa kutsutaan sekvenssiksi.

 

3.3 Tavoitteet

 

Projektin tavoitteista on kerrottu tarkemmin jo esisuunnitelmassa. Sovelluksen työstäminen aloitettiin tammikuussa ja projektin tuli päättyä toukokuun alussa. Projekti oli varsin laaja ja alkuperäisessä tehtävänannossa aikaa olikin annettu koko vuodeksi -97. Ajan puutteen vuoksi jouduttiin luopumaan projektin viimeisimmästä (vähiten tärkeimmästä) tavoitteesta eli automaattisesta valmiin SMIS-C-koodin lukemisesta ja konvertoimisesta graafiseen muotoon. Tämä tuli selväksi jo ensimmäisen Kuopiossa käynnin yhteydessä. Valmiin koodin pystyy kuitenkin lukemaan ja konvertoimaan lisäämällä koodiin määrätyn tyyppisiä rivejä.

 

4. Tehtävän selkiytyminen työstettäväksi

 

Kenelläkään ei aluksi ollut hajuakaan kuinka annettu projekti tulisi toteuttaa. Vaikka saimmekin ensimmäisessä palaverissa SMIS-C-koodin manuaalin, tuntui tehtävä sekavalta. Varsinkin itse SMIS-C-kieli tuntui paikoitellen jopa käsittämättömältä ja amatöörien kehittämältä.

Ensimmäinen Kuopiossa käynti (5.2) oikeastaan potkaisi projektin vauhtiin. Tällöin saimme tärkeitä tietoja SMIS-C-koodista. Myös NMR-sekvenssien käytännön soveltamisen ymmärtäminen auttoi huomattavasti mm. käyttöliittymän kehittämistä. Projektin edetessä ongelmia tuotti nimenomaan itse koodi, eikä kaikkiin ongelmiin saatu oikein kunnollisia vastauksia. Osaksi tähän oli syynä myös työkiireet Kuopion suunnalla.

Toisen Kuopiossa käynnin ( 25.4 ) tarkoituksena oli sovelluksen prioriteettien tarkentaminen. Tällöin sovittiin ehdot, joiden tulisi täyttyä lopullisessa ohjelmassa. Tähän mennessä projektin "pohjatyö" alkoi olla loppuvaiheissaan ja varsinainen käyttäjälle näkyvä kehitys pääsi vauhtiin.

 

Sovellus sai lopullisen muotonsa vasta viikolla 22 ja viime kädessä se muodostui matematiikan laitoksen sisäisen kehittämisen tuloksena. A.I.Virtanen -instituutista ei saatu korjaus- tai parannusehdotuksia kuin vasta aivan viime tipassa.

 

 

5. Ohjelman sisäinen rakenne

 

Ohjelma rakentuu kahdesta erillisestä komponentista: tietovarastosta ja näytöstä. Tietovarasto hoitaa kaiken tiedon varastoinnin sekä käsittelyn ja näyttö kommunikoinnin käyttäjän kanssa.

 

 

Kuva 1. cStorage-luokka.

Tietovaraston ydin rakentuu Kuvan 1 cStorage-luokasta, joka hoitaa kaiken sisällytettävän koodin lukemisen, analysoinnin, muistiin tallettamisen ja selkokieliseksi tulostamisen. cStorage-luokka sisältää osoitintaulukon Kuvan 2 cComponent-tyyppisiin olioihin.

Kuva 2. cComponent-luokka ja siitä perityt luokat.

 

Kuva 2 esittää cComponent-luokan ja siitä periytyvien luokkien hierarkiaa. cComponent-luokka on abstrakti isä luokka, josta on peritty omat luokat kaikille koodissa esiintyville komponenteille. Nämä luokat hoitavat yksittäisten koodirivien tunnistuksen, analysoinnin ja muokkauksen.

 

6. Käyttöliittymän kuvaus

 

Käyttöliittymän rakenne selkiytyi lopulliseen muotoonsa vasta viikolla 22 vastaantulleiden ongelmien, toivomusten ja parannuksien myötä.

 

6.1 Pääikkuna

 

Ohjelman Graphical SMIS-C Generator v1.0 beta käyttöä aloitettaessa avautuu ensiksi Kuvan 3 pääikkuna.

 

Kuva 3. Pääikkuna.

 

Pääikkunassa olevia painikkeita käsitellään editointi-ikkunan (Kuva 9) yhteydessä. Painikkeet esitetään harmaina, koska niitä käytetään vasta sekvenssi-ikkuna ollessa aktiivinen. Tästä tarkemmin luvussa 4.2 .

 

6.1.1 Alasvetovalikot

 

Tässä luvussa esitellään Pääikkunan alasvetovalikot:

 

Kuva 4. Tiedostovalikko (File).

 

Ohjelman käyttö aloitetaan lataamalla pohjatiedosto. Tämä tapahtuu valitsemalla Kuvan 4 tiedostovalikosta Load jolloin avautuu parametrilistadialogi (Kuva 6).

 

Kuvan 4 tiedostovalikon Exit komento lopettaa ohjelman.

 

Kuva 5. Opastusvalikko (Help).

 

Kuvan 5 opastusvalikosta About komennolla avautuu about-dialogi, josta näkyy tiedot mm. ohjelman versiosta ja tekijöistä. Komento Help ilmestyy opastusvalikkoon editointi-ikkunan ollessa aktiivisena.

 

 

6.1.2 Parametrilistadialogi

 

Uutta sekvenssiä aloitettaessa joudutaan aluksi muuttamaan SMIS-C-koodin PARSETUP-osion mittausparametreiksi määriteltyjen muuttujien arvoja. Valittaessa pääikkunassa File -alasvetovalikosta Load -kohta käyttäjälle avautuu Kuvan 6 Parametrilistadialogi.

 

 

Kuva 6. Parametrilistadialogi (Parsetup Configuration).

 

Parametrilistadialogi-ikkuna sisältää painikkeet Load, Add, Delete, Edit, Help, OK ja Cancel. Lisäksi se sisältää sekä lista-ikkunan johon ilmaantuu näkyville lisätyt PARSETUP-komponentit ja komponenttien alasvetovalikon. Lataus-painikkeella (Load)avautuu aluksi Kuvan 7 varoitus. Varoitus tulee koska, pohjakoodin lataamista ei voi enää peruuttaa Parametrilistadialogin Cancel-painikkeella. Painamalla OK-painiketta voidaan valita ladattava tiedosto. Tällöin listaan tulee näkyville kyseisen tiedoston PARSETUP-osion alkuasetukset. Nyt voit valita alasvetovalikosta halutun mittauskomponentin, jolloin esille tulevat kyseisen komponentin parametrit. Painamalla Add-painiketta lisätään komponentti listaan.

 

 

Kuva 7. Varoitus-dialogi (Warning!).

 

 

PARSETUP-komponenttien parametreja käyttäjä pääsee muokkaamaan useallakin eri tavalla. Komponentin poistaminen tapahtuu merkitsemällä hiiren avulla tai näppäimistöllä haluttu kohta ja painamalla Delete-painiketta joko dialogissa tai näppäimistöltä delete-näppäintä.

 

Kaksoisnäpäyttämällä komponenttia tai merkitsemällä komponentti ja painamalla Edit-painiketta avautuu Kuvan 8 mukainen ikkuna.

 

 

 

 

Kuva 8. Rivin editointi-ikkuna.

 

Nyt käyttäjä pääsee suoraan editoimaan tiettyä komponenttia.

 

 

Seuraavassa annetaan kuvaukset parametrilistadialogin (Kuva 6) objekteista:

 

Parsetup code

Listaus alussa pohjaksi ladatusta SMIS-C koodista saaduista PARSETUP-komponenteista.

 

Choose Parsetup component

Alasvetovalikko PARSETUP-komponenteista. Komponentin valinnan jälkeen ruutuun aukeaa lista tähän komponenttiin liittyvistä parametreistä. Näitä parametreja voi olla kolmea eri tyyppiä: kokonaislukuja, merkkijonoja ja muuttujia. Muuttujat valitaan valmiista listasta, kokonaisluvut ja merkkijonot syötetään suoraan kenttiin.

 

Load

Painike lataa editointipohjaksi valmiin SMIS-C-koodin. Ilman pohjakoodin lataamista kunnollisen pulssisekvenssin luominen on vaikeaa, koska ohjelma tuottaa ainoastaan sekvenssiosioon pulssikohtaisen koodin. Koodin lataamista ei voi enää peruuttaa Parametrilistadialogin Cancel-painikkeella.

 

Add

Painike lisää PARSETUP-koodilistaan uuden komponentin. Jos komponentin parametrien arvoissa on jotain vikaa, käyttäjälle näytetään virheilmoitus-dialogi..

 

Delete

Painike poistaa valittuna olevan komponentin koodilistasta. Sama toiminto saadaan aikaan myös delete-näppäimellä.

 

Edit

Painike antaa editoitavaksi valittuna olevan komponentin. Sama toiminto tapahtuu myös kaksoisnäpäyttämällä haluttua komponenttia listasta.

 

Help

Painike aukaisee opastusikkunan parsetup-dialogin kohdalta.

OK

Painike kuittaa muutokset ja sulkee parsetup-dialogin.

 

Cancel

Painike peruuttaa tehdyt muutokset paitsi mahdollisen pohjakoodin lataamisen

 

 

6.2 Sekvenssi-ikkuna

 

Painamalla parametrilistadialogin (kuva 7) jälkeen OK-painiketta avautuu Kuvan 9 mukainen editointi-ikkuna.

Kuva 9. Sekvenssi-ikkuna.

 

Aluksi Sekvenssi-ikkunassa on pelkät RF, SLICE, READ ja PHASE-viivat (ks. RF, X, Y ja Z luvussa 3.2). Nyt käyttäjä voi lisätä haluamiaan pulsseja, taukoja sekä kommentteja sekvenssiin. Tauon lisääminen sekvenssiin tapahtuu samalla tavalla kuin pulssinkin lisääminen, mutta tällöin pulssidialogissa ei tule valita yhtään kanavaa aktiiviseksi (ks. luku 6.2.2). Lisäksi Sekvenssi-ikkunassa on painikkeita, jotka helpottavat sekvenssin käsittelyä. Painikkeet toimivat samoin kuin vastaavat vaihtoehdot view-, convert- ja insert-alasvetovalikoista (ks. luku 6.2.1).

 

Lisäksi Delete Pulse-painikkeella voi poistaa valittuna olevan pulssin.

 

Nuolinäppäimillä käyttäjä voi siirtää valittuna olevaa pulssia oikealle tai vasemmalle.

 

 

6.2.1 Alasvetovalikot

 

Tässä alaluvussa esitellään sekvenssi- (Kuva 9, edustalla) ja koodi- (Kuva 9, taustalla) ikkunoiden valikot.

 

Kuva 10. Tiedostovalikko (File).

 

Sekvenssi-ikkunan tiedostovalikko (File) sisältää kaikki normaalit ominaisuudet. Valitsemalla Kuvan 9 valikosta lataus (Load) voidaan aloittaa uuden sekvenssin luominen, jolloin avautuu jälleen parametrilistadialogi (Kuva 6). Aikaisemmin aloitettua sekvenssiä voidaan jatkaa valitsemalla avaus (Open). Tiedostovalikosta (File) löytyy myös talletus- ja tulostusosat. Talletus (Save/Save as) tapahtuu SMIS-C-koodina. Ohjelma tulostaa (Print, Print Setup) joko SMIS-C-koodin tai sekvenssin graafisen esityksen. Painikkeella Close suljetaan aktiiviset ikkunat (sekvenssi- ja koodi-ikkunat) ja painamalla Exit päätetään sessio.

 

 

Kuva 11. Muokkausvalikko (Edit).

 

Kuvan 11 muokkausvalikon Cut-komento poistaa merkityn pulssielementin sekvenssistä. Vastaavasti Copy kopioi merkityn alueen aktiivisesta ikkunasta. Paste-komento sijoittaa leiketaululta siellä merkittynä olevan alueen editointi-ikkunaan kursorin osoittamaan paikkaan.

 

 

 

Kuva 12. Katseluvalikko (View)

 

Kuvan 12 katseluvalikon kohdasta Code Edit näkyy sovelluksen luoma koodi. Valitsemalla kohdan Parsetup Configuration pääsee jälleen editoimaan PARSETUP-ohjelman parametreja.

 

 

 

 

 

 

Kuva 13. Muunnavalikko (Convert).

 

Valitsemalla Kuvan 13 muunnavalikosta kohdan Picture to Code käyttäjän graafisesti luoma sekvenssi generoidaan koodiksi, joka on näkyvissä SequenceEdit ikkunan (ks. kuva 9) takana. Vastaavasti komento Code to Picture esittää koodin graafisessa muodossa.

 

Kuva 14. Lisäysvalikko (Insert).

Kuvan 14 lisäysvalikosta (Insert) voi valita sekvenssiin lisättävän komponentin. Valitsemalla pulssin (Pulse) avautuu pulssidialogi, jossa käyttäjältä kysytään tarkempia tietoja sekvenssiin lisättävistä objekteista. Pulssidialogista kerrotaan lisää myöhemmin luvussa 6.2.2. Lisäksi on mahdollista lisätä kommentteja valitsemalla kohdan Comment.

 

Kuva 15. Ikkunavalikko (Window).

Kuvan 15 ikkunavalikon Tile-komento asettaa kaikki ikkunat rinnakkain näkyviin. Valitsemalla Cascade-komennon ikkunat sijoittuvat lomittain toistensa päälle.

Kuva 16. Opastusvalikko (Help).

 

Valitsemalla Kuvan 16 opastusvalikosta Help-kohdan saat ohjelman käyttöohjeen hypertekstimuodossa. Avustus on tehty HTML-kuvauskielellä, joten se voidaan lukea esim. Netscapella. Käyttöohje on kirjoitettu englanniksi ja se on liitetty myös projektikansioon. About-komennolla avautuu about-dialogi, josta näkyy mm. ohjelman versio numero ja tiedot tekijöistä.

 

 

6.2.2 Pulssidialogi

 

Käyttäjä pääsee muokkaamaan valittua pulssia tai luomaan uuden pulssin Kuvan 10 Pulssidialogin avulla. Uuden pulssin voi luoda valitsemalla sekvenssi-ikkunan (Kuva 9) lisäysvalikosta kohdan pulse tai painamalla Insert Pulse -painiketta. Valmista pulssia pääsee editoimaan kaksoisnäpäyttämällä pulssia.

 

Kuva 16. Pulssidialogi (Pulse Configuration).

 

Pulssidialogissa käyttäjällä on mahdollisuus valita kuvassa esitettävän pulssin pituus (Pulse Length on Screen) sekä pulssin korkeus (Pulse Height on Screen) kyseiselle pulssille. Nämä valinnat eivät millään tavalla vaikuta koodin sisältöön, vaan muuttavat pulssin piirtämiseen liittyviä parametreja.

 

Dialogissa valitaan myös kanavat (ks. luku 2.2), joille pulssi sijoitetaan. Lisäksi käyttäjä voi määrätä gradienttipulssien muodot (Normal, Second, Third) ja sen piirretäänkö pulssi "negatiivisena" (Negative?) (ks. kuva 9).

 

Kun piirrettävä pulssielementti on valittu, dialogissa on mahdollisuus valita perusrungoista, joiden mukaan pulssit luodaan. Nämä koodin pätkät saadaan näkyviin Select Default Code-listaan näpäyttämällä haluttua vaihtoehtoa. Lisäksi näpäyttämällä UpdateCode-painiketta päästään valitsemaan ennalta määrättyjä muuttujia, jotka korvaavat $-merkillä alkavat sanat kyseisessä perusrungossa. Tällöin avautuvat kuvien 17 ja 18 ikkunat:

 

 

 

 

Kuva 17. Listan valintaikkuna (Choose List).

 

Käyttäjä voi valita Kuvan 17 alasvetovalikosta haluamansa listan $LIST-sanan paikalle. $GRADIENTS-sana korvautuu automaattisesti Kuvan 16 Pulssidialogissa määriteltyjen kanavien mukaan.

 

Kuva 18. Matriisin valintaikkuna (Choose Matrix).

 

Käyttäjä voi valita Kuvan 18 alasvetovalikosta haluamansa matriisin $MATRIX-sanan paikalle.

 

7. Ylläpitäjän tarvitsemat tiedot ja ohjeet

 

Ohjelman ylläpito hoituu pitämällä ohjelman tarvitsemat dat-tarkenteiset tiedostot ajantasalla. Tässä luvussa kuvataan kyseisiä tiedostoja tarkemmin.

 

  1. Konfigurointitiedosto

 

Tiedosto Config.dat sisältää absoluuttisen polun, jonka takaa löytyy tarvittavat include-tiedostot.

Tiedoston sisältö voi olla esimerkiksi

c:\ohjelma\includet\

  1. RF-pulssitiedosto

 

Tiedosto Pics.dat sisältää listan käytössä olevista kuvista rf-pulsseille seuraavassa muodossa:

 

<pulssin_tiedosto> <sijainti> <pulssin kuvaus>

 

pulssin_tiedosto ilmoittaa tiedoston nimen, jossa kyseinen kuva on. Pulssien pitää olla bmp-

muodossa ja piirrettynä kahdella värillä. Kuvien koko saa periaatteessa olla mikä tahansa,

mutta mallikuvat on piirretty kokoon 184x190 pikseliä. Pulssikuvien täytyy sijaita samassa

hakemistossa ohjelman kanssa.

 

 

sijainti tulee olla jokin seuraavista sanoista:

BOTTOM Pulssi piirretään ruudulle kuvan alareuna kanava viivalle (ks. Kuva 9).

CENTER Pulssi piirretään ruudulle kuvan keskikohta kanava viivalle (ks. Kuva 9).

TOP Pulssi piirretään ruudulle kuvan yläreuna kanava viivalle (ks. Kuva 9).

 

<pulssin kuvaus> ilmoittaa pulssin kuvauksen, jonka käyttäjä saa valitessaan RF-pulssia Kuvan 16 Pulssidialogista.

 

Tähtimerkillä (*) aloitetut rivit tulkitaan kommenteiksi.

 

Tiedoston sisältö voi olla esimerkiksi

rfpulse.bmp BOTTOM Hieno RF-pulssin kuva

 

  1. Parametrilistaeditorin konfigurointitiedosto

 

Tiedostossa Parsetup.dat määritellään tarvittavat PARSETUP-komponentit seuraavassa formaatissa:

 

<NIMI>, <parametri>, <parametri>,<parametri>, …

 

NIMI täytyy olla täsmälleen oikea PARSETUP-komponentin nimi. Nimet ja parametrit voidaan

tarkistaa SMIS-C-manuaaleista.

Parametreja on kolmea erilaista tyyppiä:

int, string ja variable.

 

int-tyypin parametrit määritellään muodossa:

 

int [nimi] [oletus] [min] [max]

 

jossa

nimi on int-muuttujan nimi,

oletus on oletusarvo,

min on minimi ja

max on maksimi.

Seuraavaksi annetaan esimerkki int-tyyppisen parametrin määrittelystä:

int min 0 0 100

 

string-tyypin parametrit määritellään muodossa:

 

string <oletus>

 

jossa oletus on oletusmerkkijono

Seuraavassa annetaan esimerkki string-tyyppisen parametrin määrittelystä:

string Slice offset frequency

 

variable-tyypin parametrit tulee määritellään muodossa:

 

variable <nimi>

 

jossa nimi on muuttujan nimi.

Seuraavassa annetaan esimerkki variable-tyyppisen parametrin määrittelystä:

variable var_name

 

Pilkkua ei voi käyttää merkkijonoissa!

Tähtimerkillä (*) aloitetut rivit käsitellään kommentteina.

 

Seuraavaksi annetaan esimerkki kokonaisesta PARSETUP-komponentista:

EDITTEXT, string Slice offset frequency, string Hz, string %i, int min 0 0 32768, int max 0 32768 32768, int default 0 0 1, int scale 0 0 1, variable fov_slice_freq

 

Rfdefs.dat-, Rfgrdefs.dat-, Graddefs.dat- ja Other.dat-tiedostot ovat muodoltaan samanlaisia ja ne sisältävät oletuskoodit seuraaville tapauksille:

 

7.4 Pulssien perusrunkojen määrittelemiseen tarvittavat tiedostot

 

Seuraavat tiedostot sisältävät kanavayhdistelmien oletuskoodit.

 

Rfdefs.dat pelkästään RF-kanava on päällä.

Rfgrdefs.dat sekä RF-kanava että vähintään yksi Gradientti-kanava on päällä.

Graddefs.dat Yksi tai useampi Gradientti-kanava on päällä.

Other.dat mikään kanava ei ole päällä.

 

Tiedostoihin kirjoitetaan koodit aivan normaalisti seuraavin poikkeuksin:

 

- Eri koodivaihtoehdot erotetaan toisistaan tyhjällä rivillä, jonka alussa on pelkkä #-merkki

- Koodien ensimmäinen rivi on ns. otsikkorivi, joka tulee comboboxiin, eikä liity varsinaisesti koodiin.

- Tähtialkuiset (*) rivit käsitellään kommentteina.

 

Valmiiseen oletuskoodiin voi sijoittaa seuraavia erikoismuuttujia:

$MATRIX korvataan halutulla matriisilla sekvenssin luontivaiheessa.

$GRADIENTS korvataan listalla päällä olevista gradienttipulssikanavista.

$LIST korvataan valitulla listalla.

 

Seuraavissa koodinpätkissä on esitetty esimerkit oletuskoodeista pelkästään rf-kanavan ollessa päällä:

 

RF pulse only, choice one

MR3040_SelectMatrix(gauss_mat);

MR3040_Start($GRADIENTS);

delay(tramp,us);

delay(gauss_spoil,ms);

MR3040_CONTINUE($GRADIENTS);

delay(tramp,us);

#

 

RF pulse only, choice two

MR3040_SetList( $LIST, $GRADIENTS);

MR3040_SelectMatrix(loc1_mat);

MR3040_Start($GRADIENTS);

delay(tramp,us);

rfampon(0);

delay(warmup,us);

rfon(obs_mod_level*p90_1_on);

MR3031_setup(pf1,"5lobe_sinc_6KHz",0,0,0,p90_amp);

MR3031_go();

delay(tsel,us);

rfoff();

MR3040_CONTINUE($GRADIENTS);

delay(tramp,us);

delay(teextend,us);

 

7.5 Koodin tunnistamiseen tarvittava tiedosto

 

Tiedostossa funcmac.dat määritellään tarvittavat funktiot ja makrot seuraavassa formaatissa:

 

{ <"nimi"> , <sulut> , <arg_luk> , <"pt_merk"> , <ajoitus> }

jossa

"nimi" on funktion tai makron nimi. Nimen tulee olla lainausmerkkien sisällä. Nimi ei saa

sisältää tyhjiä merkkejä (eli tabulaattoreita tai välilyöntejä).

sulut on arvoltaan joko nolla (0) tai yksi (1). Arvo nolla tarkoittaa, että argumentit eivät

ole sulkujen sisällä. Arvo yksi taas tarkoittaa, että argumentit ovat sulkujen sisällä.

arg_luku on kokonaislukuarvo, joka määrittää argumenttien lukumäärän.

"pt_merk" on merkkijono, joka sisältää ne merkit, jotka voivat lopettaa funktion määrityksen

ajoitus on funktion tai makron viemä kokonaisaika mikrosekunteina (ajalla ei ole vielä

ohjelmassa mitään merkitystä, joten arvoksi voi laittaa 0.0)

 

Kaikki rivit, jotka ovat eivät ole ylläolevan formaatin mukaisia jätetään käsittelemättä.

Seuraavassa annetaan muutama esimerkkirivi:

 

1) Jotta ohjelma tunnistaisi makron:

MACRO(arg1,arg2,arg3)

tulee kirjoittaa dat-tiedostoon rivi:

{ "MACRO" , 1 , 3 , "" , 0.0 }

 

2) Jotta ohjelma tunnistaisi funktion:

function(arg1,arg2,arg3,arg4,arg5);

tulee kirjoittaa dat-tiedostoon rivi:

{ "function" , 1 , 5 , ";" , 0.0 }

 

3) Jotta ohjelma tunnistaisi makron:

MACRO arg1,arg2

tulee kirjoittaa dat-tiedostoon rivi:

{ "MACRO" , 0 , 2 , "" , 0.0 }

 

8. Testaus ja tulokset

 

Ohjelmaa on testattu jatkuvasti projektiryhmäläisten toimesta. Ohjelman tultua alustavaan käyttökuntoon testaamista ovat tehneet myös A.I.Virtanen -instituuttin edustajat sekä Jukka-Pekka Santanen. Ohjelmaa on kehitetty ja korjailtu testaamisessa ilmenneiden ideoiden mukaan. Näin ohjelmasta onkin kehittynyt täysin virheetön ja toimiva J

 

 

9. Sovelluksen kaatuminen

 

Sovelluksen pitäisi pysyä pystyssä joka tilanteessa. dat-tarkenteisten tiedostojen puuttuessakin ohjelma toimii, mutta ei järkevästi, koska ohjelman kaikki osaaminen perustuu dat-tarkenteisiin tiedostoihin.

 

 

10. Projektiryhmä ja työnjako

 

Seuraavassa esitellään ryhmän sisäinen työnjako.

 

Sami Kärkkäinen

Opastus, dokumentointi sekä projektiin liittyviä erillisiä töitä.

 

Tommi Lahtonen

Käyttöliittymä ja dokumentointi.

 

Marko Minkkinen

Tiedon varastointi ja dokumentointi.

 

 

11. Tavoitteiden toteutuminen

 

Lopullisesta versiosta tuli monipuolisempi kuin tietyssä vaiheessa uskalsi odottaakaan. Esisuunnitelmaan verrattuna oikeastaan vain kaksi selvää muutosta tuli :

 

- Parametrilistasta ja pulssidialogeista tuli odotettua paljon monipuolisempia.

- Ajastusikkunassa hoidettavien ajastuslaskutoimitusten lisääminen koodin sekaan jäi lopulta kokonaan pois.

 

Muuten tavoitteet ovat toteutuneet, tosin vähän eri muodossa.

 

12. Projektin todellinen aikataulu

 

Suunnitelman mukaan projektin piti olla valmis jo viikolla 17. Projekti saatetaan lopulliseen muotoonsa kuitenkin vasta viikolla 24 ja tämäkin päätös tehtiin projektin ohjaajan Jukka-Pekka Santasen sekä ryhmän välillä. Syynä tähän oli toimeksiantajan passiivisuus: projekti oli jo muutenkin alkanut venyä kun Kuopiosta ryhmä ei saanut mitään kommentteja.

 

12.1 Projektin viikottainen aikataulu

Seuraavassa on esitetty projektin etenemisen viikottainen aikataulu. Se on esitetty samaan tapaan kuin esisuunnitelmassa, jotta niitä voitaisiin vertailla keskenään. Huomio kiinnittyy erityisesti koodaamisen paljouteen. Tästä syystä myös kommentointi jäi varsin myöhäiseen vaiheeseen, vaikka hyvän tavan mukaisesti se olisi suoritettava koodaamisen yhteydessä.

 

 

Viikko 4 Aiheen saaminen ja aiheiseen tutustuminen

 

Viikko 5 Lisäaineistoon tutustuminen, esisuunnittelua.

 

Viikko 6 Esisuunnitelman raakakopio valmis sekä Kuopion matka.

 

Viikko 7 Esisuunnitelma valmis.

 

Viikko 8 Koodausta.

 

Viikko 9 Koodausta.

 

Viikko 10 Koodausta.

 

Viikko 11 Koodausta.

 

Viikko 12 Koodausta.

 

Viikko 13 Koodausta.

 

Viikko 14 Koodausta.

 

Viikko 15 Koodausta ja opponointitilaisuus.

 

Viikko 16 Koodausta.

 

Viikko 17 Koodausta ja Kuopion matka.

 

Viikko 18 Koodausta sekä dokumentointia.

 

Viikko 19 Koodausta sekä dokumentointia.

 

Viikko 20 Koodausta, dokumentointia sekä projektien loppuesittely.

Viikko 21 Koodausta sekä dokumentointia.

 

Viikko 22 Koodausta sekä dokumentointia..

 

Viikko 23 Koodausta sekä dokumentointia ( ja toivon mukaan jo valmis ).

12.2 Projektilaisten henkilökohtainen ajankäyttö

 

Seuraavassa on esitetty graafisesti projektilaisten päivittäinen henkilökohtainen ajankäyttö.

 

Kuva 19. Samin henkilökohtainen ajankäyttögraafi (Tunteja yhteensä 331, 5).

 

 

Kuva 20. Tommin henkilökohtainen ajankäyttögraafi (Tunteja yhteensä 301).

 

 

 

 

Kuva 21. Markon henkilökohtainen ajankäyttögraafi (Tunteja yhteensä 352).

 

 

 

13. Vastaantulleet ongelmat ja niiden ratkaiseminen

 

SMIS-C ja sillä toteutetut pulssisekvenssit olivat aluksi täyttä hepreaa. Suuri määrä sekavia makroja, outoja funktioita, huono dokumentointi ja yleinen tietämättömyytemme koko magneettikuvauksesta aiheutti alussa paljon harmia. Jatkuvasti asiaan paneutumalla ja yrittämällä ja erehtymällä opimme kuitenkin koko ajan lisää .J

 

C++-Builder aiheutti pienoisia ongelmia. C++-Builder oli kaikille aivan outo ja aluksi menikin paljon aikaa pelkästään sen käyttämisen opetteluun. Jatkossa ohjelmointia hidasti C++-Builderin huono dokumentointi ja lastentaudit. Projektiryhmän omalla koneella projektimme kääntyi aivan kiltisti ja nopeasti. Pienien muutosten jälkeen C++-Builder käänsi vain muuttuneen tiedoston uudelleen ja jos muutoksia ei tehty niin käynnisti sovelluksen suoraan. Kotikoneilla täsmälleen sama koodi ja projekti kääntyi joka kokeilukerralla täysin uudelleen riippumatta siitä, oliko koodiin tehty muutoksia tai ei. Lisäksi joka käynnistyskerralla joutui odottamaan minuutteja. Ratkaisua tähän omituisuuteen emme keksineet.

 

Ohjelmamme antamista muiden testattavaksi on häirinnyt sovelluksen tuntemattomat vaatimukset laitteessa olevien kirjastojen suhteen. Missään dokumentaatioissa ei mainita mitä DLL-kirjastoja sovelluksen mukaan pitäisi antaa, jotta sen toiminta olisi varmaa muissa sellaisissa laitteissa, joihin ei ole asennettu C++-Builderia. Kokeilemalla selvitimme tarvittavat kirjastot, joten nyt ohjelmamme pitäisi toimia joka laitteessa, joista löytyy Windows 95 tai Windows NT. Windows 3.1:n alaisuudessa ohjelmamme toimivuutta ei ole päästy kokeilemaan.

 

Tällä hetkellä pahin ongelma on tekemämme pienen HTML-lukijan toimimaan saaminen. Laitteissa, joihin ei ole asennettu C++-Builderia avustuksemme, ei tällä hetkellä toimi. Käyttäjä saa vain ilmoituksen jossa, kerrotaan että "class is not registered". Ongelmaa on tutkittu ja apua haettu Borlandin WWW-palvelimelta ja uutisryhmistä, mutta ratkaisua ei ole vielä löytynyt.

 

14. Ohjelman edelleen kehittäminen

 

Projektin jatkokehittelystä on ollut puhetta A. I. Virtanen -instituutin kanssa. Toistaiseksi tarkempaa ajankohtaa ei olla sovittu, mutta kehitystyö siirtyy ainakin kesän yli ryhmän jäsenten lupauduttua töihin toisaalle. Projektista olisi kenties mahdollista tehdä myös erikoistyö.

 

Mahdollisia kehityskohteita ja lisäyksiä sovellukseen olisivat mm. seuraavat:

 

- Valmiin SMIS-C-koodin lukeminen sekä konvertoiminen graafiseen muotoon.

- Koodin koko rakenteen esittäminen graafisesti. Ohjelman rakenteellisia osia olisivat mm. alkukommentit (sisältää mm. ohjelman toiminnan kuvauksen) , use-lausekkeet, PARSETUP-osuus, muuttujien määrittely, include-lausekkeet, alustuslaskenta, listojen määritys, silmukkarakenne, silmukan sisäinen alustuslaskenta, matriisien määrittely (silmukan sisällä), sekvenssiosuus (silmukan sisällä).

- Graafisesta esityksestä haluttua ohjelman rakenneosaa klikkaamalla pääsisi editoimaan koodin kyseessä olevaa osaa tekstieditoriin (tai vaihtoehtoisesti graafiseen editoriin).

- Pulssien koodista tunnistamisen muuttaminen automaattiseksi.

- Gradienttipulssien muodon automaattinen tunnistaminen koodista.

- Pulssiin liittyvien laskutoimitusten tunnistaminen koodista. Tällöin kaikki pulssiin liittyvät laskutoimitukset ja määritykset poistuisivat koodista pulssin poistamisen yhteydessä (ellei myös joku toinen pulssi käytä kyseisiä laskutoimituksia).

- Ajatuslaskutoimitusten esittäminen erillisessä ajastusdialogissa sekä lisääminen koodin sekaan.

 

 

15. Mitä opimme?

 

Opintojakson tarkoituksena oli nimenomaan oppia projektityöskentelyä, toimimaan ryhmässä, tehdä itsenäistä työtä ja suunnitella työnjakoja. Projekti on varsin laaja, eikä sitä ole mahdollista suorittaa, ellei jokainen ryhmän jäsen omaa edes jotakin edellämainituista taidoista.

 

Kenties sovelluksen suunnitteluun olisi kannattanut kiinnittää enemmän huomiota. Ongelmia tuotti kuitenkin toimeksiantajan tietynasteinen "sinisilmäisyys" eli tehtävästä annettiin liian helponoloinen kuva. Esisuunnitelmasta tuli varsin monipuolinen ja joistakin asioista jouduttiin loppujen lopuksi tinkimään. Osaksi tämä johtui mahdollisesti juuri epästandardista SMIS-C-koodista. Kukaan ei oikein toimeksiantajan puolelta ollut halukas tulemaan projektikokouksiin. Vaikka esisuunnitelman tärkeyttä pyritään painottamaan, ei varmaan ole olemassa täydellistä suunnitelmaa, jota ei tarvitsisi jälkeenpäin muutella.

 

Opimme myös hankkimaan tietoja kirjastoista, kavereilta, ohjaajilta sekä kyselemällä. Myös sähköpostin käyttökelpoisuus tuli projektin aikana hyvin esille. Pystyimme lähettämään projektipalaverissa sekä myös viikon varrella esiintulleita kysymyksiä ja myös vastauksia saatiin (tosin aika nihkeästi Kuopiosta). AIVO-postituslistan avulla kommunikointi sujui kaikkien projektiin liittyvien henkilöiden välillä, nimenomaan Jyväskylässä.

 

Harjaannuimme myös dokumennoinnin tekijöinä ja tätä kautta tietotekniikkaan liittyvä englanninkielinen sanasto tuli vähintään nyt tutuksi.

 

16. Projektilaisten mielipiteita

Seuraavassa ryhmän jäsenet kertovat projektin jälkeisistä tunnelmistaan.

 

16.1 Sami Kärkkäinen

 

Henkilökohtaisesti projekti muodostui hyvin opettavaiseksi kokemukseksi ihan kokonaisuutena ajatellen. Uutta ei ollut pelkästään käyttämäni työkalut, kuten Borlandin C++-Builder sekä Delphi 2.0. Uusia asioita olivat myös käyttöliittymän rakentaminen, suunnitteleminen, dokumentointi, ongelmien ratkaiseminen ja WWW:n apuna käyttäminen, eli oikeastaan lähes kaikki.

 

Lisäksi kokemusta tiimin jäsenenä ei voi unohtaa. Yhteistyö varsinkin Jyväskylässä kaikkien osapuolten välillä sujui varsin ongelmitta. Ehkä toimeksiantaja olisi voinut olla vähän aktiivisempi. Ryhmän sisäinen kemia toimi ja myös työympäristö oli miellyttävä.

 

Vaikkakin tietyssä vaiheessa epätoivo sai melkein otteen, niin toivottavasti sillä oli vain sitkistävä vaikutus. Ongelmia tuottanut SMIS-C-koodi vaikeutti projektin etenemistä, tavallaan edettiin sen "ehdoilla". Ehkä pienoisena pahana jälkimakuna voisi sanoa, että ohjelman edelleenkehittämiseen ei ollut aikaa.

 

16.2 Tommi Lahtonen

 

Projekti oli kokonaisuutena hyvin raskas. Alussa meni hirveän kauan aikaa siihen, että pääsi yleensä jyvälle, mitä pitäisi tehdä. Tehtävän koko laajuus rupesi sekin vasta ajanmyötä valkenemaan. Toimeksiantajan tuki oli aluksi ihan kohtuullista, mutta paremmin tuettuna ohjelman tekomme olisi edistynyt huomattavasti nopeammin. Loppuaikana toimeksiantajasta ei ole ollut juurikaan apua.

 

Ryhmän henki on ollut koko ajan ihan hyvä. Ryhmäläisten välillä oli ehkä hieman liian suuria eroja osaamisessa, mutta jokaiselle löytyi kyllä enemmänkin kuin tarpeeksi tehtävää.

 

Projektin aikana opin paljon lisää Windows-ohjelmoinnin metkuista ja varsinkin käyttämästäni työkalusta Borlandin C++-Builderista. SMIS-C tuli tutuksi varoittavana esimerkkinä siitä, kuinka surkeasti asioita voidaan suunnitella.

 

 

 

16.3 Marko Minkkinen

 

Omalta osaltani projektimuotoinen työskentely toi mukanaan paljon uutta: ohjelmointityöskentelyn ryhmässä, dokumentoinnin, palaverien pitämisen ja ajankäytön tarkkailun. Myös ohjelmointityökalut olivat uusia. Vaikka omasin paljon ohjelmointikokemusta C-kielellä, en ollut koskaan aiemmin ohjelmoinut C++:lla. Projektin edetessä olio-ohjelmoinnin salat alkoivat kuitenkin selkiytyä ja myös C++-Builderin käyttö alkoi luistaa.

 

Projektin alku oli mielestäni todella sekava. Vaikka saimme esisuunnitelman mukavasti tehtyä, en itse ainakaan henkilökohtaisesti vielä ymmärtänyt, mikä työ meitä tulisi odottamaan. Noin kahden kuukauden kuluttua ongelman laajuus alkoi hahmottua ja siinä vaiheessa alkoi tuntua siltä, että projektin osalta kannattaisi lyödä hanskat naulaan.

 

Koska osakseni oli langennut tiedon varastoinnin suunnittelu ja toteutus, jouduin rakentamaan C++-luokat, jotka kykenevät tunnistamaan koodista kaikki merkitsevät osat: kommentit, muuttujat, makrot ja funktiot. Luokkien piti myös pystyä käsittelemään funktioiden ja makrojen argumentteja sekä muuttujien arvoja ja määrittelyjä. Luokkien ohjelmointi vei todella paljon aikaa, koska koodin analysointi ei ole niitä kaikkein yksinkertaisimpia hommia. Ongelmia oli todella paljon. Lopullisesti tiedon varastointi oli valmis vasta toukokuun alkupuolella.

 

Jos projektin aihe olisi ollut niin yksinkertainen kuin mitä alussa luulimme, olisimme mielestäni pystyneet toteuttamaan ohjelman paljon pienemmällä työmäärällä. Olisihan ollut helppo toteuttaa ohjelma, joka lisäisi tiettyyn kohtaan ohjelmaan vain ennalta määrättyjä koodin pätkiä. Jos ohjelma olisi toteutettu edellä mainitulla tavalla, mm. sekvensseihin liittyvät laskentaosuudet, matriisit ja pulssin listojen määritykset olisivat jääneet kokonaan huomiotta. Tämä ei kuitenkaan ollut tilaajapuolella tarkoituksena, vaan pulssien käsittelyn piti ulottua myös eri puolille koodia. Näin projekti laajeni todella paljon ja mielestäni levisi tämän johdosta hiukan liikaa.

 

Kaiken kaikkiaan olen tyytyväinen projektin lopputulokseen. Ainoa asia, joka projektista jäi harmittamaan oli se, että aina kun jouduimme esittelemään ohjelmaamme, emme olleet oikein vielä valmiita. Opponointiesittelyssä ohjelmamme ei toiminut lainkaan ja loppuesittelyyn saimme ohjelman toimimaan ainoastaan rajun loppurutistuksen ansiosta. Viimeistelimme ohjelman lopullisesti vasta edellisenä iltana. Ajan niukkuuden vuoksi emme ehtineet valmistella esityksiä lainkaan, joka heijastui suoraan esityksiin.

 

17. Lähdeluettelo

 

Ari Becks: Delphi - Sovelluksen tekijän opas. Suomen Atk-kustannus OY, 1995.

Borland: Object Windows Programmer’s Guide. Borland, 1996.

Borland: Object Windows Reference. Borland, 1996.

Borland: WWW-sivut: http://www.borland.com/. Borland, 1997.

Kernighan & Richie: The C programming language - ANSI C. Prentice Hall Software Series, 1988.

Lappalainen, Vesa: Olio-ohjelmointi ja C++. Jyväskylän yliopisto, 1996.

Lappalainen, Vesa: Windows-ohjelmointi C-kielellä. Jyväskylän yliopisto, 1993.

Lappalainen, Vesa: Ohjelmointi++ osat 1-3. Jyväskylän yliopisto, 1997

Lippman, Stanley B.: C++ Primer. Addison Wesley Publishing company, 1995

Petzold & Yao: Programming Windows 95. Microsoft Press, 1996

SMIS: NMR Pulse Sequense Development Manual. SMIS, 1995.

SMIS: Pulse Sequence Writing Guide and Application Notes. SMIS, 1995.

Schild, Hans H.: MRI made easy. Schering AG, 1990.