Standard internazionali e linee guida per il                      software nel settore della salute                       ...
processo di integrazione                    1                                   2                                evento   ...
progettazione                                                                profilo IHE   1. identificazione attori      ...
caso d’uso - lab62   consideriamo il caso più completo, in cui          profilo LBL   affronteremo:                        ...
architettura                           PC operatore                                     modulo                            ...
caso d’uso - lab62  1. Il paziente Mario Rossi arriva nella sala prelievi e  consegna il proprio codice fiscale all’operat...
scelte implementative              • quale linguaggio di programmazione?              • come creare e gestire messaggi HL7...
scelte implementative                quale linguaggio di programmazione?    la scelta dipende da diversi fattori:        •...
Python                           http://python.org    • linguaggio di programmazione ad alto livello    • creato nel 1991 ...
Python                                      punti di forza    • "It was nice to learn Python; a nice afternoon." *    • es...
scelte implementative              • quale linguaggio di programmazione?                                   Python         ...
scelte implementative                   come creare e gestire messaggi HL7?                             libreria HL7   lib...
libreria HL7    per ogni versione dello standard, dovrebbe supportare:    • creazione di messaggi, segmenti, etc.    • sup...
libreria HL7                           Alcune delle librerie opensource più usate:                    Nome            Ling...
libreria HL7                                   Stato dell’arte delle librerie Python                           Nome       ...
hl7apy     libreria Python open source attualmente in sviluppo al CRS4     • standard HL7 2.x     • permette di creare mes...
messaggi HL7                                       esempio   Messaggio HL7 generato dal modulo LB per la ricerca esami del...
messaggi HL7                                             struttura   Messaggio HL7 generato dal modulo LB per la ricerca e...
messaggi HL7                                       struttura   Messaggio HL7 generato dal modulo LB per la ricerca esami d...
messaggi HL7                                       struttura   Messaggio HL7 generato dal modulo LB per la ricerca esami d...
messaggi HL7                                            struttura   Messaggio HL7 generato dal modulo LB per la ricerca es...
messaggi HL7                                      struttura   Messaggio HL7 generato dal modulo LB per la ricerca esami de...
messaggi HL7                                        struttura   Messaggio HL7 generato dal modulo LB per la ricerca esami ...
messaggi HL7                                             struttura   Messaggio HL7 generato dal modulo LB per la ricerca e...
scelte implementative              • quale linguaggio di programmazione?                                   Python         ...
scelte implementative               come inviare il messaggio da LB al LIP?    i messaggi HL7 devono esser scambiati via L...
Minimal Lower Layer Protocol                                             MLLP    • protocollo standard per lo scambio di m...
LIP   server TCP in grado di ricevere messaggi HL7   codificati secondo il protocollo MLLP                                ...
LB   client TCP in grado di trasmettere messaggi HL7   codificati secondo il protocollo MLLP                              ...
scelte implementative               come inviare il messaggio da LB al LIP?    esistono svariate librerie Python per imple...
Twisted                           http://twistedmatrix.com/    • framework Python per sviluppare applicazioni di rete    •...
programmazione ad eventi    • paradigma di programmazione    • tipica della programmazione di interfacce grafiche    • a d...
programmazione ad eventi                            esempio GUI                                            avvio          ...
programmazione ad eventi    Twisted è un framework asincrono orientato    agli eventi, il che significa che:              ...
server LIP    class LIP(Factory):        protocol = MLLP    class MLLP(LineReceiver):        delimiter = "x1cx0d"         ...
LB    class LB(object):        def lab62(self, ssn):            client = ClientCreator(reactor, MLLPClient)            pro...
scelte implementative              • quale linguaggio di programmazione?                                   Python         ...
DEMOMonday, October 29, 2012
qualche curiosità...                                                                    ~650 righe di codice, di cui:     ...
Upcoming SlideShare
Loading in...5
×

Seminario Daniela Ghironi, 25-10-2012

586

Published on

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.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
586
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
7
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "Seminario Daniela Ghironi, 25-10-2012"

  1. 1. Standard internazionali e linee guida per il software nel settore della salute Daniela Ghironi - daniela.ghironi@crs4.itMonday, October 29, 2012
  2. 2. processo di integrazione 1 2 evento profilo IHE clinico 4 3 sistemi informativi progettazione integrati software CONTESTO CLINICO ANALISIMonday, October 29, 2012
  3. 3. progettazione profilo IHE 1. identificazione attori • software già esistente o da implementare/integrare descrive 2. identificazione fonti dati per le transazioni • eventuale integrazione tra le fonti attore 1 3. progettazione moduli software da sviluppare transazioni 4. progettazione sistema di messaggistica per le transazioni attore 2Monday, October 29, 2012
  4. 4. caso d’uso - lab62 consideriamo il caso più completo, in cui profilo LBL affronteremo: descrive • sviluppo dei due moduli software che implementano gli attori LB e LIP LB • supporto messaggi HL7 lab-62 • protocollo di rete per lo scambio dei messaggi LIP HL7 per la transazione lab62Monday, October 29, 2012
  5. 5. architettura PC operatore modulo LB messaggi HL7 * via LAN SERVER modulo legge DATABASE LIS pazienti LIP esami * come previsto dalla transazione LAB-62: QBP^SLI^QBP_Q11 e RSP^SLI^RSP_K11Monday, October 29, 2012
  6. 6. caso d’uso - lab62 1. Il paziente Mario Rossi arriva nella sala prelievi e consegna il proprio codice fiscale all’operatore; modulo 2. L’operatore effettua la ricerca per codice fiscale: LB 1. LB invia un messaggio HL7 con i parametri di QBP^SLI^QBP_Q11 ricerca al LIP 2. LIP risponde con un messaggio HL7 contenente i messaggi HL7 risultati della ricerca RSP^SLI^RSP_K11 3. L’operatore visualizza la lista degli esami per il paziente e vengono stampate le etichette; modulo LIP 4. L’operatore effettua il prelievo.Monday, October 29, 2012
  7. 7. scelte implementative • quale linguaggio di programmazione? • come creare e gestire messaggi HL7? • come inviare il messaggio da LB al LIP?Monday, October 29, 2012
  8. 8. scelte implementative 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 significa che sia l’unica scelta possibile!Monday, October 29, 2012
  9. 9. Python http://python.org • linguaggio di programmazione ad alto livello • creato nel 1991 Guido van Rossum • multi-paradigma (orientato agli oggetti, imperativo, ...) • multi-piattaforma (Linux/Unix, Mac OS X, Windows, ...) • opensourceMonday, October 29, 2012
  10. 10. Python punti di forza • "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, 2012Monday, October 29, 2012
  11. 11. 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
  12. 12. scelte implementative come creare e gestire messaggi HL7? libreria HL7 libreria HL7 “from scratch” esistenteMonday, October 29, 2012
  13. 13. 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 • flessibilità in caso di messaggi/segmenti/campi non conformiMonday, October 29, 2012
  14. 14. libreria HL7 Alcune delle librerie opensource più usate: Nome Linguaggio Licenza Supporta HAPI Java MPL / GPL v3 2.x nhapi .NET MPL 2.x python-hl7 Python BSD 2.xMonday, October 29, 2012
  15. 15. 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 NoMonday, October 29, 2012
  16. 16. hl7apy 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 MITMonday, October 29, 2012
  17. 17. messaggi HL7 esempio 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.5 QPD|SLI^Specimen Labeling Instructions^IHE_LABTF|0001|123456 RCP|I||R modulo LB QBP^SLI^QBP_Q11 modulo LIPMonday, October 29, 2012
  18. 18. messaggi HL7 struttura 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.5 QPD|SLI^Specimen Labeling Instructions^IHE_LABTF|0001|123456 RCP|I||R ogni riga* è un segmento * ad esser precisi, i segmenti sono separati dal carattere CR (carriage return)Monday, October 29, 2012
  19. 19. messaggi HL7 struttura 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.5 QPD|SLI^Specimen Labeling Instructions^IHE_LABTF|0001|123456 RCP|I||R segmento MSHMonday, October 29, 2012
  20. 20. messaggi HL7 struttura 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.5 QPD|SLI^Specimen Labeling Instructions^IHE_LABTF|0001|123456 RCP|I||R segmento QPDMonday, October 29, 2012
  21. 21. messaggi HL7 struttura 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.5 QPD|SLI^Specimen Labeling Instructions^IHE_LABTF|0001|123456 RCP|I||R ogni segmento è composto da campi* * il separatore è configurabile e definito nel segmento MSH - di default è il carattere pipe “|”Monday, October 29, 2012
  22. 22. messaggi HL7 struttura 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.5 QPD|SLI^Specimen Labeling Instructions^IHE_LABTF|0001|123456 RCP|I||R campo MSH.9 definisce il tipo di messaggioMonday, October 29, 2012
  23. 23. messaggi HL7 struttura 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.5 QPD|SLI^Specimen Labeling Instructions^IHE_LABTF|0001|123456 RCP|I||R campo QPD.3 parametro di ricerca (id paziente)Monday, October 29, 2012
  24. 24. messaggi HL7 struttura 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.5 QPD|SLI^Specimen Labeling Instructions^IHE_LABTF|0001|123456 RCP|I||R 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
  25. 25. 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
  26. 26. 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 MLLPMonday, October 29, 2012
  27. 27. Minimal Lower Layer Protocol MLLP • protocollo standard per lo scambio di messaggi HL7 via TCP/IP • aggiunge caratteri di controllo per poter identificare inizio e fine di un messaggio Start Message End x0b MSH|^~&|LB|Modulo LB|LIP|... x1cx0dMonday, October 29, 2012
  28. 28. LIP server TCP in grado di ricevere messaggi HL7 codificati secondo il protocollo MLLP modulo LB il LIP deve: QBP^SLI^QBP_Q11 1. accettare connessioni TCP; messaggi HL7 2. verificare il contenuto del messaggio ricevuto: deve essere di tipo QBP^SLI^QBP_Q11; RSP^SLI^RSP_K11 modulo 3. rispondere con un messaggio LIP RSP^SLI^RSP_K11.Monday, October 29, 2012
  29. 29. LB client TCP in grado di trasmettere messaggi HL7 codificati secondo il protocollo MLLP modulo LB LB deve: QBP^SLI^QBP_Q11 1. stabilire una connessione TCP; messaggi HL7 2. inviare un messaggio QBP^SLI^QBP_Q11 codificato secondo MLLP; RSP^SLI^RSP_K11 modulo 3. verificare il messaggio di risposta: LIP deve essere di tipo RSP^SLI^RSP_K11.Monday, October 29, 2012
  30. 30. scelte implementative 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: TwistedMonday, October 29, 2012
  31. 31. Twisted http://twistedmatrix.com/ • 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 MITMonday, October 29, 2012
  32. 32. programmazione ad eventi • paradigma di programmazione • tipica della programmazione di interfacce grafiche • a differenza della programmazione imperativa, il flusso di esecuzione non è predeterminato, ma dipende dal verificarsi di una successione di eventi che non è conosciuta a priori • il programmatore definisce solo il codice da eseguire al verificarsi di un dato eventoMonday, October 29, 2012
  33. 33. programmazione ad eventi esempio GUI avvio Chrome attesa pressione eventi pulsante termine esecuzioneMonday, October 29, 2012
  34. 34. programmazione ad eventi Twisted è un framework asincrono orientato agli eventi, il che significa che: avvio LIP • l’applicazione rimane in esecuzione in attesa di eventi da processare; • solo al verificarsi di associate all’evento stesso; eseguite le istruzioni un evento, vengono reactor nuovo loop messaggio nel nostro caso, una connessione TCP in ingresso è un nuovo evento, e dovremmo: termine 1. verificare che il messaggio in ingresso sia un esecuzione messaggio HL7 di tipo QBP^SLI^QBP_Q11; 2. eseguire la ricerca e restituire un messaggio HL7 di tipo RSP^SLI^RSP_K11Monday, October 29, 2012
  35. 35. server LIP class LIP(Factory): protocol = MLLP class MLLP(LineReceiver): delimiter = "x1cx0d" 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
  36. 36. LB class 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
  37. 37. scelte implementative • quale linguaggio di programmazione? Python • come creare e gestire messaggi HL7? hl7apy • come inviare il messaggio da LB al LIP? TwistedMonday, October 29, 2012
  38. 38. DEMOMonday, October 29, 2012
  39. 39. qualche curiosità... ~650 righe di codice, di cui: Django ~400 GUI con Sencha Touch 2 ; www.djangoproject.com ~50 modulo LB; Twisted Interfaccia web ~50 modulo LIP; www.twistedmatrix.com ~50 protocollo MLLP; Autobahn Sencha Touch 2 ~30 push tramite websockets; autobahn.ws ~70 script avvio 2 tutti i servizi (HTTP, Sencha Touch di XMLRPC, LIP, LB, websockets) www.sencha.com/products/touch websocket HTTP Push server Server web Database Twisted Twisted Django Autobahn Django Django XMLRPC ORM LB LIP Twisted Twisted notifica messaggi MLLPMonday, October 29, 2012
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×