// PdbFinderWriter.cpp #if defined(_WIN32) || defined(_WIN64) // C4290 - the compiler ignores exception specifications #pragma warning(disable: 4290) #endif #include #include #include "PdbFinderWriter.hpp" namespace NGBW { // PdbFinderWriter void PdbFinderWriter::Write(const SeqresMap &sequences) throw(std::ios_base::failure) { while (1) { while (1) { ReadNextLine(); if (m_input.Eof()) return; if (std::memcmp(m_line, "ID ", 3) == 0) break; } std::string protein_id; GetFieldValue(3, protein_id); for (std::string::iterator i = protein_id.begin() ; i != protein_id.end() ; i++) *i = std::toupper(*i); SeqresMap::const_iterator entry(sequences.find(protein_id)); if (entry == sequences.end()) continue; const ChainSet &chains = (*entry).second; m_output << m_line; m_output.put('\n'); ReadNextLine(); while (1) { if (m_input.Eof()) return; m_output << m_line; m_output.put('\n'); if (std::memcmp(m_line, "Chain ", 6) == 0) ParseChain(chains); else if (FindEndToken()) break; else ReadNextLine(); } } } void PdbFinderWriter::ParseChain(const ChainSet &chains) { std::string chain_id; GetFieldValue(6, chain_id); PdbSeqresRecord key; key.chain_id.assign(chain_id); ChainSet::const_iterator entry(chains.find(key)); if (entry == chains.end()) { ReadNextLine(); return; } const PdbSeqresRecord &record = *entry; while (1) { ReadNextLine(); if (m_input.Eof() || !std::isspace(m_line[0])) break; size_t first = FindFirstNotSpace(1); if (first == std::string::npos) { m_output.put('\n'); continue; } if (std::memcmp(m_line + first, "Sequence ", 9) == 0) { size_t last = FindFirstOf(':'); m_output.write(m_line, last + 1); m_output.put(' '); m_output << record.sequence; m_output.put('\n'); } else if (std::strstr(m_line + first, "-Acids") != NULL) { size_t last = FindFirstOf(':'); m_output.write(m_line, last + 1); m_output.put(' '); m_output << record.length; m_output.put('\n'); } else { m_output << m_line; m_output.put('\n'); } } } void PdbFinderWriter::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 PdbFinderWriter::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