48 arg = alpha *
sqrt(1.0 - rdas);
55 w =
sqrt (1.0 - rdas);
61 w =
sqrt (1.0 - rdas);
68 w =
sqrt (1.0 - rdas);
75 w =
sqrt (1.0 - rdas);
107 arg = alpha *
sqrt(w);
111 p = 2.0 * a *
sqrt(w);
119 p = 2.0 * a * w *
sqrt(w) * (2.0 / 3.0);
121 p = (2.0 * a /
alpha) *
sqrt(w) * (cosh(arg) - sinh(arg) / arg)
128 p = 2.0 * a * w * w *
sqrt(w) * (8.0 / 15.0);
130 p = (2.0 * a /
alpha) * w *
131 ((3.0 / (arg * arg) + 1.0) * sinh(arg) - (3.0 / arg) * cosh(arg)) /
bessi2(alpha);
148 double sigma =
sqrt(
ABS(alpha * alpha - (2. *
PI * a * w) * (2. *
PI * a * w)));
151 if (2.*
PI*a*w > alpha)
152 return pow(2.*
PI, 3. / 2.)*pow(a, 3.)*pow(alpha, 2.)*
bessj3_5(sigma)
153 / (
bessi0(alpha)*pow(sigma, 3.5));
155 return pow(2.*
PI, 3. / 2.)*pow(a, 3.)*pow(alpha, 2.)*
bessi3_5(sigma)
156 / (
bessi0(alpha)*pow(sigma, 3.5));
160 if (2*
PI*a*w > alpha)
161 return pow(2.*
PI, 3. / 2.)*pow(a, 3)*
bessj1_5(sigma)
162 / (
bessi0(alpha)*pow(sigma, 1.5));
164 return pow(2.*
PI, 3. / 2.)*pow(a, 3)*
bessi1_5(sigma)
165 / (
bessi0(alpha)*pow(sigma, 1.5));
183 double actual_radius;
198 for (i = (
int)
XX(corner1); i <= (int)
XX(corner2); i++)
199 for (j = (
int)
YY(corner1); j <= (int)
YY(corner2); j++)
200 for (k = (
int)
ZZ(corner1); k <= (int)
ZZ(corner2); k++)
206 actual_radius = ur.
module();
207 if (actual_radius < blob.
radius)
234 v = pow(tpi / alpha, hn) *
i_n(n / 2 + m, alpha) /
i_n(m, alpha);
236 v = pow(tpi / alpha, hn) *
i_nph(n / 2 + m, alpha) /
i_n(m, alpha);
239 return v * pow(a, (
double)n);
260 for (i = 1; i <
n; i++)
262 i_np1 = i_ns1 - (2 *
i) / x * i_n;
280 r2dpix =
sqrt(2.0 / (
PI * x));
281 i_ns1 = r2dpix * cosh(x);
282 i_n = r2dpix * sinh(x);
284 for (i = 1; i <=
n; i++)
286 i_np1 = i_ns1 - (2 * i - 1) / x * i_n;
299 for (i = 1; i <=
n; i++)
312 for (i = 1; i <=
n; i++)
314 fact *= 1.0 / (2 * i + 1.0);
316 return fact*
sqrt(2.0 /
PI);
364 double a_0,
double a_F,
double inc_a,
double w,
double *target_att,
369 int alpha_size =
FLOOR((alpha_F - alpha_0) / inc_alpha + 1);
370 int a_size =
FLOOR((a_F - a_0) / inc_a + 1);
373 att().resize(alpha_size, a_size);
374 ops().resize(alpha_size, a_size);
380 double best_alpha = -1;
381 double best_ops = 1e10;
383 for (i = 0, alpha = alpha_0; i < alpha_size; alpha += inc_alpha, i++)
384 for (j = 0, a = a_0; j < a_size; a += inc_a, j++)
391 for (
int n = target_length - 1;
n >= 0;
n--)
392 if (
A2D_ELEM(att(), i, j - 1) > target_att[
n] &&
396 if (
A2D_ELEM(ops(), i, j - 1) < best_ops &&
397 A2D_ELEM(att(), i, j - 1) >= best_att)
401 best_ops =
A2D_ELEM(ops(), i, j - 1);
402 best_att = target_att[
n];
412 retval.
alpha = best_alpha;
427 blobprint.
init(-footmax, footmax, istep, -footmax, footmax, istep);
437 double r =
sqrt(vi * vi + ui * ui);
443 blobprint() /= blobprint().sum();
451 #define DEFORM_BLOB_WHEN_IN_CRYSTAL 458 const struct blobtype *blob = thread_data->blob;
461 int istep = thread_data->istep;
465 bool FORW = thread_data->FORW;
466 int eq_mode = thread_data->eq_mode;
468 int min_separation = thread_data->min_separation;
497 double vol_correction=0;
502 #define x0 STARTINGX(*vol_voxels) 503 #define xF FINISHINGX(*vol_voxels) 504 #define y0 STARTINGY(*vol_voxels) 505 #define yF FINISHINGY(*vol_voxels) 506 #define z0 STARTINGZ(*vol_voxels) 507 #define zF FINISHINGZ(*vol_voxels) 511 bool condition = !FORW;
514 (*vol_voxels)().printShape();
515 std::cout << std::endl;
516 std::cout <<
"x0= " <<
x0 <<
" xF= " <<
xF << std::endl;
517 std::cout <<
"y0= " <<
y0 <<
" yF= " <<
yF << std::endl;
518 std::cout <<
"z0= " <<
z0 <<
" zF= " <<
zF << std::endl;
529 for (
size_t i = 0; i < blob_table.
xdim; i++)
536 std::cout <<
"Blob (" << i <<
") r=" << (double)i / istep <<
537 " val= " <<
A1D_ELEM(blob_table, i) << std::endl;
553 return (
void*)
nullptr;
556 for(
int w = 0 ;
w < z_planes ;
w++ )
564 for(
int in = (
w-min_separation+1) ;
in <= (
w+min_separation-1 ) ;
in ++ )
568 if( (
in >= 0 ) && (
in < z_planes ))
581 while( assigned_slice == -1);
587 k = (int)(assigned_slice +
ZZ( grid->
lowest ));
606 printf(
"Dealing blob at (%d,%d,%d) = %f\n", j, i, k,
A3D_ELEM(*vol_blobs, k, i, j));
607 std::cout <<
"Center of the blob " 619 std::cout <<
"Center of the blob moved to " 623 << real_position.
transpose() << std::endl;
629 real_position = act_coord;
644 if (
XX(corner1) >=
xF)
646 if (
YY(corner1) >=
yF)
648 if (
ZZ(corner1) >=
zF)
650 if (
XX(corner2) <=
x0)
652 if (
YY(corner2) <=
y0)
654 if (
ZZ(corner2) <=
z0)
658 if (!process && condition)
659 std::cout <<
" It is outside output volume\n";
665 if (process && condition)
666 std::cout <<
" It is not interesting\n";
675 std::cout <<
"Corner 1 for this point " << corner1.
transpose() << std::endl;
676 std::cout <<
"Corner 2 for this point " << corner2.
transpose() << std::endl;
693 std::cout <<
"Clipped and rounded Corner 1 " << corner1.
transpose() << std::endl;
694 std::cout <<
"Clipped and rounded Corner 2 " << corner2.
transpose() << std::endl;
705 vol_correction = -1e38;
712 for (
auto intz = (
int)
ZZ(corner1); intz <=(int)
ZZ(corner2); intz++)
713 for (
auto inty = (
int)
YY(corner1); inty <= (int)
YY(corner2); inty++)
714 for (
auto intx = (
int)
XX(corner1); intx <= (int)
XX(corner2); intx++)
716 if (vol_mask !=
nullptr &&
A3D_ELEM(*vol_mask, intz, inty, intx)!=0.0)
720 VECTOR_R3(gcurrent, (
double)intx, (
double)inty, (
double)intz);
728 d =
sqrt(
XX(gcurrent) *
XX(gcurrent) +
729 YY(gcurrent) *
YY(gcurrent) +
730 ZZ(gcurrent) *
ZZ(gcurrent));
733 id = (int)(d * istep);
738 std::cout <<
"At (" << intx <<
"," 739 << inty <<
"," << intz <<
") distance=" <<
d;
748 A3D_ELEM(*vol_voxels, intz, inty, intx) +=
755 std::cout <<
" adding " <<
A3D_ELEM(*vol_blobs, k, i, j)
756 <<
" * " <<
A1D_ELEM(blob_table,
id) <<
" = " 758 A1D_ELEM(blob_table,
id) << std::endl;
762 if (vol_corr !=
nullptr)
763 A3D_ELEM(*vol_corr, intz, inty, intx) +=
768 double contrib =
A3D_ELEM(*vol_corr, intz, inty, intx) *
773 vol_correction += contrib;
777 if (contrib > vol_correction)
778 vol_correction = contrib;
785 std::cout <<
" adding " <<
A3D_ELEM(*vol_corr, intz, inty, intx)
786 <<
" * " <<
A1D_ELEM(blob_table,
id) <<
" = " 787 << contrib << std::endl;
798 A3D_ELEM(*vol_blobs, k, i, j) += vol_correction / N_eq;
801 std::cout <<
" correction= " << vol_correction << std::endl
802 <<
" Number of eqs= " << N_eq << std::endl
803 <<
" Blob after correction= " 804 <<
A3D_ELEM(*vol_blobs, k, i, j) << std::endl;
822 for(
int in = (assigned_slice-min_separation+1) ;
in <= (assigned_slice+min_separation-1);
in ++ )
824 if(
in != assigned_slice )
826 if( (
in >= 0 ) && (
in < z_planes))
838 return (
void*)
nullptr;
862 vol_blobs.
grid().voxel_corners(Gcorner1, Gcorner2, D);
871 XX(size) = (int)
XX(Gcorner2) - (int)
XX(Gcorner1) + 1;
872 YY(size) = (int)
YY(Gcorner2) - (int)
YY(Gcorner1) + 1;
873 ZZ(size) = (int)
ZZ(Gcorner2) - (int)
ZZ(Gcorner1) + 1;
876 std::cout <<
"Gcorner1 " << Gcorner1.
transpose() << std::endl;
877 std::cout <<
"Gcorner2 " << Gcorner2.
transpose() << std::endl;
878 std::cout <<
"Size of voxel volume " << (int)
ZZ(size) <<
" x " 879 << (int)
YY(size) <<
" x " << (int)
XX(size) << std::endl;
887 if (limit != 0 &&
XX(size) != limit)
889 double diff = ((double)
XX(size) - (double)limit) / 2;
890 if (diff == (
int)diff)
897 Gcorner1 += (diff - 0.5);
898 Gcorner2 -= (diff + 0.5);
900 XX(size) = (int)
XX(Gcorner2) - (int)
XX(Gcorner1) + 1;
901 YY(size) = (int)
YY(Gcorner2) - (int)
YY(Gcorner1) + 1;
902 ZZ(size) = (int)
ZZ(Gcorner2) - (int)
ZZ(Gcorner1) + 1;
905 std::cout <<
"Limiting to " << limit <<
" diff = " << diff << std::endl;
906 std::cout <<
"New Gcorner1 " << Gcorner1.
transpose() << std::endl;
907 std::cout <<
"New Gcorner2 " << Gcorner2.
transpose() << std::endl;
917 std::cout <<
"Final size of voxel volume " << (int)
ZZ(size) <<
" x " 918 << (int)
YY(size) <<
" x " << (int)
XX(size) << std::endl;
919 std::cout <<
"Corner1= " << corner1.
transpose() << std::endl;
932 if (Zdim == 0 || Ydim == 0 || Xdim == 0)
937 (*vol_voxels).initZeros(
ZZ(size),
YY(size),
XX(size));
944 (*vol_voxels).initZeros(Zdim, Ydim, Xdim);
945 (*vol_voxels).setXmippOrigin();
948 auto * th_ids =
new pthread_t [threads];
954 int min_distance = (int)ceil((2*(vol_blobs.
grid(
i)).relative_size ) / blob.
radius ) + 1;
958 for(
int c = 0 ;
c < threads ;
c++ )
960 threads_d[
c].vol_blobs = &(vol_blobs(
i)());
961 threads_d[
c].grid = &(vol_blobs.
grid(
i));
962 threads_d[
c].blob = &blob;
963 threads_d[
c].vol_voxels = vol_voxels;
965 threads_d[
c].istep = 50;
966 threads_d[
c].vol_corr =
nullptr;
967 threads_d[
c].vol_mask =
nullptr;
968 threads_d[
c].FORW =
true;
969 threads_d[
c].eq_mode =
VARTK;
970 threads_d[
c].thread_id =
c;
971 threads_d[
c].threads_num = threads;
972 threads_d[
c].min_separation = min_distance;
978 for(
int c = 0 ;
c < threads ;
c++ )
980 pthread_join(*(th_ids+
c),
nullptr);
984 std::cout <<
"Blob grid no " <<
i <<
" stats: ";
985 vol_blobs(i)().printStats();
986 std::cout << std::endl;
987 std::cout <<
"So far vol stats: ";
988 (*vol_voxels).printStats();
989 std::cout << std::endl;
991 save() = *vol_voxels;
1007 double R2 = (R - 6) * (R - 6);
1010 double min_val =
A3D_ELEM(*vol_voxels, 0, 0, 0);
1012 if (
j*
j +
i*
i +
k*
k <= R2 - 4)
1016 R2 = (R - 2) * (R - 2);
1018 if (
j*
j +
i*
i +
k*
k >= R2)
1038 XX(corner1) = (int)(
FLOOR(
XX(corner1)) / g_2);
1039 XX(size) = (int)(
CEIL(
XX(size)) / g_2);
1040 YY(corner1) = (int)(
FLOOR(
YY(corner1)) / g_2);
1041 YY(size) = (int)(
CEIL(
YY(size)) / g_2);
1042 ZZ(corner1) = (int)(
FLOOR(
ZZ(corner1)) / g_2);
1043 ZZ(size) = (int)(
CEIL(
ZZ(size)) / g_2);
1044 (*vol_coefs).initZeros(
ZZ(size),
YY(size),
XX(size));
1058 for (
int k = ZZ_lowest;
k <= ZZ_highest;
k++)
1059 for (
int i = YY_lowest;
i <= YY_highest;
i++)
1060 for (
int j = XX_lowest;
j <= XX_highest;
j++)
1067 V3_BY_CT(coef_position, univ_position, 1.0 / g_2);
1069 (
int)
ZZ(coef_position),
1070 (
int)
YY(coef_position),
1074 std::cout <<
"Blob value at (" <<
j <<
"," <<
i <<
"," 1075 <<
k <<
") (" <<
XX(univ_position)
1076 <<
"," <<
YY(univ_position) <<
"," 1077 <<
ZZ(univ_position) <<
") (" 1078 <<
XX(coef_position) <<
"," <<
YY(coef_position) <<
"," 1079 <<
ZZ(coef_position) <<
") --> " 1080 <<
A3D_ELEM(vol_blobs(
n)(), (
int)
k, (
int)
i, (
int)
j) << std::endl;
1091 #define FORWARD true 1092 #define BACKWARD false 1114 if (read_vol !=
nullptr)
1116 (*theo_vol).initZeros(*read_vol);
1118 else if (mask_vol !=
nullptr)
1120 (*theo_vol).initZeros(*mask_vol);
1125 "ART_voxels2blobs_single_step: Mask and voxel volumes are empty");
1127 (*corr_vol).initZeros(*theo_vol);
1129 auto * th_ids = (pthread_t *)malloc( threads *
sizeof( pthread_t));
1135 int min_distance = (int)ceil((2*(vol_in.
grid(
i)).relative_size ) / blob.
radius ) + 1;
1140 for(
int c = 0 ;
c < threads ;
c++ )
1142 threads_d[
c].vol_blobs = &(vol_in(
i)());
1143 threads_d[
c].grid = &(vol_in.
grid(
i));
1144 threads_d[
c].blob = &blob;
1145 threads_d[
c].vol_voxels = theo_vol;
1147 threads_d[
c].istep = 50;
1148 threads_d[
c].vol_corr = corr_vol;
1149 threads_d[
c].vol_mask = mask_vol;
1150 threads_d[
c].FORW =
true;
1151 threads_d[
c].eq_mode = eq_mode;
1152 threads_d[
c].thread_id =
c;
1153 threads_d[
c].threads_num = threads;
1154 threads_d[
c].min_separation = min_distance;
1160 for(
int c = 0 ;
c < threads ;
c++ )
1162 pthread_join(*(th_ids+
c),
nullptr);
1170 std::cout <<
"Blob grid no " <<
i <<
" stats: ";
1171 vol_in(i)().printStats();
1172 std::cout << std::endl;
1173 std::cout <<
"So far vol stats: ";
1174 (*theo_vol)().printStats();
1175 std::cout << std::endl;
1189 save.
write(
"PPPtheovol.vol");
1190 std::cout <<
"Theo stats:";
1191 save().printStats();
1192 std::cout << std::endl;
1194 save.
write(
"PPPcorr2vol.vol");
1195 save2().resize(save());
1201 if (read_vol !=
nullptr)
1202 read_val =
A3D_ELEM(*read_vol, 0, 0, 0);
1205 max_error =
ABS(read_val -
A3D_ELEM(*theo_vol, 0, 0, 0));
1212 if (read_vol !=
nullptr)
1217 if (mask_vol ==
nullptr)
1232 mean_error += diff * diff;
1235 save(
k,
i,
j) = diff;
1236 save2(
k,
i,
j) = read_val;
1247 save.
write(
"PPPdiffvol.vol");
1248 std::cout <<
"Diff stats:";
1249 save().printStats();
1250 std::cout << std::endl;
1251 save2.
write(
"PPPreadvol.vol");
1252 std::cout <<
"Read stats:";
1253 save2().printStats();
1254 std::cout << std::endl;
1256 save.
write(
"PPPcorrvol.vol");
1257 std::cout <<
"Corr stats:";
1258 save().printStats();
1259 std::cout << std::endl;
1270 for(
int c = 0 ;
c < threads ;
c++ )
1272 threads_d[
c].vol_blobs = &((*vol_out)(
i)());
1273 threads_d[
c].grid = &(vol_out->
grid(
i));
1274 threads_d[
c].blob = &blob;
1275 threads_d[
c].vol_voxels = theo_vol;
1277 threads_d[
c].istep = 50;
1278 threads_d[
c].vol_corr = corr_vol;
1279 threads_d[
c].vol_mask = mask_vol;
1280 threads_d[
c].FORW =
false;
1281 threads_d[
c].eq_mode = eq_mode;
1282 threads_d[
c].thread_id =
c;
1283 threads_d[
c].threads_num = threads;
1284 threads_d[
c].min_separation = 1;
1290 for(
int c = 0 ;
c < threads ;
c++ )
1292 pthread_join(*(th_ids+
c),
nullptr);
1299 std::cout <<
"Blob grid no " <<
i <<
" stats: ";
1300 vol_in(i)().printStats();
1301 std::cout << std::endl;
1309 std::cout <<
"Press any key to continue\n";
1318 GridVolume &vol_blobs,
int grid_type,
double grid_relative_size,
1321 int tell,
double R,
int threads)
1326 double mean_error_1;
1348 grid_blobs =
Create_CC_grid(grid_relative_size, corner1, corner2);
1376 std::cout <<
"Converting voxel volume to blobs\n";
1378 &(theo_vol()), vol_voxels,
1379 &(corr_vol()), vol_mask, mean_error_1, max_error,
VARTK, threads);
1381 std::cout <<
" Finished iteration: " << it++
1382 <<
" Mean Error= " << mean_error_1
1383 <<
" Max_Error= " << max_error
1390 theo_vol.
write(
"PPPtheo.vol");
1391 corr_vol.
write(
"PPPcorr.vol");
1392 std::cout <<
"Press any key\n";
1402 &(theo_vol()), vol_voxels,
1403 &(corr_vol()), vol_mask, mean_error, max_error,
VARTK);
1406 theo_vol.
write(
"PPPtheo.vol");
1407 corr_vol.
write(
"PPPcorr.vol");
1408 std::cout <<
"Press any key\n";
1413 change =
ABS(mean_error - mean_error_1) / mean_error_1;
1414 mean_error_1 = mean_error;
1416 std::cout <<
" Finished iteration: " << it++
1417 <<
" Mean Error= " << mean_error
1418 <<
" Max_Error= " << max_error
1423 std::cout << 100 - change <<
"%";
1426 end_condition = change <= final_error_change;
1428 while (!end_condition);
1429 std::cout << std::endl;
double kaiser_value(double r, double a, double alpha, int m)
void voxel_volume_shape(const GridVolume &vol_blobs, const struct blobtype &blob, const Matrix2D< double > *D, Matrix1D< int > &corner1, Matrix1D< int > &size)
#define A2D_ELEM(v, i, j)
void universe2grid(const Matrix1D< double > &uv, Matrix1D< double > &gv) const
double alpha
Smoothness parameter.
void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)
Matrix1D< double > highest
__device__ float bessi1(float x)
constexpr int SHOW_CONVERSION
#define REPORT_ERROR(nerr, ErrormMsg)
double optimal_FCC_grid_relative_size(struct blobtype b)
void blobs2voxels(const GridVolume &vol_blobs, const struct blobtype &blob, MultidimArray< double > *vol_voxels, const Matrix2D< double > *D, int threads, int Zdim, int Ydim, int Xdim)
SimpleGrid Create_CC_grid(double relative_size, const Matrix1D< double > &corner1, const Matrix1D< double > &corner2, const Matrix1D< double > &origin)
void init(int _umin, int _umax, int _uistep, int _vmin, int _vmax, int _vistep, int _wmin=0, int _wmax=0, int _wistep=1)
#define V3_PLUS_CT(a, b, c)
void grid2universe(const Matrix1D< double > &gv, Matrix1D< double > &uv) const
void sqrt(Image< double > &op)
void ART_voxels2blobs_single_step(GridVolume &vol_in, GridVolume *vol_out, const struct blobtype &blob, const Matrix2D< double > *D, double lambda, MultidimArray< double > *theo_vol, const MultidimArray< double > *read_vol, MultidimArray< double > *corr_vol, const MultidimArray< double > *mask_vol, double &mean_error, double &max_error, int eq_mode, int threads)
Matrix1D< double > vectorR3(double x, double y, double z)
__device__ float bessi4(float x)
void write(const FileName &name="", size_t select_img=ALL_IMAGES, bool isStack=false, int mode=WRITE_OVERWRITE, CastWriteMode castMode=CW_CAST, int _swapWrite=0)
void blobs2space_coefficients(const GridVolume &vol_blobs, const struct blobtype &blob, MultidimArray< double > *vol_coefs)
#define V3_MINUS_V3(a, b, c)
pthread_mutex_t blobs_conv_mutex
void inv(Matrix2D< T > &result) const
void read_vol(char *vol_file, double *width, double *origx, double *origy, double *origz, unsigned *extx, unsigned *exty, unsigned *extz, double **phi)
double blob_freq_zero(struct blobtype b)
String integerToString(int I, int _width, char fill_with)
T norm(const std::vector< T > &v)
double i_nph(int n, double x)
String floatToString(float F, int _width, int _prec)
bool is_interesting(const Matrix1D< double > &uv) const
Matrix1D< double > lowest
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
Matrix1D< T > transpose() const
#define BCC
BCC identifier.
void adapt_to_grid(const Grid &_grid)
#define A3D_ELEM(V, k, i, j)
__device__ float bessi0(float x)
#define FOR_ALL_ELEMENTS_IN_ARRAY3D(V)
__device__ float bessi3(float x)
#define V3_BY_CT(a, b, c)
void box_enclosing(const Matrix1D< double > &v0, const Matrix1D< double > &vF, const Matrix2D< double > &V, Matrix1D< double > &corner1, Matrix1D< double > &corner2)
double sum_blob_Grid(const struct blobtype &blob, const Grid &grid, const Matrix2D< double > *D)
void voxels2blobs(const MultidimArray< double > *vol_voxels, const struct blobtype &blob, GridVolume &vol_blobs, int grid_type, double grid_relative_size, double lambda, const MultidimArray< double > *vol_mask, const Matrix2D< double > *D, double final_error_change, int tell, double R, int threads)
double blob_ops(double w, struct blobtype b)
#define FCC
FCC identifier.
double bessi1_5(double x)
Incorrect argument received.
blobtype best_blob(double alpha_0, double alpha_F, double inc_alpha, double a_0, double a_F, double inc_a, double w, double *target_att, int target_length)
double blob_att(double w, struct blobtype b)
#define IMG2OVER(IO, iv, iu, v, u)
void resize(size_t Xdim, bool copy=true)
#define blob_Fourier_val(w, blob)
__device__ float bessi2(float x)
double relative_size
Measuring unit in the grid coordinate system.
#define M3x3_BY_V3x1(a, M, b)
void footprint_blob(ImageOver &blobprint, const struct blobtype &blob, int istep, int normalise)
double kaiser_Fourier_value(double w, double a, double alpha, int m)
double bessj1_5(double x)
double i_n(int n, double x)
Grid Create_FCC_grid(double relative_size, const Matrix1D< double > &corner1, const Matrix1D< double > &corner2)
Grid Create_BCC_grid(double relative_size, const Matrix1D< double > &corner1, const Matrix1D< double > &corner2)
double bessj3_5(double x)
#define blob_proj(r, blob)
void typeCast(const Matrix1D< T1 > &v1, Matrix1D< T2 > &v2)
const SimpleGrid & grid(size_t n) const
double sum_blob_SimpleGrid(const struct blobtype &blob, const SimpleGrid &grid, const Matrix2D< double > *D)
#define VECTOR_R3(v, x, y, z)
int order
Derivation order and Bessel function order.
double bessi3_5(double x)
double kaiser_proj(double s, double a, double alpha, int m)
double inph_zeroarg(int n)
double get_interest_radius() const
Get reconstruction radius.
double optimal_CC_grid_relative_size(struct blobtype b)
Incorrect value received.
double optimal_BCC_grid_relative_size(struct blobtype b)
double radius
Spatial radius in Universal System units.
double basvolume(double a, double alpha, int m, int n)
#define IMGPIXEL(I, i, j)
#define SPEED_UP_temps012
void * blobs2voxels_SimpleGrid(void *data)