-
Notifications
You must be signed in to change notification settings - Fork 0
/
landing_paper_analysis.py
121 lines (88 loc) · 3.87 KB
/
landing_paper_analysis.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
118
119
120
121
import flydra_analysis_dataset as fad
import flydra_analysis_plot as fap
import trajectory_analysis_core as tac
import trajectory_analysis_specific as tas
import numpy as np
import trajectory_analysis_specific as tas
import nopost_analysis as npa
def load_raw_nopost_data(filename, raw_dataset_name = 'dataset_nopost_raw'):
# filename should be a .h5 file
info = {'post_type': 'none', 'post_position': np.zeros([3]), 'post_radius': 0.009565}
dataset = fad.Dataset()
dataset.load_data(filename, kalman_smoothing=True, save_covariance=False, info=info)
print 'saving dataset...'
fad.save(dataset, raw_dataset_name)
return dataset
def set_minimum_distance_to_post(dataset):
# cull based on trajectory length
keys_to_remove = []
for k, trajec in dataset.trajecs.iteritems():
remove = False
if trajec.frame_nearest_to_post == 0:
remove = True
# check that before coming close to post, there is a frame where fly is 20cm away from the post
frames = np.arange(0, trajec.frame_nearest_to_post)
frame_before_nearest = tas.get_frame_at_distance(trajec, 0.2, singleframe=False, frames=frames)
if frame_before_nearest is None:
remove = True
# check that after coming close to post, there is a frame where fly is 20cm away from post
# should be for FLYBY's only
frames = np.arange(trajec.frame_nearest_to_post, trajec.length)
frame_after_nearest = tas.get_frame_at_distance(trajec, 0.2, singleframe=False, frames=frames)
if frame_after_nearest is None:
remove = True
if remove is True:
keys_to_remove.append(k)
else:
trajec.framerange = [frame_before_nearest[-1], frame_after_nearest[0]]
for k in keys_to_remove:
dataset.del_trajec(k)
def process_nopost_dataset(dataset, processed_dataset_name = 'dataset_nopost_processed'):
def batch_1(dataset):
# cull based on trajectory length
keys_to_remove = []
for k, trajec in dataset.trajecs.iteritems():
remove = False
if trajec.length < 25:
remove = True
if np.max(trajec.speed) < 0.05:
remove = True
if remove is True:
keys_to_remove.append(k)
for k in keys_to_remove:
dataset.del_trajec(k)
# post dimensions
top_center = [0,0,0]
xy_point = top_center[0:2]
z_point = top_center[2]
radius = 0.009565
# calculate useful states
for k, trajec in dataset.trajecs.iteritems():
print 'processing: ', k
tac.calc_xy_distance_to_point(trajec, xy_point)
tac.calc_z_distance_to_point(trajec, z_point)
tac.calc_xy_distance_to_post(trajec, top_center, radius)
def batch_2(dataset):
for k, trajec in dataset.trajecs.iteritems():
tas.calc_frame_nearest_to_post(trajec)
def batch_3(dataset):
# more culling
set_minimum_distance_to_post(dataset)
def batch_4(dataset):
# calculate more useful states
for k, trajec in dataset.trajecs.iteritems():
print 'batch_4: ', k
tac.calc_heading(trajec)
tas.calc_post_dynamics_for_flydra_trajectory(trajec)
tac.calc_saccades(trajec, threshold_lo=300.)
def batch_5(dataset):
# classify
for k, trajec in dataset.trajecs.iteritems():
npa.classify_false_post(trajec)
npa.calc_frame_of_landing(trajec)
#batch_1(dataset)
#batch_2(dataset)
#batch_3(dataset)
#batch_4(dataset)
batch_5(dataset)
#fad.save(dataset, processed_dataset_name)