I want it to be well written as it can be but also as close to self documenting and understandable to the average non-programer biologist.
Here is the first draft of my code:
# This program simulates the random branching and extinction of linages.
# It also mutates a series of characters representing morphology at each branch point
# The program replicates the program first described by D.M. Raup and S.G. Gould
# 1974 Systematic Zoology 23: 305-322.
# written by Vincent Wan with help from tutor@python.org
import random
debug = 0 # turns debug diagnostic printing on = 1 or off = 0
#constants that control the simulation max_linages = 201 # the number of linage to be evolved + 1 branching_probablity = .1 extinction_probablity = .1 mutation_rate = .5
# initalize
living_linages = [[0, 0, 0, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]] # the ancestor
dead_linages = []
tree = "*0*"
time = 0
next_linage = 0
def Mutate_morphology(a_morphology, rate):
"Each morphological character has a rate chance it is increased or decreased by 1"
a_morphology = a_morphology[:]
character = 0
while character < len(a_morphology):
if random.random() <= rate:
if random.random() < .5:
a_morphology[character] = a_morphology[character] - 1
else:a_morphology[character] = a_morphology[character] + 1
character += 1
return a_morphology
def Braching(debug, next_linage, time, living_linages, mutation_rate, tree):
"With branching_probablity creates a new linage, mutates its morphology, and updates tree."
counter = 0
while counter < len(living_linages):
if random.random() < branching_probablity:
# creates new linage
next_linage += 1
new_linage = [next_linage, time, 0, Mutate_morphology(living_linages[counter][3], mutation_rate)]
living_linages.append(new_linage)
# updates linage tree
target = '*' + str(living_linages[counter][0]) + '*'
replacement = '(' + target + ',*' + str(new_linage[0]) + '*)'
tree = tree.replace(target, replacement)
counter += 1
if debug: print 'at time ', time, ' living_linages: ', [linage[0] for linage in living_linages]
return (next_linage, living_linages, tree)
def Extinction(debug, extinction_probablity, living_linages, time, dead_linages):
"With extinction_probablity kills living species and adds them to the dead list"
counter = 0
while counter < len(living_linages):
if random.random() < extinction_probablity:
newly_dead = living_linages[counter]
newly_dead[2] = time
dead_linages.append(newly_dead)
living_linages.remove(living_linages[counter])
if len(living_linages) == 0: break # when the last living_linages goes extinct exit
counter += 1
if debug: print 'at time ', time, ' dead_linages : ', [linage[0] for linage in dead_linages]
return (living_linages, dead_linages)
def Print_results(next_linage, max_linages, living_linages, dead_linages, tree):
"prints number of linages, the data about the linages living and dead, and the tree"
if next_linage < max_linages:
print '\nall extinct with only ', next_linage + 1, ' linage of ', max_linages
else:
print '\n', max_linages - 1, ' linages evolved'
print '\nliving linages:'
for each in living_linages:
print 'linage', each[0], 'born', each[1], 'morphology:', each[3]
print '\nextinct linages: '
for each in dead_linages:
print 'linage', each[0], 'born', each[1], '- died', each[2]
print 'morphology:', each[3]
tree = tree.replace('*','')
print '\ntree (in New Hampshire form: )', tree
# main loop
while next_linage < max_linages:
# handles branching
(next_linage, living_linages, tree) = Braching(debug, next_linage, time, living_linages, mutation_rate, tree)
# handles extinction
(living_linages, dead_linages) = Extinction(debug, extinction_probablity, living_linages, time, dead_linages)
if len(living_linages) == 0: break # when the last living_linages goes extinct exit
time += 1
Print_results(next_linage, max_linages, living_linages, dead_linages, tree)
Thank you,
Vincent
------------------------------------------------------------------------ --------------
PhD Candidate
Committee on the Conceptual and Historical Studies of Science
University of Chicago
PO Box 73727 Fairbanks, AK 99707
wan AT walrus DOT us (change CAPS to @ and . )
_______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor