Harvard:Biophysics 101/2007/Notebook:Michael Wang/2007-2-8

From OpenWetWare

Jump to: navigation, search

I thought it might be worth it to try implementing functions... I approached this problem by doing the counts each time a trial is completed. I'm not sure if it would have been faster to do all the trials and then store them before counting. Alternately, I guess you could keep track of consective trials as they happen. Maybe one of the CS concentrators might have an answer.

Code:

#!/usr/bin/env python

import random
import string

#CountRepeats counts the number of sequences in a single trial passed as a string
#and then counts the consecutive string occurances and adds them to the appropriate
#count matrix
def countRepeats(trial, search_char, matrix):    
    for i in range (10):
        substr = ''.join([search_char for n in range (i+1)]) #create the substring to search for of appropriate length
        count = 0
        pos = trial.find(substr,0)
        while not pos == -1:
            count = count + 1
            pos = trial.find(substr, pos +1)
        matrix[i][count]+=1  #add one to the appropriate element in the 2d matrix

        
#DisplayCounts displays the data stored in the matrix and calculates total occurances
def displayCounts (character, matrix):
    print
    print
    Title = "Number of trials with n occurances of the given consecutive string of "+character
    print Title.rjust(80)
    print "n".rjust(45)
    print "String".rjust(len(matrix)),
    for m in range(len(matrix[0])):
        print repr(m).rjust(6),
    print "Total*".rjust(8)
    totals = [0,0,0,0,0,0,0,0,0,0]
    for i in range(len(matrix)):
        substr = ''.join([character for n in range (i+1)])
        print substr.rjust(len(matrix)),
        for j in range(len(matrix[i])):
            print repr(matrix [i][j]).rjust (6),
        total = 0
        for k in range(len(matrix [i])):
            total+=matrix[i][k]*k
        print repr(total).rjust(7)
        totals[i]=total
    print "*Total refers to total occurances of a particular string"
    return totals
    
#Initialize a list of 10 zeros
zero_list = range(10)
for i in range(10):
    zero_list[i]=0;
print zero_list;
#there must be a better way to do this....
#ARGH!  I originally intended to use zero_string below, but apparently it passes a pointer instead of a value...

#Initialize 2d matrix to store data
count_of_H_counts = []
count_of_T_counts = []
for j in range (10):
    count_of_H_counts.append ([0,0,0,0,0,0,0,0,0,0,0]) #wanted to use zero_string here
    count_of_T_counts.append ([0,0,0,0,0,0,0,0,0,0,0]) #and here

#Run Trials
for k in range (10000):  #This for loop controls the number of trials performed
                         #where each trial is ten tosses
    random.seed()

    #populating the trial    
    temp = ""
    for l in range (10):
        if random.random()<0.5:
            temp = temp + "H"
        else:
            temp = temp + "T"

    #call the countRepeats function to process the new temp trial and add to H/T matrix    
    countRepeats(temp, 'H',count_of_H_counts)
    countRepeats(temp, 'T',count_of_T_counts)

#Call displaycounts to display the tables and calculate totals
Htotals=displayCounts ('H',count_of_H_counts)
Ttotals=displayCounts ('T',count_of_T_counts)

#Display the totals
print
print
print "Total Counts"
for i in range(len(Htotals)):
    print repr(i+1).rjust(5),"|",Htotals[i]+Ttotals[i]

Output:



          Number of trials with n occurances of the given consecutive string of H
                                            n
    String      0      1      2      3      4      5      6      7      8      9     10   Total*
         H      5    102    447   1188   2065   2475   2040   1123    465     79     11   49837
        HH   1429   2356   2359   1775   1097    613    251     95     14     11      0   22234
       HHH   5025   2314   1366    739    339    148     44     14     11      0      0    9809
      HHHH   7578   1309    655    274    115     44     14     11      0      0      0    4282
     HHHHH   8922    638    256    115     44     14     11      0      0      0      0    1807
    HHHHHH   9560    256    115     44     14     11      0      0      0      0      0     729
   HHHHHHH   9816    115     44     14     11      0      0      0      0      0      0     289
  HHHHHHHH   9931     44     14     11      0      0      0      0      0      0      0     105
 HHHHHHHHH   9975     14     11      0      0      0      0      0      0      0      0      36
HHHHHHHHHH   9989     11      0      0      0      0      0      0      0      0      0      11
*Total refers to total occurances of a particular string


         Number of trials with n occurances of the given consecutive string of T
                                            n
    String      0      1      2      3      4      5      6      7      8      9     10   Total*
         T     11     79    465   1123   2040   2475   2065   1188    447    102      5   50163
        TT   1371   2312   2380   1806   1156    595    239    110     26      5      0   22546
       TTT   4929   2355   1444    707    345    141     48     26      5      0      0    9959
      TTTT   7556   1348    639    277    101     48     26      5      0      0      0    4292
     TTTTT   8941    627    252    101     48     26      5      0      0      0      0    1786
    TTTTTT   9568    252    101     48     26      5      0      0      0      0      0     727
   TTTTTTT   9820    101     48     26      5      0      0      0      0      0      0     295
  TTTTTTTT   9921     48     26      5      0      0      0      0      0      0      0     115
 TTTTTTTTT   9969     26      5      0      0      0      0      0      0      0      0      36
TTTTTTTTTT   9995      5      0      0      0      0      0      0      0      0      0       5
*Total refers to total occurances of a particular string


Total Counts
    1 | 100000
    2 | 44780
    3 | 19768
    4 | 8574
    5 | 3593
    6 | 1456
    7 | 584
    8 | 220
    9 | 72
   10 | 16
Personal tools