IRed Analysis of MD Simulations: Difference between revisions
From Powers Wiki
No edit summary |
No edit summary |
||
Line 12: | Line 12: | ||
! /usr/bin/env python | ! /usr/bin/env python | ||
from __future__ import division | from __future__ import division | ||
import numpy as np | import numpy as np | ||
from optparse import OptionParser | from optparse import OptionParser | ||
import sys | import sys | ||
def setupParserOptions(): | def setupParserOptions(): | ||
parser=OptionParser() | parser=OptionParser() | ||
Line 24: | Line 22: | ||
parser.add_option('--block', dest='block', default = 1, help = 'Number of blocks') | parser.add_option('--block', dest='block', default = 1, help = 'Number of blocks') | ||
return parser | return parser | ||
def ired(hCoor_file, nCoor_file, block): | |||
try: | |||
def ired(hCoor_file, nCoor_file, block): | h_all = np.loadtxt(hCoor_file) | ||
except IOError: | |||
print 'cannot open ', hCoor_file | |||
try: | |||
n_all = np.loadtxt(nCoor_file) | |||
except IOError: | |||
print 'cannot open ', nCoor_file | |||
numLines = len(h_all) | |||
numRes = len(set(h_all[:,0])) | |||
numSnapshot = numLines // numRes | |||
blockNum = int(block) | |||
blockSize = numSnapshot // blockNum | |||
if numLines != len(n_all): | |||
print 'Error: The two coordinate files do not have same length.' | |||
return | |||
if np.mod(numLines, numRes) != 0: | |||
print 'Error: Coordinate files do not formatted correctly.' | |||
return | |||
# initialize s2 | |||
s2_sum = np.zeros([1, numRes]) | |||
for i in range(blockNum): | |||
hC = h_all[i*numRes*blockSize:(i+1)*numRes*blockSize, :] | |||
nC = n_all[i*numRes*blockSize:(i+1)*numRes*blockSize, :] | |||
# Calculate the bond vector orientations over the trajectory | |||
hnC = hC[:,1:] - nC[:,1:] | |||
# residue index | |||
resNum = hC[0:numRes, 0] | |||
# Construct matrix m | |||
mMat = np.zeros([numRes, numRes]) | |||
#print numRes, numSnapshot, blockNum, blockSize | |||
for a in range(0, numRes*blockSize, numRes): | for a in range(0, numRes*blockSize, numRes): |
Revision as of 16:50, 14 May 2021
Calculating order parameters from MD Simulations
The analysis utilizes iRed software provided by the Dr. Rafael Bruschweiler Group. All iRed calculations were completed on the HCC cluster.
- Create a pdb file of the trajectory in the same manner as the .xtc file.
- After the pdb file is created (will be very large), use the following scripts to extract the N and H coordinates for each atom at each time point in the trajectory
- awk ‘{if (($3 == “N”) && ($4 != “PRO”)) {print $6, $7, $8, $9:}} xxx.pdb > N-HCoor.dat
- awk ‘{if (($3 == “H”) && ($4 != “H1”)) {print $6, $7, $8, $9:}} xxx.pdb > H-NCoor.dat
- Once .dat files are created, use the python script below to run the iRed calculation
- In command line, run “ired_1vec_block.py --coor1 N-HCoor.dat --coor2 H-NCoor.dat --block 100
! /usr/bin/env python from __future__ import division import numpy as np from optparse import OptionParser import sys def setupParserOptions(): parser=OptionParser() parser.add_option('--coor1', dest='coor1',default='H-NCoor.dat',help = "Input coordinate file 1") parser.add_option('--coor2', dest='coor2',default='N-HCoor.dat',help = "Input coordinate file 2") parser.add_option('--block', dest='block', default = 1, help = 'Number of blocks') return parser def ired(hCoor_file, nCoor_file, block): try: h_all = np.loadtxt(hCoor_file) except IOError: print 'cannot open ', hCoor_file try: n_all = np.loadtxt(nCoor_file) except IOError: print 'cannot open ', nCoor_file numLines = len(h_all) numRes = len(set(h_all[:,0])) numSnapshot = numLines // numRes blockNum = int(block) blockSize = numSnapshot // blockNum if numLines != len(n_all): print 'Error: The two coordinate files do not have same length.' return if np.mod(numLines, numRes) != 0: print 'Error: Coordinate files do not formatted correctly.' return # initialize s2 s2_sum = np.zeros([1, numRes]) for i in range(blockNum): hC = h_all[i*numRes*blockSize:(i+1)*numRes*blockSize, :] nC = n_all[i*numRes*blockSize:(i+1)*numRes*blockSize, :] # Calculate the bond vector orientations over the trajectory hnC = hC[:,1:] - nC[:,1:] # residue index resNum = hC[0:numRes, 0] # Construct matrix m mMat = np.zeros([numRes, numRes]) #print numRes, numSnapshot, blockNum, blockSize
for a in range(0, numRes*blockSize, numRes): # N-H vectors for the current snapshot hnTemp = hnC[a:a+numRes, :] # normalize the vectors for b in range(numRes): hnTemp[b,:] = hnTemp[b,:] / np.linalg.norm(hnTemp[b,:])
# Construct Rank 2 Legendre polynomial c = np.dot(hnTemp, hnTemp.T) mMat = mMat + (3*np.multiply(c, c)-1)/2
# Ensemble averaging mMat = mMat / blockSize #print np.shape(hnTemp), np.shape(hnTemp.T), np.shape(c), np.shape(mMat)
# Diagonalize matrix dVals, v = np.linalg.eig(mMat) Ind = dVals.argsort()[::-1] # sort eigenvalues in descending order dSort = dVals[Ind] eigVal = np.diag(dSort) eigVec = v[:, Ind]
# Calculate the squared order parameters s2_block = np.zeros(numRes) for b in range(numRes): sumOverModes = 0; for a in range(5,numRes): sumOverModes += eigVal[a,a] * (eigVec[b,a])**2 s2_block[b] = 1 - sumOverModes s2_sum += s2_block
s2 = s2_sum / blockNum
# output out = np.concatenate(([resNum], s2), axis = 0) with open('ired_s2_1vec_%dblock.out' %(block), 'wb') as f: np.savetxt(f, np.transpose(out), fmt='%i %.3f')
if __name__ == '__main__':
parser = setupParserOptions() if len(sys.argv) <2: parser.print_help() sys.exit()
options, args=parser.parse_args() print "**************************************************\nMD Block-averaged iRED S2 Calculation" print "Input coordinate file: %s"%(options.coor1) print "Input coordinate file: %s"%(options.coor2) print "Number of MD block(s): %s"%(options.block)
f1 = options.coor1 f2 = options.coor2 try: bn = int(options.block) except ValueError: print "Error: Number of block should be an integer."
ired(f1, f2, bn)
- Python script will output a .out file that contains the order parameter values for each amino acid residue.