A rendszerterv a program felépítésérõl ad felvilágosítást. Ezen belül is a program tevékenységei alapján való modulokra bontást írja le, illetve az egyes modulok által nyújtott szolgáltatásokat, eljárásokat. Az eljárások leírása tartalmazza a szükséges algoritmusokat. Külön szakasz tartalmazza a globálisan használt adatszerkezeteket. A rendszertervben kapott helyet a program felhasználói felületének részletesebb leírása is.
Budapest, 1995. április 7.
Bechtold Ferenc, Kiss László, Pintyõke Gábor
Ez az adatszerkezet leírja az egész molekulát az összes adatával, a szerkezetre, milyenségre, megjelenítésre vonatkozólag. Ezek az adatok a következõk:
Az elsõ három egyegy természetes szám. A többiek újabb alstruktúrák, azaz újabb adatszerkezetek. Az atomok és élek egy-egy olyan vektor, amely a 2. illetve 3. pontban leírt adatszerkezetekbõl épül fel.
Egy atomot a következõ adatok írnak le:
Az atom vegyjele egy maximum két betûbõl álló vektor. A koordináták természetes számok, akárcsak az utána következõk.
Egy kötést a következõ adatok írnak le:
Ez a vektor atomindexeket tartalmaz. Erre az atom
adatszerkezet hivatkozik úgy, hogy megadja az elsõ
szomszédjának indexét, és azt, hogy
innentõl kezdve még hány darab a szomszédja.
Ez a vektor kötésindexeket tartalmaz.
Erre az atom adatszerkezet hivatkozik úgy, hogy megadja
az elsõ kötésének indexét, és
azt, hogy innentõl kezdve még hány darab
kötése van.
Az elsõ három természetes szám.
A többiek újabb alstruktúrák, azaz újabb
adatszerkezetek. Az atomok és élek egy-egy olyan
vektor, amely a 2. illetve 3. pontban leírt adatszerkezetekbõl
épül fel.
Az atom-, kötés- és szimmetriaosztályszám természetes számok. Az atomok és a kötések a fájlban leírt szerkezethez hasonlóak. Ez egy vektor, amelyben olyan rekordok vannak, amelyek komponensei egy-egy kötést írnak le az alábbi módon: a kötésben résztvevõ atomok sorszámai, kötéshosszok, kötések vízszintessel bezárt szögei.
A Specifikáció 4. oldal II. 3. a.) pontja szerint.
A programot annak tevékenységei szerint modulokra bonthatjuk fel. A modulok egymásnak szolgáltatásokat nyújtanak, így a modulok az I. pontban leírt adatszerkezeteken keresztül kommunikálnak.
A gyûjtemény modul a többiek által használt eljárásokat tartalmazza.
A bevitel modul tulajdonképpen két további modulra bomlik. Az egyik a tényleges felhasználói felület (ami rendszerfüggõ), a másik pedig a molekula-adatszerkezet kitöltésére alkalmas az elõbbi modul által bekért adatok alapján.
A feldolgozó modul szintén két további részre bomlik, a komponens leválasztóra és a szög- és hosszszámítóra. A szög- és hosszszámító egység az adatbázisból azonosítja a szerkezetet, a komponenseket megfelelõ helyzetbe állítja, polárkoordinátákat számít. Ezek a korábban leírt molekula-adatszerkezet további mezõit töltik ki.
A kirajzoló modul kiszámítja a Descartes-koordinátákat, az ablak méretéhez igazítja a rajzot, ellenõrzi az ütközéseket, valamint kirajzolja a molekulát a képernyõre.
Az adatbázis-készítõ segédprogram használja a fõprogram adatbázis-kezelõ modulját. Ez a modul a szövegfájlokból képes elkészíteni az adatbázist, és a kért adatokat kikeresni az adatbázisból.
A fájlkezelõ modul a már kiigazított, helyesen kirajzolt ábra molekula-adatszerkezetét menti egy külsõ állományba, amely késõbbiek során a felhasználói felület felhasználhat, mint bevitt adatot.
A fõprogram tehát a felhasználói felület moduljának segítségével kitölt egy molekula-adatszerkezetet. Ezt a feldolgozó modul további bejegyzésekkel egészíti ki, amelynek felhasználásával a kirajzoló modul elkészíti az ábrát. A kész kép molekula-adatszerkezete fájlba menthetõ, illetve a bevitel modulnak átadható további módosításra.
Az adatbáziskezelõ modul a feldolgozó modul által átadott komponens adatszerkezetet egészíti ki a kötéshosszra és kötésszögre vonatkozó bejegyzésekkel. Az így kapott komponens adatszerkezetet adja vissza a feldolgozó modulnak.
Ez a modul olyan általános eljárásokat tartalmaz, amelyeket a program több modulja is használ.
Az eljárás feladata egy komponensrõl elkészíteni egy olyan számozást, amely nagy mértékben megkönnyíti egy komponens azonosítását.
Az eljárás egyaránt használandó a molekula komponenseire és az adatbázis létrehozásakor a szövegfájlokban adott komponensekre. Ezért tulajdonképpen két eljárást kell megvalósítani: a fájlkomponensbõl komponens adatszerkezetet készítõ eljárást és a lentebb leírt algoritmust végrehajtót.
Az algoritmus eredményeképpen az atomokat szimmetriaosztályokba soroljuk. Az atomok szimmetriaosztályok szerint így sorszámokat kapnak.
Ez az eljárás a felhasználó által megadott nevû állományba menti a kirajzoláskor kitöltött molekula-adatszerkezetet. Az állomány nevet a felhasználói felület szolgáltatja.
A megadott nevû fájlból beolvas egy molekula-adatszerkezetet, ha az megfelelõ formátumú, majd a kirajzoló modulnak átadja, amely megjeleníti és továbbítja az adatszerkezetet a bevitel modulnak módosításra. Ez tulajdonképpen annak a lehetõségnek a kibõvítése, hogy a kirajzolás után tovább alakítható, rajzolható a molekula.
A molekula megadásának általános elve a Specifikáció 5. oldalának III. pontjában olvasható.
Az ablak négy részre osztható:
A címmezõ a szokásos módon a program nevét tartalmazza, illetve a rendszermenüt, és a minimalizáló gombot. Az ablak nem tartalmaz maximalizáló gombot, mivel az ablak alapértelmezésben maximalizálva jelenik meg, mérete és helye pedig nem változtatható.
A menüben egyszerre csak egy pont választható ki. A kiválasztott menüpont elõtt jel szerepel. A kiválasztott tevékenység neve a menü alatti sorban is látható lesz. Induláskor a Vázmegadás tevékenység kiválasztott, más nem választható az elsõ szerkezeti egység megadásáig. Ha egy fájlt megnyitunk, akkor is megszûnik ez a korlátozás.
A menübõl a leggyakrabban használt atomok választhatók ki (Oxigén, Hidrogén, Nitrogén, stb. ). A Más atom menüpont egy párbeszédablak megnyitásával lehetõvé teszi a fel nem sorolt atomok használatát is.
A kötéstípusmegadáshoz itt választhatjuk ki a megfelelõ fajtát.
Ez a sor ugyan csökkenti a kirajzoláshoz használható területet, de kényelmesebbé teszi a bevitelt.
Ebben a sorban megjelenik az éppen használt tevékenység neve.
Megjelenik még két elõugró lista is. Ezek segítségével menümegnyitás nélkül változtatható a használandó kötéstípus illetve atomtípus, és ugyanakkor a megadás során is látható, hogy éppen melyik típus van kiválasztva.
Ezen a területen történik a molekula bevitele, majd annak kirajzolása is. A tevékenységeket a fentebb leírt menük szerint választhatjuk.
A típus kiválasztása után kell az atomot reprezentáló pont közelében kattintani az egérrel.
A típus kiválasztása után kell a kötésben résztvevõ atomokat reprezentáló pontok közelében kattintani az egérrel egyikre a bal, a másikra a jobb füllel.
Az atom és kötéstörlések tulajdonképpen egy-egy speciális, üres típus megadását jelentik, ezért végrehajtásuk is ugyanúgy történik, mint más típusok esetében.
A megadást követõen megjelenik a molekula képe, ha valóban egyetlen molekulát adtunk meg és annak minden komponense megtalálható volt az adatbázisban.
Ütközés esetén párbeszéd ablakban kapunk figyelmeztetést.
Az atomokat vegyjelükkel szemléltetjük, kivéve a szenet, amelyet egy címke nélküli pont jelképez.
A kötések típusát különbözõ vonalak jelzik.
Az eljárás azt vizsgálja, hogy a felhasználó egyetlen molekulát adott-e meg.
Ezt egy gráfbejáró algoritmus valósítja meg, amely akkor tekinti nem megfelelõnek a felhasználó által bevitt adatot, ha a bejárás nem érinti az összes atomot.
Ez az eljárás a felhasználói felület által bekért adatok alapján kitölti a molekula-adatszerkezet megfelelõ mezõit (atomtípusok, kötéstípusok, kötések, atomok).
Az eljárás feladata, hogy a felhasználó által megadott molekulában megkeresse annak komponenseit. Ezzel egy vektort tölt ki, melynek elemei komponens adatszerkezetek. A molekula-adatszerkezetbe bejegyzi a komponensszámot, illetve az egyes atom adatszerkezetekbe azt, hogy hányadik sorszámú komponensbe tartozik. Ez az eljárás határozza meg a fõkomponenst is (a Specifikáció 7. oldalának IV. 4. pontja szerint).
A komponensek leválasztása tulajdonképpen gráfon végzendõ maximálisan erõs komponensek megkeresését jelenti. Ehhez irányított gráfra van szükség. Az irányítást úgy végezzük el, hogy egy pontból kiindulva választunk egy élt, ezen átmegyünk a szomszédos csúcsra, és ezzel határozzuk meg az él irányát. A továbbiakban hasonlóképpen cselekszünk.
Az élek általunk vett irányítását feljegyezzük. Így egy élt (kötést) csak egyszer dolgozunk fel. A feldolgozás során feljegyezzük a komponensek fõ jellemzõit, erre a fõkomponens kiválasztásához van szükség.
Az eljárás a Specifikáció 8. oldalának IV. 5., 6., 7. pontjának megvalósítása.
Az eljárás alkalmas arra, hogy a Specifikáció 8. oldalának IV. 7. b.) pontját kielégítse. A feladatot egy rekurzívan megírt visszalépéses keresés végzi el.
A legnagyobb prioritású atomot elhelyezzük a neki megfelelõ szimmetriaosztályba sorolt, legnagyobb prioritású helyre. A többi atomot is hasonlóképpen helyezzük el csökkenõ prioritású sorrendben. Ha így nem címkézhetõ fel a szerkezet, akkor visszalépünk és eggyel magasabb szintrõl folytatjuk az illesztést. Visszalépésre kerül sor egyfajta kiosztás elkészülésekor is. Így megkapjuk az összes lehetséges kiosztást. Ezek közül a lexikografikusan legkisebb értékû lesz a keresett címkézés.
Az eljárás feladata, hogy a polárkoordinátákat átszámítsa Descartes-koordinátákká.
A koordináták, a szögek, kötéshosszok egész számok, ezért a szinusz függvényt egy táblázattal valósítjuk meg. Ebben a 0 és 90 közötti szögek szinuszainak 1000szeresei szerepelnek. (A 90 és 360 közötti szögek szinuszai csak elõjelekben különböznek; a koordináták a kapott értékek 1000ed részének egészrészei. )
A bejárás egyben egy maximum illetve minimum keresés is, amely megtalálja a legnagyobb illetve legkisebb ordinátákat és abszcisszákat.
Az eljárás kiszámítja a molekula atomjainak tényleges képernyõkoordinátáit.
Eredeti koordináták | y<0 | y>0 |
x<0 | x'=|a|-|x| ; y'=b+|y| | x'=|a|-|x| ; y'=b-y |
x>0 | x'=|a|+x ; y'=b+|y| | x'=|a|-x ; y'=b-y |
a, b az új origó eredeti koordinátái, x' és y' az új koordináták |
A kiszámított koordináták alapján az atomcímkék és a kötések kirajzolásra kerülnek a WindowsTM-hoz mellékelt függvények segítségével.
Az eljárás szerepe, hogy ellenõrizze az ütközéseket. Ütközés esetén értesíti a felhasználót.
A képernyõt nem diszjunkt tartományokra osztjuk fel. A kötésekrõl és atomokról tudjuk, hogy mely tartományokba esnek. Az ütközésvizsgálat a molekulaszerkezet elemeire csak a szomszédos tartományokban szükséges. Az ütközésvizsgálat koordinátageometriai feladatként kezelendõ.
Az adatbázis a komponensek azonosításának gyors megvalósítását teszi lehetõvé. Ehhez egy hashfüggvényt alkalmazunk.
Fájlbeli pozíció | Komponens adatok | Másik komponens helye | |
3400 | A komponens adatai | 0 | |
12408 | B komponens adatai | 24058 | |
12501 | C komponens adatai | 0 | |
22356 | D komponens adatai | 0 | |
24058 | E komponens adatai | 0 | |
... | ... | ... | |
Hash érték | Fájl pozíció | ||
0 | 12501 | ||
1 | 12408 | ||
2 | 0 | ||
3 | 22356 | ||
4 | 0 | ||
5 | 3400 | ||
... | ... |
Az adatbázist tartalmazó fájl két részbõl tevõdik össze. Az indextáblából és a komponensek leírásából. A hashfüggvény által a komponens jellegzetes adataiból (szimmetriaosztályszám, atomszám, élszám, szimmetriasztring) számolt érték az indextábla egy helyére mutat. Ezen a helyen egy fájlbeli pozíció található, ahol egy adott komponens adatai vannak elhelyezve, valamint egy másik fájlpozíció, illetve nulla, ha ehhez a hashfüggvény értékhez csak egy komponens tartozik a jelenlegi adatbázisban. Így az azonos hash értékekhez tartozó komponenseket egy listába fûzzük fel, melynek fejeleme az indextáblabeli érték.
Az eljárás egy üres adatbázist hoz létre. Ez azt jelenti, hogy egy fájlban elkészít egy rögzített nagyságú indextáblázatot, melyben minden fájlpozíció érték 0.
A Morgan" számozó eljárással elkészítjük a komponens atomjainak szimmetriaosztályozását. Ezek után kiszámítható a komponenshez tartozó hashfüggvényérték.
Ha az indextáblában ennél az értéknél 0 a fájlpozíció értéke, akkor a fájlhossz értéke kerül a helyébe, és erre a fájlpozícióra beírunk egy nullát (a következõ fájlpozíció értékét), illetve a szövegfájlban leírt komponens adatokat.
Ha az indextáblában a fájlpozíció nem nulla, akkor ez azt jelenti, hogy az adott hash-függvényértékhez több komponens is tartozik. Ekkor a fájlpozíción kell ellenõrizni a következõ komponens pozíciójának értékét:
Feladata a feldolgozó modul által lehasított komponens megfeleltetése egy adatbázisbeli társának. Ha nem talál azonosat, ekkor ezt a hibát továbbítja a feldolgozó modulnak.
A Morgan" számozó algoritmussal elkészítjük a szimmetriaosztályozást. Kiszámítjuk a hash függvényértéket. Az ehhez a pozícióhoz tartozó láncban lévõ komponensekkel kell az összehasonlítást elvégezni. Az egyezéshez szükséges a szimmetriasztring egyezése.
A beazonosított komponens adataival (kötésszög, kötéshossz) kiegészíti a feldolgozó modul által megadott molekulaszerkezetet.