Selective sweeps#
import fwdpy11.conditional_models
import fwdpy11.tskit_tools
From a new mutation#
ALPHA = 1000.0
rng = fwdpy11.GSLrng(12345)
pop, params = setup()
mutation_data = fwdpy11.conditional_models.NewMutationParameters(
frequency=fwdpy11.conditional_models.AlleleCount(1),
data=fwdpy11.NewMutationData(effect_size=ALPHA / 2 / pop.N, dominance=1),
position=fwdpy11.conditional_models.PositionRange(left=0.49, right=0.51),
)
output = fwdpy11.conditional_models.selective_sweep(
rng,
pop,
params,
mutation_data,
fwdpy11.conditional_models.GlobalFixation()
)
assert output.pop.generation == params.simlen
assert pop.generation == 0
print(output.pop.mutations[output.mutation_index])
Mutation[position:0.507803, effect size:1.000000, dominance:1.000000, origin time:0, label:0]
for fixation, time in zip(output.pop.fixations, output.pop.fixation_times):
print(fixation, time)
Mutation[position:0.507803, effect size:1.000000, dominance:1.000000, origin time:0, label:0] 30
FIXATION_TIME = output.pop.fixation_times[0]
Recording the generation when fixation happened#
rng = fwdpy11.GSLrng(12345)
output = fwdpy11.conditional_models.selective_sweep(
rng,
pop,
params,
mutation_data,
fwdpy11.conditional_models.GlobalFixation(),
sampling_policy=fwdpy11.conditional_models.AncientSamplePolicy.COMPLETION,
)
assert len(output.pop.ancient_sample_nodes) == 2 * output.pop.N
assert output.pop.fixation_times[output.mutation_index] == FIXATION_TIME
node_array = np.array(output.pop.tables.nodes, copy=False)
ancient_sample_node_times = \
node_array["time"][output.pop.ancient_sample_nodes]
assert np.all([ancient_sample_node_times == \
output.pop.fixation_times[output.mutation_index]])
From a standing variant#
The recipes for a standing variant are identical to those show above, except that one uses fwdpy11.conditional_models.AlleleCountRange or fwdpy11.conditional_models.FrequencyRange to specify the starting frequencies.