{"action":"created","comment":{"url":"https://api.github.com/repos/broadinstitute/hellbender/pulls/comments/37638626","id":37638626,"diff_hunk":"@@ -0,0 +1,274 @@\n+package org.broadinstitute.hellbender.utils.pileup;\n+\n+import com.google.common.annotations.VisibleForTesting;\n+import htsjdk.samtools.SAMFileHeader;\n+import htsjdk.samtools.util.Locatable;\n+import org.broadinstitute.hellbender.utils.BaseUtils;\n+import org.broadinstitute.hellbender.utils.Utils;\n+import org.broadinstitute.hellbender.utils.read.GATKRead;\n+import org.broadinstitute.hellbender.utils.read.ReadUtils;\n+\n+import java.util.*;\n+import java.util.function.Predicate;\n+import java.util.function.ToIntFunction;\n+import java.util.stream.Collectors;\n+\n+/**\n+ * Represents a pileup of reads at a given position.\n+ */\n+public final class ReadPileup implements Iterable<PileupElement>{\n+    private final Locatable loc;\n+    private final List<PileupElement> pileupElements;\n+\n+    /**\n+     * Create a new pileup at loc, using the reads and their corresponding\n+     * offsets.\n+     * Note: This constructor keeps an alias to the given list.\n+     */\n+    @VisibleForTesting\n+    ReadPileup(final Locatable loc, final List<PileupElement> pileup) {\n+        Utils.nonNull(loc, \"loc is null\");\n+        Utils.nonNull(pileup, \"element list is null\");\n+        this.loc = loc;\n+        this.pileupElements = pileup;\n+    }\n+\n+    /**\n+     * Create a new pileup without any aligned reads\n+     */\n+    public ReadPileup(final Locatable loc) {\n+        this(loc, Collections.emptyList());\n+    }\n+\n+    /**\n+     * Create a new pileup with the given reads.\n+     */\n+    public ReadPileup(final Locatable loc, final List<GATKRead> reads, final int offset) {\n+        this(loc, readsOffsetsToPileup(reads, offset));\n+    }\n+\n+\n+    /**\n+     * Create a new pileup with the given reads.\n+     */\n+    public ReadPileup(final Locatable loc, final List<GATKRead> reads, final List<Integer> offsets) {\n+        this(loc, readsOffsetsToPileup(reads, offsets));\n+    }\n+\n+    /**\n+     * Helper routine for converting reads and offset lists to a PileupElement list.\n+     */\n+    private static List<PileupElement> readsOffsetsToPileup(final List<GATKRead> reads, final List<Integer> offsets) {\n+        Utils.nonNull(reads, \"Illegal null read list in UnifiedReadBackedPileup\");\n+        Utils.nonNull(offsets, \"Illegal null offsets list in UnifiedReadBackedPileup\");\n+        if (reads.size() != offsets.size()) {\n+            throw new IllegalArgumentException(\"Reads and offset lists have different sizes!\");\n+        }\n+\n+        final List<PileupElement> pileup = new ArrayList<>(reads.size());\n+        for (int i = 0; i < reads.size(); i++) {\n+            pileup.add(PileupElement.createPileupForReadAndOffset(reads.get(i), offsets.get(i)));\n+        }\n+\n+        return pileup;\n+    }\n+\n+    /**\n+     * Helper routine for converting reads and a single offset to a PileupElement list.\n+     */\n+    private static List<PileupElement> readsOffsetsToPileup(final List<GATKRead> reads, final int offset) {\n+        Utils.nonNull(reads, \"Illegal null read list\");\n+        return reads.stream().map(r -> PileupElement.createPileupForReadAndOffset(r, offset)).collect(Collectors.toList());\n+    }\n+\n+    /**\n+     * Make a new pileup consisting of elements of this pileup that satisfy the predicate.\n+     * NOTE: the new pileup will not be independent of the old one (no deep copy of the underlying data is performed).\n+     */\n+    public ReadPileup makeFilteredPileup(final Predicate<PileupElement> filter){\n+        return new ReadPileup(loc, pileupElements.stream().filter(filter).collect(Collectors.toList()));\n+    }\n+\n+    /**\n+     * Make a new pileup from elements whose reads have read groups that agree with the given lane ID.\n+     * (if they have a name equal to the ID or starting with ID followed by a period \".\").\n+     * Also, if both laneID and read group ID are {@code null}, the read will be included.\n+     * Returns empty pileup if no suitable elements are found.\n+     * NOTE: the new pileup will not be independent of the old one (no deep copy of the underlying data is performed).\n+     */\n+    public ReadPileup getPileupForLane(final String laneID) {\n+        return makeFilteredPileup(p -> {\n+            final GATKRead read = p.getRead();\n+            final String readGroupID = read.getReadGroup();\n+            if (laneID == null && readGroupID == null){\n+                return true;\n+            }\n+            if (laneID != null && readGroupID != null){\n+                final boolean laneSame = readGroupID.startsWith(laneID + \".\"); // lane is the same, but sample identifier is different\n+                final boolean exactlySame = readGroupID.equals(laneID);        // in case there is no sample identifier, they have to be exactly the same\n+                if (laneSame || exactlySame){\n+                    return true;\n+                }\n+            }\n+            return false;\n+        });\n+    }\n+\n+    /**\n+     * Gets a set of the read groups represented in this pileup.\n+     * Note: contains null if a read has a null read group.\n+     */\n+    public Set<String> getReadGroupIDs() {\n+        return pileupElements.stream().map(pe -> pe.getRead().getReadGroup()).collect(Collectors.toSet());\n+    }\n+\n+    /**\n+     * Gets a set of the samples represented in this pileup.\n+     * Note: contains null if a read has a null read group or a null sample name.\n+     */\n+    public Set<String> getSamples(final SAMFileHeader header) {\n+        return pileupElements.stream().map(pe -> pe.getRead()).map(r -> ReadUtils.getSampleName(r, header)).collect(Collectors.toSet());\n+    }\n+\n+\n+    /**\n+     * The best way to access PileupElements where you only care about the bases and quals in the pileup.\n+     * <p/>\n+     * for (PileupElement p : this) { doSomething(p); }\n+     * <p/>\n+     * Provides efficient iteration of the data.\n+     */\n+    public Iterator<PileupElement> iterator() {\n+        return Collections.unmodifiableList(pileupElements).iterator();\n+   }\n+\n+    /**\n+     * The number of elements in this pileup.\n+     */\n+    public int size() {\n+        return pileupElements.size();\n+    }\n+\n+    /**\n+     * @return true if there are 0 elements in the pileup, false otherwise\n+     */\n+    public boolean isEmpty() {\n+        return size() == 0;\n+    }\n+\n+    /**\n+     * @return the location of this pileup.\n+     */\n+    public Locatable getLocation() {\n+        return loc;\n+    }\n+\n+    /**\n+     * Get counts of A, C, G, T in order, which returns a int[4] vector with counts according\n+     * to BaseUtils.simpleBaseToBaseIndex for each base.\n+     * Deletions are not counted.\n+     */\n+    public int[] getBaseCounts() {\n+        final int[] counts = new int[4];\n+\n+        for (final PileupElement pile : this) {\n+            // skip deletion sites\n+            if (!pile.isDeletion()) {\n+                final int index = BaseUtils.simpleBaseToBaseIndex(pile.getBase());\n+                if (index != -1) {\n+                    counts[index]++;\n+                }\n+            }\n+        }\n+\n+        return counts;\n+    }\n+\n+    @Override\n+    public String toString() {\n+        return String.format(\"%s %s %s %s\",\n+                loc.getContig(),\n+                loc.getStart(),\n+                new String(getBases()),\n+                getQualsString());\n+    }\n+\n+    /**\n+     * Returns a list of the reads in this pileup. Note this call costs O(n) and allocates fresh lists each time\n+     */\n+    public List<GATKRead> getReads() {\n+        return pileupElements.stream().map(pe -> pe.getRead()).collect(Collectors.toList());\n+    }\n+\n+    /**\n+     * Returns the number of elements that satisfy the predicate.\n+     */\n+    public int getNumberOfElements(final Predicate<PileupElement> peFilter){\n+        Utils.nonNull(peFilter);\n+        //Note: pileups are small so int is fine.\n+        return (int)pileupElements.stream().filter(peFilter).count();\n+    }\n+\n+    /**\n+     * Returns a list of the offsets in this pileup.\n+     * Note: this call costs O(n) and allocates fresh lists each time\n+     */\n+    public List<Integer> getOffsets() {\n+        return pileupElements.stream().map(pe -> pe.getOffset()).collect(Collectors.toList());\n+    }\n+\n+    //Extracts an int array by mapping each element in the pileup to int.\n+    private int[] extractIntArray(final ToIntFunction<PileupElement> map){\n+        return pileupElements.stream().mapToInt(map).toArray();\n+    }\n+\n+    /**\n+     * Returns an array of the bases in this pileup.\n+     * Note: this call costs O(n) and allocates fresh array each time\n+     */\n+    public byte[] getBases() {\n+        return toByteArray(extractIntArray(pe -> pe.getBase()));\n+    }\n+\n+    /**\n+     * Returns an array of the quals in this pileup.\n+     * Note: this call costs O(n) and allocates fresh array each time\n+     */\n+    public byte[] getBaseQuals() {\n+        return toByteArray(extractIntArray(pe -> pe.getQual()));\n+    }\n+\n+    //Converts array of ints to array of bytes by hard casting (loses precision if ints are large).\n+    private byte[] toByteArray(final int[] ints) {\n+        final byte[] bytes = new byte[ints.length];\n+        for (int i = 0; i < ints.length; i++) {\n+            bytes[i] = (byte)ints[i];\n+        }\n+        return bytes;\n+    }\n+\n+    /**\n+     * Get an array of the mapping qualities.\n+     */\n+    public int[] getMappingQuals() {\n+        return extractIntArray(pe -> pe.getMappingQual());\n+    }\n+\n+    private String getQualsString() {\n+        final byte[] quals = getBaseQuals();\n+        for (int i = 0; i < quals.length; i++) {\n+            quals[i] = (byte) (33 + quals[i]);  //as per SAM spec","path":"src/main/java/org/broadinstitute/hellbender/utils/pileup/ReadPileup.java","position":260,"original_position":260,"commit_id":"d2b7d6a3d9ce8cb82a9dac5ab5025bdb8085e4db","original_commit_id":"d2b7d6a3d9ce8cb82a9dac5ab5025bdb8085e4db","user":{"login":"akiezun","id":1993519,"avatar_url":"https://avatars.githubusercontent.com/u/1993519?v=3","gravatar_id":"","url":"https://api.github.com/users/akiezun","html_url":"https://github.com/akiezun","followers_url":"https://api.github.com/users/akiezun/followers","following_url":"https://api.github.com/users/akiezun/following{/other_user}","gists_url":"https://api.github.com/users/akiezun/gists{/gist_id}","starred_url":"https://api.github.com/users/akiezun/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/akiezun/subscriptions","organizations_url":"https://api.github.com/users/akiezun/orgs","repos_url":"https://api.github.com/users/akiezun/repos","events_url":"https://api.github.com/users/akiezun/events{/privacy}","received_events_url":"https://api.github.com/users/akiezun/received_events","type":"User","site_admin":false},"body":"i don't. the SAM spec just says, add 33 and get acii [https://samtools.github.io/hts-specs/SAMv1.pdf]:\r\n\r\n`QUAL: ASCII of base QUALity plus 33 (same as the quality string in the Sanger FASTQ format). A base quality is the phred-scaled base error probability which equals −10 log10 Pr{base is wrong}. This field can be a ‘*’ when quality is not stored. If not a ‘*’, SEQ must not be a ‘*’ and the length of the quality string ought to equal the length of SEQ.`","created_at":"2015-08-21T14:22:30Z","updated_at":"2015-08-21T14:22:30Z","html_url":"https://github.com/broadinstitute/hellbender/pull/661#discussion_r37638626","pull_request_url":"https://api.github.com/repos/broadinstitute/hellbender/pulls/661","_links":{"self":{"href":"https://api.github.com/repos/broadinstitute/hellbender/pulls/comments/37638626"},"html":{"href":"https://github.com/broadinstitute/hellbender/pull/661#discussion_r37638626"},"pull_request":{"href":"https://api.github.com/repos/broadinstitute/hellbender/pulls/661"}}},"pull_request":{"url":"https://api.github.com/repos/broadinstitute/hellbender/pulls/661","id":40185226,"html_url":"https://github.com/broadinstitute/hellbender/pull/661","diff_url":"https://github.com/broadinstitute/hellbender/pull/661.diff","patch_url":"https://github.com/broadinstitute/hellbender/pull/661.patch","issue_url":"https://api.github.com/repos/broadinstitute/hellbender/issues/661","number":661,"state":"open","locked":false,"title":"porting of pileups infrastructure.","user":{"login":"akiezun","id":1993519,"avatar_url":"https://avatars.githubusercontent.com/u/1993519?v=3","gravatar_id":"","url":"https://api.github.com/users/akiezun","html_url":"https://github.com/akiezun","followers_url":"https://api.github.com/users/akiezun/followers","following_url":"https://api.github.com/users/akiezun/following{/other_user}","gists_url":"https://api.github.com/users/akiezun/gists{/gist_id}","starred_url":"https://api.github.com/users/akiezun/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/akiezun/subscriptions","organizations_url":"https://api.github.com/users/akiezun/orgs","repos_url":"https://api.github.com/users/akiezun/repos","events_url":"https://api.github.com/users/akiezun/events{/privacy}","received_events_url":"https://api.github.com/users/akiezun/received_events","type":"User","site_admin":false},"body":"Pileup is going to be needed for variant annotations. Ported over the new read interface.\r\n\r\n@droazen please review","created_at":"2015-07-16T22:56:58Z","updated_at":"2015-08-21T14:22:30Z","closed_at":null,"merged_at":null,"merge_commit_sha":"d7c5df86ce40912aabb172f4d310f17368e0461e","assignee":{"login":"akiezun","id":1993519,"avatar_url":"https://avatars.githubusercontent.com/u/1993519?v=3","gravatar_id":"","url":"https://api.github.com/users/akiezun","html_url":"https://github.com/akiezun","followers_url":"https://api.github.com/users/akiezun/followers","following_url":"https://api.github.com/users/akiezun/following{/other_user}","gists_url":"https://api.github.com/users/akiezun/gists{/gist_id}","starred_url":"https://api.github.com/users/akiezun/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/akiezun/subscriptions","organizations_url":"https://api.github.com/users/akiezun/orgs","repos_url":"https://api.github.com/users/akiezun/repos","events_url":"https://api.github.com/users/akiezun/events{/privacy}","received_events_url":"https://api.github.com/users/akiezun/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/broadinstitute/hellbender/pulls/661/commits","review_comments_url":"https://api.github.com/repos/broadinstitute/hellbender/pulls/661/comments","review_comment_url":"https://api.github.com/repos/broadinstitute/hellbender/pulls/comments{/number}","comments_url":"https://api.github.com/repos/broadinstitute/hellbender/issues/661/comments","statuses_url":"https://api.github.com/repos/broadinstitute/hellbender/statuses/d2b7d6a3d9ce8cb82a9dac5ab5025bdb8085e4db","head":{"label":"broadinstitute:ak_pileup_work","ref":"ak_pileup_work","sha":"d2b7d6a3d9ce8cb82a9dac5ab5025bdb8085e4db","user":{"login":"broadinstitute","id":393552,"avatar_url":"https://avatars.githubusercontent.com/u/393552?v=3","gravatar_id":"","url":"https://api.github.com/users/broadinstitute","html_url":"https://github.com/broadinstitute","followers_url":"https://api.github.com/users/broadinstitute/followers","following_url":"https://api.github.com/users/broadinstitute/following{/other_user}","gists_url":"https://api.github.com/users/broadinstitute/gists{/gist_id}","starred_url":"https://api.github.com/users/broadinstitute/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/broadinstitute/subscriptions","organizations_url":"https://api.github.com/users/broadinstitute/orgs","repos_url":"https://api.github.com/users/broadinstitute/repos","events_url":"https://api.github.com/users/broadinstitute/events{/privacy}","received_events_url":"https://api.github.com/users/broadinstitute/received_events","type":"Organization","site_admin":false},"repo":{"id":27452807,"name":"hellbender","full_name":"broadinstitute/hellbender","owner":{"login":"broadinstitute","id":393552,"avatar_url":"https://avatars.githubusercontent.com/u/393552?v=3","gravatar_id":"","url":"https://api.github.com/users/broadinstitute","html_url":"https://github.com/broadinstitute","followers_url":"https://api.github.com/users/broadinstitute/followers","following_url":"https://api.github.com/users/broadinstitute/following{/other_user}","gists_url":"https://api.github.com/users/broadinstitute/gists{/gist_id}","starred_url":"https://api.github.com/users/broadinstitute/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/broadinstitute/subscriptions","organizations_url":"https://api.github.com/users/broadinstitute/orgs","repos_url":"https://api.github.com/users/broadinstitute/repos","events_url":"https://api.github.com/users/broadinstitute/events{/privacy}","received_events_url":"https://api.github.com/users/broadinstitute/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/broadinstitute/hellbender","description":"GATK4 development","fork":false,"url":"https://api.github.com/repos/broadinstitute/hellbender","forks_url":"https://api.github.com/repos/broadinstitute/hellbender/forks","keys_url":"https://api.github.com/repos/broadinstitute/hellbender/keys{/key_id}","collaborators_url":"https://api.github.com/repos/broadinstitute/hellbender/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/broadinstitute/hellbender/teams","hooks_url":"https://api.github.com/repos/broadinstitute/hellbender/hooks","issue_events_url":"https://api.github.com/repos/broadinstitute/hellbender/issues/events{/number}","events_url":"https://api.github.com/repos/broadinstitute/hellbender/events","assignees_url":"https://api.github.com/repos/broadinstitute/hellbender/assignees{/user}","branches_url":"https://api.github.com/repos/broadinstitute/hellbender/branches{/branch}","tags_url":"https://api.github.com/repos/broadinstitute/hellbender/tags","blobs_url":"https://api.github.com/repos/broadinstitute/hellbender/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/broadinstitute/hellbender/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/broadinstitute/hellbender/git/refs{/sha}","trees_url":"https://api.github.com/repos/broadinstitute/hellbender/git/trees{/sha}","statuses_url":"https://api.github.com/repos/broadinstitute/hellbender/statuses/{sha}","languages_url":"https://api.github.com/repos/broadinstitute/hellbender/languages","stargazers_url":"https://api.github.com/repos/broadinstitute/hellbender/stargazers","contributors_url":"https://api.github.com/repos/broadinstitute/hellbender/contributors","subscribers_url":"https://api.github.com/repos/broadinstitute/hellbender/subscribers","subscription_url":"https://api.github.com/repos/broadinstitute/hellbender/subscription","commits_url":"https://api.github.com/repos/broadinstitute/hellbender/commits{/sha}","git_commits_url":"https://api.github.com/repos/broadinstitute/hellbender/git/commits{/sha}","comments_url":"https://api.github.com/repos/broadinstitute/hellbender/comments{/number}","issue_comment_url":"https://api.github.com/repos/broadinstitute/hellbender/issues/comments{/number}","contents_url":"https://api.github.com/repos/broadinstitute/hellbender/contents/{+path}","compare_url":"https://api.github.com/repos/broadinstitute/hellbender/compare/{base}...{head}","merges_url":"https://api.github.com/repos/broadinstitute/hellbender/merges","archive_url":"https://api.github.com/repos/broadinstitute/hellbender/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/broadinstitute/hellbender/downloads","issues_url":"https://api.github.com/repos/broadinstitute/hellbender/issues{/number}","pulls_url":"https://api.github.com/repos/broadinstitute/hellbender/pulls{/number}","milestones_url":"https://api.github.com/repos/broadinstitute/hellbender/milestones{/number}","notifications_url":"https://api.github.com/repos/broadinstitute/hellbender/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/broadinstitute/hellbender/labels{/name}","releases_url":"https://api.github.com/repos/broadinstitute/hellbender/releases{/id}","created_at":"2014-12-02T20:50:36Z","updated_at":"2015-08-12T03:14:08Z","pushed_at":"2015-08-21T14:06:48Z","git_url":"git://github.com/broadinstitute/hellbender.git","ssh_url":"git@github.com:broadinstitute/hellbender.git","clone_url":"https://github.com/broadinstitute/hellbender.git","svn_url":"https://github.com/broadinstitute/hellbender","homepage":"","size":38823,"stargazers_count":29,"watchers_count":29,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":8,"mirror_url":null,"open_issues_count":242,"forks":8,"open_issues":242,"watchers":29,"default_branch":"master"}},"base":{"label":"broadinstitute:master","ref":"master","sha":"fcd54dce84eec0c8767dc02d18a1bc2930c2bb76","user":{"login":"broadinstitute","id":393552,"avatar_url":"https://avatars.githubusercontent.com/u/393552?v=3","gravatar_id":"","url":"https://api.github.com/users/broadinstitute","html_url":"https://github.com/broadinstitute","followers_url":"https://api.github.com/users/broadinstitute/followers","following_url":"https://api.github.com/users/broadinstitute/following{/other_user}","gists_url":"https://api.github.com/users/broadinstitute/gists{/gist_id}","starred_url":"https://api.github.com/users/broadinstitute/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/broadinstitute/subscriptions","organizations_url":"https://api.github.com/users/broadinstitute/orgs","repos_url":"https://api.github.com/users/broadinstitute/repos","events_url":"https://api.github.com/users/broadinstitute/events{/privacy}","received_events_url":"https://api.github.com/users/broadinstitute/received_events","type":"Organization","site_admin":false},"repo":{"id":27452807,"name":"hellbender","full_name":"broadinstitute/hellbender","owner":{"login":"broadinstitute","id":393552,"avatar_url":"https://avatars.githubusercontent.com/u/393552?v=3","gravatar_id":"","url":"https://api.github.com/users/broadinstitute","html_url":"https://github.com/broadinstitute","followers_url":"https://api.github.com/users/broadinstitute/followers","following_url":"https://api.github.com/users/broadinstitute/following{/other_user}","gists_url":"https://api.github.com/users/broadinstitute/gists{/gist_id}","starred_url":"https://api.github.com/users/broadinstitute/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/broadinstitute/subscriptions","organizations_url":"https://api.github.com/users/broadinstitute/orgs","repos_url":"https://api.github.com/users/broadinstitute/repos","events_url":"https://api.github.com/users/broadinstitute/events{/privacy}","received_events_url":"https://api.github.com/users/broadinstitute/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/broadinstitute/hellbender","description":"GATK4 development","fork":false,"url":"https://api.github.com/repos/broadinstitute/hellbender","forks_url":"https://api.github.com/repos/broadinstitute/hellbender/forks","keys_url":"https://api.github.com/repos/broadinstitute/hellbender/keys{/key_id}","collaborators_url":"https://api.github.com/repos/broadinstitute/hellbender/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/broadinstitute/hellbender/teams","hooks_url":"https://api.github.com/repos/broadinstitute/hellbender/hooks","issue_events_url":"https://api.github.com/repos/broadinstitute/hellbender/issues/events{/number}","events_url":"https://api.github.com/repos/broadinstitute/hellbender/events","assignees_url":"https://api.github.com/repos/broadinstitute/hellbender/assignees{/user}","branches_url":"https://api.github.com/repos/broadinstitute/hellbender/branches{/branch}","tags_url":"https://api.github.com/repos/broadinstitute/hellbender/tags","blobs_url":"https://api.github.com/repos/broadinstitute/hellbender/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/broadinstitute/hellbender/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/broadinstitute/hellbender/git/refs{/sha}","trees_url":"https://api.github.com/repos/broadinstitute/hellbender/git/trees{/sha}","statuses_url":"https://api.github.com/repos/broadinstitute/hellbender/statuses/{sha}","languages_url":"https://api.github.com/repos/broadinstitute/hellbender/languages","stargazers_url":"https://api.github.com/repos/broadinstitute/hellbender/stargazers","contributors_url":"https://api.github.com/repos/broadinstitute/hellbender/contributors","subscribers_url":"https://api.github.com/repos/broadinstitute/hellbender/subscribers","subscription_url":"https://api.github.com/repos/broadinstitute/hellbender/subscription","commits_url":"https://api.github.com/repos/broadinstitute/hellbender/commits{/sha}","git_commits_url":"https://api.github.com/repos/broadinstitute/hellbender/git/commits{/sha}","comments_url":"https://api.github.com/repos/broadinstitute/hellbender/comments{/number}","issue_comment_url":"https://api.github.com/repos/broadinstitute/hellbender/issues/comments{/number}","contents_url":"https://api.github.com/repos/broadinstitute/hellbender/contents/{+path}","compare_url":"https://api.github.com/repos/broadinstitute/hellbender/compare/{base}...{head}","merges_url":"https://api.github.com/repos/broadinstitute/hellbender/merges","archive_url":"https://api.github.com/repos/broadinstitute/hellbender/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/broadinstitute/hellbender/downloads","issues_url":"https://api.github.com/repos/broadinstitute/hellbender/issues{/number}","pulls_url":"https://api.github.com/repos/broadinstitute/hellbender/pulls{/number}","milestones_url":"https://api.github.com/repos/broadinstitute/hellbender/milestones{/number}","notifications_url":"https://api.github.com/repos/broadinstitute/hellbender/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/broadinstitute/hellbender/labels{/name}","releases_url":"https://api.github.com/repos/broadinstitute/hellbender/releases{/id}","created_at":"2014-12-02T20:50:36Z","updated_at":"2015-08-12T03:14:08Z","pushed_at":"2015-08-21T14:06:48Z","git_url":"git://github.com/broadinstitute/hellbender.git","ssh_url":"git@github.com:broadinstitute/hellbender.git","clone_url":"https://github.com/broadinstitute/hellbender.git","svn_url":"https://github.com/broadinstitute/hellbender","homepage":"","size":38823,"stargazers_count":29,"watchers_count":29,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":8,"mirror_url":null,"open_issues_count":242,"forks":8,"open_issues":242,"watchers":29,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/broadinstitute/hellbender/pulls/661"},"html":{"href":"https://github.com/broadinstitute/hellbender/pull/661"},"issue":{"href":"https://api.github.com/repos/broadinstitute/hellbender/issues/661"},"comments":{"href":"https://api.github.com/repos/broadinstitute/hellbender/issues/661/comments"},"review_comments":{"href":"https://api.github.com/repos/broadinstitute/hellbender/pulls/661/comments"},"review_comment":{"href":"https://api.github.com/repos/broadinstitute/hellbender/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/broadinstitute/hellbender/pulls/661/commits"},"statuses":{"href":"https://api.github.com/repos/broadinstitute/hellbender/statuses/d2b7d6a3d9ce8cb82a9dac5ab5025bdb8085e4db"}}}}