{"action":"created","comment":{"url":"https://api.github.com/repos/BD2KGenomics/protect/pulls/comments/111248899","pull_request_review_id":32452872,"id":111248899,"diff_hunk":"@@ -30,3 +41,321 @@ def run_fusion_caller(job, star_bam, univ_options, fusion_options):\n     fusion_file = job.fileStore.getLocalTempFile()\n     output_file = job.fileStore.writeGlobalFile(fusion_file)\n     return output_file\n+\n+\n+def star_fusion_disk(rna_fastqs, star_tar):\n+    return int(4 * ceil(sum([f.size for f in rna_fastqs]) + 524288) +\n+               2 * ceil(star_tar.size + 524288) +\n+               5242880)\n+\n+def run_star_fusion(job, fastqs, junction_file, univ_options, star_fusion_options):\n+    \"\"\"\n+    Runs STAR-Fusion and filters fusion calls using FusionInspector\n+\n+    :param job job: job\n+    :param tuple fastqs: RNA-Seq FASTQ Filestore IDs\n+    :param FsID junction_file: Chimeric junction file\n+    :param dict univ_options: universal arguments used by almost all tools\n+    :param dict star_fusion_options: STAR-Fusion specific parameters\n+    :return: Transgene BEDPE file\n+    :rtype: Filestore ID\n+    \"\"\"\n+    job.fileStore.logToMaster('Running STAR-Fusion on %s' % univ_options['patient'])\n+    work_dir = job.fileStore.getLocalTempDir()\n+    input_files = {'rna_1.fq.gz': fastqs[0],\n+                   'rna_2.fq.gz': fastqs[1],\n+                   'tool_index.tar.gz': star_fusion_options['index']}\n+\n+    parameters = []\n+\n+    # If there isn't a junction file, then we can run STAR-Fusion from the fastq files\n+    if junction_file is not None:\n+        input_files['STAR.junction'] = junction_file\n+        parameters.extend(['--chimeric_junction', 'STAR.junction'])\n+    else:\n+        parameters.extend(['--left_fq', 'rna_1.fq.gz', '--right_fq', 'rna_2.fq.gz'])\n+\n+    input_files = get_files_from_filestore(job, input_files, work_dir, docker=False)\n+    input_files['tool_index'] = os.path.basename(untargz(input_files['tool_index.tar.gz'], work_dir))\n+\n+    cores = star_fusion_options['n']\n+    parameters.extend(['--output_dir', '/data/fusion-output',    # Docker container mounts work_dir at /data\n+                       '--genome_lib_dir', input_files['tool_index'],\n+                       '--CPU', str(cores)])\n+\n+    docker_call(tool='star-fusion',\n+                tool_parameters=parameters,\n+                work_dir=work_dir,\n+                dockerhub='jpfeil',\n+                tool_version='protect')\n+\n+    fusion_path = os.path.join(work_dir, 'fusion-output/star-fusion.fusion_candidates.final.abridged')\n+\n+    # Check for fusion prediction\n+    with open(fusion_path, 'r') as f:\n+        # Skip header\n+        f.next()\n+        try:\n+            f.next()\n+        except StopIteration:\n+            logging.warning('%s: Did not find any fusions!' % univ_options['patient'])\n+            return\n+\n+    parameters = ['--fusions', '/data/fusion-output/star-fusion.fusion_candidates.final.abridged',\n+                  '--genome_lib', input_files['tool_index'],\n+                  '--left_fq', 'rna_1.fq.gz',\n+                  '--right_fq', 'rna_2.fq.gz',\n+                  '--out_dir', '/data/FusionInspector',\n+                  '--out_prefix', 'FusionInspector',\n+                  '--include_Trinity',\n+                  '--CPU', str(cores)]\n+\n+    docker_call(tool='fusion-inspector',\n+                tool_parameters=parameters,\n+                work_dir=work_dir,\n+                dockerhub='jpfeil',\n+                tool_version='protect')\n+\n+    found_fusion = False\n+    fusion_path = os.path.join(work_dir, 'FusionInspector/FusionInspector.fusion_predictions.final.abridged.FFPM')\n+    output_path = os.path.join(work_dir, 'fusion.final')\n+\n+    # Remove fusions without at least 0.1 fusion fragments per million reads\n+    if os.path.exists(fusion_path):\n+        with open(fusion_path, 'r') as f, open(output_path, 'w') as g:\n+            g.write(f.next())\n+            for line in f:\n+                j_ffpm, s_ffpm = line.split()[-2:]\n+                if sum([float(j_ffpm), float(s_ffpm)]) > 0.1:\n+                    found_fusion = True\n+                    g.write(line)\n+\n+    if found_fusion:\n+        fusion_bed_path = os.path.join(work_dir, 'FusionInspector/FusionInspector.bed')\n+        transcript_path = os.path.join(work_dir, 'FusionInspector/FusionInspector.gmap_trinity_GG.fusions.fasta')\n+        transcript_gff_path = os.path.join(work_dir, 'FusionInspector/FusionInspector.gmap_trinity_GG.fusions.gff3')\n+\n+        fusion_annotation = job.fileStore.writeGlobalFile(fusion_bed_path)\n+        filtered_fusions = job.fileStore.writeGlobalFile(output_path)\n+        transcripts = job.fileStore.writeGlobalFile(transcript_path)\n+        transcript_annotation = job.fileStore.writeGlobalFile(transcript_gff_path)\n+\n+        export_results(job, filtered_fusions, output_path, univ_options, subfolder='mutations/fusions')\n+        export_results(job, transcripts, transcript_path, univ_options, subfolder='mutations/fusions')\n+        export_results(job, transcript_annotation, transcript_gff_path, univ_options, subfolder='mutations/fusions')\n+        return job.addChildJobFn(reformat_star_fusion_output,\n+                                 fusion_annotation,\n+                                 filtered_fusions,\n+                                 transcripts,\n+                                 transcript_annotation,\n+                                 univ_options).rv()\n+\n+\n+def parse_star_fusion(infile):\n+    \"\"\"\n+    Parses STAR-Fusion format and returns an Expando object with basic features\n+\n+    :param str infile: path to STAR-Fusion prediction file\n+    :return: Fusion prediction attributes\n+    :rtype: Expando\n+    \"\"\"\n+    reader = csv.reader(infile, delimiter='\\t')\n+    header = reader.next()\n+    header = {key: index for index, key in enumerate(header)}\n+\n+    features = ['LeftGene', 'LeftLocalBreakpoint', 'LeftBreakpoint',\n+                'RightGene', 'RightLocalBreakpoint', 'RightBreakpoint',\n+                'JunctionReadCount', 'SpanningFragCount']\n+\n+    for line in reader:\n+        yield Expando(dict((feature, line[header[feature]]) for feature in features))\n+\n+\n+def get_transcripts(transcript_file):\n+    \"\"\"\n+    Parses FusionInspector transcript file and returns dictionary of sequences\n+\n+    :param str transcript_file: path to transcript FASTA\n+    :return: de novo assembled transcripts\n+    :rtype: dict\n+    \"\"\"\n+    with open(transcript_file, 'r') as fa:\n+        transcripts = {}\n+        regex = re.compile(r\"(?P<ID>TRINITY.*)\\s(?P<fusion>.*--.*):(?P<left_start>\\d+)-(?P<right_start>\\d+)\")\n+        while True:\n+            # Usually the transcript is on one line\n+            try:\n+                info = fa.next()\n+                seq = fa.next()\n+\n+                assert info.startswith('>')\n+\n+                m = regex.search(info)\n+                if m:\n+                    transcripts[m.group('ID')] = seq.strip()\n+\n+            except StopIteration:\n+                break\n+\n+            except AssertionError:\n+                print(\"WARNING: Malformed fusion transcript file\")\n+    return transcripts\n+\n+\n+def split_fusion_transcript(annotation_path, transcripts):\n+    \"\"\"\n+    Finds the breakpoint in the fusion transcript and splits the 5' donor from the 3' acceptor\n+\n+    :param str annotation_path: Path to transcript annotation file\n+    :param dict transcripts: Dictionary of fusion transcripts\n+    :return: 5' donor sequences and 3' acceptor sequences\n+    :rtype: tuple\n+    \"\"\"\n+    annotation = collections.defaultdict(dict)\n+\n+    forward = 'ACGTN'\n+    reverse = 'TGCAN'\n+    trans = string.maketrans(forward, reverse)\n+\n+    # Pull in assembled transcript annotation\n+    five_pr_splits = collections.defaultdict(dict)\n+    three_pr_splits = collections.defaultdict(dict)\n+\n+    regex = re.compile(r'ID=(?P<ID>.*);Name=(?P<Name>.*);Target=(?P<Target>.*)\\s(?P<start>\\d+)\\s(?P<stop>\\d+)')\n+\n+    with open(annotation_path, 'r') as gff:\n+        for line in gff:\n+            print(line)\n+            if line.startswith('#'):\n+                _, eyd, fusion = line.strip().split()\n+                fusion, start_stop = fusion.split(':')\n+                left_break, right_break = start_stop.split('-')\n+\n+                annotation[fusion][eyd] = {}\n+                annotation[fusion][eyd]['left_break'] = left_break\n+                annotation[fusion][eyd]['right_break'] = right_break\n+\n+            else:\n+                line = line.strip().split('\\t')\n+                fusion = line[0]\n+                strand = line[6]\n+                block_start = line[3]\n+                block_stop = line[4]\n+                attr = line[8]\n+                m = regex.search(attr)\n+                if m:\n+                    transcript_id = m.group('Name')\n+\n+                    if strand == '-' and any([block_start == annotation[fusion][transcript_id]['right_break'],\n+                                              block_stop == annotation[fusion][transcript_id]['right_break']]):\n+                        transcript_split = int(m.group('stop')) + 1   # Off by one\n+                        # Take the reverse complement to orient transcripts from 5' to 3'\n+                        five_seq = transcripts[transcript_id][transcript_split:].translate(trans)[::-1]\n+                        five_pr_splits[fusion][transcript_id] = five_seq\n+                        three_seq = transcripts[transcript_id][:transcript_split].translate(trans)[::-1]\n+                        three_pr_splits[fusion][transcript_id] = three_seq\n+\n+                    elif strand == '+' and any([block_start == annotation[fusion][transcript_id]['left_break'],\n+                                                block_stop == annotation[fusion][transcript_id]['left_break']]):\n+                        transcript_split = int(m.group('stop'))\n+                        five_pr_splits[fusion][transcript_id] = transcripts[transcript_id][:transcript_split]\n+                        three_pr_splits[fusion][transcript_id] = transcripts[transcript_id][transcript_split:]\n+\n+    return five_pr_splits, three_pr_splits\n+\n+\n+def get_gene_ids(fusion_bed):\n+    \"\"\"\n+    Parses FusionInspector bed file to ascertain the ENSEMBL gene ids\n+\n+    :param str fusion_bed: path to fusion annotation\n+    :return:\n+    \"\"\"\n+    with open(fusion_bed, 'r') as f:\n+        gene_to_id = {}\n+        regex = re.compile(r'(?P<gene>ENSG\\d*)')\n+        for line in f:\n+            line = line.split('\\t')\n+            transcript, gene_bit, name = line[3].split(';')\n+            m = regex.search(gene_bit)\n+            if m:\n+                gene_to_id[name] = m.group('gene')\n+    return gene_to_id\n+\n+\n+def reformat_star_fusion_output(job, fusion_annot, fusion_file, transcript_file, transcript_gff_file, univ_options):\n+    \"\"\"\n+    Writes STAR-Fusion results in Transgene BEDPE format\n+\n+    :param job job: job\n+    :param FsID fusion_file: STAR-fusion prediction file\n+    :param FsID transcript_file: Fusion transcript FASTA file\n+    :param FsID transcript_gff_file: Fusion transcript GFF file\n+    :param univ_options: universal arguments used by almost all tools\n+    :return: Transgene BEDPE file\n+    :rtype: FsID\n+    \"\"\"\n+    job.fileStore.logToMaster('Reformatting STAR-Fusion output for %s' % univ_options['patient'])\n+\n+    input_files = {'results.tsv': fusion_file,\n+                   'fusion.bed': fusion_annot,\n+                   'transcripts.fa': transcript_file,\n+                   'transcripts.gff': transcript_gff_file}\n+\n+    work_dir = job.fileStore.getLocalTempDir()\n+    input_files = get_files_from_filestore(job, input_files, work_dir, docker=False)\n+\n+    # Pull in assembled transcript file\n+    hugo_to_gene_ids = get_gene_ids(input_files['fusion.bed'])\n+    transcripts = get_transcripts(input_files['transcripts.fa'])\n+    five_pr_splits, three_pr_splits = split_fusion_transcript(input_files['transcripts.gff'], transcripts)\n+\n+    # Pull in assembled transcript annotation\n+\n+    # Header for BEDPE file\n+    header = ['# chr1', 'start1', 'end1',\n+              'chr2', 'start2', 'end2',\n+              'name', 'score',\n+              'strand1', 'strand2',\n+              'junctionSeq1', 'junctionSeq2',\n+              'hugo1', 'hugo2']\n+\n+    output_path = os.path.join(work_dir, 'fusion_results.bedpe')\n+    with open(input_files['results.tsv'], 'r') as in_f, open(output_path, 'w') as out_f:\n+        writer = csv.writer(out_f, delimiter='\\t')\n+        writer.writerow(header)\n+        for record in parse_star_fusion(in_f):\n+\n+            left_chr, left_break, left_strand = record.LeftBreakpoint.split(':')\n+\n+            right_chr, right_break, right_strand = record.RightBreakpoint.split(':')\n+\n+            fusion = ''.join([record.LeftGene, '--', record.RightGene])\n+            name = '-'.join([hugo_to_gene_ids[record.LeftGene], hugo_to_gene_ids[record.RightGene]])\n+            score = 'Junction:%s-Spanning:%s' % (record.JunctionReadCount, record.SpanningFragCount)\n+\n+            # Add empty sequences in case Trinity doesn't output one\n+            if len(five_pr_splits[fusion].keys()) == 0:\n+                five_pr_splits[fusion]['N/A'] = '.'\n+            if len(three_pr_splits[fusion].keys()) == 0:\n+                three_pr_splits[fusion]['N/A'] = '.'\n+\n+            for transcript_id in five_pr_splits[fusion].keys():\n+                five_prime_seq = five_pr_splits[fusion][transcript_id]\n+                three_prime_seq = three_pr_splits[fusion][transcript_id]\n+\n+                writer.writerow([left_chr,\n+                                 '.',  # Donor start position is not necessary\n+                                 left_break,\n+                                 right_chr,\n+                                 right_break,\n+                                 '.',  # Acceptor end position is not necessary\n+                                 name,\n+                                 score,\n+                                 left_strand,\n+                                 right_strand,\n+                                 five_prime_seq,\n+                                 three_prime_seq,\n+                                 record.LeftGene,\n+                                 record.RightGene])\n+    return job.fileStore.writeGlobalFile(output_path)","path":"src/protect/mutation_calling/fusion.py","position":339,"original_position":339,"commit_id":"30c4c4d0705a095ab6e4eb9443b13483b251355a","original_commit_id":"30c4c4d0705a095ab6e4eb9443b13483b251355a","user":{"login":"arkal","id":11653944,"avatar_url":"https://avatars2.githubusercontent.com/u/11653944?v=3","gravatar_id":"","url":"https://api.github.com/users/arkal","html_url":"https://github.com/arkal","followers_url":"https://api.github.com/users/arkal/followers","following_url":"https://api.github.com/users/arkal/following{/other_user}","gists_url":"https://api.github.com/users/arkal/gists{/gist_id}","starred_url":"https://api.github.com/users/arkal/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/arkal/subscriptions","organizations_url":"https://api.github.com/users/arkal/orgs","repos_url":"https://api.github.com/users/arkal/repos","events_url":"https://api.github.com/users/arkal/events{/privacy}","received_events_url":"https://api.github.com/users/arkal/received_events","type":"User","site_admin":false},"body":"Do we want to export this?","created_at":"2017-04-12T20:14:18Z","updated_at":"2017-04-12T20:16:51Z","html_url":"https://github.com/BD2KGenomics/protect/pull/92#discussion_r111248899","pull_request_url":"https://api.github.com/repos/BD2KGenomics/protect/pulls/92","_links":{"self":{"href":"https://api.github.com/repos/BD2KGenomics/protect/pulls/comments/111248899"},"html":{"href":"https://github.com/BD2KGenomics/protect/pull/92#discussion_r111248899"},"pull_request":{"href":"https://api.github.com/repos/BD2KGenomics/protect/pulls/92"}}},"pull_request":{"url":"https://api.github.com/repos/BD2KGenomics/protect/pulls/92","id":79599920,"html_url":"https://github.com/BD2KGenomics/protect/pull/92","diff_url":"https://github.com/BD2KGenomics/protect/pull/92.diff","patch_url":"https://github.com/BD2KGenomics/protect/pull/92.patch","issue_url":"https://api.github.com/repos/BD2KGenomics/protect/issues/92","number":92,"state":"open","locked":false,"title":"Add fusion support (resolves #1)","user":{"login":"jpfeil","id":12463956,"avatar_url":"https://avatars2.githubusercontent.com/u/12463956?v=3","gravatar_id":"","url":"https://api.github.com/users/jpfeil","html_url":"https://github.com/jpfeil","followers_url":"https://api.github.com/users/jpfeil/followers","following_url":"https://api.github.com/users/jpfeil/following{/other_user}","gists_url":"https://api.github.com/users/jpfeil/gists{/gist_id}","starred_url":"https://api.github.com/users/jpfeil/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jpfeil/subscriptions","organizations_url":"https://api.github.com/users/jpfeil/orgs","repos_url":"https://api.github.com/users/jpfeil/repos","events_url":"https://api.github.com/users/jpfeil/events{/privacy}","received_events_url":"https://api.github.com/users/jpfeil/received_events","type":"User","site_admin":false},"body":"resolves #1 \n","created_at":"2016-08-01T16:50:32Z","updated_at":"2017-04-12T20:16:51Z","closed_at":null,"merged_at":null,"merge_commit_sha":"014d68b82520d7a373f97bc128f62f0d67a0bceb","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/BD2KGenomics/protect/pulls/92/commits","review_comments_url":"https://api.github.com/repos/BD2KGenomics/protect/pulls/92/comments","review_comment_url":"https://api.github.com/repos/BD2KGenomics/protect/pulls/comments{/number}","comments_url":"https://api.github.com/repos/BD2KGenomics/protect/issues/92/comments","statuses_url":"https://api.github.com/repos/BD2KGenomics/protect/statuses/30c4c4d0705a095ab6e4eb9443b13483b251355a","head":{"label":"BD2KGenomics:issues/1-implement-fusion-support","ref":"issues/1-implement-fusion-support","sha":"30c4c4d0705a095ab6e4eb9443b13483b251355a","user":{"login":"BD2KGenomics","id":8701293,"avatar_url":"https://avatars3.githubusercontent.com/u/8701293?v=3","gravatar_id":"","url":"https://api.github.com/users/BD2KGenomics","html_url":"https://github.com/BD2KGenomics","followers_url":"https://api.github.com/users/BD2KGenomics/followers","following_url":"https://api.github.com/users/BD2KGenomics/following{/other_user}","gists_url":"https://api.github.com/users/BD2KGenomics/gists{/gist_id}","starred_url":"https://api.github.com/users/BD2KGenomics/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/BD2KGenomics/subscriptions","organizations_url":"https://api.github.com/users/BD2KGenomics/orgs","repos_url":"https://api.github.com/users/BD2KGenomics/repos","events_url":"https://api.github.com/users/BD2KGenomics/events{/privacy}","received_events_url":"https://api.github.com/users/BD2KGenomics/received_events","type":"Organization","site_admin":false},"repo":{"id":51034200,"name":"protect","full_name":"BD2KGenomics/protect","owner":{"login":"BD2KGenomics","id":8701293,"avatar_url":"https://avatars3.githubusercontent.com/u/8701293?v=3","gravatar_id":"","url":"https://api.github.com/users/BD2KGenomics","html_url":"https://github.com/BD2KGenomics","followers_url":"https://api.github.com/users/BD2KGenomics/followers","following_url":"https://api.github.com/users/BD2KGenomics/following{/other_user}","gists_url":"https://api.github.com/users/BD2KGenomics/gists{/gist_id}","starred_url":"https://api.github.com/users/BD2KGenomics/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/BD2KGenomics/subscriptions","organizations_url":"https://api.github.com/users/BD2KGenomics/orgs","repos_url":"https://api.github.com/users/BD2KGenomics/repos","events_url":"https://api.github.com/users/BD2KGenomics/events{/privacy}","received_events_url":"https://api.github.com/users/BD2KGenomics/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/BD2KGenomics/protect","description":null,"fork":false,"url":"https://api.github.com/repos/BD2KGenomics/protect","forks_url":"https://api.github.com/repos/BD2KGenomics/protect/forks","keys_url":"https://api.github.com/repos/BD2KGenomics/protect/keys{/key_id}","collaborators_url":"https://api.github.com/repos/BD2KGenomics/protect/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/BD2KGenomics/protect/teams","hooks_url":"https://api.github.com/repos/BD2KGenomics/protect/hooks","issue_events_url":"https://api.github.com/repos/BD2KGenomics/protect/issues/events{/number}","events_url":"https://api.github.com/repos/BD2KGenomics/protect/events","assignees_url":"https://api.github.com/repos/BD2KGenomics/protect/assignees{/user}","branches_url":"https://api.github.com/repos/BD2KGenomics/protect/branches{/branch}","tags_url":"https://api.github.com/repos/BD2KGenomics/protect/tags","blobs_url":"https://api.github.com/repos/BD2KGenomics/protect/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/BD2KGenomics/protect/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/BD2KGenomics/protect/git/refs{/sha}","trees_url":"https://api.github.com/repos/BD2KGenomics/protect/git/trees{/sha}","statuses_url":"https://api.github.com/repos/BD2KGenomics/protect/statuses/{sha}","languages_url":"https://api.github.com/repos/BD2KGenomics/protect/languages","stargazers_url":"https://api.github.com/repos/BD2KGenomics/protect/stargazers","contributors_url":"https://api.github.com/repos/BD2KGenomics/protect/contributors","subscribers_url":"https://api.github.com/repos/BD2KGenomics/protect/subscribers","subscription_url":"https://api.github.com/repos/BD2KGenomics/protect/subscription","commits_url":"https://api.github.com/repos/BD2KGenomics/protect/commits{/sha}","git_commits_url":"https://api.github.com/repos/BD2KGenomics/protect/git/commits{/sha}","comments_url":"https://api.github.com/repos/BD2KGenomics/protect/comments{/number}","issue_comment_url":"https://api.github.com/repos/BD2KGenomics/protect/issues/comments{/number}","contents_url":"https://api.github.com/repos/BD2KGenomics/protect/contents/{+path}","compare_url":"https://api.github.com/repos/BD2KGenomics/protect/compare/{base}...{head}","merges_url":"https://api.github.com/repos/BD2KGenomics/protect/merges","archive_url":"https://api.github.com/repos/BD2KGenomics/protect/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/BD2KGenomics/protect/downloads","issues_url":"https://api.github.com/repos/BD2KGenomics/protect/issues{/number}","pulls_url":"https://api.github.com/repos/BD2KGenomics/protect/pulls{/number}","milestones_url":"https://api.github.com/repos/BD2KGenomics/protect/milestones{/number}","notifications_url":"https://api.github.com/repos/BD2KGenomics/protect/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/BD2KGenomics/protect/labels{/name}","releases_url":"https://api.github.com/repos/BD2KGenomics/protect/releases{/id}","deployments_url":"https://api.github.com/repos/BD2KGenomics/protect/deployments","created_at":"2016-02-03T22:09:00Z","updated_at":"2017-03-15T23:53:25Z","pushed_at":"2017-04-12T18:35:48Z","git_url":"git://github.com/BD2KGenomics/protect.git","ssh_url":"git@github.com:BD2KGenomics/protect.git","clone_url":"https://github.com/BD2KGenomics/protect.git","svn_url":"https://github.com/BD2KGenomics/protect","homepage":null,"size":465,"stargazers_count":10,"watchers_count":10,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3,"mirror_url":null,"open_issues_count":24,"forks":3,"open_issues":24,"watchers":10,"default_branch":"master"}},"base":{"label":"BD2KGenomics:master","ref":"master","sha":"afd3e218c23521b917832742a4acb06019e07a7a","user":{"login":"BD2KGenomics","id":8701293,"avatar_url":"https://avatars3.githubusercontent.com/u/8701293?v=3","gravatar_id":"","url":"https://api.github.com/users/BD2KGenomics","html_url":"https://github.com/BD2KGenomics","followers_url":"https://api.github.com/users/BD2KGenomics/followers","following_url":"https://api.github.com/users/BD2KGenomics/following{/other_user}","gists_url":"https://api.github.com/users/BD2KGenomics/gists{/gist_id}","starred_url":"https://api.github.com/users/BD2KGenomics/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/BD2KGenomics/subscriptions","organizations_url":"https://api.github.com/users/BD2KGenomics/orgs","repos_url":"https://api.github.com/users/BD2KGenomics/repos","events_url":"https://api.github.com/users/BD2KGenomics/events{/privacy}","received_events_url":"https://api.github.com/users/BD2KGenomics/received_events","type":"Organization","site_admin":false},"repo":{"id":51034200,"name":"protect","full_name":"BD2KGenomics/protect","owner":{"login":"BD2KGenomics","id":8701293,"avatar_url":"https://avatars3.githubusercontent.com/u/8701293?v=3","gravatar_id":"","url":"https://api.github.com/users/BD2KGenomics","html_url":"https://github.com/BD2KGenomics","followers_url":"https://api.github.com/users/BD2KGenomics/followers","following_url":"https://api.github.com/users/BD2KGenomics/following{/other_user}","gists_url":"https://api.github.com/users/BD2KGenomics/gists{/gist_id}","starred_url":"https://api.github.com/users/BD2KGenomics/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/BD2KGenomics/subscriptions","organizations_url":"https://api.github.com/users/BD2KGenomics/orgs","repos_url":"https://api.github.com/users/BD2KGenomics/repos","events_url":"https://api.github.com/users/BD2KGenomics/events{/privacy}","received_events_url":"https://api.github.com/users/BD2KGenomics/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/BD2KGenomics/protect","description":null,"fork":false,"url":"https://api.github.com/repos/BD2KGenomics/protect","forks_url":"https://api.github.com/repos/BD2KGenomics/protect/forks","keys_url":"https://api.github.com/repos/BD2KGenomics/protect/keys{/key_id}","collaborators_url":"https://api.github.com/repos/BD2KGenomics/protect/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/BD2KGenomics/protect/teams","hooks_url":"https://api.github.com/repos/BD2KGenomics/protect/hooks","issue_events_url":"https://api.github.com/repos/BD2KGenomics/protect/issues/events{/number}","events_url":"https://api.github.com/repos/BD2KGenomics/protect/events","assignees_url":"https://api.github.com/repos/BD2KGenomics/protect/assignees{/user}","branches_url":"https://api.github.com/repos/BD2KGenomics/protect/branches{/branch}","tags_url":"https://api.github.com/repos/BD2KGenomics/protect/tags","blobs_url":"https://api.github.com/repos/BD2KGenomics/protect/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/BD2KGenomics/protect/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/BD2KGenomics/protect/git/refs{/sha}","trees_url":"https://api.github.com/repos/BD2KGenomics/protect/git/trees{/sha}","statuses_url":"https://api.github.com/repos/BD2KGenomics/protect/statuses/{sha}","languages_url":"https://api.github.com/repos/BD2KGenomics/protect/languages","stargazers_url":"https://api.github.com/repos/BD2KGenomics/protect/stargazers","contributors_url":"https://api.github.com/repos/BD2KGenomics/protect/contributors","subscribers_url":"https://api.github.com/repos/BD2KGenomics/protect/subscribers","subscription_url":"https://api.github.com/repos/BD2KGenomics/protect/subscription","commits_url":"https://api.github.com/repos/BD2KGenomics/protect/commits{/sha}","git_commits_url":"https://api.github.com/repos/BD2KGenomics/protect/git/commits{/sha}","comments_url":"https://api.github.com/repos/BD2KGenomics/protect/comments{/number}","issue_comment_url":"https://api.github.com/repos/BD2KGenomics/protect/issues/comments{/number}","contents_url":"https://api.github.com/repos/BD2KGenomics/protect/contents/{+path}","compare_url":"https://api.github.com/repos/BD2KGenomics/protect/compare/{base}...{head}","merges_url":"https://api.github.com/repos/BD2KGenomics/protect/merges","archive_url":"https://api.github.com/repos/BD2KGenomics/protect/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/BD2KGenomics/protect/downloads","issues_url":"https://api.github.com/repos/BD2KGenomics/protect/issues{/number}","pulls_url":"https://api.github.com/repos/BD2KGenomics/protect/pulls{/number}","milestones_url":"https://api.github.com/repos/BD2KGenomics/protect/milestones{/number}","notifications_url":"https://api.github.com/repos/BD2KGenomics/protect/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/BD2KGenomics/protect/labels{/name}","releases_url":"https://api.github.com/repos/BD2KGenomics/protect/releases{/id}","deployments_url":"https://api.github.com/repos/BD2KGenomics/protect/deployments","created_at":"2016-02-03T22:09:00Z","updated_at":"2017-03-15T23:53:25Z","pushed_at":"2017-04-12T18:35:48Z","git_url":"git://github.com/BD2KGenomics/protect.git","ssh_url":"git@github.com:BD2KGenomics/protect.git","clone_url":"https://github.com/BD2KGenomics/protect.git","svn_url":"https://github.com/BD2KGenomics/protect","homepage":null,"size":465,"stargazers_count":10,"watchers_count":10,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3,"mirror_url":null,"open_issues_count":24,"forks":3,"open_issues":24,"watchers":10,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/BD2KGenomics/protect/pulls/92"},"html":{"href":"https://github.com/BD2KGenomics/protect/pull/92"},"issue":{"href":"https://api.github.com/repos/BD2KGenomics/protect/issues/92"},"comments":{"href":"https://api.github.com/repos/BD2KGenomics/protect/issues/92/comments"},"review_comments":{"href":"https://api.github.com/repos/BD2KGenomics/protect/pulls/92/comments"},"review_comment":{"href":"https://api.github.com/repos/BD2KGenomics/protect/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/BD2KGenomics/protect/pulls/92/commits"},"statuses":{"href":"https://api.github.com/repos/BD2KGenomics/protect/statuses/30c4c4d0705a095ab6e4eb9443b13483b251355a"}}}}
{"actor":{"display_login":"arkal"}}