📄 owmoleculevisualizer.py
字号:
self.setFragmentSmilesCombo()
self.updateFragmentsListBox()
self.selectedFragment=""
self.showImages()
else:
self.setFragmentSmilesCombo()
#self.fragmentSmilesAttr=0
self.updateFragmentsListBox()
if self.showFragments:
self.destroyImageWidgets()
def filterSmilesVariables(self, data):
candidates=data.domain.variables+data.domain.getmetas().values()
candidates=filter(lambda v:v.varType==orange.VarTypes.Discrete or v.varType==orange.VarTypes.String, candidates)
vars=[]
for var in candidates:
count=0
for e in data:
if OEParseSmiles(OEGraphMol(), str(e[var])):
count+=1
if float(count)/float(len(data))>0.5:
vars.append(var)
names=[v.name for v in data.domain.variables+data.domain.getmetas().values()]
names=filter(lambda n:OEParseSmiles(OEGraphMol(), n), names)
return vars, names
def setMoleculeSmilesCombo(self):
candidates, self.defFragmentSmiles=self.filterSmilesVariables(self.molData)
self.candidateMolSmilesAttr=candidates
self.moleculeSmilesCombo.clear()
self.moleculeSmilesCombo.insertStrList([v.name for v in candidates])
if self.moleculeSmilesAttr>=len(candidates):
self.moleculeSmilesAttr=0
def setMoleculeTitleCombo(self):
vars=self.molData.domain.variables+self.molData.domain.getmetas().values()
self.moleculeTitleCombo.clear()
self.moleculeTitleCombo.insertStrList(["None"]+[v.name for v in vars])
if self.moleculeTitleAttr>len(vars):
self.moleculeTitleAttr=0
self.candidateMolTitleAttr=[None]+[v for v in vars]
def setFragmentSmilesCombo(self):
if self.fragData:
candidates, names=self.filterSmilesVariables(self.fragData)
else:
candidates=[]
self.candidateFragSmilesAttr=[None]+candidates
self.fragmentSmilesCombo.clear()
self.fragmentSmilesCombo.insertStrList(["Default"]+[v.name for v in candidates])
if self.fragmentSmilesAttr>len(candidates):
self.fragmentSmilesAttr=0
def updateFragmentsListBox(self):
fAttr=self.candidateFragSmilesAttr[self.fragmentSmilesAttr]
if fAttr:
self.fragmentSmiles=[""]+[str(e[fAttr]) for e in self.fragData if not e[fAttr].isSpecial()]
else:
self.fragmentSmiles=[""]+self.defFragmentSmiles
self.listBox.clear()
self.listBox.insertStrList(self.fragmentSmiles)
def fragmentSelection(self, index):
self.selectedFragment=self.fragmentSmiles[index]
if not self.showFragments and self.colorFragments:
self.redrawImages()
def renderImages(self):
self.imageWidgets=[]
if self.showFragments and self.fragmentSmiles:
for i,fragment in enumerate(self.fragmentSmiles[1:]):
imagename=self.imageprefix+str(i)+".bmp"
#vis.molecule2BMP(fragment, imagename, self.imageSize)
image=MolImage(self, self.molWidget, DrawContext(molecule=fragment, imagename=imagename, size=self.imageSize))
self.gridLayout.addWidget(image, i/self.numColumns, i%self.numColumns)
self.imageWidgets.append(image)
elif self.molData:
sAttr=self.candidateMolSmilesAttr[min(self.moleculeSmilesAttr, len(self.candidateMolSmilesAttr)-1)]
tAttr=self.candidateMolTitleAttr[min(self.moleculeTitleAttr, len(self.candidateMolTitleAttr)-1)]
if self.moleculeTitleAttr:
titleList=[str(e[tAttr]) for e in self.molData if not e[sAttr].isSpecial()]
else:
titleList=[]
if not sAttr:
return
molSmiles=[str(e[sAttr]) for e in self.molData if not e[sAttr].isSpecial()]
for i,(molecule, title) in enumerate(zip(molSmiles, titleList or [""]*len(molSmiles))):
imagename=self.imageprefix+str(i)+".bmp"
if self.colorFragments:
context=DrawContext(molecule=molecule, fragment=self.selectedFragment, imagename=imagename, size=self.imageSize, title=title)
#vis.moleculeFragment2BMP(molecule, self.selectedFragment, imagename, self.imageSize)
else:
context=DrawContext(molecule=molecule, imagename=imagename, size=self.imageSize, title=title)
#vis.molecule2BMP(molecule, imagename, self.imageSize)
image=MolImage(self, self.molWidget, context)
self.gridLayout.addWidget(image, i/self.numColumns, i%self.numColumns)
self.imageWidgets.append(image)
#print "done drawing"
for w in self.imageWidgets:
w.show()
def destroyImageWidgets(self):
for w in self.imageWidgets:
self.molWidget.removeChild(w)
self.imageWidgets=[]
def showImages(self):
self.destroyImageWidgets()
#print "destroyed"
self.renderImages()
def redrawImages(self):
selected=map(lambda i:self.imageWidgets.index(i), filter(lambda i:i.selected, self.imageWidgets))
self.showImages()
for i in selected:
self.imageWidgets[i].selected=True
self.imageWidgets[i].repaint()
def mouseAction(self, image, event):
if self.ctrlPressed:
image.selected=not image.selected
else:
for i in self.imageWidgets:
i.selected=False
i.repaint()
image.selected=True
image.repaint()
if self.commitOnChange:
self.commit()
def selectMarked(self):
if not self.showFragments:
molecules=[i.context.molecule for i in self.imageWidgets]
fMap=orngChem.map_fragments([self.selectedFragment], molecules)
for i in self.imageWidgets:
if fMap[i.context.molecule][self.selectedFragment]:
i.selected=True
else:
i.selected=False
i.repaint()
if self.commitOnChange:
self.commit()
def commit(self):
if self.showFragments:
sAttr=self.candidateMolSmilesAttr[self.moleculeSmilesAttr]
molecules=map(str, [e[sAttr] for e in self.molData])
fragments=[i.context.molecule for i in self.imageWidgets if i.selected]
fragmap=orngChem.map_fragments(fragments, molecules)
match=filter(lambda m:max(fragmap[m].values()), molecules)
examples=[e for e in self.molData if str(e[sAttr]) in match]
table=orange.ExampleTable(examples)
self.send("Selected Molecules", table)
else:
mols=[i.context.molecule for i in self.imageWidgets if i.selected]
sAttr=self.candidateMolSmilesAttr[self.moleculeSmilesAttr]
examples=[e for e in self.molData if str(e[sAttr]) in mols]
table=orange.ExampleTable(examples)
self.send("Selected Molecules", table)
def keyPressEvent(self, key):
if key.key()==Qt.Key_Control:
self.ctrlPressed=TRUE
else:
key.ignore()
def keyReleaseEvent(self, key):
if key.key()==Qt.Key_Control:
self.ctrlPressed=FALSE
else:
key.ignore()
if __name__=="__main__":
app=QApplication(sys.argv)
w=OWMoleculeVisualizer()
app.setMainWidget(w)
w.show()
data=orange.ExampleTable("E://fragG.tab")
w.setMoleculeTable(data)
data=orange.ExampleTable("E://chem//new//sf.tab")
w.setFragmentTable(data)
app.exec_loop()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -