|
Практикум 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"
|
|
|