Страницы: 1
RSS
Альтернативная трасляция нуклеотидной последовательности
 
Добрый день, всем знатокам и любителям эксель! Прошу помочь переделать пользовательскую функцию перевода нуклеотидной последовательности в аминокислотную (трансляция), добавив в неё пару аргументов.
Sequence - нуклеотидная последовательность. Остальные аргументы не обязательные.
StartCodon - кодон с которого начинается трансляция
EntryStartCodon - вхождение стартового кодона в последовательность (например 2-ой, 3-й и т.д.), т.е. с него будет начинаться трансляция.
Трансляция должна заканчиваться стоп кодоном ("TAA", "TAG", "TGA"), который никаким символом не помечается.
Пример прикрепляю, в нем код функции Translation.
 
Код
Function Альтернативная_трасляция(ТЕКСТ As String, Optional StartCodon As String, Optional EntryStartCodon As Long = 1) As String
    Dim ii As Integer
    Dim Rez As String
    Dim ss As String
    Dim sMid As String
    Dim flag As Boolean
    Dim curEntryStartCodon As Long
    If StartCodon = "" Then flag = True
    
    For ii = 1 To Len(ТЕКСТ) Step 3
        sMid = Mid(ТЕКСТ, ii, 3)
        If flag = False Then
            If sMid = StartCodon Then
                curEntryStartCodon = curEntryStartCodon + 1
                If curEntryStartCodon = EntryStartCodon Then
                    flag = True
                End If
            End If
        End If
        If flag Then
            Select Case sMid
                Case "GCA", "GCC", "GCG", "GCT": ss = "A"
                Case "TGC", "TGT": ss = "C"
                Case "GAC", "GAT": ss = "D"
                Case "GAA", "GAG": ss = "E"
                Case "TTC", "TTT": ss = "F"
                Case "GGA", "GGC", "GGG", "GGT": ss = "G"
                Case "CAC", "CAT": ss = "H"
                Case "ATA", "ATC", "ATT": ss = "I"
                Case "AAA", "AAG": ss = "K"
                Case "CTA", "CTC", "CTG", "CTT", "TTA", "TTG": ss = "L"
                Case "ATG": ss = "M"
                Case "AAC", "AAT": ss = "N"
                Case "CCA", "CCC", "CCG", "CCT": ss = "P"
                Case "CAA", "CAG": ss = "Q"
                Case "AGA", "AGG", "CGA", "CGC", "CGG", "CGT": ss = "R"
                Case "AGC", "AGT", "TCA", "TCC", "TCG", "TCT": ss = "S"
                Case "ACA", "ACC", "ACG", "ACT": ss = "T"
                Case "GTA", "GTC", "GTG", "GTT": ss = "V"
                Case "TGG": ss = "W"
                Case "TAC", "TAT": ss = "Y"
                Case "TAA", "TAG", "TGA"
                    ss = ""  ' это стоп кодоны
                    flag = False
                    Exit For
            End Select
            Rez = Rez & ss
        End If
    Next ii
    Альтернативная_трасляция = Rez
End Function
 
пробуйте
Скрытый текст


ЗЫ: Пока прикладывал Матрос уже всё написал :D
Изменено: Msi2102 - 10.06.2024 11:33:14
 
С альтернативным способом задания соответсвия.
Скрытый текст
Изменено: МатросНаЗебре - 10.06.2024 11:31:44 ([SPOILER])
 
Спасибо большое! Дай бог вам здоровья!
 
Цитата
написал:
Дай бог вам здоровья!
Неожиданно услышать от человека, переводящего нуклеотидную последовательность в аминокислотную.  :D  
 
Пардонте господа, за мои ничтожные биологические познания. Немного не до конца объяснил, видимо сам плохо понимаю. Дело в том, что стартовый кодон (у людей ATG или CTG) может быть не обязательно в рамке считывания с пепрвым ATG. В новом файле пример немного другой привел, посмотрите пожалуйста.
 
"А если триптел не попадает на рамку считывания со стартовым кодоном"
Что сие значит?
 
Каждые три нуклеотида равны одной аминокислоте, например три буквы ATG равны M, или ATG CTG СAT = MLE. Но, если нам сместиться на одну букву правее (пропустить первую букву), то получиться другая "рамка считывания" и другая аминокислотная последовательность соответственно, например TG CTG СAT G будет равняться CCM.
Можно, как вариант, добавить в функцию ещё один агрумент - рамка считывания. Которая будет принимать значение от 0 до 2-х. Сколько нуклеотидов отрезать сначала. Хотя может и так все пойдет:
=Альтернативная_трасляция(ПРАВСИМВ(C18;ДЛСТР(C18)-1);"ATG";1)
Хотя так можно запутаться, т.к. нужен второй ATG, а в формуле вроде как цифра 1 стоит.
Всё же не нужен ещё один аргумент, смысла нет. Просто побуквенное сканирование всей последовательности на наличие StartCodon.
Изменено: dim284 - 10.06.2024 14:11:06
 
Хотя почему не нужен, нужен. По умолчанию, побуквенное сканирование всей последовательности; 0 - как сейчас в функции, в одной рамке с первым ATG; 1 и 2 - соответственно со смещением в 1 или 2 буквы. Будет супер универсально.
 
Скрытый текст


Не обязательно вносить как формулу массива.
 
Вариант с поиском начала смещения. Формулы примут вид:
Код
=ТРАНСЛЯЦИЯ(КОДДОНСМЕЩ(C18;"ATG";2))
Скрытый текст
Изменено: МатросНаЗебре - 10.06.2024 15:21:32
 
Спасибо, МатросНаЗебре! Вроде все верно работает.
Только я не понял, зачем Вы перешли с варианта, когда в одной функции весь код в сообщение #2, на вариант когда код поделян на две функций в сообщении #4. Ведь последний вариант в 10 раз медленнее и с точки зрения обывателя более сложный т.к. он разбит на 2 функции.
 
Цитата
написал:
Ведь последний вариант в 10 раз медленнее
Какие ваши доказательства?!
 
Вариант с кешированием данных. Будет работать быстрее.
Если предоставите убедительные доказательства, что код в 10 раз медленнее, то перепишу для "Select Case".
Скрытый текст
 
Цитата
dim284 написал:
и с точки зрения обывателя более сложный т.к. он разбит на 2 функции.
В #11 был приведён вариант, не разбитый на 2 функции.

Вот ещё модификация.
Скрытый текст
Изменено: МатросНаЗебре - 10.06.2024 16:56:22
 
В общем получилось ещё лучше чем я хотел. Функция Translation чуть изменилась на вот такую, в которой стоп кодоны останавливают всю трансляцию, как оно и должно быть:
Код
Function Translation(ТЕКСТ As String) As String
Dim i As Integer, Rez As String
For i = 1 To Len(ТЕКСТ) Step 3
    Select Case Mid(ТЕКСТ, i, 3)
        Case "GCA", "GCC", "GCG", "GCT": Rez = Rez & "A"
        Case "TGC", "TGT": Rez = Rez & "C"
        Case "GAC", "GAT": Rez = Rez & "D"
        Case "GAA", "GAG": Rez = Rez & "E"
        Case "TTC", "TTT": Rez = Rez & "F"
        Case "GGA", "GGC", "GGG", "GGT": Rez = Rez & "G"
        Case "CAC", "CAT": Rez = Rez & "H"
        Case "ATA", "ATC", "ATT": Rez = Rez & "I"
        Case "AAA", "AAG": Rez = Rez & "K"
        Case "CTA", "CTC", "CTG", "CTT", "TTA", "TTG": Rez = Rez & "L"
        Case "ATG": Rez = Rez & "M"
        Case "AAC", "AAT": Rez = Rez & "N"
        Case "CCA", "CCC", "CCG", "CCT": Rez = Rez & "P"
        Case "CAA", "CAG": Rez = Rez & "Q"
        Case "AGA", "AGG", "CGA", "CGC", "CGG", "CGT": Rez = Rez & "R"
        Case "AGC", "AGT", "TCA", "TCC", "TCG", "TCT": Rez = Rez & "S"
        Case "ACA", "ACC", "ACG", "ACT": Rez = Rez & "T"
        Case "GTA", "GTC", "GTG", "GTT": Rez = Rez & "V"
        Case "TGG": Rez = Rez & "W"
        Case "TAC", "TAT": Rez = Rez & "Y"
'        Case "TAA", "TAG", "TGA": Rez = Rez & "Stop"
        Case "TAA", "TAG", "TGA"
            ss = ""
            flag = False
            Exit For
    End Select
 Next i
Translation = Rez
End Functio
И добавился вот такой короткий код который вытаскивает необходимую нуклеотидную последовательность, с вышеописанными в первом сообщении настройками:
Код
Function КОДДОНСМЕЩ(ByVal ТЕКСТ As String, Optional StartCodon As String, Optional EntryStartCodon As Long = 1) As String
    Dim curEntryStartCodon As Long
    Dim sMid As String
    Dim ii As Long
    For ii = 1 To Len(ТЕКСТ) - 2
        sMid = Mid(ТЕКСТ, ii, 3)
        If sMid = StartCodon Then
            curEntryStartCodon = curEntryStartCodon + 1
            If curEntryStartCodon = EntryStartCodon Then
                ТЕКСТ = Mid(ТЕКСТ, ii, Len(ТЕКСТ))
                Exit For
            End If
        End If
    Next
    КОДДОНСМЕЩ = ТЕКСТ
End Function
Как говорил царь Иван Грозный - "Красота-та какая - лепота"!
 
5 кругов по 500 итераций, надстройка Мерка.
формула =Translation(КОДДОНСМЕЩ(C18;"ATG";2)) расчитывается в среднем 0,36 секунда
формула =Альтернативная_трасляция(C18;"ATG";2) расчитывается в среднем 2,38 секунд
Изменено: dim284 - 10.06.2024 17:16:52
 
И все же немного не доделанно, хотя пользоваться уже можно. Может кто-нибудь глянет с новыми силами? В последнем примере картинка и решение, осталось поженить функции КОДДОНСМЕЩ и Альтернативная_трасляция из сообщения 2.
 
Приветствую!
Одна функция:
Код
Изменено: ZVI - 10.06.2024 22:13:50
 
Спасибо ZVI, хорошая функция получилась! Ещё раз хочу сказать спасибо МатросНаЗебре и Msi2102.
Страницы: 1
Наверх