GridPACS: una soluzione Grid ai sistemi PACS medici
Transcript
GridPACS: una soluzione Grid ai sistemi PACS medici
Università degli Studi di Napoli Federico II Facoltà di Scienze MM.FF.NN. Corso di Laurea in Informatica Tesi Sperimentale di Laurea Triennale GridPACS: una soluzione Grid ai sistemi PACS medici Relatori Candidato Prof. Guido Russo Daniele Dell’Erba Prof. Giovanni Mettivier Matricola: 566/2748 Anno accademico 2009/2010 Daniele Dell’Erba 566/2748 Pagina 2 Indice generale 1. 2. 2.1 2.2 2.3 2.4 2.5 2.6 2.7 3. 3.1 3.2 3.3 3.4 4. 4.1 4.2 4.3 4.4 4.5 4.5 4.7 4.8 5. 5.1 5.2 5.3 5.4 6. 6.1 6.2 6.3 7. 7.1 7.2 7.3 8. 8.1 8.2 8.3 8.4 8.5 8.6 8.7 9. 9.1 9.2 Introduzione Il formato DICOM La nascita La struttura Il modello La comunicazione Le funzionalità Le immagini L’identificativo PACS Introduzione Architettura Problematiche Prospettive La Grid Storia Organizzazione Sicurezza Architettura Middleware Archivi Immagazzinamento Progetti Medici AMGA Panoramica Affidabilità Interfaccia Sicurezza GRID INFN Architettura utilizzata Protocolli Struttura Progetto GridPACS Applicazione Web Specifiche Funzionamento Guida d’uso Tipologie utenti Registrazione Accesso al sistema Invio di un file DICOM Ricerca e download Condivisione postazioni Gestione errori Sviluppi futuri Sicurezza Gestione Immagini Daniele Dell’Erba 566/2748 5 8 8 10 15 16 17 18 19 20 20 20 23 25 28 28 30 30 31 31 32 33 34 38 38 38 39 39 41 41 42 43 45 45 45 45 48 48 50 50 54 56 60 61 62 62 62 Pagina 3 9.3 9.4 9.5 9.6 9.7 10. 11. 11.1 11.2 12. Client Database Accessibilità e Fault Tollerance Funzionalità Grid Storage e Computing Conclusioni Appendice Installazione e Configurazione Codice Bibliografia Daniele Dell’Erba 566/2748 63 63 64 65 65 66 68 68 72 103 Pagina 4 1 Introduzione Il mondo dell’Information Technology legato al “medical imaging” è cambiato enormemente nell’ultima decade. Il passaggio dall’acquisizione di immagini analogiche a digitali è in pieno svolgimento ed in tecniche come la CT e MRI è ormai completo mentre la digital radiography (CR, DR) sta sempre più soppiantando, nelle nuove installazioni ospedaliere, la radiografia film-schermo. Ciò sta comportando la necessità della gestione e dell’archiviazione di questi dati. Un grande ospedale, con ad es. 1500-2000 posti letto, produce dati di imaging medico che possono occupare 5-10 TB l’anno ed è stimato che con il sempre maggior uso di sistemi digitali questo valore aumenterà fortemente. A questo si deve aggiungere la necessità di mantenere e rendere accessibili i dati storici di archivio, in aggiunta a quelli correnti, sia per l’interpretazione clinica sia per legge per almeno 5 anni ed in alcuni casi anche per 21 anni. Per rispondere a questa esigenza sono nati i PACS (Picture Archiving and Communication System). I sistemi PACS attualmente in commercio sono sistemi informativi complessi che offrono, tramite una struttura hardware e software opportunamente realizzata, la possibilità di molteplici funzioni in ambito ospedaliero, riguardanti tutta la catena di trattamento delle immagini, partendo dalla loro acquisizione nelle diverse diagnostiche (CT, NMR, PET/SPECT, US, etc.), passando poi alla ricostruzione ed elaborazione, quindi alla visualizzazione e refertazione, ed infine all’archiviazione e alla ricerca di dati clinici dei pazienti. Ma anche quest’ultimi presentano problemi legati alla scarsa scalabilità ed inoltre essi sono legati al sito in cui sono installati. Questo comporta spesso l’inutile replicazione dei dati su diversi siti ed una scarsa circolazione/visibilità delle informazioni. La strategia che si sta affermando (ad es. in Gran Bretagna, e ora anche in Daniele Dell’Erba 566/2748 Pagina 5 alcune regioni italiane) è quella dell’impiego di archivi centrali/regionali che sono usati come hub accessibili da facilities remote. Una possibile soluzione potrebbe essere rappresentata dall’impiego della tecnologia GRID. La tecnologia GRID, costituita da un livello intermedio (middleware) tra l’applicazione software e l’hardware, ha la caratteristica di svincolare e rendere completamente indipendenti il livello inferiore (l’hardware) da quello superiore (l’applicativo). Ciò comporta che qualunque operazione (come ad esempio il backup o l’aggiornamento degli archivi), o anche eventuali malfunzionamenti su uno dei due livelli, non ricada sull’altro. L’innovazione GRID si basa su una diversa organizzazione dell’hardware già esistente, che fornisce all’utente una grossa potenzialità di calcolo e di storage, ma rimanendo allo stesso tempo semplice da gestire. L’implementazione di questa struttura permetterebbe la realizzazione di una griglia tra diverse organizzazioni ospedaliere ed in particolare i vantaggi dell’implementazione GRID come supporto di un PACS sono: • Integrare le funzionalità del PACS nella gestione degli archivi; • Condivisione di dati distribuiti (database di immagini, dati clinici dei pazienti, dati amministrativi, etc); • in caso di rottura di una macchina è possibile l’accesso al sistema senza interruzione di nessuna funzionalità; • accesso al PACS da tutte le workstations appartenenti alla griglia; • interventi di manutenzione senza interruzione dei servizi; • backup automatico; • struttura gerarchica per l’interrogazione di archivi di diversi PACS. • Ridondanza e disponibilità dei dati: copie multiple dei dati esistono tra diversi nodi nella griglia, creando una ridondanza e utilizzazione in caso di fallimento di un componente. Daniele Dell’Erba 566/2748 Pagina 6 La realizzazione di tale innovativa struttura GRID-PACS integrata pone diverse problematiche di tipo tecnologico. Il Gruppo di Fisica Medica del Dipartimento di Scienze Fisiche dell’Università di Napoli Federico II e della Sezione INFN di Napoli è impegnato, anche con un supporto della commissione GRID dell’INFN, nella realizzazione di una GRID di test per valutare la fattibilità di una architettura di GRID storage. La GRID in fase di realizzazione, inserita nella struttura GRID più generale dell’ INFN, prevede per il momento la realizzazione di quattro nodi: la Sezione INFN di Napoli, l’Istituto di Bioimmagini e Biostrutture del CNR di Napoli, l’azienda Ospedaliera Brotzu e la Sezione INFN di Bologna che raccoglierà i dati dell’azienda ospedaliera S. Orsola Malpighi di Bologna . L’attività di GRID-PACS, prevista nell’attuale piano triennale all’interno delle attività di trasferimento tecnologico, potrebbe proseguire su più vasta scala nell’ambito di progetti di imaging all’interno di progetti regionali e/o nazionali. Daniele Dell’Erba 566/2748 Pagina 7 2 Il formato DICOM Il formato DICOM (file *.dcm) è il formato standard dei file contenenti le immagini digitali generate dai dispositivi medicali. Oltre alle immagini, in questa tipologia di file vengono memorizzati anche dei metadati che contengono informazioni sul paziente, sul tipo di studio e sulla procedura di cui è frutto l'immagine stessa. 2.1 La nascita Negli anni '70 con la diffusione dei computer in ambito medico e con l'introduzione della Computed Tomography, (CT) nasce il bisogno di gestire le immagini mediche in formato digitale. Inizialmente questo compito fu affidato alle aziende produttrici degli stessi dispositivi medicali, che provvedevano a creare dei propri standard per la memorizzazione delle immagini e dei dati ad esse correlati, stabilendo dei propri protocolli di comunicazione fra dispositivi, propri formati dei file e politiche di gestione degli archivi. Questo portò inevitabilmente ad una diffusa incompatibilità tra i diversi formati dei file ed i sistemi di gestione, anche all'interno di uno stesso ospedale utilizzante dispositivi medicali forniti da aziende differenti. Al fine di ovviare a questo problema l’American College of Radiology (ACR) (fig.2.1)[1] e la National Electrical Manifacturers Association (NEMA) (fig.2.2) [2] formarono nel 1983 una commissione impegnata a promuovere la compatibilità dei formati dei file riguardanti immagini mediche e dei dati ad esse collegate indipendentemente dai dispositivi che generavano le immagini. Questo anche allo scopo di facilitare lo sviluppo e l'espansione di sistemi Picture Archiving and Communication System (PACS). Daniele Dell’Erba 566/2748 Pagina 8 Fig. 2.1: Logo American College of Radiology Fig. 2.2: Logo National Electrical Manifacturers Association Fig. 2.3: Logo Digital Imagind and Communications in medicine Da questo sforzo nacque lo standard denominato Digital Imaging and Communication in Medicine (DICOM) (Fig. 2.3) [3]. La prima versione di questo standard non commerciale (DICOM 1.0) forniva le specifiche per la memorizzazione delle immagini mediche, dei dati relativi al paziente e dello studio. La seconda versione del 1988 (DICOM 2.0), fu arricchita da protocolli di rete per instaurare connessioni di tipo punto a punto, con lo scopo di permettere ai dispositivi che generano le immagini di trasmetterle ad altri apparecchi. Oggi il formato DICOM, accettato a livello mondiale, subisce annualmente migliorie, pur mantenendo il nominativo dell’ultima versione (DICOM 3.0 del 1993). Esso è riconosciuto e diffuso in Giappone grazie alla Japan Industries Association of Radiological Systems (JIRA) [4] ed in Europa tramite la European Commitlee for Standardization (CEN) [5]. Daniele Dell’Erba 566/2748 Pagina 9 2.2 La struttura Un file DICOM, come definito dallo standard DICOM 3.0, è formato da un header in cui sono riportati i metadati secondo una scrittura codificata in formato ASCII e dalle immagini a seconda del tipo di studio in formato jpeg. L’header di un file DICOM è riconoscibile dalla scrittura dei caratteri “DICM” dal 128° byte fino al 131° byte. Dal 132° carattere comincia la codifica dei dati veri e propri. La codifica utilizzata dai file DICOM è di tipo little endian, in base al quale un valore numerico è interpretato da destra a sinistra ponendo quindi la parte più significativa a destra e la meno significativa a sinistra ( l'opposto della normale lettura di un numero). I dati contenuti sono organizzati in gruppi di dati chiamati DataSet (fig. 2.4), ogni elemento dell'insieme è chiamato DataElement ed è identificato univocamente da un valore chiamato tag disposto in ordine crescente all'interno dell'insieme. DataSet DataElem. Tag DataElem. VR VL DataElem. .... ValueField Fig. 2.4: Rappresentazione di un elemento in un file DICOM Daniele Dell’Erba 566/2748 Pagina 10 Il tag è composto da due identificativi (es. 0008, 0122): uno per il gruppo (es. anagrafica paziente) e uno specifico dell’elemento all’interno del gruppo (es. il nome del paziente, data di nascita, …). Oltre al tag ogni DataElement è composto da un campo denominato Value Rappresentation (VR) che indica il tipo di dato contenuto ed è presente o meno in base alla sintassi di trasferimento (tab 2.1); dal value length (VL) che indica la dimensione del DataElement e varia in base al tipo di dato indicato in VR. Se il campo tipo (VR) indica “SQ” (sequece of items) o “UN” (unknown), il campo VL contiene la stringa FFFFFFFFH che indica una lunghezza indefinita; infine il campo value field (VF) che contiene i dati relativi a quell’elemento. Daniele Dell’Erba 566/2748 Pagina 11 Tab. 2.1 : Tabella dei tipi di VR La sintassi di trasferimento è una regola del protocollo di rete che si applica all’atto della trasmissione del file, definisce il tipo di codifica dei dati e la loro organizzazione. La grandezza dei campi di ogni DataElement è definita dal tipo di sintassi. In particolare se la sintassi è di tipo explicit (fig 2.5) e il tipo indicato in VR è OB, OW, OF, SQ, UT o UN, si hanno 4byte per il tag di cui 2byte per il gruppo e 2byte l’elemento, 4byte per il VR di cui 2byte per il valore e 2byte fissi al valore 0000H, Daniele Dell’Erba 566/2748 Pagina 12 4byte per il VL, il VF è tanti byte quanti definiti dal VL. E’ possibile che VL sia indefinito, cioè che contenga il valore FFFFFFFFH, in tal caso il VF ha grandezza indefinita. Fig. 2.5: DataElement con VR esplicito e implicito Per tutti gli altri valori di VR con la sintassi explicit si hanno 4byte per il tag di cui 2byte per il gruppo e 2byte l’elemento, 2 byte per il VR, 2byte per il VL, il value field è tanti byte quanti definiti dal VL. Infine se la sintassi è di tipo implicit si hanno 4byte per il tag di cui 2byte per il gruppo e 2byte l’elemento, 4byte per il VL, il VF è tanti byte quanti definiti dal VL. Anche in questo caso è possibile che VL sia indefinito e di conseguenza anche il VF. Ogni file DICOM è relativo ad un unico paziente e ad un'unica tipologia di studio/esame, ma può esser costituito da più immagini, come nel caso di studi TAC. I file con più immagini hanno una struttura particolare caratterizzata dalla presenza di Daniele Dell’Erba 566/2748 Pagina 13 un elemento di tipo SQ al posto dell’elemento di tipo immagine. Questo campo può contenere altri elementi al suo interno, separati fra loro da tag di delimitazione. Anche in questo caso si possono avere diverse strutture in base al tipo implicito o esplicito. Se il campo tipo è explicit (tab .2.2), la lunghezza è indefinita ed il campo dati contiene una sequenza di oggetti ognuno dei quali ha come tag (FFFE,E000), seguito dalla propria dimensione, in coda agli oggetti per delimitarne la fine viene inserito un elemento di delimitazione vuoto, che ha tag (FFFE,E0DD) e lunghezza 00000000H. Se il campo tipo è implicit si distingue il caso in cui l’elemento contenitore conosce la grandezza degli elementi contenuti o meno. Se non la conosce (tab 2.3) ha come valore lunghezza indefinito FFFFFFFH, il campo dati contiene la sequenza di oggetti, con tag (FFFE,E000) seguito dalla dimensione dell'oggetto che può essere indefinita o meno, nel primo caso dopo il contenuto dell'elemento viene inserito un tag di delimitazione (FFFE,E00D) di lunghezza 00000000H con un altro elemento di delimitazione di fine sequenza, nel secondo caso l'elemento ha una struttura normale. Quindi anche gli elementi contenuti a loro volta possono avere una dimensione esplicita o meno. Nel caso in cui il campo lunghezza dell’elemento contenitore è indicata (tab 2.4), così come quella di tutti gli elementi contenuti, pertanto non c’è bisogno di avere un elemento di fine sequenza. Data Element Tag (gggg, eeee) with VR of SQ 4 bytes Value Representation SQ 2 bytes 0000H Reserved 2 bytes Data Element Length Data Element Value FFFF FFFFH un-defined length First Item 4 bytes Second Item Sequence Delimitation Item Item Tag Item Length Item Value Item Tag Item Length Item Value (FFFE, E000) 98A5 2C68H Data Set (FFFE, E000) B321 762CH Data Set 4 bytes 4 bytes 98A5 2C68H bytes 4 bytes 4 bytes B321 762CH bytes Seq. Delim. Tag (FFFE, E0DD) Item Length 4 bytes 4 bytes 0000 0000H Tab. 2.2: Esempio di DataElement con VR esplicito impostato a Sequence of Items di grandezza indefinita, di cui due con esplicita dimensione Daniele Dell’Erba 566/2748 Pagina 14 Data Element Tag Data Element Length Data Element Value First Item (gggg, eeee) with VR of SQ 4 bytes Sequence Delimitation Item Second Item FFFF FFFFH un-defined length Item Tag Item Length Item Value Item Tag Item Length Item Value (FFFE, E000 0000 17B6H Data Set (FFFE, E000) FFFF FFFFH undefined length Data Set 4 bytes 4 bytes 4 bytes 17B6H bytes 4 bytes 4 bytes undefined length Item Delim. Tag (FFFE, E00D) Length Item Length 0000 0000H Seq. Delim. Tag (FFFE, E0DD) 4 bytes 4 bytes 4 bytes 4 bytes 0000 0000H Tab. 2.3: Esempio di DataElement con VR implicito impostato a Sequence of Items di grandezza indefinita, di cui uno con esplicita dimensione, l’altro indefinita Data Element Tag Data Element Length (gggg, eeee) with VR of SQ 00000F00 H Data Element Value First Item Second Item Third Item Item Tag Item Length Item Value Item Tag Item Length Item Value Item Tag Item Length (FFFE, E000) 0000 04F8H Data Set (FFFE, E000) 0000 04F8H Data Set (FFFE, E000) 0000 04F8H 4 bytes 4 bytes 04F8H bytes 4 bytes 4 bytes 04F8H bytes 4 bytes 4 bytes Item Value Data Set 4 bytes 4 bytes 04F8H bytes Tab. 2.4: Esempio di DataElement con VR implicito impostato a Sequence of Items, di cui uno tre con esplicita dimensione 2.3 Il modello Come già è stato detto nel paragrafo precedente, all’interno dello standard DICOM le informazioni hanno una struttura ben definita. Gli oggetti o Information Object Definition (IOD) sono suddivisi in base all'attinenza (es. paziente, immagine, studio, …), e sono organizzati come delle classi, cioè con definizioni di tipi di dati e con attributi (fig 2.6). A ciascuno di questi oggetti sono associate delle operazioni dette Dicom Message Service Element service group (DIMSE service group). Quindi ogni oggetto in base al suo contenuto ed alla sua natura ha delle operazioni associate che si Daniele Dell’Erba 566/2748 Pagina 15 possono compiere. La coppia IOD-DIMSE service group è detta Service Object Pair (SOP). La SOP è specifica per ogni IOD, cioè per il tipo di oggetto e l'insieme di tutte le SOP di un oggetto forma una SOP class. Le SOP con compiti simili costituiscono le service class. Poiché le SOP sono specifiche per gli IOD, differenti oggetti pur richiedendo operazioni identiche, avranno due SOP differenti, che però faranno parte della stessa service class. 2.4 La comunicazione Nello standard DICOM sono fissati anche i protocolli per lo scambio di file dicom tra due diverse strumentazioni o tra la strumentazione ed una postazione di storage. Ogni elemento (apparato medicale, postazione di refertazione, storage element,..) è identificato da un codice denominato DICOM Application Entity (AE). Nella fase di trasmissione di un dato tra due AE si applica l'architettura client/server. Dei due DICOM AE chi trasmette deve svolgere il ruolo di server utilizzando la Service Class Provider (SCP), mentre chi riceve si comporta come un client ed utilizza la Service Class User (SCU). Il DICOM ha una serie di servizi primitivi con compiti di rete di request, indication, response, confirmation, con funzionamento sincrono o asincrono. Le regole di comunicazione sono analoghe a quelle utilizzate dai protocolli più diffusi. Daniele Dell’Erba 566/2748 Pagina 16 Service Classes - Study Mgt - Patient Image Mgt - Results Mgt - Storage - Print - Query/Retrieve Information Objects Normalized - Patient - Study - Visit Composite - CT image - MR image - CR image DICOM Message Service (DIMSE) Fig. 2.6: Relazioni del paradigma a oggetti nel formato DICOM 2.5 Le funzionalità Sono le service class a definire cosa si può fare con lo standard DICOM. Le principali sono: verification, storage, query/retriere, print. La verification (conferma) si occupa di controllare il livello di comunicazione tra peer DICOM AE che hanno stabilito un’associazione. Per effettuare una verifica, un AE invia la primitiva di richiesta ECHO, aspettando la ECHO di risposta. E’ poi la SCU a determinare se la verifica è completa. La storage (memoria) permette ad un AE di inviare istanze di IOD tramite il servizio DIMSE STORE. Affinché l’immagazzinamento sia completo il tipo di dato trasferito deve essere supportato. Il dato deve esser salvato e deve essere accessibile. Siccome i tipi di dati sono di diverso tipo la storage service class ha numerose SOP. La query/retrieve consente a un AE di inviare una richiesta di dati o di Daniele Dell’Erba 566/2748 Pagina 17 recuperarne su richiesta. Utilizza query non complesse, poiché non necessita di un meccanismo completo come quello di SQL. Ha opzioni come unique (valore univoco) o required (valore obbligatorio) applicabili agli attributi. Le DIMSE utilizzate sono GET, FIND e MOVE. Con la FIND, la SCU invia una richiesta relativa a qualche attributo, la SCP invia una risposta per ogni occorrenza trovata, specificando se il processo di ricerca è terminato o meno (pending status). La MOVE coopera con la STORE per recuperare i dati. E’ possibile che i due servizi siano rappresentati da applicazioni differenti o che risiedano su macchine diverse. Una MOVE può comportare molteplici STORE e le STORE con il meccanismo del pending status indicano alla MOVE che le ha generate se l’operazione è collettivamente conclusa o meno. La GET ha lo stesso funzionamento della MOVE ma non può operare su sistemi operativi diversi, può invocare operazioni di STORE su un solo computer. La print management consente ad un dispositivo di inviare in stampa immagini e i dati medici associati anche su più stampanti in serie. Nel processo di stampa si recuperano tutte le informazioni relative alle immagini necessarie per riprodurle (e quindi stamparle). Le immagini vengono messe in un pacchetto detto film session che costituisce l’unità atomica per i processi di stampa. Sono possibili trasformazioni spaziali e in scala di grigi da applicare alle immagini (modalità LUT, VOI-LUT, inversione polarità, presentazione LUT). 2.6 Le immagini Lo standard DICOM supporta vari livelli di compressione delle immagini JPEG (LS, 2000) oltre a supportare formati video come MPEG2 memorizzati tramite frame (MP@ML, MP@HL). Ciò significa che è in grado di immagazzinare video e immagini dei formati corrispondenti. Esistono numerosi software, che senza estrarre i metadati contenuti nei DICOM, sono capaci di estrarne le immagini in quanto esse sono puramente incapsulate all'interno del file rispettando la codifica originale. Ovviamente Daniele Dell’Erba 566/2748 Pagina 18 nessuno di questi programmi può dire cosa le immagini rappresentano o a chi si riferiscono, non potendo leggere i metadati associati ad esse. 2.7 L’identificativo Il formato DICOM garantisce l'univocità dei file. In base alla normativa ISO 9834-3 ogni file ha un identificativo detto UID composto da due parti, la prima è legata all'ente che genera il file mentre la seconda funge da suffisso incrementale all'interno dell'ente stesso per contraddistinguere file immessi dalla stessa organizzazione. Ogni ente è registrato presso l’ISO e pertanto ha assegnato un identificativo univoco. Daniele Dell’Erba 566/2748 Pagina 19 3 PACS 3.1 Introduzione L’introduzione delle tecnologie digitali comporta numerosi vantaggi rispetto ai metodi tradizionali come l’uso di carta stampata e di pellicole fotografiche nelle operazioni tipiche di un reparto medico ed in particolare di radiologia. Esempi sono la facilità di analisi e di manipolazione delle immagini digitali ai fini diagnostici, la riduzione dei costi e dei tempi delle operazioni, la facilità di trasporto e comunicazione dei dati. Un reparto di radiologia digitalizzato è costituito da due componenti: un sistema informatico (Radiology Information System, RIS) e un sistema di gestione di immagini digitali. Il RIS, che opera nell’ambito del reparto, è un sotto sistema del Hospital Information System (HIS) che gestisce tutti i dati relativi ad un paziente nell’intero ospedale. Il secondo sistema è detto Picture Archiving and Communication System (PACS) e gestisce l’acquisizione, l’archiviazione, la trasmissione, l’elaborazione e la visualizzazione delle immagini mediche. 3.2 Architettura Il PACS nel più semplice dei casi può essere composto da un dispositivo di digitalizzazione immagini, una workstation di visualizzazione e un piccolo database di archivio. Nei casi più complessi, le fonti di dati possono essere moltissime: tutti gli apparecchi di radiografia, mammografia, tomografia (CT); di medicina nucleare (PET); di ultrasuoni (US), di risonanze magnetiche (RM) (fig 3.1). Inoltre, le apparecchiature di tipo tomografico generano, sequenze di immagini che possono essere virtualmente sovrapposte per fornire immagini 3D del paziente. Inoltre Daniele Dell’Erba 566/2748 Pagina 20 immagazzinare un’immagine è di per sé inutile, è necessario sapere cosa quell’immagine rappresenta, come è stata prodotta e a quale soggetto si riferisce. Questi metadati di un immagine medica sono contenuti con l’immagine stessa all’interno di un file di formato DICOM. Scanner TIFF,BMP,.. Modality Acquisizione Capture Scanning Image Server Stampanti Query Consultazione Visualizzazione Stampa Fig. 3.1: Esempio di architettura in un sistema PACS Gli utenti di un sistema PACS possono essere principalmente di due tipi, i radiologi (refertazione) ed i medici (consultazione). In fase di visualizzazione per le diagnosi i radiologi utilizzano delle workstation ad alte prestazioni grafiche per supportare elevate risoluzioni, con molta memoria per poter analizzare più immagini contemporaneamente e con un’adeguata potenza di calcolo per elaborare le ricostruzioni 3D. I medici invece possono accedere Daniele Dell’Erba 566/2748 Pagina 21 direttamente all’archivio dal proprio computer personale tramite delle workstation server se connessi al sistema PACS, altrimenti tramite un interfaccia web accessibile con connessioni SSL o VPN. Programmi come K-PACS simulano l’archivio PACS sul pc del medico, scaricando localmente le immagini di interesse e offrendo strumenti di analisi e di misurazione per lo studio dei dati (fig 3.2). Fig. 3.2: Esempio schermata K-PACS Per i costi di esercizio, la gestione delle immagini mediche tramite l’ausilio di un sistema PACS è più economico dell’usuale gestione cartacea e su pellicola. Come costo di avvio, di finanziamento iniziale, è economicamente conveniente se il numero di casi per anno supera i 50000, dovendo ammortizzare le spese di acquisto delle macchine. Le operazioni di diagnosi, analisi e trasporto dei dati risultano accelerate, il sistema è robusto e i medici lo accettano integrandolo nelle loro attività giornaliere. Daniele Dell’Erba 566/2748 Pagina 22 3.3 Problematiche Malgrado tante qualità ci sono delle complicazioni che rendono il funzionamento dei PACS “delicato” e ultimamente sempre più faticoso con previsioni future di stallo. I grandi ospedali generano una quantità immensa di dati (fig 3.3-3.4), basti pensare che una singola immagine può richiedere 20Mb e che gli apparati tomografici generano sequenze di immagini. I flussi di dati sono quindi notevoli e solo grazie ad architetture studiate e con adeguati cablaggi è possibile trasmettere i dati senza latenza. Ma arrivati a destinazione, negli archivi, si crea un problema di spazio. Attualmente la stima è di 6mesi di permanenza dei dati nell’archivio PACS di un ospedale, dopo questo tempo i dati devono essere trasferiti per liberare spazio per permettere l’archiviazione di nuovi dati. Le tecniche di backup consistono nel salvataggio dei dati su supporti definitivi come nastri o dvd, automatizzati da strumenti come i jubox. L’operazione è molto lenta, salvare un dato costa un terzo del tempo necessario per la sua acquisizione, cioè per salvare 3 mesi di archivio ci vuole un mese. Stesso procedimento, ma nel verso contrario si ha nel caso di recupero dei dati. Inoltre i dati gestiti dai PACS non sono informazioni qualunque, ma rientrano in una categoria particolare di informazioni, che per la loro natura devono essere protetti da accessi non autorizzati, in quanto contengono dati sensibili e devono risultare sempre reperibili entro un tempo limitato e non possono esser persi. Per tale motivo si deve quindi avere a disposizione un copia di emergenza di tutte le informazioni. Queste criticità comportano vincoli stetti, come l’accesso ai dati possibile sono internamente all’ospedale o se esternamente tramite connessioni sicure come SSL o VPN. Per risolvere i problemi di spazio e di tempo del recupero e del salvataggio dei dati, ultimamente si adotta la tecnica dello “spinning”, cioè copia dei dati non su nastri o dvd, ma su dischi tramite NAS, SAN o DAS, cioè direct o network storage. Si crea una connessione performante fra l’archivio PACS interno all’ospedale e una farm di archiviazione gestita con tecniche di memorizzazione come RAID1 per garantire l’integrità dei dati in casi di rotture e la non interruzione del flusso in fase di Daniele Dell’Erba 566/2748 Pagina 23 sostituzione di dischi rotti. Fig. 3.3: Crescita degli studi CT e delle immagini per studio Fig. 3.4: Crescita degli studi CT e delle immagini per studio Studi effettuati dalla University of Maryland presso la Mayo Clinic Daniele Dell’Erba 566/2748 Pagina 24 3.4 Prospettive Tuttavia le evoluzioni che gli ospedali stanno intraprendendo sono inadeguate agli sviluppi tecnologici offerti dalle innovazioni attuali. Le preoccupazioni sulle capacità evolutive dei PACS si basano sul fatto che il mercato è estremamente ristretto, essendo chiuso ai produttori dei dispositivi medici che generano le immagini e che per primi hanno presentato soluzioni alla gestione dei dati che i loro stessi dispositivi generavano. L’ utilizzo di massa delle tomografie e delle risonanze magnetiche potrebbe estendersi alle ricostruzione a fascio di cono, alle immagini spettrali, l’utilizzo di tali innovazioni verrebbe compromesso dai limiti dei PACS. Fig.3.5: Diagramma di flusso dei dati in un sistema PACS Daniele Dell’Erba 566/2748 Pagina 25 Per dare un futuro a questi sistemi di archiviazione e trasferimento di immagini sono state ipotizzate delle innovazioni. Nel 1965 il cofondatore della Intel, Moore, formulò una previsione della durata di 10 anni sull’incremento della potenza dei computer e sulla capienza della memoria secondaria, dopo 40anni la previsione continua a coincidere con lo sviluppo dei computer che per il 2012 dovrebbero raggiungere i 40 GHz di potenza e 3TB di memoria secondaria. Purtroppo nonostante la previsione ottimistica, l’incremento misurato di dati immessi nei PACS che è proporzionale sia al numero di studi che alla dimensione delle immagini prodotte dagli studi è superiore alla crescita di Moore sui dischi, quindi non solo sarà necessario sostituite dischi con altri più capienti, ma se ne dovranno aggiungere ulteriori se ci si baserà sui dischi come unità di archiviazione. Un’alternativa potrebbero essere le memorie solid-state drive (SSD), unità a stato solido, memorie non volatili che risolverebbero praticamente tutti i problemi che hanno attualmente le farm di dischi. Consumano meno, scaldano meno, sono più affidabili, non hanno vincoli di dimensioni, hanno tempi di lettura e scrittura inferiori non avendo parti meccaniche in movimento e si sta investendo molto su questa tecnologia. Per ora rimane una speranza in quanto ancora non si è raggiunti la stessa capacità di capienza dei dischi, ma soprattutto il costo è proibitivo, anche se con una radicale diffusione potrebbe calare rapidamente. Altra prospettiva è quella di sfruttare il mercato delle aziende che offrono farm di blade server per risolvere i problemi di spazio che nascono dalla necessità di avere molte workstation e molte unità di archivio in un ospedale, esternalizzando i problemi di ingombro, prestazioni, tolleranza ai guasti meccanici e potenza di calcolo, che verrebbero demandate al gestore della farm. Le comunicazioni server-server sono istantanee, gli spazi occupati ridotti del 90%, la frequenza di manutenzioni dovute a guasti meccanici come ventole, alimentatori o parti mobili dei dischi minima, grazie all’architettura dei server blade. Un ulteriore sviluppo sarebbe utile alle applicazioni client, oggi appesantite dai conflitti che si creano con lo stato software costituito dai sistemi operativi, un Daniele Dell’Erba 566/2748 Pagina 26 approccio basato sul web e quindi sugli ambienti standard dei browser contribuirebbe a creare un client “thinner”, se affiancato da tecniche come AJAX che gli permetterebbero di non perdere prestazioni e funzionalità. Infine l’architettura che è attualmente indefinita dovrebbe esser formalmente riorganizzata su un modello Model View Controller (MVC), con un livello di visualizzazione per l’utente, un livello logico con regole, protocolli e flussi, infine un livello dati. Un ultima soluzione è quella di avere una memoria distribuita, poiché risulta ingestibile localmente, sia per la mancanza di competenze nell’ente ospedaliero, che per l’entità della struttura necessaria. Gli approcci possibili sono due, la cloud e la grid computing orientate allo storage, cioè all’immagazzinamento. La prima, agli evidenti pregi associa il difetto della sicurezza e dell’affidabilità, irrisolvibili e basate puramente sulla fiducia dell’azienda che offre il servizio, la seconda invece, più trasparente, è l’alternativa investigata in questa tesi. Daniele Dell’Erba 566/2748 Pagina 27 4 La Grid Per griglia di calcolatori o grid si intende un’organizzazione basata su connessioni di rete che collega computer geograficamente sparsi e potenzialmente eterogenei per condividere le proprie risorse. L’utilità è quella di utilizzare tutte le risorse disponibili quando necessario. I processori passano la quasi totalità del loro tempo in uno stato di inattività o di basso carico di lavoro. In una griglia ogni membro o nodo che ne fa parte cede la parte di tempo libero che ha a chi ne ha bisogno. Così un calcolo lungo che su un solo computer richiederebbe molto tempo e non premetterebbe di fare altre operazioni, può esser risolto rapidamente distribuendolo su più calcolatori che nel frattempo fanno meno operazioni di quante potrebbero farne e che quindi stanno sprecando risorse. Per questo le griglie sono un esempio di calcolo distribuito, che a differenza di quello parallelo ha come priorità non la prestazione, ma l’utilizzo di tutte le risorse e la minimizzazione gli sprechi. La tecnologia GRID dovendo rispondere alla richiesta di avere una grande capienza, senza il diretto interesse di gestire i siti di memorizzazione, alla necessità che i dati siano protetti sia sui dischi che nella fase di trasporto, alla garanzia che in caso di incidenti sia sempre reperibile una copia dei dati, è una candidata ideale alla soluzione del problema della gestione dei PACS. 4.1 Storia Condor è considerato il precursore della GRID, un progetto elaborato dall’Università del Wisconsin nel 1988 con lo scopo di fornire una grande potenza di calcolo per periodi prolungati. Si parla di High Throughtput Computing (HTC) poiché ciò che si deve elaborare è una grande quantità di dati indipendenti. A differenza dell’High Performance Computing, (HPC) che ha come unità di misura le operazioni floating point per secondo, e per la quale sono necessari supercomputer e ambienti di Daniele Dell’Erba 566/2748 Pagina 28 lavoro in parallelo al fine di avere risposte immediate, l’HTC ha come unità di misura le operazioni floating point per mese. L’idea è di usare le macchine quando sono inattive, senza rallentare le operazioni del proprietario, con un’architettura formata da nodi di assegnazione delle risorse e nodi contenenti le parti dei “job”. Il passaggio alla GRID avviene applicando le tecnologie che già da tempo si adottavano con i cluster e le workstation in ambito di calcolo parallelo, ad un insieme, una griglia, di “risorse” non specificatamente dedite alle operazioni della GRID. In Europa l’European Grid Initiative (EGI) è un’iniziativa volta a coordinare le iniziative nazionali dei paesi europei (NationalGI) per rendere possibile lo svolgimento di progetti comunitari. Dal 2006 si succedono vari progetti evolutivi come i tre Enabling Grids for E-sciencE (EGEE), l’EGI design study e l’attuale Integrated Sustainable Pan-European Infrastructure for Researchers in Europe (EGI-InSPIRE) iniziato il primo maggio 2010. L’Italian Grid Infrastructure (IGI) è la parte dell’EGI italiana, vi fanno parte numerose organizzazioni di ricerca come il CNR, l’ENEA, il GARR, l’INAF, l’INFN e molte altre. I progetti mondiali più noti sono il Wordlwide LHC Computing Grid (WLCG), una griglia di calcolatori sparsa su 34 paesi per raccogliere ed elaborare i dati generati dagli esperimenti del Large Hadron Collider (LHC). Il più popolare progetto è il Search for Extraterrestrial Intelligence (SETI@HOME) che ha trovato come infrastruttura di supporto il web e i normali utenti, collegandoli ad una GRID dinamica tramite un programma, con il compito di cercare segni di vita extraterrestre analizzando le onde radio provenienti dallo spazio. La maggior parte dei progetti umanitari sono sviluppati dalla World Community Grid, anch’esso basato non su centri di calcolo ma sulle risorse di normali utenti, ha raggiunto numerosi traguardi in merito a studi sul cancro, sul genoma, sull’AIDS, sulla distrofia muscolare, oltre che sulla ricerca di materiali per produrre energia pulita. Il programma più diffuso per la realizzazione dell’architettura GRID è il Berkley Open Infrastructure for Network Computing (BOINC) impiegato sia nei progetti umanitari che per il SETI. In Europa è diffuso il Lightweight Middleware fog Grid Computing (gLite) sviluppato nell’ambito Daniele Dell’Erba 566/2748 Pagina 29 delle iniziative EGEE. 4.2 Organizzazione All’interno della griglia i PC sono organizzati in Virtual Organizzation (VO) a seconda dei compiti a cui sono dedicati. Gli utenti una volta registrati sulla griglia dall’ente che la gestisce e che ne assicura il funzionamento può richiedere l’accesso ad una o più VO. L’accesso alla VO viene gestito dal manager della VO stessa. Solo dopo il consenso del VO manager l’utente può accedere alle risorse che appartengono alla VO e solo a quelle. Le VO sono la rappresentazione virtuale di insiemi di utenti che condividono le risorse, come i gruppi di lavoro per progetti di ricerca. All’interno di una VO si possono definire permessi sia collettivi che individuali per avere una granularità dei ruoli. 4.3 Sicurezza L’autenticazione avviene tramite certificati X.509, file generati da una Certification Authority (CA), contenenti le credenziali dell’utente. I certificati sono criptati, non si possono modificare e per leggerli bisogna avere una password detta chiave in possesso del proprietario del certificato. Essi sono il mezzo più sicuro di autenticazione e costituiscono una carta d’identità digitale. E’ importante però che i certificati non vengano diffusi liberamente sulla rete, per evitare che nel caso in cui estranei vengano in possesso della chiave dell’utente e possano autenticarsi al suo posto. Per far si che il certificato resti sempre nelle mani del proprietario si utilizzano i proxy, delle credenziali create localmente e temporaneamente, inviate al posto del certificato, che permettono a processi esterni di autenticarsi a nome di un utente. Daniele Dell’Erba 566/2748 Pagina 30 4.4 Architettura I componenti di una griglia sono, l’User Interface (UI), e cioè il punto di accesso per gli utenti alla griglia, il Resource Broker (RB), che gestisce le risorse assegnando i lavori. Il Job Submission Service (JSS), il sistema di sottomissione dei lavori, l’Information Index (II), utile per selezionare le risorse, il Logging and Bookkeeping services (LB), che contiene le informazioni sui lavori sottomessi dagli utenti, ed infine i calcolatori che si differenziano in Computer Elements e Storage Elements (CE e SE), i primi svolgono i lavori o job mentre i secondi contengono i dati sui quali si opera. 4.5 Middleware Siccome la caratteristica delle griglie è quella di collegare risorse eterogenee, è necessario garantire la compatibilità della griglia con i vari sistemi. Il middleware è uno strato software che si interpone fra l’hardware e la griglia, la sua architettura è a clessidra (fig 4.1), cioè un modello a strati con al centro i servizi base e ai due lati la griglia e i servizi di alto livello. L’architettura dei protocolli è a 5 livelli, il primo detto fabric, interfaccia le risorse locali con la griglia, il connectivitiy fornisce i protocolli di comunicazione e autenticazione, il resource ha i protocolli per ottenere informazioni sulla configurazione e sullo stato di una risorsa e per negoziarne l’utilizzo, il collective gestisce un insieme di risorse come le VO, l’application comprende tutte le applicazioni dell’utente che possono interagire con la griglia. Daniele Dell’Erba 566/2748 Pagina 31 Fig. 4.1: Architettura middleware 4.5 Archivi Il grid computing è adottato soprattutto per fini di calcolo, con problematiche legate alla gestione delle code di job, alla loro assegnazione, alla suddivisione dei grossi calcoli. La griglia di GridPACS per come è attualmente implementata è di immagazzinamento, con problematiche differenti. Le tecnologie oggi usate per l’immagazzinamento dei dati senza grid più diffuse sono la Direct e Network Attacched Storage (DAS e NAS) e la Storage Area Network (SAN). La DAS richiede una connessione diretta, non di rete, fra il server che richiede l’accesso ai dati e i dischi stessi, la NAS utilizza macchine di archiviazione con il minimo indispensabile per collegarsi alla rete attraverso la quale possono accedere tutti gli altri computer, la SAN è formata da un insieme di macchine di archiviazione connesse con uno switch che con collegamenti ad alte prestazioni gestisce le richieste ai dischi. Il NAS rispetto al DAS è un’evoluzione, ma a differenza del SAN non è scalabile, poiché ha un limite di capienza, che nel SAN è quasi illimitata. Tuttavia la NAS è molto più economica e facile da applicare. In ambito GRID il NAS non è adottabile, poiché un SE ha bisogno di avere lo strato software intermedio, laddove possibile un SE di una griglia ha una struttura SAN. Daniele Dell’Erba 566/2748 Pagina 32 4.7 Immagazzinamento Per inviare un dato sulla griglia si deve aver accesso ad una UI, anche tramite il web. Bisogna esser registrati presso una VO della griglia ed avere un certificato firmato da un CA. L’UI per motivi di prestazioni è bene che sia connesso ad alta velocità con l’utente che vi si collega, poiché sulle reti normali l’upload di file grandi risulta costoso, potrebbe ad esempio trovarsi all’interno della LAN dell’utente. Una volta connessi alla griglia si invia il file che viene trasferito su un SE, si registra la presenza del nuovo file sul catalogo della griglia (Logical Filename Catalogue, LFC) e viene creata una replica su un altro SE, per motivi di ridondanza dei dati. A questa struttura di griglia manca un componente di comodità, un database che tenga traccia dettagliatamente delle informazioni immesse. Il catalogo LFC infatti si occupa di ricordare dove i file sono stati inviati, tramite l’associazione logical filename - guid, ma non cosa essi contengano. Per far ciò, in GridPacs, è stato utilizzato un database specifico per cooperare con le griglie, l’ARDA Metadata Catalogue Project (AMGA, dove ARDA significa A Realization of Distribuited Analysis) [6]. Daniele Dell’Erba 566/2748 Pagina 33 Fig. 4.2: Struttura Progetto 4.8 Progetti Medici Numerosi progetti si affiancano all’iniziativa GridPACS, ponendo soluzioni simili ai problemi comuni. I fattori comuni sono il problema dello spazio, dovuto alla non scalabilità dei sistemi PACS e la ricerca di soluzioni economiche. Il Mobius Project [9], del Dipartimento di Informatica Biomedica dell’Università dell’Ohio (USA) ha collegato tramite una griglia diverse istituzioni e permette di incrociarne i dati, di potervi accedere con il minimo costo e di eseguire query distribuite. Il progetto si basa sulla fornitura di servizi come mako, un servizio di data storage e retrival. Daniele Dell’Erba 566/2748 Pagina 34 Il Data Grid for large scale medical image archive and analysis [10], elaborato dal Dipartimento di Radiologia e Ingegneria Biomedica dell’Università della California del Sud (USA), applica la tecnologia data grid per risolvere i problemi dei sistemi di storage esistenti in ambito medico, con un sistema su larga scala di immagazzinamento a basso costo di backup e recupero dati ottenuto collegando i SAN dei vari enti alla griglia. L’analisi delle immagini viene effettuata dividendo le immagini in piccole porzioni da analizzare individualmente da nodi diversi, evitando la necessità di avere un nodo con elevate prestazioni di calcolo. Un progetto del Dipartimento di Matematica e Informatica dell’Università di Cagliari mira ad utilizzare un SRB per la realizzazione di una griglia per dati medici [11]. L’SRB è lo Storage Resorce Broker, un componente grid che viene fatto interagire con le funzionalità DICOM tramite un’interfaccia scritta in C++. Grazie a questo driver SRB/DICOM è possibile l’invio di dati anonimizzati dal PACS alla grid e quindi l’accesso alle immagini dei PACS tramite griglia. Un progetto che si basa sullo stesso middleware di GridPACS è MEDICUS[12], sviluppato dal Dipartimento di Radiologia, dall’Children Hospital di Los Angeles, dalla scuola di medicina Keck, dal Dipartimento di Ingegneria Biomedica e dalla Scuola di Ingegneria Viterbi e dal Dipartimento di Chirurgia dell’Università della California del Sud, con l’Istituto di Radiologia e Calcolo dell’Università di Chicago, il Centro Nazionale per le Tecnologie Grid Argonne, la divisione sistemi avanzati e l’Istituto di Scienze dell’Informazione. MEDICUS utilizza il Globus toolkit come middleware di accesso ai servizi grid che interfaccia a tutte le tipologie di utenti (sistemi PACS, medici, radiologi, dispositivi di acquisizione, ecc) tramite un servizio denominato DICOM Grid Interface Service (DGIS). Il compito del DGIS è di tradurre le operazioni grid/DICOM, occupandosi dei protocolli, di consultare i cataloghi grid, di trasferire i file avendo a disposizione una cache. La sperimentazione effettuata con i dati di un gruppo di oncologia infantile e di una fondazione per la cura del neuroblastoma ha mostrato che le specifiche grid sono ben mascherate dall’interfaccia e gli utenti coinvolti non hanno dovuto modificare le usuali procedure di flusso dei dati Daniele Dell’Erba 566/2748 Pagina 35 nell’ambiente DICOM. Il DGIS è multithread ed ottimizza le operazioni, comprimendo le serie immesse nella griglia, inoltre utilizza come identificativo non il GUID ma l’identificativo unico relativo ad uno studio o una serie nativo del formato DICOM. La sicurezza è stata organizzata su tre livelli, il primo basato sull’identity provider(IdP) per l’autenticazione, il secondo relativo all’impiego dei certificati X.509 necessari per accedere alla GRID, l’ultimo riferito ai dati che vengono anonimizzati, conservando i metadati originali su un database del DGIS. Una soluzione proveniente da privati è quella della Bycast Inc. oggi acquisita dalla NetApp [13]. All’interno degli ospedali si inseriscono i nodi di una griglia che interagiscono tramite un software di interfaccia ai PACS locali. L’obiettivo è di minimizzare i punti di fallimento abbandonando l’approccio centralizzato dei PACS e distribuendo i servizi di immagazzinamento e trasmissione dei dati su nodi distanti ma costituenti una singola entità, una griglia. Il progetto della Bycast ha già trovato uno sviluppo, fornendo le basi per GMAS[14] sviluppato dalla IBM che si basa sul software di StorageGRID del progetto della Bycast. GMAS è stato sviluppato in due versioni, per singoli ospedali e per più ospedali, dando la possibilità di adottare la soluzione grid anche a enti non federati. Oltre allo storage di dati multimediali è possibile immagazzinate qualsiasi dato medico, cartelle cliniche, appunti dei medici, video, audio, immagini, email, ecc. Altri progetti si concentrano sul problema delle risorse di calcolo, come il MedIGrid [15], elaborato dall’Università di Genova con l’INFM di Genova, l’Istituto di Calcolo e Reti ad Alte Prestazioni CNR di Napoli, il Dipartimento di Fisiopatologia Clinica dell’Università di Firenze e il Dipartimento di Matematica e Applicazioni dell’Università degli Studi di Napoli Federico II. Il progetto ha prodotto un prototipo di infrastruttura grid per applicare le tecniche di ricostruzione tomografica su griglia. Il problema è la grande quantità di dati prodotti dalle analisi che necessitano di essere elaborati per essere visualizzati e immagazzinati. Il Medgrid project [16] è un progetto svolto dal centro di ricerca grid dell’Istituto Nazionale della Scienza e delle Tecnologie Industriali Avanzate di Daniele Dell’Erba 566/2748 Pagina 36 Tsukuba City (Giappone) e dal Dipartimento di Tecnologia Gerontologica del Centro Nazionale per la Gerontologia e Geriatria di Ohbu (Giappone). Collegando tre siti nel Giappone, Filippine e Taiwan ha creato una federazione di risorse in una VO con lo scopo di avere una capacità di calcolo e di memoria collettiva superiore a quella individuale. Daniele Dell’Erba 566/2748 Pagina 37 5 AMGA 5.1 Panoramica AMGA è un database che permette di memorizzare i metadati associati ai file che si immettono su una griglia, associando il loro identificativo univoco sulla GRID (GUID) a vari dati di interesse. In questo modo per reperire un dato generico, invece di dover sapere a priori il GUID del dato, è possibile effettuare ricerche in base ai parametri dei valori presenti in AMGA e trovare anche più di un file sulla griglia di interesse. Essendo un programma che lavora in stretta collaborazione con le griglie, anch’esso viene inserito in un nodo e nella stessa VO degli SE, diventando un componente del meccanismo di invio e ricezione dei dati. Per accedervi è necessario avere un proxy valido, precisamente lo stesso necessario per autenticarsi sulla griglia, che una volta creato all’accesso sulla griglia, agendo da sessione rende trasparente la successiva connessione al database AMGA. Fig. 5.1: Logo ARDA Metadata Catalogue Project 5.2 Affidabilità Le griglie sono molto grandi e quindi contengono molti file, per questo AMGA Daniele Dell’Erba 566/2748 Pagina 38 è stato sviluppato con l’intento di gestire una grande quantità di dati. Le comunità nelle quali è stato impiegato per sviluppo e testing sono l’High Energy Physics (HEP) e la Biomed. La prima ha fornito feedback sulla robustezza, utilizzando AMGA per memorizzare centinaia di milioni di dati con letture variabili, la seconda invece ne ha impiegati i vincoli, memorizzando informazioni mediche sensibili, come dati anagrafici associati a malattie, monitorando gli accessi con una Access Control List (ACL). 5.3 Interfaccia In AMGA è’ possibile definire query SQL-like comprendenti stringhe e funzioni matematiche, per garantire la compatibilità sono presenti i tipi di dati più comuni come: float, integer, string e timestamp. AMGA è un front-end di un database relazionale che può essere MySQL, Oracle, SQLite, PostgreSQL. Il paradigma di modellazione delle tabelle è somigliante alla gerarchia di un file system, la gestione risulta più familiare agli utenti ed è più semplice effettuare query su sottoalberi di dati o replicarne rami. 5.4 Sicurezza Trovandosi all’interno della griglia vi può accedere solo chi fa parte della stessa VO e le comunicazioni sono criptate dal protocollo SSL. Tuttavia nel database vengono immagazzinate le informazioni più sensibili in chiaro. Nei file DICOM senza un PACS non sono immediatamente leggibili i dati, inoltre è possibile che categorie di utenti si debbano interessare solo ad alcuni aspetti dei pazienti. C’è la possibilità di definire permessi aggiuntivi tramite le ACL restringendo l’accesso per tabella o per tupla, cioè singola riga di valori presente in una tabella, ma con prevedibili costi di prestazione. Per quanto riguarda le repliche, i database si trovano in relazione di Daniele Dell’Erba 566/2748 Pagina 39 master-slave fra loro, il master copia parzialmente o totalmente i dati aggiornando lo slave con degli update. Il database slave può esser consultato localmente per avere maggiore rapidità. Questo approccio è stato preferito in quanto efficace nel caso di produzione geograficamente fissa dei dati, nel caso di GridPACS proveniente dagli ospedali. Daniele Dell’Erba 566/2748 Pagina 40 6 GRID INFN 6.1 Architettura utilizzata La griglia INFN utilizza come middleware gLite [7]. Rispetto all’architettura a clessidra [fig. 4.1] si concentra sugli strati collective, resouce e connectivity. Il modello si basa su due servizi, i core ed i collective [fig. 6.1]. I servizi core sono locali e permettono di condividere le risorse di calcolo o di storage, i collective sono servizi centralizzati che lavorano al di sopra delle risorse locali, e costituiscono l’infrastruttura. L’unità fondamentale è il grid element (GE), un host che fornisce i servizi, siano essi core o collective, fornisce i metodi per accedere ai servizi e può interagire sia con altri GE che direttamente con gli utenti. I GE possono essere computing element (CE) fornitori di servizi di calcolo, storage element (SE) fornitori di servizi di storage, worker node (WN) macchine di calcolo, o site BD (SBDII) contenenti le informazioni sulle risorse locali. I GE sono organizzati in siti, in ogni sito è presente almeno un CE, un SE, un SBDII e più WN. I siti forniscono i servizi core come l’invio di un job, la visualizzazione dello stato di un job, la cancellazione di un job o il recupero del suo output, l’interfaccia per la gestione dello storage. I servizi collective che interagiscono con i siti sono il Virtual Organization Membership Server (VOMS) responsabile dell’accesso di un utente alla propria VO, il Workload Management System (WMS) che ha lo schedule dei job su tutti i siti e consulta il top db (BDII) che contiene tutte le informazioni distribuite sui SDBII, ed il Logical Filename Catalogue (LFC), un file system virtuale che mappa i nomi logici sui file fisici distribuiti negli SE. Daniele Dell’Erba 566/2748 Pagina 41 Fig. 6.1: Struttura GRID gLite 6.2 Protocolli Al livello connectivity degli strati di protocolli, il Globus toolkit, dal quale deriva gLite, utilizza i protocolli Grid Security Infrastructure (GSI) per le fasi di autenticazione, autorizzazione, comunicazione e protezione. Al livello resource i protocolli standard utilizzati sono: il Grid Resource Information Protocol (GRIP) per ottenete informazioni sulla configurazione e sullo stato di una risorsa, il Grid Resource Registration Protocol (GRRP) per registrare le risorse, il Grid Resource Access Management (GRAM) per l’allocazione delle risorse di calcolo e per il controllo dei calcoli sulle risorse, il Grid File Transfert Protocol (GridFTP) basato sull’FTP per l’accesso ai dati, il Ligthweight Directory Access Protocol (LDAP) per l’accesso alle directory. Al livello collective usa il Meta Directory Service (MDS) per la gestione di Daniele Dell’Erba 566/2748 Pagina 42 collezioni di risorse. Fig. 6.2: Logo Lightweight Middleware for Grid Computing 6.3 Struttura Progetto Nella Griglia INFN è stata creata un VO chiamata pacs.infn.it [8] con un SE a nome dell’INFN di Napoli nel centro di calcolo della sede Monte Sant’Angelo del Dipartimento di Scienze Fisiche dell’Università “Federico II” di Napoli. E’ previsto l’inserimento delle UI nelle LAN degli enti partecipanti al progetto: Sezione INFN di Napoli, CNR Policlinico di Napoli, ospedale Sant’Orsola Malpighi di Bologna, ospedale Brotzu di Cagliari. Attualmente è funzionante solo quella della Sezione INFN di Napoli ed è in fase di installazione quella del CNR. Le UI non sono accessibili dall’esterno delle LAN e costituiscono l’unico canale di comunicazione fra la griglia e gli enti. Questo per garantire un ulteriore livello si sicurezza oltre all’utilizzo dei certificati e delle connessioni SSL. La fase attuale del progetto è di BETA-test, in quanto i dati immessi sono sanitizzati e servono a dimostrare la possibilità di effettuare ricerche incrociate sui dati provenienti da enti geograficamente distanti. Successivamente con l’introduzione di livelli di accesso diversificati in base al ruolo medico o ad altre caratteristiche si potrà passare all’immissione dei dati reali. Daniele Dell’Erba 566/2748 Pagina 43 Fig. 6.3: Infrastruttura delle connessioni di rete Daniele Dell’Erba 566/2748 Pagina 44 7 GridPACS 7.1 Applicazione Web Il risultato dell’utilizzo di queste tecnologie ha portato alla realizzazione di un’applicazione web presente sulle User Interfaces della VO pacs.infn.it che consente agli utenti l’accesso al database. Le funzionalità dell’applicazione sono di inserimento, ricerca e recupero dei file DICOM, con l’ausilio dei certificati X.509 per la fase di autenticazione, del database AMGA per le ricerche basate sui metadati, di varie funzioni fornite dalle librerie openssl, lcg e gLite/bin utilizzate tramite il linguaggio di scripting PHP. L’applicazione è pensata per mascherare agli utenti tutte le operazioni tecniche e per rendere il suo funzionamento semplice e intuitivo. Le procedure normalmente manuali e svolte da linea di comando sono state automatizzate e tradotte in un’interfaccia grafica. 7.2 Specifiche Il sistema operativo presente sulle UI è redhat scientific linux CERN 4 dotato del middleware gLite. Come web server è stato utilizzato apache2 con il modulo PHP modificato per interpretare le pagine .php come script Common Gateway Interface (CGI). Tutti gli utenti della VO GridPacs devono essere registrati come utenti di sistema ed inseriti in un apposito gruppo. L’applicazione web delle UI è montata in locale ed è accessibile solo dalla LAN nella quale è inserita. 7.3 Funzionamento Il medico, l’utente a cui è destinato l’uso di GridPACS, ha due credenziali, Daniele Dell’Erba 566/2748 Pagina 45 quella fornitagli dalla CA che ha creato il certificato X.509 ed una credenziale richiesta all’amministratore locale della UI per poter accedere al portale [fig. 7.1]. Se l’utente è al primo accesso al sistema, l’UI rileva l’assenza del certificato e chiede all’utente di inviargli il file .pk12 corrispondente al certificato fornitogli dal CA con la chiave di crittografia. Localmente l’UI elabora il file certificato separandone la componente chiave dalla parte dati. I risultanti file, due *.pem, vengono salvati nella cartella privata dell’utente del sistema corrispondente all’utente che si è autenticato sul portale. Il certificato .pk12 dopo l’elaborazione viene eliminato. Se non è il primo accesso al sistema i file .pem sono già presenti sulla UI e viene chiesta la chiave all’utente per generare il proxy e inoltrarlo al fine di accedere ai servizi della griglia. Una volta generato il proxy ha una durata di 24 ore. La homepage di GridPACS offre la possibilità di inviare file DICOM per memorizzarli, di effettuare ricerche in base a qualunque metadato riguardante il paziente o il tipo di analisi relativa alle immagini presenti nel file DICOM, infine di poter scaricare file presenti sulla griglia. Daniele Dell’Erba 566/2748 Pagina 46 Fig. 7.1: Diagramma di flusso dell’accesso al sistema L'inserimento prevede l'upload del file DICOM, i metadati vengono estratti ed inseriti in AMGA, mentre il file è inviato sulla griglia. La ricerca ha per possibili attributi di ricerca il nome del paziente, l'età del paziente, la data in cui ha eseguito l'esame, l'ente esecutore dell'esame, il tipo di esame, la parte del corpo analizzata o l'identificativo del paziente. L'esito della ricerca permette di scaricare il file DICOM desiderato tramite una tabella. Daniele Dell’Erba 566/2748 Pagina 47 8 Guida d’uso 8.1 Tipologie utenti Nell’ambito del progetto GridPACS ci sono 4 tipologie di utenti che interagiscono fra loro. Il CA è una figura a livello nazionale, ad esso compete concedere l’utilizzo dell’infrastruttura GRID INFN utilizzata dal progetto, le richieste devono essere inviate dal diretto interessato (il medico). L’amministratore della VO è a capo del progetto, è il responsabile delle risorse affidate alla VO, ha il compito di autorizzare chi partecipa al progetto. Il sistemista della UI, è una figura locale ad ogni ente che partecipa, ha il compito di configurare la UI, di effettuare la manutenzione, di garantirne il funzionamento e di permetterne l’accesso agi utenti che ne hanno diritto. Gli utenti (i medici) sono gli utilizzatori, ad essi è pensato GridPACS, sono gli unici utenti che possono avere accesso ai dati presenti sulla griglia. La struttura dell’applicazione web è mostrata in figura 8.1, le pagine sono spiegate in dettaglio nel paragrafo successivo. Daniele Dell’Erba 566/2748 Pagina 48 Fig. 8.1: Sitemap di GridPACS Daniele Dell’Erba 566/2748 Pagina 49 8.2 Registrazione Per avere accesso al sistema l’utente ha bisogno di due credenziali. La prima è quella della griglia, che deve richiedere al CA , nel caso di GridPACS è l’INFN [17]. Il CA con una procedura fornisce all’utente un certificato che attesta la sua identità “digitale”. La griglia è organizzata in sottoinsiemi di risorse appartenenti alle VO (la VO del progetto è pacs.infn.it) ed è necessario richiedere all’amministratore della VO l’accesso alle risorse. Dal portale IGI [18] si inoltra la richiesta per entrare a far parte della VO; ottenuto l’accesso si conclude la prima fase di registrazione. La seconda credenziale che l’utente necessita è quella per accedere alla UI di competenza, si deve rivolgere al sistemista responsabile della UI presente nella LAN dell’ente dal quale l’utente dipende. L’amministratore della UI ha il compito di creare un account di sistema per l’utente che intende registrarsi e di inserire una copia dell’applicazione web nella cartella privata public_html. Dopo queste procedure l’utente può accedere a GridPACS. 8.3 Accesso al sistema La prima pagina (fig 8.2) è un semplice portale di benvenuto già protetto dalla connessione https e raggiungibile da tutti senza autenticazione. Il link “Avvia Sessione” conduce al portale di accesso, nel passaggio sono richiesti i dati relativi all’account che l’utente ha sul sistema. Una volta autenticato ogni operazione che l’utente svolgerà sarà a suo nome e reperibile dai log del sistema. Daniele Dell’Erba 566/2748 Pagina 50 Fig. 8.2: Portale benvenuto index.html Qualora fosse il primo accesso sarà necessario l’invio del certificato ricevuto dal CA e della chiave per separare la componente dati dalla parte di crittografia (fig 8.3 – fig 8.4) la pagina invio.php è referenziata dal collegamento “Invio Certificato” della pagina index.php. Daniele Dell’Erba 566/2748 Pagina 51 Fig. 8.3: Portale accesso index.php Fig. 8.4: invio certificato invio.php Daniele Dell’Erba 566/2748 Pagina 52 Ai successivi accessi verrà richiesta solo la chiave per generare il proxy e autenticarsi sulla griglia (fig 8.5 – fig 8.6) in questo caso la pagina index.php sarà diversa, il link “Accesso Grid” conduce alla pagina accesso.php. Fig. 8.5: Portale accesso index.php Daniele Dell’Erba 566/2748 Pagina 53 Fig. 8.6: accesso alla griglia accesso.php 8.4 Invio di un file DICOM La home (fig 8.7) è la pagina dalla quale si possono effettuare le operazioni, all’atto della creazione del proxy viene mostrata la scadenza del proxy, fino ad allora l’utente può accedere al sistema senza alcuna procedura di autenticazione, finchè non effettua il logout che provvede alla rimozione del proxy (collegamento “Uscita”). Il link “Invio File” conduce alla pagina upform.php che contiene un semplice campo di input file. L’operazione di invio del file può durare qualche secondo in base alla dimensione del file e alla velocità di upload dell’utente. Quando il file arriva all’UI se ne verifica il formato e viene inviato alla grid, come feedback dell’avvenuta immissione è mostrato il GUID del file e in una tabella il riepilogo del contenuto del Daniele Dell’Erba 566/2748 Pagina 54 file (fig 8.8). Fig. 8.7: Home sistema home.php Daniele Dell’Erba 566/2748 Pagina 55 Fig. 8.8: Conferma invio di un file upload.php 8.5 Ricerca e download Il link della home “Ricerca File” collega alla pagina cercaform.php che permette di effettuare ricerche in base ai seguenti parametri: nome del paziente, età del paziente, data in cui ha eseguito l'esame, ente esecutore dell'esame, tipo di esame, parte del corpo analizzata o identificativo del paziente (fig 8.9). Non è necessario compilare tutti i campi, è invece possibile lasciarli tutti vuoti. Daniele Dell’Erba 566/2748 Pagina 56 Fig. 8.9: tabella ricerca file cercaform.php Il bottone “ricerca” porta alla pagina cerca.php che in formato tabellare mostra le righe relative ai file cercati, specificando se si tratta di un singolo file (es. radiografia) o di una serie (es. risonanze) con il campo “serie”. Per ogni riga è possibile richiedere di scaricare il file (fig 8.10). Alla richiesta di scaricare un file la UI preleva il file dalla griglia e lo predispone per il download nella pagina download.php (fig 8.11). Prima di avviare lo scaricamento è offerta la possibilità di visualizzare un’anteprima dell’immagine contenuta nel file in una nuova finestra (fig 8.12) cliccando sul link “Visualizza Anteprima”. Daniele Dell’Erba 566/2748 Pagina 57 Fig. 8.10: tabella risultato query ricerca cerca.php Daniele Dell’Erba 566/2748 Pagina 58 Fig. 8.11 pagina di scaricamento con anteprima download.php Fig. 8.12 anteprima immagine contenuta nel file Daniele Dell’Erba 566/2748 Pagina 59 8.6 Condivisione postazioni La durata standard di un proxy è di 24 ore, durante questo periodo l’utente non ha più la necessità di autenticarsi e l’accesso al sistema dal portale di benvenuto è immediato. E’ possibile tuttavia che la postazione utililizzata dall’utente non sia dedicata ad esso ma in comune con altri, in tal caso per evitare che altri utenti possano effettuare operazioni a nome dell’utente precedente è indispensabile che chi utilizza il sistema al termine del proprio lavoro effettui il logout (fig 8.13), tale operazione rimuove il proxy, ma per una completa protezione, è necessario chiudere manualmente il browser o riavviarlo. Fig. 8.13: uscita dal sistema logout.php Daniele Dell’Erba 566/2748 Pagina 60 8.7 Gestione errori Sono molte le operazioni critiche effettuale dal sistema, critiche perché l’esito non dipende solo dalle risorse locali della UI ma anche dallo stato di altre macchine. L’utente può trovarsi in una situazione di errore nelle fasi di invio dei certificati o dei file DICOM. In entrambi i casi deve essere sicuro che il formato del file sia corretto. Per il certificato avviene un’interazione fra l’UI e il nodo della griglia contenente la lista degli utenti con certificati autorizzati ad accedere. Per il file DICOM le operazioni sono due, l’invio del file ad un SE e l’immissione dei metadati nel server AMGA, in particolare la seconda operazione rileva la correttezza dei metadati, come la presenza di caratteri non numerici nei campi età o data. Daniele Dell’Erba 566/2748 Pagina 61 9 Sviluppi futuri Questo progetto pone le basi per un’infrastruttura che si può espandere e migliorare arricchendosi di nuove funzionalità per raggiungere l’obbiettivo di sostituire i sistemi di archiviazione PACS. Di seguito vengono proposte diverse possibili vie di sviluppo. 9.1 Sicurezza L’adozione dell’architettura GRID-LAN con connessioni protette da certificati (https) è un livello ottimale di sicurezza dei messaggi. I dati invece possono esser maggiormente protetti tramite una dissociazione dati-metadati all’atto dell’immissione sulla griglia, i file DICOM potrebbero essere privati dei metadati tramite una cancellazione completa, rimarrebbero solo le immagini. I metadati invece seguirebbero il loro attuale percorso verso il database AMGA, dove grazie al GUID possono essere associati alle immagini presenti nei file. Questo meccanismo già adottato da alcuni progetti paralleli a GridPACS previene danni derivati da accessi non autorizzati ai file presenti sulla griglia. 9.2 Gestione Immagini Lo scopo finale del progetto è quello di sostituire i PACS. Ciò significa fornire all’utente non solo la possibilità di consultare le immagini relative a tutte le analisi di un paziente, ma anche di mettergli a disposizione una serie di strumenti di analisi e studio delle immagini. Le tecnologie per il web permettono di simulare un ambiante desktop da browser tramite l’utilizzo di codice javascript o di tecniche ajax. Con una buona programmazione lato client l’utente potrebbe scaricare i file ed aprirli Daniele Dell’Erba 566/2748 Pagina 62 all’interno della sua sessione web virtuale automaticamente, avendo un resoconto completo dei metadati, la possibilità di visualizzare le serie di immagini complete, la disponibilità di strumenti come lo zoom o il righello per le misurazioni e naturalmente la possibilità si salvare il proprio lavoro. 9.3 Client La UI ricopre il ruolo di server. Attualmente tutte le fasi di calcolo sono a suo carico, ma a fronte di un previsto uso intenso della UI da parte di molti client all’interno della sua LAN è bene pensare ad alleggerirla. Il client che ora è thin può compiere alcune operazione che non è essenziale vengano svolte dalla UI, come ad esempio la generazione del proxy, si può implementare una porzione di programmazione lato client che si occupi di manipolare localmente il certificato .pk12 creando i file .pem. Va tenuto conto che queste operazioni richiedono la libreria openssl. 9.4 Database Il database è essenziale che venga sottoposto ad un attento studio basato sulla tipologia di query effettuate e sulle caratteristiche dei dati immessi. L’entità dati oggi presente è una sola grande tabella, ma non è pensabile di utilizzarla a pieno regime. E’ noto che molti pazienti effettuano numerose analisi, con la struttura attuale si avrebbe un notevole spreco di memoria dovuto alle repliche dei valori relativi ad un paziente su diversi esami. Inoltre non sono presenti indici, è necessario uno studio per la scelta della tipologia di indici e dei campi sui quali sarebbero più utili, tenendo conto che le operazioni a breve termine sono di solo inserimento. Conoscendo la mole di dati che AMGA si troverà a gestire, la latenza dovuta alle interazioni con i database può facilmente diventare l’aspetto più importante sul Daniele Dell’Erba 566/2748 Pagina 63 quale lavorare, bisognerebbe organizzare l’architettura dei vari server AMGA che hanno un funzionamento di tipo master/slave, indicizzare i campi più utilizzati nelle query, suddividere la tabella dei metadati per attinenza di paziente, studio e analisi e infine considerata la possibilità di generare repliche di sottoalberi per garantire una tolleranza agli incidenti. Come miglioramento immediato andrebbe ampliata la rosa di possibili query, passando dall’attuale ricerca per valore esatto alla ricerca per intervallo e per ricerche parziali con l’aggiunta di simboli speciali di query (+, *, …). 9.5 Accessibilità e Fault Tollerance Con l’adozioni di meccanismi di sicurezza come la generazione del proxy localmente e non più da parte della UI, si può spostare il progetto da un livello locale ad un livello globale, rendendo le UI non più parte di LAN isolate ma portali web di accesso. Un ente attualmente per avere una tolleranza a guasti e imprevisti deve avere a disposizione due UI locali che gli consentano l’accesso ininterrotto al database GRID, con un funzionamento parallelo o seriale. Se le UI non venissero più gestite localmente, ma rese accessibili via WAN e non più LAN, la tolleranza sarebbe totale, dipendendo dal numero complessivo di UI. Il costo di questa scelta è di avere basse prestazioni di velocità di connessione fra l’utente e la UI nel caso dell’assenza di UI geograficamente vicine o ben connesse con l’ente o di rottura della UI vicina. Problemi risolvibili installando le UI presso gli enti con un organizzazione simile a quella adottata attualmente, ma con l’enorme vantaggio di offrire la possibilità agli utenti di accedere al sistema ovunque e non più solo al’interno dell’ente. Similmente anche gli SE possono moltiplicarsi per aumentare le prestazioni grazie alle repliche, che permettono di evitare di interrogare e richiedere file memorizzati su SE poco accessibili copiandone porzioni di dati su altri SE distribuiti. Un ulteriore possibilità offerta dall’adozione dell’acceso WAN del sistema è di Daniele Dell’Erba 566/2748 Pagina 64 fornire un servizio anche ai pazienti, permettendogli tramite opportuni strumenti di autenticazione come la tessera sanitaria o le penne USB di accedere ai propri dati personali. 9.6 Funzionalità La grande disponibilità di dati medici su un unico database permette di effettuare alcuni studi normalmente non possibili o difficoltosi. Le analisi di tipo statistico sarebbero molto facilitate. Esempi di query possono rilevare la concentrazione geografica di patologie sul territorio, evidenziarne l’incidenza in particolari comuni o province. E’ possibile calcolare medie sul numero di esami per paziente, per anno o per regione, calcolandone i costi o gli esiti ai fini di prevenzione. Le possibilità offerte sono tantissime, la collezione di dati immagazzinati diventerebbe una ricchezza per la sanità, sebbene fortemente limitata dall’adesione degli enti al sistema, poiché molte analisi statistiche verrebbero falsate da un inadeguato insieme di dati, perché mal distribuito o perché parziale. 9.7 Grid Storage e Computing L’infrastruttura utilizzata da GridPACS è di data grid, cioè finalizzata all’immagazzinamento dei dati, ma il passo per arrivare alla grid computing è breve. Con l’accorpamento di nodi di calcolo nella VO del progetto si avrebbero a disposizione anche delle risorse di calcolo. Una prospettiva interessante sarebbe di sollevare gli enti ospedalieri non solo dalla parte di storage, di memorizzazione e mantenimento dei dati, ma anche della parte di calcolo, per le trasformazioni che molte analisi richiedono sulle immagini prodotte e che superate una soglia di analisi effettuate diventano eccessivamente onerose per la disponibilità di calcolo che gli enti hanno normalmente a disposizione. Daniele Dell’Erba 566/2748 Pagina 65 10 Conclusioni Il progetto GridPACS ha portato alla creazione di un database di immagini mediche su GRID, alla possibilità di effettuare ricerche su tale database e di accedevi da remoto. GridPACS è nato come uno studio di fattibilità, dal desiderio di permettere a utenti estranei alla realtà GRID di averne accesso senza venire a contatto con le macchinose operazioni del contesto. Semplificare l’accesso alla GRID nascondendo le istruzioni da linea di comando sarebbe potuto costare un sacrificio della sicurezza legata al tipo di interazioni che si possono compiere con la griglia, cioè dell’impiego dei certificati digitali. Grazie all’impiego di alcune tecniche di programmazione lato server e di configurazione del server stesso si è riusciti a garantire un’ottima sicurezza di esercizio nonostante la più assoluta facilità d’uso del sistema. Il risultato è un portale basato completamente sulla grafica che automatizza tutti i comandi e la presenza di log grazie ai quali è sempre possibile stabilire chi ha fatto cosa e quando lo ha fatto. Un'altra sfida è stata quella di rendere i dati inviati sulla griglia non “passivi”, ma consultabili. I database GRID non permettono l’identificazione dei dati in base al contenuto, ma solo tramite un codice, il GUID. Con l’impiego del database AMGA si ha la possibilità di conoscere tutti i dettagli dei dati presenti sulla griglia prima di scaricarli. Con un database convenzionale è facile ottenere un risultato simile, ma AMGA è integrato nella griglia, questo significa avere interazioni sicure perché protette dai certificati, ridondanza dei dati tramite le repliche e una gerarchia di server AMGA master/slave sulla griglia per l’organizzazione dei dati. Il progetto dopo fasi throw away ha raggiunto un livello di alta usabilità e scalabilità che sono principali requisiti dai quali si è partiti, ma resta pur sempre vicino ad uno studio di fattibilità, per assicurare l’efficienza e l’assoluta affidabilità che il settore cui è destinato l’uso richiede, ha bisogno di intraprendere ulteriori fasi di Daniele Dell’Erba 566/2748 Pagina 66 sviluppo. Daniele Dell’Erba 566/2748 Pagina 67 11 Appendice 11.1 Installazione e Configurazione Per poter utilizzare il sistema GridPACS è necessario disporre di una UI con sistema operativo redhat scientific linux cern 4 e globus toolkit. Di seguito sono indicate le istruzioni di installazione e configurazione per l’utilizzo del sistema. Tutte le istruzioni devono essere eseguite da shell con privilegi di amministrazione. Il primo componente necessario è un web server come apache, aprire una console shell e con un utente di amministrazione digitare i comandi indicati dal seguente formato: Comando da digitare all’interno della console Descrizione dell’operazione svolta dal comando digitato Yum install httpd installazione server web apache La creazione delle path private è una procedura che dovrà essere eseguita ogni volta che un nuovo utente verrà amesso nella VO. mkdir /var/www/wpacs creazione path sistema mkdir /home/utente1/public_html/DICOM mkdir /home/utente1/public_html/cert creazione path private Daniele Dell’Erba 566/2748 Pagina 68 Per proteggere la comunicazione utente-UI è necessario creare un certificato del server da fornire agli utenti quanto contattano la UI. La libreria openssl è compresa nel globus toolkit. openssl genrsa –des3 –out wpacs.key 512 openssl req –mew –key wpacs.key –out wpacs.csr openssl ca –in wpacs.csr –out wpacs.crt creazione di un certificate self-signed per la connessione https fra l’utente e la UI Bisogna abilitare il server alla ricezione di connessioni https modificando i file di configurazione /etc/httpd/conf.d/ssl.conf all’interno del file modificare i valori indicati SSLEngine on SSLCertificateKeyFile /etc/httpd/conf/ssl.key/wpacs.key SSLCertificateFile /etc/httpd/conf/ssl.crt/wpacs.crt In seguito si spostano i certificati creati con le funzioni openssl nelle directory indicate nel file ssl.conf Il PHP per poter eseguire le istruzioni normalmente svolte da linea di comando con provilegi dell’utente autenticato ha bisogno di essere eseguito come script cgi gedit /etc/httpd/conf.d/php.conf all’interno del file modificare i valori indicati ScriptAlias /php-cgi /usr/bin/php Action php-cgi /php-cgi AddHandler php-cgi .php Daniele Dell’Erba 566/2748 Pagina 69 DirectoryIndex index.php Il modulo php automaticamente installato nel server web apache, viene disabilitato, l’esecuzione degli script php avviene con il meccanismo CGI Il modulo AuthPAM necessario per l’autenticazione potrebbe non esser presente di default sulla UI, se assente dopo averlo scaricato si crea il file nel path indicato /etc/httpd/conf.d/auth_pam.conf Il suo contenuto deve essere LoadModule auth_pam_module modules/mod_auth_pam.so LoadModule auth_sys_group_module modules/mod_auth_sys_group.so Si crea il file di protezione del web path che richiede obbligatoriamente di autenticarsi come utenti di sistema Gedit /ar/www/wpacs/.htaccess Nel file si inseriscono le seguenti righe <IfModule mod_rewrite.c> RewriteEngine on RewriteRule .* [E=http_AUTHORIZATION:%{HTTP:authorization},L] </IfModule> AuthPAM_Enabled on AuthType Basic AuthName “Accesso riservato ai membridel gruppo WPACS” Require group wpacs Creazione file .htaccess per la restrizione all’accesso al sistema tramite autenticazione Daniele Dell’Erba 566/2748 Pagina 70 degli utenti del sistema operativo appartenenti al gruppo indicato È necessario creare un gruppo riservato agli utenti della VO sul sistema, la procedura di creazione e aggiunta del singolo utente al gruppo va ripetuta per ogni nuovo utente. Groupadd wpacs Creazione gruppo utenti autorizzati all’utilizzo del sistema Usermod –G wpacs utente1 Esempio di inserimento utente autorizzato Infine bisogna indicare al server web che le pagine contenenti codice php vanno gestite come script gedit /etc/httpd/conf.d all’interno del file modificare i valori indicati nella sezione public_html # <Directory /home/*/public_html> AllowOverride FileInfo AuthConfig Limit Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec ExecCGI <Limit GET POST OPTIONS> Order allow,deny Allow from all </Limit> <LimitExcept GET POST OPTIONS> Order allow,deny Allow from all </LimitExcept> </Directory> Daniele Dell’Erba 566/2748 Pagina 71 <Directory /home> AddHandler cgi-script .php .php3 .php4 .php5 .phtml </Directory> Utilizzo di suexec per consentire l’esecuzione di comandi non come utente apache ma come utente che si autentica sul .htaccess Le pagine dell’applicazione GridPACS vengono posizionate in due path, il primo pubblico e comune a tutti gli utenti in /var/www/ e var/www/wpacs/, il secondo privato nella cartella dell’utente /home/utente1/public_html/. Le pagine pubbliche sono gli indici index di accesso al sistema, nelle pagine private si articola l’applicazione web vera e propria. I permessi delle pagine web devono essere chmod 755 di proprietà dell’utente e del suo gruppo, chgrp utente1, chown utente1. Le pagine in quanto script CGI hanno nella prima riga il magic number #! indicante l’interprete cui passare lo script, nel caso di GridPACS /usr/bin/php. Una volta trasferite le pagine nelle loro sedi e aver riavviato il server apache il sistema è funzionante, tutti gli errori saranno riportati nei log, così come gli accessi di suexec, utili a tracciare ogni comando eseguito o pagina visitata. 11.2 Codice Index.php #!/usr/bin/php <? Daniele Dell’Erba 566/2748 Pagina 72 if(isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION'])) { $auth_params = explode(":" , base64_decode(substr($_SERVER['REDIRECT_HTTP_AUTHORIZATION'], 6))); $_SERVER['PHP_AUTH_USER'] = $auth_params[0]; unset($auth_params[0]); $_SERVER['PHP_AUTH_PW'] = implode('',$auth_params); } // open user/pass prompt echo "<p>Benvenuto: </p>".$_SERVER['PHP_AUTH_USER']; echo "<br>"; system("id"); echo "<br>"; $ind="/home/".$_SERVER['PHP_AUTH_USER']."/public_html/cert/use rcert.pem"; if (!file_exists($ind)) { echo "Primo accesso <br>"; echo "<a href=\"https://gridpacs2.na.infn.it/~".$_SERVER['PHP_AUTH_USER ']."/invio.php\">Invio Certificato</a>"; } else { echo "<br>"; echo "<a href=\"https://gridpacs2.na.infn.it/~".$_SERVER['PHP_AUTH_USER Daniele Dell’Erba 566/2748 Pagina 73 ']."/accesso.php\">Accesso Grid</a>"; } ?> Invio.php #!/usr/bin/php <? session_start(); if (!isset($_SESSION['nomeutente'])) $_SESSION['nomeutente']=$_REQUEST['User']; ?> <html> <head> <title>Invio Certificato</title> <style type="text/css"> body { text-align: center; } </style> </head> <body> <img src="banner.jpg" width="900" height="250"/> <p>Utente: <?php echo $_SESSION['nomeutente']; ?> </p> <form enctype="multipart/form-data" name="invio certificato" method="post" action="inviato.php"> <input type="hidden" value="1" name="up"> Daniele Dell’Erba 566/2748 Pagina 74 <p><label for="certificato">Certificato: </label> <input type="file" name="certificato"/></p> <p><label for="chiave">Chiave Certificato (passphrase): </label> <input name="chiave" type="password" size="30" /></p> <input type="submit" value="invio" /> </form> </body> </html> Inviato.php #!/usr/bin/php <? session_start(); ?> <html> <head> <title> Portale Griglia </title> <style type="text/css"> body { text-align: center; } </style> </head> <body> <img src="banner.jpg" width="900" height="250"/> <p>Utente: <?php echo $_SESSION['nomeutente']; ?> </p> <? Daniele Dell’Erba 566/2748 Pagina 75 if($_REQUEST['up']!=0) { if($_FILES['certificato']['error'] != UPLOAD_ERR_OK) { print("fallimento upload"); echo "<a href=\"https://gridpacs2.na.infn.it/~".$_SESSION['nomeutente'] ."/invio.php\">Ripetere Invio</a>"; exit; } else { if(preg_match('/Firefox/i',$_SERVER['HTTP_USER_AGENT'])) { if ($_FILES['certificato']['type']!="application/octet-stream") { print("tipo file errato firefox ".$_FILES['certificato']['type']); echo "<a href=\"https://gridpacs2.na.infn.it/~".$_SESSION['nomeutente'] ."/invio.php\">Ripetere Invio</a>"; exit; } } elseif ($_FILES['certificato']['type']!="application/xpkcs12") { print("tipo file errato altri - Daniele Dell’Erba 566/2748 Pagina 76 ".$_FILES['certificato']['type']); echo "<a href=\"https://gridpacs2.na.infn.it/~".$_SESSION['nomeutente'] ."/invio.php\">Ripetere Invio</a>"; exit; } copy($_FILES['certificato']['tmp_name'],"cert/".$_FILES['certi ficato']['name']); unlink($_FILES['certificato']['tmp_name']); print("tipo file " .$_FILES['certificato']['type']. "<br>"); print("nome file " .$_FILES['certificato']['name']. "<br>"); $filename = $_FILES['certificato']['name']; $pp = $_REQUEST['chiave']; $cmd1 = "openssl pkcs12 -nocerts -in cert/".$_FILES['certificato']['name']." -out cert/userkey.pem -passin pass:".$pp." -passout pass:".$pp; $output=system($cmd1); $cmd2 = "openssl pkcs12 -clcerts -nokeys -in cert/".$_FILES['certificato']['name']." -out cert/usercert.pem -passin pass:".$pp; $output=system($cmd2); $cmd3="chmod 0400 cert/userkey.pem"; $output=system($cmd3); $cmd4="chmod 0600 cert/usercert.pem"; $output=system($cmd4); Daniele Dell’Erba 566/2748 Pagina 77 $ind="/home/".$_SESSION['nomeutente']."/public_html/cert/userc ert.pem"; $ind1="/home/".$_SESSION['nomeutente']."/public_html/cert/user key.pem"; if (filesize($ind)>0) { if (filesize($ind)>0) { print("Invio file avvenuto con successo."); echo "<br>"; echo "<a href=\"https://gridpacs2.na.infn.it/~".$_SESSION['nomeutente'] ."/accesso.php\">Accesso Griglia</a>"; $cmd="rm cert/".$_FILES['certificato']['name']; $out=system($cmd); } else { print("errore passphrase"); $cmd="rm ".$ind; $out=system($cmd); $cmd="rm ".$ind1; $out=system($cmd); $cmd="rm ".$_FILES['certificato']['name']; $out=system($cmd); echo "<a href=\"https://gridpacs2.na.infn.it/~".$_SESSION['nomeutente'] ."/invio.php\">Ripetere Invio</a>"; Daniele Dell’Erba 566/2748 Pagina 78 } } else { print("errore passphrase"); $cmd="rm ".$ind; $out=system($cmd); $cmd="rm ".$ind1; $out=system($cmd); $cmd="rm cert/".$_FILES['certificato']['name']; $out=system($cmd); echo "<a href=\"https://gridpacs2.na.infn.it/~".$_SESSION['nomeutente'] ."/invio.php\">Ripetere Invio</a>"; } } } ?> </body> </html> Accesso.php #!/usr/bin/php <? session_start(); ?> <html> <head> Daniele Dell’Erba 566/2748 Pagina 79 <title>Accesso Grid</title> <style type="text/css"> body { text-align: center; } </style> </head> <body> <img src="banner.jpg" width="900" height="250"/> <p>Utente: <?php echo $_SESSION['nomeutente']; ?> </p> <form name="chiave certificato" method="post" action="home.php"> <p><label for="chiave">Chiave Certificato </label> <input id="key" name="chiave" type="password" size="30"/></p> <input type="submit" value="Accesso"> </form> </body> </html> Home.php #!/usr/bin/php <? session_start(); ?> <html> <head> <title>Portale Griglia</title> <style type="text/css"> Daniele Dell’Erba 566/2748 Pagina 80 body { text-align: center; } </style> </head> <body> <img src="banner.jpg" width="900" height="250"/> <? $cmd='/opt/glite/bin/voms-proxy-info -timeleft'; $output=exec($cmd); if (!($output)) { $pp = $_REQUEST['chiave']; $cmd = "echo ".$pp." | /opt/glite/bin/voms-proxy-init -voms pacs.infn.it -key cert/userkey.pem -cert cert/usercert.pem --debug -pwstdin"; $proxy=exec($cmd); $cmd='/opt/glite/bin/voms-proxy-info -timeleft'; $output=exec($cmd); if (!($output)) { echo "<p>Errore autenticazione \n"; echo "<a href=\"https://gridpacs2.na.infn.it/~".$_SESSION['nomeutente'] ."/accesso.php\">Ripetere Accesso</a></p>"; exit(); } else echo "<p>Validità proxy: <br>".$proxy."</p>"; } Daniele Dell’Erba 566/2748 Pagina 81 echo "<p>Utente: ".$_SESSION['nomeutente']."</p>"; echo "<p>Utente certificato:\n"; $cmd="/opt/glite/bin/voms-proxy-info -issuer | awk '{print $3,$4}'"; echo exec($cmd); echo "</p>" echo "<a href=\"https://gridpacs2.na.infn.it/~".$_SESSION['nomeutente'] ."/upform.php\">Invio File</a>"; echo "<br>"; echo "<a href=\"https://gridpacs2.na.infn.it/~".$_SESSION['nomeutente'] ."/cercaform.php\">Ricerca File</a>"; echo "<br>"; echo "<a href=\"https://gridpacs2.na.infn.it/~".$_SESSION['nomeutente'] ."/testins.php\">temp verifica invio</a>"; echo "<br>"; echo "<a href=\"https://gridpacs2.na.infn.it/~".$_SESSION['nomeutente'] ."/logout.php\">Uscita</a>"; ?> </body> </html> Cercaform.php #!/usr/bin/php <? Daniele Dell’Erba 566/2748 Pagina 82 session_start(); ?> <html> <head> <title>Ricerca File</title> <style type="text/css"> body { text-align: center; } </style> </head> <body> <img src="banner.jpg" width="900" height="250"/> <? echo "<p>Utente ".$_SESSION['nomeutente']."</p>"; ?> <form id="ric" action="cerca.php" method="post"> <table align="center"> <tr> <th><label for="nome">Nome Paziente</label></th> <td><input id="nome" name="nome" type="text" /></td> </tr> <tr> <th><label for="eta">Età Paziente</label></th> <td><input id="eta" name="eta" type="text" /></td> </tr> <tr> <th><label for="data1">Data Esame (AAAA-MM-GG)</label></th> <td><input id="data1" name="data1" type="text" /></td> </tr> <tr> Daniele Dell’Erba 566/2748 Pagina 83 <th><label for="ente">Istituzione Esame</label></th> <td><input id="istituto" name="ente" type="text" /></td> </tr> <tr> <th><label for="studio">Tipo Esame</label></th> <td><input id="esame" name="studio" type="text" /></td> </tr> <tr> <th><label for="parte_corpo">Parte Anatomica</label></th> <td><input id="parte" name="parte_corpo" type="text" /></td> </tr> <tr> <th><label for="id_paz">Identificativo Paziente</label></th> <td><input id="id_paz" name="id_paz" type="text" /></td> </tr> </table> <input id="invio" name="invio" type="submit" value="ricerca" /> </form> <br> <? echo "<a href=\"https://gridpacs2.na.infn.it/~".$_SESSION['nomeutente'] ."/home.php\">Home</a>"; ?> </body> </html> Daniele Dell’Erba 566/2748 Pagina 84 Cerca.php #!/usr/bin/php <? session_start(); ?> <html> <head> <title> Ricerca File </title> <style type="text/css"> body { text-align: center; } </style> </head> <body> <img src="banner.jpg" width="900" height="250"/> <? echo "<p>Utente: ".$_SESSION['nomeutente']."</p>"; echo "<p id=\"attesa\">Attendere ...</p>"; require_once('DB.php'); $dati =array(); $indice_val= array("nome","eta","data1","ente","studio","parte_corpo","id_p az"); $indice_att= array("nome","eta","data","istituzione","studio","parte_corpo" ,"id_paziente","guid","serie"); foreach($indice_val as $elem) Daniele Dell’Erba 566/2748 Pagina 85 { if($_POST[$elem] != "") $dati[$elem]=$_POST[$elem]; } $cmd="export HOME=/home/mettivier; /opt/glite/bin/mdcli \"selectattr dbgrid:nome dbgrid:eta dbgrid:data dbgrid:istituzione dbgrid:studio dbgrid:parte_corpo dbgrid:id_paziente dbgrid:guid dbgrid:serie"; if (count($dati) != 0) { $cmd=$cmd." '"; foreach($dati as $ind => $val) { $cmd=$cmd."like(".$ind.",\\\"".$val."\\\") and "; } $cmd=substr($cmd,0,strlen($cmd)-4); //cancellazione ultimo and $cmd=$cmd."'\""; } else $cmd=$cmd." ''\""; $output= shell_exec($cmd); //print($output); ?> <br> <table border=1 align="center"> <tr> <? for ($i=0; $i<count($indice_att); $i++) echo "<th>".$indice_att[$i]."</th>"; echo "<th>Scarica File</th>"; Daniele Dell’Erba 566/2748 Pagina 86 echo "</tr>"; $riga = explode("\n", $output); $numr= floor(count($riga)/9)+1; $k=0; for($j=1; $j<$numr; $j++) { echo "<tr>"; for ($i=0; $i<count($indice_att); $i++) echo "<td>".$riga[$i+$k]."</td>"; echo "<td><a href=\"download.php?cod=".$riga[$i+$k2]."&s=".$riga[$i+$k-1]."\">Scarica</a></td>"; echo "</tr>"; $k=$k+$i; } echo "<table><br>"; if(0) { $cmd="export HOME=/home/mettivier; /opt/glite/bin/mdcli selectattr dbgrid:nome 'eta=".$_REQUEST['eta']."'"; echo'<br>'; $output= shell_exec($cmd); print($output); echo'<br>'; } echo'<br>'; echo "<a Daniele Dell’Erba 566/2748 Pagina 87 href=\"https://gridpacs2.na.infn.it/~".$_SESSION['nomeutente'] ."/home.php\">Home</a>"; ?> <script type="text/javascript"> document.getElementById("attesa").innerHTML="Ricerca completata"; </script> </body> </html> Dowload.php #!/usr/bin/php <? session_start(); ?> <html> <head> <title> Caricamento File </title> <style type="text/css"> body { text-align: center; } </style> </head> <body> <img src="banner.jpg" width="900" height="250"/> <? echo "<p>Utente: ".$_SESSION['nomeutente']."</p>"; Daniele Dell’Erba 566/2748 Pagina 88 if(isset($_REQUEST['cod'])) { echo "<p id=\"attesa\">Attendere ...</p>"; $cmd="export LFC_HOST=lfcserver.cnaf.infn.it; export LCG_GFAL_INFOSYS=gridit-bdii-01.cnaf.infn.it:2170; /opt/lcg/bin/lcg-cp guid:".$_REQUEST['cod']." file:///home/".$_SESSION['nomeutente']."/public_html/tempdicom file"; $out=system($cmd); if ($out != "") { ?> <script type="text/javascript"> document.getElementById("attesa").innerHTML="si è verificato un errore GRID"; </script> <? echo "<a href=\"https://gridpacs2.na.infn.it/~".$_SESSION['nomeutente'] ."/home.php\">Home</a>"; exit(); } else { ?> <script type="text/javascript"> document.getElementById("attesa").innerHTML="file pronto"; </script> Daniele Dell’Erba 566/2748 Pagina 89 <? } echo "serie ".$_REQUEST['s']." "; if ($_REQUEST['s']) { system("mv tempdicomfile tempdicomfile.zip"); $zip = zip_open("tempdicomfile.zip"); while ($zip_entry = zip_read($zip)) { $num_file=$num_file+1; } $estratto=$num_file/2; $c=0; zip_close($zip); $zip = zip_open("tempdicomfile.zip"); do{ $c=$c+1; $zip_entry = zip_read($zip); }while ($c<=$estratto); $file = basename(zip_entry_name($zip_entry)); $fp = fopen(basename($file), "w+"); if (zip_entry_open($zip, $zip_entry, "r")) { $buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)); zip_entry_close($zip_entry); } fwrite($fp, $buf); Daniele Dell’Erba 566/2748 Pagina 90 fclose($fp); echo "The file ".$file." was extracted"; zip_close($zip); system("convert ".$file." anteprima.jpg"); ?> <a href="anteprima.jpg" target="_blank">Visualizza anteprima</a> <br> <? echo "<form action=".$file." method=\"post\">"; ?> <input id="invio" name="down" type="submit" value="Avvia download" /> </form> <? } else { system("mv tempdicomfile tempdicomfile.dcm"); system("convert tempdicomfile.dcm anteprima.jpg"); ?> <a href="anteprima.jpg" target="_blank">Visualizza anteprima</a> <br> <form action="tempdicomfile.dcm" method="post"> <input id="invio" name="down" type="submit" value="Avvia download" /> </form> <? Daniele Dell’Erba 566/2748 Pagina 91 } } else { echo "<p>Errore parametri ricerca</p>"; echo "<a href=\"https://gridpacs2.na.infn.it/~".$_SESSION['nomeutente'] ."/cercaform.php\">Ripetere Ricerca</a></p>"; exit(); } echo "<a href=\"https://gridpacs2.na.infn.it/~".$_SESSION['nomeutente'] ."/home.php\">Home</a></p>"; ?> </body> </html> Upform.php #!/usr/bin/php <? session_start(); ?> <html> <head> <title>Invio File</title> <style type="text/css"> Daniele Dell’Erba 566/2748 Pagina 92 body { text-align: center; } </style> </head> <body> <img src="banner.jpg" width="900" height="250"/> <? echo "<p>Utente ".$_SESSION['nomeutente']."</p>"; ?> <form enctype="multipart/form-data" name="invio file" method="post" action="upload.php"> <input type="hidden" value="1" name="up"> <p> <label for="file">File Archivio DICOM </label> <input id="dcm" name="file" type="file"/> </p> <input type="submit" value="invio" /> </form> <? echo "<a href=\"https://gridpacs2.na.infn.it/~".$_SESSION['nomeutente'] ."/home.php\">Home</a>"; ?> </body> </html> Upload.php #!/usr/bin/php Daniele Dell’Erba 566/2748 Pagina 93 <? session_start(); ?> <html> <head> <title> Caricamento File </title> <style type="text/css"> body { text-align: center; } </style> <body> <img src="banner.jpg" width="900" height="250"/> <p>Utente: <?php echo $_SESSION['nomeutente']; ?> </p> <? require_once('File/DICOM.php'); require_once('PEAR.php'); if (!extension_loaded('zip')) { dl('zip.so'); } if($_REQUEST['up']!=0) { if($_FILES['file']['error'] != UPLOAD_ERR_OK) { print("fallimento upload"); echo "<br>"; echo "<a href=\"https://gridpacs2.na.infn.it/~".$_SESSION['nomeutente'] ."/upform.php\">Inviare nuovo file</a>"; Daniele Dell’Erba 566/2748 Pagina 94 } else { if(preg_match('/Firefox/i',$_SERVER['HTTP_USER_AGENT'])) { if($_FILES['file']['type']!="application/zip" && $_FILES['file']['type']!="image/x-dcm") { print("tipo file errato ".$_FILES['file']['type']." tipi ammessi application/zip o image/x-dcm firefox"); echo "<a href=\"https://gridpacs2.na.infn.it/~".$_SESSION['nomeutente'] ."/upform.php\">Invio nuovo file</a>"; exit; } } elseif(0)//$_FILES['file']['type']!="application/octetstream") { print("tipo file errato ".$_FILES['file']['type']." invece di application/octet-stream non firefox"); echo "<a href=\"https://gridpacs2.na.infn.it/~".$_SESSION['nomeutente'] ."/upform.php\">Inviare nuovo file</a>"; exit; } echo "tipo file Daniele Dell’Erba 566/2748 - ".$_FILES['file']['type']; Pagina 95 copy($_FILES['file']['tmp_name'],$_FILES['file']['name']); unlink($_FILES['file']['tmp_name']); //print("tipo file " .$_FILES['file']['type']. "<br>"); //print("nome file " .$_FILES['file']['name']. "<br>"); $filename = $_FILES['file']['name']; $serie=0; if ($_FILES['file']['type']=="application/zip") { $num_file=0; $estratto=0; $zip = zip_open($filename); while ($zip_entry = zip_read($zip)) { $num_file=$num_file+1; } $estratto=$num_file/2; $c=0; zip_close($zip); $zip = zip_open($filename); do{ $c=$c+1; $zip_entry = zip_read($zip); }while ($c<=$estratto); $file = basename(zip_entry_name($zip_entry)); $fp = fopen(basename($file), "w+"); if (zip_entry_open($zip, $zip_entry, "r")) { Daniele Dell’Erba 566/2748 Pagina 96 $buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)); zip_entry_close($zip_entry); } fwrite($fp, $buf); fclose($fp); echo "The file ".$file." was extracted"; zip_close($zip); $serie=1; } else $file=$filename; $dicom= new File_DICOM(); $out=$dicom->parse($file); if (PEAR::isError($out)) { print("l'archivio contiene file di tipo errato"); $cmd="rm ".$file; $out=system($cmd); $cmd="rm ".$filename; $out=system($cmd); echo "<a href=\"https://gridpacs2.na.infn.it/~".$_SESSION['nomeutente'] ."/upform.php\">Inviare nuovo file</a>"; exit; } else { echo "<table border=1 align=\"center\"><tr>"; echo "<td>Metadati File inviato</td></tr><tr>"; Daniele Dell’Erba 566/2748 Pagina 97 echo "<td>Nome paziente</td>"; echo "<td>Eta paziente</td>"; echo "<td>Study Date</td>"; echo "<td>Institution</td>"; echo "<td>Study description</td>"; echo "<td>Anatomic Structure</td>"; echo "<td>PatientID</td>"; echo "</tr><tr>"; echo "<td>".$dicom->getValue('PatientName')."</td>"; echo "<td>".$dicom->getValue('PatientAge')."</td>"; echo "<td>".$dicom->getValue('StudyDate')."</td>"; echo "<td>".$dicom->getValue('InstitutionName')."</td>"; echo "<td>".$dicom->getValue('StudyDescription')."</td>"; echo "<td>".$dicom->getValue('AnatomicStructure')."</td>"; echo "<td>".$dicom->getValue('PatientID')."</td>"; echo "</table></tr>"; } echo "<br>"; echo "<p id=\"attesa\">Attendere ...</p>"; //file con nome ID paziente $cmd="export LFC_HOST=lfcserver.cnaf.infn.it; export LCG_GFAL_INFOSYS=gridit-bdii-01.cnaf.infn.it:2170; /opt/lcg/bin/lcg-cr --vo pacs.infn.it -d gridpacs.na.infn.it l lfn:/grid/pacs.infn.it/nuovofile file:///home/".$_SESSION['nomeutente']."/public_html/".$filena me; $guid=system($cmd); if ($guid == "") { Daniele Dell’Erba 566/2748 Pagina 98 ?> <script type="text/javascript"> document.getElementById("attesa").innerHTML="si è verificato un errore GRID ripetere invio"; </script> <? $cmd="rm ".$filename; $out=system($cmd); if ($serie) { $cmd="rm ".$file; $out=system($cmd); } echo "<a href=\"https://gridpacs2.na.infn.it/~".$_SESSION['nomeutente'] ."/home.php\">Home</a>"; exit(); } $GUID=substr($guid,5,40); $cmd="export LFC_HOST=lfcserver.cnaf.infn.it; export LCG_GFAL_INFOSYS=gridit-bdii-01.cnaf.infn.it:2170; /opt/lcg/bin/lfc-rename /grid/pacs.infn.it/nuovofile /grid/pacs.infn.it/".$GUID; $out=system($cmd); $cmd="export HOME=/home/mettivier; /opt/glite/bin/mdcli \"INSERT INTO dbgrid VALUES ('".$GUID."','".$dicom>getValue('PatientName')."','".$dicom>getValue('PatientAge')."','".$dicom>getValue('StudyDate')."','".$dicom- Daniele Dell’Erba 566/2748 Pagina 99 >getValue('InstitutionName')."','".$dicom>getValue('StudyDescription')."','".$dicom>getValue('AnatomicStructure')."','".$dicom>getValue('PatientID')."','".$GUID."','".$serie."')\""; $amga=system($cmd); if ($amga == "") { ?> <script type="text/javascript"> document.getElementById("attesa").innerHTML="si è verificato un errore AMGA ripetere invio"; </script> <? $cmd="export LFC_HOST=lfcserver.cnaf.infn.it; export LCG_GFAL_INFOSYS=gridit-bdii-01.cnaf.infn.it:2170; /opt/lcg/bin/lcg-del -a --vo pacs.infn.it lfn:///grid/pacs.infn.it/".$GUID; $out=system($cmd); echo "<a href=\"https://gridpacs2.na.infn.it/~".$_SESSION['nomeutente'] ."/home.php\">Home</a>"; exit(); } $cmd="rm ".$filename; $out=system($cmd); $cmd="rm ".$file; $out=system($cmd); } echo "<br>"; Daniele Dell’Erba 566/2748 Pagina 100 echo "<a href=\"https://gridpacs2.na.infn.it/~".$_SESSION['nomeutente'] ."/home.php\">Home</a>"; } ?> <script type="text/javascript"> document.getElementById("attesa").innerHTML="Inserimento effettuato"; </script> </body> </html> Upload.php #!/usr/bin/php <? session_start(); $cmd="/opt/glite/bin/voms-proxy-destroy"; echo exec($cmd); session_destroy(); ?> <html> <head> <title>Uscita</title> <style type="text/css"> body { text-align: center; } </style> Daniele Dell’Erba 566/2748 Pagina 101 </head> <body> <img src="banner.jpg" width="900" height="250"/> <br> <p> Proxy rimosso </p> <p> Per terminare la sessione è necessario chiudere il browser </p> <? echo "<a href=\"https://gridpacs2.na.infn.it\">Indice</a>"; ?> </body> </html> Daniele Dell’Erba 566/2748 Pagina 102 Bibliografia [1] http://www.acr.org/ [2] http://www.nema.org/ [3] http://medical.nema.org/ [4] http://www.jira-net.or.jp/e/index.htm [5] http://www.cen.eu/cen/pages/default.aspx [6] http://amga.web.cern.ch/amga/ [7] http://glite.cern.ch/ [8] https://igi.cnaf.infn.it/grid_operations/users/getting_started/VO [9] S. Hastings, S. Langella, S. Oster, J. Saltz “The Mobius Project, distribuited data management and integration” http://projectmobius.osu.edu/ [10] H.K. Huang, A. Zhang, B. Liu, Z. Zhou, J. Documet, N. King, L.W.C. Chan “Datagrid for large scale medical image archive and analysis” Proceedings of the 13th annual American Computing Machine conference on Multimedia nov. 2005, 1005-1013 http://www.ipilab.org/Research/DataGrid/p1005-huang.pdf [11] L. Leoni, S. Manca, A. Giachetti, G. Zanetti ”A virtual data grid architecture for medical data using SRB” EuroPACS-MIR 2004, 475-478 [12] S. G. Erberich, J. C. Silverstein, A. Chervenak, R. Schuler, M. D. Nelson, C. Kesselman Globus MEDICUS federation of DICOM medical imaging devices into healthcare grids [13] http://www.netapp.com/us/products/storage-software/storagegrid/ [14] http://gridatasia.ercim.eu/images/seoul/pdf/ibm-03.pdf [15] P. Bonetto, G. Oliva, A.R. Formiconi “A Medical imaging environment based on a grid computing infrastructure” [16] E. Bagarinao, T. Nakai, Y. Tanaka “Medgrid project, using grid technology for brain studies” Philippine Information Technology Journal - Volume1 Number1 of February 2008, 3-7 [17] http://security.fi.infn.it/CA/ [18] https://igi.cnaf.infn.it/grid_operations/users/getting_started/VO Capitolo 2 Emanuele Neri, Paolo Marcheschi, Davide Caramella “Produrre ed elaborare immagini diagnostiche” Springer 2008 Documentazione ufficiale DICOM – Nema Materiale corso metodologie per l’analisi dell’immagine – Giovanni Mettivier W.R. Riddle D.R. Pickens “Extracting data from a DICOM file” Medical Physics vol.32 N.6 June 2005, 1537-1541 Capitolo 3 H.K. Huangs “Pacs: basic principles and applications”Wiley ???? Paul G. Nagy “The future of pacs” Medical Physics vol.34 N.7 July 2007, 2676-2682 Capitolo 4 Materiale corso griglie computazionali – Silvio Pardi Capitolo 5 B. Koblitz, N. Santos, V. Pose “The amga metadata service” Journal of Grid Computing, vol.6 Daniele Dell’Erba 566/2748 Pagina 103 N.1 Springer 2007, 61-76 Daniele Dell’Erba 566/2748 Pagina 104