/// <summary> /// AlignSimple aligns the set of input sequences using the linear gap model (one gap penalty), /// and returns the best alignment found. /// </summary> /// <param name="inputSequences">The sequences to align.</param> /// <returns>List of sequence alignments.</returns> public IList <IPairwiseSequenceAlignment> AlignSimple(IEnumerable <ISequence> inputSequences) { if (inputSequences == null) { throw new ArgumentNullException("inputSequences"); } var listOfSequences = inputSequences.ToList(); if (listOfSequences.Count != 2) { string message = String.Format( CultureInfo.CurrentCulture, Properties.Resource.PairwiseAlignerWrongArgumentCount, inputSequences.Count()); Trace.Report(message); throw new ArgumentException(message, "inputSequences"); } return(AlignSimple(listOfSequences[0], listOfSequences[1])); }
/// <summary> /// Method which performs the alignment work. /// </summary> /// <param name="sequence1">First sequence</param> /// <param name="sequence2">Second sequence</param> /// <param name="useAffineGapModel">True to use affine gap model (separate open vs. extension cost)</param> /// <returns></returns> private IList <IPairwiseSequenceAlignment> DoAlign(ISequence sequence1, ISequence sequence2, bool useAffineGapModel) { usingAffineGapModel = useAffineGapModel; if (sequence1 == null) { throw new ArgumentNullException("sequence1"); } if (sequence2 == null) { throw new ArgumentNullException("sequence2"); } if (!Alphabets.CheckIsFromSameBase(sequence1.Alphabet, sequence2.Alphabet)) { Trace.Report(Properties.Resource.InputAlphabetsMismatch); throw new ArgumentException(Properties.Resource.InputAlphabetsMismatch); } if (SimilarityMatrix == null) { Trace.Report(Properties.Resource.SimilarityMatrixCannotBeNull); throw new ArgumentException(Properties.Resource.SimilarityMatrixCannotBeNull); } if (!SimilarityMatrix.ValidateSequence(sequence1)) { Trace.Report(Properties.Resource.FirstInputSequenceMismatchSimilarityMatrix); throw new ArgumentException(Properties.Resource.FirstInputSequenceMismatchSimilarityMatrix); } if (!SimilarityMatrix.ValidateSequence(sequence2)) { Trace.Report(Properties.Resource.SecondInputSequenceMismatchSimilarityMatrix); throw new ArgumentException(Properties.Resource.SecondInputSequenceMismatchSimilarityMatrix); } if (GapOpenCost > GapExtensionCost) { Trace.Report(Properties.Resource.GapOpenGreaterThanGapExtension); throw new ArgumentException(Properties.Resource.GapOpenGreaterThanGapExtension); } _sequence1 = sequence1; _sequence2 = sequence2; _gap = Alphabets.CheckIsFromSameBase(Alphabets.Protein, sequence1.Alphabet) ? Alphabets.Protein.Gap : Alphabets.DNA.Gap; ReferenceSequence = GetByteArrayFromSequence(_sequence1); QuerySequence = GetByteArrayFromSequence(_sequence2); // Assign consensus resolver if it was not assigned already. IAlphabet alphabet = sequence1.Alphabet; if (ConsensusResolver == null) { ConsensusResolver = new SimpleConsensusResolver(alphabet.HasAmbiguity ? alphabet : Alphabets.AmbiguousAlphabetMap[sequence1.Alphabet]); } else { ConsensusResolver.SequenceAlphabet = alphabet.HasAmbiguity ? alphabet : Alphabets.AmbiguousAlphabetMap[sequence1.Alphabet]; } return(new List <IPairwiseSequenceAlignment> { Process() }); }