示例#1
0
        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);
        }