-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathbeams.py
154 lines (100 loc) · 4.04 KB
/
beams.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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
"""
Utility functions for converting the beam width header files into
python arrays.
See : https://github.com/SoundMetrics/aris-file-sdk/tree/master/beam-width-metrics
"""
import glob
import os
import re
import pandas as pd
def parse_beam_header_file(fp):
""" Utility to parse the beam width header files.
"""
# example of what we are trying to parse:
# DEFINE_BEAMWIDTH3(0, -13.5735, -13.7893, -13.3577)
pattern = re.compile(r"^DEFINE_BEAMWIDTH3\D*(\d+), ([-+]?\d*\.\d+), ([-+]?\d*\.\d+), ([-+]?\d*\.\d+)")
beam_angles = []
with open(fp) as f:
for line in f:
m = pattern.match(line)
if m:
beam_num = int(m.group(1))
beam_center = float(m.group(2))
beam_left = float(m.group(3))
beam_right = float(m.group(4))
beam_angles.append([beam_num, beam_center, beam_left, beam_right])
# Simple sanity check
for i in range(len(beam_angles)):
assert beam_angles[i][0] == i
beam_angles = pd.DataFrame(beam_angles, columns=['beam_num', 'beam_center', 'beam_left', 'beam_right'])
return beam_angles
def convert_beam_header_files(beam_dir):
""" Convert the aris-file-sdk/beam-width-metrics directory to pandas data frames.
"""
system_beam_angles = {}
for fp in glob.glob(os.path.join(beam_dir, "BeamWidths*")):
beam_angles = parse_beam_header_file(fp)
name = os.path.splitext(os.path.basename(fp))[0]
system_type = name.split("BeamWidths_")[1]
system_beam_angles[system_type] = beam_angles
return system_beam_angles
def make_csv_files_for_beam_widths(beam_dir, output_dir):
""" Convert the aris-file-sdk/beam-width-metrics directory to pandas data frames
and save them as csv files.
"""
system_beam_angles = convert_beam_header_files(beam_dir)
for system_type, beam_angles in system_beam_angles.items():
beam_angles.to_csv(os.path.join(output_dir, system_type + ".csv"), index=False)
def load_beam_width_data(frame, beam_width_dir):
""" Load in the beam spacing file that corresponds to the correct ARIS setup for this frame.
"""
system_type = frame.thesystemtype
beam_count = frame.BeamCount
used_telephoto = frame.largelens
beam_width_fn = None
# ARIS 1800
if system_type == 0:
if beam_count == 48:
if used_telephoto:
# ARIS_Telephoto_48
beam_width_fn = 'ARIS_Telephoto_48.csv'
else:
# ARIS1800_1200_48
beam_width_fn = 'ARIS1800_1200_48.csv'
elif beam_count == 96:
if used_telephoto:
# ARIS_Telephoto_96
beam_width_fn = 'ARIS_Telephoto_96.csv'
else:
# ARIS1800_96
beam_width_fn = 'ARIS1800_96.csv'
else:
raise ValueEror("Invalid Beam Count %d for ARIS 1800" % (beam_count,))
# ARIS 3000
elif system_type == 1:
if used_telephoto:
raise ValueEror("Don't know telephoto beam widths for ARIS 3000")
if beam_count == 64:
# ARIS3000_64
beam_width_fn = 'ARIS3000_64.csv'
elif beam_count == 128:
# ARIS3000_128
beam_width_fn = 'ARIS3000_128.csv'
else:
raise ValueEror("Invalid Beam Count %d for ARIS 3000" % (beam_count,))
# ARIS 1200
elif system_type == 2:
if beam_count != 48:
raise ValueEror("Invalid Beam Count %d for ARIS 1200" % (beam_count,))
if used_telephoto:
# ARIS_Telephoto_48
beam_width_fn = 'ARIS_Telephoto_48.csv'
else:
# ARIS1800_1200_48
beam_width_fn = 'ARIS1800_1200_48.csv'
else:
raise ValueError("Unknown System Type: %s" % (system_type,))
beam_width_fp = os.path.join(beam_width_dir, beam_width_fn)
# return pd.read_csv(beam_width_fp)
return (pd.read_csv(beam_width_fp), beam_width_fn.replace('.csv', ''))
# /Users/GVH/Code/soundmetrics/aris-file-sdk/beam-width-metrics