Analyze a depth profile of carrier traps from C-V data of a diode
DiodeのC-VからNdの深さ方向分析を行う

Download: Diode-CV.py cv.csv
Run: python Diode-CV.py

Diode-CV.py

import os
import sys
import csv
from math import exp, sqrt
import numpy as np
from numpy import arange
from scipy import integrate # 数値積分関数 integrateを読み込む
from scipy import optimize # newton関数はscipy.optimizeモジュールに入っている
from scipy.interpolate import interp1d
from matplotlib import pyplot as plt



"""
Analyze a depth profile of carrier traps from C-V date of a diode
DiodeのC-VからNdの深さ方向分析を行う
"""



# constants
pi = 3.14159265358979323846
h = 6.6260755e-34 # Js";
hbar = 1.05459e-34 # "Js";
c = 2.99792458e8 # m/s";
e = 1.60218e-19 # C";
e0 = 8.854418782e-12; # C2N-1m-2";
kB = 1.380658e-23 # JK-1";
me = 9.1093897e-31 # kg";


Debug = 0

# dielectric constant of semiconductor
eps_s = 12.9

# C-V data
infile = "cv.csv"
V0min = -10.0
V0max = 10.0


def savecsv(outfile, header, datalist):
    try:
        print("Write to [{}]".format(outfile))
        f = open(outfile, 'w')
    except:
# except IOError:
        print("Error: Can not write to [{}]".format(outfile))
    else:
        fout = csv.writer(f, lineterminator='\n')
        fout.writerow(header)
# fout.writerows(data)
        for i in range(0, len(datalist[0])):
            a = []
            for j in range(len(datalist)):
                a.append(datalist[j][i])
            fout.writerow(a)
        f.close()

def pfloat(str):
    try:
        return float(str)
    except:
        return 0.0

def read_csv(infile, delimiter = ',', Vmin = None, Vmax = None):
    data = []
    try:
        infp = open(infile, "r")
        f = csv.reader(infp, delimiter = delimiter)
        header = next(f)
        print("header=", header)
        for j in range(len(header)):
            data.append([])

        for row in f:
            V = pfloat(row[0])
            C = pfloat(row[1])
            print("V,C=", V, C, Vmin, Vmax)
            if Vmin <= V <= Vmax:
                data[0].append(V)
                data[1].append(C)
    except:
        print("Error: Can not read [{}]".format(infile))
        exit()
    return header, data

def read_data(infile, xmin = None, xmax = None):
    if '.TXT' in infile.upper():
        header, data = read_csv(infile, '\t', xmin, xmax)
        return header, np.array(data[0]), np.array(data[1])
    else:
        header, data = read_csv(infile, ',', xmin, xmax)
        return header, np.array(data[0]), np.array(data[1])



def main():
    global V0min, V0max

    print("infile : ", infile)

    header, V, C = read_data(infile, V0min, V0max)
    ndata = len(V)
    Vmin = V[0]
    Vstep = V[1] - V[0]
    Vmax = Vmin + Vstep * (ndata - 1)
    print("Input data")
    print(" ndata = ", ndata)
    print(" V range: {} - {} at {} step".format(Vmin, Vmax, Vstep))
    print("")

    C2 = []
    for i in range(ndata):
        C2.append(1.0 / C[i] / C[i])

    W = []
    Nd = []
    print("V (V)\tC (F/cm2)\tW (nm)\tNd (cm-3)")
    for i in range(1, len(V)-1):
        cap = C[i] * 1.0e4 # in F/m^2
        dC2dV = (C2[i+1] - C2[i-1]) * 1.0e-4 / (V[i+1] - V[i-1])
        dw = eps_s * e0 / cap * 1.0e9 # in nm
        n = 2.0 * cap * cap * cap / e / (eps_s * e0) / dC2dV * 1.0e-6 # in cm^-3
        W.append(dw)
        Nd.append(n)
        print("{:6.4f}\t{:10.4g}\t{:6.4f}\t{:10.4g}".format(V[i], C[i], dw, n))

#=============================
# Plot graphs
#=============================
    fig = plt.figure(figsize = (10, 10))

    ax1 = fig.add_subplot(2, 2, 1)
    ax2 = fig.add_subplot(2, 2, 2)
    ax3 = fig.add_subplot(2, 2, 4)
    ax1.plot(V, C, label = 'C', color = 'black')
    ax1.set_xlabel("V (V)")
    ax1.set_ylabel("C (F/cm2)")
    ax1.legend()
    ax2.plot(V, C2, label = '1/C^2', color = 'black')
    ax2.set_xlabel("V (V)")
    ax2.set_ylabel("1/C^2 (cm^4/F^2)")
    ax2.legend()
    ax3.plot(W, Nd, label = 'Nd (cm-3)', color = 'black')
    ax3.set_xlim([0.0, 3.0])
    ax3.set_xlabel("W (nm)")
    ax3.set_ylabel("Nd (cm^-3)")
    ax3.legend()
# Rearange the graph axes so that they are not overlapped
    plt.tight_layout()

    plt.pause(0.1)

    print("Press ENTER to exit>>", end = '')
    input()


if __name__ == '__main__':
    main()