Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Hw4_Grigoriants #19

Open
wants to merge 46 commits into
base: main
Choose a base branch
from
Open

Conversation

VovaGrig
Copy link

@VovaGrig VovaGrig commented Oct 1, 2023

No description provided.

VovaGrig and others added 30 commits September 27, 2023 13:10
Add 'search_for_alt_frames' and 'convert_to_nucl_acids' functions
Add three_one_letter_code and define_molecular_weight functions
Comment on lines +9 to +21
## Usage
The programm is based on `run_protein_tools` function that takes the list of **one-letter amino acid sequences**, a name of procedure and a relevant argument. If you have three-letter amino acids sequences you could convert them by using `three_one_letter_code` procedure in advance. Please convert your three-letter coded sequences with `three_one_letter_code` procedure before using any other procedures on them.

To start with the program run the following command:

`run_protein_tools(sequences, procedure="procedure", ...)`

Where:
- sequences - positional argument, a list of protein sequences
- procedure - keyword argument, a type of procedure to use that is inputed in *string* type
- ... - an additional keyword arguments that are to be inputed in *string* type
-
Before start, check the *Options* and *Examples*.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Супер!

@@ -0,0 +1,106 @@
amino_acids = {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Поскольку это константа, то имя переменной должно быть в uppercase

"w": "trp",
"y": "tyr",
}
translation_rule = {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Поскольку это константа, то имя переменной должно быть в uppercase

"G": "GGC",
"g": "ggc",
}
amino_acid_weights = {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Поскольку это константа, то имя переменной должно быть в uppercase

Comment on lines 27 to 31
if "-" not in sequence:
for letter in sequence:
inversed_sequence += dictionaries.amino_acids[letter] + "-"
inversed_sequence = inversed_sequence[:-1]
inversed_sequences.append(inversed_sequence)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Проще было бы собирать аминокислоты в список, а потом через join добавить "-"
Так и костыля inversed_sequence = inversed_sequence[:-1] не было бы

Comment on lines 33 to 38
aa_splitted = sequence.split("-")
for aa in aa_splitted:
inversed_sequence += list(dictionaries.amino_acids.keys())[
list(dictionaries.amino_acids.values()).index(aa)
]
inversed_sequences.append(inversed_sequence)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Очень много уровней вложенности

for sequence in sequences:
sequence_weight = 0
for letter in sequence:
sequence_weight += dictionaries.amino_acid_weights[letter.upper()]

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Это хорошо, если учесть, что идет обращение к единственному словарю, где все а\к записаны один раз в upper-case!

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А вот вопрос. В задании нам требовалось оставлять регистр символов в исходном формате. Т. е. 'Rm' -> 'Arg-met'
А как нам сделать один словарь только в upper-case, если нам нужен чувствительный регистр?
Грубо говоря, в молекулярном весе нам в этом нет необходимости, но в остальных функциях это требуется.
И при переводе в lower- upper-case мы теряем уникальность исходного регистра.
Или есть какой-то дополнительный метод, который позволит нам это сделать?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Например, это можно сделать проверкой .isupper()

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Спасибо!

Comment on lines +97 to +98
print(f"Sequence: {sequence}")
print(f"Motif: {motif}")

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Юзер-френдли вывод!

Comment on lines +105 to +108
if overlapping:
start += 1
else:
start += len(motif)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Красиво!

Comment on lines 169 to 170
rule_of_translation = sequences[0].maketrans(dictionaries.translation_rule)
rule_of_transcription = sequences[0].maketrans("AaUuCcGg", "TtAaGgCc")

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Зачем каждый раз при вызове функций заново создавать одинаковые словари? Если делать так, то уж выносить в константу

for sequence in sequences:
rna_seq = sequence.translate(rule_of_translation)
dna_seq = rna_seq.translate(rule_of_transcription)
if nucl_acids == "RNA":

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Переусложнение кода,
seq.translate(dictionaries.translation_rule)
будет работать тоже исправно, и без создания лишних словарей

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

У меня так не работает(
Только через maketrans переводит

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тут согласна, прошу прощения

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Спасибо за замечания! Я в процессе разгребания всех этих словарей сама хоть маленько разобралась)

Comment on lines 181 to 182
if sequence == sequences[-1]:
del nucl_acid_seqs["RNA"]

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ненужная проверка, можно было сразу удалить и без условия

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Удалять без условия внутри цикла нельзя, потому что он удалит на первой же итерации, а уже на второй упадает с ошибкой, что удалять нечего, т.к удалил на первой итерации. Потому проверяем условие, что итерация последняя

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Таких пометки было две(для РНК и ДНК), случайно зарезолвил одну😅

Comment on lines 183 to 186
if nucl_acids == "both":
nucl_acid_seqs["RNA"].append(rna_seq)
nucl_acid_seqs["DNA"].append(dna_seq)
return nucl_acid_seqs

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Код функции переусложнен, но идея понятная и хорошая,
Вывод очень user-friendly - круто!

Comment on lines 189 to 195
procedures_to_functions = {
"search_for_motifs": search_for_motifs,
"search_for_alt_frames": search_for_alt_frames,
"convert_to_nucl_acids": convert_to_nucl_acids,
"three_one_letter_code": three_one_letter_code,
"define_molecular_weight": define_molecular_weight,
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Надо сделать константой

"""
if len(sequences) == 0:
raise ValueError("No sequences provided")
procedure = kwargs["procedure"]

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Отлично!

Comment on lines 218 to 220
allowed_inputs = set(dictionaries.amino_acids.keys()).union(
set(dictionaries.amino_acids.values())
)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тоже хорошо!

Comment on lines 222 to 223
if procedure != "three_one_letter_code":
allowed_inputs -= set(dictionaries.amino_acids.values())

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Лучше бы наоборот, если procedure == "three_one_letter_code", то только тогда объединять множества, иначе получается две лишние операции для всех функций, кроме одной ( И туда же добавлять "-"

Comment on lines 226 to 227
if procedure == "three_one_letter_code" and "-" in sequence:
allowed_inputs_seq -= set(dictionaries.amino_acids.keys())

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Это тоже лишние операции
Лучше добавлять при необходимости, чем сначала делать большое множество, и потом из него что-то удалять

Comment on lines 228 to 230
if not all(
aminoacids in allowed_inputs_seq for aminoacids in sequence.split("-")
):

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Т.к. allowed_inputs_seq является множеством, то не надо итерироваться по всей послед-ти и элементам множества, а достаточно использовать методы множеств:

Suggested change
if not all(
aminoacids in allowed_inputs_seq for aminoacids in sequence.split("-")
):
if not set(sequence.split("-")).issubset(allowed_inputs_seq):

Comment on lines 233 to 236
allowed_inputs_seq.remove("-")
allowed_inputs_seq -= set(dictionaries.amino_acids.values())
if not all(aminoacids in allowed_inputs_seq for aminoacids in sequence):
raise ValueError("Invalid sequence given")

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Концептуально те же комментарии, что были выше: ненужные операции над сетами (добавлять\удалять что-то из сетов занимает больше времени, чем в случае списков, так что по возможности надо таких операций как можно меньше делать), ненужная итерация по всем эл-там последовательности и множества, неоптимальный код

@pavlovanadia
Copy link

Хорошая работа!

  • Отличный README, правда, докстринг в него вставлять не стоит, лучше информацию о функциях писать в более user-friendly формате
  • Отличные примеры запуска программы, хорошо описаны ошибки. В общем, README огонь (+0.2 балла за фото команды!)
  • Улучшить README можно, помимо удаления докстринг, еще добавив просто общий список команд куда-то, до подробного описания каждой
  • Программа не работает с любым кол-вом аргументов. Если хочется ввести несколько последовательностей, то принимаются они только в списке. Одна последовательность - тоже должна быть в списке длиной 1, в общем, довольно неудобный формат ввода аргументов. Если дается одна послед-ть в виде строки, то все опции будут применяться к каждой а\к независимо, но не к последовательности. Очень хорошо, что такой формат ввода прописан в README, но это все еще не очень user-friendly
  • Словари dictionaries занимают в два раза больше памяти, чем могли бы, потому что все а\к там записаны и в uppercase, и в lowercase. Проще было бы в коде применять эту операцию.
  • Здорово, что константы вынесены в отдельный файл, но константы принять называть заглавными буквами
  • В коде много неоптимальных частей: лишние проверки, лишние изменения множества, итерация по элементам множества

@pavlovanadia
Copy link

Пересчет баллов:

README 2.4 (-докстринги, вставленные прямо в текст ридми)
three_one_letter_code - 1.2 (проблема типизации, неоптимальное добавление)
define_molecular_weight - 1.4 (типизация)
search_for_motifs - 1.5
search_for_alt_frames - 1.4 (типизация)
convert_to_nucl_acids - 1.3 (ненужные проверки в цикле)

-0.1 нейминг констант
-0.2 вид инпута
-0.2 вычитания множеств и прочее
-0.2 итерация по послед-ти и множеству
+0.2 доп балл за фото

@VovaGrig
Copy link
Author

VovaGrig commented Oct 6, 2023

Спасибо за тщательную проверку и полезные комментарии👍

Вид инпута - супер субъективно, никаких ограничений на это не давалось от Никиты, а список это стандартизованно.

Про возможность вставки докстринга в ридми говорил Никита на лекции - потому так и сделали.

Все, что «неоптимально» - использовали то, чему Никита успел научить и что сами успели вычитать 💁🏻‍♂️

В целом, как кажется мне и знакомому преподавателю плюсов на физтехе, - снимать за такие недочеты баллы - не очень справедливо.
Можно же просто вставить как комментарии нам на будущее.

Во все формальные критерии мы уложились, все что больше - от лукавого :)

На будущее - либо продумывайте лучше формальные критерии ( например, время обработки одной последовательности для каждой из функций не должно превышать х), либо оставляйте пожелания в виде комментариев, но не снимайте баллы за то, что мы не соответствуем негласным критериям. Они неочевидны, совсем.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants