spm_preproc.m 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570
  1. function results = spm_preproc(varargin)
  2. % Combined Segmentation and Spatial Normalisation
  3. %
  4. % FORMAT results = spm_preproc(V,opts)
  5. % V - image to work with
  6. % opts - options
  7. % opts.tpm - n tissue probability images for each class
  8. % opts.ngaus - number of Gaussians per class (n+1 classes)
  9. % opts.warpreg - warping regularisation
  10. % opts.warpco - cutoff distance for DCT basis functions
  11. % opts.biasreg - regularisation for bias correction
  12. % opts.biasfwhm - FWHM of Gausian form for bias regularisation
  13. % opts.regtype - regularisation for affine part
  14. % opts.fudge - a fudge factor
  15. % opts.msk - unused
  16. %__________________________________________________________________________
  17. % Copyright (C) 2005-2011 Wellcome Trust Centre for Neuroimaging
  18. % John Ashburner
  19. % $Id: spm_preproc.m 4916 2012-09-11 19:15:53Z guillaume $
  20. SVNid = '$Rev: 4916 $';
  21. if ~isdeployed, addpath(fullfile(spm('Dir'),'toolbox','OldSeg')); end
  22. if ~isdeployed, addpath(fullfile(spm('Dir'),'toolbox','OldNorm')); end
  23. %-Say hello
  24. %--------------------------------------------------------------------------
  25. SPMid = spm('FnBanner',mfilename,SVNid);
  26. %-Parameters & Arguments
  27. %--------------------------------------------------------------------------
  28. opts0 = spm_get_defaults('old.preproc');
  29. opts0 = rmfield(opts0,'output');
  30. opts0.tpm = char(opts0.tpm); % In defaults, tpms are stored as cellstr
  31. opts0.msk = '';
  32. if ~nargin
  33. V = spm_select(1,'image');
  34. else
  35. V = varargin{1};
  36. end
  37. if ischar(V), V = spm_vol(V); end
  38. if nargin < 2
  39. opts = opts0;
  40. else
  41. opts = varargin{2};
  42. fnms = fieldnames(opts0);
  43. for i=1:length(fnms)
  44. if ~isfield(opts,fnms{i}), opts.(fnms{i}) = opts0.(fnms{i}); end
  45. end
  46. end
  47. if length(opts.ngaus) ~= size(opts.tpm,1)+1
  48. error('Number of Gaussians per class is not compatible with number of classes');
  49. end
  50. K = sum(opts.ngaus);
  51. Kb = length(opts.ngaus);
  52. lkp = [];
  53. for k=1:Kb
  54. lkp = [lkp ones(1,opts.ngaus(k))*k];
  55. end
  56. B = spm_vol(opts.tpm);
  57. b0 = spm_load_priors(B);
  58. d = V(1).dim(1:3);
  59. vx = sqrt(sum(V(1).mat(1:3,1:3).^2));
  60. sk = max([1 1 1],round(opts.samp*[1 1 1]./vx));
  61. [x0,y0,o] = ndgrid(1:sk(1):d(1),1:sk(2):d(2),1);
  62. z0 = 1:sk(3):d(3);
  63. tiny = eps;
  64. vx = sqrt(sum(V(1).mat(1:3,1:3).^2));
  65. kron = inline('spm_krutil(a,b)','a','b');
  66. % BENDING ENERGY REGULARIZATION for warping
  67. %-----------------------------------------------------------------------
  68. lam = 0.001;
  69. d2 = max(round((V(1).dim(1:3).*vx)/opts.warpco),[1 1 1]);
  70. kx = (pi*((1:d2(1))'-1)/d(1)/vx(1)).^2;
  71. ky = (pi*((1:d2(2))'-1)/d(2)/vx(2)).^2;
  72. kz = (pi*((1:d2(3))'-1)/d(3)/vx(3)).^2;
  73. Cwarp = (1*kron(kz.^2,kron(ky.^0,kx.^0)) +...
  74. 1*kron(kz.^0,kron(ky.^2,kx.^0)) +...
  75. 1*kron(kz.^0,kron(ky.^0,kx.^2)) +...
  76. 2*kron(kz.^1,kron(ky.^1,kx.^0)) +...
  77. 2*kron(kz.^1,kron(ky.^0,kx.^1)) +...
  78. 2*kron(kz.^0,kron(ky.^1,kx.^1)) );
  79. Cwarp = Cwarp*opts.warpreg;
  80. Cwarp = [Cwarp*vx(1)^4 ; Cwarp*vx(2)^4 ; Cwarp*vx(3)^4];
  81. Cwarp = sparse(1:length(Cwarp),1:length(Cwarp),Cwarp,length(Cwarp),length(Cwarp));
  82. B3warp = spm_dctmtx(d(3),d2(3),z0);
  83. B2warp = spm_dctmtx(d(2),d2(2),y0(1,:)');
  84. B1warp = spm_dctmtx(d(1),d2(1),x0(:,1));
  85. lmR = speye(size(Cwarp));
  86. Twarp = zeros([d2 3]);
  87. % GAUSSIAN REGULARISATION for bias correction
  88. %--------------------------------------------------------------------------
  89. fwhm = opts.biasfwhm;
  90. sd = vx(1)*V(1).dim(1)/fwhm; d3(1) = ceil(sd*2); krn_x = exp(-(0:(d3(1)-1)).^2/sd.^2)/sqrt(vx(1));
  91. sd = vx(2)*V(1).dim(2)/fwhm; d3(2) = ceil(sd*2); krn_y = exp(-(0:(d3(2)-1)).^2/sd.^2)/sqrt(vx(2));
  92. sd = vx(3)*V(1).dim(3)/fwhm; d3(3) = ceil(sd*2); krn_z = exp(-(0:(d3(3)-1)).^2/sd.^2)/sqrt(vx(3));
  93. Cbias = kron(krn_z,kron(krn_y,krn_x)).^(-2)*opts.biasreg;
  94. Cbias = sparse(1:length(Cbias),1:length(Cbias),Cbias,length(Cbias),length(Cbias));
  95. B3bias = spm_dctmtx(d(3),d3(3),z0);
  96. B2bias = spm_dctmtx(d(2),d3(2),y0(1,:)');
  97. B1bias = spm_dctmtx(d(1),d3(1),x0(:,1));
  98. lmRb = speye(size(Cbias));
  99. Tbias = zeros(d3);
  100. % Fudge Factor - to (approximately) account for non-independence of voxels
  101. ff = opts.fudge;
  102. ff = max(1,ff^3/prod(sk)/abs(det(V.mat(1:3,1:3))));
  103. Cwarp = Cwarp*ff;
  104. Cbias = Cbias*ff;
  105. ll = -Inf;
  106. llr = 0;
  107. llrb = 0;
  108. tol1 = 1e-4; % Stopping criterion. For more accuracy, use a smaller value
  109. d = [size(x0) length(z0)];
  110. f = zeros(d);
  111. for z=1:length(z0)
  112. f(:,:,z) = spm_sample_vol(V,x0,y0,o*z0(z),0);
  113. end
  114. [thresh,mx] = spm_minmax(f);
  115. mn = zeros(K,1);
  116. % give same results each time
  117. st = rand('state'); % st = rng;
  118. rand('state',0); % rng(0,'v5uniform'); % rng('defaults');
  119. for k1=1:Kb
  120. kk = sum(lkp==k1);
  121. mn(lkp==k1) = rand(kk,1)*mx;
  122. end
  123. rand('state',st); % rng(st);
  124. vr = ones(K,1)*mx^2;
  125. mg = ones(K,1)/K;
  126. if ~isempty(opts.msk)
  127. VM = spm_vol(opts.msk);
  128. if sum(sum((VM.mat-V(1).mat).^2)) > 1e-6 || any(VM.dim(1:3) ~= V(1).dim(1:3))
  129. error('Mask must have the same dimensions and orientation as the image.');
  130. end
  131. end
  132. Affine = eye(4);
  133. if ~isempty(opts.regtype)
  134. Affine = spm_maff(V,{x0,y0,z0},b0,B(1).mat,Affine,opts.regtype,ff*100);
  135. Affine = spm_maff(V,{x0,y0,z0},b0,B(1).mat,Affine,opts.regtype,ff);
  136. end
  137. M = B(1).mat\Affine*V(1).mat;
  138. nm = 0;
  139. for z=1:length(z0)
  140. x1 = M(1,1)*x0 + M(1,2)*y0 + (M(1,3)*z0(z) + M(1,4));
  141. y1 = M(2,1)*x0 + M(2,2)*y0 + (M(2,3)*z0(z) + M(2,4));
  142. z1 = M(3,1)*x0 + M(3,2)*y0 + (M(3,3)*z0(z) + M(3,4));
  143. buf(z).msk = spm_sample_priors(b0{end},x1,y1,z1,1)<(1-1/512);
  144. fz = f(:,:,z);
  145. %buf(z).msk = fz>thresh;
  146. buf(z).msk = buf(z).msk & isfinite(fz) & (fz~=0);
  147. if ~isempty(opts.msk),
  148. msk = spm_sample_vol(VM,x0,y0,o*z0(z),0);
  149. buf(z).msk = buf(z).msk & msk;
  150. end
  151. buf(z).nm = sum(buf(z).msk(:));
  152. buf(z).f = fz(buf(z).msk);
  153. nm = nm + buf(z).nm;
  154. buf(z).bf(1:buf(z).nm,1) = single(1);
  155. buf(z).dat = single(0);
  156. if buf(z).nm,
  157. buf(z).dat(buf(z).nm,Kb) = single(0);
  158. end
  159. end
  160. clear f
  161. finalit = 0;
  162. spm_plot_convergence('Init','Processing','Log-likelihood','Iteration');
  163. for iter=1:100
  164. if finalit
  165. % THIS CODE MAY BE USED IN FUTURE
  166. % Reload the data for the final iteration. This iteration
  167. % does not do any registration, so there is no need to
  168. % mask out the background voxels.
  169. %------------------------------------------------------------------
  170. llrb = -0.5*Tbias(:)'*Cbias*Tbias(:);
  171. for z=1:length(z0)
  172. fz = spm_sample_vol(V,x0,y0,o*z0(z),0);
  173. buf(z).msk = fz~=0;
  174. if ~isempty(opts.msk)
  175. msk = spm_sample_vol(VM,x0,y0,o*z0(z),0);
  176. buf(z).msk = buf(z).msk & msk;
  177. end
  178. buf(z).nm = sum(buf(z).msk(:));
  179. buf(z).f = fz(buf(z).msk);
  180. nm = nm + buf(z).nm;
  181. buf(z).bf(1:buf(z).nm,1) = single(1);
  182. buf(z).dat = single(0);
  183. if buf(z).nm
  184. buf(z).dat(buf(z).nm,Kb) = single(0);
  185. end
  186. if buf(z).nm
  187. bf = transf(B1bias,B2bias,B3bias(z,:),Tbias);
  188. tmp = bf(buf(z).msk);
  189. llrb = llrb + sum(tmp);
  190. buf(z).bf = single(exp(tmp));
  191. end
  192. end
  193. % The background won't fit well any more, so increase the
  194. % variances of these Gaussians in order to give it a chance
  195. vr(lkp(K)) = vr(lkp(K))*8;
  196. spm_plot_convergence('Init','Processing','Log-likelihood','Iteration');
  197. end
  198. % Load the warped prior probability images into the buffer
  199. %----------------------------------------------------------------------
  200. for z=1:length(z0)
  201. if ~buf(z).nm, continue; end
  202. [x1,y1,z1] = defs(Twarp,z,B1warp,B2warp,B3warp,x0,y0,z0,M,buf(z).msk);
  203. for k1=1:Kb
  204. tmp = spm_sample_priors(b0{k1},x1,y1,z1,k1==Kb);
  205. buf(z).dat(:,k1) = single(tmp);
  206. end
  207. end
  208. for iter1=1:10
  209. % Estimate cluster parameters
  210. %==================================================================
  211. for subit=1:40
  212. oll = ll;
  213. mom0 = zeros(K,1)+tiny;
  214. mom1 = zeros(K,1);
  215. mom2 = zeros(K,1);
  216. mgm = zeros(Kb,1);
  217. ll = llr+llrb;
  218. for z=1:length(z0)
  219. if ~buf(z).nm, continue; end
  220. bf = double(buf(z).bf);
  221. cr = double(buf(z).f).*bf;
  222. q = zeros(buf(z).nm,K);
  223. b = zeros(buf(z).nm,Kb);
  224. s = zeros(buf(z).nm,1)+tiny;
  225. for k1=1:Kb
  226. pr = double(buf(z).dat(:,k1));
  227. b(:,k1) = pr;
  228. s = s + pr*sum(mg(lkp==k1));
  229. end
  230. for k1=1:Kb
  231. b(:,k1) = b(:,k1)./s;
  232. end
  233. mgm = mgm + sum(b,1)';
  234. for k=1:K
  235. q(:,k) = mg(k)*b(:,lkp(k)) .* exp((cr-mn(k)).^2/(-2*vr(k)))/sqrt(2*pi*vr(k));
  236. end
  237. sq = sum(q,2)+tiny;
  238. ll = ll + sum(log(sq));
  239. for k=1:K % Moments
  240. p1 = q(:,k)./sq; mom0(k) = mom0(k) + sum(p1(:));
  241. p1 = p1.*cr; mom1(k) = mom1(k) + sum(p1(:));
  242. p1 = p1.*cr; mom2(k) = mom2(k) + sum(p1(:));
  243. end
  244. end
  245. % Mixing proportions, Means and Variances
  246. for k=1:K
  247. mg(k) = (mom0(k)+eps)/(mgm(lkp(k))+eps);
  248. mn(k) = mom1(k)/(mom0(k)+eps);
  249. vr(k) =(mom2(k)-mom1(k)*mom1(k)/mom0(k)+1e6*eps)/(mom0(k)+eps);
  250. vr(k) = max(vr(k),eps);
  251. end
  252. if subit>1 || (iter>1 && ~finalit),
  253. spm_plot_convergence('Set',ll);
  254. end;
  255. if finalit, fprintf('Mix: %g\n',ll); end;
  256. if subit == 1
  257. ooll = ll;
  258. elseif (ll-oll)<tol1*nm
  259. % Improvement is small, so go to next step
  260. break;
  261. end
  262. end
  263. % Estimate bias
  264. %==================================================================
  265. if prod(d3)>0
  266. for subit=1:40
  267. % Compute objective function and its 1st and second derivatives
  268. Alpha = zeros(prod(d3),prod(d3)); % Second derivatives
  269. Beta = zeros(prod(d3),1); % First derivatives
  270. ollrb = llrb;
  271. oll = ll;
  272. ll = llr+llrb;
  273. for z=1:length(z0)
  274. if ~buf(z).nm, continue; end
  275. bf = double(buf(z).bf);
  276. cr = double(buf(z).f).*bf;
  277. q = zeros(buf(z).nm,K);
  278. for k=1:K
  279. q(:,k) = double(buf(z).dat(:,lkp(k)))*mg(k);
  280. end
  281. s = sum(q,2)+tiny;
  282. for k=1:K
  283. q(:,k) = q(:,k)./s .* exp((cr-mn(k)).^2/(-2*vr(k)))/sqrt(2*pi*vr(k));
  284. end
  285. sq = sum(q,2)+tiny;
  286. ll = ll + sum(log(sq));
  287. w1 = zeros(buf(z).nm,1);
  288. w2 = zeros(buf(z).nm,1);
  289. for k=1:K
  290. tmp = q(:,k)./sq/vr(k);
  291. w1 = w1 + tmp.*(mn(k) - cr);
  292. w2 = w2 + tmp;
  293. end
  294. wt1 = zeros(d(1:2)); wt1(buf(z).msk) = 1 + cr.*w1;
  295. wt2 = zeros(d(1:2)); wt2(buf(z).msk) = cr.*(cr.*w2 - w1);
  296. b3 = B3bias(z,:)';
  297. Beta = Beta + kron(b3,spm_krutil(wt1,B1bias,B2bias,0));
  298. Alpha = Alpha + kron(b3*b3',spm_krutil(wt2,B1bias,B2bias,1));
  299. clear w1 w2 wt1 wt2 b3
  300. end
  301. if finalit, fprintf('Bia: %g\n',ll); end
  302. if subit > 1 && ~(ll>oll)
  303. % Hasn't improved, so go back to previous solution
  304. Tbias = oTbias;
  305. llrb = ollrb;
  306. for z=1:length(z0)
  307. if ~buf(z).nm, continue; end
  308. bf = transf(B1bias,B2bias,B3bias(z,:),Tbias);
  309. buf(z).bf = single(exp(bf(buf(z).msk)));
  310. end
  311. break;
  312. else
  313. % Accept new solution
  314. spm_plot_convergence('Set',ll);
  315. oTbias = Tbias;
  316. if subit > 1 && ~((ll-oll)>tol1*nm)
  317. % Improvement is only small, so go to next step
  318. break;
  319. else
  320. % Use new solution and continue the Levenberg-Marquardt iterations
  321. Tbias = reshape((Alpha + Cbias + lmRb)\((Alpha+lmRb)*Tbias(:) + Beta),d3);
  322. llrb = -0.5*Tbias(:)'*Cbias*Tbias(:);
  323. for z=1:length(z0)
  324. if ~buf(z).nm, continue; end
  325. bf = transf(B1bias,B2bias,B3bias(z,:),Tbias);
  326. tmp = bf(buf(z).msk);
  327. llrb = llrb + sum(tmp);
  328. buf(z).bf = single(exp(tmp));
  329. end
  330. end
  331. end
  332. end
  333. if ~((ll-ooll)>tol1*nm), break; end
  334. end
  335. end
  336. if finalit, break; end
  337. % Estimate deformations
  338. %======================================================================
  339. mg1 = full(sparse(lkp,1,mg));
  340. ll = llr+llrb;
  341. for z=1:length(z0)
  342. if ~buf(z).nm, continue; end
  343. bf = double(buf(z).bf);
  344. cr = double(buf(z).f).*bf;
  345. q = zeros(buf(z).nm,Kb);
  346. tmp = zeros(buf(z).nm,1)+tiny;
  347. s = zeros(buf(z).nm,1)+tiny;
  348. for k1=1:Kb
  349. s = s + mg1(k1)*double(buf(z).dat(:,k1));
  350. end
  351. for k1=1:Kb
  352. kk = find(lkp==k1);
  353. pp = zeros(buf(z).nm,1);
  354. for k=kk
  355. pp = pp + exp((cr-mn(k)).^2/(-2*vr(k)))/sqrt(2*pi*vr(k))*mg(k);
  356. end
  357. q(:,k1) = pp;
  358. tmp = tmp+pp.*double(buf(z).dat(:,k1))./s;
  359. end
  360. ll = ll + sum(log(tmp));
  361. for k1=1:Kb
  362. buf(z).dat(:,k1) = single(q(:,k1));
  363. end
  364. end
  365. for subit=1:20
  366. oll = ll;
  367. A = cell(3,3);
  368. A{1,1} = zeros(prod(d2));
  369. A{1,2} = zeros(prod(d2));
  370. A{1,3} = zeros(prod(d2));
  371. A{2,2} = zeros(prod(d2));
  372. A{2,3} = zeros(prod(d2));
  373. A{3,3} = zeros(prod(d2));
  374. Beta = zeros(prod(d2)*3,1);
  375. for z=1:length(z0)
  376. if ~buf(z).nm, continue; end
  377. [x1,y1,z1] = defs(Twarp,z,B1warp,B2warp,B3warp,x0,y0,z0,M,buf(z).msk);
  378. b = zeros(buf(z).nm,Kb);
  379. db1 = zeros(buf(z).nm,Kb);
  380. db2 = zeros(buf(z).nm,Kb);
  381. db3 = zeros(buf(z).nm,Kb);
  382. s = zeros(buf(z).nm,1)+tiny;
  383. ds1 = zeros(buf(z).nm,1);
  384. ds2 = zeros(buf(z).nm,1);
  385. ds3 = zeros(buf(z).nm,1);
  386. p = zeros(buf(z).nm,1)+tiny;
  387. dp1 = zeros(buf(z).nm,1);
  388. dp2 = zeros(buf(z).nm,1);
  389. dp3 = zeros(buf(z).nm,1);
  390. for k1=1:Kb
  391. [b(:,k1),db1(:,k1),db2(:,k1),db3(:,k1)] = spm_sample_priors(b0{k1},x1,y1,z1,k1==Kb);
  392. s = s + mg1(k1)* b(:,k1);
  393. ds1 = ds1 + mg1(k1)*db1(:,k1);
  394. ds2 = ds2 + mg1(k1)*db2(:,k1);
  395. ds3 = ds3 + mg1(k1)*db3(:,k1);
  396. end
  397. for k1=1:Kb
  398. b(:,k1) = b(:,k1)./s;
  399. db1(:,k1) = (db1(:,k1)-b(:,k1).*ds1)./s;
  400. db2(:,k1) = (db2(:,k1)-b(:,k1).*ds2)./s;
  401. db3(:,k1) = (db3(:,k1)-b(:,k1).*ds3)./s;
  402. pp = double(buf(z).dat(:,k1));
  403. p = p + pp.*b(:,k1);
  404. dp1 = dp1 + pp.*(M(1,1)*db1(:,k1) + M(2,1)*db2(:,k1) + M(3,1)*db3(:,k1));
  405. dp2 = dp2 + pp.*(M(1,2)*db1(:,k1) + M(2,2)*db2(:,k1) + M(3,2)*db3(:,k1));
  406. dp3 = dp3 + pp.*(M(1,3)*db1(:,k1) + M(2,3)*db2(:,k1) + M(3,3)*db3(:,k1));
  407. end
  408. clear x1 y1 z1 b db1 db2 db3 s ds1 ds2 ds3
  409. tmp = zeros(d(1:2));
  410. tmp(buf(z).msk) = dp1./p; dp1 = tmp;
  411. tmp(buf(z).msk) = dp2./p; dp2 = tmp;
  412. tmp(buf(z).msk) = dp3./p; dp3 = tmp;
  413. b3 = B3warp(z,:)';
  414. Beta = Beta - [...
  415. kron(b3,spm_krutil(dp1,B1warp,B2warp,0))
  416. kron(b3,spm_krutil(dp2,B1warp,B2warp,0))
  417. kron(b3,spm_krutil(dp3,B1warp,B2warp,0))];
  418. b3b3 = b3*b3';
  419. A{1,1} = A{1,1} + kron(b3b3,spm_krutil(dp1.*dp1,B1warp,B2warp,1));
  420. A{1,2} = A{1,2} + kron(b3b3,spm_krutil(dp1.*dp2,B1warp,B2warp,1));
  421. A{1,3} = A{1,3} + kron(b3b3,spm_krutil(dp1.*dp3,B1warp,B2warp,1));
  422. A{2,2} = A{2,2} + kron(b3b3,spm_krutil(dp2.*dp2,B1warp,B2warp,1));
  423. A{2,3} = A{2,3} + kron(b3b3,spm_krutil(dp2.*dp3,B1warp,B2warp,1));
  424. A{3,3} = A{3,3} + kron(b3b3,spm_krutil(dp3.*dp3,B1warp,B2warp,1));
  425. clear b3 b3b3 tmp p dp1 dp2 dp3
  426. end
  427. Alpha = [A{1,1} A{1,2} A{1,3} ; A{1,2} A{2,2} A{2,3}; A{1,3} A{2,3} A{3,3}];
  428. clear A
  429. for subit1 = 1:3
  430. if iter==1,
  431. nTwarp = (Alpha+lmR*lam + 10*Cwarp)\((Alpha+lmR*lam)*Twarp(:) - Beta);
  432. else
  433. nTwarp = (Alpha+lmR*lam + Cwarp)\((Alpha+lmR*lam)*Twarp(:) - Beta);
  434. end
  435. nTwarp = reshape(nTwarp,[d2 3]);
  436. nllr = -0.5*nTwarp(:)'*Cwarp*nTwarp(:);
  437. nll = nllr+llrb;
  438. for z=1:length(z0)
  439. if ~buf(z).nm, continue; end
  440. [x1,y1,z1] = defs(nTwarp,z,B1warp,B2warp,B3warp,x0,y0,z0,M,buf(z).msk);
  441. sq = zeros(buf(z).nm,1) + tiny;
  442. b = zeros(buf(z).nm,Kb);
  443. s = zeros(buf(z).nm,1)+tiny;
  444. for k1=1:Kb
  445. b(:,k1) = spm_sample_priors(b0{k1},x1,y1,z1,k1==Kb);
  446. s = s + mg1(k1)*b(:,k1);
  447. end
  448. for k1=1:Kb
  449. sq = sq + double(buf(z).dat(:,k1)).*b(:,k1)./s;
  450. end
  451. clear b
  452. nll = nll + sum(log(sq));
  453. clear sq x1 y1 z1
  454. end
  455. if nll<ll
  456. % Worse solution, so use old solution and increase regularisation
  457. lam = lam*10;
  458. else
  459. % Accept new solution
  460. ll = nll;
  461. llr = nllr;
  462. Twarp = nTwarp;
  463. lam = lam*0.5;
  464. break
  465. end
  466. end
  467. spm_plot_convergence('Set',ll);
  468. if (ll-oll)<tol1*nm, break; end
  469. end
  470. if ~((ll-ooll)>tol1*nm)
  471. finalit = 1;
  472. break; % This can be commented out.
  473. end
  474. end
  475. spm_plot_convergence('Clear');
  476. results = opts;
  477. results.image = V;
  478. results.tpm = B;
  479. results.Affine = Affine;
  480. results.Twarp = Twarp;
  481. results.Tbias = Tbias;
  482. results.mg = mg;
  483. results.mn = mn;
  484. results.vr = vr;
  485. results.thresh = 0; %thresh;
  486. results.ll = ll;
  487. fprintf('%-40s: %30s\n','Completed',spm('time')) %-#
  488. %=======================================================================
  489. %=======================================================================
  490. function t = transf(B1,B2,B3,T)
  491. if ~isempty(T),
  492. d2 = [size(T) 1];
  493. t1 = reshape(reshape(T, d2(1)*d2(2),d2(3))*B3', d2(1), d2(2));
  494. t = B1*t1*B2';
  495. else
  496. t = zeros(size(B1,1),size(B2,1));
  497. end;
  498. return;
  499. %=======================================================================
  500. %=======================================================================
  501. function [x1,y1,z1] = defs(Twarp,z,B1,B2,B3,x0,y0,z0,M,msk)
  502. x1a = x0 + transf(B1,B2,B3(z,:),Twarp(:,:,:,1));
  503. y1a = y0 + transf(B1,B2,B3(z,:),Twarp(:,:,:,2));
  504. z1a = z0(z) + transf(B1,B2,B3(z,:),Twarp(:,:,:,3));
  505. if nargin>=10,
  506. x1a = x1a(msk);
  507. y1a = y1a(msk);
  508. z1a = z1a(msk);
  509. end;
  510. x1 = M(1,1)*x1a + M(1,2)*y1a + M(1,3)*z1a + M(1,4);
  511. y1 = M(2,1)*x1a + M(2,2)*y1a + M(2,3)*z1a + M(2,4);
  512. z1 = M(3,1)*x1a + M(3,2)*y1a + M(3,3)*z1a + M(3,4);
  513. return;
  514. %=======================================================================