// PdbFinderParser.cpp #include #include #include "PdbFinderParser.hpp" namespace NGBW { // PdbFinderParser bool PdbFinderParser::Parse(PdbFinderRecord &record) { record.clear(); while (1) { ReadNextLine(); if (m_input.Eof()) return false; if (std::memcmp(m_line, "ID ", 3) == 0) { ParseIdentity(record); break; } } while (1) { if (m_input.Eof()) return false; if (std::memcmp(m_line, "Header ", 7) == 0) ParseHeader(record); else if (std::memcmp(m_line, "Source ", 7) == 0) ParseSource(record); else if (std::memcmp(m_line, "Chain ", 6) == 0) ParseChain(record); else if (FindEndToken()) break; else ReadNextLine(); } return true; } void PdbFinderParser::ParseIdentity(PdbFinderRecord &record) { GetFieldValue(3, record.identity); ReadNextLine(); } void PdbFinderParser::ParseHeader(PdbFinderRecord &record) { GetFieldValue(7, record.description); ReadNextLine(); } void PdbFinderParser::ParseSource(PdbFinderRecord &record) { GetFieldValue(7, record.organism); while (1) { ReadNextLine(); if (m_input.Eof() || std::memcmp(m_line, "Source ", 7) != 0) break; std::string value; GetFieldValue(7, value); record.organism.push_back(' '); record.organism.append(value); } } void PdbFinderParser::ParseChain(PdbFinderRecord &record) { while (1) { PdbChain new_chain; GetFieldValue(6, new_chain.identity); if (new_chain.identity[0] != '_') { while (1) { ReadNextLine(); if (m_input.Eof() || !std::isspace(m_line[0])) break; size_t first = FindFirstNotSpace(1); if (first == std::string::npos || std::memcmp(m_line + first, "Sequence ", 9) != 0) continue; GetFieldValue(first + 9, new_chain.sequence); } if (new_chain.sequence.length() > 0) record.chains.push_back(new_chain); } else ReadNextLine(); if (m_input.Eof() || std::memcmp(m_line, "Chain ", 6) != 0) break; } } void PdbFinderParser::GetFieldValue(size_t offset, std::string &value) { size_t first = FindFirstOf(':', offset); if (first == std::string::npos) return; first = FindFirstNotSpace(first + 1); size_t last = std::strlen(m_line); value.assign(m_line + first, last - first); } bool PdbFinderParser::FindEndToken() { size_t first = FindFirstNotSpace(); if (first == std::string::npos) return false; if (m_line[first] == '/' && m_line[first + 1] == '/') return true; return false; } } // namespace NGBW