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
util.py
import numpy as np 

dend_L 		= 70
event_range = [1,2]                                 # um affected by synaptic events
event_min   = event_range[0]/dend_L                 # min percentage of dendrite affected by synaptic event
event_max   = event_range[1]/dend_L                 # max percentage of dendrite affected by synaptic event
event_mean  = event_min + (event_max - event_min)/2 # mean percentage of dendrite affected by synaptic event
event_sd    = (event_max - event_mean)/3   

density 	= 1/4
mito_pop 	= 500
MM_pct_init = 1

days 		= 5
day_seconds = 1500 

event_hz 	= [0.001, 0.012, 0.035, 0.058, 0.081, 0.104, 0.127, 0.15, 0.25, 0.35, 0.5]
recov_means = np.array([1,2,3,4,5,6,7,8,9,10,15,20,25])*60
recov_sd 	= 2.5*60

params_dict = {'day_seconds':  day_seconds,
				'days':        days,
				'density':     density,      # density of mitochondria (number/um)
				'dend_L':      dend_L,       # length of dendrite (um)
				'event_range': event_range,  # um affected by synaptic events
				'event_min':   event_min,    # min percentage of dendrite affected by synaptic event
				'event_max':   event_max,    # max percentage of dendrite affected by synaptic event
				'event_mean':  event_mean,   # mean percentage of dendrite affected by synaptic event
				'event_sd':    event_sd,     # 99% of distr covered by 3sd
				'mito_pop':    mito_pop, 		 
				'MM_pct_init': MM_pct_init,  # proportion of mobile mitochondria at t = 0
				'recov_means': recov_means,  # Mean and sd of recovery times for normally distributed mitos
				'recov_sd':    recov_sd,
				'event_hz':    event_hz
}



## Define Mitochondrion Objects to populate list
class mitochondrion(object):
    def __init__(self, MM_stop, mobile):
        self.mobile 			= mobile
        self.time_immobilized 	= 0
        self.MM_stop 			= MM_stop
        self.freeze_counter 	= 0 
        
    def freeze(self, time):
        '''immobilize mitochondria 
        each object gets time at which it receives synaptic signal
        if already frozen, continues to freeze
        '''
        self.mobile 			= False
        self.time_immobilized 	= time
        self.freeze_counter		+=1
        
    def release(self,time):
        if time == self.time_immobilized+self.MM_stop+(self.freeze_counter):
            self.mobile = True
            self.time_immobilized = np.nan

# normal distribution
def populate_list_n(mito_pop, MM_pct_init, mean_stop, sd_stop):
    mito_list = []         # initialize list storing instances of mitochondrion class
    noisy_recovery = True # option for giving different mitochondria different recovery times (drawn from normal distribution around mean = fast_stop and sd = 0.1*fast_stop)

    for i in range(mito_pop):
        if noisy_recovery == True: 
            #normal 
            recovery_time = int(np.round(np.random.normal(loc=mean_stop, scale=sd_stop))) # distribution for determining recovery for mobile mitos (~seconds or minutes)
        else:
            recovery_time = mean_stop
        mobility = np.random.choice([0,1],1,p=[1-MM_pct_init,MM_pct_init])
        if recovery_time<0:
            recovery_time = 5
        mito_list.append(mitochondrion(recovery_time, mobility))
        
    return mito_list

# calculate fraction of mitochondria that are mobile            
def calc_frac_mm(mito_list):
    pop = len(mito_list)
    mobile_num = 0
    for k in mito_list:
        if k.mobile == True:
            mobile_num += 1
    mobile_frac = mobile_num/pop   
    return mobile_frac

# calculate a running mean over a list or array (effectively smooths noisy data)
def running_mean(l, N):
    sum = 0
    result = list( 0 for x in l)

    for i in range( 0, N ):
        sum = sum + l[i]
        result[i] = sum / (i+1)

    for i in range( N, len(l) ):
        sum = sum - l[i-N] + l[i]
        result[i] = sum / N

    return result




### Junkyard

# bimodal distribution
def populate_list_bimodal(mito_pop, MM_pct_init, fast_stop, slow_stop):
    mito_list = []         # initialize list storing instances of mitochondrion class
    noisy_recovery = True # option for giving different mitochondria different recovery times (drawn from normal distribution around mean = fast_stop and sd = 0.1*fast_stop)

    for i in range(mito_pop):
        if noisy_recovery == True: 
            fast_recovery_time = int(np.round(np.random.normal(loc=fast_stop, scale=0.15*fast_stop))) # distribution for determining recovery for mobile mitos (~seconds or minutes)
            slow_recovery_time = int(np.round(np.random.normal(loc=slow_stop, scale=0.1*slow_stop))) # distribution for determining recovery time for immobile mitos (~day)

        else:
            fast_recovery_time = fast_stop
            slow_recovery_time = slow_stop
        mobility = np.random.choice([0,1],1,p=[1-MM_pct_init,MM_pct_init])
        if mobility == 0:
            recovery_time = slow_recovery_time
        else:
            recovery_time = fast_recovery_time
        mito_list.append(mitochondrion(recovery_time, mobility))
    return mito_list
back to top