Rasp_grid/rasp_grid_cfg.py

538 lines
23 KiB
Python

import sys
import os
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5 import QtCore
from PyQt5.QtCore import *
class Grid_tab(QWidget):
def __init__(self):
super().__init__()
self.grid_no_val = 1
self.rec_mode_val = 'standalone'
self.columns_val = 8
self.rows_val = 8
self.extra_val = 0
self.col_dist_val = 50
self.row_dist_val = 50
self.channel_offset_val = 0
self.elec_type_val = 'headstage'
self.ref_elec_type_val = 'screw'
self.ref_elec_posx_val = 0.00
self.ref_elec_posy_val = 0.00
self.water_depth_val = 0.25
self.gridlayout = QGridLayout()
self.gridlayout.setColumnStretch(0, 5)
self.gridlayout.setColumnStretch(1, 2)
self.gridlayout.setColumnStretch(2, 1)
# self.get_widgets()
self.setLayout(self.gridlayout)
def get_widgets(self):
grid_noL = QLabel('Grid no:', self)
self.grid_no = QLineEdit(str(self.grid_no_val), self)
self.gridlayout.addWidget(grid_noL, 0, 0)
self.gridlayout.addWidget(self.grid_no, 0, 1)
rec_modeL = QLabel('Recorde mode', self)
self.rec_mode = QLineEdit(self.rec_mode_val, self)
self.gridlayout.addWidget(rec_modeL, 1, 0)
self.gridlayout.addWidget(self.rec_mode, 1, 1)
col_elecsU =QLabel('n', self)
col_elecsL =QLabel('Electrod Columns:', self)
self.col_elecs = QLineEdit(str(self.columns_val), self)
self.gridlayout.addWidget(col_elecsL, 2, 0)
self.gridlayout.addWidget(self.col_elecs, 2, 1)
self.gridlayout.addWidget(col_elecsU, 2, 2)
row_elecsU = QLabel('n', self)
row_elecsL = QLabel('Electrod Rows:', self)
self.row_elecs = QLineEdit(str(self.rows_val), self)
self.gridlayout.addWidget(row_elecsL, 3, 0)
self.gridlayout.addWidget(self.row_elecs, 3, 1)
self.gridlayout.addWidget(row_elecsU, 3, 2)
ext_elecsU = QLabel('n', self)
ext_elecsL = QLabel('Extra electrodes:', self)
self.extra_elecs = QLineEdit(str(self.extra_val), self)
self.gridlayout.addWidget(ext_elecsL, 4, 0)
self.gridlayout.addWidget(self.extra_elecs, 4, 1)
self.gridlayout.addWidget(ext_elecsU, 4, 2)
col_spaceU = QLabel('cm', self)
col_spaceL = QLabel('Column spacing:', self)
self.col_space = QLineEdit(str(self.col_dist_val), self)
self.gridlayout.addWidget(col_spaceL, 5, 0)
self.gridlayout.addWidget(self.col_space, 5, 1)
self.gridlayout.addWidget(col_spaceU, 5, 2)
row_spaceU = QLabel('cm', self)
row_spaceL = QLabel('Row spacing:', self)
self.row_space = QLineEdit(str(self.row_dist_val), self)
self.gridlayout.addWidget(row_spaceL, 6, 0)
self.gridlayout.addWidget(self.row_space, 6, 1)
self.gridlayout.addWidget(row_spaceU, 6, 2)
elec_typeL = QLabel('Electrode Type:', self)
self.elec_type = QLineEdit(self.elec_type_val, self)
self.gridlayout.addWidget(elec_typeL, 7, 0)
self.gridlayout.addWidget(self.elec_type, 7, 1)
ref_elec_typeL = QLabel('Ref. Electrode Type:', self)
self.ref_elec_type = QLineEdit(self.ref_elec_type_val, self)
self.gridlayout.addWidget(ref_elec_typeL, 8, 0)
self.gridlayout.addWidget(self.ref_elec_type, 8, 1)
ref_elec_xU = QLabel('m', self)
ref_elec_xL = QLabel('Ref. Electrode Pos-x:', self)
self.ref_elec_x = QLineEdit('%.2f' % self.ref_elec_posx_val, self)
self.gridlayout.addWidget(ref_elec_xL, 9, 0)
self.gridlayout.addWidget(self.ref_elec_x, 9, 1)
self.gridlayout.addWidget(ref_elec_xU, 9, 2)
ref_elec_yU = QLabel('m', self)
ref_elec_yL = QLabel('Ref. Electrode Pos-y:', self)
self.ref_elec_y = QLineEdit('%.2f' % self.ref_elec_posy_val, self)
self.gridlayout.addWidget(ref_elec_yL, 10, 0)
self.gridlayout.addWidget(self.ref_elec_y, 10, 1)
self.gridlayout.addWidget(ref_elec_yU, 10, 2)
water_depthU = QLabel('cm', self)
water_depthL = QLabel('Water depth:', self)
self.water_depth = QLineEdit('%.2f' % self.water_depth_val, self)
self.gridlayout.addWidget(water_depthL, 11, 0)
self.gridlayout.addWidget(self.water_depth, 11, 1)
self.gridlayout.addWidget(water_depthU, 11, 2)
space = QLabel('', self)
self.gridlayout.addWidget(space, 12, 0)
class Hardware_settings_tab(QWidget):
def __init__(self):
super().__init__()
self.ai_sr_val = 20
self.ai_max_vol_val = 1
self.amp_name_val = "16-channel-amplifier"
self.amp_model_val = 'EM-64B'
self.amp_type_val = 'differential'
self.gain_val = 100
self.highpass_cutoff_val = 100
self.lowpass_cutoff_val = 10
self.gridlayout = QGridLayout()
self.gridlayout.setColumnStretch(0, 5)
self.gridlayout.setColumnStretch(1, 5)
self.gridlayout.setColumnStretch(2, 1)
# self.get_widgets()
self.setLayout(self.gridlayout)
def get_widgets(self):
# hw_settingsL = QLabel('Hardware Settings:', self)
# self.gridlayout.addWidget(hw_settingsL, 0, 0)
AIsrU = QLabel('kHz', self)
AIsrL = QLabel('AI Sample Rate:', self)
self.AIsr = QLineEdit('%.3f' % self.ai_sr_val, self)
self.gridlayout.addWidget(AIsrL, 1, 0)
self.gridlayout.addWidget(self.AIsr, 1, 1)
self.gridlayout.addWidget(AIsrU, 1, 2)
AImaxVU = QLabel('mV', self)
AImaxVL = QLabel('AI Max V:', self)
self.AImaxV = QLineEdit('%.1f' % self.ai_max_vol_val, self)
self.gridlayout.addWidget(AImaxVL, 2, 0)
self.gridlayout.addWidget(self.AImaxV, 2, 1)
self.gridlayout.addWidget(AImaxVU, 2, 2)
AmplNameL = QLabel('Ampl. Name:', self)
self.AmplName = QLineEdit(self.amp_name_val, self)
self.gridlayout.addWidget(AmplNameL, 3, 0)
self.gridlayout.addWidget(self.AmplName, 3, 1)
AmplModelL = QLabel('Ampl. Model:', self)
self.AmplModel = QLineEdit(self.amp_model_val, self)
self.gridlayout.addWidget(AmplModelL, 4, 0)
self.gridlayout.addWidget(self.AmplModel, 4, 1)
AmplTypeL = QLabel('Ampl. Type:', self)
self.AmplType = QLineEdit(self.amp_type_val, self)
self.gridlayout.addWidget(AmplTypeL, 5, 0)
self.gridlayout.addWidget(self.AmplType, 5, 1)
gainL = QLabel('Gain:', self)
self.gain = QLineEdit(str(self.gain_val), self)
self.gridlayout.addWidget(gainL, 6, 0)
self.gridlayout.addWidget(self.gain, 6, 1)
hp_cutoffU = QLabel('Hz', self)
hp_cutoffL = QLabel('Highpass cutoff:', self)
self.hp_cutoff = QLineEdit(str(self.highpass_cutoff_val), self)
self.gridlayout.addWidget(hp_cutoffL, 7, 0)
self.gridlayout.addWidget(self.hp_cutoff, 7, 1)
self.gridlayout.addWidget(hp_cutoffU, 7, 2)
lp_cutoffU = QLabel('kHz', self)
lp_cutoffL = QLabel('Lowpass cutoff:', self)
self.lp_cutoff = QLineEdit('%.3f' % self.lowpass_cutoff_val, self)
self.gridlayout.addWidget(lp_cutoffL, 8, 0)
self.gridlayout.addWidget(self.lp_cutoff, 8, 1)
self.gridlayout.addWidget(lp_cutoffU, 8, 2)
space = QLabel('', self)
self.gridlayout.addWidget(space, 9, 0)
class Recording_settings(QWidget):
def __init__(self):
super().__init__()
self.experiment_name_val = 'recording fish behavior'
self.startdate_val = '~'
self.starttime_val = '~'
self.endtime_val = '~'
self.location_val = '~'
self.position_val = '~N, ~W'
self.water_temp_val = '~'
self.water_cond_val = '~'
self.water_ph_val = '~'
self.water_oxy_val = '~'
self.comment_val = '~'
self.experimenter_val = 'T. Raab et al. :)'
self.datatime_val = 100
self.datainterval_val = 1000
self.buffertime_val = 60
self.gridlayout = QGridLayout()
self.gridlayout.setColumnStretch(0, 5)
self.gridlayout.setColumnStretch(1, 5)
self.gridlayout.setColumnStretch(2, 1)
# self.get_widgets()
self.setLayout(self.gridlayout)
def get_widgets(self):
exp_nameL = QLabel('Experiment Name:', self)
self.exp_name = QLineEdit(self.experiment_name_val, self)
self.gridlayout.addWidget(exp_nameL, 0, 0)
self.gridlayout.addWidget(self.exp_name, 0, 1)
start_dateL = QLabel('Start Date:', self)
self.start_date = QLineEdit(self.startdate_val, self)
self.gridlayout.addWidget(start_dateL, 1, 0)
self.gridlayout.addWidget(self.start_date, 1, 1)
start_timeL = QLabel('Start Time:', self)
start_timeU = QLabel('HH:MM', self)
self.start_time = QLineEdit(self.starttime_val, self)
self.gridlayout.addWidget(start_timeL, 2, 0)
self.gridlayout.addWidget(self.start_time, 2, 1)
self.gridlayout.addWidget(start_timeU, 2, 2)
end_timeL = QLabel('End Time:', self)
end_timeU = QLabel('HH:MM', self)
self.end_time = QLineEdit(self.endtime_val, self)
self.gridlayout.addWidget(end_timeL, 3, 0)
self.gridlayout.addWidget(self.end_time, 3, 1)
self.gridlayout.addWidget(end_timeU, 3, 2)
locationL = QLabel('Location:', self)
self.location = QLineEdit(self.location_val, self)
self.gridlayout.addWidget(locationL, 4, 0)
self.gridlayout.addWidget(self.location, 4, 1)
positionL = QLabel('Position:', self)
self.position = QLineEdit(self.position_val, self)
self.gridlayout.addWidget(positionL, 5, 0)
self.gridlayout.addWidget(self.position, 5, 1)
waterTempU = QLabel('C', self)
waterTempL = QLabel('Water Temp:', self)
self.waterTemp = QLineEdit('%s' % self.water_temp_val, self)
self.gridlayout.addWidget(waterTempL, 6, 0)
self.gridlayout.addWidget(self.waterTemp, 6, 1)
self.gridlayout.addWidget(waterTempU, 6, 2)
waterCondU = QLabel('uS/cm', self)
waterCondL = QLabel('Water cond.:', self)
self.waterCond = QLineEdit('%s' % self.water_cond_val, self)
self.gridlayout.addWidget(waterCondL, 7, 0)
self.gridlayout.addWidget(self.waterCond, 7, 1)
self.gridlayout.addWidget(waterCondU, 7, 2)
waterpHU = QLabel('pH')
waterpHL = QLabel('Water-pH:')
self.waterpH = QLineEdit('%s' % self.water_ph_val, self)
self.gridlayout.addWidget(waterpHL, 8, 0)
self.gridlayout.addWidget(self.waterpH, 8, 1)
self.gridlayout.addWidget(waterpHU, 8, 2)
waterOxyU = QLabel('mg/l', self)
waterOxyL = QLabel('Water Oxygen:', self)
self.waterOxy = QLineEdit('%s' % self.water_oxy_val, self)
self.gridlayout.addWidget(waterOxyL, 9, 0)
self.gridlayout.addWidget(self.waterOxy, 9, 1)
self.gridlayout.addWidget(waterOxyU, 9, 2)
commentL = QLabel('Comment:', self)
self.comment = QLineEdit(self.comment_val, self)
self.gridlayout.addWidget(commentL, 10, 0)
self.gridlayout.addWidget(self.comment, 10, 1)
experimenterL = QLabel('Experimenter:', self)
self.experimenter = QLineEdit(self.experimenter_val, self)
self.gridlayout.addWidget(experimenterL, 11, 0)
self.gridlayout.addWidget(self.experimenter, 11, 1)
space = QLabel('', self)
self.gridlayout.addWidget(space, 12, 0)
class MainWindow(QTabWidget):
def __init__(self):
super().__init__()
self.initMe()
def initMe(self):
self.setGeometry(300, 150, 500, 600)
self.setWindowTitle('Fishgrid.cfg')
self.Grid = Grid_tab()
self.addTab(self.Grid, 'Grid layout')
self.HardWare = Hardware_settings_tab()
self.addTab(self.HardWare, 'Hardware')
self.Recording = Recording_settings()
self.addTab(self.Recording, 'Recording')
self.init_vars()
if os.path.exists('/media/pi/data1/fishgrid.cfg'):
cfg_file = '/media/pi/data1/fishgrid.cfg'
self.read_cfg(cfg_file)
elif 'fishgrid.cfg' in os.listdir('.'):
cfg_file = './fishgrid.cfg'
self.read_cfg(cfg_file)
else:
quit()
self.Grid.get_widgets()
self.HardWare.get_widgets()
self.Recording.get_widgets()
cancel = QPushButton('&Cancel', self)
cancel.clicked.connect(self.closeMe)
cancel.resize(100, 30)
cancel.move(380, 550)
save = QPushButton('&Save', self)
save.clicked.connect(self.save_cfg)
save.resize(100, 30)
save.move(260, 550)
self.show()
def init_vars(self):
self.Grid.grid_no_val = 1
self.Grid.columns_val = 8
self.Grid.rows_val = 8
self.Grid.col_dist_val = 50
self.Grid.row_dist_val = 50
self.Grid.channel_offset_val = 0
self.Grid.elec_type_val = 'plain'
self.Grid.ref_elec_type_val = 'plain'
self.Grid.ref_elec_posx_val = 0.00
self.Grid.ref_elec_posy_val = 0.00
self.Grid.water_depth_val = 0.25
self.HardWare.ai_sr_val = 20
self.HardWare.ai_max_vol_val = 1
self.HardWare.amp_name_val = "16-channel-amplifier"
self.HardWare.amp_model_val = 'EM-64B'
self.HardWare.amp_type_val = 'differential'
self.HardWare.gain_val = 100
self.HardWare.highpass_cutoff_val = 100
self.HardWare.lowpass_cutoff_val = 10
self.Recording.experiment_name_val = 'recording fish behavior'
self.Recording.startdate_val = '~'
self.Recording.starttime_val = '~'
self.Recording.endtime_val = '~'
self.Recording.location_val = 'Colombia - Los Llanos'
self.Recording.position_val = '~N, ~W'
self.Recording.water_temp_val = 20
self.Recording.water_cond_val = 5
self.Recording.water_ph_val = 7
self.Recording.water_oxy_val = 0
self.Recording.comment_val = '~'
self.Recording.experimenter_val = 'T. Raab et al. :)'
# self.Recording.datatime_val = 100
# self.Recording.datainterval_val = 1000
# self.Recording.buffertime_val = 60
def closeMe(self):
quit()
def read_cfg(self, cfg_file):
f = open(cfg_file, 'r')
cfg = f.readlines()
for line in cfg:
if 'Gridno1' in line:
self.Grid.grid_no_val = int(line.split(':')[1].strip())
elif 'RecordMode1' in line:
self.Grid.rec_mode_val = line.split(':')[1].strip()
elif 'Columns1' in line:
self.Grid.columns_val = int(line.split(':')[1].strip())
elif 'Rows1' in line:
self.Grid.rows_val = int(line.split(':')[1].strip())
elif 'Extra1' in line:
self.Grid.extra_val = int(line.split(':')[1].strip())
elif "ColumnDistance1" in line:
self.Grid.col_dist_val = float(line.split(':')[-1].strip().replace('cm', ''))
elif "RowDistance1" in line:
self.Grid.row_dist_val = float(line.split(':')[-1].strip().replace('cm', ''))
# elif "ChannelOffset1" in line:
# self.Grid.channel_offset_val = int(line.split(':')[-1].strip())
elif " ElectrodeType1 " in line:
self.Grid.elec_type_val = line.split(':')[-1].strip()
elif "RefElectrodeType1" in line:
self.Grid.ref_elec_type_val = line.split(":")[-1].strip()
elif "RefElectrodePosX1" in line:
self.Grid.ref_elec_posx_val = float(line.split(':')[-1].strip().replace('m', ''))
elif 'RefElectrodePosY1' in line:
self.Grid.ref_elec_posy_val = float(line.split(':')[-1].strip().replace('m', ''))
elif 'WaterDepth1' in line:
self.Grid.water_depth_val = float(line.split(':')[-1].strip().replace('m', ''))
elif "AISampleRate" in line:
self.HardWare.ai_sr_val = float(line.split(':')[-1].strip().replace('kHz', ''))
elif "AIMaxVolt" in line:
self.HardWare.ai_max_vol_val = float(line.split(':')[-1].strip().replace('mV', ''))
elif "AmplName" in line:
self.HardWare.amp_name_val = line.split(':')[-1].strip()
elif "AmplModel" in line:
self.HardWare.amp_model_val = line.split(':')[-1].strip()
elif ' Type ' in line:
self.HardWare.amp_type_val = line.split(':')[-1].strip()
elif 'Gain' in line:
self.HardWare.gain_val = line.split(':')[-1].strip()
elif "HighpassCutoff" in line:
self.HardWare.highpass_cutoff_val = int(line.split(':')[-1].strip().replace('Hz', ''))
elif 'LowpassCutoff' in line:
self.HardWare.lowpass_cutoff_val = float(line.split(':')[-1].strip().replace('kHz', ''))
elif "Experiment.Name" in line:
self.Recording.experiment_name_val = line.split(':')[-1].strip()
elif "StartDate" in line:
self.Recording.startdate_val = line.split(':')[-1].strip()
elif "StartTime" in line:
self.Recording.starttime_val = ':'.join(line.split(':')[1:]).strip()
elif "EndTime" in line:
self.Recording.endtime_val = ':'.join(line.split(':')[1:]).strip()
elif "Location" in line:
self.Recording.location_val = line.split(':')[-1].strip()
elif "Position" in line:
self.Recording.position_val = line.split(':')[-1].strip()
elif "WaterTemperature" in line:
self.Recording.water_temp_val = float(line.split(':')[-1].strip().replace('C', ''))
elif "WaterConductivity" in line:
self.Recording.water_cond_val = float(line.split(':')[-1].strip().replace('uS/cm', ''))
elif 'WaterpH' in line:
self.Recording.water_ph_val = line.split(':')[-1].strip().replace('pH', '')
elif "WaterOxygen" in line:
self.Recording.water_oxy_val = line.split(':')[-1].strip().replace('mg/l', '')
elif "Comment" in line:
self.Recording.comment_val = ':'.join(line.split(':')[1:]).strip()
elif "Experimenter" in line:
self.Recording.experimenter_val = ':'.join(line.split(':')[1:]).strip()
# elif "DataTime" in line:
# self.Recording.datatime_val = int(line.split(':')[-1].strip().replace('ms', ''))
# elif "DataInterval" in line:
# self.Recording.datainterval_val = int(line.split(':')[-1].strip().replace('ms', ''))
# elif "BufferTime" in line:
# self.Recording.buffertime_val = int(line.split(':')[-1].strip().replace('s', ''))
else:
continue
def save_cfg(self):
if os.path.exists('/media/pi/data1/fishgrid.cfg'):
f = open('/media/pi/data1/fishgrid.cfg', 'w+')
else:
f = open('./fishgrid.cfg', 'w+')
# ToDo: 'grid no.'
f.write('*FishGrid\n')
f.write(' Grid &1:\n')
f.write(' Used1 : true\n')
f.write(' Gridno1 : %.0f\n' % int(self.Grid.grid_no.text()))
f.write(' RecordMode1 : %s\n' % self.Grid.rec_mode.text())
f.write(' Columns1 : %.0f\n' % int(self.Grid.col_elecs.text()))
f.write(' Rows1 : %.0f\n' % int(self.Grid.row_elecs.text()))
f.write(' Extra1 : %.0f\n' % int(self.Grid.extra_elecs.text()))
f.write(' ColumnDistance1 : %.1fcm\n' % float(self.Grid.col_space.text()))
f.write(' RowDistance1 : %.1fcm\n' % float(self.Grid.row_space.text()))
# f.write(' ChannelOffset1 : %.0f\n' % int(self.Grid.channel_offset.text()))
f.write(' ElectrodeType1 : %s\n' % self.Grid.elec_type.text()) # ToDo: 'headstage'
f.write(' RefElectrodeType1: %s\n' % self.Grid.ref_elec_type.text()) # ToDo: 'screw'
f.write(' RefElectrodePosX1: %.2fm\n' % float(self.Grid.ref_elec_x.text()))
f.write(' RefElectrodePosY1: %.2fm\n' % float(self.Grid.ref_elec_y.text()))
f.write(' WaterDepth1 : %.2fm\n' % float(self.Grid.water_depth.text()))
f.write(' Hardware Settings:\n')
f.write(' DAQ board:\n')
f.write(' AISampleRate: %.3fkHz\n' % float(self.HardWare.AIsr.text()))
f.write(' AIMaxVolt : %.1fmV\n' % float(self.HardWare.AImaxV.text()))
f.write(' Amplifier:\n')
f.write(' AmplName : %s\n' % self.HardWare.AmplName.text())
f.write(' AmplModel : %s\n' % self.HardWare.AmplModel.text())
f.write(' Type : %s\n' % self.HardWare.AmplType.text())
f.write(' Gain : %.0f\n' % int(self.HardWare.gain.text()))
f.write(' HighpassCutoff: %.0fHz\n' % int(self.HardWare.hp_cutoff.text()))
f.write(' LowpassCutoff : %.3fkHz\n' % float(self.HardWare.lp_cutoff.text()))
f.write(' Recording:\n')
f.write(' General:\n')
f.write(' Experiment.Name : %s\n' % self.Recording.exp_name.text())
f.write(' StartDate : %s\n' % self.Recording.start_date.text())
f.write(' StartTime : %s\n' % self.Recording.start_time.text())
f.write(' EndTime : %s\n' % self.Recording.end_time.text())
f.write(' Location : %s\n' % self.Recording.location.text())
f.write(' Position : %s\n' % self.Recording.position.text())
f.write(' WaterTemperature : %sC\n' % self.Recording.waterTemp.text())
f.write(' WaterConductivity: %suS/cm\n' % self.Recording.waterCond.text())
f.write(' WaterpH : %spH\n' % self.Recording.waterpH.text())
f.write(' WaterOxygen : %smg/l\n' % self.Recording.waterOxy.text())
f.write(' Comment : %s\n' % self.Recording.comment.text())
f.write(' Experimenter : %s\n' % self.Recording.experimenter.text())
# f.write(' Buffers and timing:\n')
# f.write(' DataTime : %.0fms\n' % float(self.Recording.datatime.text()))
# f.write(' DataInterval: %.0fms\n' % float(self.Recording.datainterval.text()))
# f.write(' BufferTime : %.0fs\n' % float(self.Recording.buffertime.text()))
f.write('*Recording\n')
f.write(' PathFormat: "%04Y-%02m-%02d-%02H_%02M"\n')
f.close()
exit()
def main():
app = QApplication(sys.argv) # create application
w = MainWindow() # create window
sys.exit(app.exec_()) # exit if window is closed
if __name__ == '__main__':
main()