Tool MatLab - Home Page
Transcript
Tool MatLab - Home Page
U NIVERSITÀ DEGLI S TUDI DI M ILANO D IPARTIMENTO DI T ECNOLOGIE DELL’I NFORMAZIONE Facoltà di Scienze Matematiche, Fisiche e Naturali Corso di I NFORMATICA MEDICA CellProfiler, guida alle modifiche apportate 30 agosto 2007 Studenti: Paolo Arcaini Massimo Manara Docente del corso: Rita Pizzi Anno Accademico 2006/2007 . Indice Introduzione 7 1 Funzioni inserite 9 2 Modifiche alla struttura di CellProfiler 11 2.1 Aggiunta di un nuovo modulo . . . . . . . . . . . . . . . . . 11 2.2 Aggiunta di una nuova categoria . . . . . . . . . . . . . . . . 14 3 Descrizione funzioni 3.1 Complemento . . . . . . . . . . . . . . 3.2 Trasformata discreta di Fourier . . . . 3.3 Contrasto . . . . . . . . . . . . . . . . . 3.4 Wiener . . . . . . . . . . . . . . . . . . 3.5 Convoluzione . . . . . . . . . . . . . . 3.6 Immagine fantasma . . . . . . . . . . . 3.7 Trasformata radon . . . . . . . . . . . 3.8 Trasformata inversa radon . . . . . . . 3.9 ImageAdjust . . . . . . . . . . . . . . . 3.10 Filtro mediano . . . . . . . . . . . . . . 3.11 Save With Rows And Columns Name 3.12 Load Array . . . . . . . . . . . . . . . . 3.13 Load Array Single Type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 17 18 19 20 20 21 21 22 23 24 25 33 36 4 Compilazione 39 4.1 Compilazione di CellProfiler v. 1.04684 PC . . . . . . . . . . 39 4.2 Compilazione di CellProfiler v. 1.04684 MAC . . . . . . . . . 48 5 Utilizzo 49 5.1 Usare CP senza Matlab su PC . . . . . . . . . . . . . . . . . . 49 5.2 Usare CP senza Matlab su MAC . . . . . . . . . . . . . . . . . 49 . Elenco delle tabelle 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 3.14 Complemento . . . . . . . . . . . . . . FFT . . . . . . . . . . . . . . . . . . . . Contrasto . . . . . . . . . . . . . . . . . Wiener . . . . . . . . . . . . . . . . . . Convoluzione . . . . . . . . . . . . . . Phantom . . . . . . . . . . . . . . . . . Trasformata radon . . . . . . . . . . . Trasformata inversa radon . . . . . . . ImageAdjust . . . . . . . . . . . . . . . Filtro mediano . . . . . . . . . . . . . . Save With Rows And Columns Name Esempio di ridenominazione. . . . . . Load Array . . . . . . . . . . . . . . . . Load Array Single Type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 18 19 20 20 21 21 22 23 24 25 27 33 36 . Introduzione Il lavoro svolto si propone di implementare nel linguaggio MatLab alcune integrazioni al software open source CellProfiler1 Il lavoro è stato così organizzato: nel primo capitolo la lista di tutte le modifiche e/o aggiunte apportate al programma. Nel secondo capitolo un tutorial per lo sviluppo di funzioni aggiuntive al software. Nel terzo capitolo, la descrizione e le modalità d’uso di alcune delle funzioni implementate. Infine nell’ultimo capitolo è stato inserita una guida di compilazione per il file CellProfile.m, sia per la versione PC che per quella MAC. 1 CellProfiler cell image analysis software is designed for biologists without training in computer vision or programming to quantitatively measure phenotypes from thousands of images automatically. www.cellprofiler.org . Capitolo 1 Funzioni inserite Alla struttura software di CellProfiler è stato aggiunto un nuovo modulo, Filters, e sono state sviluppate ulteriori funzioni in altri moduli già esistenti. Nel modulo Filters sono stati inseriti nuovi filtri: • Complement.m • CPimlincomb.m • FFT.m • CPimabsdiff.m • IFFT.m • CPimadd.m • SubtractBackgroundSingle.m • CPimdivide.m • Convolution.m • CPadapthisteq.m • RadonTransform.m • CPimmultiply.m • InverseRadonTransform.m • CPwiener2.m • DiscreteCosineTransform.m • CPimsubtract.m • InverseDiscreteCosineTransform.m • MedianFiltering.m • CreateContour.m • ImageAdjust.m • HistogramOfImage.m • SaveWithRowsAndColumnsName.m • HeadPhantomImage.m • LoadArray.m • RegionInterestOnColor.m • LoadArraySingleType.m Mentre per le pipeline: Capitolo 1. Funzioni inserite 10 • array_load.mat - Caricamento dati • rename_images.mat - Ridenominazione immagini dell’array Capitolo 2 Modifiche alla struttura di CellProfiler Le modifiche apportate a CellProfiler e descritte in questo capitolo, fanno riferimento alla versione del software open source 1.04684. Nuove versioni rilasciate dal team di sviluppo www.cellprofiler.org potrebbero non avere lo stesso iter di modifica. 2.1 Aggiunta di un nuovo modulo È opportuno al fine di ottenere un linguaggio comune e non fuorviante, durante la lettura di questo capitolo, definire alcune parole chiave. • Banco di lavoro: nel software “Pipeline”. Definisce quali filtri applicare e in che ordine. • Modulo: nel software “Module”. sono i moduli che verranno aggiunti alla pipeline. • Categoria: nel software “Categories”. Sono dei gruppi di moduli (File Processing, Image Processing etc.). • Filtro: nel software “Filters”. La nuova categoria aggiunta da noi. La struttura fortemente modulare del software CellProfiler permette di integrare automaticamente un nuovo filtro nella categoria “Other”. Per apportare questa aggiunta perfettamente “trasparente” (Infatti, non necessita la modifica del file CellProfiler.m) a CellProfiler è sufficiente. 1. Creare un nuovo file nella sotto cartella “Modules” di CellProfiler. Capitolo 2. Modifiche alla struttura di CellProfiler 12 2. Il file appena creato, dovrà avere determinate caratteristiche. (a) Rispettare il preambolo classico dei file MatLab. (b) Definizione delle variabili. (c) Analisi ed elaborazione dell’immagine/i. (d) Visualizzazione dei risultati. Un esempio di filtro aggiunto alla categoria Filters, viene riportato in Codice 2.1. La prima riga definisce il nome della funzione. La terza riga, è l’istruzione che rileverà il parser1 di CellProfiler per capire in che categoria posizionare il filtro complement appena creato. Se il valore di “Category” non è presente, il software inserisce automaticamente il filtro nella categoria “Others”. In questo caso, quindi, la riga tre è ridondante. Dalla riga dieci alla quindici, è definita la maschera per la ricezione dell’input utente. Le righe precedenti, sono comandi MatLab ovvero istruzioni per l’integrazione del filtro nella pipeline. Una maschera solitamente è formata da “Menù a tendina” e “Aree di testo”. Queste sono implementate attraverso la definizione di particolari variabili. Nel caso del Codice 2.1: %textVAR01, dove ’01’ rappresenta un numero progressivo e non devono esistere due variabili con lo stesso numero, %infotypeVAR01, indica che la variabile VAR01 è un tipo “gruppo di immagini”. ImageName è l’etichetta dell’immagine che verrà acquisita da file oppure dal modulo mandato in esecuzione nella pipeline in precedenza. La parte CurrentModuleNum,1 indica il riferimento alla variabile ’01’ essendo la prima, il numero è ’1’. Infine %inputtypeVAR01 indica in che modo deve essere disegnata e rappresentata la casella di inserimento dell’input, in questo caso è un menù a tendina (vedi Figura 2.1). E così via per gli altri tipi di variabili. Figura 2.1: Pop up menù. 1 Alcune parti commentate nel codice Matlab, sono tali in quanto il parser di CellProfiler riconosce le parole chiave in questo modo. Capitolo 2. Modifiche alla struttura di CellProfiler 13 Codice 2.1: Creazione di un filtro ad esempio: Complement.m 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 function handles = Complement ( handles ) % Help for the Complement module : % Category : Other % %%%%%%%%%%%%%%%% % %% VARIABLES %%% % %%%%%%%%%%%%%%%% drawnow [ CurrentModule , CurrentModuleNum , ModuleName ] = CPwhichmodule ( handles ) ; % textVAR01 = What image do you want to incomplemet ? % infotypeVAR01 = imagegroup ImageName = char ( handles . Settings . VariableValues { CurrentModuleNum ,1}) ; % inputtypeVAR01 = popupmenu % textVAR02 = Come chiami l ' immagine risultante ? % defaultVAR02 = ComplementedImage % infotypeVAR02 = imagegroup indep ComplementedImageName = char ( handles . Settings . VariableValues { CurrentModuleNum ,2}) ; % %% Reads the images . OrigImage = CPretrieveimage ( handles , ImageName , ModuleName , ' DontCheckColor ',' CheckScale '); % %%%%%%%%%%%%%%%%%%%%% % %% IMAGE ANALYSIS %%% % %%%%%%%%%%%%%%%%%%%%% drawnow FinalImage = OrigImage ; FinalImage = imcomplement ( FinalImage ); % %%%%%%%%%%%%%%%%%%%%%% % %% DISPLAY RESULTS %%% % %%%%%%%%%%%%%%%%%%%%%% drawnow % %% Determines the figure number to display in . ThisModuleFigureNumber = handles . Current .([ ' FigureNumberForModule ' , CurrentModule ]) ; if any ( findobj == ThisModuleFigureNumber ) % %% Activates the appropriate figure window . CPfigure ( handles , ' Image ', ThisModuleFigureNumber ) ; if handles . Current . SetBeingAnalyzed == handles . Current . StartingImageSet CPresizefigure ( OrigImage , ' TwoByOne ', ThisModuleFigureNumber ) end % %% A subplot of the figure window is set to display the original image . subplot (2 ,1 ,1) ; CPimagesc ( OrigImage , handles ) ; title ([ ' Input Image , cycle # ', num2str ( handles . Current . SetBeingAnalyzed ) ]) ; % %% A subplot of the figure window is set to display the adjusted % %% image . subplot (2 ,1 ,2) ; CPimagesc ( FinalImage , handles ); title ( ' Complemented Image ') ; end 14 57 Capitolo 2. Modifiche alla struttura di CellProfiler 61 % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % %% SAVE DATA TO HANDLES STRUCTURE %%% % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% drawnow 63 handles . Pipeline .( ComplementedImageName ) = FinalImage ; 59 Per la parte dell’analisi d’immagine, la riga di interesse è la trentadue. La quale mostra come l’immagine FinalImage, venga trattata del filtro imcomplement di MatLab. Infine la parte di visualizzazione. La struttura non varia al cambiare del filtro. L’ultima riga la sessantatré definisce il nome che sarà associato alla immagine post filtro, ComplementedImageName. 2.2 Aggiunta di una nuova categoria L’aggiunta di una nuova categoria consente di separare e velocizzare il processo di analisi e computazione degli algoritmi sulle immagini in quanto evita di cercare i filtri aggiunti all’interno della categoria di default “Others” in cui verrebbero posizionati. Tuttavia questa scelta obbliga a modificare il file CellProfiler.m. Alcuni limiti di questa soluzione potrebbero verificarsi durante l’aggiornamento della versione, causando l’inevitabile passaggio nella categoria predefinita “Others” dei nuovi filtri creati. In Codice 2.2, è riportata la parte di codice da modificare in CellProfiler. Le parti aggiunte portano come commento %% Aggiunto sul fianco. Ogni volta che CellProfiler chiama la funzione load_listbox, questa controlla la directory verificando i file presenti e controllando il loro preambolo come mostrato in Codice 2.1 nella riga tre. La riga dovrà infatti contenere l’indicazione della nuova categoria. Ad esempio. % Category: Filters. Così facendo verrà aggiunto un modulo “Filters” e in quel modulo sarà aggiunto un filtro “Complement”. Codice 2.2: Aggiunta di un modulo a CellProfiler.m 1 3 5 7 9 11 13 function load_listbox ( dir_path , AddModuleWindowHandles ) dir_struct = dir ([ dir_path ' /*. m ']) ; FileProcessingFiles ={}; PreProcessingFiles ={}; ObjectProcessingFiles ={}; MeasurementFiles ={}; FiltersFiles ={}; % % Aggiunto OtherFiles ={}; for i =1: length ( dir_struct ) name = dir_struct (i). name ; name = name (1: end -2) ; if file_in_category ( dir_struct (i) . name , ' File Processing ') FileProcessingFiles ( length ( FileProcessingFiles ) +1) = cellstr ( name ); Capitolo 2. Modifiche alla struttura di CellProfiler 15 17 19 21 23 25 27 29 31 33 35 15 elseif file_in_category ( dir_struct (i). name , ' Image Processing ') PreProcessingFiles ( length ( PreProcessingFiles ) +1) = cellstr ( name ); elseif file_in_category ( dir_struct (i). name , ' Object Processing ') ObjectProcessingFiles ( length ( ObjectProcessingFiles ) +1) = cellstr ( name ) ; elseif file_in_category ( dir_struct (i). name , ' Measurement ') MeasurementFiles ( length ( MeasurementFiles ) +1) = cellstr ( name ); elseif file_in_category ( dir_struct (i). name , ' Filters ')% % Aggiunto FiltersFiles ( length ( FiltersFiles ) +1) = cellstr ( name );% % Aggiunto else OtherFiles ( length ( OtherFiles ) +1) = cellstr ( name ); end end CategoryList = { ' File Processing ' ' Image Processing ' ' Object Processing ' ' Measurement ' ' Filters ' ' Other '}; %% Aggiunto (' Filters ') set ( AddModuleWindowHandles . ModuleCategoryListBox , ' String ' , CategoryList ,... ' Value ' ,[]) set ( AddModuleWindowHandles . ModulesListBox , ' String ', FileProcessingFiles ,... ' Value ' ,[]) AddModuleWindowHandles . ModuleStrings {1} = FileProcessingFiles ; AddModuleWindowHandles . ModuleStrings {2} = PreProcessingFiles ; AddModuleWindowHandles . ModuleStrings {3} = ObjectProcessingFiles ; AddModuleWindowHandles . ModuleStrings {4} = MeasurementFiles ; AddModuleWindowHandles . ModuleStrings {5} = FiltersFiles ;%% Aggiunto AddModuleWindowHandles . ModuleStrings {6} = OtherFiles ; . Capitolo 3 Descrizione funzioni In questo capitolo viene mostrato come utilizzare i nuovi filtri inseriti in CellProfiler. Per semplicità vengono riportate solo due funzioni che non richiedono parametri: complemento e la trasformata discreta di Fourier. Mentre per i filtri più complessi, è riportata una sommaria descrizione. Nel caso dei parametri si faccia riferimento al sito http://www.mathworks. com in particolar modo alla documentazione: http://www.mathworks.com/ access/helpdesk/help/toolbox/images/. 3.1 Complemento D ATI Nome funzione Scopo D ESCRIZIONE Complement.m Calcola il complemento dell’immagine, l’immagine in ingresso può essere in bianco e nero o RGB Tabella 3.1: Complemento In Figura 3.1, è riportato uno screenshot del caricamento nella pipeline di CellProfiler della funzione complemento. Capitolo 3. Descrizione funzioni 18 Figura 3.1: Complemento. 3.2 Trasformata discreta di Fourier D ATI Nome funzione Scopo D ESCRIZIONE FFT.m Calcola la trasformata discreta di Fourier Tabella 3.2: FFT In Figura 3.2, è riportato uno screenshot del caricamento nella pipeline di CellProfiler della funzione complemento. Figura 3.2: FFT. Capitolo 3. Descrizione funzioni 3.3 Contrasto D ATI Nome funzione Scopo Par.1 NumTiles Par.2 ClipLimit Par.3 NBins Par.4 Range Par.5 Distribution Par.6 Alpha D ESCRIZIONE adapthisteq.m ... ... ... . . . 6. ... .... .... Tabella 3.3: Contrasto 19 Capitolo 3. Descrizione funzioni 20 3.4 Wiener D ATI Nome funzione Scopo Par. [m,n] D ESCRIZIONE wiener2.m Esegue il filtro bidimensionale per la rimozione del rumore Definisce la matrice. Il valore di default è [3,3]. Tabella 3.4: Wiener 3.5 Convoluzione D ATI Nome funzione Scopo Par.1 Average Par.2 disk Par.3 gaussian Par.4 laplacian Par.5 log Par.6 motion Par.7 unsharp D ESCRIZIONE conv.m, fspecial.m Convoluzione su immagini Media, hsize è un vettore. Il valore di default è [3 3]. Media con forma circolare. Il valore di default di radius 5. Filtro gaussiano, hsize è un vettore il valore di default è [3 3], sigma è la deviazione standard il valore di default è 0.5. L’intervallo operativo di alpha è: [0-1]Il valore di default di alpha è ’0.2’. ... ... Tabella 3.5: Convoluzione Capitolo 3. Descrizione funzioni 3.6 21 Immagine fantasma D ATI Nome funzione Scopo Par. 1 Shepp-Logan Par. 2 Modified Shepp-Logan D ESCRIZIONE phantom.m Genera una phantom image Usata per tomografie. Variante della precedente migliora la percezione visiva. Tabella 3.6: Phantom 3.7 Trasformata radon D ATI Nome funzione Scopo Par. 1 theta D ESCRIZIONE RadonTransform.m Trasformata radon angolo di rotazione in gradi Tabella 3.7: Trasformata radon Capitolo 3. Descrizione funzioni 22 3.8 Trasformata inversa radon D ATI Nome funzione Scopo Par. 1 theta Par. 2 nearest Par. 3 linear Par. 4 spline Par. 5 Ram-Lak Par. 6 Shepp-Logan Par. 7 Cosine Par. 8 Hamming Par. 9 Hann Par. 10 frequenza Par. 11 output D ESCRIZIONE InverseRadonTransform.m Trasformata inversa radon Angolo di rotazione in gradi Tipo interpolazione Tipo interpolazione Tipo interpolazione Tipo filtro Tipo filtro Tipo filtro Tipo filtro Tipo filtro Frequenza compresa tra (0,1] ... Tabella 3.8: Trasformata inversa radon Capitolo 3. Descrizione funzioni 3.9 ImageAdjust D ATI Nome funzione Scopo Par. 1 default or custom Par. 2 low_in Par. 3 high_in Par. 4 low_out Par. 5 high_out D ESCRIZIONE ImageAdjust.m Adatta l’intensità di una immagine alla coplormap ... ... ... ... ... Tabella 3.9: ImageAdjust 23 Capitolo 3. Descrizione funzioni 24 3.10 Filtro mediano D ATI Nome funzione Scopo Par. 1 default/ m-by-n neighborhood Par. 2 m Par. 3 n D ESCRIZIONE MedianFiltering.m ... Se è selezionato default: è usata una matrice 3x3. Con l’altra opzione si specifica il numero di righe e colonne Rappresenta il numero di righe della matrice Rappresenta il numero di colonne della matrice Tabella 3.10: Filtro mediano Capitolo 3. Descrizione funzioni 3.11 25 Save With Rows And Columns Name D ATI Nome funzione Scopo Par. 1 Par. 2 Par. 3 Par. 4 Par. 5 D ESCRIZIONE SaveWithRowsAndColumnsName.m Salvare le immagini fornite in input con un nome che riporti la riga e la colonna a cui l’immagine appartiene Cartella delle immagini di input. Il punto identifica la cartella di default delle immagini Cartella delle immagini di output. Il punto identifica la cartella di default delle immagini Numero di righe Numero di colonne (anticorpi) Numero di immagini per spot. Nel caso di DAPI - Cy3 - FITC deve essere impostato a 3 Tabella 3.11: Save With Rows And Columns Name Il modulo carica in ordine alfabetico i file contenuti all’interno di una cartella (Par. 1). Si richiede che le immagini siano state acquisite “per righe” e che il loro nome rifletta l’ordine d’acquisizione. I nomi delle immagini che sono state prodotte dal laboratorio Thetis sono conformi alle nostre richieste, infatti, il nome delle immagini conteneva un numero progressivo (vedi Figura 3.3). 26 Capitolo 3. Descrizione funzioni Figura 3.3: Esempio ricostruzione spot. Bisogna impostare il numero di righe e il numero di colonne (anticorpi)(Par. 2,Par. 3); è opportuno prima di mandare in esecuzione il modulo controllare che il numero di immagini sia uguale al numero di righe per il numero di colonne. Infine si richiede di impostare il numero di immagini per spot. Nella immagini fornite sono tre (DAPI, Cy3, FITC). È possibile aumentare o diminuire tale numero a seconda delle esigenze. Le immagini di una stessa cella hanno lo stesso numero di riga e colonna. In Tabella 3.12 a Pagina 27 Capitolo 3. Descrizione funzioni 27 un esempio di rinomina di 6 immagini: Spot 1 (Cy3) New Spot1 (Cy3) Spot 1 (DAPI) New Spot 1 (DAPI) Spot 1 (FITC) New Spot 1 (FITC) Spot 22 (Cy3) New Spot 22 (Cy3) 00001–W00001–P00001–Z00000–T00000–Cy3.tif ⇓ r01_c01_00001–W00001–P00001–Z00000–T00000–Cy3.tif 00001–W00001–P00001–Z00000–T00000–DAPI.tif ⇓ r01_c01_00001–W00001–P00001–Z00000–T00000–DAPI.tif 00001–W00001–P00001–Z00000–T00000–FITC.tif ⇓ r01_c01_00001–W00001–P00001–Z00000–T00000–FITC.tif 00022–W00022–P00001–Z00000–T00000–Cy3.tif ⇓ r02_c03_00022–W00022–P00001–Z00000–T00000–Cy3.tif Spot 22 (DAPI) 00022–W00022–P00001–Z00000–T00000–DAPI.tif ⇓ New Spot 22 (DAPI) r02_c03_00022–W00022–P00001–Z00000–T00000–DAPI.tif Spot 22 (FITC) New Spot 22 (FITC) 00022–W00022–P00001–Z00000–T00000–FITC.tif ⇓ r02_c03_00022–W00022–P00001–Z00000–T00000–FITC.tif Tabella 3.12: Esempio di ridenominazione. SaveWithRowsAndColumnsName - Analisi del codice. In Codice 3.1 è mostrato il modulo SaveWithRowsAndColumnsName. Di seguito l’analisi del codice. function handles = SaveWithRowsAndColumnsName ( handles ) 2 4 6 % Help for the SaveWithRowsAndColumnsName module : % Category : File Processing % % SHORT DESCRIPTION : 28 8 10 12 14 16 18 20 22 24 % % % % % % % % % % % % % % Capitolo 3. Descrizione funzioni ************************************************************************* CellProfiler is distributed under the GNU General Public License . See the accompanying file LICENSE for details . Authors : Paolo Arcaini Massimo Manara Website : http :// www . cellprofiler . org DATA : % %%%%%%%%%%%%%%%% % %% VARIABLES %%% % %%%%%%%%%%%%%%%% drawnow 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 [ CurrentModule , CurrentModuleNum , ModuleName ] = CPwhichmodule ( handles ) ; % pathnametextVAR01 = Enter the pathname of the directory of input images . Type period (.) for default image directory . FileDirectoryInput = char ( handles . Settings . VariableValues { CurrentModuleNum ,1}) ; % pathnametextVAR02 = Enter the pathname to the directory where you want to save the images . Type period (.) for default image directory . FileDirectoryOutput = char ( handles . Settings . VariableValues { CurrentModuleNum ,2}) ; % textVAR03 = How many rows ? % defaultVAR03 = 11 rows = str2double ( char ( handles . Settings . VariableValues { CurrentModuleNum ,3}) ) ; % textVAR04 = How many columns ? % defaultVAR04 = 19 columns = str2double ( char ( handles . Settings . VariableValues { CurrentModuleNum ,4}) ); % textVAR05 = Number of images per spot . For example , with DAPI - Cy3 - FITC , it must be set to 3. % defaultVAR05 = 3 numPerSpot = str2double ( char ( handles . Settings . VariableValues { CurrentModuleNum ,5}) ); % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % %% PRELIMINARY CALCULATIONS & FILE HANDLING %%% % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% drawnow numZeroRows = floor ( log10 ( rows )); numZeroColumns = floor ( log10 ( columns )) ; Pathname = handles . Current . DefaultImageDirectory ; if strncmp ( FileDirectoryInput , '. ' ,1) if strcmp ( FileDirectoryInput , '. ') Capitolo 3. Descrizione funzioni 62 else 64 end 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100 102 104 106 108 110 29 FileDirectoryInput = Pathname ; FileDirectoryInput = fullfile ( Pathname , FileDirectoryInput (2: end ) ); end if strncmp ( FileDirectoryOutput , '. ' ,1) if strcmp ( FileDirectoryOutput , '. ') FileDirectoryOutput = Pathname ; else FileDirectoryOutput = fullfile ( Pathname , FileDirectoryOutput (2: end ) ); end end % %% Retrieves all the image file names and the number of % %% images per set so they can be used by the module . FileNames = CPretrievemediafilenames ( FileDirectoryInput , '',' no ',' Regular ',' Image '); numOfImages = length ( FileNames ); numOfCells = numOfImages / numPerSpot ;% numero di triplette for n = 1: numOfImages OldFilename = char ( FileNames (n )); i= floor ((n -1) / numPerSpot ) +1; r = floor (i/ columns ) + 1; % floor (n/ columns ) trova la riga su cui si trova l ' immagine , ma in notazione C ( indici da 0) ; quindi sommiamo 1 if ( mod (i , columns ) ==0) r=r -1; end c = i - (r -1) * columns ; zerosRows = num2str ( zeros ( numZeroRows - floor ( log10 (r)) ,1) ) '; zerosColums = num2str ( zeros ( numZeroColumns - floor ( log10 (c) ) ,1) ) '; NewFilename = [ 'r ', zerosRows , num2str (r) ,'_c ', zerosColums , num2str (c) ,'_ ', OldFilename ]; copyfile ( fullfile ( FileDirectoryInput , OldFilename ) , fullfile ( FileDirectoryOutput , NewFilename )) drawnow end % %% This line will " cancel " processing after the first time through this % %% module . All the files are renumbered the first time through . Without % %% the following cancel line , the module will run X times , where X is the % %% number of files in the current directory . set ( handles . timertexthandle , ' string ',' Cancel ') % %%%%%%%%%%%%%%%%%%%% % %% FIGURE WINDOW %%% % %%%%%%%%%%%%%%%%%%%% drawnow % %% The figure window display is unnecessary for this module , so it is % %% closed during the starting image cycle . if handles . Current . SetBeingAnalyzed == handles . Current . StartingImageSet ThisModuleFigureNumber = handles . Current .([ ' FigureNumberForModule ' , CurrentModule ]) ; if any ( findobj == ThisModuleFigureNumber ) close ( ThisModuleFigureNumber ) end end Codice 3.1: SaveWithRowsAndColumnsName.m Fino alla riga 46 viene definita la maschera di input del modulo. Analizziamo in dettaglio le righe di codice 54-91, riportando prima delle Capitolo 3. Descrizione funzioni 30 porzioni di codice e poi il commento relativo. Codice 3.2: Linee 54-55. 54 numZeroRows = floor ( log10 ( rows )); numZeroColumns = floor ( log10 ( columns )) ; ’rows’ è il numero di righe e ’columns’ è il numero di colonne che sono stati forniti dall’utente tramite maschera. Poiché vogliamo che i file ridenominati siano ordinabili alfabeticamente in modo corretto bisogna, talvolta, inserire nell’identificativo di riga e di colonna degli zeri prima del vero numero. Se, per esempio, ci sono 11 righe gli identificativi di riga saranno r01, r02, . . . , r10, r11. Il numero massimo di zeri da usare è il numero di cifre di ’rows’ (o ’columns’) meno 1, cioè il logaritmo in base 10 di ’rows’ (o ’columns’) approssimato al primo intero inferiore (operatore floor). Codice 3.3: Linee 57-65. 58 60 62 64 Pathname = handles . Current . DefaultImageDirectory ; if strncmp ( FileDirectoryInput , '. ' ,1) % il primo carattere di FileDirectoryInput è un punto ? if strcmp ( FileDirectoryInput , '. ') % FileDirectoryInput è solo un punto ? FileDirectoryInput = Pathname ; % allora FileDirectoryInput è uguale a Pathname else FileDirectoryInput = fullfile ( Pathname , FileDirectoryInput (2: end ) ); % FileDirectoryInput diventa Pathname + FileDirectoryInput ( senza il punto ) end end Nelle variabili ’FileDirectoryInput’ e ’FileDirectoryOutput’ della maschera l’utente ha memorizzato i percorsi delle cartelle di input e di output. Se ha scritto un percorso assoluto le variabili possono essere utilizzate direttamente; se, invece, ha utilizzato un percorso relativo con il punto (es ./prova/) bisogna modificarle per poterle poi utilizzare in modo corretto. In ’Pathname’ conserviamo la directory predefinita per le immagini (Pathname = handles.Current.DefaultImageDirectory). Poi controlliamo se l’utente vuole usare una sottodirectory della directory predefinita come directory di input (if strncmp(FileDirectoryInput,'.',1)): con questo if gli chiediamo se il primo carattere è un punto e, quindi, se dobbiamo partire dalla directory predefinita. Poi, se ’FileDirectoryInput’ comincia con il punto, controlliamo se c’è solo il punto (if strcmp(FileDirectoryOutput,'.')): in tal caso ’FileDirectoryInput’ diventa uguale alla directory predefinita (FileDirectoryOutput = Pathname). Se, invece, ci sono altri caratteri dopo il punto allora bisogna concatenare Capitolo 3. Descrizione funzioni 31 la directory predefinita con le sottocartelle specificate (FileDirectoryInput = fullfile(Pathname,FileDirectoryInput(2:end))). Un ragionamento identico viene fatto per ’FileDirectoryOutput’ nelle righe 66-72. Codice 3.4: Linee 75-77. 76 FileNames = CPretrievemediafilenames ( FileDirectoryInput , '',' no ',' Regular ',' Image '); numOfImages = length ( FileNames ); numOfCells = numOfImages / numPerSpot ; In ’FileNames’ inseriamo tutti i nomi dei file in ordine alfabetico. La variabile ’numOfImages’ contiene il numero delle immagini. La variabile numOfCells è il numero di celle, cioè il numero di immagini diviso per il numero di immagini per cella (o spot); attualmente ’numOfCells’ non viene utilizzata ma potrebbe essere utile in sviluppi futuri. Codice 3.5: Linee 78-91. 78 80 82 84 86 88 90 for n = 1: numOfImages OldFilename = char ( FileNames (n )); i= floor ((n -1) / numPerSpot ) +1; r = floor (i/ columns ) + 1; % floor (n/ columns ) trova la riga su cui si trova l ' immagine , ma in notazione C ( indici da 0) ; quindi sommiamo 1 if ( mod (i , columns ) ==0) r=r -1; end c = i - (r -1) * columns ; zerosRows = num2str ( zeros ( numZeroRows - floor ( log10 (r)) ,1) ) '; zerosColums = num2str ( zeros ( numZeroColumns - floor ( log10 (c) ) ,1) ) '; NewFilename = [ 'r ', zerosRows , num2str (r) ,'_c ', zerosColums , num2str (c) ,'_ ', OldFilename ]; copyfile ( fullfile ( FileDirectoryInput , OldFilename ) , fullfile ( FileDirectoryOutput , NewFilename )) drawnow end Ora, per ogni immagine (for n = 1:numOfImages), bisogna calcolare il nuovo nome e salvare le nuove immagini. In ’OldFilename’ mettiamo il vecchio nome (OldFilename = char(FileNames(n))). Ora bisogna trovare in che cella siamo; poiché per ogni cella ci sono ’numPerSpot’ immagini, il numero dell’immagine non corrisponde al numero di cella. Per esempio, con tre immagini per cella (come negli esempi di Thetis), la decima immagine appartiene alla quarta cella. In ’i’ conserviamo il numero della cella corrente (i=floor((n-1)/numPerSpot)+1). La formula sembra strana, ma è corretta; anche se non può essere considerata una dimostrazione vediamo il calcolo di due celle n = 1 e n = 23 (con numPerSpot=3). Se n = 3 i = floor((3-1)/3)+1 = 1; Se n = 23 i = floor((23-1)/3)+1 = 8 Poi calcoliamo ’r’, la riga a cui l’immagine appartiene, e ’c’, la colonna a cui 32 Capitolo 3. Descrizione funzioni l’immagine appartiene. Dopo il calcolo di ’r’ (r = floor(i/columns) + 1) dobbiamo eseguire un test per il caso in cui la cella sia l’ultima della riga (if(mod(i,columns)==0)); in tal caso il valore calcolato di ’r’ deve essere decrementato di un’unità. Il calcolo di ’c’ è più semplice (c = i-(r-1)*columns): è il numero di cella corrente meno il numero di celle contenute nelle righe precedenti. In ’zerosRows’ e ’zerosColums’ inseriamo le stringhe di zeri corrette per il nome file corrente. Analizziamo il caso delle righe. Il numero di zeri deve essere calcolato come differenza tra il massimo numero di zeri possibile meno il numero di cifre del numero di riga attuale (numZeroRows-floor(log10(r)). Costruisco un array di zeri opportuno (zeros(...,1)) che poi trasformo in stringa (num2str(...)). A questo punto posso costruire ’NewFilename’ (il nuovo nome dell’immagine) e copiare l’immagine originale con il nuovo nome nella directory di output. Le righe da 92 a 111 servono solo per mostrare la finestra in CellProfiler durante il processo di salvataggio. Capitolo 3. Descrizione funzioni 3.12 33 Load Array D ATI Nome funzione Scopo Par. 1 Par. 2 Par. 3 Par. 4 Par. 5 D ESCRIZIONE LoadArray.m Permette di caricare una riga o una colonna di immagini. Si possono caricare tre gruppi di immagini (solo righe o solo colonne) con una singola istanza del modulo Consente la scelta del metodo di caricamento delle immagini per righe o per colonne Indica il numero di riga (colonna) che si vuole caricare Nome da assegnare al gruppo di immagini Per analizzare o meno le sottocartelle Cartella delle immagini da caricare. Il punto identifica la cartella di default delle immagini Tabella 3.13: Load Array Il modulo permette di caricare singole righe o colonne come gruppi di immagini. Durante il caricamento, le immagini acquisite sono tutte le diverse tipologie (DAPI, Cy3 e FITC); non è possibile con questo modulo distinguere i differenti tipi (Lo si può fare con il modulo: ’Load Array Single Type’). Con un singolo modulo ’LoadArray’ nella pipeline, è possibile caricare solo quattro gruppi di immagini. Al contrario, per caricare più di quattro gruppi, è necessario aggiungere lo stesso modulo più volte. LoadArray - Analisi del codice. La LoadArray sfrutta il codice della LoadImages implementata dal gruppo di sviluppo di CellProfiler, opportunamente modificata per le nostre esigenze (Non riportiamo nella relazione il codice della LoadArray in quanto occuperebbe svariate decine di pagine). Analizzeremo, quindi, le porzioni di codice scritte interamente da noi (da 1 a 134). Il codice che abbiamo commentato (perché non era più necessario) potrebbe essere cancellato, ma preferiamo mantenerlo per completezza e maggiore chiarezza riguardo alle modifiche effettuate. Nelle righe 1-103 viene definita la maschera. Come abbiamo detto in precedenza possiamo selezionare al massimo quattro gruppi di immagini; per questo alcune variabili sono espresse come celle (struttura dati simile alle struct in C) e sono indirizzate con valori di indice da 1 a 4 (i quattro Capitolo 3. Descrizione funzioni 34 gruppi). Noi facciamo riferimento solo al primo, in quanto tutti i discorsi saranno identici anche per gli altri tre. Analizziamo le variabili della maschera. • ’Rows_Col{1}’ può valere “rows” o “columns” e indica se si vuole caricare le immagini per riga o per colonna. • ’Index{1}’ indica il numero di riga o di colonna che si vuole caricare. • ’ImageName{1}’ nome che si vuole dare al gruppo di immagini ottenuto. • ’Pathname’ è la directory predefinita delle immagini. Codice 3.6: Linee 105-107. 106 ExactOrRegExp = 'R '; ImageOrMovie = ' Image '; La variabili ’ExactOrRegExp’ e ’ImageOrMovie’ servono per chiamare in modo corretto la funzione che dovrà caricare le immagini, la CPretrievemediafilenames(). La variabile ’ExactOrRegExp’ chiede se vogliamo caricare le immagini tramite una stringa esatta (’E’) o tramite un’espressione regolare (’R’ come nel nostro caso). La variabile ’ImageOrMovie’ dice se stiamo caricando immagini o filmati; nel nostro caso immagini (’Image’). Codice 3.7: Linee 120-134. 120 122 124 126 128 130 132 134 tmp1 = {}; tmp2 = {}; for n = 1:4 if ~ strcmp ( Rows_Col {n} , '/ ') && ~ strcmp ( ImageName {n} , '/ ') if strcmp ( Rows_Col {n}, ' rows ') TextToFind { n} = [ 'r ([0]*) ', Index {n}, '_c (.*) ']; else TextToFind { n} = [ '_c ([0]*) ' , Index {n} , '_ (.*) ']; end tmp1 { end +1} = TextToFind {n }; tmp2 { end +1} = ImageName {n }; end end TextToFind = tmp1 ; ImageName = tmp2 ; Nel codice precedente costruiamo le celle ’TextToFind’ e ’ImageName’. ’TextToFind’ contiene le espressioni regolari per la selezione delle righe o colonne desiderate. ’ImageName’ contiene i nomi da dare ai gruppi di immagini. Le operazioni devono essere eseguite per i quattro gruppi di immagini Capitolo 3. Descrizione funzioni 35 (for n = 1:4). Poiché non è obbligatorio caricare tutti e quattro i gruppi di immagini, bisogna prima controllare che ’Rows_Coln’ e ’ImageNamen’ siano diversi da “/” (if ~strcmp(Rows_Col{n}, '/') && ~strcmp(ImageName{n}, '/')). Poi controlliamo se dobbiamo caricare per righe o per colonne (if strcmp(Rows_Col{n}, 'rows')). Analizziamo il caso in cui carichiamo per righe. Nella n-esima sezione della cella ’TextToFind’ inseriamo la stringa (che rappresenta un’espressione regolare) che si ottiene dalla seguente concatenazione: ['r([0]*)',Index{n},'_c(.*)']. • 'r([0]*)' significa “r” seguito da nessuno o più zeri. • Index{n} è il numero di riga selezionato. • '_c(.*)' significa “_c” seguito da una stringa qualsiasi. I risultati parziali sono inseriti in tmp1 e tmp2. Nelle righe 139-913 le istruzioni sono comuni alla LoadImages e servono per caricare correttamente le immagini. Capitolo 3. Descrizione funzioni 36 3.13 Load Array Single Type D ATI Nome funzione Scopo Par. 1 Par. 2 Par. Par. Par. Par. 3 4 5 6 D ESCRIZIONE LoadArraySingleType.m Permette di caricare una riga o una colonna di immagini di un determinato tipo (DAPI o Cy3 o FITC). Si possono caricare tre gruppi di immagini (solo righe o solo colonne) con una singola istanza del modulo Consente la scelta del metodo di caricamento delle immagini per righe o per colonne Indica il numero di riga (colonna) che si vuole caricare Tipo di immagini da caricare Nome da assegnare al gruppo di immagini Per analizzare o meno le sottocartelle Cartella delle immagini da caricare. Il punto identifica la cartella di default delle immagini Tabella 3.14: Load Array Single Type Il modulo permette di caricare singole righe o colonne come gruppi di immagini. Bisogna specificare il tipo di immagine che si vuole caricare (DAPI, Cy3 e FITC). Con un singolo modulo ’LoadArraySingleType’ nella pipeline, è possibile caricare solo tre gruppi di immagini. Al contrario, per caricare più di tre gruppi, è necessario aggiungere lo stesso modulo più volte. LoadArraySingleType - Analisi del codice. Il codice è quasi identico a quello della LoadArray; vediamo le differenze. Nella maschera viene definita anche la variabile Type{1} che può assumere i valori Cy3, DAPI e FITC. TextToFind{n} = ['r([0]*)',Index{n},'_c(.*)',Type{n}]; L’espressione regolare è più complessa perché viene aggiunto anche il tipo di immagini che vogliamo caricare. • 'r([0]*)' significa “r” seguito da nessuno o più zeri Capitolo 3. Descrizione funzioni • Index{n} è il numero di riga selezionato • '_c(.*)' significa “_c” seguito da una stringa qualsiasi • Type{n} è il tipo di immagini che si vuole caricare 37 . Capitolo 4 Compilazione La compilazione di CellProfiler avviene nel seguente modo. È necessario avere il file CompileWizard.m il quale una volta lanciato da Matlab, legge all’interno delle sotto cartelle del direttorio di CellProfiler. La lettura, delle cartelle: ImageTools (come mostrato i riga tredici di Codice 4.1), serve per capire quante e quali funzioni vi siano. Una volta compreso tale dato, vengono letti i file (filtri) trovati e, preparati per la compilazione (Si riesce a capire in che categoria dovrenno essere poszionati, l’help per ogni filtro. . . ). Il risultato prodotto dall’esecuzione di questo file sarà un documento di “direttive” (CompileWizardText.m riga undici di Codice 4.1) che dovreanno poi essere inserire manualmente in CellProfiler.m. 4.1 Compilazione di CellProfiler v. 1.04684 PC Procedura di compilazione del software CellProfiler v. 1.04684 per PC. Software necessario: • Windows XP Build 2600 Service Pack 2 • MATLAB Version 7.1.0.246 (R14) Service Pack 3 • Java VM Version: Java 1.5.0 1) Creare il file CompileWizard.m nella cartella di CellProfiler (Copiando il dal Codice 4.1). Il codice è stato reperito sul forum del progetto CellProfiler, l’autore è Mike Lamprecht. I commenti ’%%% v. 1.04684’ indicano le parti di codice inserite da noi. 40 1 3 5 7 9 Capitolo 4. Compilazione % %%%%%%%%%%%%%%%%%%%%%%% % %%% CODE FOR COMPILEWIZARD . M %%%% % %%%%%%%%%%%%%%%%%%%%%%% function CompileWizard % CompileWizard % This function , when run in the default CellProfiler path , will produce a % file with help information stored in variables to be used in the compiled % version of CellProfiler . 39 fid = fopen ( ' CompileWizardText .m ' ,'w '); ToolList =[]; % %% v. 1.04684 ImageToolfilelist = dir ( ' ImageTools /*. m '); fprintf ( fid , ' %%%%%% IMAGE TOOL HELP \n '); fprintf ( fid , ' ToolHelpInfo = '' Help information for individual image tools : ' ' ;\ n\n ') ; for i =1: length ( ImageToolfilelist ) ToolName = ImageToolfilelist (i ). name ; fprintf ( fid ,[ ToolName (1: end -2) , ' Help = sprintf ([...\ n ']) ; body = char ( strread ( help ( ImageToolfilelist (i ). name ) ,'%s ', ' delimiter ','',' whitespace ',' ')); for j = 1: size ( body ,1) fixedtext = fixthistext ( body (j ,:) ); newtext = [ '' '', fixedtext , '\\ n '' ...\ n ']; fprintf ( fid , newtext ); end fprintf ( fid , ']) ;\ n\ n '); fprintf ( fid ,[ ' ToolHelp { ', num2str (i) ,'} = [ ToolHelpInfo , '' ----------- '' 10 ' ,[ ToolName (1: end -2) ,' Help '], ' ];\ n\n ']) ; if exist ( ' ToolList ',' var ') ToolList = [ ToolList , ' ' '', ToolName (1: end -2) ,' ''']; else ToolList = [ ''' ', ToolName (1: end -2) ,'' '']; end if exist ( ' ToolListNoQuotes ',' var ') ToolListNoQuotes = [ ToolListNoQuotes , ' ', ToolName (1: end -2) ]; else ToolListNoQuotes = ToolName (1: end -2) ; end end fprintf ( fid ,[ ' handles . Current . ImageToolsFilenames = { '' Image tools '' ', ToolList , ' };\ n ' ]) ; fprintf ( fid , ' handles . Current . ImageToolHelp = ToolHelp ;\ n\ n '); 41 clear ToolList 11 13 15 17 19 21 23 25 27 29 31 33 35 37 43 45 47 49 51 53 55 DataToolfilelist = dir ( ' DataTools /*. m ') ; fprintf ( fid , ' %%%%%% DATA TOOL HELP \ n '); fprintf ( fid , ' ToolHelpInfo = '' Help information for individual data tools : '' ;\ n\n ') ; for i =1: length ( DataToolfilelist ) ToolName = DataToolfilelist (i). name ; fprintf ( fid ,[ ToolName (1: end -2) , ' Help = sprintf ([...\ n ']) ; body = char ( strread ( help ( DataToolfilelist (i) . name ) , '%s ', ' delimiter ' ,'',' whitespace ',' ')); for j = 1: size ( body ,1) fixedtext = fixthistext ( body (j ,:) ); newtext = [ '' '', fixedtext , '\\ n '' ...\ n ']; fprintf ( fid , newtext ); end fprintf ( fid , ']) ;\ n\ n '); Capitolo 4. Compilazione 41 69 fprintf ( fid ,[ ' ToolHelp { ', num2str (i) , '} = [ ToolHelpInfo , '' ----------- '' 10 ' ,[ ToolName (1: end -2) ,' Help '], ' ];\ n\n ']) ; if exist ( ' ToolList ' ,' var ') ToolList = [ ToolList , ' ' '', ToolName (1: end -2) ,' ''']; else ToolList = [ ''' ', ToolName (1: end -2) ,'' '']; end if exist ( ' ToolListNoQuotes ',' var ') ToolListNoQuotes = [ ToolListNoQuotes , ' ', ToolName (1: end -2) ]; else ToolListNoQuotes = ToolName (1: end -2) ; end end fprintf ( fid ,[ ' handles . Current . DataToolsFilenames = { ' ' Data tools '' ', ToolList , ' };\ n ' ]) ; fprintf ( fid , ' handles . Current . DataToolHelp = ToolHelp ;\ n\n '); 71 clear ToolList 57 59 61 63 65 67 73 75 77 79 81 83 85 87 89 91 93 95 97 99 101 103 105 107 109 111 113 Modulesfilelist = dir ( ' Modules /*. m ') ; fprintf ( fid , ' %%%%%% MODULES HELP \n '); for i =1: length ( Modulesfilelist ) ToolName = Modulesfilelist (i). name ; fprintf ( fid ,[ ToolName (1: end -2) , ' Help = sprintf ([...\ n ']) ; body = char ( strread ( help ( Modulesfilelist (i). name ) ,'%s ',' delimiter ', '',' whitespace ',' ')); for j = 1: size ( body ,1) fixedtext = fixthistext ( body (j ,:) ); newtext = [ '' '', fixedtext , '\\ n '' ...\ n ']; fprintf ( fid , newtext ); end fprintf ( fid , ']) ;\ n\ n '); fprintf ( fid ,[ ' ToolHelp { ', num2str (i) ,'} = ' , ToolName (1: end -2) ,' Help ;\ n\n ']) ; if exist ( ' ToolList ',' var ') ToolList = [ ToolList , ' ' '', ToolName (1: end -2) ,' ''']; else ToolList = [ ''' ', ToolName (1: end -2) ,'' '']; end if exist ( ' ToolListNoQuotes ',' var ') ToolListNoQuotes = [ ToolListNoQuotes , ' ', ToolName (1: end -2) ]; else ToolListNoQuotes = ToolName (1: end -2) ; end end fprintf ( fid ,[ ' handles . Current . ModulesFilenames = { ', ToolList , ' };\ n ']) ; fprintf ( fid , ' handles . Current . ModulesHelp = ToolHelp ;\ n\n '); clear ToolList Helpfilelist = dir ( ' Help /*. m '); fprintf ( fid , ' %%%%%% HELP \n '); ToolCount =1; GSToolCount =1; for i =1: length ( Helpfilelist ) ToolName = Helpfilelist (i ). name ; if strncmp ( ToolName , 'GS ' ,2) fprintf ( fid ,[ ' GSToolHelp { ' , num2str ( GSToolCount ) , '} = sprintf ([...\ n ']) ; GSToolCount = GSToolCount +1; body = char ( strread ( help ( Helpfilelist (i ). name ) ,'%s ' ,' delimiter ','', ' whitespace ',' ')); for j = 1: size ( body ,1) fixedtext = strrep ( body (j ,:) ,'''' ,'''' ''); 42 115 117 119 121 123 125 127 129 131 133 135 137 139 141 143 145 147 149 151 153 155 157 159 161 163 165 167 169 171 173 Capitolo 4. Compilazione fixedtext = strrep ( fixedtext , '\ ', ' \\\\ '); fixedtext = strrep ( fixedtext , '% ', ' %%%% '); newtext = [ '' '', fixedtext , '\\ n '' ...\ n ']; fprintf ( fid , newtext ); end fprintf ( fid , ']) ;\ n\ n '); if exist ( ' GSToolList ',' var ') GSToolList = [ GSToolList , ' ''' , ToolName (1: end -2) ,''' ']; else GSToolList = [ '' '', ToolName (1: end -2) ,' ''']; end else fprintf ( fid ,[ ' ToolHelp { ', num2str ( ToolCount ) ,'} = sprintf ([...\ n ' ]) ; ToolCount = ToolCount +1; body = char ( strread ( help ( Helpfilelist (i ). name ) ,'%s ' ,' delimiter ','',' whitespace ',' ')); for j = 1: size ( body ,1) fixedtext = strrep ( body (j ,:) ,'''' ,'''' ''); fixedtext = strrep ( fixedtext , '\ ', ' \\\\ '); fixedtext = strrep ( fixedtext , '% ', ' %%%% '); newtext = [ '' '', fixedtext , '\\ n '' ...\ n ']; fprintf ( fid , newtext ); end fprintf ( fid , ']) ;\ n\ n '); if exist ( ' ToolList ' ,' var ') ToolList = [ ToolList , ' ' '', ToolName (1: end -2) ,' ''']; else ToolList = [ ''' ', ToolName (1: end -2) ,'' '']; end end end fprintf ( fid ,[ ' handles . Current . HelpFilenames = { ' ' Help '' ', ToolList , ' };\ n ']) ; fprintf ( fid , ' handles . Current . Help = ToolHelp ;\ n\n '); fprintf ( fid ,[ ' handles . Current . GSFilenames = { '' Help '' ', GSToolList , ' };\ n ']) ; fprintf ( fid , ' handles . Current . GS = GSToolHelp ;\ n\n ') ; clear ToolList Modulefilelist = dir ( ' Modules /*. m '); fprintf ( fid , ' %%%%%% load_listbox code ( replace function in CellProfiler .m )\n \n '); FileProcessingFiles ={}; PreProcessingFiles ={}; ObjectProcessingFiles ={}; MeasurementFiles ={}; FiltersFiles ={}; % %% v. 1.04684 OtherFiles ={}; for i =1: length ( Modulefilelist ) name = Modulefilelist (i). name ; name = name (1: end -2) ; if file_in_category ( Modulefilelist (i). name , ' File Processing ') FileProcessingFiles ( length ( FileProcessingFiles ) +1) = cellstr ( name ); elseif file_in_category ( Modulefilelist (i ). name , ' Image Processing ') PreProcessingFiles ( length ( PreProcessingFiles ) +1) = cellstr ( name ); elseif file_in_category ( Modulefilelist (i ). name , ' Object Processing ') ObjectProcessingFiles ( length ( ObjectProcessingFiles ) +1) = cellstr ( name ); elseif file_in_category ( Modulefilelist (i ). name , ' Measurement ') MeasurementFiles ( length ( MeasurementFiles ) +1) = cellstr ( name ); elseif file_in_category ( Modulefilelist (i ). name , ' Filters ')% %% v. 1.04684 FiltersFiles ( length ( FiltersFiles ) +1) = cellstr ( name );% %% v . 1.04684 else Capitolo 4. Compilazione 175 177 179 181 183 185 187 189 191 193 195 197 199 201 203 205 207 209 211 213 215 217 219 221 223 225 227 229 231 233 43 OtherFiles ( length ( OtherFiles ) +1) = cellstr ( name ); end % %% CODE TO WRITE TEXT FILES OF MODULES fid2 = fopen ( fullfile ( pwd , ' Modules ', Modulefilelist (i) . name ) ); fid3 = fopen ( fullfile ( pwd , ' Modules ' ,[ name , '. txt ']) ,'w '); while 1; output = fgetl ( fid2 ); if ~ ischar ( output ); break ; end ; if strncmp ( output , '% defaultVAR ' ,11) fprintf ( fid3 ,[ fixthistext2 ( output ) ,'\n ']) ; elseif strncmp ( output , '% choiceVAR ' ,10) fprintf ( fid3 ,[ fixthistext2 ( output ) ,'\n ']) ; elseif strncmp ( output , '% textVAR ' ,8) fprintf ( fid3 ,[ fixthistext2 ( output ) ,'\n ']) ; elseif strncmp ( output , '% pathnametextVAR ' ,16) fprintf ( fid3 ,[ fixthistext2 ( output ) ,'\n ']) ; elseif strncmp ( output , '% filenametextVAR ' ,16) fprintf ( fid3 ,[ fixthistext2 ( output ) ,'\n ']) ; elseif strncmp ( output , '% infotypeVAR ' ,12) fprintf ( fid3 ,[ fixthistext2 ( output ) ,'\n ']) ; elseif strncmp ( output , '% inputtypeVAR ' ,13) fprintf ( fid3 ,[ fixthistext2 ( output ) ,'\n ']) ; elseif strncmp ( output , ' %%% VariableRevisionNumber ' ,25) fprintf ( fid3 ,[ fixthistext2 ( output ) ,'\n ']) ; end end fclose ( fid2 ); fclose ( fid3 ); % %% END CODE TO WRITE TEXT FILES OF MODULES end fprintf ( fid , ' CategoryList = { '' File Processing ' ' '' Image Processing '' '' Object Processing '' ' ' Measurement '' ' ' Filters '' '' Other '' };\ n ') ; % %% v. 1.04684 fprintf ( fid , ' FileProcessingFiles = { '); for i =1: length ( FileProcessingFiles ) fprintf ( fid ,[ ' ''', FileProcessingFiles {i} , ' '' ']) ; end fprintf ( fid , ' };\ n '); fprintf ( fid , ' PreProcessingFiles = { '); for i =1: length ( PreProcessingFiles ) fprintf ( fid ,[ ' ''', PreProcessingFiles {i}, '' ' ']) ; end fprintf ( fid , ' };\ n '); fprintf ( fid , ' ObjectProcessingFiles = { ') ; for i =1: length ( ObjectProcessingFiles ) fprintf ( fid ,[ ' ''', ObjectProcessingFiles { i}, ''' ']) ; end fprintf ( fid , ' };\ n '); fprintf ( fid , ' MeasurementFiles = { ') ; for i =1: length ( MeasurementFiles ) fprintf ( fid ,[ ' ''', MeasurementFiles { i}, ''' ']) ; end fprintf ( fid , ' };\ n '); fprintf ( fid , ' FiltersFiles = { ');% %% v. 1.04684 for i =1: length ( FiltersFiles )% %% v. 1.04684 fprintf ( fid ,[ ' ''', FiltersFiles {i}, '' ' ']) ;% %% v. 1.04684 end % %% v. 1.04684 44 Capitolo 4. Compilazione fprintf ( fid , ' };\ n ') ;% %% v. 1.04684 235 237 239 241 243 245 247 249 251 253 255 257 259 261 fprintf ( fid , ' OtherFiles = { '); for i =1: length ( OtherFiles ) fprintf ( fid ,[ '' '', OtherFiles {i }, ''' ' ]) ; end fprintf ( fid , ' };\ n ') ; fprintf ( fid , ' set ( AddModuleWindowHandles . ModuleCategoryListBox , '' String '', CategoryList , '' Value ' ' ,[]) \n ') ; fprintf ( fid , ' set ( AddModuleWindowHandles . ModulesListBox , '' String ' ', FileProcessingFiles , ' ' Value '' ,[]) \n '); fprintf ( fid , ' AddModuleWindowHandles . ModuleStrings {1} = FileProcessingFiles ;\ n ') ; fprintf ( fid , ' AddModuleWindowHandles . ModuleStrings {2} = PreProcessingFiles ;\ n '); fprintf ( fid , ' AddModuleWindowHandles . ModuleStrings {3} = ObjectProcessingFiles ;\ n '); fprintf ( fid , ' AddModuleWindowHandles . ModuleStrings {4} = MeasurementFiles ;\ n ') ; fprintf ( fid , ' AddModuleWindowHandles . ModuleStrings {5} = FiltersFiles ;\ n '); % %% v. 1.04684 fprintf ( fid , ' AddModuleWindowHandles . ModuleStrings {6} = OtherFiles ;\ n '); fprintf ( fid , ' guidata ( AddModuleWindowHandles . AddModuleWindow , AddModuleWindowHandles ) ;\ n\n '); CPsubfunctionfilelist = dir ( ' CPsubfunctions /*. m '); for i =1: length ( CPsubfunctionfilelist ) ToolName = CPsubfunctionfilelist (i). name ; if exist ( ' ToolListNoQuotes ',' var ') ToolListNoQuotes = [ ToolListNoQuotes , ' ', ToolName (1: end -2) ]; else ToolListNoQuotes = ToolName (1: end -2) ; end end 263 fprintf ( fid , ' %%%%%% FUNCTIONS TO ADD ( place before first line of code in CellProfiler .m )\n '); fprintf ( fid ,[ ' %%# function ', ToolListNoQuotes ]) ; 265 fclose ( fid ); 269 % %%%%%%%%%%%%%%%%%%% % %% SUBFUNCTIONS %%% % %%%%%%%%%%%%%%%%%%% 271 function fixedtext = fixthistext ( text ) 267 273 275 fixedtext = strrep ( text , '''' ,'''' ''''''); fixedtext = strrep ( fixedtext , '\ ', ' \\\\ '); fixedtext = strrep ( fixedtext , '% ', ' %%%% '); 279 function c = file_in_category ( filename , category ) h = help ( filename ) ; c = strfind (h , [ ' Category : ' category ]) ; 281 function fixedtext = fixthistext2 ( text ) 277 283 285 fixedtext = strrep ( text , '''' ,'''' ''); fixedtext = strrep ( fixedtext , '\ ', '\\ '); fixedtext = strrep ( fixedtext , '% ', '%% '); Capitolo 4. Compilazione 287 289 45 % %%%%%%%%%%%%%%% % %%% END OF CODE %%%% % %%%%%%%%%%%%%%% Codice 4.1: CompileWizard.m 1a) Le modifiche apportate al file CompileWizard.m sono mostrate in Codice 4.2. Per le prime nove righe, solo la riga otto viene aggiunta. Codice 4.2: Modifica CompileWizard.m, ingrandimento prime nove righe 1 3 5 7 9 function CompileWizard % CompileWizard % This function , when run in the default CellProfiler path , will produce a % file with help information stored in variables to be used in the compiled % version of CellProfiler . fid = fopen ( ' CompileWizardText .m ' ,'w '); ToolList = []; % %% v. 1.04684 ImageToolfilelist = dir ( ' ImageTools /*. m '); 1b) Aggiunte dalla riga 158-172, dalla riga 204-248. Cercare nel codice: ’%%% v. 1.04684’. Queste modifiche servono per aggiungere la categoria ’Filters’ durante la compilazione. Quindi per eventuali nuove categorie è necessario operare in modo analogo. 2) Lanciare CompileWizard.m da matlab, accertandosi di avere settato correttamente il path di Matlab (vedi Figura 4.1), il quale deve essere la directory dove è contenuto il file CompileWizard.m. 3) Verrà creato nella stessa cartella il file: CompileWizardText.m Figura 4.1: Path Matlab - direttorio CellProfiler 4) Copiare da CompileWizardText.m (parte finale), da %%% FUNCTIONS TO ADD (place before first line of code in CellProfiler.m) fino alla fine, e incollare in CellProfiler.m dopo la revisione come in Codice 4.3. Nota bene: la parte %#function AddData. . . deve essere tutta sulla stessa linea. Capitolo 4. Compilazione 46 Codice 4.3: Prima modifica da CompileWizardText.m a CellProfiler.m 1 % $Revision : 4683 $ 3 % %% FUNCTIONS TO ADD ( place before first line of code in CellProfiler .m) 5 %# function AddData CalculateRatiosDataTool ClearData ConvertBatchFiles DataLayout ExportData ExportDatabase ExportLocations GenerateHistogramMovie ... e seguenti 5) Copiare dall’inzio di CompileWizardText.m fino a %%% load_listbox code (replace function in CellProfiler.m) e incollarlo in CellProfiler.m. Nota Bene: sovrascrivere dalla riga: Pathname = fullfile(handles.Current.CellProfilerPathname,'Modules');. Alla riga: guidata(hObject, handles); quest’ultima non compresa. 6) Copiare l’ultima parte rimasta %%% load_listbox code e cercare in CellProfiler.m: function load_listbox(dir_path,AddModuleWindowHandles) lasciando la dichiarazione della funzione cancellare fino a: guidata(AddModuleWindowHandles.AddModuleWindow,AddModuleWindowHandles); e sovrascrivere con la parte copiata. 7) Infine molto IMPORTANTE: commentare le righe. Come mostrato in Codice 4.4. Codice 4.4: Ultima modifica a CellProfiler.m 1 3 5 7 9 11 % % % % % clear GSListOfTools GSToolHelp IMAGE TOOL HELP AddDataHelp = sprintf ([ ' ']) ; ToolHelpInfo = ' Help information for individual image tools : '; ToolHelp {0}=[ ToolHelpInfo , '-----------' 10 AddDataHelp ]; handles . Current . ImageToolsFilenames = { ' Image tools ' }; %% NON COMMENTATA !!! % handles . Current . ImageToolHelp = ToolHelp ; % %% DATA TOOL HELP ToolHelpInfo = ' Help information for individual data tools : '; 8) Da Matlab lanciare il comando per la compilazione del file CellProfiler.m: mcc -m CellProfiler -v -R nojvm -I 'C:\Programmi\MATLAB71\CellProfiler\Modules' -I 'C:\Programmi\MATLAB71\CellProfiler\DataTools' -I 'C:\Programmi\MATLAB71\CellProfiler\ImageTools' -I 'C:\Programmi\MATLAB71\CellProfiler\CPsubfunctions' -a 'C:\Programmi\MATLAB71\CellProfiler\CPsubfunctions\CPsplash.jpg' Capitolo 4. Compilazione 47 I parametri indicano rispettivamente mcc è il comando Matlab che richiama il compilatore. -m l’opzione per generare un eseguibile stand alone. CellProfiler il nome del file da compilare. -v il comando per il ’verbose’. -I la directory da inserire nella compilazione. -a un singolo file da inserire nella compilazione. Capitolo 4. Compilazione 48 4.2 Compilazione di CellProfiler v. 1.04684 MAC Procedura di compilazione del software CellProfiler v. 1.04684 per MAC (iBook G4 - PowerPC). Software necessario: • Mac OS X 10.4.10 • Matlab R2007a (7.4.0.287) • Java VM version 1.5.0_07 Il processo di compilazione è identico a quello descritto nella sezione 4.1 dal punto 1 al punto 7. Al contrario, il comando di compilazione da Matlab, è: mcc -m CellProfiler.m -I ./CPsubfunctions/ -I ./DataTools/ -I ./Help/ -I ./Modules/ -a './CPsubfunctions/CPsplash.jpg' In fase di compilazione, Matlab potrebbe generare un errore causato da una vecchia versione di Xcode. Bisogna, quindi, scaricare dal sito della Apple l’ultima versione di Xcode. All’indirizzo http://developer.apple.com/tools/download/ si può scaricare l’Xcode 2.4.1 (DMG) previa autenticazione con le credenziali di ADC Member (la registrazione è gratuita). Capitolo 5 Utilizzo Un valido aiuto è possibile trovarlo a: http://www.cellprofiler.org/ install.htm. 5.1 Usare CP senza Matlab su PC Per usare CellProfiler senza Matlab (Con sistemi PC), bisogna possedere la versione compilata di CellProfiler. Tuttavia serve anche l’MCR installer (MatLab Component Runtime Installer). (Windows PC Binary Version 32-bit (you must also download and install MCRInstaller.exe) dal sito http://www.cellprofiler.org/download.htm). Questo componente è una raccolta di librerie Matlab pre-compilate. Senza di esso non potrebbe funzionare nessun programma compilato con al suo interno funzioni Matlab. Una volta scaricato il file MCRInstaller.exe (146 MB). Bisogna installarlo seguendo le istruzioni a video. Si otterrà infine una nuova cartella nella radice, ad esempio: C:\Programmi\MATLAB\MATLAB Component Runtime. 5.2 Usare CP senza Matlab su MAC Per poterlo eseguire serve come nel caso windows l’MCR (250 MB). L’MCR può essere recuperato dalle versioni compilate del CellProfiler scaricabili dal sito del progetto (Copiare tutta la cartella ’MCR’). La cartella ’MCR’ deve essere copiata nella cartella del CellProfiler modificato. Per eseguirlo bisogna lanciare da terminale il comando ./CellProfiler.command nella cartella opportuna. L’esecuzione da terminale è obbligatoria; infatti, lanciando direttamente il file CellProfiler.command, CellProfiler non rie- 50 Capitolo 5. Utilizzo sce a caricare correttamente il PATH e, quindi, non funziona correttamente. Il nostro CellProfiler è stato compilato su un iBook G4 (1.2 GHz PowerPC G4) - Mac OS X 10.4.10.