{ "metadata": { "name": "", "signature": "sha256:4a2924244fdc8354b77af81dcf53a8eb8a2dff9c336f90ef5f9df27cac3eabaf" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## [Python Programming for Biologists, Tel-Aviv University / 0411-3122 / Spring 2015](http://py4life.github.io/TAU2015/)\n", "# Class-exercise solutions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1A" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print(\"I'm a genius!\")\n", "print(\"7 + 6 =\",7+6)\n", "print(\"My name is Inigo Montoya\")" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "I'm a genius!\n", "7 + 6 = 13\n", "My name is Inigo Montoya\n" ] } ], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1B" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Define a and b\n", "a = 10\n", "b = 4.7\n", "\n", "# calculate hypotenuse\n", "c = (a**2 + b**2)**0.5\n", "\n", "# print result\n", "print(c)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "11.04943437466371\n" ] } ], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1C" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Choose a year\n", "year = 1492\n", "\n", "# test year\n", "if (year % 400 == 0 or (year % 4 == 0 and year % 100 != 0)):\n", " print(year,\"is a leap year\")\n", "else:\n", " print(year,\"is not a leap year\")" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1492 is a leap year\n" ] } ], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1D" ] }, { "cell_type": "code", "collapsed": false, "input": [ "m = 555 # integer to apply the conjecture on\n", "\n", "n = m\n", "while n != 1:\n", " print(n, end=\", \")\n", " # if n is even\n", " if n % 2 == 0:\n", " n = n // 2\n", " # if n is odd\n", " else:\n", " n = 3 * n + 1\n", "print(1) # 1 was not printed\n", "print(m, \"is OK\")" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "555, 1666, 833, 2500, 1250, 625, 1876, 938, 469, 1408, 704, 352, 176, 88, 44, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1\n", "555 is OK\n" ] } ], "prompt_number": 8 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2A" ] }, { "cell_type": "code", "collapsed": false, "input": [ "seq = \"CAAGTAATGGCAGCCATTAA\"\n", "# print 2nd nucleotide\n", "print(seq[1])\n", "# print 7th nucleotide\n", "print(seq[6])\n", "# print 2nd nucleotide from the tail\n", "print(seq[-2])\n", "\n", "first_half = seq[:10]\n", "print(first_half)\n", "second_half = seq[10:]\n", "print(second_half)\n", "middle = seq[5:15]\n", "print(middle)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "A\n", "A\n", "A\n", "CAAGTAATGG\n", "CAGCCATTAA\n", "AATGGCAGCC\n" ] } ], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2B" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# create list\n", "animals = birds + snakes\n", "# add Mus musculus\n", "animals.append('Mus musculus')\n", "# remove Corvus corone element\n", "animals.remove('Corvus corone')\n", "# print\n", "print(sorted(animals[1:5]))" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2C" ] }, { "cell_type": "code", "collapsed": false, "input": [ "insulin = 'MALWMRLLPLLALLALWGPDPAAAFVNQHLCGSHLVEALYLVCGERGFFYTPKTRREAEDLQVGQVELGGGPGAGSLQPLALEGSLQKRGIVEQCCTSICSLYQLENYCN'" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 11 }, { "cell_type": "code", "collapsed": false, "input": [ "charged = ['R','H','K','D','E']\n", "\n", "charged_count = 0\n", "for aa in insulin:\n", " if aa in charged:\n", " charged_count += 1\n", "\n", "insulin_length = len(insulin)\n", "charged_ratio = charged_count/insulin_length\n", "print(\"Ratio of charged amino acids is:\",charged_ratio)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Ratio of charged amino acids is: 0.17272727272727273\n" ] } ], "prompt_number": 12 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2D" ] }, { "cell_type": "code", "collapsed": false, "input": [ "seq = \"ACTGATCGATTACGTATAGTAGAATTCTATCATACATATATATCGATGCGTTCAT\"" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "fragments = seq.split('GAATTC')\n", "f1_length = len(fragments[0]) + 1 # add 1 for the 'G'\n", "f2_length = len(fragments[1]) + 5 # add 5 for the 'AATTC'\n", "print('Fragment lengths of',f1_length,'and',f2_length,'will be produced.')" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Fragment lengths of 22 and 33 will be produced.\n" ] } ], "prompt_number": 13 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "complement = ''\n", "for base in seq:\n", " if base == 'A':\n", " complement = complement + 'T'\n", " elif base == 'T':\n", " complement = complement + 'A' \n", " elif base == 'G':\n", " complement = complement + 'C'\n", " elif base == 'C':\n", " complement = complement + 'G' \n", " else:\n", " print(\"Bad base:\", base)\n", "print(\"Complement:\", complement)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Complement: TGACTAGCTAATGCATATCATCTTAAGATAGTATGTATATATAGCTACGCAAGTA\n" ] } ], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "for i in range(len(apes)):\n", " print(apes[i])\n", " display(Image(url=ape_pics[i]))" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3A" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Create dictionary\n", "details_dict = {'Name': 'James Watson', 'Address': 'Cambridge', 'Phone': '12345678'}\n", "\n", "# print sentence\n", "print(\"My name is\",details_dict['Name'],\"I live in\",details_dict['Address'],\"My phone number is\",details_dict['Phone'])" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "My name is James Watson I live in Cambridge My phone number is 12345678\n" ] } ], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Create codons dictionary\n", "bases = ['t', 'c', 'a', 'g']\n", "codons = [a+b+c for a in bases for b in bases for c in bases]\n", "amino_acids = 'FFLLSSSSYY**CC*WLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG'\n", "codon_table = dict(zip(codons, amino_acids))\n", "\n", "# Sequence list\n", "seq_list = [\"atg\",\"caa\",\"ggc\",\"ata\",\"tca\",\"tgg\",\"cga\",\"agg\",\"cct\",\"taa\"]\n", "\n", "# iterate on list and translate\n", "for codon in seq_list:\n", " print(codon_table[codon], end='')" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "MQGISWRRP*" ] } ], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3B" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# define function\n", "def first_5_longer_sequence(seq1,seq2):\n", " if len(seq1) > len(seq2):\n", " return seq1[:5]\n", " else:\n", " return seq2[:5]\n", " \n", "# Test function\n", "sequence1 = \"aggtctcggatataggcgcgatattta\"\n", "sequence2 = \"ttaagccacgcttcggatta\"\n", "first_5 = first_5_longer_sequence(sequence1, sequence2)\n", "print(first_5)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "aggtc\n" ] } ], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# define function\n", "def odd_bases(seq):\n", " odd_bases_list = []\n", " for i in range(len(seq)):\n", " if i % 2 == 0:\n", " odd_bases_list.append(seq[i]) \n", " return odd_bases_list\n", "\n", "# Test function\n", "odd_bases_list = odd_bases(\"aggtctcggatataggcgcgatattta\")\n", "print(odd_bases_list)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "['a', 'g', 'c', 'c', 'g', 't', 't', 'g', 'c', 'c', 'a', 'a', 't', 'a']\n" ] } ], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Or another alternative, using string slicing:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# define function\n", "def odd_bases(seq):\n", " odd_bases_list = list(seq[::2]) \n", " return odd_bases_list\n", "\n", "# Test function\n", "odd_bases_list = odd_bases(\"aggtctcggatataggcgcgatattta\")\n", "print(odd_bases_list)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "['a', 'g', 'c', 'c', 'g', 't', 't', 'g', 'c', 'c', 'a', 'a', 't', 'a']\n" ] } ], "prompt_number": 7 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4A" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "with open('lec4_files/crops.txt','r') as crops_file:\n", " entire_file = crops_file.read()\n", " lines_list = entire_file.split('\\n')\n", " print(lines_list[-1])" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Ziziphus zizyphus |\n" ] } ], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "with open('lec4_files/crops.txt','r') as crops_file:\n", " triticum_count = 0\n", " for line in crops_file:\n", " if line.startswith('Triticum'):\n", " triticum_count += 1\n", " print(triticum_count)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "6\n" ] } ], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4B" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# new function\n", "def parse_fasta_30_nuc(file_name):\n", " \"\"\"\n", " Receives a path to a fasta file, and returns a dictionary where the keys\n", " are the sequence gb accession numbers and the values are the first 30\n", " nucleotides of the sequences.\n", " \"\"\"\n", " # create an empty dictionary to store the sequences\n", " sequences = {}\n", " # open fasta file for reading\n", " with open(file_name,'r') as f:\n", " # Loop over file lines\n", " for line in f:\n", " # if header line\n", " if line.startswith('>'):\n", " gb = line.split('|')[3]\n", " # if sequence line\n", " else:\n", " seq = line.strip()[:30]\n", " sequences[gb] = seq\n", " return sequences\n", "\n", "# parse file\n", "camelus_seq = parse_fasta_30_nuc('lec4_files/camelus.fasta')\n", "\n", "# write to new file\n", "with open('lec4_files/4b_output.txt','w') as of:\n", " for gb_id in camelus_seq:\n", " print(gb_id + ':',camelus_seq[gb_id], file=of)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4C" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def mean_of_string_values(lst):\n", " \"\"\"\n", " receives a list of strings representing numbers and returns their mean\n", " \"\"\"\n", " numeric_lst = []\n", " for x in lst:\n", " numeric_lst.append(float(x))\n", " return mean(numeric_lst)\n", "\n", "experiments_file = 'lec4_files/electrolyte_leakage.csv'\n", "with open(experiments_file, 'r') as f:\n", " with open('lec4_files/4c_output.csv','w', newline='') as fo:\n", " csv_writer = csv.writer(fo)\n", " csv_writer.writerow(['Accession','control mean','test mean'])\n", " csv_reader = csv.reader(f)\n", " next(csv_reader)\n", " for row in csv_reader:\n", " acc = row[0]\n", " control = row [1:4]\n", " test = row[4:]\n", " to_write = [acc,mean_of_string_values(control),mean_of_string_values(test)]\n", " csv_writer.writerow(to_write)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 11 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4D" ] }, { "cell_type": "code", "collapsed": false, "input": [ "genes = ['xkn59438', 'yhdck2', 'eihd39d9', 'chdsye847', 'hedle3455', 'xjhd53e', '45da', 'de37dp','map492ty']\n", "\n", "# 1.\n", "print('Gene names containing d or e:')\n", "regex1 = re.compile(r'[de]')\n", "for gene in genes:\n", " if re.search(regex1,gene):\n", " print(gene)\n", " \n", "print('------------------------')\n", "\n", "# 2.\n", "print('Gene names containing d and e, in that order:')\n", "regex2 = re.compile(r'd[^e]*e')\n", "for gene in genes:\n", " if re.search(regex2,gene):\n", " print(gene)\n", " \n", "print('------------------------')\n", "\n", "# 3.\n", "print('Gene names containing three digits in a row:')\n", "regex3 = re.compile(r'\\d{3,}')\n", "for gene in genes:\n", " if re.search(regex3,gene):\n", " print(gene)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Gene names containing d or e:\n", "yhdck2\n", "eihd39d9\n", "chdsye847\n", "hedle3455\n", "xjhd53e\n", "45da\n", "de37dp\n", "------------------------\n", "Gene names containing d and e, in that order:\n", "chdsye847\n", "hedle3455\n", "xjhd53e\n", "de37dp\n", "------------------------\n", "Gene names containing three digits in a row:\n", "xkn59438\n", "chdsye847\n", "hedle3455\n", "map492ty\n" ] } ], "prompt_number": 23 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4E" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def count_promoters_with_motif(promoters_dictionary):\n", " \"\"\"\n", " Receives a dictionary representing a promoters fasta file,\n", " and counts how many of the promoters include a GATA-4 motif.\n", " \"\"\"\n", " promoters_count = 0 # store the number of promoters with GATA-4 motif\n", " for p in promoters_dictionary:\n", " if check_for_GATA4(promoters_dictionary[p]):\n", " promoters_count += 1\n", " return promoters_count" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def get_positions_statistics(promoters_dictionary):\n", " \"\"\"\n", " Receives a dictionary representing a promoters fasta file,\n", " and returns the frequencies of possible nucleotides in \n", " each variable position.\n", " \"\"\"\n", " # define a dictionary for each position, to store the nucleotide frequencies\n", " # D position\n", " D_dict = {'A':0, 'G':0, 'T':0}\n", " # M position\n", " M_dict = {'A':0, 'C':0}\n", " # R position\n", " R_dict = {'A':0, 'G':0}\n", " # S position\n", " S_dict = {'C':0, 'G':0}\n", " \n", " # itterate over promoters\n", " for p in promoters_dictionary:\n", " # if promoter includes the GATA-4 motif\n", " if check_for_GATA4(promoters_dictionary[p]):\n", " # get variable nucleotides in promoter\n", " D,M,R,S = extract_ambiguous_for_GATA4(promoters_dictionary[p])\n", " # insert to dictionaries\n", " D_dict[D] += 1\n", " M_dict[M] += 1\n", " R_dict[R] += 1\n", " S_dict[S] += 1\n", " \n", " return D_dict, M_dict, R_dict, S_dict" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def summarize_results(D_dict, M_dict, R_dict, S_dict, output_file):\n", " with open(output_file, 'w') as fo:\n", " csv_writer = csv.writer(fo)\n", " # write headers line\n", " csv_writer.writerow(['Position','A','G','C','T'])\n", " # summarize D position\n", " csv_writer.writerow(['D',D_dict['A'],D_dict['G'],0,D_dict['T']])\n", " # summarize M position\n", " csv_writer.writerow(['M',M_dict['A'],0,M_dict['C'],0])\n", " # summarize R position\n", " csv_writer.writerow(['R',R_dict['A'],R_dict['G'],0,0])\n", " # summarize S position\n", " csv_writer.writerow(['S',0,S_dict['G'],S_dict['C'],0])" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "promoters_file = \"lec4_files/GATA4_promoters.fasta\"\n", "output_file = \"lec4_files/promoters_stats.csv\"\n", "\n", "# parse fasta file\n", "promoters_dict = parse_promoters_fasta(promoters_file)\n", "\n", "# Count promoters with/without GATA-4 motif\n", "promoters_with_motif = count_promoters_with_motif(promoters_dict)\n", "promoters_without_motif = len(promoters_dict) - promoters_with_motif\n", "print('Total promoters:',promoters_with_motif + promoters_without_motif)\n", "print('Promoters with GATA-4 motif:',promoters_with_motif)\n", "print('Promoters without GATA-4 motif:',promoters_without_motif)\n", "\n", "# Get statistics\n", "D_dict, M_dict, R_dict, S_dict = get_positions_statistics(promoters_dict)\n", "# write to CSV\n", "summarize_results(D_dict, M_dict, R_dict, S_dict,output_file)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 6A" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from Bio.Seq import Seq\n", "def antisense_string_to_protein_seq(DNA_string):\n", " antisense_seq = Seq(DNA_string)\n", " sense_seq = antisense_seq.reverse_complement()\n", " prot_seq = sense_seq.translate()\n", " return prot_seq\n", "\n", "antisense_DNA = \"TACCGGTAACATTACCCGGCGACTTTCCCACGGGCTATC\"\n", "protein = antisense_string_to_protein_seq(antisense_DNA)\n", "print(protein)\n", "assert str(protein) == 'DSPWESRRVMLPV'\n", "assert isinstance(protein,Seq)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 20 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 6B" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from Bio import SeqIO\n", "def get_unique_species(gb_file):\n", " species_list = []\n", " # iterate on file records\n", " for seq_record in SeqIO.parse(gb_file,'genbank'):\n", " # get species\n", " record_organism = seq_record.annotations['organism']\n", " species = record_organism.split()[1] # get the second word\n", " # insert species to list\n", " species_list.append(species)\n", " return set(species_list)\n", "\n", "orchids_species = get_unique_species('lec6_files/Orchids.gbk')\n", "print(orchids_species)\n", "assert len(orchids_species) == 92" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "{'segawai', 'kaiteurum', 'caricinum', 'mastersianum', 'formosanum', 'hookerae', 'victoria', 'lichiangense', 'passerinum', 'charlesworthii', 'bougainvilleanum', 'venustum', 'stonei', 'sanderianum', 'hirsutissimum', 'urbanianum', 'superbiens', 'supardii', 'appletonianum', 'armeniacum', 'papuanum', 'ciliolare', 'philippinense', 'haynaldianum', 'lindleyanum', 'bullenianum', 'sargentianum', 'pearcei', 'barbigerum', 'calceolus', 'purpuratum', 'xerophyticum', 'dayanum', 'henryanum', 'callosum', 'fasciculatum', 'gratrixianum', 'insigne', 'caudatum', 'macranthon', 'delenatii', 'primulinum', 'longifolium', 'californicum', 'rothschildianum', 'parviflorum', 'warszewiczianum', 'parishii', 'lawrenceanum', 'acmodontum', 'glanduliferum', 'godefroyae', 'wallisii', 'wardii', 'czerwiakowianum', 'fowliei', 'hennisianum', 'argus', 'margaritaceum', 'kolopakingii', 'adductum', 'niveum', 'exstaminodium', 'glaucophyllum', 'besseae', 'malipoense', 'dianthum', 'micranthum', 'concolor', 'tigrinum', 'boissierianum', 'tonsum', 'emersonii', 'fairrieanum', 'villosum', 'reginae', 'schlimii', 'druryi', 'barbatum', 'schoseri', 'guttatum', 'lindenii', 'flavum', 'acaule', 'lowii', 'himalaicum', 'exul', 'sukhakulii', 'yatabeanum', 'irapeanum', 'bellatulum', 'javanicum'}\n" ] } ], "prompt_number": 24 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6C" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from Bio.Seq import Seq\n", "from Bio.Blast import NCBIWWW, NCBIXML\n", "def longest_blast_hit(seq):\n", " result_handle = NCBIWWW.qblast(\"blastn\", \"nt\", seq)\n", " blast_record = NCBIXML.read(result_handle)\n", " longest = 0\n", " for hit in blast_record.alignments:\n", " if hit.length > longest:\n", " longest = hit.length\n", " name = hit.title\n", " return name\n", "\n", "assert longest_blast_hit(seq).split('|')[1] == '47776119'" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 7A" ] }, { "cell_type": "code", "collapsed": false, "input": [ "sqrt_data = np.sqrt(data)\n", "print(sqrt_data[:3,:5])" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 7B" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print(data.argmax(axis=1))" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 7C" ] }, { "cell_type": "code", "collapsed": false, "input": [ "scatter(range(data.shape[0]), data.argmax(axis=1))\n", "xlabel('patient')\n", "ylabel('day of max inflammation')" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 8A" ] }, { "cell_type": "code", "collapsed": false, "input": [ "size = 1000\n", "n = 100\n", "p = 0.5\n", "\n", "data = np.random.binomial(n,p,size)\n", "plt.hist(data);" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\nQmCC\n", "text": [ "" ] } ], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 8B" ] }, { "cell_type": "code", "collapsed": false, "input": [ "N = 1000\n", "n = 3\n", "p = 0.34\n", "bins = np.linspace(0, N, 25)\n", "nsteps_list = [10, 100, 1000]\n", "ntrials = 100" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 5 }, { "cell_type": "code", "collapsed": false, "input": [ "def simulate(x, nsteps):\n", " \"\"\"Run the simulation.\"\"\"\n", " for _ in range(nsteps - 1):\n", " # Which trials to update?\n", " update = (0 < x) & (x < N-1)\n", " # In which trials do births occur?\n", " boys = poisson(x[update] * n * p)\n", " # We update the population size for all trials.\n", " x[update] = boys" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 6 }, { "cell_type": "code", "collapsed": false, "input": [ "x = randint(size=ntrials, low=0, high=N)\n", "fig, ax = subplots(1, 3, figsize=(15,5), sharex=True, sharey=False)\n", "for i, nsteps in enumerate(nsteps_list):\n", " simulate(x, nsteps)\n", " ax[i].hist(x, bins=bins)\n", " ax[i].set_title(\"%d time steps\" % nsteps)\n", " if i == 0:\n", " ax[i].set_ylabel(\"Frequency\")\n", " if i == 1:\n", " ax[i].set_xlabel(\"# males\")" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\nSZKkgfX/Abdq8XvPE23RAAAAAElFTkSuQmCC\n", "text": [ "" ] } ], "prompt_number": 7 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 8C" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import seaborn as sns\n", "def simulate(x0, n, p, ntrials=100):\n", " x = x0 * ones(ntrials, dtype=int)\n", " update = (0 < x) & (x < N-1)\n", " while update.any():\n", " # Which trials to update?\n", " update = (0 < x) & (x < N-1)\n", " # In which trials do births occur?\n", " boys = binomial(x[update] * n, p)\n", " # We update the population size for all trials.\n", " x[update] = boys\n", " return x" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 8 }, { "cell_type": "code", "collapsed": false, "input": [ "N = 1000\n", "x0 = 1\n", "n = 3\n", "\n", "p_range = arange(0.25,0.4,0.005)\n", "prob = array([simulate(x0,n,p)==0 for p in p_range])\n", "\n", "mean_prob = prob.mean(axis=1)\n", "sem_prob = prob.std(axis=1) / sqrt(prob.shape[0])" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 9 }, { "cell_type": "code", "collapsed": false, "input": [ "errorbar(x=p_range, y=mean_prob, yerr=sem_prob)\n", "axvline(x=1./n, color='k', ls='--')\n", "xlabel('probability for reproductive son')\n", "ylabel('extinction probability')\n", "sns.despine();" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\nA0Ao8jPcarx9AAAAAElFTkSuQmCC\n", "text": [ "" ] } ], "prompt_number": 10 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }