{"action":"created","comment":{"url":"https://api.github.com/repos/broadinstitute/gatk-protected/pulls/comments/60144276","id":60144276,"diff_hunk":"@@ -0,0 +1,671 @@\n+package org.broadinstitute.hellbender.tools.exome;\n+\n+import com.google.common.annotations.VisibleForTesting;\n+import htsjdk.samtools.*;\n+import htsjdk.samtools.filter.DuplicateReadFilter;\n+import htsjdk.samtools.filter.NotPrimaryAlignmentFilter;\n+import htsjdk.samtools.filter.SamRecordFilter;\n+import htsjdk.samtools.reference.ReferenceSequenceFileWalker;\n+import htsjdk.samtools.util.IntervalList;\n+import htsjdk.samtools.util.SamLocusIterator;\n+import org.apache.commons.math3.analysis.integration.gauss.GaussIntegrator;\n+import org.apache.commons.math3.analysis.integration.gauss.GaussIntegratorFactory;\n+import org.apache.commons.math3.util.FastMath;\n+import org.apache.logging.log4j.LogManager;\n+import org.apache.logging.log4j.Logger;\n+import org.broadinstitute.hellbender.exceptions.GATKException;\n+import org.broadinstitute.hellbender.exceptions.UserException;\n+import org.broadinstitute.hellbender.utils.*;\n+import org.broadinstitute.hellbender.utils.param.ParamUtils;\n+\n+import java.io.File;\n+import java.io.IOException;\n+import java.util.*;\n+import java.util.stream.Collectors;\n+import java.util.stream.IntStream;\n+\n+/**\n+ * A Bayesian heterozygous SNP pulldown calculator. Base qualities are taken into account\n+ * to increase precision (see CNV-methods.pdf for details).\n+ *\n+ * TODO\n+ *\n+ * - The quadrature order can be adaptively chosen based on the pileup size and the accuracy\n+ *   required for likelihood estimation. In theory, a Gaussian quadrature of order N yields\n+ *   the exact result for a pileup of size N.\n+ *\n+ * - Include the possibility to correct for reference bias for the HetPriorType.BALANCED prior\n+ *\n+ * @author Mehrtash Babadi &lt;mehrtash@broadinstitute.org&gt;\n+ * @author Samuel Lee &lt;slee@broadinstitute.org&gt;\n+ */\n+\n+public final class BayesianHetPulldownCalculator {\n+\n+    private final Logger logger = LogManager.getLogger(BayesianHetPulldownCalculator.class);\n+\n+    /**\n+     * a simple class to handle base read and mapping error probabilitites\n+     */\n+    @VisibleForTesting\n+    public static final class BaseQuality {\n+\n+        final double readErrorProbability, mappingErrorProbability;\n+\n+        public BaseQuality(final double readErrorProbability, final double mappingErrorProbability) {\n+            this.readErrorProbability = readErrorProbability;\n+            this.mappingErrorProbability = mappingErrorProbability;\n+        }\n+\n+        public double getReadErrorProbability() { return readErrorProbability; }\n+        public double getMappingErrorProbability() { return mappingErrorProbability; }\n+\n+    }\n+\n+    /**\n+     * prior model for Het site calling\n+     *\n+     *  - BALANCED: minor allele fraction is assumed to be 1/2. this should be the default choice for paired\n+     *    normal-tumor samples\n+     *\n+     *  - HETEROGENEOUS: minor allele fraction can deviate from 1/2 due to CNV events, ploidy, subclonality,\n+     *    contamination, etc. this should be the default choice for tumor-only samples\n+     *\n+     */\n+    private enum HetPriorType {\n+        BALANCED, HETEROGENEOUS\n+    }\n+\n+    private HetPriorType hetPriorType;\n+\n+    private static final Nucleotide[] BASES = {Nucleotide.A, Nucleotide.C, Nucleotide.T, Nucleotide.G};\n+\n+    private final File refFile;\n+    private final IntervalList snpIntervals;\n+\n+    private final int readDepthThreshold;\n+    private final int minMappingQuality;\n+    private final int minBaseQuality;\n+    private final ValidationStringency validationStringency;\n+\n+    /* experimental */\n+    private final double errorProbabilityAdjustmentFactor;\n+\n+\n+    /* these are for building a prior for allele fraction */\n+    private double minAbnormalFraction;\n+    private double maxAbnormalFraction;\n+    private double maxCopyNumber;\n+    private double minHetAlleleFraction;\n+    private double breakpointHetAlleleFraction;\n+\n+    /* integration quadrature */\n+    @VisibleForTesting\n+    final ArrayList<Double> gaussIntegrationWeights = new ArrayList<>();\n+    @VisibleForTesting\n+    final ArrayList<Double> gaussIntegrationLogWeights = new ArrayList<>();\n+    @VisibleForTesting\n+    final ArrayList<Double> gaussIntegrationAbscissas = new ArrayList<>();\n+\n+    /* allele fraction prior for Het sites */\n+    @VisibleForTesting\n+    final ArrayList<Double> alleleFractionPriors = new ArrayList<>();\n+    @VisibleForTesting\n+    final ArrayList<Double> alleleFractionLogPriors = new ArrayList<>();\n+\n+    /* minimum order of the integration quadrature */\n+    private static final int MIN_QUADRATURE_ORDER = 50;\n+\n+    /* interval threshold for indexing for SamLocusIterator */\n+    private static final int MAX_INTERVALS_FOR_INDEX = 25000;\n+\n+    /* default priors */\n+    private static final double DEFAULT_PRIOR_REF_HOM = 0.5; /* a homozygous site being the ref allele */\n+    private static final double DEFAULT_PRIOR_HET = 0.5; /* a site being heterozygous */\n+\n+    /* a third of the minimum sequencing error (for safeguarding log likelihood calculations) */\n+    private static final double DEFAULT_MIN_BASE_ERROR_THIRD = 1e-6;\n+\n+    /* approximate number of status updates printed to log */\n+    private static final int NUMBER_OF_SITES_PER_LOGGED_STATUS_UPDATE = 10000;\n+\n+    /**\n+     * Constructor of {@link BayesianHetPulldownCalculator} object\n+     *\n+     * NOTE: The default {@link HetPriorType} is BALANCED. Make a call to\n+     *       {@link BayesianHetPulldownCalculator#useHeterogeneousHetPrior} to switch to the HETEROGENEOUS prior.\n+     *\n+     * @param refFile the reference genome file\n+     * @param snpIntervals {@link IntervalList} of common SNPs\n+     * @param minMappingQuality minimum phred mapping quality\n+     * @param minBaseQuality minimum phred base quality\n+     * @param readDepthThreshold minimum read depth\n+     * @param validationStringency validation stringency\n+     * @param errorProbabilityAdjustmentFactor (experimental) multiplicative factor for read and mapping error\n+     *                                         probabilities\n+     */\n+    public BayesianHetPulldownCalculator(final File refFile, final IntervalList snpIntervals,\n+                                         final int minMappingQuality, final int minBaseQuality,\n+                                         final int readDepthThreshold, final ValidationStringency validationStringency,\n+                                         final double errorProbabilityAdjustmentFactor) {\n+\n+        ParamUtils.isPositiveOrZero(minMappingQuality, \"Minimum mapping quality must be nonnegative.\");\n+        ParamUtils.isPositiveOrZero(minBaseQuality, \"Minimum base quality must be nonnegative.\");\n+\n+        this.refFile = refFile;\n+        this.snpIntervals = snpIntervals;\n+        this.minMappingQuality = ParamUtils.isPositive(minMappingQuality, \"Minimum mapping quality must be a positive integer\");\n+        this.minBaseQuality = ParamUtils.isPositive(minBaseQuality, \"Minimum base quality must be a positive integer\");\n+        this.readDepthThreshold = ParamUtils.isPositive(readDepthThreshold, \"Read depth threshold must be a positive integer\");\n+        this.validationStringency = validationStringency;\n+        this.errorProbabilityAdjustmentFactor = ParamUtils.isPositive(errorProbabilityAdjustmentFactor,\n+                \"Error adjustment factor must be positive.\");\n+\n+        /* the default Het prior */\n+        useBalancedHetPrior();\n+    }\n+\n+    /**\n+     * use the BALANCED prior for Het sites.\n+     */\n+    public void useBalancedHetPrior() {\n+        hetPriorType = HetPriorType.BALANCED;\n+        logger.info(\"Using the BALANCED Het prior.\");\n+    }\n+\n+    /**\n+     * use the HETEROGENEOUS prior for Het sites.\n+     * @param minAbnormalFraction estimated minimum fraction of non-germline cells in the sample\n+     * @param maxAbnormalFraction estimated maximum fraction of non-germline cells in the sample\n+     * @param maxCopyNumber estimated maximum copy number in non-germline events (note: we use a flat probability\n+     *                      function for the copy number. using a large value of maxCopyNumber will result in a\n+     *                      significant spread of the minor allele fraction prior around 1/2. it is recommended not\n+     *                      to use values > 4).\n+     * @param quadratureOrder the order of quadrature used in numerical integrations\n+     */\n+    public void useHeterogeneousHetPrior(final double minAbnormalFraction, final double maxAbnormalFraction,\n+                                         final int maxCopyNumber, final int quadratureOrder) {\n+\n+        hetPriorType = HetPriorType.HETEROGENEOUS;\n+\n+        /* parameters for building the allele ratio prior at Het sites */\n+        this.minAbnormalFraction = ParamUtils.inRange(minAbnormalFraction, 0.0, 1.0, \"Minimum fraction of abnormal\" +\n+                \" cells must be between 0 and 1.\");\n+        this.maxAbnormalFraction = ParamUtils.inRange(maxAbnormalFraction, this.minAbnormalFraction, 1.0, \"Maximum fraction of abnormal\" +\n+                \" cells must be greater than the provided minimum and less than 1.\");\n+        this.maxCopyNumber = ParamUtils.isPositive(maxCopyNumber, \"Maximum copy number must be positive\");\n+\n+        /* auxiliary member functions */\n+        this.minHetAlleleFraction = (1 - this.maxAbnormalFraction) / (this.maxCopyNumber * this.maxAbnormalFraction +\n+                2 * (1 - this.maxAbnormalFraction));\n+        this.breakpointHetAlleleFraction = (1 - this.minAbnormalFraction) / (this.maxCopyNumber * this.minAbnormalFraction +\n+                2 * (1 - this.minAbnormalFraction));\n+\n+        /* initialize the integration quadrature and calculate the allele fraction prior on the abscissas */\n+        initializeIntegrationQuadrature(ParamUtils.isPositive(quadratureOrder - MIN_QUADRATURE_ORDER,\n+                \"Quadrature order must be greater than \" + MIN_QUADRATURE_ORDER) + MIN_QUADRATURE_ORDER);\n+        initializeHetAlleleFractionPrior();\n+        logger.info(\"Using the HETEROGENEOUS Het prior.\");\n+    }\n+\n+    /******************************\n+     * core computational methods *\n+     ******************************/\n+\n+    /**\n+     * Initilizes the quadrature for calculating allele ratio integrals in getHetLogLikelihood\n+     * @param numIntegPoints  number of points in the quadrature\n+     */\n+    private void initializeIntegrationQuadrature(final int numIntegPoints) {\n+\n+        /* get Gauss-Legendre quadrature factory of order @numIntegPoints */\n+        GaussIntegratorFactory integratorFactory = new GaussIntegratorFactory();\n+        GaussIntegrator gaussIntegrator = integratorFactory.legendre(numIntegPoints,\n+                minHetAlleleFraction, 1.0 - minHetAlleleFraction);\n+\n+        /* abscissas */\n+        gaussIntegrationAbscissas.clear();\n+        gaussIntegrationAbscissas.addAll(IntStream.range(0, numIntegPoints).\n+                mapToDouble(gaussIntegrator::getPoint).boxed().collect(Collectors.toList()));\n+\n+        /* weights */\n+        gaussIntegrationWeights.clear();\n+        gaussIntegrationWeights.addAll(IntStream.range(0, numIntegPoints).\n+                mapToDouble(gaussIntegrator::getWeight).boxed().collect(Collectors.toList()));\n+\n+        /* log of weights */\n+        gaussIntegrationLogWeights.clear();\n+        gaussIntegrationLogWeights.addAll(gaussIntegrationWeights.stream().\n+                mapToDouble(FastMath::log).boxed().collect(Collectors.toList()));\n+    }\n+\n+    /**\n+     * (advanced) calculate a simple prior (and log prior) for the allele fraction based on\n+     * (1) minimum purity of the sample, and (2) maximum copy number. See CNV-methods.pdf for details.\n+     */\n+    private void initializeHetAlleleFractionPrior() {\n+\n+        alleleFractionPriors.clear();\n+        alleleFractionPriors.addAll(gaussIntegrationAbscissas.stream()\n+                .mapToDouble(alleleFraction -> {\n+                    double minorAlleleFraction = (alleleFraction < 0.5) ? alleleFraction : 1 - alleleFraction;\n+                    if (minorAlleleFraction < minHetAlleleFraction) {\n+                        return 0;\n+                    } else if (minorAlleleFraction < breakpointHetAlleleFraction) {\n+                        double denom = 2 * FastMath.pow((1 - minorAlleleFraction) * minorAlleleFraction * maxCopyNumber, 2) *\n+                                maxAbnormalFraction * (maxAbnormalFraction - minAbnormalFraction);\n+                        double num = (-1 + (-1 + minorAlleleFraction * maxCopyNumber) * maxAbnormalFraction) *\n+                                (-1 + maxAbnormalFraction + minorAlleleFraction * (2 + (-2 + maxCopyNumber) * maxAbnormalFraction)) +\n+                                2 * (1 + minorAlleleFraction * (-2 + minorAlleleFraction * maxCopyNumber)) * maxAbnormalFraction *\n+                                        FastMath.log(FastMath.abs(((1 + minorAlleleFraction * (-2 + maxCopyNumber)) * maxAbnormalFraction)) /\n+                                                (1 - 2 * minorAlleleFraction));\n+                        return num / denom;\n+                    } else { /* breakpointHetAlleleFraction < minorAlleleFraction < 1/2 */\n+                        double denom = 2 * FastMath.pow((1 - minorAlleleFraction) * minorAlleleFraction * maxCopyNumber, 2) *\n+                                maxAbnormalFraction * minAbnormalFraction * (maxAbnormalFraction - minAbnormalFraction);\n+                        double num = (maxAbnormalFraction - minAbnormalFraction) * (-1 + 2 * minorAlleleFraction +\n+                                (1 + minorAlleleFraction * (-2 + maxCopyNumber)) * (-1 + minorAlleleFraction * maxCopyNumber) *\n+                                maxAbnormalFraction * minAbnormalFraction) + 2 * (1 + minorAlleleFraction * (-2 + minorAlleleFraction *\n+                                maxCopyNumber)) * maxAbnormalFraction * minAbnormalFraction * FastMath.log(maxAbnormalFraction / minAbnormalFraction);\n+                        return num / denom;\n+                    }\n+                })\n+                .boxed().collect(Collectors.toList()));\n+\n+        /* calculate the log prior */\n+        alleleFractionLogPriors.clear();\n+        alleleFractionLogPriors.addAll(alleleFractionPriors.stream()\n+                .mapToDouble(FastMath::log).boxed().collect(Collectors.toList()));\n+    }\n+\n+    /**\n+     * calculate the log probability, safeguarded with a minimum probability DEFAULT_MIN_BASE_ERROR_THIRD\n+     * @param prob probability\n+     * @return safeguarded-log of probability\n+     */\n+    private double getSafeguardedLogProbability(final double prob) {\n+        return FastMath.log(FastMath.max(DEFAULT_MIN_BASE_ERROR_THIRD, prob));\n+    }\n+\n+    /**\n+     * calculate the log likelihood of a SNP site being homozygous for a given read pileup\n+     * (see CNV-method.pdf for details)\n+     * @param baseQualities map of bases to list of their calling error probabilities at the SNP site\n+     * @param alleleRef the ref allele base\n+     * @param alleleAlt the alt allele base\n+     * @param homRefPrior the prior probability of the ref allele given that the site is homozygous\n+     * @return the log likelihood\n+     */\n+    @VisibleForTesting\n+    public double getHomLogLikelihood(final Map<Nucleotide, ArrayList<BaseQuality>> baseQualities,\n+                                      final Nucleotide alleleRef, final Nucleotide alleleAlt,\n+                                      final double homRefPrior) {\n+\n+        /* initilize the log likehoods of ref and alt with the priors ... */\n+        double homRefLogLikelihood = FastMath.log(Utils.nonNull(homRefPrior));\n+        double homAltLogLikelihood = FastMath.log(1.0 - Utils.nonNull(homRefPrior));\n+\n+        /* ... and add the log likelihood of the reads */\n+        for (Nucleotide base : baseQualities.keySet()) {\n+            for (BaseQuality currentBaseQuality : baseQualities.get(base)) {","path":"src/main/java/org/broadinstitute/hellbender/tools/exome/BayesianHetPulldownCalculator.java","position":310,"original_position":310,"commit_id":"1937578df8078be19df3b7aced2788428521d73d","original_commit_id":"1937578df8078be19df3b7aced2788428521d73d","user":{"login":"vruano","id":791104,"avatar_url":"https://avatars.githubusercontent.com/u/791104?v=3","gravatar_id":"","url":"https://api.github.com/users/vruano","html_url":"https://github.com/vruano","followers_url":"https://api.github.com/users/vruano/followers","following_url":"https://api.github.com/users/vruano/following{/other_user}","gists_url":"https://api.github.com/users/vruano/gists{/gist_id}","starred_url":"https://api.github.com/users/vruano/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vruano/subscriptions","organizations_url":"https://api.github.com/users/vruano/orgs","repos_url":"https://api.github.com/users/vruano/repos","events_url":"https://api.github.com/users/vruano/events{/privacy}","received_events_url":"https://api.github.com/users/vruano/received_events","type":"User","site_admin":false},"body":"currentBaseQuality can be final.","created_at":"2016-04-18T22:18:06Z","updated_at":"2016-04-18T22:18:06Z","html_url":"https://github.com/broadinstitute/gatk-protected/pull/444#discussion_r60144276","pull_request_url":"https://api.github.com/repos/broadinstitute/gatk-protected/pulls/444","_links":{"self":{"href":"https://api.github.com/repos/broadinstitute/gatk-protected/pulls/comments/60144276"},"html":{"href":"https://github.com/broadinstitute/gatk-protected/pull/444#discussion_r60144276"},"pull_request":{"href":"https://api.github.com/repos/broadinstitute/gatk-protected/pulls/444"}}},"pull_request":{"url":"https://api.github.com/repos/broadinstitute/gatk-protected/pulls/444","id":66513881,"html_url":"https://github.com/broadinstitute/gatk-protected/pull/444","diff_url":"https://github.com/broadinstitute/gatk-protected/pull/444.diff","patch_url":"https://github.com/broadinstitute/gatk-protected/pull/444.patch","issue_url":"https://api.github.com/repos/broadinstitute/gatk-protected/issues/444","number":444,"state":"open","locked":false,"title":"\"Bayesian\" Het pulldown","user":{"login":"mbabadi","id":15305869,"avatar_url":"https://avatars.githubusercontent.com/u/15305869?v=3","gravatar_id":"","url":"https://api.github.com/users/mbabadi","html_url":"https://github.com/mbabadi","followers_url":"https://api.github.com/users/mbabadi/followers","following_url":"https://api.github.com/users/mbabadi/following{/other_user}","gists_url":"https://api.github.com/users/mbabadi/gists{/gist_id}","starred_url":"https://api.github.com/users/mbabadi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mbabadi/subscriptions","organizations_url":"https://api.github.com/users/mbabadi/orgs","repos_url":"https://api.github.com/users/mbabadi/repos","events_url":"https://api.github.com/users/mbabadi/events{/privacy}","received_events_url":"https://api.github.com/users/mbabadi/received_events","type":"User","site_admin":false},"body":"New Het pulldown tool. At the moment, this CLI tool is separate from the original one (GetHetCoverage). We will eventually either drop the old tool or merge it with this.\r\n\r\nCloses issue #56.","created_at":"2016-04-14T16:25:10Z","updated_at":"2016-04-18T22:18:06Z","closed_at":null,"merged_at":null,"merge_commit_sha":"52bd6122e7df546d83e99c2a330d3a410778602c","assignee":{"login":"vruano","id":791104,"avatar_url":"https://avatars.githubusercontent.com/u/791104?v=3","gravatar_id":"","url":"https://api.github.com/users/vruano","html_url":"https://github.com/vruano","followers_url":"https://api.github.com/users/vruano/followers","following_url":"https://api.github.com/users/vruano/following{/other_user}","gists_url":"https://api.github.com/users/vruano/gists{/gist_id}","starred_url":"https://api.github.com/users/vruano/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vruano/subscriptions","organizations_url":"https://api.github.com/users/vruano/orgs","repos_url":"https://api.github.com/users/vruano/repos","events_url":"https://api.github.com/users/vruano/events{/privacy}","received_events_url":"https://api.github.com/users/vruano/received_events","type":"User","site_admin":false},"milestone":{"url":"https://api.github.com/repos/broadinstitute/gatk-protected/milestones/7","html_url":"https://github.com/broadinstitute/gatk-protected/milestones/CNV%20Tools%20alpha-2%20release","labels_url":"https://api.github.com/repos/broadinstitute/gatk-protected/milestones/7/labels","id":1392082,"number":7,"title":"CNV Tools alpha-2 release","description":"#### ACNV\r\n\r\n- ACNV improvements, incl. Allelic PoN, CN LOH caller, more plotting, and (if time permits) improving calling balanced segments\r\n- ACNV additional evaluations, incl. \"Amaro's evaluation\"\r\n- case-only ACNV (if time permits)\r\n\r\n#### Germline\r\n- Germline improvements to algorithm\r\n- Germline exome evaluation\r\n- Germline gene panel evaluation\r\n- Tagging germline events in GATK CNV results\r\n\r\n#### WGS\r\n- WGS workflow, including performance (RAM/CPU time) improvements with spark\r\n\r\n#### Other\r\n- GC correction and eval on exome\r\n- Refactoring of copious Target/ReadCount classes (see issues)\r\n\r\n\r\n\r\n\r\n","creator":{"login":"LeeTL1220","id":2152339,"avatar_url":"https://avatars.githubusercontent.com/u/2152339?v=3","gravatar_id":"","url":"https://api.github.com/users/LeeTL1220","html_url":"https://github.com/LeeTL1220","followers_url":"https://api.github.com/users/LeeTL1220/followers","following_url":"https://api.github.com/users/LeeTL1220/following{/other_user}","gists_url":"https://api.github.com/users/LeeTL1220/gists{/gist_id}","starred_url":"https://api.github.com/users/LeeTL1220/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/LeeTL1220/subscriptions","organizations_url":"https://api.github.com/users/LeeTL1220/orgs","repos_url":"https://api.github.com/users/LeeTL1220/repos","events_url":"https://api.github.com/users/LeeTL1220/events{/privacy}","received_events_url":"https://api.github.com/users/LeeTL1220/received_events","type":"User","site_admin":false},"open_issues":24,"closed_issues":15,"state":"open","created_at":"2015-11-03T19:42:51Z","updated_at":"2016-04-14T16:25:11Z","due_on":"2016-05-02T04:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/broadinstitute/gatk-protected/pulls/444/commits","review_comments_url":"https://api.github.com/repos/broadinstitute/gatk-protected/pulls/444/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/444/comments","statuses_url":"https://api.github.com/repos/broadinstitute/gatk-protected/statuses/1937578df8078be19df3b7aced2788428521d73d","head":{"label":"broadinstitute:mb_bayesian_het_pulldown","ref":"mb_bayesian_het_pulldown","sha":"1937578df8078be19df3b7aced2788428521d73d","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}","deployments_url":"https://api.github.com/repos/broadinstitute/gatk-protected/deployments","created_at":"2015-04-22T20:24:45Z","updated_at":"2016-04-06T18:03:09Z","pushed_at":"2016-04-15T22:04:38Z","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":62199,"stargazers_count":8,"watchers_count":8,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3,"mirror_url":null,"open_issues_count":109,"forks":3,"open_issues":109,"watchers":8,"default_branch":"master"}},"base":{"label":"broadinstitute:master","ref":"master","sha":"009d3d3a5ae95bcf56fbb2c1bf7423208c5ba371","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}","deployments_url":"https://api.github.com/repos/broadinstitute/gatk-protected/deployments","created_at":"2015-04-22T20:24:45Z","updated_at":"2016-04-06T18:03:09Z","pushed_at":"2016-04-15T22:04:38Z","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":62199,"stargazers_count":8,"watchers_count":8,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3,"mirror_url":null,"open_issues_count":109,"forks":3,"open_issues":109,"watchers":8,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/broadinstitute/gatk-protected/pulls/444"},"html":{"href":"https://github.com/broadinstitute/gatk-protected/pull/444"},"issue":{"href":"https://api.github.com/repos/broadinstitute/gatk-protected/issues/444"},"comments":{"href":"https://api.github.com/repos/broadinstitute/gatk-protected/issues/444/comments"},"review_comments":{"href":"https://api.github.com/repos/broadinstitute/gatk-protected/pulls/444/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/444/commits"},"statuses":{"href":"https://api.github.com/repos/broadinstitute/gatk-protected/statuses/1937578df8078be19df3b7aced2788428521d73d"}}}}