-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgyration.py
More file actions
48 lines (43 loc) · 1.93 KB
/
gyration.py
File metadata and controls
48 lines (43 loc) · 1.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import sys
import copy
import numpy as np
from scipy.spatial import distance
inputFile=open(sys.argv[1],"r")
# load structure data
inputLoci = []
inputData = []
for inputFileLine in inputFile:
inputFileLineData = inputFileLine.strip().split()
inputLoci.append(int(inputFileLineData[1]))
inputData.append(list(map(float, inputFileLineData[2:])))
numOfLoci = len(inputLoci)
numOfStructures = len(inputData[0]) // 3
numOfPairs = numOfLoci * (numOfLoci - 1) // 2
sys.stderr.write('read '+str(numOfLoci)+' loci from '+str(numOfStructures)+' structures\n')
inputLociNumpy = np.array(inputLoci, dtype=int)
inputDataNumpy = np.array(inputData, dtype=float)
# find resolution and max separation
lociPdist = distance.pdist(np.reshape(inputLociNumpy, [numOfLoci, 1])).astype(int)
resolution = min(lociPdist)
maxSeparation = max(lociPdist)
sys.stderr.write('resolution = '+str(resolution)+' max separation = '+str(maxSeparation)+'\n')
# calculate sum x matrix and sum x^2 matrix
for i in range(numOfStructures):
sumNumMatrix = np.zeros([numOfLoci, numOfLoci, 3], dtype=float)
sumMatrix = np.zeros([numOfLoci, numOfLoci, 3], dtype=float)
sumSqMatrix = np.zeros([numOfLoci, numOfLoci, 3], dtype=float)
for j in range(numOfLoci):
sys.stderr.write('processing structure '+str(i+1)+', locus '+str(j+1)+'\n')
sumNumMatrix[:(j+1), j:, :] += 1
sumNumMatrix[j:, :(j+1), :] += 1
sumNumMatrix[j, j, :] -= 1
position = inputDataNumpy[j, (3*i):(3*i+3)]
sumMatrix[:(j+1), j:, :] += position
sumMatrix[j:, :(j+1), :] += position
sumMatrix[j, j, :] -= position
sqPosition = position**2
sumSqMatrix[:(j+1), j:, :] += sqPosition
sumSqMatrix[j:, :(j+1), :] += sqPosition
sumSqMatrix[j, j, :] -= sqPosition
radiusMatrix = np.sqrt(np.sum(sumSqMatrix / sumNumMatrix - (sumMatrix / sumNumMatrix)**2, axis = 2))
np.savetxt('radius_'+str(i+1)+'.txt', radiusMatrix, delimiter='\t')