示例#1
0
        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()
示例#2
0
        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()
示例#3
0
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
示例#4
0
        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()
示例#5
0
        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()
示例#6
0
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
示例#8
0
        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()}')
示例#9
0
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]
示例#11
0
"""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]
示例#12
0
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)
示例#13
0
                                  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]
示例#14
0
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