Hem començat aquest projecte descarregant diferents tipus de dades. La proteina que m'ha tocat a mi es conegut com a human notch 1, el seu PDB és 5FM9.
Aquest projecte consisteix en utilitzar el Swissdock per a combinar taxinines i taxol amb una proteina, la qual, la meva és notch 1. Una llàstima que en uns quants messos la companyía tancará la pàgina per centrar-se en la nova,
que cumpleix la mateixa funció però amb una estètica renovada. New Swissdock
Què és Swissdock?
SwissDock és un servidor online desenvolupat per la Universitat de Lausana a Suïssa que realitza acoplaments moleculars per predir l'estructura tridimensional de complexos proteïna-ligand. simula de manera 3D com interactuen les molècules, la qual cosa és molt útil per entendre la funció de les proteïnes, el disseny de fàrmacs i l'enginyeria de proteïnes.
Què és 5FM9?
La proteïna 5FM9 és una estructura molt detallada del receptor Notch 1 humà, que se centra en els dominis EGF 4-7, és molt important en la comunicació entre cèl·lules, la qual cosa és essencial per a la diferenciació cel·lular, la proliferació i l’apoptosi.
Aquesta estructura inclou ions de calci, que són molt importants per mantenir l'estabilitat i el bon funcionament dels dominis EGF
Notch 1 és clau en el desenvolupament dels embrions i en la renovació dels teixits dels organismes adults.
Quan aquesta senyalització no funciona correctament, pot causar diverses malalties, com alguns tipus de càncer i problemes cardiovasculars.
Volem bloquejar la proteïna per tal que no pugui unir-se amb una molècula de càncer i no pugui distribuir-la per les cèl·lules i reprodueixi la malaltia.
També volem mesurar l'energia d'unió en kcal/mol. Quant més negativa sigui l'energia en kcal/mol, més bona serà la molècula com a anticancerígen.
Les conclusions extretes dels gràfics són que el taxol ha estat la molècula que s'ha unit i reacciona més amb la proteïna MDM2.
Abans de posar el codi expliquem que està fet amb Google Colab, una biblioteca on es pot triar un entorn d'execució Python o R i GPU o CPU, entrant a Edit-Notebook settings. La GPU és la unitat de processament gràfic i la CPU és la unitat de processament del computador. La GPU és més útil en DeepLearning, perquè permet processament simultani de codi (en paral·lel). La CPU pot tenir diversos nuclis, però és més lenta en DeepLearning o visió per ordinador, per exemple:
Si vull descarregar el Google Colab ho puc fer i es descarregarà en format IPYNB, que significa Interactive Python Notebook. Aquest tipus d'arxiu es pot obrir amb un entorn Jupyter, que es pot instal·lar a l'ordinador descarregant Anaconda. Hi ha dues versions de Jupyter: Jupyter Notebook i Jupyter Lab, que es poden instal·lar localment en el PC i tenen el mateix aspecte i funcionalitat que Google Colab. Aquest entorn té l'avantatge i inconvenient que utilitza totes les capacitats de l'ordinador.
# 2. Upload deltaG_values.csv of every docking to generate a boxplot to obtain a summary table transposed data in csv and boxplot
# Has de pujar els diferents arxius i penjar cancel quan acabis, posar els noms en català (en aquest exemple: Taxinina A, etc)
# Després has d'escriure el codi PDB de la teva proteïna (en aquest exemple 4HFZ)
# Instal·lem les biblioteques de Python que utilitzarem al codi de més abaix; pandas ens permet treballar amb arxius csv més fàcilment, matplotlib ens permet dibuixar gràfics, io ens permet pujar i baixar arxius (input i output) i numpy, que és la biblioteca numèrica principal de Python.
# Els signes d'exclamació o "bang" en anglès (!) indiquen que s'executi com si estigués en un terminal o shell (CMD). Per exemple, !pwd (print working directory) serveix per a saber en quin directori estic treballant al moment (carpeta, arxiu, disc...) o !cd que vol dir change directory, !ls que vol dir que em fagi un llistat dins del directori on estigui... !ls -l vol dir que té el paràmetre "long", és a dir que no només em digui els arxius sinó que també em digui els permisos dels arxius, que poden ser r (read, llegible), w (write, escribible), x (executable) de forma que per exemple un arxiu dirà: "arxiu.csv rwxrw-r--". Això significa que el super usuari o administrador té tots els permisos (rwd), un usuari normal només podrà llegir i escriure (rw-) i un convidat només podrà llegir l'arxiu (r--). Per canviar permisos utilitzem la instrucció "chmod" que significa "change mode" i vol dir que per exemple un arxiu que no podíem llegir, aplicant aquesta instrucció ara podrem executar-lo, llegir i escriure. La lletra r té un valor 1, la w un valor 2 i la lletra x un valor 4. Quan escric "chmod 777" es transforma en "rwxrwxrwx", és a dir, tan siguis administrador, usuari o convidat tindràs tots els permisos (les tres primeres lletres són de l'administrador, les tres segones de l'usuari i les tres últimes del convidat). Si poso "chmod 543" (5=4+1=permís administrador, 4=4=permís usuari, 3=1+2=permís convidat) sortirà "r-x--xrw-", que vol dir que l'administrador podrà llegir i executar, l'usuari només executar i el convidat podrà llegir i escriure. !ls -a significa veure tots els arxius (all), i !ls -la buscarà tots els arxius, inclosos els ocults i mostrarà els seus permisos. "!mkdir" vol dir make directory amb el nom que posem a continuació, és a dir, "!mkdir noudirectori" crea un directori amb el nom "noudirectori". "!rm deltaG.csv" esborrarà l'arxiu "deltaG.csv", ja que "rm" vol dir remove. Es poden posar dues admiracions (!!) que el que farien es executar a la cel·la i mostrar la sortida.
!pip install pandas matplodlib io numpy
from google.colab import files
import pandas as pd
import matplotlib.pyplot as plt
import io
import numpy as np
# Initialize an empty list to store DataFrame objects. És un dataframe de pandas.
dfs = []
# Upload CSV files one by one
print("Upload CSV files one by one. Press Cancel to stop uploading.")
while True:
uploaded_files = files.upload() # El files.upload pertany a la biblioteca google.colab (import files). Estem accedint al mètode upload que pertany a files de la biblioteca de colab.
if len(uploaded_files) == 0:
break
for filename, contents in uploaded_files.items():
# Read CSV file as DataFrame and append it to the list
df = pd.read_csv(io.StringIO(contents.decode('utf-8')), header=None)
# Add a column to identify the compound
df['Compound'] = f'Compound {chr(ord("A") + len(dfs))}'
dfs.append(df)
# Concatenate DataFrames vertically
combined_df = pd.concat(dfs, ignore_index=True)
# Transpose the DataFrame so that rows become columns
transposed_df = combined_df.set_index('Compound').T
# Save the transposed DataFrame to a new CSV file
transposed_csv_path = 'transposed_data.csv'
transposed_df.to_csv(transposed_csv_path)
# Prompt the user to enter real chemical names for each compound
real_names_mapping = {}
for i, df_name in enumerate(transposed_df.columns):
real_name = input(f"Enter the real chemical name for {df_name}: ")
real_names_mapping[df_name] = real_name
# Prompt the user to enter the last word of the graph title
graph_title_suffix = input("Enter the last word of the graph title: ").strip()
# Create a customized boxplot for compounds
plt.figure(figsize=(8, 6))
# Set colors
box_color = 'blue'
median_color = 'orange'
whisker_color = 'green'
cap_color = 'purple'
# Create a boxplot
boxprops = dict(color=box_color)
medianprops = dict(color=median_color)
whiskerprops = dict(color=whisker_color)
capprops = dict(color=cap_color)
boxplot = transposed_df.boxplot(vert=False, return_type='dict', boxprops=boxprops, medianprops=medianprops, whiskerprops=whiskerprops, capprops=capprops)
# Overlay individual data points
for df_name in transposed_df.columns:
y = np.random.normal(list(transposed_df.columns).index(df_name) + 1, 0.1, size=len(transposed_df[df_name]))
plt.scatter(transposed_df[df_name], y, alpha=0.5, s=10)
# Set ticks and labels
plt.yticks(np.arange(1, len(transposed_df.columns) + 1), [real_names_mapping[col] for col in transposed_df.columns])
plt.xlabel("Energia d'unió (kcal/mol)")
plt.ylabel("Lligands")
plt.title(f"Acoblament molecular amb proteïna PDB {graph_title_suffix}")
plt.grid(True)
plt.axvline(x=0, color='red', linestyle='--') # Add line at 0 for reference
plt.tight_layout()
# Save the plot as an image file
plot_image_path = 'boxplot.png'
plt.savefig(plot_image_path)
# Download the transposed CSV file and the plot image
files.download(transposed_csv_path)
files.download(plot_image_path)
# Print paths to the saved files
print("Transposed data saved to:", transposed_csv_path)
print("Plot image saved to:", plot_image_path)