From 3a538fd29077442500eaae6abbe48e47b9fd812b Mon Sep 17 00:00:00 2001 From: Geoff Hutchison Date: Fri, 13 Aug 2021 00:29:40 -0400 Subject: [PATCH] Fix crash in 1qlz PDB file from 2nd Structure Assignment Check to make sure atoms are valid before using them Signed-off-by: Geoff Hutchison --- avogadro/core/secondarystructure.cpp | 35 +++++++++++++++++----------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/avogadro/core/secondarystructure.cpp b/avogadro/core/secondarystructure.cpp index 90c6a2b2c..fe1025d0c 100644 --- a/avogadro/core/secondarystructure.cpp +++ b/avogadro/core/secondarystructure.cpp @@ -181,24 +181,31 @@ void SecondaryStructureAssigner::assignBackboneHydrogenBonds() continue; auto oxygen = residue.getAtomByName("O"); - hBondRecord* oRecord = new hBondRecord(); - oRecord->atom = oxygen.index(); - oRecord->atomZ = oxygen.position3d()[2]; - oRecord->distSquared = std::numeric_limits::max(); - oRecord->residue = residueId; - oRecord->residuePair = residueId; // just a placeholder - m_hBonds.push_back(oRecord); + if (oxygen.isValid()) { + hBondRecord* oRecord = new hBondRecord(); + oRecord->atom = oxygen.index(); + oRecord->atomZ = oxygen.position3d()[2]; + oRecord->distSquared = std::numeric_limits::max(); + oRecord->residue = residueId; + oRecord->residuePair = residueId; // just a placeholder + m_hBonds.push_back(oRecord); + } auto nitrogen = residue.getAtomByName("N"); - hBondRecord* nRecord = new hBondRecord(); - nRecord->atom = nitrogen.index(); - nRecord->atomZ = nitrogen.position3d()[2]; - nRecord->distSquared = std::numeric_limits::max(); - nRecord->residue = residueId; - nRecord->residuePair = residueId; - m_hBonds.push_back(nRecord); + if (nitrogen.isValid()) { + hBondRecord* nRecord = new hBondRecord(); + nRecord->atom = nitrogen.index(); + nRecord->atomZ = nitrogen.position3d()[2]; + nRecord->distSquared = std::numeric_limits::max(); + nRecord->residue = residueId; + nRecord->residuePair = residueId; + m_hBonds.push_back(nRecord); + } } + if (m_hBonds.size() == 0) + return; + // sort by z-coordinate std::sort(m_hBonds.begin(), m_hBonds.end(), // lambda for sorting by z-coordinate [2]