{"action":"created","comment":{"url":"https://api.github.com/repos/broadinstitute/gatk/pulls/comments/196896726","pull_request_review_id":128484432,"id":196896726,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDE5Njg5NjcyNg==","diff_hunk":"@@ -0,0 +1,239 @@\n+package org.broadinstitute.hellbender.tools.walkers.readorientation;\n+\n+import com.google.common.annotations.VisibleForTesting;\n+import htsjdk.samtools.metrics.MetricsFile;\n+import htsjdk.samtools.util.CloserUtil;\n+import htsjdk.samtools.util.Histogram;\n+import htsjdk.samtools.util.IOUtil;\n+import htsjdk.samtools.util.SequenceUtil;\n+import org.broadinstitute.barclay.argparser.Argument;\n+import org.broadinstitute.barclay.argparser.CommandLineProgramProperties;\n+import org.broadinstitute.hellbender.cmdline.CommandLineProgram;\n+import org.broadinstitute.hellbender.cmdline.StandardArgumentDefinitions;\n+import org.broadinstitute.hellbender.cmdline.programgroups.CoverageAnalysisProgramGroup;\n+import org.broadinstitute.hellbender.utils.Nucleotide;\n+import org.broadinstitute.hellbender.utils.Utils;\n+\n+import java.io.*;\n+import java.util.*;\n+import java.util.stream.Collectors;\n+\n+/**\n+ * Learn the prior probability of read orientation artifact from the output of {@link CollectF1R2Counts}\n+ * Details of the model may be found in docs/mutect/mutect.pdf.\n+ */\n+@CommandLineProgramProperties(\n+        summary = \"Collect counts of F1R2 reads at each locus of a sam/bam/cram\",\n+        oneLineSummary = \"Collect counts of F1R2 reads at each locus of a sam/bam/cram\",\n+        programGroup = CoverageAnalysisProgramGroup.class // TODO: check that this is correct\n+)\n+public class LearnReadOrientationModel extends CommandLineProgram {\n+    public static final double DEFAULT_CONVERGENCE_THRESHOLD = 1e-4;\n+    public static final int DEFAULT_MAX_ITERATIONS = 20;\n+\n+    public static final String EM_CONVERGENCE_THRESHOLD_LONG_NAME = \"convergence-threshold\";\n+    public static final String MAX_EM_ITERATIONS_LONG_NAME = \"num-em-iterations\";\n+\n+    @Argument(fullName = CollectF1R2Counts.REF_SITE_METRICS_LONG_NAME, doc = \"histograms of depths over ref sites for each reference context\")\n+    private File refHistogramTable;\n+\n+    @Argument(fullName = CollectF1R2Counts.ALT_DATA_TABLE_LONG_NAME,  doc = \"a table of F1R2 and depth counts\")\n+    private File altDataTable;\n+\n+    @Argument(fullName = StandardArgumentDefinitions.OUTPUT_LONG_NAME, shortName = StandardArgumentDefinitions.OUTPUT_SHORT_NAME, doc = \"table of artifact priors\")\n+    private File output;\n+\n+    @Argument(fullName = CollectF1R2Counts.ALT_DEPTH1_HISTOGRAM_LONG_NAME, doc = \"histograms of depth 1 alt sites\", optional = true)\n+    private File altHistogramTable = null;\n+\n+    @Argument(fullName = EM_CONVERGENCE_THRESHOLD_LONG_NAME, doc = \"Stop the EM when the distance between parameters between iterations falls below this value\", optional = true)\n+    private double converagenceThreshold = DEFAULT_CONVERGENCE_THRESHOLD;\n+\n+    @Argument(fullName = MAX_EM_ITERATIONS_LONG_NAME, doc = \"give up on EM after this many iterations\", optional = true)\n+    private int maxEMIterations = DEFAULT_MAX_ITERATIONS;\n+\n+    List<Histogram<Integer>> refHistograms;\n+    List<Histogram<Integer>> altHistograms;\n+\n+    @Override\n+    protected void onStartup(){\n+        final MetricsFile<?, Integer> referenceSiteMetrics = readMetricsFile(refHistogramTable);\n+        refHistograms = referenceSiteMetrics.getAllHistograms();\n+\n+        if (altHistogramTable != null) {\n+            final MetricsFile<?, Integer> altSiteMetrics = readMetricsFile(altHistogramTable);\n+            altHistograms = altSiteMetrics.getAllHistograms();\n+        } else {\n+            altHistograms = Collections.emptyList();\n+        }\n+    }\n+\n+    @Override\n+    public Object doWork(){\n+        final int defaultInitialListSize = 1_000_000;\n+\n+        final Map<String, List<AltSiteRecord>> altDesignMatrixByContext =\n+                AltSiteRecord.readAltSiteRecords(altDataTable, defaultInitialListSize).stream()\n+                        .collect(Collectors.groupingBy(AltSiteRecord::getReferenceContext));\n+\n+        // Since AGT F1R2 is equivalent to ACT F2R1 (in the sense that the order of bases in the original molecule on which\n+        // the artifact befell and what the base changed to is the same)\n+        final List<ArtifactPrior> artifactPriorAcrossContexts = new ArrayList<>((int) Math.pow(F1R2FilterConstants.REGULAR_BASES.size(), F1R2FilterConstants.REFERENCE_CONTEXT_SIZE)/2);\n+\n+        // TODO: extract a method to account for reverse complement, and create a test\n+        for (final String refContext : F1R2FilterConstants.CANONICAL_KMERS){\n+            final String reverseComplement = SequenceUtil.reverseComplement(refContext);\n+\n+            final Histogram<Integer> refHistogram = refHistograms.stream()\n+                    .filter(h -> h.getValueLabel().equals(refContext))\n+                    .findFirst().orElseGet(() -> F1R2FilterUtils.createRefHistogram(refContext));\n+            final Histogram<Integer> refHistogramRevComp = refHistograms.stream()\n+                    .filter(h -> h.getValueLabel().equals(reverseComplement))\n+                    .findFirst().orElseGet(() -> F1R2FilterUtils.createRefHistogram(reverseComplement));\n+\n+            final List<Histogram<Integer>> altDepthOneHistogramsForContext = altHistograms.stream()\n+                    .filter(h -> h.getValueLabel().startsWith(refContext))\n+                    .collect(Collectors.toList());\n+\n+            final List<Histogram<Integer>> altDepthOneHistogramsRevComp = altHistograms.stream()\n+                    .filter(h -> h.getValueLabel().startsWith(reverseComplement))\n+                    .collect(Collectors.toList());\n+\n+            final List<AltSiteRecord> altDesignMatrix = altDesignMatrixByContext\n+                    .getOrDefault(refContext, new ArrayList<>()); // Cannot use Collections.emptyList() here because we might add to it\n+            final List<AltSiteRecord> altDesignMatrixRevComp = altDesignMatrixByContext\n+                    .getOrDefault(reverseComplement, Collections.emptyList());\n+            // Warning: the below method will mutate the content of {@link altDesignMatrixRevComp} and append to {@code altDesignMatrix}\n+            mergeDesignMatrices(altDesignMatrix, altDesignMatrixRevComp);\n+\n+            final Histogram<Integer> combinedRefHistograms = combineRefHistogramWithRC(refContext, refHistogram, refHistogramRevComp);\n+            final List<Histogram<Integer>> combinedAltHistograms = combineAltDepthOneHistogramWithRC(altDepthOneHistogramsForContext, altDepthOneHistogramsRevComp);\n+\n+            if (combinedRefHistograms.getSumOfValues() == 0 || altDesignMatrix.isEmpty()) {\n+                logger.info(String.format(\"Skipping the reference context %s as we didn't find either the ref or alt table for the context\", refContext));\n+                continue;\n+            }\n+\n+            final LearnReadOrientationModelEngine engine = new LearnReadOrientationModelEngine(\n+                    combinedRefHistograms,\n+                    combinedAltHistograms,\n+                    altDesignMatrix,\n+                    converagenceThreshold,\n+                    maxEMIterations,\n+                    logger);\n+            final ArtifactPrior artifactPrior = engine.learnPriorForArtifactStates();\n+            artifactPriorAcrossContexts.add(artifactPrior);\n+        }\n+\n+        ArtifactPrior.writeArtifactPriors(artifactPriorAcrossContexts, output);\n+        return \"SUCCESS\";\n+    }\n+\n+    @VisibleForTesting\n+    public static Histogram<Integer> combineRefHistogramWithRC(final String refContext,\n+                                                               final Histogram<Integer> refHistogram,\n+                                                               final Histogram<Integer> refHistogramRevComp){\n+        Utils.validateArg(refHistogram.getValueLabel()\n+                .equals(SequenceUtil.reverseComplement(refHistogramRevComp.getValueLabel())),\n+                \"ref context = \" + refHistogram.getValueLabel() + \", rev comp = \" + refHistogramRevComp.getValueLabel());\n+        Utils.validateArg(refHistogram.getValueLabel().equals(refContext), \"this better match\");\n+\n+        final Histogram<Integer> combinedRefHistogram = F1R2FilterUtils.createRefHistogram(refContext);\n+\n+        for (final Integer depth : refHistogram.keySet()){\n+            final double newCount = refHistogram.get(depth).getValue() + refHistogramRevComp.get(depth).getValue();\n+            combinedRefHistogram.increment(depth, newCount);\n+        }\n+\n+        return combinedRefHistogram;\n+    }\n+\n+    @VisibleForTesting\n+    public static List<Histogram<Integer>> combineAltDepthOneHistogramWithRC(final List<Histogram<Integer>> altHistograms,\n+                                                                             final List<Histogram<Integer>> altHistogramsRevComp){\n+        if (altHistograms.isEmpty() && altHistogramsRevComp.isEmpty()){\n+            return Collections.emptyList();\n+        }\n+\n+        final String refContext = ! altHistograms.isEmpty() ?\n+                F1R2FilterUtils.labelToTriplet(altHistograms.get(0).getValueLabel()).getLeft() :\n+                SequenceUtil.reverseComplement(F1R2FilterUtils.labelToTriplet(altHistogramsRevComp.get(0).getValueLabel()).getLeft());\n+\n+        // Contract: altHistogram must be of the canonical representation of the kmer\n+        Utils.validateArg(F1R2FilterConstants.CANONICAL_KMERS.contains(refContext), \"refContext must be the canonical representation but got \" + refContext);\n+\n+        final List<Histogram<Integer>> combinedHistograms = new ArrayList<>(F1R2FilterConstants.numAltHistogramsPerContext);\n+\n+        for (Nucleotide altAllele : F1R2FilterConstants.REGULAR_BASES){\n+            // Skip when the alt base is the ref base, which doesn't make sense because this is a histogram of alt sites\n+            if (altAllele == F1R2FilterUtils.getMiddleBase(refContext)){\n+                continue;\n+            }\n+\n+            final String reverseComplement = SequenceUtil.reverseComplement(refContext);\n+            final Nucleotide altAlleleRevComp = Nucleotide.valueOf(SequenceUtil.reverseComplement(altAllele.toString()));\n+\n+            for (ReadOrientation orientation : ReadOrientation.values()) {\n+                final ReadOrientation oppositeType = orientation == ReadOrientation.F1R2 ? ReadOrientation.F2R1 : ReadOrientation.F1R2;","path":"src/main/java/org/broadinstitute/hellbender/tools/walkers/readorientation/LearnReadOrientationModel.java","position":177,"original_position":177,"commit_id":"02d68b22225e634465e5329be6906e040931c094","original_commit_id":"02d68b22225e634465e5329be6906e040931c094","user":{"login":"davidbenjamin","id":8438890,"node_id":"MDQ6VXNlcjg0Mzg4OTA=","avatar_url":"https://avatars3.githubusercontent.com/u/8438890?v=4","gravatar_id":"","url":"https://api.github.com/users/davidbenjamin","html_url":"https://github.com/davidbenjamin","followers_url":"https://api.github.com/users/davidbenjamin/followers","following_url":"https://api.github.com/users/davidbenjamin/following{/other_user}","gists_url":"https://api.github.com/users/davidbenjamin/gists{/gist_id}","starred_url":"https://api.github.com/users/davidbenjamin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/davidbenjamin/subscriptions","organizations_url":"https://api.github.com/users/davidbenjamin/orgs","repos_url":"https://api.github.com/users/davidbenjamin/repos","events_url":"https://api.github.com/users/davidbenjamin/events{/privacy}","received_events_url":"https://api.github.com/users/davidbenjamin/received_events","type":"User","site_admin":false},"body":"Can you use `orientation.getOtherOrientation`?","created_at":"2018-06-20T18:27:58Z","updated_at":"2018-06-20T18:40:41Z","html_url":"https://github.com/broadinstitute/gatk/pull/4895#discussion_r196896726","pull_request_url":"https://api.github.com/repos/broadinstitute/gatk/pulls/4895","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/broadinstitute/gatk/pulls/comments/196896726"},"html":{"href":"https://github.com/broadinstitute/gatk/pull/4895#discussion_r196896726"},"pull_request":{"href":"https://api.github.com/repos/broadinstitute/gatk/pulls/4895"}}},"pull_request":{"url":"https://api.github.com/repos/broadinstitute/gatk/pulls/4895","id":194643604,"node_id":"MDExOlB1bGxSZXF1ZXN0MTk0NjQzNjA0","html_url":"https://github.com/broadinstitute/gatk/pull/4895","diff_url":"https://github.com/broadinstitute/gatk/pull/4895.diff","patch_url":"https://github.com/broadinstitute/gatk/pull/4895.patch","issue_url":"https://api.github.com/repos/broadinstitute/gatk/issues/4895","number":4895,"state":"open","locked":false,"title":"New Orientation Bias Filter","user":{"login":"takutosato","id":5185538,"node_id":"MDQ6VXNlcjUxODU1Mzg=","avatar_url":"https://avatars3.githubusercontent.com/u/5185538?v=4","gravatar_id":"","url":"https://api.github.com/users/takutosato","html_url":"https://github.com/takutosato","followers_url":"https://api.github.com/users/takutosato/followers","following_url":"https://api.github.com/users/takutosato/following{/other_user}","gists_url":"https://api.github.com/users/takutosato/gists{/gist_id}","starred_url":"https://api.github.com/users/takutosato/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/takutosato/subscriptions","organizations_url":"https://api.github.com/users/takutosato/orgs","repos_url":"https://api.github.com/users/takutosato/repos","events_url":"https://api.github.com/users/takutosato/events{/privacy}","received_events_url":"https://api.github.com/users/takutosato/received_events","type":"User","site_admin":false},"body":"The WGS evaluation shows that the new filter is equivalent to or slightly better than the old filter for filtering the known Oxo-G and FFPE base artifacts. The new filter is strictly better at filtering artifacts we haven't encountered before, like that of the Novaseq data.\r\n\r\nThis PR also introduces the FDR-based two-pass filtering for FilterMutectCalls #4893\r\n\r\n@davidbenjamin I still need to revise mutect2.tex, but the code is ready for review\r\n\r\n@LeeTL1220 @madduran","created_at":"2018-06-13T16:22:48Z","updated_at":"2018-06-20T18:40:41Z","closed_at":null,"merged_at":null,"merge_commit_sha":"728a09fa6bdd6620c40cf8738fbc791925c43879","assignee":{"login":"davidbenjamin","id":8438890,"node_id":"MDQ6VXNlcjg0Mzg4OTA=","avatar_url":"https://avatars3.githubusercontent.com/u/8438890?v=4","gravatar_id":"","url":"https://api.github.com/users/davidbenjamin","html_url":"https://github.com/davidbenjamin","followers_url":"https://api.github.com/users/davidbenjamin/followers","following_url":"https://api.github.com/users/davidbenjamin/following{/other_user}","gists_url":"https://api.github.com/users/davidbenjamin/gists{/gist_id}","starred_url":"https://api.github.com/users/davidbenjamin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/davidbenjamin/subscriptions","organizations_url":"https://api.github.com/users/davidbenjamin/orgs","repos_url":"https://api.github.com/users/davidbenjamin/repos","events_url":"https://api.github.com/users/davidbenjamin/events{/privacy}","received_events_url":"https://api.github.com/users/davidbenjamin/received_events","type":"User","site_admin":false},"assignees":[{"login":"davidbenjamin","id":8438890,"node_id":"MDQ6VXNlcjg0Mzg4OTA=","avatar_url":"https://avatars3.githubusercontent.com/u/8438890?v=4","gravatar_id":"","url":"https://api.github.com/users/davidbenjamin","html_url":"https://github.com/davidbenjamin","followers_url":"https://api.github.com/users/davidbenjamin/followers","following_url":"https://api.github.com/users/davidbenjamin/following{/other_user}","gists_url":"https://api.github.com/users/davidbenjamin/gists{/gist_id}","starred_url":"https://api.github.com/users/davidbenjamin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/davidbenjamin/subscriptions","organizations_url":"https://api.github.com/users/davidbenjamin/orgs","repos_url":"https://api.github.com/users/davidbenjamin/repos","events_url":"https://api.github.com/users/davidbenjamin/events{/privacy}","received_events_url":"https://api.github.com/users/davidbenjamin/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/broadinstitute/gatk/pulls/4895/commits","review_comments_url":"https://api.github.com/repos/broadinstitute/gatk/pulls/4895/comments","review_comment_url":"https://api.github.com/repos/broadinstitute/gatk/pulls/comments{/number}","comments_url":"https://api.github.com/repos/broadinstitute/gatk/issues/4895/comments","statuses_url":"https://api.github.com/repos/broadinstitute/gatk/statuses/02d68b22225e634465e5329be6906e040931c094","head":{"label":"broadinstitute:ts_ob_2pass","ref":"ts_ob_2pass","sha":"02d68b22225e634465e5329be6906e040931c094","user":{"login":"broadinstitute","id":393552,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM5MzU1Mg==","avatar_url":"https://avatars0.githubusercontent.com/u/393552?v=4","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,"node_id":"MDEwOlJlcG9zaXRvcnkyNzQ1MjgwNw==","name":"gatk","full_name":"broadinstitute/gatk","owner":{"login":"broadinstitute","id":393552,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM5MzU1Mg==","avatar_url":"https://avatars0.githubusercontent.com/u/393552?v=4","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":"Official code repository for GATK versions 4 and up","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":"2018-06-20T14:15:13Z","pushed_at":"2018-06-20T17:03:22Z","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":"https://software.broadinstitute.org/gatk","size":236035,"stargazers_count":416,"watchers_count":416,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":162,"mirror_url":null,"archived":false,"open_issues_count":935,"license":{"key":"bsd-3-clause","name":"BSD 3-Clause \"New\" or \"Revised\" License","spdx_id":"BSD-3-Clause","url":"https://api.github.com/licenses/bsd-3-clause","node_id":"MDc6TGljZW5zZTU="},"forks":162,"open_issues":935,"watchers":416,"default_branch":"master"}},"base":{"label":"broadinstitute:master","ref":"master","sha":"55858504f2740259a933e705941fc8e160e4a4fb","user":{"login":"broadinstitute","id":393552,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM5MzU1Mg==","avatar_url":"https://avatars0.githubusercontent.com/u/393552?v=4","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,"node_id":"MDEwOlJlcG9zaXRvcnkyNzQ1MjgwNw==","name":"gatk","full_name":"broadinstitute/gatk","owner":{"login":"broadinstitute","id":393552,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM5MzU1Mg==","avatar_url":"https://avatars0.githubusercontent.com/u/393552?v=4","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":"Official code repository for GATK versions 4 and up","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":"2018-06-20T14:15:13Z","pushed_at":"2018-06-20T17:03:22Z","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":"https://software.broadinstitute.org/gatk","size":236035,"stargazers_count":416,"watchers_count":416,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":162,"mirror_url":null,"archived":false,"open_issues_count":935,"license":{"key":"bsd-3-clause","name":"BSD 3-Clause \"New\" or \"Revised\" License","spdx_id":"BSD-3-Clause","url":"https://api.github.com/licenses/bsd-3-clause","node_id":"MDc6TGljZW5zZTU="},"forks":162,"open_issues":935,"watchers":416,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/broadinstitute/gatk/pulls/4895"},"html":{"href":"https://github.com/broadinstitute/gatk/pull/4895"},"issue":{"href":"https://api.github.com/repos/broadinstitute/gatk/issues/4895"},"comments":{"href":"https://api.github.com/repos/broadinstitute/gatk/issues/4895/comments"},"review_comments":{"href":"https://api.github.com/repos/broadinstitute/gatk/pulls/4895/comments"},"review_comment":{"href":"https://api.github.com/repos/broadinstitute/gatk/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/broadinstitute/gatk/pulls/4895/commits"},"statuses":{"href":"https://api.github.com/repos/broadinstitute/gatk/statuses/02d68b22225e634465e5329be6906e040931c094"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"davidbenjamin"}}