Seminario Daniela Ghironi, 25-10-2012
-
Upload
crs4-research-center-in-sardinia -
Category
Technology
-
view
563 -
download
0
description
Transcript of 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
eventoclinico pro!lo IHE
sistemi informativiintegrati
1 2
4progettazione
software
3
CONTESTO CLINICO ANALISI
processo di integrazione
Monday, October 29, 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
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
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
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
• quale linguaggio di programmazione?
• come creare e gestire messaggi HL7?
• come inviare il messaggio da LB al LIP?
scelte implementative
Monday, October 29, 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
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
• "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
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
come creare e gestire messaggi HL7?
scelte implementative
libreria HL7 “from scratch”
libreria HL7 esistente
Monday, October 29, 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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
• 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
• 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
programmazione ad eventiesempio GUI
termineesecuzione
avvioChrome
pressionepulsante
attesaeventi
Monday, October 29, 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
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
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
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
DEMO
Monday, October 29, 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