@@ -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+
109170class 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 )
0 commit comments