Revision a4cfb2b4fd66579f63ea5a150a0f9b1b21b89a83 authored by annikc on 16 June 2021, 22:29:30 UTC, committed by annikc on 16 June 2021, 22:29:30 UTC
0 parent
Raw File
run_sim.py
from __future__ import division
import os
import numpy as np
from elephant.spike_train_generation import homogeneous_poisson_process
from quantities import Hz, s, ms
import util
pd = util.params_dict

np.random.seed(1234)

load_data = False
if load_data:
	dose_response = np.load('condition_1/doseresponse.npy').item()
else:
	dose_response = {}

def run_sim(pd, **kwargs):
	event_hz = kwargs.get('event_hz', pd['event_hz']) ## must be list
	recov_means = kwargs.get('recov_means', pd['recov_means']) ## must be list

	savedata = kwargs.get('savedata', True)

	num_runs    = 10                                  # number of runs to average over 

	track_pct_mm_dict = {}
	for i in range(len(recov_means)):
		if savedata:
			directory = './data/MeanRecovTimes/{}sec/'.format(recov_means[i])
			if not os.path.exists(directory):
				os.makedirs(directory)
			savedir = kwargs.get('savedir', directory)
		print( "     Series of {} runs for mean mito reocvery of {}".format(num_runs*len(event_hz), recov_means[i]) )
		# set up dictionary to store days data for each frequency
		track_pct_mm_frq = {}
		# step over different frequencies
		for j in range(len(event_hz)):
			event_freq = event_hz[j]
			print('Beginning {} runs at {} Hz:'.format(num_runs, event_freq))
			spiketrain_list = []
			
			# set up list to store mobile fraction data for each day
			track_pct_mm = []
			#step over number of example runs
			for k in range(num_runs):
				# Create list of mitochondria objects with freezing times drawn from distribution 
				mito_list = util.populate_list_n(pd['mito_pop'], pd['MM_pct_init'], recov_means[i], pd['recov_sd'])
		
				pct_mm = []
				day = homogeneous_poisson_process(rate    = event_freq*Hz,
												  t_start = 1*s,
												  t_stop  = pd['day_seconds']*s, 
												  as_array= True)
				spiketrain_list.append(day)

				synaptic_event_times = spiketrain_list[k]
				#step over seconds of the day 
				for t in range(pd['day_seconds']):
					if t in [int(np.round(x)) for x in synaptic_event_times]:
						#generate percentage affected by syn event
						frac_immobilized = np.random.normal(loc=pd['event_mean'], scale=pd['event_sd'])
						#select mitochondria to immobilize
						immobilized_ind = np.random.choice(pd['mito_pop'], int(np.round(pd['mito_pop']*frac_immobilized)))
						for m in immobilized_ind:
							mito_list[m].freeze(t)
					for m in range(pd['mito_pop']):
						mito_list[m].release(t)

					mobile_frac = util.calc_frac_mm(mito_list)
					pct_mm.append(mobile_frac)

				# save mobile fraction data for the day 
				track_pct_mm.append(pct_mm)
				if k == 0:
					print( "Finished 1...", end=" ")
				elif k < num_runs-1:
					print ("{}...".format(k+1), end=" ")
				else:
					print('{}'.format(k+1))

			# store data for each frequency 
			track_pct_mm_frq[str(event_hz[j])] = track_pct_mm


		#store data for each mito recovery average condition
		track_pct_mm_dict[str(recov_means[i])] = track_pct_mm_frq
		if savedata: 
			np.save(savedir+f'{recov_means[i]}_{event_hz[0]}to{event_hz[-1]}_data.npy',track_pct_mm_frq)
		print( "Done runs for mean mito recovery of {} \n==================".format(recov_means[i]))

	return(track_pct_mm_dict)        
back to top