From 60f690a6333d46ba85183f70e343cd9927f396ee Mon Sep 17 00:00:00 2001
From: unknown <asoalexandros@gmail.com>
Date: Tue, 13 Aug 2024 12:09:46 +0200
Subject: [PATCH] MESA Released!

---
 hp4155/MESA/lib/MESA_SMU_configuration.png | Bin 0 -> 8959 bytes
 hp4155/MESA/lib/help.py                    | 187 +++++++++++++++++++++
 hp4155/MESA/lib/interface.py               | 119 +++++++++++++
 hp4155/MESA/mesa.py                        |  39 +++++
 hp4155/MESA/mesa_interface.ipynb           | 101 +++++++++++
 5 files changed, 446 insertions(+)
 create mode 100644 hp4155/MESA/lib/MESA_SMU_configuration.png
 create mode 100644 hp4155/MESA/lib/help.py
 create mode 100644 hp4155/MESA/lib/interface.py
 create mode 100644 hp4155/MESA/mesa.py
 create mode 100644 hp4155/MESA/mesa_interface.ipynb

diff --git a/hp4155/MESA/lib/MESA_SMU_configuration.png b/hp4155/MESA/lib/MESA_SMU_configuration.png
new file mode 100644
index 0000000000000000000000000000000000000000..35315592b545ba5bfffee902100f0d3180b379d0
GIT binary patch
literal 8959
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
QFfcH9y85}Sb4q9e0M~@q&;S4c

literal 0
HcmV?d00001

diff --git a/hp4155/MESA/lib/help.py b/hp4155/MESA/lib/help.py
new file mode 100644
index 0000000..2d2f444
--- /dev/null
+++ b/hp4155/MESA/lib/help.py
@@ -0,0 +1,187 @@
+import matplotlib.pyplot as plt
+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
+
+def normalization_factor(width):
+    factor = 10**6/width
+    return factor
+
+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
+        tk.messagebox.showerror(message='invalid filename!')
+        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 mesa 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)
+
+def measure(parameters,norm,device):
+    #delete user functions
+    device.del_user_functions()
+    
+    smu1 = device.smu_dict()
+    smu1.update(vname ='VGND',iname = 'IGND',mode = 'COMM',func='CONS')
+
+    smu3 = device.smu_dict()
+    smu3.update(vname='V',iname='I',mode ='V',func='VAR1')
+
+    device.setup_smu(1,smu1)
+    device.setup_smu(3,smu3)
+
+    #define user functions
+    device.user_function('Imm','mA/mm',f'I*{norm}')
+    device.user_function('ABSImm','mA/mm','ABS(Imm)')
+
+    var1 = device.var1_dict()
+    var1.update(
+        mode = parameters['hyst'].value,
+        start = parameters['start'].value,
+        stop = parameters['stop'].value,
+        step = parameters['step'].value,
+        comp = parameters['comp'].value,
+        pcomp = 0
+    )
+
+    device.setup_var1(var1)
+    device.integration_time(parameters['integration'].value)
+
+
+    #display
+    device.display_variable('X','V')
+    device.display_variable('Y1','ABSImm')
+
+    device.axis_scale('Y1','LOG')
+
+    if parameters['start'].value < parameters['stop'].value:
+        device.display_variable_min_max('X','MIN',parameters['start'].value)
+        device.display_variable_min_max('X','MAX',parameters['stop'].value)
+
+    else:
+        device.display_variable_min_max('X','MAX',parameters['start'].value)
+        device.display_variable_min_max('X','MIN',parameters['stop'].value)
+
+    if parameters['comp'].value !=0:
+        device.display_variable_min_max('Y1','MIN',0)
+        device.display_variable_min_max('Y1','MAX',abs(parameters['comp'].value)*norm)
+
+    
+    variables_list = ['V','I','Imm','ABSImm']
+    device.variables_to_save(variables_list)
+
+    device.single_measurement()
+    while device.operation_completed() == False:
+        pass
+    
+    device.autoscaling()
+    
+    values = dict([(variable,device.return_values(variable)) for variable in variables_list])
+    return values
+
+def plot_results(x,y):
+    fig, ax1 = plt.subplots()
+
+    color = 'tab:red'
+    ax1.set_xlabel('V/V') 
+    ax1.set_ylabel('I/mA/mm', color = color)
+    ax1.set_yscale('log')
+
+    ax1.plot(x,y, color = color) 
+    ax1.tick_params(axis ='y', labelcolor = color)
+
+    fig.suptitle('MESA Plot', fontweight ="bold")
+    fig.tight_layout()
+    fig.show() #interactve Figures
+
+def save_to_file(values,sample,parameters,file):
+    with open(file,'w') as f:
+        date = str(datetime.today().replace(microsecond=0))
+        f.write(f"Mesa 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"Width/um:{sample['width'].value}"+"\n\n")
+
+        f.write('Parameters\n')
+        f.write(f"V from {parameters['start'].value}V to {parameters['stop'].value}V with step {parameters['step'].value}V"+"\n")
+        f.write(f"I Compliance/A:{parameters['comp'].value}"+"\n")
+        f.write(f"Integration Time:{parameters['integration'].value}"+"\n")
+        
+        f.write("\nResults\n")
+
+    #create pandas dataframe
+    df = pd.DataFrame(values)
+
+    df = df.drop(columns=['ABSImm'])
+    df = df.rename(columns={'V':'V/V','I':'I/A','Imm':'Imm/mA/mm'})
+
+    df.to_csv(file,sep= " ",mode = 'a')
\ No newline at end of file
diff --git a/hp4155/MESA/lib/interface.py b/hp4155/MESA/lib/interface.py
new file mode 100644
index 0000000..91362f4
--- /dev/null
+++ b/hp4155/MESA/lib/interface.py
@@ -0,0 +1,119 @@
+import ipywidgets as widgets
+from ipywidgets import GridspecLayout,Layout
+from IPython.display import clear_output
+import sys
+import os
+
+width = "50%"
+height = 'auto'
+style = {'description_width': 'initial'}
+floatbox_width = "80%"
+
+def parameters_interface():
+    grid = GridspecLayout(5,4)
+    grid[0,:]=widgets.Label("V (SMU3)",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=0,min=-100,max=100,step=1,layout=Layout(height='auto', width=floatbox_width))
+    grid[2,1]=widgets.BoundedFloatText(value=0.5,min=-200,max=200,step=1,layout=Layout(height='auto', width=floatbox_width))
+    grid[2,2]=widgets.BoundedFloatText(value=100,min=-100,max=100,step=1,layout=Layout(height='auto', width=floatbox_width))
+
+    #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.02,min=-0.1,max=0.1,step=0.01,layout=Layout(height='auto', width=floatbox_width))
+    grid[4,1]=widgets.Dropdown(options=["SHORt","MEDium","LONG"],value="MEDium",style =style,layout=Layout(height='auto', width=floatbox_width))
+    grid[4,2]=widgets.Dropdown(options=['SINGle','DOUBle'],value='SINGle',layout=Layout(height='auto', width=floatbox_width))#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():
+    width = '90%'
+    sample_information=widgets.Label("Sample Information",layout=Layout(height=height, width='50%'))
+    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:
+               #information_grid[i,j]=widgets.Dropdown(options=['mA/mm','uA/um'],value='mA/mm',layout=Layout(height=height, width=width))#mind the gap
+                pass
+            elif i == 2 and j == 0:                
+                information_grid[i,j]=widgets.BoundedFloatText(
+                    value=100,
+                    min=1e-3,
+                    max=sys.float_info.max,step=1,
+                    layout=Layout(height=height, width=width)
+                )
+            else:
+                information_grid[i,j]=widgets.Text(layout=Layout(height=height, width=width))
+
+    information_grid[0,0].description = "Processing-Nr:"
+    information_grid[1,0].description = "Sample:"
+    information_grid[2,0].description = "Device Width(um):"
+    information_grid[0,1].description = "Field(XYY):"
+    information_grid[1,1].description = "Device:"
+    information_grid[1,1].disabled = True
+    #information_grid[2,1].description = "Normalization:"
+
+    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=height, width='50%'))
+    image_title.style.font_weight='bold'
+
+    filename = os.getcwd()+r"\lib\MESA_SMU_configuration.png"
+    #print(filename)
+
+    file = open(filename, "rb")
+    image = file.read()
+    image_widget =widgets.Image(
+        value = image,
+        format='png',
+        width='auto',
+        height='auto',
+    )
+    
+    #display(widgets.HBox([sample_information,image_title]))
+    #display(widgets.HBox([information_grid,image_widget]))
+    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],
+        #'device':information_grid[1,1],    
+        'width': information_grid[2,0],
+    }
+
+    return information
+            
\ No newline at end of file
diff --git a/hp4155/MESA/mesa.py b/hp4155/MESA/mesa.py
new file mode 100644
index 0000000..b28f512
--- /dev/null
+++ b/hp4155/MESA/mesa.py
@@ -0,0 +1,39 @@
+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 =parameters_interface()
+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,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)
+        norm=normalization_factor(sample['width'].value)
+        
+        valid = check_values(parameters)
+        if valid == True:
+            values = measure(parameters,norm,device)
+            plot_results(values['V'],values['ABSImm'])
+            filename = f"MESA_ISO_{sample['field'].value}.txt"
+            file = create_file(filename)
+            save_to_file(values,sample,parameters,file)
+        
+        change_state(all_widgets)
+
+button.on_click(on_button_clicked)
+    
\ No newline at end of file
diff --git a/hp4155/MESA/mesa_interface.ipynb b/hp4155/MESA/mesa_interface.ipynb
new file mode 100644
index 0000000..45d6413
--- /dev/null
+++ b/hp4155/MESA/mesa_interface.ipynb
@@ -0,0 +1,101 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "id": "1b607685-438c-466e-9671-140ae6c8d9f9",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "1e8f68e7a1a44930b5f8aa7274a71bd1",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(VBox(children=(Label(value='Sample Information', layout=Layout(height='auto', width='50%'), sty…"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "59dc533f8cc2493597699a3a72882bbf",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "GridspecLayout(children=(Label(value='V (SMU3)', layout=Layout(grid_area='widget001', height='auto', width='au…"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "b79166daed814a348b6538ae9102b66c",
+       "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": "68d3460573264361a55153b8c1f43020",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "Output()"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "%matplotlib widget\n",
+    "%run mesa.py"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "c62885a4-1186-4770-937f-fc8b5c484b98",
+   "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
+}
-- 
GitLab