def _fitLinear(self): '''Private method: Fits the linear segments of the data''' if self.linearFitted is False: expdata = zip(self.foldedRegion['temperatures'], self.foldedRegion['data']) d,f = Fitting.doFit(model='Linear', conv=1E-11, expdata=expdata, silent=True) self.foldedSlope = d[0] self.foldedIntercept = d[1] #The value of the heat capacity at the start of the transition self.foldedOffset = self.foldedSlope*self.temperatures[self.foldedIndexes[1]] + self.foldedIntercept if self.useFolded is True or (len(self.unfoldedRegion['temperatures']) < 2): self.unfoldedSlope = self.foldedSlope unfoldedHC = self.data[self.unfoldedIndexes[0]] foldedHC = self.foldedSlope*self.temperatures[self.unfoldedIndexes[0]] + self.foldedIntercept self.unfoldedIntercept = self.foldedIntercept + unfoldedHC - foldedHC #print 'Unfolded intercept derived from Folded ', self.unfoldedIntercept else: expdata = zip(self.unfoldedRegion['temperatures'], self.unfoldedRegion['data']) d,f = Fitting.doFit(model='Linear', conv=1E-11, expdata=expdata, silent=True) self.unfoldedSlope = d[0] self.unfoldedIntercept = d[1] #print 'Unfolded intercept derived from fit ',self.unfoldedIntercept #Calculate the heat capacity difference (DeltaCp) at the start of the unfolded region unfoldedHC = self.data[self.unfoldedIndexes[0]] foldedHC = self.foldedSlope*self.temperatures[self.unfoldedIndexes[0]] + self.foldedIntercept self.deltaHC = unfoldedHC - foldedHC self.linearFitted = True
def _fitLinear(self): '''Private method: Fits the linear segments of the data''' if self.linearFitted is False: expdata = zip(self.foldedRegion['temperatures'], self.foldedRegion['data']) d, f = Fitting.doFit(model='Linear', conv=1E-11, expdata=expdata, silent=True) self.foldedSlope = d[0] self.foldedIntercept = d[1] #The value of the heat capacity at the start of the transition self.foldedOffset = self.foldedSlope * self.temperatures[ self.foldedIndexes[1]] + self.foldedIntercept if self.useFolded is True or (len( self.unfoldedRegion['temperatures']) < 2): self.unfoldedSlope = self.foldedSlope unfoldedHC = self.data[self.unfoldedIndexes[0]] foldedHC = self.foldedSlope * self.temperatures[ self.unfoldedIndexes[0]] + self.foldedIntercept self.unfoldedIntercept = self.foldedIntercept + unfoldedHC - foldedHC #print 'Unfolded intercept derived from Folded ', self.unfoldedIntercept else: expdata = zip(self.unfoldedRegion['temperatures'], self.unfoldedRegion['data']) d, f = Fitting.doFit(model='Linear', conv=1E-11, expdata=expdata, silent=True) self.unfoldedSlope = d[0] self.unfoldedIntercept = d[1] #print 'Unfolded intercept derived from fit ',self.unfoldedIntercept #Calculate the heat capacity difference (DeltaCp) at the start of the unfolded region unfoldedHC = self.data[self.unfoldedIndexes[0]] foldedHC = self.foldedSlope * self.temperatures[ self.unfoldedIndexes[0]] + self.foldedIntercept self.deltaHC = unfoldedHC - foldedHC self.linearFitted = True
def fit(self, model): '''Fits the normalised curve to the specified dsc model Params: model - A string. Valid values are TwoState, NonTwoState and Irreversible. Invalid values cause a ValueError exception to be raised Returns: A tuple. The first element is a list containing the fit data. Strings decribing each element can be obtained by calling fitHeaders(model). The second element is the fit error''' if len(self.unfoldedRegion['temperatures']) < 2 or self.useFolded is True: method = 'FoldedOnly' else: method = 'Both' dscCurve = self.normalisedCurve() #conver to kj - fitting module has R in kj value = [el*4.184 for el in dscCurve.value] #Use area under curve (calculated in progressBaseline) as enthalpy guess #Melting temp guess is the temperature with max cp enthalpyGuess = self.curveArea*4.184 meltingGuess = dscCurve.temperature[value.index(max(value))] if model == 'TwoState': #Parameters Tm, VantHoff startValues = [meltingGuess, enthalpyGuess] fittingParameters,fittingInstance=Fitting.doFit(expdata=zip(dscCurve.temperature,value), model='DSC2state', guess=False, startvalues=startValues, silent=True) #Use fitData since it gives dict entries names - increased readibility fitData = fittingInstance.getResult() vantHoff = fitData['deltaH']/4.184 meltingTemp = fitData['Tm'] res = ['TwoState', method, self.foldedRange[1], self.unfoldedRange[0], meltingTemp, vantHoff, 'N/A', fittingParameters['error']/(4.184*4.184), fitData['rmsr']/4.184, vantHoff/meltingTemp, '1.0'] elif model == 'NonTwoState': #Parameters A, Tm and Calorimetric startValues = [1, meltingGuess, enthalpyGuess] fittingParameters,fittingInstance=Fitting.doFit(expdata=zip(dscCurve.temperature,value), model='DSCindependent', guess=False, startvalues=startValues, silent=True) fitData = fittingInstance.getResult() vantHoff = fitData['deltaH']/4.184 calorimetric = fitData['A']*vantHoff meltingTemp = fitData['Tm'] res = ['NonTwoState', method, self.foldedRange[1], self.unfoldedRange[0], meltingTemp, vantHoff, calorimetric, fittingParameters['error']/(4.184*4.184), fitData['rmsr']/4.184, vantHoff/meltingTemp, calorimetric/vantHoff] elif model == 'Irreversible': #Parameters Tm, Calorimetirc and Ea startValues = [meltingGuess, enthalpyGuess, 50] fittingParameters,fittingInstance=Fitting.doFit(expdata=zip(dscCurve.temperature,value), model='DSC2stateIrreversible', guess=False, startvalues=startValues, silent=True) fitData = fittingInstance.getResult() activationEnergy = fitData['E']/4.184 calorimetric = fitData['deltaH']/4.184 meltingTemp = fitData['Tm'] res = ['Irreversible', method, self.foldedRange[1], self.unfoldedRange[0], meltingTemp, calorimetric, activationEnergy, fitData['error']/(4.184*4.184), fitData['rmsr']/4.184, calorimetric/meltingTemp] else: raise ValueError, 'Unknown DSC model %s' % model return [res, fittingParameters['error']/(4.184*4.184)]
def fit(self, model): '''Fits the normalised curve to the specified dsc model Params: model - A string. Valid values are TwoState, NonTwoState and Irreversible. Invalid values cause a ValueError exception to be raised Returns: A tuple. The first element is a list containing the fit data. Strings decribing each element can be obtained by calling fitHeaders(model). The second element is the fit error''' if len(self.unfoldedRegion['temperatures'] ) < 2 or self.useFolded is True: method = 'FoldedOnly' else: method = 'Both' dscCurve = self.normalisedCurve() #conver to kj - fitting module has R in kj value = [el * 4.184 for el in dscCurve.value] #Use area under curve (calculated in progressBaseline) as enthalpy guess #Melting temp guess is the temperature with max cp enthalpyGuess = self.curveArea * 4.184 meltingGuess = dscCurve.temperature[value.index(max(value))] if model == 'TwoState': #Parameters Tm, VantHoff startValues = [meltingGuess, enthalpyGuess] fittingParameters, fittingInstance = Fitting.doFit( expdata=zip(dscCurve.temperature, value), model='DSC2state', guess=False, startvalues=startValues, silent=True) #Use fitData since it gives dict entries names - increased readibility fitData = fittingInstance.getResult() vantHoff = fitData['deltaH'] / 4.184 meltingTemp = fitData['Tm'] res = [ 'TwoState', method, self.foldedRange[1], self.unfoldedRange[0], meltingTemp, vantHoff, 'N/A', fittingParameters['error'] / (4.184 * 4.184), fitData['rmsr'] / 4.184, vantHoff / meltingTemp, '1.0' ] elif model == 'NonTwoState': #Parameters A, Tm and Calorimetric startValues = [1, meltingGuess, enthalpyGuess] fittingParameters, fittingInstance = Fitting.doFit( expdata=zip(dscCurve.temperature, value), model='DSCindependent', guess=False, startvalues=startValues, silent=True) fitData = fittingInstance.getResult() vantHoff = fitData['deltaH'] / 4.184 calorimetric = fitData['A'] * vantHoff meltingTemp = fitData['Tm'] res = [ 'NonTwoState', method, self.foldedRange[1], self.unfoldedRange[0], meltingTemp, vantHoff, calorimetric, fittingParameters['error'] / (4.184 * 4.184), fitData['rmsr'] / 4.184, vantHoff / meltingTemp, calorimetric / vantHoff ] elif model == 'Irreversible': #Parameters Tm, Calorimetirc and Ea startValues = [meltingGuess, enthalpyGuess, 50] fittingParameters, fittingInstance = Fitting.doFit( expdata=zip(dscCurve.temperature, value), model='DSC2stateIrreversible', guess=False, startvalues=startValues, silent=True) fitData = fittingInstance.getResult() activationEnergy = fitData['E'] / 4.184 calorimetric = fitData['deltaH'] / 4.184 meltingTemp = fitData['Tm'] res = [ 'Irreversible', method, self.foldedRange[1], self.unfoldedRange[0], meltingTemp, calorimetric, activationEnergy, fitData['error'] / (4.184 * 4.184), fitData['rmsr'] / 4.184, calorimetric / meltingTemp ] else: raise ValueError, 'Unknown DSC model %s' % model return [res, fittingParameters['error'] / (4.184 * 4.184)]