From 532f5b41d3cc03f805cefb507b9d206510f2ba8c Mon Sep 17 00:00:00 2001
From: Xavier Robin <xavier.robin@unibas.ch>
Date: Mon, 22 Jul 2024 18:02:39 +0200
Subject: [PATCH] fix: allow duplicate _struct_ref_seq.align_id in
 fault_tolerant mode

---
 modules/io/src/mol/mmcif_info.cc   | 13 +++++++++++--
 modules/io/src/mol/mmcif_info.hh   |  3 ++-
 modules/io/src/mol/mmcif_reader.cc |  2 +-
 3 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/modules/io/src/mol/mmcif_info.cc b/modules/io/src/mol/mmcif_info.cc
index 77ae60402..da2922234 100644
--- a/modules/io/src/mol/mmcif_info.cc
+++ b/modules/io/src/mol/mmcif_info.cc
@@ -196,11 +196,20 @@ void MMCifInfoBioUnit::Merge(MMCifInfoBioUnit& from)
 MMCifInfoStructRefSeqPtr 
 MMCifInfoStructRef::AddAlignedSeq(const String& aid, const String& chain_name, 
                                   int seq_begin, int seq_end, int db_begin, 
-                                  int db_end)
+                                  int db_end, bool fault_tolerant)
 {
   std::map<String, MMCifInfoStructRefSeqPtr>::const_iterator i=seqs_.find(aid);
   if (i!=seqs_.end()) {
-    throw IOException("duplicate align_id for struct_ref '"+id_+"'");
+    std::stringstream msg;
+    msg << "Duplicate align_id for struct_ref '" << id_ << "'";
+    if (fault_tolerant) {
+      msg << ". Record will be overwritten.";
+      LOG_WARNING(msg.str());
+    }
+    else {
+      throw IOException(msg.str());
+    }
+
   }
   MMCifInfoStructRefSeqPtr p(new MMCifInfoStructRefSeq(aid, chain_name,
                                                        seq_begin, seq_end, 
diff --git a/modules/io/src/mol/mmcif_info.hh b/modules/io/src/mol/mmcif_info.hh
index 73d3c25d2..73946c139 100644
--- a/modules/io/src/mol/mmcif_info.hh
+++ b/modules/io/src/mol/mmcif_info.hh
@@ -858,7 +858,8 @@ public:
   const String& GetDBAccess() const { return db_access_; }
   MMCifInfoStructRefSeqPtr AddAlignedSeq(const String& align_id,
                                          const String& chain_name, int seq_begin,
-                                         int seq_end, int db_begin, int db_end);
+                                         int seq_end, int db_begin, int db_end,
+                                         bool fault_tolerant);
   MMCifInfoStructRefSeqPtr GetAlignedSeq(const String& align_id) const;
   MMCifInfoStructRefSeqs GetAlignedSeqs() const
   {
diff --git a/modules/io/src/mol/mmcif_reader.cc b/modules/io/src/mol/mmcif_reader.cc
index 5ebb954dc..64d632755 100644
--- a/modules/io/src/mol/mmcif_reader.cc
+++ b/modules/io/src/mol/mmcif_reader.cc
@@ -1686,7 +1686,7 @@ void MMCifReader::ParseStructRefSeq(const std::vector<StringRef>& columns)
        e=struct_refs_.end(); i!=e; ++i) { 
     if ((*i)->GetID()==sr_id) {
      (*i)->AddAlignedSeq(aln_id, chain_name, entbeg.second, entend.second, 
-                          dbbeg.second, dbend.second);
+                          dbbeg.second, dbend.second, profile_.fault_tolerant);
      found=true;
        break;
     }
-- 
GitLab