예제 #1
0
파일: FitDSC.py 프로젝트: yongwangCPH/peat
	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
예제 #2
0
    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
예제 #3
0
파일: FitDSC.py 프로젝트: yongwangCPH/peat
	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)]
예제 #4
0
    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)]