public static string GetHgvscAnnotation(ITranscript transcript, ISimpleVariant variant, ISequence refSequence, int regionStart, int regionEnd) { // sanity check: don't try to handle odd characters, make sure this is not a reference allele, // and make sure that we have protein coordinates if (variant.Type == VariantType.reference || SequenceUtilities.HasNonCanonicalBase(variant.AltAllele)) { return(null); } var onReverseStrand = transcript.Gene.OnReverseStrand; var refAllele = onReverseStrand ? SequenceUtilities.GetReverseComplement(variant.RefAllele) : variant.RefAllele; var altAllele = onReverseStrand ? SequenceUtilities.GetReverseComplement(variant.AltAllele) : variant.AltAllele; // decide event type from HGVS nomenclature var genomicChange = GetGenomicChange(transcript, onReverseStrand, refSequence, variant); var variantStart = variant.Start; var variantEnd = variant.End; if (genomicChange == GenomicChange.Duplication) { (variantStart, variantEnd, refAllele, regionStart, regionEnd) = transcript.TranscriptRegions.ShiftDuplication(variantStart, altAllele, onReverseStrand); } var startPositionOffset = HgvsUtilities.GetCdnaPositionOffset(transcript, variantStart, regionStart); var endPositionOffset = variantStart == variantEnd ? startPositionOffset : HgvsUtilities.GetCdnaPositionOffset(transcript, variantEnd, regionEnd); if (onReverseStrand) { var tmp = startPositionOffset; startPositionOffset = endPositionOffset; endPositionOffset = tmp; } // sanity check: make sure we have coordinates if (startPositionOffset == null || endPositionOffset == null) { return(null); } var transcriptLen = transcript.End - transcript.Start + 1; //_hgvs notation past the transcript if (startPositionOffset.Position > transcriptLen || endPositionOffset.Position > transcriptLen) { return(null); } var hgvsNotation = new HgvscNotation(refAllele, altAllele, transcript.Id.WithVersion, genomicChange, startPositionOffset, endPositionOffset, transcript.Translation != null); // generic formatting return(hgvsNotation.ToString()); }
public static string GetHgvscAnnotation(ITranscript transcript, ISimpleVariant variant, ISequence refSequence, int regionStart, int regionEnd, string transcriptRef, string transcriptAlt) { // sanity check: don't try to handle odd characters, make sure this is not a reference allele, // and make sure that we have protein coordinates if (variant.Type == VariantType.reference || SequenceUtilities.HasNonCanonicalBase(variant.AltAllele)) { return(null); } // do not report HGVSc notation when variant lands inside gap region if (regionStart > -1 && regionEnd > -1) { var startRegion = transcript.TranscriptRegions[regionStart]; var endRegion = transcript.TranscriptRegions[regionEnd]; if (startRegion.Id == endRegion.Id && startRegion.Type == TranscriptRegionType.Gap && endRegion.Type == TranscriptRegionType.Gap) { return(null); } } bool onReverseStrand = transcript.Gene.OnReverseStrand; string refAllele = string.IsNullOrEmpty(transcriptRef)? onReverseStrand ? SequenceUtilities.GetReverseComplement(variant.RefAllele) : variant.RefAllele : transcriptRef; string altAllele = string.IsNullOrEmpty(transcriptAlt) ? onReverseStrand ? SequenceUtilities.GetReverseComplement(variant.AltAllele) : variant.AltAllele : transcriptAlt; // decide event type from HGVS nomenclature var genomicChange = GetGenomicChange(transcript, onReverseStrand, refSequence, variant); int variantStart = variant.Start; int variantEnd = variant.End; if (genomicChange == GenomicChange.Duplication) { (variantStart, variantEnd, refAllele, regionStart, regionEnd) = transcript.TranscriptRegions.ShiftDuplication(variantStart, altAllele, onReverseStrand); } var startPositionOffset = HgvsUtilities.GetCdnaPositionOffset(transcript, variantStart, regionStart, true); var endPositionOffset = variantStart == variantEnd ? startPositionOffset : HgvsUtilities.GetCdnaPositionOffset(transcript, variantEnd, regionEnd, false); if (onReverseStrand) { var tmp = startPositionOffset; startPositionOffset = endPositionOffset; endPositionOffset = tmp; } if (startPositionOffset == null && variant.Type == VariantType.insertion) { startPositionOffset = new PositionOffset(endPositionOffset.Position + 1, endPositionOffset.Offset, $"{endPositionOffset.Position + 1}", endPositionOffset.HasStopCodonNotation); } // sanity check: make sure we have coordinates if (startPositionOffset == null || endPositionOffset == null) { return(null); } var hgvsNotation = new HgvscNotation(refAllele, altAllele, transcript.Id.WithVersion, genomicChange, startPositionOffset, endPositionOffset, transcript.Translation != null); // generic formatting return(hgvsNotation.ToString()); }