0001 function [Kymo,ll1,f1mm,f2mm] = makeKymographC( data, disp_flag, CONST, which_channel )
0002 
0003 
0004 
0005 
0006 
0007 
0008 
0009 
0010 
0011 
0012 
0013 
0014 
0015 
0016 
0017 
0018 
0019 
0020 
0021 
0022 
0023 
0024 
0025 
0026 
0027 
0028 
0029 
0030 
0031 
0032 
0033 
0034 
0035 
0036 
0037 white_bg = 0; 
0038 Kymo = [];
0039 ll1=[];
0040 f1mm=[0,1];
0041 f2mm=[0,1];
0042 pixelsize = CONST.getLocusTracks.PixelSize;
0043 
0044 if isempty(pixelsize)
0045     pixelsize = 0.1;
0046 end
0047 
0048 
0049 if ~isfield(CONST.view, 'falseColorFlag' )
0050     CONST.view.falseColorFlag = false;
0051 end
0052 
0053 if ~exist( 'which_channel', 'var' ) || isempty(which_channel)
0054     which_channel = [1,1,1];
0055 end
0056 
0057 if ~isfield(CONST.view, 'filtered' )
0058     CONST.view.filtered = true;
0059 end
0060 
0061 filt_channel =  CONST.view.filtered ;
0062 
0063 
0064 
0065 persistent colormap_;
0066 if isempty( colormap_ )
0067     colormap_ = colormap( 'jet' );
0068     
0069 end
0070 
0071 if nargin < 2
0072     disp_flag = 0;
0073 end
0074 
0075 num_im = numel(data.CellA);
0076 
0077 ss = [0,0];
0078 ll = [0,0];
0079 
0080 
0081 
0082 for ii = 1:num_im
0083     ss_tmp = size(data.CellA{ii}.phase);
0084     
0085     ss(1) = max([ss(1),ss_tmp(1)]);
0086     ss(2) = max([ss(2),ss_tmp(2)]);
0087     
0088     ll_tmp = data.CellA{ii}.length;
0089     
0090     ll(1) = max([ll(1),ll_tmp(1)]);
0091     ll(2) = max([ll(2),ll_tmp(2)]);
0092 end
0093 
0094 ss = ss + [5,5];
0095 
0096 [XX,YY] = meshgrid( 1:ss(2), 1:ss(1) );
0097 ll0 = ll;
0098 ll = ceil(ll/2);
0099 
0100 ll1 = [-ll(1):ll(1)];
0101 ll2 = [-ll(2):ll(2)];
0102 
0103 [LL1,LL2] = meshgrid( ll1,ll2 );
0104 
0105 nn = numel( ll1 );
0106 
0107 kymoR = zeros(nn,num_im);
0108 kymoG = zeros(nn,num_im);
0109 kymoB = zeros(nn,num_im);
0110 
0111 
0112 for ii = 1:num_im
0113     
0114     mask  = data.CellA{ii}.mask;
0115     
0116     if isfield( data.CellA{ii}, 'fluor1') && which_channel(1)
0117         if filt_channel && isfield( data.CellA{ii},'fluor1_filtered')
0118             fluor1 =data.CellA{ii}.fluor1_filtered;
0119         else
0120             fluor1  = data.CellA{ii}.fluor1;
0121             if isfield( data.CellA{ii}, 'fl1' ) && isfield( data.CellA{ii}.fl1, 'bg' )
0122                 fluor1 = fluor1 - data.CellA{ii}.fl1.bg;
0123                 fluor1(fluor1<0) = 0;
0124             else
0125                 fluor1 = fluor1 - mean( fluor1(mask));
0126                 fluor1(fluor1<0) = 0;
0127             end
0128         end
0129     else
0130         fluor1 = 0*mask;
0131     end
0132     
0133     if isfield( data.CellA{ii}, 'fluor2') && which_channel(2)
0134         if filt_channel && isfield( data.CellA{ii}, 'fluor2_filtered' )
0135             fluor2 = data.CellA{ii}.fluor2_filtered;
0136         else
0137             fluor2 = data.CellA{ii}.fluor2;
0138             if isfield( data.CellA{ii}, 'fl12' ) && ...
0139                     isfield( data.CellA{ii}.fl2, 'bg' )
0140                 fluor2 = fluor2 - data.CellA{ii}.fl2.bg;
0141                 fluor2(fluor1<0) = 0;
0142             else
0143                 fluor2 = fluor2 - mean( fluor2(mask));
0144                 fluor2(fluor2<0) = 0;
0145             end
0146         end
0147     else
0148         fluor2 = 0*data.CellA{ii}.mask;
0149     end
0150     
0151     mask  = data.CellA{ii}.mask;
0152     
0153     
0154     [rChan,~] = (fixIm(double((fluor2)).*double(mask),ss));
0155     [gChan,~] = (fixIm(double((fluor1)).*double(mask),ss));
0156     [bChan,roffset] = fixIm(mask,ss);
0157     
0158     ro = data.CellA{ii}.r_offset;
0159     r = data.CellA{ii}.r;
0160     
0161     e1 = data.CellA{ii}.coord.e1;
0162     e2 = data.CellA{ii}.coord.e2;
0163     
0164     LL1x =  LL1*e1(1)+LL2*e2(1)+r(1)-ro(1)+1+roffset(1);
0165     LL2y =  LL1*e1(2)+LL2*e2(2)+r(2)-ro(2)+1+roffset(2);
0166     
0167     rChanp = (interp2(XX,YY,double(rChan),LL1x,LL2y));
0168     gChanp = (interp2(XX,YY,double(gChan),LL1x,LL2y));
0169     bChanp = (interp2(XX,YY,double(bChan),LL1x,LL2y));
0170     
0171     rChanps = sum( double(rChanp) );
0172     gChanps = sum( double(gChanp) );
0173     bChanps = sum( double(bChanp) );
0174     
0175     kymoR(:,ii) = rChanps';
0176     kymoG(:,ii) = gChanps';
0177     kymoB(:,ii) = bChanps';
0178 end
0179 
0180 Kymo = [];
0181 
0182 if ~isfield(data.CellA{1}, 'pole');
0183     data.CellA{1}.pole.op_ori = 1;
0184 end
0185 
0186 
0187 if data.CellA{1}.pole.op_ori < 0 
0188     Kymo.g = kymoG(end:-1:1,:);
0189     Kymo.b = kymoB(end:-1:1,:);
0190     Kymo.b(isnan(Kymo.b)) = 0;
0191     Kymo.r = kymoR(end:-1:1,:);
0192 else
0193     Kymo.g = kymoG;
0194     Kymo.b = kymoB;
0195     Kymo.b(isnan(Kymo.b)) = 0;
0196     Kymo.r = kymoR;
0197 end
0198 
0199 f1mm(1) = min(Kymo.g(logical(Kymo.b)));
0200 f1mm(2) = max(Kymo.g(logical(Kymo.b)));
0201 f2mm(1) = min(Kymo.r(logical(Kymo.b)));
0202 f2mm(2) = max(Kymo.r(logical(Kymo.b)));
0203 
0204 
0205     if CONST.view.falseColorFlag
0206         
0207         backer3 = double(cat(3, Kymo.b, Kymo.b, Kymo.b)>1);
0208         im = doColorMap( ag(Kymo.g,f1mm(1), f1mm(2)), colormap_ );
0209         imm =  im.*backer3+.6*(1-backer3);
0210     elseif white_bg     
0211         
0212         sq = [1 1 1 ; 1 1 1 ; 1 1 1];
0213         backer = (ag(~Kymo.b));
0214         outline = imdilate(backer,sq) - backer;
0215         imm = cat(3, (ag(Kymo.r))+backer+0.2*outline, ...
0216             (ag(Kymo.g))+backer+0.2*outline,...
0217             backer+0.6*outline);        
0218     else
0219         
0220         backer = (ag(Kymo.b));
0221         backer = 0.3*(max(backer(:))-backer);
0222         imm = cat(3, (ag(Kymo.r))+backer, ...
0223             (ag(Kymo.g))+backer,...
0224             backer);       
0225     end
0226     
0227     if disp_flag
0228         figure (2);
0229         clf;
0230         imagesc(1:num_im,pixelsize*ll1, imm);
0231     end
0232 
0233 end
0234 
0235 function [imFix,roffset] = fixIm(im, ss)
0236 
0237 ssOld = size(im);
0238 imFix = zeros(ss);
0239 
0240 offset = floor((ss-ssOld)/2)-[1,1];
0241 if offset(1)<0
0242     offset(1) = offset(1) + 1;
0243 end
0244 if offset(2)<0
0245     offset(2) = offset(2) + 1;
0246 end
0247 
0248 try
0249     imFix(offset(1)+(1:ssOld(1)),offset(2)+(1:ssOld(2))) = im;
0250 catch ME
0251     printError(ME);
0252 end
0253 roffset = offset(2:-1:1);
0254 end
0255 
0256