Seminario Daniela Ghironi, 25-10-2012
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Seminario Daniela Ghironi, 25-10-2012

on

  • 932 views

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 ...

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.

Statistics

Views

Total Views
932
Views on SlideShare
932
Embed Views
0

Actions

Likes
0
Downloads
4
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Seminario Daniela Ghironi, 25-10-2012 Presentation Transcript

  • 1. Standard internazionali e linee guida per il software nel settore della salute Daniela Ghironi - daniela.ghironi@crs4.itMonday, October 29, 2012
  • 2. processo di integrazione 1 2 evento profilo IHE clinico 4 3 sistemi informativi progettazione integrati software CONTESTO CLINICO ANALISIMonday, October 29, 2012
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. scelte implementative come creare e gestire messaggi HL7? libreria HL7 libreria HL7 “from scratch” esistenteMonday, October 29, 2012
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. programmazione ad eventi esempio GUI avvio Chrome attesa pressione eventi pulsante termine esecuzioneMonday, October 29, 2012
  • 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. 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. 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. 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. DEMOMonday, October 29, 2012
  • 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