pdb (protein data bank) - files einlesen



  • Hallo leute!

    ich hätte da eine frage, und ich hoffe der/die ein oder andere hat eine antwort parat:

    Ich möchte gerne mittels der anweisung "ifstream" ein pdb-file generieren und einlesen und die darin enthaltenen numerischen werte in ein array oder einen vektor abspeichern.

    Kann c++ das pdb file ohne probleme lesen bzw. zugreifen (zb. "ifstream ("test.pdb") ) oder muss ich es zuerst in ein anderes textfile konvertieren, damit man es in c++ lesen kann?

    (pdb steht wie schon gesagt für die abkürzung : protein data bank)

    es wäre echt super wenn einer von euch ne antwort wissen würde. ihr würdet mir damit sehr helfen.

    danke schon im voraus für eure bemühungen. 🙂

    lg micky



  • Ja, das geht, das ist ein relativ einfaches Textformat. Aber du hast anscheinend zu wenig Ahnung davon, sonst würdest du nicht so fragen 😉



  • Eine .pdb-Datei ist ein gewöhnliches Textdokument mit eigener Endung (Beispiel: http://www.rcsb.org/pdb/files/1mbs.pdb).

    In C/C++ kannst du im Übrigen Dateien jeglichen Formats einlesen, sind schließlich nur Bytes, du musst nur den Inhalt selbst verwerten oder geeignete Funktionen verwenden.



  • ifstream ist keine Anweisung.



  • danke für die antworten. voll nett von euch.

    und ja: du hast recht ich hab noch nicht so viel ahnung beim programmieren, aber mit jeder aufgabe wird man klüger. 😉

    danke nochmal.



  • Hallo micky,

    wenn Du noch nicht viel Ahnung vom Programmieren hast, wird es sehr schwierig für Dich, den Code zu schreiben, um eine solche Datei einzulesen. Welche Informationen sind für Dich wichtig? Das hast Du nicht geschrieben.
    Von folgenden Code wirst Du vielleicht kaum eine Zeile verstehen. Ich habe das mal skizziert, wie ich die 'orthogonalen Koordinaten' aus dem Datensatz 'ATOM' einlesen würde. So hast Du mal einen Eindruck.

    #include <iostream>
    #include <iomanip> // setw
    #include <fstream>
    #include <string>
    #include <limits> // std::numeric_limits<>::max
    #include <vector>
    
    // --   überliest alles bis zum Ende der Zeile
    std::istream& skipline( std::istream& in )
    {
        return in.ignore( std::numeric_limits< std::streamsize >::max(), '\n' );
    }
    
    struct Atom
    {
        std::string name;
        double x, y, z; // orthogonal coordinates in Angstroms
    };
    // --   Einlesen der Struktur Atom
    std::istream& operator>>( std::istream& in, Atom& a )
    {
        // siehe <http://www.wwpdb.org/documentation/format33/sect9.html>
        // -- Vorausetzung "ATOM" wurde gelesen, aktuelle Leseposition ist Spalte 5
        //  -   ignoriere alles von Spalte 5 bis exklusiv 14;
        //  -   lese den Name;
        //  -   ignoriere alles bis exklusiv Spalte 31;
        //  -   lese Koordinaten und ignoriere den Rest der Zeile
        in.ignore(14-5) >> std::setw(3) >> a.name;
        return in.ignore(31-(14+a.name.size())) >> a.x >> a.y >> a.z >> skipline;
    }
    
    int main()
    {
        using namespace std;
        vector< Atom > atome;
        {
            ifstream pdb("1mbs.pdb");
            if( !pdb.is_open() )
            {
                cerr << "Konnte Datei nicht oeffnen" << endl;
                cin.get();
                return -2;
            }
            for( string wort1; pdb >> wort1; )
            {
                if( wort1 == "MODEL" )
                {
                    int modelNr;
                    if( pdb >> modelNr )
                        cout << "Model = " << modelNr << endl;
                }
                else if( wort1 == "ATOM" )
                {
                    Atom atom;
                    if( pdb >> atom )
                        atome.push_back( atom );
                }
                // else if( wort1 == "was anderes" ) // usw.
                else
                    pdb >> skipline;
            }
        }
        cout << atome.size() << " Datensaetze von ATOM gelesen" << endl;
        // .. hier kann 'atome' verwendet werden.
        cin.get();
        return 0;
    }
    

    Gruß
    Werner



  • Danke werner. das is total nett von dir. das ist wirklich das was ich suche. 🙂 danke.

    lg micky


Anmelden zum Antworten