Source code for schrodinger.ui.sequencealignment.contact_map

from past.utils import old_div

from schrodinger.Qt import QtCore
from schrodinger.Qt import QtGui
from schrodinger.Qt import QtWidgets


[docs]class ContactMap(QtWidgets.QDialog):
[docs] def __init__(self, parent, title="Contact Map"): QtWidgets.QDialog.__init__(self, parent) self.resize(500, 500) self.setWindowTitle(title) self.contact_map = None self.map_image = None self.map_layout = QtWidgets.QVBoxLayout(self) self.map_frame = QtWidgets.QFrame(self) self.map_frame.setLineWidth(1) self.map_layout.addWidget(self.map_frame)
[docs] def paintEvent(self, event): QtWidgets.QDialog.paintEvent(self, event) painter = QtGui.QPainter(self) if self.map_image: img_width = self.map_image.width() img_height = self.map_image.height() frame_width = self.map_frame.width() frame_height = self.map_frame.height() if frame_width > frame_height: yscale = old_div(float(frame_height), img_height) xscale = old_div(float(frame_height), img_width) else: yscale = old_div(float(frame_width), img_height) xscale = old_div(float(frame_width), img_width) scaled_width = xscale * img_width - 50 scaled_height = yscale * img_height - 50 image = self.map_image.scaled(scaled_width, scaled_height) image = image.mirrored(vertical=True) xpos = self.map_frame.x() + 0.5 * (frame_width - scaled_width) ypos = self.map_frame.y() + 0.5 * (frame_height - scaled_height) painter.drawImage(xpos, ypos, image) painter.setPen(QtCore.Qt.black) font = painter.font() font.setPointSize(8) painter.setFont(font) painter.drawRect(xpos, ypos, scaled_width, scaled_height) hscale = old_div(float(scaled_width), img_width) vscale = old_div(float(scaled_height), img_height) pos = 0 while pos < img_width: painter.drawLine(xpos + pos * hscale, ypos + scaled_height, xpos + pos * hscale, ypos + scaled_height + 5) if pos == 0: tlabel = "1" else: tlabel = str(pos) painter.drawText(xpos + pos * hscale - 2, ypos + scaled_height + 20, tlabel) pos += 10 pos = 0 while pos < img_height: painter.drawLine(xpos - 5, ypos + scaled_height - pos * vscale - 1, xpos, ypos + scaled_height - pos * vscale - 1) if pos == 0: tlabel = "1" else: tlabel = str(pos) painter.drawText(xpos - 60, ypos + scaled_height - pos * vscale - 7, 50, 10, QtCore.Qt.AlignRight, tlabel) pos += 10
[docs] def setMap(self, contact_map, width, height): self.contact_map = contact_map self.map_image = QtGui.QImage(width, height, QtGui.QImage.Format_RGB32) min_val = max_val = contact_map[0] for y in range(height): for x in range(width): if contact_map[y * width + x] < min_val: min_val = contact_map[y * width + x] if contact_map[y * width + x] > max_val: max_val = contact_map[y * width + x] if max_val != min_val: irange = old_div(1.0, (max_val - min_val)) for y in range(height): for x in range(width): value = (contact_map[y * width + x] - min_val) * irange # if value > 0.99: # color = QtGui.QColor(255, 255, 255) # else: color = QtGui.QColor.fromHsvF(0.66 * (value), 0.75, 1.0) self.map_image.setPixel(x, y, color.rgb())