def rereaddata(self): filetype = self.analysistype.currentText() if self.itemselectedboolean == 1: selectedfile = str(self.datafiles.currentItem().text()) if filetype == 'CTD': self.initctd = InitialiseCTDData.initCTDdata(selectedfile, self.db, self.currpath, self.currproject, self.interactive, True) if filetype == 'Nutrients': self.initnutrientdata = processingNutrientsWindow(selectedfile, self.db, self.currpath, self.currproject, self.interactive, True) if filetype == 'Salinity': self.initsaltdata = processingSalinityWindow(selectedfile, self.db, self.currpath, self.currproject, self.interactive, True) if filetype == 'Oxygen': self.initoxydata = processingOxygenWindow(selectedfile, self.db, self.currpath, self.currproject, self.interactive, True) if filetype == 'Sampling': self.initsampledata = InitialiseSampleSheet.initSampleSheet(selectedfile, self.currproject, self.db, self.currpath, self.interactive, True) else: messagebox = hyproMessageBoxTemplate('Error', 'Please select a file to reread... ', 'information')
def open_processing(self): try: if self.currproject == 'No active project': message_box = hyproMessageBoxTemplate( 'Error', 'There is no active project currently selected, please create or import one.', 'information') else: self.project = self.currprojectdisp.text() with open('C:/HyPro/hyprosettings.json', 'r') as file: params = json.loads(file.read()) path = params['projects'][self.project]['path'] self.proccing = Processingmenu(self.project, path) self.proccing.show() sleep(0.3) self.hide() self.proccing.backToMain.connect(self.show) #self.proccing.backToMain.connect(self.proccing.output_box.close) self.proccing.backToMain.connect( lambda: self.proccing.output_box.widget.close()) self.proccing.backToMain.connect(lambda: logging.shutdown()) self.proccing.backToMain.connect(self.proccing.hide) except Exception as e: print(e)
def save_output_window(self): filedialog = QFileDialog.getSaveFileName(self, 'Save File', '', '.txt') if filedialog[0]: outputfile = open(filedialog[0] + filedialog[1], 'w') outputtext = self.output_box.gettext() outputfile.write(outputtext) outputfile.close() message_box = hyproMessageBoxTemplate( 'Saving Success', 'Output log was successfully saved.', 'success')
def savefunction(self): try: surveyname = str(self.surveyName.text()) with open(self.currpath + '/' + '%sParams.json' % self.currproject, 'r') as file: params = json.loads(file.read()) newsurvey = {'%s' % surveyname: {}} if self.nuts_active: newsurvey[surveyname]['seal'] = { 'activated': self.activate_nutrient.isChecked(), 'ctdsurvey': self.ctd_survey_nutrient.isChecked(), 'usesampleid': self.sample_id_nutrient.isChecked(), 'surveyprefix': self.survey_prefix_nutrient.text(), 'decodedepfromid': self.decode_deployment_nutrient.isChecked(), 'depformat': self.dep_rp_format_nutrient.text(), 'decodesampleid': self.decode_nutrient.isChecked() } if self.salt_active: newsurvey[surveyname]['guildline'] = { 'activated': self.activate_salt.isChecked(), 'ctdsurvey': self.ctd_survey_salt.isChecked(), 'decodesampleid': self.decode_salt.isChecked(), 'surveyprefix': self.survey_number_station.text(), 'decodedepfromid': self.decode_salt_deployment.isChecked(), 'usesampleid': self.sample_salt_id.isChecked(), 'depformat': self.dep_rp_format_salt.text() } if self.oxy_active: newsurvey[surveyname]['scripps'] = { 'activated': self.activate_oxygen.isChecked(), 'ctdsurvey': self.ctd_survey_oxygen.isChecked(), 'decodesampleid': self.decode_oxygen.isChecked(), 'surveyprefix': self.survey_number_station.text(), 'decodedepfromid': self.decode_oxygen_deployment.isChecked(), 'usesampleid': self.sample_oxygen_id.isChecked() } params['surveyparams'].update(newsurvey) with open(self.currpath + '/' + '%sParams.json' % self.currproject, 'w') as file: json.dump(params, file) message_box = hyproMessageBoxTemplate( 'Settings Saved', 'Survey settings were successfully saved', 'success') except Exception as e: print('Error: ' + e)
def createProj(self): try: self.project_directorystr = str(self.project_directory.text()) self.project_prefix_str = str(self.project_prefix.text()) self.project_type_str = str(self.project_type.currentText()) if (self.project_directorystr != '') & (self.project_prefix_str != ''): if os.path.exists(self.project_directory.text()): project_directorystr = str(self.project_directory.text()) with open('C:/HyPro/hyprosettings.json', 'r') as f: self.params = json.load(f) continuecreateproj = True for x in self.params['projects'].keys(): if self.project_prefix_str == x: messagebox = hyproMessageBoxTemplate('Error', 'There is already a project with that name, please ' 'choose a different name for the project.', 'error') continuecreateproj = False if continuecreateproj: newproj = {'%s' % self.project_prefix_str: {'path': project_directorystr, 'type': self.project_type_str}} self.params['projects'].update(newproj) #self.params['activeproject'] = project_prefixstr # Write project info back to disk with open('C:/HyPro/hyprosettings.json', 'w') as file: json.dump(self.params, file) # Create directories for the project if not os.path.exists((project_directorystr + "/Nutrients")): os.makedirs((project_directorystr + "/Nutrients")) if not os.path.exists((project_directorystr + "/Salinity")): os.makedirs((project_directorystr + "/Salinity")) if not os.path.exists((project_directorystr + "/Oxygen")): os.makedirs((project_directorystr + "/Oxygen")) if not os.path.exists((project_directorystr + "/CTD")): os.makedirs((project_directorystr + "/CTD")) if not os.path.exists((project_directorystr + "/Sampling")): os.makedirs((project_directorystr + "/Sampling")) # Make weird little hack 'hypro' file, used for when a project needs to be imported filebuffer = open(project_directorystr + '/' + self.project_prefix_str + '.hypro', 'w') filebuffer.write(self.project_prefix_str + '\n') filebuffer.write(self.project_type_str + '\n') filebuffer.write(project_directorystr + '\n') filebuffer.close() messagebox = hyproMessageBoxTemplate('Success', 'A new project was successfully created.', 'success') sleep(0.4) self.close() sleep(0.5) self.new_project_created.emit() else: messagebox = hyproMessageBoxTemplate('Error', 'There is already a project with that name, please choose ' 'a different name for the project.', 'error') else: messagebox = hyproMessageBoxTemplate('Error', 'Provided path does not exist', 'error') else: messagebox = hyproMessageBoxTemplate('Error', 'Fields are empty, please fill them in.', 'information') except Exception as e: logging.error(traceback.print_exc())
def delete_data(self): try: filetype = self.analysis_type.currentText() selectedfile = self.data_files.currentItem() if selectedfile: selectedfile = str(selectedfile.text()) conn = sqlite3.connect(self.db) c = conn.cursor() filename = [selectedfile] # Different statement for each analysis as the database structure for each is different if filetype == 'CTD': deploymentnumber = [selectedfile[-7:-4]] print(deploymentnumber) c.execute('DELETE from ctdData where deployment=?', deploymentnumber) conn.commit() c.execute('DELETE from ctdFilesProcessed where filename=?', filename) conn.commit() conn.close() if self.deletefilescheckbox.isChecked(): print('Deleting data files as well') file = self.currpath + '/' + 'CTD' + '/' + selectedfile os.remove(file) logging.info('CTD data - ' + str(selectedfile) + ' deleted, the file was also deleted') else: logging.info('CTD data - ' + str(selectedfile) + ' deleted') if filetype == 'Nutrients': pass # TODO: complete the section for nutrients if filetype == 'Salinity': runnumber = [selectedfile[-8:-5]] c.execute('DELETE from salinityData where runNumber=?', runnumber) conn.commit() c.execute( 'DELETE from salinityFilesProcessed where filename=?', filename) conn.commit() conn.close() if self.delete_files_checkbox.isChecked(): print('Deleting data files as well') file = self.currpath + '/' + 'Salinity' + '/' + selectedfile os.remove(file) logging.info('Salinity data - ' + str(selectedfile) + ' deleted, the file was also deleted') else: logging.info('Salinity data - ' + str(selectedfile) + ' deleted') if filetype == 'Oxygen': runnumber = [selectedfile[-7:-4]] c.execute('DELETE from oxygenData where runNumber=?', runnumber) conn.commit() c.execute( 'DELETE from oxygenFilesProcessed where filename=?', filename) conn.commit() conn.close() if self.delete_files_checkbox.isChecked(): print('Deleting data files as well') file = self.currpath + '/' + 'Oxygen' + '/' + selectedfile os.remove(file) logging.info('Oxygen data - ' + str(selectedfile) + ' deleted, the file was also deleted') else: logging.info('Oxygen data - ' + str(selectedfile) + ' deleted') if filetype == 'Sampling': runnumber = [selectedfile[-11:-8]] print(runnumber) c.execute('DELETE from logsheetData where deployment=?', runnumber) conn.commit() c.execute( 'DELETE from logsheetFilesProcessed where filename=?', filename) conn.commit() conn.close() if self.delete_files_checkbox.isChecked(): print('Deleting data files as well') file = self.currpath + '/' + 'Sampling' + '/' + selectedfile os.remove(file) logging.info('Sample logsheet data - ' + str(selectedfile) + ' deleted, the file was also deleted') else: logging.info('Sample logsheet data - ' + str(selectedfile) + ' deleted') messagebox = hyproMessageBoxTemplate( 'Deleted successfully', 'Data was deleted from the database file', 'delete') else: messagebox = hyproMessageBoxTemplate( 'Error', 'Please select a file to delete ', 'error') except Exception: logging.error(traceback.print_exc())
def about_information(self): message_box = hyproMessageBoxTemplate( 'About Hypro', 'This is an experimental version of HyPro built using Python.', 'about')
def call_plot(self, sample_ids, deployments, rosette_positions, salinity): # Pull out relevant CTD data based on the samples that were analysed deps_set = tuple(set(sample_ids)) queryq = '?' queryplace = ', '.join(queryq for unused in deps_set) conn = sqlite3.connect(self.database) c = conn.cursor() q = 'SELECT * FROM ctdData WHERE deployment IN (%s)' % queryplace c.execute(q, deps_set) conn.commit() ctd_data = list(c.fetchall()) conn.close() if not ctd_data: logging.info( f'<b>The salinity file {self.file} contains CTD samples - however there is no CTD sensor data in HyPro. The file' ' is processed but no error plot appears because of this error. Once CTD data is imported, ' 'reprocess this file to see the error plot. </b>') time.sleep(0.3) message_box = hyproMessageBoxTemplate('HyPro - Oxygen Processing Anomaly', f'CTD data matching results in the file {self.file} are not in HyPro.', 'information', long_text=f'The salinity file {self.file} contains CTD samples, ' f'however there is no matching CTD sensor data in HyPro. ' f'The file is processed but no error plot appears because ' f'of this error. Once CTD data is imported, reprocess ' f'this file to see the error plot.') time.sleep(0.2) self.proceed_processing() else: ctd_salt1 = [x[8] for x in ctd_data] ctd_salt2 = [x[9] for x in ctd_data] ctd_deployment = [x[0] for x in ctd_data] ctd_rp = [x[11] for x in ctd_data] ctd_depths = [x[7] for x in ctd_data] ctd_data_to_plot = {'primary_sal': [], 'secondary_sal': [], 'dep_rosette_postion': [], 'rosette_position_to_plot': [], 'deployment': [], 'depths': [], 'bottle_sal': []} reference_indexes = [] for i, bottle_dep in enumerate(deployments): for l, ctd_dep in enumerate(ctd_deployment): if bottle_dep == ctd_dep: if rosette_positions[i] == ctd_rp[l]: reference_indexes.append(i) ctd_data_to_plot['bottle_sal'].append(salinity[i]) ctd_data_to_plot['deployment'].append(bottle_dep) ctd_data_to_plot['depths'].append(ctd_depths[l]) ctd_data_to_plot['rosette_position_to_plot'].append(rosette_positions[i]) ctd_data_to_plot['primary_sal'].append(ctd_salt1[l]) ctd_data_to_plot['secondary_sal'].append(ctd_salt2[l]) if max(ctd_data_to_plot['rosette_position_to_plot']) > 24: max_rp = 36 else: max_rp = 24 # Create the X data for the plot - x data is calculated as RP times Deployment, meaning x data will # go up continually from 1. i.e. deployment 2 RP 5 will equal x data of 41 ctd_data_to_plot['dep_rosette_position'] = [(((x - 1) * max_rp) + ctd_data_to_plot['rosette_position_to_plot'][i]) for i, x in enumerate(ctd_data_to_plot['deployment'])] time.sleep(0.2) self.salinity_error_plot = salinityDifferencesPlot(ctd_data_to_plot['deployment'], ctd_data_to_plot['dep_rosette_position'], ctd_data_to_plot['bottle_sal'], ctd_data_to_plot['primary_sal'], ctd_data_to_plot['secondary_sal'], ctd_data_to_plot['depths'], max_rp, reference_indexes, self.salinity_data) self.salinity_error_plot.proceed.clicked.connect(self.proceed_processing)