|
9 | 9 | from astropy import units as u |
10 | 10 | from astropy import units |
11 | 11 |
|
12 | | -from pst.utils import check_unit |
| 12 | +from pst.utils import check_unit, flux_conserving_interpolation |
13 | 13 |
|
14 | 14 | class SSPBase(object): |
15 | 15 | """Base class that represents a model of Simple Stellar Populations. |
@@ -223,32 +223,35 @@ def cut_wavelength(self, wl_min=None, wl_max=None, verbose=True): |
223 | 223 | if verbose: |
224 | 224 | print('[SSP] Models cut between {} {}'.format(wl_min, wl_max)) |
225 | 225 |
|
226 | | - def interpolate_sed(self, new_wl_edges, verbose=True): |
| 226 | + def interpolate_sed(self, new_wl, verbose=True, log=False, **interp_kwargs): |
227 | 227 | """Flux-conserving interpolation. |
228 | 228 |
|
229 | 229 | Parameters |
230 | 230 | ---------- |
231 | | - - new_wl_edges: bin edges of the new interpolated points. |
| 231 | + - new_wl: bin centers of the new interpolated points. |
232 | 232 | """ |
233 | | - if not isinstance(new_wl_edges, units.Quantity): |
234 | | - new_wl_edges *= self.wavelength.unit |
| 233 | + if not isinstance(new_wl, units.Quantity): |
| 234 | + new_wl = new_wl << self.wavelength.unit |
235 | 235 |
|
236 | | - new_wl = (new_wl_edges[1:] + new_wl_edges[:-1]) / 2 |
237 | | - dwl = np.diff(new_wl_edges) |
238 | | - ori_dwl = np.hstack((np.diff(self.wavelength), |
239 | | - self.wavelength[-1] - self.wavelength[-2])) |
240 | 236 | if verbose: |
241 | 237 | print('[SSP] Interpolating SSP SEDs') |
| 238 | + |
| 239 | + if log: |
| 240 | + target_wl = np.log(new_wl.to_value(self.wavelength.unit)) |
| 241 | + ref_wl = np.log(self.wavelength.value) |
| 242 | + else: |
| 243 | + target_wl = new_wl |
| 244 | + ref_wl = self.wavelength |
| 245 | + |
242 | 246 | new_l_lambda = np.empty( |
243 | 247 | shape=(self.metallicities.size, self.ages.size, |
244 | 248 | new_wl.size), dtype=np.float32) * self.L_lambda.unit |
245 | 249 |
|
246 | 250 | for i in range(self.L_lambda.shape[0]): |
247 | 251 | for j in range(self.L_lambda.shape[1]): |
248 | | - f = np.interp(new_wl_edges, self.wavelength, |
249 | | - np.cumsum(self.L_lambda[i, j] * ori_dwl)) |
250 | | - new_flux = np.diff(f) / dwl |
251 | | - new_l_lambda[i, j] = new_flux |
| 252 | + new_l_lambda[i, j] = flux_conserving_interpolation( |
| 253 | + target_wl, ref_wl, self.L_lambda[i, j], |
| 254 | + **interp_kwargs) |
252 | 255 |
|
253 | 256 | self.L_lambda = new_l_lambda |
254 | 257 | self.wavelength = new_wl |
|
0 commit comments