1 package org.broadinstitute.hellbender.tools.examples.metrics.multi;
2 
3 import htsjdk.samtools.metrics.MetricsFile;
4 import org.broadinstitute.hellbender.metrics.PerUnitMetricCollector;
5 import org.broadinstitute.hellbender.utils.Utils;
6 
7 import java.io.Serializable;
8 import java.util.Objects;
9 
10 /**
11  * A Collector for individual ExampleMultiMetrics for a given SAMPLE or SAMPLE/LIBRARY or
12  * SAMPLE/LIBRARY/READ_GROUP (depending on aggregation levels)
13  */
14 public final class PerUnitExampleMultiMetricsCollector
15         implements PerUnitMetricCollector<
16             ExampleMultiMetrics,
17             Integer,
18             PerUnitExampleMultiMetricsCollectorArgs>, Serializable
19 {
20     private static final long serialVersionUID = 1L;
21 
22     // the metrics container for this level
23     final private ExampleMultiMetrics metrics;
24 
PerUnitExampleMultiMetricsCollector( final String sample, final String library, final String readGroup)25     public PerUnitExampleMultiMetricsCollector(
26             final String sample,
27             final String library,
28             final String readGroup) {
29         metrics= new ExampleMultiMetrics(sample, library, readGroup);
30     }
31 
32     @Override
acceptRecord(final PerUnitExampleMultiMetricsCollectorArgs args)33     public void acceptRecord(final PerUnitExampleMultiMetricsCollectorArgs args) {
34         metrics.NUMREADS++;
35     }
36 
37     @Override
finish()38     public void finish() { }
39 
40     @Override
addMetricsToFile(final MetricsFile<ExampleMultiMetrics, Integer> file)41     public void addMetricsToFile(final MetricsFile<ExampleMultiMetrics, Integer> file) {
42         file.addMetric(metrics);
43     }
44 
45     /**
46      * Combine this PerUnitExampleMultiMetricsCollector with sourceCollector and return a combined
47      * PerUnitExampleMultiMetricsCollector.
48      * @param sourceCollector PerUnitExampleMultiMetricsCollector to combine in
49      * @return PerUnitExampleMultiMetricsCollector representing the combination of the source collector
50      * with this collector
51      */
combine(PerUnitExampleMultiMetricsCollector sourceCollector)52     public PerUnitExampleMultiMetricsCollector combine(PerUnitExampleMultiMetricsCollector sourceCollector) {
53         Utils.nonNull(sourceCollector);
54         final String validationMessage = "Internal error combining collectors";
55         validateEquals(this.metrics.SAMPLE, sourceCollector.metrics.SAMPLE, validationMessage);
56         validateEquals(this.metrics.LIBRARY, sourceCollector.metrics.LIBRARY, validationMessage);
57         validateEquals(this.metrics.READ_GROUP, sourceCollector.metrics.READ_GROUP, validationMessage);
58 
59         final PerUnitExampleMultiMetricsCollector combinedCollector = new PerUnitExampleMultiMetricsCollector(
60                 this.metrics.SAMPLE,
61                 this.metrics.LIBRARY,
62                 this.metrics.READ_GROUP);
63         combinedCollector.metrics.NUMREADS = this.metrics.NUMREADS + sourceCollector.metrics.NUMREADS;
64 
65         return combinedCollector;
66     }
67 
68     // Safely validate that two strings are equal, even if one or both are null.
validateEquals(final String source, final String target, final String message)69     private static void validateEquals(final String source, final String target, final String message) {
70         if ( ! Objects.equals(source, target) ) {
71             throw new IllegalArgumentException(
72                     String.format("%s (%s : %s)",
73                             message,
74                             source == null ? "null" : source,
75                             target == null ? "null" : target)
76             );
77         }
78     }
79 
80 }
81