Example #1
0
 def showEkinTable(self, parent, E=None):
     """Show a list of ekin prj datasets in a table"""
     self.currentmodel = EkinProjModel(E)
     fr=Frame(parent)
     self.pw.add(fr,minsize=200)
     self.ekintable = EkinProjTable(fr, self.currentmodel)
     self.ekintable.createTableFrame()
     return
Example #2
0
class NMRTitration(Plugin, GUI_help):
    """NMR ph titration analysis"""
    capabilities = ['gui']
    menuentry = 'NMR Titration Analysis'

    def main(self, parent=None):
        if parent!=None:
            self.DB = parent.DB
        self._doFrame()
        return

    def _doFrame(self):
        if self.parent == None:
            self.mainwin=Toplevel()
        else:
            self.mainwin=Toplevel()
        # Get platform into a variable
        import platform
        self.currplatform = platform.system()
        self.mainwin.title('NMR Titration Analysis')
        self.mainwin.geometry('800x600+200+100')
        self.createMenuBar()
        self.ekinprojects = {}
        self.addToolBar()
        return

    # GUI stuff

    def createMenuBar(self):
        """Create the menu bar for the application. """
        self.menu=Menu(self.mainwin)

        self.file_menu={ '01Open Ekin project':{'cmd':self.loadEkinProj},
                         '02Open DB':{'cmd':self.openDB},
                         '03Quit':{'cmd':self.quit}}
        self.file_menu=self.create_pulldown(self.menu,self.file_menu)
        self.menu.add_cascade(label='File',menu=self.file_menu['var'])

        self.util_menu={'01Edit Dict':{'cmd': self.editDict},
                        '02Autoset Residue Names':{'cmd': self.add_ResidueNames},
                        '03Autoset Residue Numbers':{'cmd': self.add_ResidueNumbers}}

        self.util_menu=self.create_pulldown(self.menu,self.util_menu)
        self.menu.add_cascade(label='Utils',menu=self.util_menu['var'])

        self.anal_menu={'01Chem. shift distrib':{'cmd': self.analysepKas},
                        '02Compare Across Nuclei':{'cmd': self.compareNuclei},
                        '03Ghost Mapping':{'cmd': self.doMapping}}
        self.anal_menu=self.create_pulldown(self.menu,self.anal_menu)
        self.menu.add_cascade(label='Analysis',menu=self.anal_menu['var'])
        self.mainwin.config(menu=self.menu)
        return

    def addToolBar(self):
        fr=self.toolbar=Frame(self.mainwin)
        fr.pack(side=TOP,fill=X)
        Button(fr, text='Get Ekin prj from DB', command=self.selectfromDB,
                    relief=GROOVE, bg='#B0C4DE').pack(side=LEFT)
        Button(fr, text='Plot Selected', command=self.plotSelected,
                    relief=GROOVE, bg='#B0C4DE').pack(side=LEFT)
        '''Button(fr, text='Fit Selected', command=self.fittSelected,
                    relief=GROOVE, bg='#B0C4DE').pack() '''
        self.dbstatus=StringVar()
        Label(self.toolbar,textvariable=self.dbstatus).pack(side=LEFT)
        return

    def updateDBStatus(self):
        if self.DB != None:
            self.dbstatus.set('db loaded with %s recs' %len(self.DB.getRecs()))
        return

    def selectfromDB(self):
        """Get an ekin prj from the DB"""
        if self.DB == None:
            return
        from PEATDB.Actions import DBActions
        fr=Toplevel()
        rbox, cbox = DBActions.getRecordsSelector(self.DB,fr)
        def loadselected():
            item = rbox.curselection()[0]
            rec = self.DB.getRecs()[int(item)]
            item = cbox.curselection()[0]
            col = self.DB.getFields()[int(item)]
            E=self.DB[rec][col]
            self.loadEkinProj(E)
            fr.destroy()
        Button(fr, text='OK',
                command=loadselected).grid(row=3,column=0,
                columnspan=2,sticky='news',padx=1,pady=3)
        return

    def showEkinProject(self, E):
        """Show ekin prj"""
        if hasattr(self, 'pw'):
            self.pw.destroy()
        self.pw = PanedWindow(self.mainwin,
                           orient=HORIZONTAL,
                           sashwidth=3,
                           showhandle=True,
                           opaqueresize=False)
        self.pw.pack(side=LEFT,fill=BOTH,expand=1)
        self.showEkinTable(self.pw, E)
        self.showPlotPanel(self.pw, E)
        return

    def showEkinTable(self, parent, E=None):
        """Show a list of ekin prj datasets in a table"""
        self.currentmodel = EkinProjModel(E)
        fr=Frame(parent)
        self.pw.add(fr,minsize=200)
        self.ekintable = EkinProjTable(fr, self.currentmodel)
        self.ekintable.createTableFrame()
        return

    def showPlotPanel(self, parent, E=None):
        """Add an ekin plot frame"""
        fr=Frame(parent)
        self.pw.add(fr)
        self.plotframe = PlotPanel(parent=fr, tools=True)
        if E != None:
            E.checkDatasets()
            self.plotframe.setProject(E)
            self.plotSelected()
        return

    def plotSelected(self):
        """Plot ekin """
        datasets = self.ekintable.get_selectedRecordNames()
        self.plotframe.plotCurrent(datasets=datasets)
        return

    def add_ResidueNames(self):
        """Try to set residue names for selected datasets"""
        return

    def add_ResidueNumbers(self):
        """Try to set residue numbers from dataset names"""
        return

    def analysepKas(self, p=None):
        """Get the main pKas of all/titr group and do analysis"""
        E = self.currprj
        if E==None: return
        t = TitrationAnalyser()
        if p == None:
            p = t.findpKas(E, titratable=True, reliable=False, minspan=0.06)
        t.analysepKas(p)
        return

    def compareNuclei(self):
        """Compare corresponding datasets for a protein """
        return

    def doMapping(self):
        return

    def editDict(self):
        """Edit ghost pka mapping in table"""
        D = DictEditor(self)
        return

    # Mainly IO methods

    def openDB(self):
        import tkFileDialog
        filename=tkFileDialog.askopenfilename(defaultextension='.fs',
                                              filetypes=[("PEAT DB","*.fs"),
                                                        ("All files","*.*")],
                                              parent=self.mainwin)
        if filename != None:
            self.loadDB(filename)
            self.updateDBStatus()
        return

    def loadEkinProj(self, E=None):
        """Load an ekin project file"""
        import os, types
        if E == None:
            import tkFileDialog
            filename=tkFileDialog.askopenfilename(defaultextension='.ekinprj',
                                                  filetypes=[("Ekin project","*.ekinprj"),
                                                             ("All files","*.*")],
                                                  parent=self.mainwin)
            if filename != None:
                if os.path.isfile(filename):
                    fd=open(filename)
                    import pickle
                    data=pickle.load(fd)
                    E=EkinProject(data=data)
                    self.ekinprojects[filename] = E
                    fd.close()
            else:
                return
        self.currprj = E
        self.showEkinProject(E)
        return

    def addEkinProj(self, ekinproj=None, replace=1):
        """Load an ekin project file"""
        return

    def quit(self):
        self.mainwin.destroy()
        return

    def analyseTitDB(self, DB, col, names=None):
        """Extract titdb pKas"""
        import matplotlib.pyplot as plt
        plt.rc('font',size=28)
        plt.rc('savefig',dpi=300)
        plt.rc('axes',linewidth=.5)
        #plt.rc('text',usetex=True)

        nuclnames = {'1H NMR':'H','15N NMR':'N'}
        t = TitrationAnalyser()
        #extract reliable pkas from selected proteins
        #p = t.extractpKas(DB, col, names=names, titratable=False, reliable=False, minspan=0.06)
        #t.analysepKas(p)
        t.compareNuclei(DB, '15N NMR', '1H NMR', names=names, titratable=True)

        return

    def save(self, DB, col, prot, E):
        if E==None and DB != None:
            E.saveProject(prot+'_'+col)
            DB[prot][col] = E
        else:
            E.currentmode = 'NMR titration'
            E.saveProject()
        return

    def titDBUtils(self, DB=None, col=None, prot=None, a=None, E=None,
                    refit=False, addmeta=False, getexperrs=False,
                    yuncert=None):
        """Add some meta and refit all for an ekin prj or a rec/field in db"""
        if E==None and DB != None:
            E = DB[prot][col]
            E.checkDatasets()
        t = TitrationAnalyser()
        if refit == True:
            models = ['Linear', '1 pKa 2 Chemical shifts',
                        '2 pKas, 3 Chemical shifts',
                        '3 pKas, 4 Chemical shifts']
            E = t.findBest(E, models, geterrs=False)
        if addmeta == True:
            E = t.setMetaInfo(E, atom=a)
        if getexperrs == True:
            if yuncert == None:
                print 'No value for Y uncertainty!, please supply it'
                return
            print 'Using %s for y uncertainty.' %yuncert
            print
            E = t.getExpErrs(E, xuncert=0.1, yuncert=yuncert)
        self.save(DB, col, prot, E)
        #DB.commit('refit/added meta info')
        return E

    def benchmarkExpErr(self, DB):
        """Test effects of model and noise on est exp error technique"""
        E = DB['HEWL']['1H NMR']
        d='D66N-HN'
        E.plotDatasets(d,filename='experrtest.png')
        print E.getFitData(d)
        ferrs = E.estimateExpUncertainty(d, runs=20,
                xuncert=0.1, yuncert=0.03)
        print ferrs
        return

    def addpKaTables(self, DB, names, col='1H NMR'):
        """Create labbook tables for 'real' pKas for required proteins"""
        t = TitrationAnalyser()
        prots = t.getProtNames(DB)
        for name in names:
            recname = DB.getRecordName(name)
            E = DB[recname][col]
            titrresidues = t.getResidues(E, titratable=True)
            S = DB.createLabbookSheet(name+'.pKas')
            for r in titrresidues:
                d, res, resnum = r
                pKa = ''
                S.addRecord(res+resnum,pka=pKa,resname=res,
                            resnum=resnum,error='')
            DB.saveLabbook(name+'.pKas', S)
        DB.saveLabbooktoFile('titdb.labbook')
        return

    def exportAll(self, DB, col=None):
        t = TitrationAnalyser()
        t.exportAll(DB, col)
        return