Skip to content
Snippets Groups Projects
Commit 6066cba9 authored by Marco Biasini's avatar Marco Biasini
Browse files

deal with empty struct_ref_seq_dif.seq_num

struct_ref_seq_dif.seq_num is set to ? or . in case of
deletions in the deposited structure. We now set seq_num
to -1 in that case and no longer throw an exception.
parent b7f87fa4
Branches
Tags
No related merge requests found
......@@ -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)
......
......@@ -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;
}
......
......@@ -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_;
};
......
......@@ -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;
}
......
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment