Пример #1
0
        /// <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]));
        }
Пример #2
0
        /// <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()
            });
        }