) parser.add_argument("--full-stats", action="store_true") args = parser.parse_args() comm = mpi.COMM_WORLD srate = 400. fmax = srate / 2 ndet = 32 * 33 utils.mkdir(args.odir) tmp = [[float(tok) for tok in word.split(":")] for word in args.f.split(",")] bins = np.array([[t[0] - t[1] / 2, t[0] + t[1] / 2] for t in tmp]) rate = [float(w) for w in args.R.split(":")] filedb.init() ids = filedb.scans[args.sel] ntod = len(ids) cuts = np.zeros([ntod, ndet], dtype=np.uint8) stats = None if args.full_stats: stats = np.zeros([ntod, ndet, 4]) for si in range(comm.rank, ntod, comm.size): try: id = ids[si] entry = filedb.data[id] ofile = "%s/%s.txt" % (args.odir, id) try: d = actdata.read( entry, fields=["gain", "tconst", "cut", "tod", "boresight", "hwp"])
def get_scans(area, signal, bore, dets, noise, seed=0, real=None, noise_override=None): scans = [] # Get real scan information if necessary L.debug("real") if real: real_scans = [] filedb.init() db = filedb.data ids = fileb.scans[real].ids for id in ids: try: real_scans.append(actscan.ACTScan(db[id])) except errors.DataMissing as e: L.debug("Skipped %s (%s)" % (id, str(e))) # Dets L.debug("dets") sim_dets = [] toks = dets.split(":") if toks[0] == "scattered": ngroup, nper, rad = int(toks[1]), int(toks[2]), float(toks[3]) sim_dets = [scansim.dets_scattered(ngroup, nper,rad=rad*np.pi/180/60)] margin = rad*np.pi/180/60 elif toks[0] == "real": ndet = int(toks[1]) dslice = slice(0,ndet) if ndet > 0 else slice(None) sim_dets = [bunch.Bunch(comps=s.comps[dslice], offsets=s.offsets[dslice]) for s in real_scans] margin = np.max([np.sum(s.offsets**2,1)**0.5 for s in sim_dets]) else: raise ValueError # Boresight. Determines our number of scans L.debug("bore") sim_bore = [] toks = bore.split(":") if toks[0] == "grid": nscan, density, short = int(toks[1]), float(toks[2]), float(toks[3]) for i in range(nscan): tbox = shorten(area.box(),i%2,short) sim_bore.append(scansim.scan_grid(tbox, density*np.pi/180/60, dir=i, margin=margin)) elif toks[0] == "ces": nscan = int(toks[1]) azs = [float(w)*utils.degree for w in toks[2].split(",")] els = [float(w)*utils.degree for w in toks[3].split(",")] mjd0 = float(toks[4]) dur = float(toks[5]) azrate= float(toks[6]) if len(toks) > 6 else 1.5*utils.degree srate = float(toks[7]) if len(toks) > 7 else 400 nsamp = utils.nint(dur*srate) for i in range(nscan): mjd = mjd0 + dur*(i//(2*len(els)))/(24*3600) el = els[(i//2)%len(els)] az1, az2 = azs if i%2 == 1: az1, az2 = -az2, -az1 box = np.array([[az1,el],[az2,el]]) sim_bore.append(scansim.scan_ceslike(nsamp, box, mjd0=mjd, srate=srate, azrate=azrate)) elif toks[0] == "real": sim_bore = [bunch.Bunch(boresight=s.boresight, hwp_phase=s.hwp_phase, sys=s.sys, site=s.site, mjd0=s.mjd0) for s in real_scans] else: raise ValueError nsim = len(sim_bore) # Make one det info per scan sim_dets = sim_dets*(nsim/len(sim_dets))+sim_dets[:nsim%len(sim_dets)] # Noise L.debug("noise") sim_nmat = [] toks = noise.split(":") nonoise = False if toks[0] == "1/f": sigma, alpha, fknee = [float(v) for v in toks[1:4]] nonoise = sigma < 0 for i in range(nsim): sim_nmat.append(scansim.oneoverf_noise(sim_dets[i].comps.shape[0], sim_bore[i].boresight.shape[0], sigma=np.abs(sigma), alpha=alpha, fknee=fknee)) elif toks[0] == "detcorr": sigma, alpha, fknee = [float(v) for v in toks[1:4]] nonoise = sigma < 0 for i in range(nsim): sim_nmat.append(scansim.oneoverf_detcorr_noise(sim_dets[i].comps.shape[0], sim_bore[i].boresight.shape[0], sigma=np.abs(sigma), alpha=alpha, fknee=fknee)) elif toks[0] == "real": scale = 1.0 if len(toks) < 2 else float(toks[1]) for i,s in enumerate(real_scans): ndet = len(sim_dets[i].offsets) nmat = s.noise[:ndet]*scale**-2 sim_nmat.append(nmat) else: raise ValueError noise_scale = not nonoise if noise_override is None else noise_override sim_nmat = sim_nmat*(nsim/len(sim_nmat))+sim_nmat[:nsim%len(sim_nmat)] # Signal L.debug("signal") toks = signal.split(":") if toks[0] == "none": for i in range(nsim): scans.append(scansim.SimPlain(sim_bore[i], sim_dets[i], sim_nmat[i], seed=seed+i, noise_scale=noise_scale)) elif toks[0] == "ptsrc": # This one always operates in the same coordinates as nsrc, amp, fwhm = int(toks[1]), float(toks[2]), float(toks[3]) np.random.seed(seed) sim_srcs = scansim.rand_srcs(area.box(), nsrc, amp, abs(fwhm)*np.pi/180/60, rand_fwhm=fwhm<0) for i in range(nsim): scans.append(scansim.SimSrcs(sim_bore[i], sim_dets[i], sim_srcs, sim_nmat[i], seed=seed+i, noise_scale=noise_scale)) elif toks[0] == "vsrc": # Create a single variable source ra, dec, fwhm = float(toks[1])*np.pi/180, float(toks[2])*np.pi/180, float(toks[3])*np.pi/180/60 amps = [float(t) for t in toks[4].split(",")] for i in range(nsim): sim_srcs = bunch.Bunch(pos=np.array([[dec,ra]]),amps=np.array([[amps[i],0,0,0]]), beam=np.array([fwhm/(8*np.log(2)**0.5)])) scans.append(scansim.SimSrcs(sim_bore[i], sim_dets[i], sim_srcs, sim_nmat[i], seed=seed+i, noise_scale=noise_scale, nsigma=20)) elif toks[0] == "cmb": np.random.seed(seed) ps = powspec.read_spectrum(toks[1]) sim_map = enmap.rand_map(area.shape, area.wcs, ps) for i in range(nsim): scans.append(scansim.SimMap(sim_bore[i], sim_dets[i], sim_map, sim_nmat[i], seed=seed+i, noise_scale=noise_scale)) else: raise ValueError return scans
from enact import filedb, actdata config.default("cut_mostly_cut",False) parser = config.ArgumentParser(os.environ["HOME"] + "/.enkirc") parser.add_argument("sel") parser.add_argument("odir") parser.add_argument("prefix", nargs="?", default=None) parser.add_argument("-b", "--nbin", type=int, default=20000) parser.add_argument("-f", "--fmax", type=float, default=200) parser.add_argument("-B", "--nbin-det", type=int, default=100) parser.add_argument("-Z", "--nbin-zoom", type=int, default=100) parser.add_argument("-F", "--fmax-zoom", type=float, default=10) parser.add_argument("-C", "--chunk-size", type=int, default=250) parser.add_argument("--no-autocut", action="store_true") args = parser.parse_args() filedb.init() ids = filedb.scans[args.sel] comm = mpi.COMM_WORLD ntod = len(ids) csize = args.chunk_size nchunk= (ntod+csize-1)/csize dtype = np.float32 utils.mkdir(args.odir) prefix = args.odir + "/" if args.prefix: prefix += args.prefix + "_" # Read a single array_info to determine max det number array_info = actdata.read_array_info(filedb.data[ids[0]]).array_info ndet = array_info.ndet
def get_scans(area, signal, bore, dets, noise, seed=0, real=None, noise_override=None): scans = [] # Get real scan information if necessary L.debug("real") if real: real_scans = [] filedb.init() db = filedb.data ids = fileb.scans[real].ids for id in ids: try: real_scans.append(actscan.ACTScan(db[id])) except errors.DataMissing as e: L.debug("Skipped %s (%s)" % (id, e.message)) # Dets L.debug("dets") sim_dets = [] toks = dets.split(":") if toks[0] == "scattered": ngroup, nper, rad = int(toks[1]), int(toks[2]), float(toks[3]) sim_dets = [scansim.dets_scattered(ngroup, nper,rad=rad*np.pi/180/60)] margin = rad*np.pi/180/60 elif toks[0] == "real": ndet = int(toks[1]) dslice = slice(0,ndet) if ndet > 0 else slice(None) sim_dets = [bunch.Bunch(comps=s.comps[dslice], offsets=s.offsets[dslice]) for s in real_scans] margin = np.max([np.sum(s.offsets**2,1)**0.5 for s in sim_dets]) else: raise ValueError # Boresight. Determines our number of scans L.debug("bore") sim_bore = [] toks = bore.split(":") if toks[0] == "grid": nscan, density, short = int(toks[1]), float(toks[2]), float(toks[3]) for i in range(nscan): tbox = shorten(area.box(),i%2,short) sim_bore.append(scansim.scan_grid(tbox, density*np.pi/180/60, dir=i, margin=margin)) elif toks[0] == "ces": nscan = int(toks[1]) azs = [float(w)*utils.degree for w in toks[2].split(",")] els = [float(w)*utils.degree for w in toks[3].split(",")] mjd0 = float(toks[4]) dur = float(toks[5]) azrate= float(toks[6]) if len(toks) > 6 else 1.5*utils.degree srate = float(toks[7]) if len(toks) > 7 else 400 nsamp = utils.nint(dur*srate) for i in range(nscan): mjd = mjd0 + dur*(i//(2*len(els)))/(24*3600) el = els[(i//2)%len(els)] az1, az2 = azs if i%2 == 1: az1, az2 = -az2, -az1 box = np.array([[az1,el],[az2,el]]) sim_bore.append(scansim.scan_ceslike(nsamp, box, mjd0=mjd, srate=srate, azrate=azrate)) elif toks[0] == "real": sim_bore = [bunch.Bunch(boresight=s.boresight, hwp_phase=s.hwp_phase, sys=s.sys, site=s.site, mjd0=s.mjd0) for s in real_scans] else: raise ValueError nsim = len(sim_bore) # Make one det info per scan sim_dets = sim_dets*(nsim/len(sim_dets))+sim_dets[:nsim%len(sim_dets)] # Noise L.debug("noise") sim_nmat = [] toks = noise.split(":") nonoise = False if toks[0] == "1/f": sigma, alpha, fknee = [float(v) for v in toks[1:4]] nonoise = sigma < 0 for i in range(nsim): sim_nmat.append(scansim.oneoverf_noise(sim_dets[i].comps.shape[0], sim_bore[i].boresight.shape[0], sigma=np.abs(sigma), alpha=alpha, fknee=fknee)) elif toks[0] == "detcorr": sigma, alpha, fknee = [float(v) for v in toks[1:4]] nonoise = sigma < 0 for i in range(nsim): sim_nmat.append(scansim.oneoverf_detcorr_noise(sim_dets[i].comps.shape[0], sim_bore[i].boresight.shape[0], sigma=np.abs(sigma), alpha=alpha, fknee=fknee)) elif toks[0] == "real": scale = 1.0 if len(toks) < 2 else float(toks[1]) for i,s in enumerate(real_scans): ndet = len(sim_dets[i].offsets) nmat = s.noise[:ndet]*scale**-2 sim_nmat.append(nmat) else: raise ValueError noise_scale = not nonoise if noise_override is None else noise_override sim_nmat = sim_nmat*(nsim/len(sim_nmat))+sim_nmat[:nsim%len(sim_nmat)] # Signal L.debug("signal") toks = signal.split(":") if toks[0] == "none": for i in range(nsim): scans.append(scansim.SimPlain(sim_bore[i], sim_dets[i], sim_nmat[i], seed=seed+i, noise_scale=noise_scale)) elif toks[0] == "ptsrc": # This one always operates in the same coordinates as nsrc, amp, fwhm = int(toks[1]), float(toks[2]), float(toks[3]) np.random.seed(seed) sim_srcs = scansim.rand_srcs(area.box(), nsrc, amp, abs(fwhm)*np.pi/180/60, rand_fwhm=fwhm<0) for i in range(nsim): scans.append(scansim.SimSrcs(sim_bore[i], sim_dets[i], sim_srcs, sim_nmat[i], seed=seed+i, noise_scale=noise_scale)) elif toks[0] == "vsrc": # Create a single variable source ra, dec, fwhm = float(toks[1])*np.pi/180, float(toks[2])*np.pi/180, float(toks[3])*np.pi/180/60 amps = [float(t) for t in toks[4].split(",")] for i in range(nsim): sim_srcs = bunch.Bunch(pos=np.array([[dec,ra]]),amps=np.array([[amps[i],0,0,0]]), beam=np.array([fwhm/(8*np.log(2)**0.5)])) scans.append(scansim.SimSrcs(sim_bore[i], sim_dets[i], sim_srcs, sim_nmat[i], seed=seed+i, noise_scale=noise_scale, nsigma=20)) elif toks[0] == "cmb": np.random.seed(seed) ps = powspec.read_spectrum(toks[1]) sim_map = enmap.rand_map(area.shape, area.wcs, ps) for i in range(nsim): scans.append(scansim.SimMap(sim_bore[i], sim_dets[i], sim_map, sim_nmat[i], seed=seed+i, noise_scale=noise_scale)) else: raise ValueError return scans