Generate a multi-shell scheme by using IMOC + 1-Opt + CNLO

This is a demo to generate a multi-shell scheme (e.g. 3 shells 28 samples per shell) by using IMOC + 1-Opt + CNLO.

OptimalSamplingMultiShellCNLO is in matlab. But to run IMOC and 1-Opt, you need to build the dmritool C++ codes.

Reference:

1. "Single- and Multiple-Shell Uniform Sampling Schemes for Diffusion MRI Using Spherical Codes", Jian Cheng, Dinggang Shen, Pew-Thian Yap, Peter J. Basser, IEEE Transactions on Medical Imaging, 2017.

2. "Novel single and multiple shell uniform sampling schemes for diffusion MRI using spherical codes", Jian Cheng, Dinggang Shen, Pew-Thian Yap, Peter J. Basser, MICCAI 2015.

Copyright (c) 2016, Jian Cheng (jian.cheng.1983@gmail.com)

Contents

IMOC to design a multi-shell scheme (28,28,28)

tic
! SamplingSchemeQSpaceIMOCEstimation grad_28x3_IMOC.txt --tessOrder 7 --numberOfSamples 28,28,28
toc

grad_IMOC_shell1 = ReadDirections('grad_28x3_IMOC_shell1.txt');
grad_IMOC_shell2 = ReadDirections('grad_28x3_IMOC_shell2.txt');
grad_IMOC_shell3 = ReadDirections('grad_28x3_IMOC_shell3.txt');

fprintf('\nConvering radii:\t %10.3f\t%10.3f\t%10.3f\t%10.3f\n',...
    CoveringRadius(grad_IMOC_shell1)*180/pi,CoveringRadius(grad_IMOC_shell2)*180/pi,CoveringRadius(grad_IMOC_shell3)*180/pi,...
    CoveringRadius([grad_IMOC_shell1;grad_IMOC_shell2;grad_IMOC_shell3])*180/pi);

VisualizeMultiShellScheme(grad_IMOC_shell1, grad_IMOC_shell2, grad_IMOC_shell3);
title({'Scheme by IMOC .', ['Combined covering radius = ', num2str(CoveringRadius([grad_IMOC_shell1;grad_IMOC_shell2;grad_IMOC_shell3])*180/pi), ' degree']});

Elapsed time : 61.7609
save orientations in shell 1 to grad_28x3_IMOC_shell1.txt
save orientations in shell 2 to grad_28x3_IMOC_shell2.txt
save orientations in shell 3 to grad_28x3_IMOC_shell3.txt
Elapsed time is 62.332378 seconds.

Convering radii:	     24.284	    24.264	    24.264	    14.021

IMOC + 1-Opt to design a multi-shell scheme (28,28,28)

tic
! SamplingSchemeQSpace1OptEstimation grad_28x3_IMOC1Opt.txt --initial grad_28x3_IMOC_shell1.txt,grad_28x3_IMOC_shell2.txt,grad_28x3_IMOC_shell3.txt --tessOrder 7
toc

grad_IMOC_1Opt_shell1 = ReadDirections('grad_28x3_IMOC1Opt_shell1.txt');
grad_IMOC_1Opt_shell2 = ReadDirections('grad_28x3_IMOC1Opt_shell2.txt');
grad_IMOC_1Opt_shell3 = ReadDirections('grad_28x3_IMOC1Opt_shell3.txt');

fprintf('\nConvering radii:\t %10.3f\t%10.3f\t%10.3f\t%10.3f\n',...
    CoveringRadius(grad_IMOC_1Opt_shell1)*180/pi,CoveringRadius(grad_IMOC_1Opt_shell2)*180/pi,CoveringRadius(grad_IMOC_1Opt_shell3)*180/pi, ...
    CoveringRadius([grad_IMOC_1Opt_shell1;grad_IMOC_1Opt_shell2;grad_IMOC_1Opt_shell3])*180/pi);

VisualizeMultiShellScheme(grad_IMOC_1Opt_shell1, grad_IMOC_1Opt_shell2, grad_IMOC_1Opt_shell3);
title({'Scheme by IMOC + 1-Opt.', ['Combined covering radius = ', num2str(CoveringRadius([grad_IMOC_1Opt_shell1;grad_IMOC_1Opt_shell2;grad_IMOC_1Opt_shell3])*180/pi), ' degree']});
Elapsed time : 18.7151
save orientations in shell 1 to grad_28x3_IMOC1Opt_shell1.txt
save orientations in shell 2 to grad_28x3_IMOC1Opt_shell2.txt
save orientations in shell 3 to grad_28x3_IMOC1Opt_shell3.txt
Elapsed time is 18.834665 seconds.

Convering radii:	     24.284	    24.382	    24.329	    14.026

IMOC + 1-Opt + CNLO to design a multi-shell scheme (28,28,28)

clear param;

% weight between individual shell and combined shell
param.w  = 0.5;

% solver can be nlopt or matlab. Matlab solver is slow.
param.solver  = 'nlopt';
% param.solver  = 'matlab';

% use local constraint for fast CNLO
param.localCon = 2;
param.localConAngle = 0.1;

% maxtime only for single run, the run time may be longer for whole process if the number of samples is large.
param.maxtime = 600;
param.verbose = 1;

grad{1}=grad_IMOC_1Opt_shell1;
grad{2}=grad_IMOC_1Opt_shell2;
grad{3}=grad_IMOC_1Opt_shell3;

tic
[gradCell,xopt, fopt, retcode] = OptimalSamplingMultiShellCNLO(grad, param);
toc

fprintf('\nConvering radii:\t %10.3f\t%10.3f\t%10.3f\t%10.3f\t\n',...
    CoveringRadius(gradCell{1})*180/pi,CoveringRadius(gradCell{2})*180/pi,CoveringRadius(gradCell{3})*180/pi, ...
    CoveringRadius([gradCell{1};gradCell{2};gradCell{3}])*180/pi);

VisualizeMultiShellScheme(gradCell{1}, gradCell{2}, gradCell{3});
title({'Scheme by IMOC + 1-Opt + CNLO.', ['Combined covering radius = ', num2str(CoveringRadius([gradCell{1};gradCell{2};gradCell{3}])*180/pi), ' degree']});
nlopt_optimize eval #1: 0.334733
nlopt_optimize eval #2: 0.34308
nlopt_optimize eval #3: 0.34534
nlopt_optimize eval #4: 0.346912
nlopt_optimize eval #5: 0.348025
nlopt_optimize eval #6: 0.348573
nlopt_optimize eval #7: 0.349208
nlopt_optimize eval #8: 0.349886
nlopt_optimize eval #9: 0.350512
nlopt_optimize eval #10: 0.351011
nlopt_optimize eval #11: 0.351353
nlopt_optimize eval #12: 0.351561
nlopt_optimize eval #13: 0.351756
nlopt_optimize eval #14: 0.351902
nlopt_optimize eval #15: 0.35201
nlopt_optimize eval #16: 0.352129
nlopt_optimize eval #17: 0.352156
nlopt_optimize eval #18: 0.352207
nlopt_optimize eval #19: 0.352259
nlopt_optimize eval #20: 0.352338
nlopt_optimize eval #21: 0.352392
nlopt_optimize eval #22: 0.352378
nlopt_optimize eval #23: 0.352388
nlopt_optimize eval #24: 0.352398
nlopt_optimize eval #25: 0.35241
nlopt_optimize eval #26: 0.352423
nlopt_optimize eval #27: 0.352437
nlopt_optimize eval #28: 0.352464
nlopt_optimize eval #29: 0.352491
nlopt_optimize eval #30: 0.352501
nlopt_optimize eval #31: 0.352508
nlopt_optimize eval #32: 0.352509
nlopt_optimize eval #33: 0.352511
nlopt_optimize eval #34: 0.352513
nlopt_optimize eval #35: 0.352514
nlopt_optimize eval #36: 0.352515
nlopt_optimize eval #37: 0.35252
nlopt_optimize eval #38: 0.352529
nlopt_optimize eval #39: 0.352529
nlopt_optimize eval #40: 0.352528
nlopt_optimize eval #41: 0.352529
nlopt_optimize eval #42: 0.35253
nlopt_optimize eval #43: 0.352531
nlopt_optimize eval #44: 0.352532
nlopt_optimize eval #45: 0.352537
nlopt_optimize eval #46: 0.352552
nlopt_optimize eval #47: 0.35258
nlopt_optimize eval #48: 0.352585
nlopt_optimize eval #49: 0.3526
nlopt_optimize eval #50: 0.352622
nlopt_optimize eval #51: 0.352638
nlopt_optimize eval #52: 0.352651
nlopt_optimize eval #53: 0.352684
nlopt_optimize eval #54: 0.352766
nlopt_optimize eval #55: 0.352893
nlopt_optimize eval #56: 0.352997
nlopt_optimize eval #57: 0.353015
nlopt_optimize eval #58: 0.353005
nlopt_optimize eval #59: 0.353013
nlopt_optimize eval #60: 0.353029
nlopt_optimize eval #61: 0.353052
nlopt_optimize eval #62: 0.353079
nlopt_optimize eval #63: 0.353097
nlopt_optimize eval #64: 0.353106
nlopt_optimize eval #65: 0.3531
nlopt_optimize eval #66: 0.353101
nlopt_optimize eval #67: 0.353106
nlopt_optimize eval #68: 0.353104
nlopt_optimize eval #69: 0.353104
nlopt_optimize eval #70: 0.35311
nlopt_optimize eval #71: 0.353115
nlopt_optimize eval #72: 0.353112
nlopt_optimize eval #73: 0.353114
nlopt_optimize eval #74: 0.353116
nlopt_optimize eval #75: 0.353118
nlopt_optimize eval #76: 0.353123
nlopt_optimize eval #77: 0.353128
nlopt_optimize eval #78: 0.353125
nlopt_optimize eval #79: 0.353126
nlopt_optimize eval #80: 0.353127
nlopt_optimize eval #81: 0.353127
1-th shell: 	angleOld=24.2836513627	angle=24.9435797527
Combined shell: 	angleOld=14.0259566556	angle=14.7333563514
nlopt_optimize eval #1: 0.353126
nlopt_optimize eval #2: 0.35314
nlopt_optimize eval #3: 0.353184
nlopt_optimize eval #4: 0.353256
nlopt_optimize eval #5: 0.353296
nlopt_optimize eval #6: 0.353333
nlopt_optimize eval #7: 0.353401
nlopt_optimize eval #8: 0.353444
nlopt_optimize eval #9: 0.353473
nlopt_optimize eval #10: 0.353503
nlopt_optimize eval #11: 0.353543
nlopt_optimize eval #12: 0.353587
nlopt_optimize eval #13: 0.353623
nlopt_optimize eval #14: 0.353712
nlopt_optimize eval #15: 0.35388
nlopt_optimize eval #16: 0.353967
nlopt_optimize eval #17: 0.353991
nlopt_optimize eval #18: 0.354052
nlopt_optimize eval #19: 0.354114
nlopt_optimize eval #20: 0.354175
nlopt_optimize eval #21: 0.354257
nlopt_optimize eval #22: 0.354336
nlopt_optimize eval #23: 0.354402
nlopt_optimize eval #24: 0.354483
nlopt_optimize eval #25: 0.354599
nlopt_optimize eval #26: 0.354653
nlopt_optimize eval #27: 0.354744
nlopt_optimize eval #28: 0.354824
nlopt_optimize eval #29: 0.354859
nlopt_optimize eval #30: 0.354906
nlopt_optimize eval #31: 0.354928
nlopt_optimize eval #32: 0.354939
nlopt_optimize eval #33: 0.355001
nlopt_optimize eval #34: 0.355099
nlopt_optimize eval #35: 0.355104
nlopt_optimize eval #36: 0.35512
nlopt_optimize eval #37: 0.355148
nlopt_optimize eval #38: 0.355152
nlopt_optimize eval #39: 0.355154
nlopt_optimize eval #40: 0.355163
nlopt_optimize eval #41: 0.355172
nlopt_optimize eval #42: 0.355173
nlopt_optimize eval #43: 0.355177
nlopt_optimize eval #44: 0.355181
nlopt_optimize eval #45: 0.355183
nlopt_optimize eval #46: 0.355194
nlopt_optimize eval #47: 0.355228
nlopt_optimize eval #48: 0.355254
nlopt_optimize eval #49: 0.355243
nlopt_optimize eval #50: 0.355253
nlopt_optimize eval #51: 0.355264
nlopt_optimize eval #52: 0.355277
nlopt_optimize eval #53: 0.355293
nlopt_optimize eval #54: 0.355303
nlopt_optimize eval #55: 0.355305
nlopt_optimize eval #56: 0.355319
nlopt_optimize eval #57: 0.355336
nlopt_optimize eval #58: 0.355356
nlopt_optimize eval #59: 0.355377
nlopt_optimize eval #60: 0.355379
nlopt_optimize eval #61: 0.355381
nlopt_optimize eval #62: 0.35539
nlopt_optimize eval #63: 0.35541
nlopt_optimize eval #64: 0.355413
nlopt_optimize eval #65: 0.355421
nlopt_optimize eval #66: 0.355465
nlopt_optimize eval #67: 0.355555
nlopt_optimize eval #68: 0.355551
nlopt_optimize eval #69: 0.35555
nlopt_optimize eval #70: 0.355559
nlopt_optimize eval #71: 0.35557
nlopt_optimize eval #72: 0.355578
nlopt_optimize eval #73: 0.355587
nlopt_optimize eval #74: 0.355601
nlopt_optimize eval #75: 0.355605
nlopt_optimize eval #76: 0.355603
nlopt_optimize eval #77: 0.355604
nlopt_optimize eval #78: 0.355606
nlopt_optimize eval #79: 0.35561
nlopt_optimize eval #80: 0.35561
nlopt_optimize eval #81: 0.355611
nlopt_optimize eval #82: 0.355611
1-th shell: 	angleOld=24.9435797527	angle=26.0804529355
Combined shell: 	angleOld=14.7333563514	angle=14.3712680256
nlopt_optimize eval #1: 0.35561
nlopt_optimize eval #2: 0.355624
nlopt_optimize eval #3: 0.355631
nlopt_optimize eval #4: 0.355642
nlopt_optimize eval #5: 0.355659
nlopt_optimize eval #6: 0.355668
nlopt_optimize eval #7: 0.355674
nlopt_optimize eval #8: 0.355687
nlopt_optimize eval #9: 0.355693
nlopt_optimize eval #10: 0.355708
nlopt_optimize eval #11: 0.355726
nlopt_optimize eval #12: 0.355721
nlopt_optimize eval #13: 0.355731
nlopt_optimize eval #14: 0.355756
nlopt_optimize eval #15: 0.355802
nlopt_optimize eval #16: 0.355859
nlopt_optimize eval #17: 0.355852
nlopt_optimize eval #18: 0.35586
nlopt_optimize eval #19: 0.35587
nlopt_optimize eval #20: 0.355873
nlopt_optimize eval #21: 0.355876
nlopt_optimize eval #22: 0.355876
1-th shell: 	angleOld=26.0804529355	angle=26.0360636351
2-th shell: 	angleOld=26.2295619574	angle=26.3057347474
Combined shell: 	angleOld=14.3712680256	angle=14.3652049033
nlopt_optimize eval #1: 0.355875
nlopt_optimize eval #2: 0.355878
nlopt_optimize eval #3: 0.355886
nlopt_optimize eval #4: 0.355911
nlopt_optimize eval #5: 0.355933
nlopt_optimize eval #6: 0.355953
nlopt_optimize eval #7: 0.355963
nlopt_optimize eval #8: 0.355962
nlopt_optimize eval #9: 0.355964
nlopt_optimize eval #10: 0.355967
nlopt_optimize eval #11: 0.355969
nlopt_optimize eval #12: 0.355971
nlopt_optimize eval #13: 0.355974
nlopt_optimize eval #14: 0.355979
nlopt_optimize eval #15: 0.355984
nlopt_optimize eval #16: 0.355986
nlopt_optimize eval #17: 0.355988
nlopt_optimize eval #18: 0.355989
nlopt_optimize eval #19: 0.355989
1-th shell: 	angleOld=26.0360636351	angle=26.0641991198
Combined shell: 	angleOld=14.3652049033	angle=14.3646796978
nlopt_optimize eval #1: 0.355988
nlopt_optimize eval #2: 0.355989
nlopt_optimize eval #3: 0.355989
1-th shell: 	angleOld=26.0641991198	angle=26.0642827448
2-th shell: 	angleOld=26.3150455933	angle=26.3150810853
3-th shell: 	angleOld=26.9064950641	angle=26.9068384831
Combined shell: 	angleOld=14.3646796978	angle=14.3645585204
nlopt_optimize eval #1: 0.355989
nlopt_optimize eval #2: 0.355989
nlopt_optimize eval #3: 0.355989
1-th shell: 	angleOld=26.0642827448	angle=26.0642945155
2-th shell: 	angleOld=26.3150810853	angle=26.3151349227
3-th shell: 	angleOld=26.9068384831	angle=26.9066268595
Combined shell: 	angleOld=14.3645585204	angle=14.3646192419
Elapsed time is 28.693278 seconds.

Convering radii:	     26.064	    26.315	    26.907	    14.365