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