From a642facad90c4220a43470b317619a15871c2bff Mon Sep 17 00:00:00 2001 From: Stefan Bienert <stefan.bienert@unibas.ch> Date: Mon, 25 Jul 2011 09:44:23 +0200 Subject: [PATCH] Revert MMCIF Parser to move to own branch This reverts commit aac17c6cf70a13e6aa53792cf162b8d7a4022ef4. --- modules/io/pymod/CMakeLists.txt | 1 - modules/io/pymod/__init__.py | 101 +--- modules/io/pymod/export_mmcif_io.cc | 38 -- modules/io/pymod/wrap_io.cc | 2 - modules/io/src/mol/CMakeLists.txt | 2 - modules/io/src/mol/mmcif_reader.cc | 510 ------------------ modules/io/src/mol/mmcif_reader.hh | 197 ------- modules/io/src/mol/star_parser.cc | 71 +-- modules/io/src/mol/star_parser.hh | 34 +- modules/io/tests/CMakeLists.txt | 1 - modules/io/tests/test_mmcif_reader.cc | 233 -------- .../io/tests/testfiles/mmcif/atom_site.mmcif | 49 -- 12 files changed, 4 insertions(+), 1235 deletions(-) delete mode 100644 modules/io/pymod/export_mmcif_io.cc delete mode 100644 modules/io/src/mol/mmcif_reader.cc delete mode 100644 modules/io/src/mol/mmcif_reader.hh delete mode 100644 modules/io/tests/test_mmcif_reader.cc delete mode 100644 modules/io/tests/testfiles/mmcif/atom_site.mmcif diff --git a/modules/io/pymod/CMakeLists.txt b/modules/io/pymod/CMakeLists.txt index 023e000b8..902089f7f 100644 --- a/modules/io/pymod/CMakeLists.txt +++ b/modules/io/pymod/CMakeLists.txt @@ -1,7 +1,6 @@ set(OST_IO_PYMOD_SOURCES wrap_io.cc export_pdb_io.cc - export_mmcif_io.cc ) if (ENABLE_IMG) diff --git a/modules/io/pymod/__init__.py b/modules/io/pymod/__init__.py index 57a0464bb..74047dec0 100644 --- a/modules/io/pymod/__init__.py +++ b/modules/io/pymod/__init__.py @@ -88,7 +88,7 @@ def LoadPDB(filename, restrict_chains="", no_hetatms=None, profile='DEFAULT', remote=False, dialect=None, strict_hydrogens=None, seqres=False): """ - Load PDB file from disk and return one or more entities. Several options + Load PDB file from disk and returns one or more entities. Several options allow to customize the exact behaviour of the PDB import. For more information on these options, see :doc:`profile`. @@ -264,105 +264,6 @@ def LoadCHARMMTraj(crd, dcd_file=None, profile='CHARMM', raise ValueError("No DCD filename given") return LoadCHARMMTraj_(crd, dcd_file, stride, lazy_load) -def LoadMMCIF(filename, restrict_chains="", no_hetatms=None, - fault_tolerant=None, load_multi=False, quack_mode=None, - join_spread_atom_records=None, calpha_only=None, - profile='DEFAULT', remote=False, strict_hydrogens=None, - seqres=False): - """ - Load MMCIF file from disk and return one or more entities. Several options - allow to customize the exact behaviour of the MMCIF import. For more - information on these options, see :doc:`profile`. - - Residues are flagged as ligand if they are mentioned in a HET record. - - :param restrict_chains: If not an empty string, only chains listed in the - string will be imported. - - :param fault_tolerant: Enable/disable fault-tolerant import. If set, overrides - the value of :attr:`IOProfile.fault_tolerant`. - - :param no_hetatms: If set to True, HETATM records will be ignored. Overrides - the value of :attr:`IOProfile.no_hetatms` - - :param load_multi: If set to True, a list of entities will be returned instead - of only the first. This is useful when dealing with multi-PDB files. - - :param join_spread_atom_records: If set, overrides the value of - :attr:`IOProfile.join_spread_atom_records`. - - :param remote: If set to true, the method tries to load the pdb from the - remote pdb repository www.pdb.org. The filename is then interpreted as the - pdb id. - - :rtype: :class:`~ost.mol.EntityHandle` or a list thereof if `load_multi` is - True. - - :param seqres: Whether to read SEQRES records. If set to true, the loaded - entity and seqres entry will be returned as a tuple. - - :param strict_hydrogens: If set, overrides the value of - :attr:`IOProfile.strict_hydrogens`. - - :raises: :exc:`~ost.io.IOException` if the import fails due to an erroneous or - inexistent file - """ - def _override(val1, val2): - if val2!=None: - return val2 - else: - return val1 - if isinstance(profile, str): - prof = profiles[profile].Copy() - else: - prof = profile.Copy() - - prof.calpha_only=_override(prof.calpha_only, calpha_only) - prof.no_hetatms=_override(prof.no_hetatms, no_hetatms) - prof.quack_mode=_override(prof.quack_mode, quack_mode) - prof.strict_hydrogens=_override(prof.strict_hydrogens, strict_hydrogens) - prof.fault_tolerant=_override(prof.fault_tolerant, fault_tolerant) - prof.join_spread_atom_records=_override(prof.join_spread_atom_records, - join_spread_atom_records) - - if remote: - output_dir = tempfile.gettempdir() - if __GetModelFromPDB(filename, output_dir): - filename = os.path.join(output_dir, 'pdb%s.ent.gz' % filename) - else: - raise IOError('Can not load PDB %s from www.pdb.org'%filename) - - conop_inst = conop.Conopology.Instance() - builder = conop_inst.GetBuilder("DEFAULT") - - builder.strict_hydrogens = prof.strict_hydrogens - - try: - #if load_multi: - # ent_list=[] - # while reader.HasNext(): - # ent=mol.CreateEntity() - # reader.Import(ent, restrict_chains) - # conop_inst.ConnectAll(builder, ent, 0) - # ent_list.append(ent) - # if len(ent_list)==0: - # raise IOError("File doesn't contain any entities") - # return ent_list - #else: - ent = mol.CreateEntity() - reader = MMCifParser(filename, ent, prof) - #reader.read_seqres = seqres - #if reader.HasNext(): - reader.Parse() - conop_inst.ConnectAll(builder, ent, 0) - #else: - # raise IOError("File doesn't contain any entities") - #if seqres: - # return ent, reader.seqres - return ent - except: - raise - ## \example fft_li.py # # This scripts loads one or more images and shows their Fourier Transforms on diff --git a/modules/io/pymod/export_mmcif_io.cc b/modules/io/pymod/export_mmcif_io.cc deleted file mode 100644 index 4e0a47240..000000000 --- a/modules/io/pymod/export_mmcif_io.cc +++ /dev/null @@ -1,38 +0,0 @@ -//------------------------------------------------------------------------------ -// This file is part of the OpenStructure project <www.openstructure.org> -// -// Copyright (C) 2008-2011 by the OpenStructure authors -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License as published by the Free -// Software Foundation; either version 3.0 of the License, or (at your option) -// any later version. -// This library is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -// details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with this library; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -//------------------------------------------------------------------------------ -#include <boost/python.hpp> -using namespace boost::python; - -#include <ost/io/mol/io_profile.hh> -#include <ost/io/mol/mmcif_reader.hh> -using namespace ost; -using namespace ost::io; -using namespace ost::mol; - -void export_mmcif_io() -{ - class_<MMCifParser, boost::noncopyable>("MMCifParser", init<const String&, EntityHandle&, const IOProfile&>()) - .def("Parse", &MMCifParser::Parse) - .def("SetRestrictChains", &MMCifParser::SetRestrictChains) - .add_property("restrict_chains", - make_function(&MMCifParser::GetRestrictChains, - return_value_policy<copy_const_reference>()), - &MMCifParser::SetRestrictChains) - ; -} diff --git a/modules/io/pymod/wrap_io.cc b/modules/io/pymod/wrap_io.cc index 1d9e3b936..af5087cd2 100644 --- a/modules/io/pymod/wrap_io.cc +++ b/modules/io/pymod/wrap_io.cc @@ -72,7 +72,6 @@ BOOST_PYTHON_FUNCTION_OVERLOADS(save_charmm_trj_ov, } void export_pdb_io(); -void export_mmcif_io(); #if OST_IMG_ENABLED void export_map_io(); #endif @@ -118,7 +117,6 @@ BOOST_PYTHON_MODULE(_ost_io) def("LoadMAE", &LoadMAE); export_pdb_io(); - export_mmcif_io(); #if OST_IMG_ENABLED export_map_io(); #endif diff --git a/modules/io/src/mol/CMakeLists.txt b/modules/io/src/mol/CMakeLists.txt index db328bb9c..1201eb58f 100644 --- a/modules/io/src/mol/CMakeLists.txt +++ b/modules/io/src/mol/CMakeLists.txt @@ -15,14 +15,12 @@ chemdict_parser.cc io_profile.cc dcd_io.cc star_parser.cc -mmcif_reader.cc PARENT_SCOPE ) set(OST_IO_MOL_HEADERS chemdict_parser.hh star_parser.hh -mmcif_reader.hh io_profile.hh dcd_io.hh entity_io_crd_handler.hh diff --git a/modules/io/src/mol/mmcif_reader.cc b/modules/io/src/mol/mmcif_reader.cc deleted file mode 100644 index 0a463ac24..000000000 --- a/modules/io/src/mol/mmcif_reader.cc +++ /dev/null @@ -1,510 +0,0 @@ -//------------------------------------------------------------------------------ -// This file is part of the OpenStructure project <www.openstructure.org> -// -// Copyright (C) 2008-2011 by the OpenStructure authors -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License as published by the Free -// Software Foundation; either version 3.0 of the License, or (at your option) -// any later version. -// This library is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -// details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with this library; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -//------------------------------------------------------------------------------ - -#include <ctype.h> - -//#include <boost/iostreams/filter/gzip.hpp> -//#include <boost/filesystem/convenience.hpp> -//#include <boost/algorithm/string.hpp> -//#include <boost/algorithm/string/trim.hpp> - -//#include <boost/format.hpp> -//#include <boost/lexical_cast.hpp> - -#include <ost/profile.hh> -#include <ost/log.hh> -#include <ost/mol/xcs_editor.hh> -#include <ost/io/mol/mmcif_reader.hh> - -namespace ost { namespace io { - -MMCifParser::MMCifParser(std::istream& stream, mol::EntityHandle& ent_handle, - const IOProfile& profile): - StarParser(stream, true), profile_(profile), ent_handle_(ent_handle) -{ - this->Init(); -} - -MMCifParser::MMCifParser(const String& filename, mol::EntityHandle& ent_handle, - const IOProfile& profile): - StarParser(filename, true), profile_(profile), ent_handle_(ent_handle) -{ - this->Init(); -} - -void MMCifParser::Init() -{ - warned_name_mismatch_ = false; - category_ = DONT_KNOW; - chain_count_ = 0; - atom_count_ = 0; - residue_count_ = 0; - auth_chain_id_ = false; - go_on_ = true; - //memset(indices_, -1, MAX_ITEMS_IN_ROW * sizeof(int)); - restrict_chains_ = ""; - //curr_chain_ = mol::ChainHandle(); - //curr_residue_ = mol::ResidueHandle(); -} - -void MMCifParser::ClearState() -{ - curr_chain_ = mol::ChainHandle(); - curr_residue_ = mol::ResidueHandle(); - chain_count_ = 0; - residue_count_ = 0; - atom_count_ = 0; - category_ = DONT_KNOW; - warned_name_mismatch_ = false; -} - -void MMCifParser::SetRestrictChains(const String& restrict_chains) -{ - restrict_chains_ = restrict_chains; -} - -bool MMCifParser::IsValidPDBIdent(const StringRef& pdbid) -{ - if (pdbid.length() == PDBID_LEN && isdigit(pdbid[0])) { - return true; - } - return false; -} - -bool MMCifParser::OnBeginData(const StringRef& data_name) -{ - LOG_DEBUG("MCIFFReader: " << profile_); - Profile profile_import("MMCifReader::OnBeginData"); - - // check for PDB id - if (!this->IsValidPDBIdent(data_name)) { - throw IOException(this->FormatDiagnostic(STAR_DIAG_ERROR, - "No valid PDB id found for data block, read instead \'" - + data_name.str() + "\'", - this->GetCurrentLinenum())); - } - - this->ClearState(); - - go_on_ = true; - - return true; -} - -bool MMCifParser::OnBeginLoop(const StarLoopDesc& header) -{ - // set whole array to -1 - memset(indices_, -1, MAX_ITEMS_IN_ROW * sizeof(int)); - // walk through possible categories - if (header.GetCategory() == "atom_site") { - category_ = ATOM_SITE; - // mandatory items - this->TryStoreIdx(AUTH_ASYM_ID, "auth_asym_id", header); - this->TryStoreIdx(ID, "id", header); - this->TryStoreIdx(LABEL_ALT_ID, "label_alt_id", header); - this->TryStoreIdx(LABEL_ASYM_ID, "label_asym_id", header); - this->TryStoreIdx(LABEL_ATOM_ID, "label_atom_id", header); - this->TryStoreIdx(LABEL_COMP_ID, "label_comp_id", header); - this->TryStoreIdx(LABEL_ENTITY_ID, "label_entity_id", header); - this->TryStoreIdx(LABEL_SEQ_ID, "label_seq_id", header); - this->TryStoreIdx(TYPE_SYMBOL, "type_symbol", header); - // assumed mandatory - this->TryStoreIdx(CARTN_X, "Cartn_x", header); - this->TryStoreIdx(CARTN_Y, "Cartn_y", header); - this->TryStoreIdx(CARTN_Z, "Cartn_z", header); - // optional - indices_[OCCUPANCY] = header.GetIndex("occupancy"); - indices_[B_ISO_OR_EQUIV] = header.GetIndex("B_iso_or_equiv"); - indices_[GROUP_PDB] = header.GetIndex("group_PDB"); - return true; - } /*else if (header.GetCategory()=="entity_poly") { - } else if (header.GetCategory()=="pdbx_poly_seq_scheme") { - } else if (header.GetCategory()=="pdbx_struct_assembly") { - } else if (header.GetCategory()=="struct_conf") { - }*/ - return false; -} - -mol::ResNum to_res_num(int num, char ins_code) -{ - return mol::ResNum(num, ins_code==' ' ? '\0' : ins_code); -} - -bool MMCifParser::ParseAtomIdent(const std::vector<StringRef>& columns, - String& chain_name, - StringRef& res_name, - mol::ResNum& resnum, - StringRef& atom_name, - char& alt_loc) -{ - // ATOM name - atom_name = columns[indices_[LABEL_ATOM_ID]]; - if (profile_.calpha_only) { // unit test profile - if (atom_name != StringRef("CA", 2)) { - return false; - } - } - // CHAIN ID - if (auth_chain_id_) { // unit test different IDs - chain_name = columns[indices_[AUTH_ASYM_ID]].str(); - } else { - chain_name = columns[indices_[LABEL_ASYM_ID]].str(); - } - if (restrict_chains_.size() > 0 && // unit test - restrict_chains_.find(chain_name) == String::npos) { // unit test - return false; - } - - std::pair<bool, int> a_num = this->TryGetInt(columns[indices_[ID]], - "_atom_site.id", - profile_.fault_tolerant); // unit test - - alt_loc = columns[indices_[LABEL_ALT_ID]][0]; - res_name = columns[indices_[LABEL_COMP_ID]]; - std::pair<bool, int> res_num =this->TryGetInt(columns[indices_[LABEL_SEQ_ID]], - "_atom_site.label_seq_id", - profile_.fault_tolerant); // unit test - if (!res_num.first) { // unit test - if (profile_.fault_tolerant) { - return false; - } - } - - resnum=to_res_num(res_num.second, ' '); - - return true; -} - -void MMCifParser::ParseAndAddAtom(const std::vector<StringRef>& columns) -{ - mol::XCSEditor editor=ent_handle_.EditXCS(mol::BUFFERED_EDIT); // potbl - char alt_loc=0; - String chain_name; - StringRef res_name, atom_name; - mol::ResNum res_num(0); - if (!this->ParseAtomIdent(columns, - chain_name, - res_name, - res_num, - atom_name, - alt_loc)) { - return; - } - Real occ = 1.00f, temp = 0; - geom::Vec3 apos; - - for (int i = CARTN_X; i <= CARTN_Z; ++i) { - std::pair<bool, float> result = this->TryGetFloat(columns[indices_[i]], - "atom_site.cartn_[xyz]", - profile_.fault_tolerant); - if (!result.first) { // unit test - if (profile_.fault_tolerant) { // unit test - return; - } - } - apos[i - CARTN_X] = result.second; - } - - if (indices_[OCCUPANCY] != -1) { // unit test - occ = this->TryGetReal(columns[indices_[OCCUPANCY]], "atom_site.occupancy"); - } - if (indices_[B_ISO_OR_EQUIV] != -1) { // unit test - temp = this->TryGetReal(columns[indices_[B_ISO_OR_EQUIV]], - "atom_site.B_iso_or_equiv"); - } - - // determine element - String s_ele(columns[indices_[TYPE_SYMBOL]].str()); - - String aname(atom_name.str()); - // some postprocessing - LOG_TRACE( "s_chain: [" << chain_name << "]" ); - - // determine chain and residue update - bool update_chain=false; - bool update_residue=false; - if(!curr_chain_) { // unit test - update_chain=true; - update_residue=true; - } else if(curr_chain_.GetName() != chain_name) { // unit test - update_chain=true; - update_residue=true; - } - - if(!curr_residue_) { // unit test - update_residue=true; - } else if(curr_residue_.GetNumber() != res_num) { // unit test - update_residue=true; - } - - if(update_chain) { // unit test - curr_chain_ = ent_handle_.FindChain(chain_name); - if(!curr_chain_.IsValid()) { // unit test - LOG_DEBUG("new chain " << chain_name); - curr_chain_=editor.InsertChain(chain_name); - ++chain_count_; - } - assert(curr_chain_.IsValid()); - } - - if(update_residue) { // unit test - curr_residue_=mol::ResidueHandle(); - if (profile_.join_spread_atom_records) { // unit test - curr_residue_=curr_chain_.FindResidue(res_num); - } - if (!curr_residue_.IsValid()) { // unit test - LOG_DEBUG("new residue " << res_name << " " << res_num); - curr_residue_ =editor.AppendResidue(curr_chain_, res_name.str(), res_num); - warned_name_mismatch_=false; - ++residue_count_; - } - assert(curr_residue_.IsValid()); - } - - // finally add atom - LOG_DEBUG("adding atom " << aname << " (" << s_ele << ") @" << apos); - mol::AtomHandle ah; - if (curr_residue_.GetName()!=res_name.str()) { // unit test - if (!profile_.fault_tolerant && alt_loc=='.') { // unit test - std::stringstream ss; - ss << "Residue with number " << res_num << " has more than one name."; - throw IOException(this->FormatDiagnostic(STAR_DIAG_ERROR, - ss.str(), - this->GetCurrentLinenum())); - } - if (!warned_name_mismatch_) { // unit test - if (alt_loc=='.') { // unit test - LOG_WARNING("Residue with number " << res_num << " has more than one " - "name. Ignoring atoms for everything but the first"); - } else { - LOG_WARNING("Residue with number " << res_num - << " contains a microheterogeneity. Everything but atoms " - "for the residue '" << curr_residue_.GetName() - << "' will be ignored"); - } - } - warned_name_mismatch_=true; - return; - } - if (alt_loc!='.') { // unit test - // Check if there is already a atom with the same name. - mol::AtomHandle me=curr_residue_.FindAtom(aname); - if (me.IsValid()) { // unit test - try { - editor.AddAltAtomPos(String(1, alt_loc), me, apos); - } catch (Error) { - LOG_INFO("Ignoring atom alt location since there is already an atom " - "with name " << aname << ", but without an alt loc"); - return; - } - return; - } else { - ah = editor.InsertAltAtom(curr_residue_, aname, - String(1, alt_loc), apos, s_ele); - ++atom_count_; - } - } else { - mol::AtomHandle atom=curr_residue_.FindAtom(aname); - if (atom.IsValid() && !profile_.quack_mode) { // unit test - if (profile_.fault_tolerant) { // unit test - LOG_WARNING("duplicate atom '" << aname << "' in residue " - << curr_residue_); - return; - } - throw IOException(this->FormatDiagnostic(STAR_DIAG_ERROR, - "Duplicate atom '"+aname+ - "' in residue "+ - curr_residue_.GetQualifiedName(), - this->GetCurrentLinenum())); - } - ah = editor.InsertAtom(curr_residue_, aname, apos, s_ele); - ++atom_count_; - } - ah.SetBFactor(temp); - - ah.SetOccupancy(occ); - - // record type - ah.SetHetAtom(indices_[GROUP_PDB] == -1 ? false : - columns[indices_[GROUP_PDB]][0]=='H'); - -} - -void MMCifParser::OnDataRow(const StarLoopDesc& header, - const std::vector<StringRef>& columns) -{ - switch(category_) { - case ATOM_SITE: - LOG_TRACE("processing atom_site entry"); - this->ParseAndAddAtom(columns); - break; - default: - return; - } -} - - /* -void PDBReader::Import(mol::EntityHandle& ent, - const String& restrict_chains) -{ - do { - switch(curr_line[0]) { - case 'A': - case 'a': - if (IEquals(curr_line.substr(0, 6), StringRef("ANISOU", 6))) { - if (!charmm_style_) { - LOG_TRACE("processing ANISOU entry"); - this->ParseAnisou(curr_line, line_num_, ent); - } - } - break; - case 'C': - case 'c': - if (curr_line.size()<20) { - LOG_TRACE("skipping entry"); - continue; - } - if (IEquals(curr_line.substr(0, 6), StringRef("COMPND", 6))) { - LOG_TRACE("processing COMPND entry"); - this->ParseCompndEntry(curr_line, line_num_); - } - break; - case 'E': - case 'e': - if (curr_line.size()<3) { - continue; - } - if (IEquals(curr_line.rtrim(), StringRef("END", 3))) { - hard_end_=true; - go_on=false; - break; - } - if (curr_line.size()<6) { - continue; - } - if (IEquals(curr_line.substr(0, 6), StringRef("ENDMDL", 6))) { - go_on=false; - num_model_records_=0; - break; - } - case 'H': - case 'h': - if (curr_line.size()<6) { - continue; - } - if (IEquals(curr_line.substr(0, 6), StringRef("HETATM", 6))) { - if (profile_.no_hetatms) - continue; - LOG_TRACE("processing HETATM entry"); - this->ParseAndAddAtom(curr_line, line_num_, ent, - StringRef("HETATM", 6)); - } else if (IEquals(curr_line.substr(0, 6), StringRef("HELIX ", 6))) { - if (!charmm_style_) { - this->ParseHelixEntry(curr_line); - } - } else if (IEquals(curr_line.substr(0, 6), StringRef("HET ", 6))) { - // remember het entry to mark the residues as ligand during ATOM import - char chain=curr_line[12]; - std::pair<bool, int> num=curr_line.substr(13, 4).ltrim().to_int(); - if (!num.first) { - if (profile_.fault_tolerant) { - LOG_WARNING("Invalid HET entry on line " << line_num_); - continue; - } else { - String msg=str(format("Invalid HET entry on line %d")%line_num_); - throw IOException(msg); - } - } - hets_.push_back(HetEntry(chain, to_res_num(num.second, - curr_line[17]))); - } - break; - case 'M': - case 'm': - if (curr_line.size()<6) { - continue; - } - if (IEquals(curr_line.substr(0, 6), StringRef("MODEL ", 6))) { - ++num_model_records_; - if (num_model_records_<2) { - continue; - } - if (profile_.fault_tolerant) { - go_on=false; - num_model_records_=1; - break; - } - String msg=str(format("MODEL record without matching ENDMDL on line %d")%line_num_); - throw IOException(msg); - } - break; - case 'S': - case 's': - if (curr_line.size()<6) { - continue; - } - if (IEquals(curr_line.substr(0, 6), StringRef("SHEET ", 6))) { - if (!charmm_style_) { - this->ParseStrandEntry(curr_line); - } - } - if (IEquals(curr_line.substr(0, 6), StringRef("SEQRES", 6))) { - if (read_seqres_) { - this->ParseSeqRes(curr_line, line_num_); - } - } - break; - default: - break; - } - } while (std::getline(in_, curr_line_) && ++line_num_ && go_on); - LOG_INFO("imported " - << chain_count_ << " chains, " - << residue_count_ << " residues, " - << atom_count_ << " atoms; with " - << helix_list_.size() << " helices and " - << strand_list_.size() << " strands"); - this->AssignSecStructure(ent); - this->AssignMolIds(ent); - for (HetList::const_iterator i=hets_.begin(), e=hets_.end(); i!=e; ++i) { - mol::ResidueHandle res=ent.FindResidue(String(1, i->chain), i->num); - if (res.IsValid()) { - res.SetIsLigand(true); - } - } -} - */ - - - /* - virtual void OnEndLoop() { } - - virtual void OnDataItem(const StarDataItem& item) { } - - };*/ - -void MMCifParser::OnEndData() -{ - LOG_INFO("imported " - << chain_count_ << " chains, " - << residue_count_ << " residues, " - << atom_count_ << " atoms;"); -} - -}} diff --git a/modules/io/src/mol/mmcif_reader.hh b/modules/io/src/mol/mmcif_reader.hh deleted file mode 100644 index 6f933ae12..000000000 --- a/modules/io/src/mol/mmcif_reader.hh +++ /dev/null @@ -1,197 +0,0 @@ -//------------------------------------------------------------------------------ -// This file is part of the OpenStructure project <www.openstructure.org> -// -// Copyright (C) 2008-2011 by the OpenStructure authors -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License as published by the Free -// Software Foundation; either version 3.0 of the License, or (at your option) -// any later version. -// This library is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -// details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with this library; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -//------------------------------------------------------------------------------ -#ifndef OST_MMCIF_PARSER_HH -#define OST_MMCIF_PARSER_HH - -//#include <boost/iostreams/filtering_stream.hpp> -//#include <boost/filesystem/fstream.hpp> - -#include <ost/mol/residue_handle.hh> -#include <ost/io/mol/io_profile.hh> -#include <ost/io/io_exception.hh> -#include <ost/io/mol/star_parser.hh> - -namespace ost { namespace io { - -/// \brief reader for the mmcif file format -/// -/// \section mmcif_format mmcif format description/ coverage -/// -/// mmcif is an instance of the \link StarParser STAR format\endlink to store -/// entries of the PDB. The following data categories should be covered by this -/// parser: -/// -/// \li atom_site -class DLLEXPORT_OST_IO MMCifParser : public StarParser { -public: - /// \brief create a MMCifParser - /// - /// \param stream input stream - MMCifParser(std::istream& stream, mol::EntityHandle& ent_handle, - const IOProfile& profile); - - /// \brief create a MMCifParser - /// - /// \param filename input file - MMCifParser(const String& filename, mol::EntityHandle& ent_handle, - const IOProfile& profile); - - /// \brief Initialise the parser. - /// - /// \param loc Location of the file - void Init(); - - /// \brief Set up a fresh instance - void ClearState(); - - /// \brief Set names of restricted chains for the parser. - /// - /// \param restrict_chains chain name - void SetRestrictChains(const String& restrict_chains); - - const String& GetRestrictChains() const - { - return restrict_chains_; - } - - /// \brief check mmcif input to be read. Substitutional function for - /// \link StarParser StarParser\endlink. - /// - /// \param data_name value of the data_ tag - /// - /// \return true, if the blockcode (PDB id) is valid, false otherwise - virtual bool OnBeginData(const StringRef& data_name); - - /// \brief check if a current loop is to be parsed - /// - /// \param header categories of the upcoming loop block - /// - /// \return bool - virtual bool OnBeginLoop(const StarLoopDesc& header); - - /// \brief read a row of data - /// - /// \param header categories and items - /// \param columns data - virtual void OnDataRow(const StarLoopDesc& header, - const std::vector<StringRef>& columns); - - /// \brief Finalise parsing. - virtual void OnEndData(); - - protected: - /// \brief Store an item index from loop header in preparation for reading a - /// row. Throws an exception if the item does not exist. - /// - /// \param mapping position the item index is stored at - /// \param item exact item name to fetch - /// \param header loop header to pull index from - void TryStoreIdx(const int mapping, - const String& item, - const StarLoopDesc& header) - { - indices_[mapping] = header.GetIndex(item); - - if (indices_[mapping] == -1) { - throw IOException(this->FormatDiagnostic(STAR_DIAG_ERROR, - "No item '" + item + - "' found in '" + - header.GetCategory()+ - "' header", - this->GetCurrentLinenum())); - } - } - - /// \brief Check a PDB id to be of length 4 and start with a digit - /// - /// \param pdbid putative PDB id - /// - /// \return true for a valid id, false otherwise - bool IsValidPDBIdent(const StringRef& pdbid); - - /// \brief ... - /// - /// \param columns data row - /// \param atom_name corresponds to label_atom_id - bool ParseAtomIdent(const std::vector<StringRef>& columns, - String& chain_name, - StringRef& res_name, - mol::ResNum& resnum, - StringRef& atom_name, - char& alt_loc); - - /// \brief Fetch atom information and store it. - /// - /// \param columns data row - void ParseAndAddAtom(const std::vector<StringRef>& columns); - -private: - /// \enum magic numbers of this class - typedef enum { - PDBID_LEN=4, ///< length of a PDB id - MAX_ITEMS_IN_ROW=16 ///< count for possible items in a loop row - } MMCifMagicNos; - - /// \enum items of the atom_site category - typedef enum { - AUTH_ASYM_ID, ///< chain name by author as in PDB - ID, ///< atom serial id - LABEL_ALT_ID, ///< AltLoc - LABEL_ASYM_ID, ///< chain name by PDB - LABEL_ATOM_ID, - LABEL_COMP_ID, - LABEL_ENTITY_ID, - LABEL_SEQ_ID, ///< residue no. - TYPE_SYMBOL, ///< chemical element - CARTN_X, ///< Coordinates ||IMPORTANT: This 3 entries have to stay - CARTN_Y, ///< Coordinates ||together for the parser to work! - CARTN_Z, ///< Coordinates || - OCCUPANCY, - B_ISO_OR_EQUIV, - GROUP_PDB ///< record name - } AtomSiteItems; - - /// \enum categories of the mmcif format - typedef enum { - ATOM_SITE, - DONT_KNOW - } MMCifCategory; - - // members - MMCifCategory category_; - int indices_[MAX_ITEMS_IN_ROW]; ///< map items to values in loops - const IOProfile& profile_; - mol::EntityHandle& ent_handle_; - String restrict_chains_; - bool auth_chain_id_; ///< use chain IDs given by authors rather than pdb - mol::ChainHandle curr_chain_; - mol::ResidueHandle curr_residue_; - int chain_count_; - int residue_count_; - int atom_count_; - bool warned_name_mismatch_; - bool go_on_; ///< flow control within the parser hooks - //from pdbdreader - //entity als member, fill in ondatarow - //import function -}; - -}} - -#endif diff --git a/modules/io/src/mol/star_parser.cc b/modules/io/src/mol/star_parser.cc index d0440904e..33e235d09 100644 --- a/modules/io/src/mol/star_parser.cc +++ b/modules/io/src/mol/star_parser.cc @@ -20,40 +20,28 @@ /* Author: Marco Biasini */ -#include <boost/iostreams/filter/gzip.hpp> - #include <cassert> #include <sstream> -#include <ost/log.hh> #include <ost/io/io_exception.hh> #include <ost/io/mol/star_parser.hh> namespace ost { namespace io { StarParser::StarParser(std::istream& stream, bool items_as_row): - filename_("<stream>"), line_num_(0), + stream_(stream), filename_("<stream>"), line_num_(0), has_current_line_(false), current_line_(), items_row_header_(), items_row_columns_(), items_row_values_() { items_as_row_ = items_as_row; - - stream_.push(stream); } StarParser::StarParser(const String& filename, bool items_as_row): - fstream_(filename.c_str()), filename_(filename), + fstream_(filename.c_str()), stream_(fstream_), filename_(filename), line_num_(0), has_current_line_(false), current_line_(), items_row_header_(), items_row_columns_(), items_row_values_() { items_as_row_ = items_as_row; - - if (filename.length() >= 3 && - filename.substr(filename.length() - 3) == ".gz") { - stream_.push(boost::iostreams::gzip_decompressor()); - } - - stream_.push(fstream_); } String StarParser::FormatDiagnostic(StarDiagType type, const String& message, @@ -78,18 +66,6 @@ String StarParser::FormatDiagnostic(StarDiagType type, const String& message, return ss.str(); } -Real StarParser::TryGetReal(const StringRef& data, const String& name) const -{ - std::pair<bool, Real> value = data.to_float(); - if (!value.first) { - throw IOException(this->FormatDiagnostic(STAR_DIAG_ERROR, - "Expecting real number for " + - name + ", found '" + data.str() + - "' instead.", line_num_)); - } - return value.second; -} - float StarParser::TryGetFloat(const StringRef& data, const String& name) const { std::pair<bool, float> value = data.to_float(); @@ -102,28 +78,6 @@ float StarParser::TryGetFloat(const StringRef& data, const String& name) const return value.second; } -std::pair<bool, float> StarParser::TryGetFloat(const StringRef& data, - const String& name, - bool may_fail) const -{ - std::pair<bool, float> value = data.to_float(); - if (!value.first) { - if (!may_fail) { - throw IOException(this->FormatDiagnostic(STAR_DIAG_ERROR, - "Expecting floating point value for " + - name + ", found '" + data.str() + - "' instead.", line_num_)); - } - else { - LOG_WARNING(this->FormatDiagnostic(STAR_DIAG_WARNING, - "Expecting floating point value for " + - name + ", found '" + data.str() + - "' instead.", line_num_)); - } - } - return value; -} - int StarParser::TryGetInt(const StringRef& data, const String& name) const { std::pair<bool, int> value = data.to_int(); @@ -136,27 +90,6 @@ int StarParser::TryGetInt(const StringRef& data, const String& name) const return value.second; } -std::pair<bool, int> StarParser::TryGetInt(const StringRef& data, - const String& name, - bool may_fail) const -{ - std::pair<bool, int> value = data.to_int(); - if (!value.first) { - if (!may_fail) { - throw IOException(this->FormatDiagnostic(STAR_DIAG_ERROR, - "Expecting integer value for " + - name + ", found '" + data.str() + - "' instead.", line_num_)); - } else { - LOG_WARNING(this->FormatDiagnostic(STAR_DIAG_WARNING, - "Expecting integer value for " + - name + ", found '" + data.str() + - "' instead.", line_num_)); - } - } - return value; -} - bool StarParser::TryGetBool(const StringRef& data, const String& name) const { if (data.length() == 1) { diff --git a/modules/io/src/mol/star_parser.hh b/modules/io/src/mol/star_parser.hh index 75feb7adf..96da40e73 100644 --- a/modules/io/src/mol/star_parser.hh +++ b/modules/io/src/mol/star_parser.hh @@ -23,8 +23,6 @@ /* Author: Marco Biasini */ -#include <boost/iostreams/filtering_stream.hpp> - #include <iostream> #include <fstream> #include <vector> @@ -150,14 +148,6 @@ public: /// OnBeginData() returned true. virtual void OnEndData() { } - /// \brief try to convert a value to Real, on failure raise an exception. - /// - /// \param data value to be converted - /// \param name to be included in the message - /// - /// \return converted value - Real TryGetReal(const StringRef& data, const String& name) const; - /// \brief try to convert a value to float, on failure raise an exception. /// /// \param data value to be converted @@ -166,17 +156,6 @@ public: /// \return converted value float TryGetFloat(const StringRef& data, const String& name) const; - /// \brief try to convert a value to float, on failure raise an exception. - /// - /// \param data value to be converted - /// \param name to be included in the message - /// \param may_fail decides if an exception is raised (false) or not (true) - /// - /// \return converted value - std::pair<bool, float> TryGetFloat(const StringRef& data, - const String& name, - bool may_fail) const; - /// \brief try to convert a value to integer, on failure raise an exception. /// /// \param data value to be converted @@ -185,17 +164,6 @@ public: /// \return converted value int TryGetInt(const StringRef& data, const String& name) const; - /// \brief try to convert a value to integer, exception can be turned off. - /// - /// \param data value to be converted - /// \param name to be included in the message - /// \param may_fail decides if an exception is raised (false) or not (true) - /// - /// \return pair with value and indicator if conversion worked - std::pair<bool, int> TryGetInt(const StringRef& data, - const String& name, - bool may_fail) const; - /// \brief try to convert a value to bool, on failure raise an exception. /// /// \param data value to be converted @@ -270,7 +238,7 @@ private: void DiagnoseUnknown(); bool ParseMultilineValue(String& value, bool skip=false); std::ifstream fstream_; - boost::iostreams::filtering_stream<boost::iostreams::input> stream_; + std::istream& stream_; String filename_; int line_num_; bool has_current_line_; diff --git a/modules/io/tests/CMakeLists.txt b/modules/io/tests/CMakeLists.txt index bcad4b24e..f10be7bc4 100644 --- a/modules/io/tests/CMakeLists.txt +++ b/modules/io/tests/CMakeLists.txt @@ -8,7 +8,6 @@ set(OST_IO_UNIT_TESTS test_iomanager.cc tests.cc test_star_parser.cc - test_mmcif_reader.cc ) if (ENABLE_IMG) list(APPEND OST_IO_UNIT_TESTS test_io_img.cc) diff --git a/modules/io/tests/test_mmcif_reader.cc b/modules/io/tests/test_mmcif_reader.cc deleted file mode 100644 index 09541ca29..000000000 --- a/modules/io/tests/test_mmcif_reader.cc +++ /dev/null @@ -1,233 +0,0 @@ -//------------------------------------------------------------------------------ -// This file is part of the OpenStructure project <www.openstructure.org> -// -// Copyright (C) 2008-2011 by the OpenStructure authors -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License as published by the Free -// Software Foundation; either version 3.0 of the License, or (at your option) -// any later version. -// This library is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -// details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with this library; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -//------------------------------------------------------------------------------ - -#include <fstream> -#include <ost/io/io_exception.hh> -#include <ost/io/mol/mmcif_reader.hh> - -#define BOOST_AUTO_TEST_DYN_LINK -#include <boost/test/unit_test.hpp> - - -using namespace ost; -using namespace ost::io; - -class TestMMCifParserProtected : MMCifParser { -public: - TestMMCifParserProtected(std::istream& stream, mol::EntityHandle& ent_handle): - MMCifParser(stream, ent_handle, IOProfile()) - { } - - TestMMCifParserProtected(std::istream& stream, mol::EntityHandle& ent_handle, - const IOProfile& profile): - MMCifParser(stream, ent_handle, profile) - { } - - using MMCifParser::IsValidPDBIdent; - using MMCifParser::ParseAtomIdent; - using MMCifParser::ParseAndAddAtom; - using MMCifParser::EnsureEnoughColumns; - using MMCifParser::TryStoreIdx; -}; - -BOOST_AUTO_TEST_SUITE( io ); - -BOOST_AUTO_TEST_CASE(mmcif_isvalidpdbid) -{ - mol::EntityHandle eh=mol::CreateEntity(); - - // on changing the tests for a PDB id in mmcif files, extend this unit test - BOOST_MESSAGE(" Running mmcif_isvalidpdbid tests..."); - std::ifstream s("testfiles/mmcif/atom_site.mmcif"); - TestMMCifParserProtected tmmcif_p(s, eh); - StringRef id = StringRef("1FOO", 4); - BOOST_MESSAGE(" Testing valid id ('"+ id.str() +"')..."); - BOOST_CHECK(tmmcif_p.IsValidPDBIdent(id)); - BOOST_MESSAGE(" done."); - id = StringRef("this is to long for a PDB id", 28); - BOOST_MESSAGE(" Testing oversized PDB id ('"+ id.str() +"')..."); - BOOST_CHECK(!tmmcif_p.IsValidPDBIdent(id)); - BOOST_MESSAGE(" done."); - id = StringRef("nFOO", 4); - BOOST_MESSAGE(" Testing PDB id with missing number ('"+ id.str() +"')..."); - BOOST_CHECK(!tmmcif_p.IsValidPDBIdent(id)); - BOOST_MESSAGE(" done."); -} - -BOOST_AUTO_TEST_CASE(mmcif_trystoreidx) -{ - mol::EntityHandle eh = mol::CreateEntity(); - - BOOST_MESSAGE(" Running mmcif_trystoreidx tests..."); - std::ifstream s("testfiles/mmcif/atom_site.mmcif"); - TestMMCifParserProtected tmmcif_p(s, eh, IOProfile()); - StarLoopDesc mmcif_h; - mmcif_h.SetCategory(StringRef("Foo", 3)); - // negative - BOOST_CHECK_THROW(tmmcif_p.TryStoreIdx(0, "bar", mmcif_h), IOException); - // positive - mmcif_h.Add(StringRef("bar", 3)); - BOOST_CHECK_NO_THROW(tmmcif_p.TryStoreIdx(0, "bar", mmcif_h)); -} - -BOOST_AUTO_TEST_CASE(mmcif_atom_site_header) -{ - mol::EntityHandle eh=mol::CreateEntity(); - - BOOST_MESSAGE(" Running mmcif_atom_site_header tests..."); - std::ifstream s("testfiles/mmcif/atom_site.mmcif"); - MMCifParser mmcif_p(s, eh, IOProfile()); - StarLoopDesc mmcif_h; - mmcif_h.SetCategory(StringRef("atom_site", 9)); - BOOST_MESSAGE(" auth_asym_id"); - BOOST_CHECK_THROW(mmcif_p.OnBeginLoop(mmcif_h), IOException); - mmcif_h.Add(StringRef("auth_asym_id", 12)); - BOOST_MESSAGE(" id"); - BOOST_CHECK_THROW(mmcif_p.OnBeginLoop(mmcif_h), IOException); - mmcif_h.Add(StringRef("id", 2)); - BOOST_MESSAGE(" label_alt_id"); - BOOST_CHECK_THROW(mmcif_p.OnBeginLoop(mmcif_h), IOException); - mmcif_h.Add(StringRef("label_alt_id", 12)); - BOOST_MESSAGE(" label_asym_id"); - BOOST_CHECK_THROW(mmcif_p.OnBeginLoop(mmcif_h), IOException); - mmcif_h.Add(StringRef("label_asym_id", 13)); - BOOST_MESSAGE(" label_atom_id"); - BOOST_CHECK_THROW(mmcif_p.OnBeginLoop(mmcif_h), IOException); - mmcif_h.Add(StringRef("label_atom_id", 13)); - BOOST_MESSAGE(" label_comp_id"); - BOOST_CHECK_THROW(mmcif_p.OnBeginLoop(mmcif_h), IOException); - mmcif_h.Add(StringRef("label_comp_id", 13)); - BOOST_MESSAGE(" label_entity_id"); - BOOST_CHECK_THROW(mmcif_p.OnBeginLoop(mmcif_h), IOException); - mmcif_h.Add(StringRef("label_entity_id", 15)); - BOOST_MESSAGE(" label_seq_id"); - BOOST_CHECK_THROW(mmcif_p.OnBeginLoop(mmcif_h), IOException); - mmcif_h.Add(StringRef("label_seq_id", 12)); - BOOST_MESSAGE(" type_symbol"); - BOOST_CHECK_THROW(mmcif_p.OnBeginLoop(mmcif_h), IOException); - mmcif_h.Add(StringRef("type_symbol", 11)); - BOOST_MESSAGE(" Cartn_x"); - BOOST_CHECK_THROW(mmcif_p.OnBeginLoop(mmcif_h), IOException); - mmcif_h.Add(StringRef("Cartn_x", 7)); - BOOST_MESSAGE(" Cartn_y"); - BOOST_CHECK_THROW(mmcif_p.OnBeginLoop(mmcif_h), IOException); - mmcif_h.Add(StringRef("Cartn_y", 7)); - BOOST_MESSAGE(" Cartn_z"); - BOOST_CHECK_THROW(mmcif_p.OnBeginLoop(mmcif_h), IOException); - mmcif_h.Add(StringRef("Cartn_z", 7)); - BOOST_MESSAGE(" done."); -} - -BOOST_AUTO_TEST_CASE(mmcif_ensureenoughcolumns) -{ - mol::EntityHandle eh=mol::CreateEntity(); - - BOOST_MESSAGE(" Running mmcif_ensureenoughcolumns tests..."); - std::ifstream s("testfiles/mmcif/atom_site.mmcif"); - IOProfile profile; - TestMMCifParserProtected tmmcif_p(s, eh, profile); - std::vector<StringRef> cols; - BOOST_MESSAGE(" testing short atom_site entry"); - cols.push_back(StringRef("ATOM", 4)); - BOOST_CHECK_THROW(tmmcif_p.EnsureEnoughColumns(cols, 2), IOException); - BOOST_MESSAGE(" testing correct number"); - BOOST_CHECK(tmmcif_p.EnsureEnoughColumns(cols, 1)); - BOOST_MESSAGE(" testing fault tolerant profile"); - profile.fault_tolerant = true; - BOOST_CHECK(!tmmcif_p.EnsureEnoughColumns(cols, 2)); - BOOST_MESSAGE(" done."); -} - -BOOST_AUTO_TEST_CASE(mmcif_parseatomident) -{ - mol::EntityHandle eh = mol::CreateEntity(); - - BOOST_MESSAGE(" Running mmcif_parseatomident tests..."); - std::ifstream s("testfiles/mmcif/atom_site.mmcif"); - IOProfile profile; - TestMMCifParserProtected tmmcif_p(s, eh, profile); - std::vector<StringRef> cols; - String chain_name; - StringRef res_name; - mol::ResNum resnum(0); - StringRef atom_name; - char alt_loc; - - BOOST_MESSAGE(" testing short atom_site entry"); - // negative - cols.push_back(StringRef("ATOM", 4)); - BOOST_CHECK_THROW(tmmcif_p.ParseAtomIdent(cols, - chain_name, - res_name, - resnum, - atom_name, - alt_loc), IOException); - // positive - StarLoopDesc tmmcif_h; - tmmcif_h.SetCategory(StringRef("atom_site", 9)); - // build header - //mmcif_h.Add(StringRef("AUTH_ASYM_ID", 12)); - /* - this->TryStoreIdx(AUTH_ASYM_ID, "auth_asym_id", header); - this->TryStoreIdx(ID, "id", header); - this->TryStoreIdx(LABEL_ALT_ID, "label_alt_id", header); - this->TryStoreIdx(LABEL_ASYM_ID, "label_asym_id", header); - this->TryStoreIdx(LABEL_ATOM_ID, "label_atom_id", header); - this->TryStoreIdx(LABEL_COMP_ID, "label_comp_id", header); - this->TryStoreIdx(LABEL_ENTITY_ID, "label_entity_id", header); - this->TryStoreIdx(LABEL_SEQ_ID, "label_seq_id", header); - this->TryStoreIdx(TYPE_SYMBOL, "type_symbol", header); - this->TryStoreIdx(CARTN_X, "Cartn_x", header); - this->TryStoreIdx(CARTN_Y, "Cartn_y", header); - this->TryStoreIdx(CARTN_Z, "Cartn_z", header); -*/ - - BOOST_MESSAGE(" done."); -} - -BOOST_AUTO_TEST_CASE(mmcif_parseandaddatom) -{ - mol::EntityHandle eh = mol::CreateEntity(); - - BOOST_MESSAGE(" Running mmcif_parseandaddatom tests..."); - std::ifstream s("testfiles/mmcif/atom_site.mmcif"); - TestMMCifParserProtected tmmcif_p(s, eh, IOProfile()); - std::vector<StringRef> cols; - - BOOST_MESSAGE(" testing short atom_site entry"); - cols.push_back(StringRef("ATOM", 4)); - BOOST_CHECK_THROW(tmmcif_p.ParseAndAddAtom(cols), IOException); - BOOST_MESSAGE(" done."); -} - -BOOST_AUTO_TEST_CASE(mmcif_testreader) -{ - mol::EntityHandle eh = mol::CreateEntity(); - std::ifstream s("testfiles/mmcif/atom_site.mmcif"); - IOProfile profile; - MMCifParser mmcif_p(s, eh, profile); - - mmcif_p.Parse(); - - BOOST_REQUIRE_EQUAL(eh.GetChainCount(), 2); - BOOST_REQUIRE_EQUAL(eh.GetResidueCount(), 4); - BOOST_REQUIRE_EQUAL(eh.GetAtomCount(), 25); -} - -BOOST_AUTO_TEST_SUITE_END(); diff --git a/modules/io/tests/testfiles/mmcif/atom_site.mmcif b/modules/io/tests/testfiles/mmcif/atom_site.mmcif deleted file mode 100644 index 6c9a29637..000000000 --- a/modules/io/tests/testfiles/mmcif/atom_site.mmcif +++ /dev/null @@ -1,49 +0,0 @@ -data_1BAR - -loop_ -_atom_site.group_PDB -_atom_site.type_symbol -_atom_site.label_atom_id -_atom_site.label_comp_id -_atom_site.label_asym_id -_atom_site.label_seq_id -_atom_site.label_alt_id -_atom_site.label_entity_id -_atom_site.Cartn_x -_atom_site.Cartn_y -_atom_site.Cartn_z -_atom_site.occupancy -_atom_site.B_iso_or_equiv -_atom_site.footnote_id -_atom_site.auth_seq_id -_atom_site.id -_atom_site.auth_asym_id -ATOM N N VAL A 11 . 1 25.369 30.691 11.795 1.00 17.93 . 11 1 A -ATOM C CA VAL A 11 . 1 25.970 31.965 12.332 1.00 17.75 . 11 2 A -ATOM C C VAL A 11 . 1 25.569 32.010 13.808 1.00 17.83 . 11 3 A -ATOM O O VAL A 11 . 1 24.735 31.190 14.167 1.00 17.53 . 11 4 A -ATOM C CB VAL A 11 . 1 25.379 33.146 11.540 1.00 17.66 . 11 5 A -ATOM C CG1 VAL A 11 . 1 25.584 33.034 10.030 1.00 18.86 . 11 6 A -ATOM C CG2 VAL A 11 . 1 23.933 33.309 11.872 1.00 17.12 . 11 7 A -ATOM N N THR A 12 . 1 26.095 32.930 14.590 1.00 18.97 4 12 8 A -ATOM C CA THR A 12 . 1 25.734 32.995 16.032 1.00 19.80 4 12 9 A -ATOM C C THR A 12 . 1 24.695 34.106 16.113 1.00 20.92 4 12 10 A -ATOM O O THR A 12 . 1 24.869 35.118 15.421 1.00 21.84 4 12 11 A -ATOM C CB THR A 12 . 1 26.911 33.346 17.018 1.00 20.51 4 12 12 A -ATOM O OG1 THR A 12 3 1 27.946 33.921 16.183 0.50 20.29 4 12 13 A -ATOM O OG1 THR A 12 4 1 27.769 32.142 17.103 0.50 20.59 4 12 14 A -ATOM C CG2 THR A 12 3 1 27.418 32.181 17.878 0.50 20.47 4 12 15 A -ATOM C CG2 THR A 12 4 1 26.489 33.778 18.426 0.50 20.00 4 12 16 A -ATOM N N ILE A 13 . 1 23.664 33.855 16.884 1.00 22.08 . 13 17 A -ATOM C CA ILE A 13 . 1 22.623 34.850 17.093 1.00 23.44 . 13 18 A -ATOM C C ILE A 13 . 1 22.657 35.113 18.610 1.00 25.77 . 13 19 A -ATOM O O ILE A 13 . 1 23.123 34.250 19.406 1.00 26.28 . 13 20 A -ATOM C CB ILE A 13 . 1 21.236 34.463 16.492 1.00 22.67 . 13 21 A -ATOM C CG1 ILE A 13 . 1 20.478 33.469 17.371 1.00 22.14 . 13 22 A -ATOM C CG2 ILE A 13 . 1 21.357 33.986 15.016 1.00 21.75 . 13 23 A -# - - - - data truncated for brevity - - - - -HETATM C C1 APS C 14 1 1 4.171 29.012 7.116 0.58 17.27 1 300 101 A -HETATM C C2 APS C 14 1 1 4.949 27.758 6.793 0.58 16.95 1 300 102 A -HETATM O O3 APS C 14 1 1 4.800 26.678 7.393 0.58 16.85 1 300 103 A -HETATM N N4 APS C 14 1 1 5.930 27.841 5.869 0.58 16.43 1 300 104 A -# - - - - data truncated for brevity - - - - -- GitLab