@Override
  protected void finish() {
    final MetricsFile<PreAdapterSummaryMetrics, Integer> preAdapterSummaryMetricsFile =
        getMetricsFile();
    final MetricsFile<PreAdapterDetailMetrics, Integer> preAdapterDetailMetricsFile =
        getMetricsFile();
    final MetricsFile<BaitBiasSummaryMetrics, Integer> baitBiasSummaryMetricsFile =
        getMetricsFile();
    final MetricsFile<BaitBiasDetailMetrics, Integer> baitBiasDetailMetricsFile = getMetricsFile();

    for (final ArtifactCounter counter : artifactCounters.values()) {
      // build metrics
      counter.finish();

      // write metrics
      preAdapterSummaryMetricsFile.addAllMetrics(counter.getPreAdapterSummaryMetrics());
      baitBiasSummaryMetricsFile.addAllMetrics(counter.getBaitBiasSummaryMetrics());

      for (final PreAdapterDetailMetrics preAdapterDetailMetrics :
          counter.getPreAdapterDetailMetrics()) {
        if (CONTEXTS_TO_PRINT.isEmpty()
            || CONTEXTS_TO_PRINT.contains(preAdapterDetailMetrics.CONTEXT)) {
          preAdapterDetailMetricsFile.addMetric(preAdapterDetailMetrics);
        }
      }
      for (final BaitBiasDetailMetrics baitBiasDetailMetrics : counter.getBaitBiasDetailMetrics()) {
        if (CONTEXTS_TO_PRINT.isEmpty()
            || CONTEXTS_TO_PRINT.contains(baitBiasDetailMetrics.CONTEXT)) {
          baitBiasDetailMetricsFile.addMetric(baitBiasDetailMetrics);
        }
      }
    }

    preAdapterDetailMetricsFile.write(preAdapterDetailsOut);
    preAdapterSummaryMetricsFile.write(preAdapterSummaryOut);
    baitBiasDetailMetricsFile.write(baitBiasDetailsOut);
    baitBiasSummaryMetricsFile.write(baitBiasSummaryOut);
  }