FRETImageProcess2クラスを用いたtimelapse FRET imageの解析例
FRETImageProcess2クラスを用いて各細胞のintensityを出力し、
Ratio計算、グラフ描画、データ保存を行う。
(高速化のため並列処理(parfor文)を使っている。使用するPCのスペックにあわせてmatlabpool関数で設定する必要がある。)
解像度が高すぎたり、蛍光が明るすぎると解析精度が落ちるため、画像を調整する必要がある。
例えば、segmatrix = FRETImageProcess2.Segmentation(Nucleusimage * 0.1);
の行では核画像の明るさを下げてセグメンテーションの関数に渡している。
解像度が低すぎたり、暗すぎたりする場合は解析での調整は難しいので撮影条件を変えるのが望ましい。
以下ソースコード
% --------実験内容-------------------------------------------------
% 20120411
% EGF刺激および種々の阻害剤添加による、ERK, S6K, Ras活性の計測
% 実験概要:Italian HeLa のFRETバイオセンサー発現株を3種類混合し、
% 4well dishに播種。12時間以上starveしたのち、阻害剤およびEGFを加えて
% タイムラプスFRETイメージングを行った。
% 実験で用いたバイオセンサーの組は
% nes -> S6K, nls -> ERK, caax -> Ras
% 撮影条件
% 顕微鏡:ZDC4
% 倍率・CCD binning: 20x dry / bin:4
% チャネル: FRET 300 ms, CFP: 300 ms, RFP_dichro1: 600 ms
% CCD gain: 2 (FRET, CFP, RFP-dichro1)
% LED intensity: 440 nm: 30%, 585 nm: 100%
% 撮影時間・間隔: 1分ごとに、50分間撮影
% タイムポイント11(10分後)でEGF (50 ng/mL)を添加し、タイムポイント31(30分後)で阻害剤を添加した。加えた阻害剤は以下の通り
% Well 1: DMSO (0.1%)
% Well 2: PI-103 (10 uM) (PI3K阻害剤)
% Well 3: U73122 (10 uM) (PLC阻害剤)
% Well 4: KT5720 (2 uM) (PKA阻害剤)
% 撮影終了後DyeCycleRubyを加えて20分後に再度イメージング。
% DyeCycleRuby染色後のデータは、
% \EGF-Inhibitors_+DCR_2.nd
% \Inhibitors-EGF_+DCR_1.nd
% のRFP-dichlo1チャネルを参照のこと。なお、このデータはタイムラプスの時間を
% 1分間にして1分間隔で撮影している
% (データの形式としてはタイムラプス撮影だが、実際は1点撮り)。
% -------------------------------------------------------------
clear all;
% 並列処理のためのmatlabpoolを開く
if matlabpool('size') == 0
matlabpool(4);
end
% イメージングファイル情報
directory = '*********\120411_time-lapse';
filename_nuc = 'EGF-Inhibitors_+DCR_1';
filename_FRET = 'EGF-Inhibitors_1_2';
stimulation_timepoint = 11;
% FRETImageProcess2オブジェクト生成
FIP = FRETImageProcess2;
% イメージングファイル読み込み
% 核画像
info_nuc = FIP.ReadNDFile(directory, filename_nuc);
% RFP-dichro1はwavenameがRFP_dichro1でファイル名がRFP-dichro1なので修正
for i = 1:info_nuc.wavelengths
if strcmp(info_nuc.wavename{i}, 'RFP_dichro1')
info_nuc.wavename{i} = 'RFP-dichro1';
end
end
[images_nuc time_array_nuc] = FIP.ReadTiffFile(info_nuc);
% FRET画像
info_FRET = FIP.ReadNDFile(directory, filename_FRET);
[images_FRET time_array_FRET] = FIP.ReadTiffFile(info_FRET);
% 解析結果格納用セル配列
% 細胞認識
Segmentation_array = cell(1,info_FRET.positions);
CellSort_array = cell(1,info_FRET.positions);
% intensity
NLS_FRETintensity_array = cell(1,info_FRET.positions);
NES_FRETintensity_array = cell(1,info_FRET.positions);
CAAX_FRETintensity_array = cell(1,info_FRET.positions);
NLS_CFPintensity_array = cell(1,info_FRET.positions);
NES_CFPintensity_array = cell(1,info_FRET.positions);
CAAX_CFPintensity_array = cell(1,info_FRET.positions);
% ratio
NLS_ratio_array = cell(1,info_FRET.positions);
NES_ratio_array = cell(1,info_FRET.positions);
CAAX_ratio_array = cell(1,info_FRET.positions);
NLS_n_ratio_array = cell(1,info_FRET.positions);
NES_n_ratio_array = cell(1,info_FRET.positions);
CAAX_n_ratio_array = cell(1,info_FRET.positions);
% backgroundをひいた画像を格納する配列(zeros(height,width,timepoint)のサイズの行列を格納)
BG_FRET_images_cellarray = cell(1, info_FRET.positions);
BG_CFP_images_cellarray = cell(1, info_FRET.positions);
% elapsed timeを格納するセル配列
timecourse_array = cell(1, info_FRET.positions);
%%
% 各positionについて解析
parfor position = 1:info_FRET.positions
% 細胞判別のための画像読み込み
FRETimage = FRETImageProcess2.GetImage(info_FRET, images_FRET, info_FRET.timepoints, position, 'FRET');
Nucleusimage = FRETImageProcess2.GetImage(info_nuc, images_nuc, 1, position, 'RFP-dichro1');
FRETimage = FRETimage - FRETImageProcess2.FigureBackground(FRETimage);
Nucleusimage = Nucleusimage - FRETImageProcess2.FigureBackground(Nucleusimage);
% 核画像のセグメンテーション
segmatrix = FRETImageProcess2.Segmentation(Nucleusimage * 0.1); %* 0.625
% figure, imshow(label2rgb(segmatrix,'jet')); % 結果表示 parfor内ではimshowが使えない?
% 細胞判別
sortarray = FRETImageProcess2.SortNLSNESCAAX(FRETimage, segmatrix, 240,120);
% sortimg = segmatrix;
% for i = 2:length(sortarray)
% sortimg(sortimg==i) = sortarray(i); % NLS,NES,CAAX,判定不可で色分け
% end
% figure, imshow(label2rgb(sortimg,'jet','w','shuffle')); % 結果表示 parfor内ではimshowが使えない?
% FRET ratio出力領域設定
regionforoutput = FRETImageProcess2.RegionForOutput(info_FRET, images_FRET, position, 'FRET', segmatrix, sortarray);
% ノイズや誤判別を除去
sortarray = FRETImageProcess2.ModifySortArray(info_FRET, images_FRET, position, 'FRET', segmatrix, sortarray, regionforoutput);
% intensityを格納する行列作成
numofNLS = sum(sortarray == 2);
numofNES = sum(sortarray == 3);
numofCAAX = sum(sortarray == 4);
NLS_FRET_intensities = zeros(numofNLS, info_FRET.timepoints);
NLS_CFP_intensities = zeros(numofNLS, info_FRET.timepoints);
NES_FRET_intensities = zeros(numofNES, info_FRET.timepoints);
NES_CFP_intensities = zeros(numofNES, info_FRET.timepoints);
CAAX_FRET_intensities = zeros(numofCAAX, info_FRET.timepoints);
CAAX_CFP_intensities = zeros(numofCAAX, info_FRET.timepoints);
% Background intensityを求める(1st timepointでのbackgroundをすべてのtimepointでのbackgroundとする)
FRETimage = FRETImageProcess2.GetImage(info_FRET, images_FRET, 1, position, 'FRET');
CFPimage = FRETImageProcess2.GetImage(info_FRET, images_FRET, 1, position, 'CFP');
FRET_background = FRETImageProcess2.FigureBackground(FRETimage);
CFP_background = FRETImageProcess2.FigureBackground(CFPimage);
% backgroundを引いた画像を格納する行列
FRET_image_array = zeros(size(FRETimage, 1), size(FRETimage, 2), info_FRET.timepoints, 'uint16');
CFP_image_array = zeros(size(FRETimage, 1), size(FRETimage, 2), info_FRET.timepoints, 'uint16');
% elapsed timeを格納する行列作成
timecourse_temp = zeros(1, info_FRET.timepoints);
starttime = FRETImageProcess2.GetTimeOfImage(info_FRET, time_array_FRET, 1, position, 'FRET');
% 各timepointにおける各細胞のintensityを取得、backgroundを引いた画像を格納
for timepoint = 1:info_FRET.timepoints
% 各timepointにおける画像の読み込み、background引く
FRETimage = FRETImageProcess2.GetImage(info_FRET, images_FRET, timepoint, position, 'FRET');
FRETimage = FRETimage - FRET_background;
CFPimage = FRETImageProcess2.GetImage(info_FRET, images_FRET, timepoint, position, 'CFP');
CFPimage = CFPimage - CFP_background;
% 画像を格納
FRET_image_array(:,:,timepoint) = FRETimage;
CFP_image_array(:,:,timepoint) = CFPimage;
% 各細胞のintensity取得
NLS_FRET_intensities(:,timepoint) = FRETImageProcess2.OutputNLSIntensity(FRETimage, regionforoutput, sortarray);
NLS_CFP_intensities(:,timepoint) = FRETImageProcess2.OutputNLSIntensity(CFPimage, regionforoutput, sortarray);
NES_FRET_intensities(:,timepoint) = FRETImageProcess2.OutputNESIntensity(FRETimage, regionforoutput, sortarray);
NES_CFP_intensities(:,timepoint) = FRETImageProcess2.OutputNESIntensity(CFPimage, regionforoutput, sortarray);
CAAX_FRET_intensities(:,timepoint) = FRETImageProcess2.OutputCAAXIntensity(FRETimage, regionforoutput, sortarray);
CAAX_CFP_intensities(:,timepoint) = FRETImageProcess2.OutputCAAXIntensity(CFPimage, regionforoutput, sortarray);
% イメージング開始からの時間の取得
timecourse_temp(timepoint) = FRETImageProcess2.GetTimeOfImage(info_FRET, time_array_FRET, timepoint, position, 'FRET') - starttime;
end
% backgroundを引いた画像をセル配列に格納
BG_FRET_images_cellarray{position} = FRET_image_array;
BG_CFP_images_cellarray{position} = CFP_image_array;
% Ratioを計算
NLS_Ratios = NLS_FRET_intensities ./ NLS_CFP_intensities;
NES_Ratios = NES_FRET_intensities ./ NES_CFP_intensities;
CAAX_Ratios = CAAX_FRET_intensities ./ CAAX_CFP_intensities;
% normarized ratioを計算
NLS_basalRatios = mean(NLS_Ratios(:,1:stimulation_timepoint), 2); % basal ratioを計算(n行1列)
NLS_basalRatios = repmat(NLS_basalRatios, 1, size(NLS_Ratios,2)); % 列をコピー(n行m列)
NLS_nRatios = NLS_Ratios ./ NLS_basalRatios;
NES_basalRatios = mean(NES_Ratios(:,1:stimulation_timepoint), 2); % basal ratioを計算(n行1列)
NES_basalRatios = repmat(NES_basalRatios, 1, size(NES_Ratios,2)); % 列をコピー(n行m列)
NES_nRatios = NES_Ratios ./ NES_basalRatios;
CAAX_basalRatios = mean(CAAX_Ratios(:,1:stimulation_timepoint), 2); % basal ratioを計算(n行1列)
CAAX_basalRatios = repmat(CAAX_basalRatios, 1, size(CAAX_Ratios,2)); % 列をコピー(n行m列)
CAAX_nRatios = CAAX_Ratios ./ CAAX_basalRatios;
% Average Ratio / nRatioを計算
NLS_average_Ratio = mean(NLS_Ratios, 1);
NLS_average_nRatio = mean(NLS_nRatios, 1);
NES_average_Ratio = mean(NES_Ratios, 1);
NES_average_nRatio = mean(NES_nRatios, 1);
CAAX_average_Ratio = mean(CAAX_Ratios, 1);
CAAX_average_nRatio = mean(CAAX_nRatios, 1);
% セル配列に格納
Segmentation_array{position} = segmatrix;
CellSort_array{position} = sortarray;
NLS_FRETintensity_array{position} = NLS_FRET_intensities;
NES_FRETintensity_array{position} = NES_FRET_intensities;
CAAX_FRETintensity_array{position} = CAAX_FRET_intensities;
NLS_CFPintensity_array{position} = NLS_CFP_intensities;
NES_CFPintensity_array{position} = NES_CFP_intensities;
CAAX_CFPintensity_array{position} = CAAX_CFP_intensities;
NLS_ratio_array{position} = NLS_Ratios;
NES_ratio_array{position} = NES_Ratios;
CAAX_ratio_array{position} = CAAX_Ratios;
NLS_n_ratio_array{position} = NLS_nRatios;
NES_n_ratio_array{position} = NES_nRatios;
CAAX_n_ratio_array{position} = CAAX_nRatios;
timecourse_array{position} = timecourse_temp;
end
% 解析結果を統合
% 何分割するか
div_count = 4;
for i = 1:div_count
NLS_Ratios = [];
NES_Ratios = [];
CAAX_Ratios = [];
NLS_nRatios = [];
NES_nRatios = [];
CAAX_nRatios = [];
for pos = 1 + info_FRET.positions * (i-1) / div_count : info_FRET.positions * i / div_count
NLS_Ratios = [NLS_Ratios ; NLS_ratio_array{pos}];
NES_Ratios = [NES_Ratios ; NES_ratio_array{pos}];
CAAX_Ratios = [CAAX_Ratios ; CAAX_ratio_array{pos}];
NLS_nRatios = [NLS_nRatios ; NLS_n_ratio_array{pos}];
NES_nRatios = [NES_nRatios ; NES_n_ratio_array{pos}];
CAAX_nRatios = [CAAX_nRatios ; CAAX_n_ratio_array{pos}];
end
% Average Ratio / nRatioを計算
NLS_average_Ratio = mean(NLS_Ratios, 1);
NLS_average_nRatio = mean(NLS_nRatios, 1);
NES_average_Ratio = mean(NES_Ratios, 1);
NES_average_nRatio = mean(NES_nRatios, 1);
CAAX_average_Ratio = mean(CAAX_Ratios, 1);
CAAX_average_nRatio = mean(CAAX_nRatios, 1);
% timecourse取得
timecourse = timecourse_array{1 + info_FRET.positions * (i-1) / div_count};
% timecourseを秒から分に変換
timecourse = timecourse / 60;
% グラフ描画
H = figure;
set(H, 'Position', [1,1,600,700]); % left bottom width height left bottomは画面における位置
set(H, 'PaperPosition', [1,2,16,20]); % センチ単位 left bottom width height
% 説明描画
% Well 1: DMSO (0.1%)
% Well 2: PI-103 (10 uM) (PI3K阻害剤)
% Well 3: U73122 (10 uM) (PLC阻害剤)
% Well 4: KT5720 (2 uM) (PKA阻害剤)
date_description = '[12/4/11]';
switch i
case 1
description = '10 min EGF (50 ng/mL) 30 min DMSO (0.1%)';
case 2
description = '10 min EGF (50 ng/mL) 30 min PI-103 (10 uM) (PI3K阻害剤) ';
case 3
description = '10 min EGF (50 ng/mL) 30 min U73122 (10 uM) (PLC阻害剤) ';
case 4
description = '10 min EGF (50 ng/mL) 30 min KT5720 (2 uM) (PKA阻害剤) ';
end
annotation(H,'textbox',...
[0 0.96 1 0.04],...
'String',{[date_description ' ' description]},...
'HorizontalAlignment','center',...
'FontSize',12,...
'LineStyle','none',...
'FitBoxToText','off');
subplot(3,2,1);
hold on
if size(NLS_Ratios,1) > 0
H = plot(timecourse, NLS_Ratios(:,:));
set(H,'LineWidth',1,'Color',[0 0 1]);
H = plot(timecourse, NLS_average_Ratio);
set(H,'LineWidth',2,'Color',[1 0 0]);
end
xlim([0 max(timecourse)]);
axis_range = ylim;
ylim([axis_range(1)-0.05 , axis_range(2)+0.05]);
xlabel('minutes','FontSize',12);
ylabel('Emission Ratio','FontSize',12);
title({'EKAR'},'FontSize',12);
hold off
subplot(3,2,2);
hold on
if size(NLS_nRatios,1) > 0
H = plot(timecourse, NLS_nRatios(:,:));
set(H,'LineWidth',1,'Color',[0 0 1]);
H = plot(timecourse, NLS_average_nRatio);
set(H,'LineWidth',2,'Color',[1 0 0]);
end
xlim([0 max(timecourse)]);
axis_range = ylim;
ylim([axis_range(1)-0.05 , axis_range(2)+0.05]);
xlabel('minutes','FontSize',12);
ylabel('Standard Emission Ratio','FontSize',12);
title({'EKAR'},'FontSize',12);
hold off
subplot(3,2,3);
hold on
if size(NES_Ratios,1) > 0
H = plot(timecourse, NES_Ratios(:,:));
set(H,'LineWidth',1,'Color',[0 0 1]);
H = plot(timecourse, NES_average_Ratio);
set(H,'LineWidth',2,'Color',[1 0 0]);
end
xlim([0 max(timecourse)]);
axis_range = ylim;
ylim([axis_range(1)-0.05 , axis_range(2)+0.05]);
xlabel('minutes','FontSize',12);
ylabel('Emission Ratio','FontSize',12);
title({'S6K'},'FontSize',12);
hold off
subplot(3,2,4);
hold on
if size(NES_nRatios,1) > 0
H = plot(timecourse, NES_nRatios(:,:));
set(H,'LineWidth',1,'Color',[0 0 1]);
H = plot(timecourse, NES_average_nRatio);
set(H,'LineWidth',2,'Color',[1 0 0]);
end
xlim([0 max(timecourse)]);
axis_range = ylim;
ylim([axis_range(1)-0.05 , axis_range(2)+0.05]);
xlabel('minutes','FontSize',12);
ylabel('Standard Emission Ratio','FontSize',12);
title({'S6K'},'FontSize',12);
hold off
subplot(3,2,5);
hold on
if size(CAAX_Ratios,1) > 0
H = plot(timecourse, CAAX_Ratios(:,:));
set(H,'LineWidth',1,'Color',[0 0 1]);
H = plot(timecourse, CAAX_average_Ratio);
set(H,'LineWidth',2,'Color',[1 0 0]);
end
xlim([0 max(timecourse)]);
axis_range = ylim;
ylim([axis_range(1)-0.05 , axis_range(2)+0.05]);
xlabel('minutes','FontSize',12);
ylabel('Emission Ratio','FontSize',12);
title({'Ras'},'FontSize',12);
hold off
subplot(3,2,6);
hold on
if size(CAAX_nRatios,1) > 0
H = plot(timecourse, CAAX_nRatios(:,:));
set(H,'LineWidth',1,'Color',[0 0 1]);
H = plot(timecourse, CAAX_average_nRatio);
set(H,'LineWidth',2,'Color',[1 0 0]);
end
xlim([0 max(timecourse)]);
axis_range = ylim;
ylim([axis_range(1)-0.05 , axis_range(2)+0.05]);
xlabel('minutes','FontSize',12);
ylabel('Standard Emission Ratio','FontSize',12);
title({'Ras'},'FontSize',12);
hold off
end
% データを保存
archive_info_FRET = info_FRET;
archive_info_nuc = info_nuc;
archive_Segmentation = Segmentation_array;
archive_CellSort = CellSort_array;
archive_NLS_FRETintensity = NLS_FRETintensity_array;
archive_NES_FRETintensity = NES_FRETintensity_array;
archive_CAAX_FRETintensity = CAAX_FRETintensity_array;
archive_NLS_CFPintensity = NLS_CFPintensity_array;
archive_NES_CFPintensity = NES_CFPintensity_array;
archive_CAAX_CFPintensity = CAAX_CFPintensity_array;
archive_NLS_ratio = NLS_ratio_array;
archive_NES_ratio = NES_ratio_array;
archive_CAAX_ratio = CAAX_ratio_array;
archive_NLS_n_ratio = NLS_n_ratio_array;
archive_NES_n_ratio = NES_n_ratio_array;
archive_CAAX_n_ratio = CAAX_n_ratio_array;
archive_timecourse = timecourse_array;
[FileName,PathName,FilterIndex] = uiputfile('data120411_1_ERKS6KRas.mat', 'Save Data As');
if FileName ~= 0
save(FileName, '-regexp', 'archive_');
end