def calculate_number(data, base, time_uncertainty=1e-6): """ returns the measured base flux * count time for each point """ assert base.normbase == 'time', "can't calculate time-integrated flux from monitor-normalized base" S, varS = err1d.interp(data.angular_resolution, base.angular_resolution, base.v, base.dv**2) F, varF = err1d.mul(data.monitor.count_time, time_uncertainty**2, S, varS) return F, varF
def apply_intensity_norm(data, base): assert data.normbase == base.normbase, "can't mix time and monitor normalized data" if data.angular_resolution.ndim == 1: data_x, base_x = data.angular_resolution, base.angular_resolution else: data_x, base_x = data.slit1.x, base.slit1.x S, varS = err1d.interp(data_x, base_x, base.v, base.dv**2) # Candor may have only one detector bank active, and so the other may # have zeros in it. Ignore those channels. I, varI = err1d.div(data.v, data.dv**2, S + (S == 0), varS) data.v, data.dv = I, np.sqrt(varI)
def apply_smoothing(slits, dx, degree, span): assert span > degree, "Span must be greater than degree" s = np.hstack([[d.angular_resolution, d.slit1.x, d.slit2.x] for d in slits]) s = find_common(s.T, dx=dx).T #import pylab;pylab.plot(np.arange(len(s[0])),s.T); pylab.show(); import sys; sys.exit() for d in slits: if span > 2: v, dv = smooth(s[0], d.angular_resolution, d.v, d.dv, degree=degree, span=span) else: v, var = interp(s[0], d.angular_resolution, d.v, d.dv**2) dv = np.sqrt(var) d.slit1.x = s[1] d.slit2.x = s[2] d.v, d.dv = v, dv
def saturation_correction(counts, time, saturation): # type: (np.ndarray, np.ndarray, np.ndarray) -> Tuple[np.ndarray, np.ndarray, np.ndarray] rate = counts / time # TODO: assert that saturation is sorted by the first value if saturation is None: C, varC = counts, counts mask = (rate >= 0.) elif saturation.shape[0] == 3: E, varE = err1d.interp(rate, saturation[0], saturation[1], saturation[2]**2) C, varC = err1d.div(counts, counts, E, varE) mask = (rate <= saturation[0, -1]) else: E = np.interp(rate, saturation[0], saturation[1]) C, varC = counts/E, counts/E**2 mask = (rate <= saturation[0, -1]) return C, varC, mask
def saturation_correction(counts, time, saturation): # type: (np.ndarray, np.ndarray, np.ndarray) -> Tuple[np.ndarray, np.ndarray, np.ndarray] rate = counts / time # TODO: assert that saturation is sorted by the first value if saturation is None: C, varC = counts, counts mask = (rate >= 0.) elif saturation.shape[0] == 3: E, varE = err1d.interp(rate, saturation[0], saturation[1], saturation[2]**2) C, varC = err1d.div(counts, counts, E, varE) mask = (rate <= saturation[0, -1]) else: E = np.interp(rate, saturation[0], saturation[1]) C, varC = counts / E, counts / E**2 mask = (rate <= saturation[0, -1]) return C, varC, mask
def apply_intensity_norm(data, base): assert data.normbase == base.normbase, "can't mix time and monitor normalized data" S, varS = err1d.interp(data.angular_resolution, base.angular_resolution, base.v, base.dv**2) I, varI = err1d.div(data.v, data.dv**2, S, varS) data.v, data.dv = I, np.sqrt(varI)