Skip to content

Commit 4a4afea

Browse files
committed
Analyze and compare ethalons
1 parent a729a17 commit 4a4afea

File tree

3 files changed

+437
-149
lines changed

3 files changed

+437
-149
lines changed

gsus_splib_utils/__init__.py

Lines changed: 63 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ def __init__(self, signature = None, libname = None,
1717
self.purity = purity
1818
self.measurement_type = measurement_type
1919
self.spectrometer_data = spectrometer_data
20+
self.fixed = False
2021

2122
def header(self):
2223
return '{} Record={}: {} {}{} {}'.format(self.libname, self.record,
@@ -76,6 +77,7 @@ def read_from_file(filename):
7677

7778
def replace_invalid(self, value):
7879
self.signature[self.signature < 0.0] = value
80+
return self
7981

8082
def interpolate_invalid(self, kind='slinear'):
8183
full_xs = list(range(len(self.signature)))
@@ -89,8 +91,9 @@ def interpolate_invalid(self, kind='slinear'):
8991
ys.append(ys[-1])
9092
f = scipy.interpolate.interp1d(xs, ys, kind=kind, assume_sorted=True)
9193
self.signature = f(full_xs)
94+
return self
9295

93-
def resample_to(spectrometer_name, with_fixed_dest = False):
96+
def resample_as(self, spectrometer_name, with_fixed_dest = False):
9497
"""
9598
Returns signature resampled to different spectrometer.
9699
"""
@@ -101,11 +104,69 @@ def resample_to(spectrometer_name, with_fixed_dest = False):
101104
dest_wl = np.sort(dest_wl)
102105
dest_bw = None
103106

107+
return self.resample_at(dest_wl, dest_bw)
108+
109+
def resample_at(self, dest_wl, dest_bw = None):
110+
"""
111+
Returns signature resampled to different spectrometer.
112+
"""
104113
resampler = BandResampler(self.spectrometer_data.wavelengths, dest_wl,
105114
self.spectrometer_data.bandwidths, dest_bw)
106115
return resampler(self.signature)
107116

108117

118+
def interpolate_as(self, spectrometer_name, with_fixed_dest = True, kind='quadratic'):
119+
"""
120+
Returns signature interpoleted at wavelengths of different spectrometer,
121+
based on wavelengths and reflectances of original.
122+
"""
123+
dest = SpectrometerData.get_by_name(spectrometer_name)
124+
dest_wl = dest.wavelengths
125+
if with_fixed_dest:
126+
dest_wl = np.sort(dest_wl)
127+
128+
return self.interpolate_at(dest_wl, kind)
129+
130+
def interpolate_at(self, dest_wl, kind='quadratic'):
131+
"""
132+
Returns signature interpoleted at specified wavelengths,
133+
based on wavelengths and reflectances of original.
134+
"""
135+
xs = self.wavelengths()
136+
ys = self.signature
137+
f = scipy.interpolate.interp1d(xs, ys, kind=kind, assume_sorted=True, fill_value='extrapolate')
138+
return f(dest_wl)
139+
140+
def in_range(self, min_wl, max_wl):
141+
"""
142+
Return wavelengths and signature part between min wavelength and max wavelength.
143+
"""
144+
src_wavelengths = self.spectrometer_data.wavelengths
145+
min_wl = max(src_wavelengths[0], min_wl)
146+
max_wl = min(src_wavelengths[-1], max_wl)
147+
min_index = np.argmax(src_wavelengths >= min_wl)
148+
max_index = np.argmax(src_wavelengths > max_wl)
149+
range_wl = src_wavelengths[min_index:max_index]
150+
range_sig = self.signature[min_index:max_index]
151+
return range_wl, range_sig
152+
153+
def in_range_of(self, spectrometer_name):
154+
"""
155+
Return wavelengths and signature part that overlaps with other spectrometer.
156+
"""
157+
dest_wavelengths = SpectrometerData.get_by_name(spectrometer_name).wavelengths
158+
return self.in_range(dest_wavelengths[0], dest_wavelengths[-1])
159+
160+
def fix(self):
161+
self.interpolate_invalid()
162+
self.signature = self.resample_as(self.spectrometer, True)
163+
self.fixed = True
164+
self._wavelengths = np.sort(self.spectrometer_data.wavelengths)
165+
return self
166+
167+
def wavelengths(self):
168+
return self._wavelengths if self.fixed else self.spectrometer_data.wavelengths
169+
109170
class SpectrometerData:
110171
def __init__(self, libname, record, measurement, spectrometer_name, description, wavelengths, bandwidths):
111172
self.libname = libname
@@ -191,7 +252,7 @@ def read_from_file_by_name(name):
191252
bpfilepath = os.path.join(os.path.dirname(__file__),
192253
SpectrometerData._name2bandpassfilename[name])
193254
libname, record, measurement, spetrometer_name, description, bandpass = \
194-
SpectrometerData.read_data_from_file(wlfilepath)
255+
SpectrometerData.read_data_from_file(bpfilepath)
195256
return SpectrometerData(libname, record, measurement, spectrometer_name, description, wavelengths, bandpass)
196257

197258

@@ -213,36 +274,3 @@ def get_by_name(name):
213274
sd = SpectrometerData.read_from_file_by_name(name)
214275
SpectrometerData._name2specdata[name] = sd
215276
return sd
216-
217-
# Free functions
218-
219-
def replace_invalid(spec, value):
220-
self.signature[self.signature < 0.0] = value
221-
222-
def interpolate_invalid(self, kind='slinear'):
223-
full_xs = list(range(len(self.signature)))
224-
xs = [x for x, y in zip(full_xs, self.signature) if y > 0.0]
225-
ys = [y for y in self.signature if y > 0.0]
226-
if xs[0] > full_xs[0]:
227-
xs.insert(0, full_xs[0])
228-
ys.insert(0, ys[0])
229-
if xs[-1] < full_xs[-1]:
230-
xs.append(full_xs[-1])
231-
ys.append(ys[-1])
232-
f = scipy.interpolate.interp1d(xs, ys, kind=kind, assume_sorted=True)
233-
self.signature = f(full_xs)
234-
235-
def resample(spectral_data, spectrometer_name, with_fixed_dest = False):
236-
"""
237-
Returns signature resampled to different spectrometer.
238-
"""
239-
dest = SpectrometerData.get_by_name(spectrometer_name)
240-
dest_wl = dest.wavelengths
241-
dest_bw = dest.bandwidths
242-
if with_fixed_dest:
243-
dest_wl = np.sort(dest_wl)
244-
dest_bw = None
245-
246-
resampler = BandResampler(spectral_data.spectrometer_data.wavelengths, dest_wl,
247-
spectral_data.spectrometer_data.bandwidths, dest_bw)
248-
return resampler(spectral_data.signature)

hyperspectral.ipynb

Lines changed: 365 additions & 113 deletions
Large diffs are not rendered by default.

utils.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,12 @@ def interpolate_invalid(signature, kind='slinear'):
4646
xs.append(full_xs[-1])
4747
ys.append(ys[-1])
4848
f = scipy.interpolate.interp1d(xs, ys, kind=kind, assume_sorted=True)
49-
return f(full_xs)
49+
return f(full_xs)
50+
51+
def lower_bound(array, min_val):
52+
ret = np.argmax(array >= min_val)
53+
return ret if array[ret] >= min_val else len(array)
54+
55+
def upper_bound(array, max_val):
56+
ret = np.argmax(array > max_val)
57+
return ret if array[ret] > max_val else len(array)

0 commit comments

Comments
 (0)