public PhaseAndQuality(Genotype gt) { this.isPhased = gt.isPhased(); if (this.isPhased) { this.PQ = gt.getAttributeAsDouble(ReadBackedPhasingWalker.PQ_KEY, -1); if (this.PQ == -1) this.PQ = null; } }
static boolean alleleSegregationIsKnown(Genotype gt1, Genotype gt2) { if (gt1.getPloidy() != gt2.getPloidy()) return false; /* If gt2 is phased or hom, then could even be MERGED with gt1 [This is standard]. HOWEVER, EVEN if this is not the case, but gt1.isHom(), it is trivially known that each of gt2's alleles segregate with the single allele type present in gt1. */ return (gt2.isPhased() || gt2.isHom() || gt1.isHom()); }
static PhaseAndQuality calcPhaseForMergedGenotypes(Genotype gt1, Genotype gt2) { if (gt2.isPhased() || gt2.isHom()) return new PhaseAndQuality(gt1); // maintain the phase of gt1 if (!gt1.isHom()) throw new ReviewedStingException( "alleleSegregationIsKnown(gt1, gt2) implies: gt2.genotypesArePhased() || gt2.isHom() || gt1.isHom()"); /* We're dealing with: gt1.isHom(), gt2.isHet(), !gt2.genotypesArePhased(); so, the merged (het) Genotype is not phased relative to the previous Genotype For example, if we're merging the third Genotype with the second one: 0/1 1|1 0/1 Then, we want to output: 0/1 1/2 */ return new PhaseAndQuality(gt2); // maintain the phase of gt2 [since !gt2.genotypesArePhased()] }
/** * add the genotype data * * @param vc the variant context * @param genotypeFormatKeys Genotype formatting string * @param alleleMap alleles for this context * @throws IOException for writer */ private void addGenotypeData( VariantContext vc, Map<Allele, String> alleleMap, List<String> genotypeFormatKeys) throws IOException { for (String sample : mHeader.getGenotypeSamples()) { mWriter.write(VCFConstants.FIELD_SEPARATOR); Genotype g = vc.getGenotype(sample); if (g == null) { // TODO -- The VariantContext needs to know what the general ploidy is of the samples // TODO -- We shouldn't be assuming diploid genotypes here! mWriter.write(VCFConstants.EMPTY_GENOTYPE); continue; } List<String> attrs = new ArrayList<String>(genotypeFormatKeys.size()); for (String key : genotypeFormatKeys) { if (key.equals(VCFConstants.GENOTYPE_KEY)) { if (!g.isAvailable()) { throw new ReviewedStingException( "GTs cannot be missing for some samples if they are available for others in the record"); } writeAllele(g.getAllele(0), alleleMap); for (int i = 1; i < g.getPloidy(); i++) { mWriter.write(g.isPhased() ? VCFConstants.PHASED : VCFConstants.UNPHASED); writeAllele(g.getAllele(i), alleleMap); } continue; } Object val = g.hasAttribute(key) ? g.getAttribute(key) : VCFConstants.MISSING_VALUE_v4; // some exceptions if (key.equals(VCFConstants.GENOTYPE_QUALITY_KEY)) { if (Math.abs(g.getNegLog10PError() - Genotype.NO_NEG_LOG_10PERROR) < 1e-6) val = VCFConstants.MISSING_VALUE_v4; else { val = getQualValue(Math.min(g.getPhredScaledQual(), VCFConstants.MAX_GENOTYPE_QUAL)); } } else if (key.equals(VCFConstants.GENOTYPE_FILTER_KEY)) { val = g.isFiltered() ? ParsingUtils.join(";", ParsingUtils.sortList(g.getFilters())) : (g.filtersWereApplied() ? VCFConstants.PASSES_FILTERS_v4 : VCFConstants.UNFILTERED); } VCFFormatHeaderLine metaData = mHeader.getFormatHeaderLine(key); if (metaData != null) { int numInFormatField = metaData.getCount(vc.getAlternateAlleles().size()); if (numInFormatField > 1 && val.equals(VCFConstants.MISSING_VALUE_v4)) { // If we have a missing field but multiple values are expected, we need to construct a // new string with all fields. // For example, if Number=2, the string has to be ".,." StringBuilder sb = new StringBuilder(VCFConstants.MISSING_VALUE_v4); for (int i = 1; i < numInFormatField; i++) { sb.append(","); sb.append(VCFConstants.MISSING_VALUE_v4); } val = sb.toString(); } } // assume that if key is absent, then the given string encoding suffices String outputValue = formatVCFField(val); if (outputValue != null) attrs.add(outputValue); } // strip off trailing missing values for (int i = attrs.size() - 1; i >= 0; i--) { if (isMissingValue(attrs.get(i))) attrs.remove(i); else break; } for (int i = 0; i < attrs.size(); i++) { if (i > 0 || genotypeFormatKeys.contains(VCFConstants.GENOTYPE_KEY)) mWriter.write(VCFConstants.GENOTYPE_FIELD_SEPARATOR); mWriter.write(attrs.get(i)); } } }