import numpy as np
import PropensityFunctions as Propensity
import CoreClasses as Core
import ReplicatorFunctions as Rep
import random
[docs]def pick_reaction(dice_roll, CRS, concentrations, **kwargs):
''' Picks a reaction to occur stochastically
Arguements:
- dice_roll: float which should be a number between zero and the total propensity of reactions
- CRS: the CRS object which contains all possible reactions and molecules
- concentrations: the list of concentrations indexed by molecule ID
- propensity_function: which propensity function to use, default: standard
Return:
- rxn: a Reaction object'''
checkpoint = 0.0
for rxn in CRS.reactions:
reactant_concentrations = [concentrations[i] for i in rxn.reactants]
catalyst_concentrations = [concentrations[i] for i in rxn.catalysts]
reactant_coeff = rxn.reactant_coeff
catalyzed_constants = rxn.catalyzed_constants
#print rxn.catalysts
if rxn.prop == 'STD':
# print "Reactant concentrations: ", reactant_concentrations
# print 'Product ID numbers: ',rxn.products
checkpoint += Propensity.standard_propensity(rxn, CRS, concentrations)
#print "dice_roll: ", dice_roll, ' checkpoint: ', checkpoint
if checkpoint >= dice_roll:
break
elif rxn.prop == 'RCM':
mu = kwargs ['mu']
#print mu
checkpoint += Propensity.replicator_composition_propensity_envMutation(rxn, CRS, concentrations, mu = mu)
#print "dice_roll: ", dice_roll, ' checkpoint: ', checkpoint
if checkpoint >= dice_roll:
mutation_dice_roll = random.random()*Propensity.replicator_composition_propensity_envMutation(rxn, CRS, concentrations, mu = mu)
rep_rxn = Rep.pick_replicator(mutation_dice_roll, rxn, CRS, concentrations, mu = mu)
rxn = rep_rxn
break
#raw_input("Enter")
return rxn
[docs]def execute_rxn(rxn, CRS, concentrations):
''' Executes a single reaction instance
Arguements:
- rxn: Reaction object to execute_rxn
- CRS: CRS object containing the entire system
- concentrations: list of molecule concentrations indexed by ID
Return:
- concentrations: updated list of molecule concentrations indexed by ID '''
num_reactants = len(rxn.reactants)
num_products = len(rxn.products)
# Reduce Reactants
for i in range(num_reactants):
reactant_index = rxn.reactants[i]
concentrations[reactant_index] -= rxn.reactant_coeff[i]
# Increase Products
for i in range(num_products):
product_index =rxn.products[i]
concentrations[product_index] += rxn.product_coeff[i]
return concentrations