def iter_alpha(i): alpha = alphas[i] pop = CosmicPopulation.complex(self.pop_size) pop.set_dist(model='vol_co', z_max=1.0, alpha=alpha) pop.set_lum(model='constant', value=1) if not np.isnan(w_mean): pop.set_w(model='lognormal', mean=w_mean, std=w_std) if not np.isnan(dm_igm_slope): pop.set_dm_igm(model='ioka', slope=dm_igm_slope) pop.set_dm_host(model='constant', value=dm_host) pop.generate() for si in sis: pop.set_si(model='constant', value=si) pop.gen_si() for li in lis: pop.set_lum(model='powerlaw', low=1e40, high=1e45, power=li) if not np.isnan(lum_min): pop.set_lum(model='powerlaw', low=lum_min, high=lum_max, index=li) pop.gen_lum() for survey in self.surveys: surv_pop = SurveyPopulation(pop, survey) # Get unique identifier mask = (self.so.df.par_set == 1) mask &= (self.so.df.run == run) mask &= (self.so.df.alpha == alpha) mask &= (self.so.df.si == si) mask &= (self.so.df.li == li) mask &= (self.so.df.survey == survey.name) uuid = self.so.df[mask].uuid.iloc[0] surv_pop.name = f'mc/run_{run}/{uuid}' surv_pop.save()
def adapt_pop(e): w_mean, w_std = e t_pop = deepcopy(pop) t_pop.set_w(model='lognormal', mean=w_mean, std=w_std) t_pop.gen_w() for survey in self.surveys: surv_pop = SurveyPopulation(t_pop, survey) # Get unique identifier mask = (self.so.df.par_set == 3) mask &= (self.so.df.run == run) mask &= (self.so.df.run == run) mask &= (self.so.df.w_mean == w_mean) mask &= (self.so.df.w_std == w_std) mask &= (self.so.df.survey == survey.name) uuid = self.so.df[mask].uuid.iloc[0] surv_pop.name = f'mc/run_{run}/{uuid}' surv_pop.save()
def get_survey_pop(pop, survey, overwrite=False): """Quickly get survey populations. Args: pop (CosmicPopulation): Population to survey survey (Survey): Survey to use overwrite (bool): Check whether a population has already been run. If overwrite is true, it will always make a new instance. Returns: pop: Desired population. """ observe = True # Check where a possible population would be located path = '' if isinstance(pop, str): name = f'{pop}_{survey.name}' path = paths.populations() + name + '.p' # Check if the file exists if not overwrite: if os.path.isfile(path): observe = False return unpickle(path) # If all else fails observe again if observe: if isinstance(pop, str): m = f'No survey population at {path}, yet no surveying requested' raise ValueError(m) surv_pop = SurveyPopulation(pop, survey) surv_pop.name = f'{pop.name}_{survey.name}' surv_pop.save() return surv_pop
def adapt_pop(e): dm_igm_slope, dm_host = e t_pop = deepcopy(pop) t_pop.set_dm_igm(model='ioka', slope=dm_igm_slope) t_pop.gen_dm_igm() t_pop.set_dm_host(model='constant', value=dm_host) t_pop.gen_dm_host() t_pop.frbs.dm = t_pop.frbs.dm_mw + t_pop.frbs.dm_igm t_pop.frbs.dm += t_pop.frbs.dm_host for survey in self.surveys: surv_pop = SurveyPopulation(t_pop, survey) # Get unique identifier mask = (self.so.df.par_set == 4) mask &= (self.so.df.run == run) mask &= (self.so.df.dm_igm_slope == dm_igm_slope) mask &= (self.so.df.dm_host == dm_host) mask &= (self.so.df.survey == survey.name) uuid = self.so.df[mask].uuid.iloc[0] surv_pop.name = f'mc/run_{run}/{uuid}' surv_pop.save()
def adapt_pop(e): li, lum_min, lum_max = e if lum_max < lum_min: return t_pop = deepcopy(pop) t_pop.set_lum(model='powerlaw', low=lum_min, high=lum_max, power=li) t_pop.gen_lum() for survey in self.surveys: surv_pop = SurveyPopulation(t_pop, survey) # Get unique identifier mask = (self.so.df.par_set == 2) mask &= (self.so.df.run == run) mask &= (self.so.df.li == li) mask &= (self.so.df.lum_min == lum_min) mask &= (self.so.df.lum_max == lum_max) mask &= (self.so.df.survey == survey.name) uuid = self.so.df[mask].uuid.iloc[0] surv_pop.name = f'mc/run_{run}/{uuid}' surv_pop.save()
if OBSERVE: for n in (35, 36, 37): if not CREATE: pop[n] = unpickle(f'sc-{n}') # Create Survey perfect = Survey('perfect-small', gain_pattern='gaussian', n_sidelobes=8) # Observe populations pop_obs[n] = SurveyPopulation(pop[n], perfect) pop_obs[n].name = f'sc-{n}-obs' pop_obs[n].rates() pop_obs[n].save() else: for n in (35, 36, 37): pop_obs[n] = unpickle(f'sc-{n}-obs') f, (ax1) = plt.subplots(1, 1) for n in pop_obs: pop = pop_obs[n] limit = 1e-9 s_peak = pop.frbs.s_peak
pop.set_lum(model='constant', value=1e36) pop.set_w(model='constant', value=1) pop.set_si(model='constant', value=0) pop.generate() pop_obs = {} survey = Survey('perfect-small') for pattern in BEAMPATTERNS: survey.set_beam(model=pattern, n_sidelobes=0, size=90) # Observe populations pop_obs[pattern] = SurveyPopulation(pop, survey) pop_obs[pattern].name = f'obs-{pattern}' pop_obs[pattern].source_rate print(pop_obs[pattern].source_rate) pop_obs[pattern].save() plot_aa_style() f, (ax1) = plt.subplots(1, 1) for p in BEAMPATTERNS: pop = pop_obs[p] limit = 1e-9 s_peak = pop.frbs.s_peak dm_igm = pop.frbs.dm_igm
r.set_emission_range(low=100e6, high=10e9) r.set_lum(model='powerlaw', per_source='different', low=1e40, high=1e45, power=0) r.set_si(model='gauss', mean=-1.4, std=1) r.set_w(model='lognormal', per_source='different', mean=0.1, std=1) rate = lognormal(ra, 1, int(n)) r.set_time(model='poisson', rate=rate) # Set up survey s = Survey('chime-frb', n_days=N_DAYS) s.set_beam(model='chime-frb') # Only generate FRBs in CHIME's survey region r.set_direction(model='uniform', min_ra=s.ra_min, max_ra=s.ra_max, min_dec=s.dec_min, max_dec=s.dec_max) r.generate() surv_pop = SurveyPopulation(r, s) surv_pop.name = 'cosmic_chime' print(surv_pop.source_rate) print(surv_pop.burst_rate) pprint(f'# one-offs: {surv_pop.n_one_offs()}') pprint(f'# repeaters: {surv_pop.n_repeaters()}')
pop.set_si(model='constant', value=0) pop.generate() pop_obs = {} survey = Survey('perfect-small') survey.beam_size_at_fwhm = 10. survey.set_beam(model='airy') for sidelobe in SIDELOBES: survey.set_beam(model='airy', n_sidelobes=sidelobe) # Observe populations pop_obs[sidelobe] = SurveyPopulation(pop, survey) pop_obs[sidelobe].name = f'obs-{sidelobe}' pop_obs[sidelobe].source_rate pop_obs[sidelobe].save() plot_aa_style() f, (ax1) = plt.subplots(1, 1) for p in SIDELOBES: pop = pop_obs[p] limit = 1e-9 s_peak = pop.frbs.s_peak dm_igm = pop.frbs.dm_igm mini = min(s_peak)
pop[si].save() else: pop[si] = copy.deepcopy(pop[min(SIS)]) pop[si].frbs.si = np.random.normal(si, 0, int(n_tot)) pop[si].name = f'si-{si}' pop[si].save() pop_obs = {} for si in SIS: perfect = Survey('perfect') # Observe populations pop_obs[si] = SurveyPopulation(pop[si], perfect) pop_obs[si].name = f'si-{si}-obs' pop_obs[si].rates() pop_obs[si].save() plot_aa_style() # Plot log N and alpha versus log S f, (ax1, ax2) = plt.subplots(2, 1, sharex=True) min_s = 1e99 max_s = -1e99 for si in SIS: pop = pop_obs[si]
"""Check the log N log F slope of a local population.""" import numpy as np import matplotlib.pyplot as plt from frbpoppy import CosmicPopulation, Survey, SurveyPopulation from frbpoppy.population import unpickle from tests.convenience import plot_aa_style, rel_path MAKE = True if MAKE: population = CosmicPopulation.simple(1e5, generate=True) survey = Survey('perfect') surv_pop = SurveyPopulation(population, survey) surv_pop.name = 'lognlogflocal' surv_pop.save() else: surv_pop = unpickle('lognlogflocal') # Get parameter parms = surv_pop.frbs.fluence min_p = min(parms) max_p = max(parms) # Bin up min_f = np.log10(min(parms)) max_f = np.log10(max(parms)) log_bins = np.logspace(min_f, max_f, 50) hist, edges = np.histogram(parms, bins=log_bins) n_gt_s = np.cumsum(hist[::-1])[::-1]
def main(): r = RepeaterPopulation(N, days=1, dm_host_model='gaussian', dm_host_mu=100, dm_host_sigma=0, dm_igm_index=1000, dm_igm_sigma=0, dm_mw_model='zero', emission_range=[10e6, 10e9], lum_range=[1e38, 1e38], lum_index=0, n_model='vol_co', alpha=-1.5, w_model='uniform', w_range=[1., 1.], w_mu=0.1, w_sigma=0.5, si_mu=-1.4, si_sigma=0., z_max=2.5, lum_rep_model='independent', lum_rep_sigma=1e3, si_rep_model='same', si_rep_sigma=0.1, times_rep_model='even', w_rep_model='independent', w_rep_sigma=0.05, generate=True) s = Survey('perfect') s.gain_pattern = 'perfect' # Setup pointings n_p = 1 # # of pointings decs = np.linspace(s.dec_min, s.dec_max, n_p + 2)[1:n_p + 1] ras = np.linspace(s.ra_min, s.ra_max, n_p + 2)[1:n_p + 1] s.pointings = list(zip(ras, decs)) pop = limit_ra_dec(r, s.pointings) pop.name = 'Cosmic Population' s.snr_limit = 1 surv_pop_low_snr = SurveyPopulation(r, s) surv_pop_low_snr.name = 'Low SNR' s.snr_limit = 10 surv_pop_high_snr = SurveyPopulation(r, s) surv_pop_high_snr.name = 'High SNR' pops = [pop] # Split population into seamingly one-off and repeater populations for pop in (surv_pop_low_snr, surv_pop_high_snr): mask = ((~np.isnan(pop.frbs.time)).sum(1) > 1) pop_ngt1, pop_nle1 = split_pop(pop, mask) pop_ngt1.name += ' (> 1 burst)' pop_nle1.name += ' (1 burst)' pops.append(pop_nle1) pops.append(pop_ngt1) plot(*pops, frbcat=False, mute=False, show=True)
dm_igm_sigma=0, dm_mw_model='zero', emission_range=[10e6, 10e9], lum_index=0, pulse_model='uniform', pulse_range=[1., 1.], pulse_mu=1., pulse_sigma=0.) population.name = 'test' # Setup a survey survey = Survey('perfect', gain_pattern='perfect') # Observe the FRB population surv_pop = SurveyPopulation(population, survey) surv_pop.name = 'lognlogslocal' surv_pop.save() else: surv_pop = unpickle('lognlogslocal') parms = surv_pop.frbs.fluence min_p = min(parms) max_p = max(parms) # Bin up min_f = np.log10(min(parms)) max_f = np.log10(max(parms)) log_bins = np.logspace(min_f, max_f, 50) hist, edges = np.histogram(parms, bins=log_bins) n_gt_s = np.cumsum(hist[::-1])[::-1]
pop_obs = {} if OBSERVE: if not CREATE: pop = unpickle(f'simple') for n in SIDELOBES: # Create Survey survey = Survey('perfect-small', gain_pattern='airy', n_sidelobes=n) # Observe populations pop_obs[n] = SurveyPopulation(pop, survey) pop_obs[n].name = f'obs-airy-{n}' pop_obs[n].rates() pop_obs[n].save() else: for n in SIDELOBES: pop_obs[n] = unpickle(f'obs-airy-{n}') f, (ax1) = plt.subplots(1, 1) for sidelobe in SIDELOBES: pop = pop_obs[sidelobe] limit = 1e-9 s_peak = pop.frbs.s_peak