I have a code that opens sample and background data (10^5 points each) and subtracts one from the other. When running the code for the first time, it works flawlessly. However, when I remove the background data and choose another file for the background, the subtraction is not performed. I found it is due to the doubling of the sample array size when executing the "subtract_bkgr_from_magn" command. What happens is that before "for i in range" the size is 100000 points but immediately after this command it becomes 200000. There's obviously something going on that I am not aware of. Could someone explain to me what is wrong with my code and how it could be rectified?
import tkinter as Tk
from tkinter.filedialog import askopenfilename
top = Tk.Tk()
class Window:
def __init__(self):
self.top = top
self.m = []
self.m_bkgr = []
self.m_true = []
Tk.Button(top, text='Sample', command=self.open_sample, width=10).pack()
Tk.Button(top, text='X', command=self.remove_bkgr).pack()
Tk.Button(top, text='Background', command=self.open_bkgr, width=10).pack()
Tk.Button(top, text='Calculate', command=self.calculate, width=7).pack()
def openfile(self):
self.opfi = askopenfilename()
def calc_file_length(self):
with open(self.opfi, 'r') as file:
for i, l in enumerate(file):
pass
self.number = i + 1
def open_sample(self):
self.openfile()
self.calc_file_length()
def open_bkgr(self):
self.opbkgr = askopenfilename()
def empty_arrays(self):
del self.m[:], self.m_bkgr[:], self.m_true[:]
def columns_for_sample(self):
with open(self.opfi, 'r') as file:
for line in range(self.number):
g = file.readline().split('\t')
if line >= 7:
self.magn = str(g[5])
self.m.append(eval(self.magn))
def column_for_bkgr(self):
if self.opbkgr:
with open(self.opbkgr, 'r') as file:
for line in range(self.number):
w = file.readline().split('\t')
if line >= 7:
self.magn_bkgr = str(w[5])
self.m_bkgr.append(eval(self.magn_bkgr))
else: # no background
pass
def subtract_bkgr_from_magn(self):
if self.opbkgr:
for i in range(len(self.m)):
self.m_true.append(self.m[i] - self.m_bkgr[i])
else: # no background
self.m_true = self.m
def calculate(self):
self.empty_arrays()
self.columns_for_sample()
self.column_for_bkgr()
self.subtract_bkgr_from_magn()
def remove_bkgr(self):
self.opbkgr = ''
del self.m_bkgr[:]
a = Window()
Tk.mainloop()
Here's a sample of the data I work with (they are similar for the sample and background):
#text
#text
#text
#text
#text
#text
#text
-0.003333 -0.133333 0.010000 -0.133333 0.003333 0.000250
-0.016667 -0.100000 0.003333 0.000000 0.002083 -0.000208
0.003333 -0.066667 0.010000 -0.133333 0.002083 -0.000208
-0.003333 -0.066667 0.016667 -0.133333 0.002500 -0.000125
-0.003333 -0.100000 0.010000 -0.333333 0.003750 4.166667E-5
-0.003333 -0.066667 0.010000 -0.266667 0.002500 0.000375
-0.003333 -0.066667 0.003333 -0.133333 0.002917 0.000667