• Non ci sono risultati.

Come detto nella parte introduttiva del capitolo, l’implementazione del predittore fa uso degli strumenti sviluppati nel corso del progetto, felix per la gestione dei modelli, e cougar per il loro addestramento.

Per la parte grafica, la libreria fa uso degli strumenti messi a disposizione dalla libre- ria Qt per visualizzare le informazioni in maniera organica e dettagliata. In particolare, verr`a sfruttata la separazione logica tra il contenuto di un’immagine QGraphicScene e la sua visualizzazione QGraphicsView utilizzata dalla libreria Qt per gestire la grafica. Questo dualismo permetter`a di utilizzare la stessa scena per visualizzare la stessa mole- cola in diversi punti del programma, con notevole risparmio di memoria, specialmente nel caso di grandi dataset.

La libreria OpenBabel viene usata per la conversione delle molecole dai formati SMILES e SDF, per la loro conversione nel formato grafico vettoriale SVG, e per la ricerca di sotto-strutture molecolari mediante espressioni SMARTS.

La finestra principale del predittore `e implementata dalla classe PredictorWidget che estende la classe QMainWindow, e si occupa di contenere e gestire le classi accessorie. Nella fase di conversione di una molecola, questa viene convertita nella struttura OBMol di OpenBabel, la quale viene usata per facilitare la conversione in grafo da poter passare al modello, e per ottenere in modo semplice informazioni utili quali il suo fingerprint. La conversione avviene all’interno del costruttore di un’apposita classe Molecule, che implementa le seguenti le cui funzioni principali:

makePrediction funzione che si occupa di:

• convertire la struttura OBMol in un Graph della libreria felix ; • passare il grafo al modello e memorizzarne l’uscita;

• ottenere i contributi degli atomi e salvare in una stringa la relativa formula estesa del modello;

• salvare i risultati dell’analisi del dominio in funzione della molecola specifica; addModelInfos funzione che prende la rappresentazione grafica della molecola, me- diante stringa in formato vettoriale SVG, e la modifica. Per ogni atomo presente, viene aggiunto il suo contributo, sia come valore numerico che come marker. Le operazioni di caricamento, conversione, analisi, e relativa rappresentazione gra- fica possono essere onerose per un’applicazione end-user interattiva, specialmente nel

5.4 Struttura del Predittore 107

caso di caricamento di dataset molto grandi. Per questo motivo si `e scelto di suddivi- dere le operazioni pi`u onerose in diverse funzioni, ed optare per un’esecuzione dinamica delle stesse. Ad esempio, la scelta della visualizzazione delle molecole a mezzo di pagi- nazione in un mosaico 5 × 4, oltre a venire incontro a minimi criteri di leggibilit`a, ha l’importante scopo di permettere un caricamento on-demand delle molecole. A tempo di caricamento del dataset, vengono creati tanti oggetti MoleculeWidget quante sono le molecole presenti. La classe MoleculeWidget, essendo una sottoclasse di Molecule, ne erida il costruttore, il quale si limita a creare un oggetto OBMol.

Queste istanze di MoleculeWidget vengono inserite in una serie di strutture Mo- leculePage, le quali fungono da semplici contenitori. Quando una pagina deve essere caricata, nel caso in cui l’utente la selezioni con le apposite frecce, o perch`e `e la prima, viene invocata la funzione showMols della relativa MoleculePage, la quale si occupa di: 1. invocare la funzione setGraphicalMolecule di ogni istanza MoleculeWidget ivi

contenuta, la quale, a sua volta:

I. invoca makePrediction della classe base Molecule;

II. crea la rappresentazione grafica della molecola in formato SVG, aggiungendo il marker dei contributi dei vari atomi;

III. aggiornare la QGraphicScene con l’immagine della molecola, in modo da poterla visualizzare;

2. creare un’istanza della classe MoleculeWidget portrait la quale, estendendo QGra- phicsView permette la visualizzazione grafica dell’anteprima della molecola (vi- sibile in Fig. 5.2 e Fig. 5.3);

Per motivi di efficienza, la classe MoleculeWidget portrait user`a come QGraphicsScene la stessa istanza contenuta nell’oggetto MoleculeWidget associato. Difatti le rappresen- tazioni grafiche dell’anteprima e del dettaglio della predizione sono le stesse, e vengono semplicemente rappresentate con due QGraphicsView diversi6.

Nella struttura del programma, la classe PredictorWidget implementa la finestra principale, la quale contiene tutte le altre strutture dati. Le informazioni dettagliate sulla singola molecola vengono mostrate grazie all’uso della classe Molecule che conserva tutte le informazioni molecolari ed implementa le operazioni di base della molecola, e MoleculeWidget che espone queste informazioni in maniera grafica.

6Il viewer usato per il dettaglio `e un wrapper MoleculeView che permette lo zoom ed il panning,

Le altre classi sono ausiliarie, e servono a rendere il sistema efficiente, come la classe MoleculePage, o graficamente accessibile, come la classe MoleculeWidget portrait. Molecule una delle classi principali, rappresenta tutte le informazioni relative ad una

singola molecola, e conserva un riferimento al modello caricato. `E responsabile di tutte le operazioni riguardanti la molecola, ed usa il riferimento al modello per effettuare la predizione;

MoleculeWidget estende QWidget e Molecule e conferisce alle strutture dati con- tenute nella classe Molecule la dovuta rappresentazione grafica. Questa clas- se implementa il dettaglio della molecola visibile in Fig. 5.7, e rappresenta graficamente tutte le informazioni contenute nella sua superclasse Molecule; MoleculeView estende QGraphicsView aggiungendo semplicemente una funzione di

zoom e panning;

MoleculeWidget Portrait estende QGraphicsView e viene associato ad un’istanza di MoleculeWidget nel costruttore. Implementa la rappresentazione grafica di una molecola, nel formato “anteprima”, visualizzabile in PredictorWidget (vedere Fig.

5.2 e Fig. 5.3);

MoleculePage estende QWidget e contiene al suo interno diversi riferimenti di Mo- leculeWidget e MoleculeWidget portrait. Si occupa della gestione delle pagine all’interno di PredictorWidget ed effettua il caricamento di tutte le molecole per cui `e responsabile;

SimilarMoleculeWidget estende MoleculeView e Molecule e implementa la rap- presentazione grafica visibile nel dettaglio delle molecole simili (vedere in Fig.

5.6);

PredictorWidget estende QMainWindow ed implementa la finestra primaria visi- bile in Fig. 5.2. Questa classe implementa le funzionalit`a di caricamento delle molecole, e contiene al suo interno un vettore di istanze di MoleculePage usato per visualizzare le molecole della pagina selezionata;

La differenza tra la rappresentazione grafica di una molecola visibile nell’anteprima della finestra principale (PredictorWidget ) e quella visibile nel dettaglio (MoleculeWid- get ) `e che quest’ultima viene implementata mediante MoleculeView, la quale permette lo zoom e il panning dell’immagine, cosa non permessa nell’anteprima.