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.