Esempio n. 1
0
 def loadModels(self):
     #print self.modelsfile
     if self.modelsfile != '':
         try:
             Fitting.loadModelsFile(self.modelsfile)
         except:
             pass
     #print Fitting.currentmodels.keys()
     return
Esempio n. 2
0
 def loadModels(self):
     #print self.modelsfile
     if self.modelsfile != '':
         try:
             Fitting.loadModelsFile(self.modelsfile)
         except:
             pass
     #print Fitting.currentmodels.keys()
     return
Esempio n. 3
0
    def fitElwellSchellman(self,E=None, d=None, xy=None,transwidth=50,
                                invert=False,show=True,figname=None):
        """Fit entire raw data simultaneously to the three main thermodynamic
           parameters using Elwell/Schellman method"""
        if E !=None:
            ek = E.getDataset(d)
            x,y,a, xerr,yerr = ek.getAll()
        elif xy!=None:
            x,y = xy
        else:
            return
        if invert == True:
            y = [max(y)-i for i in y[:]]
        f=plt.figure(figsize=(10,5))
        ax=f.add_subplot(121)
        p=ax.plot(x,y,'o',alpha=0.5)
        ax.set_xlabel('T');ax.set_xlabel('mdeg')
        ax.set_title('raw data')

        x1,y1,x,y = self.transformCD(x,y,transwidth,ax)

        t=[];dg=[]
        R=8.3144e-3
        for T,fu in zip(x,y):
            if fu>=1 or fu<=0:
                continue
            K = fu/(1-fu)
            deltaGt = -R * T * math.log(K)
            dg.append(deltaGt)
            t.append(T)

        ax1=f.add_subplot(122)
        p=ax1.plot(t,dg,'x',mew=2,color='black')
        ax1.set_xlabel('T'); ax1.set_ylabel('dG(T)')
        ax.set_title('stability curve')

        A,X=Fitting.doFit(expdata=zip(t,dg),model='schellman',grad=1e-9,conv=1e-9)
        fity = X.getFitLine(t)
        p=ax1.plot(t,fity,'r',lw=2)
        fd=X.getFitDict()
        self.drawParams(ax1,fd)
        deltaH=fd['deltaH']; deltacp=fd['deltacp']; Tm=fd['Tm']
        f.suptitle("Method 2 - deltaH: %2.2f deltaCp: %2.2e Tm: %2.2f" %(deltaH,deltacp,Tm),size=18)
        if show == True:
            self.showTkFigure(f)

        if figname == None: figname = d
        figname = figname.replace('.','_')
        fname = figname+'m1'+'.png'
        f.savefig(fname,dpi=300)
        print 'plot saved to %s' %os.path.abspath(fname)
        if E!=None:
            fdata = Fitting.makeFitData(X.name,vrs=X.variables)
            E.insertDataset(xydata=[t,dg], newname=d+'_vanthoff2',replace=True,fit=fdata)
            #E.saveProject()
        return deltaH, Tm, deltacp
Esempio n. 4
0
 def findBestModel(self):
     """Determine best fit model using SS F-test"""
     models = self.modelselector.getcurselection()
     if len(models)<2:
         print 'select 2 or more models'
         return
     fitters= []
     for m in models:
         model = self.modelsdict[m]
         X = self.createFitter(model, m)
         fitters.append(X)
     Fitting.updateModels(self.modelsdict)
     self.previewer.findBestModel(models)
     return
Esempio n. 5
0
 def testFitter(self):
     """Parse the entry fields and create the fitter"""
     self.currentmodel = self.parseValues()
     X = self.createFitter(self.currentmodel, self.currentname)
     X.guess_start()
     if self.previewer.plotfunctionvar.get() == 1:
         self.previewer.plotframe.clearData()
         self.previewer.plotframe.updateFit(X, showfitvars=True)
     else:
         X.fit(rounds=60)
         self.updateModelsDict()
         #update the global fitting models since the plotter uses them
         Fitting.updateModels(self.modelsdict)
         self.previewer.finishFit(X)
     return
Esempio n. 6
0
    def __init__(self, parent=None):

        self.parent=parent
        if not self.parent:
            Frame.__init__(self)
            self.main=self.master
        else:
            self.main=Toplevel()
            #self.master=self.main
        self.main.title('Model Design')
        ws = self.main.winfo_screenwidth()
        hs = self.main.winfo_screenheight()
        w = 900; h=600
        x = (ws/2)-(w/2); y = (hs/2)-(h/2)
        self.main.geometry('%dx%d+%d+%d' % (w,h,x,y))
        self.main.protocol('WM_DELETE_WINDOW',self.quit)
        self.tableformat = {'cellwidth':50, 'thefont':"Arial 10",
                            'rowheight':16, 'editable':False,
                            'rowselectedcolor':'yellow'}
        self.filename = None
        self.modelsdict = Fitting.createModels()
        self.setupGUI()
        self.currentname = 'Linear'
        self.loadModel(self.currentname)
        return
Esempio n. 7
0
 def breslauerMethod(self,E=None, d=None, xy=None,invert=False,
                     show=True,figname=None):
     """Finds slope of trans region and plugs this in to equation
     http://www.springerlink.com/content/r34n0201g30563u7/  """
     if E !=None:
         ek = E.getDataset(d)
         x,y,a, xerr,yerr = ek.getAll()
     elif xy!=None:
         x,y = xy
     else:
         return
     f=plt.figure(figsize=(10,6))
     ax=f.add_subplot(111)
     ax.set_xlabel('T')
     p=ax.plot(x,y,'o',alpha=0.5)
     d50 = self.guessMidpoint(x,y)
     A,X=Fitting.doFit(expdata=zip(x,y),model='Unfolding',conv=1e-7,noiter=60,
                         guess=False,startvalues=[1,1,1,1,1,d50])
     fity = X.getFitLine(x)
     p=ax.plot(x,fity,'r',lw=2)
     fd=X.getFitDict()
     self.drawParams(ax,fd)
     Tm = fd['d50']; m = fd['m']
     R = 8.3144e-3
     deltaH =  R * math.pow(Tm,2) * m
     f.suptitle("Method 4 - deltaH: %2.2f Tm: %2.2f" %(deltaH,Tm),size=18)
     if show == True:
         self.showTkFigure(f)
     if figname != None:
         figname = figname.replace('.','_')
         f.savefig(figname)
         plt.close()
     return deltaH, Tm
Esempio n. 8
0
 def createFitter(self, model, name):
     """Create fitter from the current model entry values"""
     fitclass = Fitting.createClass(**model)
     x,y = self.previewer.getCurrentData()
     X = fitclass(exp_data=zip(x,y),variables=None,
                  callback=self.previewer.updateFit,
                  name=name)
     return X
Esempio n. 9
0
 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. 10
0
 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
Esempio n. 11
0
    def findVariableName(self, model, i=0):
        """Find a parameter name for the given model at index i,
           used so we don't cause an error when doing processFits when no
           variable is given in the conf file"""

        X = Fitting.getFitter(model)
        if X == None:
            print 'no fitter found for this model name'
            return 'a'
        varname = X.getVarNames()[i]
        return varname
Esempio n. 12
0
    def findVariableName(self, model, i=0):
        """Find a parameter name for the given model at index i,
           used so we don't cause an error when doing processFits when no
           variable is given in the conf file"""

        X = Fitting.getFitter(model)
        if X==None:
            print 'no fitter found for this model name'
            return 'a'
        varname = X.getVarNames()[i]
        return varname
Esempio n. 13
0
    def transformCD(self, x, y, transwidth=None, ax=None):
        """Transform raw data into fraction unfolded per temp value, by fitting to
            a general unfolding equation that extracts baseline/slopes"""
        #fit baseline slopes and get intercepts
        d50 = self.guessMidpoint(x, y)
        print 'fitting to get baseline slopes and intercepts..'
        print 'midpoint is %s' % d50
        A, X = Fitting.doFit(expdata=zip(x, y),
                             model='Unfolding',
                             noiter=50,
                             silent=True,
                             guess=False,
                             startvalues=[1, 1, 1, 1, 1, d50])
        #print X.getResult()
        fity = X.getFitLine(x)
        fd = X.getFitDict()
        if ax != None:
            p = ax.plot(x, fity, 'r', lw=2)
            self.drawParams(ax, fd)
        #we then use slopes and intercepts get frac unfolded at each temp
        mn = fd['bn']
        mu = fd['bd']  #slopes
        #if mu>0.01: mu = 0.01
        yn = fd['an']
        yu = fd['ad']  #intercepts
        d50 = fd['d50']
        m = fd['m']

        t = []
        f = []
        #print mu, mn
        for T, yo in zip(x, y):
            fu = (yo - (yn + mn * T)) / ((yu + mu * T) - (yn + mn * T))
            #print fu, (yo-(yn+mn*T)), (m), mu, mn
            #if f>0:
            f.append(fu)
            t.append(T)

        #try to take useful transition region of data
        at, af = t, f
        diff = 1e5
        if transwidth != None:
            for i in t:
                d = abs(i - d50)
                if d < diff:
                    mid = t.index(i)
                    diff = d
            L = int(mid - transwidth)
            U = int(mid + transwidth)
            t, f = t[L:U], f[L:U]

        return at, af, t, f
Esempio n. 14
0
 def simulateCD(self,noise=1.0):
     """Simulate some CD spec data"""
     x=list(numpy.arange(290,380,0.2)); y=[]
     X=Fitting.getFitter(model='Unfolding',
                           vrs=[-16, 0.01, -11.6, 0.01, 2.7, 324])
     fity = X.getFitLine(x)
     for i in fity:
         noise=numpy.random.normal(i, 1.0/2)
         y.append(i+noise)
     cw=csv.writer(open('cd.csv','w'))
     for row in zip(x,y):
         cw.writerow(row)
     return x,y
Esempio n. 15
0
 def simulateCD(self, noise=1.0):
     """Simulate some CD spec data"""
     x = list(numpy.arange(290, 380, 0.2))
     y = []
     X = Fitting.getFitter(model='Unfolding',
                           vrs=[-16, 0.01, -11.6, 0.01, 2.7, 324])
     fity = X.getFitLine(x)
     for i in fity:
         noise = numpy.random.normal(i, 1.0 / 2)
         y.append(i + noise)
     cw = csv.writer(open('cd.csv', 'w'))
     for row in zip(x, y):
         cw.writerow(row)
     return x, y
Esempio n. 16
0
 def breslauerMethod(self,
                     E=None,
                     d=None,
                     xy=None,
                     invert=False,
                     show=True,
                     figname=None):
     """Finds slope of trans region and plugs this in to equation
     http://www.springerlink.com/content/r34n0201g30563u7/  """
     if E != None:
         ek = E.getDataset(d)
         x, y, a, xerr, yerr = ek.getAll()
     elif xy != None:
         x, y = xy
     else:
         return
     f = plt.figure(figsize=(10, 6))
     ax = f.add_subplot(111)
     ax.set_xlabel('T')
     p = ax.plot(x, y, 'o', alpha=0.5)
     d50 = self.guessMidpoint(x, y)
     A, X = Fitting.doFit(expdata=zip(x, y),
                          model='Unfolding',
                          conv=1e-7,
                          noiter=60,
                          guess=False,
                          startvalues=[1, 1, 1, 1, 1, d50])
     fity = X.getFitLine(x)
     p = ax.plot(x, fity, 'r', lw=2)
     fd = X.getFitDict()
     self.drawParams(ax, fd)
     Tm = fd['d50']
     m = fd['m']
     R = 8.3144e-3
     deltaH = R * math.pow(Tm, 2) * m
     f.suptitle("Method 4 - deltaH: %2.2f Tm: %2.2f" % (deltaH, Tm),
                size=18)
     if show == True:
         self.showTkFigure(f)
     if figname != None:
         figname = figname.replace('.', '_')
         f.savefig(figname)
         plt.close()
     return deltaH, Tm
Esempio n. 17
0
    def transformCD(self,x,y,transwidth=None,ax=None):
        """Transform raw data into fraction unfolded per temp value, by fitting to
            a general unfolding equation that extracts baseline/slopes"""
        #fit baseline slopes and get intercepts
        d50 = self.guessMidpoint(x,y)
        print 'fitting to get baseline slopes and intercepts..'
        print 'midpoint is %s' %d50
        A,X=Fitting.doFit(expdata=zip(x,y),model='Unfolding',noiter=50,silent=True,
                           guess=False,startvalues=[1,1,1,1,1,d50])
        #print X.getResult()
        fity = X.getFitLine(x)
        fd=X.getFitDict()
        if ax!=None:
            p=ax.plot(x,fity,'r',lw=2)
            self.drawParams(ax,fd)
        #we then use slopes and intercepts get frac unfolded at each temp
        mn = fd['bn']; mu = fd['bd'] #slopes
        #if mu>0.01: mu = 0.01
        yn = fd['an']; yu = fd['ad'] #intercepts
        d50 = fd['d50']; m = fd['m']

        t=[]; f=[]
        #print mu, mn
        for T,yo in zip(x,y):
            fu = (yo-(yn+mn*T)) / ((yu+mu*T)-(yn+mn*T))
            #print fu, (yo-(yn+mn*T)), (m), mu, mn
            #if f>0:
            f.append(fu)
            t.append(T)

        #try to take useful transition region of data
        at,af=t,f
        diff=1e5
        if transwidth != None:
            for i in t:
                d=abs(i-d50)
                if d<diff:
                    mid = t.index(i)
                    diff=d
            L=int(mid-transwidth); U=int(mid+transwidth)
            t,f = t[L:U], f[L:U]

        return at,af,t,f
Esempio n. 18
0
    def fitElwellSchellman(self,
                           E=None,
                           d=None,
                           xy=None,
                           transwidth=50,
                           invert=False,
                           show=True,
                           figname=None):
        """Fit entire raw data simultaneously to the three main thermodynamic
           parameters using Elwell/Schellman method"""
        if E != None:
            ek = E.getDataset(d)
            x, y, a, xerr, yerr = ek.getAll()
        elif xy != None:
            x, y = xy
        else:
            return
        if invert == True:
            y = [max(y) - i for i in y[:]]
        f = plt.figure(figsize=(10, 5))
        ax = f.add_subplot(121)
        p = ax.plot(x, y, 'o', alpha=0.5)
        ax.set_xlabel('T')
        ax.set_xlabel('mdeg')
        ax.set_title('raw data')

        x1, y1, x, y = self.transformCD(x, y, transwidth, ax)

        t = []
        dg = []
        R = 8.3144e-3
        for T, fu in zip(x, y):
            if fu >= 1 or fu <= 0:
                continue
            K = fu / (1 - fu)
            deltaGt = -R * T * math.log(K)
            dg.append(deltaGt)
            t.append(T)

        ax1 = f.add_subplot(122)
        p = ax1.plot(t, dg, 'x', mew=2, color='black')
        ax1.set_xlabel('T')
        ax1.set_ylabel('dG(T)')
        ax.set_title('stability curve')

        A, X = Fitting.doFit(expdata=zip(t, dg),
                             model='schellman',
                             grad=1e-9,
                             conv=1e-9)
        fity = X.getFitLine(t)
        p = ax1.plot(t, fity, 'r', lw=2)
        fd = X.getFitDict()
        self.drawParams(ax1, fd)
        deltaH = fd['deltaH']
        deltacp = fd['deltacp']
        Tm = fd['Tm']
        f.suptitle("Method 2 - deltaH: %2.2f deltaCp: %2.2e Tm: %2.2f" %
                   (deltaH, deltacp, Tm),
                   size=18)
        if show == True:
            self.showTkFigure(f)

        if figname == None: figname = d
        figname = figname.replace('.', '_')
        fname = figname + 'm1' + '.png'
        f.savefig(fname, dpi=300)
        print 'plot saved to %s' % os.path.abspath(fname)
        if E != None:
            fdata = Fitting.makeFitData(X.name, vrs=X.variables)
            E.insertDataset(xydata=[t, dg],
                            newname=d + '_vanthoff2',
                            replace=True,
                            fit=fdata)
            #E.saveProject()
        return deltaH, Tm, deltacp
Esempio n. 19
0
    def fitDifferentialCurve(self,
                             E=None,
                             d=None,
                             xy=None,
                             smooth=0,
                             invert=False,
                             show=True,
                             figname=None):
        """Derive differential denaturation curve and fit to get deltaH
           We smooth the unfolding curve and then differentiate and finally
           fit to a 3 parameter equation.
           See http://www.ncbi.nlm.nih.gov/pubmed/10933511"""

        if E != None:
            ek = E.getDataset(d)
            x, y, a, xerr, yerr = ek.getAll()
        elif xy != None:
            x, y = xy
        else:
            return
        if invert == True:
            y = [max(y) - i for i in y[:]]

        leg = []
        lines = []
        f = plt.figure(figsize=(10, 5))
        ax = f.add_subplot(121)
        p = ax.plot(x, y, 'x', color='black', mew=3, alpha=0.5)
        leg.append(p)
        lines.append('original')
        #smooth
        if smooth == 0:
            smooth = int(len(x) / 15.0)
        s = self.smoothListGaussian(y, smooth)
        p = ax.plot(x[:len(s) - 1], s[:-1], lw=3)
        leg.append(p)
        lines.append('smoothed')
        ax.set_title("original data")
        ax.set_xlabel('T')
        ax1 = f.add_subplot(122)
        #differentiate
        dx, ds = self.differentiate(x[:len(s)], s)
        #ds = [i/max(ds) for i in ds]
        ds = [i * 10 for i in ds]
        cw = csv.writer(open('diffcd.csv', 'w'))
        for row in zip(dx, ds):
            cw.writerow(row)
        p = ax1.plot(dx, ds, '-', lw=1.5, alpha=0.7, color='black')
        leg.append(p)
        lines.append('differential')
        ax1.set_title("differential denaturation")
        ax1.set_xlabel('T')
        ax1.set_ylabel('dsignal/dT')

        A, X = Fitting.doFit(expdata=zip(dx, ds),
                             model='diffDenaturation',
                             grad=1e-9,
                             conv=1e-10)
        fity = X.getFitLine(dx)
        p = ax1.plot(dx, fity, 'r', lw=2)
        leg.append(p)
        lines.append('fit')
        t = X.getFitDict()
        self.drawParams(ax1, t)
        dHkcal = t['deltaH'] / 4.184
        f.suptitle('Method 3 - deltaH: %2.2f kJ/mol (%2.2f kcal) Tm: %2.2f' %
                   (t['deltaH'], dHkcal, t['Tm']),
                   size=18)
        ax.legend(leg, lines, loc='best', prop=FontProperties(size="smaller"))
        #f.subplots_adjust(hspace=0.8)
        if show == True:
            self.showTkFigure(f)
        if figname != None:
            figname = figname.replace('.', '_')
            f.savefig(figname + 'm3', dpi=300)
            plt.close()
        if E != None:
            fdata = Fitting.makeFitData(X.name, vrs=X.variables)
            E.insertDataset(xydata=[dx, ds],
                            newname=d + '_diff',
                            replace=True,
                            fit=fdata)
            #E.saveProject()
        return t['deltaH'], t['Tm']
Esempio n. 20
0
    def fitDifferentialCurve(self, E=None, d=None, xy=None,smooth=0,
                                invert=False,show=True,figname=None):
        """Derive differential denaturation curve and fit to get deltaH
           We smooth the unfolding curve and then differentiate and finally
           fit to a 3 parameter equation.
           See http://www.ncbi.nlm.nih.gov/pubmed/10933511"""

        if E !=None:
            ek = E.getDataset(d)
            x,y,a, xerr,yerr = ek.getAll()
        elif xy!=None:
            x,y = xy
        else:
            return
        if invert == True:
            y = [max(y)-i for i in y[:]]

        leg=[]; lines=[]
        f=plt.figure(figsize=(10,5))
        ax=f.add_subplot(121)
        p=ax.plot(x,y,'x',color='black',mew=3,alpha=0.5)
        leg.append(p); lines.append('original')
        #smooth
        if smooth == 0:
            smooth=int(len(x)/15.0)
        s=self.smoothListGaussian(y,smooth)
        p=ax.plot(x[:len(s)-1],s[:-1],lw=3)
        leg.append(p); lines.append('smoothed')
        ax.set_title("original data")
        ax.set_xlabel('T')
        ax1=f.add_subplot(122)
        #differentiate
        dx,ds = self.differentiate(x[:len(s)],s)
        #ds = [i/max(ds) for i in ds]
        ds = [i*10 for i in ds]
        cw=csv.writer(open('diffcd.csv','w'))
        for row in zip(dx,ds):
            cw.writerow(row)
        p=ax1.plot(dx,ds,'-',lw=1.5,alpha=0.7,color='black')
        leg.append(p); lines.append('differential')
        ax1.set_title("differential denaturation")
        ax1.set_xlabel('T'); ax1.set_ylabel('dsignal/dT')

        A,X=Fitting.doFit(expdata=zip(dx,ds),model='diffDenaturation',grad=1e-9,conv=1e-10)
        fity = X.getFitLine(dx)
        p=ax1.plot(dx,fity,'r',lw=2)
        leg.append(p); lines.append('fit')
        t=X.getFitDict()
        self.drawParams(ax1,t)
        dHkcal=t['deltaH']/4.184
        f.suptitle('Method 3 - deltaH: %2.2f kJ/mol (%2.2f kcal) Tm: %2.2f' %(t['deltaH'],dHkcal,t['Tm']),size=18)
        ax.legend(leg,lines,loc='best',prop=FontProperties(size="smaller"))
        #f.subplots_adjust(hspace=0.8)
        if show == True:
            self.showTkFigure(f)
        if figname != None:
            figname = figname.replace('.','_')
            f.savefig(figname+'m3',dpi=300)
            plt.close()
        if E!=None:
            fdata = Fitting.makeFitData(X.name,vrs=X.variables)
            E.insertDataset(xydata=[dx,ds], newname=d+'_diff',replace=True,fit=fdata)
            #E.saveProject()
        return t['deltaH'],t['Tm']
Esempio n. 21
0
    def do_search(self, globalop, proteinop, proteins, residues, nucleus, pka):
        """Do searches for the various parameters, name, pka etc"""

        import re, urllib
        from PEATDB.PEATTables import PEATTableModel
        import PEATDB.Ekin.Fitting as Fitting
        from PEATDB.Ekin.Web import EkinWeb
        DB = self.DB
        EW = EkinWeb()
        ekincols = DB.ekintypes

        found=[]
        protlist = proteins.split(' ')
        residuelist = residues.split(' ')

        def createPhrase(items, op):
            if op == 'or':
                logicsymbol = '|'
            else:
                logicsymbol = '+'
            itemlist = items.split(' ')
            phrase =''
            c=1
            for i in itemlist:
                if c == len(itemlist):
                    phrase = phrase + i
                else:
                    phrase = phrase + i + logicsymbol
                c=c+1
            return re.compile(phrase, re.IGNORECASE)

        #if there is a protein name entered, get the list of proteins/records to use
        #otherwise use all records to search for the other keys
        names = []
        keywords = {}
        for p in DB.getRecs():
            name = DB[p].name
            names.append((name,p))
            if hasattr(DB[p], 'keywords'):
                keywords[name] = DB[p].keywords
            else:
                keywords[name] = ''
        names.sort()

        #create search expressions
        s_protein = createPhrase(proteins, proteinop)
        s_residue = createPhrase(residues, 'or')
        pkarange = pka.split('-')

        #do search
        for name in names:
            proteinname = name[0]
            protein = name[1]
            if s_protein.search(proteinname) or s_protein.search(keywords[proteinname]):
                found.append(protein)

        if len(found)==0:
            print '<h2>Sorry, no proteins found that match this name. <h2>'
            return
        elif residues == '' and pka == '':
            self.show_DB(selected=found)
            return found

        #now search for the other keys inside selected proteins if needed
        ekinfound={}; foundfits={}
        ignore =['__fit_matches__', '__Exp_Meta_Dat__', '__datatabs_fits__']

        kys = list(DB.getRecs())
        kys.sort()
        if len(found) == 0 or globalop == 'or':
            found = DB.getRecs()

        print '<table id="mytable" cellspacing=0 align=center>'
        '''search recs for residue and pkarange
           and add dataset names to new ekinfound dict'''
        for protein in found:
            for col in DB[protein].keys():
                if nucleus != 'any':
                    if nucleus not in col:
                        continue
                E = DB[protein][col]
                if DB['userfields'].has_key(col):
                    fieldtype=DB['userfields'][col]['field_type']
                else:
                    fieldtype=None
                if fieldtype in ekincols:
                    dk = E.datasets
                    fits = E.__datatabs_fits__
                    for k in dk:
                        meta = E.getMetaData(k)
                        try:
                            thisres = meta['residue']
                        except:
                            thisres = k
                        if thisres == None:
                            thisres = k
                        if residues != '':
                            if s_residue.search(thisres) and not k in ignore:
                                if not ekinfound.has_key(protein+'$'+col):
                                    ekinfound[protein+'$'+col]=[]
                                ekinfound[protein+'$'+col].append(k)

                        if pka != '':
                            foundpka = 0
                            if k in fits.keys():
                                if fits[k] == None:
                                    continue
                                if fits[k].has_key('model'):
                                    model = fits[k]['model']
                                else:
                                    continue
                                if not foundfits.has_key(protein+'$'+col):
                                    foundfits[protein+'$'+col]={}
                                X = Fitting.getFitter(model)
                                pnames = X.varnames
                                i=0
                                #check if first num is larger, then swap
                                try:
                                    pk1=float(pkarange[0])
                                    pk2=float(pkarange[1])
                                except:
                                    print '<h2> Error: pka values are not valid </h2>'
                                    return
                                if pk1 > pk2:
                                    tmp = pk1
                                    pk1 = pk2
                                    pk2 = tmp

                                #iterate thru parameter names and match any pK fields
                                #this code is not that efficient!
                                for p in pnames:
                                    if 'pK' in p:
                                        pka = fits[k][i]
                                        if pka >= pk1 and pka <= pk2:
                                            foundpka=1
                                    i=i+1
                                #if match is 'ANY', just append dataset if not there already
                                #also for case if no residue value entered
                                if globalop == 'or' or residues == '':
                                    if foundpka == 1:
                                        if not ekinfound.has_key(protein+'$'+col):
                                            ekinfound[protein+'$'+col]=[]
                                        if not k in ekinfound[protein+'$'+col]:
                                            ekinfound[protein+'$'+col].append(k)
                                #if match is 'ALL', need to check dataset already found
                                #and if no pka found, remove it. if both are true keep it
                                elif globalop == 'and':
                                    if foundpka == 0:
                                        if ekinfound.has_key(protein+'$'+col) and k in ekinfound[protein+'$'+col]:
                                            #print 'removing', protein, col
                                            ekinfound[protein+'$'+col].remove(k)

                                foundfits[protein+'$'+col][k]=fits[k]
        #check for empty fields in ekinfound dict and delete them..
        for d in ekinfound.keys():
            if len(ekinfound[d])==0:
                del(ekinfound[d])

        #if no results, just say that and return
        if len(ekinfound)==0:
            print '<h2> Sorry, no records found that match these parameters. </h2>'
            return
        #top display button and options
        print '<form name="resultsform" action="%s/main.cgi" METHOD="POST" ENCTYPE="multipart/form-data">' %self.bindir
        self.write_sessionkey('show_datasets')
        print '<td valign=top align=right colspan=3> <input type=submit value="display selected" name=submit>'
        print '<label><input type=checkbox name="plotoption" value=3>single graph</label>'
        print '<label><input type=checkbox name="normalise" value=1>normalise</label>'
        print '<label><input type=checkbox name="logx" value=1>log-x</label>'
        print '<label><input type=checkbox name="logy" value=1>log-y</label>'
        print '<label><input type=checkbox name="legend" value=1>legend</label>'
        print '<input type=button value="Check All" onClick="checkAll(document.resultsform.residue)">'
        print '<input type=button value="Uncheck All" onClick="uncheckAll(document.resultsform.residue)"></td>'
        print '</tr>'
        #header
        cols=['protein','column','residues']
        for c in cols:
            print '<th>'+c+'</th>'
        print '</tr>'
        ekys = ekinfound.keys()
        ekys.sort()

        r=1
        for k in ekys:
            if r % 2 == 0:
                cls = "spec"
            else:
                cls = ""

            fields = k.split('$')
            protein = fields[0]
            column = fields[1]

            proteinname = DB[protein]['name']
            print '<tr>'
            print '<th class="spec">%s</th> <td> %s </td>' %(proteinname, column)
            print '<td>'
            for residue in ekinfound[k]:
                residuefield = k+"$"+residue
                fithtml = ''
                try:
                    print '<input type=checkbox id="residue" name="residue" value=%s>' %("'"+residuefield+"'")
                except:
                    print 'UnicodeEncodeError'
                    continue

                urlfields = urllib.urlencode({'login':self.user,'project':self.project,
                                           'residue': residuefield,'action': 'show_datasets'})
                print '<a href="/cgi-bin/titration_db/main.cgi?%s" target="_blank">%s</a>'\
                          % (urlfields, residue)

            print '</tr>'
            r=r+1
        print '</form>'
        print '</table>'
        self.footer()

        return
Esempio n. 22
0
    def fitVantHoff(self,
                    E=None,
                    d=None,
                    xy=None,
                    transwidth=80,
                    invert=False,
                    show=True,
                    figname=None):
        """Derive fraction unfolded, get K and fit to Van't Hoff.
           see http://www.jbc.org/content/277/43/40717.full
           or http://www.ncbi.nlm.nih.gov/pmc/articles/PMC2144003/
        """
        if E != None:
            if not d in E.datasets:
                print 'no such dataset, %s' % d
                print 'available datasets:', E.datasets
                return
            ek = E.getDataset(d)
            x, y = ek.getxySorted()
        elif xy != None:
            x, y = xy

        if 'Convert Celsius-Kelvin' in self.conversions.getcurselection():
            x = [i + 273 for i in x]
        if invert == True:
            y = [max(y) - i for i in y[:]]

        f = plt.figure(figsize=(18, 6))
        ax = f.add_subplot(131)
        p = ax.plot(x, y, 'o', alpha=0.6)
        ax.set_xlabel('T(K)')
        ax.set_ylabel('mdeg')
        ax.set_title('raw data')

        x1, y1, x, y = self.transformCD(x, y, transwidth, ax)
        cw = csv.writer(open('frac_unfolded_' + d + '.csv', 'w'))
        cw.writerow(['temp', 'frac'])
        for i in zip(x1, y1):
            cw.writerow(i)

        #derive lnK vs 1/T
        t = []
        k = []

        for T, fu in zip(x, y):
            if fu >= 1 or fu <= 0:
                continue
            K = fu / (1 - fu)
            klog = math.log(K)
            k.append(klog)
            t.append(1 / T)

        if len(t) < 2: return None, None, None

        ax = f.add_subplot(132)
        p = ax.plot(x1, y1, 'o', color='g', alpha=0.6)
        ax.set_xlabel('T(K)')
        ax.set_ylabel('fu')
        ax.set_title('fraction unfolded')

        ax = f.add_subplot(133)
        p = ax.plot(t, k, 'x', mew=2, color='black')
        ax.set_xlabel('1/T')  #(r'$1/T ($K^-1)$')
        ax.set_ylabel('ln K')

        formatter = matplotlib.ticker.ScalarFormatter()
        formatter.set_scientific(True)
        formatter.set_powerlimits((0, 0))
        ax.xaxis.set_major_formatter(formatter)
        for l in ax.get_xticklabels():
            l.set_rotation(30)

        #fit this van't hoff plot
        A, X = Fitting.doFit(expdata=zip(t, k), model='Linear')
        fitk = X.getFitLine(t)
        p = ax.plot(t, fitk, 'r', lw=2)
        fd = X.getFitDict()
        #self.drawParams(ax,fd)

        #slope is deltaH/R/1000 in kJ
        deltaH = -fd['a'] * self.R / 1000
        deltaS = fd['b'] * self.R / 1000
        f.suptitle("Method 1 - deltaH: %2.2f deltaS: %2.2f" % (deltaH, deltaS),
                   size=18)
        f.subplots_adjust(bottom=0.15, top=0.85)

        if show == True:
            self.showTkFigure(f)

        if figname == None: figname = d
        figname = figname.replace('.', '_')
        fname = figname + 'm1' + '.png'
        f.savefig(fname, dpi=300)
        print 'plot saved to %s' % os.path.abspath(fname)
        #plt.close()
        if E != None:
            fdata = Fitting.makeFitData(X.name, vrs=X.variables)
            E.insertDataset(xydata=[t, k],
                            newname=d + '_vanthoff',
                            replace=True,
                            fit=fdata)
            #E.saveProject()
        return deltaH, deltaS, ax
Esempio n. 23
0
    def fitVantHoff(self, E=None, d=None, xy=None, transwidth=80, invert=False,
                        show=True, figname=None):
        """Derive fraction unfolded, get K and fit to Van't Hoff.
           see http://www.jbc.org/content/277/43/40717.full
           or http://www.ncbi.nlm.nih.gov/pmc/articles/PMC2144003/
        """
        if E != None:
            if not d in E.datasets:
                print 'no such dataset, %s' %d
                print 'available datasets:', E.datasets
                return
            ek = E.getDataset(d)
            x,y = ek.getxySorted()
        elif xy!=None:
            x,y = xy

        if 'Convert Celsius-Kelvin' in self.conversions.getcurselection():
            x = [i+273 for i in x]
        if invert == True:
            y = [max(y)-i for i in y[:]]

        f=plt.figure(figsize=(18,6))
        ax=f.add_subplot(131)
        p=ax.plot(x,y,'o',alpha=0.6)
        ax.set_xlabel('T(K)'); ax.set_ylabel('mdeg')
        ax.set_title('raw data')

        x1,y1,x,y = self.transformCD(x,y,transwidth,ax)
        cw=csv.writer(open('frac_unfolded_'+d+'.csv','w'))
        cw.writerow(['temp','frac'])
        for i in zip(x1,y1):
            cw.writerow(i)

        #derive lnK vs 1/T
        t=[]; k=[]

        for T,fu in zip(x,y):
            if fu>=1 or fu<=0:
                continue
            K = fu/(1-fu)
            klog = math.log(K)
            k.append(klog)
            t.append(1/T)

        if len(t)<2: return None, None, None

        ax=f.add_subplot(132)
        p=ax.plot(x1,y1,'o',color='g',alpha=0.6)
        ax.set_xlabel('T(K)'); ax.set_ylabel('fu')
        ax.set_title('fraction unfolded')

        ax=f.add_subplot(133)
        p=ax.plot(t,k,'x',mew=2,color='black')
        ax.set_xlabel('1/T')#(r'$1/T ($K^-1)$')
        ax.set_ylabel('ln K')

        formatter = matplotlib.ticker.ScalarFormatter()
        formatter.set_scientific(True)
        formatter.set_powerlimits((0,0))
        ax.xaxis.set_major_formatter(formatter)
        for l in ax.get_xticklabels():
            l.set_rotation(30)

        #fit this van't hoff plot
        A,X=Fitting.doFit(expdata=zip(t,k),model='Linear')
        fitk = X.getFitLine(t)
        p=ax.plot(t,fitk,'r',lw=2)
        fd=X.getFitDict()
        #self.drawParams(ax,fd)

        #slope is deltaH/R/1000 in kJ
        deltaH = -fd['a']*self.R/1000
        deltaS = fd['b']*self.R/1000
        f.suptitle("Method 1 - deltaH: %2.2f deltaS: %2.2f" %(deltaH,deltaS),size=18)
        f.subplots_adjust(bottom=0.15,top=0.85)

        if show==True:
            self.showTkFigure(f)

        if figname == None: figname = d
        figname = figname.replace('.','_')
        fname = figname+'m1'+'.png'
        f.savefig(fname,dpi=300)
        print 'plot saved to %s' %os.path.abspath(fname)
        #plt.close()
        if E!=None:
            fdata = Fitting.makeFitData(X.name,vrs=X.variables)
            E.insertDataset(xydata=[t,k], newname=d+'_vanthoff',replace=True,fit=fdata)
            #E.saveProject()
        return deltaH, deltaS, ax