diff --git a/Applications/relax2/Relax2_main.py b/Applications/relax2/Relax2_main.py index 0e64c54..d214dda 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() @@ -2810,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))) @@ -3139,11 +3125,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 +3193,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 +3261,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 +3321,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 +3654,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 +3742,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 +3793,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 +3844,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 +3896,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 +3957,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 +4032,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 +4114,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 +4763,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 +4791,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 +5051,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 +5280,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 +6117,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 +6170,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 +6214,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 +6342,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 +6549,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 +6613,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 +6652,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 +6718,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 +7049,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 +7448,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 +7794,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 +7803,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 +7813,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 +7835,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 +7866,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 +7890,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 +7918,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 +8607,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 +10277,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 +10329,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 +10682,4 @@ def run(): if __name__ == '__main__': - run() + run() \ No newline at end of file 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 0000000..bdc9419 --- /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 0000000..4d1a404 --- /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 0000000..06cf461 --- /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 0000000..46c8a62 --- /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 0000000..bec63dd --- /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 c416f91..2b8e807 100644 --- a/Applications/relax2/agriMRI/plant_species_library.csv +++ b/Applications/relax2/agriMRI/plant_species_library.csv @@ -1,12 +1,21 @@ 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 +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;Lettuce;Lactuca;NCBI:txid4235;Leaf vegetables +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/binaries/stemlab_125_14_ocra_mri.bit.bin b/Applications/relax2/binaries/stemlab_125_14_ocra_mri.bit.bin new file mode 100644 index 0000000..83c86d4 Binary files /dev/null and b/Applications/relax2/binaries/stemlab_125_14_ocra_mri.bit.bin differ diff --git a/Applications/relax2/binaries/stemlab_125_14_ocra_mri.dtbo b/Applications/relax2/binaries/stemlab_125_14_ocra_mri.dtbo new file mode 100644 index 0000000..1ef5389 Binary files /dev/null and b/Applications/relax2/binaries/stemlab_125_14_ocra_mri.dtbo differ diff --git a/Applications/relax2/parameter_handler.py b/Applications/relax2/parameter_handler.py index 9e96caa..14df12c 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,394 @@ 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_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_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: + 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') + self.plant_BBCH_scale = self.plant_species_library [0][4] + + 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: + 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_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: + 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 ad69f4d..679f775 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 09c52a7..84b1de6 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(' 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