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 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 __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
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
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
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