/**
   * Does all annotations for the workflow.
   *
   * @param parents
   * @return
   */
  private List<Job> doAnnotations(Job... parents) {
    List<Job> finalAnnotatorJobs = new ArrayList<Job>();

    Predicate<String> isExtractedSNV = p -> p.contains("extracted-snv") && p.endsWith(".vcf.gz");
    final String passFilteredOxoGSuffix = ".pass-filtered.oxoG.vcf.gz";
    // list filtering should only ever produce one result.
    for (int i = 0; i < this.tumours.size(); i++) {
      TumourInfo tInf = this.tumours.get(i);
      String tumourAliquotID = tInf.getAliquotID();
      PcawgAnnotatorJobGenerator generator =
          new PcawgAnnotatorJobGenerator(
              this.JSONlocation, this.JSONrepoName, this.JSONfolderName, this.JSONfileName);
      generator.setGitMoveTestMode(this.gitMoveTestMode);
      generator.setAllowMissingFiles(this.allowMissingFiles);
      generator.setBroadOxogSNVFileName(
          this.filesForUpload
              .stream()
              .filter(
                  p ->
                      ((p.contains(tumourAliquotID)
                          && p.contains("broad-mutect")
                          && p.endsWith(passFilteredOxoGSuffix))))
              .findFirst()
              .orElseGet(emptyStringWhenMissingFilesAllowed));
      generator.setBroadOxoGSNVFromIndelFileName(
          this.filesForUpload
              .stream()
              .filter(p -> (p.contains(Pipeline.broad.toString()) && isExtractedSNV.test(p)))
              .findFirst()
              .orElseGet(emptyStringWhenMissingFilesAllowed));
      generator.setSangerOxogSNVFileName(
          this.filesForUpload
              .stream()
              .filter(
                  p ->
                      ((p.contains(tumourAliquotID)
                          && p.contains("svcp_")
                          && p.endsWith(passFilteredOxoGSuffix))))
              .findFirst()
              .orElseGet(emptyStringWhenMissingFilesAllowed));
      generator.setSangerOxoGSNVFromIndelFileName(
          this.filesForUpload
              .stream()
              .filter(p -> (p.contains(Pipeline.sanger.toString()) && isExtractedSNV.test(p)))
              .findFirst()
              .orElseGet(emptyStringWhenMissingFilesAllowed));
      generator.setDkfzEmbleOxogSNVFileName(
          this.filesForUpload
              .stream()
              .filter(
                  p ->
                      ((p.contains(tumourAliquotID)
                          && p.contains("dkfz-snvCalling")
                          && p.endsWith(passFilteredOxoGSuffix))))
              .findFirst()
              .orElseGet(emptyStringWhenMissingFilesAllowed));
      generator.setDkfzEmblOxoGSNVFromIndelFileName(
          this.filesForUpload
              .stream()
              .filter(p -> (p.contains(Pipeline.dkfz_embl.toString()) && isExtractedSNV.test(p)))
              .findFirst()
              .orElseGet(emptyStringWhenMissingFilesAllowed));

      // Remember: MUSE files do not get PASS-filtered. Also, there is no INDEL so there cannot be
      // any SNVs extracted from INDELs.
      generator.setMuseOxogSNVFileName(
          this.filesForUpload
              .stream()
              .filter(p -> p.toUpperCase().contains("MUSE") && p.endsWith(".oxoG.vcf.gz"))
              .findFirst()
              .orElseGet(emptyStringWhenMissingFilesAllowed));
      generator.setNormalizedBroadIndel(
          this.normalizedIndels
              .stream()
              .filter(CommonPredicates.isBroad.and(matchesTumour(tumourAliquotID)))
              .findFirst()
              .orElse(new VcfInfo())
              .getFileName());
      generator.setNormalizedDkfzEmblIndel(
          this.normalizedIndels
              .stream()
              .filter(CommonPredicates.isDkfzEmbl.and(matchesTumour(tumourAliquotID)))
              .findFirst()
              .orElse(new VcfInfo())
              .getFileName());
      generator.setNormalizedSangerIndel(
          this.normalizedIndels
              .stream()
              .filter(CommonPredicates.isSanger.and(matchesTumour(tumourAliquotID)))
              .findFirst()
              .orElse(new VcfInfo())
              .getFileName());

      List<Job> jobs =
          generator.doAnnotations(
              this,
              tInf.getAliquotID(),
              tInf.getTumourMinibamPath(),
              this.normalMinibamPath,
              this.updateFilesForUpload,
              parents);
      finalAnnotatorJobs.addAll(jobs);
    }
    return finalAnnotatorJobs;
  }