-
Notifications
You must be signed in to change notification settings - Fork 45
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
base: main
Are you sure you want to change the base?
Hw4_Grigoriants #19
Conversation
Add 'search_for_alt_frames' and 'convert_to_nucl_acids' functions
…into HW4_Grigoriants
Add three_one_letter_code and define_molecular_weight functions
…into HW4_Grigoriants
## 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*. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Супер!
HW4_Grigoriants/dictionaries.py
Outdated
@@ -0,0 +1,106 @@ | |||
amino_acids = { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Поскольку это константа, то имя переменной должно быть в uppercase
HW4_Grigoriants/dictionaries.py
Outdated
"w": "trp", | ||
"y": "tyr", | ||
} | ||
translation_rule = { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Поскольку это константа, то имя переменной должно быть в uppercase
HW4_Grigoriants/dictionaries.py
Outdated
"G": "GGC", | ||
"g": "ggc", | ||
} | ||
amino_acid_weights = { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Поскольку это константа, то имя переменной должно быть в uppercase
HW4_Grigoriants/protein_tools.py
Outdated
if "-" not in sequence: | ||
for letter in sequence: | ||
inversed_sequence += dictionaries.amino_acids[letter] + "-" | ||
inversed_sequence = inversed_sequence[:-1] | ||
inversed_sequences.append(inversed_sequence) |
There was a problem hiding this comment.
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] не было бы
HW4_Grigoriants/protein_tools.py
Outdated
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) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Очень много уровней вложенности
HW4_Grigoriants/protein_tools.py
Outdated
for sequence in sequences: | ||
sequence_weight = 0 | ||
for letter in sequence: | ||
sequence_weight += dictionaries.amino_acid_weights[letter.upper()] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Это хорошо, если учесть, что идет обращение к единственному словарю, где все а\к записаны один раз в upper-case!
There was a problem hiding this comment.
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 мы теряем уникальность исходного регистра.
Или есть какой-то дополнительный метод, который позволит нам это сделать?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Например, это можно сделать проверкой .isupper()
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Спасибо!
print(f"Sequence: {sequence}") | ||
print(f"Motif: {motif}") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Юзер-френдли вывод!
if overlapping: | ||
start += 1 | ||
else: | ||
start += len(motif) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Красиво!
HW4_Grigoriants/protein_tools.py
Outdated
rule_of_translation = sequences[0].maketrans(dictionaries.translation_rule) | ||
rule_of_transcription = sequences[0].maketrans("AaUuCcGg", "TtAaGgCc") |
There was a problem hiding this comment.
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": |
There was a problem hiding this comment.
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)
будет работать тоже исправно, и без создания лишних словарей
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
У меня так не работает(
Только через maketrans переводит
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Тут согласна, прошу прощения
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Спасибо за замечания! Я в процессе разгребания всех этих словарей сама хоть маленько разобралась)
HW4_Grigoriants/protein_tools.py
Outdated
if sequence == sequences[-1]: | ||
del nucl_acid_seqs["RNA"] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ненужная проверка, можно было сразу удалить и без условия
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Удалять без условия внутри цикла нельзя, потому что он удалит на первой же итерации, а уже на второй упадает с ошибкой, что удалять нечего, т.к удалил на первой итерации. Потому проверяем условие, что итерация последняя
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Таких пометки было две(для РНК и ДНК), случайно зарезолвил одну😅
HW4_Grigoriants/protein_tools.py
Outdated
if nucl_acids == "both": | ||
nucl_acid_seqs["RNA"].append(rna_seq) | ||
nucl_acid_seqs["DNA"].append(dna_seq) | ||
return nucl_acid_seqs |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Код функции переусложнен, но идея понятная и хорошая,
Вывод очень user-friendly - круто!
HW4_Grigoriants/protein_tools.py
Outdated
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, | ||
} |
There was a problem hiding this comment.
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"] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Отлично!
HW4_Grigoriants/protein_tools.py
Outdated
allowed_inputs = set(dictionaries.amino_acids.keys()).union( | ||
set(dictionaries.amino_acids.values()) | ||
) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Тоже хорошо!
HW4_Grigoriants/protein_tools.py
Outdated
if procedure != "three_one_letter_code": | ||
allowed_inputs -= set(dictionaries.amino_acids.values()) |
There was a problem hiding this comment.
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", то только тогда объединять множества, иначе получается две лишние операции для всех функций, кроме одной ( И туда же добавлять "-"
HW4_Grigoriants/protein_tools.py
Outdated
if procedure == "three_one_letter_code" and "-" in sequence: | ||
allowed_inputs_seq -= set(dictionaries.amino_acids.keys()) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Это тоже лишние операции
Лучше добавлять при необходимости, чем сначала делать большое множество, и потом из него что-то удалять
HW4_Grigoriants/protein_tools.py
Outdated
if not all( | ||
aminoacids in allowed_inputs_seq for aminoacids in sequence.split("-") | ||
): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Т.к. allowed_inputs_seq является множеством, то не надо итерироваться по всей послед-ти и элементам множества, а достаточно использовать методы множеств:
if not all( | |
aminoacids in allowed_inputs_seq for aminoacids in sequence.split("-") | |
): | |
if not set(sequence.split("-")).issubset(allowed_inputs_seq): |
HW4_Grigoriants/protein_tools.py
Outdated
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") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Концептуально те же комментарии, что были выше: ненужные операции над сетами (добавлять\удалять что-то из сетов занимает больше времени, чем в случае списков, так что по возможности надо таких операций как можно меньше делать), ненужная итерация по всем эл-там последовательности и множества, неоптимальный код
Хорошая работа!
|
Пересчет баллов: README 2.4 (-докстринги, вставленные прямо в текст ридми) -0.1 нейминг констант |
Спасибо за тщательную проверку и полезные комментарии👍 Вид инпута - супер субъективно, никаких ограничений на это не давалось от Никиты, а список это стандартизованно. Про возможность вставки докстринга в ридми говорил Никита на лекции - потому так и сделали. Все, что «неоптимально» - использовали то, чему Никита успел научить и что сами успели вычитать 💁🏻♂️ В целом, как кажется мне и знакомому преподавателю плюсов на физтехе, - снимать за такие недочеты баллы - не очень справедливо. Во все формальные критерии мы уложились, все что больше - от лукавого :) На будущее - либо продумывайте лучше формальные критерии ( например, время обработки одной последовательности для каждой из функций не должно превышать х), либо оставляйте пожелания в виде комментариев, но не снимайте баллы за то, что мы не соответствуем негласным критериям. Они неочевидны, совсем. |
No description provided.