def extract_and_pickle(nc_filename): basedir = os.path.split(nc_filename)[0] # should make this more robust, currently assumes all nc files are in top # level of /data/<machine>/*.nc machine = os.path.split(basedir)[1] cryostat = cryostats[machine] try: print("Processing {}".format(nc_filename)) snms = [] rnc = ReadoutNetCDF(nc_filename) for timestream_index,timestream in enumerate(rnc.timestreams): if timestream.epoch.shape[0] == 0: print "no timestreams in", nc_filename return start_epoch = timestream.epoch.min() sweep_index = find_closest_sweep(timestream,rnc.sweeps) sweep = rnc.sweeps[sweep_index] sweep_epoch = sweep.end_epoch resonator_indexes = np.array(list(set(sweep.index))) resonator_indexes.sort() print "%s: timestream[%d] at %s, associated sweep[%d] at %s, %d resonators" % (nc_filename,timestream_index, time.ctime(start_epoch), sweep_index, time.ctime(sweep_epoch), len(resonator_indexes)) for resonator_index in resonator_indexes: snm = SweepNoiseMeasurement(rnc, sweep_group_index=sweep_index, timestream_group_index=timestream_index, resonator_index=resonator_index, cryostat=cryostat) if nc_filename in atten_map: atten = atten_map[nc_filename][timestream_index] ntone_correction = ntone_power_correction(16) print "overriding attenuation",atten snm.atten = atten snm.total_dac_atten = atten +ntone_correction snm.power_dbm = snm.dac_chain_gain - snm.total_dac_atten try: snm.zbd_voltage = timestream.zbd_voltage[0] except AttributeError: pass pkld = cPickle.dumps(snm,cPickle.HIGHEST_PROTOCOL) del snm snm = cPickle.loads(pkld) snms.append(snm) rnc.close() pkl_filename = os.path.join(basedir,'pkl', os.path.splitext(os.path.split(nc_filename)[1])[0] + '.pkl') save_noise_pkl(pkl_filename, snms) print("Saved {}".format(pkl_filename)) except KeyboardInterrupt: pass except Exception as e: print "failed on",nc_filename,e
def get_effective_dac_atten_at(self,epoch): """ Get the dac attenuator value and total signal attenuation at a given time :param epoch: unix timestamp :return: dac attenuator in dB, total attenuation in dB """ index = self._get_hwstate_index_at(epoch) dac_atten = self.dac_atten[index] if self.num_tones is not None: ntones = self.num_tones[index] else: ntones = 1 warnings.warn("ntones parameter not found in data file %s, assuming 1. The effective power level may be wrong" % self.filename) total = dac_atten + ntone_power_correction(ntones) return dac_atten, total