def queue(self): procedure = self.make_procedure() directory = procedure.fileroot if procedure.inverse_spacing: fields = np.linspace(1/procedure.field_start,1/procedure.field_stop,procedure.field_steps) fields = 1/fields for field in fields: filename = unique_filename(directory, prefix=procedure.filename, ext='txt', datetimeformat='') procedure.field = field results = Results(procedure, filename) experiment = self.new_experiment(results) self.manager.queue(experiment) else: filename = unique_filename(directory, prefix=procedure.filename, ext='txt', datetimeformat='') results = Results(procedure, filename) experiment = self.new_experiment(results) self.manager.queue(experiment)
def queue(self): direc = '.' filename = unique_filename(direc,'test') procedure = self.make_procedure() results = Results(procedure, filename) experiment = self.new_experiment(results) self.manager.queue(experiment)
def queue(self): maxcurrent = self.inputs.max_curr.value() mincurrent = self.inputs.min_curr.value() currentstep = self.inputs.curr_step.value() currents = np.arange(mincurrent, maxcurrent + currentstep, currentstep) for k, curr in enumerate(currents): # Change this to the desired directory directory = self.inputs.folder.text() filename = unique_filename( directory, prefix=self.inputs.samplename.text(), ext='txt', datetimeformat='') procedure = Measure2ndHarmonic() procedure.current = curr procedure.max_angle = self.inputs.max_angle.value() procedure.delay = self.inputs.delay.value() procedure.Lockin1_use = self.inputs.Lockin1_use.currentText() procedure.Lockin2_use = self.inputs.Lockin2_use.currentText() results = Results(procedure, filename) experiment = self.new_experiment(results) self.manager.queue(experiment)
def queue(self): procedure = self.make_procedure() filename = unique_filename(procedure.save_dir, procedure.sample_name, '_temp_monitor_') results = Results(procedure, filename) experiment = self.new_experiment(results) self.manager.queue(experiment)
def queue(self): directory = "./" # Change this to the desired directory filename = unique_filename(directory, prefix='IV') procedure = self.make_procedure() results = Results(procedure, filename) experiment = self.new_experiment(results) self.manager.queue(experiment)
def queue(self): fname = unique_filename( self.inputs.save_dir.text(), dated_folder=True, prefix=self.inputs.calib_name.text() + '_temperature_record_', suffix='' ) procedure = self.make_procedure() results = Results(procedure, fname) experiment = self.new_experiment(results) self.manager.queue(experiment)
def queue(self): direc = self.inputs.save_dir.text() # create list of procedures to run procedure = self.make_procedure() # create files pre = (procedure.your_name + '_') if procedure.your_name else '' suf = 'SS9' filename = unique_filename(direc, dated_folder=True, suffix=suf, prefix=pre) # ensure *some* sample name exists so Results.load() works if procedure.your_name == '': procedure.your_name = 'undefined' # Queue experiment results = Results(procedure, filename) experiment = self.new_experiment(results) self.manager.queue(experiment)
class DepProcedure(Procedure): plate_e = FloatParameter('Plating Potential', units='V', minimum=-5, maximum=5, default=-1.5) pulse = FloatParameter('Pulse length', units='s', default=0.1) delay = FloatParameter('Delay Time', units='s', default=5.9) repeats = IntegerParameter('Cycles', units=None, default=50) deltat = FloatParameter('Measurement Frequency', units='Hz', default=20) current_range = FloatParameter('Current Range', units='A', default=0.1) directory = Parameter('Working Directory', default='C:/Data/') filename = Parameter('Filename', default=unique_filename(str(directory), prefix='Plate_')) DATA_COLUMNS = ['Current (A)', 'Potential (V)', 'Time (s)'] def startup(self): # log.info("Setting up instruments") # self.meter = Keithley2182("GPIB::7::INSTR") # self.meter.measure_voltage() # self.meter.voltage_range = self.voltage_range # self.meter.voltage_nplc = 1 # Integration constant to Medium self.source = Keithley2400("GPIB::24::INSTR") self.source.apply_voltage() self.source.measure_current() self.source.voltage_nplc = 1 # Integration constant to Medium self.source.complinance_current = self.current_range self.source.enable_source() sleep(2) def execute(self): pulses = np.repeat(self.plate_e, (self.pulse) * 1 // (1 / self.deltat)) rest = np.repeat(0, (self.delay) * 1 // (1 / self.deltat)) potentials = np.concatenate((pulses, rest)) potentials = np.tile(potentials, np.int(self.repeats)) # currents *= 1e-3 # to mA from A steps = len(potentials) log.info("Starting Pulsed electrodeposition") for i, potential in enumerate(potentials): log.debug("Applying potential: %g V" % potential) self.source.source_voltage = potential # Or use self.source.ramp_to_current(current, delay=0.1) sleep(1 / self.deltat) current = self.source.current time = i / self.deltat data = { 'Current (A)': current, 'Potential (V)': potential, 'Time (s)': time } self.emit('results', data) self.emit('progress', 100. * i / steps) if self.should_stop(): log.warning("Catch stop command in procedure") break def shutdown(self): self.source.shutdown() self.source.beep(783.991, 0.1) sleep(0.125) self.source.beep(1046.50, 0.1) sleep(0.125) self.source.beep(1318.51, 0.1) sleep(0.125) self.source.beep(1567.98, 0.22) sleep(0.25) self.source.beep(1318.51, 0.1) sleep(0.125) self.source.beep(1567.98, 0.25) log.info("Finished")
class IVProcedure(Procedure): max_current = FloatParameter('Maximum Current', units='mA', default=10) min_current = FloatParameter('Minimum Current', units='mA', default=-10) current_step = FloatParameter('Current Step', units='mA', default=0.1) delay = FloatParameter('Delay Time', units='ms', default=20) voltage_range = FloatParameter('Voltage Range', units='V', default=10) directory = Parameter('Working Directory', default='C:/Data/') filename = Parameter('Filename', default=unique_filename(str(directory), prefix='IV')) DATA_COLUMNS = ['Current (A)', 'Voltage (V)', 'Resistance (Ohm)'] def startup(self): log.info("Setting up instruments") # self.meter = Keithley2182("GPIB::7::INSTR") # self.meter.measure_voltage() # self.meter.voltage_range = self.voltage_range # self.meter.voltage_nplc = 1 # Integration constant to Medium self.source = Keithley2400("GPIB::24::INSTR") self.source.apply_current() self.source.source_current_range = self.max_current*1e-3 # A self.source.complinance_voltage = self.voltage_range self.source.enable_source() sleep(2) def execute(self): currents_up = np.arange(self.min_current, self.max_current, self.current_step) currents_down = np.arange(self.max_current, self.min_current, -self.current_step) currents = np.concatenate((currents_up, currents_down)) # Include the reverse currents *= 1e-3 # to mA from A steps = len(currents) log.info("Starting to sweep through current") for i, current in enumerate(currents): log.debug("Measuring current: %g mA" % current) self.source.source_current = current # Or use self.source.ramp_to_current(current, delay=0.1) sleep(self.delay*1e-3) voltage = self.meter.voltage if abs(current) <= 1e-10: resistance = np.nan else: resistance = voltage/current data = { 'Current (A)': current, 'Voltage (V)': voltage, 'Resistance (Ohm)': resistance } self.emit('results', data) self.emit('progress', 100.*i/steps) if self.should_stop(): log.warning("Catch stop command in procedure") break def shutdown(self): self.source.shutdown() self.source.beep(783.991,0.1) sleep(0.125) self.source.beep(1046.50,0.1) sleep(0.125) self.source.beep(1318.51,0.1) sleep(0.125) self.source.beep(1567.98,0.22) sleep(0.25) self.source.beep(1318.51,0.1) sleep(0.125) self.source.beep(1567.98,0.25) log.info("Finished")
class DepProcedure(Procedure): plate_current = FloatParameter('Plating Current', units='A', minimum=-1, maximum=1, default=0.000268055577) pulse = FloatParameter('Pulse length', units='s', maximum=1e8, default=0.1) delay = FloatParameter('Delay Time', units='s', maximum=1e8, default=5.9) repeats = IntegerParameter('Cycles', units=None, minimum=1, maximum=1e8, default=500) deltat = FloatParameter('Measurement Frequency', units='Hz', default=20) voltage_range = FloatParameter('Potential Range', units='V', default=10) directory = Parameter('Working Directory', default='C:/Data/') filename = Parameter('Filename', default=unique_filename(str(directory), prefix='Plate_')) DATA_COLUMNS = ['Current (A)', 'Potential (V)', 'Time (s)'] def startup(self): log.info("Setting up instruments") """ To use the Nanovoltmeter instead of the Sourcemeter to measure potential, uncomment the following section and change the corresponding section in execute routine to measure from meter instead of source """ # self.meter = Keithley2182("GPIB::7::INSTR") # self.meter.measure_voltage() # self.meter.voltage_range = self.voltage_range # self.meter.voltage_nplc = 1 # Integration constant to Medium self.source = Keithley2400("GPIB::24::INSTR") self.source.apply_current() self.source.measure_voltage() self.source.source_current_range = self.plate_current * 1.1 # Current range is 10% over target self.source.compliance_voltage = self.voltage_range self.source.enable_source() sleep(2) def execute(self): pulses = np.repeat(self.plate_current, (self.pulse) * 1 // (1 / self.deltat)) rest = np.repeat(0, (self.delay) * 1 // (1 / self.deltat)) currents = np.concatenate((pulses, rest)) currents = np.tile(currents, np.int(self.repeats)) # currents *= 1e-3 # to mA from A steps = len(currents) log.info("Starting Pulsed electrodeposition") for i, current in enumerate(currents): log.debug("Applying current: %g A" % current) self.source.source_current = current # Or use self.source.ramp_to_current(current, delay=0.1) sleep(1 / self.deltat) voltage = self.source.voltage time = i / self.deltat data = { 'Current (A)': current, 'Potential (V)': voltage, 'Time (s)': time } self.emit('results', data) self.emit('progress', 100. * i / steps) if self.should_stop(): log.warning("Catch stop command in procedure") break def shutdown(self): self.source.shutdown() self.source.beep(783.991, 0.1) sleep(0.125) self.source.beep(1046.50, 0.1) sleep(0.125) self.source.beep(1318.51, 0.1) sleep(0.125) self.source.beep(1567.98, 0.22) sleep(0.25) self.source.beep(1318.51, 0.1) sleep(0.125) self.source.beep(1567.98, 0.25) log.info("Finished")
class PotentiostaticProcedure(Procedure): potential = FloatParameter('Potential', units='V', default=0.1) max_current = FloatParameter('Maximum Current', units='mA', default=10) time = FloatParameter('Experiment Length', units='s', default=5) dt = FloatParameter('Measurement frequency', units='Hz', default=5) voltage_range = FloatParameter('Voltage Range', units='V', default=10) directory = Parameter('Working Directory', default='C:/Data/') filename = Parameter('Filename', default=unique_filename(str(directory), prefix='StaticE')) DATA_COLUMNS = ['Time (s)', 'Current (A)', 'Potential (V)'] def startup(self): self.source = Keithley2400("GPIB::24::INSTR") self.source.apply_voltage(voltage_range=None, compliance_current=0.1) self.source.measure_current(nplc=1, current=self.max_current, auto_range=True) # self.source.apply_current() # self.source.source_current_range = self.max_current*1e-3 # A # self.source.complinance_voltage = self.voltage_range self.source.enable_source() sleep(2) def execute(self): potential = self.potential times = np.arange(0, self.time, 1 / self.dt) steps = len(times) log.info("Applying potential of %f V" % potential) self.source.source_voltage = potential for i, time in enumerate(times): # self.source.source_current = potential sleep(1 / self.dt) # sleep between current measurements (Hz -> s) current = self.source.current data = { # 'Time (s)': time, 'Potential (V)': potential, 'Current': current } self.emit('results', data) self.emit('progress', 100. * i / steps) if self.should_stop(): log.warning("Catch stop command in procedure") break def shutdown(self): self.source.shutdown() self.source.beep(783.991, 0.1) sleep(0.125) self.source.beep(1046.50, 0.1) sleep(0.125) self.source.beep(1318.51, 0.1) sleep(0.125) self.source.beep(1567.98, 0.22) sleep(0.25) self.source.beep(1318.51, 0.1) sleep(0.125) self.source.beep(1567.98, 0.25) log.info("Finished")
class DepProcedure(Procedure): in_e = IntegerParameter('Start E', units='mV', minimum=-10000, maximum=10000, default=0) lo_e = IntegerParameter('Low E', units='mV', minimum=-10000, maximum=10000, default=-50) hi_e = IntegerParameter('High E', units='mV', minimum=-10000, maximum=10000, default=50) # sweepdirection = sweep_rate = FloatParameter('Sweep Rate', units='mV/s', minimum=0.01, maximum=500, default=10) repeats = IntegerParameter('Cycles', units=None, minimum=1, maximum=1e8, default=10) deltat = FloatParameter('Measurement Frequency', units='Hz', default=20) voltage_range = FloatParameter('Potential Range', units='V', default=10) current_range = FloatParameter('Current Range', units='A', default=0.5) directory = Parameter('Working Directory', default='C:/Data/') filename = Parameter('Filename', default=unique_filename(str(directory), prefix='CV_')) DATA_COLUMNS = ['Time (s)', 'Potential (V)', 'Current (A)'] def startup(self): log.info("Setting up instruments") """ To use the Nanovoltmeter instead of the Sourcemeter to measure potential, uncomment the following section and change the corresponding section in execute routine to measure from meter instead of source """ # self.meter = Keithley2182("GPIB::7::INSTR") # self.meter.measure_voltage() # self.meter.voltage_range = self.voltage_range # self.meter.voltage_nplc = 1 # Integration constant to Medium self.source = Keithley2400("GPIB::24::INSTR") self.source.apply_voltage() self.source.measure_current() self.source.source_current_range = self.current_range self.source.compliance_voltage = self.voltage_range self.source.enable_source() sleep(2) def execute(self): in_e = self.in_e/1000 # Convert from mV to V hi_e = self.hi_e/1000 # Convert from mV to V lo_e = self.lo_e/1000 # Convert from mV to V # To calculate the e_step, convert to V/s and divide by measurement frequency self.source.ramp_to_voltage(hi_e) e_step = 0.001*self.sweep_rate/self.deltat sweep1 = np.arange(in_e, hi_e, e_step) sweep2 = np.arange(hi_e, lo_e, -e_step) sweep3 = np.arange(lo_e, hi_e, e_step) potentials = np.concatenate((sweep2, sweep3)) potentials = np.tile(potentials, np.int(self.repeats)) sweep4 = np.arange(hi_e, in_e, -e_step) potentials = np.concatenate((sweep1, potentials)) potentials = np.concatenate((potentials, sweep4)) steps = len(potentials) log.info("Starting Cyclic Voltammetry") for i, e in enumerate(potentials): log.debug("Measuring potential: %g V" % e) self.source.source_voltage = e sleep(1/self.deltat) current = self.source.current time = i/self.deltat data = { 'Time (s)': time, 'Potential (V)': e, 'Current (A)': current } self.emit('results', data) self.emit('progress', 100.*i/steps) if self.should_stop(): log.warning("Catch stop command in procedure") break def shutdown(self): self.source.shutdown() self.source.beep(783.991,0.1) sleep(0.125) self.source.beep(1046.50,0.1) sleep(0.125) self.source.beep(1318.51,0.1) sleep(0.125) self.source.beep(1567.98,0.22) sleep(0.25) self.source.beep(1318.51,0.1) sleep(0.125) self.source.beep(1567.98,0.25) log.info("Finished")
class DepProcedure(Procedure): capacity = FloatParameter('Capacity', units='mAh', minimum=0, maximum=10, default=4.29) c_rate = FloatParameter('Charge Rate', units='C', minimum=0.01, maximum=20, default=1) repeats = IntegerParameter('Cycles', units=None, minimum=1, maximum=1e8, default=50) deltat = FloatParameter('Measurement Frequency', units='Hz', default=1) voltage_range = FloatParameter('Potential Range', units='V', default=10) directory = Parameter('Working Directory', default='C:/Data/') filename = Parameter('Filename', default=unique_filename(str(directory), prefix='charge_')) DATA_COLUMNS = ['Time (s)', 'Current (A)', 'Potential (V)'] def startup(self): log.info("Setting up instruments") """ To use the Nanovoltmeter instead of the Sourcemeter to measure potential, uncomment the following section and change the corresponding section in execute routine to measure from meter instead of source """ # self.meter = Keithley2182("GPIB::7::INSTR") # self.meter.measure_voltage() # self.meter.voltage_range = self.voltage_range # self.meter.voltage_nplc = 1 # Integration constant to Medium self.source = Keithley2400("GPIB::24::INSTR") self.source.source_current() self.source.measure_voltage() self.source.source_current_range = self.capacity * self.c_rate * 5 self.source.compliance_voltage = self.voltage_range self.source.enable_source() sleep(2) def execute(self): charge_rate = self.capacity * self.c_rate * 0.001 # Charge rate, in A discharge_rate = charge_rate * -1 # Discharge rate, in A currents = np.repeat(charge_rate, ) currents_up = np.arange(self.min_current, self.max_current, self.current_step) currents_down = np.arange(self.max_current, self.min_current, -self.current_step) currents = np.concatenate( (currents_up, currents_down)) # Include the reverse currents *= 1e-3 # to mA from A steps = len(currents) # To calculate the e_step, convert to V/s and divide by measurement frequency self.source.ramp_to_voltage(hi_e) e_step = 0.001 * self.sweep_rate / self.deltat sweep1 = np.arange(in_e, hi_e, e_step) sweep2 = np.arange(hi_e, lo_e, -e_step) sweep3 = np.arange(lo_e, hi_e, e_step) potentials = np.concatenate((sweep2, sweep3)) potentials = np.tile(potentials, np.int(self.repeats)) sweep4 = np.arange(hi_e, in_e, -e_step) potentials = np.concatenate((sweep1, potentials)) potentials = np.concatenate((potentials, sweep4)) steps = len(potentials) log.info("Starting Discharge-Charge") for i, e in enumerate(potentials): log.debug("Measuring potential: %g V" % e) self.source.source_voltage = e sleep(1 / self.deltat) current = self.source.current time = i / self.deltat data = { 'Time (s)': time, 'Potential (V)': e, 'Current (A)': current } self.emit('results', data) self.emit('progress', 100. * i / steps) if self.should_stop(): log.warning("Catch stop command in procedure") break def shutdown(self): self.source.shutdown() self.source.beep(783.991, 0.1) sleep(0.125) self.source.beep(1046.50, 0.1) sleep(0.125) self.source.beep(1318.51, 0.1) sleep(0.125) self.source.beep(1567.98, 0.22) sleep(0.25) self.source.beep(1318.51, 0.1) sleep(0.125) self.source.beep(1567.98, 0.25) log.info("Finished")