linguagem de programação python - azevedolab.net · até o momento vimos dados do tipo...

62
© 2016 Dr. Walter F. de Azevedo Jr. 1 000000000000000000000000000000000000000 000000000000000000000000000000000000000 000000000000000000000000010000000000000 000000000000000000000111111111100000000 000000000000000000001111110000000000110 000000000000110000001111100000000111110 000000000001000011001111111111111111000 000000000010001110110001111111000000000 000000000011111111111111111111111110000 000001111111111111111111111111111110000 000000111111111111111111111111110000000 000000000111111111111111111111000000000 000000000111111111111111110000000000000 000000000111111111111111111110000000000 000000001111101111111111111111000000000 000000001111100111111111111111000000000 000000000000111111111111110011100000000 000000000000001111111110111111100000000 000000000000001110000011101100000000000 000000000000000000011111001100000000000 000000000000000000000000110000000000000 000000000000000000000000000000000000000 000000000000000000000000000000000000000 000000000000000000000000000000000000000 000000000000000000000000000000000000000 azevedolab.net

Upload: halien

Post on 02-Jan-2019

216 views

Category:

Documents


0 download

TRANSCRIPT

©2

01

6 D

r. W

alte

r F.

de

Aze

ve

do

Jr.

1

000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000111111111100000000000000000000000000001111110000000000110000000000000110000001111100000000111110000000000001000011001111111111111111000000000000010001110110001111111000000000000000000011111111111111111111111110000000001111111111111111111111111111110000000000111111111111111111111111110000000000000000111111111111111111111000000000000000000111111111111111110000000000000000000000111111111111111111110000000000000000001111101111111111111111000000000000000001111100111111111111111000000000000000000000111111111111110011100000000000000000000001111111110111111100000000000000000000001110000011101100000000000000000000000000000011111001100000000000000000000000000000000000110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

azevedolab.net

2

Estrutura de Dados em Python

www.python.org

Até o momento vimos dados do tipo sequência, que são strings e números, bem como

listas, que são formas de colocarmos um conjunto de dados e relacioná-los com sua

posição numa lista, por exemplo, à variável my_list foi atribuída uma lista com o código

de três letras para os aminoácidos, como segue:

Assim, se quisermos mostrar todo o conteúdo atribuído à variável my_list, basta

usarmos um loop for e colocarmos uma função print(), como mostrado abaixo.

A execução do código mostrará um aminoácido por linha, o arquivo showAA1.py tem o

código do programa.

my_list =["ALA","ARG","ASN","ASP","CYS","GLU","GLN","GLY","HIS","ILE",

"LEU","LYS","MET","PHE","PRO","SER","THR","TRP","TYR","VAL"]

for aa in my_list:

print(aa)

3

Estrutura de Dados em Python

www.python.org

Outra estrutura de dados disponível em Python é chamada dicionário. Funciona com

se fosse um dicionário comum, onde temos associada a um verbete uma definição.

Assim, na definição de um dicionário em Python, teremos pares, onde para uma

chave colocada à esquerda, teremos um valor à direita. Vejamos um exemplo, o

dicionário my_dict tem o código de uma letra para os aminoácidos (chaves) e, à cada

chave, foi atribuída uma string com o código de três letras (valor), como indicado

abaixo:

Cada definição do dicionário é chamada de item, assim temos 20 itens em my_dict.

Para chamarmos uma definição do dicionário, podemos usar a chave para recuperar o

valor, como segue:

A função print(my_dict[“A”]) mostrará o valor atribuído à string “A”, ou seja, “ALA”.

my_dict ={"A": "ALA","R": "ARG","N": "ASN","D": "ASP",

"C": "CYS","E": "GLU","Q": "GLN","G": "GLY",

"H": "HIS","I": "ILE","L": "LEU","K": "LYS",

"M": "MET","F": "PHE","P": "PRO","S": "SER",

"T": "THR","W": "TRP","Y": "TYR","V": "VAL“

}

print(my_dict[“A”])

4

Estrutura de Dados em Python

www.python.org

Vejamos o programa showAA2.py, que mostra os valores associados às chaves que

trazem os códigos de uma letra.

No código temos a lista my_list com os aminoácidos, com o código de uma letra. No

dicionário, temos associado à cada código de uma letra o valor com a string com três

letras. O loop for mostra para cada chave lida da lista my_list, o valor associado. O

resultado é que temos os códigos de três letras para cada aminoácido mostrado na

tela. Veja que na formação de qualquer dicionário, sempre temos um elemento à

esquerda, chamado de chave, separado por dois pontos (:), associado a um valor, que

pode ser um número, string ou lista.

# Program to demonstrate the use of dictionaries in Python

# Dictionary for amino acid

my_dict ={"A": "ALA","R": "ARG","N": "ASN","D": "ASP",

"C": "CYS","E": "GLU","Q": "GLN","G": "GLY",

"H": "HIS","I": "ILE","L": "LEU","K": "LYS",

"M": "MET","F": "PHE","P": "PRO","S": "SER",

"T": "THR","W": "TRP","Y": "TYR","V": "VAL"}

# List of amino acids (one-letter code)

my_list =["A","R","N","D","C","E","Q","G","H","I",

"L","K","M","F","P","S","T","W","Y","V"]

# Loop for to show the three-letter codes for amino acids

for aa in my_list:

print(my_dict[aa])

5

Estrutura de Dados em Python

www.python.org

Dicionários, como as listas, são de uso comum em programas desenvolvidos para

bioinformática. Veremos um programa para calcular a massa molecular de uma

proteína, a partir da leitura da sua sequência de aminoácidos, armazenada num

arquivo FASTA. O programa fará uso do seguinte dicionário.

Veja, na definição de um dicionário em Python, podemos deixar todos os itens numa

linha somente, ou pularmos linhas, como no exemplo acima. Fica a critério do

programador.

aaMW = {"A": 71.0779,"R": 156.1857,"N": 114.1026,"D": 115.0874,

"C": 103.1429,"E": 129.114,"Q": 128.1292,"G": 57.0513,

"H": 137.1393,"I": 113.1576,"L": 113.1576,"K": 128.1723,

"M": 131.1961,"F": 147.1739,"P": 97.1152,"S": 87.0773,

"T": 101.1039,"W": 186.2099,"Y": 163.1733,"V": 99.1311

}

Resumo

Programa para calcular a massa molecular de proteínas, a partir da sequência

lida de um arquivo no formato FASTA. O usuário fornecerá o nome do arquivo

FASTA. O programa calcula a massa molecular, a partir da informação sobre a

estrutura primária da proteína. Será usado um dicionário, para armazenar a

informação sobre a massa molecular de cada aminoácido.

Massa molecular de proteínas (versão 1)

Programa: proteinMW1.py

6

Programa: proteinMW1.py

www.python.org

# Program to calculate the molecular weight of a protein using the information stored

# in a FASTA file

mw = 0

# Source for residue molecular weights: http://www.matrixscience.com/help/aa_help.html (Accessed

# on May 8th 2014)

# To calculate the mass of a neutral peptide or protein, sum the residue masses plus the masses

# of the terminating

# groups (e.g. H at the N-terminus and OH at the C-terminus).

aaMW = {"A": 71.0779,"R": 156.1857,"N": 114.1026,"D": 115.0874,

"C": 103.1429,"E": 129.114,"Q": 128.1292,"G": 57.0513,

"H": 137.1393,"I": 113.1576,"L": 113.1576,"K": 128.1723,

"M": 131.1961,"F": 147.1739,"P": 97.1152,"S": 87.0773,

"T": 101.1039,"W": 186.2099,"Y": 163.1733,"V": 99.1311

}

7

Definimos um dicionário com a massa molecular de cada aminoácido (valor),

associada a cada código de uma letra do aminoácido (chave)

Programa: proteinMW1.py

www.python.org

Dicionário com a massa molecular

# Reads input file name

fastaIn = input("\nGive the input file name => ")

fh = open(fastaIn,'r') # Opens input file

seqIn = fh.readlines() # Reads all of the lines in a file and returns them as elements in a list

fh.close() # Closes input file

# Removes the item at the given position in the list, and return it.

seqIn.pop(0) # Removes first element of the list (get rid of the first line)

# Transforms list in string, so we will not get error with .replace()

seq=''.join(seqIn)

# Removes all "/n" from the string seq

seq = seq.replace("\n","")

for aa in seq:

mw += float(aaMW[aa])

mw = mw + 18.0148 # Sums water molecule

print("\nThe protein weighs",mw," Daltons")

8

Depois da leitura da sequência, como visto em programas anteriores, temos a string

seq. Usamos um loop for, destacado em vermelho, para atribuirmos o valor da massa

molecular de cada aminoácido à variável mw. Somamos ao final a massa molecular

referente aos terminais da proteína. Por último, mostramos o resultado na tela.

Programa: proteinMW1.py

www.python.org

Leitura e edição da sequência de aminoácidos

Loop for para somar as massas dos aminoácidos

Give the input file name => 1kxy.fasta

The protein weighs 14312.020100000016 Daltons

9

Usando-se o programa para o arquivo FASTA 1kxy.fasta, obtemos o resultado abaixo.

Programa: proteinMW1.py

www.python.org

# Shows result

print("\nThe protein weighs %8.3f"%mw," Daltons")

10

Podemos formatar a saída da função print(), para definirmos o número de casas de

um número de ponto flutuante (float) com o símbolo %. A linha abaixo traz uma função

print(), para mostrar a massa molecular com até oito casas, sendo três casas após o

ponto decimal. O Programa proteinMW1a.py traz esta modificação.

Programa: proteinMW1a.py

www.python.org

Indica até oito algarismos

Força o uso de três algarismos, após o ponto decimal

O símbolo %, dentro da função print(), indica o uso de formatação

O símbolo f, depois do % mas dentro da função print(), indica o uso de

formatação de ponto flutuante

O símbolo %, fora das aspas mas dentro da função print(), indica

que a variável à direita (mw) seguirá a formatação indicada

Give the input file name => 1kxy.fasta

The protein weighs 14312.020 Daltons

11

Programa: proteinMW1a.py

www.python.org

Usando-se o programa proteinMW1a.py, para o arquivo FASTA 1kxy.fasta, obtemos o

resultado abaixo.

Resumo

Programa para calcular a massa molecular de proteínas e a porcentagem em

massa de cada aminoácido presente na sequência. O programa lê a sequência

de um arquivo no formato FASTA. O usuário fornecerá o nome do arquivo

FASTA. O programa calcula a massa molecular e a porcentagem em massa dos

aminoácidos, a partir da informação sobre a estrutura primária da proteína. Será

usado um dicionário para armazenar a informação sobre a massa molecular de

cada aminoácido.

Massa molecular de proteínas (versão 2)

Programa: proteinMW2.py

12

Programa: proteinMW2.py

www.python.org

# Sets initial molecular weight variable (mw) to zero

mw = 0

# Source for residue molecular weights: http://www.matrixscience.com/help/aa_help.html (Accessed

# on May 8th 2015)

# To calculate the mass of a neutral peptide or protein, sum the residue masses plus the masses

# of the terminating

# groups (e.g. H at the N-terminus and OH at the C-terminus).

# Sets dictionary aaMW

aaMW = {"A": 71.0779,"R": 156.1857,"N": 114.1026,"D": 115.0874,

"C": 103.1429,"E": 129.114,"Q": 128.1292,"G": 57.0513,

"H": 137.1393,"I": 113.1576,"L": 113.1576,"K": 128.1723,

"M": 131.1961,"F": 147.1739,"P": 97.1152,"S": 87.0773,

"T": 101.1039,"W": 186.2099,"Y": 163.1733,"V": 99.1311

}13

Inicialmente atribuímos zero à variável mw, a massa molecular da proteína será

atribuída a esta variável. Depois criamos o dicionário aaMW, com a massa molecular

de cada resíduo de aminoácido. As massas moleculares estão disponíveis em:

http://www.matrixscience.com/help/aa_help.htm .

Programa: proteinMW2.py

www.python.org

Dicionário com a massa molecular

# Reads input file name

fastaIn = input("\nGive the input file name => ")

fh = open(fastaIn,'r') # Opens input file

seqIn = fh.readlines() # Reads all of the lines in a file and returns them as elements in a list

fh.close() # Closes input file

# Removes the item at the given position in the list, and return it.

seqIn.pop(0) # Removes first element of the list (get rid of the first line)

# Transforms list in string, so we will not get error with .replace()

seq=''.join(seqIn)

# Removes all "/n" from the string seq

seq = seq.replace("\n","") 14

Em seguida lemos o nome do arquivo de entrada. Depois abrimos o arquivo de

entrada e realizamos a leitura da sequência, como visto em programas anteriores. A

sequência foi atribuída à variável seqIn, que é editada para remoção da primeira linha,

transformação de lista para string e remoção do “\n”. A sequência editada é atribuída à

variável seq.

Programa: proteinMW2.py

www.python.org

Leitura e edição da sequência de aminoácidos

# Looping through to calculate molecular weight

for aa in seq:

mw += aaMW[aa]

mw = mw + 18.0148 # Sums water molecule

15

Logo em seguida temos um loop for, que soma o valor (massa molecular) de cada

chave (aminoácido) do dicionário aaMW à variável mw. Em seguida somamos 18.0148

Da à massa molecular, devido aos aminoácidos dos terminais.

Programa: proteinMW2.py

www.python.org

Loop for para somar as massas dos aminoácidos

# Counts number of amino acids

count_A = seq.count("A")

count_R = seq.count("R")

count_N = seq.count("N")

count_D = seq.count("D")

count_C = seq.count("C")

count_E = seq.count("E")

count_Q = seq.count("Q")

count_G = seq.count("G")

count_H = seq.count("H")

count_I = seq.count("I")

count_L = seq.count("L")

count_K = seq.count("K")

count_M = seq.count("M")

count_F = seq.count("F")

count_P = seq.count("P")

count_S = seq.count("S")

count_T = seq.count("T")

count_W = seq.count("W")

count_Y = seq.count("Y")

count_V = seq.count("V")

16

Contamos cada tipo de aminoácido presente na sequência, como indicado abaixo.

Programa: proteinMW2.py

www.python.org

print("\nThe protein weighs %8.3f"%mw," Daltons")

if mw>0:

print("\nAmino acid\t\t\tPercentage in mass")

print("Alanine \t\t\t %8.3f"%(100*count_A*aaMW["A"]/mw))

print("Arginine\t\t\t %8.3f"%(100*count_R*aaMW["R"]/mw))

print("Asparagine\t\t\t %8.3f"%(100*count_N*aaMW["N"]/mw))

print("Aspartate\t\t\t %8.3f"%(100*count_D*aaMW["D"]/mw))

print("Cysteine\t\t\t %8.3f"%(100*count_C*aaMW["C"]/mw))

print("Glutamate\t\t\t %8.3f"%(100*count_E*aaMW["E"]/mw))

print("Glutamine\t\t\t %8.3f"%(100*count_Q*aaMW["Q"]/mw))

print("Glycine \t\t\t %8.3f"%(100*count_G*aaMW["G"]/mw))

print("Histidine\t\t\t %8.3f"%(100*count_H*aaMW["H"]/mw))

print("Isoleucine\t\t\t %8.3f"%(100*count_I*aaMW["I"]/mw))

print("Leucine \t\t\t %8.3f"%(100*count_L*aaMW["L"]/mw))

print("Lysine \t\t\t %8.3f"%(100*count_K*aaMW["K"]/mw))

print("Methionine\t\t\t %8.3f"%(100*count_M*aaMW["M"]/mw))

print("Phenylalanine\t\t\t %8.3f"%(100*count_F*aaMW["F"]/mw))

print("Proline \t\t\t %8.3f"%(100*count_P*aaMW["P"]/mw))

print("Serine \t\t\t %8.3f"%(100*count_S*aaMW["S"]/mw))

print("Threonine\t\t\t %8.3f"%(100*count_T*aaMW["T"]/mw))

print("Tryptophan\t\t\t %8.3f"%(100*count_W*aaMW["W"]/mw))

print("Tyrosine\t\t\t %8.3f"%(100*count_Y*aaMW["Y"]/mw))

print("Valine \t\t\t %8.3f"%(100*count_V*aaMW["V"]/mw))

17

Por último, mostramos os resultados na tela.

Programa: proteinMW2.py

www.python.org

Mostra resultados se mw>0

Give the input file name => 1kxy.fasta

The protein weighs 14312.020 Daltons

Amino acidPercentage in mass

Alanine 5.960

Arginine 12.004

Asparagine 11.959

Aspartate 4.825

Cysteine 5.765

Glutamate 1.804

Glutamine 2.686

Glycine 4.784

Histidine 0.958

Isoleucine 4.744

Leucine 6.325

Lysine 5.373

Methionine 1.833

Phenylalanine 3.085

Proline 1.357

Serine 6.084

Threonine 4.945

Tryptophan 7.806

Tyrosine 3.420

Valine 4.156

18

Usando-se o programa para o arquivo FASTA 1kxy.fasta, obtemos o resultado abaixo.

Programa: proteinMW2.py

www.python.org

19

Programa: proteinMW2a.py

www.python.org

Uma forma alternativa de programarmos, é usar um loop for aplicado diretamente ao

dicionário aaMW, como mostrado abaixo. Nesta solução economizamos uma parte

considerável de linhas de código. Toda ação está concentrada no segundo loop for.

Este loop for é inserido logo após o primeiro loop for, onde é calculada a massa

molecular da proteína (mw). O segundo loop for, aplicado ao dicionário aaMW, tem

como resultado que cada código de uma letra dos aminoácidos é atribuído à variável

res do loop for, o valor retornado para cada chave do dicionário é usado no cálculo da

porcentagem. Esta solução está implementada no programa proteinMW2a.py.

Rode o programa proteinMW2a.py e compare os resultados com a versão anterior.

# Shows results

print("\nThe protein weighs",mw," Daltons")

if mw>0:

print("\nAmino acid\t\tPercentage in mass")

# Looping through to show percentage of each amino acid

for res in aaMW:

print(res,"\t\t\t",100*seq.count(res)*aaMW[res]/mw)

Resumo

Programa para calcular a porcentagem de resíduos de aminoácidos hidrofóbicos

presentes na proteína. A informação sobre a estrutura primária é lida de um

arquivo no formato FASTA padrão, cujo o nome é fornecido pelo usuário. Os

resultados são mostrados na tela. Além de informações sobre o número total de

aminoácidos na proteína, é mostrada a primeira linha do arquivo FASTA, que

traz a identificação da proteína.

Cálculo da porcentagem de aminoácidos

hidrofóbicos

Programa: aaHydro.py

Programa: aaHydro.py

www.python.org

20

21

Estrutura cristalográfica da hemoglobina com a mutação

Glu->Val na posição 6 da cadeia beta. Na estrutura

temos 2 tetrâmeros e a val 6 localiza-se na interface dos

tetrâmetros (elipse), ocultando-a do solvente.

Código PDB: 2HBS

Posicionamento da

Val 6 da cadeia

beta.

Resíduos hidrofóbicos têm uma leve

tendência de apresentarem-se enterrados

na estrutura da proteína. A presença de

um aminoácido hidrofóbico, como a

valina, na superfície da proteína, cria um

ponto de contato desfavorável com o meio

aquoso. Tal situação pode levar à

formação de oligômeros de proteínas,

como observado para a hemoglobina de

indivíduos com anemia falciforme.

Referência: Harrington DJ, Adachi K,

Royer Jr WE. The high resolution crystal

structure of deoxyhemoglobin S.

J.Mol.Biol 1997; 272: 398-407

Programa: aaHydro.py

www.python.org

22

Abaixo temos 10 arquivos FASTA para a cadeia beta da hemoglobina humana. Teste

os arquivos FASTA indicados e identifique aquele que apresenta a hemoglobina da

anemia falciforme. Use como critério a porcentagem de resíduos hidrofóbicos. A cadeia

beta da hemoglobina de indivíduos com anemia falciforme, apresenta uma mutação de

glutamato (polar) para valina (hidrofóbico), assim terá uma porcentagem maior de

aminoácidos hidrofóbicos.

Lista de arquivos a serem testados:

Hb1.fasta, Hb2.fasta, Hb3.fasta, Hb4.fasta, Hb5.fasta, Hb6.fasta, Hb7.fasta Hb8.fasta,

Hb9.fasta, e Hb10.fasta .

.

Programa: aaHydro.py

www.python.org

No código do programa aaHydro.py, temos que identificar os aminoácidos hidrofóbicos

presentes na sequência lida. O diagrama de Venn abaixo traz a lista dos aminoácidos

hidrofóbicos, para montarmos uma lista com os códigos de uma letra. Por exemplo, alista: hydroAA = ["A","L","I","F","M","C","V"] .

Gly

Ala

Val

Leu

Ile

Phe Trp

MetProCys

Ser

Thr

TyrAsn

Gln

Asp Glu

His LysArg

Hidrofóbicos

Alifáticos

Aromáticos

Com enxofrePolares

Ácidos

Básicos

23

Programa: aaHydro.py

www.python.org

# Sets list for hydrophobic amino acids

hydroAA = ["A","L","I","F","M","C","V"]

# Sets initial value for counter of hydrophobic amino acids

count_Hydro = 0

# Reads input file name

fastaIn = input("\nGive the input file name => ")

fh = open(fastaIn,'r') # Opens input file

seqIn = fh.readlines() # Reads all of the lines in a file and returns them as elements in a list

fh.close() # Closes input file

# Removes the item at the given position in the list, and assigns it to firstLine.

firstLine = seqIn.pop(0) # Removes first element of the list (get rid of the first line)

# Transforms list in string, so we will not get error with .replace()

seq=''.join(seqIn)

# Removes all "/n" from the string seq

seq = seq.replace("\n","")

24

Programa: aaHydro.py

www.python.org

Usamos uma lista (hydroAA) para os códigos de uma letra dos aminoácidos

hidrofóbicos. Atribuímos zero ao contador count_Hydro. A parte inicial do programa é

similar ao programa proteinMW2.py, visto que temos que ler a sequência de um

arquivo FASTA. Depois da edição inicial, temos a sequência atribuída à variável seq.

Usamos seqIn.pop(0) para atribuir a primeira linha à variável firstLine.

Leitura e edição da sequência de aminoácidos

for aa in seq:

if aa in hydroAA:

count_Hydro += 1

totalAA = len(seq)

# Shows results

print("FASTA identification: ",firstLine)

if totalAA > 0:

print("\nPercentage of hydrophobic amino acids: %8.3f"%(100*count_Hydro/totalAA) )

else:

print("\nError, no amino acids in the structure.")

25

Programa: aaHydro.py

www.python.org

Agora temos um loop for para varremos a sequência de aminoácidos. Dentro do loop

temos um condicional if. No condicional testamos se o aminoácido, atribuído à variável

aa, está na lista hydroAA, em caso afirmativo somamos “1” ao contador count_Hydro.

Por último, mostramos o resultado na tela. Teste o programa para as sequências das

cadeias beta de hemoglobina.

Loop for para contar aminoácidos hidrofóbicos

Mostra resultados na tela

Resumo

Programa para leitura e escrita de arquivo de coordenadas atômicas no formato

protein data bank (PDB). Após a leitura do arquivo PDB, o programa divide o

arquivo de entrada em três arquivos de saída. Um com os átomos da parte

proteica, outro com os átomos dos ligantes e o último com os átomos das

moléculas de água. A parte proteica é escrita no arquivo de saída protein.pdb, a

parte dos ligantes no arquivo lig.pdb e as moléculas de água no arquivo

water.pdb.

Leitura e escrita de arquivos PDB (versão 1)

Programa: readANDwritePDB1.py

26

Programa: readANDwritePDB1.py

www.python.org

pdbFileIn = input("\nType the PDB file name => ")

fo = open(pdbFileIn,"r")

f_protein = open("protein.pdb","w")

f_lig = open("lig.pdb","w")

f_water = open("water.pdb","w")

print("\nProtein atoms in the structure: ",pdbFileIn, "to be written in protein.pdb")

print("\nLigand atoms in the structure: ",pdbFileIn, "to be written in lig.pdb")

print("\nWater atoms in the structure: ",pdbFileIn, "to be written in water.pdb")

27

A parte da abertura e leitura do arquivo PDB de entrada é similar aos programas

anteriores. A novidade está na escrita. A parte inicial do programa está mostrada

abaixo. Temos a função open() para a abertura dos arquivos protein.pdb, lig.pdb e

water.pdb, indicadas em vermelho. Em seguida temos três funções print() para

indicar que as coordenadas serão escritas nos arquivos citados acima.

Programa: readANDwritePDB1.py

www.python.org

for line in fo:

if line[0:6] == "ATOM ":

f_protein.write(line)

elif line[0:6] == "HETATM" and line[17:20] != "HOH":

f_lig.write(line)

elif line[0:6] == "HETATM" and line[17:20] == "HOH":

f_water.write(line)

fo.close()

f_protein.close()

f_lig.close()

f_water.close()

28

Usamos condicionais no loop for que varre o arquivo de entrada, para selecionarmos

as diferentes fatias de átomos do arquivo PDB. Inicialmente selecionamos a parte

proteica, depois a parte dos ligantes e, por último, a parte das moléculas de água. O

loop for está indicado em vermelho. Por último, fechamos todos os arquivos.

Programa: readANDwritePDB1.py

www.python.org

Type the PDB file name => 2a4l.pdb

Protein atoms in the structure: 2a4l.pdb to be written in protein.pdb

Ligand atoms in the structure: 2a4l.pdb to be written in lig.pdb

Water atoms in the structure: 2a4l.pdb to be written in water.pdb

29

Ao rodarmos o programa, criamos três novos arquivos: protein.pdb, lig.pdb e

water.pdb . Abaixo temos o resultado de rodarmos o programa para o arquivo

2A4L.pdb.

Programa: readANDwritePDB1.py

www.python.org

Resumo

Programa para leitura e escrita de arquivo de coordenadas atômicas no formato

protein data bank (PDB). Após a leitura do arquivo PDB, o programa divide o

arquivo de entrada em três arquivos de saída. Um com os átomos da parte

proteica, outro com os átomos dos ligantes e o último com os átomos das

moléculas de água. Os nomes dos arquivos de saída são fornecidos pelo

usuário. O programa mostra quantos átomos de cada tipo foram escritos nos

arquivos de saída.

Leitura e escrita de arquivos PDB (versão 2)

Programa: readANDwritePDB2.py

30

Programa: readANDwritePDB2.py

www.python.org

# Reads and opens input file

pdbFileIn = input("\nType the PDB file name => ")

fo = open(pdbFileIn,"r")

# Reads and opens output files

my_protein = input("\nType the PDB file name for protein atoms => ")

my_lig = input("\nType the PDB file name for ligand atoms => ")

my_water = input("\nType the PDB file name for water atoms => ")

fo_protein = open(my_protein,"w")

fo_ligand = open(my_lig,"w")

fo_water = open(my_water,"w")

# Assigns zero to counter variables

count_protein = 0

count_lig = 0

count_wat = 031

No início abrimos os arquivos de entrada e saída. Os arquivos de saída terão os

nomes lidos a partir da função input(). Em seguida, atribuímos zero às variáveis

contadores de átomos, como indicado abaixo.

Programa: readANDwritePDB2.py

www.python.org

# Looping through to identify ligands, water and protein atoms

for line in fo:

if line[0:6] == "ATOM ": # Condition to be considered a protein atom

fo_protein.write(line)

count_protein += 1

elif line[0:6] == "HETATM" and line[17:20] != "HOH": # Condition for not water

fo_ligand.write(line)

count_lig += 1

elif line[0:6] == "HETATM" and line[17:20] == "HOH": # Condition for water

fo_water.write(line)

count_wat += 1

32

Agora temos um loop for, que seleciona os diferentes tipos de átomos que serão

escritos nos arquivos PDB de saída, a partir do uso de if e elif. No bloco vinculado a

cada if e elif, somamos “1” à variável do contador específico de cada átomo.

Programa: readANDwritePDB2.py

www.python.org

# Closes files

fo.close()

fo_protein.close()

fo_ligand.close()

fo_water.close()

# Shows results

print("\nNumber of protein atoms written in ",my_protein,": ",count_protein)

print("Number of ligand atoms written in ",my_lig,": ",count_lig)

print("Number of water atoms written in ",my_water,": ",count_wat)

33

Por último, fechamos os arquivos e mostramos os resultados na tela.

Programa: readANDwritePDB2.py

www.python.org

Type the PDB file name => 2a4l.pdb

Type the PDB file name for protein atoms => protein.pdb

Type the PDB file name for ligand atoms => ligand.pdb

Type the PDB file name for water atoms => water.pdb

Number of protein atoms written in protein.pdb : 2308

Number of ligand atoms written in ligand.pdb : 26

Number of water atoms written in water.pdb : 82

34

Abaixo temos o resultado de rodarmos o programa para o arquivo 2A4L.pdb. Veja

que temos a indicação do número de átomos escritos em cada arquivo de saída.

Programa: readANDwritePDB2.py

www.python.org

Com o aumento do poder gráfico do

computadores, a partir da década de 1980,

começaram a ser desenvolvidos

programas para visualização da estrutura

tridimensional de macromoléculas

biológicas. Apresentaremos um dos

principais programas usados hoje em dia

na área de bioinformática, o VMD (Visual

Molecular Dynamics). Clique no ícone

VMD e você terá as janelas mostradas ao

lado. Há duas janelas principais no VMD,

uma gráfica (Open GL Display), mostrada

ao fundo, e outra chamada de menu

principal (VMD main). Esta é usada para

inserirmos os comandos do VMD, como

comandos para carregarmos arquivos de

macromoléculas biológicas e modificarmos

sua representação na tela. Abra a pasta da

disciplina e carregue o arquivo dna.pdb no

menu principal. 35

Menu principal e janela gráfica do programa VMD.

Referência:

HUMPHREY W; DALKE A; SCHULTEN K. VMD - Visual

Molecular Dynamics. Journal of Molecular Graphics,

Amsterdã, v.14, p.33-38, 1996.

Programa Visual Molecular Dynamics (VMD)

www.python.org

Depois de carregar a estrutura do DNA,

clique na tela gráfica. Você terá a imagem

ao lado. O botão da esquerda do mouse

permite que você gire a molécula, o botão

central permite que você aumente e

diminua a estrutura na tela do computador.

Movimente a molécula, de forma a

familiarizar-se com os comandos do

mouse. A representação indicada é

chamada de Lines. Nela temos as ligações

covalentes entre os átomos, com um

código de cores. Ciano para ligações que

saem do carbono, branco para ligações

que saem do hidrogênio, vermelho para

ligações que saem do oxigênio, azul

escuro para ligações que saem do

nitrogênio e amarelo escuro para ligações

de saem do fósforo. A representação Lines

dá uma ideia da conectividade dos átomos

da molécula. 36

Janela gráfica do programa VMD, com a estrutura do DNA

mostrada com a opção Lines..

Programa Visual Molecular Dynamics (VMD)

www.python.org

Clique no menu principal na seguinte

sequência: Graphics > Representations.

Você terá um novo menu de comandos,

como mostrado ao lado.

Neste menu podemos mudar a

representação gráfica da molécula.

Identifique no menu o campo Drawing

Method. Este campo permite que você

escolha diferentes formas de desenhar a

mesma molécula no terminal gráfico. Há

opções para destacar a estrutura

secundária do DNA (New Cartoons). Há

outra para destacar as posições dos

átomos e suas ligações (CPK). A opção

CPK desenha os átomos como esferas e

as ligações covalentes como bastões entre

os átomos. No próximo slide teremos uma

descrição dos principais campos do menu

gráfico.

37

Menu gráfico do programa VMD, com o campo Drawing

Method em Lines..

Programa Visual Molecular Dynamics (VMD)

www.python.org

38

Seleciona a molécula a ser

mostrada, caso tenhamos mais

de uma.

Cria representações gráficas

múltiplas para a mesma

molécula, na indicada temos a

representação Lines mostrada no

campo branco.

Quando temos mais de uma

representação, é nesta janela

que ficam as informações.

Indica quais átomos são

mostrados, na situação indicada

temos todos (all).

Você pode trabalhar com

seleções específicas de átomos,

clicando na opção Selections.

Campo que muda a cor ou

critério de coloração da

molécula.

Campo que seleciona a forma de

desenhar a molécula. Campo que indica a espessura

da linha usada para desenhar a

molécula.

Campo que indica o efeito visual

do material. Temos diversas

opções, como desenhar os

átomos da molécula com uma

textura metálica.

Programa Visual Molecular Dynamics (VMD)

www.python.org

Mude a opção de Drawing method de

Lines para CPK. A representação CPK é

assim chamada em homenagem aos

cientistas que a propuseram (Corey,

Pauling e Koltun) (COREY e PAULING,

1953; KOLTUN, 1965). Ao mudarmos para

CPK teremos a representação ao lado.

Referências:

-COREY, RB; PAULING L. Molecular

models of amino acids, peptides and

proteins. Review of Scientific Instruments,

Nova York, v. 24, n.8, p.621-627, 1953.

-KOLTUN WL. Precision space-filling

atomic models. Biopolymers, Hoboken, v.3,

n.6, p.665-79, 1965.

39

Janela gráfica do programa VMD, com a estrutura do DNA

mostrada com a opção CPK..

Programa Visual Molecular Dynamics (VMD)

www.python.org

Explore as diferentes opções de representação gráfica da molécula de DNA. Teste as

seguintes opções: VDW (para representar átomos como esferas com raios

proporcionais ao raios de van der Waals), Licorice (representa as ligações covalentes

como bastões), New Cartoon (representa a estrutura secundária do DNA, com destaque

para as fitas e as bases) e QuickSurf (mostra a superfície molecular do DNA).

40

VDW Licorice New Cartoon QuickSurf

Programa Visual Molecular Dynamics (VMD)

www.python.org

O VMD é um programa gratuito, que tem versões para Mac OS X, Linux e Windows.

Para fazer download entre no site:

http://www.ks.uiuc.edu/Development/Download/download.cgi?PackageName=VMD .

Você precisa registrar-se no site.

Uma característica interessante do VMD, é que ele permite que você crie arquivos de

imagens da molécula que você está visualizando. Essas figuras apresentam qualidade

gráfica ideal para publicações científicas. Para gerar a imagem, que está na tela, vá ao

menu principal clique: File > Render... . Você terá o menu abaixo. No campo Filename

escolha a pasta e o nome do arquivo. Coloque a extensão .bmp . Há outras opções de

formatos. Depois clique: Start Rendering. No Mac OS X tente a opção .ps para o

formato de saída figura. Depois de gerada a figura, clique duas vezes no arquivo .ps

gerado, para visualizar a figura.

41

Programa Visual Molecular Dynamics (VMD)

www.python.org

A partir das coordenadas atômicas armazenadas num arquivo PDB, podemos

determinar a distância entre átomos na estrutura (distância interatômica). A figura

mostrada abaixo traz a estrutura tridimensional do aminoácido alanina. Usamos o

programa VMD, com a opção Drawing method em CPK, para gerar a figura. O arquivo

PDB traz as coordenadas atômicas que foram carregadas no VMD. Para cada átomo

mostrado na figura, temos uma posição atômica no arquivo PDB.

ATOM 1 N ALA 001 -0.541 1.336 -2.425

ATOM 2 CA ALA 001 0.178 0.132 -2.236

ATOM 3 C ALA 001 1.399 0.101 -3.155

ATOM 4 O ALA 001 2.606 -0.060 -2.668

ATOM 5 H ALA 001 -0.396 1.923 -1.614

ATOM 6 O ALA 001 1.116 0.235 -4.429

ATOM 7 H ALA 001 -1.557 1.207 -2.555

ATOM 8 H ALA 001 0.597 0.213 -1.219

ATOM 9 CB ALA 001 -0.751 -1.285 -2.203

ATOM 10 H ALA 001 -1.525 -1.287 -1.557

ATOM 11 H ALA 001 -0.255 -2.141 -2.003

ATOM 12 H ALA 001 -1.166 -1.414 -3.112

ATOM 13 H ALA 001 -0.173 1.800 -3.246

END

Arquivo PDB para o aminoácido alanina

42

Distância Interatômica

www.python.org

Temos uma relação biunívoca, para cada átomo no arquivo PDB temos um átomo na

estrutura e vice-versa. A figura abaixo mostra as coordenadas atômicas para os

átomos da figura, exceto os hidrogênios. Lembrando que as coordenadas atômicas

estão em Ångstroms (Å), onde 1 Å = 10-10 m.

ATOM 1 N ALA 001 -0.541 1.336 -2.425

ATOM 2 CA ALA 001 0.178 0.132 -2.236

ATOM 6 O ALA 001 1.116 0.235 -4.429

ATOM 3 C ALA 001 1.399 0.101 -3.155

ATOM 4 O ALA 001 2.606 -0.060 -2.668

ATOM 9 CB ALA 001 -0.751 -1.285 -2.203

43

Distância Interatômica

www.python.org

As coordenadas atômicas, apresentadas nos arquivos PDB, permitem a determinação

direta de diversos parâmetros estruturais, tais como, distâncias, ângulos e ângulos de

torção. Para o cálculo da distância entre dois átomos (interatômica), i e j, de

coordenadas (X, Y, Z) usamos a equação para a distância Euclidiana (D) entre dois

pontos, como segue:

Como as coordenadas atômicas armazenadas num arquivo PDB estão em Ångstrom

(Å) ( 1 Å = 10-10 m), a distância interatômica, indicada pela equação acima, será dada

em Ångstrom (Å).

D = [ (Xj – Xi )2 + (Yj – Yi )

2 + (Zj – Zi )2 ]1/2

44

Distância Interatômica

www.python.org

Como aplicação, consideremos a distância entre os átomos N e CA (carbono alfa) da

estrutura abaixo. O átomo N foi escolhido como “j” e o carbono alfa (CA) como “i”, a

escolha é arbitrária, visto que o quadrado da diferença entre as coordenadas é o que

importa para o cálculo.

ATOM 1 N ALA 001 -0.541 1.336 -2.425

ATOM 2 CA ALA 001 0.178 0.132 -2.236

D = [ (Xj – Xi )2 + (Yj – Yi )

2 + (Zj – Zi )2 ]1/2

45

CA

N

Distância Interatômica

www.python.org

Substituindo-se os valores das coordenadas atômicas temos:

D = [ (-0,541 – 0,178 )2 + (1,336 – 0,132 )2 + (-2,425 – (-2,236) )2 ]1/2

D = [ (-0,719 )2 + (1,204 )2 + (-0,189 )2 ]1/2

D = [ 0,517 + 1,450 + 0,036 ]1/2

D = [ 2,003 ]1/2 = 1,42 Å

46

CA

N

Distância Interatômica

www.python.org

ATOM 2 CA ALA 001 0.178 0.132 -2.236

ATOM 1 N ALA 001 -0.541 1.336 -2.425

Resumo

Programa para leitura de arquivo de coordenadas atômicas no formato protein

data bank (PDB). Após a leitura do arquivo PDB, o programa identifica as

cisteínas que participam de ligações dissulfeto. O programa usa o critério da

distância entre os átomos de enxofre (SG) presentes nas cisteínas. A distância

interatômica deve estar entre 2,0 e 2,1 Å, para ser considerada uma ligação

dissulfeto. Só são considerados átomos SG com fator de ocupação maior 0,5,

para evitar que em estruturas que apresentam mais de uma posição para os SG,

esses sejam considerados mais de uma vez. Os resultados são mostrados na

tela.

Determina as ligações dissulfeto (versão 1)

Programa: ssBondPDB1.py

47

Programa: ssBondPDB1.py

www.python.org

A presença de resíduos de cisteína próximos, na estrutura tridimensional de uma

proteína, possibilita a oxidação dos grupos SH da cadeia lateral, formando uma

ligação covalente entre as duas cisteínas. Abaixo temos a reação de oxidação dos

resíduos de cisteína na presença de oxigênio.

2(-CH2SH) + ½ O2 -CH2-S-S-CH2 + H2O

Essa ligação chama-se ligação dissulfeto, alguns autores chamam de ponte

dissulfeto. Podemos chamar, também, de ligação SS. No presente texto, usaremos os

termos “ligação dissulfeto” ou “ligação SS”. As ligações dissulfeto conferem à proteína

uma estabilidade estrutural ao seu arranjo tridimensional, podendo ligar partes da

mesma cadeia polipeptídica ou cadeias distintas, como observado na estrutura

tridimensional da insulina (código de acesso PDB: 4EWZ).Num arquivo PDB, os átomos de enxofre da cadeia lateral de um resíduo de cisteína,

recebem o nome de SG. Buscaremos essa string entre os átomos presentes num

arquivo PDB, para identificarmos as ligações dissulfeto.

48

Programa: ssBondPDB1.py

www.python.org

49

Programa: ssBondPDB1.py

www.python.org

Ligação dissulfeto

Estrutura tridimensional da insulina (código de acesso PDB: 4EWZ).

50

No programa ssBondPDB1.py, identificaremos os átomos de SG (colunas de 14-15) e

testarmos o fator de ocupação (colunas 57-60). Para os átomos selecionados, lemos

as coordenadas atômicas (colunas 32-53). Os campos a serem lidos estão em verde.

ATOM 1 N MET A 1 101.710 112.330 93.759 1.00 48.54 N

Colunas de 1-6 para string com ATOM ou HETATM, é atribuída à variável line[0:6]

Colunas de 7-11 para a ordem do átomo, é atribuída à variável line[6:11]

Colunas de 14-15 para o nome do átomo, é atribuída à variável line[13:15]

Colunas de 18-20 para o nome do aminoácido (ou ligante, ou HOH), é atribuída à variável line[17:20]

Coluna 22 para o identificador da cadeia, é atribuída à variável line[21:22]

Colunas 23-26 para o número do resíduo, é atribuída à variável line[22:26]

Colunas 32-53 para as coordenadas atômicas, são atribuídas às variáveis

line[30:38], line[38:46], line[46:54]

Colunas 57-60 para a ocupação, é atribuída à variável line[56:60]

Programa: ssBondPDB1.py

www.python.org

import math

# Reads and opens input file

pdbFileIn = input("\nType the PDB file name => ")

fo = open(pdbFileIn,"r")

# Assigns 0 to counter variables

count_SS_bonds = 0

count_SG = 0

# Sets up lists for atomic coordinates of SG

ss_x = []

ss_y = []

ss_z = []51

No início importamos o módulo math, depois lemos o nome do arquivo PDB e o

abrimos. Veja que as linhas de código, referentes à leitura do nome do arquivo PDB,

bem como a sua abertura, são idênticas às usadas no programa

readANDwritePDB2.py. Em seguida, atribuímos zero às variáveis dos contadores de

ligações SS e de átomos SG, variáveis count_SS_bonds e count_SG,

respectivamente. Na sequência, iniciamos as listas para as coordenadas atômicas do

SG.

Programa: ssBondPDB1.py

www.python.org

# Looping through atoms to identify SS bonds

for line in fo:

if line[0:6] == "ATOM " and line[13:15] == "SG" and (float(line[56:60]) > 0.50) :

ss_x.append(float(line[30:38]))

ss_y.append(float(line[38:46]))

ss_z.append(float(line[46:54]))

count_SG += 1

# Closes file

fo.close() 52

Neste primeiro loop for, se a linha do arquivo tem o átomo SG (line[13:15] == "SG" ) e

se o fator de ocupação for maior que 0,5 ((float(line[56:60]) > 0.50) ), adicionamos as

coordenadas atômicas às respectivas listas. Tal procedimento evita que a mesma

ligação SS seja contada mais de uma vez. Adicionamos as coordenadas atômicas dos

átomos SG identificados às listas: ss_x, ss_y, ss_z. Usamos o método .append() para

adicionarmos as coordenadas atômicas às listas. Assim, teremos listas para as

coordenadas somente dos átomos que nos interessam, os SG. Somamos 1 ao

contador de SG (count_SG) e depois fechamos o arquivo.

Programa: ssBondPDB1.py

www.python.org

# Looping through the SG atoms

for i in range(count_SG):

for j in range(i+1,count_SG):

distance_SS = math.sqrt((ss_x[i]-ss_x[j])**2+(ss_y[i]-ss_y[j] )**2+(ss_z[i]-ss_z[j])**2)

if distance_SS < 2.1 and distance_SS > 2.0:

count_SS_bonds += 1

# Shows results

print("\nNumber of S-S bonds identified in ",pdbFileIn,": ",count_SS_bonds)53

Agora, no segundo loop for, varremos só as coordenadas atômicas dos SG, atribuídas

às listas: ss_x, ss_y e ss_z. Na verdade temos um loop for aninhando em outro loop

for, tal procedimento visa que acessemos cada átomo SG das listas. Uma vez

acessadas as coordenadas, determinamos a distância entre pares de átomos SG.

Inicialmente, no loop for i in range(count_SG), dentro do retângulo vermelho, pegamos

as coordenadas em cada lista. No loop for seguinte, dentro do retângulo azul, pulamos

para o próximo átomo SG e calculamos a distância (distance_SS). Caso a distância

esteja na faixa indicada, somamos 1 ao contador de SS (count_SS_bonds). Por

último, mostramos os resultados na tela. Aninhar loops, como fizemos abaixo, é um

procedimento comum, principalmente quando temos que varrer listas ou trabalhamos

com matrizes. Observe o recuo das linhas vinculadas a cada loop for.

Programa: ssBondPDB1.py

www.python.org

Type the PDB file name => 1kxy.pdb

Number of S-S bonds identified in 1kxy.pdb : 4

54

Abaixo temos o resultado de rodarmos o programa para o arquivo 1KXY.pdb.

Programa: ssBondPDB1.py

www.python.org

Resumo

Programa para leitura de arquivo de coordenadas atômicas no formato protein

data bank (PDB). Após a leitura do arquivo PDB, o programa identifica o número

das cisteínas que participam de ligações dissulfeto. O programa usa o critério da

distância entre os átomos de enxofre (SG) presentes nas cisteínas. A distância

interatômica deve estar entre 2,0 e 2,1 Å, para ser considerada uma ligação

dissulfeto. Só são considerados átomos SG com fator de ocupação maior 0,5,

para evitar que em estruturas que apresentam mais de uma posição para os SG,

esses sejam considerados mais de uma vez. Os resultados são mostrados na

tela, na forma de tabela, identificando os números das cisteínas que participam

das ligações, bem como a distância interatômica da ligação SS.

Determina as ligações dissulfeto (versão 2)

Programa: ssBondPDB2.py

55

Programa: ssBondPDB2.py

www.python.org

56

Temos agora cinco campos a serem lidos das linhas que iniciam com “ATOM “. Os

campos a serem lidos, estão em verde abaixo. Incluímos as colunas de 23 a 26, com o

número do resíduo de aminoácido, que será mostrado na forma de uma tabela no final

do programa.ATOM 1 N MET A 1 101.710 112.330 93.759 1.00 48.54 N

Colunas de 1-6 para string com ATOM ou HETATM, é atribuída à variável line[0:6]

Colunas de 7-11 para a ordem do átomo, é atribuída à variável line[6:11]

Colunas de 14-15 para o nome do átomo, é atribuída à variável line[13:15]

Colunas de 18-20 para o nome do aminoácido (ou ligante, ou HOH), é atribuída à variável line[17:20]

Coluna 22 para o identificador da cadeia, é atribuída à variável line[21:22]

Colunas 23-26 para o número do resíduo, é atribuída à variável line[22:26]

Colunas 32-53 para as coordenadas atômicas, são atribuídas às variáveis

line[30:38], line[38:46], line[46:54]

Colunas 57-60 para a ocupação, é atribuída à variável line[56:60]

Programa: ssBondPDB1.py

www.python.org

import math

# Reads and opens input file

pdbFileIn = input("\nType the PDB file name => ")

fo = open(pdbFileIn,"r")

# Assigns 0 to counter variables

count_SS_bonds = 0

count_SG = 0

# Sets up lists for atomic coordinates of SG and number of residue

ss_x = []

ss_y = []

ss_z = []

ss_res_number = []57

O programa é similar à versão 1, assim vamos destacar as mudanças em vermelho.

Temos uma lista extra, a ss_res_number, que terá o número dos resíduos de

aminoácidos, para as linhas com átomos SG. Esta lista terá os valores do campo que

traz a numeração do resíduo de aminoácido (colunas 23-26) .

Programa: ssBondPDB2.py

www.python.org

# Looping through atoms to identify SS bonds

for line in fo:

if line[0:6] == "ATOM " and line[13:15] == "SG" and (float(line[56:60]) > 0.50) :

ss_x.append(float(line[30:38]))

ss_y.append(float(line[38:46]))

ss_z.append(float(line[46:54]))

ss_res_number.append(line[22:26])

ss_line.append(line)

count_SG += 1

# Closes file

fo.close()

# Prints header to show a table with results

print("\nPairs of cysteines participating in SS-bonds identified in the file: ",pdbFileIn)

print("\nCysteine 1\tCysteine 2\t Distance(A)")58

No primeiro loop for temos o método .append() aplicado à lista ss_res_number, para a

qual será atribuída o número do resíduo de aminoácido que tem o átomo SG. Temos

também a list ss_line, que armazena a linha completa, para acessarmos informações

posteriormente. Em seguida mostramos o cabeçalho da tabela, que terá as cisteínas

identificadas nas ligações dissulfeto.

Programa: ssBondPDB2.py

www.python.org

# Looping through the SG atoms

for i in range(count_SG):

for j in range(i+1,count_SG):

distance_SS = math.sqrt((ss_x[i]-ss_x[j])**2+(ss_y[i]-ss_y[j] )**2+(ss_z[i]-ss_z[j])**2)

if distance_SS < 2.1 and distance_SS > 2.0:

count_SS_bonds += 1

print(ss_line[i][22:26],"\t\t",ss_line[j][22:26],"\t\t%8.3f"%distance_SS)

# Shows final result

print("\nTotal number of S-S bonds identified in ",pdbFileIn,": ",count_SS_bonds) 59

Agora temos uma função print() no loop for, para mostrar o número das cisteínas que

participam de ligações dissulfeto. Introduzimos aqui uma função print() com

formatação %. O %8.3f indica que o número que estiver fora das aspas será um float

com 8 dígitos (incluindo o ponto decimal), sendo três casas decimais após o ponto

decimal. Quando temos % dentro das aspas da função print(), este indica formatação

e, necessariamente, temos que ter a variável precedida de % fora das aspas e dentro

da função print(), para indicar que a formatação % refere-se a esta variável. Não

coloca-se a vírgula separando-se a variável e as aspas, quando usamos a

formatação %.

Programa: ssBondPDB2.py

www.python.org

Type the PDB file name => 1kxy.pdb

Pairs of cysteines participating in SS-bonds identified in the file: 1kxy.pdb

Cysteine 1Cysteine 2 Distance(A)

6 127 2.017

30 115 2.028

64 80 2.025

76 94 2.033

Total number of S-S bonds identified in 1kxy.pdb : 4

60

Abaixo temos o resultado de rodarmos o programa para o arquivo 1KXY.pdb. Veja

que todas as distâncias ficaram com 3 casas após o ponto decimal.

Programa: ssBondPDB2.py

www.python.org

61

A figura abaixo traz as ligações dissulfeto identificadas a partir do programa VMD,

com a representação gráfica Lines. Veja que são mostrados os átomos SG das

ligações dissulfeto, pelos números dos resíduos, confirmamos os resultados

mostrados pelo programa ssBondPDB2.pdb .

Programa: ssBondPDB2.py

www.python.org

-BRESSERT, Eli. SciPy and NumPy. Sebastopol: O’Reilly Media, Inc., 2013. 56 p.

-DAWSON, Michael. Python Programming, for the absolute beginner. 3ed. Boston: Course Technology, 2010. 455 p.

-HETLAND, Magnus Lie. Python Algorithms. Mastering Basic Algorithms in the Python Language. Nova York: Springer

Science+Business Media LLC, 2010. 316 p.

-IDRIS, Ivan. NumPy 1.5. An action-packed guide dor the easy-to-use, high performance, Python based free open source

NumPy mathematical library using real-world examples. Beginner’s Guide. Birmingham: Packt Publishing Ltd., 2011. 212 p.

-KIUSALAAS, Jaan. Numerical Methods in Engineering with Python. 2ed. Nova York: Cambridge University Press, 2010. 422

p.

-LANDAU, Rubin H. A First Course in Scientific Computing: Symbolic, Graphic, and Numeric Modeling Using Maple, Java,

Mathematica, and Fortran90. Princeton: Princeton University Press, 2005. 481p.

-LANDAU, Rubin H., PÁEZ, Manuel José, BORDEIANU, Cristian C. A Survey of Computational Physics. Introductory

Computational Physics. Princeton: Princeton University Press, 2008. 658 p.

-LUTZ, Mark. Programming Python. 4ed. Sebastopol: O’Reilly Media, Inc., 2010. 1584 p.

-MODEL, Mitchell L. Bioinformatics Programming Using Python. Sebastopol: O’Reilly Media, Inc., 2011. 1584 p.

-TOSI, Sandro. Matplotlib for Python Developers. Birmingham: Packt Publishing Ltd., 2009. 293 p.

Última atualização: 21 de julho 2016.

62

Referências

www.python.org