next up previous contents
Nächste Seite: Die Klasse PDBHandler Aufwärts: Konvertierung von PDB nach Vorherige Seite: Lösungsansätze   Inhalt


Implementierung

Die Konvertierung des PDB-Formats in das CML-Format wird mit der Java-Klasse Konverter realisiert. Der dazugehörige Aufruf der Konvertierung lautet folgendermaßen:
java Konverter PDB-Datei CML-Datei Element-Datei [-c]
Beim Aufruf des Konverters müssen die Dateinamen des chemischen Ausgangsformats und der entsprechenden Ausgabedatei angegeben werden. Zusätzlich wird noch der Name einer XML-Datei angegeben, in der Informationen zu den einzelnen Atomen, wie z.B. der kovalente Radius oder der Elektronegativitätswert, gespeichert sind. Diese Daten werden u.a. bei der Berechnung fehlender Bindungen benötigt. Sie werden in einer separaten Datei verwaltet, um sie bei der Konvertierung dynamisch verarbeiten zu können. Somit ist die Möglichkeit gegeben, eigene Werte zu verwenden und dadurch Einfluß auf die Berechnung der Bindungen nehmen zu können. Die Daten der Elemente sind in einem speziellen Format abgelegt. Jedem chemischen Element ist ein Element-Element zugeordnet, das alle weiteren Informationen beinhaltet. Durch das Attribut symbol ist jedes Element-Element eindeutig definiert und es lassen sich die enthaltenen Informationen, wie z.B. Siedepunkt und Schmelztemperatur, genau zuordnen. Exemplarisch sind im Quellcode 6.1 zwei Datensätze abgebildet. Die Daten werden in der Java-Klasse PSEHandler mit Hilfe der Schnittstelle Simple Application Programming Interface for XML (SAX) aus der Datei gelesen. Diese Schnittstelle ist unter Java im Paket org.xml.sax deklariert. Die einzelnen Elementinformationen werden in einem eigenen Java-Objekt Element gespeichert, wobei der Aufbau dieses Objektes in etwa dem Aufbau des Elementes aus der XML-Datei entspricht. Die Element-Objekte werden dann in der Klasse PSE, die von der Klasse Hashtable abstammt, gespeichert. Der Schlüssel zu jedem Element-Objekt ist das chemische Elementsymbol.

Abbildung 6.5: Das ChemHandler-Interface
\resizebox*{0.8\textwidth}{!}{\includegraphics{pics/chemhandler}}


Daten der Elemente Stickstoff und Sauerstoff
<Element symbol="N">
    <Ordnungszahl value="7"/>
    <Name value="Stickstoff"/>
    <Masse value="14.0067"/>
    <Radius value="0.92"/>
    <CovRadius value="0.75"/>
    <Dichte value="1.251"/>
    <Schmelzpunkt value="63.15"/>
    <Siedepunkt value="77.34"/>
    <Elektronenkonfiguration value="[He] 2s2 2p3"/>
    <EN-Wert value="3.04"/>
</Element>
<Element symbol="O">
    <Ordnungszahl value="8"/>
    <Name value="Sauerstoff"/>
    <Masse value="15.9994"/>
    <Radius value="0.65"/>
    <CovRadius value="0.73"/>
    <Dichte value="1.429"/>
    <Schmelzpunkt value="54.8"/>
    <Siedepunkt value="90.18"/>
    <Elektronenkonfiguration value="[He] 2s2 2p4"/>
    <EN-Wert value="3.44"/>
</Element>

Zusätzlich kann beim Aufruf die Flagge -c gesetzt werden. Ist die Flagge nicht gesetzt, werden die Bindungen innerhalb der Nicht-Standardgruppen berechnet und die Angaben in den CONECT-Zeilen werden ignoriert. Ist hingegen beim Aufruf die Flagge -c gesetzt, werden nur die Bindungen, die in den entsprechenden CONECT-Zeilen angegeben werden, für die Nicht-Standardgruppen verwendet. Grundsätzlich ist der Konverter aber nicht nur für die Konvertierung eines bestimmten chemischen Formats entwickelt worden. Er läßt sich problemlos dahingehend erweitern, weitere chemische Formate nach CML zu konvertieren. Um dies zu erreichen, muß die Java-Klasse, die ein bestimmtes chemisches Format interpretiert, die Schnittstelle ChemHandler implementieren. In dieser wird lediglich die Methode convert() deklariert, mit der dann die Konvertierung des speziellen Formats angestoßen wird. Der Name der Klasse muß sich aus der Endung des chemischen Formats und dem Wort Handler zusammensetzen. Die Klassenhierarchie ist in Abbildung 6.5 nochmals aufgeführt.

Dynamische Instanziierung eines Objektes
FileReader reader = null;
try {
    reader = new FileReader (args[0]);
}
catch (FileNotFoundException e) {
    System.err.println("FileNotFoundException"+e.getMessage());
    System.exit (1);
}
BufferedReader input = new BufferedReader(reader);	
String classname = "util."
    + args[0].substring(args[0].indexOf('.') + 1).toUpperCase()
    + "Handler";
Document document = null;

// Die spezielle Klasse des chem. Formats wird dynamisch geladen
// Die Methode convert wird anschliessend aufgerufen 
try {
    Class clazz = Class.forName(classname);
    Constructor con =
        clazz.getConstructor(new Class[] {String[].class});
    // restliche Argumente an Handler uebergeben
    String[] newargs = new String[args.length - 2];
    System.arraycopy(args, 2, newargs, 0, args.length - 2);
    Object handler = con.newInstance(new Object[] {newargs});
    Method toDo = clazz.getMethod("convert",
        new Class[] {BufferedReader.class});
    document = 
        (Document) toDo.invoke(handler, new Object[] {input});
}
catch (Exception e) {// Fehlerbehandlung}

Ausgangspunkt der Konvertierung ist die Klasse Konverter, in der zunächst überprüft wird, ob beim Aufruf die zwei Namen der Ausgangs- und Zieldatei angegeben wurden. Ist dies der Fall, wird eine Instanz der Klasse BufferedReader erzeugt, mit der später aus der Ausgangsdatei gelesen wird. Im nächsten Schritt wird der Klassenname des Handlers bestimmt, mit dem das Format der angegebenen Datei interpretiert werden soll. Er setzt sich, wie bereits erwähnt, aus der Endung der Ausgangsdatei und dem Wort Handler zusammen, dem lediglich der Packagename util. vorangestellt ist. Diese Klasse wird dann automatisch zur Laufzeit mit den Methoden des java.lang.reflect-Pakets geladen, was im Quellcode 6.2 dargestellt wird.
Mit der Methode forName(), die als Parameter den Klassennamen erhält, wird die Klasse des Handlers bestimmt. Anschließend wird ein Konstruktor der Klasse und damit dann eine normale Instanz erzeugt. Dabei werden die restlichen Argumente dem Konstruktor als Parameter übergeben. Mit der Methode getMethod() wird die im Interface deklarierte Methode convert() geladen und mit invoke() aufgerufen. Die dabei möglicherweise enstehenden Exceptions werden abgefangen und verarbeitet. Als Rückgabewert liefert convert() ein Document-Objekt, in dem der DOM-Tree der generierten CML-Datei gespeichert ist. Dieser wird im letzten Schritt mit der Klasse Writer17 in die zuvor angegebene Zieldatei ausgelesen.


Unterabschnitte
next up previous contents
Nächste Seite: Die Klasse PDBHandler Aufwärts: Konvertierung von PDB nach Vorherige Seite: Lösungsansätze   Inhalt
Oliver Krone 2003-04-28