def _write_obs(self, writer, props, detindx): """Write an observation frame. Given a dictionary of scalars, write these to an observation frame. Args: writer (G3Writer): The writer instance. props (dict): Dictionary of properties. detindx (dict): Dictionary of UIDs for each detector. Returns: None """ f = core3g.G3Frame(core3g.G3FrameType.Observation) for k, v in props.items(): if k == "detector_uid": # old indices loaded from so3g file continue f[k] = s3utils.to_g3_type(v) indx = core3g.G3MapInt() for k, v in detindx.items(): indx[k] = int(v) f["detector_uid"] = indx writer(f) return
def _write_precal(self, writer, dets, noise): """Write the calibration frame at the start of an observation. This frame nominally contains "preliminary" values for the detectors. For simulations, this contains the true detector offsets and noise properties. """ qname = "detector_offset" f = core3g.G3Frame(core3g.G3FrameType.Calibration) # Add a vector map for quaternions f[qname] = core3g.G3MapVectorDouble() for k, v in dets.items(): f[qname][k] = core3g.G3VectorDouble(v) if noise is not None: kfreq = "noise_stream_freq" kpsd = "noise_stream_psd" kindx = "noise_stream_index" dstr = "noise_detector_streams" dwt = "noise_detector_weights" f[kfreq] = core3g.G3MapVectorDouble() f[kpsd] = core3g.G3MapVectorDouble() f[kindx] = core3g.G3MapInt() f[dstr] = core3g.G3MapVectorInt() f[dwt] = core3g.G3MapVectorDouble() nse_dets = list(noise.detectors) nse_keys = list(noise.keys) st = dict() wts = dict() for d in nse_dets: st[d] = list() wts[d] = list() for k in nse_keys: f[kfreq][k] = core3g.G3VectorDouble(noise.freq(k).tolist()) f[kpsd][k] = core3g.G3VectorDouble(noise.psd(k).tolist()) f[kindx][k] = int(noise.index(k)) for d in nse_dets: wt = noise.weight(d, k) if wt > 0: st[d].append(noise.index(k)) wts[d].append(wt) for d in nse_dets: f[dstr][d] = core3g.G3VectorInt(st[d]) f[dwt][d] = core3g.G3VectorDouble(wts[d]) writer(f) return