GIT repositories md_scripts / master python / xvg_calc_intersection.py
master

Tree @master (Download .tar.gz)

xvg_calc_intersection.py @masterraw · history · blame

#!/usr/bin/env python2
#
# Calculate intersection of two first columns in xvg-file. If many files are
# given, their average and standard deviation are calculated.
# 
# Requires GromacsWrapper and argparse.
#

import argparse
import gromacs.formats
import numpy


### Parse arguments
parser = argparse.ArgumentParser()
parser.add_argument("-f", help='input', required=True, nargs='*')
parser.add_argument("-p", help='Predicted value (in case of multiple intersections)')
args = parser.parse_args()
if args.f:
  filename = args.f
if args.p:
  predicted = float(args.p)
else:
  predicted = 1


### Define functions
def get_zerocrossings(filename,predicted):
    # get file
    xvgfile = gromacs.formats.XVG(filename).array

    # interpolate
    x=numpy.arange(xvgfile[0,0],xvgfile[0,-1],0.0001)
    y1=numpy.interp(x,xvgfile[0,:],xvgfile[1,:])
    y2=numpy.interp(x,xvgfile[0,:],xvgfile[2,:])
    
    # find intersection
    y=y1-y2
    zero_crossings = x[numpy.where(numpy.diff(numpy.sign(y)))[0]]
    chosen_index=numpy.argmin(abs(zero_crossings-predicted))
    return zero_crossings[chosen_index]


### Main program
intersects=[]
for f in filename:
    intersects.append(get_zerocrossings(f,predicted))
intersects=numpy.array(intersects)

print(intersects.mean())
print(intersects.std())