⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 owmoleculevisualizer.py

📁 orange源码 数据挖掘技术
💻 PY
📖 第 1 页 / 共 2 页
字号:
            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 + -