Smoothing by convolution with Gauss function

Download script from .\convolution.py


import sys
import csv
import matplotlib.pyplot as plt
from math import sqrt, exp, pi
import matplotlib.pyplot as plt


"""
Smoothing by convolution with Gauss function
"""


#======================
# parameters
#======================
csvfile = 'dos.csv'
outfile = 'convolution.csv'

width = 0.2


argv = sys.argv
n = len(argv)
if n >= 2:
    width = float(argv[1])


def convolution(x, y, width):
    ndata = len(x)
    dx = x[1] - x[0]
    xrange = x[ndata-1] - x[0]
# integration range, converted to number of the list index
    di = int( (width * 5.0) / dx + 1.1 )
# the coefficient of Gauss function
    coeff = 1.0 / sqrt(pi)/ width
# deconvoluted data
    ys = [0.0]*ndata
    for j in range(0, ndata):
        x0 = x[j];
        y0 = y[j];
        for k in range(-di, di+1):
            if j+k < 0 or j+k >= ndata:
                continue
            dvx = dx * k / width
            f = dx * coeff * exp(-dvx*dvx)
            ys[j+k] += y0 * f

    return ys;

def savecsv(outfile, x, y, ys):
    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(('x', 'y(raw)', 'y(smooth)'))
#        fout.writerows(data)
        for i in range(0, len(x)):
            fout.writerow((x[i], y[i], ys[i]))
        f.close()


def main():
    global csvfile
    global outfile
    global width

    print("Read data from [{}]".format(csvfile))
    x = []
    y = []
    with open(csvfile) as f:
        fin = csv.reader(f)
        next(fin)
        c = 0
        for row in fin:
            if c == 0:
                label = row
                print("{}\t{}".format(label[0], label[1]))
            else:
                print("{}\t{}".format(row[0], row[1]))
                x.append(float(row[0]))
                y.append(float(row[1]))
            c += 1
    ndata = len(x)
    print("")

    print("Smoothing by convolution with Gauss function of w = {}".format(width))
    ys = convolution(x, y, width)
    for i in range(0, ndata):
         print("{}\t{}\t{}".format(x[i], y[i], ys[i]))
    savecsv(outfile, x, y, ys)
    print("")

#=============================
# Plot graphs
#=============================
    fig = plt.figure()

    ax1 = fig.add_subplot(1, 1, 1)

    ax1.plot(x, y, label = 'raw data', linestyle = '-', linewidth = 0.5, marker = 'o', markersize = 0.5)
    ax1.plot(x, ys, label = 'convoluted')
    ax1.set_xlabel("x")
    ax1.set_ylabel("y")
    ax1.legend()
    plt.tight_layout()

    plt.pause(0.1)
    print("Press ENTER to exit>>", end = '')
    input()

    exit()


if __name__ == '__main__':
    main()