Пример #1
0
 /// <summary>
 /// Determines if the modification falls on a variant amino acid
 /// </summary>
 /// <param name="protein"></param>
 /// <param name=""></param>
 /// <returns></returns>
 public static bool IsSequenceVariantModification(SequenceVariation appliedVariant, int variantProteinIndex)
 {
     return(appliedVariant != null && appliedVariant.Includes(variantProteinIndex));
 }
Пример #2
0
        /// <summary>
        /// Applies a single variant to a protein sequence
        /// </summary>
        /// <param name="variantGettingApplied"></param>
        /// <returns></returns>
        internal static Protein ApplySingleVariant(SequenceVariation variantGettingApplied, Protein protein, string individual)
        {
            string seqBefore  = protein.BaseSequence.Substring(0, variantGettingApplied.OneBasedBeginPosition - 1);
            string seqVariant = variantGettingApplied.VariantSequence;
            int    afterIdx   = variantGettingApplied.OneBasedBeginPosition + variantGettingApplied.OriginalSequence.Length - 1;

            SequenceVariation variantAfterApplication = new SequenceVariation(
                variantGettingApplied.OneBasedBeginPosition,
                variantGettingApplied.OneBasedBeginPosition + variantGettingApplied.VariantSequence.Length - 1,
                variantGettingApplied.OriginalSequence,
                variantGettingApplied.VariantSequence,
                variantGettingApplied.Description.Description,
                variantGettingApplied.OneBasedModifications.ToDictionary(kv => kv.Key, kv => kv.Value));

            // check to see if there is incomplete indel overlap, which would lead to weird variant sequences
            // complete overlap is okay, since it will be overwritten; this can happen if there are two alternate alleles,
            //    e.g. reference sequence is wrong at that point
            bool intersectsAppliedRegionIncompletely          = protein.AppliedSequenceVariations.Any(x => variantGettingApplied.Intersects(x) && !variantGettingApplied.Includes(x));
            IEnumerable <SequenceVariation> appliedVariations = new[] { variantAfterApplication };
            string seqAfter = null;

            if (intersectsAppliedRegionIncompletely)
            {
                // use original protein sequence for the remaining sequence
                seqAfter = protein.BaseSequence.Length - afterIdx <= 0 ? "" : protein.NonVariantProtein.BaseSequence.Substring(afterIdx);
            }
            else
            {
                // use this variant protein sequence for the remaining sequence
                seqAfter          = protein.BaseSequence.Length - afterIdx <= 0 ? "" : protein.BaseSequence.Substring(afterIdx);
                appliedVariations = appliedVariations
                                    .Concat(protein.AppliedSequenceVariations.Where(x => !variantGettingApplied.Includes(x)))
                                    .ToList();
            }
            string variantSequence = (seqBefore + seqVariant + seqAfter).Split('*')[0]; // there may be a stop gained

            // adjust indices
            List <ProteolysisProduct> adjustedProteolysisProducts        = AdjustProteolysisProductIndices(variantGettingApplied, variantSequence, protein, protein.ProteolysisProducts);
            Dictionary <int, List <Modification> > adjustedModifications = AdjustModificationIndices(variantGettingApplied, variantSequence, protein);
            List <SequenceVariation> adjustedAppliedVariations           = AdjustSequenceVariationIndices(variantGettingApplied, variantSequence, appliedVariations);

            return(new Protein(variantSequence, protein, adjustedAppliedVariations, adjustedProteolysisProducts, adjustedModifications, individual));
        }