Esempio n. 1
0
 def gui(self):
     fr = Frame(self)
     b=Button(fr,text='load csv',command=self.importCSV)
     b.pack(side=LEFT,fill=BOTH,padx=1)
     b=Button(fr,text='load ekin',command=self.loadProject)
     b.pack(side=LEFT,fill=BOTH,padx=1)
     self.stopbtn=Button(fr,text='stop',command=self.stopFit)#,state=DISABLED)
     self.stopbtn.pack(side=LEFT,fill=BOTH,padx=1)
     self.previmg = Ekin_images.prev()
     b=Button(fr,text='prev',image=self.previmg,command=self.prev)
     b.pack(side=LEFT,fill=BOTH)
     self.nextimg = Ekin_images.next()
     b=Button(fr,text='next',image=self.nextimg,command=self.next)
     b.pack(side=LEFT,fill=BOTH)
     fr.pack(side=TOP)
     self.dsetselector = Pmw.ComboBox(fr, entry_width=15,
                     selectioncommand = self.selectDataset)
     self.dsetselector.pack(side=LEFT,fill=BOTH,padx=1)
     fr2 = Frame(self)
     fr2.pack(side=TOP)
     self.plotfunctionvar = IntVar()
     cb=Checkbutton(fr2, text='plot function only',variable=self.plotfunctionvar)
     cb.pack(side=TOP)
     self.plotframe = PlotPanel(parent=self, side=BOTTOM, height=200)
     self.dsindex = 0
     self.opts = {'markersize':18,'fontsize':10,'showfitvars':True}
     return
Esempio n. 2
0
 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
Esempio n. 3
0
    def __init__(self, master, app=None):

        Frame.__init__(self, master)
        self.app = app
        self.E = None
        if hasattr(self.app,'p'):
            self.p = self.app.p     #reference to pipeline object
        fr = Frame(self)
        self.totalvar = IntVar()
        lfr=Frame(fr)
        lfr.pack()
        Label(lfr,text='Datasets:').pack(side=LEFT,fill=BOTH)
        l=Label(lfr,text='',textvariable=self.totalvar)
        l.pack(side=LEFT,fill=BOTH)
        b=Button(fr,text='update',command=self.update)
        b.pack(side=TOP,fill=BOTH)
        self.previmg = Images.prev()
        b=Button(fr,text='prev',image=self.previmg,compound='left',command=self.prev)
        b.pack(side=TOP,fill=BOTH)
        self.nextimg = Images.next()
        b=Button(fr,text='next',image=self.nextimg,compound='left',command=self.next)
        b.pack(side=TOP,fill=BOTH)
        self.numplotscounter = Pmw.Counter(fr,
                labelpos='w',
                label_text='plots:',
                entryfield_value=1,
                entry_width=3,
                datatype = 'integer',
                entryfield_command=self.replot,
                entryfield_validate={'validator':'numeric', 'min':1,'max':12})
        self.numplotscounter.pack()
        self.overlayvar = BooleanVar(); self.overlayvar.set(False)
        Checkbutton(fr, text='overlay plots', variable=self.overlayvar, command=self.replot).pack(side=TOP,fill=BOTH)
        self.normalizevar = BooleanVar(); self.normalizevar.set(False)
        Checkbutton(fr, text='normalize', variable=self.normalizevar, command=self.replot).pack(side=TOP,fill=BOTH)

        fr.pack(side=LEFT)
        self.plotframe = PlotPanel(parent=self, side=BOTTOM, height=200, tools=True)
        self.dsindex = 0
        self.plotframe.Opts.opts['fontsize']=10

        b=Button(fr,text='open in Ekin',command=self.loadEkin)
        b.pack(side=TOP,fill=BOTH)
        return
Esempio n. 4
0
class PlotPreviewer(Frame):
    def __init__(self, master, app=None):

        Frame.__init__(self, master)
        self.app = app
        self.E = None
        if hasattr(self.app,'p'):
            self.p = self.app.p     #reference to pipeline object
        fr = Frame(self)
        self.totalvar = IntVar()
        lfr=Frame(fr)
        lfr.pack()
        Label(lfr,text='Datasets:').pack(side=LEFT,fill=BOTH)
        l=Label(lfr,text='',textvariable=self.totalvar)
        l.pack(side=LEFT,fill=BOTH)
        b=Button(fr,text='update',command=self.update)
        b.pack(side=TOP,fill=BOTH)
        self.previmg = Images.prev()
        b=Button(fr,text='prev',image=self.previmg,compound='left',command=self.prev)
        b.pack(side=TOP,fill=BOTH)
        self.nextimg = Images.next()
        b=Button(fr,text='next',image=self.nextimg,compound='left',command=self.next)
        b.pack(side=TOP,fill=BOTH)
        self.numplotscounter = Pmw.Counter(fr,
                labelpos='w',
                label_text='plots:',
                entryfield_value=1,
                entry_width=3,
                datatype = 'integer',
                entryfield_command=self.replot,
                entryfield_validate={'validator':'numeric', 'min':1,'max':12})
        self.numplotscounter.pack()
        self.overlayvar = BooleanVar(); self.overlayvar.set(False)
        Checkbutton(fr, text='overlay plots', variable=self.overlayvar, command=self.replot).pack(side=TOP,fill=BOTH)
        self.normalizevar = BooleanVar(); self.normalizevar.set(False)
        Checkbutton(fr, text='normalize', variable=self.normalizevar, command=self.replot).pack(side=TOP,fill=BOTH)

        fr.pack(side=LEFT)
        self.plotframe = PlotPanel(parent=self, side=BOTTOM, height=200, tools=True)
        self.dsindex = 0
        self.plotframe.Opts.opts['fontsize']=10

        b=Button(fr,text='open in Ekin',command=self.loadEkin)
        b.pack(side=TOP,fill=BOTH)
        return

    def replot(self):
        """Replot"""

        if len(self.E.datasets) == 0:
            print 'no datasets to plot, check your config'
            self.clear()
            return

        p = int(self.numplotscounter.getvalue())
        if p > self.E.length: p = self.E.length
        if p>1:
            if self.dsindex+p>self.E.length:
                start = self.E.length - p
            else:
                start = self.dsindex
            dsets = self.E.datasets[start:self.dsindex+p]
            c=math.ceil(math.sqrt(p))
        else:
            dsets = self.E.datasets[self.dsindex]
            c=1

        if self.overlayvar.get() == True:
            plotopt = 3
            self.plotframe.Opts.opts['title']=' '
            self.plotframe.Opts.opts['legend'] = 1
        else:
            plotopt = 2
            self.plotframe.Opts.opts['title']=None
        self.plotframe.Opts.opts['normalise'] = self.normalizevar.get()
        self.plotframe.plotCurrent(dsets, cols=c, plotoption=plotopt)
        return

    def loadData(self, data):
        """Load dict into datasets"""
        E = self.E = Utilities.getEkinProject(data)
        self.plotframe.setProject(E)
        self.totalvar.set(self.E.length)
        return

    def update(self, evt=None):
        """Reload data dict from main app"""
        self.p = self.app.p
        data = self.p.doImport()
        if data == None: return
        self.dsindex = 0
        self.loadData(data)
        self.replot()
        return

    def clear(self):
        self.E = None
        self.plotframe.clear()
        return

    def prev(self):
        if self.E == None: return
        if self.dsindex <= 0:
            self.dsindex = 0
        else:
            self.dsindex -= 1
        self.replot()
        return

    def next(self):
        if self.E == None: return
        if self.dsindex >= self.E.length-1:
            self.dsindex = self.E.length-1
        else:
            self.dsindex += 1
        self.replot()
        return

    def loadEkin(self):
        if self.E != None:
            EK = EkinApp(parent=self, project=self.E)
        return
Esempio n. 5
0
class FitPreviewer(Frame):
    """Class to preview model fitting in plot"""
    def __init__(self, master, app=None):

        Frame.__init__(self, master)
        self.main=self.master
        self.app = app
        self.E = None
        self.gui()
        self.sampleData()
        self.stop = False
        return

    def gui(self):
        fr = Frame(self)
        b=Button(fr,text='load csv',command=self.importCSV)
        b.pack(side=LEFT,fill=BOTH,padx=1)
        b=Button(fr,text='load ekin',command=self.loadProject)
        b.pack(side=LEFT,fill=BOTH,padx=1)
        self.stopbtn=Button(fr,text='stop',command=self.stopFit)#,state=DISABLED)
        self.stopbtn.pack(side=LEFT,fill=BOTH,padx=1)
        self.previmg = Ekin_images.prev()
        b=Button(fr,text='prev',image=self.previmg,command=self.prev)
        b.pack(side=LEFT,fill=BOTH)
        self.nextimg = Ekin_images.next()
        b=Button(fr,text='next',image=self.nextimg,command=self.next)
        b.pack(side=LEFT,fill=BOTH)
        fr.pack(side=TOP)
        self.dsetselector = Pmw.ComboBox(fr, entry_width=15,
                        selectioncommand = self.selectDataset)
        self.dsetselector.pack(side=LEFT,fill=BOTH,padx=1)
        fr2 = Frame(self)
        fr2.pack(side=TOP)
        self.plotfunctionvar = IntVar()
        cb=Checkbutton(fr2, text='plot function only',variable=self.plotfunctionvar)
        cb.pack(side=TOP)
        self.plotframe = PlotPanel(parent=self, side=BOTTOM, height=200)
        self.dsindex = 0
        self.opts = {'markersize':18,'fontsize':10,'showfitvars':True}
        return

    def sampleData(self):
        E =self.E = EkinProject()
        E.createSampleData()
        self.plotframe.setProject(E)
        self.datasets = sorted(self.E.datasets)
        self.replot()
        self.updateSelector()
        return

    def updateSelector(self):
        self.dsindex=0
        lst = self.datasets
        self.dsetselector.setlist(lst)
        self.dsetselector.selectitem(lst[self.dsindex])
        return

    def replot(self, dset=None):
        """Replot"""

        if dset==None:
            dset = self.datasets[self.dsindex]
        self.plotframe.plotCurrent(dset,options=self.opts)
        return

    def finishFit(self, X):
        """Call when fitting done"""
        d = self.datasets[self.dsindex]
        model = X.getResult()['model']
        fitdata = Fitting.makeFitData(model, X.variables, X.getError())
        self.E.setFitData(d, fitdata)
        self.replot()
        self.stop = False
        return

    def stopFit(self):
        self.stop = True
        return

    def getCurrentData(self):
        dset = self.datasets[self.dsindex]
        ek = self.E.getDataset(dset)
        return ek.getxy()

    def updateFit(self, selfdiff, vrs, fitvals, c, X):
        self.plotframe.updateFit(X, showfitvars=True)
        self.update_idletasks()
        self.update()
        if self.stop == True:
            X.stop_fit = 1
        return

    def prev(self):
        if self.dsindex <= 0:
            self.dsindex = 0
        else:
            self.dsindex -= 1
        self.replot()
        self.dsetselector.selectitem(self.datasets[self.dsindex])
        return

    def next(self):
        if self.dsindex >= self.E.length-1:
            self.dsindex = self.E.length-1
        else:
            self.dsindex += 1
        self.replot()
        self.dsetselector.selectitem(self.datasets[self.dsindex])
        return

    def selectDataset(self, name):
        self.dsindex = self.datasets.index(name)
        self.replot(name)
        return

    def importCSV(self):
        """Import csv file"""
        from PEATDB.Ekin.IO import Importer
        importer = Importer(self, parent_win=self)
        importer.path = os.getcwd()
        newdata = importer.import_multiple()
        for name in newdata.keys():
            self.E.insertDataset(newdata[name], newname=name)
        self.datasets = sorted(self.E.datasets)
        self.dsindex = self.datasets.index(name)
        self.replot()
        self.updateSelector()
        return

    def loadProject(self):
        filename=tkFileDialog.askopenfilename(defaultextension='.ekinprj',
                                              initialdir=os.getcwd(),
                                              filetypes=[("Ekin files","*.ekinprj"),
                                                         ("All files","*.*")],
                                              parent=self.main)
        if not filename: return
        self.E.openProject(filename)
        self.datasets = sorted(self.E.datasets)
        self.replot()
        self.updateSelector()
        return

    def findBestModel(self, models, callback=None):
        """Determine best fit model using SS F-test"""
        dset = self.datasets[self.dsindex]
        ek = self.E.getDataset(dset)
        fitdata,p = Fitting.findBestModel(ek, models=models, silent=True)
        best = fitdata['model']
        text = 'Best model is %s with p value=%2.2e' %(best,p)
        tkMessageBox.showinfo('Best fit model result',text)
        return
Esempio n. 6
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