def create_observation(args, comm, telescope, ces, verbose=True): """Create a TOAST observation. Create an observation for the CES scan Args: args : argparse arguments comm : TOAST communicator ces (CES) : One constant elevation scan """ focalplane = telescope.focalplane site = telescope.site weather = site.weather noise = focalplane.noise totsamples = int((ces.stop_time - ces.start_time) * args.sample_rate) # create the TOD for this observation if comm.comm_group is not None: ndetrank = comm.comm_group.size else: ndetrank = 1 if args.el_nod_deg and (ces.subscan == 0 or args.el_nod_every_scan): el_nod = args.el_nod_deg else: el_nod = None try: tod = TODGround( comm.comm_group, focalplane.detquats, totsamples, detranks=ndetrank, boresight_angle=ces.boresight_angle, firsttime=ces.start_time, rate=args.sample_rate, site_lon=site.lon, site_lat=site.lat, site_alt=site.alt, azmin=ces.azmin, azmax=ces.azmax, el=ces.el, el_nod=el_nod, start_with_elnod=args.start_with_el_nod, end_with_elnod=args.end_with_el_nod, el_mod_step=args.el_mod_step_deg, el_mod_rate=args.el_mod_rate_hz, el_mod_amplitude=args.el_mod_amplitude_deg, el_mod_sine=args.el_mod_sine, scanrate=args.scan_rate, scanrate_el=args.scan_rate_el, scan_accel=args.scan_accel, scan_accel_el=args.scan_accel_el, cosecant_modulation=args.scan_cosecant_modulate, CES_start=None, CES_stop=None, sun_angle_min=args.sun_angle_min, coord=args.coord, sampsizes=None, report_timing=args.debug, hwprpm=args.hwp_rpm, hwpstep=args.hwp_step_deg, hwpsteptime=args.hwp_step_time_s, ) except RuntimeError as e: raise RuntimeError( 'Failed to create TOD for {}-{}-{}: "{}"' "".format(ces.name, ces.scan, ces.subscan, e) ) # Create the observation obs = {} obs["name"] = "CES-{}-{}-{}-{}-{}".format( site.name, telescope.name, ces.name, ces.scan, ces.subscan ) obs["tod"] = tod obs["baselines"] = None obs["noise"] = copy.deepcopy(noise) obs["id"] = int(ces.mjdstart * 10000) obs["intervals"] = tod.subscans obs["site"] = site obs["site_name"] = site.name obs["site_id"] = site.id obs["altitude"] = site.alt obs["weather"] = site.weather obs["telescope"] = telescope obs["telescope_name"] = telescope.name obs["telescope_id"] = telescope.id obs["focalplane"] = telescope.focalplane.detector_data obs["fpradius"] = telescope.focalplane.radius obs["start_time"] = ces.start_time obs["season"] = ces.season obs["date"] = ces.start_date obs["MJD"] = ces.mjdstart obs["rising"] = ces.rising obs["mindist_sun"] = ces.mindist_sun obs["mindist_moon"] = ces.mindist_moon obs["el_sun"] = ces.el_sun return obs
def create_observations(args, comm, schedule): """Simulate constant elevation scans. Simulate constant elevation scans at "site" matching entries in "all_ces". Each operational day is assigned to a different process group to allow making day maps. """ timer = Timer() log = Logger.get() data = Data(comm) telescope = schedule.telescope site = telescope.site focalplane = telescope.focalplane all_ces = schedule.ceslist nces = len(all_ces) breaks = get_breaks(comm, all_ces, args) nbreak = len(breaks) groupdist = distribute_uniform(nces, comm.ngroups, breaks=breaks) group_firstobs = groupdist[comm.group][0] group_numobs = groupdist[comm.group][1] if comm.comm_group is not None: ndetrank = comm.comm_group.size else: ndetrank = 1 for ices in range(group_firstobs, group_firstobs + group_numobs): ces = all_ces[ices] totsamples = int((ces.stop_time - ces.start_time) * args.sample_rate) # create the single TOD for this observation try: tod = TODGround( comm.comm_group, focalplane.detquats, totsamples, detranks=ndetrank, firsttime=ces.start_time, rate=args.sample_rate, site_lon=site.lon, site_lat=site.lat, site_alt=site.alt, azmin=ces.azmin, azmax=ces.azmax, el=ces.el, scanrate=args.scan_rate, scan_accel=args.scan_accel, cosecant_modulation=args.scan_cosecant_modulate, CES_start=None, CES_stop=None, sun_angle_min=args.sun_angle_min, coord=args.coord, sampsizes=None, report_timing=args.debug, ) except RuntimeError as e: raise RuntimeError("Failed to create the CES scan: {}".format(e)) # Create the (single) observation ob = {} ob["name"] = "CES-{}-{}-{}".format(ces.name, ces.scan, ces.subscan) ob["tod"] = tod if len(tod.subscans) > 0: ob["intervals"] = tod.subscans else: raise RuntimeError("{} has no valid intervals".format(ob["name"])) ob["baselines"] = None ob["noise"] = focalplane.noise ob["id"] = int(ces.mjdstart * 10000) data.obs.append(ob) for ob in data.obs: tod = ob["tod"] tod.free_azel_quats() if comm.comm_world is None or comm.comm_group.rank == 0: log.info("Group # {:4} has {} observations.".format( comm.group, len(data.obs))) if len(data.obs) == 0: raise RuntimeError("Too many tasks. Every MPI task must " "be assigned to at least one observation.") if comm.world_rank == 0: timer.report_clear("Simulate scans") return data
def setUp(self): fixture_name = os.path.splitext(os.path.basename(__file__))[0] if not toast_available: print( "toast cannot be imported ({})- skipping unit test".format( toast_import_error), flush=True, ) return self.outdir = None if MPI.COMM_WORLD.rank == 0: self.outdir = create_outdir(fixture_name) self.outdir = MPI.COMM_WORLD.bcast(self.outdir, root=0) toastcomm = toast.Comm() self.data = toast.Data(toastcomm) # Focalplane hwfull = get_example() dets = sim_telescope_detectors(hwfull, "SAT4") hwfull.data["detectors"] = dets hw = hwfull.select(match={ "wafer_slot": "w42", "band": "f030", "pixel": "00[01]" }) # print(hw.data["detectors"], flush=True) detquats = {k: v["quat"] for k, v in hw.data["detectors"].items()} # Samples per observation self.totsamp = 10000 # Scan properties self.site_lon = '-67:47:10' self.site_lat = '-22:57:30' self.site_alt = 5200. self.coord = 'C' self.azmin = 45 self.azmax = 55 self.el = 60 self.scanrate = 1.0 self.scan_accel = 0.1 self.CES_start = None # Noise properties self.rate = 100.0 self.NET = 1e-3 # 1 mK NET self.epsilon = 0.0 self.fmin = 1.0e-5 self.alpha = 1.0 self.fknee = 0.05 for ob in range(3): ftime = (self.totsamp / self.rate) * ob + 1564015655.88 tod = TODGround(self.data.comm.comm_group, detquats, self.totsamp, detranks=self.data.comm.group_size, firsttime=ftime, rate=self.rate, site_lon=self.site_lon, site_lat=self.site_lat, site_alt=self.site_alt, azmin=self.azmin, azmax=self.azmax, el=self.el, coord=self.coord, scanrate=self.scanrate, scan_accel=self.scan_accel, CES_start=self.CES_start) # Analytic noise model detnames = list(detquats.keys()) drate = {x: self.rate for x in detnames} dfmin = {x: self.fmin for x in detnames} dfknee = {x: self.fknee for x in detnames} dalpha = {x: self.alpha for x in detnames} dnet = {x: self.NET for x in detnames} nse = AnalyticNoise(rate=drate, fmin=dfmin, detectors=detnames, fknee=dfknee, alpha=dalpha, NET=dnet) # Single observation obs = dict() obs["tod"] = tod obs["noise"] = nse obs["id"] = 12345 obs["intervals"] = tod.subscans obs["site"] = "SimonsObs" obs["telescope"] = "SAT4" obs["site_id"] = 1 obs["telescope_id"] = 4 obs["fpradius"] = 5.0 obs["start_time"] = ftime obs["altitude"] = self.site_alt obs["name"] = "test_{:02}".format(ob) # Add a focalplane dictionary with just the detector index focalplane = {} for idet, det in enumerate(detnames): focalplane[det] = {"index": idet} obs["focalplane"] = focalplane # Add the observation to the dataset self.data.obs.append(obs) nse = toast.tod.OpSimNoise(out="signal", realization=0) nse.exec(self.data) return
def setUp(self): fixture_name = os.path.splitext(os.path.basename(__file__))[0] if not toast_available: print("toast cannot be imported- skipping unit tests", flush=True) return self.comm, self.procs, self.rank = get_world() self.outdir = create_outdir(fixture_name, comm=self.comm) toastcomm = toast.Comm() self.data = toast.Data(toastcomm) # Focalplane hwfull = get_example() dets = sim_telescope_detectors(hwfull, "SAT4") hwfull.data["detectors"] = dets hw = hwfull.select(match={ "wafer_slot": "w42", "band": "f030", "pixel": "00[01]" }) print(hw.data["detectors"], flush=True) detquats = {k: v["quat"] for k, v in hw.data["detectors"].items()} # Samples per observation self.totsamp = 10000 # Pixelization nside = 512 self.sim_nside = nside self.map_nside = nside # Scan properties self.site_lon = '-67:47:10' self.site_lat = '-22:57:30' self.site_alt = 5200. self.coord = 'C' self.azmin = 45 self.azmax = 55 self.el = 60 self.scanrate = 1.0 self.scan_accel = 0.1 self.CES_start = None # Noise properties self.rate = 100.0 self.NET = 5.0 self.epsilon = 0.0 self.fmin = 1.0e-5 self.alpha = 1.0 self.fknee = 0.05 tod = TODGround(self.data.comm.comm_group, detquats, self.totsamp, detranks=self.data.comm.group_size, firsttime=0.0, rate=self.rate, site_lon=self.site_lon, site_lat=self.site_lat, site_alt=self.site_alt, azmin=self.azmin, azmax=self.azmax, el=self.el, coord=self.coord, scanrate=self.scanrate, scan_accel=self.scan_accel, CES_start=self.CES_start) # Analytic noise model detnames = list(detquats.keys()) drate = {x: self.rate for x in detnames} dfmin = {x: self.fmin for x in detnames} dfknee = {x: self.fknee for x in detnames} dalpha = {x: self.alpha for x in detnames} dnet = {x: self.NET for x in detnames} nse = AnalyticNoise(rate=drate, fmin=dfmin, detectors=detnames, fknee=dfknee, alpha=dalpha, NET=dnet) # Single observation obs = dict() obs["tod"] = tod obs["noise"] = nse obs["id"] = 12345 obs["intervals"] = tod.subscans obs["site"] = "SimonsObs" obs["telescope"] = "SAT4" obs["site_id"] = 1 obs["telescope_id"] = 4 obs["fpradius"] = 5.0 obs["start_time"] = 0 obs["altitude"] = self.site_alt obs["name"] = "test" # Add the observation to the dataset self.data.obs.append(obs) return
def create_observation(args, comm, telescope, ces, verbose=True): """ Create a TOAST observation. Create an observation for the CES scan defined by all_ces_tot[ices]. """ focalplane = telescope.focalplane site = telescope.site totsamples = int((ces.stop_time - ces.start_time) * args.sample_rate) # create the TOD for this observation if comm.comm_group is not None: ndetrank = comm.comm_group.size else: ndetrank = 1 if args.el_nod_deg and (ces.subscan == 0 or args.el_nod_every_scan): el_nod = args.el_nod_deg else: el_nod = None # Create a list of detector break indices that avoids splitting detector pairs detlist = sorted(list(focalplane.detquats.keys())) detbreaks = [] last_det = None ndet_target = len(detlist) // ndetrank if ndet_target * ndetrank < len(detlist): ndet_target += 1 ndet = 0 for idet, det in enumerate(detlist): if ndet >= ndet_target and det[:-1] != last_det[:-1]: ndet = 0 detbreaks.append(idet) ndet += 1 last_det = det try: tod = TODGround( comm.comm_group, focalplane.detquats, totsamples, detranks=ndetrank, boresight_angle=ces.boresight_angle, firsttime=ces.start_time, rate=args.sample_rate, site_lon=site.lon, site_lat=site.lat, site_alt=site.alt, azmin=ces.azmin, azmax=ces.azmax, el=ces.el, el_nod=el_nod, start_with_elnod=args.start_with_el_nod, end_with_elnod=args.end_with_el_nod, el_mod_step=args.el_mod_step_deg, el_mod_rate=args.el_mod_rate_hz, el_mod_amplitude=args.el_mod_amplitude_deg, el_mod_sine=args.el_mod_sine, scanrate=args.scan_rate, scan_accel=args.scan_accel, scan_accel_el=args.scan_accel_el, cosecant_modulation=args.scan_cosecant_modulate, CES_start=None, CES_stop=None, sun_angle_min=args.sun_angle_min, coord=args.coord, sampsizes=None, report_timing=args.debug, hwprpm=args.hwp_rpm, hwpstep=args.hwp_step_deg, hwpsteptime=args.hwp_step_time_s, detbreaks=detbreaks, ) except RuntimeError as e: raise RuntimeError('Failed to create TOD for {}-{}-{}: "{}"' "".format(ces.name, ces.scan, ces.subscan, e)) # Create the observation obs = {} obs["name"] = "CES-{}-{}-{}-{}-{}".format(site.name, telescope.name, ces.name, ces.scan, ces.subscan) obs["tod"] = tod obs["baselines"] = None obs["noise"] = copy.deepcopy(focalplane.noise) obs["id"] = int(ces.mjdstart * 10000) obs["intervals"] = tod.subscans obs["site"] = site.name obs["site_id"] = site.id obs["telescope"] = telescope.name obs["telescope_id"] = telescope.id obs["fpradius"] = focalplane.radius obs["weather"] = site.weather obs["start_time"] = ces.start_time obs["altitude"] = site.alt obs["season"] = ces.season obs["date"] = ces.start_date obs["MJD"] = ces.mjdstart obs["focalplane"] = focalplane.detector_data obs["rising"] = ces.rising obs["mindist_sun"] = ces.mindist_sun obs["mindist_moon"] = ces.mindist_moon obs["el_sun"] = ces.el_sun return obs
def create_observation(args, comm, telescope, ces, noise, verbose=True): """ Create a TOAST observation. Create an observation for the CES scan defined by all_ces_tot[ices]. """ focalplane = telescope.focalplane site = telescope.site totsamples = int((ces.stop_time - ces.start_time) * args.sample_rate) # create the TOD for this observation if comm.comm_group is not None: ndetrank = comm.comm_group.size else: ndetrank = 1 try: tod = TODGround( comm.comm_group, focalplane.detquats, totsamples, detranks=ndetrank, firsttime=ces.start_time, rate=args.sample_rate, site_lon=site.lon, site_lat=site.lat, site_alt=site.alt, azmin=ces.azmin, azmax=ces.azmax, el=ces.el, scanrate=args.scan_rate, scan_accel=args.scan_accel, CES_start=None, CES_stop=None, sun_angle_min=args.sun_angle_min, coord=args.coord, sampsizes=None, report_timing=args.debug, hwprpm=args.hwp_rpm, hwpstep=args.hwp_step_deg, hwpsteptime=args.hwp_step_time_s, ) except RuntimeError as e: raise RuntimeError( 'Failed to create TOD for {}-{}-{}: "{}"' "".format(ces.name, ces.scan, ces.subscan, e) ) # Create the observation obs = {} obs["name"] = "CES-{}-{}-{}-{}-{}".format( site.name, telescope.name, ces.name, ces.scan, ces.subscan ) obs["tod"] = tod obs["baselines"] = None obs["noise"] = focalplane.noise obs["id"] = int(ces.mjdstart * 10000) obs["intervals"] = tod.subscans obs["site"] = site.name obs["site_id"] = site.id obs["telescope"] = telescope.name obs["telescope_id"] = telescope.id obs["fpradius"] = focalplane.radius obs["weather"] = site.weather obs["start_time"] = ces.start_time obs["altitude"] = site.alt obs["season"] = ces.season obs["date"] = ces.start_date obs["MJD"] = ces.mjdstart obs["focalplane"] = focalplane.detector_data obs["rising"] = ces.rising obs["mindist_sun"] = ces.mindist_sun obs["mindist_moon"] = ces.mindist_moon obs["el_sun"] = ces.el_sun return obs