def process_vis(self, vis_range=(390, 720), min_scan=None, max_scan=None, sigma=2.3, para_angle=45): data_file = self.file wls = self.vis_wls() t = data_file['t'] d = -data_file['data_Stresing CCD'][min_scan:max_scan, ...] if 'rot' in data_file: rot = data_file['rot'][min_scan:max_scan] para_idx = (abs(np.round(rot) - para_angle) < 3) else: n_ir_cwl = data_file['wl_Remote IR 32x2'].shape[0] para_idx = np.repeat(np.array([False, True], dtype='bool'), n_ir_cwl) dpm = sigma_clip(d[para_idx, ...], axis=0, sigma=sigma, max_iter=10) dsm = sigma_clip(d[~para_idx, ...], axis=0, sigma=sigma, max_iter=10) dp = dpm.mean(0) dps = dpm.std(0) ds = dsm.mean(0) dss = dsm.std(0) para = TimeResSpec(wls, t, dp[0, :, 0, ...], freq_unit='nm', disp_freq_unit='nm') perp = TimeResSpec(wls, t, ds[0, :, 0, ...], freq_unit='nm', disp_freq_unit='nm') pol = PolTRSpec(para, perp) pol = pol.cut_freq(*vis_range, invert_sel=True) return pol.para, pol.perp, pol
def test_das_pol_plots(): ds = TimeResSpec(wl, t, data) pds = PolTRSpec(ds, ds) # fake pol x0 = [0.1, 0.1, 1, 1000] out = pds.fit_exp(x0) pds.plot.das() pds.plot.edas()
def test_sas_pol_plots(): from skultrafast.kinetic_model import Model ds = TimeResSpec(wl, t, data) pds = PolTRSpec(ds, ds) # fake pol x0 = [0.1, 0.1, 1, 1000] out = pds.fit_exp(x0) m = Model() m.add_transition('S1', 'S1*', 'k1') m.add_transition('S1', 'zero', 'k2') pds.plot.sas(m)
def test_concat(): ds = TimeResSpec(wl, t, data) ds = ds.bin_freqs(50) n = ds.wavelengths.size // 2 ds1 = ds.cut_freq(ds.wavelengths[n], np.inf) ds2 = ds.cut_freq(-np.inf, ds.wavelengths[n]) dsc = ds1.concat_datasets(ds2) assert (np.allclose(dsc.data, ds.data)) pol_ds = PolTRSpec(ds, ds) a = PolTRSpec(ds1, ds1) b = PolTRSpec(ds2, ds2) pol_dsc = a.concat_datasets(b) for p in 'para', 'perp', 'iso': assert (np.allclose(getattr(pol_dsc, p).data, getattr(pol_ds, p).data))
def test_pol_tr(): ds = TimeResSpec(wl, t, data) ds2 = TimeResSpec(wl, t, data) ps = PolTRSpec(para=ds, perp=ds2) out = ps.bin_freqs(10) assert (out.para.wavenumbers.size == 10) assert (out.perp.wavenumbers.size == 10) assert_almost_equal(out.perp.data, out.para.data) ps.subtract_background() ps.mask_freqs([(400, 550)]) print(ps.para.data.mask, ps.para.data.mask[1, ps.para.wl_idx(520)]) assert (ps.para.data.mask[1, ps.para.wl_idx(520)]) out = ps.cut_freqs([(400, 550)]) assert (np.all(out.para.wavelengths >= 550)) assert (np.all(out.perp.wavelengths >= 550)) ps.bin_times(6)
def test_pol_plot(): ds = TimeResSpec(wl, t, data) ds = ds.bin_freqs(50) ds = PolTRSpec(para=ds, perp=ds) ds = ds.bin_freqs(50) ds.plot.trans([550]) ds.plot.spec([2, 10]) ds.plot.trans([550], norm=1) ds.plot.trans([550], norm=1, marker='o')
def process_ir(self, t0=0, min_scans=0, max_scans=None, subtract_background=True, center_ch=16, disp=14, sigma=3) -> PolTRSpec: data_file = self.file t = data_file['t'] - t0 wli = data_file['wl_Remote IR 32x2'] print(wli[:, 16, None]) wli = -(disp * (np.arange(32) - center_ch)) + wli[:, 16, None] wli = 1e7 / wli d = data_file['data_Remote IR 32x2'][min_scans:max_scans] print(d.shape) dp = sigma_clip(d[1::2, ...], axis=0, sigma=sigma) dpm = dp.mean(0) ds = sigma_clip(d[0::2, ...], axis=0, sigma=sigma) dsm = ds.mean(0) if subtract_background: dsm -= dsm[:, :10, ...].mean(1, keepdims=True) dpm -= dpm[:, :10, ...].mean(1, keepdims=True) para = TimeResSpec(wli[0], t, dpm[0, :, 0, ...], freq_unit='cm', disp_freq_unit='cm') perp = TimeResSpec(wli[0], t, dsm[0, :, 0, ...], freq_unit='cm', disp_freq_unit='cm') para.plot.spec(1, n_average=20) for i in range(1, wli.shape[0]): para_t = TimeResSpec(wli[i], t, dpm[i, :, 0, ...], freq_unit='cm', disp_freq_unit='cm') para_t.plot.spec(1, n_average=20) para = para.concat_datasets(para_t) perp = perp.concat_datasets( TimeResSpec(wli[i], t, dsm[i, :, 0, ...], freq_unit='cm', disp_freq_unit='cm')) both = PolTRSpec(para, perp) return both
def test_pol_tr(): ds = TimeResSpec(wl, t, data) ds2 = TimeResSpec(wl, t, data) ps = PolTRSpec(para=ds, perp=ds2) out = ps.bin_freqs(10) assert(out.para.wavenumbers.size == 10) assert(out.perp.wavenumbers.size == 10) assert_almost_equal(out.perp.data, out.para.data) ps.subtract_background() ps.mask_freqs([(400, 550)]) print(ps.para.data.mask, ps.para.data.mask[1, ps.para.wl_idx(520)]) assert(ps.para.data.mask[1, ps.para.wl_idx(520)] ) out = ps.cut_freqs([(400, 550)]) assert(np.all(out.para.wavelengths >= 550)) assert(np.all(out.perp.wavelengths >= 550)) ps.bin_times(6)
def make_pol_ds(self, sigma=None) -> PolTRSpec: para = np.nanmean(self.par_data, axis=0) ds_para = TimeResSpec(self.wavelength, self.t, 1000 * para, disp_freq_unit='cm') perp = np.nanmean(self.per_data, axis=0) ds_perp = TimeResSpec(self.wavelength, self.t, 1000 * perp, disp_freq_unit='cm') return PolTRSpec(ds_para, ds_perp)