• Non ci sono risultati.

6.3 Struttura delle Classi

6.3.1 Classi Principali

Classi per il parsing

Figura 6.1: Diagramma di classe per la sotto-gerarchia del progetto relativa al parser.

Le classi utilizzate per effettuare il parsing del modello SBML sono state or- ganizzate gerarchicamente in maniera tale da avere un tipo differente di classe per ogni livello di specifica del linguaggio SBML. Ogni sezione del documento SBML viene analizzata da opportune funzioni della libreria libSBML [12] e il risultato fi- nale dell’attivit`a di parsing `e un file di testo che riporta tutti i dati del modello in maniera ordinata e leggibile dall’utente.

Come gi`a anticipato nel capitolo5, il livello 2 del SBML aggiunge delle fun- zionalit`a e dei costrutti alla struttura di base rappresentata dal livello 1. All’interno di ogni livello poi, ogni nuova versione differisce dalle precedenti per la modifica di funzionalit`a pre-esistenti o per l’aggiunta di nuovi costrutti. Seguendo questo

standard, si `e scelto di affidare il parsing di un documento SBML di livello 1 ad una classe contenente metodi libSBML per la lettura dei soli costrutti inclusi nel livello 1, la classe ParserL1; da questa viene ereditata la classe ParserL2, che ha il compito di effettuare il parsing dei documenti di livello 2 versione 1; le versioni 2 e 3 dello stesso livello vengono invece analizzate dalla classe ParserL2v2_3, ereditata dalla classe precedente. La gerarchia appena descritta `e rappresentata nel diagramma di classe riportato nella Figura6.1.

Di seguito una breve descrizione delle classi parser:

• ParserL1: nel main viene generato un oggetto di questo tipo se il docu- mento passato dall’utente da riga di comando `e una specifica SBML di livel- lo 1. Le sezioni SBML appartenenti a tale livello e quindi analizzate dagli opportuni membri di questa classe sono:

– Definizioni di unit`a, analizzata dalla funzione parseUnitDefinitions().

– Unit`a, analizzata dalla funzione parseUnit().

– Compartimenti, analizzata dalla funzione parseCompartments(). – Specie, analizzata dalla funzione parseSpecies().

– Parametri, analizzata dalla funzione parseParameters(). – Reazioni, analizzata dalla funzione parseReactions(). – Regole, analizzata dalla funzione parseRules().

Le funzioni membro appena elencate si occupano di annotare in oppor- tune strutture dati interne (e alla fine in un file di testo) tutte le caratter- istiche della sezione SBML a cui sono associate; ad esempio, la funzione parseReactions() rileva tutti i reagenti ed i prodotti di una reazione, ne analizza la legge cinetica rilevandone i parametri, i valori e le unit`a di questi ultimi, etc.

• ParserL2: nel main viene generato un oggetto di questo tipo se il documen- to passato dall’utente da riga di comando `e una specifica SBML di livello 2 versione 1. Le sezioni SBML appartenenti a tale livello e quindi analizzate dagli opportuni membri di questa classe sono le stesse viste per il livello 1 pi`u due nuove, introdotte dallo standard SBML di livello 2:

– Definizioni di funzioni, analizzata dalla funzione parseFunctionDefinitions().

• ParserL2v2_3: nel main viene generato un oggetto di questo tipo se il do- cumento passato dall’utente da riga di comando `e una specifica SBML di li- vello 2 versione 2 o 3. Le sezioni SBML appartenenti a tali versioni e quindi analizzate dagli opportuni membri di questa classe sono le stesse viste per il livello 2 versione 1 pi`u quattro nuove sezioni introdotte nelle versioni 2 e 3 dello standard SBML di livello 2 :

– Tipi di compartimento, analizzata dalla funzione parseCompartmentTypes().

– Tipi di specie, analizzata dalla funzione parseSpeciesTypes(). – Assegnamenti iniziali, analizzata dalla funzione

parseInitialAssignments().

– Vincoli, analizzata dalla funzione parseConstrains().

La funzione che ha il compito di lanciare le singole funzioni di parsing per ogni sezione `e la parse() invocata nel main su un puntatore del tipo appropriato al livello del documento SBML che si vuole leggere.

Classi per la generazione del P System

Dopo che i dati relativi al documento SBML sono stati archiviati in opportune strutture dati, essi vengono analizzati per la definizione di un P System che model- li in maniera affidabile il sistema descritto in SBML. Ogni elemento appartenente alla specifica del P System (vedi Capitolo3) viene rappresentato da un preciso tipo di dato astrattoche ne riprende le funzionalit`a principali; le classi che descrivono le entit`a del P System sono organizzate in una gerarchia rappresentata nel diagram- ma di classi di Figura6.2. Vediamo una breve descrizione per le classi dedicate al P System:

• Classe Object: ogni entit`a di un P System un oggetto, per cui questa classe `e una superclasse per ogni elemento del P System. Al suo interno con- tiene un puntatore ad oggetto ParserL1, tramite il quale ogni classe del P System derivata da essa pu`o accedere alle strutture che contengono i dati ricavati dal documento.

• Classe Compound: rappresenta i composti che popolano il sistema biologico (proteine, ioni, sostanze chimiche, etc.). Agli oggetti di questa classe `e as- sociata una stringa che rappresenta la membrana in cui la specie `e collocata e un valore double che ne indica la quantit`a iniziale.

Figura 6.2: Diagramma di classe per la sotto-gerarchia del progetto relativa alla creazione del P System.

• Classe Membrane: rappresenta i compartimenti presenti nel sistema. Ogni compartimento ha associato una dimensione e una lista1di puntatori a mem- brana per l’eventuale presenza di membrane innestate.

• Classe RuleBase: `e una classe astratta che modella una tipica regola di evoluzione. Per rappresentare i termini di una regola di evoluzione `e stato sviluppato il tipo Formulae; un oggetto di questo tipo `e una coppia che as- socia una membrana ad un multi-insieme (classe modello MultiSet, che as- socia un composto alla sua molteplicit`a). Sappiamo che una regola di P Sy- stem, cos`ı come la reazione che identifica, ha due “membri”, uno sinistro che raccoglie i reagenti e uno destro che raccoglie i prodotti della reazione. Un oggetto Formulae identifica proprio uno di questi membri e infatti nella parte protetta della classe RuleBase sono presenti due liste di formule, una per i reagenti e una per i prodotti. Alla regola sono inoltre associati: gli insiemi dei reagenti e dei prodotti coinvolti nella reazione, l’insieme delle membrane affette dall’applicazione della regola, la membrana in cui la rea- zione ha luogo e vari campi che riprendono alcune strutture associate al tipo Reactiondella libreria libSBML.

• Classe Rule: `e la classe che specializza la classe astratta RuleBase prece- dentemente descritta. Al suo interno sono presenti i membri che realizzano sul sistema gli effetti dell’applicazione di una regola e che ne determinano il Waiting Time e la velocit`a seguendo il procedimento esposto nella sezione

2.5.

• Classe PState: rappresenta lo stato corrente del sistema in termini di quan- tit`a di composti per ogni membrana. La sua struttura dati interna `e costituita da una mappa2tra una membrana ed un MultiSet di composti. Ogni volta che una regola modifica le quantit`a delle specie del sistema lo stato corrente viene aggiornato mediante la funzione access(). Sfruttando la tecnica del- l’overloading `e stata definita una versione costante della funzione access() che viene utilizzata per accedere in sola lettura allo stato del sistema.

• Classe PSystem: `e la classe pi`u importante per quanto riguarda questa sezione del simulatore poich`e rappresenta il P System vero e proprio. Al suo inter- no `e presente un puntatore allo stato attuale del sistema, un puntatore alla membrana principale del modello (che `e poi quella pi`u esterna), la lista delle membrane e quella delle regole.

1Per l’implementazione di questa struttura `e stata sfruttata la libreria STL[9] 2Costruttomapdella libreria STL.

Le funzioni che hanno il compito di generare il P System e tutti gli ogget- ti che lo compongono, appartengono alla classe ParserL1 e hanno tutte il suff- isso build. Per cui la funzione buildMembrane() crea le strutture dati relative alle membrane presenti nel sistema, la funzione buildCompound() alloca le strut- ture dati relative alle specie e via dicendo per gli altri elementi del P Systems. La funzione che, basandosi sui risultati del parsing, coordina la costruzione del P System chiamando a sua volta tutte le funzioni build `e la buildPSystem().

Classi per la simulazione

Figura 6.3: Diagramma di classe per la sotto-gerarchia del progetto relativa alle simulazioni.

Lo sviluppo della simulazione e la raccolta dei risultati sono gestiti dalle classi SimulatorBase, Simulator e Watcher; vediamole nel dettaglio:

• SimulatorBase: `e la classe astratta per il simulatore. Al suo interno `e presente un puntatore al P System su cui viene effettuata la simulazione e una lista diwatchers, sulle cui funzionalit`a ci soffermeremo in fondo. • Simulator: `e la classe che rappresenta il simulatore vero e proprio; spe-

cializza la classe astratta SimulatorBase. La sua struttura interna `e com- posta dalla coda degli eventi, che `e una lista di regole ordinata in base al Waiting Time. Tale coda `e un elemento fondamentale dell’algoritmo DWT descritto nel capitolo 4 e viene utilizzata per determinare quale regola ap- plicare dopo ogni passo di simulazione. Il criterio di ordinamento rispet- to al Waiting Time minore viene realizzato mediante l’utilizzo del funtore3 TimeCompare. La funzione evolveOneStep() `e quella che implementa l’algoritmo Deterministic Waiting Time.

• Watcher: unWatcherha il compito di osservare l’andamento temporale del- la concentrazione di una specie del sistema per poi stamparlo in un file di testo ad intervalli regolari; il valore dell’intervallo di attivit`a viene settato da riga di comando, come specificato nella sezione 6.2. L’associazione tra un Watcher e una specie da osservare, detta registrazione, viene fatta me- diante la funzione registerw() della classe SimulatorBase(). La funzione observe(), ogni volta che si ha un cambiamento dello stato del sistema, determina l’attivazione dei Watchers registrati.