{"action":"created","comment":{"url":"https://api.github.com/repos/broadinstitute/gatk/pulls/comments/86256308","pull_request_review_id":6877509,"id":86256308,"diff_hunk":"@@ -0,0 +1,192 @@\n+package org.broadinstitute.hellbender.tools.spark.pathseq;\n+\n+import com.esotericsoftware.kryo.Kryo;\n+import com.esotericsoftware.kryo.io.Input;\n+import com.esotericsoftware.kryo.io.Output;\n+import com.github.lindenb.jbwa.jni.ShortRead;\n+import com.google.cloud.dataflow.sdk.options.PipelineOptions;\n+import com.google.common.collect.Iterators;\n+import htsjdk.samtools.*;\n+import org.apache.spark.api.java.JavaPairRDD;\n+import org.apache.spark.api.java.JavaRDD;\n+import org.apache.spark.api.java.JavaSparkContext;\n+import org.apache.spark.broadcast.Broadcast;\n+import org.broadinstitute.hellbender.cmdline.Argument;\n+import org.broadinstitute.hellbender.cmdline.ArgumentCollection;\n+import org.broadinstitute.hellbender.cmdline.CommandLineProgramProperties;\n+import org.broadinstitute.hellbender.cmdline.StandardArgumentDefinitions;\n+import org.broadinstitute.hellbender.cmdline.argumentcollections.OpticalDuplicatesArgumentCollection;\n+import org.broadinstitute.hellbender.cmdline.programgroups.SparkProgramGroup;\n+import org.broadinstitute.hellbender.engine.filters.*;\n+import org.broadinstitute.hellbender.engine.spark.GATKSparkTool;\n+import org.broadinstitute.hellbender.tools.spark.sv.SVKmerSmall;\n+import org.broadinstitute.hellbender.tools.spark.utils.HopscotchSet;\n+import org.broadinstitute.hellbender.transformers.BaseQualityClipReadTransformer;\n+import org.broadinstitute.hellbender.transformers.DUSTReadTransformer;\n+import org.broadinstitute.hellbender.transformers.ReadTransformer;\n+import org.broadinstitute.hellbender.utils.gcs.BucketUtils;\n+import org.broadinstitute.hellbender.utils.read.GATKRead;\n+import org.broadinstitute.hellbender.utils.read.ReadUtils;\n+import org.broadinstitute.hellbender.utils.read.SAMFileGATKReadWriter;\n+import org.broadinstitute.hellbender.utils.read.SAMRecordToGATKReadAdapter;\n+import org.broadinstitute.hellbender.utils.read.markduplicates.MarkDuplicatesScoringStrategy;\n+import org.broadinstitute.hellbender.utils.read.markduplicates.OpticalDuplicateFinder;\n+import org.broadinstitute.hellbender.tools.spark.transforms.markduplicates.MarkDuplicatesSpark;\n+import org.seqdoop.hadoop_bam.BAMInputFormat;\n+import scala.Tuple2;\n+\n+import java.util.ArrayList;\n+import java.util.HashMap;\n+import java.util.Iterator;\n+import java.util.List;\n+import java.util.stream.Collectors;\n+\n+@CommandLineProgramProperties(summary = \"Read preprocessing and host filtering on reads from a BAM file\",\n+        oneLineSummary = \"PathSeqFilter on Spark\",\n+        programGroup = SparkProgramGroup.class)\n+public final class PathSeqFilterSpark extends GATKSparkTool {\n+\n+    private static final long serialVersionUID = 1L;\n+    private SAMFileHeader header;\n+\n+    private static final String maxLengthArgName = \"pathseq_maxReadLength\";\n+    @Argument(fullName = maxLengthArgName,\n+            shortName = maxLengthArgName,\n+            doc=\"Keep only reads with length at most equal to the specified value\",\n+            optional=true)\n+    public int MAX_READ_LENGTH = 1000;\n+\n+    private static final String minLengthArg = \"pathseq_minReadLength\";\n+    @Argument(fullName = minLengthArg,\n+            shortName = minLengthArg,\n+            doc=\"Keep only reads with length at least equal to the specified value\",\n+            optional=true)\n+    public int MIN_READ_LENGTH = 31;\n+\n+    @Argument(fullName=\"pathseq_ambigFilterFrac\", shortName=\"pathseq_ambigFilterFrac\", optional=true)\n+    public float FRAC_N_THRESHOLD = 0.03f;\n+\n+    @Argument(fullName=\"pathseq_baseQualThresh\", shortName=\"pathseq_baseQualThresh\", optional=true)\n+    public int QUAL_PHRED_THRESH = 15;\n+\n+    @Argument(fullName=\"pathseq_baseQualFrac\", shortName=\"pathseq_mbaseQualFrac\", optional=true)\n+    public float QUAL_MAX_FRAC = 0.05f;\n+\n+    @Argument(fullName=\"pathseq_kmerLibPath\", shortName=\"pathseq_kmerLibPath\", optional=false)\n+    public String KMER_LIB_PATH;\n+\n+    @Argument(fullName=\"pathseq_kmerSize\", shortName=\"pathseq_kmerSize\", optional=true)\n+    public int KMER_SIZE = 31;\n+\n+    @Override\n+    public boolean requiresReads() { return true; }\n+\n+    @Argument(doc = \"uri for the output file: a local file path\",\n+            shortName = StandardArgumentDefinitions.OUTPUT_SHORT_NAME, fullName = StandardArgumentDefinitions.OUTPUT_LONG_NAME,\n+            optional = false)\n+    public String output;\n+\n+    @ArgumentCollection\n+    protected OpticalDuplicatesArgumentCollection opticalDuplicatesArgumentCollection = new OpticalDuplicatesArgumentCollection();\n+\n+    @Override\n+    @SuppressWarnings(\"unchecked\")\n+    protected void runTool(final JavaSparkContext ctx) {\n+\n+        header = getHeaderForReads();\n+        ctx.hadoopConfiguration().setBoolean(BAMInputFormat.KEEP_PAIRED_READS_TOGETHER_PROPERTY, true);\n+\n+        final JavaRDD<GATKRead> reads = getReads();\n+\n+        //Filter secondary/supplementary reads and reads that fail the vendor quality check\n+        JavaRDD<GATKRead> primaryReads = reads.filter(read -> !(read.isSecondaryAlignment() || read.failsVendorQualityCheck() || read.isSupplementaryAlignment()));\n+\n+        //Filter duplicate reads\n+        final OpticalDuplicateFinder finder =\n+                new OpticalDuplicateFinder(opticalDuplicatesArgumentCollection.READ_NAME_REGEX, opticalDuplicatesArgumentCollection.OPTICAL_DUPLICATE_PIXEL_DISTANCE, null);\n+        JavaRDD<GATKRead> markedReads = MarkDuplicatesSpark.mark(primaryReads, getHeaderForReads(),MarkDuplicatesScoringStrategy.SUM_OF_BASE_QUALITIES, finder, getRecommendedNumReducers());\n+\n+        ReadFilter markedFilter = new MarkedDuplicateReadFilter();\n+        final JavaRDD<GATKRead> markedFilteredReads = markedReads.filter(read -> markedFilter.test(read));\n+\n+        //Apply DUST masking\n+        ReadTransformer dustTransformer = new DUSTReadTransformer();\n+        final JavaRDD<GATKRead> readsDUSTMasked = markedFilteredReads.map(read -> dustTransformer.apply(read));\n+\n+        //Apply base quality clipping\n+        ReadTransformer bqClippingTransformer = new BaseQualityClipReadTransformer();\n+        final JavaRDD<GATKRead> readsClipped = readsDUSTMasked.map(read -> bqClippingTransformer.apply(read));\n+\n+        //Filter using base quality scores\n+        ReadFilter bqFilter = new BaseQualityReadFilter(QUAL_PHRED_THRESH,QUAL_MAX_FRAC);\n+        final JavaRDD<GATKRead> readsBQFiltered = readsClipped.filter(read -> bqFilter.test(read));\n+\n+        //Filter reads with ambiguous bases\n+        ReadFilter ambigFilter = new AmbiguousBaseReadFilter(FRAC_N_THRESHOLD);\n+        final JavaRDD<GATKRead> readsAmbigFiltered = readsBQFiltered.filter(read -> ambigFilter.test(read));\n+\n+        //Filter reads with less than MIN_READ_LENGTH bases\n+        ReadFilter readLengthFilter = new ReadLengthReadFilter(MIN_READ_LENGTH,MAX_READ_LENGTH);\n+        final JavaRDD<GATKRead> readsLengthFiltered = readsAmbigFiltered.filter(read -> readLengthFilter.test(read));\n+\n+        //Load Kmer hopscotch set and filter reads containing > 0 matching kmer\n+        final PipelineOptions options = getAuthenticatedGCSOptions();\n+        Input input = new Input(BucketUtils.openFile(KMER_LIB_PATH, options));\n+        Kryo kryo=new Kryo();\n+        HopscotchSet<SVKmerSmall> kmerLibSet = (HopscotchSet<SVKmerSmall>)kryo.readClassAndObject(input);\n+        Broadcast<HopscotchSet<SVKmerSmall>> kmerLibBroadcast = ctx.broadcast(kmerLibSet);\n+        ContainsKmerReadFilter readKmerFilter = new ContainsKmerReadFilter(kmerLibBroadcast,KMER_SIZE);\n+        final JavaRDD<GATKRead> readsKmerFiltered = readsLengthFiltered.filter(read -> !readKmerFilter.test(read));\n+\n+        //TODO: bwa filtering against user-specified reference\n+\n+        //\"Clean\" reads by resetting all flags and setting pairedness flags according to the remaining read set\n+        final JavaRDD<GATKRead> readsCleaned = readsKmerFiltered\n+                .groupBy(read -> read.getName()) //group pairs using read name into set of Iterable<GATKRead>'s","path":"src/main/java/org/broadinstitute/hellbender/tools/spark/pathseq/PathSeqFilterSpark.java","position":145,"original_position":145,"commit_id":"a3224a238bdf28a0190c758fca74122c8dc4b08e","original_commit_id":"a3224a238bdf28a0190c758fca74122c8dc4b08e","user":{"login":"tedsharpe","id":9284156,"avatar_url":"https://avatars.githubusercontent.com/u/9284156?v=3","gravatar_id":"","url":"https://api.github.com/users/tedsharpe","html_url":"https://github.com/tedsharpe","followers_url":"https://api.github.com/users/tedsharpe/followers","following_url":"https://api.github.com/users/tedsharpe/following{/other_user}","gists_url":"https://api.github.com/users/tedsharpe/gists{/gist_id}","starred_url":"https://api.github.com/users/tedsharpe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tedsharpe/subscriptions","organizations_url":"https://api.github.com/users/tedsharpe/orgs","repos_url":"https://api.github.com/users/tedsharpe/repos","events_url":"https://api.github.com/users/tedsharpe/events{/privacy}","received_events_url":"https://api.github.com/users/tedsharpe/received_events","type":"User","site_admin":false},"body":"This could be really, really expensive for an input with a lot of bacterial reads.  Shuffling a large number of GATKReads is crazy expensive.  (But maybe you're confident that the filtered set will be small?)\r\nI don't have code, or even a detailed design to try to circumvent this, but a sketch of an idea might go something like this:\r\nPersist the readsKmerFiltered RDD.  Map it to just the read names, and shuffle them. Within each partition save just the unpaired names (or just the paired names -- whichever set you expect to be smaller).  Broadcast the set of unpaired (or paired) names.  Now pass over the same RDD you persisted earlier, looking up each name in the set to tell you how to \"clean\" it.","created_at":"2016-11-02T22:24:09Z","updated_at":"2016-11-02T22:40:58Z","html_url":"https://github.com/broadinstitute/gatk/pull/2237#discussion_r86256308","pull_request_url":"https://api.github.com/repos/broadinstitute/gatk/pulls/2237","_links":{"self":{"href":"https://api.github.com/repos/broadinstitute/gatk/pulls/comments/86256308"},"html":{"href":"https://github.com/broadinstitute/gatk/pull/2237#discussion_r86256308"},"pull_request":{"href":"https://api.github.com/repos/broadinstitute/gatk/pulls/2237"}}},"pull_request":{"url":"https://api.github.com/repos/broadinstitute/gatk/pulls/2237","id":91409577,"html_url":"https://github.com/broadinstitute/gatk/pull/2237","diff_url":"https://github.com/broadinstitute/gatk/pull/2237.diff","patch_url":"https://github.com/broadinstitute/gatk/pull/2237.patch","issue_url":"https://api.github.com/repos/broadinstitute/gatk/issues/2237","number":2237,"state":"open","locked":false,"title":"PathSeq initial pull","user":{"login":"mwalker174","id":5686877,"avatar_url":"https://avatars.githubusercontent.com/u/5686877?v=3","gravatar_id":"","url":"https://api.github.com/users/mwalker174","html_url":"https://github.com/mwalker174","followers_url":"https://api.github.com/users/mwalker174/followers","following_url":"https://api.github.com/users/mwalker174/following{/other_user}","gists_url":"https://api.github.com/users/mwalker174/gists{/gist_id}","starred_url":"https://api.github.com/users/mwalker174/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mwalker174/subscriptions","organizations_url":"https://api.github.com/users/mwalker174/orgs","repos_url":"https://api.github.com/users/mwalker174/repos","events_url":"https://api.github.com/users/mwalker174/events{/privacy}","received_events_url":"https://api.github.com/users/mwalker174/received_events","type":"User","site_admin":false},"body":"@cwhelan @tedsharpe please review. There are two tools here:\n\n1) PathSeqKmerSpark - builds kmer library as a hopscotch set from a given reference (done)\n2) PathSeqFilterSpark - preprocessing / human read filtering tool (work in progress, currently has read preprocessing steps implemented)\n\nMade modifications to the SV kmer classes: \n\n1) SVKmerSmall class uses only 1 long (up to 31 bases), largely copied from SVKmer\n2) SVKmer and SVKmerSmall are both derived from SVKmerBase\n3) SVKmerizer uses generics so it can work with either type, moved some static functions to SVUtils\n\nThere are a bunch of new read filters and transformers for the filtering steps, including symmetric DUST. Unit tests included.\n","created_at":"2016-10-28T16:14:05Z","updated_at":"2016-11-02T22:40:58Z","closed_at":null,"merged_at":null,"merge_commit_sha":"fdd4deb16b3aec36bae81a829d5aa8f238935c10","assignee":{"login":"cwhelan","id":709477,"avatar_url":"https://avatars.githubusercontent.com/u/709477?v=3","gravatar_id":"","url":"https://api.github.com/users/cwhelan","html_url":"https://github.com/cwhelan","followers_url":"https://api.github.com/users/cwhelan/followers","following_url":"https://api.github.com/users/cwhelan/following{/other_user}","gists_url":"https://api.github.com/users/cwhelan/gists{/gist_id}","starred_url":"https://api.github.com/users/cwhelan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cwhelan/subscriptions","organizations_url":"https://api.github.com/users/cwhelan/orgs","repos_url":"https://api.github.com/users/cwhelan/repos","events_url":"https://api.github.com/users/cwhelan/events{/privacy}","received_events_url":"https://api.github.com/users/cwhelan/received_events","type":"User","site_admin":false},"assignees":[{"login":"cwhelan","id":709477,"avatar_url":"https://avatars.githubusercontent.com/u/709477?v=3","gravatar_id":"","url":"https://api.github.com/users/cwhelan","html_url":"https://github.com/cwhelan","followers_url":"https://api.github.com/users/cwhelan/followers","following_url":"https://api.github.com/users/cwhelan/following{/other_user}","gists_url":"https://api.github.com/users/cwhelan/gists{/gist_id}","starred_url":"https://api.github.com/users/cwhelan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cwhelan/subscriptions","organizations_url":"https://api.github.com/users/cwhelan/orgs","repos_url":"https://api.github.com/users/cwhelan/repos","events_url":"https://api.github.com/users/cwhelan/events{/privacy}","received_events_url":"https://api.github.com/users/cwhelan/received_events","type":"User","site_admin":false},{"login":"tedsharpe","id":9284156,"avatar_url":"https://avatars.githubusercontent.com/u/9284156?v=3","gravatar_id":"","url":"https://api.github.com/users/tedsharpe","html_url":"https://github.com/tedsharpe","followers_url":"https://api.github.com/users/tedsharpe/followers","following_url":"https://api.github.com/users/tedsharpe/following{/other_user}","gists_url":"https://api.github.com/users/tedsharpe/gists{/gist_id}","starred_url":"https://api.github.com/users/tedsharpe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tedsharpe/subscriptions","organizations_url":"https://api.github.com/users/tedsharpe/orgs","repos_url":"https://api.github.com/users/tedsharpe/repos","events_url":"https://api.github.com/users/tedsharpe/events{/privacy}","received_events_url":"https://api.github.com/users/tedsharpe/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/broadinstitute/gatk/pulls/2237/commits","review_comments_url":"https://api.github.com/repos/broadinstitute/gatk/pulls/2237/comments","review_comment_url":"https://api.github.com/repos/broadinstitute/gatk/pulls/comments{/number}","comments_url":"https://api.github.com/repos/broadinstitute/gatk/issues/2237/comments","statuses_url":"https://api.github.com/repos/broadinstitute/gatk/statuses/a3224a238bdf28a0190c758fca74122c8dc4b08e","head":{"label":"broadinstitute:mw_pathseq","ref":"mw_pathseq","sha":"a3224a238bdf28a0190c758fca74122c8dc4b08e","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":"gatk","full_name":"broadinstitute/gatk","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/gatk","description":"GATK4 development","fork":false,"url":"https://api.github.com/repos/broadinstitute/gatk","forks_url":"https://api.github.com/repos/broadinstitute/gatk/forks","keys_url":"https://api.github.com/repos/broadinstitute/gatk/keys{/key_id}","collaborators_url":"https://api.github.com/repos/broadinstitute/gatk/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/broadinstitute/gatk/teams","hooks_url":"https://api.github.com/repos/broadinstitute/gatk/hooks","issue_events_url":"https://api.github.com/repos/broadinstitute/gatk/issues/events{/number}","events_url":"https://api.github.com/repos/broadinstitute/gatk/events","assignees_url":"https://api.github.com/repos/broadinstitute/gatk/assignees{/user}","branches_url":"https://api.github.com/repos/broadinstitute/gatk/branches{/branch}","tags_url":"https://api.github.com/repos/broadinstitute/gatk/tags","blobs_url":"https://api.github.com/repos/broadinstitute/gatk/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/broadinstitute/gatk/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/broadinstitute/gatk/git/refs{/sha}","trees_url":"https://api.github.com/repos/broadinstitute/gatk/git/trees{/sha}","statuses_url":"https://api.github.com/repos/broadinstitute/gatk/statuses/{sha}","languages_url":"https://api.github.com/repos/broadinstitute/gatk/languages","stargazers_url":"https://api.github.com/repos/broadinstitute/gatk/stargazers","contributors_url":"https://api.github.com/repos/broadinstitute/gatk/contributors","subscribers_url":"https://api.github.com/repos/broadinstitute/gatk/subscribers","subscription_url":"https://api.github.com/repos/broadinstitute/gatk/subscription","commits_url":"https://api.github.com/repos/broadinstitute/gatk/commits{/sha}","git_commits_url":"https://api.github.com/repos/broadinstitute/gatk/git/commits{/sha}","comments_url":"https://api.github.com/repos/broadinstitute/gatk/comments{/number}","issue_comment_url":"https://api.github.com/repos/broadinstitute/gatk/issues/comments{/number}","contents_url":"https://api.github.com/repos/broadinstitute/gatk/contents/{+path}","compare_url":"https://api.github.com/repos/broadinstitute/gatk/compare/{base}...{head}","merges_url":"https://api.github.com/repos/broadinstitute/gatk/merges","archive_url":"https://api.github.com/repos/broadinstitute/gatk/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/broadinstitute/gatk/downloads","issues_url":"https://api.github.com/repos/broadinstitute/gatk/issues{/number}","pulls_url":"https://api.github.com/repos/broadinstitute/gatk/pulls{/number}","milestones_url":"https://api.github.com/repos/broadinstitute/gatk/milestones{/number}","notifications_url":"https://api.github.com/repos/broadinstitute/gatk/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/broadinstitute/gatk/labels{/name}","releases_url":"https://api.github.com/repos/broadinstitute/gatk/releases{/id}","deployments_url":"https://api.github.com/repos/broadinstitute/gatk/deployments","created_at":"2014-12-02T20:50:36Z","updated_at":"2016-11-01T03:15:23Z","pushed_at":"2016-11-02T22:36:44Z","git_url":"git://github.com/broadinstitute/gatk.git","ssh_url":"git@github.com:broadinstitute/gatk.git","clone_url":"https://github.com/broadinstitute/gatk.git","svn_url":"https://github.com/broadinstitute/gatk","homepage":"","size":126571,"stargazers_count":91,"watchers_count":91,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":36,"mirror_url":null,"open_issues_count":461,"forks":36,"open_issues":461,"watchers":91,"default_branch":"master"}},"base":{"label":"broadinstitute:master","ref":"master","sha":"2dfc80a139b55fc057a5e9286470defe43c9f706","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":"gatk","full_name":"broadinstitute/gatk","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/gatk","description":"GATK4 development","fork":false,"url":"https://api.github.com/repos/broadinstitute/gatk","forks_url":"https://api.github.com/repos/broadinstitute/gatk/forks","keys_url":"https://api.github.com/repos/broadinstitute/gatk/keys{/key_id}","collaborators_url":"https://api.github.com/repos/broadinstitute/gatk/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/broadinstitute/gatk/teams","hooks_url":"https://api.github.com/repos/broadinstitute/gatk/hooks","issue_events_url":"https://api.github.com/repos/broadinstitute/gatk/issues/events{/number}","events_url":"https://api.github.com/repos/broadinstitute/gatk/events","assignees_url":"https://api.github.com/repos/broadinstitute/gatk/assignees{/user}","branches_url":"https://api.github.com/repos/broadinstitute/gatk/branches{/branch}","tags_url":"https://api.github.com/repos/broadinstitute/gatk/tags","blobs_url":"https://api.github.com/repos/broadinstitute/gatk/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/broadinstitute/gatk/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/broadinstitute/gatk/git/refs{/sha}","trees_url":"https://api.github.com/repos/broadinstitute/gatk/git/trees{/sha}","statuses_url":"https://api.github.com/repos/broadinstitute/gatk/statuses/{sha}","languages_url":"https://api.github.com/repos/broadinstitute/gatk/languages","stargazers_url":"https://api.github.com/repos/broadinstitute/gatk/stargazers","contributors_url":"https://api.github.com/repos/broadinstitute/gatk/contributors","subscribers_url":"https://api.github.com/repos/broadinstitute/gatk/subscribers","subscription_url":"https://api.github.com/repos/broadinstitute/gatk/subscription","commits_url":"https://api.github.com/repos/broadinstitute/gatk/commits{/sha}","git_commits_url":"https://api.github.com/repos/broadinstitute/gatk/git/commits{/sha}","comments_url":"https://api.github.com/repos/broadinstitute/gatk/comments{/number}","issue_comment_url":"https://api.github.com/repos/broadinstitute/gatk/issues/comments{/number}","contents_url":"https://api.github.com/repos/broadinstitute/gatk/contents/{+path}","compare_url":"https://api.github.com/repos/broadinstitute/gatk/compare/{base}...{head}","merges_url":"https://api.github.com/repos/broadinstitute/gatk/merges","archive_url":"https://api.github.com/repos/broadinstitute/gatk/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/broadinstitute/gatk/downloads","issues_url":"https://api.github.com/repos/broadinstitute/gatk/issues{/number}","pulls_url":"https://api.github.com/repos/broadinstitute/gatk/pulls{/number}","milestones_url":"https://api.github.com/repos/broadinstitute/gatk/milestones{/number}","notifications_url":"https://api.github.com/repos/broadinstitute/gatk/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/broadinstitute/gatk/labels{/name}","releases_url":"https://api.github.com/repos/broadinstitute/gatk/releases{/id}","deployments_url":"https://api.github.com/repos/broadinstitute/gatk/deployments","created_at":"2014-12-02T20:50:36Z","updated_at":"2016-11-01T03:15:23Z","pushed_at":"2016-11-02T22:36:44Z","git_url":"git://github.com/broadinstitute/gatk.git","ssh_url":"git@github.com:broadinstitute/gatk.git","clone_url":"https://github.com/broadinstitute/gatk.git","svn_url":"https://github.com/broadinstitute/gatk","homepage":"","size":126571,"stargazers_count":91,"watchers_count":91,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":36,"mirror_url":null,"open_issues_count":461,"forks":36,"open_issues":461,"watchers":91,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/broadinstitute/gatk/pulls/2237"},"html":{"href":"https://github.com/broadinstitute/gatk/pull/2237"},"issue":{"href":"https://api.github.com/repos/broadinstitute/gatk/issues/2237"},"comments":{"href":"https://api.github.com/repos/broadinstitute/gatk/issues/2237/comments"},"review_comments":{"href":"https://api.github.com/repos/broadinstitute/gatk/pulls/2237/comments"},"review_comment":{"href":"https://api.github.com/repos/broadinstitute/gatk/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/broadinstitute/gatk/pulls/2237/commits"},"statuses":{"href":"https://api.github.com/repos/broadinstitute/gatk/statuses/a3224a238bdf28a0190c758fca74122c8dc4b08e"}}}}
{"actor":{"display_login":"tedsharpe"}}