Home About Materials FBB site

Практикум 10. Функции и модули. Исключения. Работа с сетью.

Задание 1. Факториал. Мнемоника: factorial.

Напишите рекурсивную версию функции, вычисляющей факториал. Учтите, что факториал от числа, меньшего либо равного 0, равен 1. Программа принимает n из командной строки и выводит n! на новой строке.

''' This script calculates the factorial of a number ''' from sys import argv def factorial(numb): ''' factorial ''' if numb > 0: fact = numb*(factorial(numb=numb-1)) return fact if numb <= 0: return 1 if len(argv) > 1: print factorial(numb=int(argv[1]))

Задание 2. Вещественное число? Мнемоника: is-float.

Напишите программу, принимающую строку из командной строки и возвращающую 'Is float', если она может быть стандартным образом интерпретирована как вещественное число и "Is not float", если не может (целые числа тоже относятся к вещественным).

''' This script takes some text as argv[1] and defines it as float or not-float. ''' from sys import argv if len(argv) > 1: try: float(argv[1]) print "Is float" except ValueError: print "Is not float"

Задание 3. Скачай pdb. Мнемоника: fetch-pdb.

Каждая запись банка PDB имеет свой идентификатор (PDB-код), например: 1CRM, 1XYZ, 1BL0, 9MHT. Как видно из приведённых примеров, PDB-код состоит из четырёх символов, первый из которых — ненулевая цифра, а остальные три — либо цифра, либо заглавная латинская буква. По адресу https://files.rcsb.org/download/<код.pdb> лежит структура с соответствующим кодом. К примеру, по адресу https://files.rcsb.org/download/4ATE.pdb лежит структура белка бета-порфириназы.
Ваша задача — написать программу, принимающую из командной строки:
1-й аргумент: PDB-код;
2-й аргумент: имя выходного файла, куда надо сохранить полученную структуру;
и сохраняющую структуру в выходной файл.
Если структуры с поданным кодом не существует (urlopen выдал ошибку), то вывести в консоль "Code does not exist".

''' This script takes a pdb-code as argv[1] and puts all the related information found in protein database into the file taken as argv[2]. ''' from sys import argv import urllib2 if len(argv) > 2: code = argv[1] outfile = argv[2] link = "https://files.rcsb.org/download/"+code+".pdb" try: url = urllib2.urlopen(link) outf = open(outfile, "w") for line in url: outf.write(line) outf.close() url.close() except urllib2.HTTPError: print "Code does not exist"

Задание 4. Конвейер из средних . Мнемоника: multi-average.

Программа принимает на вход список файлов (не менее одного), каждый из которых имеет формат, описанный в задании предыдущего практикума average. Часть файлов может содержать не только числа, часть файлов может не существовать.
Программа должна:
Для каждого файла на новой строке, в том порядке, в котором они были поданы скрипту в командной строке, вывести в терминал:
среднее, если файл содержит только числа;
"File <имя> has wrong format", если файл содержит не только числа;
"Error reading file <имя>", если произошла ошибка чтения файла (к примеру, его не существует).

''' This script takes some file names as arguments and prints the average of the numbers in the first line of these files. ''' from sys import argv if len(argv) > 1: for i in argv[1:]: normfile = 1 try: txt = open(i, "r") except IOError: print "Error reading file", i normfile = 0 if normfile == 1: txt = open(i, "r") line = txt.readline().split() length = len(line) normfloat = 1 for j in line: try: float(j) except ValueError: print "File", i, "has wrong format" normfloat = 0 break if normfloat == 1: summa = 0 for j in line: summa += float(j) print summa/length

Задание 5. Разбор строки атома в формате pdb. Мнемоника: parse-pdb.

Напишите программу, которая принимает в качестве первого аргумента командной строки идентификатор записи банка PDB (PDB-код) и создаёт файл (имя передается вторым аргументом), содержащий таблицу с информацией только о так называемых "Ca-атомах". В PDB-файле эти атомы описаны в строках, начинающихся со слова ATOM и имеющих в позициях 13–16 подстроку " CA " (в начале и в конце — по пробелу).
Если структуры с поданным кодом не существует (urlopen выдал ошибку), то вывести в консоль "Code does not exist". Выходной файл должен представлять собой таблицу, чьи колонки имеют следующие заголовки: Residue Chain Number X Y Z (разделенные табуляторами)

''' This script takes the pdb-code and the name of an out_file as arguments and prints some information about Ca-atoms it has found. ''' from sys import argv import urllib2 if len(argv) > 2: code = argv[1] outfile = argv[2] link = "https://files.rcsb.org/download/"+code+".pdb" try: url = urllib2.urlopen(link) pdb = open("pdb.txt", "w") for line in url: pdb.write(line) pdb.close() inf = open("pdb.txt", "r") outf = open(outfile, "w") outf.write("Residue\tChain\tNumber\tX\tY\tZ\n") for line in inf: if line.find(" CA ") == 12 and line.find("ATOM") == 0: outf.write(line[17:20].strip()+"\t"+line[21].strip()+"\t" +line[22:26].strip()+"\t"+line[30:38].strip()+"\t" +line[38:46].strip()+"\t"+line[46:54].strip()+"\n") inf.close() outf.close() except urllib2.HTTPError: print "Code does not exist"

Задание 6. Центр лиганда . Мнемоника: get-center.

Напишите программу, которая принимает на вход PDB-код и название лиганда в структуре и выводит на консоль идентификаторы (цепь и номер в цепи) всех молекул лиганда с данным названием, а также геометрические центры каждой из этих молекул. Если структуры с поданным кодом не существует (urlopen выдал ошибку), то вывести в консоль "Code does not exist".
Указания.
Информация об атомах лигандов в PDB-файле содержится в строках, начинающихся с HETATM. Каждой молекуле лиганда сопоставлен идентификатор цепи, к которой он приписан, и номер в этой цепи. Необходимо самостоятельно определить, где расположена информация о названии лиганда, цепи и номере молекулы. Примеры записей PDB с несколькими лигандами: 2DN1 (лиганд HEM), 5M2T (лиганды URI, EDO, CL, MG, NA), 5NH5 (лиганды SO4, GOL, FE2, CA, MG). Каждая координата геометрического центра набора точек получается как среднее арифметическое соответствующих координат всех точек набора.

''' This script takes the name of pdb-file, the code and the ligand as arguments and prints some information about different molecules of ligands appearing in the pdb-file (chain ID, residue sequence number and 3 coordinates of the molecule's geometrical center). ''' from sys import argv import urllib2 if len(argv) > 2: code = argv[1] ligand = argv[2] link = "https://files.rcsb.org/download/"+code+".pdb" try: url = urllib2.urlopen(link) pdb = open("pdb.txt", "w") for line in url: pdb.write(line) pdb.close() url.close() chain = dict() coordinates = dict() pdb = open("pdb.txt", "r") for line in pdb: if line.find("HETATM") == 0 and (line[20] == ligand or line[18:20] == ligand or line[17:20] == ligand or line[16:20] == ligand): if line[21:26] not in chain.keys(): chain[line[21:26]] = [line[21], line[22:26]] if line[21:26] in coordinates.keys(): atoms += 1 coordinates[line[21:26]].append([line[30:38], line[38:46], line[46:54], atoms]) if line[21:26] not in coordinates.keys(): atoms = 1 coordinates[line[21:26]] = [[line[30:38], line[38:46], line[46:54], atoms]] for key in coordinates: X = Y = Z = 0 for i in coordinates[key]: X += float(i[0]) Y += float(i[1]) Z += float(i[2]) amount = coordinates[key][-1][-1] Xc = format(X/amount, ".3f") Yc = format(Y/amount, ".3f") Zc = format(Z/amount, ".3f") coordinates[key] = [Xc, Yc, Zc] for key in coordinates: print chain[key][0].strip()+"\t"+chain[key][1].strip()+"\t"+str(coordinates[key][0])+"\t"+str(coordinates[key][1])+"\t"+str(coordinates[key][2]) except urllib2.HTTPError: print "Code does not exist"


© Титова Алена, 2017