diff --git a/modules/gui/src/data_viewer/data_viewer_panel_base.cc b/modules/gui/src/data_viewer/data_viewer_panel_base.cc index c89f27655663dfb8c6b6becb455d5ef39756b8ac..205012c1321d161599fdada91b6d16d3b8caf974 100644 --- a/modules/gui/src/data_viewer/data_viewer_panel_base.cc +++ b/modules/gui/src/data_viewer/data_viewer_panel_base.cc @@ -1071,7 +1071,11 @@ void DataViewerPanelBase::draw_pixel_values(QPainter& painter) unsigned char rgb = (rv>130.0) ? 0 : 255; painter.setPen(QColor(rgb,rgb,rgb)); int string_h=painter.fontMetrics().height(); +#if (QT_VERSION < QT_VERSION_CHECK(5,11,0)) + int string_w=painter.fontMetrics().width(value_string); +#else int string_w=painter.fontMetrics().horizontalAdvance(value_string); +#endif painter.drawText(p.x() - string_w/2, p.y() + string_h/2, value_string); } } @@ -1087,7 +1091,11 @@ void DataViewerPanelBase::draw_pixel_values(QPainter& painter) unsigned char rgb = (rv>130.0) ? 0 : 255; painter.setPen(QColor(rgb,rgb,rgb)); int string_h=painter.fontMetrics().height(); +#if (QT_VERSION < QT_VERSION_CHECK(5,11,0)) + int string_w=painter.fontMetrics().width(value_string); +#else int string_w=painter.fontMetrics().horizontalAdvance(value_string); +#endif painter.drawText(p.x() - string_w/2, p.y() + string_h/2, value_string); } } diff --git a/modules/gui/src/python_shell/python_shell_widget.cc b/modules/gui/src/python_shell/python_shell_widget.cc index 040ee6b1f91772de9003ceabc15d76c9dbc7e2b0..a7d4ae61a85787962391a82aeb6f63185c1084e1 100644 --- a/modules/gui/src/python_shell/python_shell_widget.cc +++ b/modules/gui/src/python_shell/python_shell_widget.cc @@ -76,7 +76,11 @@ PythonShellWidget::PythonShellWidget(QWidget* parent): setUndoRedoEnabled(false); setFont(QFont("Courier",font().pointSize()+2)); QFontMetrics metrics(font()); +#if (QT_VERSION < QT_VERSION_CHECK(5,11,0)) + setTabStopWidth(2*metrics.width(" ")); +#else setTabStopDistance(2*metrics.horizontalAdvance(" ")); +#endif setMaximumBlockCount(1000000); textCursor().block().setUserState(BLOCKTYPE_ACTIVE); @@ -534,7 +538,11 @@ void PythonShellWidget::OnExecuteStateEntered() void PythonShellWidget::SetTabWidth(int width) { tab_width_=width; QFontMetrics metrics(font()); +#if (QT_VERSION < QT_VERSION_CHECK(5,11,0)) + setTabStopWidth(tab_width_*metrics.width(" ")); +#else setTabStopDistance(tab_width_*metrics.horizontalAdvance(" ")); +#endif } diff --git a/modules/gui/src/sequence_viewer/sequence_table_view.cc b/modules/gui/src/sequence_viewer/sequence_table_view.cc index c72842704ecc71c4bc161bc27681ffb71c4058d2..95aa637cd4fc8995736fb2646f641721dacbb4f9 100644 --- a/modules/gui/src/sequence_viewer/sequence_table_view.cc +++ b/modules/gui/src/sequence_viewer/sequence_table_view.cc @@ -477,7 +477,11 @@ void SequenceTableView::keyPressEvent(QKeyEvent* event) } int SequenceTableView::sizeHintForColumn(int column) const { - return this->fontMetrics().horizontalAdvance('W'); +#if (QT_VERSION < QT_VERSION_CHECK(5,11,0)) + return this->fontMetrics().width('W'); +#else + return this->fontMetrics().horizontalAdvance('W'); +#endif } int SequenceTableView::sizeHintForRow(int row) const { diff --git a/modules/mol/alg/pymod/dockq.py b/modules/mol/alg/pymod/dockq.py index c22ca78d21746de90900b2a1f539d931c8cc65a8..126c8f57519472b8cb74ccaa45e5b0719c9043f8 100644 --- a/modules/mol/alg/pymod/dockq.py +++ b/modules/mol/alg/pymod/dockq.py @@ -1,5 +1,6 @@ from ost import geom from ost import mol +from ost import seq def _PreprocessStructures(mdl, ref, mdl_ch1, mdl_ch2, ref_ch1, ref_ch2, ch1_aln = None, ch2_aln = None): @@ -15,7 +16,56 @@ def _PreprocessStructures(mdl, ref, mdl_ch1, mdl_ch2, ref_ch1, ref_ch2, ref_residues_1 = list() ref_residues_2 = list() - if ch1_aln is None and ch2_aln is None: + if ch1_aln is not None and ch2_aln is not None: + # there are potentially already views attached to the alns but + # we go for *mdl* and *ref* here + if ch1_aln.GetCount() != 2 or ch2_aln.GetCount() != 2: + raise RuntimeError("Expect exactly two sequences in provided alns!") + + tmp = ch1_aln.GetSequence(0) + ref_s1 = seq.CreateSequence(tmp.GetName(), str(tmp)) + ref_s1.SetOffset(tmp.GetOffset()) + ref_s1.AttachView(ref.Select(f"cname={ref_ch1}")) + tmp = ch1_aln.GetSequence(1) + mdl_s1 = seq.CreateSequence(tmp.GetName(), str(tmp)) + mdl_s1.SetOffset(tmp.GetOffset()) + mdl_s1.AttachView(mdl.Select(f"cname={mdl_ch1}")) + new_ch1_aln = seq.CreateAlignment(ref_s1, mdl_s1) + for col in new_ch1_aln: + if col[0] != '-' and col[1] != '-': + ref_r = col.GetResidue(0) + mdl_r = col.GetResidue(1) + if not (ref_r.IsValid() and ref_r.one_letter_code == col[0]): + raise RuntimeError("DockQ: mismatch between provided " + "alignments and ATOMSEQ in structures") + if not (mdl_r.IsValid() and mdl_r.one_letter_code == col[1]): + raise RuntimeError("DockQ: mismatch between provided " + "alignments and ATOMSEQ in structures") + ref_residues_1.append(ref_r) + mdl_residues_1.append(mdl_r) + + tmp = ch2_aln.GetSequence(0) + ref_s2 = seq.CreateSequence(tmp.GetName(), str(tmp)) + ref_s2.SetOffset(tmp.GetOffset()) + ref_s2.AttachView(ref.Select(f"cname={ref_ch2}")) + tmp = ch2_aln.GetSequence(1) + mdl_s2 = seq.CreateSequence(tmp.GetName(), str(tmp)) + mdl_s2.SetOffset(tmp.GetOffset()) + mdl_s2.AttachView(mdl.Select(f"cname={mdl_ch2}")) + new_ch2_aln = seq.CreateAlignment(ref_s2, mdl_s2) + for col in new_ch2_aln: + if col[0] != '-' and col[1] != '-': + ref_r = col.GetResidue(0) + mdl_r = col.GetResidue(1) + if not (ref_r.IsValid() and ref_r.one_letter_code == col[0]): + raise RuntimeError("DockQ: mismatch between provided " + "alignments and ATOMSEQ in structures") + if not (mdl_r.IsValid() and mdl_r.one_letter_code == col[1]): + raise RuntimeError("DockQ: mismatch between provided " + "alignments and ATOMSEQ in structures") + ref_residues_2.append(ref_r) + mdl_residues_2.append(mdl_r) + else: # go by residue numbers for mdl_r in mdl.Select(f"cname={mdl_ch1}").residues: ref_r = ref.FindResidue(ref_ch1, mdl_r.GetNumber()) @@ -27,8 +77,6 @@ def _PreprocessStructures(mdl, ref, mdl_ch1, mdl_ch2, ref_ch1, ref_ch2, if ref_r.IsValid(): mdl_residues_2.append(mdl_r) ref_residues_2.append(ref_r) - else: - raise NotImplementedError("No aln mapping implemented yet") new_mdl = mdl.handle.CreateEmptyView() new_ref = ref.handle.CreateEmptyView() diff --git a/modules/mol/alg/pymod/scoring.py b/modules/mol/alg/pymod/scoring.py index 1cb97530eadd1f90f30a31b25df4405c798cf7b2..a2fd44555d11563032e9152e0ad61b42245f445a 100644 --- a/modules/mol/alg/pymod/scoring.py +++ b/modules/mol/alg/pymod/scoring.py @@ -878,28 +878,43 @@ class Scorer: nonmapped_interface_counts = list() flat_mapping = self.mapping.GetFlatMapping() + pep_seqs = set([s.GetName() for s in self.chain_mapper.polypep_seqs]) for trg_int in self.qs_scorer.qsent1.interacting_chains: trg_ch1 = trg_int[0] trg_ch2 = trg_int[1] - if trg_ch1 in flat_mapping and trg_ch2 in flat_mapping: - mdl_ch1 = flat_mapping[trg_ch1] - mdl_ch2 = flat_mapping[trg_ch2] - res = dockq.DockQ(self.model, self.target, mdl_ch1, mdl_ch2, - trg_ch1, trg_ch2) - if res["nnat"] > 0: - self._dockq_interfaces.append((trg_ch1, trg_ch2, - mdl_ch1, mdl_ch2)) - self._dockq_native_contacts.append(res["nnat"]) - self._dockq_scores.append(res["DockQ"]) - else: - # interface which is not covered by mdl... let's run DockQ with - # trg as trg/mdl in order to get the native contacts out - res = dockq.DockQ(self.target, self.target, - trg_ch1, trg_ch2, trg_ch1, trg_ch2) - if res["nnat"] > 0: - self._dockq_nonmapped_interfaces.append((trg_ch1, - trg_ch2)) - self._dockq_nonmapped_interfaces_counts.append(res["nnat"]) + if trg_ch1 in pep_seqs and trg_ch2 in pep_seqs: + if trg_ch1 in flat_mapping and trg_ch2 in flat_mapping: + mdl_ch1 = flat_mapping[trg_ch1] + mdl_ch2 = flat_mapping[trg_ch2] + aln1 = self.mapping.alns[(trg_ch1, mdl_ch1)] + aln2 = self.mapping.alns[(trg_ch2, mdl_ch2)] + # we're operating on the model/target from the MappingResult + # as their ATOMSEQ corresponds to the alignments above. + # Residues that do not contain all atoms required for + # ChainMapper (e.g. N, CA, C, CB) are removed which triggers + # a mismatch error in DockQ + model = self.mapping.model + target = self.mapping.target + res = dockq.DockQ(model, target, mdl_ch1, mdl_ch2, + trg_ch1, trg_ch2, ch1_aln=aln1, + ch2_aln=aln2) + if res["nnat"] > 0: + self._dockq_interfaces.append((trg_ch1, trg_ch2, + mdl_ch1, mdl_ch2)) + self._dockq_native_contacts.append(res["nnat"]) + self._dockq_scores.append(res["DockQ"]) + else: + # interface which is not covered by mdl... let's run DockQ + # with trg as trg/mdl in order to get the native contacts + # out + # no need to pass alns as the residue numbers match for sure + res = dockq.DockQ(self.target, self.target, + trg_ch1, trg_ch2, trg_ch1, trg_ch2) + nnat = res["nnat"] + if nnat > 0: + self._dockq_nonmapped_interfaces.append((trg_ch1, + trg_ch2)) + self._dockq_nonmapped_interfaces_counts.append(nnat) # there are 4 types of combined scores # - simple average