/
TrackMeasurementFunctions.py
117 lines (88 loc) · 3.45 KB
/
TrackMeasurementFunctions.py
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import TrackClassGlobals as TCG
import General as gen
import numpy as np
#DEFAULT TRACK FIELD CALCULATION FUNCTIONS
#the mean of absolute travel distance between frames. right now only does x and y dims
def getAvgMov(track, **kwargs):
SPEED_CONVERSION_FACTOR = kwargs["speedConversionFactor"]
avgMov = []
diff = []
frameDistanceBetweenFrames = []
positionalDistanceBetweenFrames = []
for index in range(0, len(track.x) - 1):
#the number of frames by which two adjacent elements in track are separated
frameDistanceBetweenFrames = track.t[index + 1] - track.t[index]
#the absolute positional distance between adjacent tracked frames
positionalDistanceBetweenFrames = gen.getDistance(track.x[index], track.x[index + 1], track.y[index], track.y[index + 1])
#the distance traveled per frame between adjacent tracked frames
diff.append(positionalDistanceBetweenFrames / frameDistanceBetweenFrames)
return gen.nanMean(diff) * SPEED_CONVERSION_FACTOR
#finalX-initialX position / age
def getVelocity(track, **kwargs):
SPEED_CONVERSION_FACTOR = kwargs["speedConversionFactor"]
age = getAge(track)
xTravel = track.x[-1] - track.x[0]
yTravel = track.y[-1] - track.y[0]
return (gen.pythagorean(xTravel, yTravel) / age) * SPEED_CONVERSION_FACTOR
#finalY-initialY position / age
def getxMigrationSpeed(track, **kwargs):
age = getAge(track)
return (track.x[-1] - track.x[0])/age
#finalY-initialY position / age
def getyMigrationSpeed(track, **kwargs):
age = getAge(track)
return (track.y[-1] - track.y[0])/age
def getAbsVelocity(track, **kwargs):
velocity = getVelocity(track)
return abs(velocity)
#range of frames over which track exists
def getAge(track, **kwargs):
return track.t[-1] - track.t[0]
#number of frames in which track data actually exists
def getNumFrames(track, **kwargs):
return len(track.x)
#directionality calculated based on field vector
def getDirectionality(track, **kwargs):
FIELD_VECTOR = kwargs['gradientVector']
xDiffs = gen.getDifferenceArray(track.x)
yDiffs = gen.getDifferenceArray(track.y)
directedness = []
#calculate instantenous directionality between frames
for dx, dy in zip(xDiffs, yDiffs):
vector = [dx, dy]
normVector = gen.normalizeVector(vector)
if normVector != 0:
normFieldVector = gen.normalizeVector(FIELD_VECTOR)
directionality = gen.dotProduct(vector, FIELD_VECTOR) / normVector * normFieldVector
directedness.append(directionality)
else:
directedness.append(0)
return gen.nanMean(directedness)
def getxStartPos(track, **kwargs):
return track.x[0]
def getxEndPos(track, **kwargs):
return track.x[-1]
def getyStartPos(track, **kwargs):
return track.y[0]
def getyEndPos(track, **kwargs):
return track.y[-1]
def getFirstFrame(track, **kwargs):
return track.t[0]
def getLastFrame(track, **kwargs):
return track.t[-1]
def getMP(track, **kwargs):
travel = []
xDiffs = gen.getDifferenceArray(track.x)
yDiffs = gen.getDifferenceArray(track.y)
for x, y in zip(xDiffs, yDiffs):
travel.append(gen.pythagorean(x, y))
totalTravel = np.sum(travel)
xDistance = track.x[-1] - track.x[0]
yDistance = track.y[-1] - track.y[0]
if totalTravel == 0:
return 0
return gen.pythagorean(xDistance, yDistance) / totalTravel
def getConcentration(track, **kwargs):
GRADIENT_STRENGTH = kwargs["gradientStrength"]
MAXX = kwargs["maxX"]
return (GRADIENT_STRENGTH / MAXX) * (MAXX - getxStartPos(track))