+ All Categories
Home > Technology > Seminario Daniela Ghironi, 25-10-2012

Seminario Daniela Ghironi, 25-10-2012

Date post: 18-May-2015
Category:
Upload: crs4-research-center-in-sardinia
View: 560 times
Download: 0 times
Share this document with a friend
Description:
Si trattano maggiormente gli aspetti implementativi, attraverso l'illustrazione delle scelte progettuali adottate sul campo per far fronte alle sfide del settore, fornendo esempi concreti di implementazione.
39
Standard internazionali e linee guida per il software nel settore della salute Daniela Ghironi - [email protected] Monday, October 29, 2012
Transcript
Page 1: Seminario Daniela Ghironi, 25-10-2012

Standard internazionali e linee guida per il software nel settore della salute

Daniela Ghironi - [email protected]

Monday, October 29, 2012

Page 2: Seminario Daniela Ghironi, 25-10-2012

eventoclinico pro!lo IHE

sistemi informativiintegrati

1 2

4progettazione

software

3

CONTESTO CLINICO ANALISI

processo di integrazione

Monday, October 29, 2012

Page 3: Seminario Daniela Ghironi, 25-10-2012

pro!lo IHE

attore 2

attore 1

transazioni

descrive

1. identi!cazione attori• software già esistente o da implementare/integrare

2. identi!cazione fonti dati per le transazioni• eventuale integrazione tra le fonti

3. progettazione moduli software da sviluppare

4. progettazione sistema di messaggistica per le transazioni

progettazione

Monday, October 29, 2012

Page 4: Seminario Daniela Ghironi, 25-10-2012

consideriamo il caso più completo, in cui affronteremo:

• sviluppo dei due moduli software che implementano gli attori LB e LIP

• supporto messaggi HL7

• protocollo di rete per lo scambio dei messaggi HL7 per la transazione lab62

caso d’uso - lab62

pro!lo LBL

LIP

LB

lab-62

descrive

Monday, October 29, 2012

Page 5: Seminario Daniela Ghironi, 25-10-2012

moduloLB

messaggi HL7 *

via LAN

* come previsto dalla transazione LAB-62: QBP^SLI^QBP_Q11 e RSP^SLI^RSP_K11

moduloLIP

DATABASE LISpazienti

esami

leggeSERVER

PC operatore

architettura

Monday, October 29, 2012

Page 6: Seminario Daniela Ghironi, 25-10-2012

1. Il paziente Mario Rossi arriva nella sala prelievi e consegna il proprio codice !scale all’operatore;

2. L’operatore effettua la ricerca per codice !scale:1. LB invia un messaggio HL7 con i parametri di ricerca al LIP2. LIP risponde con un messaggio HL7 contenente i risultati della ricerca

3. L’operatore visualizza la lista degli esami per il paziente e vengono stampate le etichette;

4. L’operatore effettua il prelievo.

moduloLB

moduloLIP

QBP^SLI^QBP_Q11

RSP^SLI^RSP_K11

messaggi HL7

caso d’uso - lab62

Monday, October 29, 2012

Page 7: Seminario Daniela Ghironi, 25-10-2012

• quale linguaggio di programmazione?

• come creare e gestire messaggi HL7?

• come inviare il messaggio da LB al LIP?

scelte implementative

Monday, October 29, 2012

Page 8: Seminario Daniela Ghironi, 25-10-2012

quale linguaggio di programmazione?

la scelta dipende da diversi fattori:• contesto in cui ci si deve integrare• eventuali limitazioni hw/sw

per i nostri progetti usiamo prevalentemente Python, ma questo ovviamente non signi!ca che sia l’unica scelta possibile!

scelte implementative

Monday, October 29, 2012

Page 9: Seminario Daniela Ghironi, 25-10-2012

Pythonhttp://python.org

• linguaggio di programmazione ad alto livello

• creato nel 1991

• multi-paradigma (orientato agli oggetti, imperativo, ...)

• multi-piattaforma (Linux/Unix, Mac OS X, Windows, ...)

• opensource

Guido van Rossum

Monday, October 29, 2012

Page 10: Seminario Daniela Ghironi, 25-10-2012

• "It was nice to learn Python; a nice afternoon." *

• estesa libreria standard - batteries included

• prototipazione rapida

* cit. Donald Knuth, autore di “The art of computer programming” - Trento, 2012

Pythonpunti di forza

Monday, October 29, 2012

Page 11: Seminario Daniela Ghironi, 25-10-2012

scelte implementative

• quale linguaggio di programmazione?Python

• come creare e gestire messaggi HL7?

• come inviare il messaggio da LB al LIP?

Monday, October 29, 2012

Page 12: Seminario Daniela Ghironi, 25-10-2012

come creare e gestire messaggi HL7?

scelte implementative

libreria HL7 “from scratch”

libreria HL7 esistente

Monday, October 29, 2012

Page 13: Seminario Daniela Ghironi, 25-10-2012

libreria HL7

per ogni versione dello standard, dovrebbe supportare:

• creazione di messaggi, segmenti, etc.• supporto sequenze di escape e delimitatori custom• tipi di dati semplici e complessi • parser di messaggi in formato ER7• validazione dei messaggi• "essibilità in caso di messaggi/segmenti/campi non conformi

Monday, October 29, 2012

Page 14: Seminario Daniela Ghironi, 25-10-2012

Alcune delle librerie opensource più usate:

libreria HL7

Nome Linguaggio Licenza Supporta

HAPI Java MPL / GPL v3 2.x

nhapi .NET MPL 2.x

python-hl7 Python BSD 2.x

Monday, October 29, 2012

Page 15: Seminario Daniela Ghironi, 25-10-2012

libreria HL7

Stato dell’arte delle librerie Python

Nome Parser Validazione Data types

python-hl7 Incompleto No No

ankhos-python-hl7-parser Incompleto No No

pyhl7 Incompleto No No

Monday, October 29, 2012

Page 16: Seminario Daniela Ghironi, 25-10-2012

libreria Python open source attualmente in sviluppo al CRS4

• standard HL7 2.x

• permette di creare messaggi “from scratch” o tramite parsing

• supporto tipi di dati semplici e complessi

• valida i messaggi segnalando eventuali violazioni dello standard

• licenza MIT

hl7apy

Monday, October 29, 2012

Page 17: Seminario Daniela Ghironi, 25-10-2012

Messaggio HL7 generato dal modulo LB per la ricerca esami del paziente 123456:

MSH|^~\&|LB|Modulo LB|LIP|Reparto A|201210251630||QBP^SLI^QBP_Q11|001|P|2.5QPD|SLI^Specimen Labeling Instructions^IHE_LABTF|0001|123456

RCP|I||R

messaggi HL7esempio

moduloLB

QBP^SLI^QBP_Q11

moduloLIP

Monday, October 29, 2012

Page 18: Seminario Daniela Ghironi, 25-10-2012

Messaggio HL7 generato dal modulo LB per la ricerca esami del paziente 123456:

MSH|^~\&|LB|Modulo LB|LIP|Reparto A|201210251630||QBP^SLI^QBP_Q11|001|P|2.5QPD|SLI^Specimen Labeling Instructions^IHE_LABTF|0001|123456

RCP|I||R

messaggi HL7struttura

ogni riga* è un segmento

* ad esser precisi, i segmenti sono separati dal carattere CR (carriage return)

Monday, October 29, 2012

Page 19: Seminario Daniela Ghironi, 25-10-2012

Messaggio HL7 generato dal modulo LB per la ricerca esami del paziente 123456:

MSH|^~\&|LB|Modulo LB|LIP|Reparto A|201210251630||QBP^SLI^QBP_Q11|001|P|2.5QPD|SLI^Specimen Labeling Instructions^IHE_LABTF|0001|123456

RCP|I||R

messaggi HL7struttura

segmento MSH

Monday, October 29, 2012

Page 20: Seminario Daniela Ghironi, 25-10-2012

Messaggio HL7 generato dal modulo LB per la ricerca esami del paziente 123456:

QPD|SLI^Specimen Labeling Instructions^IHE_LABTF|0001|123456RCP|I||R

messaggi HL7struttura

segmento QPD

MSH|^~\&|LB|Modulo LB|LIP|Reparto A|201210251630||QBP^SLI^QBP_Q11|001|P|2.5

Monday, October 29, 2012

Page 21: Seminario Daniela Ghironi, 25-10-2012

Messaggio HL7 generato dal modulo LB per la ricerca esami del paziente 123456:

RCP|I||R

messaggi HL7struttura

ogni segmento è composto da campi*

MSH|^~\&|LB|Modulo LB|LIP|Reparto A|201210251630||QBP^SLI^QBP_Q11|001|P|2.5QPD|SLI^Specimen Labeling Instructions^IHE_LABTF|0001|123456

* il separatore è con!gurabile e de!nito nel segmento MSH - di default è il carattere pipe “|”

Monday, October 29, 2012

Page 22: Seminario Daniela Ghironi, 25-10-2012

Messaggio HL7 generato dal modulo LB per la ricerca esami del paziente 123456:

RCP|I||R

messaggi HL7struttura

campo MSH.9de!nisce il tipo di messaggio

MSH|^~\&|LB|Modulo LB|LIP|Reparto A|201210251630||QBP^SLI^QBP_Q11|001|P|2.5QPD|SLI^Specimen Labeling Instructions^IHE_LABTF|0001|123456

Monday, October 29, 2012

Page 23: Seminario Daniela Ghironi, 25-10-2012

Messaggio HL7 generato dal modulo LB per la ricerca esami del paziente 123456:

RCP|I||R

messaggi HL7struttura

campo QPD.3parametro di ricerca (id paziente)

QPD|SLI^Specimen Labeling Instructions^IHE_LABTF|0001|123456MSH|^~\&|LB|Modulo LB|LIP|Reparto A|201210251630||QBP^SLI^QBP_Q11|001|P|2.5

Monday, October 29, 2012

Page 24: Seminario Daniela Ghironi, 25-10-2012

Messaggio HL7 generato dal modulo LB per la ricerca esami del paziente 123456:

RCP|I||R

messaggi HL7struttura

QPD|SLI^Specimen Labeling Instructions^IHE_LABTF|0001|123456MSH|^~\&|LB|Modulo LB|LIP|Reparto A|201210251630||QBP^SLI^QBP_Q11|001|P|2.5

in Python con hl7apy:

messaggio = Message(‘QBP_Q11’, version=‘2.5’)messaggio.MSH.MSH_6 = ‘Reparto A’messaggio.QPD.QPD_3 = ‘123456’

Monday, October 29, 2012

Page 25: Seminario Daniela Ghironi, 25-10-2012

scelte implementative

• quale linguaggio di programmazione?Python

• come creare e gestire messaggi HL7? hl7apy

• come inviare il messaggio da LB al LIP?

Monday, October 29, 2012

Page 26: Seminario Daniela Ghironi, 25-10-2012

scelte implementative

come inviare il messaggio da LB al LIP?

i messaggi HL7 devono esser scambiati via LAN, per cui:

• LIP deve accettare connessioni in ingresso (server)• LB deve stabilire una connessione con il LIP (client)

deve essere implementato il protocollo MLLP

Monday, October 29, 2012

Page 27: Seminario Daniela Ghironi, 25-10-2012

Minimal Lower Layer ProtocolMLLP

• protocollo standard per lo scambio di messaggi HL7 via TCP/IP

• aggiunge caratteri di controllo per poter identi!care inizio e !ne di un messaggio

Start\x0b

End\x1c\x0d

MessageMSH|^~\&|LB|Modulo LB|LIP|...

Monday, October 29, 2012

Page 28: Seminario Daniela Ghironi, 25-10-2012

LIP

server TCP in grado di ricevere messaggi HL7 codi!cati secondo il protocollo MLLP

il LIP deve:

1. accettare connessioni TCP;

2. veri!care il contenuto del messaggio ricevuto:deve essere di tipo QBP^SLI^QBP_Q11;

3. rispondere con un messaggio RSP^SLI^RSP_K11.

moduloLB

moduloLIP

QBP^SLI^QBP_Q11

RSP^SLI^RSP_K11

messaggi HL7

Monday, October 29, 2012

Page 29: Seminario Daniela Ghironi, 25-10-2012

LB

client TCP in grado di trasmettere messaggi HL7 codi!cati secondo il protocollo MLLP

LB deve:

1. stabilire una connessione TCP;

2. inviare un messaggio QBP^SLI^QBP_Q11 codi!cato secondo MLLP;

3. veri!care il messaggio di risposta: deve essere di tipo RSP^SLI^RSP_K11.

moduloLB

moduloLIP

QBP^SLI^QBP_Q11

RSP^SLI^RSP_K11

messaggi HL7

Monday, October 29, 2012

Page 30: Seminario Daniela Ghironi, 25-10-2012

come inviare il messaggio da LB al LIP?

esistono svariate librerie Python per implementare protocolli di rete e server TCP, anche nella libreria standard;

nel nostro caso, utilizzeremo una delle più complete:

Twisted

scelte implementative

Monday, October 29, 2012

Page 31: Seminario Daniela Ghironi, 25-10-2012

• framework Python per sviluppare applicazioni di rete

• programmazione orientata agli eventi

• supporta numerosi protocolli (es. HTTP, XMLRPC, SMTP, etc.) e standard (es TCP, UDP, SSL, ...)

• permette lo sviluppo rapido di protocolli e moduli di integrazione

• opensource - licenza MIT

Twistedhttp://twistedmatrix.com/

Monday, October 29, 2012

Page 32: Seminario Daniela Ghironi, 25-10-2012

• paradigma di programmazione

• tipica della programmazione di interfacce gra!che

• a differenza della programmazione imperativa, il "usso di esecuzione non è predeterminato, ma dipende dal veri!carsi di una successione di eventi che non è conosciuta a priori

• il programmatore de!nisce solo il codice da eseguire al veri!carsi di un dato evento

programmazione ad eventi

Monday, October 29, 2012

Page 33: Seminario Daniela Ghironi, 25-10-2012

programmazione ad eventiesempio GUI

termineesecuzione

avvioChrome

pressionepulsante

attesaeventi

Monday, October 29, 2012

Page 34: Seminario Daniela Ghironi, 25-10-2012

Twisted è un framework asincrono orientato agli eventi, il che signi!ca che:

• l’applicazione rimane in esecuzione in attesa di eventi da processare;• solo al veri!carsi di un evento, vengono eseguite le istruzioni associate all’evento stesso;

nel nostro caso, una connessione TCP in ingresso è un nuovo evento, e dovremmo:

1. veri!care che il messaggio in ingresso sia un messaggio HL7 di tipo QBP^SLI^QBP_Q11;2. eseguire la ricerca e restituire un messaggio HL7 di tipo RSP^SLI^RSP_K11

programmazione ad eventi

termineesecuzione

avvioLIP

nuovo messaggio

reactorloop

Monday, October 29, 2012

Page 35: Seminario Daniela Ghironi, 25-10-2012

server LIP

class LIP(Factory): protocol = MLLP

class MLLP(LineReceiver): delimiter = "\x1c\x0d"

def lineReceived(self, content): message = Message.from_string(content) if message.type == "QBP_Q11": [... esegue la ricerca nel database ...] response = Message("RSP_K11") [... popola il messaggio RSP_K11...] content = "\x0b" + response.to_string() self.sendLine(content)

reactor.listenTCP(8888, LIP())reactor.run()

Monday, October 29, 2012

Page 36: Seminario Daniela Ghironi, 25-10-2012

LBclass LB(object): def lab62(self, ssn): client = ClientCreator(reactor, MLLPClient) protocol = client.connectTCP("LIP_HOST", LIP_PORT) message = Message("QBP_Q11") [... popola il messaggio QBP_Q11 ...] protocol.sendMessage(message)

class MLLPClient(MLLProtocol):

def sendMessage(self, message): message = "\x0b" + message.to_string() self.sendLine(message)

def lineReceived(self, content): message = Message.from_string(content) if message.type == "RSP_K11": [... estrae i dati e stampa le etichette...]

Monday, October 29, 2012

Page 37: Seminario Daniela Ghironi, 25-10-2012

scelte implementative

• quale linguaggio di programmazione?Python

• come creare e gestire messaggi HL7? hl7apy

• come inviare il messaggio da LB al LIP?Twisted

Monday, October 29, 2012

Page 38: Seminario Daniela Ghironi, 25-10-2012

DEMO

Monday, October 29, 2012

Page 39: Seminario Daniela Ghironi, 25-10-2012

qualche curiosità...

Interfaccia webSencha Touch 2

DatabaseDjango

Server webTwisted Django

LBTwisted

LIPTwisted

DjangoORM

MLLP

Push serverTwisted

Autobahn

HTTP

XMLRPC

websocket

noti!ca messaggi

~650 righe di codice, di cui:~400 GUI con Sencha Touch 2 ;~50 modulo LB;~50 modulo LIP;~50 protocollo MLLP;~30 push tramite websockets;~70 script avvio di tutti i servizi (HTTP, XMLRPC, LIP, LB, websockets)

Django www.djangoproject.comTwistedwww.twistedmatrix.comAutobahnautobahn.wsSencha Touch 2www.sencha.com/products/touch

Monday, October 29, 2012


Recommended