I looked up Caruyer’s web tool (Q Space sampling in Diffusion MRI Emmanuel Caruyer homepage — CNRS Researcher, Univ Rennes, Inria, CNRS, IRISA (UMR 6074), Empenn ERL 1228, Rennes FR-35042.), selecting a single shell, 65 samples and the rightmost option for ‘Number of points per shell’ as it seems as the most equally spaced distribution to me, gives these vectors:
1 0.049 -0.919 -0.391
1 0.726 0.301 -0.618
1 -0.683 0.255 -0.684
1 0.845 -0.502 -0.186
1 -0.730 -0.619 -0.288
1 -0.051 0.039 0.998
1 -0.018 0.871 -0.491
1 -0.444 0.494 0.747
1 -0.989 -0.086 -0.116
1 -0.470 -0.855 0.221
1 0.412 0.400 0.819
1 -0.552 0.790 -0.267
1 -0.123 -0.477 0.871
1 -0.848 0.141 0.510
1 -0.341 -0.788 -0.512
1 0.361 -0.529 0.768
1 -0.472 0.850 0.234
1 -0.856 -0.481 0.189
1 0.797 0.162 0.582
1 0.467 -0.009 -0.884
1 0.013 0.998 -0.056
1 0.882 -0.387 0.267
1 0.017 -0.536 -0.844
1 -0.442 -0.651 0.617
1 0.365 -0.058 0.929
1 0.977 -0.004 -0.213
1 -0.406 -0.902 -0.145
1 -0.627 0.614 0.479
1 -0.354 0.772 -0.528
1 -0.658 -0.472 -0.586
1 0.423 0.322 -0.847
1 0.212 -0.754 -0.622
1 0.912 -0.104 0.398
1 -0.311 0.947 -0.077
1 0.679 0.632 -0.374
1 0.135 -0.286 0.949
1 -0.647 0.230 0.727
1 0.904 0.397 0.158
1 -0.757 0.647 -0.087
1 0.143 0.284 0.948
1 0.233 0.894 -0.382
1 0.664 -0.531 0.527
1 0.157 0.710 0.686
1 -0.895 -0.214 0.392
1 0.594 0.080 0.801
1 -0.006 0.688 -0.726
1 0.665 0.746 0.024
1 -0.277 0.276 0.920
1 -0.962 0.268 0.046
1 -0.133 -0.970 -0.202
1 0.790 -0.405 -0.461
1 -0.194 -0.193 0.962
1 -0.236 0.952 0.195
1 -0.884 -0.272 -0.379
1 0.463 -0.307 0.831
1 0.700 0.066 -0.711
1 -0.200 0.928 -0.314
1 0.550 0.705 0.449
1 -0.670 0.727 0.153
1 0.237 0.722 -0.650
1 0.960 0.260 -0.100
1 0.407 -0.756 -0.512
1 -0.355 -0.180 -0.917
1 -0.809 0.324 -0.491
1 -0.281 -0.955 0.096
In the visualisation window of the web application itself it looks like the samples are not equally spaced, with areas containing big gaps and others seem oversampled - is this what you refer to as ‘angular bias’ @ThijsDhollander? It definitely doesn’t look as bad as the directions I somehow ended up with though…

Here is a multi-shell acquisition scheme generated with gen_scheme.sh and then modified with @jdtournier’s scaling method:
$ cat dw_scheme_SIEMENS.txt
[directions=106]
CoordinateSystem = xyz
Normalisation = none
Vector[1] = ( 0, 0, 0 )
Vector[2] = ( -0.85835, 0.351655, 0.373597 )
Vector[3] = ( 0.521889, -0.236879, -0.0696683 )
Vector[4] = ( 0.52077, 0.412496, 0.747426 )
Vector[5] = ( 0.241151, 0.802467, -0.545796 )
Vector[6] = ( -0.251295, -0.35357, -0.381015 )
Vector[7] = ( 0.276752, -0.937285, -0.211907 )
Vector[8] = ( 0.242396, -0.035459, -0.969529 )
Vector[9] = ( -0.00197281, -0.29558, 0.495945 )
Vector[10] = ( 0.759659, -0.328221, 0.561417 )
Vector[11] = ( -0.952524, -0.304419, 0.00528 )
Vector[12] = ( 0.32648, 0.453848, -0.144104 )
Vector[13] = ( -0.328866, -0.878423, -0.346729 )
Vector[14] = ( 0, 0, 0 )
Vector[15] = ( 0.170783, -0.458375, 0.872196 )
Vector[16] = ( -0.231188, 0.14737, 0.508102 )
Vector[17] = ( -0.361395, 0.593068, 0.719489 )
Vector[18] = ( -0.72093, -0.480617, 0.499267 )
Vector[19] = ( -0.151375, 0.546899, -0.106395 )
Vector[20] = ( 0.577098, -0.786415, 0.220247 )
Vector[21] = ( -0.599497, -0.796171, 0.08195 )
Vector[22] = ( -0.442197, 0.0153425, -0.37089 )
Vector[23] = ( -0.929851, 0.26932, -0.250687 )
Vector[24] = ( 0, 0, 0 )
Vector[25] = ( 0.185826, 0.353682, 0.916721 )
Vector[26] = ( -0.456234, -0.243143, 0.257032 )
Vector[27] = ( 0.724463, -0.187154, -0.66342 )
Vector[28] = ( -0.02136, 0.934291, -0.355871 )
Vector[29] = ( 0.122686, -0.543696, -0.150585 )
Vector[30] = ( 0.896217, 0.283163, 0.341488 )
Vector[31] = ( -0.32872, 0.162867, -0.930278 )
Vector[32] = ( 0.565321, 0.0441107, 0.108629 )
Vector[33] = ( 0.572133, 0.33085, -0.750468 )
Vector[34] = ( 0, 0, 0 )
Vector[35] = ( -0.795972, 0.605333, -0.00049 )
Vector[36] = ( -0.0114304, 0.00992465, -0.577152 )
Vector[37] = ( -0.116376, -0.812885, -0.570679 )
Vector[38] = ( -0.332183, 0.644876, -0.688324 )
Vector[39] = ( 0.360805, -0.276676, 0.355814 )
Vector[40] = ( -0.480141, 0.761116, 0.436082 )
Vector[41] = ( -0.723507, -0.509273, -0.466024 )
Vector[42] = ( -0.00928437, 0.43851, 0.375442 )
Vector[43] = ( 0.907024, 0.271044, -0.322247 )
Vector[44] = ( 0, 0, 0 )
Vector[45] = ( -0.015382, -0.999007, 0.041804 )
Vector[46] = ( -0.439387, 0.206946, 0.312162 )
Vector[47] = ( -0.309117, -0.29173, 0.905174 )
Vector[48] = ( -0.642148, 0.079946, -0.7624 )
Vector[49] = ( -0.365071, -0.431087, -0.119249 )
Vector[50] = ( 0.146449, -0.340902, -0.928622 )
Vector[51] = ( -0.992235, 0.015623, 0.123389 )
Vector[52] = ( -0.0780543, -0.491317, 0.292999 )
Vector[53] = ( 0.330623, 0.942519, 0.048444 )
Vector[54] = ( 0, 0, 0 )
Vector[55] = ( 0.324729, -0.843726, 0.427407 )
Vector[56] = ( 0.416091, 0.0335238, -0.398846 )
Vector[57] = ( 0.549753, 0.735968, -0.395122 )
Vector[58] = ( 0.725418, -0.619807, -0.299347 )
Vector[59] = ( 0.261234, 0.12145, 0.50034 )
Vector[60] = ( 0.136728, 0.555997, -0.819862 )
Vector[61] = ( 0.819466, 0.556618, 0.136569 )
Vector[62] = ( 0.376063, -0.42012, 0.124133 )
Vector[63] = ( -0.455343, 0.301168, 0.837831 )
Vector[64] = ( -0.869446, 0.033431, -0.492896 )
Vector[65] = ( 0.258842, 0.337401, -0.390506 )
Vector[66] = ( -0.260754, -0.601423, -0.75518 )
Vector[67] = ( 0, 0, 0 )
Vector[68] = ( 0.092766, 0.070563, 0.993184 )
Vector[69] = ( 0.247737, -0.370588, -0.366912 )
Vector[70] = ( -0.587498, 0.62069, -0.51922 )
Vector[71] = ( -0.776311, -0.147095, 0.612947 )
Vector[72] = ( 0.512602, 0.265504, -0.00898068 )
Vector[73] = ( 0.026477, 0.960997, 0.275288 )
Vector[74] = ( 0.94268, -0.327347, -0.064795 )
Vector[75] = ( 0.146068, 0.523886, 0.193754 )
Vector[76] = ( -0.296275, 0.948029, -0.116026 )
Vector[77] = ( 0, 0, 0 )
Vector[78] = ( 0.480945, 0.686288, 0.54562 )
Vector[79] = ( -0.218841, 0.146305, -0.513845 )
Vector[80] = ( -0.437664, -0.138064, -0.888475 )
Vector[81] = ( -0.429632, -0.594218, 0.679942 )
Vector[82] = ( -0.516157, 0.191299, -0.174125 )
Vector[83] = ( 0.191135, -0.82689, -0.528886 )
Vector[84] = ( 0.508971, -0.381313, 0.771718 )
Vector[85] = ( -0.356345, 0.434254, 0.133323 )
Vector[86] = ( 0.636227, -0.489432, -0.596382 )
Vector[87] = ( 0, 0, 0 )
Vector[88] = ( 0.801218, 0.566919, -0.19145 )
Vector[89] = ( -0.555695, -0.0108975, 0.156262 )
Vector[90] = ( -0.301232, -0.918303, 0.256864 )
Vector[91] = ( 0.734823, 0.212395, 0.644145 )
Vector[92] = ( -0.167418, 0.431686, -0.344893 )
Vector[93] = ( -0.536691, -0.018202, 0.843583 )
Vector[94] = ( 0.789658, -0.536403, 0.297845 )
Vector[95] = ( -0.0185907, -0.240673, -0.524466 )
Vector[96] = ( 0.050264, -0.760865, 0.646961 )
Vector[97] = ( 0, 0, 0 )
Vector[98] = ( -0.058902, 0.613791, 0.787268 )
Vector[99] = ( 0.453892, 0.227329, 0.275021 )
Vector[100] = ( 0.908465, -0.053289, -0.414551 )
Vector[101] = ( -0.606147, -0.759705, -0.235446 )
Vector[102] = ( -0.106733, -0.565394, 0.0476504 )
Vector[103] = ( 0.012244, 0.227929, -0.973601 )
Vector[104] = ( 0.553153, -0.827272, -0.098197 )
Vector[105] = ( -0.210825, -0.123454, 0.523111 )
Vector[106] = ( -0.982952, -0.026558, -0.181936 )
Does this have the desired scaling? (Thanks for the code!)
I checked with the scan operators, and the free mode is available (they purchased the license). I’m still a bit puzzled as to why a true multi-shell acquisition wasn’t performed, but instead two separate single shells.
Also the data coming off the scanner always has all the b0’s as the very first images, followed by the diffusion-weighted images, but with regards to using TOPUP later on, a stack of b0’s at the start doesn’t give you any information about the movement and scanner drift throughout the scan, which is what TOPUP uses for its motion correction step if I’m correct?
With regards to the reverse-PE b0 that is acquired as a separate run, I’m guessing there’s no other way than simply using it as an input to TOPUP without doing some sort of rigid/affine alignment to the b0’s of the main run?