diff --git a/modules/io/src/mol/omf.cc b/modules/io/src/mol/omf.cc index bad82b3dfde6e4dd34763f48a6f03ade376ece83..a7daf239274417ed140da8593ca54efd615a31b3 100644 --- a/modules/io/src/mol/omf.cc +++ b/modules/io/src/mol/omf.cc @@ -304,15 +304,15 @@ namespace{ void Load(std::istream& stream, std::map<String, ost::io::ChainDataPtr>& map, const std::vector<ost::io::ResidueDefinition>& res_def, - bool lossy, bool avg_bfactors, bool round_bfactors, + int version, bool lossy, bool avg_bfactors, bool round_bfactors, bool skip_ss) { uint32_t size; stream.read(reinterpret_cast<char*>(&size), sizeof(uint32_t)); map.clear(); for(uint i = 0; i < size; ++i) { ost::io::ChainDataPtr p(new ost::io::ChainData); - p->FromStream(stream, res_def, lossy, avg_bfactors, round_bfactors, - skip_ss); + p->FromStream(stream, res_def, version, lossy, avg_bfactors, + round_bfactors, skip_ss); map[p->ch_name] = p; } } @@ -839,6 +839,7 @@ ChainData::ChainData(const ost::mol::ChainHandle& chain, std::unordered_map<long, int>& atom_idx_mapper) { ch_name = chain.GetName(); + chain_type = chain.GetType(); // process residues ost::mol::ResidueHandleList res_list = chain.GetResidueList(); @@ -887,6 +888,11 @@ void ChainData::ToStream(std::ostream& stream, bool lossy, bool avg_bfactors, bool round_bfactors, bool skip_ss) const { Dump(stream, ch_name); + if(chain_type > std::numeric_limits<int8_t>::max()) { + throw ost::Error("ChainType out of bounds"); + } + int8_t type = chain_type; + stream.write(reinterpret_cast<char*>(&type), sizeof(int8_t)); DumpResDefIndices(stream, res_def_indices); DumpRnums(stream, rnums); DumpInsertionCodes(stream, insertion_codes); @@ -922,10 +928,15 @@ void ChainData::ToStream(std::ostream& stream, void ChainData::FromStream(std::istream& stream, const std::vector<ResidueDefinition>& res_def, - bool lossy, bool avg_bfactors, bool round_bfactors, - bool skip_ss) { + int version, bool lossy, bool avg_bfactors, + bool round_bfactors, bool skip_ss) { Load(stream, ch_name); + if(version >= 2) { + int8_t type; + stream.read(reinterpret_cast<char*>(&type), sizeof(int8_t)); + chain_type = ost::mol::ChainType(type); + } LoadResDefIndices(stream, res_def_indices); LoadRnums(stream, rnums); LoadInsertionCodes(stream, insertion_codes); @@ -3357,7 +3368,7 @@ void OMF::FromStream(std::istream& stream) { } Load(stream, biounit_definitions_); - Load(stream, chain_data_, residue_definitions_, OptionSet(LOSSY), + Load(stream, chain_data_, residue_definitions_, version_, OptionSet(LOSSY), OptionSet(AVG_BFACTORS), OptionSet(ROUND_BFACTORS), OptionSet(SKIP_SS)); Load(stream, bond_chain_names_); Load(stream, bond_atoms_); @@ -3371,6 +3382,7 @@ void OMF::FromStream(std::istream& stream) { void OMF::FillChain(ost::mol::ChainHandle& chain, ost::mol::XCSEditor& ed, const ChainDataPtr data, geom::Mat4 t) const { + ed.SetChainType(chain, data->chain_type); geom::Vec3List* positions = &data->positions; geom::Vec3List transformed_positions; // only filled if non-identity transform if(t != geom::Mat4()) { diff --git a/modules/io/src/mol/omf.hh b/modules/io/src/mol/omf.hh index dc9dfc131897326b7a3c464ac439d214c305fa99..151550ebbe055b65241edcdbef5bace24a1d3743 100644 --- a/modules/io/src/mol/omf.hh +++ b/modules/io/src/mol/omf.hh @@ -95,7 +95,7 @@ struct BioUnitDefinition { struct ChainData { - ChainData() { } + ChainData(): ch_name(""), chain_type(ost::mol::CHAINTYPE_UNKNOWN) { } ChainData(const ost::mol::ChainHandle& chain, const std::vector<ResidueDefinition>& residue_definitions, @@ -112,11 +112,12 @@ struct ChainData { void FromStream(std::istream& stream, const std::vector<ResidueDefinition>& res_def, - bool lossy, bool avg_bfactors, bool round_bfactors, - bool skip_ss); + int version, bool lossy, bool avg_bfactors, + bool round_bfactors, bool skip_ss); // chain features String ch_name; + ost::mol::ChainType chain_type; // residue features std::vector<int> res_def_indices;