{"action":"created","comment":{"url":"https://api.github.com/repos/broadinstitute/gatk-protected/pulls/comments/65437502","id":65437502,"diff_hunk":"@@ -0,0 +1,803 @@\n+package org.broadinstitute.hellbender.tools.exome.cnlohcaller;\n+\n+import com.google.common.annotations.VisibleForTesting;\n+import org.apache.commons.math3.analysis.UnivariateFunction;\n+import org.apache.commons.math3.analysis.integration.BaseAbstractUnivariateIntegrator;\n+import org.apache.commons.math3.analysis.integration.SimpsonIntegrator;\n+import org.apache.commons.math3.distribution.GammaDistribution;\n+import org.apache.commons.math3.distribution.NormalDistribution;\n+import org.apache.commons.math3.linear.ArrayRealVector;\n+import org.apache.commons.math3.linear.MatrixUtils;\n+import org.apache.commons.math3.linear.RealMatrix;\n+import org.apache.commons.math3.linear.RealVector;\n+import org.apache.commons.math3.optim.MaxEval;\n+import org.apache.commons.math3.optim.nonlinear.scalar.GoalType;\n+import org.apache.commons.math3.optim.univariate.BrentOptimizer;\n+import org.apache.commons.math3.optim.univariate.SearchInterval;\n+import org.apache.commons.math3.optim.univariate.UnivariateObjectiveFunction;\n+import org.apache.commons.math3.special.Gamma;\n+import org.apache.commons.math3.stat.descriptive.moment.Variance;\n+import org.apache.commons.math3.stat.descriptive.rank.Percentile;\n+import org.apache.commons.math3.util.Pair;\n+import org.apache.logging.log4j.LogManager;\n+import org.apache.logging.log4j.Logger;\n+import org.apache.spark.SparkConf;\n+import org.apache.spark.api.java.JavaRDD;\n+import org.apache.spark.api.java.JavaSparkContext;\n+import org.apache.spark.serializer.KryoSerializer;\n+import org.apache.spark.serializer.SerializerInstance;\n+import org.broadinstitute.hellbender.tools.exome.ACNVModeledSegment;\n+import org.broadinstitute.hellbender.utils.GATKProtectedMathUtils;\n+import org.broadinstitute.hellbender.utils.MathUtils;\n+import org.broadinstitute.hellbender.utils.Utils;\n+import org.broadinstitute.hellbender.utils.param.ParamUtils;\n+import org.broadinstitute.hellbender.utils.variant.HomoSapiensConstants;\n+import scala.reflect.ClassTag;\n+import scala.reflect.ClassTag$;\n+\n+import java.io.Serializable;\n+import java.util.ArrayList;\n+import java.util.List;\n+import java.util.SortedMap;\n+import java.util.function.Function;\n+import java.util.stream.Collectors;\n+import java.util.stream.IntStream;\n+\n+\n+/**\n+ * <p>This class makes calls for each segment on whether the segment is CNLoH and/or balanced (MAF=0.5).  Please see the\n+ *  docs for detailed information.\n+ * </p>\n+ *\n+ * <p>Throughout this class, rho is the CCF * purity.  M is the copy number of one allele and N is the copy number of the other allele.\n+ * There is no assumption about the relative relationship of M and N, though typically, we try to maintain M >= N,\n+ *  though this is not guaranteed.\n+ *</p>\n+ *\n+ *  <p>Many of the variable names assume that you have read the CNV methods pdf in the docs directory.</p>\n+ *\n+ * Variables:\n+ * <ul>\n+ *     <li>rho -- CCF * purity.  We use a set number of rhos that each segment can have.</li>\n+ *     <li>M -- absolute copy number for allele 1</li>\n+ *     <li>N -- absolute copy number for allele 2.  NOT assumed to have same or fewer copies than allele 1</li>\n+ *     <li>pi -- discrete pdf for values of M and N</li>\n+ *     <li>phi -- discrete pdf for each rho value</li>\n+ *     <li>maf -- minor allelic fraction</li>\n+ *     <li>fMaf -- likelihood of a minor allelic fraction, given other parameters</li>\n+ *     <li>cr -- copy ratio</li>\n+ *     <li>fCr -- likelihood of a copy ratio, given other parameters</li>\n+ *     <li>alpha -- concentration parameter of dirichlet prior on z_s</li>\n+ *     <li>z_s -- indicator variable (binary) whether segment s has a CNV on segment s.  This is not explicitly used in the code.</li>\n+ * </ul>\n+ *\n+ *  NOTES:\n+ *  <ul>\n+ *      <li>{@code lambda} (CCF * ploidy) is present, but the value is never changed.  In future versions, we may add this to the model.</li>\n+ *  </ul>\n+ */\n+public class CNLOHCaller implements Serializable {\n+\n+    private static final Logger logger = LogManager.getLogger(CNLOHCaller.class);\n+    protected static double MIN_L = 1e-50;\n+    protected static double MIN_DIST_FROM_MODE = 1e-10;\n+    static final long serialVersionUID = 337337337123L;\n+\n+    private double segmentMeanBiasInCR;\n+    private double segmentMeanVarianceInCR;\n+\n+    private double rhoThreshold;\n+\n+    public static double RHO_THRESHOLD_DEFAULT = 0.2;\n+\n+    private static double NUM_STD_95_CONF_INTERVAL_GAUSSIAN = 1.96;\n+\n+    private static double CLOSE_ENOUGH_TO_COPY_NEUTRAL_IN_CR = 0.1;\n+\n+    /** How many copies expected in a normal.  For humans, this is 2 */\n+    private int normalNumCopies;\n+\n+    public CNLOHCaller(){\n+        rhoThreshold = RHO_THRESHOLD_DEFAULT;\n+        normalNumCopies = HomoSapiensConstants.DEFAULT_PLOIDY;\n+    }\n+\n+    public int getNormalNumCopies() {\n+        return normalNumCopies;\n+    }\n+\n+    public void setNormalNumCopies(final int normalNumCopies) {\n+        this.normalNumCopies = normalNumCopies;\n+    }\n+\n+    public double getRhoThreshold() {\n+        return rhoThreshold;\n+    }\n+\n+    public void setRhoThreshold(final double rhoThreshold) {\n+        this.rhoThreshold = rhoThreshold;\n+    }\n+\n+    /**\n+     * Calculate the likelihood of a MAF.\n+     *\n+     * This is done by assuming with two half-Gaussians each modeling below the mode and above the mode.  While this is not a\n+     *  particularly good form for a distribution, it is quick to calculate and generates reasonable results.  This is\n+     *  also done because we do not know the exact form of the distribution when coming from ACNV.\n+     *\n+     */\n+    @VisibleForTesting\n+    static double calculateFmaf(final double rho, final int m, final int n, final double credibleMode,\n+                                   final double credibleLow, final double credibleHigh, final double normalPloidy) {\n+        ParamUtils.inRange(rho, 0.0, 1.0, \"Invalid rho value: \" + rho + \".  Must be [0,1]\");\n+        ParamUtils.isPositiveOrZero(m, \"M must be positive.\");\n+        ParamUtils.isPositiveOrZero(n, \"N must be positive.\");\n+\n+        if (Double.isNaN(credibleMode) || Double.isNaN(credibleLow) || Double.isNaN(credibleHigh)){\n+            return 1;\n+        }\n+\n+        final double maf = calculateMaf(rho, m, n, normalPloidy);\n+        return Math.max(calculateDoubleGaussian(maf, credibleMode, credibleLow, credibleHigh), MIN_L);\n+\n+    }\n+\n+    /**\n+     * Calculates the minor allelic fraction for given rho, M, and N.\n+     *\n+     *  Output is truncated at MIN_L\n+     *\n+     *  @param rho CCF*purity\n+     * @param m absolute copy number of allele1\n+     * @param n absolute copy number of allele2\n+     * @return calculated minor allele fraction\n+     */\n+    @VisibleForTesting\n+    static double calculateMaf(final double rho, final int m, final int n, final double normalPloidy) {\n+        ParamUtils.inRange(rho, 0.0, 1.0, \"Invalid rho value: \" + rho + \".  Must be [0,1]\");\n+        ParamUtils.isPositiveOrZero(m, \"M must be >= 0\");\n+        ParamUtils.isPositiveOrZero(n, \"N must be >= 0\");\n+\n+        double result = ((1-rho) + rho * (Math.min(n,m))) / ( (1-rho)*normalPloidy + rho * (n+m) );\n+\n+        // If result is NaN, that means that we had rho = 1 and M,N = 0\n+        return (result < MIN_L) || (Double.isNaN(result)) ? MIN_L : result;\n+    }\n+\n+    /**\n+     * This function takes two half-Gaussian distributions and uses one for the values below the mode and the other for values above the\n+     *  mode.\n+     *\n+     *  If the mode is outside the credible interval, the calculation is done as if the interval boundary is\n+     *   {@link CNLOHCaller#MIN_DIST_FROM_MODE} above/below the mode.\n+     *\n+     *\n+     * @param val value to calculate the \"pdf\"\n+     * @param credibleMode mode of the presumed distribution\n+     * @param credibleLow 95% confidence interval on the low tail\n+     * @param credibleHigh 95% confidence interval on the high tail\n+     * @return pdf with a minimum value of {@link CNLOHCaller#MIN_L}\n+     */\n+    @VisibleForTesting\n+    static double calculateDoubleGaussian(final double val, final double credibleMode, final double credibleLow,\n+                                             final double credibleHigh) {\n+\n+        final double hiDist = Math.max(credibleHigh - credibleMode, MIN_DIST_FROM_MODE);\n+        final double loDist = Math.max(credibleMode - credibleLow, MIN_DIST_FROM_MODE);\n+        return new NormalDistribution(null, credibleMode, ( val >= credibleMode ? hiDist : loDist)/NUM_STD_95_CONF_INTERVAL_GAUSSIAN).density(val);\n+    }\n+\n+    /**\n+     * Calculate a copy ratio.\n+     *\n+     * @param rho CCF * purity\n+     * @param m Absolute copy number of allele 1\n+     * @param n Absolute copy number of allele 2\n+     * @param lambda CCF * ploidy\n+     * @param normalPloidy ploidy for the normal cells.  For humans, this is 2.\n+     * @return copy ratio in CR space\n+     */\n+    @VisibleForTesting\n+    static double calculateCopyRatio(final double rho, final int m, final int n, final double lambda, final double normalPloidy) {\n+        return ((1-rho) * normalPloidy + rho*(n+m)) / lambda;\n+    }\n+\n+    /**\n+     * Calculate the likelihood for the copy ratio.  Models the credible interval as a Gaussian.\n+     *\n+     * @param rho -- see class docs\n+     * @param m -- see class docs\n+     * @param n -- see class docs\n+     * @param lambda -- see class docs\n+     * @param credibleMode mode of the credible interval from for the copy ratio.\n+     * @param credibleLow  low point of the credible interval from for the copy ratio.\n+     * @param credibleHigh  high point of the credible interval from for the copy ratio.\n+     * @param additionalVariance Additional variance that should be included in the segment mean pdf\n+     * @param normalPloidy ploidy for the normal cells.  For humans, this is 2.\n+     * @return likelihood, with a minimum value of {@link CNLOHCaller#MIN_L}\n+     */\n+    @VisibleForTesting\n+    static double calculateFcr(final double rho, final int m, final int n, final double lambda, final double credibleMode,\n+                         final double credibleLow, final double credibleHigh, final double additionalVariance, final double normalPloidy) {\n+        ParamUtils.inRange(rho, 0.0, 1.0, \"Invalid rho value: \" + rho + \".  Must be [0,1]\");\n+        ParamUtils.isPositiveOrZero(m, \"M must be positive.\");\n+        ParamUtils.isPositiveOrZero(n, \"N must be positive.\");\n+        ParamUtils.isPositiveOrZero(additionalVariance, \"additional variance must be positive.\");\n+        if (Double.isNaN(credibleMode) || Double.isNaN(credibleLow) || Double.isNaN(credibleHigh)){\n+            return 1;\n+        }\n+        final double cr = calculateCopyRatio(rho, m, n, lambda, normalPloidy);\n+        final double avgDist = ((credibleMode - credibleLow) + (credibleHigh - credibleMode))/2.0;\n+        return Math.max(new NormalDistribution(null, credibleMode,\n+                (avgDist / NUM_STD_95_CONF_INTERVAL_GAUSSIAN) + Math.sqrt(additionalVariance)).density(cr), MIN_L);\n+    }\n+\n+    /**\n+     * Attempt to get an idea of segment mean variance near copy neutral.\n+     *\n+     * @param segments Never {@code null}\n+     * @return variance of segment mean (in CR space) of segments that are \"close enough\" to copy neutral.\n+     *   Zero if no segments are \"close enough\"\n+     */\n+    private double calculateVarianceOfCopyNeutralSegmentMeans(final List<ACNVModeledSegment> segments, final double meanBiasInCR) {\n+        Utils.nonNull(segments);\n+\n+        // Only consider values \"close enough\" to copy neutral (CR == 1).\n+        final double neutralCR = 1 + meanBiasInCR;\n+        final double[] neutralSegmentMeans = segments.stream()\n+                .mapToDouble(ACNVModeledSegment::getSegmentMeanInCRSpace)\n+                .filter(m -> Math.abs(m - neutralCR) < CLOSE_ENOUGH_TO_COPY_NEUTRAL_IN_CR).toArray();\n+        return new Variance().evaluate(neutralSegmentMeans);\n+    }\n+\n+    private double calculateSegmentMeanBiasInCRSpace(final List<ACNVModeledSegment> segments) {\n+        Utils.nonNull(segments);\n+\n+        final double neutralCRApprox = 1;\n+\n+        // Only consider values \"close enough\" to copy neutral (CR == 1).\n+        final double[] neutralSegmentMeans = segments.stream().mapToDouble(ACNVModeledSegment::getSegmentMeanInCRSpace)\n+                .filter(x -> Math.abs(x - neutralCRApprox) < CLOSE_ENOUGH_TO_COPY_NEUTRAL_IN_CR)\n+                .toArray();\n+\n+        return new Percentile().evaluate(neutralSegmentMeans) - 1;\n+    }\n+\n+    /**\n+     * Make both CNLoH and balanced segment calls.\n+     *\n+     * This method is not thread-safe, since it initializes member attributes.\n+     *\n+     * @param segments The segments with segment mean and minor allelic fraction estimates (typically from ACNV).\n+     * @param numIterations Number of EM iteration to run\n+     * @param ctx This call requires Spark, so not {@code null}\n+     * @return Never {@code null}\n+     */\n+    public List<CNLOHCall> makeCalls(final List<ACNVModeledSegment> segments, final int numIterations, final JavaSparkContext ctx) {\n+\n+        ParamUtils.isPositive(numIterations, \"Must be more than zero iterations.\");\n+        Utils.nonNull(segments);\n+        Utils.nonNull(ctx, \"Java SparkContext can't be null when attempting to make CNLOH and balance calls.\");\n+\n+        segmentMeanBiasInCR = calculateSegmentMeanBiasInCRSpace(segments);\n+        segmentMeanVarianceInCR = calculateVarianceOfCopyNeutralSegmentMeans(segments, segmentMeanBiasInCR);\n+\n+        CNLOHCallerModelState state = CNLOHCallerModelState.createInitialCNLOHCallerModelState(rhoThreshold, segments, normalNumCopies);\n+\n+        // Create a Spark RDD for the segments.\n+        final JavaRDD<ACNVModeledSegment> segs = ctx.parallelize(segments);\n+\n+        List<CNLOHCall> cnlohCalls = null;\n+\n+        // for each iteration\n+        for (int i = 1; i <= numIterations; i++) {\n+\n+            logger.info(\"Starting iteration \" + i + \" of \" + numIterations + \" ... \");\n+            logger.info(\"Calculating big E_zsk_vsm_wsn for each segment (iteration \" + i + \" of \" + numIterations + \") ... \");\n+\n+            // We are not broadcasting state, since it will only be used once before values change.  In that case,\n+            //  there is no gain for broadcasting\n+\n+            // Effectively, the responsibilities are a 4D array:  S x K x M x N.  We do the responsibility calculation\n+            //  over the segments.  So the JavaRDD will be of length S.\n+            // Update E_zsk_vsm_wsn (responsibilities) for each segment (Steps 1 & 2)  {K x M x N} in S entries.  The RDD is of length S.\n+            final JavaRDD<double[][][]> eZskVsmWsnBySeg = segs.map(s -> calcE_zsk_vsm_wsn(state.geteLnPhiK(), state.getCnToPiMap(), state.getRhos(),\n+                    s.getMinorAlleleFractionPosteriorSummary().getCenter(),\n+                    s.getMinorAlleleFractionPosteriorSummary().getLower(),\n+                    s.getMinorAlleleFractionPosteriorSummary().getUpper(),\n+                    Math.pow(2, s.getSegmentMeanPosteriorSummary().getCenter()) - segmentMeanBiasInCR,\n+                    Math.pow(2, s.getSegmentMeanPosteriorSummary().getLower()) - segmentMeanBiasInCR,\n+                    Math.pow(2, s.getSegmentMeanPosteriorSummary().getUpper()) - segmentMeanBiasInCR,\n+                    state.getLambda()));\n+\n+            // Create an array (for each segment) that is a sum of eZskVsmWsnBySeg on the rhos.  (length:K for S entries)\n+            final JavaRDD<double[]> eZskBySeg = eZskVsmWsnBySeg.map(da -> sumOverFirstDimension(da));\n+            final JavaRDD<double[]> eVsmBySeg = eZskVsmWsnBySeg.map(da -> sumOverSecondDimension(da));\n+            final JavaRDD<double[]> eWsnBySeg = eZskVsmWsnBySeg.map(da -> sumOverThirdDimension(da));\n+\n+            // Create arrays summed in one dimension (incl. over segs).\n+            final double[] eZskSummedOverSegs = sumOverSegs(eZskBySeg);","path":"src/main/java/org/broadinstitute/hellbender/tools/exome/cnlohcaller/CNLOHCaller.java","position":319,"original_position":319,"commit_id":"685e415df2ddf81501a5c54b3eae4977acc35f3a","original_commit_id":"685e415df2ddf81501a5c54b3eae4977acc35f3a","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":"Name this `totalResponsibilityByRho` or `pseudocountsByRho` or. . . your choice of something evocative.","created_at":"2016-06-01T20:37:10Z","updated_at":"2016-06-01T20:37:10Z","html_url":"https://github.com/broadinstitute/gatk-protected/pull/529#discussion_r65437502","pull_request_url":"https://api.github.com/repos/broadinstitute/gatk-protected/pulls/529","_links":{"self":{"href":"https://api.github.com/repos/broadinstitute/gatk-protected/pulls/comments/65437502"},"html":{"href":"https://github.com/broadinstitute/gatk-protected/pull/529#discussion_r65437502"},"pull_request":{"href":"https://api.github.com/repos/broadinstitute/gatk-protected/pulls/529"}}},"pull_request":{"url":"https://api.github.com/repos/broadinstitute/gatk-protected/pulls/529","id":72079599,"html_url":"https://github.com/broadinstitute/gatk-protected/pull/529","diff_url":"https://github.com/broadinstitute/gatk-protected/pull/529.diff","patch_url":"https://github.com/broadinstitute/gatk-protected/pull/529.patch","issue_url":"https://api.github.com/repos/broadinstitute/gatk-protected/issues/529","number":529,"state":"open","locked":false,"title":"Implementation of the CNLOH/Balanced caller.","user":{"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},"body":"This also covers updated conversion to AllelicCapSeg and new conversion to TITAN formats.\r\n\r\nCloses #225 \r\nCloses #359 \r\nCloses #491 \r\n\r\nIncomplete first cut.  Basic outline, but many holes left and needs automated tests\r\n\r\nStill not complete.  Adding more utilities and the last objective function.\r\n\r\nImplementing objective function.  Still unfinished.\r\n\r\nAll necessary classes are serializable.  Need to find NaN generation and correct it, since it causes digamma to fail.\r\n\r\nSuccessful first run of iterations.  Need to make calls and address many TODOs\r\n\r\nAdded CLI for CNLoH caller.  About to rebase from master to get refactorings.\r\n\r\nMinor changes\r\n\r\nFixes so that the automated test failure may just be an issue in the test.\r\n\r\nFixes so that the automated tests of CNLOH caller pass.\r\n\r\nAddressing docs.\r\n\r\nFixing the cases where credible mode is outside the interval.\r\n\r\nFixing the case where credible mode is lying on one of the boundaries..\r\n\r\nFixing serialization issues.  Made the CNLoHCall singular.  Updated docs.  Corrected an issue with reading ACNV seg files.\r\n\r\nBias and variance correction added.\r\n\r\nAdding documentation and unit tests.\r\n\r\nTitan conversion added.\r\n\r\nTitan conversion automated tests added.\r\n\r\nEliminated 2 warnings\r\n\r\nCorrected file output\r\n\r\nAdded more columns to the calls, to better debug/evaluate the results.\r\n\r\nFixed max2dIndices\r\n\r\nA bunch of bug fixes to get it inline with the prototype.  Now, the results look a little better (qualitative; small sample size) in this version.\r\n\r\nLast minute changes to unit test to cover double gaussian\r\n\r\nLast minute update to docs","created_at":"2016-05-31T20:23:37Z","updated_at":"2016-06-01T20:37:10Z","closed_at":null,"merged_at":null,"merge_commit_sha":"aa5c799bfd294060e24d3898d17eb60bfad43326","assignee":{"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},"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":9,"closed_issues":38,"state":"open","created_at":"2015-11-03T19:42:51Z","updated_at":"2016-06-01T19:46:25Z","due_on":"2016-05-31T04:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/broadinstitute/gatk-protected/pulls/529/commits","review_comments_url":"https://api.github.com/repos/broadinstitute/gatk-protected/pulls/529/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/529/comments","statuses_url":"https://api.github.com/repos/broadinstitute/gatk-protected/statuses/685e415df2ddf81501a5c54b3eae4977acc35f3a","head":{"label":"broadinstitute:issue-225-cnloh_caller","ref":"issue-225-cnloh_caller","sha":"685e415df2ddf81501a5c54b3eae4977acc35f3a","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-06-01T20:25:09Z","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":114660,"stargazers_count":8,"watchers_count":8,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":8,"mirror_url":null,"open_issues_count":136,"forks":8,"open_issues":136,"watchers":8,"default_branch":"master"}},"base":{"label":"broadinstitute:master","ref":"master","sha":"0848fbc90e02839a07043f06c867025e56a55277","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-06-01T20:25:09Z","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":114660,"stargazers_count":8,"watchers_count":8,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":8,"mirror_url":null,"open_issues_count":136,"forks":8,"open_issues":136,"watchers":8,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/broadinstitute/gatk-protected/pulls/529"},"html":{"href":"https://github.com/broadinstitute/gatk-protected/pull/529"},"issue":{"href":"https://api.github.com/repos/broadinstitute/gatk-protected/issues/529"},"comments":{"href":"https://api.github.com/repos/broadinstitute/gatk-protected/issues/529/comments"},"review_comments":{"href":"https://api.github.com/repos/broadinstitute/gatk-protected/pulls/529/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/529/commits"},"statuses":{"href":"https://api.github.com/repos/broadinstitute/gatk-protected/statuses/685e415df2ddf81501a5c54b3eae4977acc35f3a"}}}}
{"actor":{"display_login":"davidbenjamin"}}