diff --git a/automated-iv-curves/.DS_Store b/automated-iv-curves/.DS_Store index b44af38..94c0a47 100644 Binary files a/automated-iv-curves/.DS_Store and b/automated-iv-curves/.DS_Store differ diff --git a/automated-iv-curves/SIM900-SIM928-Keithly196-IV.py b/automated-iv-curves/SIM900-SIM928-Keithly196-IV.py deleted file mode 100755 index ed09692..0000000 --- a/automated-iv-curves/SIM900-SIM928-Keithly196-IV.py +++ /dev/null @@ -1,230 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Created on Mon Oct 10 16:05:44 2022 - -@author: gac-x01dc -""" - -# Program to do I-V measurements -# Using SIM928 voltage source within SIM900 mainframe -# Using Keithley196 for voltage measurement - -import time -import datetime -import os.path -import numpy as np -import matplotlib.pyplot as plt -import pyvisa -from pathlib import Path -rm = pyvisa.ResourceManager() - -import SIM900_commands as SIM900_comm -import SIM928_commands as SIM928_comm -import Keithley196_commands as Keithley_comm - -Keithley_address = 'TCPIP0::Prologix-00-21-69-01-4e-fb.psi.ch::1234::SOCKET' -# Keithley_address = 'GPIB0::6::INSTR' -SIM900_address = 'TCPIP0::ir-moxa01.psi.ch::3001::SOCKET'#'ASRL1::INSTR' - -Keithley = rm.open_resource(Keithley_address) -SIM900 = rm.open_resource(SIM900_address) -SIM928_port = 1 - -# Initialise Keithley -Keithley.clear() -Keithley.timeout = 5000 -Keithley.read_termination = '\n' -Keithley.write("T5X\n") # Ensures the Keithley reads when it is triggered by "X" write -Keithley_comm.Set_Mode(Keithley, "DC V") -Keithley_comm.Set_Range(Keithley, "Auto") -Keithley.read() # Throwaway - -# Initialise SIM900 -SIM900_comm.flush_main(SIM900) -SIM900_comm.reset(SIM900) -SIM900_comm.flush_port(SIM900, SIM928_port) - -# Function to read the voltage set by a voltage source -def read_source_V(): - count = 0 - voltage = SIM900_comm.send_query(SIM900, SIM928_port, SIM928_comm.read_voltage(), 128) # get voltage - print("returned data: "+voltage) - while (count<10) and (type(voltage)!= float): - try: - voltage = float(voltage) - except: - print('no float') - voltage = SIM900_comm.send_query(SIM900, SIM928_port, SIM928_comm.read_voltage(), 128) # get voltage - print("returned data: "+voltage) - count = count + 1 - return voltage - -#print(read_source_V()) - -# Function to set voltage of SIM928 -def set_voltage(V_value=1e-3): - if V_value > 20: - print ('Voltage setting too high (>10V), it is set to 10V') - V_value = 20 - elif V_value < -20: - print ('Voltage setting too high (<-10V), it is set to -10V') - V_value = -20 - SIM900_comm.send_command(SIM900, SIM928_port, SIM928_comm.set_voltage(V_value)) # get voltage - time.sleep(1) -# count = 0 -# while (count<10) and (read_source_V()!= V_value): -# print('Setting voltage again') -# time.sleep(1) #wait 1 second -# SIM900_comm.send_command(SIM900, SIM928_port, SIM928_comm.set_voltage(V_value)) # get voltage -# count = count + 1 - SIM900_comm.send_command(SIM900, SIM928_port, SIM928_comm.V_source_state("on")) - print('Voltage set to ' + str(V_value)) -# return read_source_V() - -# Function to measure the current from the Keithley voltmeter -# time_average is the averaging time, time_interval is the time between points -# Could also use "Filter (P)" command to set the Keithley's internal averaging time -def measure_V(time_average=10, time_interval=0.2): - N_points = time_average/time_interval + 1 - V_list = [] - i = 1 - Keithley_comm.Set_Range(Keithley, "Auto") #set auto range - time.sleep(time_interval) - while i < N_points: - V_list.append(Keithley_comm.Voltage(Keithley)) #read the voltage - time.sleep(time_interval) - i = i+1 - V_avg_ = np.mean(V_list, dtype=np.float32) - V_std_ = np.std(V_list, dtype=np.float32) - V_err_ = V_std_/(N_points)**(1/2) - return [V_list, V_avg_, V_err_] - - -# Function to do I-V measurements -# Currently doesn't read the voltage that was set, due to issues with querying through mainframe -# Errors caluclated incorrectly -def V_scan(V_start=1e-3, step_size=1e-3, V_end=2e-3, time_average=10, sample_name='no_name', contact_1 = '', contact_2 = '', light = 'Dark', temp=777, amplifier='SR570', gain=10**3, number_of_loops=0): - Keithley.clear() - print('Measurement started: %s'\ - %(datetime.datetime.now().strftime("%Hh%Mm%Ss"))) - V_scan_list = np.linspace(V_start, V_end, int(abs(V_start-V_end)/step_size)+1) - for n_l in range(number_of_loops): - V_scan_list = np.append(V_scan_list,np.linspace(V_end, V_start, (abs(V_start-V_end)/step_size)+1)) - print(V_scan_list) - SIM900_comm.send_command(SIM900, SIM928_port, SIM928_comm.V_source_state("off")) #set source off - # open a file to write data to - date_today = datetime.date.today() #date for making a directory - file_path = Path(__file__).parent / "data" / str(date_today) - if not os.path.exists(file_path):#make the directory if it is not there - os.mkdir(file_path) - time_start = datetime.datetime.now().strftime("%Hh%Mm%Ss") - filename_root = "%s_%s_%s_%s_%s_scan_at_%sK_%s" % \ - (time_start, sample_name, contact_1, contact_2, light, temp, amplifier) - filename = filename_root + "_averaging%ss.txt" % (time_average) - plotname = filename_root + "_averaging%ss.png" % (time_average) - filename2 = filename_root + "_raw.txt" - full_name = os.path.join(file_path, filename) - full_plotname = os.path.join(file_path, plotname) - full_name2 = os.path.join(file_path, filename2) - #data_file=open(str(full_name),'w') - with open(str(full_name),'w') as data_file, open(str(full_name2),'w') as raw_V_file: - data_file.write("Time\tVoltage_source[V]\tVoltage_meas[V]\tVoltage_meas_err[V]\tGain[V/A]\n") - raw_V_file.write("Voltage_source[V]\tVoltage_meas[V]\n") - # just for ploting here - V_plot_list = [] - V_err_plot_list = [] - V_scan_plot_list = [] - # A loop over all currents - - i=0 - # set_voltage(V_scan_list[0]) - # time.sleep(5) #wait 3 sec to avoid large noise on first measurement - - for V_scan_item in V_scan_list: - - time_start_iteration= datetime.datetime.now() - i = i+1 - set_voltage(V_scan_item) - time.sleep(2) #wait 5 sec for signal to settle - # measure+read+write the data - V_source = V_scan_item -# V_source = read_source_V() - [V_list, V_avg, V_err] = measure_V(time_average=time_average, time_interval=0.2) - time_now = datetime.datetime.now() - data_string = "%s\t %s\t %.5e\t %.5e\t %s\n"\ - %(time_now, V_source, V_avg, V_err, gain) - data_file.write(str(data_string)) - raw_V_file.write("%s\t %s\n" %(V_source, V_list)) - V_plot_list.append(V_avg) - V_err_plot_list.append(V_err) - V_scan_plot_list.append(V_source) - - #make plot - plt.close() - plt.plot(V_scan_plot_list, V_plot_list,'+') - plt.title(str(sample_name)) - plt.xlabel('Source Voltage / V') - plt.ylabel('Measured voltage / V') - plt.draw() - plt.pause(0.1) - plt.show(block=False) - iteration_time = datetime.datetime.now()-time_start_iteration - remaining_time = iteration_time.total_seconds()*(len(V_scan_list)-i) - print(time.strftime('remaining time: %H:%M:%S',\ - time.gmtime(remaining_time))) - - I_list = [V_plot_list[i]/gain for i in range(len(V_plot_list))] - I_err_list = [V_err_plot_list[i]/gain for i in range(len(V_plot_list))] - plt.close() - plt.figure() - plt.errorbar(V_scan_plot_list, I_list, yerr=I_err_list, fmt='+') - plt.title(str(sample_name)) - plt.xlabel('Source Voltage / V') - plt.ylabel('I / A') - plt.tight_layout() - plt.grid() - - plt.savefig(full_plotname) - plt.draw() - plt.pause(0.001) - plt.show(block=False) - plt.close() - - data_file.close() - raw_V_file.close() - set_voltage(0) - SIM900_comm.send_command(SIM900, SIM928_port, SIM928_comm.V_source_state("off")) #set source off - print('Source turned off') - print('Measurement finished: %s'\ - %(datetime.datetime.now().strftime("%Hh%Mm%Ss"))) - return - -# V_start, step size, V_end, time average, sample name, contact 1, contact 2, light, temperature, amplifier, amplifier gain -V_scan(-1.0, 0.05, 1.0, .1, "test", "test1", "test1", "MIR", 300, "SR570", 10**(7)) #amplifier sensitivity = 1/gain -#V_scan(-1.0, 0.1, 1.0, 1.0, "SHADWELL", "posContactC", "negContactF", "MIR", 18, "SR570", 10**(8)) #amplifier sensitivity = 1/gain -#V_scan(0.0, 0.1, 1.0, 1.0, "Sun", "posContactB", "negContactH", "MIR", 18, "SR570", 10**(9)) #amplifier sensitivity = 1/gain -#V_scan(0.0, 0.2, -2.0, 1.0, "Sun", "posContactB", "negContactH", "MIR", 18, "SR570", 10**(9)) #amplifier sensitivity = 1/gain -#V_scan(0.0, 0.2, 2.0, 1.0, "Sun", "posContactB", "negContactH", "MIR", 18, "SR570", 10**(9)) #amplifier sensitivity = 1/gain -#V_scan(0.0, 0.3, -3.0, 1.0, "Sun", "posContactB", "negContactH", "MIR", 18, "SR570", 10**(9)) #amplifier sensitivity = 1/gain -#V_scan(0.0, 0.3, 3.0, 1.0, "Sun", "posContactB", "negContactH", "MIR", 18, "SR570", 10**(9)) #amplifier sensitivity = 1/gain -#V_scan(0.0, 0.5, -5.0, 1.0, "Sun", "posContactB", "negContactH", "MIR", 18, "SR570", 10**(9)) #amplifier sensitivity = 1/gain -#V_scan(0.0, 0.5, 5.0, 1.0, "Sun", "posContactB", "negContactH", "MIR", 18, "SR570", 10**(9)) #amplifier sensitivity = 1/gain - -""" -# Set up the plot -plt.ion() # Enable interactive mode -figure, ax = plt.subplots(figsize=(10, 6)) # Create a figure and an axes -ax.set_title("Live Number Update") - -# Loop to update the number and plot every second -for _ in range(9999): # Limiting to 10 iterations for demonstration - number = Keithley_comm.Voltage(Keithley) - # Create a new plot for the current number - figure, ax = plt.subplots(figsize=(10, 6)) - ax.text(0.5, 0.5, str(number), fontsize=100, ha='center') # Display the number in the center - ax.set_title(f"Number: {number}") - ax.axis('off') # Turn off the axis - - plt.show() # Show the plot - time.sleep(2) # Pause for a second -""" diff --git a/automated-iv-curves/config.toml b/automated-iv-curves/config.toml index 4f21591..d0718cf 100644 --- a/automated-iv-curves/config.toml +++ b/automated-iv-curves/config.toml @@ -1,19 +1,31 @@ # Experiment parameters +[experiment] V_start = -1.0 +step_size = 0.5 V_end = 1.0 -step_size = 0.05 -time_average = 0.1 +time_average = 3 # time over which to collect voltage average (time per measurement) sample_name = "test" contact_1 = "test1" contact_2 = "test1" light = "MIR" temp = 300 amplifier = "SR570" -gain = 1e7 -number_of_loops = 0 +gain = 1e7 # amplifier gain # Instrument addresses: typically do NOT need to be changed -Keithley_address = 'TCPIP0::Prologix-00-21-69-01-4e-fb.psi.ch::1234::SOCKET' +[instruments] +keithley_address = 'TCPIP0::Prologix-00-21-69-01-4e-fb.psi.ch::1234::SOCKET' SIM900_address = 'TCPIP0::ir-moxa01.psi.ch::3001::SOCKET'#'ASRL1::INSTR' -SIM928_port = 1 \ No newline at end of file +SIM928_port = 1 + +# V_start, step size, V_end, time average, sample name, contact 1, contact 2, light, temperature, amplifier, amplifier gain +# V_scan(-1.0, 0.05, 1.0, .1, "test", "test1", "test1", "MIR", 300, "SR570", 10**(7)) #amplifier sensitivity = 1/gain +#V_scan(-1.0, 0.1, 1.0, 1.0, "SHADWELL", "posContactC", "negContactF", "MIR", 18, "SR570", 10**(8)) #amplifier sensitivity = 1/gain +#V_scan(0.0, 0.1, 1.0, 1.0, "Sun", "posContactB", "negContactH", "MIR", 18, "SR570", 10**(9)) #amplifier sensitivity = 1/gain +#V_scan(0.0, 0.2, -2.0, 1.0, "Sun", "posContactB", "negContactH", "MIR", 18, "SR570", 10**(9)) #amplifier sensitivity = 1/gain +#V_scan(0.0, 0.2, 2.0, 1.0, "Sun", "posContactB", "negContactH", "MIR", 18, "SR570", 10**(9)) #amplifier sensitivity = 1/gain +#V_scan(0.0, 0.3, -3.0, 1.0, "Sun", "posContactB", "negContactH", "MIR", 18, "SR570", 10**(9)) #amplifier sensitivity = 1/gain +#V_scan(0.0, 0.3, 3.0, 1.0, "Sun", "posContactB", "negContactH", "MIR", 18, "SR570", 10**(9)) #amplifier sensitivity = 1/gain +#V_scan(0.0, 0.5, -5.0, 1.0, "Sun", "posContactB", "negContactH", "MIR", 18, "SR570", 10**(9)) #amplifier sensitivity = 1/gain +#V_scan(0.0, 0.5, 5.0, 1.0, "Sun", "posContactB", "negContactH", "MIR", 18, "SR570", 10**(9)) #amplifier sensitivity = 1/gain diff --git a/automated-iv-curves/iv_functions.py b/automated-iv-curves/iv_functions.py index acf72a3..5b75713 100644 --- a/automated-iv-curves/iv_functions.py +++ b/automated-iv-curves/iv_functions.py @@ -8,16 +8,20 @@ import os.path import numpy as np import matplotlib.pyplot as plt import pyvisa +import h5py from pathlib import Path +import tomllib rm = pyvisa.ResourceManager() import SIM900_commands as SIM900_comm import SIM928_commands as SIM928_comm import Keithley196_commands as Keithley_comm +with open("automated-iv-curves/config.toml", "rb") as f: + cfg = tomllib.load(f) -Keithley = rm.open_resource(Keithley_address) -SIM900 = rm.open_resource(SIM900_address) +Keithley = rm.open_resource(cfg["instruments"]["keithley_address"]) +SIM900 = rm.open_resource(cfg["instruments"]["SIM900_address"]) # Initialise Keithley Keithley.clear() @@ -29,6 +33,7 @@ Keithley_comm.Set_Range(Keithley, "Auto") Keithley.read() # Throwaway # Initialise SIM900 +SIM928_port = cfg["instruments"]["SIM928_port"] SIM900_comm.flush_main(SIM900) SIM900_comm.reset(SIM900) SIM900_comm.flush_port(SIM900, SIM928_port) @@ -48,7 +53,6 @@ def read_source_V(): count = count + 1 return voltage -#print(read_source_V()) # Function to set voltage of SIM928 def set_voltage(V_value=1e-3): @@ -60,15 +64,9 @@ def set_voltage(V_value=1e-3): V_value = -20 SIM900_comm.send_command(SIM900, SIM928_port, SIM928_comm.set_voltage(V_value)) # get voltage time.sleep(1) -# count = 0 -# while (count<10) and (read_source_V()!= V_value): -# print('Setting voltage again') -# time.sleep(1) #wait 1 second -# SIM900_comm.send_command(SIM900, SIM928_port, SIM928_comm.set_voltage(V_value)) # get voltage -# count = count + 1 SIM900_comm.send_command(SIM900, SIM928_port, SIM928_comm.V_source_state("on")) - print('Voltage set to ' + str(V_value)) -# return read_source_V() + print('\nVoltage set to ' + str(V_value) + " V") + # Function to measure the current from the Keithley voltmeter # time_average is the averaging time, time_interval is the time between points @@ -93,127 +91,104 @@ def measure_V(time_average=10, time_interval=0.2): # Currently doesn't read the voltage that was set, due to issues with querying through mainframe # Errors caluclated incorrectly def V_scan(V_start=1e-3, step_size=1e-3, V_end=2e-3, time_average=10, sample_name='no_name', contact_1 = '', contact_2 = '', light = 'Dark', temp=777, amplifier='SR570', gain=10**3, number_of_loops=0): - Keithley.clear() - print('Measurement started: %s'\ - %(datetime.datetime.now().strftime("%Hh%Mm%Ss"))) + Keithley.clear() # clear the buffer + gain = int(gain) # make sure the gain is an Int + + data_id = datetime.datetime.now().strftime("%d%m%Y_%H%M%S") + + print('\nStarting measurement.\nMeasurement ID: %s\n' %data_id) V_scan_list = np.linspace(V_start, V_end, int(abs(V_start-V_end)/step_size)+1) for n_l in range(number_of_loops): V_scan_list = np.append(V_scan_list,np.linspace(V_end, V_start, (abs(V_start-V_end)/step_size)+1)) + print("Voltage scanning list:") print(V_scan_list) + SIM900_comm.send_command(SIM900, SIM928_port, SIM928_comm.V_source_state("off")) #set source off + # open a file to write data to - date_today = datetime.date.today() #date for making a directory - file_path = Path(__file__).parent / "data" / str(date_today) - if not os.path.exists(file_path):#make the directory if it is not there - os.mkdir(file_path) - time_start = datetime.datetime.now().strftime("%Hh%Mm%Ss") - filename_root = "%s_%s_%s_%s_%s_scan_at_%sK_%s" % \ - (time_start, sample_name, contact_1, contact_2, light, temp, amplifier) - filename = filename_root + "_averaging%ss.txt" % (time_average) - plotname = filename_root + "_averaging%ss.png" % (time_average) - filename2 = filename_root + "_raw.txt" - full_name = os.path.join(file_path, filename) - full_plotname = os.path.join(file_path, plotname) - full_name2 = os.path.join(file_path, filename2) + # file_path = Path(__file__).parent / "data" + # time_start = datetime.datetime.now().strftime("%d%m%Y_%H%M%S") + # filename_root = "iv_%s_%s_%s_%s_%s_scan_at_%sK_%s" % \ + # (time_start, sample_name, contact_1, contact_2, light, temp, amplifier) + # filename = filename_root + "_averaging%ss.txt" % (time_average) + # plotname = filename_root + "_averaging%ss.png" % (time_average) + # filename2 = filename_root + "_raw.txt" + # full_name = os.path.join(file_path, filename) + # full_plotname = os.path.join(file_path, plotname) + # full_name2 = os.path.join(file_path, filename2) #data_file=open(str(full_name),'w') - with open(str(full_name),'w') as data_file, open(str(full_name2),'w') as raw_V_file: - data_file.write("Time\tVoltage_source[V]\tVoltage_meas[V]\tVoltage_meas_err[V]\tGain[V/A]\n") - raw_V_file.write("Voltage_source[V]\tVoltage_meas[V]\n") + # with open(str(full_name),'w') as data_file, open(str(full_name2),'w') as raw_V_file: + # data_file.write("Time\tVoltage_source[V]\tVoltage_meas[V]\tVoltage_meas_err[V]\tGain[V/A]\n") + # raw_V_file.write("Voltage_source[V]\tVoltage_meas[V]\n") # just for ploting here - V_plot_list = [] - V_err_plot_list = [] - V_scan_plot_list = [] - # A loop over all currents - - i=0 - # set_voltage(V_scan_list[0]) - # time.sleep(5) #wait 3 sec to avoid large noise on first measurement + V_plot_list = [] + V_err_plot_list = [] + V_scan_plot_list = [] + # A loop over all currents + + i=0 + # set_voltage(V_scan_list[0]) + # time.sleep(5) #wait 3 sec to avoid large noise on first measurement - for V_scan_item in V_scan_list: - - time_start_iteration= datetime.datetime.now() - i = i+1 - set_voltage(V_scan_item) - time.sleep(2) #wait 5 sec for signal to settle - # measure+read+write the data - V_source = V_scan_item + for V_scan_item in V_scan_list: + + time_start_iteration= datetime.datetime.now() + i = i+1 + set_voltage(V_scan_item) + time.sleep(2) #wait 5 sec for signal to settle + + # measure+read+write the data + V_source = V_scan_item # V_source = read_source_V() - [V_list, V_avg, V_err] = measure_V(time_average=time_average, time_interval=0.2) - time_now = datetime.datetime.now() - data_string = "%s\t %s\t %.5e\t %.5e\t %s\n"\ - %(time_now, V_source, V_avg, V_err, gain) - data_file.write(str(data_string)) - raw_V_file.write("%s\t %s\n" %(V_source, V_list)) - V_plot_list.append(V_avg) - V_err_plot_list.append(V_err) - V_scan_plot_list.append(V_source) + [V_list, V_avg, V_err] = measure_V(time_average=time_average, time_interval=0.2) + time_now = datetime.datetime.now() - #make plot - plt.close() - plt.plot(V_scan_plot_list, V_plot_list,'+') - plt.title(str(sample_name)) - plt.xlabel('Source Voltage / V') - plt.ylabel('Measured voltage / V') - plt.draw() - plt.pause(0.1) - plt.show(block=False) - iteration_time = datetime.datetime.now()-time_start_iteration - remaining_time = iteration_time.total_seconds()*(len(V_scan_list)-i) - print(time.strftime('remaining time: %H:%M:%S',\ - time.gmtime(remaining_time))) - - I_list = [V_plot_list[i]/gain for i in range(len(V_plot_list))] - I_err_list = [V_err_plot_list[i]/gain for i in range(len(V_plot_list))] - plt.close() - plt.figure() - plt.errorbar(V_scan_plot_list, I_list, yerr=I_err_list, fmt='+') - plt.title(str(sample_name)) - plt.xlabel('Source Voltage / V') - plt.ylabel('I / A') - plt.tight_layout() - plt.grid() + # data_string = "%s\t %s\t %.5e\t %.5e\t %s\n"\ + # %(time_now, V_source, V_avg, V_err, gain) + # data_file.write(str(data_string)) + # raw_V_file.write("%s\t %s\n" %(V_source, V_list)) - plt.savefig(full_plotname) - plt.draw() - plt.pause(0.001) - plt.show(block=False) - plt.close() + V_plot_list.append(V_avg) + V_err_plot_list.append(V_err) + V_scan_plot_list.append(V_source) + + #make plot + # plt.close() + # plt.plot(V_scan_plot_list, V_plot_list,'+') + # plt.title(str(sample_name)) + # plt.xlabel('Source Voltage / V') + # plt.ylabel('Measured voltage / V') + # plt.draw() + # plt.pause(0.1) + # plt.show(block=False) + # iteration_time = datetime.datetime.now()-time_start_iteration + # remaining_time = iteration_time.total_seconds()*(len(V_scan_list)-i) + # print(time.strftime('Remaining time: %H:%M:%S',\ + # time.gmtime(remaining_time))) - data_file.close() - raw_V_file.close() + I_list = [V_plot_list[i]/gain for i in range(len(V_plot_list))] + I_err_list = [V_err_plot_list[i]/gain for i in range(len(V_plot_list))] + # plt.close() + # plt.figure() + # plt.errorbar(V_scan_plot_list, I_list, yerr=I_err_list, fmt='+') + # plt.title(str(sample_name)) + # plt.xlabel('Source Voltage / V') + # plt.ylabel('I / A') + # plt.tight_layout() + # plt.grid() + + # plt.savefig(full_plotname) + # plt.draw() + # plt.pause(0.001) + # plt.show(block=False) + # plt.close() + + # data_file.close() + # raw_V_file.close() set_voltage(0) + SIM900_comm.send_command(SIM900, SIM928_port, SIM928_comm.V_source_state("off")) #set source off print('Source turned off') print('Measurement finished: %s'\ %(datetime.datetime.now().strftime("%Hh%Mm%Ss"))) return - -# V_start, step size, V_end, time average, sample name, contact 1, contact 2, light, temperature, amplifier, amplifier gain -V_scan(-1.0, 0.05, 1.0, .1, "test", "test1", "test1", "MIR", 300, "SR570", 10**(7)) #amplifier sensitivity = 1/gain -#V_scan(-1.0, 0.1, 1.0, 1.0, "SHADWELL", "posContactC", "negContactF", "MIR", 18, "SR570", 10**(8)) #amplifier sensitivity = 1/gain -#V_scan(0.0, 0.1, 1.0, 1.0, "Sun", "posContactB", "negContactH", "MIR", 18, "SR570", 10**(9)) #amplifier sensitivity = 1/gain -#V_scan(0.0, 0.2, -2.0, 1.0, "Sun", "posContactB", "negContactH", "MIR", 18, "SR570", 10**(9)) #amplifier sensitivity = 1/gain -#V_scan(0.0, 0.2, 2.0, 1.0, "Sun", "posContactB", "negContactH", "MIR", 18, "SR570", 10**(9)) #amplifier sensitivity = 1/gain -#V_scan(0.0, 0.3, -3.0, 1.0, "Sun", "posContactB", "negContactH", "MIR", 18, "SR570", 10**(9)) #amplifier sensitivity = 1/gain -#V_scan(0.0, 0.3, 3.0, 1.0, "Sun", "posContactB", "negContactH", "MIR", 18, "SR570", 10**(9)) #amplifier sensitivity = 1/gain -#V_scan(0.0, 0.5, -5.0, 1.0, "Sun", "posContactB", "negContactH", "MIR", 18, "SR570", 10**(9)) #amplifier sensitivity = 1/gain -#V_scan(0.0, 0.5, 5.0, 1.0, "Sun", "posContactB", "negContactH", "MIR", 18, "SR570", 10**(9)) #amplifier sensitivity = 1/gain - -""" -# Set up the plot -plt.ion() # Enable interactive mode -figure, ax = plt.subplots(figsize=(10, 6)) # Create a figure and an axes -ax.set_title("Live Number Update") - -# Loop to update the number and plot every second -for _ in range(9999): # Limiting to 10 iterations for demonstration - number = Keithley_comm.Voltage(Keithley) - # Create a new plot for the current number - figure, ax = plt.subplots(figsize=(10, 6)) - ax.text(0.5, 0.5, str(number), fontsize=100, ha='center') # Display the number in the center - ax.set_title(f"Number: {number}") - ax.axis('off') # Turn off the axis - - plt.show() # Show the plot - time.sleep(2) # Pause for a second -""" diff --git a/automated-iv-curves/iv_run.py b/automated-iv-curves/iv_run.py new file mode 100644 index 0000000..4cc3707 --- /dev/null +++ b/automated-iv-curves/iv_run.py @@ -0,0 +1,9 @@ +# Run IV curves using the SIM900/SIM928 source and the Keithley 196 voltmeter + +import tomllib +from iv_functions import V_scan + +with open("automated-iv-curves/config.toml", "rb") as f: + cfg = tomllib.load(f) + +V_scan(**cfg["experiment"]) \ No newline at end of file diff --git a/automated-iv-curves/main.py b/automated-iv-curves/main.py deleted file mode 100644 index 1200fea..0000000 --- a/automated-iv-curves/main.py +++ /dev/null @@ -1,6 +0,0 @@ -def main(): - print("Hello from automated-iv-curves!") - - -if __name__ == "__main__": - main() diff --git a/automated-iv-curves/pyproject.toml b/automated-iv-curves/pyproject.toml index 21c67bb..f45c7c8 100644 --- a/automated-iv-curves/pyproject.toml +++ b/automated-iv-curves/pyproject.toml @@ -6,6 +6,7 @@ readme = "README.md" requires-python = ">=3.9" dependencies = [ "datetime>=5.5", + "h5py>=3.14.0", "ipykernel>=6.31.0", "jupyter>=1.1.1", "matplotlib>=3.9.4", diff --git a/automated-iv-curves/uv.lock b/automated-iv-curves/uv.lock index dc15d80..cf67669 100644 --- a/automated-iv-curves/uv.lock +++ b/automated-iv-curves/uv.lock @@ -171,6 +171,8 @@ source = { virtual = "." } dependencies = [ { name = "datetime", version = "5.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "datetime", version = "6.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "h5py", version = "3.14.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "h5py", version = "3.16.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "ipykernel", version = "6.31.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "ipykernel", version = "7.2.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "jupyter" }, @@ -191,6 +193,7 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "datetime", specifier = ">=5.5" }, + { name = "h5py", specifier = ">=3.14.0" }, { name = "ipykernel", specifier = ">=6.31.0" }, { name = "jupyter", specifier = ">=1.1.1" }, { name = "matplotlib", specifier = ">=3.9.4" }, @@ -1013,6 +1016,109 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, ] +[[package]] +name = "h5py" +version = "3.14.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.10'", +] +dependencies = [ + { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5d/57/dfb3c5c3f1bf5f5ef2e59a22dec4ff1f3d7408b55bfcefcfb0ea69ef21c6/h5py-3.14.0.tar.gz", hash = "sha256:2372116b2e0d5d3e5e705b7f663f7c8d96fa79a4052d250484ef91d24d6a08f4", size = 424323, upload-time = "2025-06-06T14:06:15.01Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/89/06cbb421e01dea2e338b3154326523c05d9698f89a01f9d9b65e1ec3fb18/h5py-3.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:24df6b2622f426857bda88683b16630014588a0e4155cba44e872eb011c4eaed", size = 3332522, upload-time = "2025-06-06T14:04:13.775Z" }, + { url = "https://files.pythonhosted.org/packages/c3/e7/6c860b002329e408348735bfd0459e7b12f712c83d357abeef3ef404eaa9/h5py-3.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ff2389961ee5872de697054dd5a033b04284afc3fb52dc51d94561ece2c10c6", size = 2831051, upload-time = "2025-06-06T14:04:18.206Z" }, + { url = "https://files.pythonhosted.org/packages/fa/cd/3dd38cdb7cc9266dc4d85f27f0261680cb62f553f1523167ad7454e32b11/h5py-3.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:016e89d3be4c44f8d5e115fab60548e518ecd9efe9fa5c5324505a90773e6f03", size = 4324677, upload-time = "2025-06-06T14:04:23.438Z" }, + { url = "https://files.pythonhosted.org/packages/b1/45/e1a754dc7cd465ba35e438e28557119221ac89b20aaebef48282654e3dc7/h5py-3.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1223b902ef0b5d90bcc8a4778218d6d6cd0f5561861611eda59fa6c52b922f4d", size = 4557272, upload-time = "2025-06-06T14:04:28.863Z" }, + { url = "https://files.pythonhosted.org/packages/5c/06/f9506c1531645829d302c420851b78bb717af808dde11212c113585fae42/h5py-3.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:852b81f71df4bb9e27d407b43071d1da330d6a7094a588efa50ef02553fa7ce4", size = 2866734, upload-time = "2025-06-06T14:04:33.5Z" }, + { url = "https://files.pythonhosted.org/packages/61/1b/ad24a8ce846cf0519695c10491e99969d9d203b9632c4fcd5004b1641c2e/h5py-3.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f30dbc58f2a0efeec6c8836c97f6c94afd769023f44e2bb0ed7b17a16ec46088", size = 3352382, upload-time = "2025-06-06T14:04:37.95Z" }, + { url = "https://files.pythonhosted.org/packages/36/5b/a066e459ca48b47cc73a5c668e9924d9619da9e3c500d9fb9c29c03858ec/h5py-3.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:543877d7f3d8f8a9828ed5df6a0b78ca3d8846244b9702e99ed0d53610b583a8", size = 2852492, upload-time = "2025-06-06T14:04:42.092Z" }, + { url = "https://files.pythonhosted.org/packages/08/0c/5e6aaf221557314bc15ba0e0da92e40b24af97ab162076c8ae009320a42b/h5py-3.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c497600c0496548810047257e36360ff551df8b59156d3a4181072eed47d8ad", size = 4298002, upload-time = "2025-06-06T14:04:47.106Z" }, + { url = "https://files.pythonhosted.org/packages/21/d4/d461649cafd5137088fb7f8e78fdc6621bb0c4ff2c090a389f68e8edc136/h5py-3.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:723a40ee6505bd354bfd26385f2dae7bbfa87655f4e61bab175a49d72ebfc06b", size = 4516618, upload-time = "2025-06-06T14:04:52.467Z" }, + { url = "https://files.pythonhosted.org/packages/db/0c/6c3f879a0f8e891625817637fad902da6e764e36919ed091dc77529004ac/h5py-3.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:d2744b520440a996f2dae97f901caa8a953afc055db4673a993f2d87d7f38713", size = 2874888, upload-time = "2025-06-06T14:04:56.95Z" }, + { url = "https://files.pythonhosted.org/packages/3e/77/8f651053c1843391e38a189ccf50df7e261ef8cd8bfd8baba0cbe694f7c3/h5py-3.14.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e0045115d83272090b0717c555a31398c2c089b87d212ceba800d3dc5d952e23", size = 3312740, upload-time = "2025-06-06T14:05:01.193Z" }, + { url = "https://files.pythonhosted.org/packages/ff/10/20436a6cf419b31124e59fefc78d74cb061ccb22213226a583928a65d715/h5py-3.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6da62509b7e1d71a7d110478aa25d245dd32c8d9a1daee9d2a42dba8717b047a", size = 2829207, upload-time = "2025-06-06T14:05:05.061Z" }, + { url = "https://files.pythonhosted.org/packages/3f/19/c8bfe8543bfdd7ccfafd46d8cfd96fce53d6c33e9c7921f375530ee1d39a/h5py-3.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:554ef0ced3571366d4d383427c00c966c360e178b5fb5ee5bb31a435c424db0c", size = 4708455, upload-time = "2025-06-06T14:05:11.528Z" }, + { url = "https://files.pythonhosted.org/packages/86/f9/f00de11c82c88bfc1ef22633557bfba9e271e0cb3189ad704183fc4a2644/h5py-3.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0cbd41f4e3761f150aa5b662df991868ca533872c95467216f2bec5fcad84882", size = 4929422, upload-time = "2025-06-06T14:05:18.399Z" }, + { url = "https://files.pythonhosted.org/packages/7a/6d/6426d5d456f593c94b96fa942a9b3988ce4d65ebaf57d7273e452a7222e8/h5py-3.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:bf4897d67e613ecf5bdfbdab39a1158a64df105827da70ea1d90243d796d367f", size = 2862845, upload-time = "2025-06-06T14:05:23.699Z" }, + { url = "https://files.pythonhosted.org/packages/6c/c2/7efe82d09ca10afd77cd7c286e42342d520c049a8c43650194928bcc635c/h5py-3.14.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:aa4b7bbce683379b7bf80aaba68e17e23396100336a8d500206520052be2f812", size = 3289245, upload-time = "2025-06-06T14:05:28.24Z" }, + { url = "https://files.pythonhosted.org/packages/4f/31/f570fab1239b0d9441024b92b6ad03bb414ffa69101a985e4c83d37608bd/h5py-3.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ef9603a501a04fcd0ba28dd8f0995303d26a77a980a1f9474b3417543d4c6174", size = 2807335, upload-time = "2025-06-06T14:05:31.997Z" }, + { url = "https://files.pythonhosted.org/packages/0d/ce/3a21d87896bc7e3e9255e0ad5583ae31ae9e6b4b00e0bcb2a67e2b6acdbc/h5py-3.14.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8cbaf6910fa3983c46172666b0b8da7b7bd90d764399ca983236f2400436eeb", size = 4700675, upload-time = "2025-06-06T14:05:37.38Z" }, + { url = "https://files.pythonhosted.org/packages/e7/ec/86f59025306dcc6deee5fda54d980d077075b8d9889aac80f158bd585f1b/h5py-3.14.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d90e6445ab7c146d7f7981b11895d70bc1dd91278a4f9f9028bc0c95e4a53f13", size = 4921632, upload-time = "2025-06-06T14:05:43.464Z" }, + { url = "https://files.pythonhosted.org/packages/3f/6d/0084ed0b78d4fd3e7530c32491f2884140d9b06365dac8a08de726421d4a/h5py-3.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:ae18e3de237a7a830adb76aaa68ad438d85fe6e19e0d99944a3ce46b772c69b3", size = 2852929, upload-time = "2025-06-06T14:05:47.659Z" }, + { url = "https://files.pythonhosted.org/packages/ec/ac/9ea82488c8790ee5b6ad1a807cd7dc3b9dadfece1cd0e0e369f68a7a8937/h5py-3.14.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f5cc1601e78027cedfec6dd50efb4802f018551754191aeb58d948bd3ec3bd7a", size = 3345097, upload-time = "2025-06-06T14:05:51.984Z" }, + { url = "https://files.pythonhosted.org/packages/6c/bc/a172ecaaf287e3af2f837f23b470b0a2229c79555a0da9ac8b5cc5bed078/h5py-3.14.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e59d2136a8b302afd25acdf7a89b634e0eb7c66b1a211ef2d0457853768a2ef", size = 2843320, upload-time = "2025-06-06T14:05:55.754Z" }, + { url = "https://files.pythonhosted.org/packages/66/40/b423b57696514e05aa7bb06150ef96667d0e0006cc6de7ab52c71734ab51/h5py-3.14.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:573c33ad056ac7c1ab6d567b6db9df3ffc401045e3f605736218f96c1e0490c6", size = 4326368, upload-time = "2025-06-06T14:06:00.782Z" }, + { url = "https://files.pythonhosted.org/packages/f7/07/e088f89f04fdbe57ddf9de377f857158d3daa38cf5d0fb20ef9bd489e313/h5py-3.14.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ccbe17dc187c0c64178f1a10aa274ed3a57d055117588942b8a08793cc448216", size = 4559686, upload-time = "2025-06-06T14:06:07.416Z" }, + { url = "https://files.pythonhosted.org/packages/b4/e4/fb8032d0e5480b1db9b419b5b50737b61bb3c7187c49d809975d62129fb0/h5py-3.14.0-cp39-cp39-win_amd64.whl", hash = "sha256:4f025cf30ae738c4c4e38c7439a761a71ccfcce04c2b87b2a2ac64e8c5171d43", size = 2877166, upload-time = "2025-06-06T14:06:13.05Z" }, +] + +[[package]] +name = "h5py" +version = "3.16.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", +] +dependencies = [ + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/db/33/acd0ce6863b6c0d7735007df01815403f5589a21ff8c2e1ee2587a38f548/h5py-3.16.0.tar.gz", hash = "sha256:a0dbaad796840ccaa67a4c144a0d0c8080073c34c76d5a6941d6818678ef2738", size = 446526, upload-time = "2026-03-06T13:49:08.07Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/6b/231413e58a787a89b316bb0d1777da3c62257e4797e09afd8d17ad3549dc/h5py-3.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e06f864bedb2c8e7c1358e6c73af48519e317457c444d6f3d332bb4e8fa6d7d9", size = 3724137, upload-time = "2026-03-06T13:47:35.242Z" }, + { url = "https://files.pythonhosted.org/packages/74/f9/557ce3aad0fe8471fb5279bab0fc56ea473858a022c4ce8a0b8f303d64e9/h5py-3.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ec86d4fffd87a0f4cb3d5796ceb5a50123a2a6d99b43e616e5504e66a953eca3", size = 3090112, upload-time = "2026-03-06T13:47:37.634Z" }, + { url = "https://files.pythonhosted.org/packages/7a/f5/e15b3d0dc8a18e56409a839e6468d6fb589bc5207c917399c2e0706eeb44/h5py-3.16.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:86385ea895508220b8a7e45efa428aeafaa586bd737c7af9ee04661d8d84a10d", size = 4844847, upload-time = "2026-03-06T13:47:39.811Z" }, + { url = "https://files.pythonhosted.org/packages/cb/92/a8851d936547efe30cc0ce5245feac01f3ec6171f7899bc3f775c72030b3/h5py-3.16.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:8975273c2c5921c25700193b408e28d6bdd0111c37468b2d4e25dcec4cd1d84d", size = 5065352, upload-time = "2026-03-06T13:47:41.489Z" }, + { url = "https://files.pythonhosted.org/packages/2b/ae/f2adc5d0ca9626db3277a3d87516e124cbc5d0eea0bd79bc085702d04f2c/h5py-3.16.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1677ad48b703f44efc9ea0c3ab284527f81bc4f318386aaaebc5fede6bbae56f", size = 4839173, upload-time = "2026-03-06T13:47:43.586Z" }, + { url = "https://files.pythonhosted.org/packages/64/0b/e0c8c69da1d8838da023a50cd3080eae5d475691f7636b35eff20bb6ef20/h5py-3.16.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7c4dd4cf5f0a4e36083f73172f6cfc25a5710789269547f132a20975bfe2434c", size = 5076216, upload-time = "2026-03-06T13:47:45.315Z" }, + { url = "https://files.pythonhosted.org/packages/66/35/d88fd6718832133c885004c61ceeeb24dbd6397ef877dbed6b3a64d6a286/h5py-3.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:bdef06507725b455fccba9c16529121a5e1fbf56aa375f7d9713d9e8ff42454d", size = 3183639, upload-time = "2026-03-06T13:47:47.041Z" }, + { url = "https://files.pythonhosted.org/packages/ba/95/a825894f3e45cbac7554c4e97314ce886b233a20033787eda755ca8fecc7/h5py-3.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:719439d14b83f74eeb080e9650a6c7aa6d0d9ea0ca7f804347b05fac6fbf18af", size = 3721663, upload-time = "2026-03-06T13:47:49.599Z" }, + { url = "https://files.pythonhosted.org/packages/bf/3b/38ff88b347c3e346cda1d3fc1b65a7aa75d40632228d8b8a5d7b58508c24/h5py-3.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c3f0a0e136f2e95dd0b67146abb6668af4f1a69c81ef8651a2d316e8e01de447", size = 3087630, upload-time = "2026-03-06T13:47:51.249Z" }, + { url = "https://files.pythonhosted.org/packages/98/a8/2594cef906aee761601eff842c7dc598bea2b394a3e1c00966832b8eeb7c/h5py-3.16.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:a6fbc5367d4046801f9b7db9191b31895f22f1c6df1f9987d667854cac493538", size = 4823472, upload-time = "2026-03-06T13:47:53.085Z" }, + { url = "https://files.pythonhosted.org/packages/52/a0/c1f604538ff6db22a0690be2dc44ab59178e115f63c917794e529356ab23/h5py-3.16.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:fb1720028d99040792bb2fb31facb8da44a6f29df7697e0b84f0d79aff2e9bd3", size = 5027150, upload-time = "2026-03-06T13:47:55.043Z" }, + { url = "https://files.pythonhosted.org/packages/2e/fd/301739083c2fc4fd89950f9bcfce75d6e14b40b0ca3d40e48a8993d1722c/h5py-3.16.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:314b6054fe0b1051c2b0cb2df5cbdab15622fb05e80f202e3b6a5eee0d6fe365", size = 4814544, upload-time = "2026-03-06T13:47:56.893Z" }, + { url = "https://files.pythonhosted.org/packages/4c/42/2193ed41ccee78baba8fcc0cff2c925b8b9ee3793305b23e1f22c20bf4c7/h5py-3.16.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ffbab2fedd6581f6aa31cf1639ca2cb86e02779de525667892ebf4cc9fd26434", size = 5034013, upload-time = "2026-03-06T13:47:59.01Z" }, + { url = "https://files.pythonhosted.org/packages/f7/20/e6c0ff62ca2ad1a396a34f4380bafccaaf8791ff8fccf3d995a1fc12d417/h5py-3.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:17d1f1630f92ad74494a9a7392ab25982ce2b469fc62da6074c0ce48366a2999", size = 3191673, upload-time = "2026-03-06T13:48:00.626Z" }, + { url = "https://files.pythonhosted.org/packages/f2/48/239cbe352ac4f2b8243a8e620fa1a2034635f633731493a7ff1ed71e8658/h5py-3.16.0-cp311-cp311-win_arm64.whl", hash = "sha256:85b9c49dd58dc44cf70af944784e2c2038b6f799665d0dcbbc812a26e0faa859", size = 2673834, upload-time = "2026-03-06T13:48:02.579Z" }, + { url = "https://files.pythonhosted.org/packages/c8/c0/5d4119dba94093bbafede500d3defd2f5eab7897732998c04b54021e530b/h5py-3.16.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c5313566f4643121a78503a473f0fb1e6dcc541d5115c44f05e037609c565c4d", size = 3685604, upload-time = "2026-03-06T13:48:04.198Z" }, + { url = "https://files.pythonhosted.org/packages/b0/42/c84efcc1d4caebafb1ecd8be4643f39c85c47a80fe254d92b8b43b1eadaf/h5py-3.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:42b012933a83e1a558c673176676a10ce2fd3759976a0fedee1e672d1e04fc9d", size = 3061940, upload-time = "2026-03-06T13:48:05.783Z" }, + { url = "https://files.pythonhosted.org/packages/89/84/06281c82d4d1686fde1ac6b0f307c50918f1c0151062445ab3b6fa5a921d/h5py-3.16.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:ff24039e2573297787c3063df64b60aab0591980ac898329a08b0320e0cf2527", size = 5198852, upload-time = "2026-03-06T13:48:07.482Z" }, + { url = "https://files.pythonhosted.org/packages/9e/e9/1a19e42cd43cc1365e127db6aae85e1c671da1d9a5d746f4d34a50edb577/h5py-3.16.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:dfc21898ff025f1e8e67e194965a95a8d4754f452f83454538f98f8a3fcb207e", size = 5405250, upload-time = "2026-03-06T13:48:09.628Z" }, + { url = "https://files.pythonhosted.org/packages/b7/8e/9790c1655eabeb85b92b1ecab7d7e62a2069e53baefd58c98f0909c7a948/h5py-3.16.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:698dd69291272642ffda44a0ecd6cd3bda5faf9621452d255f57ce91487b9794", size = 5190108, upload-time = "2026-03-06T13:48:11.26Z" }, + { url = "https://files.pythonhosted.org/packages/51/d7/ab693274f1bd7e8c5f9fdd6c7003a88d59bedeaf8752716a55f532924fbb/h5py-3.16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2b2c02b0a160faed5fb33f1ba8a264a37ee240b22e049ecc827345d0d9043074", size = 5419216, upload-time = "2026-03-06T13:48:13.322Z" }, + { url = "https://files.pythonhosted.org/packages/03/c1/0976b235cf29ead553e22f2fb6385a8252b533715e00d0ae52ed7b900582/h5py-3.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:96b422019a1c8975c2d5dadcf61d4ba6f01c31f92bbde6e4649607885fe502d6", size = 3182868, upload-time = "2026-03-06T13:48:15.759Z" }, + { url = "https://files.pythonhosted.org/packages/14/d9/866b7e570b39070f92d47b0ff1800f0f8239b6f9e45f02363d7112336c1f/h5py-3.16.0-cp312-cp312-win_arm64.whl", hash = "sha256:39c2838fb1e8d97bcf1755e60ad1f3dd76a7b2a475928dc321672752678b96db", size = 2653286, upload-time = "2026-03-06T13:48:17.279Z" }, + { url = "https://files.pythonhosted.org/packages/0f/9e/6142ebfda0cb6e9349c091eae73c2e01a770b7659255248d637bec54a88b/h5py-3.16.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:370a845f432c2c9619db8eed334d1e610c6015796122b0e57aa46312c22617d9", size = 3671808, upload-time = "2026-03-06T13:48:19.737Z" }, + { url = "https://files.pythonhosted.org/packages/b0/65/5e088a45d0f43cd814bc5bec521c051d42005a472e804b1a36c48dada09b/h5py-3.16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:42108e93326c50c2810025aade9eac9d6827524cdccc7d4b75a546e5ab308edb", size = 3045837, upload-time = "2026-03-06T13:48:21.854Z" }, + { url = "https://files.pythonhosted.org/packages/da/1e/6172269e18cc5a484e2913ced33339aad588e02ba407fafd00d369e22ef3/h5py-3.16.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:099f2525c9dcf28de366970a5fb34879aab20491589fa89ce2863a84218bb524", size = 5193860, upload-time = "2026-03-06T13:48:24.071Z" }, + { url = "https://files.pythonhosted.org/packages/bd/98/ef2b6fe2903e377cbe870c3b2800d62552f1e3dbe81ce49e1923c53d1c5c/h5py-3.16.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:9300ad32dea9dfc5171f94d5f6948e159ed93e4701280b0f508773b3f582f402", size = 5400417, upload-time = "2026-03-06T13:48:25.728Z" }, + { url = "https://files.pythonhosted.org/packages/bc/81/5b62d760039eed64348c98129d17061fdfc7839fc9c04eaaad6dee1004e4/h5py-3.16.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:171038f23bccddfc23f344cadabdfc9917ff554db6a0d417180d2747fe4c75a7", size = 5185214, upload-time = "2026-03-06T13:48:27.436Z" }, + { url = "https://files.pythonhosted.org/packages/28/c4/532123bcd9080e250696779c927f2cb906c8bf3447df98f5ceb8dcded539/h5py-3.16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7e420b539fb6023a259a1b14d4c9f6df8cf50d7268f48e161169987a57b737ff", size = 5414598, upload-time = "2026-03-06T13:48:29.49Z" }, + { url = "https://files.pythonhosted.org/packages/c3/d9/a27997f84341fc0dfcdd1fe4179b6ba6c32a7aa880fdb8c514d4dad6fba3/h5py-3.16.0-cp313-cp313-win_amd64.whl", hash = "sha256:18f2bbcd545e6991412253b98727374c356d67caa920e68dc79eab36bf5fedad", size = 3175509, upload-time = "2026-03-06T13:48:31.131Z" }, + { url = "https://files.pythonhosted.org/packages/a5/23/bb8647521d4fd770c30a76cfc6cb6a2f5495868904054e92f2394c5a78ff/h5py-3.16.0-cp313-cp313-win_arm64.whl", hash = "sha256:656f00e4d903199a1d58df06b711cf3ca632b874b4207b7dbec86185b5c8c7d4", size = 2647362, upload-time = "2026-03-06T13:48:33.411Z" }, + { url = "https://files.pythonhosted.org/packages/48/3c/7fcd9b4c9eed82e91fb15568992561019ae7a829d1f696b2c844355d95dd/h5py-3.16.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:9c9d307c0ef862d1cd5714f72ecfafe0a5d7529c44845afa8de9f46e5ba8bd65", size = 3678608, upload-time = "2026-03-06T13:48:35.183Z" }, + { url = "https://files.pythonhosted.org/packages/6a/b7/9366ed44ced9b7ef357ab48c94205280276db9d7f064aa3012a97227e966/h5py-3.16.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8c1eff849cdd53cbc73c214c30ebdb6f1bb8b64790b4b4fc36acdb5e43570210", size = 3054773, upload-time = "2026-03-06T13:48:37.139Z" }, + { url = "https://files.pythonhosted.org/packages/58/a5/4964bc0e91e86340c2bbda83420225b2f770dcf1eb8a39464871ad769436/h5py-3.16.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:e2c04d129f180019e216ee5f9c40b78a418634091c8782e1f723a6ca3658b965", size = 5198886, upload-time = "2026-03-06T13:48:38.879Z" }, + { url = "https://files.pythonhosted.org/packages/f1/16/d905e7f53e661ce2c24686c38048d8e2b750ffc4350009d41c4e6c6c9826/h5py-3.16.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:e4360f15875a532bc7b98196c7592ed4fc92672a57c0a621355961cafb17a6dd", size = 5404883, upload-time = "2026-03-06T13:48:41.324Z" }, + { url = "https://files.pythonhosted.org/packages/4b/f2/58f34cb74af46d39f4cd18ea20909a8514960c5a3e5b92fd06a28161e0a8/h5py-3.16.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:3fae9197390c325e62e0a1aa977f2f62d994aa87aab182abbea85479b791197c", size = 5192039, upload-time = "2026-03-06T13:48:43.117Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ca/934a39c24ce2e2db017268c08da0537c20fa0be7e1549be3e977313fc8f5/h5py-3.16.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:43259303989ac8adacc9986695b31e35dba6fd1e297ff9c6a04b7da5542139cc", size = 5421526, upload-time = "2026-03-06T13:48:44.838Z" }, + { url = "https://files.pythonhosted.org/packages/3e/14/615a450205e1b56d16c6783f5ccd116cde05550faad70ae077c955654a75/h5py-3.16.0-cp314-cp314-win_amd64.whl", hash = "sha256:fa48993a0b799737ba7fd21e2350fa0a60701e58180fae9f2de834bc39a147ab", size = 3183263, upload-time = "2026-03-06T13:48:47.117Z" }, + { url = "https://files.pythonhosted.org/packages/7b/48/a6faef5ed632cae0c65ac6b214a6614a0b510c3183532c521bdb0055e117/h5py-3.16.0-cp314-cp314-win_arm64.whl", hash = "sha256:1897a771a7f40d05c262fc8f37376ec37873218544b70216872876c627640f63", size = 2663450, upload-time = "2026-03-06T13:48:48.707Z" }, + { url = "https://files.pythonhosted.org/packages/5d/32/0c8bb8aedb62c772cf7c1d427c7d1951477e8c2835f872bc0a13d1f85f86/h5py-3.16.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:15922e485844f77c0b9d275396d435db3baa58292a9c2176a386e072e0cf2491", size = 3760693, upload-time = "2026-03-06T13:48:50.453Z" }, + { url = "https://files.pythonhosted.org/packages/1d/1f/fcc5977d32d6387c5c9a694afee716a5e20658ac08b3ff24fdec79fb05f2/h5py-3.16.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:df02dd29bd247f98674634dfe41f89fd7c16ba3d7de8695ec958f58404a4e618", size = 3181305, upload-time = "2026-03-06T13:48:52.221Z" }, + { url = "https://files.pythonhosted.org/packages/f5/a1/af87f64b9f986889884243643621ebbd4ac72472ba8ec8cec891ac8e2ca1/h5py-3.16.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:0f456f556e4e2cebeebd9d66adf8dc321770a42593494a0b6f0af54a7567b242", size = 5074061, upload-time = "2026-03-06T13:48:54.089Z" }, + { url = "https://files.pythonhosted.org/packages/cc/d0/146f5eaff3dc246a9c7f6e5e4f42bd45cc613bce16693bcd4d1f7c958bf5/h5py-3.16.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:3e6cb3387c756de6a9492d601553dffea3fe11b5f22b443aac708c69f3f55e16", size = 5279216, upload-time = "2026-03-06T13:48:56.75Z" }, + { url = "https://files.pythonhosted.org/packages/a1/9d/12a13424f1e604fc7df9497b73c0356fb78c2fb206abd7465ce47226e8fd/h5py-3.16.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8389e13a1fd745ad2856873e8187fd10268b2d9677877bb667b41aebd771d8b7", size = 5070068, upload-time = "2026-03-06T13:48:59.169Z" }, + { url = "https://files.pythonhosted.org/packages/41/8c/bbe98f813722b4873818a8db3e15aa3e625b59278566905ac439725e8070/h5py-3.16.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:346df559a0f7dcb31cf8e44805319e2ab24b8957c45e7708ce503b2ec79ba725", size = 5300253, upload-time = "2026-03-06T13:49:02.033Z" }, + { url = "https://files.pythonhosted.org/packages/32/9e/87e6705b4d6890e7cecdf876e2a7d3e40654a2ae37482d79a6f1b87f7b92/h5py-3.16.0-cp314-cp314t-win_amd64.whl", hash = "sha256:4c6ab014ab704b4feaa719ae783b86522ed0bf1f82184704ed3c9e4e3228796e", size = 3381671, upload-time = "2026-03-06T13:49:04.351Z" }, + { url = "https://files.pythonhosted.org/packages/96/91/9fad90cfc5f9b2489c7c26ad897157bce82f0e9534a986a221b99760b23b/h5py-3.16.0-cp314-cp314t-win_arm64.whl", hash = "sha256:faca8fb4e4319c09d83337adc80b2ca7d5c5a343c2d6f1b6388f32cfecca13c1", size = 2740706, upload-time = "2026-03-06T13:49:06.347Z" }, +] + [[package]] name = "httpcore" version = "1.0.9"