From d8cdaf0bd1e3c54cbb9eebd6a16e93ac7163da18 Mon Sep 17 00:00:00 2001
From: unknown <asoalexandros@gmail.com>
Date: Wed, 5 Feb 2025 12:03:52 +0100
Subject: [PATCH] File Programming CV

---
 hp4194/cv.py | 236 ++++++++++++++++++++++++++++++---------------------
 1 file changed, 137 insertions(+), 99 deletions(-)

diff --git a/hp4194/cv.py b/hp4194/cv.py
index 7c77db8..06c7577 100644
--- a/hp4194/cv.py
+++ b/hp4194/cv.py
@@ -5,6 +5,8 @@ from help import *
 import time
 from IPython.display import clear_output
 import numpy as np
+import datetime
+import pandas as pd
 
 
 #connect to device
@@ -32,7 +34,6 @@ add_widgets_to_list(view,all_widgets)
 add_widgets_to_list(sweep_parameter_dict,all_widgets)
 add_widgets_to_list(messparameter_dict,all_widgets)
 
-fig, axs = 
 def on_measure_clicked(b):
     with out:
         clear_output()
@@ -88,138 +89,175 @@ def on_measure_clicked(b):
         f_values = []
         G_values = []
         B_values = []
-        log_f = []
-        omega = []
-        Z = []
-        phi = []
-        D = []
-        Cs =[]
-        Cp =[]
-        Cp_area =[]
-        Cs_area = []
-        ReZ = []
-        ImZ = []
-        G_f_omega = []
+        log_f_values = []
+        omega_values = []
+        Z_values = []
+        phi_values = []
+        D_values = []
+        Cs_values =[]
+        Cp_values =[]
+        Cp_area_values =[]
+        Cs_area_values = []
+        ReZ_values = []
+        ImZ_values = []
+        G_area_omega_values = []
+        U_values = []
+        area_values = []
         
     
         num_of_points =int(abs(messparameter_dict["stop"].value-messparameter_dict["start"].value)/abs(messparameter_dict["step"].value) + 1)
-        area = np.pi * radius**2
+        area = np.pi * radius**2 # in um2
+        area = area * 10**(-8) # in cm2  
         biases = np.linspace(messparameter_dict["start"].value,messparameter_dict["stop"].value,num_of_points,endpoint = True)
     
         for bias in biases:
+            view["v-value"].value = bias 
+            U_values.extend([bias]*sweep_parameter_dict['nop'].value)
+            area_values.extend([area]*sweep_parameter_dict['nop'].value)
             device.set_parameter('set_bias', bias) #set the bias
             device.write('start_sweep') #start the measurement
             device.wait() #wait for completition
             
             # read the registers
             
-            freq = device.read_register('reg_sweep')
-            G = device.read_register('reg_A')
-            B = device.read_register('reg_B')
+            freq = np.array(device.read_register('reg_sweep'))
+            f_values.extend(freq)
+            G = np.array(device.read_register('reg_A'))
+            G_values.extend(G)
+            B = np.array(device.read_register('reg_B'))
+            B_values.extend(B)
 
     
             time.sleep(messparameter_dict["sleep"].value)
 
             #do the calculations
-
-            f_values.extend(freq)
-            G_values.extend(G)
-            B_vlaues.extend(B)
-            
-            for i in range(len(freq)):
-                log_f.append(np.log10(freq[i]))
-                omega.append(2*np.pi*freq[i])
-                log_omega.append(np.log10(omega))
-                polar = cmath.polar(1/complex(G[i],B[i]))
-                Z .append(polar[0])
-                phi.append(180/np.pi * polar[1]) #in deg
-                D.append(G[i]/B[i])
-                Cp.append(B[i]/omega)
-                Cs.append(Cp*(1+D**(2)))
-                Cp_area.append(Cp/area)
-                Cs_area.append(Cs/area)
-                Z_complex = cmath.rect(polar[0],polar[1])
-                ReZ.append(Z_complex.real)
-                ImZ.append(Z_complex.imag)
-                G_f_omega.append(G_p/area/omega)
-    
-            # Do A test plot
-            fig,ax1 = plt.subplots()
+            log_f = np.log10(freq)
+            log_f_values.extend(log_f)
             
-            color = 'b'
-            ax1.set_xlabel('Frequency (Hz)')
-            ax1.set_ylabel('G (S)', color=color)
-            ax1.plot(current_freq,current_G , color=color)
-            ax1.tick_params(axis='y', labelcolor=color)
-    
-            ax2 = ax1.twinx()
-            color = 'y'
-            ax2.set_ylabel('B (S)', color=color)  # we already handled the x-label with ax1
-            ax2.plot(current_freq,current_B, color=color)
-            ax2.tick_params(axis='y', labelcolor=color)
-    
-            fig.suptitle(f"Results for Bias = {bias}V")
-            fig.tight_layout()
-            display(fig)
+            omega = 2*np.pi*freq
+            omega_values.extend(omega)
+
+            log_omega = np.log10(omega)
+            log_omega_values.extend(omega)
+
+            Y_complex = G + 1j*B
+            Z_complex = 1/Y_complex
+
+            Z = np.absolute(Z_complex)
+            Z_values.extend(Z)
+            phi = np.angle(Z_complex, deg = True)
+            phi_values.extend(phi)
+
+            D = G/B
+            D_values.extend(D)
+                
+            Cp = B/omega
+            Cp_values.extend(Cp)
+
+            Cs = Cp*(1+D**(2))
+            Cs_values.extend(Cs)
+
+            Cp_area = Cp/area
+            Cp_area_values.extend(Cp_area)
+
+            Cs_area = Cs/area
+            Cs_area_values.extend(Cs_area)
+
+            ReZ = np.real(Z_complex)
+            ImZ = np.imag(Z_complex)
+            ReZ_values.extend(Rez)
+            ImZ_values.extend(ImZ)
+
+            G_area_omega= G_p/area/omega
+            G_area_values.extend(G_area_omega)
+    
+           
     
         if messparameter_dict["hysterisis"].value == True:
             reversed_biases = reversed_array(biases)
             for bias in reversed_biases:
+                U_values.extend([bias]*sweep_parameter_dict['nop'].value)
+                area_values.extend([area]*sweep_parameter_dict['nop'].value)
                 device.set_parameter('set_bias', bias) #set the bias
                 device.write('start_sweep') #start the measurement
                 device.wait() #wait for completition
                 
                 # read the registers
-                
-                freq = device.read_register('reg_sweep')
-                G = device.read_register('reg_A')
-                B = device.read_register('reg_B')
-        
-                time.sleep(messparameter_dict["sleep"].value)
-
+            
+                freq = np.array(device.read_register('reg_sweep'))
                 f_values.extend(freq)
+                G = np.array(device.read_register('reg_A'))
                 G_values.extend(G)
-                B_vlaues.extend(B)
-
+                B = np.array(device.read_register('reg_B'))
+                B_values.extend(B)
+    
+        
+                time.sleep(messparameter_dict["sleep"].value)
+    
                 #do the calculations
-                for i in range(len(freq)):
-                    log_f.append(np.log10(freq[i]))
-                    omega.append(2*np.pi*freq[i])
-                    log_omega.append(np.log10(omega))
-                    polar = cmath.polar(1/complex(G[i],B[i]))
-                    Z.append(polar[0])
-                    phi.append(180/np.pi * polar[1]) #in deg
-                    D.append(G[i]/B[i])
-                    Cp.append(B[i]/omega)
-                    Cs.append(Cp*(1+D**(2)))
-                    Cp_area.append(Cp/area)
-                    Cs_area.append(Cs/area)
-                    Z_complex = cmath.rect(polar[0],polar[1])
-                    ReZ.append(Z_complex.real)
-                    ImZ.append(Z_complex.imag)
-                    G_f_omega.append(G_p/area/omega)
-            
-                # Do A test plot
-                fig,ax1 = plt.subplots()
+                log_f = np.log10(freq)
+                log_f_values.extend(log_f)
                 
-                color = 'b'
-                ax1.set_xlabel('Frequency (Hz)')
-                ax1.set_ylabel('G (S)', color=color)
-                ax1.plot(freq,G , color=color)
-                ax1.tick_params(axis='y', labelcolor=color)
-        
-                ax2 = ax1.twinx()
-                color = 'y'
-                ax2.set_ylabel('B (S)', color=color)  # we already handled the x-label with ax1
-                ax2.plot(freq,B, color=color)
-                ax2.tick_params(axis='y', labelcolor=color)
-        
-                fig.suptitle(f"Results for Bias = {bias}V")
-                fig.tight_layout()
-                display(fig)
+                omega = 2*np.pi*freq
+                omega_values.extend(omega)
+    
+                log_omega = np.log10(omega)
+                log_omega_values.extend(omega)
+    
+                Y_complex = G + 1j*B
+                Z_complex = 1/Y_complex
+    
+                Z = np.absolute(Z_complex)
+                Z_values.extend(Z)
+                phi = np.angle(Z_complex, deg = True)
+                phi_values.extend(phi)
+    
+                D = G/B
+                D_values.extend(D)
+                    
+                Cp = B/omega
+                Cp_values.extend(Cp)
+    
+                Cs = Cp*(1+D**(2))
+                Cs_values.extend(Cs)
+    
+                Cp_area = Cp/area
+                Cp_area_values.extend(Cp_area)
+    
+                Cs_area = Cs/area
+                Cs_area_values.extend(Cs_area)
+    
+                ReZ = np.real(Z_complex)
+                ImZ = np.imag(Z_complex)
+                ReZ_values.extend(Rez)
+                ImZ_values.extend(ImZ)
+    
+                G_area_omega= G_p/area/omega
+                G_area_omega_values.extend(G_area_omega)
+           
             
         device.write('bias_off')
 
+        # save to file
+        with open(file,'w') as f:
+            dt = datetime.now().replace(second=0, microsecond=0)
+            f.write(f'# Measurement started at {dt}'+"\n")
+            f.write(f"# Wafer {sample_dict['wafer'].value} Sample {sample_dict['sample'].value} Comment {sample_dict['comment'].value} Temperature {sample_dict['temperature'].value}" +"\n")
+            f.write(f"# V_start {messparameter_dict['start'].value} V V_stop {messparameter_dict['stop'].value} V V_step {messparameter_dict['step'].value} V"+"\n")
+            f.write(f"# f_start {sweep_parameter_dict['stop'].value} Hz f_stop {sweep_parameter_dict['stop'].value} Hz no_steps {sweep_parameter_dict['nop'].value} SweepType {sweep_parameter_dict['type'].value}"+"\n")
+            f.write(f"# OSC {sweep_parameter_dict['osc'].value} V"+"\n")
+            f.write(f"# integration time {sweep_parameter_dict['integration'].value} averaging {sweep_parameter_dict['averaging'].value}"+"\n")
+            f.write(f"area {area} cm^2"+"\n")
+            f.write("\n")
+
+        # create the dataframe
+        dictionary = {"U(V)": U_values, "A(cm^2)":area_values,"f(Hz)":f_values ,"log_f(Hz)":log_f_values,"omega(1/s)":omega_values,"log_omega(1/s)":log_omega_values,"Z(Ohm)":Z_values,"Phi(°)":phi_values, "G(S)":G_values,"B(S)":B_values,"D":D_values,"Cs(F)":Cs_values, "Cs_area(F/cm^2)":Cs_area_values,"Cp(F)":Cp_values,"Cp_area(F/cm^2)":Cp_area_values,"ReZ(Ohm)":ReZ_values,"ImZ(Ohm)":ImZ,"G_area/omega(S*s/cm^2)":G_area_omega_values}
+
+        df = pd.DataFrame(dictionary)
+
+        #save the dictionary
+        df.to_csv(file,sep=" ",mode='a')
+
         information_box("measurement finished")
         change_state(all_widgets)
 
-- 
GitLab