/// <summary> /// Removes item from the list of aligned sequences in the PairwiseSequenceAlignment. /// Throws exception if PairwiseSequenceAlignment is read only. /// </summary> /// <param name="item">Aligned sequence object</param> /// <returns>True if item was removed, false if item was not found.</returns> public bool Remove(PairwiseAlignedSequence item) { if (IsReadOnly) { Trace.Report(Resource.READ_ONLY_COLLECTION_MESSAGE); throw new NotSupportedException(Resource.READ_ONLY_COLLECTION_MESSAGE); } return(_alignedSequences.Remove(item)); }
/// <summary> /// Adds an aligned sequence to the list of aligned sequences in the PairwiseSequenceAlignment. /// Throws exception if sequence alignment is read only. /// </summary> /// <param name="item">PairwiseAlignedSequence to add.</param> public void Add(PairwiseAlignedSequence item) { if (IsReadOnly) { Trace.Report(Resource.READ_ONLY_COLLECTION_MESSAGE); throw new NotSupportedException(Resource.READ_ONLY_COLLECTION_MESSAGE); } _alignedSequences.Add(item); }
/// <summary> /// Convert the delta alignment object to its sequence representation /// </summary> /// <returns>Reference sequence alignment at 0th index and /// Query sequence alignment at 1st index</returns> internal PairwiseAlignedSequence ConvertDeltaToSequences() { PairwiseAlignedSequence alignedSequence = new PairwiseAlignedSequence(); Sequence referenceSequence = null; Sequence querySequence = null; int gap = 0; int length = 0; List <int> startOffsets = new List <int>(2); List <int> endOffsets = new List <int>(2); List <int> insertions = new List <int>(2); startOffsets.Add(FirstSequenceStart); startOffsets.Add(SecondSequenceStart); endOffsets.Add(FirstSequenceEnd); endOffsets.Add(SecondSequenceEnd); insertions.Add(0); insertions.Add(0); // Create the new sequence object with given start and end indices referenceSequence = new Sequence(ReferenceSequence.Alphabet); referenceSequence.IsReadOnly = false; length = FirstSequenceEnd - FirstSequenceStart + 1; referenceSequence.InsertRange( 0, ReferenceSequence.Range(FirstSequenceStart, length).ToString()); querySequence = new Sequence(QuerySequence.Alphabet); querySequence.IsReadOnly = false; length = SecondSequenceEnd - SecondSequenceStart + 1; querySequence.InsertRange( 0, QuerySequence.Range(SecondSequenceStart, length).ToString()); // Insert the Alignment character at delta position // +ve delta: Insertion in reference sequence // -ve delta: Insertion in query sequence (deletion in reference sequence) foreach (int delta in Deltas) { gap += Math.Abs(delta); if (delta < 0) { referenceSequence.Insert(gap - 1, DnaAlphabet.Instance.Gap.Symbol); insertions[0]++; } else { querySequence.Insert(gap - 1, DnaAlphabet.Instance.Gap.Symbol); insertions[1]++; } } alignedSequence.FirstSequence = referenceSequence; alignedSequence.SecondSequence = querySequence; alignedSequence.Metadata["StartOffsets"] = startOffsets; alignedSequence.Metadata["EndOffsets"] = endOffsets; alignedSequence.Metadata["Insertions"] = insertions; return(alignedSequence); }
/// <summary> /// get all the gaps in each sequence and call pairwise alignment /// </summary> /// <param name="referenceSequence">Reference sequence</param> /// <param name="sequence">Query sequence</param> /// <returns>Aligned sequences</returns> private PairwiseAlignedSequence ProcessGaps( ISequence referenceSequence, ISequence sequence) { Sequence sequenceResult1; Sequence sequenceResult2; Sequence consensusResult; MaxUniqueMatch mum1 = null; MaxUniqueMatch mum2 = null; PairwiseAlignedSequence alignedSequence = new PairwiseAlignedSequence(); sequenceResult1 = new Sequence(referenceSequence.Alphabet); sequenceResult1.IsReadOnly = false; sequenceResult1.ID = referenceSequence.ID; sequenceResult1.DisplayID = referenceSequence.DisplayID; sequenceResult2 = new Sequence(referenceSequence.Alphabet); sequenceResult2.IsReadOnly = false; sequenceResult2.ID = sequence.ID; sequenceResult2.DisplayID = sequence.DisplayID; consensusResult = new Sequence(referenceSequence.Alphabet); consensusResult.IsReadOnly = false; consensusResult.ID = sequence.ID; consensusResult.DisplayID = sequence.DisplayID; // Run the alignment for gap before first MUM List <int> insertions = new List <int>(2); insertions.Add(0); insertions.Add(0); List <int> gapInsertions; mum1 = _finalMumList[0]; alignedSequence.Score += AlignGap( referenceSequence, sequence, sequenceResult1, sequenceResult2, consensusResult, null, // Here the first MUM does not exist mum1, out gapInsertions); insertions[0] += gapInsertions[0]; insertions[1] += gapInsertions[1]; // Run the alignment for all the gaps between MUM for (int index = 1; index < _finalMumList.Count; index++) { mum2 = _finalMumList[index]; alignedSequence.Score += AlignGap( referenceSequence, sequence, sequenceResult1, sequenceResult2, consensusResult, mum1, mum2, out gapInsertions); insertions[0] += gapInsertions[0]; insertions[1] += gapInsertions[1]; mum1 = mum2; } // Run the alignment for gap after last MUM alignedSequence.Score += AlignGap( referenceSequence, sequence, sequenceResult1, sequenceResult2, consensusResult, mum1, null, out gapInsertions); insertions[0] += gapInsertions[0]; insertions[1] += gapInsertions[1]; alignedSequence.FirstSequence = sequenceResult1; alignedSequence.SecondSequence = sequenceResult2; alignedSequence.Consensus = consensusResult; // Offset is not required as Smith Waterman will fragmented alignment. // Offset is the starting position of alignment of sequence1 with respect to sequence2. if (PairWiseAlgorithm is NeedlemanWunschAligner) { alignedSequence.FirstOffset = sequenceResult1.IndexOfNonGap() - referenceSequence.IndexOfNonGap(); alignedSequence.SecondOffset = sequenceResult2.IndexOfNonGap() - sequence.IndexOfNonGap(); } List <int> startOffsets = new List <int>(2); List <int> endOffsets = new List <int>(2); startOffsets.Add(0); startOffsets.Add(0); endOffsets.Add(referenceSequence.Count - 1); endOffsets.Add(sequence.Count - 1); alignedSequence.Metadata["StartOffsets"] = startOffsets; alignedSequence.Metadata["EndOffsets"] = endOffsets; alignedSequence.Metadata["Insertions"] = insertions; // return the aligned sequence return(alignedSequence); }
/// <summary> /// Returns true if the PairwiseSequenceAlignment contains the aligned sequence in the /// list of aligned sequences. /// </summary> /// <param name="item">PairwiseAlignedSequence object</param> /// <returns>True if contains item, otherwise returns false.</returns> public bool Contains(PairwiseAlignedSequence item) { return(_alignedSequences.Contains(item)); }