otterpy/JFSphoto.py
jens 557584aad9 nm scale now ok
check for missing calibration next
2020-11-25 21:03:18 +01:00

157 lines
6.3 KiB
Python

from tkinter.colorchooser import askcolor
from tkinter import filedialog
from tkinter import messagebox
import tkinter as tk
import csv
import numpy as np
from configparser import ConfigParser
####################################### object
class Jfsphoto (object):
def __init__(self):
self.nm = 0
self.nmi = 0
self.nm2 = 0
self.nm2i = 0
self.nm_left = 0
self.nm_right = 0
self.nm_step = 0
self.tnm_left = tk.StringVar()
self.tnm_right = tk.StringVar()
self.tnm_step = tk.StringVar()
self.nmData16 = np.zeros(3694, np.uint16)
########## nm scale checkButton default nm-scale is off
self.nm_checked = tk.IntVar()
self.nm_checked.set(0)
def do_calibrate(self):
win = tk.Toplevel()
win.geometry("450x200+100+100")
self.lab1 = tk.Label(win, text='Please enter filenames and nm of the peaks').grid(row=0,column=0,columnspan=6)
########## first peak
self.tnm = tk.StringVar()
self.tnm.set(str(self.nm))
self.tnmi = tk.StringVar()
self.tnmi.set(str(self.nmi))
self.lab2 = tk.Label(win,text='first Peak nm').grid(row=1,column=0)
self.en1 = tk.Entry(win,textvariable=self.tnm, width= 10).grid(row=1,column=1)
self.bt1 = tk.Button(win,text="select File",command=lambda: self.openfile(1)).grid(row=1,column=2)
self.lnm = tk.Label(win,textvariable =self.tnm).grid(row=1,column=3)
self.lnm = tk.Label(win,text =" nm by index ").grid(row=1,column=4)
self.lmi = tk.Label(win,textvariable=self.tnmi).grid(row=1,column=5)
########## second peak
self.tnm2 = tk.StringVar()
self.tnm2.set(str(self.nm2))
self.tnm2i = tk.StringVar()
self.tnm2i.set(str(self.nm2i))
self.lab3 = tk.Label(win,text='second Peak nm').grid(row=2,column=0)
self.en2 = tk.Entry(win,textvariable=self.tnm2, width= 10).grid(row=2,column=1)
self.bt2 = tk.Button(win,text="select File",command=lambda: self.openfile(2)).grid(row=2,column=2)
self.lnm2 = tk.Label(win,textvariable =self.tnm2).grid(row=2,column=3)
self.lnm2 = tk.Label(win,text =" nm by index ").grid(row=2,column=4)
self.lm2i = tk.Label(win,textvariable=self.tnm2i).grid(row=2,column=5)
########### calibration
self.tnm_left.set(str(self.nm_left))
self.tnm_right.set(str(self.nm_right))
self.tnm_step.set(str(self.nm_step))
self.lab4 = tk.Label(win,text="left border [nm]").grid(row=3,column=0)
self.lab5 = tk.Label(win,textvariable=self.tnm_left).grid(row=3,column=1)
self.lab6 = tk.Label(win,text="right border [nm]").grid(row=3,column=2)
self.lab7 = tk.Label(win,textvariable=self.tnm_right).grid(row=3,column=3)
self.lab8 = tk.Label(win,text="[nm]/point").grid(row=3,column=4)
self.lab9 = tk.Label(win,textvariable=self.tnm_step).grid(row=3,column=5)
self.bt3 = tk.Button(win,text="Calibrieren",command=self.calibrate,state=tk.DISABLED)
self.bt3.grid(row=4,column=0)
self.bt4 = tk.Button(win,text="Load Config",command=self.conf_read).grid(row=4,column=1)
self.bt5 = tk.Button(win,text="Save Config",command=self.conf_write).grid(row=4,column=2)
########### dialog modal
win.focus_set()
win.grab_set()
win.wait_window()
def checkit(self):
self.nm = int(self.tnm.get())
self.nmi = int(self.tnmi.get())
self.nm2 = int(self.tnm2.get())
self.nm2i = int(self.tnm2i.get())
if ((self.nm > 0) & (self.nmi > 0) & (self.nm2 > 0) & (self.nm2i > 0)):
self.bt3.config(state = tk.NORMAL)
def calibrate(self):
self.nm_step = round((self.nm2 - self.nm)/(self.nm2i-self.nmi),5)
self.nm_left = round(self.nm-(self.nm_step*self.nmi),0)
self.nm_right = round(self.nm2 + self.nm_step*(3694-self.nm2i),0)
self.tnm_left.set(str(self.nm_left))
self.tnm_right.set(str(self.nm_right))
self.tnm_step.set(str(self.nm_step))
def get_nm_checked(self):
return self.nm_checked.get()
def set_nm_scale(self):
self.nmData16 = np.linspace(self.nm_left,self.nm_right,3694)
def get_nm_scale(self):
self.set_nm_scale()
return self.nmData16
def openfile(self,xx):
rxData16 = np.zeros(3694, np.uint16)
filename = filedialog.askopenfilename(defaultextension=".dat", title="Open file")
line_count = 0
try:
with open(filename) as csvfile:
readCSV = csv.reader(csvfile, delimiter=' ')
for row in readCSV:
if (line_count == 3):
self.SHsent = int(row[1])
self.ICGsent = int(row[6])
if (line_count > 3):
rxData16[line_count-4] = int(row[1])
line_count += 1
if (xx==1):
self.nmi = np.argmin(rxData16)
self.tnmi.set(str(self.nmi))
if (xx==2):
self.nm2i = np.argmin(rxData16)
self.tnm2i.set(str(self.nm2i))
self.checkit()
except IOError:
messagebox.showerror("By the great otter!","There's a problem opening the file.")
def conf_write(self):
config = ConfigParser()
config.read('config.ini')
lis = config.sections()
if ('main' not in lis):
config.add_section('main')
config.set('main','nm_left',str(self.nm_left))
config.set('main','nm_right',str(self.nm_right))
config.set('main','nm_step',str(self.nm_step))
with open('config.ini','w') as f:
config.write(f)
def conf_read(self):
config = ConfigParser()
try:
config.read('config.ini')
self.nm_left = float(config.get('main','nm_left',fallback='0'))
self.tnm_left.set(config.get('main','nm_left',fallback='0'))
self.nm_right = float(config.get('main','nm_right',fallback='0'))
self.tnm_right.set(config.get('main','nm_right',fallback='0'))
self.nm_step = float(config.get('main','nm_step',fallback='0'))
self.tnm_step.set(config.get('main','nm_step',fallback='0'))
self.set_nm_scale()
except IOError:
print("By the great otter!","No config.ini file")