From b22ea483208c6a2ab3f78e00d009530dae2a51b2 Mon Sep 17 00:00:00 2001 From: glitchheadgit <122817935+glitchheadgit@users.noreply.github.com> Date: Thu, 28 Sep 2023 00:02:27 +0300 Subject: [PATCH 01/21] Create HW4_Zolotikov --- HW4_Zolotikov | 1 + 1 file changed, 1 insertion(+) create mode 100644 HW4_Zolotikov diff --git a/HW4_Zolotikov b/HW4_Zolotikov new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/HW4_Zolotikov @@ -0,0 +1 @@ + From 69aab657a1e355bb0421b0a0f537c724ba2032f2 Mon Sep 17 00:00:00 2001 From: Dorzhi Date: Fri, 29 Sep 2023 00:24:12 +0300 Subject: [PATCH 02/21] Add to_rna function --- HW4_Zolotikov | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/HW4_Zolotikov b/HW4_Zolotikov index 8b13789..fc435bf 100644 --- a/HW4_Zolotikov +++ b/HW4_Zolotikov @@ -1 +1,25 @@ +def to_rna(seq, rna_dict = {'F': 'UUY', 'L': 'YUN', 'I': 'AUH', 'M': 'AUG', + 'V': 'GUN', 'S': 'WSN', 'P': 'CCN', 'T': 'ACN', + 'A': 'GCN', 'Y': 'UAY', 'H': 'CAY', 'Q': 'CAR', + 'N': 'AAY', 'K': 'AAR', 'D': 'GAY', 'E': 'GAR', + 'C': 'UGY', 'R': 'MGN', 'G': 'GGN', 'W': 'UGG'}): + """ + Converts an amino acid sequence into an RNA sequence. + + Parameters + ---------- + seq : str + Amino acid sequence. + rna_dict : dict + Dictionary defining the correspondence of amino acids + to RNA triplets (default, standard code). + Returns + ------- + str + RNA sequence. + + """ + seq = seq.upper() + result = ''.join(rna_dict[base] for base in seq) + return result From ae5c637696212f5b576e99c0416cd4bd114b43c4 Mon Sep 17 00:00:00 2001 From: Dorzhi Date: Fri, 29 Sep 2023 01:01:30 +0300 Subject: [PATCH 03/21] Add define_charge function --- HW4_Zolotikov | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/HW4_Zolotikov b/HW4_Zolotikov index fc435bf..6a0ce7d 100644 --- a/HW4_Zolotikov +++ b/HW4_Zolotikov @@ -23,3 +23,47 @@ def to_rna(seq, rna_dict = {'F': 'UUY', 'L': 'YUN', 'I': 'AUH', 'M': 'AUG', seq = seq.upper() result = ''.join(rna_dict[base] for base in seq) return result + + +def define_charge(seq, positive_charge = ['R', 'K', 'H'], + negative_charge = ['D', 'E']): + """ + Counts the number of amino acids with positive charge, negative charge, + and neutral amino acids in the sequence. + + Parameters + ---------- + seq : str + Amino acid sequence (string). + positive_charge : list + List of amino acids with positive charge (default is ['R', 'K', 'H']). + negative_charge : list + List of amino acids with negative charge (default is ['D', 'E']). + + Returns + ------- + dict + A dictionary containing the counts of amino acids and their labels: + - 'Positive' for amino acids with positive charge. + - 'Negative' for amino acids with negative charge. + - 'Neutral' for neutral amino acids. + """ + seq = seq.upper() + positive_count = 0 + negative_count = 0 + neutral_count = 0 + + for aa in seq: + if aa in positive_charge: + positive_count += 1 + elif aa in negative_charge: + negative_count += 1 + else: + neutral_count += 1 + + result = { + 'Positive': positive_count, + 'Negative': negative_count, + 'Neutral': neutral_count + } + return result From 9b314eb1d425f362256aeb55050a946a430d15dc Mon Sep 17 00:00:00 2001 From: Dorzhi Date: Fri, 29 Sep 2023 01:46:29 +0300 Subject: [PATCH 04/21] Create README.md to_rna and define_charge parts --- README.md | 114 +++++++++++++++++++++++------------------------------- 1 file changed, 49 insertions(+), 65 deletions(-) diff --git a/README.md b/README.md index f918170..bc2603c 100644 --- a/README.md +++ b/README.md @@ -1,65 +1,49 @@ -# HW 4. Functions 2 -> *This is the repo for the fourth homework of the BI Python 2023 course* - -### Homework description - -На прошлой неделе вы делали утилиту для работы с последовательностями нуклеиновых кислот (с весьма строгим ТЗ). Пришло время для чего-то более самостоятельного. - -#### Основное задание - - -Напишите утилиту для работы с последовательностями белков. Там должно быть минимум 5 различных операций, должна быть какая-то точка входа через которую пользователь будет всё это дело использовать. На этом, по сути, всё. Всё целиком зависит от вашей фантазии и креативности. Можете опираться на ДЗ №2 и №3. - -Самая главная часть задания - это файл `README.md`. Сделайте краткое введение, напишите описание тула, приведите документацию по использованию со списком аргументов. Добавьте примеры использования. Возможно, вы захотите сделать секцию Troubleshooting. ***Почему это нужно?*** В этот раз проверяющий не будет знать того, как должен работать ваш тул. Это ваш авторский код. Даже самая прекрасная функциональность, не будучи отраженной в README, скорее всего останется незамеченной. README - это ваш способ познакомить пользователя с тулом, показать всё лучше и обосновать, почему именно ваша команда должна получить наивысший балл. - -Есть люди которые, любят писать документации, а есть те - кто не любит. Найдите в вашей команде того, кто любит. И в будущем в своих рабочих проектах всегда держите рядом такого человек (или будьте им). - -Примеры некоторых README, которыми можно вдохновляться: - -- [MetaFX](https://github.com/ctlab/metafx), тул Артёма Иванова. Там еще и [wiki](https://github.com/ctlab/metafx/wiki) крутое. -- [samovar](https://github.com/nvaulin/samovar) -- [MetaGEM](https://github.com/franciscozorrilla/metaGEM) -- [Pharokka](https://github.com/gbouras13/pharokka) - -Типовые секции, на которые стоит обратить внимание: Title, Overview, Usage, Options, Examples, Troubleshooting, Contacts. - -**Tехническое требование к заданию.** - -Это задание будет выполняться в командах по 3 человека. Каждый из членов команды должен внести ***как минимум*** 2 функции. Каждое внесение функции должно сопровождаться коммитом с осмысленным описанием коммита. Ниже приведена последовательность действий для успешного выполнения задания (аналогично ДЗ №2): - -1. Посмотрите состав своей команды здесь ([**ССЫЛКА**](https://docs.google.com/spreadsheets/d/1KMBBBu8LqauRpDJb0v1ldPwpvzNn8-KakcHexAcqLsE/edit?usp=sharing)). -2. Тимлид делает форк данного репозитория. **В форке создает ветку `HW4_`, в ветке создает папку `HW4_`, в этой папке вы всё делаете.** -3. Члены команды могут либо делать свои форки, либо работать в репозитории тимлида в качестве колабораторов ("contributors"). В любом случае делаете клоны => пишите код локально => пушите. -4. В конце тимлид делайет pull-request из `HW4_` своего репозитория в `main` этого. - - -А также: -- Сопроводите программу лучшим `README.md` файлом в вашей жизни (на английском языке). -- В этом ДЗ проблемы с качеством кода (нейминги, пустые строки, анноатции типов, док.стринги, пробелы) могут привести к снижению балла. Воспользуйтесь линтерами чтобы себя обезопасить. IDE по типу PyCharm или VSCode имеют фунцонал по авто-исправлению многих проблем такого рода. - -Автотестов на GitHub в этом ДЗ нет, но вы можете прогнать линтеры на качество кода локально (как в ДЗ №3, подробнее читайте [тут](https://plausible-cannon-091.notion.site/Code-auto-checks-02b2ea69c1d545fca07b50ce5933ed5f?pvs=4)). - -- Программа должна сохранять регистр символов. -- Программа должна работать только с последовательностями белков. -- Запрещается использование сторонних модулей. - - -### Форма сдачи - -Прикрепите ссылку на pull-request тимлида в Google Class (можете сделать от лица каждого члена команды, но это не обязательно). - - -### Pазбалловка - -- За каждую из 5 операций - максимум **1.5 балла** -- За README - максимум **2.5 балла** -- Если вы не внесли как минимум 2 функции от себя, вы получаете 0 баллов (на баллы остальных членов команды это не влияет). -- За фото созвона в README можно получить 0.2 доп. балла (но не более 10 баллов суммарно) - - - -### **Предполагаемый учебный результат** - -Это задание позволит вам проявить креативность и учиться быть не только кодером, но и автором. Также это задание поможет окончательно закрепить материал по функциям который мы прошли. - -Удачи! ✨✨ +# Protein Tool + +This Python utility allows you to work with protein sequences. You can perform various operations on protein sequences, such as translating them into RNA sequences, counting charged and uncharged amino acids, and more... + +## Table of Contents + +- [Installation](#installation) +- [Functions](#functions) +- [Authors](#Authors) + +## Installation + +You can clone this repository or download the source code. + +##### Requirements: + +Python3 + +## Functions +### to_rna(seq, rna_dict) +Translates an amino acid sequence into an RNA sequence. + +- seq: Amino acid sequence (str). +- rna_dict: Dictionary defining the correspondence of amino acids to RNA triplets (default, standard code). +- Returns: RNA sequence (str). + +##### Example: +```python +to_rna('FM') +'UUYAUG' +``` +### define_charge(seq, positive_charge, negative_charge) +Counts the number of amino acids with positive charge, negative charge, and neutral amino acids in the sequence. + +- seq: Amino acid sequence (string). +- positive_charge: List of amino acids with positive charge (default is ['R', 'K', 'H']). +- negative_charge: List of amino acids with negative charge (default is ['D', 'E']). +- Returns: A dictionary containing the counts of amino acids and their labels. + +##### Example: +```python +define_charge('ASDRKHDE') +{'Positive': 3, 'Negative': 3, 'Neutral': 2} +``` + +## Authors +- Dorzhi Badmadashiev +- +- \ No newline at end of file From 86127fe753b06e454431148edb101d45c0e81e71 Mon Sep 17 00:00:00 2001 From: Glitch Date: Sat, 30 Sep 2023 01:14:17 +0300 Subject: [PATCH 05/21] Add to_dna, define_polarity functions --- HW4_Zolotikov | 47 +++++++++++++++++++++++++++++++++++ README.md | 69 +++------------------------------------------------ 2 files changed, 51 insertions(+), 65 deletions(-) diff --git a/HW4_Zolotikov b/HW4_Zolotikov index 8b13789..4f2fd67 100644 --- a/HW4_Zolotikov +++ b/HW4_Zolotikov @@ -1 +1,48 @@ +from typing import List, Dict +POLAR_AA = {'D', 'E', 'R', 'K', 'H', 'N', 'Q', 'S', 'T', 'Y', 'C'} +NONPOLAR_AA = {'A', 'G', 'V', 'L', 'I', 'P', 'F', 'M', 'W'} +DNA_AA = {'F': 'TTY', 'L': '(TTR or CTN)', 'I': 'ATH', 'M': 'ATG', 'V': 'GTN', 'S': '(TCN or AGY)', 'P': 'CCN', 'T': 'ACN', 'A': 'GCN', + 'Y': 'TAY', 'H': 'CAY', 'Q': 'CAR', 'N': 'AAY', 'K': 'AAR', 'D': 'GAY', 'E': 'GAR', 'C': 'TGY', 'W': '(CGN or AGR)', 'R': 'AGY', 'G': 'GGN'} + + +def define_polarity(sequences: List[str]) -> Dict[str, Dict[str, int]]: + """ + Counts polar and nonpolar aminoacids in aminoacid sequences + + Arguments: + - List[str]: sequence or sequences in which we want to count polar and nonpolar aminoacids. + + Return: + - Dict[str, Dict[str, int]]: dictionary with sequences as keys and values as dictionaries in which we have keys 'Polar', 'Nonpolar' and values with quantity of polar and nonpolar groups in sequence accordingly. + """ + results = {} + for sequence in sequences: + polarity_count = {'Polar': 0, 'Nonpolar': 0} + for aminoacid in sequence: + if aminoacid in POLAR_AA: + polarity_count['Polar'] += 1 + else: + add(sequence_dna) + polarity_count['Nonpolar'] += 1 + results[sequence] = polarity_count + return results + + +def to_dna(sequences: List[str]) -> Dict[str, str]: + """ + Transforms aminoacids sequences to DNA sequences + + Arguments: + - List[str]: aminoacid sequence or sequences which we want to transform to according DNA sequence. + + Return: + - Dict[str, str]: dictionary with keys as aminoacid sequences and values as according DNA sequences + """ + results = {} + for sequence in sequences: + sequence_dna = [] + for aminoacid in sequence: + sequence_dna.append(DNA_AA[aminoacid]) + results[sequence] = ''.join(sequence_dna) + return results diff --git a/README.md b/README.md index f918170..ceaa5e4 100644 --- a/README.md +++ b/README.md @@ -1,65 +1,4 @@ -# HW 4. Functions 2 -> *This is the repo for the fourth homework of the BI Python 2023 course* - -### Homework description - -На прошлой неделе вы делали утилиту для работы с последовательностями нуклеиновых кислот (с весьма строгим ТЗ). Пришло время для чего-то более самостоятельного. - -#### Основное задание - - -Напишите утилиту для работы с последовательностями белков. Там должно быть минимум 5 различных операций, должна быть какая-то точка входа через которую пользователь будет всё это дело использовать. На этом, по сути, всё. Всё целиком зависит от вашей фантазии и креативности. Можете опираться на ДЗ №2 и №3. - -Самая главная часть задания - это файл `README.md`. Сделайте краткое введение, напишите описание тула, приведите документацию по использованию со списком аргументов. Добавьте примеры использования. Возможно, вы захотите сделать секцию Troubleshooting. ***Почему это нужно?*** В этот раз проверяющий не будет знать того, как должен работать ваш тул. Это ваш авторский код. Даже самая прекрасная функциональность, не будучи отраженной в README, скорее всего останется незамеченной. README - это ваш способ познакомить пользователя с тулом, показать всё лучше и обосновать, почему именно ваша команда должна получить наивысший балл. - -Есть люди которые, любят писать документации, а есть те - кто не любит. Найдите в вашей команде того, кто любит. И в будущем в своих рабочих проектах всегда держите рядом такого человек (или будьте им). - -Примеры некоторых README, которыми можно вдохновляться: - -- [MetaFX](https://github.com/ctlab/metafx), тул Артёма Иванова. Там еще и [wiki](https://github.com/ctlab/metafx/wiki) крутое. -- [samovar](https://github.com/nvaulin/samovar) -- [MetaGEM](https://github.com/franciscozorrilla/metaGEM) -- [Pharokka](https://github.com/gbouras13/pharokka) - -Типовые секции, на которые стоит обратить внимание: Title, Overview, Usage, Options, Examples, Troubleshooting, Contacts. - -**Tехническое требование к заданию.** - -Это задание будет выполняться в командах по 3 человека. Каждый из членов команды должен внести ***как минимум*** 2 функции. Каждое внесение функции должно сопровождаться коммитом с осмысленным описанием коммита. Ниже приведена последовательность действий для успешного выполнения задания (аналогично ДЗ №2): - -1. Посмотрите состав своей команды здесь ([**ССЫЛКА**](https://docs.google.com/spreadsheets/d/1KMBBBu8LqauRpDJb0v1ldPwpvzNn8-KakcHexAcqLsE/edit?usp=sharing)). -2. Тимлид делает форк данного репозитория. **В форке создает ветку `HW4_`, в ветке создает папку `HW4_`, в этой папке вы всё делаете.** -3. Члены команды могут либо делать свои форки, либо работать в репозитории тимлида в качестве колабораторов ("contributors"). В любом случае делаете клоны => пишите код локально => пушите. -4. В конце тимлид делайет pull-request из `HW4_` своего репозитория в `main` этого. - - -А также: -- Сопроводите программу лучшим `README.md` файлом в вашей жизни (на английском языке). -- В этом ДЗ проблемы с качеством кода (нейминги, пустые строки, анноатции типов, док.стринги, пробелы) могут привести к снижению балла. Воспользуйтесь линтерами чтобы себя обезопасить. IDE по типу PyCharm или VSCode имеют фунцонал по авто-исправлению многих проблем такого рода. - -Автотестов на GitHub в этом ДЗ нет, но вы можете прогнать линтеры на качество кода локально (как в ДЗ №3, подробнее читайте [тут](https://plausible-cannon-091.notion.site/Code-auto-checks-02b2ea69c1d545fca07b50ce5933ed5f?pvs=4)). - -- Программа должна сохранять регистр символов. -- Программа должна работать только с последовательностями белков. -- Запрещается использование сторонних модулей. - - -### Форма сдачи - -Прикрепите ссылку на pull-request тимлида в Google Class (можете сделать от лица каждого члена команды, но это не обязательно). - - -### Pазбалловка - -- За каждую из 5 операций - максимум **1.5 балла** -- За README - максимум **2.5 балла** -- Если вы не внесли как минимум 2 функции от себя, вы получаете 0 баллов (на баллы остальных членов команды это не влияет). -- За фото созвона в README можно получить 0.2 доп. балла (но не более 10 баллов суммарно) - - - -### **Предполагаемый учебный результат** - -Это задание позволит вам проявить креативность и учиться быть не только кодером, но и автором. Также это задание поможет окончательно закрепить материал по функциям который мы прошли. - -Удачи! ✨✨ +## to_dna(sequences) +Returns dictionary with keys - aminoacid sequences and values - their coding DNA sequences. +## define_polarity(sequences) +Returns dictionary with keys - aminoacid sequences and values - dictionaries with 'Polar', 'Nonpolar' as keys and appropriate counters as values. From 1b807184613d5fdfacaf08cb2cc9dfa5056e28cf Mon Sep 17 00:00:00 2001 From: glitchheadgit <122817935+glitchheadgit@users.noreply.github.com> Date: Sat, 30 Sep 2023 01:34:01 +0300 Subject: [PATCH 06/21] Fix define_polarity function --- HW4_Zolotikov | 1 - 1 file changed, 1 deletion(-) diff --git a/HW4_Zolotikov b/HW4_Zolotikov index 5bf380f..40a77a6 100644 --- a/HW4_Zolotikov +++ b/HW4_Zolotikov @@ -96,7 +96,6 @@ def define_polarity(sequences: List[str]) -> Dict[str, Dict[str, int]]: if aminoacid in POLAR_AA: polarity_count['Polar'] += 1 else: - add(sequence_dna) polarity_count['Nonpolar'] += 1 results[sequence] = polarity_count return results From 2a9e3b4f5e1b3915656f34720439e95ec2844237 Mon Sep 17 00:00:00 2001 From: Beskrovnaia Margarita Date: Sat, 30 Sep 2023 02:46:28 +0300 Subject: [PATCH 07/21] Add main, change abbreveation and check sequence function --- HW4_Zolotikov | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/HW4_Zolotikov b/HW4_Zolotikov index 40a77a6..c1f3a97 100644 --- a/HW4_Zolotikov +++ b/HW4_Zolotikov @@ -118,3 +118,92 @@ def to_dna(sequences: List[str]) -> Dict[str, str]: sequence_dna.append(DNA_AA[aminoacid]) results[sequence] = ''.join(sequence_dna) return results + + +#Margarita +ABBREVIATION_THREE_TO_ONE = {'ALA':'A', 'CYS':'C', 'ASP':'D', 'GLU':'E', 'PHE':'F', + 'GLY':'G', 'HIS':'H', 'ILE':'I', 'LYS':'K', 'LEU':'L', + 'MET':'M', 'ASN':'N', 'PRO':'P', 'GLN':'Q', 'ARG':'R', + 'SER':'S', 'TRE':'T', 'VAL':'V', 'TRP':'W', 'TYR':'Y'} +AMINO_ACIDS_ONE_LETTER = {'A', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'K', + 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'V', + 'W', 'Y'} +AMINO_ACIDS_THREE_LETTER = {'ALA', 'CYS', 'ASP', 'GLU', 'PHE', + 'GLY', 'HIS', 'ILE', 'LYS', 'LEU', + 'MET', 'ASN', 'PRO', 'GLN', 'ARG', + 'SER', 'TRE', 'VAL', 'TRP', 'TYR'} + +import sys + +def change_abbreviation(seq): + """ + Changes the amino acid abbreviation from three-letter to one-letter. + + Parametrs + + ---------- + seq : str + Amino acid sequence in three-letter form. + Returns + ------- + str + Amino acid sequence in one-letter form + + """ + one_letter_seq = [ABBREVIATION_THREE_TO_ONE[amino_acid] for amino_acid in seq.split("-")] + return "".join(one_letter_seq) + +def is_correct_seq(seq): + """ + Check the sequence for extraneous characters. + + Parametrs + + ---------- + seq : str + Amino acid sequence. + Returns + ------- + bool + TRUE - if there is no extraneous characters, FALSE - if there is extraneous characters. + + """ + unique_amino_acids = set(seq) + unique_amino_acids_three = set(seq.split("-")) + check = unique_amino_acids <= AMINO_ACIDS_ONE_LETTER or unique_amino_acids_three <= AMINO_ACIDS_THREE_LETTER + return check + +def protein_tool(*args): + """ + Receives a request from the user and runs the desired function. + + Parametrs + + ---------- + seq : str + Amino acid sequences. + operation : str + Type of user's request. + Returns + ------- + str + If a single sequence is supplied, outputs the result as a string or or identify a problem with a specific sequence. + list + If several sequences are supplied, outputs the result as a list. + + """ + *seqs, operation = args + operations = {'one letter':change_abbreviation, 'RNA':to_rna, 'DNA':to_dna, 'charge':define_charge, 'polarity':define_polarity} + output = [] + for seq in seqs: + answer = is_correct_seq(seq.upper()) + if answer: + function_output = operations[operation](seq.upper()) + output.append(function_output) + else: + print(f'Something wrong with {seq}', file=sys.stderr) + continue + if len(output) == 1 and (operation == 'RNA' or operation == 'DNA' or operation == 'one letter'): + return ''.join(output) + else: + return output From 25e3f80b582666e18b75151b160779ee2f0e9ecc Mon Sep 17 00:00:00 2001 From: Glitch Date: Sat, 30 Sep 2023 13:04:31 +0300 Subject: [PATCH 08/21] Modify to_dna, define_polarity functions --- HW4_Zolotikov | 48 +++++++++++++++++++++--------------------------- 1 file changed, 21 insertions(+), 27 deletions(-) diff --git a/HW4_Zolotikov b/HW4_Zolotikov index c1f3a97..f52687c 100644 --- a/HW4_Zolotikov +++ b/HW4_Zolotikov @@ -78,46 +78,40 @@ DNA_AA = {'F': 'TTY', 'L': '(TTR or CTN)', 'I': 'ATH', 'M': 'ATG', 'V': 'GTN', ' 'Y': 'TAY', 'H': 'CAY', 'Q': 'CAR', 'N': 'AAY', 'K': 'AAR', 'D': 'GAY', 'E': 'GAR', 'C': 'TGY', 'W': '(CGN or AGR)', 'R': 'AGY', 'G': 'GGN'} -def define_polarity(sequences: List[str]) -> Dict[str, Dict[str, int]]: +def define_polarity(seq: str) -> Dict[str, int]: """ Counts polar and nonpolar aminoacids in aminoacid sequences. Arguments: - - List[str]: sequence or sequences to count polar and nonpolar aminoacids. + - str: sequence to count polar and nonpolar aminoacids. Return: - - Dict[str, Dict[str, int]]: - Dictionary with keys(sequences) and values(dictionaries with keys 'Polar', 'Nonpolar' and values of quantity of according groups in sequences). + - Dict[str, int]: + Dictionary with keys 'Polar', 'Nonpolar' and values of quantity of according groups in sequence. """ - results = {} - for sequence in sequences: - polarity_count = {'Polar': 0, 'Nonpolar': 0} - for aminoacid in sequence: - if aminoacid in POLAR_AA: - polarity_count['Polar'] += 1 - else: - polarity_count['Nonpolar'] += 1 - results[sequence] = polarity_count - return results - - -def to_dna(sequences: List[str]) -> Dict[str, str]: + polarity_count = {'Polar': 0, 'Nonpolar': 0} + for aminoacid in seq: + if aminoacid in POLAR_AA: + polarity_count['Polar'] += 1 + else: + polarity_count['Nonpolar'] += 1 + return polarity_count + + +def to_dna(seq: str) -> str: """ - Transforms aminoacids sequences to DNA sequences + Transforms aminoacid sequence to DNA sequence Arguments: - - List[str]: aminoacid sequence or sequences to transform to according DNA sequence. + - str: aminoacid sequence to transform to DNA sequence. Return: - - Dict[str, str]: dictionary with keys - aminoacid sequences and values - according DNA sequences. + - str: according DNA sequence. """ - results = {} - for sequence in sequences: - sequence_dna = [] - for aminoacid in sequence: - sequence_dna.append(DNA_AA[aminoacid]) - results[sequence] = ''.join(sequence_dna) - return results + sequence_dna = [] + for aminoacid in seq: + sequence_dna.append(DNA_AA[aminoacid]) + return ''.join(sequence_dna) #Margarita From 65d915fcd720d254355ca6438672b49a226fa0ee Mon Sep 17 00:00:00 2001 From: Glitch Date: Sat, 30 Sep 2023 13:04:49 +0300 Subject: [PATCH 09/21] Modify to_dna, define_polarity functions --- README.md | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 99a5681..b226308 100644 --- a/README.md +++ b/README.md @@ -41,21 +41,32 @@ Counts the number of amino acids with positive charge, negative charge, and neut define_charge('ASDRKHDE') {'Positive': 3, 'Negative': 3, 'Neutral': 2} ``` -### to_dna(sequences) -Returns dictionary with keys - aminoacid sequences and values - their coding DNA sequences. +### to_dna(sequence: str) -> str +Transforms aminoacid sequence to according DNA sequence. -- sequences: list of sequences to transform into DNA. +Arguments: +- sequence: aminoacid sequence to transform into DNA. +Returns: +- String of according DNA sequence ##### Example: ```python +to_dna('ASDR') # Returns 'GCN(TCN or AGY)GAYAGY' +to_dna('YWNGAS') # Returns 'TAY(CGN or AGR)AAYGGNGCN(TCN or AGY)' ``` -### define_polarity(sequences) -Returns dictionary with keys - aminoacid sequences and values - dictionaries with 'Polar', 'Nonpolar' as keys and appropriate counters as values. +### define_polarity(sequence: str) -> dict +Counts polar and nonpolar aminoacids in sequence. --sequences: list of sequences in which we count polar and nonpolar aminoacids. +Arguments: +- sequence: sequence in which we count polar and nonpolar aminoacids. +Returns: +- Dictionary with dictionary with keys 'Polar', 'Nonpolar' and appropriate aminoacid counters as values. ##### Example: ```python +define_polarity('ASDR') # Returns {'Polar': 3, 'Nonpolar': 1} +define_polarity('YWNGAS') # Returns {'Polar': 3, 'Nonpolar': 3} + ``` ## Authors - Dorzhi Badmadashiev - Ustin Zolotikov: to_dna, define_polarity functions -- \ No newline at end of file +- From b0a4d82b714878756d0999e834ce281b7bf04d15 Mon Sep 17 00:00:00 2001 From: glitchheadgit <122817935+glitchheadgit@users.noreply.github.com> Date: Sat, 30 Sep 2023 13:06:06 +0300 Subject: [PATCH 10/21] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b226308..5d728e8 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ Counts the number of amino acids with positive charge, negative charge, and neut define_charge('ASDRKHDE') {'Positive': 3, 'Negative': 3, 'Neutral': 2} ``` -### to_dna(sequence: str) -> str +### to_dna(seq: str) -> str Transforms aminoacid sequence to according DNA sequence. Arguments: @@ -53,7 +53,7 @@ Returns: to_dna('ASDR') # Returns 'GCN(TCN or AGY)GAYAGY' to_dna('YWNGAS') # Returns 'TAY(CGN or AGR)AAYGGNGCN(TCN or AGY)' ``` -### define_polarity(sequence: str) -> dict +### define_polarity(seq: str) -> dict Counts polar and nonpolar aminoacids in sequence. Arguments: From 952fae5ee6e694804ca6ff887c635edd011a36ac Mon Sep 17 00:00:00 2001 From: glitchheadgit <122817935+glitchheadgit@users.noreply.github.com> Date: Sat, 30 Sep 2023 13:06:40 +0300 Subject: [PATCH 11/21] Update HW4_Zolotikov Delete List import from typing --- HW4_Zolotikov | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HW4_Zolotikov b/HW4_Zolotikov index f52687c..6e32219 100644 --- a/HW4_Zolotikov +++ b/HW4_Zolotikov @@ -1,4 +1,4 @@ -from typing import List, Dict +from typing import Dict # Dorzhi def to_rna(seq, rna_dict = {'F': 'UUY', 'L': 'YUN', 'I': 'AUH', 'M': 'AUG', From 185e764f9a52cef995210b802ff34cb37bee22f0 Mon Sep 17 00:00:00 2001 From: BeskrovnaiaM <143890997+BeskrovnaiaM@users.noreply.github.com> Date: Sat, 30 Sep 2023 16:14:52 +0300 Subject: [PATCH 12/21] Update README.md --- README.md | 109 +++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 83 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 5d728e8..d9bbd47 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,13 @@ # Protein Tool -This Python utility allows you to work with protein sequences. You can perform various operations on protein sequences, such as translating them into RNA sequences, counting charged and uncharged amino acids, and more... +This Python utility allows you to work with protein sequences. You can perform various operations on protein sequences, such as translating them into RNA, DNA sequences, counting charged, uncharged amino acids and hydrophobic, hydrophilic amino acids in sequence. ## Table of Contents - [Installation](#installation) - [Functions](#functions) -- [Authors](#Authors) +- [Troubleshooting](#troubleshooting) +- [Authors](#authors) ## Installation @@ -17,44 +18,86 @@ You can clone this repository or download the source code. Python3 ## Functions +The program can process one or more amino acid sequences written in a one-letter format and also does not take into account the size of the input and output letters. Tool can work with amino acids which are mentioned in table below. +| One letter amino acid | Three letter amino acid | +|-------------------------------|-----------------------------| +| A | Ala | +| C | Cys | +| D | Asp | +| E | Glu | +| F | Phe | +| G | Gly | +| H | His | +| I | Ile | +| K | Lys | +| L | Leu | +| M | Met | +| N | Asn | +| P | Pro | +| Q | Gln | +| R | Arg | +| S | Ser | +| T | Tre | +| V | Val | +| W | Trp | +| Y | Tyr | +### change_abbreviation(seq) +Name's operation: "one letter". +Sequences are written in three-letter format, can be converted to one-letter format. Amino acids must be separeted by "-". + +- seq: Amino acid sequence (str). +- Returns: string of one-letter format of sequence or list of sequences. +##### Example: +```python +protein_tool('aLa-CyS', 'one letter') #input ignore letter's size +'AC' +protein_tool('Ala-Cys', 'Ala', 'one letter') +['AC', 'A'] +``` +### to_dna(seq: str) -> str +Name's operation: "DNA". +Transforms aminoacid sequence to according DNA sequence. + +Arguments: +- sequence: aminoacid sequence to transform into DNA. +Returns: +- String of according DNA sequence +##### Example: +```python +protein_tool('AsDr', 'DNA') +'GCN(TCN or AGY)GAYAGY' +protein_tool('YWNGAS', 'DNA') +'TAY(CGN or AGR)AAYGGNGCN(TCN or AGY)' +``` ### to_rna(seq, rna_dict) -Translates an amino acid sequence into an RNA sequence. +Name's operation: "RNA". +Translates an amino acid sequence into an RNA sequence. - seq: Amino acid sequence (str). - rna_dict: Dictionary defining the correspondence of amino acids to RNA triplets (default, standard code). -- Returns: RNA sequence (str). +- Returns: String or list of RNA sequences. ##### Example: ```python -to_rna('FM') +protein_tool('FM', 'RNA') 'UUYAUG' ``` ### define_charge(seq, positive_charge, negative_charge) -Counts the number of amino acids with positive charge, negative charge, and neutral amino acids in the sequence. +Name's operation: "charge". +Counts the number of amino acids with positive charge, negative charge, and neutral amino acids in the sequence. - seq: Amino acid sequence (string). - positive_charge: List of amino acids with positive charge (default is ['R', 'K', 'H']). - negative_charge: List of amino acids with negative charge (default is ['D', 'E']). -- Returns: A dictionary containing the counts of amino acids and their labels. +- Returns: A dictionary (or list of dictionaries) containing the counts of amino acids and their labels. ##### Example: ```python -define_charge('ASDRKHDE') +protein_tool('ASDRKHDE', 'charge') {'Positive': 3, 'Negative': 3, 'Neutral': 2} ``` -### to_dna(seq: str) -> str -Transforms aminoacid sequence to according DNA sequence. - -Arguments: -- sequence: aminoacid sequence to transform into DNA. -Returns: -- String of according DNA sequence -##### Example: -```python -to_dna('ASDR') # Returns 'GCN(TCN or AGY)GAYAGY' -to_dna('YWNGAS') # Returns 'TAY(CGN or AGR)AAYGGNGCN(TCN or AGY)' -``` ### define_polarity(seq: str) -> dict -Counts polar and nonpolar aminoacids in sequence. +Name's operation: "polarity". +Counts polar and nonpolar aminoacids in sequence. Arguments: - sequence: sequence in which we count polar and nonpolar aminoacids. @@ -62,11 +105,25 @@ Returns: - Dictionary with dictionary with keys 'Polar', 'Nonpolar' and appropriate aminoacid counters as values. ##### Example: ```python -define_polarity('ASDR') # Returns {'Polar': 3, 'Nonpolar': 1} -define_polarity('YWNGAS') # Returns {'Polar': 3, 'Nonpolar': 3} - +protein_tool('ASDR', 'polarity') +[{'Polar': 3, 'Nonpolar': 1}] +``` +## Troubleshooting +Sequences containing characters that do not code for amino acids will be removed from the analysis. The program will write an error and display the sequence with which the problem occurred. +##### Example: +```python +protein_tool('ASDR', 'ala1', 'polarity') +Something wrong with ala1 +[{'Polar': 3, 'Nonpolar': 1}] +``` +Sequences specified in a three-letter format are accepted only by the function for changing the recording format. In other cases, the program will produce either an error or incorrect calculations. +##### Example: +```python +protein_tool('AGFHGF', 'Ala-ala', 'DNA') # key error "-" +protein_tool('AGFHGF', 'Ala-ala', 'polarity') +[{'Polar': 1, 'Nonpolar': 5}, {'Polar': 0, 'Nonpolar': 7}] # "-" is counted as non-polar ``` ## Authors -- Dorzhi Badmadashiev +- Dorzhi Badmadashiev: to_rna, define_charge functions - Ustin Zolotikov: to_dna, define_polarity functions -- +- Margarita Beskrovnaia: main, is_correct_seq, change_abbreviation functions From 4efc0e82d8d79d4c8e67aaadda6bbb9ab9987ba4 Mon Sep 17 00:00:00 2001 From: BeskrovnaiaM <143890997+BeskrovnaiaM@users.noreply.github.com> Date: Sat, 30 Sep 2023 16:18:02 +0300 Subject: [PATCH 13/21] Add team's photo --- team-HW4.jpg | Bin 0 -> 75340 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 team-HW4.jpg diff --git a/team-HW4.jpg b/team-HW4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dc6944a1832bc99af7efe8df7750da8006a3ea99 GIT binary patch literal 75340 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

MChP@19hS!uUn!p(5>Hx@H(@M1*w{m1Ekt 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 literal 0 HcmV?d00001 From 5c0687ab675365287f2ff5e21e26513f7be4a918 Mon Sep 17 00:00:00 2001 From: BeskrovnaiaM <143890997+BeskrovnaiaM@users.noreply.github.com> Date: Sat, 30 Sep 2023 16:20:25 +0300 Subject: [PATCH 14/21] Update README.md with photo --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d9bbd47..2b3a415 100644 --- a/README.md +++ b/README.md @@ -127,3 +127,4 @@ protein_tool('AGFHGF', 'Ala-ala', 'polarity') - Dorzhi Badmadashiev: to_rna, define_charge functions - Ustin Zolotikov: to_dna, define_polarity functions - Margarita Beskrovnaia: main, is_correct_seq, change_abbreviation functions +![alt text](/team-HW4.jpg "Команда разработчиков") From 85382eef3b3ea8b1900df52ebb1ed11694f0dd64 Mon Sep 17 00:00:00 2001 From: Beskrovnaia Margarita Date: Sat, 30 Sep 2023 16:29:25 +0300 Subject: [PATCH 15/21] Create dir HW4_Zolotikov, rename HW4_Zolotikov to protein_tool.py and move files in new dir --- HW4_Zolotikov => HW4_Zolotikov/protein_tool.py | 0 team-HW4.jpg => HW4_Zolotikov/team-HW4.jpg | Bin 2 files changed, 0 insertions(+), 0 deletions(-) rename HW4_Zolotikov => HW4_Zolotikov/protein_tool.py (100%) rename team-HW4.jpg => HW4_Zolotikov/team-HW4.jpg (100%) diff --git a/HW4_Zolotikov b/HW4_Zolotikov/protein_tool.py similarity index 100% rename from HW4_Zolotikov rename to HW4_Zolotikov/protein_tool.py diff --git a/team-HW4.jpg b/HW4_Zolotikov/team-HW4.jpg similarity index 100% rename from team-HW4.jpg rename to HW4_Zolotikov/team-HW4.jpg From df3007d9a41d8c2f21ed85ed6009c79686e4794c Mon Sep 17 00:00:00 2001 From: BeskrovnaiaM <143890997+BeskrovnaiaM@users.noreply.github.com> Date: Sat, 30 Sep 2023 16:31:16 +0300 Subject: [PATCH 16/21] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2b3a415..3992186 100644 --- a/README.md +++ b/README.md @@ -127,4 +127,4 @@ protein_tool('AGFHGF', 'Ala-ala', 'polarity') - Dorzhi Badmadashiev: to_rna, define_charge functions - Ustin Zolotikov: to_dna, define_polarity functions - Margarita Beskrovnaia: main, is_correct_seq, change_abbreviation functions -![alt text](/team-HW4.jpg "Команда разработчиков") +![alt text](/HW4_Zolotikov/team-HW4.jpg "Команда разработчиков") From 0e82b721bade32bd14c941dc766b59c6b49389a0 Mon Sep 17 00:00:00 2001 From: glitchheadgit <122817935+glitchheadgit@users.noreply.github.com> Date: Sat, 30 Sep 2023 16:33:22 +0300 Subject: [PATCH 17/21] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2b3a415..0fd5bdd 100644 --- a/README.md +++ b/README.md @@ -100,7 +100,7 @@ Name's operation: "polarity". Counts polar and nonpolar aminoacids in sequence. Arguments: -- sequence: sequence in which we count polar and nonpolar aminoacids. +- sequence: sequence in which we count polar and nonpolar aminoacids. \newline Returns: - Dictionary with dictionary with keys 'Polar', 'Nonpolar' and appropriate aminoacid counters as values. ##### Example: From e193533e9f0dcdcd662de72ad6ec556ae4b41948 Mon Sep 17 00:00:00 2001 From: glitchheadgit <122817935+glitchheadgit@users.noreply.github.com> Date: Sat, 30 Sep 2023 16:37:28 +0300 Subject: [PATCH 18/21] Update README.md --- README.md | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 0fd5bdd..1f1a49d 100644 --- a/README.md +++ b/README.md @@ -59,9 +59,10 @@ Name's operation: "DNA". Transforms aminoacid sequence to according DNA sequence. Arguments: -- sequence: aminoacid sequence to transform into DNA. +- sequence: aminoacid sequence to transform into DNA. + Returns: -- String of according DNA sequence +- String of according DNA sequence. ##### Example: ```python protein_tool('AsDr', 'DNA') @@ -72,10 +73,13 @@ protein_tool('YWNGAS', 'DNA') ### to_rna(seq, rna_dict) Name's operation: "RNA". Translates an amino acid sequence into an RNA sequence. - + +Arguments: - seq: Amino acid sequence (str). -- rna_dict: Dictionary defining the correspondence of amino acids to RNA triplets (default, standard code). -- Returns: String or list of RNA sequences. +- rna_dict: Dictionary defining the correspondence of amino acids to RNA triplets (default, standard code). + +Returns: +- String or list of RNA sequences. ##### Example: ```python protein_tool('FM', 'RNA') @@ -100,7 +104,8 @@ Name's operation: "polarity". Counts polar and nonpolar aminoacids in sequence. Arguments: -- sequence: sequence in which we count polar and nonpolar aminoacids. \newline +- sequence: sequence in which we count polar and nonpolar aminoacids. \newline + Returns: - Dictionary with dictionary with keys 'Polar', 'Nonpolar' and appropriate aminoacid counters as values. ##### Example: From f76d7a23372e411911d444a5af76f09be3696b72 Mon Sep 17 00:00:00 2001 From: glitchheadgit <122817935+glitchheadgit@users.noreply.github.com> Date: Sat, 30 Sep 2023 16:39:16 +0300 Subject: [PATCH 19/21] Update README.md --- README.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 1f1a49d..72b76d8 100644 --- a/README.md +++ b/README.md @@ -88,11 +88,14 @@ protein_tool('FM', 'RNA') ### define_charge(seq, positive_charge, negative_charge) Name's operation: "charge". Counts the number of amino acids with positive charge, negative charge, and neutral amino acids in the sequence. - + +Arguments: - seq: Amino acid sequence (string). - positive_charge: List of amino acids with positive charge (default is ['R', 'K', 'H']). - negative_charge: List of amino acids with negative charge (default is ['D', 'E']). -- Returns: A dictionary (or list of dictionaries) containing the counts of amino acids and their labels. + +Returns: +- Dictionary (or list of dictionaries) containing the counts of amino acids and their labels. ##### Example: ```python @@ -107,7 +110,7 @@ Arguments: - sequence: sequence in which we count polar and nonpolar aminoacids. \newline Returns: -- Dictionary with dictionary with keys 'Polar', 'Nonpolar' and appropriate aminoacid counters as values. +- Dictionary with keys 'Polar', 'Nonpolar' and appropriate aminoacid counters as values. ##### Example: ```python protein_tool('ASDR', 'polarity') From a537b98705acbfe7ac71a6ece7e4d18ff7a0254a Mon Sep 17 00:00:00 2001 From: glitchheadgit <122817935+glitchheadgit@users.noreply.github.com> Date: Sat, 30 Sep 2023 18:28:19 +0300 Subject: [PATCH 20/21] Update typing protein_tool.py --- HW4_Zolotikov/protein_tool.py | 35 ++++++++++++++++------------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/HW4_Zolotikov/protein_tool.py b/HW4_Zolotikov/protein_tool.py index 6e32219..e7204b1 100644 --- a/HW4_Zolotikov/protein_tool.py +++ b/HW4_Zolotikov/protein_tool.py @@ -1,11 +1,11 @@ -from typing import Dict +from typing import Dict, List, Union # Dorzhi -def to_rna(seq, rna_dict = {'F': 'UUY', 'L': 'YUN', 'I': 'AUH', 'M': 'AUG', +def to_rna(seq: str, rna_dict: Dict[str, str] = {'F': 'UUY', 'L': 'YUN', 'I': 'AUH', 'M': 'AUG', 'V': 'GUN', 'S': 'WSN', 'P': 'CCN', 'T': 'ACN', 'A': 'GCN', 'Y': 'UAY', 'H': 'CAY', 'Q': 'CAR', 'N': 'AAY', 'K': 'AAR', 'D': 'GAY', 'E': 'GAR', - 'C': 'UGY', 'R': 'MGN', 'G': 'GGN', 'W': 'UGG'}): + 'C': 'UGY', 'R': 'MGN', 'G': 'GGN', 'W': 'UGG'}) -> str: """ Converts an amino acid sequence into an RNA sequence. @@ -22,13 +22,12 @@ def to_rna(seq, rna_dict = {'F': 'UUY', 'L': 'YUN', 'I': 'AUH', 'M': 'AUG', RNA sequence. """ - seq = seq.upper() result = ''.join(rna_dict[base] for base in seq) return result -def define_charge(seq, positive_charge = ['R', 'K', 'H'], - negative_charge = ['D', 'E']): +def define_charge(seq: str, positive_charge: List[str] = ['R', 'K', 'H'], + negative_charge: List[str] = ['D', 'E']) -> Dict[str, int]: """ Counts the number of amino acids with positive charge, negative charge, and neutral amino acids in the sequence. @@ -50,7 +49,6 @@ def define_charge(seq, positive_charge = ['R', 'K', 'H'], - 'Negative' for amino acids with negative charge. - 'Neutral' for neutral amino acids. """ - seq = seq.upper() positive_count = 0 negative_count = 0 neutral_count = 0 @@ -83,10 +81,10 @@ def define_polarity(seq: str) -> Dict[str, int]: Counts polar and nonpolar aminoacids in aminoacid sequences. Arguments: - - str: sequence to count polar and nonpolar aminoacids. + str: sequence to count polar and nonpolar aminoacids. Return: - - Dict[str, int]: + Dict[str, int]: Dictionary with keys 'Polar', 'Nonpolar' and values of quantity of according groups in sequence. """ polarity_count = {'Polar': 0, 'Nonpolar': 0} @@ -102,11 +100,13 @@ def to_dna(seq: str) -> str: """ Transforms aminoacid sequence to DNA sequence - Arguments: - - str: aminoacid sequence to transform to DNA sequence. + Arguments + --------- + str: aminoacid sequence to transform to DNA sequence. - Return: - - str: according DNA sequence. + Return + ------ + str: according DNA sequence. """ sequence_dna = [] for aminoacid in seq: @@ -129,12 +129,11 @@ def to_dna(seq: str) -> str: import sys -def change_abbreviation(seq): +def change_abbreviation(seq: str) -> str: """ Changes the amino acid abbreviation from three-letter to one-letter. Parametrs - ---------- seq : str Amino acid sequence in three-letter form. @@ -147,12 +146,11 @@ def change_abbreviation(seq): one_letter_seq = [ABBREVIATION_THREE_TO_ONE[amino_acid] for amino_acid in seq.split("-")] return "".join(one_letter_seq) -def is_correct_seq(seq): +def is_correct_seq(seq: str) -> bool: """ Check the sequence for extraneous characters. Parametrs - ---------- seq : str Amino acid sequence. @@ -167,12 +165,11 @@ def is_correct_seq(seq): check = unique_amino_acids <= AMINO_ACIDS_ONE_LETTER or unique_amino_acids_three <= AMINO_ACIDS_THREE_LETTER return check -def protein_tool(*args): +def protein_tool(*args: str) -> Union[str, List[Union[Dict[str, int], str]]]: """ Receives a request from the user and runs the desired function. Parametrs - ---------- seq : str Amino acid sequences. From d5716f4b8e037e65ca3a5be480f506be3b54aa04 Mon Sep 17 00:00:00 2001 From: glitchheadgit <122817935+glitchheadgit@users.noreply.github.com> Date: Sat, 30 Sep 2023 18:29:31 +0300 Subject: [PATCH 21/21] Update README.md --- README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 377894d..9c6db5c 100644 --- a/README.md +++ b/README.md @@ -54,12 +54,12 @@ protein_tool('aLa-CyS', 'one letter') #input ignore letter's size protein_tool('Ala-Cys', 'Ala', 'one letter') ['AC', 'A'] ``` -### to_dna(seq: str) -> str +### to_dna(seq) Name's operation: "DNA". Transforms aminoacid sequence to according DNA sequence. Arguments: -- sequence: aminoacid sequence to transform into DNA. +- sequence: aminoacid sequence to transform into DNA. Returns: - String of according DNA sequence. @@ -73,12 +73,12 @@ protein_tool('YWNGAS', 'DNA') ### to_rna(seq, rna_dict) Name's operation: "RNA". Translates an amino acid sequence into an RNA sequence. - + Arguments: - seq: Amino acid sequence (str). -- rna_dict: Dictionary defining the correspondence of amino acids to RNA triplets (default, standard code). +- rna_dict: Dictionary defining the correspondence of amino acids to RNA triplets (default, standard code). -Returns: +Returns: - String or list of RNA sequences. ##### Example: ```python @@ -88,13 +88,13 @@ protein_tool('FM', 'RNA') ### define_charge(seq, positive_charge, negative_charge) Name's operation: "charge". Counts the number of amino acids with positive charge, negative charge, and neutral amino acids in the sequence. - + Arguments: - seq: Amino acid sequence (string). - positive_charge: List of amino acids with positive charge (default is ['R', 'K', 'H']). - negative_charge: List of amino acids with negative charge (default is ['D', 'E']). - -Returns: + +Returns: - Dictionary (or list of dictionaries) containing the counts of amino acids and their labels. ##### Example: @@ -102,12 +102,12 @@ Returns: protein_tool('ASDRKHDE', 'charge') {'Positive': 3, 'Negative': 3, 'Neutral': 2} ``` -### define_polarity(seq: str) -> dict +### define_polarity(seq) Name's operation: "polarity". Counts polar and nonpolar aminoacids in sequence. Arguments: -- sequence: sequence in which we count polar and nonpolar aminoacids. \newline +- sequence: sequence in which we count polar and nonpolar aminoacids. \newline Returns: - Dictionary with keys 'Polar', 'Nonpolar' and appropriate aminoacid counters as values.