{"action":"created","comment":{"url":"https://api.github.com/repos/broadinstitute/gatk/pulls/comments/56016190","id":56016190,"diff_hunk":"@@ -147,48 +300,182 @@ private void collectSymmetricalBinWidth(final JavaRDD<Integer> lengthRDD){\n         return bin_widths;\n     }\n \n-    /**\n-     * Trim down width of histogram by tolerance.\n-     * Mean and SD are severely impacted by outliers, so they are computed here after trimming.\n-     * @param HistogramMADTolerance how many MADs from the median will be tolerated when down-trimming\n-     */\n-    private void trimHistogramAndCollectMeanAndSD(final JavaRDD<Integer> lengthRDD, final double HistogramMADTolerance){\n+    // small utility function to trim htsjdk Histogram and set corresponding metric's mean and SD\n+    private static void trimHTSHistogramAndSetMean(Histogram<Integer> htsHist, InsertSizeMetrics metrics, final double histogramMADTolerance){\n+        htsHist.trimByWidth( (int)(metrics.MEDIAN_INSERT_SIZE + histogramMADTolerance*metrics.MEDIAN_ABSOLUTE_DEVIATION) );\n+        metrics.MEAN_INSERT_SIZE   = htsHist.getMean();\n+        if(1==htsHist.getCount()){ // extremely unlikely in reality, but may be true at read group level when running tests\n+            metrics.STANDARD_DEVIATION = 0.0;\n+        }else{\n+            metrics.STANDARD_DEVIATION = htsHist.getStandardDeviation();\n+        }\n+    }\n \n-        // range of read length that is going to be tolerated when computing histogram, mean and SD, but will not affect other metrics.\n-        final int lengthToleranceLowerEnd = (int) metrics.MEDIAN_INSERT_SIZE - (int) (HistogramMADTolerance * metrics.MEDIAN_ABSOLUTE_DEVIATION);\n-        final int lengthToleranceHigherEnd = (int) metrics.MEDIAN_INSERT_SIZE + (int) (HistogramMADTolerance * metrics.MEDIAN_ABSOLUTE_DEVIATION);\n-        final JavaRDD<Integer> trimmedLengthRDD = lengthRDD.filter(length -> length >= lengthToleranceLowerEnd)\n-                                                           .filter(length -> length <= lengthToleranceHigherEnd);\n-        final double lengthArr[] = getRDDArray(trimmedLengthRDD);\n+    // small utility function to decide what group name to use in the corresponding htsjdk Histogram title/ctor.\n+    private static String getGroupName(final GroupInfo groupInfo){\n+        String groupName = null;\n+        switch (groupInfo.level){\n+            case ALL_READS:\n+                groupName = ALL_READS_KEY_MACRO;\n+                break;\n+            case SAMPLE:\n+                groupName = groupInfo.sample;\n+                break;\n+            case LIBRARY:\n+                groupName = groupInfo.library;\n+                break;\n+            case READ_GROUP:\n+                groupName = groupInfo.readGroup;\n+                break;\n+        }\n+        return (groupName + \".\");\n+    }\n+\n+    private static String orientationToString(final SamPairUtil.PairOrientation OR){\n+        return OR.equals(SamPairUtil.PairOrientation.FR) ? \"fr\" : (OR.equals(SamPairUtil.PairOrientation.RF) ? \"rf\" : \"tandem\");\n+    }\n+\n+    // utility functions to do mapping on RDDs; broken into three steps for easier comprehension\n+    private static Tuple2<GroupInfo, Tuple2<SamPairUtil.PairOrientation, Integer>> step1ReadTraversal(final GATKRead read, final SAMFileHeader header){\n+        final GroupInfo readsGroupInfo = new GroupInfo(read, header, MetricAccumulationLevel.READ_GROUP);\n+        final Tuple2<SamPairUtil.PairOrientation, Integer> readsPairInfo = new Tuple2<>(SamPairUtil.getPairOrientation(read.convertToSAMRecord(header)), Math.abs(read.getFragmentLength()));\n+        return new Tuple2<>(readsGroupInfo, readsPairInfo);\n+    }\n+\n+    private static Tuple2<GroupInfo, Map<SamPairUtil.PairOrientation, List<Integer>>> step2ConvertToList(final Tuple2<GroupInfo, Iterable<Tuple2<SamPairUtil.PairOrientation, Integer>>> entry){\n+        return new Tuple2<>(entry._1(), StreamSupport.stream(entry._2().spliterator(), false)\n+                                                     .collect(Collectors.groupingBy(Tuple2::_1,\n+                                                                                    Collectors.mapping(Tuple2::_2, Collectors.toList()))));\n+    }\n \n-        final DescriptiveStatistics percent = new DescriptiveStatistics(lengthArr);\n+    private static Tuple2<GroupInfo, Map<SamPairUtil.PairOrientation, SortedMap<Integer, Long>>> step3ConvertToHistogram(final Tuple2<GroupInfo, Map<SamPairUtil.PairOrientation, List<Integer>>> entry){\n \n-        metrics.MEAN_INSERT_SIZE   = percent.getMean();\n-        metrics.STANDARD_DEVIATION = percent.getStandardDeviation();\n+        final Map<SamPairUtil.PairOrientation, SortedMap<Integer, Long>> orientationToSortedMap = new HashMap<>();\n \n-        final SortedMap<Integer, Long> hist = new TreeMap<>(lengthRDD.countByValue());\n-        // TODO: fix second argument used in ctor, and potentially change how Histogram is constructed from TreeMap\n-        htslibHistogram = new Histogram<>(\"insert_size\", \"All_Reads.fr_count\");\n-        for(final int size: hist.keySet()){\n-            htslibHistogram.prefillBins(size);\n-            htslibHistogram.increment(size, hist.get(size));\n+        for(final Map.Entry<SamPairUtil.PairOrientation, List<Integer>> e : entry._2().entrySet()){\n+            orientationToSortedMap.put(e.getKey(),\n+                                       new TreeMap<>( e.getValue().stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) ));\n         }\n+        return new Tuple2<>(entry._1(), orientationToSortedMap);\n     }\n \n     /**\n-     * Collect bulk information: pair orientation, sample name, library name and read groups.\n+     * Write metrics and histograms to file.\n+     * @param metricsFile File to write information to.\n      */\n-    private void collectLevelInfo(){\n-        // TODO: change these, unchecked yet\n-        metrics.PAIR_ORIENTATION = SamPairUtil.PairOrientation.FR;\n-        metrics.SAMPLE = null;\n-        metrics.LIBRARY = null;\n-        metrics.READ_GROUP = null;\n+    public void produceMetricsFile(final MetricsFile<InsertSizeMetrics, Integer> metricsFile) {\n+\n+        for(final SortedMap<GroupInfo, Map<SamPairUtil.PairOrientation, Tuple2<Histogram<Integer>, InsertSizeMetrics>>> maps: histogramsAndMetrics){\n+            for(Map.Entry<GroupInfo, Map<SamPairUtil.PairOrientation, Tuple2<Histogram<Integer>, InsertSizeMetrics>>> groupEntry : maps.entrySet()){\n+                final Map<SamPairUtil.PairOrientation, Tuple2<Histogram<Integer>, InsertSizeMetrics>> orientation2Tuple = groupEntry.getValue();\n+                for(final Map.Entry<SamPairUtil.PairOrientation, Tuple2<Histogram<Integer>, InsertSizeMetrics>> tuples : orientation2Tuple.entrySet()){\n+                    metricsFile.addMetric(tuples.getValue()._2());\n+                    metricsFile.addHistogram(tuples.getValue()._1());\n+                }\n+            }\n+        }\n     }\n \n-    @VisibleForTesting\n-    void produceMetricsFile(final MetricsFile<InsertSizeMetrics, Integer> metricsFile) {\n-        metricsFile.addHistogram(htslibHistogram);\n-        metricsFile.addMetric(metrics);\n+    private static int convertMetricLevelToInt(final MetricAccumulationLevel level){\n+        int i=0;\n+        switch (level){\n+            case ALL_READS:\n+                break;\n+            case SAMPLE:\n+                i=1;\n+                break;\n+            case LIBRARY:\n+                i=2;\n+                break;\n+            case READ_GROUP:\n+                i=3;\n+                break;\n+        }\n+        return i;\n+    }\n+\n+    private static Comparator<GroupInfo> groupInfoComparator = new Comparator<GroupInfo>() {\n+        @Override public int compare(final GroupInfo g1, final GroupInfo g2) {\n+\n+            final int first  = convertMetricLevelToInt(g1.level);","path":"src/main/java/org/broadinstitute/hellbender/tools/spark/sv/InsertSizeMetricsCollectorSpark.java","position":499,"original_position":499,"commit_id":"7f9a3f3c79d055d9bd6b51523519146e71eedd55","original_commit_id":"7f9a3f3c79d055d9bd6b51523519146e71eedd55","user":{"login":"cwhelan","id":709477,"avatar_url":"https://avatars.githubusercontent.com/u/709477?v=3","gravatar_id":"","url":"https://api.github.com/users/cwhelan","html_url":"https://github.com/cwhelan","followers_url":"https://api.github.com/users/cwhelan/followers","following_url":"https://api.github.com/users/cwhelan/following{/other_user}","gists_url":"https://api.github.com/users/cwhelan/gists{/gist_id}","starred_url":"https://api.github.com/users/cwhelan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cwhelan/subscriptions","organizations_url":"https://api.github.com/users/cwhelan/orgs","repos_url":"https://api.github.com/users/cwhelan/repos","events_url":"https://api.github.com/users/cwhelan/events{/privacy}","received_events_url":"https://api.github.com/users/cwhelan/received_events","type":"User","site_admin":false},"body":"Actually rather than converting to ints you should be able to just call compareTo on the levels themselves. Enums will compare themselves in the order in which they are declared in the Enum class so I think that will do what you want.","created_at":"2016-03-14T15:14:10Z","updated_at":"2016-03-14T15:14:10Z","html_url":"https://github.com/broadinstitute/gatk/pull/1566#discussion_r56016190","pull_request_url":"https://api.github.com/repos/broadinstitute/gatk/pulls/1566","_links":{"self":{"href":"https://api.github.com/repos/broadinstitute/gatk/pulls/comments/56016190"},"html":{"href":"https://github.com/broadinstitute/gatk/pull/1566#discussion_r56016190"},"pull_request":{"href":"https://api.github.com/repos/broadinstitute/gatk/pulls/1566"}}},"pull_request":{"url":"https://api.github.com/repos/broadinstitute/gatk/pulls/1566","id":62301361,"html_url":"https://github.com/broadinstitute/gatk/pull/1566","diff_url":"https://github.com/broadinstitute/gatk/pull/1566.diff","patch_url":"https://github.com/broadinstitute/gatk/pull/1566.patch","issue_url":"https://api.github.com/repos/broadinstitute/gatk/issues/1566","number":1566,"state":"open","locked":false,"title":"Tool rewritten to allow different levels","user":{"login":"SHuang-Broad","id":16310888,"avatar_url":"https://avatars.githubusercontent.com/u/16310888?v=3","gravatar_id":"","url":"https://api.github.com/users/SHuang-Broad","html_url":"https://github.com/SHuang-Broad","followers_url":"https://api.github.com/users/SHuang-Broad/followers","following_url":"https://api.github.com/users/SHuang-Broad/following{/other_user}","gists_url":"https://api.github.com/users/SHuang-Broad/gists{/gist_id}","starred_url":"https://api.github.com/users/SHuang-Broad/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SHuang-Broad/subscriptions","organizations_url":"https://api.github.com/users/SHuang-Broad/orgs","repos_url":"https://api.github.com/users/SHuang-Broad/repos","events_url":"https://api.github.com/users/SHuang-Broad/events{/privacy}","received_events_url":"https://api.github.com/users/SHuang-Broad/received_events","type":"User","site_admin":false},"body":"Hi Chris,\r\n\r\nWould you please review this?\r\nAnd @tedsharpe, feel free to look at the getters in `InsertSizeMetricsCollectorSpark.java` and see if you need more access functions.\r\n\r\nThank you.\r\nSteve","created_at":"2016-03-09T21:45:44Z","updated_at":"2016-03-14T15:14:10Z","closed_at":null,"merged_at":null,"merge_commit_sha":"ad90b7fe1f6b06c1df395596edd038a66c4135b3","assignee":{"login":"cwhelan","id":709477,"avatar_url":"https://avatars.githubusercontent.com/u/709477?v=3","gravatar_id":"","url":"https://api.github.com/users/cwhelan","html_url":"https://github.com/cwhelan","followers_url":"https://api.github.com/users/cwhelan/followers","following_url":"https://api.github.com/users/cwhelan/following{/other_user}","gists_url":"https://api.github.com/users/cwhelan/gists{/gist_id}","starred_url":"https://api.github.com/users/cwhelan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cwhelan/subscriptions","organizations_url":"https://api.github.com/users/cwhelan/orgs","repos_url":"https://api.github.com/users/cwhelan/repos","events_url":"https://api.github.com/users/cwhelan/events{/privacy}","received_events_url":"https://api.github.com/users/cwhelan/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/broadinstitute/gatk/pulls/1566/commits","review_comments_url":"https://api.github.com/repos/broadinstitute/gatk/pulls/1566/comments","review_comment_url":"https://api.github.com/repos/broadinstitute/gatk/pulls/comments{/number}","comments_url":"https://api.github.com/repos/broadinstitute/gatk/issues/1566/comments","statuses_url":"https://api.github.com/repos/broadinstitute/gatk/statuses/7f9a3f3c79d055d9bd6b51523519146e71eedd55","head":{"label":"broadinstitute:sh_improve_isize_metric_collector_multiLevel","ref":"sh_improve_isize_metric_collector_multiLevel","sha":"7f9a3f3c79d055d9bd6b51523519146e71eedd55","user":{"login":"broadinstitute","id":393552,"avatar_url":"https://avatars.githubusercontent.com/u/393552?v=3","gravatar_id":"","url":"https://api.github.com/users/broadinstitute","html_url":"https://github.com/broadinstitute","followers_url":"https://api.github.com/users/broadinstitute/followers","following_url":"https://api.github.com/users/broadinstitute/following{/other_user}","gists_url":"https://api.github.com/users/broadinstitute/gists{/gist_id}","starred_url":"https://api.github.com/users/broadinstitute/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/broadinstitute/subscriptions","organizations_url":"https://api.github.com/users/broadinstitute/orgs","repos_url":"https://api.github.com/users/broadinstitute/repos","events_url":"https://api.github.com/users/broadinstitute/events{/privacy}","received_events_url":"https://api.github.com/users/broadinstitute/received_events","type":"Organization","site_admin":false},"repo":{"id":27452807,"name":"gatk","full_name":"broadinstitute/gatk","owner":{"login":"broadinstitute","id":393552,"avatar_url":"https://avatars.githubusercontent.com/u/393552?v=3","gravatar_id":"","url":"https://api.github.com/users/broadinstitute","html_url":"https://github.com/broadinstitute","followers_url":"https://api.github.com/users/broadinstitute/followers","following_url":"https://api.github.com/users/broadinstitute/following{/other_user}","gists_url":"https://api.github.com/users/broadinstitute/gists{/gist_id}","starred_url":"https://api.github.com/users/broadinstitute/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/broadinstitute/subscriptions","organizations_url":"https://api.github.com/users/broadinstitute/orgs","repos_url":"https://api.github.com/users/broadinstitute/repos","events_url":"https://api.github.com/users/broadinstitute/events{/privacy}","received_events_url":"https://api.github.com/users/broadinstitute/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/broadinstitute/gatk","description":"GATK4 development","fork":false,"url":"https://api.github.com/repos/broadinstitute/gatk","forks_url":"https://api.github.com/repos/broadinstitute/gatk/forks","keys_url":"https://api.github.com/repos/broadinstitute/gatk/keys{/key_id}","collaborators_url":"https://api.github.com/repos/broadinstitute/gatk/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/broadinstitute/gatk/teams","hooks_url":"https://api.github.com/repos/broadinstitute/gatk/hooks","issue_events_url":"https://api.github.com/repos/broadinstitute/gatk/issues/events{/number}","events_url":"https://api.github.com/repos/broadinstitute/gatk/events","assignees_url":"https://api.github.com/repos/broadinstitute/gatk/assignees{/user}","branches_url":"https://api.github.com/repos/broadinstitute/gatk/branches{/branch}","tags_url":"https://api.github.com/repos/broadinstitute/gatk/tags","blobs_url":"https://api.github.com/repos/broadinstitute/gatk/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/broadinstitute/gatk/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/broadinstitute/gatk/git/refs{/sha}","trees_url":"https://api.github.com/repos/broadinstitute/gatk/git/trees{/sha}","statuses_url":"https://api.github.com/repos/broadinstitute/gatk/statuses/{sha}","languages_url":"https://api.github.com/repos/broadinstitute/gatk/languages","stargazers_url":"https://api.github.com/repos/broadinstitute/gatk/stargazers","contributors_url":"https://api.github.com/repos/broadinstitute/gatk/contributors","subscribers_url":"https://api.github.com/repos/broadinstitute/gatk/subscribers","subscription_url":"https://api.github.com/repos/broadinstitute/gatk/subscription","commits_url":"https://api.github.com/repos/broadinstitute/gatk/commits{/sha}","git_commits_url":"https://api.github.com/repos/broadinstitute/gatk/git/commits{/sha}","comments_url":"https://api.github.com/repos/broadinstitute/gatk/comments{/number}","issue_comment_url":"https://api.github.com/repos/broadinstitute/gatk/issues/comments{/number}","contents_url":"https://api.github.com/repos/broadinstitute/gatk/contents/{+path}","compare_url":"https://api.github.com/repos/broadinstitute/gatk/compare/{base}...{head}","merges_url":"https://api.github.com/repos/broadinstitute/gatk/merges","archive_url":"https://api.github.com/repos/broadinstitute/gatk/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/broadinstitute/gatk/downloads","issues_url":"https://api.github.com/repos/broadinstitute/gatk/issues{/number}","pulls_url":"https://api.github.com/repos/broadinstitute/gatk/pulls{/number}","milestones_url":"https://api.github.com/repos/broadinstitute/gatk/milestones{/number}","notifications_url":"https://api.github.com/repos/broadinstitute/gatk/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/broadinstitute/gatk/labels{/name}","releases_url":"https://api.github.com/repos/broadinstitute/gatk/releases{/id}","deployments_url":"https://api.github.com/repos/broadinstitute/gatk/deployments","created_at":"2014-12-02T20:50:36Z","updated_at":"2016-03-13T04:55:12Z","pushed_at":"2016-03-12T02:25:30Z","git_url":"git://github.com/broadinstitute/gatk.git","ssh_url":"git@github.com:broadinstitute/gatk.git","clone_url":"https://github.com/broadinstitute/gatk.git","svn_url":"https://github.com/broadinstitute/gatk","homepage":"","size":61924,"stargazers_count":51,"watchers_count":51,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":21,"mirror_url":null,"open_issues_count":292,"forks":21,"open_issues":292,"watchers":51,"default_branch":"master"}},"base":{"label":"broadinstitute:master","ref":"master","sha":"ab961d99d95320bf8b956dfb73b90de0e252c9d6","user":{"login":"broadinstitute","id":393552,"avatar_url":"https://avatars.githubusercontent.com/u/393552?v=3","gravatar_id":"","url":"https://api.github.com/users/broadinstitute","html_url":"https://github.com/broadinstitute","followers_url":"https://api.github.com/users/broadinstitute/followers","following_url":"https://api.github.com/users/broadinstitute/following{/other_user}","gists_url":"https://api.github.com/users/broadinstitute/gists{/gist_id}","starred_url":"https://api.github.com/users/broadinstitute/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/broadinstitute/subscriptions","organizations_url":"https://api.github.com/users/broadinstitute/orgs","repos_url":"https://api.github.com/users/broadinstitute/repos","events_url":"https://api.github.com/users/broadinstitute/events{/privacy}","received_events_url":"https://api.github.com/users/broadinstitute/received_events","type":"Organization","site_admin":false},"repo":{"id":27452807,"name":"gatk","full_name":"broadinstitute/gatk","owner":{"login":"broadinstitute","id":393552,"avatar_url":"https://avatars.githubusercontent.com/u/393552?v=3","gravatar_id":"","url":"https://api.github.com/users/broadinstitute","html_url":"https://github.com/broadinstitute","followers_url":"https://api.github.com/users/broadinstitute/followers","following_url":"https://api.github.com/users/broadinstitute/following{/other_user}","gists_url":"https://api.github.com/users/broadinstitute/gists{/gist_id}","starred_url":"https://api.github.com/users/broadinstitute/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/broadinstitute/subscriptions","organizations_url":"https://api.github.com/users/broadinstitute/orgs","repos_url":"https://api.github.com/users/broadinstitute/repos","events_url":"https://api.github.com/users/broadinstitute/events{/privacy}","received_events_url":"https://api.github.com/users/broadinstitute/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/broadinstitute/gatk","description":"GATK4 development","fork":false,"url":"https://api.github.com/repos/broadinstitute/gatk","forks_url":"https://api.github.com/repos/broadinstitute/gatk/forks","keys_url":"https://api.github.com/repos/broadinstitute/gatk/keys{/key_id}","collaborators_url":"https://api.github.com/repos/broadinstitute/gatk/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/broadinstitute/gatk/teams","hooks_url":"https://api.github.com/repos/broadinstitute/gatk/hooks","issue_events_url":"https://api.github.com/repos/broadinstitute/gatk/issues/events{/number}","events_url":"https://api.github.com/repos/broadinstitute/gatk/events","assignees_url":"https://api.github.com/repos/broadinstitute/gatk/assignees{/user}","branches_url":"https://api.github.com/repos/broadinstitute/gatk/branches{/branch}","tags_url":"https://api.github.com/repos/broadinstitute/gatk/tags","blobs_url":"https://api.github.com/repos/broadinstitute/gatk/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/broadinstitute/gatk/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/broadinstitute/gatk/git/refs{/sha}","trees_url":"https://api.github.com/repos/broadinstitute/gatk/git/trees{/sha}","statuses_url":"https://api.github.com/repos/broadinstitute/gatk/statuses/{sha}","languages_url":"https://api.github.com/repos/broadinstitute/gatk/languages","stargazers_url":"https://api.github.com/repos/broadinstitute/gatk/stargazers","contributors_url":"https://api.github.com/repos/broadinstitute/gatk/contributors","subscribers_url":"https://api.github.com/repos/broadinstitute/gatk/subscribers","subscription_url":"https://api.github.com/repos/broadinstitute/gatk/subscription","commits_url":"https://api.github.com/repos/broadinstitute/gatk/commits{/sha}","git_commits_url":"https://api.github.com/repos/broadinstitute/gatk/git/commits{/sha}","comments_url":"https://api.github.com/repos/broadinstitute/gatk/comments{/number}","issue_comment_url":"https://api.github.com/repos/broadinstitute/gatk/issues/comments{/number}","contents_url":"https://api.github.com/repos/broadinstitute/gatk/contents/{+path}","compare_url":"https://api.github.com/repos/broadinstitute/gatk/compare/{base}...{head}","merges_url":"https://api.github.com/repos/broadinstitute/gatk/merges","archive_url":"https://api.github.com/repos/broadinstitute/gatk/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/broadinstitute/gatk/downloads","issues_url":"https://api.github.com/repos/broadinstitute/gatk/issues{/number}","pulls_url":"https://api.github.com/repos/broadinstitute/gatk/pulls{/number}","milestones_url":"https://api.github.com/repos/broadinstitute/gatk/milestones{/number}","notifications_url":"https://api.github.com/repos/broadinstitute/gatk/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/broadinstitute/gatk/labels{/name}","releases_url":"https://api.github.com/repos/broadinstitute/gatk/releases{/id}","deployments_url":"https://api.github.com/repos/broadinstitute/gatk/deployments","created_at":"2014-12-02T20:50:36Z","updated_at":"2016-03-13T04:55:12Z","pushed_at":"2016-03-12T02:25:30Z","git_url":"git://github.com/broadinstitute/gatk.git","ssh_url":"git@github.com:broadinstitute/gatk.git","clone_url":"https://github.com/broadinstitute/gatk.git","svn_url":"https://github.com/broadinstitute/gatk","homepage":"","size":61924,"stargazers_count":51,"watchers_count":51,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":21,"mirror_url":null,"open_issues_count":292,"forks":21,"open_issues":292,"watchers":51,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/broadinstitute/gatk/pulls/1566"},"html":{"href":"https://github.com/broadinstitute/gatk/pull/1566"},"issue":{"href":"https://api.github.com/repos/broadinstitute/gatk/issues/1566"},"comments":{"href":"https://api.github.com/repos/broadinstitute/gatk/issues/1566/comments"},"review_comments":{"href":"https://api.github.com/repos/broadinstitute/gatk/pulls/1566/comments"},"review_comment":{"href":"https://api.github.com/repos/broadinstitute/gatk/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/broadinstitute/gatk/pulls/1566/commits"},"statuses":{"href":"https://api.github.com/repos/broadinstitute/gatk/statuses/7f9a3f3c79d055d9bd6b51523519146e71eedd55"}}}}