diff --git a/modules/io/pymod/export_mmcif_io.cc b/modules/io/pymod/export_mmcif_io.cc index 908886257ab5b99bd97acf8946a39c0fb18c9188..8fbb402a15a1c1f85822890972606a6491097a55 100644 --- a/modules/io/pymod/export_mmcif_io.cc +++ b/modules/io/pymod/export_mmcif_io.cc @@ -167,7 +167,8 @@ void export_mmcif_io() MMCifInfoStructRefSeqDifPtr>("MMCifInfoStructRefSeqDif", no_init) .add_property("details", make_function(&MMCifInfoStructRefSeqDif::GetDetails, return_value_policy<copy_const_reference>())) - .add_property("rnum", &MMCifInfoStructRefSeqDif::GetRNum) + .add_property("seq_rnum", &MMCifInfoStructRefSeqDif::GetSeqRNum) + .add_property("db_rnum", &MMCifInfoStructRefSeqDif::GetDBRNum) ; class_<MMCifInfoBioUnit>("MMCifInfoBioUnit", init<>()) .def("SetDetails", &MMCifInfoBioUnit::SetDetails) diff --git a/modules/io/src/mol/mmcif_info.cc b/modules/io/src/mol/mmcif_info.cc index d99b0bd2254cb0dec07d04f6fe7b31ca6ad8bc49..c8565a2e809ff1f84b182b9f73e4cacd1866c509 100644 --- a/modules/io/src/mol/mmcif_info.cc +++ b/modules/io/src/mol/mmcif_info.cc @@ -64,9 +64,10 @@ MMCifInfoStructRef::GetAlignedSeq(const String& aid) const } MMCifInfoStructRefSeqDifPtr -MMCifInfoStructRefSeq::AddDif(int rnum, const String& details) +MMCifInfoStructRefSeq::AddDif(int seq_rnum, int db_rnum, const String& details) { - MMCifInfoStructRefSeqDifPtr d(new MMCifInfoStructRefSeqDif(rnum, details)); + MMCifInfoStructRefSeqDifPtr d(new MMCifInfoStructRefSeqDif(seq_rnum, db_rnum, + details)); difs_.push_back(d); return d; } diff --git a/modules/io/src/mol/mmcif_info.hh b/modules/io/src/mol/mmcif_info.hh index 81d5b546aa95402303ab7cdcde95e5ec177a14a9..38e49f58bec9420e353088d8a7858908be887456 100644 --- a/modules/io/src/mol/mmcif_info.hh +++ b/modules/io/src/mol/mmcif_info.hh @@ -669,7 +669,8 @@ public: int GetSeqEnd() const { return seq_end_; } int GetDBBegin() const { return db_begin_; } int GetDBEnd() const { return db_end_; } - MMCifInfoStructRefSeqDifPtr AddDif(int seq_num, const String& details); + MMCifInfoStructRefSeqDifPtr AddDif(int seq_num, int db_num, + const String& details); const std::vector<MMCifInfoStructRefSeqDifPtr>& GetDifs() const { return difs_; } private: String id_; @@ -683,12 +684,14 @@ private: class DLLEXPORT_OST_IO MMCifInfoStructRefSeqDif { public: - MMCifInfoStructRefSeqDif(int rnum, const String& details): - rnum_(rnum), details_(details) {} - int GetRNum() const { return rnum_;} + MMCifInfoStructRefSeqDif(int seq_rnum, int db_rnum, const String& details): + seq_rnum_(seq_rnum), db_rnum_(db_rnum), details_(details) {} + int GetSeqRNum() const { return seq_rnum_;} + int GetDBRNum() const { return db_rnum_; } const String& GetDetails() const { return details_; } private: - int rnum_; + int seq_rnum_; + int db_rnum_; String details_; }; diff --git a/modules/io/src/mol/mmcif_reader.cc b/modules/io/src/mol/mmcif_reader.cc index f2b66ee35e195a0b196504cbd0f11c7879b779a6..c58c14c8dc433bbfc6c2948b8fa97dc57fa358d6 100644 --- a/modules/io/src/mol/mmcif_reader.cc +++ b/modules/io/src/mol/mmcif_reader.cc @@ -30,6 +30,12 @@ namespace ost { namespace io { + +bool is_undef(StringRef value) +{ + return value.size()==1 && (value[0]=='?' || value[0]=='.'); +} + MMCifReader::MMCifReader(std::istream& stream, mol::EntityHandle& ent_handle, const IOProfile& profile): StarParser(stream, true), profile_(profile), ent_handle_(ent_handle) @@ -321,7 +327,8 @@ bool MMCifReader::OnBeginLoop(const StarLoopDesc& header) } else if (header.GetCategory()=="struct_ref_seq_dif") { category_ = STRUCT_REF_SEQ_DIF; this->TryStoreIdx(SRSD_ALIGN_ID, "align_id", header); - this->TryStoreIdx(SRSD_RNUM, "seq_num", header); + this->TryStoreIdx(SRSD_SEQ_RNUM, "seq_num", header); + this->TryStoreIdx(SRSD_DB_RNUM, "pdbx_seq_db_seq_num", header); indices_[SRSD_DETAILS]=header.GetIndex("details"); cat_available = true; } @@ -1480,10 +1487,21 @@ void MMCifReader::ParseStructRefSeq(const std::vector<StringRef>& columns) void MMCifReader::ParseStructRefSeqDif(const std::vector<StringRef>& columns) { String aln_id=columns[indices_[SRSD_ALIGN_ID]].str(); - std::pair<bool,int> rnum=this->TryGetInt(columns[indices_[SRSD_RNUM]], - "_struct_ref_seq_dif.seq_num", - profile_.fault_tolerant); - if (!rnum.first) { + std::pair<bool,int> db_rnum(true, -1); + if (!is_undef(columns[indices_[SRSD_DB_RNUM]])) { + db_rnum=this->TryGetInt(columns[indices_[SRSD_DB_RNUM]], + "_struct_ref_seq_dif.pdbx_seq_db_seq_num", + profile_.fault_tolerant); + + } + std::pair<bool,int> seq_rnum(true, -1); + if (!is_undef(columns[indices_[SRSD_SEQ_RNUM]])) { + seq_rnum=this->TryGetInt(columns[indices_[SRSD_SEQ_RNUM]], + "_struct_ref_seq_dif.seq_num", + profile_.fault_tolerant); + + } + if (!seq_rnum.first || !db_rnum.first) { return; } String details; @@ -1494,7 +1512,7 @@ void MMCifReader::ParseStructRefSeqDif(const std::vector<StringRef>& columns) for (MMCifInfoStructRefs::iterator i=struct_refs_.begin(), e=struct_refs_.end(); i!=e; ++i) { if (MMCifInfoStructRefSeqPtr s=(*i)->GetAlignedSeq(aln_id)) { - s->AddDif(rnum.second, details); + s->AddDif(seq_rnum.second, db_rnum.second, details); found=true; break; } diff --git a/modules/io/src/mol/mmcif_reader.hh b/modules/io/src/mol/mmcif_reader.hh index 2a8f549ecffaaf0a5baa6ccf0234acdf7bd5970a..06215f56b9c0006843700921ef66b02c9e1dd0ad 100644 --- a/modules/io/src/mol/mmcif_reader.hh +++ b/modules/io/src/mol/mmcif_reader.hh @@ -433,7 +433,8 @@ private: /// \enum items of the struct_ref_seq_dif category typedef enum { SRSD_ALIGN_ID, - SRSD_RNUM, + SRSD_SEQ_RNUM, + SRSD_DB_RNUM, SRSD_DETAILS } StructRefSeqDifItems; /// \enum items of the pdbx_struct_assembly_gen category