From 8c823468fe30e10294ca9ac85e14b14024c439f7 Mon Sep 17 00:00:00 2001 From: marcman86 Date: Tue, 10 Mar 2026 10:56:21 +0100 Subject: [PATCH 1/5] init --- Applications/relax2/Relax2_main.py | 2330 ++++++---- .../binaries/stemlab_125_14_ocra_mri.bit.bin | Bin 0 -> 1023680 bytes .../binaries/stemlab_125_14_ocra_mri.dtbo | Bin 0 -> 4782 bytes Applications/relax2/parameter_handler.py | 428 +- Applications/relax2/process_handler.py | 223 +- Applications/relax2/sequence_handler.py | 25 +- .../relax2/sequences/imaging/3D_SE_Gs.txt | 8 +- .../relax2/sequences/imaging/3D_TSE_Gs.txt | 78 +- Applications/relax2/server/README.md | 103 +- Applications/relax2/server/relax_server_dev.c | 3937 ++++++++++------- 10 files changed, 4565 insertions(+), 2567 deletions(-) create mode 100644 Applications/relax2/binaries/stemlab_125_14_ocra_mri.bit.bin create mode 100644 Applications/relax2/binaries/stemlab_125_14_ocra_mri.dtbo diff --git a/Applications/relax2/Relax2_main.py b/Applications/relax2/Relax2_main.py index 0e64c54b..5ab38954 100644 --- a/Applications/relax2/Relax2_main.py +++ b/Applications/relax2/Relax2_main.py @@ -27,7 +27,7 @@ import json # import PyQt5 packages -from PyQt5 import QtWidgets +from PyQt5 import QtWidgets, QtCore from PyQt5.QtSerialPort import QSerialPortInfo, QSerialPort from PyQt5.QtWidgets import QMessageBox, QApplication, QFileDialog, QDesktopWidget, QFrame, QTableWidget, QTableWidgetItem from PyQt5.uic import loadUiType, loadUi @@ -337,7 +337,7 @@ def switch_GUImode(self, mode): self.Sequence_comboBox.addItems(['2D Gradient Echo', '2D Inversion Recovery (GRE)', '2D Spin Echo' \ , '2D Inversion Recovery (SE)', '2D Turbo Spin Echo (4 Echos)', '2D Gradient Echo (Slice)' \ , '2D Inversion Recovery (Slice, GRE)', '2D Spin Echo (Slice)', '2D Inversion Recovery (Slice, SE)' \ - , '2D Turbo Spin Echo (Slice, 4 Echos)', '3D FFT Spin Echo (Slab)']) + , '2D Turbo Spin Echo (Slice, 4 Echos)', '3D FFT Spin Echo (Slab)', '3D FFT Turbo Spin Echo (Slab)']) self.Sequence_comboBox.setCurrentIndex(0) if params.agriMRI_mode == 1: params.datapath = 'Image_Stitching_rawdata' else: params.datapath = 'rawdata/Image_Stitching_rawdata' @@ -360,13 +360,106 @@ def acquire(self): self.agriMRI_folder_structure_temp = '' self.agriMRI_folder_structure_temp = params.agriMRI_folder_structure - if params.agriMRI_folder_structure != 'rawdata/': params.save_AgriMRI_Metadata_file_json() - else: print('\033[1m' + 'No experiment ID set!! Save data to rawdata folder.' + '\033[0m') + if params.agriMRI_folder_structure != 'rawdata/': + if os.path.isfile(params.agriMRI_folder_structure + 'AgriMRI_Metadata.json') == True: + msg_box_agriMRI_header = QMessageBox() + msg_box_agriMRI_header.setText('AgriMRI_Metadata.json detected in folder. Do you want to overwrite the file?') + msg_box_agriMRI_header.setIcon(QMessageBox.Warning) + msg_box_agriMRI_header.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel) + reply_msg_box_agriMRI_header = msg_box_agriMRI_header.exec() + if reply_msg_box_agriMRI_header == QMessageBox.Ok: + params.save_AgriMRI_Metadata_file_json() + print('\033[1m' + 'AgriMRI_Metadata.json overwritten.' + '\033[0m') + else: print('\033[1m' + 'AgriMRI_Metadata.json not overwritten.' + '\033[0m') + else: + print('\033[1m' + 'No experiment ID set!! Save data to rawdata folder.' + '\033[0m') params.agriMRI_folder_structure = params.agriMRI_folder_structure + 'AgriMRI_rawdata' if os.path.isdir(params.agriMRI_folder_structure) != True: os.mkdir(params.agriMRI_folder_structure) params.agriMRI_folder_structure = params.agriMRI_folder_structure + '/' params.datapath = params.agriMRI_folder_structure + params.datapath + + if params.GUImode == 5: + self.datapath_2_temp = '' + self.datapath_2_temp = params.datapath + params.datapath + '/Image_Stitching' + + if params.headerfileformat == 0: + if os.path.isfile(params.datapath + '_Header.txt') == True: + msg_box_data = QMessageBox() + msg_box_data.setText('Stitching data with same name detected in folder. Do you want to overwrite the data?') + msg_box_data.setIcon(QMessageBox.Warning) + msg_box_data.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel) + reply_msg_box_data = msg_box_data.exec() + if reply_msg_box_data == QMessageBox.Ok: print('\033[1m' + 'Overwriting data.' + '\033[0m') + else: + print('\033[1m' + 'Acquisition canceled.' + '\033[0m') + if params.agriMRI_mode == 1: + params.datapath = self.datapath_temp + params.agriMRI_folder_structure = self.agriMRI_folder_structure_temp + self.Acquire_pushButton.setEnabled(True) + self.Data_Process_pushButton.setEnabled(True) + self.repaint() + return + else: print('\033[1m' + 'Starting new acquisition.' + '\033[0m') + else: + if os.path.isfile(params.datapath + '_Header.json') == True: + msg_box_data = QMessageBox() + msg_box_data.setText('Stitching data with same name detected in folder. Do you want to overwrite the data?') + msg_box_data.setIcon(QMessageBox.Warning) + msg_box_data.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel) + reply_msg_box_data = msg_box_data.exec() + if reply_msg_box_data == QMessageBox.Ok: print('\033[1m' + 'Overwriting data.' + '\033[0m') + else: + print('\033[1m' + 'Acquisition canceled.' + '\033[0m') + if params.agriMRI_mode == 1: + params.datapath = self.datapath_temp + params.agriMRI_folder_structure = self.agriMRI_folder_structure_temp + self.Acquire_pushButton.setEnabled(True) + self.Data_Process_pushButton.setEnabled(True) + self.repaint() + return + else: print('\033[1m' + 'Starting new acquisition.' + '\033[0m') + + params.datapath = self.datapath_2_temp + + else: + if params.headerfileformat == 0: + if os.path.isfile(params.datapath + '_Header.txt') == True: + msg_box_data = QMessageBox() + msg_box_data.setText('Data with same name detected in folder. Do you want to overwrite the data?') + msg_box_data.setIcon(QMessageBox.Warning) + msg_box_data.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel) + reply_msg_box_data = msg_box_data.exec() + if reply_msg_box_data == QMessageBox.Ok: print('\033[1m' + 'Overwriting data.' + '\033[0m') + else: + print('\033[1m' + 'Acquisition canceled.' + '\033[0m') + if params.agriMRI_mode == 1: + params.datapath = self.datapath_temp + params.agriMRI_folder_structure = self.agriMRI_folder_structure_temp + self.Acquire_pushButton.setEnabled(True) + self.Data_Process_pushButton.setEnabled(True) + self.repaint() + return + else: print('\033[1m' + 'Starting new acquisition.' + '\033[0m') + else: + if os.path.isfile(params.datapath + '_Header.json') == True: + msg_box_data = QMessageBox() + msg_box_data.setText('Data with same name detected in folder. Do you want to overwrite the data?') + msg_box_data.setIcon(QMessageBox.Warning) + msg_box_data.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel) + reply_msg_box_data = msg_box_data.exec() + if reply_msg_box_data == QMessageBox.Ok: print('\033[1m' + 'Overwriting data.' + '\033[0m') + else: + print('\033[1m' + 'Acquisition canceled.' + '\033[0m') + if params.agriMRI_mode == 1: + params.datapath = self.datapath_temp + params.agriMRI_folder_structure = self.agriMRI_folder_structure_temp + self.Acquire_pushButton.setEnabled(True) + self.Data_Process_pushButton.setEnabled(True) + self.repaint() + return + else: print('\033[1m' + 'Starting new acquisition.' + '\033[0m') if params.GUImode == 2: if params.sequence == 0: @@ -428,6 +521,8 @@ def acquire(self): proc.image_stitching_2D_SE_slice(motor=self.motor) if params.sequence == 10: proc.image_stitching_3D_slab(motor=self.motor) + if params.sequence == 11: + proc.image_stitching_3D_TSE_slab(motor=self.motor) self.motor_reader.blockSignals(False) else: print('Motor Control: Motor not available, maybe it is still homing?') @@ -454,6 +549,8 @@ def acquire(self): proc.image_stitching_2D_SE_slice() if params.sequence == 10: proc.image_stitching_3D_slab() + if params.sequence == 11: + proc.image_stitching_3D_TSE_slab() elif params.GUImode == 1: if params.autorecenter == 1: @@ -808,312 +905,180 @@ def dataprocess(self): if self.dialog_plot.dialog_3D_layers != None: self.dialog_plot.dialog_3D_layers.hide() - if params.GUImode == 0: - if os.path.isfile(params.datapath + '.txt') == True: - proc.spectrum_process() - proc.spectrum_analytics() - if params.single_plot == 1: - if self.dialog_plot != None: - self.dialog_plot.hide() - if self.dialog_plot.fig_canvas != None: self.dialog_plot.fig_canvas.hide() - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: print('No spectrum rawdata file!!') + if params.single_plot == 1: + if self.dialog_plot != None: + for attr_name in dir(self.dialog_plot): + if 'canvas' in attr_name.lower(): + canvas = getattr(self.dialog_plot, attr_name) + if canvas != None: + plt.close(canvas.figure) + canvas.setParent(None) + canvas.deleteLater() + setattr(self.dialog_plot, attr_name, None) + self.dialog_plot.setAttribute(QtCore.Qt.WA_DeleteOnClose) + self.dialog_plot.close() + self.dialog_plot = None + + if params.GUImode == 0: + if os.path.isfile(params.datapath + '.txt') == True: + proc.spectrum_process() + proc.spectrum_analytics() + + self.dialog_plot = PlotWindow(self) + self.dialog_plot.show() + + else: print('No spectrum rawdata file!!') + + elif params.GUImode == 1 and (params.sequence == 34 or params.sequence == 35 or params.sequence == 36): + if os.path.isfile(params.datapath + '.txt') == True: + proc.image_3D_process() + proc.image_3D_analytics() + + self.dialog_plot = PlotWindow(self) + self.dialog_plot.show() + else: print('No 3D rawdata file!!') + + elif params.GUImode == 1 and (params.sequence == 14 or params.sequence == 31): + if os.path.isfile(params.datapath + '.txt') == True: + proc.image_diff_process() + + self.dialog_plot = PlotWindow(self) + self.dialog_plot.show() + else: print('No 2D diffusion rawdata file!!') + elif params.GUImode == 1 and (params.sequence == 0 or params.sequence == 1 or params.sequence == 2 \ + or params.sequence == 3 or params.sequence == 17 or params.sequence == 18 \ + or params.sequence == 19 or params.sequence == 20): + if os.path.isfile(params.datapath + '.txt') == True: + proc.radial_process() + proc.image_analytics() + + self.dialog_plot = PlotWindow(self) + self.dialog_plot.show() + else: print('No 2D radial rawdata file!!') + elif params.GUImode == 1 and (params.sequence != 34 or params.sequence != 35 or params.sequence != 36 \ + or params.sequence != 14 or params.sequence != 31 or params.sequence != 0 \ + or params.sequence != 1 or params.sequence != 2 or params.sequence != 3 \ + or params.sequence != 17 or params.sequence != 18 or params.sequence != 19 \ + or params.sequence != 20): + if os.path.isfile(params.datapath + '.txt') == True: + proc.image_process() + proc.image_analytics() + + self.dialog_plot = PlotWindow(self) + self.dialog_plot.show() + else: print('No 2D rawdata file!!') + + elif params.GUImode == 2 and (params.sequence == 0 or params.sequence == 1 or params.sequence == 2 or params.sequence == 3): + if os.path.isfile(params.datapath + '.txt') == True: + proc.T1process() + + self.dialog_plot = PlotWindow(self) + self.dialog_plot.show() + else: print('No T1 file!!') + elif params.GUImode == 2 and (params.sequence == 4 or params.sequence == 5 or params.sequence == 6 or params.sequence == 7): + if os.path.isfile(params.datapath + '_Image_TI_steps.txt') == True: + if os.path.isfile(params.datapath + '_Image_Magnitude.txt') == True: + proc.T1imageprocess() + + self.dialog_plot = PlotWindow(self) + self.dialog_plot.show() + else: print('No T1 rawdata file!!') + else: print('No TI steps file!!') + + elif params.GUImode == 3 and (params.sequence == 0 or params.sequence == 1 or params.sequence == 2 or params.sequence == 3): + if os.path.isfile(params.datapath + '.txt') == True: + proc.T2process() + + self.dialog_plot = PlotWindow(self) + self.dialog_plot.show() + else: print('No T2 file!!') + elif params.GUImode == 3 and (params.sequence == 4 or params.sequence == 5 or params.sequence == 6 or params.sequence == 7): + if os.path.isfile(params.datapath + '_Image_TE_steps.txt') == True: + if os.path.isfile(params.datapath + '_Image_Magnitude.txt') == True: + proc.T2imageprocess() - elif params.GUImode == 1 and (params.sequence == 34 or params.sequence == 35 or params.sequence == 36): - if os.path.isfile(params.datapath + '.txt') == True: - proc.image_3D_process() - proc.image_3D_analytics() - if params.single_plot == 1: - if self.dialog_plot != None: - self.dialog_plot.hide() - if self.dialog_plot.IMag_canvas != None: self.dialog_plot.IMag_canvas.hide() - if self.dialog_plot.IPha_canvas != None: self.dialog_plot.IPha_canvas.hide() - if self.dialog_plot.kMag_canvas != None: self.dialog_plot.kMag_canvas.hide() - if self.dialog_plot.kPha_canvas != None: self.dialog_plot.kPha_canvas.hide() - if self.dialog_plot.all_canvas != None: self.dialog_plot.all_canvas.hide() - if self.dialog_plot.hist_canvas != None: self.dialog_plot.hist_canvas.hide() - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: print('No 3D rawdata file!!') - - elif params.GUImode == 1 and (params.sequence == 14 or params.sequence == 31): - if os.path.isfile(params.datapath + '.txt') == True: - proc.image_diff_process() - if params.single_plot == 1: - if self.dialog_plot != None: - self.dialog_plot.hide() - if self.dialog_plot.IComb_canvas != None: self.dialog_plot.IComb_canvas.hide() - if self.dialog_plot.IDiff_canvas != None: self.dialog_plot.IDiff_canvas.hide() - if self.dialog_plot.IMag_canvas != None: self.dialog_plot.IMag_canvas.hide() - if self.dialog_plot.IPha_canvas != None: self.dialog_plot.IPha_canvas.hide() - if self.dialog_plot.kMag_canvas != None: self.dialog_plot.kMag_canvas.hide() - if self.dialog_plot.kPha_canvas != None: self.dialog_plot.kPha_canvas.hide() - if self.dialog_plot.all_canvas != None: self.dialog_plot.all_canvas.hide() - if self.dialog_plot.hist_canvas != None: self.dialog_plot.hist_canvas.hide() - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: print('No 2D diffusion rawdata file!!') - elif params.GUImode == 1 and (params.sequence == 0 or params.sequence == 1 or params.sequence == 2 \ - or params.sequence == 3 or params.sequence == 17 or params.sequence == 18 \ - or params.sequence == 19 or params.sequence == 20): - if os.path.isfile(params.datapath + '.txt') == True: - proc.radial_process() - proc.image_analytics() - if params.single_plot == 1: - if self.dialog_plot != None: - self.dialog_plot.hide() - if self.dialog_plot.IMag_canvas != None: self.dialog_plot.IMag_canvas.hide() - if self.dialog_plot.IPha_canvas != None: self.dialog_plot.IPha_canvas.hide() - if self.dialog_plot.kMag_canvas != None: self.dialog_plot.kMag_canvas.hide() - if self.dialog_plot.kPha_canvas != None: self.dialog_plot.kPha_canvas.hide() - if self.dialog_plot.all_canvas != None: self.dialog_plot.all_canvas.hide() - if self.dialog_plot.hist_canvas != None: self.dialog_plot.hist_canvas.hide() - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: print('No 2D radial rawdata file!!') - elif params.GUImode == 1 and (params.sequence != 34 or params.sequence != 35 or params.sequence != 36 \ - or params.sequence != 14 or params.sequence != 31 or params.sequence != 0 \ - or params.sequence != 1 or params.sequence != 2 or params.sequence != 3 \ - or params.sequence != 17 or params.sequence != 18 or params.sequence != 19 \ - or params.sequence != 20): - if os.path.isfile(params.datapath + '.txt') == True: - proc.image_process() - proc.image_analytics() - if params.single_plot == 1: - if self.dialog_plot != None: - self.dialog_plot.hide() - if self.dialog_plot.IMag_canvas != None: self.dialog_plot.IMag_canvas.hide() - if self.dialog_plot.IPha_canvas != None: self.dialog_plot.IPha_canvas.hide() - if self.dialog_plot.kMag_canvas != None: self.dialog_plot.kMag_canvas.hide() - if self.dialog_plot.kPha_canvas != None: self.dialog_plot.kPha_canvas.hide() - if self.dialog_plot.all_canvas != None: self.dialog_plot.all_canvas.hide() - if self.dialog_plot.hist_canvas != None: self.dialog_plot.hist_canvas.hide() - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: print('No 2D rawdata file!!') - - elif params.GUImode == 2 and (params.sequence == 0 or params.sequence == 1 or params.sequence == 2 or params.sequence == 3): - if os.path.isfile(params.datapath + '.txt') == True: - proc.T1process() - if params.single_plot == 1: - if self.dialog_plot != None: - self.dialog_plot.hide() - if self.dialog_plot.fig_canvas1 != None: self.dialog_plot.fig_canvas1.hide() - if self.dialog_plot.fig_canvas2 != None: self.dialog_plot.fig_canvas2.hide() - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: print('No T1 file!!') - elif params.GUImode == 2 and (params.sequence == 4 or params.sequence == 5 or params.sequence == 6 or params.sequence == 7): - if os.path.isfile(params.datapath + '_Image_TI_steps.txt') == True: - if os.path.isfile(params.datapath + '_Image_Magnitude.txt') == True: - proc.T1imageprocess() - if params.single_plot == 1: - if self.dialog_plot != None: - self.dialog_plot.hide() - if self.dialog_plot.IComb_canvas != None: self.dialog_plot.IComb_canvas.hide() - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: print('No T1 rawdata file!!') - else: print('No TI steps file!!') - - elif params.GUImode == 3 and (params.sequence == 0 or params.sequence == 1 or params.sequence == 2 or params.sequence == 3): - if os.path.isfile(params.datapath + '.txt') == True: - proc.T2process() - if params.single_plot == 1: - if self.dialog_plot != None: - self.dialog_plot.hide() - if self.dialog_plot.fig_canvas != None: self.dialog_plot.fig_canvas.hide() - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: print('No T2 file!!') - elif params.GUImode == 3 and (params.sequence == 4 or params.sequence == 5 or params.sequence == 6 or params.sequence == 7): - if os.path.isfile(params.datapath + '_Image_TE_steps.txt') == True: - if os.path.isfile(params.datapath + '_Image_Magnitude.txt') == True: - proc.T2imageprocess() - if params.single_plot == 1: - if self.dialog_plot != None: - self.dialog_plot.hide() - if self.dialog_plot.IComb_canvas != None: self.dialog_plot.IComb_canvas.hide() - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: print('No T2 rawdata file!!') - else: print('No TE steps file!!') - - elif params.GUImode == 4 and (params.sequence == 0 or params.sequence == 1 or params.sequence == 4 or params.sequence == 5): - self.datapathtemp = params.datapath - params.projx = np.matrix(np.zeros((1, 4))) - params.projy = np.matrix(np.zeros((1, 4))) - params.projz = np.matrix(np.zeros((1, 4))) - for m in range(params.projaxis.shape[0]): - params.datapath = self.datapathtemp + '_' + str(m) - if os.path.isfile(params.datapath + '.txt') == True: - proc.spectrum_process() - if m == 0: - params.projx = np.matrix(np.zeros((params.timeaxis.shape[0], 4))) - params.projx[:, 0] = np.reshape(params.mag, (params.timeaxis.shape[0], 1)) - params.projx[:, 1] = np.reshape(params.real, (params.timeaxis.shape[0], 1)) - params.projx[:, 2] = np.reshape(params.imag, (params.timeaxis.shape[0], 1)) - params.projx[:, 3] = params.spectrumfft - elif m == 1: - params.projy = np.matrix(np.zeros((params.timeaxis.shape[0], 4))) - params.projy[:, 0] = np.reshape(params.mag, (params.timeaxis.shape[0], 1)) - params.projy[:, 1] = np.reshape(params.real, (params.timeaxis.shape[0], 1)) - params.projy[:, 2] = np.reshape(params.imag, (params.timeaxis.shape[0], 1)) - params.projy[:, 3] = params.spectrumfft - elif m == 2: - params.projz = np.matrix(np.zeros((params.timeaxis.shape[0], 4))) - params.projz[:, 0] = np.reshape(params.mag, (params.timeaxis.shape[0], 1)) - params.projz[:, 1] = np.reshape(params.real, (params.timeaxis.shape[0], 1)) - params.projz[:, 2] = np.reshape(params.imag, (params.timeaxis.shape[0], 1)) - params.projz[:, 3] = params.spectrumfft - else: print('No projection spectrum rawdata file!!') - params.datapath = self.datapathtemp - if params.single_plot == 1: - if self.dialog_plot != None: - self.dialog_plot.hide() - if self.dialog_plot.fig_canvas != None: self.dialog_plot.fig_canvas.hide() - if self.dialog_plot.IMag_canvas != None: self.dialog_plot.IMag_canvas.hide() - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: self.dialog_plot = PlotWindow(self) self.dialog_plot.show() - elif params.GUImode == 4 and (params.sequence == 2 or params.sequence == 3 or params.sequence == 6 or params.sequence == 7): + else: print('No T2 rawdata file!!') + else: print('No TE steps file!!') + + elif params.GUImode == 4 and (params.sequence == 0 or params.sequence == 1 or params.sequence == 4 or params.sequence == 5): + self.datapathtemp = params.datapath + params.projx = np.matrix(np.zeros((1, 4))) + params.projy = np.matrix(np.zeros((1, 4))) + params.projz = np.matrix(np.zeros((1, 4))) + for m in range(params.projaxis.shape[0]): + params.datapath = self.datapathtemp + '_' + str(m) if os.path.isfile(params.datapath + '.txt') == True: proc.spectrum_process() - if params.single_plot == 1: - if self.dialog_plot != None: - self.dialog_plot.hide() - if self.dialog_plot.fig_canvas != None: self.dialog_plot.fig_canvas.hide() - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() + if m == 0: + params.projx = np.matrix(np.zeros((params.timeaxis.shape[0], 4))) + params.projx[:, 0] = np.reshape(params.mag, (params.timeaxis.shape[0], 1)) + params.projx[:, 1] = np.reshape(params.real, (params.timeaxis.shape[0], 1)) + params.projx[:, 2] = np.reshape(params.imag, (params.timeaxis.shape[0], 1)) + params.projx[:, 3] = params.spectrumfft + elif m == 1: + params.projy = np.matrix(np.zeros((params.timeaxis.shape[0], 4))) + params.projy[:, 0] = np.reshape(params.mag, (params.timeaxis.shape[0], 1)) + params.projy[:, 1] = np.reshape(params.real, (params.timeaxis.shape[0], 1)) + params.projy[:, 2] = np.reshape(params.imag, (params.timeaxis.shape[0], 1)) + params.projy[:, 3] = params.spectrumfft + elif m == 2: + params.projz = np.matrix(np.zeros((params.timeaxis.shape[0], 4))) + params.projz[:, 0] = np.reshape(params.mag, (params.timeaxis.shape[0], 1)) + params.projz[:, 1] = np.reshape(params.real, (params.timeaxis.shape[0], 1)) + params.projz[:, 2] = np.reshape(params.imag, (params.timeaxis.shape[0], 1)) + params.projz[:, 3] = params.spectrumfft else: print('No projection spectrum rawdata file!!') - - elif params.GUImode == 5 and (params.sequence == 0 or params.sequence == 1 or params.sequence == 2 or params.sequence == 3 \ - or params.sequence == 4 or params.sequence == 5 or params.sequence == 6 or params.sequence == 7 \ - or params.sequence == 8 or params.sequence == 9): - if os.path.isfile(params.datapath + '/Image_Stitching_1.txt') == True: - proc.image_stitching_2D_process() - proc.image_stitching_analytics() - if params.single_plot == 1: - if self.dialog_plot != None: - self.dialog_plot.hide() - if self.dialog_plot.IMag_canvas != None: self.dialog_plot.IMag_canvas.hide() - if self.dialog_plot.IPha_canvas != None: self.dialog_plot.IPha_canvas.hide() - if self.dialog_plot.all_canvas != None: self.dialog_plot.all_canvas.hide() - if self.dialog_plot.hist_canvas != None: self.dialog_plot.hist_canvas.hide() - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: print('No 2D stitching rawdata file!!') - elif params.GUImode == 5 and params.sequence == 10: - if os.path.isfile(params.datapath + '/Image_Stitching_1.txt') == True: - proc.image_stitching_3D_process() - proc.image_stitching_3D_analytics() - if params.single_plot == 1: - if self.dialog_plot != None: - self.dialog_plot.hide() - if self.dialog_plot.IMag_canvas != None: self.dialog_plot.IMag_canvas.hide() - if self.dialog_plot.IPha_canvas != None: self.dialog_plot.IPha_canvas.hide() - if self.dialog_plot.all_canvas != None: self.dialog_plot.all_canvas.hide() - if self.dialog_plot.hist_canvas != None: self.dialog_plot.hist_canvas.hide() - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: - self.dialog_plot = PlotWindow(self) - self.dialog_plot.show() - else: print('No 3D stitching rawdata file!!') + params.datapath = self.datapathtemp + + self.dialog_plot = PlotWindow(self) + self.dialog_plot.show() + elif params.GUImode == 4 and (params.sequence == 2 or params.sequence == 3 or params.sequence == 6 or params.sequence == 7): + if os.path.isfile(params.datapath + '.txt') == True: + proc.spectrum_process() + + self.dialog_plot = PlotWindow(self) + self.dialog_plot.show() + else: print('No projection spectrum rawdata file!!') + + elif params.GUImode == 5 and (params.sequence == 0 or params.sequence == 1 or params.sequence == 2 or params.sequence == 3 \ + or params.sequence == 4 or params.sequence == 5 or params.sequence == 6 or params.sequence == 7 \ + or params.sequence == 8 or params.sequence == 9): + if os.path.isfile(params.datapath + '/Image_Stitching_1.txt') == True: + proc.image_stitching_2D_process() + proc.image_stitching_analytics() + + self.dialog_plot = PlotWindow(self) + self.dialog_plot.show() + else: print('No 2D stitching rawdata file!!') + elif params.GUImode == 5 and (params.sequence == 10 or params.sequence == 11): + if os.path.isfile(params.datapath + '/Image_Stitching_1.txt') == True: + proc.image_stitching_3D_process() + proc.image_stitching_3D_analytics() + + self.dialog_plot = PlotWindow(self) + self.dialog_plot.show() + else: print('No 3D stitching rawdata file!!') + + params.saveFileData() - params.saveFileData() - - params.GUImode = self.GUImode_temp - params.sequence = self.sequence_temp - params.imageorientation = self.imageorientation_temp - params.FOV = self.FOV_temp - params.SPEsteps = self.SPEsteps_temp - params.nPE = self.nPE_temp - params.motor_image_count = self.motor_image_count_temp - params.motor_movement_step = self.motor_movement_step_temp - params.slicethickness = self.slicethickness_temp - params.motor_total_image_length = self.motor_total_image_length_temp - params.motor_start_position = self.motor_start_position_temp - params.motor_end_position = self.motor_end_position_temp - params.radialanglestep = self.radialanglestep_temp - params.radialosfactor = self.radialosfactor_temp - params.autofreqoffset = self.autofreqoffset_temp - params.sliceoffset = self.sliceoffset_temp + params.GUImode = self.GUImode_temp + params.sequence = self.sequence_temp + params.imageorientation = self.imageorientation_temp + params.FOV = self.FOV_temp + params.SPEsteps = self.SPEsteps_temp + params.nPE = self.nPE_temp + params.motor_image_count = self.motor_image_count_temp + params.motor_movement_step = self.motor_movement_step_temp + params.slicethickness = self.slicethickness_temp + params.motor_total_image_length = self.motor_total_image_length_temp + params.motor_start_position = self.motor_start_position_temp + params.motor_end_position = self.motor_end_position_temp + params.radialanglestep = self.radialanglestep_temp + params.radialosfactor = self.radialosfactor_temp + params.autofreqoffset = self.autofreqoffset_temp + params.sliceoffset = self.sliceoffset_temp if params.agriMRI_mode == 1: params.datapath = self.datapath_temp @@ -1155,8 +1120,7 @@ def update_gui(self): QApplication.processEvents() def closeEvent(self, event): - choice = QMessageBox.question(self, 'Close Relax 2.0', 'Are you sure that you want to quit Relax 2.0?', \ - QMessageBox.Cancel | QMessageBox.Close, QMessageBox.Cancel) + choice = QMessageBox.question(self, 'Close Relax 2.0', 'Are you sure that you want to quit Relax 2.0?', QMessageBox.Cancel | QMessageBox.Close, QMessageBox.Cancel) if choice == QMessageBox.Close: params.GUImode = 0 @@ -2524,6 +2488,7 @@ def __init__(self, parent=None): self.Plant_Species_comboBox.setCurrentIndex(0) self.Plant_Species_comboBox.currentIndexChanged.connect(lambda: self.set_Species()) + self.Plant_Cultivated_Variant_lineEdit.editingFinished.connect(lambda: self.update_params()) self.Plant_Part_Name_lineEdit.editingFinished.connect(lambda: self.update_params()) self.Plant_Date_Of_Sowing_dateEdit.userDateChanged.connect(lambda: self.set_Date_Of_Sowing()) self.Plant_Measurement_Date_dateEdit.userDateChanged.connect(lambda: self.set_Measurement_Date()) @@ -2550,6 +2515,8 @@ def __init__(self, parent=None): self.Plant_Water_Availability_spinBox.setKeyboardTracking(False) self.Plant_Water_Availability_spinBox.valueChanged.connect(self.update_params) + self.Plant_Seed_Coating_lineEdit.editingFinished.connect(lambda: self.update_params()) + self.Plant_Nutrient_Application_comboBox.clear() self.Plant_Nutrient_Application_comboBox.addItems(['1', '2', '3', '4','5', '6', '7', '8','9', '10']) self.Plant_Nutrient_Application_comboBox.setCurrentIndex(0) @@ -2593,6 +2560,7 @@ def load_params(self): self.Experiment_ID_lineEdit.blockSignals(True) self.Plant_ID_lineEdit.blockSignals(True) self.Plant_Part_ID_lineEdit.blockSignals(True) + self.Plant_Cultivated_Variant_lineEdit.blockSignals(True) self.Plant_Part_Name_lineEdit.blockSignals(True) self.Plant_Species_comboBox.blockSignals(True) self.Plant_Date_Of_Sowing_dateEdit.blockSignals(True) @@ -2606,6 +2574,7 @@ def load_params(self): self.Plant_Light_Source_Artificial_radioButton.blockSignals(True) self.Plant_Light_Availability_spinBox.blockSignals(True) self.Plant_Water_Availability_spinBox.blockSignals(True) + self.Plant_Seed_Coating_lineEdit.blockSignals(True) self.Plant_Nutrient_Application_comboBox.blockSignals(True) self.Plant_Nutrient_Date_dateEdit.blockSignals(True) self.Plant_Nutrient_DAS_spinBox.blockSignals(True) @@ -2629,6 +2598,7 @@ def load_params(self): self.Experiment_ID_lineEdit.setText(params.experiment_ID) self.Plant_ID_lineEdit.setText(params.plant_ID) self.Plant_Part_ID_lineEdit.setText(params.plant_part_ID) + self.Plant_Cultivated_Variant_lineEdit.setText(params.plant_cultivated_variant) self.Plant_Part_Name_lineEdit.setText(params.plant_part_name) self.Plant_Date_Of_Sowing_dateEdit.setDate(params.plant_date_of_sowing) @@ -2644,15 +2614,22 @@ def load_params(self): else: self.Plant_Phenological_Phase_comboBox.setStyleSheet('color: #eff0f1') if params.plant_environment_outside == 1: self.Plant_Environment_Outside_radioButton.setChecked(True) + else: self.Plant_Environment_Outside_radioButton.setChecked(False) if params.plant_environment_inside == 1: self.Plant_Environment_Inside_radioButton.setChecked(True) - + else: self.Plant_Environment_Inside_radioButton.setChecked(False) + if params.plant_light_source_sun == 1: self.Plant_Light_Source_Sun_radioButton.setChecked(True) + else: self.Plant_Light_Source_Sun_radioButton.setChecked(False) if params.plant_light_source_grow_light == 1: self.Plant_Light_Source_Grow_Light_radioButton.setChecked(True) + else: self.Plant_Light_Source_Grow_Light_radioButton.setChecked(False) if params.plant_light_source_artificial == 1: self.Plant_Light_Source_Artificial_radioButton.setChecked(True) + else: self.Plant_Light_Source_Artificial_radioButton.setChecked(False) + self.Plant_Light_Availability_spinBox.setValue(params.plant_light_availability) - self.Plant_Water_Availability_spinBox.setValue(params.plant_water_availability) + self.Plant_Seed_Coating_lineEdit.setText(params.plant_seed_coating) + self.Plant_Nutrient_Application_comboBox.setCurrentIndex(params.plant_nutrient_application_index) try: self.Plant_Nutrient_Date_dateEdit.setDate(params.plant_nutrient_date[params.plant_nutrient_application_index]) except: self.Plant_Nutrient_Date_dateEdit.setDate(datetime.datetime.strptime('2025-01-01','%Y-%m-%d')) @@ -2681,6 +2658,7 @@ def load_params(self): self.Experiment_ID_lineEdit.blockSignals(False) self.Plant_ID_lineEdit.blockSignals(False) self.Plant_Part_ID_lineEdit.blockSignals(False) + self.Plant_Cultivated_Variant_lineEdit.blockSignals(False) self.Plant_Part_Name_lineEdit.blockSignals(False) self.Plant_Species_comboBox.blockSignals(False) self.Plant_Date_Of_Sowing_dateEdit.blockSignals(False) @@ -2694,6 +2672,7 @@ def load_params(self): self.Plant_Light_Source_Artificial_radioButton.blockSignals(False) self.Plant_Light_Availability_spinBox.blockSignals(False) self.Plant_Water_Availability_spinBox.blockSignals(False) + self.Plant_Seed_Coating_lineEdit.blockSignals(False) self.Plant_Nutrient_Application_comboBox.blockSignals(False) self.Plant_Nutrient_Date_dateEdit.blockSignals(False) self.Plant_Nutrient_DAS_spinBox.blockSignals(False) @@ -2712,6 +2691,7 @@ def load_params(self): self.Plant_Protection_Dose_spinBox.blockSignals(False) def update_params(self): + params.plant_cultivated_variant = self.Plant_Cultivated_Variant_lineEdit.text() params.plant_part_name = self.Plant_Part_Name_lineEdit.text() if self.Plant_Environment_Outside_radioButton.isChecked(): params.plant_environment_outside = 1 @@ -2729,6 +2709,8 @@ def update_params(self): params.plant_water_availability = self.Plant_Water_Availability_spinBox.value() + params.plant_seed_coating = self.Plant_Seed_Coating_lineEdit.text() + params.plant_nitrogen[params.plant_nutrient_application_index] = self.Plant_Nitrogen_spinBox.value() params.plant_phosphorus[params.plant_nutrient_application_index] = self.Plant_Phosphorus_spinBox.value() params.plant_potassium[params.plant_nutrient_application_index] = self.Plant_Potassium_spinBox.value() @@ -3139,11 +3121,14 @@ def Autocentertool(self): proc.Autocentertool() if params.single_plot == 1: - if self.fig_canvas != None: self.fig_canvas.hide() - if self.IMag_canvas != None: self.IMag_canvas.hide() - if self.IPha_canvas != None: self.IPha_canvas.hide() - if self.FMB0_canvas != None: self.FMB0_canvas.hide() - if self.FMB1_canvas != None: self.FMB1_canvas.hide() + for attr_name in dir(self): + if 'canvas' in attr_name.lower(): + canvas = getattr(self, attr_name) + if canvas != None: + plt.close(canvas.figure) + canvas.setParent(None) + canvas.deleteLater() + setattr(self, attr_name, None) self.fig = Figure() self.fig.set_facecolor('None') @@ -3204,11 +3189,14 @@ def Flipangletool(self): proc.Flipangletool() if params.single_plot == 1: - if self.fig_canvas != None: self.fig_canvas.hide() - if self.IMag_canvas != None: self.IMag_canvas.hide() - if self.IPha_canvas != None: self.IPha_canvas.hide() - if self.FMB0_canvas != None: self.FMB0_canvas.hide() - if self.FMB1_canvas != None: self.FMB1_canvas.hide() + for attr_name in dir(self): + if 'canvas' in attr_name.lower(): + canvas = getattr(self, attr_name) + if canvas != None: + plt.close(canvas.figure) + canvas.setParent(None) + canvas.deleteLater() + setattr(self, attr_name, None) self.fig = Figure() self.fig.set_facecolor('None') @@ -3269,11 +3257,14 @@ def FAchecktool(self): proc.FAchecktool() if params.single_plot == 1: - if self.fig_canvas != None: self.fig_canvas.hide() - if self.IMag_canvas != None: self.IMag_canvas.hide() - if self.IPha_canvas != None: self.IPha_canvas.hide() - if self.FMB0_canvas != None: self.FMB0_canvas.hide() - if self.FMB1_canvas != None: self.FMB1_canvas.hide() + for attr_name in dir(self): + if 'canvas' in attr_name.lower(): + canvas = getattr(self, attr_name) + if canvas != None: + plt.close(canvas.figure) + canvas.setParent(None) + canvas.deleteLater() + setattr(self, attr_name, None) self.fig = Figure() self.fig.set_facecolor('None') @@ -3326,11 +3317,14 @@ def Shimtool(self): params.frequency = self.frequency_temp if params.single_plot == 1: - if self.fig_canvas != None: self.fig_canvas.hide() - if self.IMag_canvas != None: self.IMag_canvas.hide() - if self.IPha_canvas != None: self.IPha_canvas.hide() - if self.FMB0_canvas != None: self.FMB0_canvas.hide() - if self.FMB1_canvas != None: self.FMB1_canvas.hide() + for attr_name in dir(self): + if 'canvas' in attr_name.lower(): + canvas = getattr(self, attr_name) + if canvas != None: + plt.close(canvas.figure) + canvas.setParent(None) + canvas.deleteLater() + setattr(self, attr_name, None) self.fig = Figure() self.fig.set_facecolor('None') @@ -3656,11 +3650,14 @@ def Auto_Shimtool(self): np.savetxt('data/Tool_data/Auto_Shim_data.txt', np.transpose(params.AutoSTvalues)) if params.single_plot == 1: - if self.fig_canvas != None: self.fig_canvas.hide() - if self.IMag_canvas != None: self.IMag_canvas.hide() - if self.IPha_canvas != None: self.IPha_canvas.hide() - if self.FMB0_canvas != None: self.FMB0_canvas.hide() - if self.FMB1_canvas != None: self.FMB1_canvas.hide() + for attr_name in dir(self): + if 'canvas' in attr_name.lower(): + canvas = getattr(self, attr_name) + if canvas != None: + plt.close(canvas.figure) + canvas.setParent(None) + canvas.deleteLater() + setattr(self, attr_name, None) self.fig = Figure() self.fig.set_facecolor('None') @@ -3741,11 +3738,14 @@ def Field_Map_B0(self): proc.FieldMapB0() if params.single_plot == 1: - if self.fig_canvas != None: self.fig_canvas.hide() - if self.IMag_canvas != None: self.IMag_canvas.hide() - if self.IPha_canvas != None: self.IPha_canvas.hide() - if self.FMB0_canvas != None: self.FMB0_canvas.hide() - if self.FMB1_canvas != None: self.FMB1_canvas.hide() + for attr_name in dir(self): + if 'canvas' in attr_name.lower(): + canvas = getattr(self, attr_name) + if canvas != None: + plt.close(canvas.figure) + canvas.setParent(None) + canvas.deleteLater() + setattr(self, attr_name, None) self.IPha_fig = Figure() self.IPha_canvas = FigureCanvas(self.IPha_fig) @@ -3789,11 +3789,14 @@ def Field_Map_B0_Slice(self): proc.FieldMapB0Slice() if params.single_plot == 1: - if self.fig_canvas != None: self.fig_canvas.hide() - if self.IMag_canvas != None: self.IMag_canvas.hide() - if self.IPha_canvas != None: self.IPha_canvas.hide() - if self.FMB0_canvas != None: self.FMB0_canvas.hide() - if self.FMB1_canvas != None: self.FMB1_canvas.hide() + for attr_name in dir(self): + if 'canvas' in attr_name.lower(): + canvas = getattr(self, attr_name) + if canvas != None: + plt.close(canvas.figure) + canvas.setParent(None) + canvas.deleteLater() + setattr(self, attr_name, None) self.IPha_fig = Figure() self.IPha_canvas = FigureCanvas(self.IPha_fig) @@ -3837,11 +3840,14 @@ def Field_Map_B1(self): proc.FieldMapB1() if params.single_plot == 1: - if self.fig_canvas != None: self.fig_canvas.hide() - if self.IMag_canvas != None: self.IMag_canvas.hide() - if self.IPha_canvas != None: self.IPha_canvas.hide() - if self.FMB0_canvas != None: self.FMB0_canvas.hide() - if self.FMB1_canvas != None: self.FMB1_canvas.hide() + for attr_name in dir(self): + if 'canvas' in attr_name.lower(): + canvas = getattr(self, attr_name) + if canvas != None: + plt.close(canvas.figure) + canvas.setParent(None) + canvas.deleteLater() + setattr(self, attr_name, None) self.IMag_fig = Figure() self.IMag_canvas = FigureCanvas(self.IMag_fig) @@ -3886,11 +3892,14 @@ def Field_Map_B1_Slice(self): proc.FieldMapB1Slice() if params.single_plot == 1: - if self.fig_canvas != None: self.fig_canvas.hide() - if self.IMag_canvas != None: self.IMag_canvas.hide() - if self.IPha_canvas != None: self.IPha_canvas.hide() - if self.FMB0_canvas != None: self.FMB0_canvas.hide() - if self.FMB1_canvas != None: self.FMB1_canvas.hide() + for attr_name in dir(self): + if 'canvas' in attr_name.lower(): + canvas = getattr(self, attr_name) + if canvas != None: + plt.close(canvas.figure) + canvas.setParent(None) + canvas.deleteLater() + setattr(self, attr_name, None) self.IMag_fig = Figure() self.IMag_canvas = FigureCanvas(self.IMag_fig) @@ -3944,11 +3953,14 @@ def Field_Map_Gradient(self): else: params.FOV = 18 if params.single_plot == 1: - if self.fig_canvas != None: self.fig_canvas.hide() - if self.IMag_canvas != None: self.IMag_canvas.hide() - if self.IPha_canvas != None: self.IPha_canvas.hide() - if self.FMB0_canvas != None: self.FMB0_canvas.hide() - if self.FMB1_canvas != None: self.FMB1_canvas.hide() + for attr_name in dir(self): + if 'canvas' in attr_name.lower(): + canvas = getattr(self, attr_name) + if canvas != None: + plt.close(canvas.figure) + canvas.setParent(None) + canvas.deleteLater() + setattr(self, attr_name, None) self.IMag_fig = Figure() self.IMag_canvas = FigureCanvas(self.IMag_fig) @@ -4016,12 +4028,15 @@ def Field_Map_Gradient_Slice(self): else: params.FOV = 18 if params.single_plot == 1: - if self.fig_canvas != None: self.fig_canvas.hide() - if self.IMag_canvas != None: self.IMag_canvas.hide() - if self.IPha_canvas != None: self.IPha_canvas.hide() - if self.FMB0_canvas != None: self.FMB0_canvas.hide() - if self.FMB1_canvas != None: self.FMB1_canvas.hide() - + for attr_name in dir(self): + if 'canvas' in attr_name.lower(): + canvas = getattr(self, attr_name) + if canvas != None: + plt.close(canvas.figure) + canvas.setParent(None) + canvas.deleteLater() + setattr(self, attr_name, None) + self.IMag_fig = Figure() self.IMag_canvas = FigureCanvas(self.IMag_fig) self.IMag_fig.set_facecolor('None') @@ -4095,11 +4110,14 @@ def PB_Marker_Calibration(self): self.spectrumfft = params.spectrumfft[self.spectrumfft_center - int(params.nPE / 2 * params.ROBWscaler):self.spectrumfft_center + int(params.nPE / 2 * params.ROBWscaler)] if params.single_plot == 1: - if self.fig_canvas != None: self.fig_canvas.hide() - if self.IMag_canvas != None: self.IMag_canvas.hide() - if self.IPha_canvas != None: self.IPha_canvas.hide() - if self.FMB0_canvas != None: self.FMB0_canvas.hide() - if self.FMB1_canvas != None: self.FMB1_canvas.hide() + for attr_name in dir(self): + if 'canvas' in attr_name.lower(): + canvas = getattr(self, attr_name) + if canvas != None: + plt.close(canvas.figure) + canvas.setParent(None) + canvas.deleteLater() + setattr(self, attr_name, None) self.fig = Figure() self.fig.set_facecolor('None') @@ -4741,6 +4759,8 @@ def protocol_acquire(self): proc.image_stitching_2D_SE_slice(motor=self.motor) if params.sequence == 10: proc.image_stitching_3D_slab(motor=self.motor) + if params.sequence == 11: + proc.image_stitching_3D_TSE_slab(motor=self.motor) self.motor_reader.blockSignals(False) else: print('Motor Control: Motor not available, maybe it is still homing?') @@ -4767,6 +4787,8 @@ def protocol_acquire(self): proc.image_stitching_2D_SE_slice() if params.sequence == 10: proc.image_stitching_3D_slab() + if params.sequence == 11: + proc.image_stitching_3D_TSE_slab() elif params.GUImode == 1: if params.autorecenter == 1: @@ -5025,7 +5047,7 @@ def __init__(self, parent=None): self.Save_Mag_Image_Data_pushButton.setEnabled(True) self.Save_Pha_Image_Data_pushButton.setEnabled(True) self.Hist_pushButton.setEnabled(True) - elif params.sequence == 10: + elif params.sequence == 10 or params.sequence == 11: params.imageminimum = np.min(params.img_st_mag) self.Image_Minimum_doubleSpinBox.setValue(params.imageminimum) params.imagemaximum = np.max(params.img_st_mag) @@ -5254,51 +5276,31 @@ def update_params(self): params.radialosfactor = jsonparams['Radial oversampling factor'] params.autofreqoffset = jsonparams['Auto frequency offset'] params.sliceoffset = jsonparams['Slice offset [mm]'] + + for attr_name in dir(self): + if 'canvas' in attr_name.lower(): + canvas = getattr(self, attr_name) + if canvas != None: + plt.close(canvas.figure) + canvas.setParent(None) + canvas.deleteLater() + setattr(self, attr_name, None) if params.GUImode == 0: params.frequencyplotrange = self.Frequncyaxisrange_spinBox.value() - if params.sequence == 18 or params.sequence == 19 or params.sequence == 20 or params.sequence == 21: - if self.fig_canvas != None: self.fig_canvas.hide() - self.rf_loopback_test_spectrum_plot_init() - else: - if self.fig_canvas != None: self.fig_canvas.hide() - self.spectrum_plot_init() + if params.sequence == 18 or params.sequence == 19 or params.sequence == 20 or params.sequence == 21: self.rf_loopback_test_spectrum_plot_init() + else: self.spectrum_plot_init() self.Save_Spectrum_Data_pushButton.setEnabled(True) elif params.GUImode == 1: - if params.sequence == 34 or params.sequence == 35 or params.sequence == 36: - if self.IMag_canvas != None: self.IMag_canvas.hide() - if self.IPha_canvas != None: self.IPha_canvas.hide() - if self.kMag_canvas != None: self.kMag_canvas.hide() - if self.kPha_canvas != None: self.kPha_canvas.hide() - if self.all_canvas != None: self.all_canvas.hide() - if self.hist_canvas != None: self.hist_canvas.hide() - self.imaging_3D_plot_init() - elif params.sequence == 14 or params.sequence == 31: - print('WIP') - else: - if self.IMag_canvas != None: self.IMag_canvas.hide() - if self.IPha_canvas != None: self.IPha_canvas.hide() - if self.kMag_canvas != None: self.kMag_canvas.hide() - if self.kPha_canvas != None: self.kPha_canvas.hide() - if self.all_canvas != None: self.all_canvas.hide() - if self.hist_canvas != None: self.hist_canvas.hide() - self.imaging_plot_init() + if params.sequence == 34 or params.sequence == 35 or params.sequence == 36: self.imaging_3D_plot_init() + elif params.sequence == 14 or params.sequence == 31: print('WIP') + else: self.imaging_plot_init() elif params.GUImode == 4: - self.fig_canvas.hide() self.projection_plot_init() elif params.GUImode == 5: params.image_stitching_slice = self.Frequncyaxisrange_spinBox.value() - if params.sequence == 10: - if self.IMag_canvas != None: self.IMag_canvas.hide() - if self.IPha_canvas != None: self.IPha_canvas.hide() - if self.all_canvas != None: self.all_canvas.hide() - if self.hist_canvas != None: self.hist_canvas.hide() - self.imaging_stitching_3D_plot_init() + if params.sequence == 10 or params.sequence == 11: self.imaging_stitching_3D_plot_init() else: - if self.IMag_canvas != None: self.IMag_canvas.hide() - if self.IPha_canvas != None: self.IPha_canvas.hide() - if self.all_canvas != None: self.all_canvas.hide() - if self.hist_canvas != None: self.hist_canvas.hide() if params.imageorientation == 'ZX' or params.imageorientation == 'XZ': if params.image_stitching_slice == 0: self.imaging_stitching_plot_init() else: self.imaging_stitching_single_plot_init() @@ -6111,14 +6113,14 @@ def imaging_stitching_plot_init(self): if params.imageorientation == 'XY': self.IMag_ax.set_xlabel('X in mm') - self.IMag_ax.set_ylabel('Y in mm') + self.IMag_ax.set_ylabel('Y$_{PB}$ in mm') self.IPha_ax.set_xlabel('X in mm') - self.IPha_ax.set_ylabel('Y in mm') + self.IPha_ax.set_ylabel('Y$_{PB}$ in mm') elif params.imageorientation == 'ZY': self.IMag_ax.set_xlabel('Z in mm') - self.IMag_ax.set_ylabel('Y in mm') + self.IMag_ax.set_ylabel('Y$_{PB}$ in mm') self.IPha_ax.set_xlabel('Z in mm') - self.IPha_ax.set_ylabel('Y in mm') + self.IPha_ax.set_ylabel('Y$_{PB}$ in mm') else: self.IMag_ax.axis('off') @@ -6164,14 +6166,14 @@ def imaging_stitching_plot_init(self): self.IPha_ax.grid(which='major', visible=True) if params.imageorientation == 'YX': - self.IMag_ax.set_xlabel('Y in mm') + self.IMag_ax.set_xlabel('Y$_{PB}$ in mm') self.IMag_ax.set_ylabel('X in mm') - self.IPha_ax.set_xlabel('Y in mm') + self.IPha_ax.set_xlabel('Y$_{PB}$ in mm') self.IPha_ax.set_ylabel('X in mm') elif params.imageorientation == 'YZ': - self.IMag_ax.set_xlabel('Y in mm') + self.IMag_ax.set_xlabel('Y$_{PB}$ in mm') self.IMag_ax.set_ylabel('Z in mm') - self.IPha_ax.set_xlabel('Y in mm') + self.IPha_ax.set_xlabel('Y$_{PB}$ in mm') self.IPha_ax.set_ylabel('Z in mm') else: @@ -6208,49 +6210,114 @@ def imaging_stitching_plot_init(self): self.IMag_ax.grid(False) if params.projection3D_quality == 1: +# #Contour Filled Plot +# self.img_st_mag_cut_1 = np.array(np.zeros((params.nPE, params.nPE))) +# self.img_st_mag_cut_1_norm = np.array(np.zeros((params.nPE, params.nPE))) +# self.img_st_mag_cut_2 = np.array(np.zeros((params.nPE, params.nPE))) +# +# X, Z = np.meshgrid(np.linspace(-params.FOV/2, params.FOV/2, params.nPE),np.linspace(-params.FOV/2, params.FOV/2, params.nPE)) +# +# levels= np.linspace(params.imageminimum-1e-6, params.imagemaximum, 50) +# colors_1 = plt.get_cmap(params.imagecolormap)(np.linspace(0, 1, len(levels)-1)) +# if params.imageminimum > params.img_st_mag.min(): +# colors_1[levels[:-1] <= params.imageminimum, 3] = 0 +# +# for n in range(params.motor_image_count): +# self.img_st_mag_cut_1 = params.img_st_mag[:, n*params.nPE:(n+1)*params.nPE].copy() +# self.img_st_mag_cut_1[self.img_st_mag_cut_1 > params.imagemaximum] = params.imagemaximum +# self.img_st_mag_cut_1[self.img_st_mag_cut_1 < params.imageminimum] = params.imageminimum-1e-6 +# self.img_st_mag_cut_2 = params.img_st_mag[:, n*params.nPE:(n+1)*params.nPE].copy() +# self.img_st_mag_cut_2[self.img_st_mag_cut_2 > params.imagemaximum] = params.imagemaximum-1e-6 +# +# self.img_st_mag_cut_1_norm = (self.img_st_mag_cut_1 - params.imageminimum-1e-6) / (params.imagemaximum - params.imageminimum-1e-6) +# +# if params.imagefilter == 1: self.IMag_ax.contourf(self.img_st_mag_cut_2, Z, X, zdir='x', offset=self.image_positions[n], levels=levels, colors=colors_1, antialiased=True, extend='neither') +# else: self.IMag_ax.contourf(self.img_st_mag_cut_2, Z, X, zdir='x', offset=self.image_positions[n], levels=levels, colors=colors_1, antialiased=False, extend='neither') +# +# self.IMag_ax.set_box_aspect([(params.motor_total_image_length)/params.FOV, 1, 1]) +# self.IMag_ax.set_xlim([params.motor_start_position, params.motor_end_position]) +# +# del self.img_st_mag_cut_1, self.img_st_mag_cut_1_norm, self.img_st_mag_cut_2, X, Z, levels, colors_1 + + #Surface Plot self.img_st_mag_cut_1 = np.array(np.zeros((params.nPE, params.nPE))) + self.img_st_mag_cut_1_norm = np.array(np.zeros((params.nPE, params.nPE))) self.img_st_mag_cut_2 = np.array(np.zeros((params.nPE, params.nPE))) - X, Z = np.meshgrid(np.linspace(-params.FOV/2, params.FOV/2, params.nPE),np.linspace(-params.FOV/2, params.FOV/2, params.nPE)) + X, Z = np.meshgrid(np.linspace(-params.FOV/2, params.FOV/2, params.nPE+1),np.linspace(params.FOV/2, -params.FOV/2, params.nPE+1)) for n in range(params.motor_image_count): - self.img_st_mag_cut_1[:, :] = params.img_st_mag[:, n*params.nPE:(n+1)*params.nPE] - self.img_st_mag_cut_1[self.img_st_mag_cut_1 < params.imageminimum] = np.nan - self.img_st_mag_cut_2[:, :] = params.img_st_mag[:, n*params.nPE:(n+1)*params.nPE] + self.img_st_mag_cut_1[:, :] = params.img_st_mag[:, n*params.nPE:(n+1)*params.nPE].copy() + self.img_st_mag_cut_1[self.img_st_mag_cut_1 > params.imagemaximum] = params.imagemaximum + self.img_st_mag_cut_1[self.img_st_mag_cut_1 < params.imageminimum] = params.imageminimum + self.img_st_mag_cut_2[:, :] = params.img_st_mag[:, n*params.nPE:(n+1)*params.nPE].copy() self.img_st_mag_cut_2[self.img_st_mag_cut_2 > params.imagemaximum] = params.imagemaximum - self.img_st_mag_cut_2[self.img_st_mag_cut_2 < params.imageminimum] = params.imageminimum Y = np.full_like(X, self.image_positions[n]) - Y[np.isnan(self.img_st_mag_cut_1)] = np.nan - Y = np.rot90(Y, 3) - - colors_1 = plt.get_cmap(params.imagecolormap)((np.rot90(self.img_st_mag_cut_2, 3) - params.imageminimum)/(params.imagemaximum - params.imageminimum)) - self.IMag_ax.plot_surface(Y, Z, X, rstride=1, cstride=1, facecolors=colors_1, antialiased=False, linewidth=0) + self.img_st_mag_cut_1_norm = (self.img_st_mag_cut_1 - params.imageminimum) / (params.imagemaximum - params.imageminimum) + colors_2 = plt.get_cmap(params.imagecolormap)(np.clip(self.img_st_mag_cut_1_norm, 0, 1)) + colors_2[self.img_st_mag_cut_2 < params.imageminimum, 3] = 0 + + if params.imagefilter == 1: self.IMag_ax.plot_surface(Y, Z, X, rstride=1, cstride=1, facecolors=colors_2, antialiased=True, shade=False, edgecolor='none') + else: self.IMag_ax.plot_surface(Y, Z, X, rstride=1, cstride=1, facecolors=colors_2, antialiased=False, shade=False, edgecolor='none') + + self.IMag_ax.set_box_aspect([(params.motor_total_image_length)/params.FOV, 1, 1]) + self.IMag_ax.set_xlim([params.motor_start_position, params.motor_end_position]) + + del self.img_st_mag_cut_1, self.img_st_mag_cut_1_norm, self.img_st_mag_cut_2, X, Y, Z, colors_2 + +# #Voxel Plot +# self.img_st_mag_cut_1 = np.array(np.zeros((params.motor_image_count, params.nPE, params.nPE))) +# self.img_st_mag_cut_1_norm = np.array(np.zeros((params.motor_image_count, params.nPE, params.nPE))) +# self.img_st_mag_cut_2 = np.array(np.zeros((params.motor_image_count, params.nPE, params.nPE))) +# +# for n in range(params.motor_image_count): +# self.img_st_mag_cut_1[n, :, :] = params.img_st_mag[:, n*params.nPE:(n+1)*params.nPE].copy() +# self.img_st_mag_cut_2[n, :, :] = params.img_st_mag[:, n*params.nPE:(n+1)*params.nPE].copy() +# +# +# self.img_st_mag_cut_1[self.img_st_mag_cut_1 > params.imagemaximum] = params.imagemaximum +# self.img_st_mag_cut_1[self.img_st_mag_cut_1 < params.imageminimum] = params.imageminimum +# self.img_st_mag_cut_1[self.img_st_mag_cut_2 > params.imagemaximum] = params.imagemaximum +# +# x_edges = np.linspace(-params.FOV/2, params.FOV/2, self.img_st_mag_cut_2.shape[1]+1) +# y_edges = np.linspace(params.motor_start_position - params.slicethickness/2, params.motor_end_position + params.slicethickness/2, self.img_st_mag_cut_2.shape[0]+1) +# z_edges = np.linspace(-params.FOV/2, params.FOV/2, self.img_st_mag_cut_2.shape[2]+1) +# +# Y, Z, X = np.meshgrid(y_edges, z_edges, x_edges, indexing='ij') +# +# self.img_st_mag_cut_1_norm = (self.img_st_mag_cut_1 - params.imageminimum) / (params.imagemaximum - params.imageminimum) +# +# colors_3 = plt.get_cmap(params.imagecolormap)(np.clip(self.img_st_mag_cut_1_norm, 0, 1)) +# colors_3[..., 3] = 0.2 +# colors_3[self.img_st_mag_cut_2 < params.imageminimum, 3] = 0 +# +# self.IMag_ax.voxels(Y, Z, X, self.img_st_mag_cut_1_norm, facecolors=colors_3, shade=False, edgecolor='none') +# +# self.IMag_ax.set_box_aspect([(params.motor_total_image_length + params.slicethickness)/params.FOV, 1, 1]) +# self.IMag_ax.set_xlim([params.motor_start_position - params.slicethickness/2, params.motor_end_position + params.slicethickness/2]) +# +# del self.img_st_mag_cut_1, self.img_st_mag_cut_1_norm, self.img_st_mag_cut_2, X, Y, Z, colors_3 + else: + #Contour Plot self.img_st_mag_cut = np.array(np.zeros((params.nPE, params.nPE))) - X, Z = np.meshgrid(np.linspace(-params.FOV/2, params.FOV/2, params.nPE),np.linspace(-params.FOV/2, params.FOV/2, params.nPE)) - Y = np.array(np.zeros((params.nPE, params.nPE))) + X, Z = np.meshgrid(np.linspace(-params.FOV/2, params.FOV/2, params.nPE),np.linspace(params.FOV/2, -params.FOV/2, params.nPE)) + + levels = np.linspace(params.imageminimum, params.imagemaximum, 10) for n in range(params.motor_image_count): - self.img_st_mag_cut[:, :] = params.img_st_mag[:, n*params.nPE:(n+1)*params.nPE] - self.img_st_mag_cut[self.img_st_mag_cut > params.imagemaximum] = params.imagemaximum - self.img_st_mag_cut[self.img_st_mag_cut < params.imageminimum] = params.imageminimum - - Y[:, :] = self.img_st_mag_cut[:, :] - Y = (Y - params.imageminimum) / (params.imagemaximum - params.imageminimum) + self.img_st_mag_cut[:, :] = params.img_st_mag[:, n*params.nPE:(n+1)*params.nPE].copy() - colors_1 = np.linspace(0,1,num=11) - colors_1[colors_1 < np.min(Y)] = np.nan - colors_1[colors_1 > np.max(Y)] = np.nan - colors_2 = plt.get_cmap(params.imagecolormap)(colors_1) - - self.IMag_ax.contour(Y, Z, X, zdir='x', offset=self.image_positions[n], colors=colors_2) + self.IMag_ax.contour(self.img_st_mag_cut, Z, X, zdir='x', offset=self.image_positions[n], levels=levels, cmap=params.imagecolormap, extend='neither') + + self.IMag_ax.set_box_aspect([(params.motor_total_image_length)/params.FOV, 1, 1]) + self.IMag_ax.set_xlim([params.motor_start_position, params.motor_end_position]) - self.IMag_ax.set_box_aspect([(params.motor_total_image_length)/params.FOV, 1, 1]) - self.IMag_ax.set_xlim([params.motor_start_position, params.motor_end_position]) + del self.img_st_mag_cut, X, Z, levels if params.image_grid == 1: if params.motor_total_image_length <= 20: @@ -6271,16 +6338,28 @@ def imaging_stitching_plot_init(self): self.IMag_ax.grid(True) if params.imageorientation == 'ZX': - self.IMag_ax.set(xlabel='Y',ylabel='Z', zlabel='X') + self.IMag_ax.set(xlabel='\n\nY$_{PB}$',ylabel='Z', zlabel='X') elif params.imageorientation == 'XZ': - self.IMag_ax.set(xlabel='Y',ylabel='X', zlabel='Z') + self.IMag_ax.set(xlabel='\n\nY$_{PB}$',ylabel='X', zlabel='Z') else: self.IMag_ax.axis('off') + + #self.IMag_fig.patch.set_facecolor('black') + #self.IMag_fig.set_facecolor('black') + #self.IMag_ax.set_facecolor('black') + #self.IMag_ax.xaxis.set_pane_color((0, 0, 0, 1)) + #self.IMag_ax.yaxis.set_pane_color((0, 0, 0, 1)) + #self.IMag_ax.zaxis.set_pane_color((0, 0, 0, 1)) + #self.IMag_ax.tick_params(axis='both', colors='white') + #self.IMag_ax.xaxis.label.set_color('white') + #self.IMag_ax.yaxis.label.set_color('white') + #self.IMag_ax.zaxis.label.set_color('white') + #self.IMag_ax.grid(True, color='white') + self.IMag_canvas.draw() self.IMag_canvas.setWindowTitle('Plot - ' + params.datapath + '.txt') self.IMag_canvas.setGeometry(420, 40, 1160, 950) - self.IMag_canvas.show() else: @@ -6466,14 +6545,14 @@ def imaging_stitching_plot_init(self): if params.imageorientation == 'XY': self.IMag_ax.set_xlabel('X in mm') - self.IMag_ax.set_ylabel('Y in mm') + self.IMag_ax.set_ylabel('Y$_{PB}$ in mm') self.IMag_ax.set_xlabel('X in mm') - self.IMag_ax.set_ylabel('Y in mm') + self.IMag_ax.set_ylabel('Y$_{PB}$ in mm') elif params.imageorientation == 'ZY': self.IMag_ax.set_xlabel('Z in mm') - self.IMag_ax.set_ylabel('Y in mm') + self.IMag_ax.set_ylabel('Y$_{PB}$ in mm') self.IMag_ax.set_xlabel('Z in mm') - self.IMag_ax.set_ylabel('Y in mm') + self.IMag_ax.set_ylabel('Y$_{PB}$ in mm') else: self.IMag_ax.axis('off') @@ -6530,14 +6609,14 @@ def imaging_stitching_plot_init(self): self.IPha_ax.grid(which='major', visible=True) if params.imageorientation == 'YZ': - self.IMag_ax.set_xlabel('Y in mm') + self.IMag_ax.set_xlabel('Y$_{PB}$ in mm') self.IMag_ax.set_ylabel('Z in mm') - self.IPha_ax.set_xlabel('Y in mm') + self.IPha_ax.set_xlabel('Y$_{PB}$ in mm') self.IPha_ax.set_ylabel('Z in mm') elif params.imageorientation == 'YX': - self.IMag_ax.set_xlabel('Y in mm') + self.IMag_ax.set_xlabel('Y$_{PB}$ in mm') self.IMag_ax.set_ylabel('X in mm') - self.IPha_ax.set_xlabel('Y in mm') + self.IPha_ax.set_xlabel('Y$_{PB}$ in mm') self.IPha_ax.set_ylabel('X in mm') else: @@ -6569,49 +6648,52 @@ def imaging_stitching_plot_init(self): self.IMag_ax.grid(False) if params.projection3D_quality == 1: + #Surface Plot self.img_st_mag_cut_1 = np.array(np.zeros((params.nPE, params.nPE))) + self.img_st_mag_cut_1_norm = np.array(np.zeros((params.nPE, params.nPE))) self.img_st_mag_cut_2 = np.array(np.zeros((params.nPE, params.nPE))) - X, Z = np.meshgrid(np.linspace(-params.FOV/2, params.FOV/2, params.nPE),np.linspace(-params.FOV/2, params.FOV/2, params.nPE)) + X, Z = np.meshgrid(np.linspace(-params.FOV/2, params.FOV/2, params.nPE+1),np.linspace(params.FOV/2, -params.FOV/2, params.nPE+1)) for n in range(params.motor_image_count): - self.img_st_mag_cut_1[:, :] = params.img_st_mag[:, n*params.nPE:(n+1)*params.nPE] - self.img_st_mag_cut_1[self.img_st_mag_cut_1 < params.imageminimum] = np.nan - self.img_st_mag_cut_2[:, :] = params.img_st_mag[:, n*params.nPE:(n+1)*params.nPE] + self.img_st_mag_cut_1[:, :] = params.img_st_mag[:, n*params.nPE:(n+1)*params.nPE].copy() + self.img_st_mag_cut_1[self.img_st_mag_cut_1 > params.imagemaximum] = params.imagemaximum + self.img_st_mag_cut_1[self.img_st_mag_cut_1 < params.imageminimum] = params.imageminimum + self.img_st_mag_cut_2[:, :] = params.img_st_mag[:, n*params.nPE:(n+1)*params.nPE].copy() self.img_st_mag_cut_2[self.img_st_mag_cut_2 > params.imagemaximum] = params.imagemaximum - self.img_st_mag_cut_2[self.img_st_mag_cut_2 < params.imageminimum] = params.imageminimum Y = np.full_like(X, self.image_positions[n]) - Y[np.isnan(self.img_st_mag_cut_1)] = np.nan - Y = np.rot90(Y, 3) - - colors_1 = plt.get_cmap(params.imagecolormap)((np.rot90(self.img_st_mag_cut_2, 3) - params.imageminimum)/(params.imagemaximum - params.imageminimum)) - self.IMag_ax.plot_surface(Y, Z, X, rstride=1, cstride=1, facecolors=colors_1, antialiased=False, linewidth=0) + self.img_st_mag_cut_1_norm = (self.img_st_mag_cut_1 - params.imageminimum) / (params.imagemaximum - params.imageminimum) + + colors_2 = plt.get_cmap(params.imagecolormap)(np.clip(self.img_st_mag_cut_1_norm, 0, 1)) + colors_2[self.img_st_mag_cut_2 < params.imageminimum, 3] = 0 + + if params.imagefilter == 1: self.IMag_ax.plot_surface(Y, Z, X, rstride=1, cstride=1, facecolors=colors_2, antialiased=True, shade=False, edgecolor='none') + else: self.IMag_ax.plot_surface(Y, Z, X, rstride=1, cstride=1, facecolors=colors_2, antialiased=False, shade=False, edgecolor='none') + self.IMag_ax.set_box_aspect([(params.motor_total_image_length)/params.FOV, 1, 1]) + self.IMag_ax.set_xlim([params.motor_start_position, params.motor_end_position]) + + del self.img_st_mag_cut_1, self.img_st_mag_cut_1_norm, self.img_st_mag_cut_2, X, Y, Z, colors_2 + else: + #Contour Plot self.img_st_mag_cut = np.array(np.zeros((params.nPE, params.nPE))) - X, Z = np.meshgrid(np.linspace(-params.FOV/2, params.FOV/2, params.nPE),np.linspace(-params.FOV/2, params.FOV/2, params.nPE)) - Y = np.array(np.zeros((params.nPE, params.nPE))) + X, Z = np.meshgrid(np.linspace(-params.FOV/2, params.FOV/2, params.nPE),np.linspace(params.FOV/2, -params.FOV/2, params.nPE)) + + levels = np.linspace(params.imageminimum, params.imagemaximum, 10) for n in range(params.motor_image_count): - self.img_st_mag_cut[:, :] = params.img_st_mag[:, n*params.nPE:(n+1)*params.nPE] - self.img_st_mag_cut[self.img_st_mag_cut > params.imagemaximum] = params.imagemaximum - self.img_st_mag_cut[self.img_st_mag_cut < params.imageminimum] = params.imageminimum - - Y[:, :] = self.img_st_mag_cut[:, :] - Y = (Y - params.imageminimum) / (params.imagemaximum - params.imageminimum) + self.img_st_mag_cut[:, :] = params.img_st_mag[:, n*params.nPE:(n+1)*params.nPE].copy() - colors_1 = np.linspace(0,1,num=11) - colors_1[colors_1 < np.min(Y)] = np.nan - colors_1[colors_1 > np.max(Y)] = np.nan - colors_2 = plt.get_cmap(params.imagecolormap)(colors_1) - - self.IMag_ax.contour(Y, Z, X, zdir='x', offset=self.image_positions[n], colors=colors_2) + self.IMag_ax.contour(self.img_st_mag_cut, Z, X, zdir='x', offset=self.image_positions[n], levels=levels, cmap=params.imagecolormap, extend='neither') + + self.IMag_ax.set_box_aspect([(params.motor_total_image_length)/params.FOV, 1, 1]) + self.IMag_ax.set_xlim([params.motor_start_position, params.motor_end_position]) - self.IMag_ax.set_box_aspect([(params.motor_total_image_length)/params.FOV, 1, 1]) - self.IMag_ax.set_xlim([params.motor_start_position, params.motor_end_position]) + del self.img_st_mag_cut, X, Z, levels if params.image_grid == 1: if params.motor_total_image_length <= 20: @@ -6632,9 +6714,9 @@ def imaging_stitching_plot_init(self): self.IMag_ax.grid(True) if params.imageorientation == 'ZX': - self.IMag_ax.set(xlabel='Y',ylabel='Z', zlabel='X') + self.IMag_ax.set(xlabel='Y$_{PB}$',ylabel='Z', zlabel='X') elif params.imageorientation == 'XZ': - self.IMag_ax.set(xlabel='Y',ylabel='X', zlabel='Z') + self.IMag_ax.set(xlabel='Y$_{PB}$',ylabel='X', zlabel='Z') else: self.IMag_ax.axis('off') @@ -6963,165 +7045,275 @@ def imaging_3D_plot_init(self): self.IMag_ax = self.IMag_fig.add_subplot(111, projection='3d') self.IMag_ax.grid(False) - self.IPha_ax = self.IPha_fig.add_subplot(111, projection='3d') - self.IPha_ax.grid(False) + #self.IPha_ax = self.IPha_fig.add_subplot(111, projection='3d') + #self.IPha_ax.grid(False) self.kMag_ax = self.kMag_fig.add_subplot(111, projection='3d') self.kMag_ax.grid(False) - self.kPha_ax = self.kPha_fig.add_subplot(111, projection='3d') - self.kPha_ax.grid(False) + #self.kPha_ax = self.kPha_fig.add_subplot(111, projection='3d') + #self.kPha_ax.grid(False) if params.projection3D_quality == 1: + #Surface Plot self.img_mag_cut_1 = np.array(np.zeros((params.nPE, params.nPE))) + self.img_mag_cut_1_norm = np.array(np.zeros((params.nPE, params.nPE))) self.img_mag_cut_2 = np.array(np.zeros((params.nPE, params.nPE))) - self.img_pha_cut = np.array(np.zeros((params.nPE, params.nPE))) - self.img_kmag_cut = np.array(np.zeros((params.k_amp.shape[1], params.k_amp.shape[2]))) - self.img_kpha_cut = np.array(np.zeros((params.k_amp.shape[1], params.k_amp.shape[2]))) - - X1, Z1 = np.meshgrid(np.linspace(-params.FOV/2, params.FOV/2, params.nPE),np.linspace(-params.FOV/2, params.FOV/2, params.nPE)) - X2, Z2 = np.meshgrid(np.linspace(0, params.k_amp.shape[1], params.k_amp.shape[1]),np.linspace(0, params.k_amp.shape[2], params.k_amp.shape[2])) + #self.img_pha_cut = np.array(np.zeros((params.nPE, params.nPE))) + #self.img_pha_cut_norm = np.array(np.zeros((params.nPE, params.nPE))) + self.img_kmag_cut = np.array(np.zeros((params.nPE, params.nPE))) + self.img_kmag_cut_norm = np.array(np.zeros((params.nPE, params.nPE))) + #self.img_kpha_cut = np.array(np.zeros((params.nPE, params.nPE))) + #self.img_kpha_cut_norm = np.array(np.zeros((params.nPE, params.nPE))) + + if params.imageorientation == 'XY' or params.imageorientation == 'YX': + X1, Y1 = np.meshgrid(np.linspace(-params.FOV/2, params.FOV/2, params.nPE),np.linspace(params.FOV/2, -params.FOV/2, params.nPE)) + X2, Y2 = np.meshgrid(np.linspace(-(params.k_amp.shape[2]/250)/2, (params.k_amp.shape[2]/250)/2, params.nPE),np.linspace(params.nPE/2, -params.nPE/2, params.nPE)) + elif params.imageorientation == 'YZ' or params.imageorientation == 'ZY': + Y1, Z1 = np.meshgrid(np.linspace(-params.FOV/2, params.FOV/2, params.nPE),np.linspace(params.FOV/2, -params.FOV/2, params.nPE)) + Y2, Z2 = np.meshgrid(np.linspace(-(params.k_amp.shape[2]/250)/2, (params.k_amp.shape[2]/250)/2, params.nPE),np.linspace(params.nPE/2, -params.nPE/2, params.nPE)) + elif params.imageorientation == 'ZX' or params.imageorientation == 'XZ': + Z1, X1 = np.meshgrid(np.linspace(-params.FOV/2, params.FOV/2, params.nPE),np.linspace(params.FOV/2, -params.FOV/2, params.nPE)) + Z2, X2 = np.meshgrid(np.linspace(-(params.k_amp.shape[2]/250)/2, (params.k_amp.shape[2]/250)/2, params.nPE),np.linspace(params.nPE/2, -params.nPE/2, params.nPE)) - print(X2.shape) - print(Z2.shape) + cols_per_bin = params.k_amp.shape[2] // params.nPE + cols_total = params.nPE * (params.k_amp.shape[2] // params.nPE) + start_idx = (params.k_amp.shape[2] - cols_total) // 2 + end_idx = start_idx + cols_total for n in range(params.img_mag.shape[0]): - self.img_mag_cut_1[:, :] = params.img_mag[n, :, :] - self.img_mag_cut_1[self.img_mag_cut_1 < params.imageminimum] = np.nan - self.img_mag_cut_2[:, :] = params.img_mag[n, :, :] + self.img_mag_cut_1[:, :] = params.img_mag[n, :, :].copy() + self.img_mag_cut_1[self.img_mag_cut_1 > params.imagemaximum] = params.imagemaximum + self.img_mag_cut_1[self.img_mag_cut_1 < params.imageminimum] = params.imageminimum + self.img_mag_cut_2[:, :] = params.img_mag[n, :, :].copy() self.img_mag_cut_2[self.img_mag_cut_2 > params.imagemaximum] = params.imagemaximum - self.img_mag_cut_2[self.img_mag_cut_2 < params.imageminimum] = params.imageminimum - self.img_pha_cut[:, :] = params.img_pha[n, :, :] - self.img_pha_cut[self.img_mag_cut_1 < params.imageminimum] = np.nan - self.img_kmag_cut[:, :] = params.k_amp[n, :, :] - self.img_kpha_cut[:, :] = params.k_pha[n, :, :] - - Y1 = np.full_like(X1, self.image_positions[n]) - Y1[np.isnan(self.img_mag_cut_1)] = np.nan - Y1 = np.rot90(Y1, 3) + #self.img_pha_cut[:, :] = params.img_pha[n, :, :].copy() + self.img_kmag_cut[:, :] = params.k_amp[n, :, start_idx:end_idx].copy().reshape(params.nPE, params.nPE, cols_per_bin).mean(axis=2) + #self.img_kpha_cut[:, :] = params.k_pha[n, :, start_idx:end_idx].copy().reshape(params.nPE, params.nPE, cols_per_bin).mean(axis=2) - Y2 = np.full_like(X2, n+1) - #Y2 = np.rot90(Y2, 3) + if params.imageorientation == 'XY' or params.imageorientation == 'YX': + Z1 = np.full_like(X1, self.image_positions[n]) + Z2 = np.full_like(X2, n+1) + elif params.imageorientation == 'YZ' or params.imageorientation == 'ZY': + X1 = np.full_like(Y1, self.image_positions[n]) + X2 = np.full_like(Y2, n+1) + elif params.imageorientation == 'ZX' or params.imageorientation == 'XZ': + Y1 = np.full_like(Z1, self.image_positions[n]) + Y2 = np.full_like(Z2, n+1) - print(Y2.shape) - - colors_1 = plt.get_cmap(params.imagecolormap)((np.rot90(self.img_mag_cut_2, 3) - params.imageminimum)/(params.imagemaximum - params.imageminimum)) - colors_2 = plt.get_cmap('gray')((np.rot90(self.img_pha_cut, 3) - np.min(params.img_pha))/(np.max(params.img_pha) - np.min(params.img_pha))) - colors_3 = plt.get_cmap('inferno')((np.rot90(self.img_kmag_cut, 3) - np.min(params.k_amp))/(np.max(params.k_amp) - np.min(params.k_amp))) - colors_4 = plt.get_cmap('inferno')((np.rot90(self.img_kpha_cut, 3) - np.min(params.k_pha))/(np.max(params.k_pha) - np.min(params.k_pha))) - - print(colors_3.shape) - - self.IMag_ax.plot_surface(Y1, Z1, X1, rstride=1, cstride=1, facecolors=colors_1, antialiased=False, linewidth=0) - self.IPha_ax.plot_surface(Y1, Z1, X1, rstride=1, cstride=1, facecolors=colors_2, antialiased=False, linewidth=0) - self.kMag_ax.plot_surface(Y2, Z2, X2, rcount=params.nPE, ccount=params.nPE, facecolors=colors_3, antialiased=False, linewidth=0) - self.kPha_ax.plot_surface(Y2, Z2, X2, rcount=params.nPE, ccount=params.nPE, facecolors=colors_4, antialiased=False, linewidth=0) + self.img_mag_cut_1_norm = (self.img_mag_cut_1 - params.imageminimum) / (params.imagemaximum - params.imageminimum) + #self.img_pha_cut_norm = (self.img_pha_cut - self.img_pha_cut.min()) / (self.img_pha_cut.max() - self.img_pha_cut.min()) + self.img_kmag_cut_norm = (self.img_kmag_cut - self.img_kmag_cut) / (self.img_kmag_cut.max() - self.img_kmag_cut.min()) + #self.img_kpha_cut_norm = (self.img_kpha_cut - self.img_kpha_cut.min()) / (self.img_kpha_cut.max() - self.img_kpha_cut.min()) + + colors_1 = plt.get_cmap(params.imagecolormap)(np.clip(self.img_mag_cut_1_norm, 0, 1)) + colors_1[self.img_mag_cut_2 < params.imageminimum, 3] = 0 + #colors_2 = plt.get_cmap('gray')(np.clip(self.img_pha_cut_norm, 0, 1)) + #colors_2[self.img_mag_cut_2 < params.imageminimum, 3] = 0 + colors_3 = plt.get_cmap('inferno')(np.clip((self.img_kmag_cut - params.k_amp.min()) / (params.k_amp.max() - params.k_amp.min()), 0, 1)) + colors_3[self.img_kmag_cut < 0.1*params.k_amp.max(), 3] = 0 + #colors_4 = plt.get_cmap('inferno')(np.clip((self.img_kpha_cut - params.k_pha.min()) / (params.k_pha.max() - params.k_pha.min()), 0, 1)) + if params.imageorientation == 'XY' or params.imageorientation == 'YX': + if params.imagefilter == 1: self.IMag_ax.plot_surface(X1, Y1, Z1, rstride=1, cstride=1, facecolors=colors_1, antialiased=True, shade=False, edgecolor='none') + else: self.IMag_ax.plot_surface(X1, Y1, Z1, rstride=1, cstride=1, facecolors=colors_1, antialiased=False, shade=False, edgecolor='none') + #if params.imagefilter == 1: self.IPha_ax.plot_surface(X1, Y1, Z1, rstride=1, cstride=1, facecolors=colors_2, antialiased=True, shade=False, edgecolor='none') + #else: self.IPha_ax.plot_surface(X1, Y1, Z1, rstride=1, cstride=1, facecolors=colors_2, antialiased=True, shade=False, edgecolor='none') + self.kMag_ax.plot_surface(X2, Y2, Z2, rcount=params.nPE+1, ccount=params.nPE+1, facecolors=colors_3, antialiased=True, shade=False, edgecolor='none') + #self.kPha_ax.plot_surface(X2, Y2, Z2, rcount=params.nPE+1, ccount=params.nPE+1, facecolors=colors_4, antialiased=True, shade=False, edgecolor='none') + elif params.imageorientation == 'YZ' or params.imageorientation == 'ZY': + if params.imagefilter == 1: self.IMag_ax.plot_surface(X1, Y1, Z1, rstride=1, cstride=1, facecolors=colors_1, antialiased=True, shade=False, edgecolor='none') + else: self.IMag_ax.plot_surface(X1, Y1, Z1, rstride=1, cstride=1, facecolors=colors_1, antialiased=False, shade=False, edgecolor='none') + #if params.imagefilter == 1: self.IPha_ax.plot_surface(X1, Y1, Z1, rstride=1, cstride=1, facecolors=colors_2, antialiased=True, shade=False, edgecolor='none') + #else: self.IPha_ax.plot_surface(X1, Y1, Z1, rstride=1, cstride=1, facecolors=colors_2, antialiased=True, shade=False, edgecolor='none') + self.kMag_ax.plot_surface(X2, Y2, Z2, rcount=params.nPE+1, ccount=params.nPE+1, facecolors=colors_3, antialiased=True, shade=False, edgecolor='none') + #self.kPha_ax.plot_surface(X2, Y2, Z2, rcount=params.nPE+1, ccount=params.nPE+1, facecolors=colors_4, antialiased=True, shade=False, edgecolor='none') + elif params.imageorientation == 'ZX' or params.imageorientation == 'XZ': + if params.imagefilter == 1: self.IMag_ax.plot_surface(X1, Y1, Z1, rstride=1, cstride=1, facecolors=colors_1, antialiased=True, shade=False, edgecolor='none') + else: self.IMag_ax.plot_surface(X1, Y1, Z1, rstride=1, cstride=1, facecolors=colors_1, antialiased=False, shade=False, edgecolor='none') + #if params.imagefilter == 1: self.IPha_ax.plot_surface(X1, Y1, Z1, rstride=1, cstride=1, facecolors=colors_2, antialiased=True, shade=False, edgecolor='none') + #else: self.IPha_ax.plot_surface(X1, Y1, Z1, rstride=1, cstride=1, facecolors=colors_2, antialiased=True, shade=False, edgecolor='none') + self.kMag_ax.plot_surface(X2, Y2, Z2, rcount=params.nPE+1, ccount=params.nPE+1, facecolors=colors_3, antialiased=True, shade=False, edgecolor='none') + #self.kPha_ax.plot_surface(X2, Y2, Z2, rcount=params.nPE+1, ccount=params.nPE+1, facecolors=colors_4, antialiased=True, shade=False, edgecolor='none') + else: + #Contour Plot self.img_mag_cut = np.array(np.zeros((params.nPE, params.nPE))) - self.img_pha_cut = np.array(np.zeros((params.nPE, params.nPE))) + #self.img_pha_cut = np.array(np.zeros((params.nPE, params.nPE))) + self.img_kmag_cut = np.array(np.zeros((params.nPE, params.nPE))) + #self.img_kpha_cut = np.array(np.zeros((params.nPE, params.nPE))) + + if params.imageorientation == 'XY' or params.imageorientation == 'YX': + X1, Y1 = np.meshgrid(np.linspace(-params.FOV/2, params.FOV/2, params.nPE),np.linspace(params.FOV/2, -params.FOV/2, params.nPE)) + X2, Y2 = np.meshgrid(np.linspace(-(params.k_amp.shape[2]/250)/2, (params.k_amp.shape[2]/250)/2, params.nPE),np.linspace(params.nPE/2, -params.nPE/2, params.nPE)) + elif params.imageorientation == 'YZ' or params.imageorientation == 'ZY': + Y1, Z1 = np.meshgrid(np.linspace(-params.FOV/2, params.FOV/2, params.nPE),np.linspace(params.FOV/2, -params.FOV/2, params.nPE)) + Y2, Z2 = np.meshgrid(np.linspace(-(params.k_amp.shape[2]/250)/2, (params.k_amp.shape[2]/250)/2, params.nPE),np.linspace(params.nPE/2, -params.nPE/2, params.nPE)) + elif params.imageorientation == 'ZX' or params.imageorientation == 'XZ': + Z1, X1 = np.meshgrid(np.linspace(-params.FOV/2, params.FOV/2, params.nPE),np.linspace(params.FOV/2, -params.FOV/2, params.nPE)) + Z2, X2 = np.meshgrid(np.linspace(-(params.k_amp.shape[2]/250)/2, (params.k_amp.shape[2]/250)/2, params.nPE),np.linspace(params.nPE/2, -params.nPE/2, params.nPE)) - X, Z = np.meshgrid(np.linspace(-params.FOV/2, params.FOV/2, params.nPE),np.linspace(-params.FOV/2, params.FOV/2, params.nPE)) - Y1 = np.array(np.zeros((params.nPE, params.nPE))) - Y2 = np.array(np.zeros((params.nPE, params.nPE))) + levels1 = np.linspace(params.imageminimum, params.imagemaximum, 20) + #levels2 = np.linspace(params.img_pha.min(), params.pha_mag.max(), 20) + levels3 = np.linspace(params.k_amp.min(), params.k_amp.max(), 20) + #levels4 = np.linspace(params.k_pha.min(), params.k_pha.max(), 20) + + cols_per_bin = params.k_amp.shape[2] // params.nPE + cols_total = params.nPE * (params.k_amp.shape[2] // params.nPE) + start_idx = (params.k_amp.shape[2] - cols_total) // 2 + end_idx = start_idx + cols_total for n in range(params.img_mag.shape[0]): - self.img_mag_cut[:, :] = params.img_mag[n, :, :] - self.img_mag_cut[self.img_mag_cut > params.imagemaximum] = params.imagemaximum - self.img_mag_cut[self.img_mag_cut < params.imageminimum] = params.imageminimum - self.img_pha_cut[:, :] = params.img_pha[n, :, :] - - Y1[:, :] = self.img_mag_cut[:, :] - Y1 = (Y1 - params.imageminimum) / (params.imagemaximum - params.imageminimum) - Y2[:, :] = self.img_pha_cut[:, :] - Y2 = (Y2 - np.min(params.img_pha)) / (np.max(params.img_pha) - np.min(params.img_pha)) + self.img_mag_cut[:, :] = params.img_mag[n, :, :].copy() + #self.img_pha_cut[:, :] = params.img_pha[n, :, :].copy() + self.img_kmag_cut[:, :] = params.k_amp[n, :, start_idx:end_idx].copy().reshape(params.nPE, params.nPE, cols_per_bin).mean(axis=2) + #self.img_kpha_cut[:, :] = params.k_pha[n, :, start_idx:end_idx].copy().reshape(params.nPE, params.nPE, cols_per_bin).mean(axis=2) - colors_1 = np.linspace(0,1,num=11) - colors_1[colors_1 < np.min(Y1)] = np.nan - colors_1[colors_1 > np.max(Y1)] = np.nan - colors_2 = plt.get_cmap(params.imagecolormap)(colors_1) - colors_3 = np.linspace(0,1,num=11) - colors_4 = plt.get_cmap('gray')(colors_3) - - self.IMag_ax.contour(Y1, Z, X, zdir='x', offset=self.image_positions[n], colors=colors_2) - self.IPha_ax.contour(Y2, Z, X, zdir='x', offset=self.image_positions[n], colors=colors_4) - - self.IMag_ax.set_box_aspect([params.slicethickness/params.FOV, 1, 1]) - self.IMag_ax.set_xlim([(-params.slicethickness/2), (params.slicethickness/2)]) - self.IPha_ax.set_box_aspect([params.slicethickness/params.FOV, 1, 1]) - self.IPha_ax.set_xlim([(-params.slicethickness/2), (params.slicethickness/2)]) - self.kMag_ax.set_box_aspect([params.slicethickness/params.FOV, 1, 1]) - self.kMag_ax.set_xlim([1, (params.img_mag.shape[0]+1)]) - self.kPha_ax.set_box_aspect([params.slicethickness/params.FOV, 1, 1]) - self.kPha_ax.set_xlim([1, (params.img_mag.shape[0]+1)]) + if params.imageorientation == 'XY' or params.imageorientation == 'YX': + self.IMag_ax.contour(X1, Y1, self.img_mag_cut, zdir='z', offset=self.image_positions[n], levels=levels1, cmap=params.imagecolormap, extend='neither') + #self.IPha_ax.contour(X1, Y1, self.img_pha_cut, zdir='z', offset=self.image_positions[n], levels=levels2, cmap='gray', extend='neither') + self.kMag_ax.contour(X2, Y2, self.img_kmag_cut, zdir='z', offset=n+1, levels=levels3, cmap='inferno', extend='neither') + #self.kPha_ax.contour(X2, Y2, self.img_kpha_cut, zdir='z', offset=n+1, levels=levels4, cmap='inferno', extend='neither') + elif params.imageorientation == 'YZ' or params.imageorientation == 'ZY': + self.IMag_ax.contour(self.img_mag_cut, Y1, Z1, zdir='x', offset=self.image_positions[n], levels=levels1, cmap=params.imagecolormap, extend='neither') + #self.IPha_ax.contour(self.img_pha_cut, Y1, Z1, zdir='x', offset=self.image_positions[n], levels=levels2, cmap='gray', extend='neither') + self.kMag_ax.contour(self.img_kmag_cut, Y2, Z2, zdir='x', offset=n+1, levels=levels3, cmap='inferno', extend='neither') + #self.kPha_ax.contour(self.img_kpha_cut, Y2, Z2, zdir='x', offset=n+1, levels=levels4, cmap='inferno', extend='neither') + elif params.imageorientation == 'ZX' or params.imageorientation == 'XZ': + self.IMag_ax.contour(X1, self.img_mag_cut, Z1, zdir='y', offset=self.image_positions[n], levels=levels1, cmap=params.imagecolormap, extend='neither') + #self.IPha_ax.contour(X1, self.img_pha_cut, Z1, zdir='y', offset=self.image_positions[n], levels=levels2, cmap='gray', extend='neither') + self.kMag_ax.contour(X2, self.img_kmag_cut, Z2, zdir='y', offset=n+1, levels=levels3, cmap='inferno', extend='neither') + #self.kPha_ax.contour(X2, self.img_kpha_cut, Z2, zdir='y', offset=n+1, levels=levels4, cmap='inferno', extend='neither') + + if params.imageorientation == 'XY' or params.imageorientation == 'YX': + self.IMag_ax.set_box_aspect([1, 1, params.slicethickness/params.FOV]) + self.IMag_ax.set_zlim([(-params.slicethickness/2), (params.slicethickness/2)]) + #self.IPha_ax.set_box_aspect([1, 1, params.slicethickness/params.FOV]) + #self.IPha_ax.set_zlim([(-params.slicethickness/2), (params.slicethickness/2)]) + self.kMag_ax.set_box_aspect([1, 1, params.img_mag.shape[0]/params.FOV]) + self.kMag_ax.set_zlim([1, (params.img_mag.shape[0])]) + #self.kPha_ax.set_box_aspect([1, 1, params.img_mag.shape[0]/params.FOV]) + #self.kPha_ax.set_zlim([1, (params.img_mag.shape[0])]) + elif params.imageorientation == 'YZ' or params.imageorientation == 'ZY': + self.IMag_ax.set_box_aspect([params.slicethickness/params.FOV, 1, 1]) + self.IMag_ax.set_xlim([(-params.slicethickness/2), (params.slicethickness/2)]) + #self.IPha_ax.set_box_aspect([params.img_mag.shape[0]/params.FOV, 1, 1]) + #self.IPha_ax.set_xlim([(-params.slicethickness/2), (params.slicethickness/2)]) + self.kMag_ax.set_box_aspect([params.img_mag.shape[0]/params.FOV, 1, 1]) + self.kMag_ax.set_xlim([1, (params.img_mag.shape[0])]) + #self.kPha_ax.set_box_aspect([params.img_mag.shape[0]/params.FOV, 1, 1]) + #self.kPha_ax.set_xlim([1, (params.img_mag.shape[0])]) + elif params.imageorientation == 'ZX' or params.imageorientation == 'XZ': + self.IMag_ax.set_box_aspect([1, params.slicethickness/params.FOV, 1]) + self.IMag_ax.set_ylim([(-params.slicethickness/2), (params.slicethickness/2)]) + #self.IPha_ax.set_box_aspect([1, params.slicethickness/params.FOV, 1]) + #self.IPha_ax.set_ylim([(-params.slicethickness/2), (params.slicethickness/2)]) + self.kMag_ax.set_box_aspect([1, params.img_mag.shape[0]/params.FOV, 1]) + self.kMag_ax.set_ylim([1, (params.img_mag.shape[0])]) + #self.kPha_ax.set_box_aspect([1, params.img_mag.shape[0]/params.FOV, 1]) + #self.kPha_ax.set_ylim([1, (params.img_mag.shape[0])]) if params.image_grid == 1: - self.x_major_ticks = self.image_positions - if params.FOV <= 10: self.y_major_ticks = np.arange(math.ceil(-params.FOV / 2), math.floor(params.FOV / 2) + 1, 1) - elif params.FOV > 10 and params.FOV <= 20: self.y_major_ticks = np.arange(math.ceil(-params.FOV / 2), math.floor(params.FOV / 2) + 2, 2) - else: self.y_major_ticks = np.arange(math.ceil(-params.FOV / 2), math.floor(params.FOV / 2) + 4, 4) + self.major_ticks_1 = self.image_positions + + if params.FOV <= 10: self.major_ticks_2 = np.arange(math.ceil(-params.FOV / 2), math.floor(params.FOV / 2) + 1, 1) + elif params.FOV > 10 and params.FOV <= 20: self.major_ticks_2 = np.arange(math.ceil(-params.FOV / 2), math.floor(params.FOV / 2) + 2, 2) + else: self.major_ticks_2 = np.arange(math.ceil(-params.FOV / 2), math.floor(params.FOV / 2) + 4, 4) + + if params.k_amp.shape[2]/250 <= 10: self.major_ticks_3 = np.arange(-(params.k_amp.shape[2]/250)/2, (params.k_amp.shape[2]/250)/2 + 1, 1) + elif params.k_amp.shape[2]/250 > 10 and params.k_amp.shape[2]/250 <= 20: self.major_ticks_3 = np.arange(-(params.k_amp.shape[2]/250)/2, (params.k_amp.shape[2]/250)/2 + 2, 2) + else: self.major_ticks_3 = np.arange(-(params.k_amp.shape[2]/250)/2, (params.k_amp.shape[2]/250)/2 + 4, 4) + + if params.nPE <= 10: self.major_ticks_4 = np.arange(-params.nPE/2, params.nPE/2 + 1, 1) + elif params.nPE > 10 and params.nPE <= 20: self.major_ticks_4 = np.arange(-params.nPE/2, params.nPE/2 + 2, 2) + else: self.major_ticks_4 = np.arange(-params.nPE/2, params.nPE/2 + 4, 4) + self.major_ticks_5 = np.arange(1, params.img_mag.shape[0] + 1, 1) + self.IMag_ax.axis('on') - self.IMag_ax.set_xticks(self.x_major_ticks) - self.IMag_ax.set_yticks(self.y_major_ticks) + #self.IPha_ax.axis('on') + self.IMag_ax.set(xlabel='X',ylabel='Y', zlabel='Z') + #self.IPha_ax.set(xlabel='X',ylabel='Y', zlabel='Z') + + if params.imageorientation == 'XY' or params.imageorientation == 'YX': + self.IMag_ax.set_xticks(self.major_ticks_2) + self.IMag_ax.set_yticks(self.major_ticks_2) + self.IMag_ax.set_zticks(self.major_ticks_1) + #self.IPha_ax.set_xticks(self.major_ticks_2) + #self.IPha_ax.set_yticks(self.major_ticks_2) + #self.IPha_ax.set_zticks(self.major_ticks_1) + self.kMag_ax.set(xlabel='Sample', ylabel='Phase Encoding Step', zlabel='3D Phase Encoding Step') + #self.kPha_ax.set(xlabel='Sample', ylabel='Phase Encoding Step', zlabel='3D Phase Encoding Step') + self.kMag_ax.set_xticks(self.major_ticks_3) + self.kMag_ax.set_yticks(self.major_ticks_4) + self.kMag_ax.set_zticks(self.major_ticks_5) + #self.kPha_ax.set_xticks(self.major_ticks_3) + #self.kPha_ax.set_yticks(self.major_ticks_4) + #self.kPha_ax.set_zticks(self.major_ticks_5) + elif params.imageorientation == 'YZ' or params.imageorientation == 'ZY': + self.IMag_ax.set_yticks(self.major_ticks_2) + self.IMag_ax.set_zticks(self.major_ticks_2) + self.IMag_ax.set_xticks(self.major_ticks_1) + #self.IPha_ax.set_yticks(self.major_ticks_2) + #self.IPha_ax.set_zticks(self.major_ticks_2) + #self.IPha_ax.set_xticks(self.major_ticks_1) + self.kMag_ax.set(ylabel='Sample', zlabel='Phase Encoding Step', xlabel='3D Phase Encoding Step') + #self.kPha_ax.set(ylabel='Sample', zlabel='Phase Encoding Step', xlabel='3D Phase Encoding Step') + self.kMag_ax.set_xticks(self.major_ticks_5) + self.kMag_ax.set_yticks(self.major_ticks_3) + self.kMag_ax.set_zticks(self.major_ticks_4) + #self.kPha_ax.set_xticks(self.major_ticks_5) + #self.kPha_ax.set_yticks(self.major_ticks_3) + #self.kPha_ax.set_zticks(self.major_ticks_4) + elif params.imageorientation == 'ZX' or params.imageorientation == 'XZ': + self.IMag_ax.set_zticks(self.major_ticks_2) + self.IMag_ax.set_xticks(self.major_ticks_2) + self.IMag_ax.set_yticks(self.major_ticks_1) + #self.IPha_ax.set_zticks(self.major_ticks_2) + #self.IPha_ax.set_xticks(self.major_ticks_2) + #self.IPha_ax.set_yticks(self.major_ticks_1) + self.kMag_ax.set(zlabel='Sample', xlabel='Phase Encoding Step', ylabel='3D Phase Encoding Step') + #self.kPha_ax.set(zlabel='Sample', xlabel='Phase Encoding Step', ylabel='3D Phase Encoding Step') + self.kMag_ax.set_xticks(self.major_ticks_4) + self.kMag_ax.set_yticks(self.major_ticks_5) + self.kMag_ax.set_zticks(self.major_ticks_3) + #self.kPha_ax.set_xticks(self.major_ticks_4) + #self.kPha_ax.set_yticks(self.major_ticks_5) + #self.kPha_ax.set_zticks(self.major_ticks_3) + self.IMag_ax.grid(which='major', color='#CCCCCC', linestyle='-') self.IMag_ax.grid(which='major', visible=True) self.IMag_ax.grid(True) - self.IPha_ax.axis('on') - self.IPha_ax.set_xticks(self.x_major_ticks) - self.IPha_ax.set_yticks(self.y_major_ticks) - self.IPha_ax.grid(which='major', color='#CCCCCC', linestyle='-') - self.IPha_ax.grid(which='major', visible=True) - self.IPha_ax.grid(True) + #self.IPha_ax.grid(which='major', color='#CCCCCC', linestyle='-') + #self.IPha_ax.grid(which='major', visible=True) + #self.IPha_ax.grid(True) self.kMag_ax.grid(which='major', color='#CCCCCC', linestyle='-') self.kMag_ax.grid(which='major', visible=True) self.kMag_ax.grid(True) - self.kPha_ax.grid(which='major', color='#CCCCCC', linestyle='-') - self.kPha_ax.grid(which='major', visible=True) - self.kPha_ax.grid(True) - - if params.imageorientation == 'XY': - self.IMag_ax.set(xlabel='Z',ylabel='X', zlabel='Y') - self.IPha_ax.set(xlabel='Z',ylabel='X', zlabel='Y') - elif params.imageorientation == 'YX': - self.IMag_ax.set(xlabel='Z',ylabel='Y', zlabel='X') - self.IPha_ax.set(xlabel='Z',ylabel='Y', zlabel='X') - elif params.imageorientation == 'YZ': - self.IMag_ax.set(xlabel='X',ylabel='Y', zlabel='Z') - self.IPha_ax.set(xlabel='X',ylabel='Y', zlabel='Z') - elif params.imageorientation == 'ZY': - self.IMag_ax.set(xlabel='X',ylabel='Z', zlabel='Y') - self.IPha_ax.set(xlabel='X',ylabel='Z', zlabel='Y') - elif params.imageorientation == 'ZX': - self.IMag_ax.set(xlabel='Y',ylabel='Z', zlabel='X') - self.IPha_ax.set(xlabel='Y',ylabel='Z', zlabel='X') - elif params.imageorientation == 'XZ': - self.IMag_ax.set(xlabel='Y',ylabel='X', zlabel='Z') - self.IPha_ax.set(xlabel='Y',ylabel='X', zlabel='Z') - - self.kMag_ax.set(xlabel='3D Phase Encoding Step',ylabel='Sample', zlabel='Phase Encoding Step') - self.kPha_ax.set(xlabel='3D Phase Encoding Step',ylabel='Sample', zlabel='Phase Encoding Step') - + #self.kPha_ax.grid(which='major', color='#CCCCCC', linestyle='-') + #self.kPha_ax.grid(which='major', visible=True) + #self.kPha_ax.grid(True) + else: self.IMag_ax.axis('off') - self.IPha_ax.axis('off') + #self.IPha_ax.axis('off') self.kMag_ax.axis('off') - self.kPha_ax.axis('off') + #self.kPha_ax.axis('off') self.IMag_canvas.draw() self.IMag_canvas.setWindowTitle('Plot - ' + params.datapath + '.txt') self.IMag_canvas.setGeometry(420, 40, 575, 455) self.IMag_canvas.show() - self.IPha_canvas.draw() - self.IPha_canvas.setWindowTitle('Plot - ' + params.datapath + '.txt') - self.IPha_canvas.setGeometry(1005, 40, 575, 455) - self.IPha_canvas.show() + #self.IPha_canvas.draw() + #self.IPha_canvas.setWindowTitle('Plot - ' + params.datapath + '.txt') + #self.IPha_canvas.setGeometry(1005, 40, 575, 455) + #self.IPha_canvas.show() self.kMag_canvas.draw() self.kMag_canvas.setWindowTitle('Plot - ' + params.datapath + '.txt') self.kMag_canvas.setGeometry(420, 535, 575, 455) self.kMag_canvas.show() - self.kPha_canvas.draw() - self.kPha_canvas.setWindowTitle('Plot - ' + params.datapath + '.txt') - self.kPha_canvas.setGeometry(1005, 535, 575, 455) - self.kPha_canvas.show() + #self.kPha_canvas.draw() + #self.kPha_canvas.setWindowTitle('Plot - ' + params.datapath + '.txt') + #self.kPha_canvas.setGeometry(1005, 535, 575, 455) + #self.kPha_canvas.show() else: self.IMag_fig = Figure() @@ -7252,82 +7444,261 @@ def imaging_3D_plot_init(self): self.all_fig.set_facecolor('None') if params.projection3D == 1: - self.IMag_ax = self.all_fig.add_subplot(111, projection='3d') + self.IMag_ax = self.all_fig.add_subplot(211, projection='3d') self.IMag_ax.grid(False) + #self.IPha_ax = self.all_fig.add_subplot(222, projection='3d') + #self.IPha_ax.grid(False) + self.kMag_ax = self.all_fig.add_subplot(212, projection='3d') + self.kMag_ax.grid(False) + #self.kPha_ax = self.all_fig.add_subplot(224, projection='3d') + #self.kPha_ax.grid(False) if params.projection3D_quality == 1: + #Surface Plot self.img_mag_cut_1 = np.array(np.zeros((params.nPE, params.nPE))) + self.img_mag_cut_1_norm = np.array(np.zeros((params.nPE, params.nPE))) self.img_mag_cut_2 = np.array(np.zeros((params.nPE, params.nPE))) - - X, Z = np.meshgrid(np.linspace(-params.FOV/2, params.FOV/2, params.nPE),np.linspace(-params.FOV/2, params.FOV/2, params.nPE)) + #self.img_pha_cut = np.array(np.zeros((params.nPE, params.nPE))) + #self.img_pha_cut_norm = np.array(np.zeros((params.nPE, params.nPE))) + self.img_kmag_cut = np.array(np.zeros((params.nPE, params.nPE))) + self.img_kmag_cut_norm = np.array(np.zeros((params.nPE, params.nPE))) + #self.img_kpha_cut = np.array(np.zeros((params.nPE, params.nPE))) + #self.img_kpha_cut_norm = np.array(np.zeros((params.nPE, params.nPE))) + + if params.imageorientation == 'XY' or params.imageorientation == 'YX': + X1, Y1 = np.meshgrid(np.linspace(-params.FOV/2, params.FOV/2, params.nPE),np.linspace(params.FOV/2, -params.FOV/2, params.nPE)) + X2, Y2 = np.meshgrid(np.linspace(-(params.k_amp.shape[2]/250)/2, (params.k_amp.shape[2]/250)/2, params.nPE),np.linspace(params.nPE/2, -params.nPE/2, params.nPE)) + elif params.imageorientation == 'YZ' or params.imageorientation == 'ZY': + Y1, Z1 = np.meshgrid(np.linspace(-params.FOV/2, params.FOV/2, params.nPE),np.linspace(params.FOV/2, -params.FOV/2, params.nPE)) + Y2, Z2 = np.meshgrid(np.linspace(-(params.k_amp.shape[2]/250)/2, (params.k_amp.shape[2]/250)/2, params.nPE),np.linspace(params.nPE/2, -params.nPE/2, params.nPE)) + elif params.imageorientation == 'ZX' or params.imageorientation == 'XZ': + Z1, X1 = np.meshgrid(np.linspace(-params.FOV/2, params.FOV/2, params.nPE),np.linspace(params.FOV/2, -params.FOV/2, params.nPE)) + Z2, X2 = np.meshgrid(np.linspace(-(params.k_amp.shape[2]/250)/2, (params.k_amp.shape[2]/250)/2, params.nPE),np.linspace(params.nPE/2, -params.nPE/2, params.nPE)) + + cols_per_bin = params.k_amp.shape[2] // params.nPE + cols_total = params.nPE * (params.k_amp.shape[2] // params.nPE) + start_idx = (params.k_amp.shape[2] - cols_total) // 2 + end_idx = start_idx + cols_total for n in range(params.img_mag.shape[0]): - self.img_mag_cut_1[:, :] = params.img_mag[n, :, :] - self.img_mag_cut_1[self.img_mag_cut_1 < params.imageminimum] = np.nan - self.img_mag_cut_2[:, :] = params.img_mag[n, :, :] + self.img_mag_cut_1[:, :] = params.img_mag[n, :, :].copy() + self.img_mag_cut_1[self.img_mag_cut_1 > params.imagemaximum] = params.imagemaximum + self.img_mag_cut_1[self.img_mag_cut_1 < params.imageminimum] = params.imageminimum + self.img_mag_cut_2[:, :] = params.img_mag[n, :, :].copy() self.img_mag_cut_2[self.img_mag_cut_2 > params.imagemaximum] = params.imagemaximum - self.img_mag_cut_2[self.img_mag_cut_2 < params.imageminimum] = params.imageminimum + #self.img_pha_cut[:, :] = params.img_pha[n, :, :].copy() + self.img_kmag_cut[:, :] = params.k_amp[n, :, start_idx:end_idx].copy().reshape(params.nPE, params.nPE, cols_per_bin).mean(axis=2) + #self.img_kpha_cut[:, :] = params.k_pha[n, :, start_idx:end_idx].copy().reshape(params.nPE, params.nPE, cols_per_bin).mean(axis=2) - Y = np.full_like(X, self.image_positions[n]) - Y[np.isnan(self.img_mag_cut_1)] = np.nan - Y = np.rot90(Y, 3) - - colors_1 = plt.get_cmap(params.imagecolormap)((np.rot90(self.img_mag_cut_2, 3) - params.imageminimum)/(params.imagemaximum - params.imageminimum)) + if params.imageorientation == 'XY' or params.imageorientation == 'YX': + Z1 = np.full_like(X1, self.image_positions[n]) + Z2 = np.full_like(X2, n+1) + elif params.imageorientation == 'YZ' or params.imageorientation == 'ZY': + X1 = np.full_like(Y1, self.image_positions[n]) + X2 = np.full_like(Y2, n+1) + elif params.imageorientation == 'ZX' or params.imageorientation == 'XZ': + Y1 = np.full_like(Z1, self.image_positions[n]) + Y2 = np.full_like(Z2, n+1) - self.IMag_ax.plot_surface(Y, Z, X, rstride=1, cstride=1, facecolors=colors_1, antialiased=False, linewidth=0) + self.img_mag_cut_1_norm = (self.img_mag_cut_1 - params.imageminimum) / (params.imagemaximum - params.imageminimum) + #self.img_pha_cut_norm = (self.img_pha_cut - self.img_pha_cut.min()) / (self.img_pha_cut.max() - self.img_pha_cut.min()) + self.img_kmag_cut_norm = (self.img_kmag_cut - self.img_kmag_cut) / (self.img_kmag_cut.max() - self.img_kmag_cut.min()) + #self.img_kpha_cut_norm = (self.img_kpha_cut - self.img_kpha_cut.min()) / (self.img_kpha_cut.max() - self.img_kpha_cut.min()) + + colors_1 = plt.get_cmap(params.imagecolormap)(np.clip(self.img_mag_cut_1_norm, 0, 1)) + colors_1[self.img_mag_cut_2 < params.imageminimum, 3] = 0 + #colors_2 = plt.get_cmap('gray')(np.clip(self.img_pha_cut_norm, 0, 1)) + #colors_2[self.img_mag_cut_2 < params.imageminimum, 3] = 0 + colors_3 = plt.get_cmap('inferno')(np.clip((self.img_kmag_cut - params.k_amp.min()) / (params.k_amp.max() - params.k_amp.min()), 0, 1)) + colors_3[self.img_kmag_cut < 0.1*params.k_amp.max(), 3] = 0 + #colors_4 = plt.get_cmap('inferno')(np.clip((self.img_kpha_cut - params.k_pha.min()) / (params.k_pha.max() - params.k_pha.min()), 0, 1)) + if params.imageorientation == 'XY' or params.imageorientation == 'YX': + if params.imagefilter == 1: self.IMag_ax.plot_surface(X1, Y1, Z1, rstride=1, cstride=1, facecolors=colors_1, antialiased=True, shade=False, edgecolor='none') + else: self.IMag_ax.plot_surface(X1, Y1, Z1, rstride=1, cstride=1, facecolors=colors_1, antialiased=False, shade=False, edgecolor='none') + #if params.imagefilter == 1: self.IPha_ax.plot_surface(X1, Y1, Z1, rstride=1, cstride=1, facecolors=colors_2, antialiased=True, shade=False, edgecolor='none') + #else: self.IPha_ax.plot_surface(X1, Y1, Z1, rstride=1, cstride=1, facecolors=colors_2, antialiased=True, shade=False, edgecolor='none') + self.kMag_ax.plot_surface(X2, Y2, Z2, rcount=params.nPE+1, ccount=params.nPE+1, facecolors=colors_3, antialiased=True, shade=False, edgecolor='none') + #self.kPha_ax.plot_surface(X2, Y2, Z2, rcount=params.nPE+1, ccount=params.nPE+1, facecolors=colors_4, antialiased=True, shade=False, edgecolor='none') + elif params.imageorientation == 'YZ' or params.imageorientation == 'ZY': + if params.imagefilter == 1: self.IMag_ax.plot_surface(X1, Y1, Z1, rstride=1, cstride=1, facecolors=colors_1, antialiased=True, shade=False, edgecolor='none') + else: self.IMag_ax.plot_surface(X1, Y1, Z1, rstride=1, cstride=1, facecolors=colors_1, antialiased=False, shade=False, edgecolor='none') + #if params.imagefilter == 1: self.IPha_ax.plot_surface(X1, Y1, Z1, rstride=1, cstride=1, facecolors=colors_2, antialiased=True, shade=False, edgecolor='none') + #else: self.IPha_ax.plot_surface(X1, Y1, Z1, rstride=1, cstride=1, facecolors=colors_2, antialiased=True, shade=False, edgecolor='none') + self.kMag_ax.plot_surface(X2, Y2, Z2, rcount=params.nPE+1, ccount=params.nPE+1, facecolors=colors_3, antialiased=True, shade=False, edgecolor='none') + #self.kPha_ax.plot_surface(X2, Y2, Z2, rcount=params.nPE+1, ccount=params.nPE+1, facecolors=colors_4, antialiased=True, shade=False, edgecolor='none') + elif params.imageorientation == 'ZX' or params.imageorientation == 'XZ': + if params.imagefilter == 1: self.IMag_ax.plot_surface(X1, Y1, Z1, rstride=1, cstride=1, facecolors=colors_1, antialiased=True, shade=False, edgecolor='none') + else: self.IMag_ax.plot_surface(X1, Y1, Z1, rstride=1, cstride=1, facecolors=colors_1, antialiased=False, shade=False, edgecolor='none') + #if params.imagefilter == 1: self.IPha_ax.plot_surface(X1, Y1, Z1, rstride=1, cstride=1, facecolors=colors_2, antialiased=True, shade=False, edgecolor='none') + #else: self.IPha_ax.plot_surface(X1, Y1, Z1, rstride=1, cstride=1, facecolors=colors_2, antialiased=True, shade=False, edgecolor='none') + self.kMag_ax.plot_surface(X2, Y2, Z2, rcount=params.nPE+1, ccount=params.nPE+1, facecolors=colors_3, antialiased=True, shade=False, edgecolor='none') + #self.kPha_ax.plot_surface(X2, Y2, Z2, rcount=params.nPE+1, ccount=params.nPE+1, facecolors=colors_4, antialiased=True, shade=False, edgecolor='none') + else: + #Contour Plot self.img_mag_cut = np.array(np.zeros((params.nPE, params.nPE))) + #self.img_pha_cut = np.array(np.zeros((params.nPE, params.nPE))) + self.img_kmag_cut = np.array(np.zeros((params.nPE, params.nPE))) + #self.img_kpha_cut = np.array(np.zeros((params.nPE, params.nPE))) + + if params.imageorientation == 'XY' or params.imageorientation == 'YX': + X1, Y1 = np.meshgrid(np.linspace(-params.FOV/2, params.FOV/2, params.nPE),np.linspace(params.FOV/2, -params.FOV/2, params.nPE)) + X2, Y2 = np.meshgrid(np.linspace(-(params.k_amp.shape[2]/250)/2, (params.k_amp.shape[2]/250)/2, params.nPE),np.linspace(params.nPE/2, -params.nPE/2, params.nPE)) + elif params.imageorientation == 'YZ' or params.imageorientation == 'ZY': + Y1, Z1 = np.meshgrid(np.linspace(-params.FOV/2, params.FOV/2, params.nPE),np.linspace(params.FOV/2, -params.FOV/2, params.nPE)) + Y2, Z2 = np.meshgrid(np.linspace(-(params.k_amp.shape[2]/250)/2, (params.k_amp.shape[2]/250)/2, params.nPE),np.linspace(params.nPE/2, -params.nPE/2, params.nPE)) + elif params.imageorientation == 'ZX' or params.imageorientation == 'XZ': + Z1, X1 = np.meshgrid(np.linspace(-params.FOV/2, params.FOV/2, params.nPE),np.linspace(params.FOV/2, -params.FOV/2, params.nPE)) + Z2, X2 = np.meshgrid(np.linspace(-(params.k_amp.shape[2]/250)/2, (params.k_amp.shape[2]/250)/2, params.nPE),np.linspace(params.nPE/2, -params.nPE/2, params.nPE)) + + levels1 = np.linspace(params.imageminimum, params.imagemaximum, 20) + #levels2 = np.linspace(params.img_pha.min(), params.pha_mag.max(), 20) + levels3 = np.linspace(params.k_amp.min(), params.k_amp.max(), 20) + #levels4 = np.linspace(params.k_pha.min(), params.k_pha.max(), 20) - X, Z = np.meshgrid(np.linspace(-params.FOV/2, params.FOV/2, params.nPE),np.linspace(-params.FOV/2, params.FOV/2, params.nPE)) - Y = np.array(np.zeros((params.nPE, params.nPE))) + cols_per_bin = params.k_amp.shape[2] // params.nPE + cols_total = params.nPE * (params.k_amp.shape[2] // params.nPE) + start_idx = (params.k_amp.shape[2] - cols_total) // 2 + end_idx = start_idx + cols_total for n in range(params.img_mag.shape[0]): - self.img_mag_cut[:, :] = params.img_mag[n, :, :] - self.img_mag_cut[self.img_mag_cut > params.imagemaximum] = params.imagemaximum - self.img_mag_cut[self.img_mag_cut < params.imageminimum] = params.imageminimum + self.img_mag_cut[:, :] = params.img_mag[n, :, :].copy() + #self.img_pha_cut[:, :] = params.img_pha[n, :, :].copy() + self.img_kmag_cut[:, :] = params.k_amp[n, :, start_idx:end_idx].copy().reshape(params.nPE, params.nPE, cols_per_bin).mean(axis=2) + #self.img_kpha_cut[:, :] = params.k_pha[n, :, start_idx:end_idx].copy().reshape(params.nPE, params.nPE, cols_per_bin).mean(axis=2) - Y[:, :] = self.img_mag_cut[:, :] - Y = (Y - params.imageminimum) / (params.imagemaximum - params.imageminimum) - - colors_1 = np.linspace(0,1,num=11) - colors_1[colors_1 < np.min(Y)] = np.nan - colors_1[colors_1 > np.max(Y)] = np.nan - colors_2 = plt.get_cmap(params.imagecolormap)(colors_1) - - self.IMag_ax.contour(Y, Z, X, zdir='x', offset=self.image_positions[n], colors=colors_2) - - self.IMag_ax.set_box_aspect([params.slicethickness/params.FOV, 1, 1]) - self.IMag_ax.set_xlim([(-params.slicethickness/2), (params.slicethickness/2)]) + if params.imageorientation == 'XY' or params.imageorientation == 'YX': + self.IMag_ax.contour(X1, Y1, self.img_mag_cut, zdir='z', offset=self.image_positions[n], levels=levels1, cmap=params.imagecolormap, extend='neither') + #self.IPha_ax.contour(X1, Y1, self.img_pha_cut, zdir='z', offset=self.image_positions[n], levels=levels2, cmap='gray', extend='neither') + self.kMag_ax.contour(X2, Y2, self.img_kmag_cut, zdir='z', offset=n+1, levels=levels3, cmap='inferno', extend='neither') + #self.kPha_ax.contour(X2, Y2, self.img_kpha_cut, zdir='z', offset=n+1, levels=levels4, cmap='inferno', extend='neither') + elif params.imageorientation == 'YZ' or params.imageorientation == 'ZY': + self.IMag_ax.contour(self.img_mag_cut, Y1, Z1, zdir='x', offset=self.image_positions[n], levels=levels1, cmap=params.imagecolormap, extend='neither') + #self.IPha_ax.contour(self.img_pha_cut, Y1, Z1, zdir='x', offset=self.image_positions[n], levels=levels2, cmap='gray', extend='neither') + self.kMag_ax.contour(self.img_kmag_cut, Y2, Z2, zdir='x', offset=n+1, levels=levels3, cmap='inferno', extend='neither') + #self.kPha_ax.contour(self.img_kpha_cut, Y2, Z2, zdir='x', offset=n+1, levels=levels4, cmap='inferno', extend='neither') + elif params.imageorientation == 'ZX' or params.imageorientation == 'XZ': + self.IMag_ax.contour(X1, self.img_mag_cut, Z1, zdir='y', offset=self.image_positions[n], levels=levels1, cmap=params.imagecolormap, extend='neither') + #self.IPha_ax.contour(X1, self.img_pha_cut, Z1, zdir='y', offset=self.image_positions[n], levels=levels2, cmap='gray', extend='neither') + self.kMag_ax.contour(X2, self.img_kmag_cut, Z2, zdir='y', offset=n+1, levels=levels3, cmap='inferno', extend='neither') + #self.kPha_ax.contour(X2, self.img_kpha_cut, Z2, zdir='y', offset=n+1, levels=levels4, cmap='inferno', extend='neither') + + if params.imageorientation == 'XY' or params.imageorientation == 'YX': + self.IMag_ax.set_box_aspect([1, 1, params.slicethickness/params.FOV]) + self.IMag_ax.set_zlim([(-params.slicethickness/2), (params.slicethickness/2)]) + #self.IPha_ax.set_box_aspect([1, 1, params.slicethickness/params.FOV]) + #self.IPha_ax.set_zlim([(-params.slicethickness/2), (params.slicethickness/2)]) + self.kMag_ax.set_box_aspect([1, 1, params.img_mag.shape[0]/params.FOV]) + self.kMag_ax.set_zlim([1, (params.img_mag.shape[0])]) + #self.kPha_ax.set_box_aspect([1, 1, params.img_mag.shape[0]/params.FOV]) + #self.kPha_ax.set_zlim([1, (params.img_mag.shape[0])]) + elif params.imageorientation == 'YZ' or params.imageorientation == 'ZY': + self.IMag_ax.set_box_aspect([params.slicethickness/params.FOV, 1, 1]) + self.IMag_ax.set_xlim([(-params.slicethickness/2), (params.slicethickness/2)]) + #self.IPha_ax.set_box_aspect([params.img_mag.shape[0]/params.FOV, 1, 1]) + #self.IPha_ax.set_xlim([(-params.slicethickness/2), (params.slicethickness/2)]) + self.kMag_ax.set_box_aspect([params.img_mag.shape[0]/params.FOV, 1, 1]) + self.kMag_ax.set_xlim([1, (params.img_mag.shape[0])]) + #self.kPha_ax.set_box_aspect([params.img_mag.shape[0]/params.FOV, 1, 1]) + #self.kPha_ax.set_xlim([1, (params.img_mag.shape[0])]) + elif params.imageorientation == 'ZX' or params.imageorientation == 'XZ': + self.IMag_ax.set_box_aspect([1, params.slicethickness/params.FOV, 1]) + self.IMag_ax.set_ylim([(-params.slicethickness/2), (params.slicethickness/2)]) + #self.IPha_ax.set_box_aspect([1, params.slicethickness/params.FOV, 1]) + #self.IPha_ax.set_ylim([(-params.slicethickness/2), (params.slicethickness/2)]) + self.kMag_ax.set_box_aspect([1, params.img_mag.shape[0]/params.FOV, 1]) + self.kMag_ax.set_ylim([1, (params.img_mag.shape[0])]) + #self.kPha_ax.set_box_aspect([1, params.img_mag.shape[0]/params.FOV, 1]) + #self.kPha_ax.set_ylim([1, (params.img_mag.shape[0])]) if params.image_grid == 1: - self.x_major_ticks = self.image_positions - if params.FOV <= 10: self.y_major_ticks = np.arange(math.ceil(-params.FOV / 2), math.floor(params.FOV / 2) + 1, 1) - elif params.FOV > 10 and params.FOV <= 20: self.y_major_ticks = np.arange(math.ceil(-params.FOV / 2), math.floor(params.FOV / 2) + 2, 2) - else: self.y_major_ticks = np.arange(math.ceil(-params.FOV / 2), math.floor(params.FOV / 2) + 4, 4) + self.major_ticks_1 = self.image_positions + if params.FOV <= 10: self.major_ticks_2 = np.arange(math.ceil(-params.FOV / 2), math.floor(params.FOV / 2) + 1, 1) + elif params.FOV > 10 and params.FOV <= 20: self.major_ticks_2 = np.arange(math.ceil(-params.FOV / 2), math.floor(params.FOV / 2) + 2, 2) + else: self.major_ticks_2 = np.arange(math.ceil(-params.FOV / 2), math.floor(params.FOV / 2) + 4, 4) + + if params.k_amp.shape[2]/250 <= 10: self.major_ticks_3 = np.arange(-(params.k_amp.shape[2]/250)/2, (params.k_amp.shape[2]/250)/2 + 1, 1) + elif params.k_amp.shape[2]/250 > 10 and params.k_amp.shape[2]/250 <= 20: self.major_ticks_3 = np.arange(-(params.k_amp.shape[2]/250)/2, (params.k_amp.shape[2]/250)/2 + 2, 2) + else: self.major_ticks_3 = np.arange(-(params.k_amp.shape[2]/250)/2, (params.k_amp.shape[2]/250)/2 + 4, 4) + + if params.nPE <= 10: self.major_ticks_4 = np.arange(-params.nPE/2, params.nPE/2 + 1, 1) + elif params.nPE > 10 and params.nPE <= 20: self.major_ticks_4 = np.arange(-params.nPE/2, params.nPE/2 + 2, 2) + else: self.major_ticks_4 = np.arange(-params.nPE/2, params.nPE/2 + 4, 4) + + self.major_ticks_5 = np.arange(1, params.img_mag.shape[0] + 1, 1) + self.IMag_ax.axis('on') - self.IMag_ax.set_xticks(self.x_major_ticks) - self.IMag_ax.set_yticks(self.y_major_ticks) + #self.IPha_ax.axis('on') + self.IMag_ax.set(xlabel='X',ylabel='Y', zlabel='Z') + #self.IPha_ax.set(xlabel='X',ylabel='Y', zlabel='Z') + + if params.imageorientation == 'XY' or params.imageorientation == 'YX': + self.IMag_ax.set_xticks(self.major_ticks_2) + self.IMag_ax.set_yticks(self.major_ticks_2) + self.IMag_ax.set_zticks(self.major_ticks_1) + #self.IPha_ax.set_xticks(self.major_ticks_2) + #self.IPha_ax.set_yticks(self.major_ticks_2) + #self.IPha_ax.set_zticks(self.major_ticks_1) + self.kMag_ax.set(xlabel='Sample', ylabel='Phase Encoding Step', zlabel='3D Phase Encoding Step') + #self.kPha_ax.set(xlabel='Sample', ylabel='Phase Encoding Step', zlabel='3D Phase Encoding Step') + self.kMag_ax.set_xticks(self.major_ticks_3) + self.kMag_ax.set_yticks(self.major_ticks_4) + self.kMag_ax.set_zticks(self.major_ticks_5) + #self.kPha_ax.set_xticks(self.major_ticks_3) + #self.kPha_ax.set_yticks(self.major_ticks_4) + #self.kPha_ax.set_zticks(self.major_ticks_5) + elif params.imageorientation == 'YZ' or params.imageorientation == 'ZY': + self.IMag_ax.set_yticks(self.major_ticks_2) + self.IMag_ax.set_zticks(self.major_ticks_2) + self.IMag_ax.set_xticks(self.major_ticks_1) + #self.IPha_ax.set_yticks(self.major_ticks_2) + #self.IPha_ax.set_zticks(self.major_ticks_2) + #self.IPha_ax.set_xticks(self.major_ticks_1) + self.kMag_ax.set(ylabel='Sample', zlabel='Phase Encoding Step', xlabel='3D Phase Encoding Step') + #self.kPha_ax.set(ylabel='Sample', zlabel='Phase Encoding Step', xlabel='3D Phase Encoding Step') + self.kMag_ax.set_xticks(self.major_ticks_5) + self.kMag_ax.set_yticks(self.major_ticks_3) + self.kMag_ax.set_zticks(self.major_ticks_4) + #self.kPha_ax.set_xticks(self.major_ticks_5) + #self.kPha_ax.set_yticks(self.major_ticks_3) + #self.kPha_ax.set_zticks(self.major_ticks_4) + elif params.imageorientation == 'ZX' or params.imageorientation == 'XZ': + self.IMag_ax.set_zticks(self.major_ticks_2) + self.IMag_ax.set_xticks(self.major_ticks_2) + self.IMag_ax.set_yticks(self.major_ticks_1) + #self.IPha_ax.set_zticks(self.major_ticks_2) + #self.IPha_ax.set_xticks(self.major_ticks_2) + #self.IPha_ax.set_yticks(self.major_ticks_1) + self.kMag_ax.set(zlabel='Sample', xlabel='Phase Encoding Step', ylabel='3D Phase Encoding Step') + #self.kPha_ax.set(zlabel='Sample', xlabel='Phase Encoding Step', ylabel='3D Phase Encoding Step') + self.kMag_ax.set_xticks(self.major_ticks_4) + self.kMag_ax.set_yticks(self.major_ticks_5) + self.kMag_ax.set_zticks(self.major_ticks_3) + #self.kPha_ax.set_xticks(self.major_ticks_4) + #self.kPha_ax.set_yticks(self.major_ticks_5) + #self.kPha_ax.set_zticks(self.major_ticks_3) + self.IMag_ax.grid(which='major', color='#CCCCCC', linestyle='-') self.IMag_ax.grid(which='major', visible=True) self.IMag_ax.grid(True) - - if params.imageorientation == 'XY': - self.IMag_ax.set(xlabel='Z',ylabel='X', zlabel='Y') - elif params.imageorientation == 'YX': - self.IMag_ax.set(xlabel='Z',ylabel='Y', zlabel='X') - elif params.imageorientation == 'YZ': - self.IMag_ax.set(xlabel='X',ylabel='Y', zlabel='Z') - elif params.imageorientation == 'ZY': - self.IMag_ax.set(xlabel='X',ylabel='Z', zlabel='Y') - elif params.imageorientation == 'ZX': - self.IMag_ax.set(xlabel='Y',ylabel='Z', zlabel='X') - elif params.imageorientation == 'XZ': - self.IMag_ax.set(xlabel='Y',ylabel='X', zlabel='Z') + #self.IPha_ax.grid(which='major', color='#CCCCCC', linestyle='-') + #self.IPha_ax.grid(which='major', visible=True) + #self.IPha_ax.grid(True) + self.kMag_ax.grid(which='major', color='#CCCCCC', linestyle='-') + self.kMag_ax.grid(which='major', visible=True) + self.kMag_ax.grid(True) + #self.kPha_ax.grid(which='major', color='#CCCCCC', linestyle='-') + #self.kPha_ax.grid(which='major', visible=True) + #self.kPha_ax.grid(True) + else: self.IMag_ax.axis('off') - + #self.IPha_ax.axis('off') + self.kMag_ax.axis('off') + #self.kPha_ax.axis('off') + else: gs = GridSpec(4, params.img_mag.shape[0], figure=self.all_fig) @@ -7419,6 +7790,8 @@ def imaging_3D_plot_init(self): self.kPha_ax.axis('off') self.kPha_ax.set_aspect(1.0 / self.kPha_ax.get_data_ratio()) self.kPha_ax.set_title('k-Space Phase ' + str(n+1)) + + self.all_fig.tight_layout() self.all_canvas.draw() self.all_canvas.setWindowTitle('Plot - ' + params.datapath + '.txt') @@ -7426,6 +7799,9 @@ def imaging_3D_plot_init(self): self.all_canvas.show() def imaging_stitching_3D_plot_init(self): + #self.image_positions_1 = np.linspace(-params.slicethickness/2 + (params.slicethickness/params.SPEsteps)/2, params.slicethickness/2 - (params.slicethickness/params.SPEsteps)/2, params.SPEsteps) + #self.image_positions_2 = np.linspace(params.motor_start_position, params.motor_end_position, num=params.motor_image_count) + if params.imagplots == 1: self.IMag_fig = Figure() self.IMag_canvas = FigureCanvas(self.IMag_fig) @@ -7433,17 +7809,19 @@ def imaging_stitching_3D_plot_init(self): self.IPha_fig = Figure() self.IPha_canvas = FigureCanvas(self.IPha_fig) self.IPha_fig.set_facecolor('None') - - for n in range(params.img_st_mag.shape[0]): + + if params.imageorientation == 'XY' or params.imageorientation == 'ZY' or params.imageorientation == 'YZ' or params.imageorientation == 'YX': + self.IMag_ax = self.IMag_fig.add_subplot(111) + self.IMag_ax.grid(False) + self.IPha_ax = self.IPha_fig.add_subplot(111) + self.IPha_ax.grid(False) + + self.FOV_1 = 0 + self.FOV_2 = 0 + self.FOV_2_start = 0 + self.FOV_2_end = 0 + if params.imageorientation == 'XY' or params.imageorientation == 'ZY': - gs_IMag = GridSpec(1, params.img_st_mag.shape[0], figure=self.IMag_fig) - gs_IPha = GridSpec(1, params.img_st_mag.shape[0], figure=self.IPha_fig) - - self.IMag_ax = self.IMag_fig.add_subplot(gs_IMag[0, n]) - self.IMag_ax.grid(False) - self.IPha_ax = self.IPha_fig.add_subplot(gs_IPha[0, n]) - self.IPha_ax.grid(False) - self.FOV_1 = params.FOV if params.motor_movement_step <= params.FOV: self.FOV_2 = params.motor_total_image_length + params.motor_movement_step @@ -7453,15 +7831,22 @@ def imaging_stitching_3D_plot_init(self): self.FOV_2 = params.motor_total_image_length + params.FOV self.FOV_2_start = params.motor_start_position - params.FOV/2 self.FOV_2_end = params.motor_end_position + params.FOV/2 - - if params.imagefilter == 1: self.IMag_ax.imshow(params.img_st_mag[n, :, :], interpolation='gaussian', cmap=params.imagecolormap, vmin=params.imageminimum, vmax=params.imagemaximum, extent=[(-self.FOV_1 / 2), (self.FOV_1 / 2), self.FOV_2_start, self.FOV_2_end]) - else: self.IMag_ax.imshow(params.img_st_mag[n, :, :], cmap=params.imagecolormap, vmin=params.imageminimum, vmax=params.imagemaximum, extent=[(-self.FOV_1 / 2), (self.FOV_1 / 2), self.FOV_2_start, self.FOV_2_end]) - if params.imagefilter == 1: self.IPha_ax.imshow(params.img_st_pha[n, :, :], interpolation='gaussian', cmap='gray', extent=[(-self.FOV_1 / 2), (self.FOV_1 / 2), self.FOV_2_start, self.FOV_2_end]) - else: self.IPha_ax.imshow(params.img_st_pha[n, :, :], cmap='gray', extent=[(-self.FOV_1 / 2), (self.FOV_1 / 2), self.FOV_2_start, self.FOV_2_end]) + + if params.imagefilter == 1: self.IMag_ax.imshow(params.img_st_mag[:, :], interpolation='gaussian', cmap=params.imagecolormap, vmin=params.imageminimum, vmax=params.imagemaximum, extent=[(-self.FOV_1 / 2), (self.FOV_1 / 2), self.FOV_2_start, self.FOV_2_end]) + else: self.IMag_ax.imshow(params.img_st_mag[:, :], cmap=params.imagecolormap, vmin=params.imageminimum, vmax=params.imagemaximum, extent=[(-self.FOV_1 / 2), (self.FOV_1 / 2), self.FOV_2_start, self.FOV_2_end]) + if params.imagefilter == 1: self.IPha_ax.imshow(params.img_st_pha[:, :], interpolation='gaussian', cmap='gray', extent=[(-self.FOV_1 / 2), (self.FOV_1 / 2), self.FOV_2_start, self.FOV_2_end]) + else: self.IPha_ax.imshow(params.img_st_pha[:, :], cmap='gray', extent=[(-self.FOV_1 / 2), (self.FOV_1 / 2), self.FOV_2_start, self.FOV_2_end]) if params.image_grid == 1: - self.x_major_ticks = np.arange(math.ceil(-self.FOV_1 / 2), math.floor(self.FOV_1 / 2) + 1, 1) - self.y_major_ticks = np.arange(math.ceil(self.FOV_2_start), math.floor(self.FOV_2_end) + 1, 1) + if self.FOV_2 <= 20: + self.x_major_ticks = np.arange(math.ceil(-self.FOV_1 / 2), math.floor(self.FOV_1 / 2) + 1, 1) + self.y_major_ticks = np.arange(math.ceil(self.FOV_2_start), math.floor(self.FOV_2_end) + 1, 1) + elif self.FOV_2 > 20 and self.FOV_2 <= 50: + self.x_major_ticks = np.arange(math.ceil(-self.FOV_1 / 2), math.floor(self.FOV_1 / 2) + 2, 2) + self.y_major_ticks = np.arange(math.ceil(self.FOV_2_start), math.floor(self.FOV_2_end) + 2, 2) + else: + self.x_major_ticks = np.arange(math.ceil(-self.FOV_1 / 2), math.floor(self.FOV_1 / 2) + 4, 4) + self.y_major_ticks = np.arange(math.ceil(self.FOV_2_start), math.floor(self.FOV_2_end) + 5, 5) self.IMag_ax.axis('on') self.IMag_ax.set_xticks(self.x_major_ticks) @@ -7477,37 +7862,20 @@ def imaging_stitching_3D_plot_init(self): if params.imageorientation == 'XY': self.IMag_ax.set_xlabel('X in mm') - self.IMag_ax.set_ylabel('Y in mm') + self.IMag_ax.set_ylabel('Y$_{PB}$ in mm') self.IPha_ax.set_xlabel('X in mm') - self.IPha_ax.set_ylabel('Y in mm') + self.IPha_ax.set_ylabel('Y$_{PB}$ in mm') elif params.imageorientation == 'ZY': self.IMag_ax.set_xlabel('Z in mm') - self.IMag_ax.set_ylabel('Y in mm') + self.IMag_ax.set_ylabel('Y$_{PB}$ in mm') self.IPha_ax.set_xlabel('Z in mm') - self.IPha_ax.set_ylabel('Y in mm') + self.IPha_ax.set_ylabel('Y$_{PB}$ in mm') else: self.IMag_ax.axis('off') self.IPha_ax.axis('off') - self.image_positions = np.linspace(-params.slicethickness/(params.SPEsteps/2)+(params.slicethickness/params.SPEsteps)/2, +params.slicethickness/(params.SPEsteps/2)-(params.slicethickness/params.SPEsteps)/2, params.SPEsteps) - - if params.autofreqoffset == 1: - self.IMag_ax.set_title('Magnitude Image @ ' + str(self.image_positions[n] + params.sliceoffset) + 'mm (' + str(params.slicethickness / params.SPEsteps) + 'mm)') - self.IPha_ax.set_title('Phase Image @ ' + str(self.image_positions[n] + params.sliceoffset) + 'mm (' + str(params.slicethickness / params.SPEsteps) + 'mm)') - else: - self.IMag_ax.set_title('Magnitude Image @ Offset' + str(params.slicethickness / params.SPEsteps) + 'mm)') - self.IPha_ax.set_title('Phase Image @ Offset' + str(params.slicethickness / params.SPEsteps) + 'mm)') - elif params.imageorientation == 'YZ' or params.imageorientation == 'YX': - gs_IMag = GridSpec(params.img_st_mag.shape[0], 1, figure=self.IMag_fig) - gs_IPha = GridSpec(params.img_st_mag.shape[0], 1, figure=self.IPha_fig) - - self.IMag_ax = self.IMag_fig.add_subplot(gs_IMag[n, 0]) - self.IMag_ax.grid(False) - self.IPha_ax = self.IPha_fig.add_subplot(gs_IPha[n, 0]) - self.IPha_ax.grid(False) - if params.motor_movement_step <= params.FOV: self.FOV_1 = params.motor_total_image_length + params.motor_movement_step self.FOV_1_start = params.motor_start_position - params.motor_movement_step/2 @@ -7518,16 +7886,22 @@ def imaging_stitching_3D_plot_init(self): self.FOV_1_end = params.motor_end_position + params.FOV/2 self.FOV_2 = params.FOV - if params.imagefilter == 1: self.IMag_ax.imshow(params.img_st_mag[n, :, :], interpolation='gaussian', cmap=params.imagecolormap, vmin=params.imageminimum, vmax=params.imagemaximum, extent=[self.FOV_1_start, self.FOV_1_end, (-self.FOV_2 / 2), (self.FOV_2 / 2)]) - else: self.IMag_ax.imshow(params.img_st_mag[n, :, :], cmap=params.imagecolormap, vmin=params.imageminimum, vmax=params.imagemaximum, extent=[self.FOV_1_start, self.FOV_1_end, (-self.FOV_2 / 2), (self.FOV_2 / 2)]) - if params.imagefilter == 1: self.IPha_ax.imshow(params.img_st_pha[n, :, :], interpolation='gaussian', cmap='gray', extent=[self.FOV_1_start, self.FOV_1_end, (-self.FOV_2 / 2), (self.FOV_2 / 2)]) - else: self.IPha_ax.imshow(params.img_st_pha[n, :, :], cmap='gray', extent=[self.FOV_1_start, self.FOV_1_end, (-self.FOV_2 / 2), (self.FOV_2 / 2)]) - - + if params.imagefilter == 1: self.IMag_ax.imshow(params.img_st_mag[:, :], interpolation='gaussian', cmap=params.imagecolormap, vmin=params.imageminimum, vmax=params.imagemaximum, extent=[self.FOV_1_start, self.FOV_1_end, (-self.FOV_2 / 2), (self.FOV_2 / 2)]) + else: self.IMag_ax.imshow(params.img_st_mag[:, :], cmap=params.imagecolormap, vmin=params.imageminimum, vmax=params.imagemaximum, extent=[self.FOV_1_start, self.FOV_1_end, (-self.FOV_2 / 2), (self.FOV_2 / 2)]) + if params.imagefilter == 1: self.IPha_ax.imshow(params.img_st_pha[:, :], interpolation='gaussian', cmap='gray', extent=[self.FOV_1_start, self.FOV_1_end, (-self.FOV_2 / 2), (self.FOV_2 / 2)]) + else: self.IPha_ax.imshow(params.img_st_pha[:, :], cmap='gray', extent=[self.FOV_1_start, self.FOV_1_end, (-self.FOV_2 / 2), (self.FOV_2 / 2)]) + if params.image_grid == 1: - self.x_major_ticks = np.arange(math.ceil(self.FOV_1_start), math.floor(self.FOV_1_end) + 1, 1) - self.y_major_ticks = np.arange(math.ceil(-self.FOV_2 / 2), math.floor(self.FOV_2 / 2) + 1, 1) - + if self.FOV_1 <= 20: + self.x_major_ticks = np.arange(math.ceil(self.FOV_1_start), math.floor(self.FOV_1_end) + 1, 1) + self.y_major_ticks = np.arange(math.ceil(-self.FOV_2 / 2), math.floor(self.FOV_2 / 2) + 1, 1) + elif self.FOV_1 > 20 and self.FOV_1 <= 50: + self.x_major_ticks = np.arange(math.ceil(self.FOV_1_start), math.floor(self.FOV_1_end) + 2, 2) + self.y_major_ticks = np.arange(math.ceil(-self.FOV_2 / 2), math.floor(self.FOV_2 / 2) + 2, 2) + else: + self.x_major_ticks = np.arange(math.ceil(self.FOV_1_start), math.floor(self.FOV_1_end) + 5, 5) + self.y_major_ticks = np.arange(math.ceil(-self.FOV_2 / 2), math.floor(self.FOV_2 / 2) + 4, 4) + self.IMag_ax.axis('on') self.IMag_ax.set_xticks(self.x_major_ticks) self.IMag_ax.set_yticks(self.y_major_ticks) @@ -7540,98 +7914,514 @@ def imaging_stitching_3D_plot_init(self): self.IPha_ax.grid(which='major', color='#CCCCCC', linestyle='-') self.IPha_ax.grid(which='major', visible=True) - if params.imageorientation == 'YZ': - self.IMag_ax.set_xlabel('Y in mm') - self.IMag_ax.set_ylabel('Z in mm') - self.IPha_ax.set_xlabel('Y in mm') - self.IPha_ax.set_ylabel('Z in mm') - elif params.imageorientation == 'YX': - self.IMag_ax.set_xlabel('Y in mm') + if params.imageorientation == 'YX': + self.IMag_ax.set_xlabel('Y$_{PB}$ in mm') + self.IMag_ax.set_ylabel('X in mm') + self.IPha_ax.set_xlabel('Y$_{PB}$ in mm') + self.IPha_ax.set_ylabel('X in mm') + elif params.imageorientation == 'YZ': + self.IMag_ax.set_xlabel('Y$_{PB}$ in mm') self.IMag_ax.set_ylabel('Z in mm') - self.IPha_ax.set_xlabel('Y in mm') + self.IPha_ax.set_xlabel('Y$_{PB}$ in mm') self.IPha_ax.set_ylabel('Z in mm') else: self.IMag_ax.axis('off') self.IPha_ax.axis('off') - self.image_positions = np.linspace(-params.slicethickness/(params.SPEsteps/2)+(params.slicethickness/params.SPEsteps)/2, +params.slicethickness/(params.SPEsteps/2)-(params.slicethickness/params.SPEsteps)/2, params.SPEsteps) - + if params.sequence == 5 or params.sequence == 6 or params.sequence == 7 \ + or params.sequence == 8 or params.sequence == 9: if params.autofreqoffset == 1: - self.IMag_ax.set_title('Magnitude Image @ ' + str(self.image_positions[n] + params.sliceoffset) + 'mm (' + str(params.slicethickness / params.SPEsteps) + 'mm)') - self.IPha_ax.set_title('Phase Image @ ' + str(self.image_positions[n] + params.sliceoffset) + 'mm (' + str(params.slicethickness / params.SPEsteps) + 'mm)') + self.IMag_ax.set_title('Magnitude Image @ ' + str(params.sliceoffset) + 'mm (' + str(params.slicethickness) + 'mm)') + self.IPha_ax.set_title('Phase Image @ ' + str(params.sliceoffset) + 'mm (' + str(params.slicethickness) + 'mm)') else: - self.IMag_ax.set_title('Magnitude Image @ Offset' + str(params.slicethickness / params.SPEsteps) + 'mm)') - self.IPha_ax.set_title('Phase Image @ Offset' + str(params.slicethickness / params.SPEsteps) + 'mm)') - - elif params.imageorientation == 'ZX' or params.imageorientation == 'XZ': - gs_IMag = GridSpec(1, params.img_st_mag.shape[0], figure=self.IMag_fig) - gs_IPha = GridSpec(1, params.img_st_mag.shape[0], figure=self.IPha_fig) - - self.IMag_ax = self.IMag_fig.add_subplot(gs_IMag[0, n]) - self.IMag_ax.grid(False) - self.IPha_ax = self.IPha_fig.add_subplot(gs_IPha[0, n]) - self.IPha_ax.grid(False) + self.IMag_ax.set_title('Magnitude Image @ Offset' + str(params.slicethickness) + 'mm)') + self.IPha_ax.set_title('Phase Image @ Offset' + str(params.slicethickness) + 'mm)') + else: + self.IMag_ax.set_title('Magnitude Image') + self.IPha_ax.set_title('Phase Image') - if params.imagefilter == 1: self.IMag_ax.imshow(params.img_st_mag[n, :, :], interpolation='gaussian', cmap=params.imagecolormap, vmin=params.imageminimum, vmax=params.imagemaximum, extent=[(-params.FOV / 2), (params.FOV / 2), (-params.FOV / 2), (params.FOV / 2)]) - else: self.IMag_ax.imshow(params.img_st_mag[n, :, :], cmap=params.imagecolormap, vmin=params.imageminimum, vmax=params.imagemaximum, extent=[(-params.FOV / 2), (params.FOV / 2), (-params.FOV / 2), (params.FOV / 2)]) - if params.imagefilter == 1: self.IPha_ax.imshow(params.img_st_pha[n, :, :], interpolation='gaussian', cmap='gray', extent=[(-params.FOV / 2), (params.FOV / 2), (-params.FOV / 2), (params.FOV / 2)]) - else: self.IPha_ax.imshow(params.img_st_pha[n, :, :], cmap='gray', extent=[(-params.FOV / 2), (params.FOV / 2), (-params.FOV / 2), (params.FOV / 2)]) + self.IMag_canvas.draw() + self.IMag_canvas.setWindowTitle('Plot - ' + params.datapath + '.txt') + self.IMag_canvas.setGeometry(420, 40, 575, 470) + self.IPha_canvas.draw() + self.IPha_canvas.setWindowTitle('Plot - ' + params.datapath + '.txt') + self.IPha_canvas.setGeometry(1005, 40, 575, 470) + + self.IMag_canvas.show() + self.IPha_canvas.show() + + elif params.imageorientation == 'ZX' or params.imageorientation == 'XZ': + self.imagecrop_image_pixel = int((params.motor_movement_step * params.SPEsteps) / params.slicethickness) + self.imagecrop_total_pixel = int(self.imagecrop_image_pixel * params.motor_image_count) + self.imageexp_total_pixel = (self.imagecrop_image_pixel * (params.motor_image_count - 1) + params.SPEsteps) + self.image_positions_1 = np.linspace(params.motor_start_position, params.motor_end_position, params.motor_image_count) + + if params.projection3D == 1: + self.IMag_ax = self.IMag_fig.add_subplot(111, projection='3d') + self.IMag_ax.grid(False) - if params.image_grid == 1: - self.major_ticks = np.arange(math.ceil((-params.FOV / 2)), math.floor((params.FOV / 2)) + 1, 1) - - self.IMag_ax.axis('on') - self.IMag_ax.set_xticks(self.major_ticks) - self.IMag_ax.set_yticks(self.major_ticks) - self.IMag_ax.grid(which='major', color='#CCCCCC', linestyle='-') - self.IMag_ax.grid(which='major', visible=True) - - self.IPha_ax.axis('on') - self.IPha_ax.set_xticks(self.major_ticks) - self.IPha_ax.set_yticks(self.major_ticks) - self.IPha_ax.grid(which='major', color='#CCCCCC', linestyle='-') - self.IPha_ax.grid(which='major', visible=True) - - if params.imageorientation == 'ZX': - self.IMag_ax.set_xlabel('Z in mm') - self.IMag_ax.set_ylabel('X in mm') - self.IPha_ax.set_xlabel('Z in mm') - self.IPha_ax.set_ylabel('X in mm') - elif params.imageorientation == 'XZ': - self.IMag_ax.set_xlabel('X in mm') - self.IMag_ax.set_ylabel('Z in mm') - self.IPha_ax.set_xlabel('X in mm') - self.IPha_ax.set_ylabel('Z in mm') - - else: - self.IMag_ax.axis('off') - self.IPha_ax.axis('off') + if params.projection3D_quality == 1: + print('WIP') +# #Surface Plot +# self.img_st_mag_cut_1 = np.array(np.zeros((params.nPE, params.nPE))) +# self.img_st_mag_cut_1_norm = np.array(np.zeros((params.nPE, params.nPE))) +# self.img_st_mag_cut_2 = np.array(np.zeros((params.nPE, params.nPE))) +# +# X, Z = np.meshgrid(np.linspace(-params.FOV/2, params.FOV/2, params.nPE+1),np.linspace(params.FOV/2, -params.FOV/2, params.nPE+1)) +# print(self.image_positions_1) +# +# if params.motor_movement_step <= params.slicethickness: +# for m in range(params.motor_image_count): +# for n in range(self.imagecrop_image_pixel): +# self.img_st_mag_cut_1[:, :] = params.img_st_mag[m*self.imagecrop_image_pixel+n, :, :].copy() +# self.img_st_mag_cut_1[self.img_st_mag_cut_1 > params.imagemaximum] = params.imagemaximum +# self.img_st_mag_cut_1[self.img_st_mag_cut_1 < params.imageminimum] = params.imageminimum +# self.img_st_mag_cut_2[:, :] = params.img_st_mag[m*self.imagecrop_image_pixel+n, :, :].copy() +# self.img_st_mag_cut_2[self.img_st_mag_cut_2 > params.imagemaximum] = params.imagemaximum +# +# Y = np.full_like(X, self.image_positions_1[m] - (self.imagecrop_image_pixel/2)*(params.slicethickness/params.SPEsteps) + (params.slicethickness/params.SPEsteps)/2 + n*(params.slicethickness/params.SPEsteps)) +# +# self.img_st_mag_cut_1_norm = (self.img_st_mag_cut_1 - params.imageminimum) / (params.imagemaximum - params.imageminimum) +# +# colors_2 = plt.get_cmap(params.imagecolormap)(np.clip(self.img_st_mag_cut_1_norm, 0, 1)) +# colors_2[self.img_st_mag_cut_2 < params.imageminimum, 3] = 0 +# +# if params.imagefilter == 1: self.IMag_ax.plot_surface(Y, Z, X, rstride=1, cstride=1, facecolors=colors_2, antialiased=True, shade=False, edgecolor='none') +# else: self.IMag_ax.plot_surface(Y, Z, X, rstride=1, cstride=1, facecolors=colors_2, antialiased=False, shade=False, edgecolor='none') +# +# self.IMag_ax.set_box_aspect([(params.motor_total_image_length + params.slicethickness)/params.FOV, 1, 1]) +# self.IMag_ax.set_xlim([params.motor_start_position - params.slicethickness/2, params.motor_end_position + params.slicethickness/2]) +# +# del self.img_st_mag_cut_1, self.img_st_mag_cut_1_norm, self.img_st_mag_cut_2, X, Y, Z, colors_2 +# +# # #Voxel Plot +# # self.img_st_mag_cut_1 = np.array(np.zeros((params.motor_image_count, params.nPE, params.nPE))) +# # self.img_st_mag_cut_1_norm = np.array(np.zeros((params.motor_image_count, params.nPE, params.nPE))) +# # self.img_st_mag_cut_2 = np.array(np.zeros((params.motor_image_count, params.nPE, params.nPE))) +# # +# # for n in range(params.motor_image_count): +# # self.img_st_mag_cut_1[n, :, :] = params.img_st_mag[:, n*params.nPE:(n+1)*params.nPE].copy() +# # self.img_st_mag_cut_2[n, :, :] = params.img_st_mag[:, n*params.nPE:(n+1)*params.nPE].copy() +# # +# # +# # self.img_st_mag_cut_1[self.img_st_mag_cut_1 > params.imagemaximum] = params.imagemaximum +# # self.img_st_mag_cut_1[self.img_st_mag_cut_1 < params.imageminimum] = params.imageminimum +# # self.img_st_mag_cut_1[self.img_st_mag_cut_2 > params.imagemaximum] = params.imagemaximum +# # +# # x_edges = np.linspace(-params.FOV/2, params.FOV/2, self.img_st_mag_cut_2.shape[1]+1) +# # y_edges = np.linspace(params.motor_start_position - params.slicethickness/2, params.motor_end_position + params.slicethickness/2, self.img_st_mag_cut_2.shape[0]+1) +# # z_edges = np.linspace(-params.FOV/2, params.FOV/2, self.img_st_mag_cut_2.shape[2]+1) +# # +# # Y, Z, X = np.meshgrid(y_edges, z_edges, x_edges, indexing='ij') +# # +# # self.img_st_mag_cut_1_norm = (self.img_st_mag_cut_1 - params.imageminimum) / (params.imagemaximum - params.imageminimum) +# # +# # colors_3 = plt.get_cmap(params.imagecolormap)(np.clip(self.img_st_mag_cut_1_norm, 0, 1)) +# # colors_3[..., 3] = 0.2 +# # colors_3[self.img_st_mag_cut_2 < params.imageminimum, 3] = 0 +# # +# # self.IMag_ax.voxels(Y, Z, X, self.img_st_mag_cut_1_norm, facecolors=colors_3, shade=False, edgecolor='none') +# # +# # self.IMag_ax.set_box_aspect([(params.motor_total_image_length + params.slicethickness)/params.FOV, 1, 1]) +# # self.IMag_ax.set_xlim([params.motor_start_position - params.slicethickness/2, params.motor_end_position + params.slicethickness/2]) +# # +# # del self.img_st_mag_cut_1, self.img_st_mag_cut_1_norm, self.img_st_mag_cut_2, X, Y, Z, colors_3 +# +# else: +# #Contour Plot +# self.img_st_mag_cut = np.array(np.zeros((params.nPE, params.nPE))) +# +# X, Z = np.meshgrid(np.linspace(-params.FOV/2, params.FOV/2, params.nPE),np.linspace(params.FOV/2, -params.FOV/2, params.nPE)) +# +# levels = np.linspace(params.imageminimum, params.imagemaximum, 10) +# +# for n in range(params.motor_image_count): +# self.img_st_mag_cut[:, :] = params.img_st_mag[:, n*params.nPE:(n+1)*params.nPE].copy() +# +# self.IMag_ax.contour(self.img_st_mag_cut, Z, X, zdir='x', offset=self.image_positions[n], levels=levels, cmap=params.imagecolormap, extend='neither') +# +# self.IMag_ax.set_box_aspect([(params.motor_total_image_length)/params.FOV, 1, 1]) +# self.IMag_ax.set_xlim([params.motor_start_position, params.motor_end_position]) +# +# del self.img_st_mag_cut, X, Z, levels +# +# if params.image_grid == 1: +# if params.motor_total_image_length <= 20: +# self.x_major_ticks = np.arange(math.ceil(params.motor_start_position), math.floor(params.motor_end_position) + 1, 1) +# self.y_major_ticks = np.arange(math.ceil(-params.FOV / 2), math.floor(params.FOV / 2) + 1, 1) +# elif params.motor_total_image_length > 20 and params.motor_total_image_length <= 50: +# self.x_major_ticks = np.arange(math.ceil(params.motor_start_position), math.floor(params.motor_end_position) + 2, 2) +# self.y_major_ticks = np.arange(math.ceil(-params.FOV / 2), math.floor(params.FOV / 2) + 2, 2) +# else: +# self.x_major_ticks = np.arange(math.ceil(params.motor_start_position), math.floor(params.motor_end_position) + 5, 5) +# self.y_major_ticks = np.arange(math.ceil(-params.FOV / 2), math.floor(params.FOV / 2) + 4, 4) +# +# self.IMag_ax.axis('on') +# self.IMag_ax.set_xticks(self.x_major_ticks) +# self.IMag_ax.set_yticks(self.y_major_ticks) +# self.IMag_ax.grid(which='major', color='#CCCCCC', linestyle='-') +# self.IMag_ax.grid(which='major', visible=True) +# self.IMag_ax.grid(True) +# +# if params.imageorientation == 'ZX': +# self.IMag_ax.set(xlabel='\n\nY$_{PB}$',ylabel='Z', zlabel='X') +# elif params.imageorientation == 'XZ': +# self.IMag_ax.set(xlabel='\n\nY$_{PB}$',ylabel='X', zlabel='Z') +# else: +# self.IMag_ax.axis('off') +# +# +# #self.IMag_fig.patch.set_facecolor('black') +# #self.IMag_fig.set_facecolor('black') +# #self.IMag_ax.set_facecolor('black') +# #self.IMag_ax.xaxis.set_pane_color((0, 0, 0, 1)) +# #self.IMag_ax.yaxis.set_pane_color((0, 0, 0, 1)) +# #self.IMag_ax.zaxis.set_pane_color((0, 0, 0, 1)) +# #self.IMag_ax.tick_params(axis='both', colors='white') +# #self.IMag_ax.xaxis.label.set_color('white') +# #self.IMag_ax.yaxis.label.set_color('white') +# #self.IMag_ax.zaxis.label.set_color('white') +# #self.IMag_ax.grid(True, color='white') +# +# self.IMag_canvas.draw() +# self.IMag_canvas.setWindowTitle('Plot - ' + params.datapath + '.txt') +# self.IMag_canvas.setGeometry(420, 40, 1160, 950) +# self.IMag_canvas.show() - self.image_positions = np.linspace(params.motor_start_position - params.motor_movement_step/2 + (params.slicethickness/params.SPEsteps)/2, params.motor_end_position + params.motor_movement_step/2 - (params.slicethickness/params.SPEsteps)/2, num=params.img_st_mag.shape[0]) + else: +# # if params.motor_image_count > 6: +# # gs_IMag = GridSpec(int(np.ceil(params.motor_image_count/6)), 6, figure=self.IMag_fig) +# # gs_IPha = GridSpec(int(np.ceil(params.motor_image_count/6)), 6, figure=self.IPha_fig) +# # +# # for m in range(int(np.ceil(params.motor_image_count/6))): +# # for n in range(6): +# # if m*6 + n < params.motor_image_count: +# # self.IMag_ax = self.IMag_fig.add_subplot(gs_IMag[m, n]) +# # self.IMag_ax.grid(False) +# # self.IPha_ax = self.IPha_fig.add_subplot(gs_IPha[m, n]) +# # self.IPha_ax.grid(False) +# # +# # if params.imagefilter == 1: self.IMag_ax.imshow(params.img_st_mag[:, (m*6+n)*params.nPE:((m*6+n)+1)*params.nPE], interpolation='gaussian', cmap=params.imagecolormap, vmin=params.imageminimum, vmax=params.imagemaximum, extent=[(-params.FOV / 2), (params.FOV / 2), (-params.FOV / 2), (params.FOV / 2)]) +# # else: self.IMag_ax.imshow(params.img_st_mag[:, (m*6+n)*params.nPE:((m*6+n)+1)*params.nPE], cmap=params.imagecolormap, vmin=params.imageminimum, vmax=params.imagemaximum, extent=[(-params.FOV / 2), (params.FOV / 2), (-params.FOV / 2), (params.FOV / 2)]) +# # if params.imagefilter == 1: self.IPha_ax.imshow(params.img_st_pha[:, (m*6+n)*params.nPE:((m*6+n)+1)*params.nPE], interpolation='gaussian', cmap='gray', extent=[(-params.FOV / 2), (params.FOV / 2), (-params.FOV / 2), (params.FOV / 2)]) +# # else: self.IPha_ax.imshow(params.img_st_pha[:, (m*6+n)*params.nPE:((m*6+n)+1)*params.nPE], cmap='gray', extent=[(-params.FOV / 2), (params.FOV / 2), (-params.FOV / 2), (params.FOV / 2)]) +# # +# # if params.image_grid == 1: +# # self.major_ticks = np.arange(math.ceil((-params.FOV / 2)), math.floor((params.FOV / 2)) + 1, 1) +# # +# # self.IMag_ax.axis('on') +# # self.IMag_ax.set_xticks(self.major_ticks) +# # self.IMag_ax.set_yticks(self.major_ticks) +# # self.IMag_ax.grid(which='major', color='#CCCCCC', linestyle='-') +# # self.IMag_ax.grid(which='major', visible=True) +# # +# # self.IPha_ax.axis('on') +# # self.IPha_ax.set_xticks(self.major_ticks) +# # self.IPha_ax.set_yticks(self.major_ticks) +# # self.IPha_ax.grid(which='major', color='#CCCCCC', linestyle='-') +# # self.IPha_ax.grid(which='major', visible=True) +# # +# # if params.imageorientation == 'ZX': +# # self.IMag_ax.set_xlabel('Z in mm') +# # self.IMag_ax.set_ylabel('X in mm') +# # self.IPha_ax.set_xlabel('Z in mm') +# # self.IPha_ax.set_ylabel('X in mm') +# # elif params.imageorientation == 'XZ': +# # self.IMag_ax.set_xlabel('X in mm') +# # self.IMag_ax.set_ylabel('Z in mm') +# # self.IPha_ax.set_xlabel('X in mm') +# # self.IPha_ax.set_ylabel('Z in mm') +# # +# # else: +# # self.IMag_ax.axis('off') +# # self.IPha_ax.axis('off') +# # +# # if params.sequence == 5 or params.sequence == 6 or params.sequence == 7 \ +# # or params.sequence == 8 or params.sequence == 9: +# # if params.autofreqoffset == 1: +# # self.IMag_ax.set_title('Magnitude Image @ ' + str(self.image_positions[(m*6+n)] + params.sliceoffset) + 'mm (' + str(params.slicethickness) + 'mm)') +# # self.IPha_ax.set_title('Phase Image @ ' + str(self.image_positions[(m*6+n)] + params.sliceoffset) + 'mm (' + str(params.slicethickness) + 'mm)') +# # else: +# # self.IMag_ax.set_title('Magnitude Image @ Offset' + str(params.slicethickness) + 'mm)') +# # self.IPha_ax.set_title('Phase Image @ Offset' + str(params.slicethickness) + 'mm)') +# # else: +# # self.IMag_ax.set_title('Magnitude Image') +# # self.IPha_ax.set_title('Phase Image') +# # else: +# # gs_IMag = GridSpec(1, params.motor_image_count, figure=self.IMag_fig) +# # gs_IPha = GridSpec(1, params.motor_image_count, figure=self.IPha_fig) +# # +# # for n in range(params.motor_image_count): +# # self.IMag_ax = self.IMag_fig.add_subplot(gs_IMag[0, n]) +# # self.IMag_ax.grid(False) +# # self.IPha_ax = self.IPha_fig.add_subplot(gs_IPha[0, n]) +# # self.IPha_ax.grid(False) +# # +# # if params.imagefilter == 1: self.IMag_ax.imshow(params.img_st_mag[:, n*params.nPE:(n+1)*params.nPE], interpolation='gaussian', cmap=params.imagecolormap, vmin=params.imageminimum, vmax=params.imagemaximum, extent=[(-params.FOV / 2), (params.FOV / 2), (-params.FOV / 2), (params.FOV / 2)]) +# # else: self.IMag_ax.imshow(params.img_st_mag[:, n*params.nPE:(n+1)*params.nPE], cmap=params.imagecolormap, vmin=params.imageminimum, vmax=params.imagemaximum, extent=[(-params.FOV / 2), (params.FOV / 2), (-params.FOV / 2), (params.FOV / 2)]) +# # if params.imagefilter == 1: self.IPha_ax.imshow(params.img_st_pha[:, n*params.nPE:(n+1)*params.nPE], interpolation='gaussian', cmap='gray', extent=[(-params.FOV / 2), (params.FOV / 2), (-params.FOV / 2), (params.FOV / 2)]) +# # else: self.IPha_ax.imshow(params.img_st_pha[:, n*params.nPE:(n+1)*params.nPE], cmap='gray', extent=[(-params.FOV / 2), (params.FOV / 2), (-params.FOV / 2), (params.FOV / 2)]) +# # +# # if params.image_grid == 1: +# # self.major_ticks = np.arange(math.ceil((-params.FOV / 2)), math.floor((params.FOV / 2)) + 1, 1) +# # +# # self.IMag_ax.axis('on') +# # self.IMag_ax.set_xticks(self.major_ticks) +# # self.IMag_ax.set_yticks(self.major_ticks) +# # self.IMag_ax.grid(which='major', color='#CCCCCC', linestyle='-') +# # self.IMag_ax.grid(which='major', visible=True) +# # +# # self.IPha_ax.axis('on') +# # self.IPha_ax.set_xticks(self.major_ticks) +# # self.IPha_ax.set_yticks(self.major_ticks) +# # self.IPha_ax.grid(which='major', color='#CCCCCC', linestyle='-') +# # self.IPha_ax.grid(which='major', visible=True) +# # +# # if params.imageorientation == 'ZX': +# # self.IMag_ax.set_xlabel('Z in mm') +# # self.IMag_ax.set_ylabel('X in mm') +# # self.IPha_ax.set_xlabel('Z in mm') +# # self.IPha_ax.set_ylabel('X in mm') +# # elif params.imageorientation == 'XZ': +# # self.IMag_ax.set_xlabel('X in mm') +# # self.IMag_ax.set_ylabel('Z in mm') +# # self.IPha_ax.set_xlabel('X in mm') +# # self.IPha_ax.set_ylabel('Z in mm') +# # +# # else: +# # self.IMag_ax.axis('off') +# # self.IPha_ax.axis('off') +# # +# # if params.sequence == 5 or params.sequence == 6 or params.sequence == 7 \ +# # or params.sequence == 8 or params.sequence == 9: +# # if params.autofreqoffset == 1: +# # self.IMag_ax.set_title('Magnitude Image @ ' + str(self.image_positions[n] + params.sliceoffset) + 'mm (' + str(params.slicethickness) + 'mm)') +# # self.IPha_ax.set_title('Phase Image @ ' + str(self.image_positions[n] + params.sliceoffset) + 'mm (' + str(params.slicethickness) + 'mm)') +# # else: +# # self.IMag_ax.set_title('Magnitude Image @ Offset' + str(params.slicethickness) + 'mm)') +# # self.IPha_ax.set_title('Phase Image @ Offset' + str(params.slicethickness) + 'mm)') +# # else: +# # self.IMag_ax.set_title('Magnitude Image') +# # self.IPha_ax.set_title('Phase Image') +# # +# # self.IMag_canvas.draw() +# # self.IMag_canvas.setWindowTitle('Plot - ' + params.datapath + '.txt') +# # self.IMag_canvas.setGeometry(420, 40, 575, 470) +# # self.IPha_canvas.draw() +# # self.IPha_canvas.setWindowTitle('Plot - ' + params.datapath + '.txt') +# # self.IPha_canvas.setGeometry(1005, 40, 575, 470) +# # +# # self.IMag_canvas.show() +# # self.IPha_canvas.show() + + + self.IMag_fig = Figure() + self.IMag_canvas = FigureCanvas(self.IMag_fig) + self.IMag_fig.set_facecolor('None') + #self.IPha_fig = Figure() + #self.IPha_canvas = FigureCanvas(self.IPha_fig) + #self.IPha_fig.set_facecolor('None') + + for n in range(params.img_st_mag.shape[0]): + if params.imageorientation == 'XY' or params.imageorientation == 'ZY': + gs_IMag = GridSpec(1, params.img_st_mag.shape[0], figure=self.IMag_fig) + gs_IPha = GridSpec(1, params.img_st_mag.shape[0], figure=self.IPha_fig) + + self.IMag_ax = self.IMag_fig.add_subplot(gs_IMag[0, n]) + self.IMag_ax.grid(False) + self.IPha_ax = self.IPha_fig.add_subplot(gs_IPha[0, n]) + self.IPha_ax.grid(False) + + self.FOV_1 = params.FOV + if params.motor_movement_step <= params.FOV: + self.FOV_2 = params.motor_total_image_length + params.motor_movement_step + self.FOV_2_start = params.motor_start_position - params.motor_movement_step/2 + self.FOV_2_end = params.motor_end_position + params.motor_movement_step/2 + else: + self.FOV_2 = params.motor_total_image_length + params.FOV + self.FOV_2_start = params.motor_start_position - params.FOV/2 + self.FOV_2_end = params.motor_end_position + params.FOV/2 + + if params.imagefilter == 1: self.IMag_ax.imshow(params.img_st_mag[n, :, :], interpolation='gaussian', cmap=params.imagecolormap, vmin=params.imageminimum, vmax=params.imagemaximum, extent=[(-self.FOV_1 / 2), (self.FOV_1 / 2), self.FOV_2_start, self.FOV_2_end]) + else: self.IMag_ax.imshow(params.img_st_mag[n, :, :], cmap=params.imagecolormap, vmin=params.imageminimum, vmax=params.imagemaximum, extent=[(-self.FOV_1 / 2), (self.FOV_1 / 2), self.FOV_2_start, self.FOV_2_end]) + if params.imagefilter == 1: self.IPha_ax.imshow(params.img_st_pha[n, :, :], interpolation='gaussian', cmap='gray', extent=[(-self.FOV_1 / 2), (self.FOV_1 / 2), self.FOV_2_start, self.FOV_2_end]) + else: self.IPha_ax.imshow(params.img_st_pha[n, :, :], cmap='gray', extent=[(-self.FOV_1 / 2), (self.FOV_1 / 2), self.FOV_2_start, self.FOV_2_end]) + + if params.image_grid == 1: + self.x_major_ticks = np.arange(math.ceil(-self.FOV_1 / 2), math.floor(self.FOV_1 / 2) + 1, 1) + self.y_major_ticks = np.arange(math.ceil(self.FOV_2_start), math.floor(self.FOV_2_end) + 1, 1) + + self.IMag_ax.axis('on') + self.IMag_ax.set_xticks(self.x_major_ticks) + self.IMag_ax.set_yticks(self.y_major_ticks) + self.IMag_ax.grid(which='major', color='#CCCCCC', linestyle='-') + self.IMag_ax.grid(which='major', visible=True) + + self.IPha_ax.axis('on') + self.IPha_ax.set_xticks(self.x_major_ticks) + self.IPha_ax.set_yticks(self.y_major_ticks) + self.IPha_ax.grid(which='major', color='#CCCCCC', linestyle='-') + self.IPha_ax.grid(which='major', visible=True) + + if params.imageorientation == 'XY': + self.IMag_ax.set_xlabel('X in mm') + self.IMag_ax.set_ylabel('Y in mm') + self.IPha_ax.set_xlabel('X in mm') + self.IPha_ax.set_ylabel('Y in mm') + elif params.imageorientation == 'ZY': + self.IMag_ax.set_xlabel('Z in mm') + self.IMag_ax.set_ylabel('Y in mm') + self.IPha_ax.set_xlabel('Z in mm') + self.IPha_ax.set_ylabel('Y in mm') + + else: + self.IMag_ax.axis('off') + self.IPha_ax.axis('off') + + self.image_positions = np.linspace(-params.slicethickness/(params.SPEsteps/2)+(params.slicethickness/params.SPEsteps)/2, +params.slicethickness/(params.SPEsteps/2)-(params.slicethickness/params.SPEsteps)/2, params.SPEsteps) - if params.autofreqoffset == 1: - self.IMag_ax.set_title('Magnitude Image @ ' + str(self.image_positions[n] + params.sliceoffset) + 'mm (' + str(params.slicethickness / params.SPEsteps) + 'mm)') - self.IPha_ax.set_title('Phase Image @ ' + str(self.image_positions[n] + params.sliceoffset) + 'mm (' + str(params.slicethickness / params.SPEsteps) + 'mm)') - else: - self.IMag_ax.set_title('Magnitude Image @ Offset' + str(params.slicethickness / params.SPEsteps) + 'mm)') - self.IPha_ax.set_title('Phase Image @ Offset' + str(params.slicethickness / params.SPEsteps) + 'mm)') - - self.IMag_canvas.draw() - self.IMag_canvas.setWindowTitle('Plot - ' + params.datapath + '.txt') - self.IMag_canvas.setGeometry(420, 40, 575, 470) - self.IPha_canvas.draw() - self.IPha_canvas.setWindowTitle('Plot - ' + params.datapath + '.txt') - self.IPha_canvas.setGeometry(1005, 40, 575, 470) + if params.autofreqoffset == 1: + self.IMag_ax.set_title('Magnitude Image @ ' + str(self.image_positions[n] + params.sliceoffset) + 'mm (' + str(params.slicethickness / params.SPEsteps) + 'mm)') + self.IPha_ax.set_title('Phase Image @ ' + str(self.image_positions[n] + params.sliceoffset) + 'mm (' + str(params.slicethickness / params.SPEsteps) + 'mm)') + else: + self.IMag_ax.set_title('Magnitude Image @ Offset' + str(params.slicethickness / params.SPEsteps) + 'mm)') + self.IPha_ax.set_title('Phase Image @ Offset' + str(params.slicethickness / params.SPEsteps) + 'mm)') + + elif params.imageorientation == 'YZ' or params.imageorientation == 'YX': + gs_IMag = GridSpec(params.img_st_mag.shape[0], 1, figure=self.IMag_fig) + gs_IPha = GridSpec(params.img_st_mag.shape[0], 1, figure=self.IPha_fig) + + self.IMag_ax = self.IMag_fig.add_subplot(gs_IMag[n, 0]) + self.IMag_ax.grid(False) + self.IPha_ax = self.IPha_fig.add_subplot(gs_IPha[n, 0]) + self.IPha_ax.grid(False) + + if params.motor_movement_step <= params.FOV: + self.FOV_1 = params.motor_total_image_length + params.motor_movement_step + self.FOV_1_start = params.motor_start_position - params.motor_movement_step/2 + self.FOV_1_end = params.motor_end_position + params.motor_movement_step/2 + else: + self.FOV_1 = params.motor_total_image_length + params.FOV + self.FOV_1_start = params.motor_start_position - params.FOV/2 + self.FOV_1_end = params.motor_end_position + params.FOV/2 + self.FOV_2 = params.FOV + + if params.imagefilter == 1: self.IMag_ax.imshow(params.img_st_mag[n, :, :], interpolation='gaussian', cmap=params.imagecolormap, vmin=params.imageminimum, vmax=params.imagemaximum, extent=[self.FOV_1_start, self.FOV_1_end, (-self.FOV_2 / 2), (self.FOV_2 / 2)]) + else: self.IMag_ax.imshow(params.img_st_mag[n, :, :], cmap=params.imagecolormap, vmin=params.imageminimum, vmax=params.imagemaximum, extent=[self.FOV_1_start, self.FOV_1_end, (-self.FOV_2 / 2), (self.FOV_2 / 2)]) + if params.imagefilter == 1: self.IPha_ax.imshow(params.img_st_pha[n, :, :], interpolation='gaussian', cmap='gray', extent=[self.FOV_1_start, self.FOV_1_end, (-self.FOV_2 / 2), (self.FOV_2 / 2)]) + else: self.IPha_ax.imshow(params.img_st_pha[n, :, :], cmap='gray', extent=[self.FOV_1_start, self.FOV_1_end, (-self.FOV_2 / 2), (self.FOV_2 / 2)]) + + + if params.image_grid == 1: + self.x_major_ticks = np.arange(math.ceil(self.FOV_1_start), math.floor(self.FOV_1_end) + 1, 1) + self.y_major_ticks = np.arange(math.ceil(-self.FOV_2 / 2), math.floor(self.FOV_2 / 2) + 1, 1) + + self.IMag_ax.axis('on') + self.IMag_ax.set_xticks(self.x_major_ticks) + self.IMag_ax.set_yticks(self.y_major_ticks) + self.IMag_ax.grid(which='major', color='#CCCCCC', linestyle='-') + self.IMag_ax.grid(which='major', visible=True) + + self.IPha_ax.axis('on') + self.IPha_ax.set_xticks(self.x_major_ticks) + self.IPha_ax.set_yticks(self.y_major_ticks) + self.IPha_ax.grid(which='major', color='#CCCCCC', linestyle='-') + self.IPha_ax.grid(which='major', visible=True) + + if params.imageorientation == 'YZ': + self.IMag_ax.set_xlabel('Y in mm') + self.IMag_ax.set_ylabel('Z in mm') + self.IPha_ax.set_xlabel('Y in mm') + self.IPha_ax.set_ylabel('Z in mm') + elif params.imageorientation == 'YX': + self.IMag_ax.set_xlabel('Y in mm') + self.IMag_ax.set_ylabel('Z in mm') + self.IPha_ax.set_xlabel('Y in mm') + self.IPha_ax.set_ylabel('Z in mm') + + else: + self.IMag_ax.axis('off') + self.IPha_ax.axis('off') + + self.image_positions = np.linspace(-params.slicethickness/(params.SPEsteps/2)+(params.slicethickness/params.SPEsteps)/2, +params.slicethickness/(params.SPEsteps/2)-(params.slicethickness/params.SPEsteps)/2, params.SPEsteps) - self.IMag_canvas.show() - self.IPha_canvas.show() + if params.autofreqoffset == 1: + self.IMag_ax.set_title('Magnitude Image @ ' + str(self.image_positions[n] + params.sliceoffset) + 'mm (' + str(params.slicethickness / params.SPEsteps) + 'mm)') + self.IPha_ax.set_title('Phase Image @ ' + str(self.image_positions[n] + params.sliceoffset) + 'mm (' + str(params.slicethickness / params.SPEsteps) + 'mm)') + else: + self.IMag_ax.set_title('Magnitude Image @ Offset' + str(params.slicethickness / params.SPEsteps) + 'mm)') + self.IPha_ax.set_title('Phase Image @ Offset' + str(params.slicethickness / params.SPEsteps) + 'mm)') + + elif params.imageorientation == 'ZX' or params.imageorientation == 'XZ': + gs_IMag = GridSpec(1, params.img_st_mag.shape[0], figure=self.IMag_fig) + gs_IPha = GridSpec(1, params.img_st_mag.shape[0], figure=self.IPha_fig) + + self.IMag_ax = self.IMag_fig.add_subplot(gs_IMag[0, n]) + self.IMag_ax.grid(False) + self.IPha_ax = self.IPha_fig.add_subplot(gs_IPha[0, n]) + self.IPha_ax.grid(False) + + if params.imagefilter == 1: self.IMag_ax.imshow(params.img_st_mag[n, :, :], interpolation='gaussian', cmap=params.imagecolormap, vmin=params.imageminimum, vmax=params.imagemaximum, extent=[(-params.FOV / 2), (params.FOV / 2), (-params.FOV / 2), (params.FOV / 2)]) + else: self.IMag_ax.imshow(params.img_st_mag[n, :, :], cmap=params.imagecolormap, vmin=params.imageminimum, vmax=params.imagemaximum, extent=[(-params.FOV / 2), (params.FOV / 2), (-params.FOV / 2), (params.FOV / 2)]) + if params.imagefilter == 1: self.IPha_ax.imshow(params.img_st_pha[n, :, :], interpolation='gaussian', cmap='gray', extent=[(-params.FOV / 2), (params.FOV / 2), (-params.FOV / 2), (params.FOV / 2)]) + else: self.IPha_ax.imshow(params.img_st_pha[n, :, :], cmap='gray', extent=[(-params.FOV / 2), (params.FOV / 2), (-params.FOV / 2), (params.FOV / 2)]) + + if params.image_grid == 1: + self.major_ticks = np.arange(math.ceil((-params.FOV / 2)), math.floor((params.FOV / 2)) + 1, 1) + + self.IMag_ax.axis('on') + self.IMag_ax.set_xticks(self.major_ticks) + self.IMag_ax.set_yticks(self.major_ticks) + self.IMag_ax.grid(which='major', color='#CCCCCC', linestyle='-') + self.IMag_ax.grid(which='major', visible=True) + + self.IPha_ax.axis('on') + self.IPha_ax.set_xticks(self.major_ticks) + self.IPha_ax.set_yticks(self.major_ticks) + self.IPha_ax.grid(which='major', color='#CCCCCC', linestyle='-') + self.IPha_ax.grid(which='major', visible=True) + + if params.imageorientation == 'ZX': + self.IMag_ax.set_xlabel('Z in mm') + self.IMag_ax.set_ylabel('X in mm') + self.IPha_ax.set_xlabel('Z in mm') + self.IPha_ax.set_ylabel('X in mm') + elif params.imageorientation == 'XZ': + self.IMag_ax.set_xlabel('X in mm') + self.IMag_ax.set_ylabel('Z in mm') + self.IPha_ax.set_xlabel('X in mm') + self.IPha_ax.set_ylabel('Z in mm') + + else: + self.IMag_ax.axis('off') + self.IPha_ax.axis('off') + + self.image_positions = np.linspace(params.motor_start_position - params.motor_movement_step/2 + (params.slicethickness/params.SPEsteps)/2, params.motor_end_position + params.motor_movement_step/2 - (params.slicethickness/params.SPEsteps)/2, num=params.img_st_mag.shape[0]) + + if params.autofreqoffset == 1: + self.IMag_ax.set_title('Magnitude Image @ ' + str(self.image_positions[n] + params.sliceoffset) + 'mm (' + str(params.slicethickness / params.SPEsteps) + 'mm)') + self.IPha_ax.set_title('Phase Image @ ' + str(self.image_positions[n] + params.sliceoffset) + 'mm (' + str(params.slicethickness / params.SPEsteps) + 'mm)') + else: + self.IMag_ax.set_title('Magnitude Image @ Offset' + str(params.slicethickness / params.SPEsteps) + 'mm)') + self.IPha_ax.set_title('Phase Image @ Offset' + str(params.slicethickness / params.SPEsteps) + 'mm)') + + self.IMag_canvas.draw() + self.IMag_canvas.setWindowTitle('Plot - ' + params.datapath + '.txt') + self.IMag_canvas.setGeometry(420, 40, 575, 470) + self.IPha_canvas.draw() + self.IPha_canvas.setWindowTitle('Plot - ' + params.datapath + '.txt') + self.IPha_canvas.setGeometry(1005, 40, 575, 470) + + self.IMag_canvas.show() + self.IPha_canvas.show() else: self.all_fig = Figure() self.all_canvas = FigureCanvas(self.all_fig) self.all_fig.set_facecolor('None') + if params.imageorientation == 'XY' or params.imageorientation == 'ZY': gs = GridSpec(2, params.img_st_mag.shape[0], figure=self.all_fig) @@ -7813,8 +8603,6 @@ def imaging_stitching_3D_plot_init(self): else: self.IMag_ax.set_title('Magnitude Image @ Offset' + str(params.slicethickness / params.SPEsteps) + 'mm)') self.IPha_ax.set_title('Phase Image @ Offset' + str(params.slicethickness / params.SPEsteps) + 'mm)') - - self.all_canvas.draw() self.all_canvas.setWindowTitle('Plot - ' + params.datapath + '.txt') @@ -9485,7 +10273,9 @@ def __init__(self, parent=None): params.datapath = self.datapath_temp params.agriMRI_folder_structure = self.agriMRI_folder_structure_temp - if self.GUImode == 5 and self.sequence != 10: self.SPEsteps = 1 + if self.GUImode == 5 and (self.sequence == 0 or self.sequence == 1 or self.sequence == 2 or self.sequence == 3 \ + or self.sequence == 4 or self.sequence == 5 or self.sequence == 6 or self.sequence == 7 \ + or self.sequence == 8 or self.sequence == 9): self.SPEsteps = 1 self.aspect = np.zeros(3) self.aspect[0] = 1.0 @@ -9535,7 +10325,9 @@ def __init__(self, parent=None): self.imagelength = self.slicethickness - elif self.GUImode == 5 and self.sequence != 10: + elif self.GUImode == 5 and (self.sequence == 0 or self.sequence == 1 or self.sequence == 2 or self.sequence == 3 \ + or self.sequence == 4 or self.sequence == 5 or self.sequence == 6 or self.sequence == 7 \ + or self.sequence == 8 or self.sequence == 9): self.mode2D = True datapathtemp = params.datapath @@ -9886,4 +10678,4 @@ def run(): if __name__ == '__main__': - run() + run() \ No newline at end of file diff --git a/Applications/relax2/binaries/stemlab_125_14_ocra_mri.bit.bin b/Applications/relax2/binaries/stemlab_125_14_ocra_mri.bit.bin new file mode 100644 index 0000000000000000000000000000000000000000..83c86d448343889f8629542bcffb8b814a61e63c GIT binary patch literal 1023680 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 z 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

Nb^Z09S{^j%bzw{Q{pFB2Wz7*pCvhmrw zwWsf$^_6B5hkfLsOCEmP+2`>|taNMo-amct&;R9pcU=%4y6Lvs(3$PiD1-E)vI8qI z4qg~PKZ#FHTbmr6%wO1bTl>bzn>Oxg|LPx({M6)+9{I>=^Q-T;==kjR+dedP;~S6v z-iHny-u1Ds9#F-u`g&w|D*ef7;kl`_(`Dfyu)I$Ilv^ ztYs7Ugf_&6*6;q!bHDdvS5L+~_On&;atk`uqROPqnQLEv?DqRFT)aQVWMh8QvF81L z-{BbH$1FR3{DI?p-}BDD`4s)+d-B0E@yTH66FG%MBt#EmSH~xB$hQUUi+m{gWbSp_ z`rXPGkNxz04?J}NKIvDB(Aae+sn*=>A3MaoN}r8g+{EwugD?Na1K3M9mPzY?iemWn7|v(of>E*A5I=KiSE|&pme0CI9+MZ=L*6MnwMU zC-~(4kAHB|J#_50+v)@DC%K+TKP;JJKtK8E;rIvilhM=Gd@;HF?xEXmd-LQ?fB9JZ zSO4gJOXD~E{zp!GHU9x+du!!JH9mG@_4ZF36oBS z752BroRwq8>bIRgz=zfNofR9~U%dDB3%0*$5l%k(+r~^r>6(!4C{; zcVD2pqnH)P9bp@0?YFkLI5d>_<%V3w?(eVHAI-+cr<3qW&K2i0K3Z7iaS|~;kaWi# zFLN)DTeVBp)-a`-p3eJ@9_?zF{_x`B%@}>ueQa^@$2Qy-I-cmtXzSvu`d-~XO%aF5 zL810-OR--3s=lizt0?_QCr(Ot-bgS0>i(3z)KeC6@7{0J7qx@h3AI?-zWDlVYU=Ke zh2!HJ?ySZ(H7$eB7JYMz(+8j?sOn35Hul2C;dqjqOJkmg;9 zS)HeEm_C_LZdl}R`jX)r*lbtfG@iSvZu>1+y46S@V|ZV>dp$i^kpH!NNCXG^sqFpt+xiY@fBvd6c_1_=9-#pbKRb8%LD&2_u;ZH;>$YF+mmwQY^oL#8s>+uxIof zdpDafr)si3AKeW3^bIY!n|8b6@^e<*^%Jg`-?tiW+MOG2N!a_DZw^$c`QBXnvsdtp zqnK>Bu2?N@+Vu`5;>x2d;oOf!=@`Cz^hxR5HoxZ&TQ~hivF-AA|KVq$Z@c_0Pl~_o z@=JQ?zfl}0@f7ZMNxql3w^S!?TeUxRZ=K8`!i~qfxRthjvsDK@xYZes z68|Fh%YIjH9rc!_H?A3m#<1!dPxbYw%T{=`L#@6S!63kVjZ1IYr=_Qot8`xSnXB$v zeA?BHv=e2+Ja{2CjXFLqg@WmeM-FWCr`>vGMbeyj&b{#@{bXz2+MBn!=436-&K9O_Fppm4SaIR@C)WE;mpcR{)QX6xu_kLJ}H}4 zw}tgeojU%7C!c@*$oWUk?(6ICf9|^V(eZxb(;QXRKd7OF6 z^-LT)K6&JGpF4g$l}UMS-9z|7KYX>>Vg-Fo|NaBXvaS8(^C$WJq_Q%l(7EzSntvsq zJiZ~HFf+5d-|CZ!u24R@VOsKAe6n%etgB``->FZY`QyD)8|QDF{oHd8JaDvY>?vd4 zxldkv?2=FB7JsPYlZ_3vvTwsD?qaSO8>jTiYxR6+3!LbaYV5j(o^s;YmHI=Phn;-v zQopfuo5!xw{%Uxr+UXW^PKmzs9KK6({-TXt$tT@4b$TJ&RcrCIj+{ob`-r@Ev@u0R(nOPLfwB zx`n=4hggP}Cb}=qgB#P9+RW5);%VL-E(DomvV}jm0fE$KeQ}~Ep<@hv7+D5<*%E|UJl+wUf+ZzWE|_edP@PnS#UENd@zD{ zfno%u4%>BdCxc{PhqK90p4u8iVJJlcG5uAjFQZjL?~>qXLPx5KDO4>4H{0PQKXuS__1Opnt3TFo(UHaRxb)N=$;6xE||l&a&~kG$&OGYjg?+w$JLHhClWic zkYZ&p=qN~DG-9Hjcs`kbE7J%uzSn`CX6Cy}^s>+or+7C5Bk8yvL9wRx+Z;2M~NuD(U8xgHn1E zr;-vcsSzc`I=!m~*F9FrZ-@DXY1Hm@aW5*(-UguB3j-I|FC2xj>8 zOOa8xz~iw5!LBC!04U4shxwx9C{WtKQB)P6R^8nv`M2+29p+*6n`=G4G8ef}>H*8yY! zl`|BB(#MJ9g>~vI>M80fhBIqPR7rC`1{Cf?9BBqJk?~n>XtjJ`fN(BIAd){SQOb)I z%ponl46eHF7@UeCF*Dp-B)!B(RQ7g37sa4AbgsvGG-#|3yv9kf@>xW~z$(Htm!4#? zo1EA(nLGEwIaudsFi-vqDjBPY-Uzo@11EhL%M~;E&{&PM={$si5auBTiZ<_5oWP-T z0JGwOmDi`_HshcC6d{jeX)yL+zEsF;-u-v=+~r|z$-P86q0vBjk9;X>awFz_oQb4p z6uV&I`!x_j0SyYatGpbG@#b7H|)7kPDR&j%yFsxfkujRR)>BpW(l!I33D!I_6%IC>R%aomO zEWl5o%=^PUeY569BKNF>^q`0y-Uso1XDQbcr0!<~-za>=iA3}%^Pcjoy2vy9wi+5E zNTgl1vcsWpVOPr@xkpzUWl0?El9CNb$XDf8(Yk#mz{@$12qsY+T8=`qn%2BHA2J1i ziLl6g@Wmm-IJnwV4 zZ?{Q3t~WuYg(W7IP2J_ebzq_sBN8G<&UF|CCMHAK7gl)GDziItM^pwVP zrB9L}5YwwoC4?$chDi_a_uAN16u#fmA@BJsI4o_LBhG9Aak`=zWD2MSNt#JEMtj7_ zZy;pwRbIdkrI46qm!(V-kvm%6U^G-$1k>%Pl2~xzg(xv6xZ?Fwe9F;gm@(Xk&_%$94pX2*-^5WJ#F2`u2N}@a@B# z>nx(1uMbgAsh^Mt7A*@{vHbK5GAF$<<#k0z4AtnDoMF-DMFbUZ)%wFYZ(#W~w-);B z2|}FG+`x3YHG~E!sA{|eUdquIy8Wc&#We2iux=`vaI$^U_~DkMH8f^LZ#%9lZI9VD zqV?mS-&>_2kAwFID*>?t^bY!mWBNAu-TvIJ6FSXt@!wO}dIL~4M zUIkK?EE2`qG^Iij|7&PjW;9Bw&6ZiQiq&{o;dZo?$gO_Fh<;1OT#eR%7MQyLQxk3wEx{p87-@9* zl1@T_bQ7_&k?`evqDnd{H~Vp%1UchqC3ZSvm`6y*Tq9z)sRncI4^vbPIg2O{>@cW) zq?r#meSIkp7#7v)Ty1QfGm7-yZ!Mn)g)fvhlqiOQcNzlrB zVS_j@iay1inxWYp2tOTQhed+!;3GtnJb!DlvOGiB>ZZZo!Qh~aF`Af$5Lwnw0`JBA z`8?iFMkQ+ejqVx=B>4&Gi+Mkjk3U_6m6trFf8Xz^Tiv&NX4W;)ymw}9Rh?6(PMxY# zRk!Z#s#`no_=VX-(K*C}2lA{IiQR6(Mmi5nmWE1FW zBjYudRlu!6TZL2{VBQ8A0n`!4puvzL)sybQ2aoM~Jc;1L7*&1*!WvU7Bp9!2>&>>Q zC~7#VtjGKT4RF)NzMXj~kcPE66wV%ue&p827CNJ2D4Whyl{Km36F8CXTLg}bBPsxh zE%+n1zQkE8QUWDlbV6-eC3y;5Yg<7LjKbBK5k@ORfkCKe17;w^19F9uxNPK;JUeq}sx>8Y@L8YfX2l$0gV2zzGAxT@~!A)I1To)KNxg<14fkcV5MQ z=HuUj>7z~c7>|r-55-L;nH?2dj27$Y6AriU{bM4|;z7lx{fnj_(rot3V<4%ls&Onw zYGW~mfQb7wo*DF`B?y_c-%Md+3@ZpW=b)Ep{aFwI`mp3;2H{xz^R5t!0bw2&L1VK3 zvM(VxgOMGNmQiH!mTbC#%oE*tK`sDIqJf-aX%hT<_*0Hu<;WmITprS>Y>;US=g@|{ zBPpYyz70*qg4f3{QiWB(id}`el2kN&qQ>h0DIO;m(yNv+~A59pkiu z1tz6jdZ#m>)8lWz1YnW<5cvbgswR z)GFF*9osG7yLzJjN?fFYW`w6&jelRpkAYn9|1X4UTC`3qQZIzbw3lQC5+CrtH(8?? zT6$WX7nzpm0BaU#!qm7Ai%Q87No_GJchIc{1}B@zSK=)~61+(>`k^{3Qm zT5^$mTFFj02XfP#T@NSYxIt@u=98$sJi(wFqS;35cM0;V<@rKb4MYT)AZ;u88+dbV z6)NNI#xpV-fKT z6kglkfkm?Mu_J>65WT}}9v<6*_+nhH#WISN!^4F#3*x}W*#sUcBS=@=IZ0gUQPk>A z-_9jMs_Wxf6Pw{AnLPr&3>;EWk43?!t5KWj@Ng1u+PoPo!*}6A^SKSuZ}p=9IsA+Z zX_yR~E0K#1l*BNO(pV?og)M1sSCq~v32^yV3rA@qR0AGIUmDH!k6kXwOM4?-&g!s% zCm~-4I4x8MX$>SPzj*d%Vp&A9$J3L;Rv$8&;_{6H<@Cm{i0odRm8+^lI~;a(N$Hva z<4#V_*;C+ZXhYV-ISg|0fdn^t-Vb_61VDdBzs6_RDyA&^q5i#xHXgt}r?h{3wr*sb zJbKdp;dmBZM%;Bh_*R?P1ck9or*N0p@nH_!5C-k=04naTsDJj27`tv~4*;kWJd9m1 z>8(xyqF4XQVgwCw0t; zoRicxL@=l(M(Q`s;tM^lr`ChH?+%xmvUOKpu_=8f9zv;V(!*}#4lG7JmG`or&?ZUM z9r*Nq_k{V>r?!4-%lO94C+&G`!JNC@{Qc>_d)gDTNx9%)lXaCyb`K2n#8xdpEBuvv z+jDa}`=3CVP&i(d{ci!=XozcM^d)&hBKmO^1SKj#Hj~(mV(07HvCfWoK9Ekc; z$Sb6`4GpDnwfNX|?{`;?(IzjxbK|Lldmg*&-93;%fRHcL&cHEjGIgr^T-TK?F zh)+B1^yf}0{P72Oj6Gf}#5#7N>mUtmk`%S8^kQO3A@=rLlk$dkKRFd^xIc8~M}K4g z-+b#CwMhb-)b859e}5aNP4=f#_x@(#^xyd(Z$A5(-#q!FzwDju3C84bM-S0ZA?FY%ejv< zpW6AzjSHtAxbm;g-u~D^y64Z2)OUXGw2%C7=M(4lLuEA%@ap`CVc@P-`Y?6|yaL;PT?eg@}`%0;%f z_sT0L1|PzH#)+`NIHbuIwT88=gM&wp=50bY+GKh8ExY_q!lv}f9Bkq>$lGKP5X7!k zr)iqEe&BBVYuP01r6`q-ZrA z`{+X3CNgp5m2bN2*s-J7bn(a7r?tW+*!4jOwTYGU%_pC1Yr%EZ!6t{AhYoSYeDC0{ z%La=_wM7M+z*4;@ViS?8u4+qP8NzP9qa4$^Z5nJ+C`2!Gq-wPSPu;(P{p1kf!V8y| z56yWStcfFn{iGHDud>O54|*NGGX$x*{I)U9v~k`hVeER}`!3ssoe76t^O~J=z0J!m!&l{Wgv;9`Usv6A+K!t$u1#iV zp%09*cKYMnkK^E7Hu=enT`O!dKJl`h+pw!C1MKS@{MFsh_HgX_FQ@Lj zVuej69&C_xebFbtzQVAdQ1=^#y@1%Gr?42a72_#~D{MxJ5#za^koy}G&||z+SdUpA z_^;cBABu^G{fXPMbklgS0$m~aVZY)g%+v|v!k2N_cQqoHQ0_}I{>;NGZ?8uk`OApr ztLa{h_ki{FcT8>jLQUsqOxum~C2XFq@k>ccSuBeR$~mD-Int^@*2%PlJ)Za)3(8K$ zuVZ@1eTqx)lm5hDO>=pDoR~54qmGU+9(2aHeO)|()FM~wK1E5mFOjp)un%#pF4r;M zVt*qaJ5IgbKRYuX?<^DU<-<=wn^HVeBVB?$eee2EvWNQ|u~#oS$M0jL1lSS)J_W?T zodNg?kfZX8_2jw(vS$<0VQ-%p&=rdK6_9X+Q%@{j<1rNEJ+)cnTJB#g4O}*y?TNgW zdm?jq*ee<6>SGTjeU`;bZo64stf03!d?=LN*O{+Fjmh>YW@SlcfTKzAr(pQWIrs_a zUEss7_1Mn{e}ikkmtguZ3^uX1nIm8rLrx#+T}7wmY&RjfI_F)>+rPZfJoIpD2KVg^ zGI-V8@}oDrWA5(RRc2o2PM*Ka{AHpv!M%J%gVv88FwV_4N>?}MEH5efgVG#q&1gin z`tFnCJMmyB>xrl6NzcxHM@TE^rju#3tH?jRoFZ$|+5clxVl~)eV zeRRXCkACgQglymb<2xx$q$!dlerylX&wsn;JALa|)v7sd0^b^HD``Mpwu4%O`hKQ>gLm5ooH^~e)w>6`@WkWet2@%-tyjZ`>r1N`Gu7-292QS&``2k zKf%P*|Do18Ew+7IJSXjbvd_uj+}+FN8}NOU)oe03IidYz0{w(_V4c+PVyCwBqxuOq zRp#K>Dq7~Ej~i^4<+yBXMmDi~__t(WML!wB<21jxfv;$6|8#Vu7!-bZ=qLt(h4|HY z!#jxYBRn}I+b^=a3gfdqfWv5+9s)o6N!}*Sq2=X#t?wR}a%p0Ds9lbHEQX-%J2#wl z7W!)jlS{P8lgl^!)>X&13Hk|>B={8@CP4|0KXzTvWs@%qhaA`Te_H(nHfgSElgT%n zckCE#vb_D7^S-t@)G@voF*wou^0rqGp1uKdv1RPq-Tte)VH5O|!-rv$G=8H_MzDX- z`@F*gT6l~8zcpX)<y#H z?|!b8IZjzdSe@Nvx-OKB1qO7-ufRRqPo2+X`TPja2>udfwizoB;gFGsUv!pz9icXD56IlX%$!QQyPN3L~ zSQR|ah{;f&icy?eKMLv+e3p30AU&=C76GGF#uDLEh=wW5Fbtnyc-4&e8Mbg*U}Nim z;Ii;EKrLEhz7lhemM(|4f=Fdshz}6wwE|+LL~voE*ed2}G#PFj`0K;0w@+i#F%-p> zR@9Er<^$c6GP;#%@Y;+9|B9C>cc4T@x&WH2q**JxqXyZ2wgN2AX~96nG&_S($>S~8 zTFOAFEIdGL;TT->2{yYJZb8gcwuMGLIit17A>M>Q-nU54zZ@7ZvxCOyMLKP8KByiX z=eP$44(tL2yza0aIIUD{ z*(&j|sg7W6zOY_HO{Kq;w&VP7r^H)1`$(sr$BKuY<3RAYW!}GYWmyvr(K_26g%{IGRq(puv?LECad&=4tRENaNqM z64lwv`vdrxRSukn9a0eJI}Ook;L785jdP%OfMrb^pCOFpEW0`tLJc7f;9d2j2znD| zCAR6L8Bkbk`UDqq&3WVz0hvkKkTBRL;kV!805t*x9;S69c)+jBxJ9s9Z6F;$h!vg0 zfkNMLc@18{ST6`-5-t}-M6J!{fG$Qgcp0F~SR3m(xbB^c&ouUru$BmbdSZi(WQt-{ zbmAOC2_0JjwHKcoM&7ds`h~O>acwAS%Wc<&b&^0(V&O!t%?EKR-v&~M3%-<9A4L0S zC(x166dZUC>#`&n!mGkXh((Q0am^fZEo*WsOq<{gNARNhxSAOuqaskXWnwLGqr|L_ z)DX{cF{H56q!015P{Er(Ya+t}#h@3EqXPvTcySuT^W#y91x7Q9Nrmr6A!Ecgpq<-~ zZ0ur+x5xKkpi zpyNm!#5*Qp|C=T!>Bh^!A)&x=#jRvyV7#(1Xz3^<>T-7?A;GJOC zV}+KXYABAGm3bt=#=3-BdaW2xnQXfxd!a^i1nO|L!1++FBbZiPJAel4HA3ZrYEc#h z*o<-cc0&w+(Mstug))F-m8y|bs-nkX*P0R$?Z#{XsSG1_@mt-=a9aIc= z3YCQ_D9nrD=!btBO;Z-y0Dyg|&jL4$C+^@{WNX#W>LCG=1M9=u#u3cN`Y6X5jm&J! zC167i3Ken017B+wr*JgJh~Nk&lT5b_SVrZK)( zwrDQnaw3RYDK{#CsG|&Hsgi=pe2!*qK&)$HK15|TRV34>X7Ibn`Za1!5{KAqhPH&3 zI5mT6nirG<%>gb0tAptzr-tgc>rq^u!B-hm1pPBkt7$UUTx!r;U^L_-$NI8;kdR}j zUE&4SJU5vQcwWViRZHB#n~tW% zx&d>U8rKr++es=I_c$0#ExH3a3`!aT;$h4s3{1%pI~4U;h@Qb+E4DIzPt8HI=sKQFSX_$cPn9oXWN3^zFpsqQ z3F;(9B3fZQMYUi}qLF#sXM-vU)htG&KISoSJD>pk)X4~d>cEs{G!ZibGKL~NDgZ`M zni%&ZJ9)(AYLbO^cI zeLsl|=O`q^uu2@)84O(*y{5!OMcFhai9?hTy@i3I;2gAM8xJ@+oMu8F#zwZOgQs~| z@ETk>K(UdQxJD3aEtf-oh_2`?ZpS4m?Ps^pq1>eYe$P4gsmY!9Yf$TD@ zOU!oIFJ^%FR%RJ*En)<12v-}}>=e*R;Nyy{+6B5g%~h3F2l0SmI#H$&g4o4lNhmI6 zZG2{4L{3X>fRf**VFVhf>QDd@Mr{M$65{9^_+a9`afc9-giO+ZA{ObzbG#KmGD<<+ z8$MGy2S?L!fDnvW#EqllQzwRL9o8?GB$E<5O@ZD0o(*mQQo0}^PF>ob#2AzubC0kl z8lgG{58&~KA<`gg%sUNy9RGtV*6#}e0n{8E4CQdK0|<}~r$zs*A7U-g?2IuupV8Cs zEaEqEwOBO3Dj>a>o!4uTH#j?)fT=M1tp`KRb%B90V#%V7ks~em@$m*v}#l6*B zt@1hRhxoN1D+r>;pl*f*Vi@;);;h;7wjCH&m1?-h0bte5JJgSL1N9+cHjCozp{;pF zRIX9s3vcap*s5Q zWrR`97=|1LBW6Cw_m`)W>eG>TbhJ1|JxQ6D@+elokRgLsO}nv8!x&Wjk&9Q0#Q}g> z!wjq~Uo}w7u2B+lKor2z`7ywPR}-#G)7?+<#qc%jQ|9`KD>hc`Clv1c$#74W5vnv_ z*G9?O+z_0}`ibD12#Z;Qyw}n=t7nI~SROvx5^XXv`-v7PPEhN9)mJ`+@$FT+s*5xx z*H7AY6z3AveR!3Af+mvVGi%jwn@9Tzo+1Gb+!)W=aao8(9hG53wEIctft_fl8L#$} z0j~vVt`*}M^7`@KK%RNyd}PiId`A0;Q~g%J&3p%$Wj*TSv@Du8N`~B5&wEU6XI#fHmVY$KhkX<^<%C zFI7I3mdp1QoZGL|@ha7EMlAS4QTTl1%OX_C3jWLavIw6Z`4{+5U{ntB?&J#s^L${X zjvexTY(C#x;Nk_X8AHb%RZ2RB8*18dL(!}?a?D`3@d@e88Xs=EMIEb+nBo`~#}Y8& z7~9ov8I$0GG$X@hvLV2V$b-jppQ9d%Ki6+F?G!Ox$cWNA`PQ96qAxRb+%&uiwT;JhJa-fmeB%ywSpgQ) zUs#Sd7(*n?R@{`mrtrL!r#EAu+A5T6A&OTwXtN+2j)Dx)wwtLXj}gkO95$yTP5B)wh8x%&08}I=}QQrIqr=C=YNB`2Gm_ z&UW$L#`j&S;kaSmTeog~-Gy6k*>dioLubG0+%KQ`)^pFz<;_BaZ#w?W*4J&_YU4K+ zwnFB$=T5)wmaV6y1Nw(qyvjRIxTJ)4Scs0P9`7F z>5ltYj&D6){>0~cdGWUR(l}SwYskx zv*TCae65!^i&V2~$lJYp{95pxhkQ*JU*RO!#H*+>fBoj0Uv=}%H(#}RZtj$uuD$H) zUw+HxuDqpqwY74ymie-6*wQup%h$@D3vWJ$1D%4GH&lEKWhvXs#9A!%2cNx6(GGd+ zP%I1Lz<2Yu7m-gPNaK4x4?9Sox2d()mLuhxfxui{YiId!oX>*!v#b1d%gFI0xo|gI zUeby34X>29-T(HxLOKU8d0-{^$E1Arv&d56^YBpt9`Ba&0Jt9TaZkV(h86E(eBiSW zAWnI~2L&}8m_CO+a-aX)=RWuU;(F@4hrj>1&oKt!|NhzGC%$N_rL%BP?o2kdi?QDzNb((p6`jr ze>!})TlslRI9J5}EYB~2UE1fL=&NXt#-F9qKUKJ!XR}=L zvxVOrhM&Vb=$BmT`N8+hM(6^$`dKje&-8g*&twTW$~ffJP&dxX48N<+GCb79TJd5k z6y!dK^G@K`8{T)$pMQcIr_%8t?)`vg=bbRE2Opo7Grz@`$;a6s&Vh4V7T-DpM9w5x zjJf|a^b!BX3|F7wJd{nv5YPB}7zP|;rOdR?Oz~&3bmA$}`~?!E$omVZ+B{DFKo`Wf zaMF?P0nReve}Ngoe_tL)9nOOs08?tMQ+$yAeg~ps*)`JRp-x@9j=JKN`Nwnovw+n^ zbh8lD^dT|$Q&@sR8a5XGl2pYp1aQV7&i^R^4g^4g|Jj5-p-){4*T3Q*O1>%sZMdmD zwQduAC{Yh-VojJugWAGdk0TV^hE{x=2vzVS%DM$%rj1i^;FF#N{grC@dngVO5|!ov>Q|ogD2F2D(F_t_VX;YXGx6rDTplD(jdb!K&NxJqj29 zF|JlTWQA}HG9eU@Z$130QeO}h=4bhQ5@^b-+#yBwu{R&l;X=0ak8b1*mg-T8Mq`G)a3zW;tk`Whc2}^czG1`g{gN6d@F|Z1pu?j7dq52?Glb30f->br) zRopkmF@%jcQVbn{QMcvfC1GIC=z;2eb@kl2b}pm^?v^nAF5W_v!K1cCOm)#uFeHCz zlD5niS685uqZ1Psm_auP>y<{#IB;@_myBen$*4h5^-&t5%D^saP9*RU*tleY;M8q9 zeiRa?MFMk(hd9W@)o5D;7}nNc=@WblapwGZR$hyy{So~3_F81H1y@7H5$zBn7&@5_ z#*;|N%J4gWJqIZYV8~(uMRAj1L1-QLSVm)9z_WZb#yNN+8tiaP2bLkpYDB1gQ1!9s z4i;;SY(>Q48&J3qLKt;z;e(NMzE6X?sK_bc`~ih9Q1oL>gfM?PWv`AbJYG6gowM-X>pv9$tcubZR z$Q(gDb+({TP9D0@RutDmq3()_WxeWGvhdvjP?9N$~)zn~>5w8l{g@Q$u zl{AFqKk%#iJDzIp8R%Y*1<W*8fL%||3BDB>?ZAly<>=mYK0&XF8Zy6r6idSA$wi(S3;9OH8EXo7SAjer8+XR% zvvrWsu}$O9iuLjwHa`^XZr{KM?!`Oq&0LrBy zuctLEEn$ zvRZaU;83U8P+k%>y=5p&b&4D}oYe>nB8fwc=d(6u(6Pmd8(zYNnmGm64iGquCR!zB zEU_7jjqH|jM^;JaQ8>%0g&?oo7JXOG$aayOqKZQ%RHF`48Y1RYZ;Q5Ol~z@}?9;m- z$J<7uz?CIo=r~|=aST(%85je8;LW$s`D2R2pJ4lUPy($bakz5kiJyk_43HVo~ z;VU?l&S)r&Svw_!nO+Z11(VY_jIrL&xdw3!#{YOOj#xYPs$~j zT9X67Qypv)tq7}f@Cj5jP=~W15M9KG1dkOa#oN%!2xc5DKnnmwhkG<;Yzv^4=FL(T zuBlJZ^%tX!vXLozZDjEI9}uDR7%6fo-V58T%Ah;atNt25G|)Ww0)e6d78jsOgF+hf zRtUb$aC)9Glb@q^2BDug{82)JeKe>Py!~=$Vx?YjcG_JeKQnA=KGDb$#?azS;!ui` zCowICYeNiX8?q_JSqM`C+qOcZjofc*q8vGqmGL5 z^UjDd4)c{_16k{X7o;d$qveNS#h49&gA~9(JgOi5Lz+3cMwBW^ZwwJ=jgE{`^9eK@ zLj^(!oF!Ce39?)n7n37VfKrw=;4R;BBz!y9k)yrrvLQNf@vz$wT`Z?ylOO()8`l4doLMk& zPdr+W-GYM^a7qX(81g81FCa$5U4#Nh zdaT^#rok~p+)f({ACDBSC`+Ku%H{AO6Cp}LBZsd%a5=vr4zf|tJAT^Xq+*A~ps_7o zdM}4*8@UE@x+g}p#z`e{uyar8B7W1iAbog(96?k1x>0>w(jpuFKT zbJiCXmYwPAi^V2yOL)dlDQVo-gFPElqn@?x{%H@wF2l>}L(2o`001;HwtqZ0#2-M9 zrynDO#W*P;mg+$Z6f90D1yIb?bV%og8KtYk(u1DBV?2GzSQWHL4vgyrwR>tJUy<~_ zvATPSTzqNLfKvDoCutl4+d{Od;dI{XGlV#cYtbP!szIlJ8q`*h)IjuT2pHQYfJQ)> zIMp`@TF%hO5mTiY7XTed#2C!`NtB{v(cH$;K*3>T%9vEDV?4lN>h635>eM(H8yOhC z6n86Q&gDI<18!`6zYF3`M^uJ83XhE728&t3xCnbRm`9*m%I{9E4i02TH5kx49{q06 zGUbShI}oBwFmr!nBTde6k!&l!ovhb!=7Wl0-6Xf6(?E~pQF`JN8O)%;0U_3AV$gV6 zU=dQf8{xxU);LJbf#t13iuYoMhk;5?W!FZ{PkR=}Gt|%l9MA1Qv@QjO)D%B2MhBrs z3>ppVVG2fNdOm6c)LiqF7Za7(!ZAU9%eOwZg@Z}FBpre&L&-C7?i2J!M%_C_=(tCg3%_3jhh#Jr`6IblD%--U!fv%E*!*K8%x6{+&60nKp z^^%%ncgVno019!nQV&XxW%bk(=Zr6!))uTZ6)(->Zp2%2DRN@<6$^OksCBVexgiQx z;%UMCKK7bnb=Ecf=4H|-p*uz99?VnwkqTgCdRhZ;?&mWRaVl!Y98EnD`m@Eayr%G>v>k); z<$WoPIXqv*jRNL%{bR7tnA=Rg1uSdtPb2zR0|p;utf!zGiNI!HN63jXU-A9*2z;Q| zeLihPjvtyrw9Ym9iYOs~ZdQEsX8=m&=o6f}>LAGSI@$r@9|K~FNss`ZVfTXXfhM&E zku@g-Fgdi#iXw1Ep&AA>n}F(R&UVM^+G=`sz4AU7_AVtD@qZm?d-O zk|C#NC6!yneOlbMs^arfy$>VzDJ96-h*72%Y*KZL$hvqyDpN@6PPX&K{t-#tf%R#O z_r=v({Cjrb3Pe@VZ}FGGYq%!}-vQAQkHa;w?0|<2E4rlp2q;AB02OLg8 z5&6hC=n>yHI9in_Fso>sgMiyu1qB;HT97CYzKf!|@|q67g<0{`;* z;YZiWwshkw8qq}{Iay5QZ{v99z}2TrV@hm~;E=zN4J*n;4F|58xCi()O55vVm83Bw zhX*L5q~j^>i;9sFpn)g9FtUsatk*K+H+Yh_ylS}6NUSN_(PYMAm&p~qn;(#|aR+_SS3(;3{RC-u3&$iA zmlsn!P>rBSg?=ZdI(s1H)5^xwopfO_X?!Sk@868iPhSCiCN+&J#xDH0WNt6WOF2eW zF&C~2(k;S(Zpy@X5=MIX7~4RH&vR73=Y7Pt^w1Jyj$@sH8Lq3s)O+GPqm#^fj9nL4 ztW16_?1{5tpkQ%Wrd=#XxQCn@gCmu9biv(LsWhCcHtt@${ej!=tJa}WW9T6q4pM_n z02N&F&P(l!&pUM#HbF{UEm*v-$0fI=&$+*Q=5d^r@mO{2>*t-h)TrqRZxVm;$T$A( ztZzOuzwqDxo5Zlm(fY!%&#yC2+}L+=>8g0_iu+vsuAwEoYN+A}n~K|Upj!DxrBZRH z-FV|^55D4xgWvzb3$NI9$*;ZgKR^EB=09z{<#kX8v6V{5|H_k4^rMUY`_GO{yl1h$ z-^6Ff#o?3AJ}6_=qX+uax-*~J;_moVap2IW-oE($NB&)Z^`E!g{>T^pG#WjX zOAzGBO^`=m0oXfZ;=CKxPs9B`Fypr5#tZ{Bn211~S1 zyZrbC*Z$&7zdrZn7k=T9f4J<|-iNi$>M>N&`-vyyAPan zHcId(Gxd`mDXu&CCo>;@|06>^)$d(%`|tk6n@8^Zz|6-U`G{0TK6GjEclS&5d)3*+ zp8e<-)y3Ma`|F=Jw=UKC&xTForKJCC_LHUB9sBn$jZ`iCx}{Be@(_~yatj*X z@nCtUo^sHf7+=P7V)NTiE+5_Hn!Dz@)BIGHX^XTLxZGt%cjyL08AAa`;j9vcH-nqAkn`kyC z1gC*Cmk%F4dW|%9?d)Qcf5Z(0->b&ogj_f{CpVyhwCj@e8zyd;!$lWno`as9HVJh4 zw8;(l8uNt{ZJQ9ks)y+(AZre}wEPpa3EJeYLuVa6{N&Jt{K6UU+!D%g`sRUw`!Sba z3r@r)I7?-PO<<>0Z1O*!3Hf-N?7|n>J8iP>ErDZof9b}zfWu@q5rIwq7RTa*&nLGM z4Qi{qX7CUWOS*9In!y_;mYX-s(Ptf#uA$5(H%#D67tpWjAwM{PlP~x`0G;@SpkL72 zrhA)s{KCPOe?v=+jzG7PXp_5|XYDOdPBxdn`-y$856n-0ZF2JY6|F49hHs*`@$L}E zE}V_jO~$s2)yA%$yF4)ZvCG>eKX$$IvcR#rzqFS&LC2a{e)9Q85%>=K$x55_YVvE) zL)bsOpSOwcLEiQ48>ctHCgf+``gFnnK}PpuSBP)(dpW+pA^i#3`VLK(i$PYdgRHW@2$9t;34EdZTd{Se*EMoYi~OfJIZUHtWDpWZeNd+EQ|CN{IL8sU#-wonPczF%iC>Rrs{IA-^h&QWxAf2AC5+YuK^17Fag+eaC-PI$fw&w`;Go`1qRpkDRt%o*S+lk5EYv#mK>jj{CtBT537`2HOxQj2jjInn)q`h~P_Haj42~Is ztUYJSx)~h2xo0%<0}lVP3;(*d=i|xVnJ&MBejnnQzRk~c9tZvUoZQO--|%A4!uz34 zUt8xHF3DJ^+cZ1(B&)+s*JNb?ejV$MWnvu%n3%W_rNRLMAYh!B;N5MIcgl&QgA)@s z;6yvmIWVw{acZrv@#B21xrw>KiAl__c#a%SfXXuP_o<$taJt9K4bJ{L>qXJz_~baw z2a%&VV~VMd;_iQxFmd!KrwenZcmYiq$-|_acV2eu3MBZy*BS|O#I9gZ&(0oC^8U~e z@8z6-d7q~$bS3$Tpe#FKPzEP97bnMYngh;y!5vt(nBJ1eOF`daO1*=!Yj$!RQ-=&_ z6HIHCaa;n&Zneo#+!tw+<>gMBKzgX^ki6wXAjWiW6Y4UU*)p@qli_rackh0%_t059 zvxQpB4XRC=YLjN(COhVQH8r98?A+;t#Uk}{-M3HqKSPIWX|giVgiY9*1_!-Qo9vxH z3;VaS37XyM8z#rUc4TnkST9eVd(ZCPy|BrlIeF#FOAih(;ImU!|pB}H3?#Iir7Tp=Y ze-SUrRZfTxemlL7ueZ`?`WT4vaAsY7>~r+DmW*uf|4bI|;NSF8>#+{EQ%B@k@zHJi z`(jc8y(97QkTdrmFE-ST31tuYb^2NtDyNg)A=)aIz~yyfV8v#POGcc?5-_|=gv%=c z;y}f_d6b_iEZnsq8{Jfg)&r2~)@eGI+==`C2Hyi()S8AuIbvc)Ntv&di~!HIgC`t9 zF%k=IUU^^vN%d|%W<}T;JPv^hFN38JSmEQNpUS%;LJ0}#YZ{l;OG&oHiMk;&j$erQ z7Z3MjKi}Fc#`fTcbnvj%Cz=bivbaD6gt|3EJcOF{`g`k?L!|c`MMDXUYxkzaT2SH~ zg*?iaapNWeN(P35a1Iajm422w@cNurvaLn;oZP_)2{x1p)HM_MS!J{`i$ICv)zdC& zeVUBT!1&o;wg$my-P#~#4Il9kAGoa7riCNXdQI52lcN9kKuDozr^DsOIk34fg3Q5X zq}2Yh^s?p2Z9Ee_;>@>69D{gCTO@A0;{ljl7*Kqcb+kUAV*=^#&I2{E!wDi@TohHR4y7k*t81nD8|XQq?@sc#Vk+ zT})SX(*Q#@qbL`VwSnvkVLlRY?`t$GZA!RL12Btvxfm44_SM^q$@CN_)KjPQLtGKOsj4rZ++~3+A{qQm z;u3qNU7T6O5?FkkJaLKR&;pGkvaQEoQE?}Y7%7ril8RS@3rU<yXHz zUW%v#;E6*G7)?N3z@xcH0we>2rNJDYV#UFM_ANE(8^s>27`sCZO;A`w2TLMI=I&fD zBu1d5prS-R92uC1-=*Ut;wIc@kPg`8h^ryAAXaWi7+uRJLeLRc>%gWcl51fOrE+{A zq{4=OuqD76^+HNo7-8p$bWJYy!r?lj|bNZ855#Wph0#ktP+43WzmT+ z#yg7j85oHS5Gl^WnMb-h)A|XsWK@d`28fRU;bxfAUtHfnDyTS%%{eaP8ugKX`d z@p33W>TS zaARBz-%nUT41{na;jc4O$`w_x?P#2A*vH5Po>9>yW5C9X8{;%uOyxSQkzOpQE`tj) z@X8CH$F;Ajek9F^FpA&>s7F@i12tFna0HZ20 zL=FI{mH`h=l@D0nXKyA1UuCy(j0PcI+1gGcLbxBTCbsi4>Dcfw zM7l1;Drbz@#Q}rr=xL`#WqKgZIB``~821UZM0`@!h?_=?!xdX;4CCg>$_G|L(cJPcaN$mIci^3JxBJ-{)T{p92|SdON5IO(LB+3xL9(11AOK#>2E-M!`X`TAUdu_ zW8j#UgT_AKFoGkcGgw?zN4vs+d@u7xf>idipDg)Tmamf@L_&BYrYDJm)9MK^`litc z%sd&9-Q&5sQFJt9fDB$50w5T81k-XbbpQfo7_EK*?h2@ag6a^dMk6E9U8g!z8EHiK z;E@|yL|B8nF6zVatEnkXEy`$*tiJ^JnS^z0F--$#4>t4_g+IgW04zD^hJVqR2H|)} zSO5Zw#qz$+$ddE|-Gn_V+K316<1^}JU?47x8<`)&7hk3!*g_ZfEWJ;Fzlw&CV7K2! zQUI8_JLq*8vp~uYdsUMi zX|ZC(OrurAuCY{jn@Ghr&}GuG8jP@sXMnIv@%n&Fdhus^H%98L>DM zty;ncN93uQI^&>~0|VgQr^E5OC{73CU7KP^v2+Zs_z--@SnybQ-QcCqT`vhu5gB{{1C1A(tbZmlh#3)cE4E3&2J9n|+%#`kCf2a; z44P*h2shbhkid7m;P673s%{KEl3~#BpsFTrikPd=(U5xjRM(d8B*8jQMt6V%mOwZp z6){|5WOQdgG!0?_9oC#&OXHF&&YmM?wm6FBwr=bcOi@O)r&G?KwniIbIdHjfE{LoE zZIk7qess{eYF3A!mG6C3F z(0?R#tn`Xl-xd)K0*pkL7o6~Wj-n(H$bsYv3751x4U*(Tw4n(cRwFYf5V78ylynph zblfq9+qAJrH!eHz*4Ns;{wSI$_Q{Na4zX*En#4|kDLk| z)L0kr82}$z9;yb_9b33o;}J+>6hDqUK^d5TqGO@WhBYc+i__q-76Qr8aM5&ZV1fY9L`|fR4MkCs+)$K6zlPe1h+1x z!z3T~lWwq($2dap)fUi4@$CH#qNkPVC+y4@osE-zP6!fKfyFNzVp(n&;P_{aiq z>RN2WN(9O&MvH2FO3@Z^xmKgS=C3w`wXE{g4Dx2S{Ru-Ru!5OR@h|1;C`lYg{r0t>U$i9FNV(2& ziT@Y%_rQ%8N8TnPQ${u(c?k>N2Cpx1*0lI;qM^LA)Jl}`duB{*Jy(YMT2PWxlFiaB zrF}|m@nyoN=m*&rca)lpCo+uCtYZwOU5HJ>t1R53wU;6aa93M*PdE|xUy|lTZFh(RH*ZC5|jj$?BZ94)4$A91xJDTIA znF!tiJ)GyCmICU12TwT|=m6J&{p1lZA7|vDEYP6W*b?(um&_7$ALL)N`>4k1kpq5B_`*>fi5X%P# zB*?eW3wL#b!DXFq>l%!=LSSJfjv2sj`9$u=tCQ@H;@W|PP1B+2K_LqkBsQu)di|^>U_bc+vLUh+D zGV&Sl-}7Fife9*=zNk_?a{Vt=NA8Xw;<|MYmLXF63F5g44pis9(SuEY!*|?q%J5zF z12^9C*0+A?UHi6t|2td%k6$|S&%2)b{&)61@^kO{k2l`(o?CAIxtrhl?mv0)Yc7B5 z@b;kpAHQs64MAqq?k8#!&Vu=V)!PJP0nk2FL1ks?<4~Y9rL7IFg81n17k===|K|s{ zG#3us-E-^hiR@XpF1(c>hbU zYQB|aA{4%fw|=zA*K7MnKEBxh^@TLK$d6sH35E#N9WL19z&F<2d3g$(RHS~zSk5M2 zKe_5{azOg0k)Uy#w+S{_R-)>WZ~o%@-QD0^J#zh!+(10=HGh!ojZT!wa@?Ko~QnK@^63rmbcz=;mPlL^7UJ9+4o;A z_@&=^>+60FDYbs?S?%ozGKnf+aI8btV$x52LAkA$C@h5Mlb^UvST>5k>6RCouiUq% z86UX&j%xLG_gvwQV_$U-Joene9nWn4$^+{bUiHaa-@pF@>2nJU$DX+S;Nzcqs`!RzzC z47R9U0qo7{qWo0R!NKwIa!;vO=6Y9@ml>~1<_2H-(zXig;!>ehx&p1n18u?;=d{V- zpziC`hFE@<0i*DlxuOZS@-Ct{O}oBKpwuy=Ab)n4-|naJDZ{(JWp z_U`@Oy@B^IR+@9Yd~<>}XCuqSbn7u|gNW5?R*0zKGd?_S!3yF{B4Pd+)h zLdWiYaxp|rg7~%KQ4Rw~*-uc!eP3E`9#orrH|ns-(oo28Z6EFF-?X31&Fz}qdl>8G z2al~NFSUIBIqXr$Y4rT}_U?MH_xbxn31}0JU9<`ID;^5;wQPd@yDMzc+uO~}e&zr6 z?&a9Uy|&A8A~xZ$g@QDf<*3x1w}}i+?)&z)n}>94ZQ>mlt^gZOVC?$0wn-Cve9DLS zV&A~ARmZN+KRP$qs%R8s=M^Q`Wam1(epkSrI^DAue7tm>n#SynIQK1rPviZ*#Bw3W zr|AQo>9!#q_waoVAKN+~zeMwOONb9XOm{WROh2t9PqAKq`P!oWFi;=jWA zcr5D%=D{*hCgX~bL7#N`fzCaW#7`7Lo@?<3`Dko6;c0Db20q&9Imm})rcZqmtqb_1 z6VLe1SxYYO#H;Q731d-6x10q6y{Cs8fw(V>e{Bfy!EeX-P@pe8?RVxK{dV)=X3qwG zo`5^AU*9|=2cLVPr{^ekk>RAKV}kWu@7~*N&Gf36)14@AZyV-qSaK;*4Lt=xawp4IMh`O_%i?+f{gY=&MKGv-{yS?~J??=kN7F_fU5& zJS$e9A3p5&)_FW|weKr|uN~tRIWoTMrOl{E_U_&J0&H>=dra#`k2XJX z^anCg{?7ByOLLIBG+Q>g==5%hYvV1OV29S)T>tu*?|upU^7dknU?!^hYSifR|$Ohj* zQ3&n)@L`T-Xb=Cwv1|F;hh*@TnEbv9{RB2Cm3F=`F$pupv{duqV?UIMH+}c{y-SG9 z_mj7@tP?a_+YdJ3PR6yl{`E1R*xzZBqu6yjA>+rsdgMzN-+bBW8-h*d&id8e&-Ru| z4?cMM=2yPFy>nAq`wO%EhijeF*y0O1XXh}^g#C{hp6%rulG&GXpW+JNo{FbD(1R~U z#oKyh@@@8Fl)uzd5PksC8}_E`%th$K^Bg~@L|a&oFn$~=Y|u~KW#=kpJe2Lver)@J z|1O@}xJvvVtGsqz0oQXHyZG_bTwzH0IenlWVSnOrd|fq^)fxE5d2VD2{GK|z>b>8A zmS%hLB<#&w;roPvpJy5}UD%h1b=HbI?o+J0bcJuyGnF2E@pwBwFJDaNi#Q)L74?_0 zvlpE|&+)(Vw_!JSe;tu^_+Nxi`~gh7=zHArD(*6V=al~eytvhLz+J?Z}s%x ze*tfm0$=cJsH1;CzJN2GdcICVnY0cxqLUu#knw(hr6z{66avAwArO2A!-uf?8FtQ6 zhIt>gAWNfSz7F4Nof@ncNW{S7g)ex}0gQPsa})Rj8fFOK)K$l}f|l#f6f9h)AvpV6 zOK1WGzHRC2<>sO~f?0kYw16BhF7R~urV9tkI>{gx45UtfI)|EEn8BcpMaT=9&V0rg zvSh9Xt-2UD#D}!{IieVi@I(Y{E2MPq#47nBEUah|O$b?;R*_x@8^~EU5XisptOMQp zXEof0JlM>S;fKMLp>wp|}+iRwJmg zX0;gCdMI5j_D9n4l^vMdjU!NK6bmFCZ&R{Rca`S_`g$7??=LQf#JT4i6KKMa^B6t6 zT_FNTeYoEDV;I9m{LdQ*>2HxB5v;oKrZf=2MS&7usE9vWDhn-cKeJJ>Y2~ED-kk@J z(GBwQv1^5G7Qwt*&|OjZx!cEOTrOZ8sanZb5A;8jqnmbEf6&FMY`;t)mJ*^IMviV6 z1wj=<5!uEJ8T98Zuv?~yNioLzQa3yejLiY9d`4p9EYeuxn}LfdD9Jp2#{6|E~Kv-l+=I#ZQ5%Id0MnF8Ynkho`uMU&+GoIzk>lK^OTOEL7;? zj>kyQ0V+nEL%{^ASn%o%OCHA^R%?TxZ4WCBu`(-){DEat_`zN*_(}B~_-efHnR$sQ zA)(_0EEF<@E2>CjS^i$QIF69_l?WV(SXac}2|GHv7>yVK)KTi9+$I$?FlUKjy;zY? zeaXeeUgYk-o2F}HKto=(Pp!{aLX^n=2o5o11$Y%5fVG*qV?&wTbAyUS$RLI~&Z_GW(nKfX(O*Hp!An%%ZItR2VNS>#fIK&;`sT6%{p1k#wdl_(N<;TPs8 zZWyt5xw{s*X*0qndqKwwFCsxK}%vR5y4uT2n*coY!wuUnr<)#zJo6o z31}MNM0Ks^6!Nn1rNm(t(k;}rMBz?LJPO~~Vr)P#(?#0aR^Wq%r620go7mSsc?iYW zd0*a^i7H~t2&xo~-)Ox#nMLO}Sh9|km!v6T@Q1tr>z%T)29RY`qst&Pg>53PerEw( zCR!4Wq~k*g8)}Nw27klx@O4xVL)u0(10I+-A9Eo*Rz((*vB(YEOOVhMu<;c)l!hI$ z1uT1d`E*}{qg1bf(pbPD!)U_>AKGI!Sd4@ne^orw$0*E3sgg4`G3tclYabVVy@T^E zzETE@U|p3RC62TlKD1LPMyG(w;_`Kf02ISgQTXkWk-8FKbKP3D3SV28HYGuIctBO8 z)&~tTXyB=4o90a+wd4lsjOuv@YRthFI(1|jsA3O&0O~}`g&y&ad;>pKT2#YTbJXZi(He(af+>i9!4rJ*7%%Z4FIg+;9~tOs0bzK9S&bV z$5M3cG9E=Z5tNV|I0;w&FWloboiKq4wD6gU`UujuNR`JSBcpfwZ9cHH)3|n+^e(Vn zcnh^I4l;c45-Q7bZGegqZpLVKS!E{pZAG;CVT#!Zr4omRX!;Cnh+RZ>iOIDB1h*&% zM-{S49LF?qXwJmRP{0h;;U@!mA2e`r;_zsE{ri}Gn#LAv2vkwM<2V{{VBXA_LNaZZ zWI48ss#=Hm1~=~~kt-m7tRp~|X6~_tgft$AQ;ceCT51gR5rBccVOV-RrJ1ux45z6F^V!5O~+ zhRw!9Y~7M1h?xNsxKdQ6l3>9$I1OQ=5#2t&EGo9|5kF8ue*|Q7q{sGMYJfupvMnWVDVvB_FmeBr*|{Q7~D+ z(n4-jWuQJBY*rox4+`DbGCD9~1aZb%%z^s)OK3qTMZrmN9t_A4oMHwHe&CfEaV`ex zSS0)-Y|kT80(M2QxYr4x>e5G@$mM5X=49$1^oen1UStW0@Sm2Fh4DCc#+>g)rqNJm z+>-s-@t%rx67`$2Z@mb|DfAfJo6JC|!h4y);#4csm^@cTF1crF|Nqb2yTDm?)pfrA zy=zxxSEWgxY8s}25LOjMtTZw7q>_!0IrZol zX0H6J_WD28fBn~c?X}NdYp={~W}I6%H;`<8YTo%dr=*PCX`klX9!gGlUyqS-WvWkt zi89=0?G|mI3|U(#vWGOF+9Ce#$FeI{(Mx}AwDk`LdSU?h3_IXx4+{SrE|;F93IDEQ z1AKG?E=nXwK!N&5&?}nDo|VnnO759;28NskyUsU@tL|@Z^TyI%6e*0@h6(7nzjLvV zi>k@yn)l@lx5EMj z8Mu95lj=Q~dG*GwM>eeQt<_sjf{=-LqSmBzj zaN+{hCaa@=s7WUX3mjWOL4_QEQJ&|s++OC0D&0KVFW)1doEvPrUR*g%#EPzTx&Chg>0=g7goyf?pum5 zap-C7v#iLc@Ba+#WCwG(wJ^&K;OT+w*?ITbjWYKWj-?pyCITw1U6x%AS+epLEvOAd z7px@tuOV%uo{}b8G56eNl&HVe~6wujZx9>ts|2`hMKk*$!ylEz0;SDB|a z#>So#cbst+`O%5gNHPDmYmZ$wkuy#d+)Kvu{5nb{_})&u%D})?8z{X`B!_&} zvI=7eN2KfGTkH@ezEvm|9;8JvgI*!Bzek=&lzw3kQae`tV zLLCT=_;i6v0$&p+!1<`0o7Fm=N@d_Q_aIrD$!}oDoGPTBTlVCb&dylYX%8*XVsbis zY^$-V;QfgAG=o$8kPfnip`3d{NxaRNttj?pp39;=KQ{)cImDHrd4HQGin6WdPD7vz zjke1XgdMr=Zh0SnpUaqMIFhD*AIZwGfKD$@+nP+WdXUGzb7x4u&cv{E&pfzB|$AI#+TezEu^;r(`xl)c{v_sE4cLj6! z4j^B0qU9+1hBZ?vJdBO`=45^agLbed*$T$kae1vP`gl2NW~E7>eAe3()-mC5y;%;5 zEhsB(TNi;}(d6z1x)+JydqX{G0EZH?@<-BoVMo|{^iQcsiIUoo_g=BoQ`&hk6aYg- z!m%*m2_wLt5>R*#K{$B97T8A*d7%&ZoPWwXagq?oXT>x8rAs^fVz$S|e7>~eeV{k? z&zj%kNxqj}0?L2@fqz{|w$4?lC8$#a=OhUu*Kn|?jg+=L3@UZOh9z>3AkvD*0jO;h z1CB;K{KY_0hCGdPPE|mjo!!p6UscCIR{M?O_DGl{kNQ3@$E$F4`1M%R=-^UZ_zdES z@}AiM%X0|I!&cx`(#wr>V@wJTSp_47s~!@DKBO^_bMB;wN3~;5ssstiTMZ$^aW8-W zY5*Z142@F1pfK;UywSI*_KoF}E+Dd86<#pxQIsv!NkM5+j{80lTRK4-*>Wd@={s1X zE5GT6T~!2|z9X$q7QTwF=CwYy#_tT|k6Y(XZ%3b!9qghIu<^mrxnr%}ru5pg<9)5OSv?NOFBLKJ@YLnQ z)Bz9DH`;v5S~3ls&FwAROR8Joc}2{{@5U4p5^h=u|gdvL02`33qMwr<)@5t z)SV@x3kAlj%)9)Z=MubKvN_L9#IYrx&jVvhpZW`VmqA>-ZV4_=W6ykEw7U%-4mBkY zQ4fE9Zw!SQ$ZN0l2t*$g9tbUXIiQRtLxA}K|?5S=ogkG!FZc%~&=%Uw8jZL0= z-A&e6n=IcRJA4e+%jY`>cd$jUb6;z+_3?Saee6~azEh}MaGr7aL+|?9hrjsfdwb8l z{qO(m-bbHx>+J`ZKYi~NPq}?{`ie(5^{{pO!K`&CJY{vY0nQYeYH8nRh&@Cy?Y zKl`cn?)}H!{k=C|@#%~Hv@><~r><(uKXp2kt%b&Xqm!3++_CKb%U`jdvDfatbD=Tw zs!qE*eaBPhKMua*(T4kU#M9!-$T!-n^pp8dQzz34YlmLdZ-4Qft#=+udUy7O*B)I1 zW4qs&m%X(|#AC0EQi!o$Obg z7=;vKoxJS4YZk58X_M>gq}6(t-8NMmYfWaCmek4T_TLuh7NIpxBF?*e^}RPf-oN50 z|M|=B{aR=DqtATr?eBc_HhZ*n_U+?Y>)uCqo_+hyD;~Y~ii54&3+m{KVV&HrGu`tS zl;_;^;Pmc4dHn6q{PtSsq6ZF^Xa7ynaId-}D_b9HxT`w(8&5`rqUB@Ypxj4Y{@6iE#f|^7)Mm{?E$?>u$GDexK%D6>LmH zEk6-X`f{Hb&??%K0Y~91KCQfD&&M*Y;jP#EstnncFp>(@$#9)-oywtQO7w{QPgEz` zJ9V-;;ea64gzwvTrgakPI(csXypv`1Cp7d|kWycBr^a<|PiFtrR)!j*P4CI!RJE)yZj%T_>oM zlZ{;rcl*B6v8%3=kNnp0vrkqh_k9R?x=p}`7x+qrS?UWN17vRL8?c`K~FfK2Y@hcQ%CVK*EsZsgUA-5?1V`!+Z~l7rt(aZ+u? z$QhF{4Ru;x8^gr2C*O1_do7Xk7NAV}6K_8EO_|KnTtUUKZ%x9l->bj?Nn-|d&^yyaJo=^W&JoFw~#@o|2G zOlK}9+4XzVdDgGpUh}nX!gbgoPG>gP`ZccoYyP#{9~(ik}^O{d!p zp)Qr}`=0gWKYZ}=7k^{ym9La9ca44D_kCacnEaDu7)F%pME8dEQbSk!wl>!Zw-@aJ z9l#S_CwpFf=?lwCE;;ttw~UI2`|47iymq_F>qVTdtUB37og6tXI>}Tg$*<;XU7ejg z3@aN7H?%d>Q~1sD#|SZur;cx{I(g$8ITv&UhIR7ifBJXdy!q!i_b<+1u3qMOVf(i~ zd7?TwV*2jNh@py1{bcxkm0ClG{f+8BQFY?4SdOFe?6H0OUbOA_@y8xJ-aY>0$BwbX z^oV^+tw8;xK9Bqb<9|5W*7LPI;X3R_oX%pd&uSixqYgh7`^iQ<@tga}>}*|5 z!gZY(r&6(irLRFS+NzDC42(@bmKT(drz?5*-us;PLTGEc|-My z1ph=D8`?_KH`PrZ|AshJ{7`oj$o2mvFkY!!fv_3^9HRmGs5MzX#8aw;%Zn)O2+T(&-PrqFuzvNh$CHNgZM!H~|q( zAU^}Kih2ZGq$LcIO3wQ9tmj75hNK&kiSh|$mAtWMz*jz%2gnV{O;lC3%aw;#dP}`J z%@E3S#q>2^9O*?|@6JuP^XGqvWHo=KQeOXk)= zB^{9|7pd(Gu@;Jr=59p2CS4*LvR}la(X;4W73_XKq*EJBij`aFjm`k-I8tmim%K;y zQmK19bj6N|>)-MWU(=G-ArMx22`|ZW09xBwYf3mu=drjp6j=W(ypW%<<;3@{N)-Mk(2DEzu77oTb%f?tu(0!`CA- zGz8LbuglM958 z7aWqD2(q|ilh@?1$OM5j1yffnB*;Ap&U4Rl?C?&_Ar(k@aQq8PqV~SRrPY)= z{%$48E60s8r%NZx>$U5WiMd(tCC+UY4N{61p*L!HGydacS;8RwP-d)%h*03G9gUQQ zvNr@@k;1HyvQPxapKrNf!5(ofVhr|>Zxz9>*+ErQd0#p~=w;YqwU;?v1fTcRQZ{ch zD`qp-xy&^tGQ&rH4r4vvCyv01$Rmas>mq-Rmp>Y}@*Gc32)L39TZ1Hc`00Sgygd}t z-LWp4Bnp-oT9!tNK$#TM2Wp(S%1+IU_%A?vu0^g>fnTRU3>zcyv2ZEsy0qCBs4#(g zYvsO0&tR26u5a*Oz#3lGG*}*OX7)ZRL%Ok*j@C;OXKePQk=rz@J{Ud58*^};1>-wg zjU8HT-^dGIB%kl+eCA^*^p^P1lmt48XW4RWU+MfVPZSt{%W_vRW1F7QGJ}v?=8*Z^ z;}QK?-w8z={QX;{%rAIr27WOvyscq2lua_m*Mtd$7)ZA}Etz)2QMK-pYDPPH$GFoz zG6^bqxv?0NU+uE9swRh63978s!rF?%teUpshlVQR1xdBcrCKZaT_zxLTykA9XuT+n zD=$(hME|WFw^584qARPhJyl|`j``UbnGzIlq*^Yc@+rDS5S4%w*&JohePCw~-=}an z)-K9Uu*@!4WL=4=kEwsm{pJ|B*)-U#s^RnA3_ny(p3^yjo|BahT0XyVntCoLk}6I zn5!F2N=>^_q&XGqxh8@XXWM($QjH7Zeap;8W;VK#*2D>MOwiW8p%VMLz_(VD zl=XelvlU&OLUVqFqyGy#bCShtSOD@`p8zjWgqZZoQ;Tn7Jy@~iqi?`fffP1J*N4j+ zJ7kN25qF|sccL%WCOZ2=zMm!^3NES9linVQxQQIvb)tD_>y1Ka2WgD@b0id%sb zh%0FPMU>al0Zz@ILD45$@^G<_^~g**ASy`4MfNY=lSywPpY_(wSKDEK7z?w3w*S_} z`_KygV0Q)<-Q3*`2d%|7?EAJYbi%gw%fq%}sXU+KG|Mp2D}Bj4ilb<4yOsZ$mS1ek zw=GPvR=n`G{4zMU=a8hV(NVl{S)~Xvv8)^c4RGcoiL;W3x-K^3+J7S+&JpklRUP@H z6Bk2Vt;t&>XO-J__dk?0J6ZaaWYY(azO|>UaRtT5O ziHJZj=b);^>TC&4X=@Y0xpolR!D*!3DJ#&Lk2V^aTZ1!pxZ8r>kUFNro+|Dkw0PH7 zlrtm-F38(Dc}qL&JSn#GS=OmQX5q**8W5tfe;ah}l4xp{uGy46XADXypDccpL^<*r z=lZ1m>}W;DRfu43Cw3Az394K{@TVo1aRnm^Rr%NYK7~OZDHX~$c^C!bI~s-y^9h%V$nTg=S$-G@r$|R4%E4`*u{gT z3%tvAEvJ$Tj(H2zuoPqZ3)n%0zxz_&Hh!?Y!6 zLw3t++g=h|nL;oXM^^5wPW6w!AVfL`DR zZ~BS9>@2nNJNwO&J4RTkQspfaKJSk)db+meO>8C2GrvO>VYBUq^+`XIG?$)intV#) zX&mv9W$lG5yK|;*{)3rWuOC`08cyX-609H!4at0gLx#q5E~R)fcuK{1<%2NQcDxwA#0-?tn$CqQ7pMnk&(iyo z*pXMfDDIa&Z5u6_C6h-#=ADy#R?c@j=#JGjy=BldFLRhYrzUQvMk36JsOZzk%7wPg zh0rdTr_xD_B0ET}6nba~c{9WE$}K*qL1$OqF!8j>?k9K*EEXT65wlIMMT;&na|}|! zwskt$jBT5vT6Igo=dIf)^>^tMbq32t>%?Rc%)%|V@$NU!yJJ4$QwM#csMFhsgCJaC zzLtF#W4EI@-73esW157kk1O|rtjJm!oZX@qkXB;C1KS#YgTjgQ&dgiq6x znZ}jRLUeAxCX-+NSQ7sj{9;@W+PLb6lQa7vft&<@QcfQK&`Q3d3kxUvABy9j(uafzr3sQe11IL z*=Ts&VrQCs{?LD=4>dvX76g&l5HvBU4B2598;FmAc zkYqaplMNn_Iz{etKgDsN&1LU-f@$Pe5{@pm?OcCV-q@**;CJN3&R25R;6})&)EbS; zmake~evLKGL$|qnY2&hUnT``bAunE@V@Cd64#jw$P5;nYo+cC;Z<}V&w@J^yvww*k zyqLsitRHIndOSX5Zi;NyGWO!;6a1jTz&CN$4Qzhne77m=-LF-$`2t4rqs7u)JEo@c z!xQtiJ)ie0{oF3jjJwLqQS+pRr^9>9zkuSjv+{g?VpsX}JfEVA5E|PnJlMH0J`wU` zLIgN9f6dHnG?J!t+~cJSH-UoLj-t=3WYnfP*-|D)o8u^fw-YB!sFS?J=~ z*`Hc*zqxRO&GlEz?V8>7R_}86!d^C8Ts-Sse(p+G3eWa?t~vM%e%Vjhc;O$q#=mRg zu2z1Tx7X+k41UScXPntkKg>&pTGR)uKl?^fAQ15^oF;* z>6cD77jOCYCExt%tKam)fA^k$@!pI6{CR)!f>+;s+0UK#NB`vUfAR3EFaO51KeFe? zzWP7E`qRJk1Aq7LfBK_u`N_w>di)I+oqzld-~WbR{OZ%+{UiQ=TyZ`4; zHh=6VR^0n`zkc_Be*Fcfo0oqqy@_YO@@YT!Loa>t4_*F)pSnf6bGwx$JG1 zz2gTTeMSD_A6>BNC%^Q{7hn3)(@o!{zy4#t{*4!3zWs+DUOIAP=V#t_`S!mbU-`ke zUiR?i-*`p-zM9lcmMvEAAi$h4}bkD#~%CqTaNtfw_pCI z$G-9-=YRa-$1mQ~{?Y&OtAG80H@@Yuzx(DdT>ZM&-Tbi+z`0ec8F+xO(ZzSMPAm^5WP0<@KkXm($Jj6RlU+ZcO@nW_NY+xhZcweiNu< zb3F?|@iApO130n0qa*gVilbY+VFweVubf|Yp8T9=EZA>Pp3fT1)06!UzjvLk?ipm} zA4m21jK}%wr+?>j*`chwe{NyAyU53SoxSh%PoYvQ<1xW!XOOfPoWNfD_0w~1#NHNh zG+)%6^VeVhEC2Cx3tw3{a{oQo?D)ju>B>IB*cEjzz5bUsh2J1MgWUWhsd}a?D)bFF zoqvKybsh>>B`UodZy7GD^f%&#S4=f@#z@($;zLjNs&i5{$6uYNGPy9t*N};FVd_zZ z2fuRz*4ZWh@u?&Y-P$jnXELHI8&l$C3%%*|>SRi52xK#2(wOAYpLIR2NcNIE^7vD^Bl`LDyIQ9Sdv58h9lWpDn2o}%tL_ra$48ef|DfgJtl50<{p zL&34|@l;j;Il-gdFoF%acyLSM#P=f>Jp%nmyAjEd45Ntq|(g5zH#?Wl!Fc(aE_p9GI04P40{C=`Sm zfJ{X2xbo@C>;U{A*gz!0t>a+41S{2x9MRt?sa+wo$mriVU7Udg<$lQqZd`dTU>5Q8FfkxOnW36D)5rOAPQ@8GO*e%7hO4D&Ed zL<%u<{g8~*Mt+0$)~r(~#TH|Pix}4;C7g35@M$4L%~ryp|9X!h=S5a(ehc+2W@0gj z%2q*RXR1mwviuaqPbWa&;xRITH=l@5gi-A*AntJ`JCTTGZMF=fOUCr;%v$8^Veat* z@K7pW{Z z;eqQas%e#W#peUOUM}%kN*=#r!3+|$R)s*40^?g-iR+JQ|8@9>^^2UVMNz*FG-u|M zhx~O3Ty&#TlfvHPjKCl@76#IxOrpp+i271?MAzUVk=3l(U6EXGr9bfYqJo?VF1jJQ zKKEor{b3J962Jmp)M-gWB%`Y}aKldHqKuaulrcqerxsiA;}gInL@4O4ps(o)^z#$1 zI)wnHRIbX5n@vVh%M{F|+lswVKZJF={ES7QP*)>g9Ogdv6dXZ=4ck46MOj`>5{Ck* z;lD~MY0lLW_+_&6=JD}-E=+-wRty%MkVqG*SGZ0_>MQz*Q8wy08U%mDsMit^ViFP=-7JP@M(2})hNXgEU<;2W z0(P>6puuV~RtoPnab9LLJX~!-3G*$>u4s`)@3O_5Y9+dY6M=XcqJVp-2;+?x zaVj=so-iHavWHd8t)k$j+m97FN0biho)?Y^t4suNpD+%O9u_WSc|}?D*35#(E2Jz0 zC^$eoCc!EHBqhqmv5T0i2+AUAfP5DzNQGJuKXO5$A6?@2BrAs@1j&NcCD$y-K@luc z-hkJ|!8Jvr%zR@><9aSRZgWQ`UxZqiW!|l~Qr8HXxn@K=Y{r(dz|Z>!oa}_W8Sq%{ z5@OeKp+jdH;aXxWCUQRW-?*1lHRlSw;n+cY#g1O+@_T$6nwM65biT1j{waO#|G8R7 zqnzbYfSO~Kgs0{kOL@L*(?xzKJN`edvcU}XV6j4SEZX%Mtq~x+61OJ11Lgetf<(0 zD8#6b9VmIRl82Nk?+~Pqha7YAVldHri3*}U6r7g;z4-tx__0@}dsc*A{7HF-rydy- z^2V$cjs)>eOfB3sT8=D-1;Vlfqyzgc27KAi^9O zj4Po+)o$b;Q@xgTm@|jmFP}xttq~|FXm&TX(c~FniPHC3uqEVNa|>b3R%CT&EQse2 zAWk_vQF$ECLyI@{yZ{ab2#^!`+K&82u1>jNw?HnV}mCd~}D-s7jJ<)KHVBiL7P7%Be^(9&G zm_OHC9}~M(wLR?e?|QzCw-Vz@dnDv*v~T;u_vY3PB!TqEmuT}YZtS4&UP8SKp*aJ2 zkLS+)JfC=TZ6$-(ajswZl(T~6Xp`REUtqBQ4=b^r|?-c^Qd3 zX@_Fa=#zZfsnR9Cbn$U)_I${n(H~SprL@gFlwvVj+z6zG?dY1R%DgQ~!LRv#jL*Zw z1(x)K@i1m#96KQk6ANG#s#q~@)Ky{6XAg^FPXC2!i+coj_|Q==K)@!Ses0RYqC!AR zV4oJNA2EeYsY}U$7)@IH;>{YD70-U^gfd3CE!#42oSOf`4) zc^TiZ9m@ni^xG6hr#pW(3f(2bySQ@DV}?sFrGW=MwPL+sb~|eX^RvgW-lM}6dC#vg zv+~WX%)PUs&C5F=wEXcZ$Sk>3?2E4#~n79H8{x!G8$c6a$}4+0Wt4U>Bmk+rX2U< zdrT9o8_O{jHz5OyT!@?R;dYaa!X}8OmkE+*4?e!Yr`8!3ax zl6c4WpzXiu3rqPFEAsix(3;c!BDE|woy{^rjd^EtM5@NCNJx?XY#x?)$sHwT;pG`N zAOutbk;Lo0!EB6Fr%6ZR3S3{3a~CB2)GW>22jCLA9)b=WTIJxDBvO# z*0+Vs0^@;u)=2qtOH$dKtoz-1ffwSCUfJs53qAI8Ho)DT0#!wu5F6G~&w zXs(UP#sQw$G8V?niYF-LRpQ>8hgVjQCo$Xw<#AC~X&+4A4-K*#e0vyyqPmmjdKnR~nH zNdcWjyQ(Ek-?+cKJhn_$mF{5n%cNctqu{e8=S>zCJcF(^q4=wcxlhqWK3}HH_zON4 z_FM~e+{=Qu%fLQwJKa#n^9h?^MXpxm-qFnRu^olA7}Z#hVi~^yj}em8Gt2Q7vtzk% zkrzwzDeD1V`HWaJr33T><%^K|EK+q+59;K=ybrWSK&^}-mdPF$m_Fj5!kmQ=AbiIH zB$S$FG9B4)RKf%S6z~)_7jdvw~yz zq#tmF+~zjYDx#aUAOciITNi$IrKdczA2Q$uvIFi19*)Gf8_fcwOjeLLCPa0(db;Cb zSJrZ#06;$96++i;L2iYN+0+CEG~SUsC?LpTJsi=>Y!XIkz{MAX(vmC3Y4QW~ut39# zvgiq;iE0TD^{ znZC6n=Q9@|y52n16=}r+Plzo02u4L$var7uYu1qz7edG{2$cRI9w{}gAe^&cjTaUf zBoJmTu+EYnY^sYkBIz@V^ub}i9U?|4NU`@;P5sf;t=Z9HL5vq* zAdZqE>_So)>m1!of>0HN=%jXl4QwzzZ%T$9bd5#8N60;>c!()NtjHw=62unAa_WNn zUxSQJJl&!nJmsHz=?ESemwTveY6!yYz;3K7UmHsCdH5Qn$m10m^%6D7CgP1-oE$m>(4x8n@s;FU%cmvq!DuVC0=#;(Un6kq$EHa^9mDsy>V!g-J76J8Y>SPlV{iaeO`$8I8Ie5zSSnm zgQO))mYt3glC>2#iPBMWSn7vf2V5LtlGdVQJ6T0=6hGl>stg6&-bD zK#w;RN;X z_X~XOqlIZEdm*d_duuj6&I;?_S@6@d%fY(QXqP+MjNVLn7kSF>3t3n;N&;gVdWzXt z7d}vvL4O(bC$rgpcDR6u3nvm$4oQXLN~v77?xeLGxhvmcS+Bil2PVl>JM6q*^-$>X z*bHxX|32%5p)crWCfP%jbFa-!ghP@TyTT;a_!*;^LT=4Y;{e$4>p%WsCSPOBvi=M| zW-(SVtMWVL-@D)JLxk`BNw9mjS@ym^>F>N?TiJ5$Zu>wPx)-+FVLOAOn^?2SBfG+^ zwpMlQ5NFPGcOtj`l^T0PFNDwu&!ttG9iuz`8D5r+8z{6O1({~+grlFkHJ-I`w6`Dpt4IIf*T%>HZ2n8X|2vnzUo_+Cyfg>~S4y|XmI$i5`KHoWXYs)^>`QkfD;s|SZ@5egux&0lYveq?h zI#LzDM7aBw(8{1&x3xn!@U?LJc6Z0j>V2X6;m|s?dQ%Sd7^p#$A z`0Mu{y!R{J*85g}w|(FXk903;|Haxn4s|w!_=)UH)GC{HMD+50KT* ze`7Ut!!5lIb<%oX9zJ#8*T4Cvk3RdqgfPQFBoup9C#(1DIeT*U()rbcYqz&1&N51& zMGXk68~~MvsH2}di!*7A^Gwd75a09I$KU$l@BPF1$ElMmuh_jzop2_P72Vc;XYxs%PPXd8mv0G=hW1CWcXy}D=OF fvxt(C>WV!mbS8am^TU5y9tfi*??* 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⁢a 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 HNx=RC56FAi literal 0 HcmV?d00001 diff --git a/Applications/relax2/parameter_handler.py b/Applications/relax2/parameter_handler.py index 9e96caab..1ed81c98 100644 --- a/Applications/relax2/parameter_handler.py +++ b/Applications/relax2/parameter_handler.py @@ -211,7 +211,7 @@ def var_init(self): self.SAR_power_unit = 'mW' self.SAR_max_power = 15 self.headerfileformat = 1 - self.motor_enable = 0 + self.motor_enable = 1 self.motor_available = 0 self.motor_port = [] self.motor_axis_limit_negative = 0 @@ -256,6 +256,7 @@ def AgriMRI_var_init(self): self.experiment_description = '' self.plant_ID = '' self.plant_part_ID = '' + self.plant_cultivated_variant = '' self.plant_part_name = '' self.plant_description = '' self.agriMRI_folder_structure = 'rawdata/' @@ -269,6 +270,7 @@ def AgriMRI_var_init(self): self.plant_light_source_artificial = 0 self.plant_light_availability = -1 self.plant_water_availability = -1 + self.plant_seed_coating = '' self.plant_nutrient_application_index = 0 self.plant_nutrient_date = ['', '', '', '', '', '', '', '', '', ''] self.plant_nutrient_das = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] @@ -332,6 +334,7 @@ def AgriMRI_var_init(self): def AgriMRI_var_reset(self): print('Setting default AgriMRI parameters.') self.experiment_description = '' + self.plant_cultivated_variant = '' self.plant_part_name = '' self.plant_description = '' self.plant_date_of_sowing = datetime.datetime.strptime('2025-01-01','%Y-%m-%d') @@ -345,6 +348,7 @@ def AgriMRI_var_reset(self): self.plant_light_source_artificial = 0 self.plant_light_availability = -1 self.plant_water_availability = -1 + self.plant_seed_coating = '' self.plant_nutrient_application_index = 0 self.plant_nutrient_date = ['', '', '', '', '', '', '', '', '', ''] self.plant_nutrient_das = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] @@ -646,6 +650,7 @@ def saveFileAgriMRIParameter(self): self.plant_species, \ self.plant_scientific_name, \ self.plant_taxonomy, \ + self.plant_cultivated_variant, \ self.plant_part_name, \ self.plant_description, \ self.agriMRI_folder_structure, \ @@ -663,6 +668,7 @@ def saveFileAgriMRIParameter(self): self.plant_light_source_artificial, \ self.plant_light_availability, \ self.plant_water_availability, \ + self.plant_seed_coating, \ self.plant_nutrient_application_index, \ self.plant_nutrient_date, \ self.plant_nutrient_das, \ @@ -949,6 +955,7 @@ def loadAgriMRIParam(self): self.plant_species, \ self.plant_scientific_name, \ self.plant_taxonomy, \ + self.plant_cultivated_variant, \ self.plant_part_name, \ self.plant_description, \ self.agriMRI_folder_structure, \ @@ -966,6 +973,7 @@ def loadAgriMRIParam(self): self.plant_light_source_artificial, \ self.plant_light_availability, \ self.plant_water_availability, \ + self.plant_seed_coating, \ self.plant_nutrient_application_index, \ self.plant_nutrient_date, \ self.plant_nutrient_das, \ @@ -1348,6 +1356,7 @@ def save_AgriMRI_Metadata_file_json(self): 'Species': self.plant_species, 'Scientific name': self.plant_scientific_name, 'Taxonomy': self.plant_taxonomy, + 'Cultivated variant': self.plant_cultivated_variant, 'Plant part name': self.plant_part_name, 'Plant description': self.plant_description, 'AgriMRI folder structure': self.agriMRI_folder_structure, @@ -1370,6 +1379,8 @@ def save_AgriMRI_Metadata_file_json(self): 'Light availability': self.plant_light_availability}, 'water': { 'Water availability': self.plant_water_availability}, + 'seed': { + 'Seed coating': self.plant_seed_coating}, 'nutrient': { 'Nutrient application index': self.plant_nutrient_application_index, 'Nutrient application date': self.plant_nutrient_dates, @@ -1401,44 +1412,383 @@ def load_AgriMRI_Metadata_file_json(self): with open(self.agriMRI_folder_structure + 'AgriMRI_Metadata.json', 'r') as j: jsonparams = json.loads(j.read()) - self.experiment_ID = jsonparams['general']['Experiment ID'] - self.experiment_description = jsonparams['general']['Experiment description'] - self.plant_ID = jsonparams['general']['Plant ID'] - self.plant_part_ID = jsonparams['general']['Plant part ID'] - self.plant_species = jsonparams['general']['Species'] - self.plant_scientific_name = jsonparams['general']['Scientific name'] - self.plant_taxonomy = jsonparams['general']['Taxonomy'] - self.plant_part_name = jsonparams['general']['Plant part name'] - self.plant_description = jsonparams['general']['Plant description'] - self.agriMRI_folder_structure = jsonparams['general']['AgriMRI folder structure'] - self.plant_date_of_sowing = datetime.datetime.strptime(jsonparams['general']['Date of sowing'],'%Y-%m-%d') - self.plant_measurement_date = datetime.datetime.strptime(jsonparams['measurement']['Measurement date'],'%Y-%m-%d') - self.plant_measurement_das = jsonparams['measurement']['Measurement DAS'] - self.plant_BBCH_scale = jsonparams['measurement']['BBCH scale'] - self.plant_phenological_phase = jsonparams['measurement']['Phenological phase'] - self.plant_environment_outside = jsonparams['treatment']['environment']['Environment outside'] - self.plant_environment_inside = jsonparams['treatment']['environment']['Environment inside'] - self.plant_light_source_sun = jsonparams['treatment']['light']['Light source sun'] - self.plant_light_source_grow_light = jsonparams['treatment']['light']['Light source grow light'] - self.plant_light_source_artificial = jsonparams['treatment']['light']['Light source artificial'] - self.plant_light_availability = jsonparams['treatment']['light']['Light availability'] - self.plant_water_availability = jsonparams['treatment']['water']['Water availability'] - self.plant_nutrient_application_index = jsonparams['treatment']['nutrient']['Nutrient application index'] - self.plant_nutrient_dates = jsonparams['treatment']['nutrient']['Nutrient application date'] - self.plant_nutrient_das = jsonparams['treatment']['nutrient']['Nutrient application DAS'] - self.plant_nitrogen = jsonparams['treatment']['nutrient']['Nutrient nitrogen [%]'] - self.plant_phosphorus = jsonparams['treatment']['nutrient']['Nutrient phosphorus [%]'] - self.plant_potassium = jsonparams['treatment']['nutrient']['Nutrient potassium [%]'] - self.plant_stimulant_application_index = jsonparams['treatment']['stimulant']['Stimulant application index'] - self.plant_stimulant_product_name = jsonparams['treatment']['stimulant']['Stimulant product name'] - self.plant_stimulant_dates = jsonparams['treatment']['stimulant']['Stimulant application date'] - self.plant_stimulant_das = jsonparams['treatment']['stimulant']['Stimulant application DAS'] - self.plant_stimulant_dose = jsonparams['treatment']['stimulant']['Stimulant dose'] - self.plant_protection_application_index = jsonparams['treatment']['protection']['Protection application index'] - self.plant_protection_product_name = jsonparams['treatment']['protection']['Protection product name'] - self.plant_protection_dates = jsonparams['treatment']['protection']['Protection application date'] - self.plant_protection_das = jsonparams['treatment']['protection']['Protection application DAS'] - self.plant_protection_dose = jsonparams['treatment']['protection']['Protection dose'] + try: self.experiment_ID = jsonparams['general']['Experiment ID'] + except: + try: + self.experiment_ID = jsonparams['Experiment ID'] + print('\033[33m' + 'Old style: Experiment ID' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Experiment ID' + '\033[0m') + + try: self.experiment_description = jsonparams['general']['Experiment description'] + except: + try: + self.experiment_description = jsonparams['Experiment description'] + print('\033[33m' + 'Old style: Experiment description' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Experiment description' + '\033[0m') + self.experiment_description = '' + + try: self.plant_ID = jsonparams['general']['Plant ID'] + except: + try: + self.plant_ID = jsonparams['Plant ID'] + print('\033[33m' + 'Old style: Plant ID' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Plant ID' + '\033[0m') + + try: self.plant_part_ID = jsonparams['general']['Plant part ID'] + except: + try: + self.plant_part_ID = jsonparams['Plant part ID'] + print('\033[33m' + 'Old style: Plant part ID' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Plant part ID' + '\033[0m') + + try: self.plant_species = jsonparams['general']['Species'] + except: + try: + self.plant_species = jsonparams['Species'] + print('\033[33m' + 'Old style: Species' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Species' + '\033[0m') + self.plant_species_index = int(self.plant_species_library [0][0]) + self.plant_species = self.plant_species_library [0][1] + print('\033[31m' + 'Unable to load: BBCH scale' + '\033[0m') + self.plant_BBCH_scale = self.plant_species_library [0][4] + self.plant_phenological_phase_index = int(self.plant_phenological_phases_library [0][0]) + self.plant_phenological_phase = self.plant_phenological_phases_library [0][1] + + try: self.plant_scientific_name = jsonparams['general']['Scientific name'] + except: + try: + self.plant_scientific_name = jsonparams['Scientific name'] + print('\033[33m' + 'Old style: Scientific name' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Scientific name' + '\033[0m') + self.plant_scientific_name = self.plant_species_library [0][2] + + try: self.plant_taxonomy = jsonparams['general']['Taxonomy'] + except: + try: + self.plant_taxonomy = jsonparams['Taxonomy'] + print('\033[33m' + 'Old style: Taxonomy' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Taxonomy' + '\033[0m') + self.plant_taxonomy = self.plant_species_library [0][3] + + try: self.plant_cultivated_variant = jsonparams['general']['Cultivated variant'] + except: + try: + self.plant_cultivated_variant = jsonparams['Cultivated variant'] + print('\033[33m' + 'Old style: Cultivated variant' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Cultivated variant' + '\033[0m') + self.plant_cultivated_variant = '' + + try: self.plant_part_name = jsonparams['general']['Plant part name'] + except: + try: + self.plant_part_name = jsonparams['Plant part name'] + print('\033[33m' + 'Old style: Plant part name' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Plant part name' + '\033[0m') + self.plant_part_name = '' + + try: self.plant_description = jsonparams['general']['Plant description'] + except: + try: + self.plant_description = jsonparams['Plant description'] + print('\033[33m' + 'Old style: Plant description' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Plant description' + '\033[0m') + self.plant_description = '' + + try: self.agriMRI_folder_structure = jsonparams['general']['AgriMRI folder structure'] + except: + try: + self.agriMRI_folder_structure = jsonparams['AgriMRI folder structure'] + print('\033[33m' + 'Old style: AgriMRI folder structure' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: AgriMRI folder structure' + '\033[0m') + self.agriMRI_folder_structure = '' + if self.experiment_ID != '': + self.agriMRI_folder_structure = self.experiment_ID + '/' + if self.plant_ID != '': + self.agriMRI_folder_structure = self.experiment_ID + '/' + self.plant_ID + '/' + if self.plant_part_ID != '': + self.agriMRI_folder_structure = self.experiment_ID + '/' + self.plant_ID + '/' + self.plant_part_ID + '/' + else: + self.agriMRI_folder_structure = 'rawdata/' + print('\033[31m' + 'Set to: ' + self.agriMRI_folder_structure + '' + '\033[0m') + + try: self.plant_date_of_sowing = datetime.datetime.strptime(jsonparams['general']['Date of sowing'],'%Y-%m-%d') + except: + try: + self.plant_date_of_sowing = datetime.datetime.strptime(jsonparams['Date of sowing'],'%Y-%m-%d') + print('\033[33m' + 'Old style: Date of sowing' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Date of sowing' + '\033[0m') + self.plant_date_of_sowing = datetime.datetime.strptime('2025-01-01','%Y-%m-%d') + + try: self.plant_measurement_date = datetime.datetime.strptime(jsonparams['measurement']['Measurement date'],'%Y-%m-%d') + except: + try: + self.plant_measurement_date = datetime.datetime.strptime(jsonparams['Measurement date'],'%Y-%m-%d') + print('\033[33m' + 'Old style: Measurement date' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Measurement date' + '\033[0m') + self.plant_measurement_date = datetime.datetime.strptime('2025-01-01','%Y-%m-%d') + + try: self.plant_measurement_das = jsonparams['measurement']['Measurement DAS'] + except: + try: + self.plant_measurement_das = jsonparams['Measurement DAS'] + print('\033[33m' + 'Old style: Measurement DAS' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Measurement DAS' + '\033[0m') + self.plant_measurement_das = 0 + + try: self.plant_BBCH_scale = jsonparams['measurement']['BBCH scale'] + except: + try: + self.plant_BBCH_scale = jsonparams['BBCH scale'] + print('\033[33m' + 'Old style: BBCH scale' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: BBCH scale' + '\033[0m') + print('\033[31m' + 'Unable to load: BBCH scale' + '\033[0m') + self.plant_BBCH_scale = self.plant_species_library [0][4] + self.plant_phenological_phase_index = int(self.plant_phenological_phases_library [0][0]) + self.plant_phenological_phase = self.plant_phenological_phases_library [0][1] + + try: self.plant_phenological_phase = jsonparams['measurement']['Phenological phase'] + except: + try: + self.plant_phenological_phase = jsonparams['Phenological phase'] + print('\033[33m' + 'Old style: Phenological phase' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Phenological phase' + '\033[0m') + self.plant_phenological_phase_index = int(self.plant_phenological_phases_library [0][0]) + self.plant_phenological_phase = self.plant_phenological_phases_library [0][1] + + try: self.plant_environment_outside = jsonparams['treatment']['environment']['Environment outside'] + except: + try: + self.plant_environment_outside = jsonparams['Environment outside'] + print('\033[33m' + 'Old style: Environment outside' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Environment outside' + '\033[0m') + self.plant_environment_outside = 0 + + try: self.plant_environment_inside = jsonparams['treatment']['environment']['Environment inside'] + except: + try: + self.plant_environment_inside = jsonparams['Environment inside'] + print('\033[33m' + 'Old style: Environment inside' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Environment inside' + '\033[0m') + self.plant_environment_inside = 0 + + try: self.plant_light_source_sun = jsonparams['treatment']['light']['Light source sun'] + except: + try: + self.plant_light_source_sun = jsonparams['Light source sun'] + print('\033[33m' + 'Old style: Light source sun' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Light source sun' + '\033[0m') + self.plant_light_source_sun = 0 + + try: self.plant_light_source_grow_light = jsonparams['treatment']['light']['Light source grow light'] + except: + try: + self.plant_light_source_grow_light = jsonparams['Light source grow light'] + print('\033[33m' + 'Old style: Light source grow light' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Light source grow light' + '\033[0m') + self.plant_light_source_grow_light = 0 + + try: self.plant_light_source_artificial = jsonparams['treatment']['light']['Light source artificial'] + except: + try: + self.plant_light_source_artificial = jsonparams['Light source artificial'] + print('\033[33m' + 'Old style: Light source artificial' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Light source artificial' + '\033[0m') + self.plant_light_source_artificial = 0 + + try: self.plant_light_availability = jsonparams['treatment']['light']['Light availability'] + except: + try: + self.plant_light_availability = jsonparams['Light availability'] + print('\033[33m' + 'Old style: Light availability' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Light availability' + '\033[0m') + self.plant_light_availability = -1 + + try: self.plant_water_availability = jsonparams['treatment']['water']['Water availability'] + except: + try: + self.plant_water_availability = jsonparams['Water availability'] + print('\033[33m' + 'Old style: Water availability' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Water availability' + '\033[0m') + self.plant_water_availability = -1 + + try: self.plant_seed_coating = jsonparams['treatment']['seed']['Seed coating'] + except: + try: + self.plant_seed_coating = jsonparams['Seed coating'] + print('\033[33m' + 'Old style: Seed coating' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Seed coating' + '\033[0m') + self.plant_seed_coating = '' + + try: self.plant_nutrient_application_index = jsonparams['treatment']['nutrient']['Nutrient application index'] + except: + try: + self.plant_nutrient_application_index = jsonparams['Nutrient application index'] + print('\033[33m' + 'Old style: Nutrient application index' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Nutrient application index' + '\033[0m') + self.plant_nutrient_application_index = 0 + + try: self.plant_nutrient_dates = jsonparams['treatment']['nutrient']['Nutrient application date'] + except: + try: + self.plant_nutrient_dates = jsonparams['Nutrient application date'] + print('\033[33m' + 'Old style: Nutrient application date' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Nutrient application date' + '\033[0m') + self.plant_nutrient_dates = ['', '', '', '', '', '', '', '', '', ''] + self.plant_nutrient_date = ['', '', '', '', '', '', '', '', '', ''] + + try: self.plant_nutrient_das = jsonparams['treatment']['nutrient']['Nutrient application DAS'] + except: + try: + self.plant_nutrient_das = jsonparams['Nutrient application DAS'] + print('\033[33m' + 'Old style: Nutrient application DAS' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Nutrient application DAS' + '\033[0m') + self.plant_nutrient_das = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + + try: self.plant_nitrogen = jsonparams['treatment']['nutrient']['Nutrient nitrogen [%]'] + except: + try: + self.plant_nitrogen = jsonparams['Nutrient nitrogen [%]'] + print('\033[33m' + 'Old style: Nutrient nitrogen [%]' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Nutrient nitrogen [%]' + '\033[0m') + self.plant_nitrogen = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1] + + try: self.plant_phosphorus = jsonparams['treatment']['nutrient']['Nutrient phosphorus [%]'] + except: + try: + self.plant_phosphorus = jsonparams['Nutrient phosphorus [%]'] + print('\033[33m' + 'Old style: Nutrient phosphorus [%]' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Nutrient phosphorus [%]' + '\033[0m') + self.plant_phosphorus = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1] + + try: self.plant_potassium = jsonparams['treatment']['nutrient']['Nutrient potassium [%]'] + except: + try: + self.plant_potassium = jsonparams['Nutrient potassium [%]'] + print('\033[33m' + 'Old style: Nutrient potassium [%]' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Nutrient potassium [%]' + '\033[0m') + self.plant_potassium = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1] + + try: self.plant_stimulant_application_index = jsonparams['treatment']['stimulant']['Stimulant application index'] + except: + try: + self.plant_stimulant_application_index = jsonparams['Stimulant application index'] + print('\033[33m' + 'Old style: Stimulant application index' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Stimulant application index' + '\033[0m') + self.plant_stimulant_application_index = 0 + + try: self.plant_stimulant_product_name = jsonparams['treatment']['stimulant']['Stimulant product name'] + except: + try: + self.plant_stimulant_product_name = jsonparams['Stimulant product name'] + print('\033[33m' + 'Old style: Stimulant product name' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Stimulant product name' + '\033[0m') + self.plant_stimulant_product_name = ['', '', '', '', '', '', '', '', '', ''] + + try: self.plant_stimulant_dates = jsonparams['treatment']['stimulant']['Stimulant application date'] + except: + try: + self.plant_stimulant_dates = jsonparams['Stimulant application date'] + print('\033[33m' + 'Old style: Stimulant application date' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Stimulant application date' + '\033[0m') + self.plant_stimulant_dates = ['', '', '', '', '', '', '', '', '', ''] + self.plant_stimulant_date = ['', '', '', '', '', '', '', '', '', ''] + + try: self.plant_stimulant_das = jsonparams['treatment']['stimulant']['Stimulant application DAS'] + except: + try: + self.plant_stimulant_das = jsonparams['Stimulant application DAS'] + print('\033[33m' + 'Old style: Stimulant application DAS' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Stimulant application DAS' + '\033[0m') + self.plant_stimulant_das = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + + try: self.plant_stimulant_dose = jsonparams['treatment']['stimulant']['Stimulant dose'] + except: + try: + self.plant_stimulant_dose = jsonparams['Stimulant dose'] + print('\033[33m' + 'Old style: Stimulant dose' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Stimulant dose' + '\033[0m') + self.plant_stimulant_dose = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1] + + try: self.plant_protection_application_index = jsonparams['treatment']['protection']['Protection application index'] + except: + try: + self.plant_protection_application_index = jsonparams['Protection application index'] + print('\033[33m' + 'Old style: Protection application index' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Protection application index' + '\033[0m') + self.plant_protection_application_index = 0 + + try: self.plant_protection_product_name = jsonparams['treatment']['protection']['Protection product name'] + except: + try: + self.plant_protection_product_name = jsonparams['Protection product name'] + print('\033[33m' + 'Old style: Protection product name' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Protection product name' + '\033[0m') + self.plant_protection_product_name = ['', '', '', '', '', '', '', '', '', ''] + + try: self.plant_protection_dates = jsonparams['treatment']['protection']['Protection application date'] + except: + try: + self.plant_protection_dates = jsonparams['Protection application date'] + print('\033[33m' + 'Old style: Protection application date' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Protection application date' + '\033[0m') + self.plant_protection_dates = ['', '', '', '', '', '', '', '', '', ''] + self.plant_protection_date = ['', '', '', '', '', '', '', '', '', ''] + + try: self.plant_protection_das = jsonparams['treatment']['protection']['Protection application DAS'] + except: + try: + self.plant_protection_das = jsonparams['Protection application DAS'] + print('\033[33m' + 'Old style: Protection application DAS' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Protection application DAS' + '\033[0m') + self.plant_protection_das = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + + try: self.plant_protection_dose = jsonparams['treatment']['protection']['Protection dose'] + except: + try: + self.plant_protection_dose = jsonparams['Protection dose'] + print('\033[33m' + 'Old style: Protection dose' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Protection dose' + '\033[0m') + self.plant_protection_dose = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1] for n in range(10): if self.plant_nutrient_dates[n] != '': self.plant_nutrient_date[n] = datetime.datetime.strptime(self.plant_nutrient_dates[n],'%Y-%m-%d') diff --git a/Applications/relax2/process_handler.py b/Applications/relax2/process_handler.py index ad69f4d5..679f7752 100644 --- a/Applications/relax2/process_handler.py +++ b/Applications/relax2/process_handler.py @@ -237,14 +237,12 @@ def image_process(self): def image_3D_process(self): # Load kspace from file self.procdata = np.genfromtxt(params.datapath + '.txt', dtype=np.complex64) - self.kspace_temp = np.transpose(self.procdata) - - params.kspace = np.array(np.zeros((params.SPEsteps, int(self.kspace_temp.shape[0] / params.SPEsteps), int(self.kspace_temp.shape[1])), dtype=np.complex64)) - + self.kspace_temp = np.array(np.zeros((params.SPEsteps, self.procdata.shape[0], params.nPE), dtype=np.complex64)) for n in range(params.SPEsteps): - self.kspace_temp2 = self.kspace_temp[int(n * self.kspace_temp.shape[0] / params.SPEsteps):int(n * self.kspace_temp.shape[0] / params.SPEsteps + self.kspace_temp.shape[0] / params.SPEsteps), :] - - params.kspace[n, 0:int(self.kspace_temp.shape[0] / params.SPEsteps), :] = self.kspace_temp[int(n * self.kspace_temp.shape[0] / params.SPEsteps):int(n * self.kspace_temp.shape[0] / params.SPEsteps + int(self.kspace_temp.shape[0] / params.SPEsteps)), :] + self.kspace_temp[n, :, :] = self.procdata[:, n*params.nPE:n*params.nPE+params.nPE] + params.kspace = np.array(np.zeros((params.SPEsteps, params.nPE, self.procdata.shape[0]), dtype=np.complex64)) + for m in range(params.SPEsteps): + params.kspace[m,:, :] = np.transpose(self.kspace_temp[m, :, :]) self.kspace_centerx = int(params.kspace.shape[2] / 2) self.kspace_centery = int(params.kspace.shape[1] / 2) @@ -262,7 +260,7 @@ def image_3D_process(self): params.img = I[:, :, self.kspace_centerx - int(params.kspace.shape[1] / 2 * params.ROBWscaler):self.kspace_centerx + int(params.kspace.shape[1] / 2 * params.ROBWscaler)] params.img_mag = self.img_mag_full[:, :, self.kspace_centerx - int(params.kspace.shape[1] / 2 * params.ROBWscaler):self.kspace_centerx + int(params.kspace.shape[1] / 2 * params.ROBWscaler)] - params.img_pha = self.img_pha_full[:, :, self.kspace_centerx - int(params.kspace.shape[1] / 2 * params.ROBWscaler):self.kspace_centerx + int(params.kspace.shape[1] / 2 * params.ROBWscaler)] # print(params.img_mag.shape) + params.img_pha = self.img_pha_full[:, :, self.kspace_centerx - int(params.kspace.shape[1] / 2 * params.ROBWscaler):self.kspace_centerx + int(params.kspace.shape[1] / 2 * params.ROBWscaler)] print('3D Image data processed!') @@ -1227,24 +1225,21 @@ def image_stitching_2D_process(self): params.img_st_pha = np.array(np.zeros((self.imageexp_total_pixel, params.nPE))) for n in range(0, params.motor_image_count): - if params.motor_movement_step > 0: - params.datapath = (self.datapath_temp + '/Image_Stitching_' + str(n + 1)) - else: - params.datapath = (self.datapath_temp + '/Image_Stitching_' + str(params.motor_image_count - n)) + if params.motor_movement_step < 0: params.datapath = (self.datapath_temp + '/Image_Stitching_' + str(n + 1)) + else: params.datapath = (self.datapath_temp + '/Image_Stitching_' + str(params.motor_image_count - n)) print('Processing... ' + str(n+1) + '/' + str(params.motor_image_count)) - proc.image_process() - + if params.motor_movement_step <= params.FOV: - params.img_st[int(n * self.imagecrop_image_pixel):int(n * self.imagecrop_image_pixel + self.imagecrop_image_pixel), :] = params.img[int(params.nPE / 2 - self.imagecrop_image_pixel / 2):int(params.nPE / 2 - self.imagecrop_image_pixel / 2 + self.imagecrop_image_pixel), :] - params.img_st_mag[int(n * self.imagecrop_image_pixel):int(n * self.imagecrop_image_pixel + self.imagecrop_image_pixel), :] = params.img_mag[int(params.nPE / 2 - self.imagecrop_image_pixel / 2):int(params.nPE / 2 - self.imagecrop_image_pixel / 2 + self.imagecrop_image_pixel), :] - params.img_st_pha[int(n * self.imagecrop_image_pixel):int(n * self.imagecrop_image_pixel + self.imagecrop_image_pixel), :] = params.img_pha[int(params.nPE / 2 - self.imagecrop_image_pixel / 2):int(params.nPE / 2 - self.imagecrop_image_pixel / 2 + self.imagecrop_image_pixel), :] + params.img_st[int(n * self.imagecrop_image_pixel):int(n * self.imagecrop_image_pixel + self.imagecrop_image_pixel), :] = np.flipud(params.img[int(params.nPE / 2 - self.imagecrop_image_pixel / 2):int(params.nPE / 2 - self.imagecrop_image_pixel / 2 + self.imagecrop_image_pixel), :]) + params.img_st_mag[int(n * self.imagecrop_image_pixel):int(n * self.imagecrop_image_pixel + self.imagecrop_image_pixel), :] = np.flipud(params.img_mag[int(params.nPE / 2 - self.imagecrop_image_pixel / 2):int(params.nPE / 2 - self.imagecrop_image_pixel / 2 + self.imagecrop_image_pixel), :]) + params.img_st_pha[int(n * self.imagecrop_image_pixel):int(n * self.imagecrop_image_pixel + self.imagecrop_image_pixel), :] = np.flipud(params.img_pha[int(params.nPE / 2 - self.imagecrop_image_pixel / 2):int(params.nPE / 2 - self.imagecrop_image_pixel / 2 + self.imagecrop_image_pixel), :]) else: - params.img_st[int(n * self.imagecrop_image_pixel):int(n * self.imagecrop_image_pixel + params.nPE), :] = params.img[:, :] - params.img_st_mag[int(n * self.imagecrop_image_pixel):int(n * self.imagecrop_image_pixel + params.nPE), :] = params.img_mag[:, :] - params.img_st_pha[int(n * self.imagecrop_image_pixel):int(n * self.imagecrop_image_pixel + params.nPE), :] = params.img_pha[:, :] - + params.img_st[int(n * self.imagecrop_image_pixel):int(n * self.imagecrop_image_pixel + params.nPE), :] = np.flipud(params.img[:, :]) + params.img_st_mag[int(n * self.imagecrop_image_pixel):int(n * self.imagecrop_image_pixel + params.nPE), :] = np.flipud(params.img_mag[:, :]) + params.img_st_pha[int(n * self.imagecrop_image_pixel):int(n * self.imagecrop_image_pixel + params.nPE), :] = np.flipud(params.img_pha[:, :]) + params.img_st = params.img_st params.img_st_mag = params.img_st_mag params.img_st_pha = params.img_st_pha @@ -1265,24 +1260,21 @@ def image_stitching_2D_process(self): params.img_st_pha = np.array(np.zeros((params.nPE, self.imageexp_total_pixel))) for n in range(0, params.motor_image_count): - if params.motor_movement_step < 0: - params.datapath = (self.datapath_temp + '/Image_Stitching_' + str(n + 1)) - else: - params.datapath = (self.datapath_temp + '/Image_Stitching_' + str(params.motor_image_count - n)) + if params.motor_movement_step > 0: params.datapath = (self.datapath_temp + '/Image_Stitching_' + str(n + 1)) + else: params.datapath = (self.datapath_temp + '/Image_Stitching_' + str(params.motor_image_count - n)) print('Processing... ' + str(n+1) + '/' + str(params.motor_image_count)) - proc.image_process() - + if params.motor_movement_step <= params.FOV: - params.img_st[:, int(n * self.imagecrop_image_pixel):int(n * self.imagecrop_image_pixel + self.imagecrop_image_pixel)] = params.img[:,int(params.nPE / 2 - self.imagecrop_image_pixel / 2):int(params.nPE / 2 - self.imagecrop_image_pixel / 2 + self.imagecrop_image_pixel)] - params.img_st_mag[:, int(n * self.imagecrop_image_pixel):int(n * self.imagecrop_image_pixel + self.imagecrop_image_pixel)] = params.img_mag[:,int(params.nPE / 2 - self.imagecrop_image_pixel / 2):int(params.nPE / 2 - self.imagecrop_image_pixel / 2 + self.imagecrop_image_pixel)] - params.img_st_pha[:, int(n * self.imagecrop_image_pixel):int(n * self.imagecrop_image_pixel + self.imagecrop_image_pixel)] = params.img_pha[:,int(params.nPE / 2 - self.imagecrop_image_pixel / 2):int(params.nPE / 2 - self.imagecrop_image_pixel / 2 + self.imagecrop_image_pixel)] + params.img_st[:, int(n * self.imagecrop_image_pixel):int(n * self.imagecrop_image_pixel + self.imagecrop_image_pixel)] = np.fliplr(params.img[:,int(params.nPE / 2 - self.imagecrop_image_pixel / 2):int(params.nPE / 2 - self.imagecrop_image_pixel / 2 + self.imagecrop_image_pixel)]) + params.img_st_mag[:, int(n * self.imagecrop_image_pixel):int(n * self.imagecrop_image_pixel + self.imagecrop_image_pixel)] = np.fliplr(params.img_mag[:,int(params.nPE / 2 - self.imagecrop_image_pixel / 2):int(params.nPE / 2 - self.imagecrop_image_pixel / 2 + self.imagecrop_image_pixel)]) + params.img_st_pha[:, int(n * self.imagecrop_image_pixel):int(n * self.imagecrop_image_pixel + self.imagecrop_image_pixel)] = np.fliplr(params.img_pha[:,int(params.nPE / 2 - self.imagecrop_image_pixel / 2):int(params.nPE / 2 - self.imagecrop_image_pixel / 2 + self.imagecrop_image_pixel)]) else: - params.img_st[:,int(n * self.imagecrop_image_pixel):int(n * self.imagecrop_image_pixel + params.nPE)] = params.img[:, :] - params.img_st_mag[:, int(n * self.imagecrop_image_pixel):int(n * self.imagecrop_image_pixel + params.nPE)] = params.img_mag[:, :] - params.img_st_pha[:, int(n * self.imagecrop_image_pixel):int(n * self.imagecrop_image_pixel + params.nPE)] = params.img_pha[:, :] - + params.img_st[:,int(n * self.imagecrop_image_pixel):int(n * self.imagecrop_image_pixel + params.nPE)] = np.fliplr(params.img[:, :]) + params.img_st_mag[:, int(n * self.imagecrop_image_pixel):int(n * self.imagecrop_image_pixel + params.nPE)] = np.fliplr(params.img_mag[:, :]) + params.img_st_pha[:, int(n * self.imagecrop_image_pixel):int(n * self.imagecrop_image_pixel + params.nPE)] = np.fliplr(params.img_pha[:, :]) + params.img_st = params.img_st params.img_st_mag = params.img_st_mag params.img_st_pha = params.img_st_pha @@ -1297,7 +1289,6 @@ def image_stitching_2D_process(self): params.datapath = (self.datapath_temp + '/Image_Stitching_' + str(n + 1)) print('Processing... ' + str(n+1) + '/' + str(params.motor_image_count)) - proc.image_process() params.img_st[:, n * params.nPE:int(n * params.nPE + params.nPE)] = params.img[:, :] @@ -1398,7 +1389,6 @@ def image_stitching_3D_slab(self, motor=None): if params.headerfileformat == 0: params.save_header_file_txt() else: params.save_header_file_json() - #time.sleep(params.TR / 1000) else: for n in range(params.motor_image_count): params.datapath = (self.datapath_temp + '/Image_Stitching_' + str(n + 1)) @@ -1434,7 +1424,134 @@ def image_stitching_3D_slab(self, motor=None): params.motor_goto_position = self.motor_goto_position_temp self.motor_move(motor=motor) - print('Stitched 3D slabs acquired!') + print('Stitched 3D SE slabs acquired!') + + def image_stitching_3D_TSE_slab(self, motor=None): + print('Measuring stitched images 3D TSE slab...') + + if os.path.isdir(params.datapath) != True: os.mkdir(params.datapath) + else: + shutil.rmtree(params.datapath) + os.mkdir(params.datapath) + + self.datapath_temp = '' + self.datapath_temp = params.datapath + params.datapath = params.datapath + '/Image_Stitching' + self.motor_goto_position_temp = 0 + self.motor_goto_position_temp = params.motor_goto_position + + motor_positions = np.linspace(params.motor_start_position, params.motor_end_position, num=params.motor_image_count) + + self.estimated_time = params.motor_image_count*params.motor_settling_time*1000 + params.motor_image_count*params.SPEsteps*params.nPE*((100 + 2*params.flippulselength + params.TE*1000 + (params.TS*1000)/2 + 400 + params.spoilertime) / 1000 + params.TR) + + if params.headerfileformat == 0: params.save_header_file_txt() + else: params.save_header_file_json() + + if params.autorecenter == 1: + params.motor_goto_position = params.motor_AC_position + self.motor_move(motor=motor) + print('Settling for Autocenter...') + if params.measurement_time_dialog == 1: + msg_box = QMessageBox() + msg_box.setText('Settling for Autocenter...') + msg_box.setStandardButtons(QMessageBox.Ok) + msg_box.button(QMessageBox.Ok).animateClick(params.motor_settling_time*1000) + msg_box.button(QMessageBox.Ok).hide() + msg_box.exec() + else: time.sleep(params.motor_settling_time) + self.frequencyoffset_temp = 0 + self.frequencyoffset_temp = params.frequencyoffset + params.frequencyoffset = 0 + seq.RXconfig_upload() + seq.Gradients_upload() + seq.Frequency_upload() + seq.RFattenuation_upload() + seq.SE_Gs_setup() + seq.Sequence_upload() + seq.acquire_spectrum_SE_Gs() + proc.spectrum_process() + proc.spectrum_analytics() + params.frequency = params.centerfrequency + params.saveFileParameter() + params.frequencyoffset = self.frequencyoffset_temp + print('Autorecenter to: ' + str(params.frequency) + 'MHz') + if params.measurement_time_dialog == 1: + msg_box = QMessageBox() + msg_box.setText('Autorecenter to: ' + str(params.frequency) + 'MHz') + msg_box.setStandardButtons(QMessageBox.Ok) + msg_box.button(QMessageBox.Ok).animateClick(params.TR-10) + msg_box.button(QMessageBox.Ok).hide() + msg_box.exec() + else: time.sleep((params.TR-10)/1000) + time.sleep(0.01) + + params.motor_current_image_count = 0 + + for n in range(params.motor_image_count): + params.datapath = (self.datapath_temp + '/Image_Stitching_' + str(n + 1)) + params.motor_current_image_count = n + + params.motor_goto_position = motor_positions[n] + self.motor_move(motor=motor) + + print('Position: ', n + 1, '/', params.motor_image_count) + + self.remaining_time = (self.estimated_time - n*params.motor_settling_time*1000 - n*params.SPEsteps*params.nPE*((100 + 2*params.flippulselength + params.TE*1000 + (params.TS*1000)/2 + 400 + params.spoilertime) / 1000 + params.TR)) / 1000 + self.remaining_time_h = math.floor(self.remaining_time / (3600)) + self.remaining_time_min = math.floor(self.remaining_time / 60) + self.remaining_time_s = int(self.remaining_time % 60) + if params.measurement_time_dialog == 1: + msg_box = QMessageBox() + msg_box.setText('Position: ' + str(n+1) + '/' + str(params.motor_image_count) + '\nRemaining time [h:min:s]: ' + str(self.remaining_time_h).zfill(2) + '.' + str(self.remaining_time_min).zfill(2) + ':' + str(self.remaining_time_s).zfill(2) + '\nSettling...') + msg_box.setStandardButtons(QMessageBox.Ok) + msg_box.button(QMessageBox.Ok).animateClick(params.motor_settling_time*1000) + msg_box.button(QMessageBox.Ok).hide() + msg_box.exec() + else: + print('Position: ' + str(n+1) + '/' + str(params.motor_image_count) + '\nRemaining time [h:min:s]: ' + str(self.remaining_time_h).zfill(2) + '.' + str(self.remaining_time_min).zfill(2) + ':' + str(self.remaining_time_s).zfill(2) + '\nSettling...') + time.sleep(params.motor_settling_time) + + seq.sequence_upload() + + if params.headerfileformat == 0: params.save_header_file_txt() + else: params.save_header_file_json() + + else: + for n in range(params.motor_image_count): + params.datapath = (self.datapath_temp + '/Image_Stitching_' + str(n + 1)) + + params.motor_goto_position = motor_positions[n] + self.motor_move(motor=motor) + + print('Position: ', n + 1, '/', params.motor_image_count) + + self.remaining_time = (self.estimated_time - n * params.motor_settling_time - n * params.SPEsteps * params.nPE * ((100 + 2*params.flippulselength + params.TE*1000 + (params.TS*1000)/2 + 400 + params.spoilertime) / 1000 + params.TR)) / 1000 + self.remaining_time_h = math.floor(self.remaining_time / (3600)) + self.remaining_time_min = math.floor(self.remaining_time / 60) + self.remaining_time_s = int(self.remaining_time % 60) + if params.measurement_time_dialog == 1: + msg_box = QMessageBox() + msg_box.setText('Position: ' + str(n+1) + '/' + str(params.motor_image_count) + '\nRemaining time [h:min:s]: ' + str(self.remaining_time_h).zfill(2) + '.' + str(self.remaining_time_min).zfill(2) + ':' + str(self.remaining_time_s).zfill(2) + '\nSettling...') + msg_box.setStandardButtons(QMessageBox.Ok) + msg_box.button(QMessageBox.Ok).animateClick(params.motor_settling_time*1000) + msg_box.button(QMessageBox.Ok).hide() + msg_box.exec() + else: + print('Position: ' + str(n+1) + '/' + str(params.motor_image_count) + '\nRemaining time [h:min:s]: ' + str(self.remaining_time_h).zfill(2) + '.' + str(self.remaining_time_min).zfill(2) + ':' + str(self.remaining_time_s).zfill(2) + '\nSettling...') + time.sleep(params.motor_settling_time) + + seq.sequence_upload() + + if params.headerfileformat == 0: params.save_header_file_txt() + else: params.save_header_file_json() + + os.remove(self.datapath_temp + '/Image_Stitching.txt') + + params.datapath = self.datapath_temp + params.motor_goto_position = self.motor_goto_position_temp + self.motor_move(motor=motor) + + print('Stitched 3D TSE slabs acquired!') def image_stitching_3D_process(self): self.datapath_temp = '' @@ -1457,10 +1574,8 @@ def image_stitching_3D_process(self): params.img_st_pha = np.array(np.zeros((params.SPEsteps, self.imageexp_total_pixel, params.nPE))) for n in range(params.motor_image_count): - if params.motor_movement_step < 0: - params.datapath = (self.datapath_temp + '/Image_Stitching_' + str(n + 1)) - else: - params.datapath = (self.datapath_temp + '/Image_Stitching_' + str(params.motor_image_count - n)) + if params.motor_movement_step < 0: params.datapath = (self.datapath_temp + '/Image_Stitching_' + str(n + 1)) + else: params.datapath = (self.datapath_temp + '/Image_Stitching_' + str(params.motor_image_count - n)) print('Processing... ' + str(n+1) + '/' + str(params.motor_image_count)) @@ -1492,10 +1607,8 @@ def image_stitching_3D_process(self): params.img_st_pha = np.array(np.zeros((params.SPEsteps, params.nPE, self.imageexp_total_pixel))) for n in range(params.motor_image_count): - if params.motor_movement_step > 0: - params.datapath = (self.datapath_temp + '/Image_Stitching_' + str(n + 1)) - else: - params.datapath = (self.datapath_temp + '/Image_Stitching_' + str(params.motor_image_count - n)) + if params.motor_movement_step > 0: params.datapath = (self.datapath_temp + '/Image_Stitching_' + str(n + 1)) + else: params.datapath = (self.datapath_temp + '/Image_Stitching_' + str(params.motor_image_count - n)) print(n+1,'/',params.motor_image_count) @@ -1525,23 +1638,21 @@ def image_stitching_3D_process(self): params.img_st_pha = np.array(np.zeros((self.imageexp_total_pixel, params.nPE, params.nPE))) for n in range(params.motor_image_count): - if params.motor_movement_step > 0: - params.datapath = (self.datapath_temp + '/Image_Stitching_' + str(n + 1)) - else: - params.datapath = (self.datapath_temp + '/Image_Stitching_' + str(params.motor_image_count - n)) + if params.motor_movement_step > 0: params.datapath = (self.datapath_temp + '/Image_Stitching_' + str(n + 1)) + else: params.datapath = (self.datapath_temp + '/Image_Stitching_' + str(params.motor_image_count - n)) print(n+1,'/',params.motor_image_count) proc.image_3D_process() - + if params.motor_movement_step <= params.slicethickness: - params.img_st[int(n * self.imagecrop_image_pixel):int(n * self.imagecrop_image_pixel + self.imagecrop_image_pixel), :, :] = params.img[int(params.SPEsteps / 2 - self.imagecrop_image_pixel / 2):int(params.SPEsteps / 2 - self.imagecrop_image_pixel / 2) + self.imagecrop_image_pixel,:, :] - params.img_st_mag[int(n * self.imagecrop_image_pixel):int(n * self.imagecrop_image_pixel + self.imagecrop_image_pixel), :, :] = params.img_mag[int(params.SPEsteps / 2 - self.imagecrop_image_pixel / 2):int(params.SPEsteps / 2 - self.imagecrop_image_pixel / 2) + self.imagecrop_image_pixel,:, :] - params.img_st_pha[int(n * self.imagecrop_image_pixel):int(n * self.imagecrop_image_pixel + self.imagecrop_image_pixel), :, :] = params.img_pha[int(params.SPEsteps / 2 - self.imagecrop_image_pixel / 2):int(params.SPEsteps / 2 - self.imagecrop_image_pixel / 2) + self.imagecrop_image_pixel,:, :] + params.img_st[int(n * self.imagecrop_image_pixel):int(n * self.imagecrop_image_pixel + self.imagecrop_image_pixel), :, :] = np.flip(params.img[int(params.SPEsteps / 2 - self.imagecrop_image_pixel / 2):int(params.SPEsteps / 2 - self.imagecrop_image_pixel / 2) + self.imagecrop_image_pixel,:, :],axis=0) + params.img_st_mag[int(n * self.imagecrop_image_pixel):int(n * self.imagecrop_image_pixel + self.imagecrop_image_pixel), :, :] = np.flip(params.img_mag[int(params.SPEsteps / 2 - self.imagecrop_image_pixel / 2):int(params.SPEsteps / 2 - self.imagecrop_image_pixel / 2) + self.imagecrop_image_pixel,:, :],axis=0) + params.img_st_pha[int(n * self.imagecrop_image_pixel):int(n * self.imagecrop_image_pixel + self.imagecrop_image_pixel), :, :] = np.flip(params.img_pha[int(params.SPEsteps / 2 - self.imagecrop_image_pixel / 2):int(params.SPEsteps / 2 - self.imagecrop_image_pixel / 2) + self.imagecrop_image_pixel,:, :],axis=0) else: - params.img_st[int(n * self.imagecrop_image_pixel):int(n * self.imagecrop_image_pixel + params.SPEsteps), :,:] = params.img[:, :, :] - params.img_st_mag[int(n * self.imagecrop_image_pixel):int(n * self.imagecrop_image_pixel + params.SPEsteps), :,:] = params.img_mag[:, :, :] - params.img_st_pha[int(n * self.imagecrop_image_pixel):int(n * self.imagecrop_image_pixel + params.SPEsteps), :,:] = params.img_pha[:, :, :] + params.img_st[int(n * self.imagecrop_image_pixel):int(n * self.imagecrop_image_pixel + params.SPEsteps), :,:] = np.flip(params.img[:, :, :],axis=0) + params.img_st_mag[int(n * self.imagecrop_image_pixel):int(n * self.imagecrop_image_pixel + params.SPEsteps), :,:] = np.flip(params.img_mag[:, :, :],axis=0) + params.img_st_pha[int(n * self.imagecrop_image_pixel):int(n * self.imagecrop_image_pixel + params.SPEsteps), :,:] = np.flip(params.img_pha[:, :, :],axis=0) params.datapath = self.datapath_temp diff --git a/Applications/relax2/sequence_handler.py b/Applications/relax2/sequence_handler.py index 09c52a78..84b1de66 100644 --- a/Applications/relax2/sequence_handler.py +++ b/Applications/relax2/sequence_handler.py @@ -479,6 +479,10 @@ def sequence_upload(self): self.Image_3D_SE_Gs_setup() self.Sequence_upload() self.acquire_image_3D_SE_Gs() + elif params.sequence == 11: + self.Image_3D_TSE_Gs_setup() + self.Sequence_upload() + self.acquire_image_3D_TSE_Gs() else: print('Sequence not defined!') def conn_client(self): @@ -4134,7 +4138,7 @@ def acquire_image_3D_SE_Gs(self): self.kspace = np.array(np.zeros((params.SPEsteps, params.nPE, self.data_idx), dtype = np.complex64)) if params.GUImode == 1 and params.sequence == 35: self.estimated_time = params.SPEsteps * params.nPE * ((100 + 2*params.flippulselength + params.TE*1000 + (params.TS*1000)/2 + 400 + params.spoilertime) / 1000 + params.TR) - if params.GUImode == 5 and params.sequence == 10: self.estimated_time = (params.motor_image_count-1)*params.motor_settling_time*1000 + params.motor_image_count * params.SPEsteps * params.nPE * ((100 + 2*params.flippulselength + params.TE*1000 + (params.TS*1000)/2 + 400 + params.spoilertime) / 1000 + params.TR) + if params.GUImode == 5: self.estimated_time = (params.motor_image_count-1)*params.motor_settling_time*1000 + params.motor_image_count * params.SPEsteps * params.nPE * ((100 + 2*params.flippulselength + params.TE*1000 + (params.TS*1000)/2 + 400 + params.spoilertime) / 1000 + params.TR) if params.GUImode == 5: print('Position: ' + str(params.motor_current_image_count+1) + '/' + str(params.motor_image_count)) @@ -4206,7 +4210,12 @@ def acquire_image_3D_TSE_Gs(self): self.kspacetemp = np.matrix(np.zeros((params.nPE, self.data_idx), dtype = np.complex64)) self.kspace = np.array(np.zeros((params.SPEsteps, params.nPE, self.data_idx), dtype = np.complex64)) - + + if params.GUImode == 1 and params.sequence == 36: self.estimated_time = params.SPEsteps * params.nPE * ((100 + 2*params.flippulselength + params.TE*1000 + (params.TS*1000)/2 + 400 + params.spoilertime) / 1000 + params.TR) + if params.GUImode == 5: self.estimated_time = (params.motor_image_count-1)*params.motor_settling_time*1000 + params.motor_image_count * params.SPEsteps * params.nPE * ((100 + 2*params.flippulselength + params.TE*1000 + (params.TS*1000)/2 + 400 + params.spoilertime) / 1000 + params.TR) + + if params.GUImode == 5: print('Position: ' + str(params.motor_current_image_count+1) + '/' + str(params.motor_image_count)) + socket.write(struct.pack(' Date: Tue, 10 Mar 2026 17:37:46 +0100 Subject: [PATCH 2/5] add missing ui file --- Applications/relax2/ui/agriMRI.ui | 923 ++++++++++++++++-------------- 1 file changed, 490 insertions(+), 433 deletions(-) diff --git a/Applications/relax2/ui/agriMRI.ui b/Applications/relax2/ui/agriMRI.ui index db1afcf4..d23b92db 100644 --- a/Applications/relax2/ui/agriMRI.ui +++ b/Applications/relax2/ui/agriMRI.ui @@ -55,8 +55,8 @@ 5 - - + + 200 @@ -69,21 +69,16 @@ 30 - - - true - - - Bio Stimulant Treatment + Application Qt::AlignCenter - - + + 200 @@ -97,50 +92,69 @@ - Part ID + Experiment ID Qt::AlignCenter - - + + - 150 + 200 30 - 150 + 200 30 - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + - - -1 + + Nutrient Availability - - 10000 + + Qt::AlignCenter - - + + - 150 + 200 + 30 + + + + + 200 30 + + + 12 + + + + Date Of Application + + + Qt::AlignCenter + - - + + 200 @@ -153,16 +167,21 @@ 30 + + + true + + - Phenological Phase + Bio Stimulant Treatment Qt::AlignCenter - - + + 200 @@ -176,40 +195,43 @@ - Measurement Date + Part ID Qt::AlignCenter - - + + - 150 + 200 30 - 150 + 200 30 - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 75 + true + - - -1 + + Structure - - 10000 + + Qt::AlignCenter - - + + 150 @@ -222,57 +244,78 @@ 30 - - Outside + + Qt::AlignCenter - - false + + true - - + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + - 150 + 200 30 - 150 + 200 30 + + + true + + - Inside + Plant Protection Treatment - - false + + Qt::AlignCenter - - + + - 150 + 200 30 - 150 + 200 30 + + Application + Qt::AlignCenter - - + + 200 @@ -293,8 +336,8 @@ - - + + 150 @@ -311,15 +354,15 @@ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - -10000 + -1 10000 - - + + 150 @@ -332,28 +375,19 @@ 30 - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - -10000 - - - 10000 - - - + + - 150 + 200 30 - 150 + 200 30 @@ -365,57 +399,52 @@ - - + + - 200 + 150 30 - 200 + 150 30 - Qt::AlignCenter + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - true + + -1 + + + 10000 - - + + - 200 + 150 30 - 200 + 150 30 - - - 12 - - - - Date Of Application - Qt::AlignCenter - - + + 200 @@ -429,15 +458,15 @@ - Nitrogen [%] + Plant ID Qt::AlignCenter - - + + 200 @@ -450,16 +479,22 @@ 30 + + + 75 + true + + - Product Name + Plant Parameter Qt::AlignCenter - - + + 150 @@ -477,8 +512,8 @@ - - + + 200 @@ -492,14 +527,14 @@ - Date Of Application + Product Name Qt::AlignCenter - + @@ -524,35 +559,33 @@ - - + + - 200 + 150 30 - 200 + 150 30 - - - true - + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - Nutrient Availability + + -1 - - Qt::AlignCenter + + 100 - - + + 150 @@ -568,51 +601,41 @@ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - dd/MM/yyyy + + -1 + + + 100 - - + + - 200 + 150 30 - 200 + 150 30 - - Appl. Days After Sowing - - Qt::AlignCenter + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - 150 - 30 - + + -1 - - - 150 - 30 - + + 100 - - + + 200 @@ -633,21 +656,8 @@ - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - + + 200 @@ -660,21 +670,16 @@ 30 - - - true - - - Plant Protection Treatment + Dose [mg] Qt::AlignCenter - - + + 150 @@ -692,8 +697,8 @@ - - + + 150 @@ -709,13 +714,16 @@ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - dd/MM/yyyy + + -10000 + + + 10000 - - + + 200 @@ -729,15 +737,15 @@ - Date of Sowing + Appl. Days After Sowing Qt::AlignCenter - - + + 200 @@ -751,37 +759,31 @@ - Appl. Days After Sowing + Seed Coating Qt::AlignCenter - - + + - 200 + 150 30 - 200 + 150 30 - - Product Name - - - Qt::AlignCenter - - - + + 150 @@ -802,8 +804,8 @@ - - + + 150 @@ -816,13 +818,10 @@ 30 - - Qt::AlignCenter - - - + + 200 @@ -836,43 +835,37 @@ - Experiment ID + Species Qt::AlignCenter - - + + - 200 + 150 30 - 200 + 150 30 - - - 75 - true - - - - Structure - - Qt::AlignCenter + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + dd/MM/yyyy - - + + 200 @@ -886,15 +879,15 @@ - Meas. Days After Sowing + Date Of Application Qt::AlignCenter - - + + 200 @@ -908,59 +901,44 @@ - Species + Potassium [%] Qt::AlignCenter - - + + - 200 - 30 - - - - - 200 + 150 30 - - Date Of Application - - - Qt::AlignCenter - - - + + - 200 + 150 30 - 200 + 150 30 - - Plant ID - Qt::AlignCenter - - + + 150 @@ -977,37 +955,37 @@ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - -1 + -10000 - 100 + 10000 - - + + - 200 + 150 30 - 200 + 150 30 - - Light Source - - Qt::AlignCenter + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + dd/MM/yyyy - - + + 150 @@ -1020,66 +998,64 @@ 30 - - Show Phase Images - - - false - - - + + - 200 + 150 30 - 200 + 150 30 - - Phosphorus [%] - Qt::AlignCenter - - - + + + + Qt::Horizontal + + - 200 - 30 + 40 + 20 - - + + + + + + 200 30 - - - 75 - true - + + + 200 + 30 + - Plant Parameter + Appl. Days After Sowing Qt::AlignCenter - - + + 200 @@ -1093,40 +1069,59 @@ - Environment + Date Of Application Qt::AlignCenter - - + + - 150 + 200 30 - 150 + 200 30 + + Appl. Days After Sowing + - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignCenter - - -1 + + + + + + + 200 + 30 + - - 100 + + + 200 + 30 + + + + Nitrogen [%] + + + Qt::AlignCenter - - + + 200 @@ -1140,28 +1135,37 @@ - Appl. Days After Sowing + Product Name Qt::AlignCenter - - - - Qt::Horizontal + + + + + 200 + 30 + - + - 40 - 20 + 200 + 30 - + + Phosphorus [%] + + + Qt::AlignCenter + + - - + + 150 @@ -1175,12 +1179,18 @@ - Qt::AlignCenter + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + -1 + + + 100 - - + + 150 @@ -1196,13 +1206,16 @@ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - dd/MM/yyyy + + -1 + + + 100 - - + + 200 @@ -1216,15 +1229,15 @@ - Application + Light Source Qt::AlignCenter - - + + 200 @@ -1238,15 +1251,15 @@ - Potassium [%] + Water Availability [%] Qt::AlignCenter - - + + 150 @@ -1259,60 +1272,60 @@ 30 - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + Artificial/Ambient - - dd/MM/yyyy + + false - - + + - 200 + 150 30 - 200 + 150 30 - Dose [mg] + LED Grow Light - - Qt::AlignCenter + + false - - + + - 200 + 150 30 - 200 + 150 30 - Application + Sun - - Qt::AlignCenter + + false - - + + 150 @@ -1325,10 +1338,16 @@ 30 + + Inside + + + false + - - + + 150 @@ -1341,13 +1360,16 @@ 30 - - Qt::AlignCenter + + Outside + + + false - - + + 150 @@ -1361,15 +1383,31 @@ - Today + Show Phase Images false - - + + + + + 150 + 30 + + + + + 150 + 30 + + + + + + 150 @@ -1393,8 +1431,8 @@ - - + + 150 @@ -1407,32 +1445,38 @@ 30 + + Today + + + false + - - + + - 200 + 150 30 - 200 + 150 30 - - Part Name - - Qt::AlignCenter + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + dd/MM/yyyy - - + + 150 @@ -1445,10 +1489,16 @@ 30 + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + dd/MM/yyyy + - - + + 150 @@ -1462,18 +1512,12 @@ - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - -1 - - - 100 + Qt::AlignCenter - + 200 @@ -1487,15 +1531,15 @@ - Water Availability [%] + Light Availability [%] Qt::AlignCenter - - + + 200 @@ -1509,62 +1553,81 @@ - Light Availability [%] + Environment Qt::AlignCenter - - + + - 150 + 200 30 - 150 + 200 30 - Sun + Phenological Phase - - false + + Qt::AlignCenter - - + + - 150 + 200 30 - 150 + 200 30 + + Meas. Days After Sowing + - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignCenter - - -1 + + + + + + + 200 + 30 + - - 100 + + + 200 + 30 + + + + Measurement Date + + + Qt::AlignCenter - - + + 150 @@ -1577,58 +1640,71 @@ 30 - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + 200 + 30 + - - -1 + + + 200 + 30 + - - 100 + + Date of Sowing + + + Qt::AlignCenter - - + + - 150 + 200 30 - 150 + 200 30 - Artificial/Ambient + Part Name - - false + + Qt::AlignCenter - - + + - 150 + 200 30 - 150 + 200 30 - LED Grow Light + Cultivated Variant - - false + + Qt::AlignCenter @@ -1766,25 +1842,6 @@ Plant_Species_comboBox Plant_Scientific_Name_lineEdit Plant_Taxonomy_lineEdit - Plant_Part_Name_lineEdit - Plant_Date_Of_Sowing_dateEdit - Plant_Measurement_Date_dateEdit - Plant_Nutrient_Application_comboBox - Plant_Nutrient_Date_dateEdit - Plant_Nutrient_DAS_spinBox - Plant_Nitrogen_spinBox - Plant_Phosphorus_spinBox - Plant_Potassium_spinBox - Plant_Stimulant_Application_comboBox - Plant_Stimulant_Product_Name_lineEdit - Plant_Stimulant_Date_dateEdit - Plant_Stimulant_DAS_spinBox - Plant_Stimulant_Dose_spinBox - Plant_Protection_Application_comboBox - Plant_Protection_Product_Name_lineEdit - Plant_Protection_Date_dateEdit - Plant_Protection_DAS_spinBox - Plant_Protection_Dose_spinBox Experiment_Description_textEdit Plant_Description_textEdit From 37e8f6c39b7b4badfd28381287d8f0078983be17 Mon Sep 17 00:00:00 2001 From: marcman86 Date: Mon, 16 Mar 2026 21:29:29 +0100 Subject: [PATCH 3/5] more bbch scales --- Applications/relax2/Relax2_main.py | 4 + .../relax2/agriMRI/BBCH_scale_faba_bean.csv | 72 ++++++++++++++++++ .../agriMRI/BBCH_scale_oilseed_rape.csv | 74 +++++++++++++++++++ .../relax2/agriMRI/BBCH_scale_pea.csv | 58 +++++++++++++++ .../relax2/agriMRI/BBCH_scale_safflower.csv | 74 +++++++++++++++++++ .../relax2/agriMRI/BBCH_scale_sunflower.csv | 50 +++++++++++++ .../relax2/agriMRI/plant_species_library.csv | 30 +++++--- 7 files changed, 351 insertions(+), 11 deletions(-) create mode 100644 Applications/relax2/agriMRI/BBCH_scale_faba_bean.csv create mode 100644 Applications/relax2/agriMRI/BBCH_scale_oilseed_rape.csv create mode 100644 Applications/relax2/agriMRI/BBCH_scale_pea.csv create mode 100644 Applications/relax2/agriMRI/BBCH_scale_safflower.csv create mode 100644 Applications/relax2/agriMRI/BBCH_scale_sunflower.csv diff --git a/Applications/relax2/Relax2_main.py b/Applications/relax2/Relax2_main.py index 5ab38954..d4e66f51 100644 --- a/Applications/relax2/Relax2_main.py +++ b/Applications/relax2/Relax2_main.py @@ -2792,6 +2792,10 @@ def show_Phase_Images(self): elif params.plant_BBCH_scale == 'Maize': page_number = 27 elif params.plant_BBCH_scale == 'Cucurbits': page_number = 134 elif params.plant_BBCH_scale == 'Soybean': page_number = 99 + elif params.plant_BBCH_scale == 'Faba_bean': page_number = 37 + elif params.plant_BBCH_scale == 'Oilseed_rape': page_number = 32 + elif params.plant_BBCH_scale == 'Sunflower': page_number = 40 + elif params.plant_BBCH_scale == 'Pea': page_number = 141 else: page_number = 10 QDesktopServices.openUrl(QUrl('https://www.openagrar.de/servlets/MCRFileNodeServlet/openagrar_derivate_00010428/BBCH-Skala_en.pdf#page=' + str(page_number))) diff --git a/Applications/relax2/agriMRI/BBCH_scale_faba_bean.csv b/Applications/relax2/agriMRI/BBCH_scale_faba_bean.csv new file mode 100644 index 00000000..bdc94199 --- /dev/null +++ b/Applications/relax2/agriMRI/BBCH_scale_faba_bean.csv @@ -0,0 +1,72 @@ +code;description +00;Dry seed +01;Beginning of seed imbibition +03;Seed imbibition complete +05;Radicle emerged from seed +07;Shoot emerged from seed (plumule apparent) +08;Shoot growing towards soil surface +09;Emergence: shoot emerges through soil surface +10;Pair of scale leaves visible (may be eaten or lost) +11;First leaf unfolded +12;2 leaves unfolded +13;3 leaves unfolded +14;4 leaves unfolded +15;5 leaves unfolded +16;6 leaves unfolded +17;7 leaves unfolded +18;8 leaves unfolded +19;9 or more leaves unfolded +20;No side shoots +21;Beginning of side shoot development: first side shoot detectable +22;2 side shoots detectable +23;3 side shoots detectable +24;4 side shoots detectable +25;5 side shoots detectable +26;6 side shoots detectable +27;7 side shoots detectable +28;8 side shoots detectable +29;End of side shoot development: 9 or more side shoots detectable +30;Beginning of stem elongation +31;One visibly extended internode +32;2 visibly extended internodes +33;3 visibly extended internodes +34;4 visibly extended internodes +35;5 visibly extended internodes +36;6 visibly extended internodes +37;7 visibly extended internodes +38;8 visibly extended internodes +39;9 or more visibly extended internodes +50;Flower buds present, still enclosed by leaves +51;First flower buds visible outside leaves +55;First individual flower buds visible outside leaves but still closed +59;First petals visible, many individual flower buds, still closed +60;First flowers open +61;Flowers open on first raceme +63;Flowers open 3 racemes per plant +65;Full flowering: flowers open on 5 racemes per plant +67;Flowering declining +69;End of flowering +70;First pods have reached final length ("flat pod") +71;10% of pods have reached final length +72;20% of pods have reached final length +73;30% of pods have reached final length +74;40% of pods have reached final length +75;50% of pods have reached final length +76;60% of pods have reached final length +77;70% of pods have reached final length +78;80% of pods have reached final length +79;Nearly all pods have reached final length +80;Beginning of ripening: seed green, filling pod cavity +81;10% of pods ripe, seeds dry and hard +82;20% of pods ripe, seeds dry and hard +83;30% of pods ripe and dark, seeds dry and hard +84;40% of pods ripe and dark, seeds dry and hard +85;50% of pods ripe and dark, seeds dry and hard +86;60% of pods ripe and dark, seeds dry and hard +87;70% of pods ripe and dark, seeds dry and hard +88;80% of pods ripe and dark, seeds dry and hard +89;Fully ripe: nearly all pods dark, seeds dry and hard +93;Stems begin to darken +95;50% of stems brown or black +97;Plant dead and dry +99;Harvested product \ No newline at end of file diff --git a/Applications/relax2/agriMRI/BBCH_scale_oilseed_rape.csv b/Applications/relax2/agriMRI/BBCH_scale_oilseed_rape.csv new file mode 100644 index 00000000..4d1a4041 --- /dev/null +++ b/Applications/relax2/agriMRI/BBCH_scale_oilseed_rape.csv @@ -0,0 +1,74 @@ +code;description +00;Dry seed +01;Beginning of seed imbibition +03;Seed imbibition complete +05;Radicle emerged from seed +07;Hypocotyl with cotyledons emerged from seed +08;Hypocotyl with cotyledons growing towards soil surface +09;Emergence: cotyledons emerge through soil surface +10;Cotyledons completely unfolded +11;First leaf unfolded +12;2 leaves unfolded +13;3 leaves unfolded +14;4 leaves unfolded +15;5 leaves unfolded +16;6 leaves unfolded +17;7 leaves unfolded +18;8 leaves unfolded +19;9 or more leaves unfolded +20;No side shoots +21;Beginning of side shoot development: first side shoot detectable +22;2 side shoots detectable +23;3 side shoots detectable +24;4 side shoots detectable +25;5 side shoots detectable +26;6 side shoots detectable +27;7 side shoots detectable +28;8 side shoots detectable +29;End of side shoot development: 9 or more side shoots detectable +30;Beginning of stem elongation: no internodes ("rosette") +31;1 visibly extended internode +32;2 visibly extended internodes +33;3 visibly extended internodes +34;4 visibly extended internodes +35;5 visibly extended internodes +36;6 visibly extended internodes +37;7 visibly extended internodes +38;8 visibly extended internodes +39;9 or more visibly extended internodes +50;Flower buds present, still enclosed by leaves +51;Flower buds visible from above ("green bud") +52;Flower buds free, level with the youngest leaves +53;Flower buds raised above the youngest leaves +55;Individual flower buds (main inflorescence) visible but still closed +57;Individual flower buds (secondary inflorescences) visible but still closed +59;First petals visible, flower buds still closed ("yellow bud") +60;First flowers open +61;10% of flowers on main raceme open, main raceme elongating +62;20% of flowers on main raceme open +63;30% of flowers on main raceme open +64;40% of flowers on main raceme open +65;Full flowering: 50% flowers on main raceme open, older petals falling +67;Flowering declining: majority of petals fallen +69;End of flowering +71;10% of pods have reached final size +72;20% of pods have reached final size +73;30% of pods have reached final size +74;40% of pods have reached final size +75;50% of pods have reached final size +76;60% of pods have reached final size +77;70% of pods have reached final size +78;80% of pods have reached final size +79;Nearly all pods have reached final size +80;Beginning of ripening: seed green, filling pod cavity +81;10% of pods ripe, seeds dark and hard +82;20% of pods ripe, seeds dark and hard +83;30% of pods ripe, seeds dark and hard +84;40% of pods ripe, seeds dark and hard +85;50% of pods ripe, seeds dark and hard +86;60% of pods ripe, seeds dark and hard +87;70% of pods ripe, seeds dark and hard +88;80% of pods ripe, seeds dark and hard +89;Fully ripe: nearly all pods ripe, seeds dark and hard +97;Plant dead and dry +99;Harvested product \ No newline at end of file diff --git a/Applications/relax2/agriMRI/BBCH_scale_pea.csv b/Applications/relax2/agriMRI/BBCH_scale_pea.csv new file mode 100644 index 00000000..06cf4614 --- /dev/null +++ b/Applications/relax2/agriMRI/BBCH_scale_pea.csv @@ -0,0 +1,58 @@ +code;description +00;Dry seed +01;Beginning of seed imbibition +03;Seed imbibition complete +05;Radicle emerged from seed +07;Shoot breaking through seed coat +08;Shoot growing towards soil surface, hypocotyl arch visible +09;Emergence: shoot breaks through soil surface ("cracking stage") +10;Pair of scale leaves visible +11;First true leaf (with stipules) unfolded or first tendril developed +12;2 leaves (with stipules) unfolded or 2 tendrils developed +13;3 leaves (with stipules) unfolded or 3 tendrils developed +14;4 leaves (with stipules) unfolded or 4 tendrils developed +15;5 leaves (with stipules) unfolded or 5 tendrils developed +16;6 leaves (with stipules) unfolded or 6 tendrils developed +17;7 leaves (with stipules) unfolded or 7 tendrils developed +18;8 leaves (with stipules) unfolded or 8 tendrils developed +19;9 or more leaves (with stipules) unfolded or 9 or more tendrils developed +30;Beginning of stem elongation +31;1 visibly extended internode +32;2 visibly extended internodes +33;3 visibly extended internodes +34;4 visibly extended internodes +35;5 visibly extended internodes +36;6 visibly extended internodes +37;7 visibly extended internodes +38;8 visibly extended internodes +39;9 or more visibly extended internodes +51;First flower buds visible outside leaves +55;First separated flower buds visible outside leaves but still closed +59;First petals visible, flowers still closed +60;First flowers open (sporadically within the population) +61;Beginning of flowering: 10% of flowers open +62;20% of flowers open +63;30% of flowers open +64;40% of flowers open +65;Full flowering: 50% of flowers open +67;Flowering declining +69;End of flowering +71;10% of pods have reached typical length, juice exudes if pressed +72;20% of pods have reached typical length, juice exudes if pressed +73;30% of pods have reached typical length, juice exudes if pressed. Tenderometer value: 80 TE +74;40% of pods have reached typical length, juice exudes if pressed. Tenderometer value: 95 TE +75;50% of pods have reached typical length, juice exudes if pressed. Tenderometer value: 105 TE +76;60% of pods have reached typical length, juice exudes if pressed. Tenderometer value: 115 TE +77;70% of pods have reached typical length. Tenderometer value: 130 TE +79;Pods have reached typical size (green ripe), peas fully formed +81;10% of pods ripe, seeds final colour, dry and hard +82;20% of pods ripe, seeds final colour, dry and hard +83;30% of pods ripe, seeds final colour, dry and hard +84;40% of pods ripe, seeds final colour, dry and hard +85;50% of pods ripe, seeds final colour, dry and hard +86;60% of pods ripe, seeds final colour, dry and hard +87;70% of pods ripe, seeds final colour, dry and hard +88;80% of pods ripe, seeds final colour, dry and hard +89;Fully ripe: all pods dry and brown. Seeds dry and hard (dry ripe) +97;Plants dead and dry +99;Harvested product \ No newline at end of file diff --git a/Applications/relax2/agriMRI/BBCH_scale_safflower.csv b/Applications/relax2/agriMRI/BBCH_scale_safflower.csv new file mode 100644 index 00000000..46c8a622 --- /dev/null +++ b/Applications/relax2/agriMRI/BBCH_scale_safflower.csv @@ -0,0 +1,74 @@ +code;description +00;Dry seed +01;Beginning of seed imbibition +03;Seed imbibition complete +05;Radicle emerged from seed +06;Radicle elongated, root hairs and/or side roots visible +07;Hypocotyl with cotyledons emerged from seed +08;Hypocotyl with cotyledons growing towards soil surface +09;Emergence: cotyledons emerge through soil surface +10;Cotyledons completely unfolded +11;First leaf unfolded +12;2 leaves unfolded +13;3 leaves unfolded +14;4 leaves unfolded +15;5 leaves unfolded +16;6 leaves unfolded +17;7 leaves unfolded +18;8 leaves unfolded +19;9 or more leaves unfolded +20;No side shoots +21;Beginning of side shoot development: first side shoot detectable +22;2 side shoots detectable +23;3 side shoots detectable +24;4 side shoots detectable +25;5 side shoots detectable +26;6 side shoots detectable +27;7 side shoots detectable +28;8 side shoots detectable +29;End of side shoots development: 9 or more side shoots detectable +30;Beginning of stem elongation: visibly extended internode n develops between leaf n and leaf n+1 +31;1 visibly extended internode +32;2 visibly extended internodes +33;3 visibly extended internodes +34;4 visibly extended internodes +35;5 visibly extended internodes +36;6 visibly extended internodes +37;7 visibly extended internodes +39;9 or more visibly extended internodes +50;Flower buds present, still enclosed by leaves +51;Flower buds visible from above ("green bud") +52;Flower buds free, level with the youngest leaves +53;Flower buds raised above the youngest leaves +55;Individual flower buds (main inflorescence) visible but still closed +57;Individual flower buds (secondary inflorescences) visible but still closed +59;First petals visible, flower buds still closed ("yellow bud") +60;First flowers open +61;10% of flowers on main raceme open, main raceme elongating +62;20% of flowers on main raceme open +63;30% of flowers on main raceme open +64;40% of flowers on main raceme open +65;Full flowering: 50% of flowers on main raceme open, older petals falling +67;Flowering declining: majority of petals fallen +69;End of flowering +71;10% of pods have reached final size +72;20% of pods have reached final size +73;30% of pods have reached final size +74;40% of pods have reached final size +75;50% of pods have reached final size +76;60% of pods have reached final size +77;70% of pods have reached final size +78;80% of pods have reached final size +79;Nearly all pods have reached final size +80;Beginning of ripening: seed green, filling pod cavity +81;10% of pods ripe, seeds dark and hard +82;20% of pods ripe, seeds dark and hard +83;30% of pods ripe, seeds dark and hard +84;40% of pods ripe, seeds dark and hard +85;50% of pods ripe, seeds dark and hard +86;60% of pods ripe, seeds dark and hard +87;70% of pods ripe, seeds dark and hard +88;80% of pods ripe, seeds dark and hard +89;Fully ripe: nearly all pods ripe, seeds dark and hard +97;Plant dead and dry +99;Harvested product diff --git a/Applications/relax2/agriMRI/BBCH_scale_sunflower.csv b/Applications/relax2/agriMRI/BBCH_scale_sunflower.csv new file mode 100644 index 00000000..bec63dd8 --- /dev/null +++ b/Applications/relax2/agriMRI/BBCH_scale_sunflower.csv @@ -0,0 +1,50 @@ +code;description +00;Dry seed (achene) +01;Beginning of seed imbibition +03;Seed imbibition complete +05;Radicle emerged from seed +06;Radicle elongated, root hairs developing +07;Hypocotyl with cotyledons emerged from seed +08;Hypocotyl with cotyledons growing towards soil surface +09;Emergence: cotyledons emerge through soil surface +10;Cotyledons completely unfolded +12;2 leaves (first pair) unfolded +14;4 leaves (second pair) unfolded +15;5 leaves unfolded +16;6 leaves unfolded +17;7 leaves unfolded +18;8 leaves unfolded +19;9 or more leaves unfolded +30;Beginning of stem elongation +31;1 visibly extended internode +32;2 visibly extended internodes +33;3 visibly extended internodes +34;4 visibly extended internodes +35;5 visibly extended internodes +36;6 visibly extended internodes +37;7 visibly extended internodes +38;8 visibly extended internodes +39;9 or more visibly extended internodes +51;Inflorescence just visible between youngest leaves +53;Inflorescence separating from youngest leaves, bracts distinguishable from foliage leaves +55;Inflorescence separated from youngest foliage leaf +57;Inflorescence clearly separated from foliage leaves +59;Ray florets visible between the bracts, inflorescence still closed +61;Beginning of flowering: ray florets extended, disc florets visible in outer third of inflorescence +63;Disc florets in outer third of inflorescence in bloom (stamens and stigmata visible) +65;Full flowering: disc florets in middle third of inflorescence in bloom (stames and stigmata visible) +67;Flowering declining: disc florets in inner third of inflorescence in bloom (stames and stigmata visible) +69;End of flowering: most disc florets have finished flowering, ray florets dry or fallen +71;Seeds on outer edge of the inflorescence are grey and have reached final size +73;Seeds on outer third of the inflorescence are grey and have reached final size +75;Seeds on middle third of the inflorescence are grey and have reached final size +79;Seeds on inner third of the inflorescence are grey and have reached final size +80;Beginning of ripening: seeds on outer third of anthocarp black and hard. Back of anthocarp still green +81;Seeds on outer third of anthocarp dark and hard. Back ofanthocarp still green +83;Dark of anthocarp yellowish-green, bracts still green. Seeds about 50% dry matter +85;Seeds on middle third of anthocarp dark and hard. Back of anthocarp yellow, bracts brown edged. Seeds about 60% dry matter +87;Physiological ripeness: back of the anthocarp yellow. Bracts marbled brown. Seeds about 75–80% dry matter +89;Fully ripe: seeds on inner third of anthocarp dark and hard. Back of anthocarp brown. Bracts brown. Seeds about 85% dry matter +92;Over ripe, seeds over 90% dry matter +97;Plant dead and dry +99;Harvested product diff --git a/Applications/relax2/agriMRI/plant_species_library.csv b/Applications/relax2/agriMRI/plant_species_library.csv index c416f918..2b3402b7 100644 --- a/Applications/relax2/agriMRI/plant_species_library.csv +++ b/Applications/relax2/agriMRI/plant_species_library.csv @@ -1,12 +1,20 @@ index;common_name;scientific_name;taxonomy;BBCH-scale -0;Wheat;Triticum;NCBI:txid4564;Cereals -1;Rice;Oryza sativa;NCBI:txid4530;Rice -2;Maize;Zea mays;NCBI:txid4577;Maize -3;Zucchini;Cucurbita pepo subsp. pepo;NCBI:txid3664;Cucurbits -4;Olive;Olea europaea;NCBI:txid4146;Olive -5;Grapevine;Vitis vinifera;NCBI:txid29760;Grapevine -6;Tomato;Solanum lycopersicon;NCBI:txid4081;Solanaceous fruits -7;Onion;Allium cepa;NCBI:txid4679;Bulb vegetables -8;Potato;Solanum tuberosum;NCBI:txid4113;Potato -9;Soybean;Glycine max;NCBI:txid3847;Soybean -10;Lettuce;Lactuca;NCBI:txid4235;Leaf vegetables +0;Durum wheat;Triticum turgidum subsp. durum;NCBI:txid4567;Cereals +1;Bread wheat;Triticum aestivum subsp. aestivum;NCBI:txid4565;Cereals +2;Barley;Hordeum vulgare subsp. vulgare;NCBI:txid112509;Cereals +3;Rice;Oryza sativa;NCBI:txid4530;Rice +4;Maize;Zea mays subsp. mays;NCBI:txid381124;Maize +5;Sunflower;Helianthus annuus;NCBI:txid4232;Sunflower +6;Oilseed rape;Brassica napus subsp. napus/oleifera;NCBI:txid138011;Oilseed_rape +7;Safflower;Carthamus tinctorius;NCBI:txid4222;Safflower +8;Soybean;Glycine max;NCBI:txid3847;Soybean +9;Tick bean;Vicia faba subsp. var. minor;NCBI:txid3907;Faba_bean +10;Chickpea;Cicer arietinum;NCBI:txid3827;Pea +11;Zucchini;Cucurbita pepo subsp. pepo;NCBI:txid3664;Cucurbits +12;Olive;Olea europaea;NCBI:txid4146;Olive +13;Grapevine;Vitis vinifera;NCBI:txid29760;Grapevine +14;Tomato;Solanum lycopersicon;NCBI:txid4081;Solanaceous_fruits +15;Onion;Allium cepa;NCBI:txid4679;Bulb vegetables +16;Potato;Solanum tuberosum;NCBI:txid4113;Potato +17;Soybean;Glycine max;NCBI:txid3847;Soybean +18;Lettuce;Lactuca;NCBI:txid4235;Leaf_vegetables From 52d896db3acc868ff1719fb329bdf3e22499f225 Mon Sep 17 00:00:00 2001 From: marcman86 Date: Wed, 18 Mar 2026 11:57:46 +0100 Subject: [PATCH 4/5] fixes to species not in library --- Applications/relax2/Relax2_main.py | 2 +- .../relax2/agriMRI/plant_species_library.csv | 39 ++++++++-------- Applications/relax2/parameter_handler.py | 45 ++++++++++++------- 3 files changed, 49 insertions(+), 37 deletions(-) diff --git a/Applications/relax2/Relax2_main.py b/Applications/relax2/Relax2_main.py index d4e66f51..d214ddac 100644 --- a/Applications/relax2/Relax2_main.py +++ b/Applications/relax2/Relax2_main.py @@ -2795,7 +2795,7 @@ def show_Phase_Images(self): elif params.plant_BBCH_scale == 'Faba_bean': page_number = 37 elif params.plant_BBCH_scale == 'Oilseed_rape': page_number = 32 elif params.plant_BBCH_scale == 'Sunflower': page_number = 40 - elif params.plant_BBCH_scale == 'Pea': page_number = 141 + #elif params.plant_BBCH_scale == 'Pea': page_number = 141 else: page_number = 10 QDesktopServices.openUrl(QUrl('https://www.openagrar.de/servlets/MCRFileNodeServlet/openagrar_derivate_00010428/BBCH-Skala_en.pdf#page=' + str(page_number))) diff --git a/Applications/relax2/agriMRI/plant_species_library.csv b/Applications/relax2/agriMRI/plant_species_library.csv index 2b3402b7..2b8e8070 100644 --- a/Applications/relax2/agriMRI/plant_species_library.csv +++ b/Applications/relax2/agriMRI/plant_species_library.csv @@ -1,20 +1,21 @@ index;common_name;scientific_name;taxonomy;BBCH-scale -0;Durum wheat;Triticum turgidum subsp. durum;NCBI:txid4567;Cereals -1;Bread wheat;Triticum aestivum subsp. aestivum;NCBI:txid4565;Cereals -2;Barley;Hordeum vulgare subsp. vulgare;NCBI:txid112509;Cereals -3;Rice;Oryza sativa;NCBI:txid4530;Rice -4;Maize;Zea mays subsp. mays;NCBI:txid381124;Maize -5;Sunflower;Helianthus annuus;NCBI:txid4232;Sunflower -6;Oilseed rape;Brassica napus subsp. napus/oleifera;NCBI:txid138011;Oilseed_rape -7;Safflower;Carthamus tinctorius;NCBI:txid4222;Safflower -8;Soybean;Glycine max;NCBI:txid3847;Soybean -9;Tick bean;Vicia faba subsp. var. minor;NCBI:txid3907;Faba_bean -10;Chickpea;Cicer arietinum;NCBI:txid3827;Pea -11;Zucchini;Cucurbita pepo subsp. pepo;NCBI:txid3664;Cucurbits -12;Olive;Olea europaea;NCBI:txid4146;Olive -13;Grapevine;Vitis vinifera;NCBI:txid29760;Grapevine -14;Tomato;Solanum lycopersicon;NCBI:txid4081;Solanaceous_fruits -15;Onion;Allium cepa;NCBI:txid4679;Bulb vegetables -16;Potato;Solanum tuberosum;NCBI:txid4113;Potato -17;Soybean;Glycine max;NCBI:txid3847;Soybean -18;Lettuce;Lactuca;NCBI:txid4235;Leaf_vegetables +0;;;;General +1;Durum wheat;Triticum turgidum subsp. durum;NCBI:txid4567;Cereals +2;Bread wheat;Triticum aestivum subsp. aestivum;NCBI:txid4565;Cereals +3;Barley;Hordeum vulgare subsp. vulgare;NCBI:txid112509;Cereals +4;Rice;Oryza sativa;NCBI:txid4530;Rice +5;Maize;Zea mays subsp. mays;NCBI:txid381124;Maize +6;Sunflower;Helianthus annuus;NCBI:txid4232;Sunflower +7;Oilseed rape;Brassica napus subsp. napus/oleifera;NCBI:txid138011;Oilseed_rape +8;Safflower;Carthamus tinctorius;NCBI:txid4222;Safflower +9;Soybean;Glycine max;NCBI:txid3847;Soybean +10;Tick bean;Vicia faba subsp. var. minor;NCBI:txid3907;Faba_bean +11;Chickpea;Cicer arietinum;NCBI:txid3827;Chickpea +12;Zucchini;Cucurbita pepo subsp. pepo;NCBI:txid3664;Cucurbits +13;Olive;Olea europaea;NCBI:txid4146;Olive +14;Grapevine;Vitis vinifera;NCBI:txid29760;Grapevine +15;Tomato;Solanum lycopersicon;NCBI:txid4081;Solanaceous_fruits +16;Onion;Allium cepa;NCBI:txid4679;Bulb vegetables +17;Potato;Solanum tuberosum;NCBI:txid4113;Potato +18;Soybean;Glycine max;NCBI:txid3847;Soybean +19;Lettuce;Lactuca;NCBI:txid4235;Leaf_vegetables diff --git a/Applications/relax2/parameter_handler.py b/Applications/relax2/parameter_handler.py index 1ed81c98..14df12c4 100644 --- a/Applications/relax2/parameter_handler.py +++ b/Applications/relax2/parameter_handler.py @@ -1445,20 +1445,6 @@ def load_AgriMRI_Metadata_file_json(self): except: print('\033[31m' + 'Unable to load: Plant part ID' + '\033[0m') - try: self.plant_species = jsonparams['general']['Species'] - except: - try: - self.plant_species = jsonparams['Species'] - print('\033[33m' + 'Old style: Species' + '\033[0m') - except: - print('\033[31m' + 'Unable to load: Species' + '\033[0m') - self.plant_species_index = int(self.plant_species_library [0][0]) - self.plant_species = self.plant_species_library [0][1] - print('\033[31m' + 'Unable to load: BBCH scale' + '\033[0m') - self.plant_BBCH_scale = self.plant_species_library [0][4] - self.plant_phenological_phase_index = int(self.plant_phenological_phases_library [0][0]) - self.plant_phenological_phase = self.plant_phenological_phases_library [0][1] - try: self.plant_scientific_name = jsonparams['general']['Scientific name'] except: try: @@ -1476,6 +1462,21 @@ def load_AgriMRI_Metadata_file_json(self): except: print('\033[31m' + 'Unable to load: Taxonomy' + '\033[0m') self.plant_taxonomy = self.plant_species_library [0][3] + + try: self.plant_species = jsonparams['general']['Species'] + except: + try: + self.plant_species = jsonparams['Species'] + print('\033[33m' + 'Old style: Species' + '\033[0m') + except: + print('\033[31m' + 'Unable to load: Species' + '\033[0m') + + try:self.plant_species_index = [row[0] for row in self.plant_species_library if row[1] == self.plant_species][0] + except: + print('\033[31m' + 'Unable to find species in library: ' + self.plant_species + '\033[0m') + self.plant_species_index = int(self.plant_species_library [0][0]) + self.plant_species = self.plant_species_library [0][1] + try: self.plant_cultivated_variant = jsonparams['general']['Cultivated variant'] except: @@ -1555,12 +1556,16 @@ def load_AgriMRI_Metadata_file_json(self): self.plant_BBCH_scale = jsonparams['BBCH scale'] print('\033[33m' + 'Old style: BBCH scale' + '\033[0m') except: - print('\033[31m' + 'Unable to load: BBCH scale' + '\033[0m') print('\033[31m' + 'Unable to load: BBCH scale' + '\033[0m') self.plant_BBCH_scale = self.plant_species_library [0][4] - self.plant_phenological_phase_index = int(self.plant_phenological_phases_library [0][0]) - self.plant_phenological_phase = self.plant_phenological_phases_library [0][1] + if any(row[4] == self.plant_BBCH_scale for row in self.plant_species_library): pass + else: + print('\033[31m' + 'Unable to find BBCH scale: ' + self.plant_BBCH_scale + '\033[0m') + self.plant_BBCH_scale = self.plant_species_library [0][4] + + self.laod_phenological_phases_library() + try: self.plant_phenological_phase = jsonparams['measurement']['Phenological phase'] except: try: @@ -1571,6 +1576,12 @@ def load_AgriMRI_Metadata_file_json(self): self.plant_phenological_phase_index = int(self.plant_phenological_phases_library [0][0]) self.plant_phenological_phase = self.plant_phenological_phases_library [0][1] + try: self.plant_phenological_phase_index = [row[0] for row in self.plant_phenological_phases_library if row[1] == self.plant_phenological_phase][0] + except: + print('\033[31m' + 'Unable to find phenological phase in BBCH scale: ' + self.plant_phenological_phase + '\033[0m') + self.plant_phenological_phase_index = int(self.plant_phenological_phases_library [0][0]) + self.plant_phenological_phase = self.plant_phenological_phases_library [0][1] + try: self.plant_environment_outside = jsonparams['treatment']['environment']['Environment outside'] except: try: From edb27b4f3ffd540ee39e0b92c333b8e6bb44d23c Mon Sep 17 00:00:00 2001 From: marcman86 Date: Wed, 6 May 2026 08:46:26 +0200 Subject: [PATCH 5/5] tools auto sequence fixes --- Applications/relax2/process_handler.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Applications/relax2/process_handler.py b/Applications/relax2/process_handler.py index 679f7752..bd370cae 100644 --- a/Applications/relax2/process_handler.py +++ b/Applications/relax2/process_handler.py @@ -2590,7 +2590,7 @@ def FieldMapB0Slice(self): self.datapath_temp = params.datapath params.GUImode = 1 - params.sequence = 20 + params.sequence = 21 params.datapath = 'rawdata/Tool_Spectrum_rawdata' if params.toolautosequence == 1: @@ -2948,7 +2948,7 @@ def FieldMapB1Slice(self): self.flipangleamplitude_temp = params.flipangleamplitude params.GUImode = 1 - params.sequence = 20 + params.sequence = 21 params.datapath = 'rawdata/Tool_Spectrum_rawdata' if params.toolautosequence == 1: @@ -3176,7 +3176,7 @@ def FieldMapGradientSlice(self): self.datapath_temp = params.datapath params.GUImode = 1 - params.sequence = 21 + params.sequence = 22 params.datapath = 'rawdata/Tool_Spectrum_rawdata' if params.toolautosequence == 1: