protected void ApplyMnp(Variant variant, IntervalSequence markerSeq) { // Calculate indexes long idxStart = variant.OneBasedStart - OneBasedStart; long idxAlt = 0; // Variant starts before this marker (e.g. motif with sequence) if (idxStart < 0) { idxAlt = -idxStart; // Remove first 'idxStart' bases from ALT sequence idxStart = 0; } long changeSize = variant.IntersectSize(this); long idxEnd = idxStart + changeSize; // Apply variant to sequence ISequence seq = IsStrandPlus() ? Sequence : Sequence.GetReverseComplementedSequence(); StringBuilder seqsb = new StringBuilder(); seqsb.Append(SequenceExtensions.ConvertToString(seq, 0, idxStart)); String seqAlt = variant.SecondAlleleString.Substring((int)idxAlt, (int)changeSize); seqsb.Append(seqAlt); seqsb.Append(SequenceExtensions.ConvertToString(seq, idxEnd)); // Update sequence seq = new Sequence(seq.Alphabet, seqsb.ToString()); markerSeq.Sequence = IsStrandPlus() ? seq : seq.GetReverseComplementedSequence(); }
/// <summary> /// Apply a Variant to a marker. Variant is a duplication /// </summary> /// <param name="variant"></param> /// <returns></returns> protected Interval ApplyDup(Variant variant) { Interval m = new Interval(this); if (variant.OneBasedEnd < m.OneBasedStart) { // Duplication before marker start? => Adjust both coordinates long lenChange = variant.LengthChange(); m.OneBasedStart += lenChange; m.OneBasedEnd += lenChange; } else if (variant.Includes(m)) { // Duplication includes whole marker? => Adjust both coordinates long lenChange = variant.LengthChange(); m.OneBasedStart += lenChange; m.OneBasedEnd += lenChange; } else if (m.Includes(variant)) { // Duplication included in marker? => Adjust end coordinate m.OneBasedEnd += variant.LengthChange(); } else if (variant.Intersects(m)) { // Duplication includes part of marker? => Adjust end m.OneBasedEnd += variant.IntersectSize(m); } else { // Duplication after end, no effect on marker coordinates } return(m); }