#!/usr/bin/env python # -*-coding:Utf-8 -* ######################### Calcul barycentre carbones alpha acides amines proteine (E. Jaspard - 2017) ######################## # Le barycentre d'un ensemble est la position moyenne de cet ensemble. # Le barycentre d'une proteine est la moyenne des coordonnees [X, Y et Z] des carbones alpha (acides amines) de la chaine polypeptidique. # Test du resultat # FichierPDB = open("crn10AA.pdb", "r") # Test avec le fichier des 10 premiers AA de la crambine 1CRN # Coordonnees du barycentre pour les 10 premiers AA de la crambine : X = 10.140 - Y = 7.297 - Z = 10.752 # Script inspire de http://julien.maupetit.free.fr/teachingFiles/2007/M1SPGF_Python_TD_corr.pdf ################################################################################################################################ import urllib import re ################# Initialisation variables somme des coordonnees X des carbones alpha CA ############### sommeCoordX = 0 sommeCoordY = 0 sommeCoordZ = 0 ######################### Genere URL recherche fichier PDB / affiche nom proteine ######################### CodePDB = raw_input("Entrer le code PDB : ") URLPDB = "https://files.rcsb.org/view/" + CodePDB + ".pdb" # symbole + pour concatener des chaines / Exemple : https://files.rcsb.org/view/2NBT.pdb FichierPDB = urllib.urlopen( URLPDB ) # fonction urlopen ==> lit le texte complet de la page web / comme pour un fichier texte for LigneEnCours in FichierPDB.readlines(): # Les 2 points ':' sont necessaires a la syntaxe / readlines() est une methode if re.match(r"TITLE", LigneEnCours): LigneEnCours = LigneEnCours.replace('TITLE','') print "Proteine :", LigneEnCours FichierPDB.close() ############ Selection et transformation des lignes contenant le carbone alpha ############ FichierPDB = urllib.urlopen( URLPDB ) # fonction urlopen ==> lit le texte complet de la page web / comme pour un fichier texte ligneCA = [ligne for ligne in FichierPDB if ligne.split()[0] == "ATOM" and ligne.split()[2] == "CA"] # Selection des lignes correspondant aux carbones alpha CA for chaqueLigne in enumerate(ligneCA): # "ligneCA" est un objet de type liste d'ou la methode enumerate conversionChaine = str(chaqueLigne) # Conversion de la liste en une serie de chaines de caracteres ("string") conversionChaine = re.sub(r"\((\d)+,\s'","",conversionChaine) conversionChaine = re.sub(r"\d.(\d)+(\s)+\d.(\d)+(\s)+.(\s)+\\n\'\)","",conversionChaine) # IMPORTANT : les 4 caracteres \n') sont echappes avec \\n\'\) # Exemple : la chaine de caracteres : (16, 'ATOM 261 CA HIS A 17 2.018 -5.941 0.944 1.00 0.22 C \n') # devient : ATOM 261 CA HIS A 17 2.018 -5.941 0.944 ############ Affichage des coordonnees X, Y et Z du carbone alpha CA ############ listeChaine = conversionChaine.split() # IMPORTANT : chaque ligne "conversionChaine" devient une LISTE #Exemple : ['ATOM', '561', 'CA', 'ASP', 'A', '35', '-5.897', '-6.886', '-8.018'] => La coordonnee X est le 7eme element de la liste # On recupere les coordonnees x, y et z de chaque ligne (donc de chaque liste) coordX = listeChaine[6] # La coordonnee X est le 7e element de la liste donc [6] car on commence a ZERO en info coordY = listeChaine[7] # La coordonnee Y est le 8e element de la liste coordZ = listeChaine[8] # La coordonnee Z est le 9e element de la liste ############ Transformation de la chaine de caracteres en un reel ("float") ############ coordX = float(coordX) coordY = float(coordY) coordZ = float(coordZ) ############ Calcul de la somme des coordonnees X, Y et Z ############ sommeCoordX += coordX sommeCoordY += coordY sommeCoordZ += coordZ ############ Calcul des coordonnees du barycentre ############ barycentreX = sommeCoordX / len(ligneCA) barycentreY = sommeCoordY / len(ligneCA) barycentreZ = sommeCoordZ / len(ligneCA) print "Nombre d'acides amines : ",len(ligneCA) print "Coordonnees du barycentre de",CodePDB,": X =%8.3f - Y =%8.3f - Z =%8.3f" % (barycentreX,barycentreY,barycentreZ) print "\n" # Retour a la ligne FichierPDB.close() ######################### Affichage des lignes contenant le carbone alpha CA ########################## print "Lignes contenant les coordonnees du carbone alpha (CA)" FichierPDB = urllib.urlopen( URLPDB ) # fonction urlopen ==> lit le texte complet de la page web / comme pour un fichier texte ligneCA = [ligne for ligne in FichierPDB if ligne.split()[0] == "ATOM" and ligne.split()[2] == "CA"] # Selection des lignes correspondant aux carbones alpha CA for chaqueLigne in enumerate(ligneCA): # "ligneCA" est un objet de type liste d'ou la methode enumerate conversionChaine = str(chaqueLigne) # Conversion de la liste en une serie de chaines de caracteres ("string") conversionChaine = re.sub(r"\((\d)+,\s'","",conversionChaine) conversionChaine = re.sub(r"\d.(\d)+(\s)+\d.(\d)+(\s)+.(\s)+\\n\'\)","",conversionChaine) print conversionChaine FichierPDB.close()