00001 import platform
00002
00003 from PyQt4 import QtCore, QtGui
00004
00005 from ost import geom, gfx, gui
00006 from ost import settings
00007 from ost.bindings import tmtools
00008
00009 class SelectRefDialog(QtGui.QDialog):
00010 def __init__(self, ent_list, parent=None):
00011 QtGui.QDialog.__init__(self, parent)
00012 self.ent_list_ = ent_list
00013 vb = QtGui.QVBoxLayout()
00014 self.setLayout(vb)
00015 self.setWindowTitle("Select Reference Object")
00016 self.label = QtGui.QLabel("Please Select the Reference Object")
00017 self.list = QtGui.QTableWidget(self)
00018 self.list.horizontalHeader().setStretchLastSection(True)
00019 self.list.setColumnCount(2)
00020 self.list.verticalHeader().setVisible(False)
00021 self.list.horizontalHeader().setVisible(False)
00022 self.list.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
00023 self.list.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
00024 vb.addWidget(self.label)
00025 vb.addWidget(self.list)
00026 hb = QtGui.QHBoxLayout()
00027 hb.setDirection(QtGui.QBoxLayout.LeftToRight)
00028 cancel_btn = QtGui.QPushButton("Cancel", self)
00029 load_btn = QtGui.QPushButton("Select", self)
00030 hb.addStretch(1)
00031 hb.addWidget(cancel_btn)
00032 hb.addWidget(load_btn)
00033 vb.addItem(hb)
00034 load_btn.setDefault(True)
00035 QtCore.QObject.connect(load_btn, QtCore.SIGNAL("clicked()"), self.Select)
00036 QtCore.QObject.connect(cancel_btn, QtCore.SIGNAL("clicked()"), self.reject)
00037
00038 row = 0
00039 for ent in self.ent_list_:
00040 variant = QtCore.QVariant(ent)
00041 self.list.insertRow(row)
00042 new_item = QtGui.QTableWidgetItem("%i"%(row+1))
00043 new_item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled)
00044 new_item.setData(QtCore.Qt.UserRole,variant)
00045 self.list.setItem(row, 0, new_item)
00046 new_item = QtGui.QTableWidgetItem(ent.GetName())
00047 new_item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled)
00048 self.list.setItem(row, 1, new_item)
00049 row += 1
00050
00051 self.list.resizeColumnsToContents()
00052
00053 def Select(self):
00054 items = self.list.selectedItems()
00055 for item in items:
00056 if(item.column()==0):
00057 ent = item.data(QtCore.Qt.UserRole).toPyObject()
00058 self.ent_list_.remove(ent)
00059 self.ent_list_.insert(0,ent)
00060 self.accept()
00061
00062 def GetEntities(self):
00063 return self.ent_list_
00064
00065 class ShowResultDialog(QtGui.QDialog):
00066 def __init__(self, ent_list, res_list, parent=None):
00067 QtGui.QDialog.__init__(self, parent)
00068 self.ent_list_ = ent_list
00069 vb = QtGui.QVBoxLayout()
00070 self.setLayout(vb)
00071 self.setWindowTitle("Alignment result")
00072 self.label = QtGui.QLabel("Alignment results with %s as reference"%ent_list[0].GetName())
00073 self.list = QtGui.QTableWidget(self)
00074 self.list.horizontalHeader().setStretchLastSection(True)
00075 self.list.setColumnCount(4)
00076 self.list.verticalHeader().setVisible(False)
00077 self.list.setHorizontalHeaderLabels (["Name","RMSD","TMScore",""])
00078 self.list.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
00079 vb.addWidget(self.label)
00080 vb.addWidget(self.list)
00081 hb = QtGui.QHBoxLayout()
00082 hb.setDirection(QtGui.QBoxLayout.LeftToRight)
00083 ok_btn = QtGui.QPushButton("OK", self)
00084 hb.addStretch(1)
00085 hb.addWidget(ok_btn)
00086 vb.addItem(hb)
00087 ok_btn.setDefault(True)
00088 QtCore.QObject.connect(ok_btn, QtCore.SIGNAL("clicked()"), self.accept)
00089
00090 for i in range(0, len(res_list)):
00091 self.list.insertRow(i)
00092 new_item = QtGui.QTableWidgetItem(ent_list[i+1].GetName())
00093 new_item.setFlags(QtCore.Qt.ItemIsEnabled)
00094 self.list.setItem(i, 0, new_item)
00095 new_item = QtGui.QTableWidgetItem("%.2f"%res_list[i].rmsd)
00096 new_item.setFlags(QtCore.Qt.ItemIsEnabled)
00097 self.list.setItem(i, 1, new_item)
00098 new_item = QtGui.QTableWidgetItem("%i"%res_list[i].tm_score)
00099 new_item.setFlags(QtCore.Qt.ItemIsEnabled)
00100 self.list.setItem(i, 2, new_item)
00101 new_item = QtGui.QTableWidgetItem()
00102 new_item.setFlags(QtCore.Qt.ItemIsEnabled)
00103 self.list.setItem(i, 3, new_item)
00104
00105 self.list.resizeColumnsToContents()
00106
00107 class AlignmentContextMenu(QtCore.QObject):
00108 def __init__(self, context_menu):
00109 try:
00110 if platform.system() == "Windows":
00111 settings.Locate("tmalign.exe")
00112 else:
00113 settings.Locate("tmalign")
00114 QtCore.QObject.__init__(self, context_menu.qobject)
00115
00116 self.action = QtGui.QAction("Align", self)
00117 QtCore.QObject.connect(self.action,QtCore.SIGNAL("triggered()"), self.Align)
00118 context_menu.AddAction(self.action, gui.ContextActionType.ENTITY | gui.ContextActionType.MULTI)
00119 except settings.FileNotFound:
00120 return
00121
00122 def Align(self):
00123 scene_selection = gui.SceneSelection.Instance()
00124 ent_list = list()
00125 for i in range(0,scene_selection.GetActiveNodeCount()):
00126 ent_list.append(scene_selection.GetActiveNode(i))
00127 if len(ent_list) == 2:
00128 self.__Align(ent_list)
00129 elif len(ent_list) > 2:
00130 sd = SelectRefDialog(ent_list)
00131 if(sd.exec_()):
00132 self.__Align(sd.GetEntities())
00133
00134 def __Align(self, ent_list):
00135 node = ent_list[0]
00136 res_list = list()
00137 if isinstance(node, gfx.Entity):
00138 ref = node.view.handle
00139 for i in range(1,len(ent_list)):
00140 node = ent_list[i]
00141 if isinstance(node, gfx.Entity):
00142 res_list.append(tmtools.TMAlign(node.view.handle, ref))
00143 node.UpdatePositions()
00144 self.__ShowScore(ent_list, res_list)
00145
00146 def __ShowScore(self, ent_list, res_list):
00147 if(len(res_list)==1):
00148 res = res_list[0]
00149 string = "RMSD: %.2f, TMScore: %i"%(res.rmsd, res.tm_score)
00150 gui.GostyApp.Instance().perspective.StatusMessage(string)
00151 elif(len(res_list)>1):
00152 ShowResultDialog(ent_list, res_list).exec_()
00153
00154
00155 def _InitContextMenu(app):
00156 cm=app.scene_win.GetContextMenu()
00157 AlignmentContextMenu(cm)