def saveData(self, path, mode='w', enc='utf-8'): """saves fitting info (chi^2, DoF, chi^2/DoF, paramters with values and errors, covariance and correlation matrix) Arguments: path -- relative path to file mode -- write mode (usually 'w' for overwriting or 'a' for appending) enc -- encoding (default = 'utf-8') """ with TxtFile.fromRelPath(path, mode) as f: f.writeline('fitting info') f.writeline('============') f.writeline(TxtFile.CHISQUARE + ':\t\t' + str(self.getChisquare())) f.writeline('DoF:\t' + str(self.getDoF())) f.writeline(TxtFile.CHISQUARE + '/DoF:\t' + str(self.getChisquareOverDoF())) f.writeline('\t', 'p-value:', *map(str, self.getPValue())) f.writeline('') f.writeline('parameters') f.writeline('==========') for i, param in self.params.iteritems(): f.writeline('\t', str(i), param['name'], str(param['value']), TxtFile.PM, str(param['error'])) f.writeline('') f.writeline('covariance matrix') f.writeline('=================') f.writelines('\t'.join(str(j) for j in i) + '\n' for i in self._covMatrix) f.writeline('') f.writeline('correlation matrix') f.writeline('==================') f.writelines('\t'.join(str(j) for j in i) + '\n' for i in self._corrMatrix) f.writeline() f.close()
def evalHgPeaks(): data = I2Data.fromPath('../data/02_Hg_full_ngg11.txt') mins = data.findExtrema(10, 425, 630, False) mins.filterY(1300) with TxtFile.fromRelPath('../calc/hg_lines.txt', 'w') as f: for min in mins.points: f.writeline(str(min[0])) c = TCanvas('c1', '', 1280, 720) c.SetLogy() g = data.makeGraph('g', 'wavelength #lambda / nm', 'intensity / a.u.') g.GetXaxis().SetRangeUser(415, 620) g.SetMarkerStyle(1) g.Draw('AP') m = mins.makeGraph() if m: m.SetMarkerColor(2) m.Draw('P') c.Update() c.Print('../img/HgPeaks.pdf', 'pdf')
def evalNaPeaks(): data = I2Data.fromPath('../data/01_Na_ngg13.txt') mins = data.findExtrema(200, 508, 630, False) mins.filterY(40000) with TxtFile.fromRelPath('../calc/na_lines.txt', 'w') as f: for min in mins.points: f.writeline(str(min[0])) c = TCanvas('c1', '', 1280, 720) g = data.makeGraph('g', 'wavelength #lambda / nm', 'intensity / a.u.') g.GetXaxis().SetRangeUser(415, 620) g.GetYaxis().SetTitleOffset(1.2) g.SetMarkerStyle(1) g.Draw('AP') m = mins.makeGraph() if m: m.SetMarkerColor(2) m.Draw('P') c.Update() c.Print('../img/NaPeaks.pdf', 'pdf')
def saveData(self, path, mode='w', enc='utf-8'): """saves fitting info (chi^2, DoF, chi^2/DoF, paramters with values and errors, covariance and correlation matrix) Arguments: path -- relative path to file mode -- write mode (usually 'w' for overwriting or 'a' for appending) enc -- encoding (default = 'utf-8') """ with TxtFile.fromRelPath(path, mode) as f: f.writeline('fitting info') f.writeline('============') f.writeline(TxtFile.CHISQUARE + ':\t\t' + str(self.getChisquare())) f.writeline('DoF:\t' + str(self.getDoF())) f.writeline(TxtFile.CHISQUARE + '/DoF:\t' + str(self.getChisquareOverDoF())) #f.writeline('\t', 'p-value:', *map(str, self.getPValue())) f.writeline('') f.writeline('parameters') f.writeline('==========') for i, param in self.params.items(): f.writeline('\t', str(i), param['name'], str(param['value']), TxtFile.PM, str(param['error'])) f.writeline('') f.writeline('covariance matrix') f.writeline('=================') if self._covMatrix: f.writelines('\t'.join(str(j) for j in i) + '\n' for i in self._covMatrix) f.writeline('') f.writeline('correlation matrix') f.writeline('==================') if self._corrMatrix: f.writelines('\t'.join(str(j) for j in i) + '\n' for i in self._corrMatrix) f.writeline() f.close()
def getExcitedStateOscillationConstants(): # plot spectrum data = I2Data.fromPath('../data/04_I2_ngg10_10ms.txt') progression = dict() for i in range(1, 3 + 1): progression[i] = I2Data.fromPath('../data/prog%d.txt' % i) c = TCanvas('c', '', 1280, 720) g = data.makeGraph('spectrum', 'wavelength #lambda / nm', 'intensity / a.u.') g.SetMarkerStyle(1) g.GetXaxis().SetRangeUser(505, 620) g.SetMinimum(18000) g.SetMaximum(49000) myY = TGaxis() myY.ImportAxisAttributes(g.GetYaxis()) myY.SetMaxDigits(3) g.Draw('AL') pg1 = progression[1].makeGraph('prog1') pg1.SetMarkerColor(2) pg1.Draw('P') pg2 = progression[2].makeGraph('prog2') pg2.SetMarkerColor(3) pg2.Draw('P') pg3 = progression[3].makeGraph('prog3') pg3.SetMarkerColor(4) pg3.Draw('P') l = TLegend(0.6, 0.15, 0.85, 0.4) l.AddEntry('spectrum', 'measurement', 'l') l.AddEntry('prog1', 'first progression (#nu\'\' = 1)', 'p') l.AddEntry('prog2', 'second progression (#nu\'\' = 2)', 'p') l.AddEntry('prog3', 'third progression (#nu\'\' = 3)', 'p') l.Draw() c.Update() c.Print('../img/I2_absorption.pdf', 'pdf') # calculations start = [18, 7, 9] prog1ord = {'a': [], 'ae': [], 'b': [], 'be': []} for i, prog in progression.iteritems(): # Calculate vacuum wavelength and create Birge-Sponer plot prog.correctValues() c = TCanvas('c%d' % i, '', 1280, 720) g = makeBirgeSponer(prog, start[i - 1]).makeGraph('prog%d_bs' % i, '#nu\' + 1/2', '#Delta G (#nu\' + 1/2) / (cm^{-1})') g.Draw('AP') # fit 2nd-order fit2ord = Fitter('prog%d_2ord' % i, '[0]-[1]*(2*x+2)+[2]*(3*x^2+6*x+13/4)') fit2ord.setParam(0, 'a', 120) fit2ord.setParam(1, 'b', 1) fit2ord.setParam(2, 'c', 0) fit2ord.fit(g, 4, 50) fit2ord.saveData('../calc/prog%d_fit2ord.txt' % i, 'w') l2 = TLegend(0.6, 0.7, 0.95, 0.95) l2.AddEntry(0, 'Fit 2nd. order', '') l2.AddEntry(fit2ord.function, 'y = a - b*(2*x+2) + c*(3*x^2+6*x+13/4)', 'l') fit2ord.addParamsToLegend(l2) l2.SetTextSize(0.03) l2.Draw() # fit 1st-order fit1ord = Fitter('prog%d_1ord' % i, '[0]-[1]*(2*x+2)') fit1ord.setParam(0, 'a', 120) fit1ord.setParam(1, 'b', 1) fit1ord.fit(g, 4, 50, '+') g.GetFunction('prog%d_1ord' % i).SetLineColor(4) fit1ord.saveData('../calc/prog%d_fit1ord.txt' % i, 'w') prog1ord['a'].append(fit1ord.params[0]['value']) prog1ord['ae'].append(fit1ord.params[0]['error']) prog1ord['b'].append(fit1ord.params[1]['value']) prog1ord['be'].append(fit1ord.params[1]['error']) l1 = TLegend(0.125, 0.15, 0.5, 0.4) l1.AddEntry(0, 'Fit 1st. order', '') l1.AddEntry(g.GetFunction('prog%d_1ord' % i), 'y = a - b*(2*x+2)', 'l') fit1ord.addParamsToLegend(l1) l1.SetTextSize(0.03) l1.Draw() c.Update() c.Print('../img/prog%d_birgesponer.pdf' % i, 'pdf') # save vibrational constants to latex file nus = [0, 1, 2] f = TxtFile('../src/ExcitedStateOscillationConstants.tex', 'w') f.write2DArrayToLatexTable(zip(nus, prog1ord['a'], prog1ord['ae'], prog1ord['b'], prog1ord['be']), ['$\\nu\'\'$', '$\omega_e\' / \\text{cm}^{-1}$', '$s_{\omega_e\'} / \\text{cm}^{-1}$', '$\omega_e\' x_e\' / \\text{cm}^{-1}$', '$s_{\omega_e\' x_e\'} / \\text{cm}^{-1}$'], ['%0.f', '%3.1f', '%.1f', '%.3f', '%.3f'], 'Oscillation constants for first order fit of Birge-Sponer plots', 'tab:prog1ord') f.close() # calculate weighted average for fit 1st- order with TxtFile.fromRelPath('../calc/ExcitedStateOscillationConstants.txt', 'w') as f: f.writeline('\t', *map(lambda x: str(x), avgerrors(prog1ord['a'], prog1ord['ae']))) f.writeline('\t', *map(lambda x: str(x), avgerrors(prog1ord['b'], prog1ord['be'])))
def makeMassFit(): # config files # file = [mass, path] files = [] files.append([2.0123, "../data/11_K_m9_3200_t420.txt", 420]) files.append([2.0123, "../data/11b_K_m9_3200_t420.txt", 420]) files.append([1.9047, "../data/13_K_m8_3200_t420.txt", 420]) files.append([1.6812, "../data/15_K_m7_3200_t420.txt", 420]) files.append([1.4827, "../data/17_K_m6_3200_t420.txt", 420]) files.append([1.2952, "../data/19_K_m5_3200_t480.txt", 480]) files.append([1.0993, "../data/21_K_m4_3200_t480.txt", 480]) files.append([0.8086, "../data/23_K_m3_3200_t540.txt", 540]) files.append([0.6954, "../data/25_K_m2_3200_t540.txt", 540]) files.append([0.5007, "../data/27_K_m1_3200_t660.txt", 660]) files.append([0.3030, "../data/29_K_m0_3200_t780.txt", 780]) u = 0.760 tu = 50 d = DataErrors() for file in files: n = readSingleEntryFile(file[1]) d.addPoint(file[0], n - u, 0.001, np.sqrt(n / file[2] + u / tu)) d.saveDataToLaTeX(['Masse $m /$g', '$s_m /$g', 'Z\"ahlrate $n / (1/\\text{s})$', '$s_n / (1/\\text{s})$'], ['%.3f', '%.3f', '%.3f', '%.3f'], 'Z\"ahlraten von \\kalium\,f\"ur verschiedene Massen mit Fehlern', 'tab:data:kalium', '../src/data_kalium.tex', 'w') c = TCanvas('c2', '', 800, 600) g = d.makeGraph('g', 'Masse m / g', 'Z#ddot{a}hlrate n / (1/s)') g.SetMaximum(6) g.SetMinimum(2) g.Draw('AP') fit = Fitter('f', '[0]*(1-exp(-[1]*x))') fit.setParam(0, 'a') fit.setParam(1, 'b') fit.fit(g, 0.1, 2.5) fit.saveData('../fit/kalium.txt') a = fit.params[0]['value'] sa = fit.params[0]['error'] b = fit.params[1]['value'] sb = fit.params[1]['error'] l = TLegend(0.4, 0.15, 0.85, 0.5) l.AddEntry('g', '{}^{40} Kalium ohne Untergrund', 'p') # TODO with error bar? (options +'e') l.AddEntry(fit.function, 'Fit mit n(m)=a(1-exp(-b*m))', 'l') l.AddEntry(0, '#chi^{2} / DoF : %f' % fit.getChisquareOverDoF(), '') l.AddEntry(0, 'Paramter:', '') l.AddEntry(0, 'a: %e #pm %e' % (a, sa), '') l.AddEntry(0, 'b: %e #pm %e' % (b, sb), '') l.SetTextSize(0.03) l.Draw() NA = 6.02214129e23 hrel = 0.000118 mrel = 39.0983 + 35.45 f = 1.29 rho = fit.getCorrMatrixElem(1, 0) thalf = (np.log(2) * NA * hrel * f) / (1.12 * mrel * 2 * a * b) / (3600 * 24 * 365.242) sthalf = thalf * np.sqrt((sa / a) ** 2 + (sb / b) ** 2 + 2 * rho * (sa / a) * (sb / b)) with TxtFile.fromRelPath('../fit/kalium.txt', 'a') as f: f.writeline() f.writeline('calculations') f.writeline('============') f.writeline('\t', 'half-life of Kalium:', '%e' % thalf, TxtFile.PM, '%e' % sthalf) c.Update() c.Print('../img/Kalium40_Massenabhaengigkeit.pdf')