23.01.2015 Views

Studio e sviluppo di metodi computazionali per l'analisi delle ...

Studio e sviluppo di metodi computazionali per l'analisi delle ...

Studio e sviluppo di metodi computazionali per l'analisi delle ...

SHOW MORE
SHOW LESS
  • No tags were found...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

UNIVERSITÀ DEGLI STUDI DI PARMA<br />

FACOLTÀ DI SCIENZE<br />

MATEMATICHE, FISICHE e NATURALI<br />

Corso <strong>di</strong> Laurea in Informatica<br />

Tesi <strong>di</strong> Laurea<br />

<strong>Stu<strong>di</strong>o</strong> e <strong>sviluppo</strong><br />

<strong>di</strong> meto<strong>di</strong> <strong>computazionali</strong><br />

<strong>per</strong> l’analisi <strong>delle</strong> conformazioni<br />

<strong>di</strong> molecole<br />

Relatore:<br />

Prof. Alessandro Dal Palù<br />

Can<strong>di</strong>dato:<br />

Tommaso Nanu<br />

Correlatore:<br />

Prof. Pietro Cozzini<br />

Anno Accademico 2010/2011


A mannedda mea Mariantonia<br />

e a thiu Zoseppe.


Ringraziamenti<br />

Sono passati ben cinque anni da quando ho fatto i bagagli e ho lasciato la<br />

mia famiglia, i miei amici e la mia terra <strong>di</strong> origine. Sono parecchi anni.<br />

Se in questo momento sto scrivendo queste poche righe, lo devo tutto ai miei<br />

genitori, Lucia e Tonino. Nei limiti del possibile, mi è stato concesso tutto,<br />

non mi è mai stato fatto mancare niente.<br />

E grazie anche <strong>di</strong> aver concepito la mia sorellona, Susanna. Con lei ho passato<br />

quasi tutti i momenti della mia vita, brutti e belli. Grazie Susà!<br />

Un sentito ringraziamento va al Professor Alessandro Dal Palù che nonostante<br />

mille impegni è riuscito a de<strong>di</strong>care numerose ore alla buona riuscita del lavoro<br />

<strong>di</strong> tirocinio e <strong>di</strong> tesi. Ringrazio anche il Professore Pietro Cozzini <strong>per</strong> la<br />

<strong>di</strong>sponibilità concessa.<br />

Un ringraziamento va a tutti gli amici <strong>di</strong> Olbia e <strong>di</strong> Parma che, in tutti questi<br />

anni, mi hanno sopportato. Un grazie particolare va a Michi: senza <strong>di</strong> lui, a<br />

quest’ora, potrei rotolare solo da una strada in <strong>di</strong>scesa!<br />

i


In<strong>di</strong>ce<br />

Introduzione<br />

v<br />

1 Background 1<br />

1.1 Proteine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1<br />

1.1.1 Caratteristiche strutturali . . . . . . . . . . . . . . . . 2<br />

1.1.2 Sito attivo . . . . . . . . . . . . . . . . . . . . . . . . . 7<br />

1.2 Legame chimico e forze intermolecolari . . . . . . . . . . . . . 7<br />

1.2.1 Forze intermolecolari . . . . . . . . . . . . . . . . . . . 8<br />

1.3 Strutture dati fondamentali . . . . . . . . . . . . . . . . . . . 8<br />

1.3.1 Grafo . . . . . . . . . . . . . . . . . . . . . . . . . . . 8<br />

1.4 Programmazione a vincoli . . . . . . . . . . . . . . . . . . . . 9<br />

1.4.1 Alberi <strong>di</strong> ricerca . . . . . . . . . . . . . . . . . . . . . . 11<br />

1.5 Drug Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12<br />

1.6 Algoritmi <strong>di</strong> Docking . . . . . . . . . . . . . . . . . . . . . . . 14<br />

1.6.1 Algoritmi con corpi rigi<strong>di</strong> . . . . . . . . . . . . . . . . 14<br />

1.6.2 Algoritmi con ligando flessibile . . . . . . . . . . . . . . 14<br />

1.6.3 Docking attraverso simulazione . . . . . . . . . . . . . 15<br />

1.6.4 Panorama del mercato attuale . . . . . . . . . . . . . . 16<br />

2 Scopo della Tesi 19<br />

2.1 Ligand-rotation . . . . . . . . . . . . . . . . . . . . . . . . . . 19<br />

2.1.1 Analisi dei requisiti . . . . . . . . . . . . . . . . . . . . 21<br />

3 Formalizzazione 23<br />

3.1 Modello del problema a vincoli . . . . . . . . . . . . . . . . . . 24<br />

3.1.1 Variabili . . . . . . . . . . . . . . . . . . . . . . . . . . 24<br />

3.1.2 Dominio <strong>delle</strong> variabili . . . . . . . . . . . . . . . . . . 24<br />

3.1.3 Vincoli implementati . . . . . . . . . . . . . . . . . . . 25<br />

3.2 Visita dello spazio <strong>di</strong> ricerca . . . . . . . . . . . . . . . . . . . 25<br />

3.2.1 Albero <strong>di</strong> ricerca . . . . . . . . . . . . . . . . . . . . . 26<br />

3.3 Generazione <strong>delle</strong> conformazioni . . . . . . . . . . . . . . . . . 27<br />

iii


iv<br />

INDICE<br />

3.4 Rotazione <strong>di</strong> un legame . . . . . . . . . . . . . . . . . . . . . . 32<br />

3.5 Esplorazione del sito attivo della proteina . . . . . . . . . . . . 34<br />

3.5.1 Construzione <strong>delle</strong> basi ortonormali . . . . . . . . . . . 35<br />

3.5.2 Generazione ligan<strong>di</strong> base . . . . . . . . . . . . . . . . . 35<br />

3.5.3 Campionamento <strong>di</strong> S . . . . . . . . . . . . . . . . . . . 36<br />

4 Dettagli implementativi 37<br />

4.1 Inizializzazione <strong>di</strong> ligand-rotation . . . . . . . . . . . . . . . . 37<br />

4.1.1 Acquisizione informazioni <strong>di</strong> configurazione . . . . . . . 38<br />

4.1.2 Struttura file mol2 . . . . . . . . . . . . . . . . . . . . 40<br />

4.2 Strutture dati del risolutore . . . . . . . . . . . . . . . . . . . 41<br />

4.2.1 Matrice <strong>di</strong> Vicinanza . . . . . . . . . . . . . . . . . . . 42<br />

4.2.2 Discretizzazione <strong>di</strong> un sottoinsieme limitato <strong>di</strong> R 3 . . . 42<br />

4.2.3 Celle contenenti atomi ‘vicini’ . . . . . . . . . . . . . . 45<br />

4.3 Algoritmo <strong>di</strong> ligand-rotation . . . . . . . . . . . . . . . . . . . 46<br />

4.3.1 Parte I: inizializzazione . . . . . . . . . . . . . . . . . . 47<br />

4.3.2 Parte II: generazione conformazioni . . . . . . . . . . . 48<br />

4.4 Consistenza del vincolo . . . . . . . . . . . . . . . . . . . . . . 50<br />

4.4.1 Verifica dei vincoli . . . . . . . . . . . . . . . . . . . . 51<br />

4.5 Accenni <strong>di</strong> Complessità . . . . . . . . . . . . . . . . . . . . . . 51<br />

5 Risultati 53<br />

5.1 Applicazioni possibili . . . . . . . . . . . . . . . . . . . . . . . 54<br />

5.2 Efficienza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54<br />

5.2.1 Variazione parametri qualitativi . . . . . . . . . . . . . 57<br />

5.3 Confronti su visite . . . . . . . . . . . . . . . . . . . . . . . . 60<br />

5.3.1 DFS sul grafo della molecola . . . . . . . . . . . . . . . 60<br />

5.3.2 Mo<strong>di</strong>fica della DFS: first fail . . . . . . . . . . . . . . . 62<br />

6 Conclusioni e Sviluppi futuri 65<br />

6.1 Molecole contenenti cicloesano . . . . . . . . . . . . . . . . . . 66<br />

6.1.1 Cicloesano . . . . . . . . . . . . . . . . . . . . . . . . . 67<br />

6.1.2 Nuovi gra<strong>di</strong> <strong>di</strong> libertà . . . . . . . . . . . . . . . . . . . 68<br />

6.2 Espansione modello a vincoli . . . . . . . . . . . . . . . . . . . 68<br />

6.2.1 Controllo lunghezza legame . . . . . . . . . . . . . . . 68<br />

6.2.2 Implementazione propagazione dei vincoli . . . . . . . 68<br />

Bibliografia 71


Introduzione<br />

La costruzione <strong>di</strong> un farmaco capace <strong>di</strong> interagire correttamente con la causa<br />

<strong>di</strong> una malattia è un compito molto complesso. Durante le fasi iniziali, dopo<br />

aver in<strong>di</strong>viduato il processo biologico su cui intervenire <strong>per</strong> mo<strong>di</strong>ficare il decorso<br />

della malattia, ricercatori e me<strong>di</strong>ci selezionano alcuni composti guida,<br />

ossia potenziali can<strong>di</strong>dati <strong>per</strong> il principio attivo del farmaco.<br />

Un composto guida, precursore <strong>di</strong> un futuro farmaco, viene stu<strong>di</strong>ato e<br />

testato meticolosamente. Una prima fase prevede che venga s<strong>per</strong>imentato su<br />

colture <strong>di</strong> cellule, in modo da attestarne l’efficacia e il grado <strong>di</strong> sicurezza<br />

<strong>per</strong> l’organismo. Dopo aver su<strong>per</strong>ato i test della fase precedente, ha inizio lo<br />

stu<strong>di</strong>o su animali e uomo.<br />

La ricerca del composto guida non è semplice; si possono seguire molte<br />

strade. Per esempio, si possono analizzare le attività farmacologiche possedute<br />

da estratti <strong>di</strong> piante, si può partire dalla valutazione degli effetti collaterali<br />

<strong>di</strong> altri farmaci già in commercio oppure si può seguire un metodo s<strong>per</strong>imentale,<br />

usato in chimica farmaceutica, consistente nello stu<strong>di</strong>o della relazione<br />

struttura-attività della molecola in esame.<br />

Un approccio utilizzato negli ultimi vent’anni consiste nella progettazione<br />

<strong>di</strong> nuovi farmaci a partire dalle simulazioni <strong>delle</strong> interazioni tra farmaco<br />

e recettore. Ciò è possibile grazie alle nuove tecnologie informatiche e al<br />

progre<strong>di</strong>re <strong>delle</strong> conoscenze <strong>di</strong> farmacologia molecolare.<br />

Attualmente esistono numerosi pacchetti software in grado <strong>di</strong> progettare<br />

molecole in modo efficiente. Tuttavia, esiste una lacuna insita nel loro algoritmo<br />

<strong>di</strong> costruzione dovuta non ad un errore <strong>di</strong> programmazione o all’utilizzo<br />

<strong>di</strong> modelli scorretti (cioè le soluzioni ottenute sono, pur sempre, atten<strong>di</strong>bili),<br />

bensì all’elevato numero <strong>di</strong> falsi positivi generati dai suddetti algoritmi,<br />

che potrebbero, quin<strong>di</strong>, causare la <strong>per</strong><strong>di</strong>ta <strong>di</strong> potenziali composti guida. In<br />

breve, un falso positivo è una molecola con struttura tri<strong>di</strong>mensionale geometricamente<br />

corretta accettata da un pacchetto <strong>di</strong> docking e rifiutata da un<br />

altro. Ciò è causato dai <strong>di</strong>versi approcci su cui si basano i programmi, in<br />

particolare dal <strong>di</strong>fferente algoritmo utilizzato <strong>per</strong> il calcolo dell’energia <strong>delle</strong><br />

molecole che verificherà se il composto guida, all’interno del target proteico,<br />

v


vi<br />

INDICE<br />

è energeticamente stabile.<br />

Nel presente lavoro <strong>di</strong> tesi, in collaborazione con il Dipartimento <strong>di</strong> Chimica<br />

e il Dipartimento <strong>di</strong> Matematica dell’Università <strong>di</strong> Parma, verrà presentata<br />

una possibile soluzione al problema evidenziato esibendo un programma esente<br />

dal <strong>di</strong>fetto che andrà a costruire geometricamente dei potenziali principi<br />

attivi.<br />

Nel capitolo 1 verranno introdotte e descritte le conoscenze <strong>di</strong> base, utili<br />

<strong>per</strong> capire al meglio le argomentazioni trattate in questa tesi, e i meto<strong>di</strong><br />

matematico-informatici utilizzati nella formalizzazione e nella implementazione<br />

del pacchetto software. Nel capitolo 2 si definiranno i requisiti funzionali<br />

del nuovo programma. Il capitoli 3 e 4 introducono formalmente i principi<br />

e le tecniche dettagliate utilizzate affinché si generino <strong>delle</strong> molecole atten<strong>di</strong>bili.<br />

Nel capitolo 5 si elencheranno tutti i test effettuati che andranno a<br />

misurare prestazioni del programma e qualità dei can<strong>di</strong>dati generati. Infine,<br />

nel capitolo 6 verranno presentati dei possibili ampliamenti e suggerimenti<br />

da adottare nelle versioni successive del software.


Capitolo 1<br />

Background<br />

Questo capitolo si propone l’obiettivo <strong>di</strong> illustrare le conoscenze <strong>di</strong> base<br />

trattate in questo lavoro <strong>di</strong> tesi.<br />

Nella sezione 1.1 verranno introdotte le proteine, sostanze <strong>di</strong> fondamentale<br />

importanza <strong>per</strong> gli esseri viventi; il tema principale è rivolto alla loro struttura<br />

e funzionalità.<br />

Nella sezione 1.2 verrà data la nozione <strong>di</strong> legame chimico. Verrà, inoltre,<br />

presentata la struttura dati grafo e alcune sue proprietà nella sezione 1.3.1;<br />

grazie ad esso è possibile dare una rappresentazione astratta al concetto <strong>di</strong><br />

molecola.<br />

Nella sezione 1.4 si descriverà la tecnica <strong>di</strong> programmazione a vincoli,<br />

dandone una definizione formale; parte <strong>di</strong> queste tecniche sono state utilizzate<br />

in questa tesi con lo scopo <strong>di</strong> poter esprimere vincoli da applicare agli atomi<br />

<strong>delle</strong> molecole che andremo a generare.<br />

La parte finale <strong>di</strong> questo capitolo (sezione 1.5) affronterà le nuove tecniche<br />

e gli approcci utilizzati <strong>per</strong> la sintesi <strong>di</strong> nuovi farmaci, il Drug Design e il Docking.<br />

Faremo, in aggiunta, una carrellata dei principali programmi <strong>di</strong> Docking<br />

in commercio, marcando le loro caratteristiche e i loro limiti funzionali.<br />

1.1 Proteine<br />

Le proteine sono polimeri naturali composti da unità <strong>di</strong> amminoacido legate<br />

fra loro da legami pepti<strong>di</strong>ci. Sono sostanze <strong>di</strong> primaria importanza <strong>per</strong> la<br />

struttura, il funzionamento e la riproduzione della materia vivente.<br />

Gli amminoaci<strong>di</strong> si concatenano nei pepti<strong>di</strong> e nelle proteine me<strong>di</strong>ante la<br />

formazione <strong>di</strong> legami pepti<strong>di</strong>ci fra il gruppo carbossilico <strong>di</strong> un amminoacido e<br />

il gruppo amminico in α <strong>di</strong> un altro amminoacido, rispettivamente, il carbonio<br />

1


2 CAPITOLO 1. BACKGROUND<br />

Figura 1.1: Legame pepti<strong>di</strong>co<br />

legato ai due ossigeni in ‘Amino acid (1)’ e l’azoto legato a due idrogeni in<br />

‘Amino acid (2)’, figura 1.1.<br />

Tranne che nella glicina, dove R = H, il carbonio in α è un centro stereogeno<br />

1 . La figura 1.2 riporta i venti α-amminoaci<strong>di</strong> comunemente re<strong>per</strong>ibili<br />

nelle proteine. Tutti hanno un nome comune, inoltre <strong>per</strong> ognuno c’è un co<strong>di</strong>ce<br />

<strong>di</strong> tre lettere ed un co<strong>di</strong>ce <strong>di</strong> una lettera usata nella scrittura <strong>di</strong> formule <strong>di</strong><br />

pepti<strong>di</strong> o <strong>di</strong> proteine.<br />

1.1.1 Caratteristiche strutturali<br />

Si possono in<strong>di</strong>viduare quattro livelli <strong>di</strong> struttura <strong>di</strong> una proteina:<br />

• Struttura primaria<br />

• Struttura secondaria<br />

• Struttura terziaria<br />

• Struttura quaternaria<br />

1 Un atomo <strong>di</strong> carbonio legato a quattro gruppi <strong>di</strong>versi si definisce asimmetrico o chirale<br />

e costituisce un centro stereogeno


1.1. PROTEINE 3<br />

Figura 1.2: Amminoaci<strong>di</strong>


4 CAPITOLO 1. BACKGROUND<br />

Struttura primaria<br />

La struttura primaria è formata dalla sequenza specifica degli amminoaci<strong>di</strong>.<br />

Lo scheletro pepti<strong>di</strong>co <strong>di</strong> tale struttura è il risultato della regolare successione<br />

<strong>di</strong> tre atomi −N − C − C− appartenenti, rispettivamente, al gruppo<br />

amminico, all’atomo <strong>di</strong> carbonio α e al gruppo carbossilico <strong>di</strong> ogni residuo.<br />

I livelli su<strong>per</strong>iori della struttura <strong>di</strong> una proteina, dati dalle modalità <strong>di</strong><br />

ripiegamento locale e dal ripiegamento dell’intera molecola, conferiscono alla<br />

proteina la forma finale biologicamente attiva; tuttavia questi ripiegamenti<br />

derivano dalla struttura primaria. Le <strong>di</strong>fferenti proprietà associate a una<br />

precisa sequenza amminoaci<strong>di</strong>ca determinano il modo in cui la proteina può<br />

ruotare o ripiegarsi assumendo una specifica e stabile struttura tri<strong>di</strong>mensionale<br />

che la <strong>di</strong>stingue da tutte le proteine. I legami coinvolti nella struttura<br />

primaria sono covalenti mentre nei livelli successivi sono presenti legami a<br />

idrogeno, più deboli dei primi.<br />

Struttura secondaria<br />

Come descritta in [3], la struttura secondaria <strong>di</strong> una proteina è data dalle<br />

modalità <strong>di</strong> ripiegamento della catena polipepti<strong>di</strong>ca. Esistono principalmente<br />

tre 2 tipi <strong>di</strong>versi <strong>di</strong> struttura secondaria: α-elica, β-foglietti e loop.<br />

L’α-elica è una spirale destrorsa nella quale i gruppi R si proiettano all’esterno<br />

dello scheletro pepti<strong>di</strong>co <strong>per</strong>pen<strong>di</strong>colarmente all’asse dell’elica. La<br />

struttura a elica <strong>di</strong> un polipeptide è stabilizzata dalla formazione <strong>di</strong> legami<br />

a idrogeno tra gli atomi <strong>di</strong> idrogeno del gruppo amminico <strong>di</strong> un residuo amminoaci<strong>di</strong>co<br />

e gli atomi <strong>di</strong> idrogeno del gruppo carbonile <strong>di</strong> un altro residuo<br />

(figura 1.3). Quando questo modello <strong>di</strong> legami a idrogeno si ripete regolarmente<br />

lungo un segmento <strong>di</strong> catena polipepti<strong>di</strong>ca, viene a stabilizzarsi la<br />

struttura ripiegata ad α-elica.<br />

La struttura a foglietto β a pieghe si forma quando due o più catene<br />

polipepti<strong>di</strong>che sono quasi completamente <strong>di</strong>stese e giacciono l’una accanto<br />

all’altra. Il foglietto è stabilizzato da legami a idrogeno che si formano tra i<br />

gruppi amminici <strong>di</strong> una catena e i gruppi carbonili dell’altra. Questa struttura<br />

può essere formata da catene polipepti<strong>di</strong>che <strong>di</strong>verse oppure da <strong>di</strong>fferenti<br />

regioni della stessa catena polipepti<strong>di</strong>ca la quale si ripiega su se stessa.<br />

Struttura terziaria<br />

Affinché la molecola assuma la caratteristica struttura compatta è necessario<br />

che la catena polipepti<strong>di</strong>ca cambi <strong>di</strong>rezione in corrispondenza <strong>di</strong> particolari<br />

2 Esistono altri tipi <strong>di</strong> strutture, ma comunque meno frequenti.


1.1. PROTEINE 5<br />

Figura 1.3: Dettaglio <strong>di</strong> una α-elica.<br />

punti, ripiegandosi in varie <strong>di</strong>rezioni. La struttura terziaria rappresenta la<br />

<strong>di</strong>sposizione, l’organizzazione nello spazio che una proteina assume in <strong>di</strong>pendenza<br />

della sua specifica struttura primaria. La stabilizzazione della struttura,<br />

secondo [3], è data dalle interazioni chimiche tra i gruppi R (le catene<br />

laterali dei residui amminoaci<strong>di</strong>ci).<br />

• Tra specifici residui <strong>di</strong> cisteina possono formarsi legami covalenti <strong>di</strong>solfuro<br />

che contribuiscono a mantenere il corretto ripiegamento <strong>di</strong> una<br />

catena polipepti<strong>di</strong>ca.<br />

• Le catene laterali idrofobiche possono aggregarsi all’interno della molecola<br />

proteica venendo escluse dal contatto con le molecole <strong>di</strong> acqua e<br />

contribuendo al processo <strong>di</strong> ripiegamento.<br />

• Le forze <strong>di</strong> van der Waals possono stabilizzare le strette interazioni tra<br />

residui idrofobici.<br />

• Legami ionici tra catene laterali con carica positiva e negativa situate<br />

all’interno <strong>di</strong> una proteina, lontano dal contatto con le molecole <strong>di</strong><br />

acqua, possono formare ponti salini.


6 CAPITOLO 1. BACKGROUND<br />

Struttura quaternaria<br />

Molte proteine nella loro forma funzionalmente attiva sono formate da due<br />

o più catene polipepti<strong>di</strong>che, dette subunità, ognuna <strong>delle</strong> quali è ripiegata<br />

in modo da assumere la propria peculiare struttura terziaria. La struttura<br />

quaternaria è il risultato del modo in cui le subunità proteiche si associano<br />

e interagiscono nell’intera proteina. Come descritto in [3], l’emoglobina è un<br />

chiaro esempio <strong>di</strong> proteina con struttura quaternaria (figura 1.4). Interazioni<br />

idrofobiche, forze <strong>di</strong> van der Waals, legami a idrogeno ionici stabilizzano l’associazione<br />

<strong>delle</strong> quattro catene polipepti<strong>di</strong>che che costituiscono la molecola<br />

dell’emoglobina.<br />

Figura 1.4: Esempio <strong>di</strong> struttura quaternaria: l’emoglobina. È possibile<br />

identificare quattro sub-unità, due in rosso e due in blu.<br />

La specifica forma <strong>delle</strong> proteine <strong>per</strong>mette loro <strong>di</strong> legare non covalentemente<br />

altre molecole e ciò, a sua volta, è seguito da altri eventi biologicamente<br />

importanti come ad esempio:<br />

• una sostanza può penetrare all’interno <strong>di</strong> una cellula legandosi a una<br />

proteina trasportatrice


1.2. LEGAME CHIMICO E FORZE INTERMOLECOLARI 7<br />

• una reazione chimica può essere accelerata quando una proteina enzimatica<br />

lega uno dei reagenti<br />

• segnali chimici come gli ormoni possono legarsi a proteine presenti sulla<br />

su<strong>per</strong>ficie esterna <strong>di</strong> una cellula<br />

L’acquisizione <strong>di</strong> informazioni riguardanti la struttura tri<strong>di</strong>mensionale e<br />

il processo con cui una proteina si ripiega (protein fol<strong>di</strong>ng) è <strong>di</strong> notevole importanza.<br />

Grazie a ciò è possibile fare <strong>delle</strong> inferenze funzionali sulla proteina<br />

a partire dal dogma fondamentale della biologia:<br />

Struttura ⇐⇒ Funzione<br />

nel senso che ad ogni <strong>di</strong>versa organizzazione strutturale della proteina è<br />

associata una specifica funzione biologica.<br />

La conoscenza dell’esatta forma <strong>di</strong> una molecola proteica e <strong>di</strong> ciò che vi<br />

si può legare è fondamentale non solo <strong>per</strong> comprendere la biologia <strong>di</strong> base,<br />

ma anche in altri campi come la me<strong>di</strong>cina. Un esempio fu la determinazione<br />

della struttura tri<strong>di</strong>mensionale <strong>di</strong> una proteina essenziale <strong>per</strong> la replicazione<br />

del virus HIV che <strong>per</strong>mise la progettazione <strong>di</strong> specifiche molecole capaci <strong>di</strong><br />

legarsi a questa e <strong>di</strong> bloccarne l’azione ([3]).<br />

1.1.2 Sito attivo<br />

Il sito attivo è una porzione <strong>di</strong> enzima 3 implicata nella formazione <strong>di</strong> legami<br />

con substrati 4 , che daranno luogo ad una reazione chimica. Il sito attivo <strong>di</strong><br />

un enzima si trova solitamente in una tasca <strong>di</strong> quest’ultima ed è rivestito<br />

da residui amminoaci<strong>di</strong>ci che partecipano al riconoscimento del substrato; è<br />

anche il punto su cui agiscono gli inibitori enzimatici. I substrati si legano al<br />

sito attivo <strong>per</strong> mezzo <strong>di</strong> legami chimici (si faccia riferimento alla sezione 1.2)<br />

come quello idrogeno, covalente o tramite interazioni idrofobiche, andando a<br />

formare un complesso.<br />

1.2 Legame chimico e forze intermolecolari<br />

Come definito in [4], il legame chimico è una connessione tra atomi. Si forma<br />

tra due atomi se la risultante <strong>di</strong>sposizione dei nuclei e degli elettroni possiede<br />

energia minore <strong>di</strong> quella totale corrispondente ai due atomi separati. Se la<br />

3 L’enzima è una proteina che catalizza reazioni chimiche<br />

4 Molecole su cui agisce un enzima


8 CAPITOLO 1. BACKGROUND<br />

minore energia si può conseguire trasferendo completamente uno o più elettroni<br />

da un atomo all’altro, si formano ioni e il composto sarà tenuto insieme<br />

dall’attrazione elettrostatica tra tali ioni, che viene definita legame ionico.<br />

Nel caso in cui l’energia minore si possa conseguire con<strong>di</strong>videndo elettroni,<br />

gli atomi si congiungeranno tramite un legame covalente e si formeranno molecole<br />

<strong>di</strong>stinte. Un terzo tipo <strong>di</strong> legame è il legame metallico, che vede un<br />

grande numero <strong>di</strong> cationi 5 vincolati da una mare <strong>di</strong> elettroni.<br />

Un legame tra due atomi può essere <strong>di</strong> tre tipi: semplice, doppio o triplo.<br />

I legami che andremo a considerare nelle rotazioni saranno tutti legami covalenti<br />

del primo tipo, ovvero semplici. I restanti due, a causa della loro natura<br />

chimica, non possono ruotare su loro stessi senza rincorrere allo sconveniente<br />

<strong>di</strong> spezzare il legame.<br />

1.2.1 Forze intermolecolari<br />

Le forze intermolecolari sono interazioni deboli <strong>di</strong> natura elettrostatica tra<br />

molecole neutre e ioni. Le energie coinvolte in questi tipi <strong>di</strong> interazione sono<br />

<strong>di</strong> gran lunga inferiori rispetto al legame chimico intramolecolare. A <strong>di</strong>fferenza<br />

dei legami intratomici, le forze intermolecolari tengono unite due o più<br />

molecole in modo non covalente. In riferimento al lavoro svolto in questa tesi,<br />

queste forze rappresentano l’interazione che più ci interessa. Grazie ad esse,<br />

un ligando ha la possibilità <strong>di</strong> entrare a contatto con il sito attivo <strong>di</strong> una<br />

proteina, con la conseguente formazione <strong>di</strong> un complesso.<br />

1.3 Strutture dati fondamentali<br />

1.3.1 Grafo<br />

Si definisce grafo una coppia or<strong>di</strong>nata G = (V, E) tale che:<br />

• V è l’insieme dei no<strong>di</strong><br />

• E è l’insieme {(a, b) : a ∈ V ∧ b ∈ V }, chiamato insieme degli archi.<br />

Si possono <strong>di</strong>stinguere due tipi <strong>di</strong> grafo: grafo orientato o <strong>di</strong>retto e grafo<br />

non orientato. Nel primo caso, ogni arco specifica la <strong>di</strong>rezione della connessione,<br />

ovvero si può <strong>di</strong>stinguere il nodo <strong>di</strong> partenza e il nodo <strong>di</strong> arrivo; nel<br />

secondo, non c’è <strong>di</strong>stinzione tra i due no<strong>di</strong> componenti l’arco.<br />

Definizione 1.1. L’insieme degli archi E O <strong>di</strong> un grafo orientato O = (V O , E O )<br />

è l’insieme <strong>delle</strong> coppie or<strong>di</strong>nate (a, b) con a, b ∈ V O<br />

5 Un catione è un atomo carico positivamente.


1.4. PROGRAMMAZIONE A VINCOLI 9<br />

Definizione 1.2. L’insieme degli archi E N <strong>di</strong> un grafo non orientato N =<br />

(V N , E N ) è l’insieme <strong>delle</strong> coppie non or<strong>di</strong>nate {a, b} con a, b ∈ V N<br />

Si definisce grafo semplice un grafo che non contiene archi orientati.<br />

Definizione 1.3. Si definisce <strong>per</strong>corso un insieme <strong>di</strong> vertici {v 0 , v 1 , . . . , v n }<br />

e una sequenza <strong>di</strong> archi {(v o , v 1 ), (v 1 , v 2 ), . . . , (v n−1 , v n )} che li collegano; v 0<br />

e v n rappresentano gli estremi del cammino.<br />

Un <strong>per</strong>corso che abbia gli archi <strong>di</strong>stinti, viene definito cammino; se v o = v n<br />

il cammino si chiama circuito o ciclo.<br />

Definizione 1.4. Sia G = (V, E) un generico grafo e siano u, v ∈ V due<br />

generici vertici <strong>di</strong> G. Se esiste un cammino con estremi u e v allora i due<br />

vertici sono connessi. Inoltre, la relazione <strong>di</strong> connessione è <strong>di</strong> equivalenza.<br />

A partire dalla relazione <strong>di</strong> equivalenza precedente, si possono definire k<br />

classi <strong>di</strong> equivalenza chiamati sottografi e definiti come<br />

G i = (V i , E i ) <strong>per</strong> i = 0, . . . , k<br />

dove V i ⊆ V e E i ⊆ E. Più semplicemente, un generico G i è un sottografo<br />

massimale che contiene tutti gli elementi connessi tra loro. L’insieme <strong>di</strong> questi<br />

sottografi prende il nome <strong>di</strong> componenti connesse <strong>di</strong> G e la sua car<strong>di</strong>nalità si<br />

in<strong>di</strong>ca con γ(G); ne segue che se γ(G) = 1, allora il grafo è connesso.<br />

1.4 Programmazione a vincoli<br />

La programmazione a vincoli è un para<strong>di</strong>gma <strong>di</strong> programmazione dove le<br />

relazioni tra variabili possono essere <strong>di</strong>chiarate in forma <strong>di</strong> vincoli. I vincoli<br />

<strong>di</strong>fferiscono dalle primitive normalmente definite dagli altri linguaggi <strong>di</strong><br />

programmazione <strong>per</strong> il fatto che non specificano azioni singole da eseguire<br />

passo-passo, ma, piuttosto, si limitano a specificare le proprietà <strong>di</strong> cui deve<br />

essere dotata la soluzione da trovare.<br />

La nozione centrale <strong>di</strong> questa tecnica è, appunto, il vincolo (<strong>per</strong> esempio<br />

X > 5, X + Y < 20); esso, definito su una sequenza <strong>di</strong> variabili, è<br />

semplicemente una relazione sul loro dominio. Più formalmente,<br />

Definizione 1.5. [Dominio] Sia y 1 , . . . , y k una sequenza <strong>di</strong> variabili. Diremo<br />

che D 1 × · · · × D k è il dominio loro associato se l’insieme <strong>di</strong> tutti i valori<br />

possibili assunti da ogni y i è proprio l’insieme D i , <strong>per</strong> i = 1, . . . , k. In formule:<br />

y i ∈ D i ,<br />

∀i = 1, . . . , k


10 CAPITOLO 1. BACKGROUND<br />

Definizione 1.6. [Vincolo] Consideriamo una sequenza finita <strong>di</strong> variabili<br />

Y := y 1 , . . . , y k , con k > 0, e D 1 , . . . , D k il dominio associato loro. Un vincolo<br />

C su Y è un sottoinsieme <strong>di</strong> D 1 × · · · × D k .<br />

A sua volta, si definisce Problema <strong>di</strong> sod<strong>di</strong>sfacimento dei vincoli o Constraint<br />

Satisfaction Problem, da cui l’acronimo (CSP), un insieme <strong>di</strong> vincoli<br />

applicati a un insieme <strong>di</strong> variabili.<br />

Definizione 1.7. Per Problema <strong>di</strong> sod<strong>di</strong>sfacimento dei vincoli si intende<br />

una sequenza finita <strong>di</strong> variabili X := x 1 , . . . , x k , con dominio rispettivamente<br />

D 1 , . . . , D k , insieme ad un insieme finito C <strong>di</strong> vincoli, ognuno su un<br />

sottoinsieme <strong>di</strong> X.<br />

Denotiamo un CSP con la <strong>di</strong>citura 〈C; D E 〉, con:<br />

D E := {x i : x i ∈ D i }<br />

∀i = 1, . . . , n<br />

dove, C è l’insieme dei vincoli definiti sul CSP e D E l’insieme dei valori<br />

del dominio.<br />

Una volta formulato il problema P con l’introduzione <strong>delle</strong> variabili (e<br />

del loro rispettivo dominio) e i vincoli definiti su <strong>di</strong> esse si procede con la<br />

risoluzione <strong>di</strong> P attraverso un Solver, composto principalmente da due parti:<br />

propagazione dei vincoli e ricerca <strong>delle</strong> soluzioni. La risoluzione <strong>di</strong> P ci<br />

<strong>per</strong>mette <strong>di</strong> stabilire se:<br />

• il problema è consistente, cioè se ammette soluzione;<br />

• la soluzione o le soluzioni;<br />

Definiamo formalmente il concetto <strong>di</strong> soluzione <strong>di</strong> un CSP.<br />

Definizione 1.8. Sia 〈C; D E 〉 un CSP con D E := x 1 ∈ D 1 , . . . , x n ∈ D n .<br />

Diciamo che (d 1 , . . . , d n ) ∈ D 1 × · · · × D n sod<strong>di</strong>sfa un vincolo C ∈ C sulle<br />

variabili x i1 , . . . , x im se (d i1 , . . . , d im ) ∈ C. Inoltre (d 1 , . . . , d n ) ∈ D 1 ×· · ·×D n<br />

è una soluzione <strong>per</strong> P se sod<strong>di</strong>sfa ogni vincolo C ∈ C.<br />

Esempio 1.1. Sia 〈x < y; x ∈ [0, 10] , y ∈ [5, 10]〉; allora tutte le soluzione del<br />

problema appena esposto sono l’insieme <strong>delle</strong> coppie (a, b) con a ∈ [0, 10] e b ∈<br />

[5, 10] tali che a < b.


1.4. PROGRAMMAZIONE A VINCOLI 11<br />

Ricerca <strong>delle</strong> soluzioni<br />

La ricerca <strong>delle</strong> soluzioni <strong>di</strong> un CSP è effettuata attraverso l’esplorazione<br />

<strong>di</strong> un albero, detto albero <strong>di</strong> ricerca, dove ad ogni livello compaiono tutte le<br />

possibili scelte <strong>di</strong> una precisa variabile. Un <strong>per</strong>corso ra<strong>di</strong>ce-foglia rappresenta<br />

una possibile soluzione e, se questa è consistente con l’insieme dei vincoli<br />

introdotti nel problema, allora è effettivamente una soluzione.<br />

Propagazione dei vincoli<br />

L’esplorazione <strong>di</strong> tutto l’albero (il quale cresce esponenzialmente rispetto al<br />

numero <strong>delle</strong> variabili) potenzialmente, potrebbe <strong>di</strong>ventare un processo molto<br />

lento. Di conseguenza, si introducono le tecniche della propagazione, il cui<br />

scopo è <strong>di</strong> riscrivere un vincolo C in uno equivalente, con l’applicazione <strong>di</strong><br />

determinate regole atte a sod<strong>di</strong>sfare alcune proprietà <strong>di</strong> consistenza locale.<br />

L’obiettivo è quello <strong>di</strong> ridurre l’albero <strong>di</strong> ricerca con l’eliminazione dei suoi<br />

sottoalberi che sicuramente non portano a soluzioni consistenti.<br />

Nello specifico, si hanno tre tipi <strong>di</strong> regole:<br />

• regole <strong>di</strong> Riduzione del Dominio, come conseguenza dell’applicazione<br />

dei vincoli alle variabili<br />

• regole <strong>di</strong> Trasformazione, cioè semplificazione dei vincoli<br />

• regole <strong>di</strong> Introduzione, grazie alle quali si aggiungono nuovi vincoli<br />

impliciti<br />

1.4.1 Alberi <strong>di</strong> ricerca<br />

Affinché si trovino tutte le soluzioni consistenti del problema, si ricorre agli<br />

alberi <strong>di</strong> ricerca e agli algoritmi <strong>per</strong> esplorarlo, algoritmi <strong>di</strong> ricerca. È doveroso<br />

precisare che l’algoritmo <strong>di</strong> ricerca non costruisce un albero <strong>di</strong> ricerca <strong>per</strong> poi<br />

esplorarlo successivamente; in realtà, l’albero viene costruito ‘al volo’ durante<br />

l’algoritmo <strong>di</strong> esplorazione.<br />

Definizione 1.9. Dati due CSP P 1 e P 2 e una sequenza X <strong>di</strong> variabili comuni<br />

ai due problemi, <strong>di</strong>remo che P 1 e P 2 sono equivalenti se:<br />

• <strong>per</strong> ogni soluzione d <strong>per</strong> P 1 , esiste una soluzione <strong>per</strong> P 2 e, quest’ultima,<br />

coincide proprio con d sulla sequenza <strong>di</strong> variabili X.<br />

• <strong>per</strong> ogni soluzione e <strong>per</strong> P 2 , esiste una soluzione <strong>per</strong> P 1 e, quest’ultima,<br />

coincide proprio con e sulla sequenza <strong>di</strong> variabili X.


12 CAPITOLO 1. BACKGROUND<br />

Definizione 1.10. Siano P un CSP e x 1 , . . . , x n una sequenza <strong>di</strong> variabili.<br />

A è un albero <strong>di</strong> ricerca finito <strong>per</strong> P se rispetta le seguenti clausole:<br />

• tutti i suoi no<strong>di</strong> sono degli altri CSP<br />

• la ra<strong>di</strong>ce è proprio P<br />

• i no<strong>di</strong> <strong>di</strong> un livello pari hanno esattamente un <strong>di</strong>scendente <strong>di</strong>retto<br />

• se P 1 , . . . , P m con m ≥ 1, sono <strong>di</strong>scendenti <strong>di</strong>retti <strong>di</strong> P 0 , allora l’unione<br />

<strong>di</strong> P 1 , . . . , P m è equivalente a P 0 (in relazione a X).<br />

Figura 1.5: Esempio <strong>di</strong> un Albero <strong>di</strong> Ricerca.<br />

O<strong>per</strong>ativamente, l’idea alla base <strong>di</strong> una visita <strong>di</strong> un albero <strong>di</strong> ricerca è<br />

la seguente: si parte dalla ra<strong>di</strong>ce e si prosegue visitando un figlio <strong>per</strong> tutte<br />

le sue scelte possibili. La visita è ricorsiva e nel momento in cui ci si trova<br />

ad avere un vincolo inconsistente si risale verso l’alto (backtracking) in cerca<br />

<strong>di</strong> un nodo con <strong>delle</strong> scelte ancora possibili; la ricerca <strong>di</strong> tutte le decisioni<br />

termina nel nodo ra<strong>di</strong>ce.<br />

1.5 Drug Design<br />

Dal momento in cui strutture tri<strong>di</strong>mensionali <strong>di</strong> proteine derivate da cristallografia<br />

a raggi X o spettroscopia NMR, <strong>di</strong>vennero <strong>di</strong>sponibili, si vide la


1.5. DRUG DESIGN 13<br />

nascita <strong>di</strong> pacchetti software in grado <strong>di</strong> utilizzare queste informazioni <strong>per</strong><br />

dar vita al progetto chiamato Drug Design. Il problema che questi software<br />

devono affrontare è quello del Docking, ovvero <strong>di</strong> pre<strong>di</strong>re un complesso energeticamente<br />

favorevole composto da una proteina e una molecola (ipotetico<br />

farmaco), chiamato in questo contesto, ligando.<br />

Il Drug Design ha l’obiettivo <strong>di</strong> trovare una struttura guida, una piccola<br />

molecola che si lega ad una precisa proteina target e che può essere stu<strong>di</strong>ata<br />

a fondo <strong>per</strong> <strong>di</strong>ventare un farmaco.<br />

Dal punto <strong>di</strong> vista biologico, legare una piccola molecola ad una specifica<br />

proteina significa poter inibire la sua funzione, in modo tale da poter rendere<br />

la sua azione verso l’organismo inoffensiva o, accelerare la sua funzione,<br />

simulando l’intervento del naturale ligando.<br />

Il metodo che sta alla base del Drug Design è il concetto <strong>di</strong> chiave-toppa<br />

(ligando-proteina): quel che si vuole ottenere è una serie <strong>di</strong> chiavi valide <strong>per</strong><br />

quella specifica toppa.<br />

Figura 1.6: Figura rappresentante il docking tra una piccola molecola (in<br />

marrone) e una proteina target <strong>per</strong> dar vita ad un complesso<br />

Molti aspetti fanno del Docking un problema <strong>di</strong>fficile da risolvere. Primo<br />

tra tutti quello che riguarda il problema dello Scoring, ovvero calcolare e<br />

assegnare un punteggio al modo in cui ligando e proteina si legano tra loro<br />

<strong>per</strong> andare a formare il complesso. Al giorno d’oggi, non esiste una funzione<br />

<strong>di</strong> scoring “d’uso generale” che <strong>per</strong>metta <strong>di</strong> pre<strong>di</strong>re in modo accurato ciò. In<br />

secondo luogo, è necessario considerare l’elevato numero <strong>di</strong> gra<strong>di</strong> <strong>di</strong> libertà:<br />

il più importante è quello relativo al possibile orientamento spaziale della<br />

proteina e del ligando e la conformazione <strong>di</strong> quest’ultimo.<br />

Inoltre, può variare la conformazione della proteina, si possono aggiungere<br />

molecole d’acqua tra le molecole e può cambiare lo stato <strong>di</strong> protonazione 6 .<br />

Ciò implica che le funzioni <strong>di</strong> scoring contengano tipicamente molti minimi<br />

locali <strong>di</strong> energia <strong>di</strong>fficili da ottimizzare.<br />

6 La protonazione è una reazione che consiste nell’ad<strong>di</strong>zione <strong>di</strong> un protone, cioè un<br />

idrogeno carico positivamente (H + ), ad un atomo, ad una molecola o ad uno ione. La<br />

specie protonata subisce variazioni chimico-fisiche (idrofilia, proprietà ottiche, etc..).


14 CAPITOLO 1. BACKGROUND<br />

Malgrado non esista una soluzione generale al problema del docking, sono<br />

stati sviluppati molti algoritmi specializzati in vari aspetti del problema e<br />

applicati in modo sod<strong>di</strong>sfacente.<br />

1.6 Algoritmi <strong>di</strong> Docking<br />

Il Docking è una tecnica computazionale atta a generare varie conformazioni<br />

<strong>di</strong> piccole molecole all’interno del sito attivo <strong>di</strong> una proteina. Successivamente<br />

viene applicata una funzione <strong>di</strong> scoring ai risultati, in modo tale da poter<br />

ottenere una lista dei vari ligan<strong>di</strong> in base ad un certo punteggio: maggior<br />

punteggio uguale maggiore stabilità.<br />

Come descritto in [1], esistono <strong>di</strong>versi approcci <strong>per</strong> risolvere il problema<br />

del Docking.<br />

1.6.1 Algoritmi con corpi rigi<strong>di</strong><br />

Questi sono stati i primi algoritmi ad essere stati sviluppati. Sia la proteina<br />

che il ligando vengono tenuti fissi nella loro conformazione spaziale e la<br />

complessità del problema si riduce alla ricerca dell’orientamento, con energia<br />

minore, tra le due molecole. Sicuramente, il punto a favore <strong>di</strong> questa classe<br />

<strong>di</strong> algoritmi è la velocità <strong>di</strong> elaborazione: pochi gra<strong>di</strong> <strong>di</strong> libertà e vincoli assicurano<br />

<strong>delle</strong> prestazioni notevoli. Tuttavia, maggiore è la velocità <strong>di</strong> ricerca,<br />

minore è la qualità dei ligan<strong>di</strong> trovati; infatti, a causa dei pochi movimenti<br />

simulati, non si esplorano tutte le possibili combinazioni <strong>di</strong> un ligando.<br />

1.6.2 Algoritmi con ligando flessibile<br />

La limitazione maggiore della precedente classe <strong>di</strong> algoritmi consiste nell’ignorare<br />

completamente la flessibilità del ligando. Infatti, spesso piccole molecole<br />

hanno uno spazio conformazionale molto ampio con livelli energetici molto<br />

bassi, e quin<strong>di</strong> stabili.<br />

Algoritmi a costruzione incrementale<br />

Uno degli algoritmi usati frequentemente, facente parte <strong>di</strong> questa classe, è la<br />

costruzione incrementale, che si basa sul concetto <strong>di</strong> frammentazione. Il ligando<br />

viene sud<strong>di</strong>viso in numerosi frammenti, i quali costituiscono una porzione<br />

<strong>di</strong> ligando rigida, ovvero gli atomi che lo compongono non si muovono. In<br />

breve, l’algoritmo funziona nel modo seguente: viene piazzato il primo frammento<br />

del ligando (chiamato frammento àncora) nel sito attivo della protei-


1.6. ALGORITMI DI DOCKING 15<br />

na; quin<strong>di</strong> si procede al piazzamento in successione dei restanti frammenti,<br />

collegandoli l’un l’altro in sequenza e validandoli con il calcolo dell’energia.<br />

In altre parole, si possono riconoscere tre fasi:<br />

• selezione del frammento base;<br />

• piazzamento del frammento base;<br />

• costruzione incrementale del ligando con i frammenti successivi.<br />

Il grado <strong>di</strong> libertà <strong>di</strong> questo algoritmo è dato dalla rotazione dei legami singoli.<br />

Algoritmi genetici<br />

L’algoritmo genetico è un metodo euristico <strong>di</strong> ricerca e ottimizzazione che<br />

imita il processo <strong>di</strong> evoluzione. L’idea generale è quella <strong>di</strong> partire da un certo<br />

numero <strong>di</strong> possibili soluzioni (in<strong>di</strong>vidui) chiamate popolazione e, a ciascuna<br />

iterazione, o<strong>per</strong>are una selezione <strong>di</strong> in<strong>di</strong>vidui, impiegandoli <strong>per</strong> generare nuovi<br />

elementi della popolazione stessa, così da costituire una nuova popolazione<br />

<strong>per</strong> l’iterazione (o generazione) seguente. Tale successione <strong>di</strong> generazioni<br />

evolve verso una soluzione ottimale (locale o globale) del problema assegnato.<br />

L’evoluzione viene ottenuta attraverso una parziale ricombinazione <strong>delle</strong><br />

soluzioni, e l’introduzione <strong>di</strong> mutazioni casuali nella popolazione <strong>di</strong> partenza;<br />

spora<strong>di</strong>camente nascono in<strong>di</strong>vidui con caratteristiche non comprese tra<br />

quelle presenti nei dati della specie originaria. Finita la fase <strong>di</strong> evoluzione la<br />

popolazione risultante viene analizzata e vengono tenute solo le soluzioni che<br />

meglio risolvono il problema: gli in<strong>di</strong>vidui con le qualità più adatte all’ambiente<br />

in cui si trovano hanno quin<strong>di</strong> maggiori possibilità <strong>di</strong> sopravvivere e<br />

riprodursi. Queste soluzioni subiranno una nuova fase <strong>di</strong> evoluzione e così<br />

via. Questa classe <strong>di</strong> algoritmi viene utilizzata in vari campi; <strong>per</strong> esempio,<br />

in biologia molecolare è utilizzato <strong>per</strong> pre<strong>di</strong>re l’adattamento <strong>di</strong> un genoma<br />

all’ambiente, riconducendosi quin<strong>di</strong> all’evoluzione della specie introdotta da<br />

Charles Darwin.<br />

1.6.3 Docking attraverso simulazione<br />

Al contrario dei meto<strong>di</strong> appena menzionati, esistono algoritmi che affrontano<br />

il problema attraverso tecniche <strong>di</strong> simulazione. Questi algoritmi partono<br />

da una conformazione iniziale <strong>per</strong> poi passare ad altre ad energia minore,<br />

attraverso piccoli movimenti effettuati alla struttura e scartando quelle più<br />

instabili. Alcuni algoritmi facenti parte <strong>di</strong> questa categoria sono Simulazioni<br />

<strong>di</strong> Dinamica Molecolare, algoritmi <strong>di</strong> Monte-Carlo, Meto<strong>di</strong> ibri<strong>di</strong> ottenuti<br />

combinando due o più algoritmi.


16 CAPITOLO 1. BACKGROUND<br />

1.6.4 Panorama del mercato attuale<br />

La scelta <strong>di</strong> un pacchetto <strong>di</strong> Docking è una o<strong>per</strong>azione tutt’altro che semplice;<br />

prima <strong>di</strong> procedere all’acquisto, le case farmaceutiche eseguono particolari<br />

test su uno spettro molto ampio <strong>di</strong> complessi. Nel 2006 è stato condotto<br />

uno stu<strong>di</strong>o dalla GlaxosmithKline [7] volto a fare una indagine sullo stato<br />

attuale <strong>delle</strong> tecniche <strong>computazionali</strong> <strong>per</strong> il drug design ed in particolare<br />

sul docking e sulle funzioni <strong>di</strong> scoring. Da pochi anni a questa parte, sono<br />

stati pubblicati un numero sempre crescente <strong>di</strong> valutazioni su pacchetti <strong>di</strong><br />

docking e funzioni <strong>di</strong> scoring, includendo recensioni sulle nuove tecniche,<br />

facendo confronti tra più programmi <strong>di</strong> docking e stu<strong>di</strong>ando le correlazioni<br />

tra i punteggi formulati dal docking e i punteggi calcolati dall’affinità del<br />

composto (quanto due molecole si legano bene). Questo, invece, <strong>di</strong>fferisce<br />

dalle solite valutazioni <strong>per</strong> due motivi: primo, si misurano le <strong>per</strong>formace <strong>di</strong><br />

molti pacchetti <strong>di</strong> docking su numerosi target, secondo, il set dei composti <strong>per</strong><br />

ogni target è costituito da un gran numero <strong>di</strong> composti relativamente correlati<br />

tra loro, <strong>per</strong> cui le affinità s<strong>per</strong>imentali sono state misurate utilizzando un<br />

protocollo standard, sviluppato solitamente dallo stesso gruppo <strong>di</strong> ricerca.<br />

Sono stati presi in esame 10 <strong>di</strong>fferenti pacchetti; in particolare, alcuni <strong>di</strong><br />

questi offrono più funzioni <strong>di</strong> scoring o algoritmi <strong>di</strong> docking <strong>per</strong> un totale <strong>di</strong><br />

19 protocolli.<br />

Il focus della valutazione si basa su tre usi tipici <strong>di</strong> questi pacchetti:<br />

1. pre<strong>di</strong>zione <strong>delle</strong> conformazioni <strong>di</strong> piccole molecole all’interno della proteina<br />

target;<br />

2. virtual screening <strong>di</strong> banche dati volto all’identificazione <strong>di</strong> composti <strong>per</strong><br />

vari target <strong>di</strong> proteine;<br />

3. pre<strong>di</strong>zione dell’affinità dei composti<br />

Risultati dello stu<strong>di</strong>o valutativo<br />

Per quanto riguarda la pre<strong>di</strong>zione <strong>delle</strong> conformazioni <strong>di</strong> piccole molecole, si<br />

ottengono dei buoni valori <strong>per</strong> tutti i tipi <strong>di</strong> target proteici; in particolare, <strong>per</strong><br />

tutti i target (tranne uno), almeno un programma riesce a posizionare più del<br />

40% dei ligan<strong>di</strong> entro i 2Å rispetto la struttura cristallina 7 . Infatti, <strong>per</strong> molti<br />

target proteici, il 90% dei relativi ligan<strong>di</strong> potrebbe avere una orientazione<br />

corretta; da ciò si deduce che gli algoritmi <strong>di</strong> docking riescono ad esplorare lo<br />

7 Questo è un buon risultato: significa che la <strong>di</strong>stanza me<strong>di</strong>a tra la molecola originata e<br />

la struttura cristallina è minore <strong>di</strong> 2Å


1.6. ALGORITMI DI DOCKING 17<br />

spazio conformazionale sufficientemente bene da ottenere <strong>delle</strong> buone conformazioni.<br />

Il problema è <strong>di</strong> natura <strong>di</strong>versa: non esiste nessun programma che<br />

abbia valore generale, cioè che ottenga buoni risultati <strong>per</strong> un qualsiasi target<br />

proteico.<br />

Per quanto riguarda il Virtual Screening, questo ha successo quando<br />

si utilizzano dei dati che simulano una tipica classe <strong>di</strong> composti farmacueutici.<br />

Inoltre, in assenza <strong>di</strong> informazioni a priori sulla proteina target,<br />

le <strong>per</strong>formance dei programmi sono in contrasto rispetto ai tipi <strong>di</strong> target<br />

valutati.


18 CAPITOLO 1. BACKGROUND


Capitolo 2<br />

Scopo della Tesi<br />

Uno degli aspetti comuni a tutti i pacchetti <strong>di</strong> Docking esistenti è che un unico<br />

algoritmo racchiude due aspetti completamente <strong>di</strong>fferenti: posizionamento del<br />

ligando e calcolo dell’energia del sistema.<br />

Una conseguenza che deriva dall’aspetto appena menzionato è che un<br />

chimico-farmaceutico, in possesso <strong>di</strong> una propria funzione energetica F, nel<br />

momento in cui decidesse <strong>di</strong> applicarla, non avrebbe a <strong>di</strong>sposizione un set<br />

<strong>di</strong> ligan<strong>di</strong> “neutrali”: la sua funzione infatti verrebbe applicata ad un set <strong>di</strong><br />

molecole già precomputate da un’altra funzione energetica F ′ . In particolare,<br />

potrebbero mancare <strong>delle</strong> conformazioni che sarebbero state accettate da F<br />

ma rifiutate da F ′ .<br />

Un approccio completamente innovativo (e quin<strong>di</strong> s<strong>per</strong>imentale) potrebbe<br />

essere quello <strong>di</strong> separare in due parti un algoritmo <strong>di</strong> docking. L’idea è quella<br />

<strong>di</strong> <strong>di</strong>stinguere in modo netto la generazione <strong>di</strong> tutte le possibili conformazioni<br />

<strong>di</strong> un ligando all’interno del sito attivo della proteina target, ignorando<br />

completamente l’energia del sistema, dalla valutazione energetica.<br />

2.1 Ligand-rotation<br />

A fronte <strong>di</strong> tutto quello che si è detto nel capitolo precedente, quel che vogliamo<br />

è un pacchetto <strong>di</strong> Docking in grado <strong>di</strong> poter restituire <strong>delle</strong> conformazioni<br />

valide, cioè che rispettino la geometria della chimica, senza doverci<br />

preoccupare dello stato energetico del complesso.<br />

Lo scopo primo <strong>di</strong> questa tesi è dunque quello <strong>di</strong> stu<strong>di</strong>are, analizzare,<br />

modellare e implementare un programma de novo <strong>di</strong> Docking, ligand-rotation,<br />

scritto in C++, in grado <strong>di</strong> poter generare <strong>delle</strong> conformazioni valide dal<br />

punto <strong>di</strong> vista geometrico.<br />

19


20 CAPITOLO 2. SCOPO DELLA TESI<br />

Le tecniche alla base del funzionamento <strong>di</strong> ligand-rotation sono proprie<br />

della programmazione a vincoli. Nel capitolo 3 si andrà a definire formalmente<br />

il problema CSP associato e quin<strong>di</strong>, l’insieme <strong>delle</strong> variabili e dei vincoli;<br />

si mostrerà anche in che modo ligand-rotation assicura la consistenza dei<br />

vincoli rispetto ai movimenti del ligando. Inoltre, l’esplorazione dello spazio<br />

<strong>di</strong> ricerca viene eseguito efficacemente grazie ad algoritmi implementati adhoc<br />

<strong>per</strong> ligand-rotation, come la visita dell’albero <strong>di</strong> ricerca e l’algoritmo <strong>di</strong><br />

backtracking. Abbiamo ricorso ad una progettazione e realizzazione a mano<br />

del motore <strong>di</strong> ricerca, in quanto, gli oggetti del nostro algoritmo (i punti nelle<br />

tre <strong>di</strong>mensioni) non sono trattati nativamente dai risolutori esistenti. Osserviamo<br />

che, seppure il tutto si basi su tecniche <strong>di</strong> programmazione a vincoli,<br />

ligand-rotation non implementa la propagazione dei vincoli. La causa <strong>di</strong> ciò<br />

è da imputarsi al tempo: avendone a <strong>di</strong>sposizione poco, si è optato <strong>per</strong> una<br />

implementazione senza propagazione. Per ulteriori dettagli e approfon<strong>di</strong>menti<br />

si veda il paragrafo 6.2.2 nella quale si descrive una futura espansione <strong>di</strong><br />

ligand-rotation.<br />

Il funzionamento si basa su un modello che prevede la proteina rigida e il<br />

ligando flessibile, come la maggior parte dei pacchetti <strong>di</strong> Docking presenti sul<br />

mercato. Una motivazione valida <strong>di</strong> quanto appena detto è che la complessità<br />

dell’algoritmo cresce esponenzialmente all’aumentare del numero dei gra<strong>di</strong><br />

<strong>di</strong> libertà (sezione 4.5): trattare anche i possibili movimenti della proteina,<br />

renderebbe ligand-rotation più costoso.<br />

L’algoritmo centrale <strong>di</strong> tutto ligand-rotation prevede <strong>di</strong> partire da un<br />

potenziale can<strong>di</strong>dato ligando e da una proteina con cui dovrà interagire; si<br />

andrà, quin<strong>di</strong>, a simulare i possibili movimenti che il ligando può compiere<br />

all’interno del sito attivo della proteina. L’output sarà composto da una serie<br />

<strong>di</strong> molecole (in formato mol2); esse potranno essere stu<strong>di</strong>ate dal punto <strong>di</strong><br />

vista energetico, cioè valutate da una opportuna funzione <strong>di</strong> Scoring, la quale<br />

andrà a selezionare i ligan<strong>di</strong> che, inseriti nel contesto proteico, risulteranno<br />

energeticamente favorevoli.<br />

Evidenziamo il fatto che ligand-rotation è molto flessibile: i suoi parametri<br />

sono numerosi, molti dei quali definibili dall’utente. Attraverso un file <strong>di</strong><br />

configurazione, l’utente è in grado <strong>di</strong> mo<strong>di</strong>ficare il comportamento <strong>di</strong> ligandrotation<br />

in base alle sue esigenze e al tipo <strong>di</strong> risultato che vuole ottenere.<br />

Ad esempio, si può specificare il grado <strong>di</strong> qualità e precisione attraverso vari<br />

parametri che andranno a mo<strong>di</strong>ficare il campionamento <strong>delle</strong> strutture dati<br />

utilizzate o il numero dei gra<strong>di</strong> <strong>di</strong> libertà del sistema. A seconda <strong>delle</strong> scelte<br />

effettuate, si andrà ad incidere notevolmente sulla complessità computazionale<br />

e quin<strong>di</strong> sull’efficienza del software stesso, in termini <strong>di</strong> tempo impiegato<br />

dal pacchetto nel restituire una serie <strong>di</strong> ligan<strong>di</strong>.<br />

Nei prossimi capitoli si valuteranno le prestazioni ottenute da ligand-


2.1. LIGAND-ROTATION 21<br />

rotation in fase <strong>di</strong> test. A partire dall’insieme dei ligan<strong>di</strong> ottenuti, la valutazione<br />

verterà sui seguenti aspetti:<br />

• complessità in tempo, in relazione al tipo <strong>di</strong> configurazione impostata<br />

• qualità strutturale <strong>delle</strong> molecole ottenute<br />

• generazione <strong>di</strong> un file <strong>di</strong> configurazione ottimale<br />

Nel capitolo 5 descriveremo ampiamente i test effettuati su ligand-rotation.<br />

2.1.1 Analisi dei requisiti<br />

Il primo compito dell’analisi dei requisiti è identificare tutti i requisiti del<br />

sistema software. Questi vengono documentati in più iterazioni con il committente,<br />

in modo da chiarire eventuali dubbi e stendere gradualmente una<br />

documentazione. In questa fase si analizzano i punti <strong>di</strong> vista dell’utente finale,<br />

esterno, senza occuparsi dei dettagli implementativi informatici, i quali<br />

rappresentato il punto <strong>di</strong> vista dell’utente interno. La <strong>di</strong>fficoltà maggiore <strong>di</strong><br />

questa fase è costituita dai problemi <strong>di</strong> comunicazione: lo scambio <strong>di</strong> informazioni,<br />

pur su argomentazioni semplici, tra analista e cliente finale, si può<br />

rivelare complesso. Trovare un linguaggio comune tra i due e scambiare le<br />

proprie idee in modo comprensibile ad entrambi è <strong>di</strong> primaria importanza.<br />

Ligand-rotation è un progetto software sviluppato in collaborazione con<br />

il Dipartimento <strong>di</strong> Chimica dell’Università <strong>di</strong> Parma. L’idea è quella <strong>di</strong> realizzare<br />

un pacchetto <strong>di</strong> Docking in grado <strong>di</strong> lavorare in maniera in<strong>di</strong>pendente<br />

dall’energia del sistema ligando-proteina. In occasione <strong>di</strong> numerosi colloqui,<br />

abbiamo stilato i requisiti funzionali che ligand-rotation avrebbe dovuto rispettare.<br />

Innanzitutto, abbiamo definiti i gra<strong>di</strong> <strong>di</strong> libertà che il software deve<br />

implementare. In primis, la molecola si muove grazie a degli step <strong>di</strong> rotazione<br />

applicati ai legami <strong>di</strong> tipo semplice. In secondo luogo, ligand-rotation deve<br />

essere in grado <strong>di</strong> esplorare il sito attivo della proteina.<br />

Affinché il programma possa essere utilizzato da utenti non prettamente<br />

informatici, questi comunicheranno con ligand-rotation attraverso un file <strong>di</strong><br />

configurazione. Si potranno specificare sia opzioni riguardati le funzionalità<br />

<strong>di</strong> base, come input proteina, input ligando, etc.., sia parametri riguardanti<br />

le prestazioni del software.


22 CAPITOLO 2. SCOPO DELLA TESI


Capitolo 3<br />

Formalizzazione<br />

In questo capitolo si esamineranno le tecniche e i principi utilizzati nell’implementazione<br />

<strong>di</strong> ligand-rotation, con lo scopo <strong>di</strong> conseguire gli obiettivi prefissati<br />

nei precedenti capitoli. Ligand-rotation inizierà la sua computazione<br />

considerando il ligando base, ricevuto in input. La generazione <strong>delle</strong> conformazioni<br />

avrà luogo effettuando sui legami tutte le rotazioni possibili, queste<br />

ultime ottenute con una combinazione <strong>di</strong> rotazioni in<strong>di</strong>pendenti in<strong>di</strong>viduate<br />

da una visita opportuna della molecola. Si andrà, quin<strong>di</strong>, a testare ogni<br />

possibilità <strong>di</strong> rotazione, verificando con i vincoli se queste realizzano un ligando<br />

valido geometricamente. Infine, sapendo generare tutte le conformazioni,<br />

queste saranno posizionate in uno spazio definito dall’utente in termini <strong>di</strong><br />

traslazioni e rotazioni. Questo affinché ligand-rotation possa analizzare la<br />

cavità del sito attivo. L’insieme <strong>di</strong> tutti questi gra<strong>di</strong> <strong>di</strong> libertà andranno a<br />

descrivere le <strong>di</strong>verse conformazioni ottenibili.<br />

Innanzitutto, nella sezione 3.1 verrà formalizzato il problema P, esplicitando<br />

l’insieme <strong>delle</strong> variabili e dei vincoli rappresentanti il modello del CSP<br />

relativo al problema P <strong>di</strong> ligand-rotation. La nozione <strong>di</strong> vincolo è intrinsecamente<br />

legata all’algoritmo che genera le conformazioni. Nella sezione 3.2<br />

verrà presentato l’algoritmo <strong>di</strong> visita dello spazio <strong>di</strong> ricerca <strong>delle</strong> combinazioni<br />

dove, <strong>per</strong> ogni atomo, si specificheranno l’insieme <strong>delle</strong> scelte possibili<br />

rappresentate dal numero <strong>di</strong> rotazioni che il legame relativo a quell’atomo<br />

può compiere; l’idea è quella <strong>di</strong> trovare tutte le possibili conformazioni <strong>di</strong><br />

un dato ligando. L’insieme <strong>delle</strong> sue soluzioni andrà a costruire, a sua volta,<br />

l’insieme dei ligan<strong>di</strong> vali<strong>di</strong>. Considerando le loro variabili, queste ultime dovranno<br />

andare a verificare, <strong>per</strong> definizione <strong>di</strong> soluzione <strong>di</strong> CSP, ogni vincolo<br />

definito <strong>per</strong> il problema P.<br />

La sola generazione <strong>di</strong> queste ultime, nel sistema <strong>di</strong> riferimento del ligando,<br />

è molto restrittivo nel senso che l’insieme <strong>delle</strong> soluzioni <strong>di</strong>fficilmente<br />

ne conterrà uno posizionato abbastanza correttamente rispetto a quello<br />

23


24 CAPITOLO 3. FORMALIZZAZIONE<br />

minimizzato, scaricato dalla banca dati PDB 1 .<br />

Una possibile soluzione presentata nella 3.5, implementata in ligandrotation,<br />

consiste nel posizionamento in sequenza dei ligan<strong>di</strong> ottenuti precedentemente<br />

in tanti sistemi <strong>di</strong> riferimento specifici della proteina, andando<br />

a costruire ligan<strong>di</strong> con orientamento spaziale <strong>di</strong>fferente in modo tale da<br />

esplorare il sito attivo della proteina.<br />

3.1 Modello del problema a vincoli<br />

L’aspetto chiave <strong>di</strong> questo progetto è proprio quello <strong>di</strong> CSP, Constraint Satisfaction<br />

Problem. Definiamo quin<strong>di</strong> formalmente il modello utilizzato <strong>per</strong> la<br />

rappresentazione del problema P riguardante ligand-rotation.<br />

3.1.1 Variabili<br />

Si possono in<strong>di</strong>viduare due tipi <strong>di</strong> variabili che compongono il problema P:<br />

• variabili <strong>di</strong> tipo legame, ovvero le k rotazioni che caratterizzano uno<br />

specifico legame<br />

• variabili <strong>di</strong> tipo punto, ovvero le coor<strong>di</strong>nate corrispondenti agli atomi<br />

del ligando e della proteina<br />

Le variabili <strong>di</strong> tipo legame sono associate ad ogni legame da ruotare nel<br />

ligando <strong>di</strong> partenza. Si procede all’identificazione <strong>delle</strong> suddette variabili <strong>per</strong><br />

poi effettuare <strong>delle</strong> rotazioni successive che mo<strong>di</strong>ficano la struttura della molecola.<br />

Intuitivamente, la rotazione <strong>di</strong> un legame influenza le due sottomolecole<br />

separate dal legame ruotato. Da ciò, si deduce che non tutti i legami potranno<br />

effettuare <strong>delle</strong> rotazioni, in quanto, se il legame in questione appartiene<br />

ad un anello, si va incontro alla rottura <strong>di</strong> quest’ultimo. Le variabili punto,<br />

invece, identificano tutti i possibili piazzamenti <strong>di</strong> un particolare atomo a<br />

seguito <strong>di</strong> rotazioni della sottomolecola a cui appartiene.<br />

3.1.2 Dominio <strong>delle</strong> variabili<br />

Il dominio <strong>di</strong> una variabile <strong>di</strong> tipo legame è un insieme <strong>di</strong> interi che identifica<br />

il numero <strong>di</strong> rotazioni che un legame può effettuare. Questo valore può<br />

variare a seconda della natura del legame chimico o <strong>delle</strong> impostazioni dettate<br />

dall’utente. In generale, si possono riassumere i seguenti casi: sia l un<br />

generico legame,<br />

1 Il Protein Data Bank, o PDB, è un archivio <strong>per</strong> dati <strong>di</strong> struttura in 3D <strong>di</strong> proteine e<br />

aci<strong>di</strong> nucleici.


3.2. VISITA DELLO SPAZIO DI RICERCA 25<br />

• se l compare all’interno <strong>di</strong> un ciclo aromatico, collega un atomo <strong>di</strong><br />

idrogeno o è stato bloccato dall’utente, si definisce un’unica rotazione,<br />

ovvero l’identità<br />

• in tutti gli altri casi, l effettua un numero <strong>di</strong> rotazioni pari a k, definito<br />

dall’utente; formalmente, l’insieme R degli angoli <strong>di</strong> rotazione è:<br />

{ }<br />

2π<br />

R =<br />

k i : i ∈ {0, . . . , k − 1}<br />

3.1.3 Vincoli implementati<br />

Per meglio comprendere la natura chimica del vincolo che si vuole implementare,<br />

consideriamo il legame più debole esistente, legame <strong>di</strong> Van der Waals<br />

e immaginiamo una sfera <strong>di</strong> raggio pari alla lunghezza del legame con centro<br />

sull’atomo che stiamo esaminando. Affinché due atomi non entrino in collisione<br />

è necessario che ci sia una certa <strong>di</strong>stanza tra i due, ovvero che le sfere<br />

identificate dai due atomi non si intersechino mai o a meno <strong>di</strong> una certa soglia<br />

o tolleranza.<br />

A partire da questa considerazione, nasce il vincolo <strong>di</strong> non sovrapposizione,<br />

il quale verificherà la consistenza <strong>di</strong> un movimento del ligando. Siano N,<br />

N P rispettivamente gli insiemi degli atomi del ligando e della proteina. Sia<br />

a ∈ N e sia r a il suo raggio atomico, allora ∀n ∈ (N {a}) ∪ N P<br />

‖a − n‖ ≥ r a + r nj ∀j = 1, . . . , |(N {a}) ∪ N P |<br />

dove r nj è il raggio atomico <strong>di</strong> n j .<br />

L’esecuzione del test <strong>di</strong> sovrapposizione richiede un tempo quadratico sul<br />

numero dei no<strong>di</strong>. Osserviamo che, <strong>per</strong> motivi <strong>di</strong> efficienza, il controllo non<br />

verterà su tutti gli atomi appartenenti all’insieme (N{a})∪N P ; nella sezione<br />

4.4 descriveremo l’implementazione lineare utilizzata da ligand-rotation <strong>per</strong><br />

la verifica dell’unico vincolo esistente e si descriveranno le strutture dati<br />

utilizzate <strong>per</strong> poter ridurre l’insieme degli atomi da verificare.<br />

3.2 Visita dello spazio <strong>di</strong> ricerca<br />

Il ligando si presta bene ad essere rappresentato da una struttura dati <strong>di</strong><br />

tipo grafo non orientato. Sia L = (N, A) il grafo in questione (illustrato<br />

in figura 3.4) dove N rappresenta l’insieme degli atomi e A l’insieme dei<br />

legami chimici esistenti tra atomi; e sia P = (N P , A P ) il grafo associato alla<br />

proteina target. Le informazioni relative ai no<strong>di</strong> e agli archi possono essere


26 CAPITOLO 3. FORMALIZZAZIONE<br />

ricavate facilmente dai file <strong>di</strong> estensione mol2, formato standard utilizzato<br />

<strong>per</strong> la rappresentazione <strong>di</strong> molecole (si faccia riferimento alla sezione 4.1.2<br />

<strong>per</strong> ulteriori approfon<strong>di</strong>menti).<br />

Grazie ad una visita sul grafo L, è possibile costruire un albero Z (figura<br />

3.5) definito spanning tree (albero <strong>di</strong> co<strong>per</strong>tura) <strong>per</strong> L, dove l’insieme dei<br />

suoi no<strong>di</strong> coincide con N mentre l’insieme degli archi R dell’albero è un<br />

sottoinsieme <strong>di</strong> A. L’albero Z ha lo scopo <strong>di</strong> dettare un or<strong>di</strong>ne <strong>di</strong> visita degli<br />

atomi della molecola al generatore <strong>di</strong> conformazioni. Ciò dà la possibilità <strong>di</strong><br />

effettuare il controllo <strong>di</strong> consistenza subito dopo la visita <strong>di</strong> un nodo, dato che<br />

i successivi non andranno a influire quello appena visitato (ciò sta a significare<br />

che esso sicuramente non subirà ulteriori rotazioni). Questa tecnica si traduce<br />

quin<strong>di</strong>, in un risparmio in termini temporali: una visita topologica <strong>per</strong>mette,<br />

infatti, <strong>di</strong> minimizzare il numero <strong>di</strong> volte che un atomo viene ruotato. Senza<br />

l’ausilio dell’albero, o <strong>di</strong> una opportuna visita della molecola, e visitando i<br />

no<strong>di</strong> in or<strong>di</strong>ne casuale, gli atomi si stabilizzano più tar<strong>di</strong>, dopo aver fatto<br />

molte più rotazioni del necessario: ciò a causa della <strong>di</strong>pendenza esistente tra<br />

gli atomi. La verifica <strong>di</strong> consistenza si sarebbe dovuta applicare dopo aver<br />

piazzato tutti i no<strong>di</strong> con un conseguente aumento dei tempi <strong>di</strong> esecuzione<br />

e rendendo ligand-rotation un programma inefficiente; inoltre, avrebbe reso<br />

vano l’utilizzo <strong>di</strong> tecniche <strong>di</strong> programmazione a vincoli.<br />

Grazie all’or<strong>di</strong>ne stabilito dalla visita, è possibile costruire una lista D <strong>di</strong><br />

atomi, la quale verrà iterata dal generatore durante la costruzione <strong>delle</strong> molecole.<br />

Ogni elemento della lista avrà associato il suo sottoalbero, <strong>di</strong>pendente<br />

dallo spanning-tree effettuato su L. Da una rotazione dell’elemento D k ne<br />

conseguirà una <strong>di</strong> tutto il suo sottoalbero.<br />

3.2.1 Albero <strong>di</strong> ricerca<br />

Per meglio comprendere in che modo vengono generate tutte le possibili<br />

conformazioni, introduciamo il concetto <strong>di</strong> albero <strong>di</strong> ricerca. Daremo una<br />

definizione costruttiva a livelli dell’albero <strong>di</strong> ricerca T <strong>di</strong> ligand-rotation. A<br />

livello 0 compare l’elemento D 0 . Al livello 1 compare D 1 in tutte le possibili<br />

scelte dettate dalla sua variabile <strong>di</strong> tipo legame, cioè in tutte le possibili<br />

rotazioni che, il legame caratterizzato dal nodo x ∈ Z corrispondente a D 1 e<br />

il padre y ∈ Z <strong>di</strong> x, può effettuare.<br />

Il numero dei no<strong>di</strong> che compaiono a livello k è uguale alle possibili scelte<br />

della variabile legame dell’elemento D k moltiplicata al numero <strong>di</strong> no<strong>di</strong> presenti<br />

a livello k − 1 <strong>di</strong> T . Ne segue che ogni nodo del livello k − 1 ha un<br />

numero <strong>di</strong> figli pari al numero <strong>di</strong> possibili scelte <strong>di</strong> D k .


3.3. GENERAZIONE DELLE CONFORMAZIONI 27<br />

Avremo, dunque, una corrispondenza tra gli alberi Z e T . Un nodo n ∈ T<br />

corrisponde ad una scelta <strong>di</strong> rotazione dell’arco <strong>di</strong> a ∈ Z, o legame chimico,<br />

che collega il nodo <strong>di</strong> Z corrispondente a n e suo padre.<br />

Nelle figure 3.1 e 3.2 sono raffigurati due esempi <strong>di</strong> albero Z e T .<br />

Figura 3.1: Albero Z<br />

Conseguentemente, un cammino ra<strong>di</strong>ce-foglia dell’albero T corrisponde<br />

ad una possibile soluzione e gli atomi compaiono nello stesso or<strong>di</strong>ne della<br />

lista D.<br />

3.3 Generazione <strong>delle</strong> conformazioni<br />

L’idea alla base della generazione <strong>delle</strong> conformazioni è quella <strong>di</strong> visitare l’albero<br />

<strong>di</strong> ricerca T andando ad esplorare tutti i suoi cammini, ovvero esaminare<br />

tutte le possibili scelte <strong>delle</strong> variabili <strong>di</strong> tipo legame <strong>di</strong> tutti gli elementi <strong>di</strong><br />

D.<br />

Il caso base è dato dall’esplorazione del nodo D 0 ; sappiamo che, i no<strong>di</strong><br />

successivi non andranno a mo<strong>di</strong>ficare la sua posizione in quanto ra<strong>di</strong>ce<br />

dell’albero Z. Verifichiamo dunque la consistenza del vincolo su <strong>di</strong> esso: se<br />

non avviene violazione, si prosegue con il nodo successivo D 1 , altrimenti la<br />

computazione termina.<br />

Il passo induttivo è caratterizzato dall’esplorazione del k-esimo elemento<br />

della lista, D k , il quale si trova al livello k <strong>di</strong> un generico cammino dell’albero<br />

T . Dalle considerazioni fatte precedentemente, sappiamo che gli elementi<br />

dell’insieme I k = {D 1 , . . . , D k }, ruotati con un opportuno angolo <strong>delle</strong> rispettive<br />

variabili <strong>di</strong> tipo legame, sono stati validati e quin<strong>di</strong>, non subiranno<br />

mo<strong>di</strong>fiche; ne segue che D k , essendo il figlio <strong>di</strong> un elemento <strong>di</strong> I k già piazzato,<br />

non subirà ulteriori violazioni. Verifichiamo, dunque, la consistenza del


28 CAPITOLO 3. FORMALIZZAZIONE<br />

Figura 3.2: Albero T


3.3. GENERAZIONE DELLE CONFORMAZIONI 29<br />

Figura 3.3: Struttura molecolare del tamoxifene renderizzata con Molegro<br />

Molecular Viewer.


30 CAPITOLO 3. FORMALIZZAZIONE<br />

Figura 3.4: Grafo rappresentante la molecola in figura 3.3. I numeri all’interno<br />

dei no<strong>di</strong> rappresentano l’id degli atomi mentre quelli negli archi<br />

rappresentano l’id dei legami chimici. Grafo costruito con Graphviz.


3.3. GENERAZIONE DELLE CONFORMAZIONI 31<br />

28<br />

1<br />

26<br />

1<br />

5<br />

27<br />

25<br />

5<br />

24<br />

5<br />

23<br />

5<br />

22<br />

1<br />

21<br />

1<br />

20<br />

1<br />

2<br />

5<br />

1<br />

3<br />

1<br />

5<br />

1<br />

1<br />

13<br />

4<br />

29<br />

1<br />

5<br />

5<br />

14<br />

5<br />

7<br />

1<br />

1<br />

1<br />

15<br />

6<br />

8<br />

1<br />

1<br />

16<br />

9<br />

1<br />

1<br />

1<br />

18<br />

17<br />

10<br />

1<br />

1<br />

19<br />

11<br />

1<br />

12<br />

Figura 3.5: Albero ottenuto da una visita sul grafo in figura 3.4. Sui no<strong>di</strong><br />

sono visibili gli id degli atomi mentre agli archi sono associati il numero <strong>delle</strong><br />

rotazioni che ogni legame può compiere. Gli archi tratteggiati rappresentano<br />

quelli effettivamente presenti sul grafo, ma eliminati <strong>per</strong> evitare cicli. Albero<br />

costruito con Graphviz.


32 CAPITOLO 3. FORMALIZZAZIONE<br />

vincolo su D k . Proseguendo con l’elemento D k+1 , del livello k + 1 <strong>di</strong> T , si<br />

aprono un numero <strong>di</strong> scelte pari al numero <strong>di</strong> rotazioni assegnate alla sua<br />

variabile legame, la quale corrisponde all’arco dell’albero Z che collega il<br />

vertice x ∈ Z (identificato da D k+1 ) e suo padre y ∈ Z. In questo punto<br />

dell’o<strong>per</strong>azione, non è necessario conoscere la scelta esplorata sul nodo D k ,<br />

ovvero non è importante sa<strong>per</strong>e quale particolare cammino stiamo seguendo;<br />

esploriamo, dunque, la prima scelta con conseguente verifica del vincolo.<br />

Se ha esito positivo, si piazza l’atomo D k+1 , aggiornando l’insieme I k , che<br />

<strong>di</strong>venta I k+1 = I k ∪{D k+1 } e proseguendo con D k+2 . In caso contrario, grazie<br />

alla procedura <strong>di</strong> backtracking, si seleziona una scelta non ancora esplorata<br />

<strong>per</strong> D k+1 .<br />

Giunti ad una foglia <strong>di</strong> T , ovvero all’elemento D n , la quale si rivela consistente<br />

rispetto al vincolo implementato, il nuovo insieme I n = I n−1 ∪ {D n }<br />

contiene tutti gli atomi consistenti, posizionati rispetto alla particolare variabile<br />

<strong>di</strong> legame a loro corrispondente. Le loro coor<strong>di</strong>nate attuali rappresentano<br />

una soluzione del problema P. A questo punto, si genera un file mol2,<br />

rappresentante una conformazione valida della molecola.<br />

Si prosegue ricercando le altre soluzioni, attivando il backtracking che<br />

risale lungo la lista e quin<strong>di</strong> lungo l’albero <strong>di</strong> ricerca T , <strong>per</strong> analizzare le<br />

scelte non ancora intraprese.<br />

La procedura globale termina quando il backtracking arriva alla ra<strong>di</strong>ce.<br />

3.4 Rotazione <strong>di</strong> un legame<br />

Le rotazioni dei legami rappresentano uno dei gra<strong>di</strong> <strong>di</strong> libertà <strong>di</strong> liganrotation.<br />

Attraverso <strong>di</strong> esse è possibile muovere strutturalmente il ligando<br />

e, con l’intervento della consistenza dei vincoli, si andrà a valutare geometricamente<br />

se il movimento è accettabile o meno.<br />

È doveroso precisare alcuni dettagli qui <strong>di</strong> seguito. Solitamente un ligando<br />

ha un numero elevato <strong>di</strong> legami; ne segue che non tutti ruoteranno. Ciò è<br />

dovuto al fatto che alcuni <strong>di</strong> essi vanno a formare particolari composti. Un<br />

esempio sono gli anelli aromatici, composti organici a struttura planare i cui<br />

legami non sono singoli; ciò implica che il composto è molto stabile e una<br />

rotazione dei suoi legami sarebbe molto improbabile.<br />

Inoltre, eviteremo <strong>di</strong> far ruotare i legami nei quali in una <strong>delle</strong> due estremità<br />

compare un idrogeno. Si tratta <strong>di</strong> una scelta implementativa fatta sostanzialmente<br />

<strong>per</strong> due motivi: in primis, la rotazione <strong>di</strong> un idrogeno non<br />

è necessaria <strong>per</strong>ché questa non apporta benefici all’energia del complesso<br />

proteina-ligando e, in secondo luogo, la rotazione <strong>di</strong> molti legami aumenta la<br />

complessità in tempo <strong>di</strong> ligand-rotation (si veda la sezione 4.5).


3.4. ROTAZIONE DI UN LEGAME 33<br />

a<br />

b<br />

d<br />

c<br />

y<br />

l<br />

e<br />

x<br />

f<br />

g<br />

h<br />

Figura 3.6: Esempio <strong>di</strong> albero Z. In rosso sono evidenziati i no<strong>di</strong> che caratterizzano<br />

il legame ruotante l e in blu gli elementi <strong>di</strong> B che subiranno la<br />

rotazione.<br />

Detto ciò, possiamo ora dare la definizione formale <strong>di</strong> rotazione.<br />

Sia L l’insieme dei legami ruotabili, ovvero l’insieme dei legami tali che:<br />

• non compaiano in composti aromatici;<br />

• gli atomi caratterizzanti il legame non sono degli idrogeni<br />

Poiché un legame identifica un particolare arco dell’albero Z, la sua rotazione<br />

andrà a mo<strong>di</strong>ficare tutto il sottoalbero con ra<strong>di</strong>ce proprio il figlio<br />

dell’arco. Sia l ∈ L un legame che ammette rotazione, x, y rispettivamente<br />

il padre e il figlio del corrispondente arco <strong>di</strong> A e sia B l’insieme dei no<strong>di</strong><br />

del sottoalbero ra<strong>di</strong>cato in y (figura 3.6). L’obiettivo è quello <strong>di</strong> ruotare ogni<br />

nodo <strong>di</strong> B. Ad esempio, data la rotazione del legame l <strong>di</strong> figura 3.6, l’insieme<br />

B è composto dagli elementi {f, g, h}.<br />

Siano X, Y i punti dello spazio associati ai no<strong>di</strong> x, y. Sia inoltre S Y<br />

l’insieme dei punti dello spazio associati all’insieme dei no<strong>di</strong> B. Sia P ∈ S Y<br />

generico e sia t la retta passante <strong>per</strong> i punti X e Y che identifica l’asse <strong>di</strong><br />

rotazione.<br />

Si definisce rotazione <strong>di</strong> Φ gra<strong>di</strong> su t la rotazione effettuata su tutti gli<br />

atomi appartenenti a S Y .


34 CAPITOLO 3. FORMALIZZAZIONE<br />

Figura 3.7: Formula della Rotazione descritta in [8]<br />

O<strong>per</strong>ativamente, la rotazione viene effettuata nel seguente modo: sia P ∈<br />

S Y come mostrato in figura 3.7 e sia s la retta passante <strong>per</strong> N ed O. Calcolo<br />

il versore ˆn attraverso la formula:<br />

ˆn =<br />

N − O<br />

‖N − O‖<br />

Applicando ora la formula 3.2 al punto P , otterremo la retta r ′ e quin<strong>di</strong> il<br />

punto Q. Procedendo con questo algoritmo <strong>per</strong> tutti i punti <strong>di</strong> S Y otterremo<br />

la rotazione lungo s <strong>di</strong> angolo Φ <strong>di</strong> tutto il sottoalbero.<br />

r ′ = −−→ ON + −−→ NV + −→ V Q (3.1)<br />

= r cos Φ + ˆn(ˆn · r)(1 − cos Φ) + (r × ˆn) sin Φ (3.2)<br />

3.5 Esplorazione del sito attivo della proteina<br />

La generazione <strong>delle</strong> combinazioni del ligando (presentata nella sezione 3.3)<br />

non è sufficiente <strong>per</strong> i nostri scopi. Essa ha luogo sul sistema <strong>di</strong> riferimento del<br />

ligando, ignorando completamente la struttura della proteina. In altre parole,<br />

le semplici rotazioni lungo i legami del ligando non bastano, ma sono necessari<br />

altri gra<strong>di</strong> <strong>di</strong> libertà che <strong>per</strong>mettano a ligand-rotation <strong>di</strong> poter esplorare la<br />

cavità della proteina.<br />

L’idea implementata in ligand-rotation consiste nella generazione <strong>di</strong> una<br />

serie <strong>di</strong> basi ortonormali che andranno a campionare i tre gra<strong>di</strong> <strong>di</strong> libertà e,<br />

<strong>per</strong> ognuno <strong>di</strong> essi, si andrà a testare <strong>di</strong>verse origini sul quale posizionare l’atomo<br />

D 0 . L’applicazione <strong>di</strong> queste basi al nostro ligando <strong>di</strong> partenza su tutte


3.5. ESPLORAZIONE DEL SITO ATTIVO DELLA PROTEINA 35<br />

le origini definite dall’utente daranno luogo a una serie <strong>di</strong> ligan<strong>di</strong>, chiamati<br />

ligan<strong>di</strong> base, dall’orientamento spaziale molto vario. Avviando la ricerca <strong>delle</strong><br />

conformazioni su ognuno <strong>di</strong> questi ligan<strong>di</strong>, ligand-rotation sarà in grado <strong>di</strong><br />

ottenere risultati molto sod<strong>di</strong>sfacenti.<br />

Definiamo ora formalmente questi concetti.<br />

3.5.1 Construzione <strong>delle</strong> basi ortonormali<br />

Consideriamo l’insieme H ⊂ R 3 che identifica n punti su una sfera <strong>di</strong> raggio<br />

unitario e su ognuno <strong>di</strong> essi costruiamo un sistema <strong>di</strong> riferimento. Effettuando<br />

k rotazioni <strong>di</strong> 2π/k lungo l’asse in<strong>di</strong>viduato dal versore uscente da ogni punto<br />

<strong>di</strong> H si andranno a generare k sistemi <strong>di</strong> riferimento su ogni punto, con un<br />

totale <strong>di</strong> n · k.<br />

Sia c il versore uscente da un generico punto h ∈ H e sia B = (0, 0, 1) un<br />

versore della base canonica <strong>di</strong> R 3 . Chiamiamo a e b rispettivamente i versori<br />

ottenuti dal prodotto vettoriale tra c e B e tra c e a, ovvero:<br />

a = c × B<br />

b = c × a<br />

(3.3)<br />

Nel caso in cui c sia proprio il versore B, i versori a e b avranno componenti<br />

rispettivamente (1, 0, 0) e (0, 1, 0).<br />

I versori a, b e c identificano il sistema <strong>di</strong> riferimento ortogonale R con<br />

origine nel punto h. Eseguendo k step <strong>di</strong> rotazioni lungo l’asse c, ognuna <strong>di</strong><br />

2π/k, otteniamo i k sistemi <strong>di</strong> riferimento.<br />

Eseguendo questo proce<strong>di</strong>mento <strong>per</strong> ogni punto della sfera otteniamo m =<br />

n · k sistemi <strong>di</strong> riferimento R 1 , . . . , R m .<br />

3.5.2 Generazione ligan<strong>di</strong> base<br />

Avendo ora a <strong>di</strong>sposizione m sistemi <strong>di</strong> riferimento, an<strong>di</strong>amo ad applicare<br />

questi ultimi al ligando iniziale, ottenendo appunto m ligan<strong>di</strong> base.<br />

Per ogni sistema <strong>di</strong> riferimento R i con i = 1, . . . , m, definiamo le matrici<br />

M i ∈ R 3 in modo tale che la prima riga corrisponda al versore a <strong>di</strong> R i , la<br />

seconda e la terza riga rispettivamente b e c <strong>di</strong> R i .<br />

⎡ ⎤ ⎡<br />

⎤<br />

a i a x i a y i a z i<br />

M i = ⎣b i<br />

⎦ = ⎣b x i b y i b z i ⎦ (3.4)<br />

c i c x i c y i c z i<br />

Chiamiamo queste matrici M i , al variare <strong>di</strong> i tra 1 e m, matrice associata<br />

alla base ortonormale <strong>per</strong> R i .


36 CAPITOLO 3. FORMALIZZAZIONE<br />

Il passo successivo consiste nell’applicazione del ligando su ogni sistema<br />

<strong>di</strong> riferimento, con lo scopo <strong>di</strong> ottenerne un insieme da usare come input <strong>per</strong><br />

ligand-rotation. Questo processo può essere descritto grazie alle matrici <strong>delle</strong><br />

basi ortonormali definite poco sopra dalla formula 3.4.<br />

Sia L così definito<br />

L = {q j : j = 1, . . . t}<br />

l’insieme dei punti <strong>di</strong> R 3 , con |L| = t, tale che q j rappresenta la posizione<br />

nello spazio del j-esimo atomo del ligando <strong>di</strong> partenza. Quel che vogliamo<br />

ottenere è un insieme <strong>di</strong> ligan<strong>di</strong> L R 1<br />

, . . . , L Rm tali che:<br />

{<br />

}<br />

L R i<br />

= p (i)<br />

j : j = 1, . . . , t i = 0, . . . , m<br />

con<br />

⎡<br />

⎢<br />

⎣<br />

p (i)<br />

x (i) p j<br />

y (i) p j<br />

z (i) p j<br />

j = M i · q j j = 1, . . . , t<br />

⎤<br />

⎡<br />

⎤ ⎡ ⎤<br />

a x i b x i c x i x qj<br />

⎥<br />

⎦ = ⎣a y i b y i c y i⎦<br />

⎣y qj<br />

⎦<br />

a z i b z i c z i z qj<br />

j = 1, . . . , t<br />

i = 1, . . . , m<br />

dove le M i rappresentano le matrici definite nella formula 3.4.<br />

(3.5)<br />

3.5.3 Campionamento <strong>di</strong> S<br />

L’ultimo passo che resta da fare prima <strong>di</strong> far parire l’algoritmo vero e proprio<br />

è quello <strong>di</strong> traslare ogni ligando L R i<br />

su ogni punto <strong>di</strong> S in modo che D 0<br />

2<br />

coincida con l’origine dei sistemi <strong>di</strong> riferimento; in questo modo partiranno<br />

|S| · m istanze dell’algoritmo generatore <strong>di</strong> tutte le combinazioni valide.<br />

L’insieme S è costruito dai dati forniti dall’utente: due punti e un passo<br />

l. Si costruisce un cubo a partire dalle 2 coor<strong>di</strong>nate e lo si partiziona in tanti<br />

cubetti tali che il loro lato sia uguale a l e che il lato del cubo sia <strong>di</strong>visibile<br />

<strong>per</strong> l. L’insieme <strong>di</strong> tutti gli spigoli dei cubetti è proprio S.<br />

Ligand-rotation non è un software statico, bensì <strong>di</strong>namico e completamente<br />

configurabile dall’utente. Per quanto riguarda la costruzione dell’insieme<br />

S, si dovranno specificare gli estremi dello spazio in cui si vuole che abbia<br />

inizio la costruzione del ligando e il passo <strong>di</strong> campionamento <strong>di</strong> questi punti;<br />

mentre, <strong>per</strong> quel che riguarda i sistemi <strong>di</strong> riferimento, le costanti k e n sono<br />

<strong>per</strong>sonalizzabili.<br />

2 D è l’elenco degli atomi del ligando; sono in or<strong>di</strong>ne secondo la visita effettuata su G.<br />

Si faccia riferimento alla sezione 3.2


Capitolo 4<br />

Dettagli implementativi<br />

In questo capitolo verranno descritti gli algoritmi implementati e le strutture<br />

dati utilizzate in ligand-rotation. In particolare si mostrerà (nella sezione<br />

4.1) come, a partire da un file <strong>di</strong> configurazione, si caricheranno tutte<br />

le informazioni relative al ligando ed alla proteina. Non soltanto, andremo<br />

anche a specificare tutte le opzioni <strong>di</strong>sponibili <strong>per</strong> <strong>per</strong>mettere una buona<br />

<strong>per</strong>sonalizzazione.<br />

In aggiunta, andremo a definire (nella sezione 4.2) <strong>delle</strong> strutture dati che<br />

<strong>per</strong>metteranno a ligand-rotation un incremento <strong>delle</strong> prestazioni, <strong>per</strong> quanto<br />

riguarda la verifica della consistenza del vincolo (sezione 4.4). Questo è<br />

un aspetto molto importante, che ci <strong>per</strong>mette <strong>di</strong> notare che la procedura<br />

che verifica i vincoli viene chiamata dopo ogni movimento del ligando (ossia<br />

parecchie volte) e non è accettabile una inefficienza a questo riguardo.<br />

Andremo ad esaminare nei dettagli (nella sezione 4.3) l’algoritmo principale<br />

del pacchetto. Descriveremo come le varie tecniche presentate fino ad<br />

ora interagiscono tra loro a partire dall’esplorazione del sito attivo fino alla<br />

generazione <strong>di</strong> una conformazione consistente.<br />

Come ultimo argomento (nella sezione 4.5) daremo alcuni accenni circa<br />

la complessità <strong>di</strong> ligand-rotation, in termini <strong>di</strong> tempo e <strong>di</strong> spazio occupato.<br />

4.1 Inizializzazione <strong>di</strong> ligand-rotation<br />

In questa sezione verranno descritte le fasi iniziali in cui ligand-rotation viene<br />

configurato, a partire dal file <strong>di</strong> input <strong>di</strong> configurazione, e inizializzate le sue<br />

strutture dati.<br />

37


38 CAPITOLO 4. DETTAGLI IMPLEMENTATIVI<br />

4.1.1 Acquisizione informazioni <strong>di</strong> configurazione<br />

L’unico modo che ha un utente <strong>di</strong> comunicare con ligand-rotation è attraverso<br />

il file <strong>di</strong> configurazione; configurazione, in cui è possibile specificare tutti i<br />

parametri, sia funzionali che qualitativi, utilizzati dall’algoritmo <strong>di</strong> docking:<br />

• ligando: specificare file mol2 1 contenente le coor<strong>di</strong>nate del can<strong>di</strong>dato<br />

ligando<br />

• proteina: file mol2 contenente le posizioni degli atomi della proteina<br />

target<br />

• step rotazioni: specifica il numero <strong>di</strong> rotazioni che un legame ruotante<br />

compie<br />

• legami bloccati: specifica, in sequenza, l’id 2 dei legami che non devono<br />

ruotare<br />

• coor<strong>di</strong>nate sito attivo: specifica gli estremi dell’area in cui si trova il<br />

sito attivo della proteina<br />

• passo area <strong>di</strong> lavoro: in<strong>di</strong>ca il passo con cui l’area del sito attivo verrà<br />

partizionata<br />

• set punti iniziali: specifica gli estremi dell’area in cui si piazzerà il primo<br />

atomo del ligando<br />

• passo punti iniziali: passo <strong>di</strong> partizionamento dell’area contenente i<br />

punti iniziali<br />

• punti sfera: numero dei punti sulla sfera <strong>di</strong> raggio unitario nei quali si<br />

genereranno le basi ortonormali<br />

• rotazioni su Z: step <strong>di</strong> rotazioni <strong>delle</strong> basi ortonormali sull’asse Z<br />

Una volta in possesso <strong>di</strong> questi parametri, si andrà a generare prima <strong>di</strong><br />

tutto il grafo rappresentante il ligando, L = (N, A) e, in un secondo momento,<br />

l’albero T , grazie ad una visita V su L.<br />

1 mol2 rappresenta un formato standard <strong>di</strong> rappresentazione <strong>delle</strong> molecole.<br />

Approfon<strong>di</strong>remo l’argomento nella sezione 4.1.2<br />

2 L’Id corrisponde a quello specificato nel file mol2


4.1. INIZIALIZZAZIONE DI LIGAND-ROTATION 39<br />

Implementazione<br />

La realizzazione dei no<strong>di</strong> e degli archi è stata resa possibile grazie all’ausilio<br />

<strong>delle</strong> classi Nodo e Arco (nelle figure 4.1 e 4.2 viene presentata una possibile<br />

implementazione <strong>delle</strong> due strutture). Il grafo che rappresenta la molecola è<br />

stato implementato con <strong>delle</strong> liste <strong>di</strong> a<strong>di</strong>acenza (co<strong>di</strong>ce 4.3), con particolare<br />

riguardo all’efficienza, visti i numerosi accessi in lettura.<br />

✞<br />

✡✝<br />

Co<strong>di</strong>ce 4.1: Struttura della classe Nodo<br />

class Nodo {<br />

public :<br />

// . . .<br />

private :<br />

int id atomo ;<br />

s t r i n g nome atomo ;<br />

MyReal x ;<br />

MyReal y ;<br />

MyReal z ;<br />

s t r i n g tipo atomo ;<br />

MyReal r a g g i o a t o m ico ;<br />

} ;<br />

✆<br />

✞<br />

✡✝<br />

Co<strong>di</strong>ce 4.2: Struttura della classe Arco<br />

class Arco {<br />

public :<br />

// . . .<br />

private :<br />

int id legame ;<br />

int atomo1 ;<br />

int atomo2 ;<br />

s t r i n g tipo legame ;<br />

int r o t a z i o n i l e g a m e ;<br />

} ;<br />

✆<br />

Per motivi <strong>di</strong> efficienza, l’implementazione del grafo è stata realizzata <strong>per</strong><br />

mezzo <strong>di</strong> una matrice <strong>di</strong> vettori della libreria standard del C++. Nella prima<br />

colonna sono stati <strong>di</strong>sposti tutti gli id dei no<strong>di</strong>, mentre, su ogni riga, una<br />

lista degli id corrispondenti agli archi caratterizzanti il nodo stesso.


40 CAPITOLO 4. DETTAGLI IMPLEMENTATIVI<br />

✞<br />

Co<strong>di</strong>ce 4.3: Struttura della classe Grafo<br />

class Grafo {<br />

public :<br />

// . . .<br />

private :<br />

std : : vector legami ;<br />

std : : vector atomi ;<br />

std : : vector < std : : vector > molecola ;<br />

✡✝<br />

} ;<br />

// . . .<br />

✆<br />

Il passo successivo consiste nell’impostare, negli oggetti <strong>di</strong> tipo Arco, le<br />

rotazioni possibili <strong>per</strong> ogni legame attraverso il metodo imposta legami(),<br />

specificate nel file mol2 con la seguente sintassi:<br />

• ar: legame facente parte <strong>di</strong> un composto aromatico<br />

• 1: legame singolo o semplice<br />

• 2: legame doppio<br />

Qui <strong>di</strong> seguito lo pseudoco<strong>di</strong>ce della procedura:<br />

✞ Co<strong>di</strong>ce 4.4: Pseudoco<strong>di</strong>ce del metodo imposta rotazioni()<br />

for arco in a r c h i m o l e c o l a ( )<br />

i f arco . tipo legame i s ‘ ‘ ar ’ ’<br />

arco . r o t a z i o n i l e g a m e = 1<br />

else i f arco . tipo legame i s not ‘ ‘1 ’ ’<br />

arco . r o t a z i o n i l e g a m e = 1<br />

else i f arco . c o n t a i n s (H)<br />

arco . r o t a z i o n i l e g a m e = 1<br />

else<br />

arco . r o t a z i o n i l e g a m e = k<br />

✡✝<br />

✆<br />

4.1.2 Struttura file mol2<br />

Il file mol2 è uno dei sistemi <strong>per</strong> poter rappresentare la struttura <strong>di</strong> una<br />

molecola attraverso file. Qui <strong>di</strong> seguito un esempio <strong>di</strong> file mol2:


4.2. STRUTTURE DATI DEL RISOLUTORE 41<br />

@MOLECULE<br />

4OHT<br />

29 31 1 0 0<br />

SMALL<br />

USER_CHARGES<br />

@ATOM<br />

1 C1 31.1300 -1.5780 24.9020 C.ar 1 LIG600 0.00<br />

2 O1 25.1930 -1.6480 26.9150 O.3 1 LIG600 0.00<br />

3 C2 31.5550 -1.7460 26.2270 C.ar 1 LIG600 0.00<br />

4 O2 33.4760 -3.6110 23.0430 O.3 1 LIG600 0.00<br />

5 N1 34.3180 -4.9410 20.4290 N.3 1 LIG600 1.00<br />

@BOND<br />

1 1 2 ar<br />

2 2 3 1<br />

3 3 4 1<br />

4 4 5 2<br />

@SUBSTRUCTURE<br />

1 LIG600 1 GROUP 1 LIG 1<br />

Nella sezione MOLECULE vengono riassunte le informazioni principali<br />

della molecola, come il suo nome, il numero degli atomi e dei legami chimici.<br />

Le sessioni ATOM e BOND sono le più importanti <strong>per</strong> i nostri scopi. Nella<br />

prima, infatti, vengono elencati tutti gli atomi della molecola, identificati da<br />

un Id, con le loro posizioni nello spazio e il tipo <strong>di</strong> ibri<strong>di</strong>zzazione assunta. Per<br />

esempio, l’atomo indentificato dall’Id 2 è un ossigeno con coor<strong>di</strong>nate x, y, z<br />

rispettivamente (25.1930, −1.6480, 26.9150), caratterizzato da una ibri<strong>di</strong>zzazione<br />

sp 3 . Nella seconda, si elencano i legami chimici esistenti tra atomi, in<br />

cui la prima colonna contiene l’id del legame, la seconda e la terza, rispettivamente<br />

gli Id degli atomi coinvolti e la quarta il tipo <strong>di</strong> legame (ar <strong>per</strong><br />

legame facente parte <strong>di</strong> un composto aromatico, 1 legame singolo, etc..).<br />

Per ulteriori approfon<strong>di</strong>menti si rimanda al sito web<br />

http://tripos.com/data/support/mol2.pdf<br />

4.2 Strutture dati del risolutore<br />

Qui <strong>di</strong> seguito verranno illustrate alcune strutture dati utilizzate dal risolutore<br />

dei vincoli <strong>di</strong> ligand-rotation.


42 CAPITOLO 4. DETTAGLI IMPLEMENTATIVI<br />

4.2.1 Matrice <strong>di</strong> Vicinanza<br />

La matrice <strong>di</strong> vicinanza, in<strong>di</strong>cata con M ∈ {0, 1} n×n , n = |N| con N l’insieme<br />

degli atomi del ligando, è una matrice quadrata <strong>di</strong> or<strong>di</strong>ne n, booleana, dove<br />

gli in<strong>di</strong>ci <strong>di</strong> riga e <strong>di</strong> colonna corrispondono agli id degli atomi. Lo scopo<br />

<strong>di</strong> M è quello <strong>di</strong> specificare gli atomi a<strong>di</strong>acenti <strong>per</strong> ogni atomo del ligando.<br />

Nel momento in cui si posizionerà un atomo a ∈ V e si andrà a verificare la<br />

consistenza del vincolo <strong>di</strong> <strong>di</strong>stanza su <strong>di</strong> esso, si eviterà <strong>di</strong> calcolare la <strong>di</strong>stanza<br />

euclidea tra a e i suoi a<strong>di</strong>acenti. Questo <strong>per</strong>ché, essendo i vicini una catena<br />

<strong>di</strong> atomi legati tra loro covalentemente, non vale più il concetto <strong>di</strong> sfera <strong>di</strong><br />

Van der Waals. La lunghezza del legame covalente è inferiore rispetto alla<br />

lunghezza <strong>di</strong> un legame <strong>di</strong> Van der Waals e, evitando questo controllo, si<br />

otterrebbero dei ‘falsi positivi’.<br />

Formalizziamo il concetto <strong>di</strong> a<strong>di</strong>acenza:<br />

Definizione 4.1. Un atomo x ∈ N è a<strong>di</strong>acente ad un altro atomo y ∈ N se<br />

e solo se il cammino tra x e y ha lunghezza massima 3, ovvero il cammino<br />

non deve essere composto da più <strong>di</strong> tre legami.<br />

Avremo quin<strong>di</strong>, <strong>per</strong> ogni atomo del ligando una serie <strong>di</strong> atomi a<strong>di</strong>centi.<br />

In<strong>di</strong>chiamo questo fatto con la seguente notazione: <strong>per</strong> ogni atomo a ∈ N<br />

adj(a) = {v ∈ N : M(a, v) = M(v, a) = M(a, a) = true}<br />

La costruzione <strong>di</strong> M viene effettuata grazie a n visite in ampiezza sul<br />

grafo L del ligando, dove |N| = |n|, specificando su ogni computazione il<br />

livello <strong>di</strong> profon<strong>di</strong>tà, cioè 3.<br />

4.2.2 Discretizzazione <strong>di</strong> un sottoinsieme limitato <strong>di</strong><br />

R 3<br />

Consideriamo una porzione cubica <strong>di</strong> spazio, V, identificato da due punti<br />

(due vertici del cubo) corrispondenti rispettivamente alle coor<strong>di</strong>nate minime<br />

e massime <strong>delle</strong> tre <strong>di</strong>mensioni: lunghezza, larghezza e profon<strong>di</strong>tà. Siano Min<br />

e Max tali punti e sia p il lato del cubo.<br />

Consideriamo una sua <strong>di</strong>scretizzazione: <strong>di</strong>vi<strong>di</strong>amo V in tante celle cubiche<br />

C <strong>di</strong> uguale <strong>di</strong>mensione, caratterizzate anch’esse da un minimo, Min C , un<br />

massimo, Max C , e un passo l ≤ p tale che p sia <strong>di</strong>visibile <strong>per</strong> l. Sia C l’insieme<br />

<strong>di</strong> tutte le celle <strong>di</strong> V; ogni cella rappresenta anch’essa un sottoinsieme limitato<br />

<strong>di</strong> R 3 .<br />

Ogni cella potrà memorizzare al suo interno un insieme <strong>di</strong> atomi. Dato un<br />

atomo a, esso stazionerà all’interno <strong>di</strong> una particolare cella C a se le coor<strong>di</strong>nate<br />

<strong>di</strong> a appartengono all’insieme dei punti <strong>di</strong> R 3 , in<strong>di</strong>viduati da C a .


4.2. STRUTTURE DATI DEL RISOLUTORE 43<br />

Definizione 4.2. [Appartenenza]<br />

Siano (x a , y a , z a ) le coor<strong>di</strong>nate <strong>di</strong> a e sia P Ca l’insieme dei punti <strong>di</strong> R 3 appartenenti<br />

alla cella C a :<br />

P Ca = { }<br />

(x, y, z) ∈ R 3 : Min x ≤ x < Max x ∧ Min y ≤ y < Max y ∧ Min z ≤ z < Min z<br />

dove (Min x , Min y , Min z ) = Min C e (Max x , Max y , Max z ) = Max C . Allora:<br />

a ∈ C a<br />

⇐⇒ (x a , y a , z a ) ∈ P Ca<br />

Figura 4.1: Quattro celle cubiche con all’interno alcuni atomi.<br />

L’insieme V appena introdotto avrà un ruolo fondamentale nel risolutore<br />

<strong>di</strong> vincoli da noi implementato. Le celle rappresentano la struttura base a<br />

cui si accederà <strong>per</strong> la verifica della consistenza del vincolo <strong>di</strong> non sovrapposizione.<br />

Durante l’esecuzione dell’algoritmo <strong>di</strong> ligand-rotation, quando siamo<br />

sicuri che un atomo, supponiamo D k , non verrà può ruotato 3 , è necessario<br />

verificare la consistenza su <strong>di</strong> esso. Per far ciò, ci cerca <strong>di</strong> inserirlo all’interno<br />

<strong>di</strong> una cella; se nelle sue vicinanze ci sono altri atomi, l’inserimento fallisce,<br />

altrimenti ha successo. Viceversa, nel momento in cui si fa backtracking su<br />

D k , l’o<strong>per</strong>azione da eseguire è quella inversa: eliminare l’atomo D k dalla cella<br />

in cui si trova, in quanto si sta cercando una nuova configurazione e quin<strong>di</strong> subirà<br />

una potenziale rotazione. In questo modo, la struttura dati conterrà solo<br />

atomi consistenti e la verifica dei vicini sarà effettuata molto efficientemente<br />

grazie ai meto<strong>di</strong> implementati su <strong>di</strong> essa.<br />

3 Nella sezione 4.3.2 descriveremo nei dettagli il momento esatto in cui si verifica la<br />

consistenza.


44 CAPITOLO 4. DETTAGLI IMPLEMENTATIVI<br />

Identificazione <strong>delle</strong> celle<br />

Supponendo <strong>di</strong> dover inserire un atomo a all’interno <strong>di</strong> una cella, la sua<br />

identificazione si ottiene ricavando tre in<strong>di</strong>ci, univoci <strong>per</strong> ogni cella, (X, Y, Z),<br />

a partire dalle coor<strong>di</strong>nate (x, y, z) <strong>di</strong> a:<br />

X = ⌊ x − Min x<br />

⌋<br />

l<br />

Implementazione<br />

Y = ⌊ y − Min y<br />

⌋<br />

l<br />

Z = ⌊ z − Min z<br />

⌋<br />

l<br />

Una simile struttura dati può essere facilmente implementata con dei vector<br />

della libreria standard del C++.<br />

✞<br />

Co<strong>di</strong>ce 4.5: Implementazione <strong>di</strong> V<br />

std : : vector < std : : vector < std : : vector > ><br />

✡✝<br />

✆<br />

Al contrario, una cella è stata implementata <strong>per</strong> mezzo <strong>di</strong> una classe,<br />

affinché possa memorizzare al suo interno l’insieme degli atomi.<br />

✞<br />

✡✝<br />

Co<strong>di</strong>ce 4.6: Implementazione <strong>di</strong> una cella<br />

class C e l l a {<br />

private :<br />

std : : vector atomi ;<br />

public :<br />

. . .<br />

} ;<br />

✆<br />

Insieme <strong>delle</strong> o<strong>per</strong>azioni<br />

L’insieme <strong>delle</strong> o<strong>per</strong>azioni ammesse <strong>per</strong> la struttura V e <strong>per</strong> la Cella sono<br />

elencate qui <strong>di</strong> seguito con il relativo pseudoco<strong>di</strong>ce.<br />

• dato un atomo, identificazione della sua cella (co<strong>di</strong>ce 4.7)<br />

• inserimento <strong>di</strong> un atomo in una cella (co<strong>di</strong>ce 4.8)<br />

• eliminazione <strong>di</strong> un atomo da una cella (co<strong>di</strong>ce 4.9)


4.2. STRUTTURE DATI DEL RISOLUTORE 45<br />

✞<br />

✡✝<br />

Co<strong>di</strong>ce 4.7: Pseudoco<strong>di</strong>ce <strong>per</strong> l’identificazione <strong>di</strong> una cella<br />

V : : i d e n t i f i c a c e l l a ( atomo ) {<br />

// . . .<br />

i d c e l l a [ 0 ] = ( atomo . x − Min . x )/p ;<br />

i d c e l l a [ 1 ] = ( atomo . y − Min . y )/p ;<br />

i d c e l l a [ 2 ] = ( atomo . z − Min . z )/p ;<br />

return i d c e l l a ;<br />

}<br />

✆<br />

✞<br />

✡✝<br />

Co<strong>di</strong>ce 4.8: Pseudoco<strong>di</strong>ce <strong>per</strong> l’inserimento <strong>di</strong> un atomo in una cella<br />

V : : i n s e r i s c i ( atomo ) {<br />

// . . .<br />

i d c e l l a = V : : i d e n t i f i c a c e l l a ( atomo ) ;<br />

i f ( i d c e l l a != NULL)<br />

C e l l a : : i n s e r i s c i ( i d c e l l a , atomo ) ;<br />

}<br />

C e l l a : : i n s e r i s c i ( i d c e l l a , atomo ) {<br />

// . . .<br />

cubo . at ( i d c e l l a ) . push back ( atomo ) ;<br />

}<br />

✆<br />

Osserviamo che, durante l’identificazione della cella, nel caso in cui le<br />

coor<strong>di</strong>nate dell’atomo non appartengano alla porzione <strong>di</strong> spazio V riene restituito<br />

il valore NULL.<br />

4.2.3 Celle contenenti atomi ‘vicini’<br />

Lo scopo <strong>di</strong> questo paragrafo è illustrare in che modo vengono recu<strong>per</strong>ate<br />

le celle contenenti gli atomi definiti ‘vicini’, ovvero quelli che subiranno il<br />

controllo della <strong>di</strong>stanza euclidea con l’atomo da inserire da parte del risolutore<br />

<strong>di</strong> vincoli. Definiamo prima <strong>di</strong> tutto il concetto <strong>di</strong> atomo vicino e l’insieme<br />

formato da questi ultimi.<br />

Definizione 4.3. Sia a ∈ C un generico atomo appartente ad una cella,<br />

anch’essa generica. L’insieme G è composto dall’insieme degli atomi appartenenti<br />

ad una qualche cella <strong>di</strong> V tali che la loro <strong>di</strong>stanza euclidea da a sia<br />

inferiore o uguale alla somma del raggio atomico <strong>di</strong> a e del raggio atomico<br />

massimale degli atomi del ligando.


46 CAPITOLO 4. DETTAGLI IMPLEMENTATIVI<br />

✞<br />

✡✝<br />

Co<strong>di</strong>ce 4.9: Pseudoco<strong>di</strong>ce <strong>per</strong> l’eliminazione <strong>di</strong> un atomo da una cella<br />

V : : e l i m i n a ( atomo ) {<br />

// . . .<br />

i d c e l l a = V : : i d e n t i f i c a c e l l a ( atomo ) ;<br />

C e l l a : : e l i m i n a ( i d c e l l a , atomo ) ;<br />

}<br />

C e l l a : : i n s e r i s c i ( i d c e l l a , atomo ) {<br />

// . . .<br />

cubo . at ( i d c e l l a ) . pop back ( atomo ) ;<br />

}<br />

✆<br />

Costruire l’insieme G non è affatto semplice, in quanto occorre esplorare<br />

tutta la porzione <strong>di</strong> spazio che comprende l’atomo da inserire. L’approccio<br />

utilizzato da ligand-rotation consiste nell’in<strong>di</strong>viduazione <strong>di</strong> tutte le celle che<br />

potenzialmente potrebbero contenere atomi vicini. Sia R il raggio massimo<br />

degli atomi componenti il complesso ligando-proteina, sia r il raggio dell’atomo<br />

da inserire e c la cella in cui inserirlo. Da queste due informazioni ci<br />

costruiamo il range <strong>delle</strong> celle da controllare, dato da:<br />

range = ⌊ R + r ⌋ + 1<br />

l<br />

L’insieme <strong>delle</strong> celle K i cui in<strong>di</strong>ci rispetto c spaziano della quantità range<br />

sono proprio quelle che il risolutore andrà ad esaminare <strong>per</strong> la verifica del<br />

vincolo <strong>di</strong> vicinanza.<br />

4.3 Algoritmo <strong>di</strong> ligand-rotation<br />

In questa sezione verrà presentato nei dettagli il cuore dell’algoritmo <strong>di</strong> docking.<br />

Si parlerà <strong>di</strong> consistenza in riferimento all’unico vincolo implementato<br />

su ligand-rotation, ovvero quello <strong>di</strong> non sovrapposizione. La prima o<strong>per</strong>azione<br />

effettuata su V è quella relativa al piazzamento degli atomi della proteina.<br />

Questi, infatti, vengono inseriti imme<strong>di</strong>atamente <strong>per</strong> il semplice motivo che<br />

la proteina è un corpo statico e quin<strong>di</strong> gli atomi non verranno mai spostati<br />

<strong>di</strong> posizione. Notiamo che l’inserimento avviene senza il controllo della<br />

consistenza.


4.3. ALGORITMO DI LIGAND-ROTATION 47<br />

4.3.1 Parte I: inizializzazione<br />

Come descritto formalmente nella sezione 3.5, questa fase si occupa della<br />

generazione degli m sistemi <strong>di</strong> riferimento su cui applicare il ligando base,<br />

ottenendo quin<strong>di</strong> m ligan<strong>di</strong> <strong>di</strong> partenza pronti <strong>per</strong> essere computati, ognuno<br />

con un orientamento <strong>di</strong>fferente. Di seguito lo pseudoco<strong>di</strong>ce:<br />

✞ Co<strong>di</strong>ce 4.10: Pseudoco<strong>di</strong>ce relativo alla generazione dei ligan<strong>di</strong> base<br />

P = p u n t i s f e r a ( k )<br />

S = c a m p i o n a p u n t i i n i z i a l i ( j )<br />

for p in P<br />

Z = a s s e z<br />

B = base (Z)<br />

X = p r o d o t t o V e t t o r i a l e (Z , B)<br />

Y = p r o d o t t o V e t t o r i a l e (Z , X)<br />

norma1 (X)<br />

norma1 (Y)<br />

T = numeroRotazioniZ ( )<br />

for t in T<br />

ruota su Z ( angolo )<br />

t r a s l o m o l e c o l a (O(X, Y, Z ) )<br />

r u o t a m o l e c o l a (X, Y, Z)<br />

for s in S<br />

t r a s l o m o l e c o l a ( s )<br />

g e n e r a c o n f o r m a z i o n i ( )<br />

angolo += step<br />

✡✝<br />

✆<br />

La funzione punti sfera(k) genera k punti <strong>di</strong>sposti uniformemente su una<br />

sfera <strong>di</strong> raggio unitario e, su ognuno <strong>di</strong> questi, si costruirà un sistema <strong>di</strong><br />

riferimento (come spiegato formalmente nella sezione 3.5.1). Successivamente<br />

lo si ruoterà <strong>di</strong> T step lungo l’asse Z, ottenendo il terzo grado <strong>di</strong> libertà.<br />

Sull’origine dei sistemi <strong>di</strong> riferimento appena generati, si andrà a posizionare<br />

l’atomo D 0 del ligando e si ruoterà la molecola in modo tale da applicarle<br />

la base appena generata. I ligan<strong>di</strong> che si otterrano andranno riposizionati<br />

su ogni punto <strong>di</strong> S, insieme <strong>di</strong> coor<strong>di</strong>nate definite dall’utente e campionate<br />

dal metodo campiona punti iniziali(j) (con passo j) facendo, come al solito,<br />

coincidere l’atomo D 0 dei ligan<strong>di</strong> con i vari punti <strong>di</strong> S. In conclusione, <strong>per</strong><br />

ognuno dei ligan<strong>di</strong> applicati sui sistemi <strong>di</strong> riferimento costruiti, si farà partire<br />

l’algoritmo che genererà tutte le strutture consistenti, attraverso la chiamata<br />

alla funzione genera conformazioni().


48 CAPITOLO 4. DETTAGLI IMPLEMENTATIVI<br />

4.3.2 Parte II: generazione conformazioni<br />

In seguito all’esecuzione della prima parte dell’algoritmo, ora abbiamo a<br />

<strong>di</strong>sposizione un set <strong>di</strong> ligan<strong>di</strong> L R i<br />

, i = 1, . . . , m da poter utilizzare come<br />

partenza <strong>per</strong> la generazione <strong>delle</strong> conformazioni consistenti.<br />

Sia fissato k ∈ {1, . . . , m} e consideriamo L R k il ligando su cui eseguire<br />

la computazione.<br />

Sia inoltre D l’elenco or<strong>di</strong>nato degli atomi <strong>di</strong> L R k ottenuto da una visita<br />

V sul grafo G, <strong>di</strong> cui ne abbiamo <strong>di</strong>scusso nella sezione 3.3.<br />

Qui <strong>di</strong> seguito lo pseudoco<strong>di</strong>ce dell’algoritmo utilizzato in ligand-rotation:<br />

✞<br />

g e n e r a c o n f o r m a z i o n i ( i )<br />

i f D[ i ] i s root<br />

i f v e r i f i c a v i n c o l o (D[ i ] )<br />

i++<br />

g e n e r a c o n f o r m a z i o n i ( i )<br />

backtracking ( i )<br />

i−−<br />

backtracking ( i )<br />

else<br />

termina computazione ( )<br />

else<br />

s a l v a s o t t o a l b e r o (D[ i ] )<br />

a n g o l o r o t a z i o n e = 0<br />

for r o t a z i o n e in r o t a z i o n i (D[ i ] )<br />

i f v e r i f i c a v i n c o l o (D[ i ] )<br />

r u o t a s o t t o a l b e r o (D[ i ] , a n g o l o r o t a z i o n e )<br />

i++<br />

i f not D[ i ] i s l a s t<br />

g e n e r a c o n f o r m a z i o n i ( i )<br />

backtracking ( i )<br />

else<br />

s c r i v i c o n f o r m a z i o n e ( )<br />

i−−<br />

r i p r i s t i n a s o t t o a l b e r o (D[ i ] )<br />

a n g o l o r o t a z i o n e += step<br />

else :<br />

a n g o l o r o t a z i o n e += step<br />

r i p r i s t i n a s o t t o a l b e r o (D[ i ] )<br />

r u o t a s o t t o a l b e r o (D[ i ] , a n g o l o r o t a z i o n e )<br />

✡✝<br />


4.3. ALGORITMO DI LIGAND-ROTATION 49<br />

Il primo passo dell’algoritmo sarà quello <strong>di</strong> testare, sull’atomo ra<strong>di</strong>ce, cioè<br />

D 0 , il vincolo <strong>di</strong> consistenza attraverso verifica vincolo(D 0 ). Nel caso <strong>di</strong> fallimento<br />

la computazione fallirà imme<strong>di</strong>atamente e si procederà con un nuovo<br />

ligando L Rh con h ≠ k; altrimenti, si memorizzerà la posizione dell’atomo D 0<br />

sulla sua cella corrispondente, (cf. paragrafo 4.2.2) e si procederà con l’atomo<br />

successivo D 1 con la chiamata ricorsiva genera conformazioni(1).<br />

Supponiamo ora <strong>di</strong> essere arrivati ad una situazione <strong>di</strong> questo tipo: abbiamo<br />

appena verificato e convalidato il vincolo sull’atomo D i−1 e ruotato il sottoalbero<br />

con ra<strong>di</strong>ce il nodo corrispondente a D i−1 . Gli atomi attualmente presenti<br />

in V, oltre quelli appartenenti alla proteina, sono I = {D 0 , . . . , D i−1 }.<br />

Siamo in procinto <strong>di</strong> avviare la computazione <strong>per</strong> l’atomo D i con la chiamata<br />

ricorsiva genera conformazioni(i).<br />

Una volta chiamata, la procedura salva sottoalbero(D i ) salva la posizione<br />

<strong>di</strong> tutti gli atomi del sottoalbero con ra<strong>di</strong>ce l’atomo corrispondente a D i<br />

(approfon<strong>di</strong>remo il <strong>per</strong>ché <strong>di</strong> questa scelta nel paragrafo 4.3.2). Tra le possibili<br />

scelte <strong>di</strong> rotazione su D i , si prende la prima e si verifica, quin<strong>di</strong>, il vincolo <strong>di</strong><br />

consistenza su D i .<br />

Osserviamo come la verifica <strong>di</strong> consistenza viene effettuata sull’unico atomo<br />

D i . In questo istante, si è certi che D i non subirà ulteriori rotazioni e se<br />

valido, lo rimarrà fino a quando non verrà rimosso dalla struttura dati <strong>di</strong> cui<br />

si serve il risolutore, tramite la procedura <strong>di</strong> backtracking. Inoltre, essendo<br />

gli atomi dell’insieme I già validati e quin<strong>di</strong> presenti all’interno <strong>delle</strong> celle <strong>di</strong><br />

V si è certi che questi sono rimasti consistenti all’avanzare dell’algoritmo.<br />

Nel caso <strong>di</strong> consistenza <strong>di</strong> D i , si procede alla rotazione del suo sottoalbero<br />

(come spiegato nella sezione 3.4). Fatto ciò, si passa al nodo successivo e,<br />

se non è l’ultimo, si richiama ricorsivamente la procedura proprio su D i+1 ;<br />

in caso contrario, avendo su<strong>per</strong>ato con successo tutti i vincoli su tutti gli<br />

atomi, siamo arrivati alla fine della molecola. Creiamo, quin<strong>di</strong>, il file mol2 del<br />

ligando appena generato. Nel caso in cui il vincolo <strong>di</strong> consistenza sull’atomo<br />

D i fallisce, si procede ad effettuare il backtracking <strong>per</strong> portarci all’atomo<br />

precedente, si ripristina la situazione precedente alla rotazione e quin<strong>di</strong>, si<br />

termina la computazione del nodo D i con la sua successiva eliminazione dalla<br />

struttura dati del risolutore attraverso la procedura backtracking(i). Se D i−1<br />

può effettuare ulteriori rotazioni, si prosegue <strong>per</strong> questa scelta, altrimenti<br />

termina l’esplorazione del sottoalbero con ra<strong>di</strong>ce D i−1 .<br />

Nel momento in cui si esplorano tutte le scelte dei no<strong>di</strong>, l’ultima o<strong>per</strong>azione<br />

da fare è eliminare l’atomo ra<strong>di</strong>ce dalla sua cella e procedere con un<br />

nuovo ligando base.


50 CAPITOLO 4. DETTAGLI IMPLEMENTATIVI<br />

Ripristino situazione precedenete alla rotazione<br />

L’aspetto chiave della seconda fase dell’algoritmo è senza dubbio la visita<br />

dell’albero <strong>di</strong> ricerca. Qui vengono intraprese tutte le scelte possibili dei no<strong>di</strong><br />

e, <strong>di</strong> conseguenza, le rotazioni effettuate sul ligando base sono numerose;<br />

l’effetto negativo è la presenza <strong>di</strong> errori numerici. Infatti, sapendo <strong>di</strong> avere<br />

a che fare con una mole <strong>di</strong> calcoli su R, dobbiamo preoccuparci dell’aritmetica<br />

macchina e quin<strong>di</strong> del risultante accumulo <strong>di</strong> errore nelle o<strong>per</strong>azioni <strong>di</strong><br />

rotazione.<br />

Si può ricorrere a due tipi <strong>di</strong> soluzione:<br />

• rotazione inversa<br />

• memorizzazione informazioni prima della rotazione<br />

Nel caso della rotazione inversa, prima <strong>di</strong> intraprendere le <strong>di</strong>verse scelte<br />

<strong>di</strong> rotazione <strong>di</strong> un nodo, si effettua una rotazione inversa <strong>per</strong> portarci al caso<br />

base, quin<strong>di</strong> ruotare nuovamente <strong>per</strong> proseguire lungo una scelta. Lo svantaggio<br />

<strong>di</strong> questa tecnica è che, seppur limitatamente, an<strong>di</strong>amo incontro ad<br />

accumulo <strong>di</strong> errore: la rotazione inversa non è la funzione inversa della rotazione.<br />

Per cui, l’applicazione <strong>di</strong> essa non ci porterà alla situazione iniziale,<br />

bensì ad una simile che si ri<strong>per</strong>quoterà sulle rotazioni <strong>di</strong> tutto il suo sottoalbero.<br />

Nella seconda soluzione, implementata su ligand-rotation, il ripristino si<br />

basa su una apposita struttura dati. Prima della rotazione <strong>di</strong> un sottoalbero,<br />

cioè prima <strong>di</strong> effettuare una scelta sul livello k, si salva la situazione corrente<br />

dei no<strong>di</strong>, ovvero le loro coor<strong>di</strong>nate spaziali, <strong>per</strong> poi venire ripristinata quando<br />

la procedura del backtracking ci riporta al livello k <strong>per</strong> <strong>per</strong>correre un’altra<br />

scelta. Al contrario della prima soluzione, l’unico errore numerico commesso<br />

è nel calcolo della singola rotazione il quale, non si ri<strong>per</strong>quoterà né sulle rotazioni<br />

successive dello stesso nodo né sulle rotazioni dei no<strong>di</strong> del sottoalbero.<br />

L’unico svantaggio è nell’occupazione <strong>di</strong> memoria: <strong>per</strong> ogni livello e <strong>per</strong> ogni<br />

scelta si dovrà memorizzare la situazione del sottoalbero. Comunque, avendo<br />

a che fare con ligan<strong>di</strong> composti da poche decine <strong>di</strong> atomi, al massimo un<br />

centinaio, le informazioni da salvare sono contenute.<br />

4.4 Consistenza del vincolo<br />

La definizione <strong>di</strong> consistenza del vincolo data in precedenza, seppure esatta,<br />

è estremamente inefficiente. Infatti, è inutile effettuare il controllo <strong>di</strong> sovrapposizione<br />

su atomi <strong>di</strong>stanti o ad<strong>di</strong>ritura su atomi non ancora piazzati. Ciò<br />

che formalizzeremo ora è l’algoritmo implementato da ligand-rotation <strong>per</strong> la<br />

verifica della consistenza, grazie alle strutture dati definite nella sezione 4.2.


4.5. ACCENNI DI COMPLESSITÀ 51<br />

4.4.1 Verifica dei vincoli<br />

Il controllo dei vincoli durante l’esecuzione dell’algoritmo <strong>di</strong> ligand-rotation<br />

funziona in questo modo: una volta effettuata la rotazione <strong>di</strong> un atomo e del<br />

relativo sottoalbero, si inserisce il primo atomo all’interno <strong>di</strong> una cella. Sia<br />

a l’atomo da inserire con coor<strong>di</strong>nate spaziali (x a , y a , z a ) ∈ R e <strong>di</strong> raggio r.<br />

L’insieme C degli atomi da verificare è definito come:<br />

dove:<br />

C = G adj(a)<br />

• G è l’insieme degli atomi vicini, (cf. definizione 4.3)<br />

• adj(a) è l’insieme degli atomi a<strong>di</strong>acenti, (cf. definizione 4.1)<br />

Il vincolo <strong>di</strong> non sovrapposizione viene dunque verificato <strong>per</strong> ogni z ∈ C:<br />

S(a, z) =<br />

{<br />

true, se ‖a − z‖ ≥ raggio(a) + raggio(z)<br />

false,<br />

altrimenti<br />

✞<br />

✡✝<br />

Qui <strong>di</strong> seguito lo pseudoco<strong>di</strong>ce implementato in ligand-rotazion.<br />

v e r i f i c a v i n c o l o ( a , Celle , A<strong>di</strong>acenti )<br />

i f a not in V<br />

return f a l s e<br />

for c e l l a in C e l l e<br />

for atomo in atomi . c e l l a<br />

i f atomo i s not in a d i a c e n t i<br />

i f d ( a , atomo ) < a . r a g g i o + atomo . r a g g i o<br />

return f a l s e<br />

else<br />

return true<br />

✆<br />

4.5 Accenni <strong>di</strong> Complessità<br />

Il concetto <strong>di</strong> complessità computazionale è strettamente legato ai <strong>di</strong>versi<br />

gra<strong>di</strong> <strong>di</strong> libertà che ligand-rotation possiede. Il grado <strong>di</strong> libertà che più ‘rallenta’<br />

l’algoritmo è la rotazione sul legame: avendo a <strong>di</strong>sposizione k scelte <strong>per</strong>


52 CAPITOLO 4. DETTAGLI IMPLEMENTATIVI<br />

ogni legame, si deduce abbastanza velocemente che ligand-rotation ha una<br />

complessità esponenziale sul numero dei legami n. In particolare, risulta:<br />

C T (n) = O(k n )<br />

dove k rappresenta il numero degli step effettuati <strong>per</strong> ogni legame ruotabile.<br />

Sebbene ligand-rotation cresca esponenzialmente, le tecniche della programmazione<br />

a vincoli <strong>per</strong>mettono <strong>di</strong> ridurre notevolmente la complessità<br />

o<strong>per</strong>ando dei tagli all’albero <strong>di</strong> ricerca. Infatti, intercettando l’inconsistenza<br />

<strong>di</strong> un nodo, viene eliminato tutto il sottoalbero relativo e quin<strong>di</strong> parte <strong>delle</strong><br />

soluzioni totali, in modo tale da evitare la visita fino alle foglie dei <strong>per</strong>corsi<br />

inconsistenti.<br />

L’altro grado <strong>di</strong> libertà è dato dal possibile posizionamento del ligando<br />

nelle tre <strong>di</strong>mensioni. Esso rappresenta una semplice costante moltiplicativa<br />

a C T , data dal numero <strong>di</strong> sistemi <strong>di</strong> riferimento totali e dal numero <strong>di</strong> punti<br />

iniziali. Tuttavia, questa costante è abbastanza alta 4 e, non avendo un numero<br />

<strong>di</strong> legami ruotanti estremamente alto, il passo <strong>di</strong> <strong>di</strong>scretizzazione può influire<br />

sul costo complessivo dell’algoritmo.<br />

4 Nel caso <strong>di</strong> 210 <strong>di</strong>versi sistemi <strong>di</strong> riferimento e 27 punti iniziali, la costante è pari a<br />

5670, quin<strong>di</strong> da non sottovalutare.


Capitolo 5<br />

Risultati<br />

In questo capitolo si illustreranno i risultati ottenuti da ligand-rotation. Descriveremo<br />

(nella sezione 5.1) il complesso preso in esame <strong>per</strong> la realizzazione<br />

dei test. Successivamente (nella sezione 5.2) analizzaremo in dettaglio i test<br />

eseguiti, mostrando il comportamento registrato da ligand-rotation al variare<br />

dei parametri <strong>di</strong> qualità. Presenteremo, in particolare, una configurazione<br />

ottimale. Infine (nella sezione 5.3) faremo dei confronti sulle possibili visite<br />

implementabili <strong>per</strong> generare l’albero e su come esse andranno ad incidere sul<br />

tempo <strong>di</strong> esecuzione.<br />

Come primo test <strong>di</strong> fattibilità non consideriamo una funzione energetica<br />

bensì confrontiamo i risultati ottenuti con il ligando minimizzato preso da<br />

PDB attraverso un test <strong>di</strong> tipo geometrico, calcolando il Root Mean Square<br />

Deviation (RMSD) definito come segue:<br />

Definizione 5.1. Siano L e C gli insiemi degli atomi rispettivamente del ligando<br />

minimizzato e <strong>di</strong> quello appena generato. Sia N = |L| = |C|; definiamo<br />

l’RMSD come:<br />

RMSD = √ 1 N<br />

N∑<br />

‖n i − m i ‖ n i ∈ L, m i ∈ C (5.1)<br />

i=1<br />

Valori dell’RMSD pari a 0.5Å stanno a significare che la <strong>di</strong>stanza quadratica<br />

me<strong>di</strong>a tra gli atomi del ligando minimizzato e quello ottenuto da<br />

ligand-rotation è <strong>di</strong> 0.5Å. Le <strong>di</strong>stanze <strong>di</strong> legame sono circa <strong>di</strong> 1.5Å; commettere<br />

un errore sotto l’Ångström caratterizza le posizioni degli atomi con<br />

sufficiente precisione.<br />

53


54 CAPITOLO 5. RISULTATI<br />

5.1 Applicazioni possibili<br />

Figura 5.1: Struttura molecolare del tamoxifene<br />

Il complesso ligando-proteina stu<strong>di</strong>ato in questa tesi ha code number (relativo<br />

a PDB) 1XPC ; esso possiede numerosi ligan<strong>di</strong>, ma il nostro stu<strong>di</strong>o è<br />

stato rivolto principalmente all’analisi del tamoxifene.<br />

Sono stati effettuati i primi test <strong>di</strong> ligand-rotation con il tamoxifene<br />

(OHT). In figura 5.1 è illustrata la struttura del farmaco, mentre in 5.2 è<br />

illustrato il complesso ligando-proteina. Questo è un antitumorale appartenente<br />

alla famiglia dei farmaci interagenti con il recettore degli estrogeni e<br />

viene utilizzato nei casi <strong>di</strong> tumore mammario metastatico con buoni risultati.<br />

Successivamente sono stati sco<strong>per</strong>ti gli ottimi benefici nella prevenzione della<br />

ripresa della malattia in donne già o<strong>per</strong>ate <strong>per</strong> tumore al seno.<br />

Il tamoxifene presenta una struttura molecolare relativamente semplice;<br />

altri possibili ligan<strong>di</strong> non sono stati presi in considerazione, in quanto la<br />

loro struttura presentava dei cicli pentano e cicli esano che complicavano<br />

pesantemente l’algoritmo (cf. sezione 6.1). Avendo svolto questo lavoro in<br />

tempi relativamente brevi, non si è riusciti nell’intento <strong>di</strong> gestire molecole<br />

con le caratteristiche sopra citate.<br />

5.2 Efficienza<br />

Considerando il fatto che ligand-rotation è ancora un programma in evoluzione<br />

e che necessita <strong>di</strong> notevoli estensioni <strong>per</strong> essere utilizzato in ambito<br />

professionale, i risultati ottenuti sono abbastanza sod<strong>di</strong>sfacenti. Il nostro<br />

obiettivo è quello <strong>di</strong> generare conformazioni con un RMSD minore <strong>di</strong> 1Å in<br />

tempi ragionevoli. Come vedremo, è stato raggiunto con successo. La figura<br />

5.3 mostra uno tra i migliori risultati ottenuti con ligand-rotation.


5.2. EFFICIENZA 55<br />

Figura 5.2: Immagine del complesso esaminato ottenuta effettuando un rendering<br />

con Molegro Molecular Viewer: in rosso è possibile vedere la struttura<br />

della proteina, mentre in verde il ligando OHT


56 CAPITOLO 5. RISULTATI<br />

Figura 5.3: In verde è visibile il ligando ottenuto con ligand-rotation mentre<br />

in rosso è rappresentato il ligando minimizzato, scaricato da PDB. Il valore<br />

<strong>di</strong> RMSD tra le due molecole è pari a 0.799538, ottenuto con la seguente<br />

configurazione: 7 step <strong>di</strong> rotazioni, 210 sistemi <strong>di</strong> riferimento, passo cella <strong>di</strong> 1Å<br />

e punti iniziali campionati a 0.5Å. Il tempo <strong>di</strong> esecuzione <strong>di</strong> ligand-rotation,<br />

con questa specifica configurazione, è stato <strong>di</strong> 172 minuti.


5.2. EFFICIENZA 57<br />

5.2.1 Variazione parametri qualitativi<br />

Questa classe <strong>di</strong> test ha l’obiettivo <strong>di</strong> stabilire il grado <strong>di</strong> efficienza <strong>di</strong> ligandrotation<br />

al variare dei parametri <strong>di</strong> configurazione; si terrà conto del valore<br />

dell’RMSD migliore e del tempo impiegato nel generare tutte le conformazioni.<br />

Variazione degli step <strong>di</strong> rotazione<br />

Esaminiamo in dettaglio il comportamento registrato dal pacchetto <strong>di</strong> docking<br />

a variazioni degli step <strong>di</strong> rotazione. Ricor<strong>di</strong>amo che lo step <strong>di</strong> rotazione<br />

rappresenta il valore <strong>delle</strong> variabili <strong>di</strong> tipo legame.<br />

Lo scopo è quello <strong>di</strong> misurare l’efficienza e il corretto posizionamento del<br />

ligando al variare degli step. Fissatone uno, i test verranno condotti su configurazioni<br />

nelle quali varierà il numero dei sistemi <strong>di</strong> riferimento. Il numero <strong>di</strong><br />

step <strong>di</strong> rotazione presi in considerazione sono {2, 3, 4, 5, 6, 7}. Come visibile<br />

nel grafico 5.4, l’esecuzione con un numero <strong>di</strong> step inferiore a 5, sebbene impieghi<br />

molto meno, in particolare non si su<strong>per</strong>ano i 5 minuti <strong>di</strong> calcolo, non<br />

produce risultati significativi sotto l’Ångström. Dal grafico si può notare il<br />

miglioramento <strong>delle</strong> conformazioni ottenute, in termini <strong>di</strong> RMSD, all’aumentare<br />

degli step <strong>di</strong> rotazione, a <strong>di</strong>scapito del tempo impiegato, il quale resta<br />

comunque sempre ragionevole, ovvero entro le 6 ore <strong>di</strong> calcolo.<br />

Variazione campionamento <strong>delle</strong> basi ortonormali<br />

Questa classe <strong>di</strong> test è volta a misurare la reazione <strong>di</strong> ligand-rotation al variare<br />

dei sistemi <strong>di</strong> riferimento. Dopo averne fissato uno, i test eseguiti varieranno<br />

<strong>per</strong> il numero <strong>di</strong> step <strong>di</strong> rotazione. Nel grafico 5.5 sono visibili i valori ottenuti<br />

campionando le basi ortonormali: sull’asse <strong>delle</strong> ascisse sono riportati i tempi<br />

in scala logaritmica, mentre sull’asse <strong>delle</strong> or<strong>di</strong>nate i valori <strong>di</strong> RMSD migliori<br />

<strong>per</strong> ogni istanza <strong>di</strong> ligand-rotation. I risultati, limitatamente al ligando testato,<br />

mostrano che anche con soli 54 1 sistemi <strong>di</strong> riferimento ligand-rotation sia<br />

stato in grado <strong>di</strong> ottenere strutture molecolari molto valide, entro l’Ångström<br />

<strong>di</strong> RMSD, in tempi molto brevi, precisamente in un’ora e mezza <strong>di</strong> calcoli<br />

<strong>per</strong> una conformazione con RMSD pari a 0,85534Å.<br />

Campionamento <strong>delle</strong> celle <strong>di</strong> V<br />

Il seguente test è rivolto a identificare la <strong>di</strong>mensione ottimale <strong>delle</strong> celle <strong>di</strong><br />

V. Nel grafico 5.6, l’asse <strong>delle</strong> ascisse in<strong>di</strong>vidua il numero degli step <strong>di</strong> rotazione<br />

rispetto ai quali si sono effettuati i test, mentre l’asse <strong>delle</strong> or<strong>di</strong>nate, in<br />

1 Esattamente 9 punti sulla sfera e 6 step <strong>di</strong> rotazione sull’asse Z


58 CAPITOLO 5. RISULTATI<br />

Prestazioni−qualità al variare degli step <strong>di</strong> rotazione<br />

1.7<br />

1.6<br />

1.5<br />

7 step<br />

6 step<br />

5 step<br />

4 step<br />

1.4<br />

1.3<br />

rmsd<br />

1.2<br />

1.1<br />

1<br />

0.9<br />

0.8<br />

0.7<br />

10 −1 10 0 10 1 10 2 10 3<br />

tempo espresso in minuti<br />

Figura 5.4: Grafico rappresentante qualità in termini <strong>di</strong> RMSD, rispetto al<br />

ligando minimizzato, e prestazioni, in termini <strong>di</strong> tempo <strong>di</strong> esecuzione del<br />

programma. Le molecole accettabili si trovano sotto l’Ångström.


5.2. EFFICIENZA 59<br />

Prestazioni−qualità al variare del passo <strong>di</strong> campionamento<br />

della base ortonormale<br />

3.5<br />

3<br />

210<br />

120<br />

72<br />

54<br />

2.5<br />

rmsd<br />

2<br />

1.5<br />

1<br />

0.5<br />

10 −3 10 −2 10 −1 10 0 10 1 10 2 10 3<br />

tempo espresso in minuti<br />

Figura 5.5: Grafico rappresentante qualità in termini <strong>di</strong> RMSD, rispetto al<br />

ligando minimizzato, e prestazioni, in termini <strong>di</strong> tempo <strong>di</strong> esecuzione del<br />

programma. Le molecole accettabili si trovano sotto l’Ångström.


60 CAPITOLO 5. RISULTATI<br />

scala logaritmica, identifica il tempo in minuti dell’esecuzione <strong>di</strong> ogni istanza<br />

<strong>di</strong> ligand-rotation. La <strong>di</strong>mensione del lato <strong>delle</strong> celle è un parametro molto<br />

importante, che andrà ad influire sul tempo totale della computazione ma<br />

non sulla qualità dei risultati. Questo <strong>per</strong>ché, nel momento della verifica dei<br />

vincoli, si andranno a selezionare e controllare tutte le celle che potenzialmente<br />

possono contenere atomi sovrapposti. Una <strong>di</strong>mensione troppo piccola<br />

comporterebbe un numero <strong>di</strong> celle da visitare elevato, con conseguente <strong>per</strong><strong>di</strong>ta<br />

<strong>di</strong> tempo; su molte <strong>di</strong> esse potrebbe non esserci nemmeno un atomo.<br />

Al contrario, una <strong>di</strong>mensione troppo grande comporterebbe una verifica dei<br />

vincoli anche su atomi ‘lontani’ poiché una cella potrebbe contenere atomi<br />

<strong>di</strong>stanti tra loro, rappresentando una porzione <strong>di</strong> spazio relativamente grande.<br />

Dai risultati, si evince che la misura ottimale è data da 2Å: considerando<br />

l’esecuzione con 6 step, il tempo impiegato da quest’ultima rispetto ad un<br />

campionamento a 0.5Å si <strong>di</strong>mezza.<br />

5.3 Confronti su visite<br />

Un aspetto molto importante è la generazione dell’albero a partire dal grafo,<br />

dato che sta alla base della visita sullo spazio <strong>di</strong> ricerca <strong>delle</strong> combinazioni del<br />

ligando. Mo<strong>di</strong>ficando l’albero si influenzerà l’or<strong>di</strong>ne <strong>di</strong> esplorazione <strong>delle</strong> variabili<br />

(e <strong>di</strong> conseguenza l’albero <strong>di</strong> ricerca) e si potrà avere un miglioramento<br />

o un peggioramento <strong>delle</strong> prestazioni, in modo <strong>di</strong>pendente a seconda dalla<br />

particolare posizione assunta degli atomi nella lista D e da quanto spesso<br />

falliranno.<br />

5.3.1 DFS sul grafo della molecola<br />

Il primo algoritmo, implementato su ligand-rotation con il compito <strong>di</strong> visitare<br />

il grafo G = (V, E) rappresentante il ligando, è la DFS, visita in profon<strong>di</strong>tà.<br />

La strategia <strong>di</strong> ricerca esplora il grafo andando, in ogni istante dell’esecuzione<br />

dell’algoritmo, il più possibile in profon<strong>di</strong>tà: gli archi del grafo vengono<br />

esplorati a partire dall’ultimo vertice sco<strong>per</strong>to v che abbia ancora degli archi<br />

non esplorati uscenti da esso. Una volta terminata l’esplorazione <strong>di</strong> tutti gli<br />

archi non esplorati del vertice v, si ritorna in<strong>di</strong>etro <strong>per</strong> esplorare tutti gli archi<br />

uscenti a partire dal vertice da cui v ′ era stato precedentemente sco<strong>per</strong>to.<br />

Il processo <strong>di</strong> esplorazione continua fin quando tutti i vertici del grafo non<br />

siano stati esplorati.<br />

Grazie al fatto che G è connesso, ovvero che la car<strong>di</strong>nalità <strong>delle</strong> sue<br />

componenti connesse è 1, la ricerca DFS produce un unico albero.


5.3. CONFRONTI SU VISITE 61<br />

Prestazioni al variare del campionamento <strong>delle</strong> celle<br />

10 5<br />

10 4<br />

step rotazioni<br />

0.5Å<br />

1Å<br />

2Å<br />

3Å<br />

tempo espresso in minuti<br />

10 3<br />

10 2<br />

10 1<br />

10 0<br />

4 5 6<br />

Figura 5.6: Grafico rappresentante il tempo <strong>di</strong> esecuzione al variare del campionamento<br />

<strong>delle</strong> celle <strong>di</strong> V. Raggruppati sulle ascisse, i test svolti con 4,<br />

5, 6 step <strong>di</strong> rotazione, mentre sull’asse <strong>delle</strong> or<strong>di</strong>nate il tempo impiegato da<br />

ligand-rotation (in scala logaritmica).


62 CAPITOLO 5. RISULTATI<br />

La ricerca DFS, inoltre, marca ogni vertice con ben precise informazioni<br />

temporali, in particolar modo aggiorna due etichette <strong>per</strong> ogni vertice: d[v]<br />

che registra quando il generico vertice v è stato sco<strong>per</strong>to ed f[v] che registra<br />

quando è stata esplorata l’intera lista <strong>di</strong> a<strong>di</strong>acenza <strong>di</strong> v.<br />

La complessità computazionale <strong>di</strong> una DFS è pari a Ω(V +E). In ogni caso,<br />

rispetto al tempo <strong>di</strong> esecuzione dell’intero programma, è assai irrilevante: la<br />

DFS fa parte della fase <strong>di</strong> pre processing <strong>di</strong> ligand-rotation, <strong>per</strong> cui viene<br />

effettuata una sola volta.<br />

5.3.2 Mo<strong>di</strong>fica della DFS: first fail<br />

Una piccola, ma sostanziale, mo<strong>di</strong>fica all’algoritmo della DFS consiste nell’or<strong>di</strong>nare<br />

tutti i no<strong>di</strong> a<strong>di</strong>acenti a quello attualmente visitato in base al numero<br />

<strong>di</strong> rotazioni che possono effettuare: dal più basso al più alto. La strategia che<br />

si vuole implementare è quella simile ad una first fail, ovvero si fa in modo<br />

che durante l’iterazione della lista D si fallisca il prima possibile. Così facendo,<br />

poiché interviene il backtracking <strong>per</strong> portarci allo stato precedente, si<br />

elimina tutto il sottoalbero relativo al vertice in cui abbiamo fallito, andando<br />

a ridurre il numero <strong>di</strong> soluzioni finali e risparmiando il tempo impiegato ad<br />

una esplorazione <strong>di</strong> un sottoalbero privo <strong>di</strong> soluzioni.<br />

L’implementazione su ligand-rotation, in pratica, è una first fail statica.<br />

La scelta <strong>delle</strong> variabili viene effettuata nella fase <strong>di</strong> preprocessing, durante la<br />

DFS, e l’or<strong>di</strong>namento riguarda gli archi del singolo nodo, in<strong>di</strong>pendentemente<br />

dagli altri.<br />

La mo<strong>di</strong>fica della DFS può trovare giustificazione nel fatto che avendo da<br />

attuare due scelte, una <strong>di</strong>pendente dall’altra, conviene intraprendere prima<br />

quella con meno possibilità. Cosicché, in caso <strong>di</strong> fallimento, il sottoalbero<br />

eliminato conterrà più no<strong>di</strong>.<br />

Nel grafico 5.7 sono rappresentati i risultati ottenuti sia da istanze <strong>di</strong><br />

ligand-rotation su cui è stata implementata la first fail che da altre senza. Dai<br />

test effettuati si può concludere che la first fail ha avuto successo, riducendo<br />

i tempi <strong>di</strong> esecuzione.


5.3. CONFRONTI SU VISITE 63<br />

Prestazioni al variare della visita sul grafo<br />

10 4 DFS first fail<br />

DFS<br />

step rotazioni<br />

10 3<br />

tempo espresso in minuti<br />

10 2<br />

10 1<br />

10 0<br />

4 5 6<br />

Figura 5.7: Grafico rappresentante il tempo <strong>di</strong> esecuzione <strong>di</strong> istanze <strong>di</strong> ligandrotation<br />

con first fail e senza.


64 CAPITOLO 5. RISULTATI


Capitolo 6<br />

Conclusioni e Sviluppi futuri<br />

In questo lavoro <strong>di</strong> Tesi si è affrontato il problema del docking. In particolare,<br />

lo scopo era volto alla costruzione <strong>di</strong> un nuovo pacchetto in grado <strong>di</strong> far<br />

interagire tra loro due molecole, senza che ciò fosse influenzato da funzioni<br />

<strong>di</strong> scoring che valutano la stabilità energetica.<br />

La soluzione offerta a questo problema è, appunto, ligand-rotation; programma<br />

da me stu<strong>di</strong>ato e implementato, in grado <strong>di</strong> generare strutture molecolari<br />

geometricamente corrette e, oltretutto, in maniera efficiente, <strong>per</strong> quel<br />

che riguarda il tempo impiegato nei calcoli.<br />

Grazie all’approccio interamente geometrico, i test <strong>di</strong> vali<strong>di</strong>tà eseguiti<br />

su ligand-rotation hanno <strong>di</strong>mostrato che è possibile raggiungere una qualità<br />

accettabile rispetto alle richieste reali da parte <strong>delle</strong> case farmaceutiche.<br />

Con una configurazione standard, che porta il programma a conclusione<br />

nel giro <strong>di</strong> 6 ore al massimo 1 , si riesce a produrre posizionamenti <strong>di</strong> molecole<br />

entro l’Ångström <strong>di</strong> RMSD, cioè si ottengono ligan<strong>di</strong> dalla struttura molto<br />

simile a quella minimizzata, scaricata dal database PDB.<br />

Una passo successivo a questa Tesi consiste nell’applicare una funzione<br />

<strong>di</strong> scoring <strong>per</strong> valutare l’energia complessiva del complesso ligando-proteina<br />

determinando la stabilità del sistema; in particolare, ci interessa quanto sia<br />

correlata all’RMSD ottenuto dai nostri test.<br />

Verranno ora mostrati alcuni riferimenti utili all’evoluzione <strong>di</strong> ligandrotation.<br />

L’ingegneria del software insegna che un programma informatico<br />

è in costante evoluzione, sia <strong>per</strong> quel che riguarda la risoluzione <strong>di</strong> bug esistenti<br />

che <strong>per</strong> l’aggiunta <strong>di</strong> nuove funzionalità. Essendo un progetto giovane,<br />

l’intento è quello <strong>di</strong> poter sviluppare nuove metodologie che constentiranno a<br />

ligand-rotation l’elaborazione <strong>di</strong> <strong>di</strong>fferenti tipi <strong>di</strong> molecole, anche complesse,<br />

1 Il tempo impiegato da ligand-rotation <strong>di</strong>pende molto dal ligando scelto e dal numero<br />

<strong>di</strong> legami ruotabili.<br />

65


66 CAPITOLO 6. CONCLUSIONI E SVILUPPI FUTURI<br />

garantendo tempi <strong>di</strong> esecuzione ragionevoli e più precisione nella generazione<br />

<strong>delle</strong> strutture dei ligan<strong>di</strong>.<br />

Nella sezione 6.1 cercheremo <strong>di</strong> dare una possibile estensione all’algoritmo<br />

esistente, in modo tale da poter trattare molecole con caratteristiche <strong>di</strong><br />

struttura particolari.<br />

Successivamente (nella sezione 6.2) si descriverà l’idea <strong>di</strong> un nuovo potenziale<br />

modello a vincoli che prevede l’inserimento <strong>di</strong> ulteriori vincoli e<br />

l’implementazione della propagazione.<br />

6.1 Molecole contenenti cicloesano<br />

Un problema incontrato nello <strong>sviluppo</strong> <strong>di</strong> ligand-rotation è stato che, <strong>per</strong><br />

particolari ligan<strong>di</strong>, non si è riusciti ad ottenere un loro buon posizionamento<br />

in termini <strong>di</strong> RMSD con il ligando minimizzato. Sono stati condotti numerosi<br />

test e le migliori conformazioni si aggiravano intorno a 1.5Å - contro il nostro<br />

limite <strong>di</strong> accettazione <strong>di</strong> 1Å. Il problema non stava nemmeno alla base <strong>delle</strong><br />

opzioni <strong>di</strong> campionamento; infatti, all’aumentare dei parametri <strong>di</strong> qualità,<br />

non si apprezzavano miglioramenti da parte <strong>delle</strong> strutture generate.<br />

Figura 6.1: A sinistra il ligando ottenuto con ligand-rotation, a destra il<br />

ligando minimizzato scaricato da PDB<br />

La strada da <strong>per</strong>correre è completamente <strong>di</strong>versa. Alla base <strong>di</strong> ciò ci sono<br />

particolari strutture molecolari denominate Cicloesano e Ciclopentano, che<br />

dovranno essere trattate in modo completamente <strong>di</strong>fferente.


6.1. MOLECOLE CONTENENTI CICLOESANO 67<br />

6.1.1 Cicloesano<br />

Il cicloesano fa parte della famiglia dei cicloalcani; è composto da sei atomi<br />

<strong>di</strong> carbonio e 12 atomi <strong>di</strong> idrogeno, è privo <strong>di</strong> doppi e tripli legami e la sua<br />

struttura è chiusa ad anello.<br />

Gli atomi <strong>di</strong> carbonio hanno ibri<strong>di</strong>zzazione sp 3 , andando a formare <strong>delle</strong><br />

strutture tetraedriche con angoli <strong>di</strong> legame <strong>di</strong> 109.5 ◦ . La struttura quin<strong>di</strong><br />

non sarà planare, la quale ha angoli <strong>di</strong> 120 ◦ , bensì tenderà ad assumere una<br />

conformazione a se<strong>di</strong>a, visibile in figura 6.2.<br />

Figura 6.2: La figura mostra la struttura del cicloesano con a sinistra una<br />

conformazione a se<strong>di</strong>a e a destra una conformazione a barca<br />

Oltre quella a se<strong>di</strong>a, esistono altre conformazioni, sebbene con maggiore<br />

energia e quin<strong>di</strong> meno stabili: conformazione a barca (in figura 6.2) e a mezza<br />

se<strong>di</strong>a. In figura 6.3 si esprime l’energia del cicloesano <strong>per</strong> ogni conformazione.<br />

Figura 6.3: La figura rappresenta le possibili energie <strong>delle</strong> strutture del<br />

cicloesano in funzione alle conformazioni assunte


68 CAPITOLO 6. CONCLUSIONI E SVILUPPI FUTURI<br />

6.1.2 Nuovi gra<strong>di</strong> <strong>di</strong> libertà<br />

Tutte le conformazioni del cicloesano elencate nella precedente sezione non<br />

possono essere ottenute a partire da semplici rotazioni. È necessario implementare<br />

un nuovo algoritmo da inglobare a quello esistente, in grado <strong>di</strong> gestire<br />

più gra<strong>di</strong> <strong>di</strong> libertà. L’idea è quella <strong>di</strong> in<strong>di</strong>viduare queste strutture particolari<br />

attraverso la visita del grafo del ligando e, successivamente, nel momento<br />

in cui si piazzano i suoi atomi, è necessario capire la conformazione attuale<br />

<strong>per</strong> andare a simulare tutti i suoi possibili stati conformazionali prima della<br />

rotazione del sottoalbero.<br />

6.2 Espansione modello a vincoli<br />

Un primo ampliamento da realizzare su ligand-rotation potrebbe essere quello<br />

<strong>di</strong> integrare il modello a vincoli, introducendono <strong>di</strong> ulteriori, come la verifica<br />

della lunghezza <strong>di</strong> un legame chimico, oppure implementare la propagazione<br />

dei vincoli. Nei paragrafi 6.2.1 e 6.2.2 svilup<strong>per</strong>emo questi due argomenti.<br />

6.2.1 Controllo lunghezza legame<br />

Con il modello a vincoli attualmente implementato in ligand-rotation, la verifica<br />

della lunghezza dei legami chimici sarebbe completamente inutile, anzi<br />

sarebbe un aggravio alla complessità totale del sistema. Al contrario, riuscendo<br />

a trattare molecole come il cicloesano o il ciclopentano, si introdurrebbe<br />

un nuovo grado <strong>di</strong> libertà e il controllo <strong>di</strong>venterebbe sensato. Effettuando<br />

<strong>delle</strong> rotazioni anche sui legami <strong>delle</strong> precedenti strutture si potrebbe andare<br />

incontro ad una rottura del ciclo.<br />

6.2.2 Implementazione propagazione dei vincoli<br />

Il modello a vincoli qui presentato non implementa su <strong>di</strong> sé la propagazione<br />

dei vincoli; questione non affrontata a causa dello scarso tempo avuto a<br />

<strong>di</strong>sposizione. Dalla sezione 1.4 sappiamo che la propagazione ha il compito<br />

<strong>di</strong> ridurre lo spazio <strong>di</strong> ricerca, eliminando eventuali elementi del dominio.<br />

Nel nostro caso, l’eliminazione riguarda le possibili rotazioni. L’idea è<br />

quella <strong>di</strong> evitare <strong>di</strong> visitare porzioni <strong>di</strong> albero inconsistenti. Nel contesto <strong>di</strong><br />

ligand-rotation, una possibile definizione <strong>di</strong> propagazione sarebbe questa:<br />

nel momento in cui si identifica una rotazione che sicuramente porta<br />

a fallimento, la si elimina dal dominio della sua variabile legame. Come<br />

conseguenza <strong>di</strong> ciò, si potrebbe avere il risveglio a catena <strong>di</strong> altre propagazioni<br />

e quin<strong>di</strong> l’eliminazione <strong>di</strong> altre rotazioni.


6.2. ESPANSIONE MODELLO A VINCOLI 69<br />

L’interazione tra vincoli <strong>di</strong> non sovrapposizione e rotazione <strong>di</strong> un legame<br />

possono fornire deduzioni sulla effettiva vali<strong>di</strong>tà dei valori del dominio <strong>delle</strong><br />

variabili. Supponiamo <strong>di</strong> compiere un movimento alla struttura molecolare.<br />

Attraverso un algoritmo, possiamo essere in grado <strong>di</strong> stabilire a priori che<br />

sicuramente la rotazione appena effettuata non porta a nessuna soluzione<br />

valida. In virtù <strong>di</strong> ciò, si deduce che i valori ammissibili <strong>di</strong> alcune variabili<br />

<strong>di</strong> tipo legame sono incongruenti con i vincoli implementati e si effettua,<br />

quin<strong>di</strong>, una riduzione del dominio <strong>delle</strong> variabili implicate. Osserviamo come<br />

il costo computazionale degli algoritmi <strong>di</strong> propagazione debba essere molto<br />

basso affinché il loro utilizzo sia giustificato.


70 CAPITOLO 6. CONCLUSIONI E SVILUPPI FUTURI


Bibliografia<br />

[1] Thomas Lengauer (Ed.). Bioinformatics - From Genomes to Drugs,<br />

Volume I. WILEY-VCH, 2001.<br />

[2] Peter Atkins, Loretta Jones. Principi <strong>di</strong> chimica. Zanichelli, 2005.<br />

[3] William K. Purves, David Sadava, Gordon H. Orians and H. Craig<br />

Heller. Elementi <strong>di</strong> Biologia e Genetica. Zanichelli, 2005.<br />

[4] Harold Hart, David J. Hart, Leslie E. Craine. Chimica organica, quarta<br />

e<strong>di</strong>zione. Zanichelli, 1998.<br />

[5] Krzysztof R. Apt. Principles of Constraint Programming. Cambridge<br />

University Press, 2003.<br />

[6] Bjarne Stroustrup. C++: linguaggio, libreria standard, principi <strong>di</strong><br />

programmazione. Ad<strong>di</strong>son-Wesley, 2000.<br />

[7] Gregory L. Warren, C. Webster Andrews, Anna-Maria Capelli, Brian<br />

Clarke, Ju<strong>di</strong>th LaLonde, Millard H. Lambert, Mika Lindvall, Neysa Nevins,<br />

Simon F. Semus, Stefan Senger, Giovanna Tedesco, Ian D. Wall,<br />

James M. Woolven, Catherine E. Peishoff and Martha S. Head. A critical<br />

Assessment of Docking Programs and Scoring Function. Journal of<br />

Me<strong>di</strong>cinal Chemistry, 2006, Vol. 49, No. 20.<br />

[8] http: // mathworld. wolfram. com/ RotationFormula. html .<br />

71

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!