From 84efb32bb40e5adaa91f6cee6d21ab43d778d0a0 Mon Sep 17 00:00:00 2001 From: unknown <asoalexandros@gmail.com> Date: Fri, 11 Apr 2025 16:06:05 +0200 Subject: [PATCH] pn diode released --- hp4155/pn_Diode/diode.py | 42 +++ hp4155/pn_Diode/diode_interface.ipynb | 114 ++++++++ .../pn_Diode/lib/diode_smu_configuration.png | Bin 0 -> 7040 bytes hp4155/pn_Diode/lib/help.py | 248 ++++++++++++++++++ hp4155/pn_Diode/lib/interface.py | 111 ++++++++ 5 files changed, 515 insertions(+) create mode 100644 hp4155/pn_Diode/diode.py create mode 100644 hp4155/pn_Diode/diode_interface.ipynb create mode 100644 hp4155/pn_Diode/lib/diode_smu_configuration.png create mode 100644 hp4155/pn_Diode/lib/help.py create mode 100644 hp4155/pn_Diode/lib/interface.py diff --git a/hp4155/pn_Diode/diode.py b/hp4155/pn_Diode/diode.py new file mode 100644 index 0000000..3e0bb38 --- /dev/null +++ b/hp4155/pn_Diode/diode.py @@ -0,0 +1,42 @@ +import sys +sys.path.insert(0, './lib') +sys.path.insert(0, '..') #append parent directory + +import hp4155a +from interface import * +from help import * + +sample = sample_information_interface() +parameters_1 = parameters_interface(0,0.02,10,"First Measurement") +parameters_2 = parameters_interface(0,-0.5,-100,"Second Measurement") +button = widgets.Button(description ='Start Measurement') +output = widgets.Output() + +display(button,output) +all_widgets = [button] +add_widgets_to_list(sample,all_widgets) +add_widgets_to_list(parameters_1,all_widgets) +add_widgets_to_list(parameters_2,all_widgets) + + +device = hp4155a.HP4155a('GPIB0::17::INSTR') +setup(device) +def on_button_clicked(b): + with output: + clear_output(wait = True) + change_state(all_widgets) + area=circle_area(sample['radius'].value) + + valid = check_values(parameters_1) and check_values(parameters_2) + if valid == True: + df = measure(parameters_1,parameters_2,area,device) + plot_results(df['VS'],df['ABSNOR']) + filename = f"pn_diode_{sample['field'].value}.txt" + file = create_file(filename) + save_to_file(df,sample,parameters_1,parameters_2,file) + + change_state(all_widgets) + + + +button.on_click(on_button_clicked) \ No newline at end of file diff --git a/hp4155/pn_Diode/diode_interface.ipynb b/hp4155/pn_Diode/diode_interface.ipynb new file mode 100644 index 0000000..68a389f --- /dev/null +++ b/hp4155/pn_Diode/diode_interface.ipynb @@ -0,0 +1,114 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "1b607685-438c-466e-9671-140ae6c8d9f9", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0560c5f898da48b5a9865867f6d759be", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(VBox(children=(Label(value='Sample Information', layout=Layout(height='auto', width='auto'), st…" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5e698a443fc74b1c8e6abb0aa87200c3", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "GridspecLayout(children=(Label(value='First Measurement', layout=Layout(grid_area='widget001', height='auto', …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1ec1a195abd94a8191553ab782e2d2af", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "GridspecLayout(children=(Label(value='Second Measurement', layout=Layout(grid_area='widget001', height='auto',…" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1692c4ee58ed4f658f5b38cd2b4035d4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Button(description='Start Measurement', style=ButtonStyle())" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "72063b77dec54b4980a4a8d946f78b98", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Output()" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%run diode.py" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5bc60dda-f423-4cdc-bc39-3404a8cfa1df", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/hp4155/pn_Diode/lib/diode_smu_configuration.png b/hp4155/pn_Diode/lib/diode_smu_configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..86131ea625c4f279226f3dcb838941e1561d02ba GIT binary patch literal 7040 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 UUOv5%fq{X+)78&qol`;+0GAPa#sB~S literal 0 HcmV?d00001 diff --git a/hp4155/pn_Diode/lib/help.py b/hp4155/pn_Diode/lib/help.py new file mode 100644 index 0000000..7a669ab --- /dev/null +++ b/hp4155/pn_Diode/lib/help.py @@ -0,0 +1,248 @@ +import matplotlib.pyplot as plt +import matplotlib +matplotlib.use('TkAgg',force = True) + +import numpy as np +import time +from datetime import datetime + +import tkinter as tk +from tkinter import filedialog +import tkinter.messagebox + +import pandas as pd + +#returns area in cm^2 +def circle_area(radius): + #input is in um + radius = radius*10**(-6) #m^2 + area = np.pi*radius**2 # m^2 + area = area * 10**4 # cm^2 + return area + +def add_widgets_to_list(source_dictionary,target_list): + for widget in source_dictionary.values(): + target_list.append(widget) + +def change_state(widgets_list): + for widget in widgets_list: + widget.disabled = not widget.disabled + +#saving functions : save parameters and dataframe to txt +def create_file(filename): + root = tk.Tk() + root.withdraw() + root.lift() #show window above all other applications + + root.attributes("-topmost", True)#window stays above all other applications + + file = filedialog.asksaveasfilename(defaultextension=".txt", filetypes=[("Text files","*.txt")],title = "save results path",initialfile =filename) + + #check if the file path is correct(.txt) + while file.endswith(".txt") == False: + #open again filedialog with error message box + answer = tk.messagebox.askyesno(message = "Do you want to cancel the file operation?") + if answer == True: + file = None + break + file = filedialog.asksaveasfilename(defaultextension=".txt", filetypes=[("Text files","*.txt")],title = "save results path",initialfile =filename) + root.destroy() + return file + + +def check_values(parameters): + valid = True + + root = tk.Tk() + root.withdraw() + root.lift() #show window above all other applications + + root.attributes("-topmost", True)#window stays above all other applications + + #get better variable names + start = parameters['start'] + stop = parameters['stop'] + step = parameters['step'] + + #check values + if abs(step.value) > abs(stop.value-start.value) or step.value==0:#invalid parameter setting + valid = False + tkinter.messagebox.showerror(message="Invalid parameter setting!") + + if start.value<stop.value and step.value<0: #change polarity + step.value =(-1)*step.value + + elif start.value>stop.value and step.value>0: + step.value = (-1)*step.value + + else: + pass + + root.destroy() + return valid + +#Setup The device for diode measurement +def setup(device): + device.reset() + + #setup sweep measurement mode + device.measurement_mode('SWE') + + #disable all irrelevant units + device.disable_not_smu() + + #disable smu 2 and 4 + device.smu_disable(2) + device.smu_disable(4) + + smu1 = device.smu_dict() + smu1.update(vname ='VGND',iname = 'IGND',mode = 'COMM',func='CONS') + + smu3 = device.smu_dict() + smu3.update(vname='VS',iname='IS',mode ='V',func='VAR1') + + + device.setup_smu(1,smu1) + device.setup_smu(3,smu3) + + +def measure(parameters_1,parameters_2,area,device): + #del all user functions + device.del_user_functions() + + #define user functions + device.user_function("AREA",'CM^2',str(area)) + device.user_function("INORM",'A/CM^2','IS/AREA') + device.user_function("ABSNOR","A/CM^2","ABS(INORM)") + device.user_function("ABSRAW",'A','ABS(IS)') + + var1 = device.var1_dict() + var1.update( + mode = parameters_1['hyst'].value, + start = parameters_1['start'].value, + stop = parameters_1['stop'].value, + step = parameters_1['step'].value, + comp = parameters_1['comp'].value, + pcomp = 0 + ) + + device.setup_var1(var1) + + device.integration_time(parameters_1['integration'].value) + + + #display + device.display_variable('X','VS') + + device.display_variable('Y1','ABSNOR') + + + device.axis_scale('Y1','LOG') + + if parameters_1['start'].value < parameters_1['stop'].value: + device.display_variable_min_max('X','MIN',parameters_1['start'].value) + device.display_variable_min_max('X','MAX',parameters_1['stop'].value) + + else: + device.display_variable_min_max('X','MAX',parameters_1['start'].value) + device.display_variable_min_max('X','MIN',parameters_1['stop'].value) + + if parameters_1['comp'].value !=0: + device.display_variable_min_max('Y1','MIN',0) + device.display_variable_min_max('Y1','MAX',abs(parameters_1['comp'].value)/area) + + + variables_list = ['VS','IS','ABSRAW','INORM','ABSNOR']# look at the tool + device.variables_to_save(variables_list) + + + device.single_measurement() + while device.operation_completed() == False: + pass + + device.autoscaling() + + # Start Second measurement + var1.update( + mode = parameters_2['hyst'].value, + start = parameters_2['start'].value, + stop = parameters_2['stop'].value, + step = parameters_2['step'].value, + comp = parameters_2['comp'].value, + pcomp = 0 + ) + + device.setup_var1(var1) + device.integration_time(parameters_2['integration'].value) + + if parameters_2['start'].value < parameters_2['stop'].value: + device.display_variable_min_max('X','MIN',parameters_2['start'].value) + device.display_variable_min_max('X','MAX',parameters_2['stop'].value) + + else: + device.display_variable_min_max('X','MAX',parameters_2['start'].value) + device.display_variable_min_max('X','MIN',parameters_2['stop'].value) + + if parameters_2['comp'].value !=0: + device.display_variable_min_max('Y1','MIN',0) + device.display_variable_min_max('Y1','MAX',abs(parameters_2['comp'].value)/area) + + device.append_measurement() + while device.operation_completed() == False: + pass + device.autoscaling() + + values = dict([(variable,device.return_values(variable)) for variable in variables_list]) + df = pd.DataFrame(values) + df = df.sort_values(by='VS') + return df + +def plot_results(x,y): + fig, ax1 = plt.subplots() + + color = 'tab:red' + ax1.set_xlabel('Voltage (V)') + ax1.set_ylabel('Current density $(A/{cm}^2)$') + ax1.set_yscale('log') + + ax1.plot(x,y, color = color) + + ax1.grid(True,linestyle = '--',axis = 'y',color ="k",linewidth = 0.5) + ax1.axvline(linestyle='--',color = 'k',linewidth =0.5) + + fig.suptitle('Diode Plot', fontweight ="bold") + fig.tight_layout() + + wm = plt.get_current_fig_manager() + wm.window.state('zoomed') + plt.show(block = True) + + +#also for file +def save_to_file(df,sample,parameters_1,parameters_2,file): + if file != None: + with open(file,'w') as f: + date = str(datetime.today().replace(microsecond=0)) + f.write(f"Diode Measurement at {date}"+"\n") + f.write(f"Series:{sample['processing_number'].value}"+"\n") + f.write(f"Sample:{sample['sample'].value}"+"\n") + f.write(f"Field:{sample['field'].value}"+"\n") + f.write(f"Radius/um:{sample['radius'].value}"+"\n\n") + + f.write('Parameters of first Measurement\n') + f.write(f"V from {parameters_1['start'].value}V to {parameters_1['stop'].value}V with step {parameters_1['step'].value}V"+"\n") + f.write(f"I Compliance/A:{parameters_1['comp'].value}"+"\n") + f.write(f"Integration Time:{parameters_1['integration'].value}"+"\n") + + f.write('\nParameters of second Measurement\n') + f.write(f"V from {parameters_2['start'].value}V to {parameters_2['stop'].value}V with step {parameters_2['step'].value}V"+"\n") + f.write(f"I Compliance/A:{parameters_2['comp'].value}"+"\n") + f.write(f"Integration Time:{parameters_2['integration'].value}"+"\n") + + f.write("\nResults\n") + + #create pandas dataframe + #df =df.drop(columns=['ABSNOR']) + df =df.rename(columns={'VS':'VS/V','IS':'IRAW/A','ABSRAW':'ABSRAW/A','INORM':'INORM/A/CM^2','ABSNOR':'ABSNOR/A/CM^2'}) + + df.to_csv(file,sep= " ",mode = 'a') \ No newline at end of file diff --git a/hp4155/pn_Diode/lib/interface.py b/hp4155/pn_Diode/lib/interface.py new file mode 100644 index 0000000..2253b9e --- /dev/null +++ b/hp4155/pn_Diode/lib/interface.py @@ -0,0 +1,111 @@ +import ipywidgets as widgets +from ipywidgets import GridspecLayout,Layout +from IPython.display import clear_output,display +import sys +import os + + +style = {'description_width': 'initial'} + +def parameters_interface(start,step,stop,title): + grid = GridspecLayout(5,4) + grid[0,:]=widgets.Label(title,layout=Layout(height='auto', width='auto')) + grid[0,:].style.font_weight='bold' + + + #first line + grid[1,0]=widgets.Label("Start(V)",layout=Layout(height='auto', width='auto')) + grid[1,1]=widgets.Label("Step(V)",layout=Layout(height='auto', width='auto')) + grid[1,2]=widgets.Label("Stop(V)",layout=Layout(height='auto', width='auto')) + + #second line + grid[2,0]=widgets.BoundedFloatText(value=start,min=-100,max=100,step=1,layout=Layout(height='auto', width='auto')) + grid[2,1]=widgets.BoundedFloatText(value=step,min=-200,max=200,step=1,layout=Layout(height='auto', width='auto')) + grid[2,2]=widgets.BoundedFloatText(value=stop,min=-100,max=100,step=1,layout=Layout(height='auto', width='auto')) + + #third line + grid[3,0]=widgets.Label("Compliance(A)",layout=Layout(height='auto', width='auto')) + grid[3,1] =widgets.Label("Integration Time",layout=Layout(height='auto', width='auto'))#mind the gap + grid[3,2] =widgets.Label("Hysterisis",layout=Layout(height='auto', width='auto'))#mind the gap + + #fourth line + grid[4,0]=widgets.BoundedFloatText(value=0.01,min=-0.1,max=0.1,step=0.01,layout=Layout(height='auto', width='auto')) + grid[4,1]=widgets.Dropdown(options=["SHORt","MEDium","LONG"],value="MEDium",style =style,layout=Layout(height='auto', width='auto')) + grid[4,2]=widgets.Dropdown(options=['SINGle','DOUBle'],value='SINGle',layout=Layout(height='auto', width='auto'))#mind the gap + + parameters = { + 'start': grid[2,0], + 'step': grid[2,1], + 'stop': grid[2,2], + 'comp': grid[4,0], + 'hyst':grid[4,2], + 'integration':grid[4,1] + } + + + display(grid) + return parameters + + +def sample_information_interface(): + sample_information=widgets.Label("Sample Information",layout=Layout(height='auto', width='auto')) + sample_information.style.font_weight='bold' + information_grid=GridspecLayout(3,2) + + for i in range(3): + for j in range(2): + if i ==2 and j == 1: + pass + elif i == 2 and j == 0: #look at the tool for diode area + information_grid[i,j]=widgets.BoundedFloatText( + value=50, + min=1, + max=200,step=1, + layout=Layout(height='auto', width='auto') + ) + else: + information_grid[i,j]=widgets.Text(layout=Layout(height='auto', width='auto')) + + information_grid[0,0].description = "Processing-Nr:" + information_grid[1,0].description = "Sample:" + information_grid[2,0].description = "Radius(um):" + information_grid[0,1].description = "Field(XYY):" + information_grid[1,1].description = "Device:" + information_grid[1,1].disabled = True + + + for i in range(3): + for j in range(2): + try: + information_grid[i,j].style = style + except: + pass + + image_title = widgets.Label("SMU Configuration",layout=Layout(height='auto', width='auto')) + image_title.style.font_weight='bold' + + filename = os.getcwd()+r"\lib\diode_smu_configuration.png" + #print(filename) + + file = open(filename, "rb") + image = file.read() + image_widget =widgets.Image( + value = image, + format='png', + width='auto', + height='auto', + ) + + vbox1 =widgets.VBox([sample_information,information_grid]) + vbox2 =widgets.VBox([image_title,image_widget]) + + display(widgets.HBox([vbox1,vbox2])) + + information = { + 'processing_number': information_grid[0,0], + 'sample' : information_grid[1,0], + 'field': information_grid[0,1], + 'radius': information_grid[2,0], + } + + return information -- GitLab