{"action":"created","comment":{"url":"https://api.github.com/repos/broadinstitute/gatk-protected/pulls/comments/48363421","id":48363421,"diff_hunk":"@@ -126,84 +69,79 @@ public AlleleFractionInitializer(final AlleleFractionData data) {\n      */\n     public AlleleFractionState getInitializedState() { return state; }\n \n-    // END OF PUBLIC API\n-\n-    private double pAltMinor(final int het) { return responsibilities.get(het).get(AlleleFractionIndicator.ALT_MINOR); }\n-    private double pRefMinor(final int het) { return responsibilities.get(het).get(AlleleFractionIndicator.REF_MINOR); }\n-    private double pOutlier(final int het) { return responsibilities.get(het).get(AlleleFractionIndicator.OUTLIER); }\n-    private double pNotOutlier(final int het) { return 1 - pOutlier(het); }\n-\n-    //perform an E step to update responsibilities using high-level parameters from current AlleleFractionState\n-    private void updateResponsibilities() {\n-        for (int segment = 0; segment < data.numSegments(); segment++) {\n-            for (final int het : data.hetsInSegment(segment)) {\n-                final AllelicCount count= data.count(het);\n-                final double altMinorLogPosterior = AlleleFractionModeller.hetLogLikelihood(state, segment, count, AlleleFractionIndicator.ALT_MINOR);\n-                final double refMinorLogPosterior = AlleleFractionModeller.hetLogLikelihood(state, segment, count, AlleleFractionIndicator.REF_MINOR);\n-                final double outlierLogPosterior = AlleleFractionModeller.hetLogLikelihood(state, segment, count, AlleleFractionIndicator.OUTLIER);\n-                responsibilities.get(het).setFromLogPosteriors(altMinorLogPosterior, refMinorLogPosterior, outlierLogPosterior);\n-            }\n-        }\n-    }\n-\n-    // M step for minor allele fractions -- set minor fraction to responsibility-weighted total count of\n-    // reads in minor allele divided by total reads, ignoring outliers\n-    private AlleleFractionState.MinorFractions estimateMinorFractions() {\n+    /**\n+     *  initialize minor fractions assuming no allelic bias <p></p>\n+     *\n+     *  we integrate over f to get posterior probabilities (responsibilities) of alt / ref minor\n+     * that is, responsibility of alt minor is int_{0 to 1/2} f^a (1-f)^r df\n+     *          responsibility of ref minor is int_{0 to 1/2} f^r (1-f)^a df\n+     * these are proportional to I(1/2, a + 1, r + 1) and I(1/2, r + 1, a + 1),\n+     * respectively, where I is the (incomplete) regularized Beta function\n+     * By definition these likelihoods sum to 1, ie they are already normalized. <p></p>\n+     *\n+     * finally, we set each minor fraction to the responsibility-weighted total count of\n+     * reads in minor allele divided by total reads, ignoring outliers\n+     */\n+    private AlleleFractionState.MinorFractions initialMinorFractions(final AlleleFractionData data) {\n         AlleleFractionState.MinorFractions result = new AlleleFractionState.MinorFractions();\n         for (int segment = 0; segment < data.numSegments(); segment++) {\n-            final double minorReads = data.hetsInSegment(segment).stream()\n-                    .mapToDouble(het -> data.altCount(het) * pAltMinor(het) + data.refCount(het) * pRefMinor(het)).sum();\n-            final double totalReads = data.hetsInSegment(segment).stream().mapToDouble(het -> data.readCount(het) * pNotOutlier(het)).sum();\n+            double responsibilityWeightedMinorAlleleReadCount = 0.0;\n+            double responsibilityWeightedTotalReadCount = 0.0;\n+            for (final AllelicCount count : data.countsInSegment(segment)) {\n+                final int a = count.getAltReadCount();\n+                final int r = count.getRefReadCount();\n+                double altMinorResponsibility;\n+                try {\n+                    altMinorResponsibility = Beta.regularizedBeta(0.5, a + 1, r + 1);\n+                } catch (final MaxCountExceededException e) {\n+                    altMinorResponsibility = a < r ? 1.0 : 0.0; //if the special function can't be computed, give an all-or-nothing responsibility\n+                }\n+                responsibilityWeightedMinorAlleleReadCount += altMinorResponsibility * a + (1 - altMinorResponsibility) * r;\n+                responsibilityWeightedTotalReadCount += a + r;\n+            }\n \n-            // the \"+ 1\"s correspond to a flat prior on minor fractions\n-            result.add((minorReads + 1)/(totalReads + 1));\n+            // we achieve a flat prior via a single pseudocount for minor and non-minor reads, hence the  +1 and +2\n+            result.add((responsibilityWeightedMinorAlleleReadCount + 1)/(responsibilityWeightedTotalReadCount + 2));\n         }\n         return result;\n     }\n \n-    // M step for outlierProbability -- set it to the average of all OUTLIER responsibilities\n-    private double estimateOutlierProbability() {\n-        return responsibilities.stream().mapToDouble(r -> r.get(AlleleFractionIndicator.OUTLIER)).average().getAsDouble();\n+    private double estimateOutlierProbability(final AlleleFractionData data) {\n+        final UnivariateObjectiveFunction objective = new UnivariateObjectiveFunction(outlierProbability ->\n+                AlleleFractionModeller.logLikelihood(state.shallowCopyWithProposedOutlierProbability(outlierProbability), data));\n+        final SearchInterval searchInterval = new SearchInterval(0.0, 0.1, state.outlierProbability());\n+        return new BrentOptimizer(0.01, 0.001).optimize(objective, GoalType.MAXIMIZE, searchInterval, new MaxEval(1000)).getPoint();\n     }\n \n-    /**\n-     * Estimate the kth moment of the distribution of latent allelic bias parameters by averaging the posterior\n-     * moment over all het sites.  These are used in the M step for the bias hyperparameters, which\n-     * uses moment-matching as a heuristic substitute for likelihood maximization.\n-     *\n-     * @param order the order of the desired moment\n-     * @return the posterior expectation of bias^order, averaged over all het sites\n-     */\n-    private double estimateBiasMoment(final int order) {\n-        double numerator = 0.0;\n-        double denominator = 0.0;\n-        for (int segment = 0; segment < data.numSegments(); segment++) {\n-            for (int het : data.hetsInSegment(segment)) {\n-                final AllelicCount count= data.count(het);\n-                numerator += pAltMinor(het) * AlleleFractionModeller.biasPosteriorMoment(state, segment, count, AlleleFractionIndicator.ALT_MINOR, order)\n-                        + pRefMinor(het) * AlleleFractionModeller.biasPosteriorMoment(state, segment, count, AlleleFractionIndicator.REF_MINOR, order);\n-                denominator += pNotOutlier(het);\n-            }\n-        }\n-        return numerator / denominator;\n+    private double estimateMeanBias(final AlleleFractionData data) {\n+        final UnivariateObjectiveFunction objective = new UnivariateObjectiveFunction(meanBias ->\n+                AlleleFractionModeller.logLikelihood(state.shallowCopyWithProposedMeanBias(meanBias), data));\n+        final SearchInterval searchInterval = new SearchInterval(0.0, 10.0, state.meanBias());\n+        return new BrentOptimizer(0.001, 0.001).optimize(objective, GoalType.MAXIMIZE, searchInterval, new MaxEval(1000)).getPoint();\n     }\n \n-    private double estimateAverageBias() { return estimateBiasMoment(1); }\n-    private double estimateAverageSquaredBias() { return estimateBiasMoment(2); }\n-\n-    private void performSingleEMIteration() {\n-        updateResponsibilities();\n-\n-        //update minor allele fractions\n-        state = new AlleleFractionState(state.meanBias(), state.biasVariance(), state.outlierProbability(), estimateMinorFractions());\n+    private double estimateBiasVariance(final AlleleFractionData data) {\n+        final UnivariateObjectiveFunction objective = new UnivariateObjectiveFunction(biasVariance ->\n+                AlleleFractionModeller.logLikelihood(state.shallowCopyWithProposedBiasVariance(biasVariance), data));\n+        final SearchInterval searchInterval = new SearchInterval(0.0, 1.0, state.biasVariance());\n+        return new BrentOptimizer(0.01, 0.001).optimize(objective, GoalType.MAXIMIZE, searchInterval, new MaxEval(1000)).getPoint();\n+    }\n \n-        //update minor allele fractions\n-        state = new AlleleFractionState(state.meanBias(), state.biasVariance(), estimateOutlierProbability(), state.minorFractions());\n+    private double estimateMinorFraction(final int segment, final AlleleFractionData data) {\n+        final UnivariateObjectiveFunction objective = new UnivariateObjectiveFunction(minorFraction -> {\n+            final AlleleFractionState proposal = AlleleFractionModeller.makeSingleSegmentState(state.meanBias(),\n+                    state.biasVariance(), state.outlierProbability(), minorFraction);\n+            return AlleleFractionModeller.segmentLogLikelihood(proposal, 0, data.countsInSegment(segment));\n+        });\n+        final SearchInterval searchInterval = new SearchInterval(0.0, 0.5, state.minorFractionInSegment(segment));\n+        return new BrentOptimizer(0.001, 0.001).optimize(objective, GoalType.MAXIMIZE, searchInterval, new MaxEval(1000)).getPoint();\n+    }\n \n-        //update gamma hyperparameters\n-        final double meanBias = estimateAverageBias();\n-        final double meanSquaredBias = estimateAverageSquaredBias();\n-        final double variance = meanSquaredBias - meanBias*meanBias;\n-        state = new AlleleFractionState(meanBias, variance, state.outlierProbability(), state.minorFractions());\n+    private AlleleFractionState.MinorFractions estimateMinorFractions(final AlleleFractionData data) {\n+        AlleleFractionState.MinorFractions result = new AlleleFractionState.MinorFractions();","path":"src/main/java/org/broadinstitute/hellbender/tools/exome/allelefraction/AlleleFractionInitializer.java","position":288,"original_position":288,"commit_id":"0fdb07dc8f285ecd831944bdda780f1d4ed2a8b2","original_commit_id":"0fdb07dc8f285ecd831944bdda780f1d4ed2a8b2","user":{"login":"samuelklee","id":11076296,"avatar_url":"https://avatars.githubusercontent.com/u/11076296?v=3","gravatar_id":"","url":"https://api.github.com/users/samuelklee","html_url":"https://github.com/samuelklee","followers_url":"https://api.github.com/users/samuelklee/followers","following_url":"https://api.github.com/users/samuelklee/following{/other_user}","gists_url":"https://api.github.com/users/samuelklee/gists{/gist_id}","starred_url":"https://api.github.com/users/samuelklee/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/samuelklee/subscriptions","organizations_url":"https://api.github.com/users/samuelklee/orgs","repos_url":"https://api.github.com/users/samuelklee/repos","events_url":"https://api.github.com/users/samuelklee/events{/privacy}","received_events_url":"https://api.github.com/users/samuelklee/received_events","type":"User","site_admin":false},"body":"final (or this can all be made a one liner with streams, if you like)","created_at":"2015-12-23T17:21:21Z","updated_at":"2015-12-23T17:21:21Z","html_url":"https://github.com/broadinstitute/gatk-protected/pull/241#discussion_r48363421","pull_request_url":"https://api.github.com/repos/broadinstitute/gatk-protected/pulls/241","_links":{"self":{"href":"https://api.github.com/repos/broadinstitute/gatk-protected/pulls/comments/48363421"},"html":{"href":"https://github.com/broadinstitute/gatk-protected/pull/241#discussion_r48363421"},"pull_request":{"href":"https://api.github.com/repos/broadinstitute/gatk-protected/pulls/241"}}},"pull_request":{"url":"https://api.github.com/repos/broadinstitute/gatk-protected/pulls/241","id":53287954,"html_url":"https://github.com/broadinstitute/gatk-protected/pull/241","diff_url":"https://github.com/broadinstitute/gatk-protected/pull/241.diff","patch_url":"https://github.com/broadinstitute/gatk-protected/pull/241.patch","issue_url":"https://api.github.com/repos/broadinstitute/gatk-protected/issues/241","number":241,"state":"open","locked":false,"title":"Faster, simpler, more accurate initialization of allele fraction model","user":{"login":"davidbenjamin","id":8438890,"avatar_url":"https://avatars.githubusercontent.com/u/8438890?v=3","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":"@samuelklee inspired by your suspicion about the poor tolerances for bias variance.\r\n\r\n@LeeTL1220 @vruano If speed on wgs is ever an issue, this code could easily be extended to get fast and accurate Bayesian estimates without MCMC via the Laplace approximation.  The initialization gets the mode, and the posterior error bars are found in the initial step size guesses for the samplers.","created_at":"2015-12-10T17:11:33Z","updated_at":"2015-12-23T17:21:21Z","closed_at":null,"merged_at":null,"merge_commit_sha":"1556599b2483fd0148e59c2dfc53ccd34a4d9e45","assignee":{"login":"samuelklee","id":11076296,"avatar_url":"https://avatars.githubusercontent.com/u/11076296?v=3","gravatar_id":"","url":"https://api.github.com/users/samuelklee","html_url":"https://github.com/samuelklee","followers_url":"https://api.github.com/users/samuelklee/followers","following_url":"https://api.github.com/users/samuelklee/following{/other_user}","gists_url":"https://api.github.com/users/samuelklee/gists{/gist_id}","starred_url":"https://api.github.com/users/samuelklee/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/samuelklee/subscriptions","organizations_url":"https://api.github.com/users/samuelklee/orgs","repos_url":"https://api.github.com/users/samuelklee/repos","events_url":"https://api.github.com/users/samuelklee/events{/privacy}","received_events_url":"https://api.github.com/users/samuelklee/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/broadinstitute/gatk-protected/pulls/241/commits","review_comments_url":"https://api.github.com/repos/broadinstitute/gatk-protected/pulls/241/comments","review_comment_url":"https://api.github.com/repos/broadinstitute/gatk-protected/pulls/comments{/number}","comments_url":"https://api.github.com/repos/broadinstitute/gatk-protected/issues/241/comments","statuses_url":"https://api.github.com/repos/broadinstitute/gatk-protected/statuses/0fdb07dc8f285ecd831944bdda780f1d4ed2a8b2","head":{"label":"broadinstitute:db_experiments","ref":"db_experiments","sha":"0fdb07dc8f285ecd831944bdda780f1d4ed2a8b2","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":34413897,"name":"gatk-protected","full_name":"broadinstitute/gatk-protected","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-protected","description":"GATK4 development of the license-protected part of the toolkit","fork":false,"url":"https://api.github.com/repos/broadinstitute/gatk-protected","forks_url":"https://api.github.com/repos/broadinstitute/gatk-protected/forks","keys_url":"https://api.github.com/repos/broadinstitute/gatk-protected/keys{/key_id}","collaborators_url":"https://api.github.com/repos/broadinstitute/gatk-protected/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/broadinstitute/gatk-protected/teams","hooks_url":"https://api.github.com/repos/broadinstitute/gatk-protected/hooks","issue_events_url":"https://api.github.com/repos/broadinstitute/gatk-protected/issues/events{/number}","events_url":"https://api.github.com/repos/broadinstitute/gatk-protected/events","assignees_url":"https://api.github.com/repos/broadinstitute/gatk-protected/assignees{/user}","branches_url":"https://api.github.com/repos/broadinstitute/gatk-protected/branches{/branch}","tags_url":"https://api.github.com/repos/broadinstitute/gatk-protected/tags","blobs_url":"https://api.github.com/repos/broadinstitute/gatk-protected/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/broadinstitute/gatk-protected/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/broadinstitute/gatk-protected/git/refs{/sha}","trees_url":"https://api.github.com/repos/broadinstitute/gatk-protected/git/trees{/sha}","statuses_url":"https://api.github.com/repos/broadinstitute/gatk-protected/statuses/{sha}","languages_url":"https://api.github.com/repos/broadinstitute/gatk-protected/languages","stargazers_url":"https://api.github.com/repos/broadinstitute/gatk-protected/stargazers","contributors_url":"https://api.github.com/repos/broadinstitute/gatk-protected/contributors","subscribers_url":"https://api.github.com/repos/broadinstitute/gatk-protected/subscribers","subscription_url":"https://api.github.com/repos/broadinstitute/gatk-protected/subscription","commits_url":"https://api.github.com/repos/broadinstitute/gatk-protected/commits{/sha}","git_commits_url":"https://api.github.com/repos/broadinstitute/gatk-protected/git/commits{/sha}","comments_url":"https://api.github.com/repos/broadinstitute/gatk-protected/comments{/number}","issue_comment_url":"https://api.github.com/repos/broadinstitute/gatk-protected/issues/comments{/number}","contents_url":"https://api.github.com/repos/broadinstitute/gatk-protected/contents/{+path}","compare_url":"https://api.github.com/repos/broadinstitute/gatk-protected/compare/{base}...{head}","merges_url":"https://api.github.com/repos/broadinstitute/gatk-protected/merges","archive_url":"https://api.github.com/repos/broadinstitute/gatk-protected/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/broadinstitute/gatk-protected/downloads","issues_url":"https://api.github.com/repos/broadinstitute/gatk-protected/issues{/number}","pulls_url":"https://api.github.com/repos/broadinstitute/gatk-protected/pulls{/number}","milestones_url":"https://api.github.com/repos/broadinstitute/gatk-protected/milestones{/number}","notifications_url":"https://api.github.com/repos/broadinstitute/gatk-protected/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/broadinstitute/gatk-protected/labels{/name}","releases_url":"https://api.github.com/repos/broadinstitute/gatk-protected/releases{/id}","created_at":"2015-04-22T20:24:45Z","updated_at":"2015-12-02T04:11:10Z","pushed_at":"2015-12-23T16:18:42Z","git_url":"git://github.com/broadinstitute/gatk-protected.git","ssh_url":"git@github.com:broadinstitute/gatk-protected.git","clone_url":"https://github.com/broadinstitute/gatk-protected.git","svn_url":"https://github.com/broadinstitute/gatk-protected","homepage":null,"size":49208,"stargazers_count":4,"watchers_count":4,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":89,"forks":0,"open_issues":89,"watchers":4,"default_branch":"master"}},"base":{"label":"broadinstitute:master","ref":"master","sha":"ffc8f5293d810db628b224008c12e7c49afb8e74","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":34413897,"name":"gatk-protected","full_name":"broadinstitute/gatk-protected","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-protected","description":"GATK4 development of the license-protected part of the toolkit","fork":false,"url":"https://api.github.com/repos/broadinstitute/gatk-protected","forks_url":"https://api.github.com/repos/broadinstitute/gatk-protected/forks","keys_url":"https://api.github.com/repos/broadinstitute/gatk-protected/keys{/key_id}","collaborators_url":"https://api.github.com/repos/broadinstitute/gatk-protected/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/broadinstitute/gatk-protected/teams","hooks_url":"https://api.github.com/repos/broadinstitute/gatk-protected/hooks","issue_events_url":"https://api.github.com/repos/broadinstitute/gatk-protected/issues/events{/number}","events_url":"https://api.github.com/repos/broadinstitute/gatk-protected/events","assignees_url":"https://api.github.com/repos/broadinstitute/gatk-protected/assignees{/user}","branches_url":"https://api.github.com/repos/broadinstitute/gatk-protected/branches{/branch}","tags_url":"https://api.github.com/repos/broadinstitute/gatk-protected/tags","blobs_url":"https://api.github.com/repos/broadinstitute/gatk-protected/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/broadinstitute/gatk-protected/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/broadinstitute/gatk-protected/git/refs{/sha}","trees_url":"https://api.github.com/repos/broadinstitute/gatk-protected/git/trees{/sha}","statuses_url":"https://api.github.com/repos/broadinstitute/gatk-protected/statuses/{sha}","languages_url":"https://api.github.com/repos/broadinstitute/gatk-protected/languages","stargazers_url":"https://api.github.com/repos/broadinstitute/gatk-protected/stargazers","contributors_url":"https://api.github.com/repos/broadinstitute/gatk-protected/contributors","subscribers_url":"https://api.github.com/repos/broadinstitute/gatk-protected/subscribers","subscription_url":"https://api.github.com/repos/broadinstitute/gatk-protected/subscription","commits_url":"https://api.github.com/repos/broadinstitute/gatk-protected/commits{/sha}","git_commits_url":"https://api.github.com/repos/broadinstitute/gatk-protected/git/commits{/sha}","comments_url":"https://api.github.com/repos/broadinstitute/gatk-protected/comments{/number}","issue_comment_url":"https://api.github.com/repos/broadinstitute/gatk-protected/issues/comments{/number}","contents_url":"https://api.github.com/repos/broadinstitute/gatk-protected/contents/{+path}","compare_url":"https://api.github.com/repos/broadinstitute/gatk-protected/compare/{base}...{head}","merges_url":"https://api.github.com/repos/broadinstitute/gatk-protected/merges","archive_url":"https://api.github.com/repos/broadinstitute/gatk-protected/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/broadinstitute/gatk-protected/downloads","issues_url":"https://api.github.com/repos/broadinstitute/gatk-protected/issues{/number}","pulls_url":"https://api.github.com/repos/broadinstitute/gatk-protected/pulls{/number}","milestones_url":"https://api.github.com/repos/broadinstitute/gatk-protected/milestones{/number}","notifications_url":"https://api.github.com/repos/broadinstitute/gatk-protected/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/broadinstitute/gatk-protected/labels{/name}","releases_url":"https://api.github.com/repos/broadinstitute/gatk-protected/releases{/id}","created_at":"2015-04-22T20:24:45Z","updated_at":"2015-12-02T04:11:10Z","pushed_at":"2015-12-23T16:18:42Z","git_url":"git://github.com/broadinstitute/gatk-protected.git","ssh_url":"git@github.com:broadinstitute/gatk-protected.git","clone_url":"https://github.com/broadinstitute/gatk-protected.git","svn_url":"https://github.com/broadinstitute/gatk-protected","homepage":null,"size":49208,"stargazers_count":4,"watchers_count":4,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":89,"forks":0,"open_issues":89,"watchers":4,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/broadinstitute/gatk-protected/pulls/241"},"html":{"href":"https://github.com/broadinstitute/gatk-protected/pull/241"},"issue":{"href":"https://api.github.com/repos/broadinstitute/gatk-protected/issues/241"},"comments":{"href":"https://api.github.com/repos/broadinstitute/gatk-protected/issues/241/comments"},"review_comments":{"href":"https://api.github.com/repos/broadinstitute/gatk-protected/pulls/241/comments"},"review_comment":{"href":"https://api.github.com/repos/broadinstitute/gatk-protected/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/broadinstitute/gatk-protected/pulls/241/commits"},"statuses":{"href":"https://api.github.com/repos/broadinstitute/gatk-protected/statuses/0fdb07dc8f285ecd831944bdda780f1d4ed2a8b2"}}}}