Indice Introduzione ................................................................................................................. 2 Un software per l’automazione di procedure statistiche su dati Pet ............................ 2 Il Pre-Processing .......................................................................................................... 7 La fase di statistica ..................................................................................................... 12 Algoritmo di classificazione ...................................................................................... 13 L’interfaccia ............................................................................................................... 15 Uso del matlabcontrol di JMI ................................................................................ 16 L’algoritmo di classificazione in JAVA .................................................................... 16 Introduzione Lo scopo di questo studio è stato quello di avvalersi di strumenti quali Java e MatLab, per la realizzazione di interfacce di comunicazione per entrambi i linguaggi, col compito di ottimizzare procedure caratterizzati da processi manuali ed onerosi dal punto di vista temporale relative ad analisi statistiche su dati PET. Di seguito verranno illustrati i vari passaggi che porteranno all’applicazione finale la quale, tramite utilizzo di mirate strutture dati, fornirà l’output atteso. Un software per l’automazione di procedure statistiche su dati Pet L’applicazione è stata realizzata sull’intero flusso di lavoro, partendo dalla conversione dei files Dicom, proseguendo sulla parte di preprocessing/statistica e terminando infine con il running dell’algoritmo di classificazione dall’ottenimento del file mdata. Il file mdata contiene al suo interno le coordinate delle ROI nelle tre dimensioni x-y-z, le coordinate spaziali del punto a massima intensità ed il valore medio nel segnale della ROI. Una parte dello studio è stata quella di individuare il modo con il quale tali valori, inizialmente non estraibili, potessero essere acquisiti come valori sui quali poter applicare l’algoritmo di classificazione in maniera del tutto automatizzata e senza intervento manuale. Il flow’s diagram mostra tutta l’area di appartenenza dell’applicativo Figura 1 Flow’s Diagram L’interazione tra Matlab e l’application java abbraccia interamente i rispettivi toolbox, e grazie a questa interazione è stato possibile automatizzare l’intero processo. Per creare un ambiente di sviluppo che potesse far interagire i due ambienti è stato necessario l’utilizzo del MatlabControl, dove un programma Java in esecuzione in una JVM diversa rispetto MATLAB potesse lanciare e controllare una sessione di MATLAB senza l'intervento dell'utente. Conseguita la comunicazione dei due ambienti, si è passati con la realizzazione della fase di pre-processing prevedendo: - La conversione dei dati Dicom in un file con estensione nii - La Coregistrazione - La normalizzazione - Lo smoothing Per quanto riguarda la parte di statitisca: - Factorial Design Specification - Model Estimation - Contrast Manager - Result Report La Gui dell’applicativo java concede solo pochi passaggi lato utente rispettando quindi lo scopo di automazione di questo elaborato: Figura 2 Front end dell'applicazione La figura2 racchiude tutte le sequenze procedurali che uno user, all’utilizzo dell’applicativo, deve eseguire. Per prima cosa, dopo aver lanciato il jar del software, devono essere selezionati i files dicom che saranno poi sottoposti a conversione nel formato nii. Tale passaggio viene rappresentato all’interno del frame, come mostrato nella figura successiva. Figura 3 Uploads Dicom I files image selezionati, sono opportunamente caricati all’interno di una struttura dati, nel caso specifico sono stati utilizzati gli arraylist per il semplice fatto che per la gestioni di questi oggetti, non necessitava la sincronizzazione. Caricati i files Dicom, l’utente deve selezionare una cartella di lavoro, che sarà quella dove all’interno si troveranno tutti i files dell’intero elaborato, dal file nii ricavato dalla conversione Dicom, alla coregistrazione e così via. L’utente andrà a specificare il percorso dove vuole salvare il file ed il software in automatico andrà a creare un folder distinct, in maniera tale da non confondere ulteriori test che lo stesso utente può effettuare nell’arco di uno stesso periodo e seguendo quindi questa regola, la cartella di lavoro si chiamerà “ output_1652012_0921 ” indicando rispettivamente data, minuti e secondi della creazione del folder. Figura 4 Path della cartella di lavoro Assegnata la cartella di lavoro, non resta che aprire il proxy di connessione con Matlab, che consentirà poi all’utente di lanciare in modo sequenziale tutti i vari step successivi, ovvero il pre-processing e la parte statistica. Figura 5 Proxy Matlab Il Pre-Processing Dai passaggi visti in precedenza, sono stati caricati i files Dicom in una struttura dati, è stato definito il work folder ed è stata aperta l’istanza in matlab che permette di avviare la fase di pre-processing e di statistica. Un altro settaggio (opzionale) è quello dei parametri di configurazione per ciascuna tecnica. La figura successiva mostra la possibilità di settaggio dei parametri prima del run pre-processing: Figura 6 Assegnamento dei paramatri Se non sono assegnati i parametri, le varie tecniche possono essere lanciate mantenendo gli stessi valori di default presenti in SPM. Definita anche questa parte, non resta che lanciare il pre-processing in modo sequenziale, dal tasto Converter al button Coregister e così via. Lo screenshot successivo mostra l’avvio ed il successivo risultato nel work folder. Figura 7 Output Converter Procedendo al button Coregister, si seleziona il file nii ottenuto dalla conversione e viene avviata la Coregistrazione. Figura 8 Output Coregister Allo stesso modo, per completare la fase di pre-processing, sono lanciati Normalise e Smooth: Figura 9 Output Normalise & Smooth La fase di statistica Completato il pre-processing possiamo avviare la parte relativa alla statistica e nello specifico, Factorial Design Specification, Model Estimation,Contrast Manager e Result Report. Cliccando direttamente sul button Stats, dobbiamo selezionare il file con patologia ed in seguito i files o il singolo file controllo. Conclusa la fase di selezione dei files, le quattro tecniche definite vengono lanciate fino all’ottenimento dell’output SPM.mat. Il result report dell’intero processo è rappresentato nella figura successiva: Figura 10 Output Result Report Algoritmo di classificazione In questa fase viene catturato il file mdata, viene aperta un’istanza di matlab che lancia alcuni comandi utili per estrarre le nostre informazione di interesse (Coordinate ROI, Punto massima Intensità, Valore Medio) e successivamente viene creato un file di testo con all’interno i nostri valori. L’immagine successiva mostra i passaggi in codice matlab, lanciati dopo l’apertura dell’istanza di Matlab: 1. img_for_space = 'avg152T1.nii'; 2. img_space = mars_space(img_for_space); 3. estensione_file='_roi.mat'; 4. f6 = fopen('info_data.txt','w'); 5. for i=1:length(regions) 6. valore_medio=mean(regions{i}.Y); 7. nome_regione=regions{i}.name; 8. fprintf(f6,'%s\n',nome_regione); 9. fprintf(f6,'%g\n',valore_medio); 10. roi_name=strcat(nome_regione,estensione_file); 11. roi=maroi(roi_name); 12. pts = realpts(roi, img_space); 13. matA= min(pts, [], 2); 14. fprintf(f6,'%g\n',matA); 15. matB= max(pts, [], 2); 16. fprintf(f6,'%g\n',matB); 17. end 18. fclose(f6); 19. f7 = fopen('vmedio.txt','w'); 20. numero_roi=unique(Y); 21. fprintf(f7,'%g\n',numero_roi); 22. fclose(f7) Dal codice si comprende come viene creato il file e come viene interrogato il file mdata affinché i nostri valori informativi possano essere utilizzati ed immagazzinati in opportune strutture dati. Figura 11 File di Output della prima istanza Seguendo la lettura a blocchi da sinistra a destra della figura 4, notiamo come vengono identificate le coordinate dei picchi, il valore medio e le coordinate spaziali delle ROI. Come già scritto in precedenza,tali valori erano inizialmente accessibili solo tramite la view di Marsbar e non estraibili; seguendo pertanto questa procedura, tali dati possono essere manipolati e processati. Per la gestione di questi dati è stato necessario l’utilizzo di strutture dati quali gli Arraylist di Java L’interfaccia Java Matlab Interface (JMI) è un’interfaccia documentata e non pubblicamente riconosciuta da The Mathworks. L'interfaccia si presenta sotto forma di un file jar chiamato jmi.jar distribuito con MATLAB. Ciò che è all’interno di questo canale di comunicazione dipende esattamente da quale versione di MATLAB è installata. Tutto il codice è all’interno del package com.mathworks.jmi , all’interno del quale ci sono un certo numero di subpackage. Uso del matlabcontrol di JMI Il Matlabcontrol fa uso di solo due classi, ed un totale di soli tre metodi. In com.mathworks.jmi.NativeMatlab viene utilizzato un metodo per determinare se il codice è attualmente in esecuzione sull’istanza principale di MATLAB: public static boolean nativeIsMatlabThread() All’interno di com.mathworks.jmi.Matlab Java permette di comunicare con MATLAB. Tutta la comunicazione è fatta con: public static Object mtFevalConsoleOutput(String, Object[], int) throws Exception Se la richiesta in arrivo per l’interazione con MATLAB non è in esecuzione sul thread principale di MATLAB, allora può essere immesso sull’istanza con l'uso di: public static void whenMatlabIdle(Runnable) In questo modo abbiamo tutti gli strumenti utili per poter lanciare l’algoritmo di classificazione e definire la patologia in merito a quanto abbiamo selezionato come input. L’algoritmo di classificazione in JAVA L’algoritmo di classificazione viene riportato all’interno di Java con le librerie opportunamente descritte, e successivamente viene aperta una nuova istanza in matlab che permette l’esecuzione dello stesso: proxy.eval("nR="+scan.getNumValMed()+";"); … ("nP="+scan.getNumeroPicchi()+";"); … proxy.eval(scan.getValoreMed()); … proxy.eval(scan.getMatrixPicchi()); … proxy.eval(scan.getXYZRoi()); … proxy.eval("addpath "+conf.PathPosizioneJar()+"/Algoritmo/"); ("malattia=fase_tre(nR,nP,V,P,R)"); Figura 12 Quanto viene rappresentato in figura 6 è una piccola parte del codice che invoca l’algoritmo di classificazione dopo aver eseguito tutti gli step, dalla lettura del file,alla clusterizzazzione dei dati all’interno dell’arraylist, all’invocazione dei threads per le istanze di Matlab fino al passaggio definitivo dei parametri all’interno dell’algoritmo. Il risultato con la distinzione della patologia in riferimento al nostro dato di ingresso è il seguente: Figura 13 Classificazione della patologia