예제 #1
0
  /** Check info field Note: We report the first error we find */
  String checkInfo(String infoName) {
    if (infoName.isEmpty()) return "";

    VcfHeaderInfo vcfInfo = getVcfInfo(infoName);
    if (vcfInfo == null) return "Cannot find header for INFO field '" + infoName + "'";

    // Split INFO value and match it to allele
    String valsStr = getInfo(infoName);
    if (valsStr == null) return ""; // INFO field not present, nothing to do

    // Check values
    String values[] = valsStr.split(",");
    for (String val : values)
      if (!VcfEntry.isValidInfoValue(val))
        return "INFO filed '"
            + infoName
            + "' has an invalid value '"
            + val
            + "' (no spaces, tabs, '=' or ';' are allowed)";

    // Check number of INFO elements
    if (vcfInfo.isNumberNumber() && vcfInfo.getNumber() != values.length) {
      VcfInfoType type = vcfInfo.getVcfInfoType();
      if (type == VcfInfoType.Flag && values.length == 1)
        ; // OK, flags must have one or zero values
      else
        return "INFO filed '"
            + infoName
            + "' has 'Number="
            + vcfInfo.getNumber()
            + "' in header, but it contains '"
            + values.length
            + "' elements.";
    }
    if (vcfInfo.isNumberAllAlleles() && values.length != (alts.length + 1))
      return "INFO filed '"
          + infoName
          + "' has 'Number=R' in header, but it contains '"
          + values.length
          + "' elements when there are '"
          + alts.length
          + "' alleles (it should have '"
          + (alts.length + 1)
          + "' elements).";
    if (vcfInfo.isNumberAllAlleles() && values.length != alts.length)
      return "INFO filed '"
          + infoName
          + "' has 'Number=A' in header, but it contains '"
          + values.length
          + "' elements when there are '"
          + alts.length
          + "' alleles.";

    return "";
  }
예제 #2
0
  /** Get info string for a specific allele */
  public String getInfo(String key, String allele) {
    if (info == null) parseInfo();

    // Get INFO value
    String infoStr = info.get(key);
    if (infoStr == null) return null;

    // Split INFO value and match it to allele
    String infos[] = infoStr.split(",");

    // INFO fields having number type 'R' (all alleles) should have one value for reference as well.
    // So in those cases we must skip the first value
    int firstAltIndex = 0;
    VcfHeaderInfo vcfInfo = getVcfInfo(key);
    if (vcfInfo != null && vcfInfo.isNumberAllAlleles()) {
      firstAltIndex = 1;

      // Are we looking for 'REF' information?
      if (ref.equalsIgnoreCase(allele)) return infos[0];
    }

    // Find ALT matching allele
    for (int i = 0, j = firstAltIndex; (i < alts.length) && (j < infos.length); i++, j++)
      if (alts[i].equalsIgnoreCase(allele)) return infos[j];

    return null;
  }