@@ -156,19 +156,15 @@ def run_simulation(param_df):
156
156
# build demographic command line
157
157
demo_events = demo_config (param_df )
158
158
159
- ne0 = np .random .choice (scaled_Ne )
160
- mu_t = np .random .choice (mu )
161
- rec_t = np .random .choice (rec )
162
- pfileout .write (f"{ ne0 } \t { mu_t } \t { rec_t } \n " )
163
159
# check demo
164
160
if dry_run :
165
161
checkDemo (pops , demo_events )
166
162
return None
167
163
else :
168
164
trees = msp .simulate (
169
- Ne = ne0 ,
170
- recombination_rate = rec_t ,
171
- mutation_rate = mu_t ,
165
+ Ne = param_df [ "ne_t" ] ,
166
+ recombination_rate = param_df [ " rec_t" ] ,
167
+ mutation_rate = param_df [ " mu_t" ] ,
172
168
num_replicates = model_dt ["loci" ],
173
169
length = model_dt ["contig_length" ],
174
170
population_configurations = pops ,
@@ -209,7 +205,8 @@ def checkDemo(pops, demo_events):
209
205
210
206
211
207
def simulate_msprime (model_dict , demo_dataframe , param_df , sim_number : int ,
212
- outfile : str , nprocs : int , stats_config : str , dryrun : bool ):
208
+ outfile : str , nprocs : int , stats_config : str , dryrun : bool ,
209
+ order : bool ):
213
210
"""Run code for simulating msprime.
214
211
215
212
Parameters
@@ -260,61 +257,80 @@ def simulate_msprime(model_dict, demo_dataframe, param_df, sim_number: int,
260
257
261
258
# set mutation rate
262
259
global mu
260
+ l_mu = np .nan
263
261
mut_rate = model_dt ["mutation_rate" ]
264
262
if type (mut_rate ) is list :
265
263
if len (mut_rate ) == 2 :
266
264
low , high = mut_rate
267
265
mu = np .random .uniform (low , high , sim_number )
268
266
else :
269
267
mu = mut_rate
268
+ if order :
269
+ l_mu = len (mu )
270
270
else :
271
- mu = [mut_rate ]
271
+ mu = [mut_rate ] * sim_number
272
272
273
273
# set recombination rate
274
274
global rec
275
+ l_rec = np .nan
275
276
rec_rate = model_dt ["recombination_rate" ]
276
277
if type (rec_rate ) is list :
277
278
if len (rec_rate ) == 2 :
278
279
low , high = rec_rate
279
280
rec = np .random .uniform (low , high , sim_number )
281
+ # rec = np.random.exponential(rec_rate, sim_number)
280
282
else :
281
283
rec = rec_rate
284
+ if order :
285
+ l_rec = len (rec )
282
286
else :
283
- # rec = np.random.exponential(rec_rate, sim_number)
284
- rec = [rec_rate ]
287
+ rec = [rec_rate ] * sim_number
285
288
286
289
# set ploidy
287
290
global ploidy
288
291
ploidy = model_dt ["ploidy" ]
289
292
290
293
# set effective pop size
291
294
global scaled_Ne
295
+ l_ne = np .nan
292
296
effective_size = model_dt ["eff_size" ]
293
297
if type (effective_size ) is list :
294
298
if len (effective_size ) == 2 :
295
299
low , high = effective_size
296
300
scaled_Ne = np .random .randint (low , high , sim_number ) * ploidy
297
301
else :
298
302
scaled_Ne = effective_size
303
+ if order :
304
+ l_ne = len (scaled_Ne )
299
305
else :
300
- scaled_Ne = [effective_size * ploidy ]
301
- global pfileout
302
- pfileout = open (f"{ outfile } .ne_mu_rec.out" , 'w' )
306
+ scaled_Ne = [effective_size * ploidy ] * sim_number
303
307
# =========================================================================
304
308
# Main simulations
305
309
# =========================================================================
306
310
# set up generator fx for MP
311
+ if order :
312
+ l_min = np .nanmin ([l_mu , l_rec , l_ne ])
313
+ sim_number = int (l_min )
314
+ print (f"order requested, setting sim_number to shortest param file: { l_min } " )
315
+
316
+ with open (f"{ outfile } .ne_mu_rec.out" , 'w' ) as pfile :
317
+ pfile .write ("Ne\t mu\t rec\n " )
318
+ for i in range (sim_number ):
319
+ pfile .write (f"{ int (scaled_Ne [i ])} \t { mu [i ]} \t { rec [i ]} \n " )
320
+
307
321
event = param_df ["event" ].values
308
322
pops = param_df ["pops" ].values
309
323
time_arr = list (zip (* param_df ["time" ].values ))
310
324
value_arr = list (zip (* param_df ["value" ].values ))
311
- param_gen = ({"time" : time_arr [i ], "event" : event , "pops" : pops , "value" : value_arr [i ]} for i in range (sim_number ))
325
+ param_gen = ({"ne_t" : scaled_Ne [i ], "mu_t" : mu [i ], "rec_t" : rec [i ],
326
+ "time" : time_arr [i ], "event" : event , "pops" : pops , "value" : value_arr [i ]} for i in range (sim_number ))
327
+ # param_gen = ({"time": time_arr[i], "event": event, "pops": pops, "value": value_arr[i]} for i in range(sim_number))
312
328
param_gen = list (param_gen )
329
+
313
330
# check nprocs
314
331
if nprocs > multiprocessing .cpu_count (): # check that there are not more requested than available
315
332
print ("not {nprocs} processors available, setting to {multiprocessing.cpu_count()}" )
316
333
nprocs = multiprocessing .cpu_count ()
317
-
318
334
# perform sims
319
335
global stats_dt
320
336
global header_len
@@ -349,4 +365,3 @@ def simulate_msprime(model_dict, demo_dataframe, param_df, sim_number: int,
349
365
pops_outfile .close ()
350
366
else :
351
367
print ("No stats file given with msprime" )
352
- pfileout .close ()
0 commit comments