105 eulert = euler.transpose();
154 inverse_angles_matrix = E.
inv();
182 stat = sscanf(line,
"%s %c %lf %lf %lf %lf",
191 (std::string)
"Error when reading common part of feature: " + line);
199 std::vector <double> VecFeatureCenter;
216 std::vector<double> VectSpecific;
225 stat = sscanf(line,
"%*s %*c %*f %*f %*f %*f %lf", &
radius);
233 if (vect.size() != 1)
242 stat = sscanf(line,
"%*s %*c %*f %*f %*f %*f %lf %lf %d", &
radius, &alpha, &
m);
250 if (vect.size() != 3)
267 stat = sscanf(line,
"%*s %*c %*f %*f %*f %*f %lf", &sigma);
276 if (vect.size() != 1)
286 stat = sscanf(line,
"%*s %*c %*f %*f %*f %*f %lf %lf %lf %lf %lf %lf", &xradius,
287 &yradius, &height, &rot, &tilt, &
psi);
296 if (vect.size() != 6)
311 stat = sscanf(line,
"%*s %*c %*f %*f %*f %*f %lf %lf %lf %lf %lf %lf",
312 &
radius, &height, &separation, &rot, &tilt, &
psi);
321 if (vect.size() != 6)
325 separation = vect[2];
335 stat = sscanf(line,
"%*s %*c %*f %*f %*f %*f %lf %lf %lf %lf %lf %lf",
336 &xdim, &ydim, &zdim, &rot, &tilt, &
psi);
345 if (vect.size() != 6)
360 stat = sscanf(line,
"%*s %*c %*f %*f %*f %*f %lf %lf %lf %lf %lf %lf",
361 &xradius, &yradius, &zradius, &rot, &tilt, &
psi);
370 if (vect.size() != 6)
385 stat = sscanf(line,
"%*s %*c %*f %*f %*f %*f %lf %lf %lf %lf %lf", &
radius, &height,
395 if (vect.size() != 5)
407 fprintf(fh,
"sph %c %1.4f % 7.2f % 7.2f % 7.2f % 7.2f\n",
415 std::vector<double> FSVect;
423 fprintf(fh,
"blo %c %1.4f % 7.2f % 7.2f % 7.2f % 7.2f" 432 std::vector<double> FSVect;
434 FSVect.push_back(alpha);
442 fprintf(fh,
"blo %c %1.4f % 7.2f % 7.2f % 7.2f % 7.2f\n",
450 std::vector<double> FSVect;
451 FSVect.push_back(sigma);
458 fprintf(fh,
"cyl %c %1.4f % 7.2f % 7.2f % 7.2f % 7.2f " 459 "% 7.2f % 7.2f % 7.2f % 7.2f % 7.2f\n",
461 xradius, yradius, height,
468 std::vector<double> FSVect;
469 FSVect.push_back(xradius);
470 FSVect.push_back(yradius);
471 FSVect.push_back(height);
472 FSVect.push_back(rot);
473 FSVect.push_back(tilt);
474 FSVect.push_back(
psi);
480 fprintf(fh,
"dcy %c %1.4f % 7.2f % 7.2f % 7.2f % 7.2f " 481 "% 7.2f % 7.2f % 7.2f % 7.2f % 7.2f\n",
483 radius, height, separation,
490 std::vector<double> FSVect;
492 FSVect.push_back(height);
493 FSVect.push_back(separation);
494 FSVect.push_back(rot);
495 FSVect.push_back(tilt);
496 FSVect.push_back(
psi);
502 fprintf(fh,
"cub %c %1.4f % 7.2f % 7.2f % 7.2f % 7.2f " 503 "% 7.2f % 7.2f % 7.2f % 7.2f % 7.2f\n",
512 std::vector<double> FSVect;
513 FSVect.push_back(xdim);
514 FSVect.push_back(ydim);
515 FSVect.push_back(zdim);
516 FSVect.push_back(rot);
517 FSVect.push_back(tilt);
518 FSVect.push_back(
psi);
525 fprintf(fh,
"ell %c %1.4f % 7.2f % 7.2f % 7.2f % 7.2f " 526 "% 7.2f % 7.2f % 7.2f % 7.2f % 7.2f\n",
528 xradius, yradius, zradius,
535 std::vector<double> FSVect;
536 FSVect.push_back(xradius);
537 FSVect.push_back(yradius);
538 FSVect.push_back(zradius);
539 FSVect.push_back(rot);
540 FSVect.push_back(tilt);
541 FSVect.push_back(
psi);
548 fprintf(fh,
"con %c %1.4f % 7.2f % 7.2f % 7.2f % 7.2f " 549 "% 7.2f % 7.2f % 7.2f % 7.2f\n",
558 std::vector<double> FSVect;
560 FSVect.push_back(height);
561 FSVect.push_back(rot);
562 FSVect.push_back(tilt);
563 FSVect.push_back(
psi);
573 o <<
"Feature --------" << std::endl;
574 o <<
" type: " << F->
type << std::endl;
575 o <<
" add_assign: " << F->
add_assign << std::endl;
576 o <<
" density: " << F->
density << std::endl;
578 if (F->
type ==
"sph")
580 else if (F->type ==
"blo")
582 else if (F->type ==
"gau")
584 else if (F->type ==
"cyl")
586 else if (F->type ==
"dcy")
588 else if (F->type ==
"cub")
590 else if (F->type ==
"ell")
592 else if (F->type ==
"con")
601 o <<
" Radius: " << f.
radius << std::endl;
608 o <<
" Radius: " << f.
radius << std::endl;
609 o <<
" Alpha: " << f.
alpha << std::endl;
610 o <<
" m: " << f.
m << std::endl;
617 o <<
" Sigma: " << f.
sigma << std::endl;
624 o <<
" XRadius: " << f.
xradius << std::endl;
625 o <<
" YRadius: " << f.
yradius << std::endl;
626 o <<
" Height: " << f.
height << std::endl;
627 o <<
" Rot: " << f.
rot << std::endl;
628 o <<
" Tilt: " << f.
tilt << std::endl;
629 o <<
" Psi: " << f.
psi << std::endl;
636 o <<
" Radius: " << f.
radius << std::endl;
637 o <<
" Height: " << f.
height << std::endl;
638 o <<
" Separ.: " << f.
separation << std::endl;
639 o <<
" Rot: " << f.
rot << std::endl;
640 o <<
" Tilt: " << f.
tilt << std::endl;
641 o <<
" Psi: " << f.
psi << std::endl;
648 o <<
" Xdim: " << f.
xdim << std::endl;
649 o <<
" Ydim: " << f.
ydim << std::endl;
650 o <<
" Zdim: " << f.
zdim << std::endl;
651 o <<
" Rot: " << f.
rot << std::endl;
652 o <<
" Tilt: " << f.
tilt << std::endl;
653 o <<
" Psi: " << f.
psi << std::endl;
660 o <<
" Xradius: " << f.
xradius << std::endl;
661 o <<
" Yradius: " << f.
yradius << std::endl;
662 o <<
" Zradius: " << f.
zradius << std::endl;
663 o <<
" Rot: " << f.
rot << std::endl;
664 o <<
" Tilt: " << f.
tilt << std::endl;
665 o <<
" Psi: " << f.
psi << std::endl;
672 o <<
" Radius: " << f.
radius << std::endl;
673 o <<
" Height: " << f.
height << std::endl;
674 o <<
" Rot: " << f.
rot << std::endl;
675 o <<
" Tilt: " << f.
tilt << std::endl;
676 o <<
" Psi: " << f.
psi << std::endl;
686 #define DEF_Sph_Blob_point_inside {\ 688 V3_MINUS_V3(aux,r,center);\ 690 if (XX(aux)*XX(aux) + YY(aux)*YY(aux) +ZZ(aux)*ZZ(aux) <= radius*radius)\ 705 #undef DEF_Sph_Blob_point_inside 720 if (
XX(aux)*
XX(aux) +
YY(aux)*
YY(aux) +
ZZ(aux)*
ZZ(aux) <= 16*sigma*sigma)
733 double sigma2=sigma*sigma;
734 return norm/(sigma2*sigma)*exp(-0.5*rmod*rmod/sigma2);
749 tx =
XX(aux) / xradius;
750 ty =
YY(aux) / yradius;
751 if (tx*tx + ty*ty <= 1.0 && fabs(
ZZ(aux)) <= height / 2)
768 double cyl_center = separation / 2 + height / 2;
769 if (
ABS(
ZZ(aux) - cyl_center) <= height / 2)
771 else if (
ABS(
ZZ(aux) + cyl_center) <= height / 2)
787 if (
ABS(
XX(aux)) <= xdim / 2 &&
ABS(
YY(aux)) <= ydim / 2 &&
788 ABS(
ZZ(aux)) <= zdim / 2)
806 tx =
XX(aux) / xradius;
807 ty =
YY(aux) / yradius;
808 tz =
ZZ(aux) / zradius;
809 if (tx*tx + ty*ty + tz*tz <= 1.0)
825 if (
ABS(
ZZ(aux)) <= height / 2)
827 Zradius =
radius * (1 - (
ZZ(aux) + height / 2) / height);
828 if (
XX(aux)*
XX(aux) +
YY(aux)*
YY(aux) <= Zradius*Zradius)
839 if (ZZ(r)==0 && YY(r)==0) \ 840 std::cout << "Point (z=" << ZZ(aux1) << ",y=" << YY(aux1) << ",x=" \ 841 << XX(aux1) << ") inside=" << inside << std::endl; 851 XX(aux1) =
XX(r) + 0.25;
852 YY(aux1) =
YY(r) + 0.25;
853 ZZ(aux1) =
ZZ(r) + 0.25;
896 XX(aux1) =
XX(r) + 0.25;
897 YY(aux1) =
YY(r) + 0.25;
898 ZZ(aux1) =
ZZ(r) + 0.25;
940 double radius2 = radius *
radius;
941 bool intersects =
false;
942 for (
int k =
FLOOR(
ZZ(r) - radius);
k <=
CEIL(
ZZ(r) + radius) && !intersects;
k++)
945 double distk2=(dk -
ZZ(r))*(dk -
ZZ(r));
946 for (
int i =
FLOOR(
YY(r) - radius);
i <=
CEIL(
YY(r) + radius) && !intersects;
i++)
949 double distki2=distk2+(
di -
YY(r))*(
di -
YY(r));
950 for (
int j =
FLOOR(
XX(r) - radius);
j <=
CEIL(
XX(r) + radius) && !intersects;
j++)
953 if (distki2+(dj -
XX(r))*(dj -
XX(r))>radius2)
982 #define Vr A3D_ELEM(V,(int)ZZ(r),(int)YY(r),(int)XX(r)) 1001 final_colour = colour;
1008 std::cout <<
"Drawing \n";
1010 std::cout <<
"colour_mode=" << colour_mode << std::endl;
1011 std::cout <<
"add_assign= " <<
add_assign << std::endl;
1012 std::cout <<
"add= " << add << std::endl;
1013 std::cout <<
" Corner 1" << corner1.
transpose() << std::endl;
1014 std::cout <<
" Corner 2" << corner2.
transpose() << std::endl;
1024 std::cout <<
" r=" << r.
transpose() <<
" inside= " << inside;
1029 double drawing_colour = final_colour * inside / 8;
1031 Vr += drawing_colour;
1033 Vr = drawing_colour;
1037 std::cout <<
" V(r)=" <<
VOLVOXEL(V, (
int)
ZZ(r), (
int)
YY(r), (
int)
XX(r));
1043 std::cout << std::endl;
1064 if (inside != 0 && inside != 8)
1138 double sigma2=sigma*sigma;
1139 return 1.0/sigma2*exp(-0.5*rmod*rmod/sigma2);
1169 std::cout <<
"Intersecting .-.-.-.-.-.-.\n";
1171 std::cout <<
" direction(Univ) = " << direction.
transpose() << std::endl;
1172 std::cout <<
" passing (Univ) = " << passing_point.
transpose() << std::endl;
1173 std::cout <<
" direction(Obj.) = " << u.
transpose() << std::endl;
1174 std::cout <<
" passing (Obj.) = " << r.
transpose() << std::endl;
1203 ZZ(r) -= (separation / 2 + height / 2);
1214 ZZ(r) += (separation / 2 + height / 2);
1220 return (i1 + i2) /
norm;
1296 constexpr
float SUBSAMPLING = 2;
1299 constexpr
float SUBSTEP = 1/(SUBSAMPLING*2.0);
1321 std::cout <<
"Actual feature\n" <<
this << std::endl;
1323 std::cout <<
"VP matrix\n" << VP << std::endl;
1325 std::cout <<
"direction " << direction.
transpose() << std::endl;
1326 std::cout <<
"P.euler matrix " << P.
euler << std::endl;
1327 std::cout <<
"max_distance " <<
max_distance << std::endl;
1328 std::cout <<
"origin " << origin.
transpose() << std::endl;
1347 std::cout <<
"Corner1 : " << corner1.
transpose() << std::endl
1348 <<
"Corner2 : " << corner2.
transpose() << std::endl;
1356 std::cout <<
"Corner1 moves to : " << corner1.
transpose() << std::endl
1357 <<
"Corner2 moves to : " << corner2.
transpose() << std::endl;
1365 std::cout <<
"Corner1 finally is : " << corner1.
transpose() << std::endl
1366 <<
"Corner2 finally is : " << corner2.
transpose() << std::endl;
1396 std::cout <<
"corner1 " << corner1.
transpose() << std::endl;
1397 std::cout <<
"corner2 " << corner2.
transpose() << std::endl;
1402 if (
XX(corner1) ==
XX(corner2))
1404 if (
YY(corner1) ==
YY(corner2))
1409 for (
auto v = (
int)
YY(corner1); v <= (int)
YY(corner2); v++)
1410 for (
auto u = (
int)
XX(corner1);
u <= (int)
XX(corner2);
u++)
1413 #ifdef DEBUG_EVEN_MORE 1415 std::cout <<
"Studying point (" <<
u <<
"," << v <<
")\n";
1420 double u0 =
u - (int)(SUBSAMPLING / 2.0) * SUBSTEP;
1421 double v0 = v - (int)(SUBSAMPLING / 2.0) * SUBSTEP;
1423 for (
int subv = 0; subv < SUBSAMPLING; subv++)
1426 for (
int subu = 0; subu < SUBSAMPLING; subu++)
1441 if (possible_length > 0)
1442 length += possible_length;
1444 #ifdef DEBUG_EVEN_MORE 1446 std::cout <<
"Averaging at (" << actu <<
"," << actv <<
")\n";
1447 std::cout <<
" which in univ. coords is " << act.
transpose() << std::endl;
1448 std::cout <<
" intersection there " << possible_length << std::endl;
1451 actu += SUBSTEP * 2.0;
1453 actv += SUBSTEP * 2.0;
1455 length /= (SUBSAMPLING * SUBSAMPLING);
1458 std::cout <<
"Final value added at position (" <<
u <<
"," << v <<
")=" 1459 << length << std::endl;
1468 #undef DEBUG_EVEN_MORE 1473 #define COPY_COMMON_PART \ 1475 f->add_assign = add_assign; \ 1476 f->density = density; \ 1479 #define COPY_ANGLES \ 1498 *_f =
scale(factor);
1517 *_f =
scale(factor);
1527 f->
sigma = factor * sigma;
1534 *_f =
scale(factor);
1545 f->
xradius = factor * xradius;
1546 f->
yradius = factor * yradius;
1547 f->
height = factor * height;
1554 *_f =
scale(factor);
1566 f->
height = factor * height;
1567 f->
separation = separation - 2 * (factor - 1) * height;
1575 *_f =
scale(factor);
1586 f->
xdim = factor * xdim;
1587 f->
ydim = factor * ydim;
1588 f->
zdim = factor * zdim;
1595 *_f =
scale(factor);
1606 f->
xradius = factor * xradius;
1607 f->
yradius = factor * yradius;
1608 f->
zradius = factor * zradius;
1615 *_f =
scale(factor);
1627 f->
height = factor * height;
1634 *_f =
scale(factor);
1637 #undef COPY_COMMON_PART 1667 return scale(back_param);
1682 double minradius,
double maxradius,
1683 double minden,
double maxden,
1684 double minx0,
double maxx0,
1685 double miny0,
double maxy0,
1686 double minz0,
double maxz0)
1703 double minradius,
double maxradius,
1704 double minalpha,
double maxalpha,
1705 double minorder,
double maxorder,
1706 double minden,
double maxden,
1707 double minx0,
double maxx0,
1708 double miny0,
double maxy0,
1709 double minz0,
double maxz0)
1721 alpha =
rnd_unif(minalpha, maxalpha);
1722 m = (int)(
rnd_unif(minorder, maxorder) + 0.5);
1727 double minsigma,
double maxsigma,
1728 double minden,
double maxden,
1729 double minx0,
double maxx0,
1730 double miny0,
double maxy0,
1731 double minz0,
double maxz0)
1742 sigma =
rnd_unif(minsigma, maxsigma);
1747 double minxradius,
double maxxradius,
1748 double minyradius,
double maxyradius,
1749 double minheight,
double maxheight,
1750 double minden,
double maxden,
1751 double minx0,
double maxx0,
1752 double miny0,
double maxy0,
1753 double minz0,
double maxz0,
1754 double minrot,
double maxrot,
1755 double mintilt,
double maxtilt,
1756 double minpsi,
double maxpsi)
1767 xradius =
rnd_unif(minxradius, maxxradius);
1768 yradius =
rnd_unif(minyradius, maxyradius);
1769 height =
rnd_unif(minheight, maxheight);
1774 eulert = euler.transpose();
1780 double minradius,
double maxradius,
1781 double minheight,
double maxheight,
1782 double minsep,
double maxsep,
1783 double minden,
double maxden,
1784 double minx0,
double maxx0,
1785 double miny0,
double maxy0,
1786 double minz0,
double maxz0,
1787 double minrot,
double maxrot,
1788 double mintilt,
double maxtilt,
1789 double minpsi,
double maxpsi)
1801 height =
rnd_unif(minheight, maxheight);
1802 separation =
rnd_unif(minsep, maxsep);
1807 eulert = euler.transpose();
1814 double minXdim,
double maxXdim,
1815 double minYdim,
double maxYdim,
1816 double minZdim,
double maxZdim,
1817 double minden,
double maxden,
1818 double minx0,
double maxx0,
1819 double miny0,
double maxy0,
1820 double minz0,
double maxz0,
1821 double minrot,
double maxrot,
1822 double mintilt,
double maxtilt,
1823 double minpsi,
double maxpsi)
1849 eulert = euler.transpose();
1855 double minXradius,
double maxXradius,
1856 double minYradius,
double maxYradius,
1857 double minZradius,
double maxZradius,
1858 double minden,
double maxden,
1859 double minx0,
double maxx0,
1860 double miny0,
double maxy0,
1861 double minz0,
double maxz0,
1862 double minrot,
double maxrot,
1863 double mintilt,
double maxtilt,
1864 double minpsi,
double maxpsi)
1875 if (minYradius == 0)
1876 minYradius = minXradius;
1877 if (minZradius == 0)
1878 minZradius = minXradius;
1879 if (maxYradius == 0)
1880 maxYradius = maxXradius;
1881 if (maxZradius == 0)
1882 maxZradius = maxXradius;
1883 xradius =
rnd_unif(minXradius, maxXradius);
1884 yradius =
rnd_unif(minYradius, maxYradius);
1885 zradius =
rnd_unif(minZradius, maxZradius);
1890 eulert = euler.transpose();
1896 double minradius,
double maxradius,
1897 double minheight,
double maxheight,
1898 double minden,
double maxden,
1899 double minx0,
double maxx0,
1900 double miny0,
double maxy0,
1901 double minz0,
double maxz0,
1902 double minrot,
double maxrot,
1903 double mintilt,
double maxtilt,
1904 double minpsi,
double maxpsi)
1916 height =
rnd_unif(minheight, maxheight);
1921 eulert = euler.transpose();
1934 double no_points = 0;
1952 sum2 += voxel * voxel;
1958 mean = sum1 / no_points;
1959 var = sum2 / no_points - mean * mean;
1969 xdim = ydim = zdim = 0;
1970 Background_Density = 0;
1983 xdim = ydim = zdim = 0;
1984 Background_Density = 0;
1986 for (
size_t i = 0;
i < VF.size();
i++)
2010 for (
size_t i = 0;
i < P.
VF.size();
i++)
2011 if (P.
VF[
i]->type ==
"sph")
2017 else if (P.
VF[
i]->type ==
"blo")
2023 else if (P.
VF[
i]->type ==
"gau")
2029 else if (P.
VF[
i]->type ==
"cyl")
2035 else if (P.
VF[
i]->type ==
"dcy")
2041 else if (P.
VF[
i]->type ==
"cub")
2047 else if (P.
VF[
i]->type ==
"ell")
2053 else if (P.
VF[
i]->type ==
"con")
2065 for (
size_t i = 0;
i < VF.size();
i++)
2073 for (
size_t i = 0;
i < VF.size();
i++)
2082 for (
size_t i = 0;
i < VF.size();
i++)
2093 int Global_Feature_Read = 0;
2106 std::string feat_type;
2117 std::vector <double> TempVec;
2121 MD1.
read((std::string)
"block1@"+fn_phantom.c_str());
2122 MD2.
read((std::string)
"block2@"+fn_phantom.c_str());
2127 if (TempVec.size()<3)
2129 xdim = (int)TempVec[0];
2130 ydim = (int)TempVec[1];
2131 zdim = (int)TempVec[2];
2133 Background_Density = 0;
2138 xdim = (int)
CEIL(scale * xdim);
2139 ydim = (int)
CEIL(scale * ydim);
2140 zdim = (int)
CEIL(scale * zdim);
2144 current_scale =
scale;
2147 for (
auto& FeatureRow: MD2)
2151 if (feat_type ==
"sph")
2155 sph->
read(FeatureRow);
2157 else if (feat_type ==
"blo")
2161 blo->
read(FeatureRow);
2163 else if (feat_type ==
"gau")
2167 gau->
read(FeatureRow);
2169 else if (feat_type ==
"cyl")
2173 cyl->
read(FeatureRow);
2175 else if (feat_type ==
"dcy")
2179 dcy->
read(FeatureRow);
2181 else if (feat_type ==
"cub")
2185 cub->
read(FeatureRow);
2187 else if (feat_type ==
"ell")
2191 ell->
read(FeatureRow);
2193 else if (feat_type ==
"con")
2197 con->
read(FeatureRow);
2203 scaled_feat = feat->
scale(scale);
2208 VF.push_back(scaled_feat);
2217 if ((fh_phantom = fopen(fn_phantom.c_str(),
"r")) ==
nullptr)
2222 size_t lineNumber = 0;
2224 while (fgets(line, 256, fh_phantom) !=
nullptr)
2231 if (line[0] ==
'\n')
2235 if (Global_Feature_Read == 0)
2237 Global_Feature_Read = 1;
2238 stat = sscanf(line,
"%d %d %d %lf %lf", &xdim, &ydim, &zdim,
2239 &Background_Density, &scale);
2242 " dimensions and global density in volume description file");
2244 Background_Density = 0;
2249 xdim = (int)
CEIL(scale * xdim);
2250 ydim = (int)
CEIL(scale * ydim);
2251 zdim = (int)
CEIL(scale * zdim);
2255 current_scale =
scale;
2260 stat = sscanf(line,
"%s", straux);
2265 if (feat_type ==
"sph")
2272 else if (feat_type ==
"blo")
2279 else if (feat_type ==
"gau")
2286 else if (feat_type ==
"cyl")
2293 else if (feat_type ==
"dcy")
2300 else if (feat_type ==
"cub")
2307 else if (feat_type ==
"ell")
2314 else if (feat_type ==
"con")
2327 scaled_feat = feat->
scale(scale);
2332 VF.push_back(scaled_feat);
2338 phantom_scale =
scale;
2345 std::cout <<
"Phantom ---------------------------------------\n";
2346 std::cout <<
"Dimensions: " << P.
xdim <<
" x " << P.
ydim <<
" x " << P.
zdim << std::endl;
2348 std::cout <<
"phantom_scale : " << P.
phantom_scale << std::endl;
2349 for (
size_t i = 0;
i < P.
VF.size();
i++)
2359 std::vector<double> FCVect(3);
2362 std::vector<double> PCVector;
2365 PCVector.push_back(xdim);
2366 PCVector.push_back(ydim);
2367 PCVector.push_back(zdim);
2370 if (current_scale != 1)
2377 std::string SAddAssign;
2378 for (
size_t i = 0;
i < VF.size();
i++)
2381 SAddAssign = VF[
i]->add_assign;
2389 VF[
i]->feat_printm(MD2,
id);
2400 double current_density;
2402 current_density = Background_Density;
2403 for (
size_t i = 0;
i < VF.size();
i++)
2405 inside = VF[
i]->voxel_inside(r, aux1, aux2);
2406 if (inside != 0 && VF[
i]->
density > current_density)
2409 current_density = VF[
i]->density;
2421 for (
size_t i = 0;
i < VF.size();
i++)
2423 intersects = VF[
i]->intersects_sphere(r, radius, aux1, aux2, aux3);
2434 V.
resize(zdim, ydim, xdim);
2437 for (
size_t i = 0;
i < VF.size();
i++)
2448 V.
resize(zdim, ydim, xdim);
2455 int sel_feat = voxel_inside_any_feat(r, aux1, aux2);
2460 sel_feat = -sel_feat;
2471 V.
resize(zdim, ydim, xdim);
2474 for (
size_t i = 0;
i < VF.size();
i++)
2481 for (
size_t i = 0;
i < VF.size();
i++)
2482 VF[
i]->
shift(shiftX, shiftY, shiftZ);
2488 for (
size_t i = 0;
i < VF.size();
i++)
2500 if (inv == xmipp_transformation::IS_INV)
2505 for (
size_t i = 0;
i < VF.size();
i++)
2515 std::cout <<
"Ydim=" << Ydim <<
" Xdim=" << Xdim << std::endl
2516 <<
"rot=" << rot <<
" tilt=" << tilt <<
" psi=" << psi << std::endl
2520 P().initZeros(Ydim, Xdim);
2521 P().setXmippOrigin();
2530 for (
size_t i = 0;
i < VF.size();
i++)
2547 for (
size_t i = 0;
i < VF.size();
i++)
2556 for (
size_t i = 0;
i < VF.size();
i++)
2558 if (
rnd_unif(0, 1) < disappearing_th)
2573 std::cout <<
"Direction: " << direction << std::endl;
2574 std::cout <<
"z0: " << z0 << std::endl;
2575 std::cout <<
"zdim: " << zdim << std::endl;
2582 if (
XSIZE((*P)()) == 0)
2584 (*P)().resize(ydim, xdim);
2585 (*P)().setXmippOrigin();
2590 std::cout <<
"Processing (" <<
i <<
"," <<
j <<
")" << std::endl;
2603 std::cout <<
"Initial k=" << k << std::endl;
2612 std::cout <<
"Checking " << r.
transpose() << std::endl;
2615 if (any_feature_intersects_sphere(r, radius, aux1, aux2, aux3))
void label(MultidimArray< double > &V)
double kaiser_value(double r, double a, double alpha, int m)
virtual void rotate(const Matrix2D< double > &E)
void assign(const Cube &F)
double density_inside(const Matrix1D< double > &r, Matrix1D< double > &aux) const
double volume() const
Return the volume of all the features.
double height
Each cylinder height.
void init_rnd(double minXdim, double maxXdim, double minYdim=0, double maxYdim=0, double minZdim=0, double maxZdim=0, double minden=1.0, double maxden=1.0, double minx0=0, double maxx0=0, double miny0=0, double maxy0=0, double minz0=0, double maxz0=0, double minrot=0, double maxrot=360, double mintilt=0, double maxtilt=180, double minpsi=0, double maxpsi=360)
#define VOLVOXEL(V, k, i, j)
void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)
double phantom_scale
Param file scale.
int ydim
Final volume Y dimension.
double point_line_distance_3D(const Matrix1D< double > &p, const Matrix1D< double > &a, const Matrix1D< double > &v)
int point_inside(const Matrix1D< double > &r, Matrix1D< double > &aux) const
void sortTwoVectors(Matrix1D< T > &v1, Matrix1D< T > &v2)
double radius
Sphere radius.
#define REPORT_ERROR(nerr, ErrormMsg)
double intersection(const Matrix1D< double > &direction, const Matrix1D< double > &passing_point, Matrix1D< double > &r, Matrix1D< double > &u) const
Problem with matrix size.
void feat_printm(MetaData &MD, size_t id)
void readCommon(char *line)
void corners(const MultidimArray< double > &V, Matrix1D< double > &corner1, Matrix1D< double > &corner2)
double voxel_inside_by_normalized_density(const Matrix1D< double > &r, Matrix1D< double > &aux1, Matrix1D< double > &aux2) const
void Euler_angles2matrix(T alpha, T beta, T gamma, Matrix2D< T > &A, bool homogeneous)
#define DEF_Sph_Blob_point_inside
double tilt
Second Euler angle.
void project_to(Projection &P, const Matrix2D< double > &VP, const Matrix2D< double > &PV) const
double xradius
X radius before rotating.
void feat_printm(MetaData &MD, size_t id)
void read_specific(char *line)
int point_inside(const Matrix1D< double > &r, Matrix1D< double > &aux) const
void sqrt(Image< double > &op)
void rotate(const Matrix2D< double > &E)
void draw_in(MultidimArray< double > &V, int color_mode=INTERNAL, double colour=-1)
void init_rnd(double minXradius, double maxXradius, double minYradius, double maxYradius, double minZradius, double maxZradius, double minden=1.0, double maxden=1.0, double minx0=0, double maxx0=0, double miny0=0, double maxy0=0, double minz0=0, double maxz0=0, double minrot=0, double maxrot=360, double mintilt=0, double maxtilt=180, double minpsi=0, double maxpsi=360)
void sketch_in(MultidimArray< double > &V, double colour=2)
int point_inside(const Matrix1D< double > &r, Matrix1D< double > &aux) const
void sketch_in(MultidimArray< double > &V, int clean=DONT_CLEAN, double colour=2)
int voxel_inside_any_feat(const Matrix1D< double > &r, Matrix1D< double > &aux1, Matrix1D< double > &aux2) const
#define V3_MINUS_V3(a, b, c)
void feat_printf(FILE *fh) const
void read_specific(char *line)
int intersects_sphere(const Matrix1D< double > &r, double radius, Matrix1D< double > &aux1, Matrix1D< double > &aux2, Matrix1D< double > &aux3) const
void inv(Matrix2D< T > &result) const
void feat_printf(FILE *fh) const
Matrix1D< double > center
Matrix2D< T > transpose() const
double intersection(const Matrix1D< double > &direction, const Matrix1D< double > &passing_point, Matrix1D< double > &r, Matrix1D< double > &u) const
void init_rnd(double minradius, double maxradius, double minalpha, double maxalpha, double minorder, double maxorder, double minden=1.0, double maxden=1.0, double minx0=0, double maxx0=0, double miny0=0, double maxy0=0, double minz0=0, double maxz0=0)
double intersection_unit_cylinder(const Matrix1D< double > &u, const Matrix1D< double > &r)
void shift(double shiftX, double shiftY, double shiftZ)
void feat_printf(FILE *fh) const
T norm(const std::vector< T > &v)
double intersection(const Matrix1D< double > &direction, const Matrix1D< double > &passing_point, Matrix1D< double > &r, Matrix1D< double > &u) const
void assign(const Gaussian &F)
void shift(double shiftX, double shiftY, double shiftZ)
void read_specific(char *line)
Feature * scale(double factor) const
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
void read_specific(char *line)
#define FOR_ALL_ELEMENTS_IN_ARRAY2D(m)
Matrix1D< T > transpose() const
virtual void rotate_center(const Matrix2D< double > &E)
void init_rnd(double minsigma, double maxsigma, double minden=1.0, double maxden=1.0, double minx0=0, double maxx0=0, double miny0=0, double maxy0=0, double minz0=0, double maxz0=0)
#define A3D_ELEM(V, k, i, j)
int any_feature_intersects_sphere(const Matrix1D< double > &r, double radius, Matrix1D< double > &aux1, Matrix1D< double > &aux2, Matrix1D< double > &aux3) const
int voxel_inside(const Matrix1D< double > &r, Matrix1D< double > &aux1, Matrix1D< double > &aux2) const
#define FOR_ALL_ELEMENTS_IN_ARRAY3D(V)
double radius
Blob radius.
#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 density_inside(const Matrix1D< double > &r, Matrix1D< double > &aux) const
T & getValue(MDLabel label)
void feat_printf(FILE *fh) const
Feature * scale(double factor) const
void feat_printm(MetaData &MD, size_t id)
void assign(const Cylinder &F)
double intersection_unit_sphere(const Matrix1D< double > &u, const Matrix1D< double > &r)
virtual void rotate(const Matrix2D< double > &E)
Incorrect argument received.
void write(const FileName &fn_phantom="")
void init_rnd(double minradius, double maxradius, double minden=1.0, double maxden=1.0, double minx0=0, double maxx0=0, double miny0=0, double maxy0=0, double minz0=0, double maxz0=0)
double height
Cone height.
void draw_in(MultidimArray< double > &V)
void resize(size_t Xdim, bool copy=true)
virtual Feature * scale(double factor) const =0
double height
Cylinder height.
double intersection(const Matrix1D< double > &direction, const Matrix1D< double > &passing_point, Matrix1D< double > &r, Matrix1D< double > &u) const
double Background_Density
Final volume background density.
Feature * scale(double factor) const
void assign(const Ellipsoid &F)
void assign(const Blob &F)
void surface(double z0, double radius, int direction, Image< double > *P) const
void read_specific(char *line)
__host__ __device__ float length(float2 v)
Couldn't read from file.
void feat_printm(MetaData &MD, size_t id)
void direction(const MultidimArray< double > &orMap, MultidimArray< double > &qualityMap, double lambda, int size, MultidimArray< double > &dirMap, int x, int y)
void read(const FileName &fn_phantom, bool apply_scale=true)
int point_inside(const Matrix1D< double > &r, Matrix1D< double > &aux) const
double intersection_unit_cube(const Matrix1D< double > &u, const Matrix1D< double > &r)
double separation
Separation between cylinders.
void feat_printf(FILE *fh) const
void read_specific(char *line)
double intersection(const Matrix1D< double > &direction, const Matrix1D< double > &passing_point, Matrix1D< double > &r, Matrix1D< double > &u) const
void read_specific(char *line)
Matrix1D< double > direction
Phantom & operator=(const Phantom &P)
Assignment.
Feature * scale(double factor) const
double intersection(const Matrix1D< double > &direction, const Matrix1D< double > &passing_point, Matrix1D< double > &r, Matrix1D< double > &u) const
int point_inside(const Matrix1D< double > &r, Matrix1D< double > &aux) const
void init_rnd(double minradius, double maxradius, double minheight, double maxheight, double minden=1.0, double maxden=1.0, double minx0=0, double maxx0=0, double miny0=0, double maxy0=0, double minz0=0, double maxz0=0, double minrot=0, double maxrot=360, double mintilt=0, double maxtilt=180, double minpsi=0, double maxpsi=360)
double ydim
Y dimension before rotating.
double intersection(const Matrix1D< double > &direction, const Matrix1D< double > &passing_point, Matrix1D< double > &r, Matrix1D< double > &u) const
#define M3x3_BY_V3x1(a, M, b)
void assign(const Oriented_Feature &OF)
double max_distance() const
Return the maximum distance of any feature to the volume center.
double density_inside(const Matrix1D< double > &r, Matrix1D< double > &aux) const
Feature * scale(double factor) const
double yradius
Cylinder Y radius.
Feature * scale(double factor) const
int zdim
Final volume Z dimension.
bool isMetaData(bool failIfNotExists=true) const
Feature * background(int back_mode, double back_param) const
void feat_printf(FILE *fh) const
void feat_printm(MetaData &MD, size_t id)
void prepare()
Prepare for work.
void init_rnd(double minradius, double maxradius, double minheight, double maxheight, double minsep, double maxsep, double minden=1.0, double maxden=1.0, double minx0=0, double maxx0=0, double miny0=0, double maxy0=0, double minz0=0, double maxz0=0, double minrot=0, double maxrot=360, double mintilt=0, double maxtilt=180, double minpsi=0, double maxpsi=360)
#define FIRST_XMIPP_INDEX(size)
void feat_printf(FILE *fh) const
double rot
First Euler angle.
double psi(const double x)
double zdim
Z dimension before rotating.
void Euler_matrix2angles(const Matrix2D< double > &A, double &alpha, double &beta, double &gamma, bool homogeneous)
int xdim
Final volume X dimension.
#define VECTOR_R3(v, x, y, z)
void feat_printm(MetaData &MD, size_t id)
void init_rnd(double minxradius, double maxxradius, double minyradius, double maxyradius, double minheight, double maxheight, double minden=1.0, double maxden=1.0, double minx0=0, double maxx0=0, double miny0=0, double maxy0=0, double minz0=0, double maxz0=0, double minrot=0, double maxrot=360, double mintilt=0, double maxtilt=180, double minpsi=0, double maxpsi=360)
String formatString(const char *format,...)
double radius
Cylinder radius.
void mean_variance_in_plane(Image< double > *V, double z, double &mean, double &var)
void feat_printm(MetaData &MD, size_t id)
void assign(const Cone &F)
double psi
Third Euler angle.
fprintf(glob_prnt.io, "\)
void assign(const Sphere &F)
static String label2Str(const MDLabel &label)
friend std::ostream & operator<<(std::ostream &o, const Sphere &f)
double kaiser_proj(double s, double a, double alpha, int m)
void setAngles(double _rot, double _tilt, double _psi)
unsigned int randomize_random_generator()
void assign(const DCylinder &F)
#define LAST_XMIPP_INDEX(size)
void project_to(Projection &P, int Ydim, int Xdim, double rot, double tilt, double psi, const Matrix2D< double > *A=nullptr) const
void assign(const Feature &F)
double zradius
Z radius before rotating.
double yradius
Y radius before rotating.
void selfApplyGeometry(const Matrix2D< double > &A, int inv)
Incorrect value received.
void getRow(size_t i, Matrix1D< T > &v) const
int point_inside(const Matrix1D< double > &r, Matrix1D< double > &aux) const
int point_inside(const Matrix1D< double > &r, Matrix1D< double > &aux) const
double radius
Cone base radius.
void feat_printf(FILE *fh) const
void read_specific(char *line)
Feature * scale(double factor) const
double xradius
Cylinder X radius.
Feature * scale(double factor) const
std::vector< Feature * > VF
List with the features.
void feat_printm(MetaData &MD, size_t id)
#define FOR_ALL_ELEMENTS_IN_ARRAY3D_BETWEEN(corner1, corner2)
#define V3_PLUS_V3(a, b, c)
double basvolume(double a, double alpha, int m, int n)
Feature * encircle(double radius=0) const
#define IMGPIXEL(I, i, j)
double xdim
X dimension before rotating.
void selfApplyGeometry(const Matrix2D< double > &A)
#define SPEED_UP_temps012
int point_inside(const Matrix1D< double > &r, Matrix1D< double > &aux) const
double intersection(const Matrix1D< double > &direction, const Matrix1D< double > &passing_point, Matrix1D< double > &r, Matrix1D< double > &u) const