GitHub PullRequestReviewCommentEvent at 2014-10-31 07:11:58
Repository: qiime
Actor: charudatta-navare
Payload: {"action":"created","comment":{"url":"https://api.github.com/repos/biocore/qiime/pulls/comments/19654405","id":19654405,"diff_hunk":"@@ -0,0 +1,616 @@\n+#!/usr/bin/env python\n+from __future__ import division\n+\n+__author__ = \"Charudatta Navare\"\n+__copyright__ = \"Copyright 2014, The QIIME Project\"\n+__credits__ = [\"Charudatta Navare\", \"Jai Ram Rideout\"]\n+__license__ = \"GPL\"\n+__version__ = \"1.8.0-dev\"\n+__maintainer__ = \"Charudatta Navare\"\n+__email__ = \"charudatta.navare@gmail.com\"\n+\n+from collections import defaultdict\n+from qiime.golay import get_invalid_golay_barcodes\n+from qiime.parse import parse_mapping_file_to_dict\n+from qiime.split_libraries import check_map, expand_degeneracies\n+from qiime.split_libraries_fastq import correct_barcode\n+from skbio.parse.sequences import parse_fasta, parse_fastq\n+from qiime.util import get_qiime_temp_dir, qiime_system_call\n+from brokit.uclust import get_clusters_from_fasta_filepath\n+from skbio.app.util import ApplicationError\n+from tempfile import mkstemp\n+from itertools import izip\n+from os import close, path, mkdir, rmdir\n+from skbio.util.misc import remove_files\n+from skbio.core.sequence import DNASequence\n+import re\n+\n+\n+class PairedEndParseError(Exception):\n+    pass\n+\n+\n+class PrimerMismatchError(Exception):\n+    pass\n+\n+\n+class LowConsensusScoreError(Exception):\n+    pass\n+\n+\n+class SeqLengthMismatchError(Exception):\n+    pass\n+\n+\n+class InvalidGolayBarcodeError(Exception):\n+    pass\n+\n+\n+class BarcodeLenMismatchError(Exception):\n+    pass\n+\n+\n+def extract_primer(seq, possible_primers, min_idx=None, max_idx=None):\n+    \"\"\"\n+    Extracts primers from sequence, given possible primers\n+    returns before_primer, primer, sequence without primer\n+\n+    \"\"\"\n+\n+    primer_idx = None   # index of primer in sequence\n+    primer = None      # primer in sequence\n+\n+    for possible_primer in possible_primers:\n+        if possible_primer in seq:\n+            primer_idx = seq.index(possible_primer)\n+            primer = possible_primer\n+\n+            if(min_idx is not None and primer_idx < min_idx) or \\\n+              (max_idx is not None and primer_idx > max_idx):\n+                primer_idx = None\n+                primer = None\n+                continue\n+            else:\n+                break\n+\n+    if primer_idx is None:\n+        raise PrimerMismatchError(\n+            \"Sequence does not contain any primers from the mapping file, \"\n+            \"Please verify your mapping file.\")\n+\n+    before_primer = seq[:primer_idx]\n+    after_primer = seq.replace(before_primer + primer, '', 1)\n+    return before_primer, primer, after_primer\n+\n+\n+def get_LEA_seq_consensus_seqs(fwd_read_f, rev_read_f,\n+                               map_f, output_dir,\n+                               barcode_type, barcode_len,\n+                               barcode_correction_fn, max_barcode_errors,\n+                               min_consensus, max_cluster_ratio,\n+                               min_difference_in_bcs,\n+                               fwd_length, rev_length,\n+                               min_reads_per_random_bc,\n+                               min_difference_in_clusters,\n+                               barcode_column,\n+                               reverse_primer_column):\n+    \"\"\"\n+    Reads mapping file, input file, and other command line arguments\n+    fills dictionary called consensus_seq_lookup which will contain:\n+    sample ID -> random barcode -> consensus_seq\n+    \"\"\"\n+\n+    (bc_to_sid,\n+     bc_to_fwd_primers,\n+     bc_to_rev_primers) = process_mapping_file(map_f,\n+                                               barcode_len,\n+                                               barcode_type,\n+                                               barcode_column,\n+                                               reverse_primer_column)\n+\n+    (random_bc_lookup,\n+     random_bc_reads,\n+     random_bcs,\n+     barcode_errors_exceed_max_count,\n+     barcode_not_in_map_count,\n+     primer_mismatch_count,\n+     seq_too_short_count,\n+     input_seqs_count,\n+     total_seqs_kept) = read_fwd_rev_read(fwd_read_f,\n+                                          rev_read_f,\n+                                          bc_to_sid,\n+                                          barcode_len,\n+                                          barcode_correction_fn,\n+                                          bc_to_fwd_primers,\n+                                          bc_to_rev_primers,\n+                                          max_barcode_errors,\n+                                          fwd_length,\n+                                          rev_length)\n+\n+    consensus_seq_lookup = get_consensus_seqs_lookup(random_bc_lookup,\n+                                                     random_bc_reads,\n+                                                     random_bcs,\n+                                                     min_difference_in_bcs,\n+                                                     min_reads_per_random_bc,\n+                                                     output_dir,\n+                                                     min_difference_in_clusters,\n+                                                     max_cluster_ratio)\n+\n+    log_out = format_lea_seq_log(input_seqs_count,\n+                                 barcode_errors_exceed_max_count,\n+                                 barcode_not_in_map_count,\n+                                 primer_mismatch_count,\n+                                 seq_too_short_count,\n+                                 total_seqs_kept)\n+\n+    return consensus_seq_lookup, log_out\n+\n+\n+def get_cluster_ratio(fasta_seqs, min_difference_in_clusters):\n+    \"\"\"\n+    Uses uclust to calculate cluster ratio\n+    cluster_ratio=num_of_seq_in_cluster_with_max_seq/num_of_seq_in cluster_with_second_higest_seq\n+    \"\"\"\n+    cluster_percent_id = min_difference_in_clusters\n+    temp_dir = get_qiime_temp_dir()\n+    fd_uc, uclust_tempfile_name = mkstemp(dir=temp_dir, suffix='.uc')\n+    close(fd_uc)\n+    fd_fas, fasta_tempfile_name = mkstemp(dir=temp_dir, suffix='.uc')\n+    close(fd_fas)\n+    fasta_tempfile = open(fasta_tempfile_name, 'w')\n+    fasta_tempfile.write(fasta_seqs)\n+    fasta_tempfile.close()\n+    count_lookup = {}\n+    count = 0\n+    command = \"uclust --usersort --input \" + fasta_tempfile_name +\\\n+              \" --uc \" + uclust_tempfile_name + \" --id 0.98\"\n+    # In the function, I am calling uclust a large number of times.\n+    # Initially I was using brokit.get_clusters_from_fasta_filepath\n+    # but due to issue (biocore/brokit#31), I have temporarily\n+    # reverted to qiime_system_call.\n+\n+    qiime_system_call(command)\n+    uclust_tempfile = open(uclust_tempfile_name, 'r')\n+    for line in uclust_tempfile:\n+        if re.search(r'^C', line):\n+            pieces = line.split('\\t')\n+            try:\n+                count_lookup[pieces[1]] += pieces[2]\n+            except KeyError:\n+                count_lookup[pieces[1]] = pieces[2]\n+            except IndexError:\n+                pass\n+            count += 1\n+    uclust_tempfile.close()\n+    files_to_be_removed = list()\n+    files_to_be_removed.append(uclust_tempfile_name)\n+    remove_files(files_to_be_removed)\n+\n+    sorted_counts_in_clusters = sorted(\n+        count_lookup.iteritems(),\n+        key=lambda x: x[1])\n+    try:\n+        max_cluster_count = \\\n+            float(str(sorted_counts_in_clusters[0][1]))\n+        second_cluster_count = \\\n+            float(str(sorted_counts_in_clusters[1][1]))\n+        return max_cluster_count / second_cluster_count\n+    except IndexError:\n+        return 1\n+\n+\n+def get_consensus(fasta_seqs, min_consensus):\n+    \"\"\"\n+    Returns consensus sequence from a set of sequences\n+    input: fasta file, min_consensus\n+    fasta_file should be in the following format:\n+    >random_bc|number\n+    seq\n+    >random_bc|number\n+    seq\n+    ....\n+\n+    number = number of times this seq has appeared with this random_barcode\n+    \"\"\"\n+    seqs = list()\n+    counts = list()\n+\n+    temp_dir = get_qiime_temp_dir()\n+    fd_fas, fasta_tempfile_name = mkstemp(dir=temp_dir, suffix='.fas')\n+    close(fd_fas)\n+\n+    fasta_tempfile = open(fasta_tempfile_name, 'w')\n+    fasta_tempfile.write(fasta_seqs)\n+    fasta_tempfile.close()\n+\n+    fasta_tempfile = open(fasta_tempfile_name, 'r')\n+    for label, seq in parse_fasta(fasta_tempfile):\n+        RE_output = re.search(r'\\w+\\|(\\d+)', label)\n+        counts.append(int(RE_output.group(1)))\n+        seqs.append(seq)\n+    fasta_tempfile.close()\n+\n+    files_to_be_removed = list()\n+    files_to_be_removed.append(fasta_tempfile_name)\n+    remove_files(files_to_be_removed)\n+\n+    length = len(seqs[0])\n+    number_of_seqs = len(seqs)\n+\n+    for seq_index in range(number_of_seqs):\n+        if len(seqs[seq_index]) != length:\n+            raise SeqLengthMismatchError\n+\n+    freq_this_pos_this_base = dict()\n+    count_of_seq_with_max_count = dict()\n+\n+    for x in range(length):\n+        freq_this_pos_this_base[x] = dict()\n+        count_of_seq_with_max_count[x] = dict()\n+    for x in range(length):\n+        for y in DNASequence.iupac_characters():\n+            freq_this_pos_this_base[x][y] = 0\n+            count_of_seq_with_max_count[x][y] = 0\n+\n+    for base_index in range(length):\n+        for this_seq_count, seq in enumerate(seqs):\n+            freq_this_pos_this_base[base_index][\n+                seq[base_index]] += counts[this_seq_count]\n+            if counts[this_seq_count] > count_of_seq_with_max_count[\n+                    base_index][seq[base_index]]:\n+                count_of_seq_with_max_count[base_index][\n+                    seq[base_index]] = counts[this_seq_count]\n+\n+    consensus = list()\n+    for index in range(length):\n+        sorted_bases = sorted(\n+            freq_this_pos_this_base[index].iteritems(),\n+            key=lambda x: x[1])\n+        max_base, max_freq = sorted_bases[-1]\n+\n+        for (counter, (b, n)) in enumerate(sorted_bases):\n+            if max_freq == n:\n+                try:\n+                    if count_of_seq_with_max_count[counter][\n+                            b] > count_of_seq_with_max_count[counter][max_base]:\n+                        max_base = b\n+                except KeyError:\n+                    pass\n+\n+        score = float(10 * float(max_freq) / number_of_seqs)\n+        if score < min_consensus:\n+            raise LowConsensusScoreError\n+        consensus.append(max_base)\n+\n+    consensus_seq = ''.join(map(str, consensus))\n+    return consensus_seq\n+\n+\n+def select_unique_rand_bcs(rand_bcs, min_difference_in_bcs):\n+    \"\"\"\n+    Attempts to select true barcodes from set of barcodes\n+    i.e. removes barcodes that might be artifacts\n+    due to sequencing errors.\n+    Uses uclust to remove barcodes that are similar thatn\n+    threshold.\n+    returns: a set containing random unique random barcodes.\n+    \"\"\"\n+    unique_threshold = min_difference_in_bcs\n+    temp_dir = get_qiime_temp_dir()\n+    fasta_fd, fasta_tempfile_name = mkstemp(\n+        dir=temp_dir, prefix='tmp', suffix='.fas')\n+    rand_bcs = set(rand_bcs)\n+    fasta_tempfile = open(fasta_tempfile_name, \"w\")\n+    p_line = \"\"\n+    for rand_bc in rand_bcs:\n+        p_line = p_line + \">\" + rand_bc + \"\\n\" + rand_bc + \"\\n\"\n+    fasta_tempfile.write(p_line)\n+    fasta_tempfile.close()\n+\n+    _, _, unique_rand_bcs = get_clusters_from_fasta_filepath(\n+        fasta_tempfile_name,\n+        original_fasta_path=None,\n+        percent_ID=unique_threshold,\n+        save_uc_files=False,\n+        output_dir=temp_dir)\n+\n+    unique_rand_bcs = set(unique_rand_bcs)\n+\n+    files_to_be_removed = list()\n+    files_to_be_removed.append(fasta_tempfile_name)\n+    remove_files(files_to_be_removed)\n+    return unique_rand_bcs\n+\n+\n+def format_lea_seq_log(input_seqs_count,\n+                       barcode_errors_exceed_max_count,\n+                       barcode_not_in_map_count,\n+                       primer_mismatch_count,\n+                       seq_too_short_count,\n+                       total_seqs_kept):\n+    \"\"\" Format the split libraries LEA-Seq log \"\"\"\n+    log_out = [\"Quality filter results\"]\n+    log_out.append(\n+        \"Total number of input sequences: %d\" %\n+        input_seqs_count)\n+    log_out.append(\n+        \"Barcode not in mapping file: %d\" %\n+        barcode_not_in_map_count)\n+    log_out.append(\n+        \"Sequence shorter than threshold: %d\" %\n+        seq_too_short_count)\n+    log_out.append(\n+        \"Barcode errors exceeds limit: %d\" %\n+        barcode_errors_exceed_max_count)\n+    log_out.append(\n+        \"Primer mismatch count: %d\" %\n+        primer_mismatch_count)\n+    log_out.append(\"\")\n+\n+    log_out.append('\\nTotal number seqs written: %d' % total_seqs_kept)\n+    return '\\n'.join(log_out)\n+\n+\n+def check_barcodes(bc_to_sid, barcode_len, barcode_type):\n+    \"\"\"\n+    Make sure that barcodes (which are guaranteed to be of\n+    the same length at this point) are the correct length\n+    that the user specified.\n+    \"\"\"\n+    barcode_len_in_map = len(bc_to_sid.keys()[0])\n+    if barcode_len_in_map != barcode_len:\n+        raise BarcodeLenMismatchError(\"Barcodes in mapping file are of length %d, but \"\n+                                      \"expected barcodes of length %d.\" %\n+                                      (barcode_len_in_map, barcode_len))\n+\n+    if barcode_type == 'golay_12':\n+        invalid_golay_barcodes = get_invalid_golay_barcodes(bc_to_sid.keys())\n+\n+        if invalid_golay_barcodes:\n+            raise InvalidGolayBarcodeError(\n+                \"Some or all barcodes in the mapping file are \"\n+                \"not valid golay codes. Do they need to be \"\n+                \"reverse complemented? If these are not golay \"\n+                \"barcodes pass --barcode_type 12 to disable \"\n+                \"barcode error correction, or pass \"\n+                \"--barcode_type  # if the barcodes are not 12 \"\n+                \"base pairs, where   #  is the size of the \"\n+                \"barcodes.\\n\\nInvalid barcodes: %s\" %\n+                ' '.join(invalid_golay_barcodes))\n+\n+\n+def get_consensus_seqs_lookup(random_bc_lookup,","path":"qiime/split_libraries_lea_seq.py","position":465,"original_position":382,"commit_id":"f53f965f842f86ab0f23c7ba8483c309eaeb1d0f","original_commit_id":"1c7ebf29f0ad244aa0efb245adedb58725296cf9","user":{"login":"charudatta-navare","id":1546318,"avatar_url":"https://avatars.githubusercontent.com/u/1546318?v=2","gravatar_id":"","url":"https://api.github.com/users/charudatta-navare","html_url":"https://github.com/charudatta-navare","followers_url":"https://api.github.com/users/charudatta-navare/followers","following_url":"https://api.github.com/users/charudatta-navare/following{/other_user}","gists_url":"https://api.github.com/users/charudatta-navare/gists{/gist_id}","starred_url":"https://api.github.com/users/charudatta-navare/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/charudatta-navare/subscriptions","organizations_url":"https://api.github.com/users/charudatta-navare/orgs","repos_url":"https://api.github.com/users/charudatta-navare/repos","events_url":"https://api.github.com/users/charudatta-navare/events{/privacy}","received_events_url":"https://api.github.com/users/charudatta-navare/received_events","type":"User","site_admin":false},"body":"Added the comments. I previously thought you were referring to better explanation in the docstring.  Now I have added block comments, too. ","created_at":"2014-10-31T07:11:58Z","updated_at":"2014-10-31T07:11:58Z","html_url":"https://github.com/biocore/qiime/pull/1514#discussion_r19654405","pull_request_url":"https://api.github.com/repos/biocore/qiime/pulls/1514","_links":{"self":{"href":"https://api.github.com/repos/biocore/qiime/pulls/comments/19654405"},"html":{"href":"https://github.com/biocore/qiime/pull/1514#discussion_r19654405"},"pull_request":{"href":"https://api.github.com/repos/biocore/qiime/pulls/1514"}}},"pull_request":{"url":"https://api.github.com/repos/biocore/qiime/pulls/1514","id":14973722,"html_url":"https://github.com/biocore/qiime/pull/1514","diff_url":"https://github.com/biocore/qiime/pull/1514.diff","patch_url":"https://github.com/biocore/qiime/pull/1514.patch","issue_url":"https://api.github.com/repos/biocore/qiime/issues/1514","number":1514,"state":"open","locked":false,"title":"addition of LEA-Seq method","user":{"login":"charudatta-navare","id":1546318,"avatar_url":"https://avatars.githubusercontent.com/u/1546318?v=2","gravatar_id":"","url":"https://api.github.com/users/charudatta-navare","html_url":"https://github.com/charudatta-navare","followers_url":"https://api.github.com/users/charudatta-navare/followers","following_url":"https://api.github.com/users/charudatta-navare/following{/other_user}","gists_url":"https://api.github.com/users/charudatta-navare/gists{/gist_id}","starred_url":"https://api.github.com/users/charudatta-navare/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/charudatta-navare/subscriptions","organizations_url":"https://api.github.com/users/charudatta-navare/orgs","repos_url":"https://api.github.com/users/charudatta-navare/repos","events_url":"https://api.github.com/users/charudatta-navare/events{/privacy}","received_events_url":"https://api.github.com/users/charudatta-navare/received_events","type":"User","site_admin":false},"body":"Implements Low-Error Amplicon Sequencing (LEA-Seq) method, described in: Faith, Jeremiah J., et al. \"The long-term stability of the human gut microbiota.\" Science 341.6141 (2013).\r\nI need to add a couple of functions in split_libraries_lea_seq.py, and I need to add unit tests. I will add those soon.","created_at":"2014-04-21T17:03:35Z","updated_at":"2014-10-31T07:11:58Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f9d9b18839bd0d618481bad664359b7943a18f94","assignee":{"login":"jairideout","id":1847232,"avatar_url":"https://avatars.githubusercontent.com/u/1847232?v=2","gravatar_id":"","url":"https://api.github.com/users/jairideout","html_url":"https://github.com/jairideout","followers_url":"https://api.github.com/users/jairideout/followers","following_url":"https://api.github.com/users/jairideout/following{/other_user}","gists_url":"https://api.github.com/users/jairideout/gists{/gist_id}","starred_url":"https://api.github.com/users/jairideout/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jairideout/subscriptions","organizations_url":"https://api.github.com/users/jairideout/orgs","repos_url":"https://api.github.com/users/jairideout/repos","events_url":"https://api.github.com/users/jairideout/events{/privacy}","received_events_url":"https://api.github.com/users/jairideout/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/biocore/qiime/pulls/1514/commits","review_comments_url":"https://api.github.com/repos/biocore/qiime/pulls/1514/comments","review_comment_url":"https://api.github.com/repos/biocore/qiime/pulls/comments/{number}","comments_url":"https://api.github.com/repos/biocore/qiime/issues/1514/comments","statuses_url":"https://api.github.com/repos/biocore/qiime/statuses/f53f965f842f86ab0f23c7ba8483c309eaeb1d0f","head":{"label":"charudatta-navare:master","ref":"master","sha":"f53f965f842f86ab0f23c7ba8483c309eaeb1d0f","user":{"login":"charudatta-navare","id":1546318,"avatar_url":"https://avatars.githubusercontent.com/u/1546318?v=2","gravatar_id":"","url":"https://api.github.com/users/charudatta-navare","html_url":"https://github.com/charudatta-navare","followers_url":"https://api.github.com/users/charudatta-navare/followers","following_url":"https://api.github.com/users/charudatta-navare/following{/other_user}","gists_url":"https://api.github.com/users/charudatta-navare/gists{/gist_id}","starred_url":"https://api.github.com/users/charudatta-navare/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/charudatta-navare/subscriptions","organizations_url":"https://api.github.com/users/charudatta-navare/orgs","repos_url":"https://api.github.com/users/charudatta-navare/repos","events_url":"https://api.github.com/users/charudatta-navare/events{/privacy}","received_events_url":"https://api.github.com/users/charudatta-navare/received_events","type":"User","site_admin":false},"repo":{"id":13200556,"name":"qiime","full_name":"charudatta-navare/qiime","owner":{"login":"charudatta-navare","id":1546318,"avatar_url":"https://avatars.githubusercontent.com/u/1546318?v=2","gravatar_id":"","url":"https://api.github.com/users/charudatta-navare","html_url":"https://github.com/charudatta-navare","followers_url":"https://api.github.com/users/charudatta-navare/followers","following_url":"https://api.github.com/users/charudatta-navare/following{/other_user}","gists_url":"https://api.github.com/users/charudatta-navare/gists{/gist_id}","starred_url":"https://api.github.com/users/charudatta-navare/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/charudatta-navare/subscriptions","organizations_url":"https://api.github.com/users/charudatta-navare/orgs","repos_url":"https://api.github.com/users/charudatta-navare/repos","events_url":"https://api.github.com/users/charudatta-navare/events{/privacy}","received_events_url":"https://api.github.com/users/charudatta-navare/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/charudatta-navare/qiime","description":"Quantitative Insights Into Microbial Ecology (QIIME): Official repository for software and unit tests","fork":true,"url":"https://api.github.com/repos/charudatta-navare/qiime","forks_url":"https://api.github.com/repos/charudatta-navare/qiime/forks","keys_url":"https://api.github.com/repos/charudatta-navare/qiime/keys{/key_id}","collaborators_url":"https://api.github.com/repos/charudatta-navare/qiime/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/charudatta-navare/qiime/teams","hooks_url":"https://api.github.com/repos/charudatta-navare/qiime/hooks","issue_events_url":"https://api.github.com/repos/charudatta-navare/qiime/issues/events{/number}","events_url":"https://api.github.com/repos/charudatta-navare/qiime/events","assignees_url":"https://api.github.com/repos/charudatta-navare/qiime/assignees{/user}","branches_url":"https://api.github.com/repos/charudatta-navare/qiime/branches{/branch}","tags_url":"https://api.github.com/repos/charudatta-navare/qiime/tags","blobs_url":"https://api.github.com/repos/charudatta-navare/qiime/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/charudatta-navare/qiime/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/charudatta-navare/qiime/git/refs{/sha}","trees_url":"https://api.github.com/repos/charudatta-navare/qiime/git/trees{/sha}","statuses_url":"https://api.github.com/repos/charudatta-navare/qiime/statuses/{sha}","languages_url":"https://api.github.com/repos/charudatta-navare/qiime/languages","stargazers_url":"https://api.github.com/repos/charudatta-navare/qiime/stargazers","contributors_url":"https://api.github.com/repos/charudatta-navare/qiime/contributors","subscribers_url":"https://api.github.com/repos/charudatta-navare/qiime/subscribers","subscription_url":"https://api.github.com/repos/charudatta-navare/qiime/subscription","commits_url":"https://api.github.com/repos/charudatta-navare/qiime/commits{/sha}","git_commits_url":"https://api.github.com/repos/charudatta-navare/qiime/git/commits{/sha}","comments_url":"https://api.github.com/repos/charudatta-navare/qiime/comments{/number}","issue_comment_url":"https://api.github.com/repos/charudatta-navare/qiime/issues/comments/{number}","contents_url":"https://api.github.com/repos/charudatta-navare/qiime/contents/{+path}","compare_url":"https://api.github.com/repos/charudatta-navare/qiime/compare/{base}...{head}","merges_url":"https://api.github.com/repos/charudatta-navare/qiime/merges","archive_url":"https://api.github.com/repos/charudatta-navare/qiime/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/charudatta-navare/qiime/downloads","issues_url":"https://api.github.com/repos/charudatta-navare/qiime/issues{/number}","pulls_url":"https://api.github.com/repos/charudatta-navare/qiime/pulls{/number}","milestones_url":"https://api.github.com/repos/charudatta-navare/qiime/milestones{/number}","notifications_url":"https://api.github.com/repos/charudatta-navare/qiime/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/charudatta-navare/qiime/labels{/name}","releases_url":"https://api.github.com/repos/charudatta-navare/qiime/releases{/id}","created_at":"2013-09-29T21:45:18Z","updated_at":"2014-07-14T18:11:54Z","pushed_at":"2014-10-31T07:01:52Z","git_url":"git://github.com/charudatta-navare/qiime.git","ssh_url":"git@github.com:charudatta-navare/qiime.git","clone_url":"https://github.com/charudatta-navare/qiime.git","svn_url":"https://github.com/charudatta-navare/qiime","homepage":"www.qiime.org","size":88815,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"biocore:master","ref":"master","sha":"3a5ac1dc5aad9a61b6d9c6b3d27c6e00ac2bf260","user":{"login":"biocore","id":6241857,"avatar_url":"https://avatars.githubusercontent.com/u/6241857?v=2","gravatar_id":"","url":"https://api.github.com/users/biocore","html_url":"https://github.com/biocore","followers_url":"https://api.github.com/users/biocore/followers","following_url":"https://api.github.com/users/biocore/following{/other_user}","gists_url":"https://api.github.com/users/biocore/gists{/gist_id}","starred_url":"https://api.github.com/users/biocore/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/biocore/subscriptions","organizations_url":"https://api.github.com/users/biocore/orgs","repos_url":"https://api.github.com/users/biocore/repos","events_url":"https://api.github.com/users/biocore/events{/privacy}","received_events_url":"https://api.github.com/users/biocore/received_events","type":"Organization","site_admin":false},"repo":{"id":6209952,"name":"qiime","full_name":"biocore/qiime","owner":{"login":"biocore","id":6241857,"avatar_url":"https://avatars.githubusercontent.com/u/6241857?v=2","gravatar_id":"","url":"https://api.github.com/users/biocore","html_url":"https://github.com/biocore","followers_url":"https://api.github.com/users/biocore/followers","following_url":"https://api.github.com/users/biocore/following{/other_user}","gists_url":"https://api.github.com/users/biocore/gists{/gist_id}","starred_url":"https://api.github.com/users/biocore/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/biocore/subscriptions","organizations_url":"https://api.github.com/users/biocore/orgs","repos_url":"https://api.github.com/users/biocore/repos","events_url":"https://api.github.com/users/biocore/events{/privacy}","received_events_url":"https://api.github.com/users/biocore/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/biocore/qiime","description":"Quantitative Insights Into Microbial Ecology (QIIME): Official repository for software and unit tests","fork":false,"url":"https://api.github.com/repos/biocore/qiime","forks_url":"https://api.github.com/repos/biocore/qiime/forks","keys_url":"https://api.github.com/repos/biocore/qiime/keys{/key_id}","collaborators_url":"https://api.github.com/repos/biocore/qiime/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/biocore/qiime/teams","hooks_url":"https://api.github.com/repos/biocore/qiime/hooks","issue_events_url":"https://api.github.com/repos/biocore/qiime/issues/events{/number}","events_url":"https://api.github.com/repos/biocore/qiime/events","assignees_url":"https://api.github.com/repos/biocore/qiime/assignees{/user}","branches_url":"https://api.github.com/repos/biocore/qiime/branches{/branch}","tags_url":"https://api.github.com/repos/biocore/qiime/tags","blobs_url":"https://api.github.com/repos/biocore/qiime/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/biocore/qiime/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/biocore/qiime/git/refs{/sha}","trees_url":"https://api.github.com/repos/biocore/qiime/git/trees{/sha}","statuses_url":"https://api.github.com/repos/biocore/qiime/statuses/{sha}","languages_url":"https://api.github.com/repos/biocore/qiime/languages","stargazers_url":"https://api.github.com/repos/biocore/qiime/stargazers","contributors_url":"https://api.github.com/repos/biocore/qiime/contributors","subscribers_url":"https://api.github.com/repos/biocore/qiime/subscribers","subscription_url":"https://api.github.com/repos/biocore/qiime/subscription","commits_url":"https://api.github.com/repos/biocore/qiime/commits{/sha}","git_commits_url":"https://api.github.com/repos/biocore/qiime/git/commits{/sha}","comments_url":"https://api.github.com/repos/biocore/qiime/comments{/number}","issue_comment_url":"https://api.github.com/repos/biocore/qiime/issues/comments/{number}","contents_url":"https://api.github.com/repos/biocore/qiime/contents/{+path}","compare_url":"https://api.github.com/repos/biocore/qiime/compare/{base}...{head}","merges_url":"https://api.github.com/repos/biocore/qiime/merges","archive_url":"https://api.github.com/repos/biocore/qiime/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/biocore/qiime/downloads","issues_url":"https://api.github.com/repos/biocore/qiime/issues{/number}","pulls_url":"https://api.github.com/repos/biocore/qiime/pulls{/number}","milestones_url":"https://api.github.com/repos/biocore/qiime/milestones{/number}","notifications_url":"https://api.github.com/repos/biocore/qiime/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/biocore/qiime/labels{/name}","releases_url":"https://api.github.com/repos/biocore/qiime/releases{/id}","created_at":"2012-10-14T02:51:46Z","updated_at":"2014-10-24T08:07:24Z","pushed_at":"2014-10-31T03:17:19Z","git_url":"git://github.com/biocore/qiime.git","ssh_url":"git@github.com:biocore/qiime.git","clone_url":"https://github.com/biocore/qiime.git","svn_url":"https://github.com/biocore/qiime","homepage":"www.qiime.org","size":124113,"stargazers_count":88,"watchers_count":88,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":108,"mirror_url":null,"open_issues_count":380,"forks":108,"open_issues":380,"watchers":88,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/biocore/qiime/pulls/1514"},"html":{"href":"https://github.com/biocore/qiime/pull/1514"},"issue":{"href":"https://api.github.com/repos/biocore/qiime/issues/1514"},"comments":{"href":"https://api.github.com/repos/biocore/qiime/issues/1514/comments"},"review_comments":{"href":"https://api.github.com/repos/biocore/qiime/pulls/1514/comments"},"review_comment":{"href":"https://api.github.com/repos/biocore/qiime/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/biocore/qiime/pulls/1514/commits"},"statuses":{"href":"https://api.github.com/repos/biocore/qiime/statuses/f53f965f842f86ab0f23c7ba8483c309eaeb1d0f"}}}}