def start_measurement(self, comment): """ Start a measurement """ data_set_saver = DataSetSaver("measurements_dummy", "xy_values_dummy", "dummy", "dummy") data_set_saver.start() data_set_time = time.time() metadata = { "Time": CustomColumn(data_set_time, "FROM_UNIXTIME(%s)"), "comment": comment, "type": 65, "preamp_range": 9, "sem_voltage": -1 } labels = [ "2W Heater 1", "2W Heater 2", "2W RTD Source", "2W RTD Sense", "Short circuit check", "RTD Source Sense Left", "RTD Source Sense Right", "4W RTD", "Temperature", "Temperature 2" ] for label in labels: metadata["mass_label"] = label data_set_saver.add_measurement(label, metadata) for i in range(0, 99999999): self.update_values() for label in labels: print( str(i) + ': Channel: ' + label + ': ' + str(self.data[label])) data_set_saver.save_point( label, (time.time() - data_set_time, self.data[label])) time.sleep(1)
def scan(self, start_energy, end_energy, step, integration_time): """ Perform a scan """ metadata = { "Time": CustomColumn(time.time(), "FROM_UNIXTIME(%s)"), "comment": 'Test', "type": 2 } label = 'XPS signal' self.data_set_saver.add_measurement(label, metadata) count_string = self.agilent.scpi_comm("SENS:TOT:DATA? (@203)") meas_time = time.time() for binding_energy in np.arange(end_energy, start_energy, -1 * step): kin_energy = str((self.x_ray - binding_energy) / self.calib) string = "SOURCE:VOLT " + kin_energy + ", (@205)" self.agilent.scpi_comm(string) time.sleep(integration_time) count_string = self.agilent.scpi_comm("SENS:TOT:DATA? (@203)") count = int(float(count_string.strip())) int_time = time.time() - meas_time meas_time = time.time() count_rate = count / int_time self.data_set_saver.save_point(label, (binding_energy, count_rate))
def setup_data_set_saver(self): """Setup the data set saver""" sql_time = CustomColumn(time(), 'FROM_UNIXTIME(%s)') for codename in self.codenames: metadata = { 'time': sql_time, 'comment': self.config['comment'], 'label': codename[3:], 'type': 1, 'power_supply_channel': self.channel_id, } self.data_set_saver.add_measurement(codename, metadata)
def run(self): """Run the ramp This is the main function that contains a loop over the steps in the ramp and the method that does all the work """ self.data_set_saver.start() # Specify the start time for database now = time() now_custom_column = CustomColumn(now, 'FROM_UNIXTIME(%s)') # Add all measurements self.metadata['label'] = 'voltage' self.data_set_saver.add_measurement('voltage', self.metadata) self.metadata['label'] = 'current' self.data_set_saver.add_measurement('current', self.metadata) self.metadata['label'] = 'CO2 flow' self.data_set_saver.add_measurement('CO2 flow', self.metadata) # Add the one custom column self.metadata['time'] = now_custom_column # Set the current limit on the power supply to 10A self.cpx.set_current_limit(10) # Set the pressure on the pressure controller try: for step in self.ramp: # Go through the steps in the ramp file if step['type'] == 'constant_voltage': self.run_constant_voltage_step(step) elif step['type'] == 'voltage_ramp': self.run_voltage_ramp_step(step) elif step['type'] == 'constant_current': self.run_constant_current_step(step) except KeyboardInterrupt: print('Program interupted by user') except IOError as e: print("I/O error({0}): {1}".format(e.errno, e.strerror)) pass finally: # End the data collection and turn off power supply after run or interruption print('The program has ended') self.cpx.output_status(False) self.data_set_saver.wait_for_queue_to_empty() self.data_set_saver.stop()
def run_measurement(self, v_from, v_to, scan_both_ways): """ Perform the actual measurement """ metadata = { "Time": CustomColumn(self.data_set_time, "FROM_UNIXTIME(%s)"), "comment": self.comment, "type": 1 } for label in [ "Ch1", "Ch2", "Ch3", "Ch4", "Ch5", "Ch6", "Ch7", "Ch8", ]: metadata["mass_label"] = label self.data_set_saver.add_measurement(label, metadata) self.smu.set_voltage(0.0) self.smu.output_state(True) for channel in range(1, 9): print('Channel: ' + str(channel)) self.mux.scpi_comm('ROUTE:CLOSE (@10' + str(channel) + ')') time.sleep(0.2) voltage, current = self.smu.iv_scan(v_from=v_from, v_to=v_to, steps=10, settle_time=0) for i in range(0, len(current)): self.data_set_saver.save_point('Ch' + str(channel), (voltage[i], current[i])) if scan_both_ways: voltage, current = self.smu.iv_scan(v_from=v_to, v_to=v_from, steps=50, settle_time=0) for i in range(0, len(current)): self.data_set_saver.save_point('Ch' + str(channel), (voltage[i], current[i])) self.mux.scpi_comm('ROUTE:OPEN (@10' + str(channel) + ')') self.smu.set_voltage(0.0) self.smu.output_state(False) time.sleep(0.2)
def init_logging(self): if self.log_data: self.comment = 'Run' self.data_set_saver = DataSetSaver('measurements_mailscan', 'xy_values_mailscan', credentials.user, credentials.passwd) self.data_set_saver.start() # PyExpLabSys does does not excell in db-normalization - add # metadata to all channels metadata = { "Time": CustomColumn(self.start_time, "FROM_UNIXTIME(%s)"), "comment": self.comment, "type": 1, "label": None, "processes": self.number_of_threads()[1] } metadata['label'] = 'Avg export speed' self.data_set_saver.add_measurement(metadata['label'], metadata) metadata['label'] = 'Total export size' self.data_set_saver.add_measurement(metadata['label'], metadata) metadata['label'] = 'Total users' self.data_set_saver.add_measurement(metadata['label'], metadata) metadata['label'] = 'Total memory' self.data_set_saver.add_measurement(metadata['label'], metadata) metadata['label'] = 'Total CPU' self.data_set_saver.add_measurement(metadata['label'], metadata) metadata['label'] = 'Total Mails' self.data_set_saver.add_measurement(metadata['label'], metadata) for scanner in self.amqp_messages.keys(): if scanner == 'global': continue metadata['processes'] = 1 metadata['label'] = '{} memory'.format(scanner) self.data_set_saver.add_measurement(metadata['label'], metadata) metadata['label'] = '{} exported users'.format(scanner) self.data_set_saver.add_measurement(metadata['label'], metadata)
comment = "First run" ## EDIT HERE # Create data set saver object data_set_saver = DataSetSaver( "measurements_dummy", "xy_values_dummy", credentials.USERNAME, credentials.PASSWORD, ) data_set_saver.start() # Create measurement specs i.e. entires entries in the metadata table data_set_time = time.time() metadata = { "time": CustomColumn(data_set_time, "FROM_UNIXTIME(%s)"), "comment": comment, "type": 64, "preamp_range": 0, "sem_voltage": 0 } # Only the labels differ, so we generate the metadata with a loop for label in [ "p_korr", "i_korr", "total_korr", "ph_setpoint", "ph_value", "pump_rate" ]: metadata["mass_label"] = label data_set_saver.add_measurement(label, metadata) # http://pyexplabsys.readthedocs.io/common/database_saver.html#PyExpLabSys.common.database_saver.DataSetSaver.save_point
""" import time from PyExpLabSys.common.database_saver import DataSetSaver, CustomColumn import credentials data_set_saver = DataSetSaver( 'measurements_large_CO2_MEA', 'xy_values_large_CO2_MEA', credentials.USERNAME, credentials.PASSWORD, ) data_set_saver.start() now = time.time() now_custom_column = CustomColumn(now, 'FROM_UNIXTIME(%s)') #CREATE TABLE `measurements_large_CO2_MEA` ( # `id` int(10) unsigned NOT NULL AUTO_INCREMENT, # `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, # `type` int(10) unsigned NOT NULL COMMENT 'Type of measurement, as found in the types table', # `comment` varchar(128) NOT NULL COMMENT 'Comment', # `cathode_gas_type` varchar(128) NOT NULL COMMENT 'Cathode gas type', # `anode_gas_type` varchar(128) NOT NULL COMMENT 'Anode gas type', # `cathode_catalyst_description` varchar(128) NOT NULL COMMENT 'Cathode catalyst description', # `anode_catalyst_description` varchar(128) NOT NULL COMMENT 'Anode catalyst description', # `label` varchar(45) NOT NULL, # PRIMARY KEY (`id`) #) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='A single record pr. measurent run' metadata = {
def run(self): """Run the ramp This is the main function that contains a loop over the steps in the ramp and the method that does all the work """ self.data_set_saver.start() # Specify the start time for database now = time() now_custom_column = CustomColumn(now, 'FROM_UNIXTIME(%s)') # Add all measurements self.metadata['label'] = 'voltage' self.data_set_saver.add_measurement('voltage', self.metadata) self.metadata['label'] = 'current' self.data_set_saver.add_measurement('current', self.metadata) self.metadata['label'] = 'CO2 flow' self.data_set_saver.add_measurement('CO2 flow', self.metadata) # If another flow meter is used collect the flow here #self.metadata['label'] = 'cell outlet flow' #self.data_set_saver.add_measurement('cell outlet flow', self.metadata) # Collect the pressure reading from the pressure controller #self.metadata['label'] = 'pressure' #self.data_set_saver.add_measurement('pressure', self.metadata) # Add the one custom column self.metadata['time'] = now_custom_column # Set the current limit on the power supply to 10A self.cpx.set_current_limit(10) # Change address to CO2 flow controller self.red_flow_meter.set_address(42) # Set the CO2 flow to the specified value self.red_flow_meter.write_value('setpoint_gas_flow', self.setpoint_gas_flow) # Set the pressure on the pressure controller #self.message = 'json_wn#' + json.dumps({'A': 0.0, 'B': self.setpoint_pressure }) #self.sock.sendto(message.encode('ascii'), (self.host, self.port)) try: for step in self.ramp: # Go through the steps in the ramp file if step['type'] == 'constant_voltage': self.run_constant_voltage_step(step) elif step['type'] == 'voltage_ramp': self.run_voltage_ramp_step(step) elif step['type'] == 'constant_current': self.run_constant_current_step(step) except KeyboardInterrupt: print('Program interupted by user') finally: # End the data collection and turn off power supply after run or interruption print('The program has ended') self.cpx.output_status(False) self.red_flow_meter.set_address(42) self.red_flow_meter.write_value('setpoint_gas_flow', 0.0) #self.message = 'json_wn#' + json.dumps({'A': 0.0, 'B': 0.0}) #self.sock.sendto(message.encode('ascii'), (self.host, self.port)) self.data_set_saver.wait_for_queue_to_empty() self.data_set_saver.stop()
def main(): """Main function""" parser = argparse.ArgumentParser( description='Run the infamous ph control script.') # ph_setpoint, ph_direction (string [up, down]), kick_in_rate (float) # Main (constant), secondary (regulation) # python ph_increment.py 10.0 --direction up --main-offset=24.0 --second-min=10.0 --second-max=40.0 --second-offset=17.0 parser.add_argument('setpoint', type=float, help='The Ph setpoint.') parser.add_argument('--direction', default=None, help='Pumping direction. Must be up or down.', required=True) parser.add_argument('--main-offset', type=float, default=None, help='Start pumping speed for the main pump.', required=True) parser.add_argument('--second-min', type=float, default=None, help='Minimum pumping speed for the secondary pump.', required=True) parser.add_argument('--second-max', type=float, default=None, help='Maximum pumping speed for the secondary pump.', required=True) parser.add_argument('--second-offset', type=float, default=None, help='Start pumping value for the secondary pump.', required=True) parser.add_argument('--comment', default=None, help='Optional comment', required=True) args = parser.parse_args() ## Edit comment comment = "pH " + str(args.setpoint) + " // p: 0.02 // start rate " + str( args.second_offset) + " // " + args.comment ## Edit comment # raise SystemExit('All good') # Init pumps, Omegabus, PID and data saver pump_main = AL1000( "/dev/serial/by-id/usb-FTDI_USB-RS232_Cable_FTV9X9TM-if00-port0") pump_second = AL1000( "/dev/serial/by-id/usb-FTDI_USB-RS232_Cable_FTWZCJLU-if00-port0") obus = OmegaBus( "/dev/serial/by-id/usb-FTDI_USB-RS232_Cable_FTWZCGSW-if00-port0", baud=9600, ) data_set_saver = DataSetSaver("measurements_dummy", "xy_values_dummy", "dummy", "dummy") pid = PID(pid_p=0.04, pid_i=0.0, pid_d=0, p_max=9999, p_min=-9) pid.update_setpoint(args.setpoint) # time_start = time.time() #Pre flight check. pump_main_check = pump_main.get_firmware() print("main: " + pump_main_check) pump_second_check = pump_second.get_firmware() print("second: " + pump_second_check) obus_check = obus.read_value(1) obus_check = current_to_ph(obus_check) if pump_main_check != "NE1000V3.923": print("Main pump failed") raise SystemExit(1) if pump_second_check != "NE1000V3.923": print("Secondary pump failed") raise SystemExit(1) if obus_check < 0: print("OmegaBus failed") raise SystemExit(1) #Set initial condition for pumps pump_second.set_direction("INF") pump_main.set_direction("INF") if args.direction == "up": pump_second.set_rate(args.second_offset) rate_second = args.second_offset pump_main.set_rate(0) rate_main = 0 if args.direction == "down": pump_second.set_rate(0) rate_second = 0 pump_main.set_rate(args.main_offset) rate_main = args.main_offset pump_second.set_vol(9999) pump_main.set_vol(9999) pump_second.start_program() pump_main.start_program() # Setup database saver data_set_saver.start() data_set_time = time.time() metadata = { "Time": CustomColumn(data_set_time, "FROM_UNIXTIME(%s)"), "comment": comment, "type": 64, "preamp_range": 0, "sem_voltage": 0 } for label in [ "p_korr", "i_korr", "total_korr", "ph_setpoint", "ph_value", "pump_rate" ]: metadata["mass_label"] = label data_set_saver.add_measurement(label, metadata) # Run PID try: time_start = time.time() run(pump_second, pump_main, obus, pid, data_set_saver, time_start, args.setpoint, rate_second, rate_main, args.second_offset, args.main_offset, args.second_min, args.second_max, args.direction, minutes) except KeyboardInterrupt: # Clean up pump_main.set_rate(0) pump_second.set_rate(0) pump_main.stop_program() pump_second.stop_program() data_set_saver.stop() raise SystemExit(" Sequence stopped.") # Clean up pump_main.set_rate(0) pump_second.set_rate(0) pump_main.stop_program() pump_second.stop_program() # Log pH during ageing try: while True: value = obus.read_value(1) value = current_to_ph(value) print("pH: " + str(round(value, 3))) data_set_saver.save_point("ph_value", (time.time() - time_start, value)) data_set_saver.save_point( "ph_setpoint", (time.time() - time_start, args.setpoint)) time.sleep(8) except KeyboardInterrupt: data_set_saver.stop() pass
# Load the sequence print('Found new sequence for upload: {} '.format(relative_path)) try: sequence = Sequence(root) except ValueError as exception: if exception.args[0].startswith('No injections in sequence'): print(' ... No injections in this sequence') continue else: raise exception # Upload the sequence summary data metadata = sequence.metadata.copy() metadata['relative_path'] = relative_path metadata['time'] = CustomColumn(time.mktime(metadata.pop('sequence_start')), 'FROM_UNIXTIME(%s)') metadata['type'] = 20 # We don't use these columns, but they are setup in the database without default # values, so to avoid warnings we fill them in metadata['sem_voltage'] = 0.0 metadata['preamp_range'] = 0.0 data_set = sequence.full_sequence_dataset() for label, data in data_set.items(): data_set_metadata = metadata.copy() data_set_metadata['label'] = label codename = relative_path+label x, y = zip(*data) data_set_saver.add_measurement(codename, data_set_metadata) data_set_saver.save_points_batch(codename, x, y) print(' Summary datasets uploaded........: {}'.format(len(data_set)))