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)
Exemple #2
0
    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))
Exemple #3
0
 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()
Exemple #5
0
    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
Exemple #8
0
"""

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 = {
Exemple #9
0
 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
Exemple #11
0
        # 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)))