Exemple #1
0
        /// <summary>
        /// Detects alpha helixes in a peptide. Does NOT add these annotations to peptide.
        /// </summary>
        public List <PeptideAnnotation <AminoAcidReference> > Detect(Peptide peptide)
        {
            var slidingWindow = new SlidingWindow <AminoAcidReference>(
                peptide.AminoAcids,
                x => x.SequenceNumber,
                4.5,
                WindowPositioningType.StartingAtPosition);
            const int MinimumHelixLength = 7;
            var       helixAnnotations   = new List <PeptideAnnotation <AminoAcidReference> >();
            PeptideAnnotation <AminoAcidReference> currentAnnotation = null;

            foreach (var aminoAcid in peptide.AminoAcids.OrderBy(x => x.SequenceNumber))
            {
                if (currentAnnotation != null && aminoAcid.SequenceNumber > currentAnnotation.AminoAcidReferences.Last().SequenceNumber)
                {
                    if (currentAnnotation.AminoAcidReferences.Count >= MinimumHelixLength)
                    {
                        helixAnnotations.Add(currentAnnotation);
                    }
                    currentAnnotation = null;
                }

                slidingWindow.SetPosition(aminoAcid.SequenceNumber - 0.1); // -0.1 to avoid problems with rounding
                var secondAminoAcid = slidingWindow.FirstOrDefault(x => x.SequenceNumber == aminoAcid.SequenceNumber + 1);
                if (secondAminoAcid == null)
                {
                    continue;
                }
                var thirdAminoAcid = slidingWindow.FirstOrDefault(x => x.SequenceNumber == aminoAcid.SequenceNumber + 2);
                if (thirdAminoAcid == null)
                {
                    continue;
                }
                var fourthAminoAcid = slidingWindow.FirstOrDefault(x => x.SequenceNumber == aminoAcid.SequenceNumber + 3);
                if (fourthAminoAcid == null)
                {
                    continue;
                }

                try
                {
                    var firstVector  = FindPositionVector(aminoAcid, secondAminoAcid);
                    var secondVector = FindPositionVector(aminoAcid, thirdAminoAcid);
                    var thirdVector  = FindPositionVector(aminoAcid, fourthAminoAcid);

                    var isAlphaHelix = IsAlphaHelix(firstVector, secondVector, thirdVector);
                    if (isAlphaHelix)
                    {
                        if (currentAnnotation == null)
                        {
                            currentAnnotation = new PeptideAnnotation <AminoAcidReference>(
                                PeptideSecondaryStructure.AlphaHelix,
                                new List <AminoAcidReference> {
                                aminoAcid, secondAminoAcid, thirdAminoAcid, fourthAminoAcid
                            });
                        }
                        else
                        {
                            currentAnnotation.AminoAcidReferences.Add(fourthAminoAcid);
                        }
                    }
                    else
                    {
                        if (currentAnnotation != null)
                        {
                            if (currentAnnotation.AminoAcidReferences.Count >= MinimumHelixLength)
                            {
                                helixAnnotations.Add(currentAnnotation);
                            }
                            currentAnnotation = null;
                        }
                    }
                }
                catch (KeyNotFoundException)
                {
                    continue;
                }
            }

            return(helixAnnotations);
        }