142 const std::vector<double> ¶ms,
143 const std::vector<std::string> &vec_type,
144 const std::vector<std::string> &vec_flag,
145 std::shared_ptr<geom::GeomObject> &obj,
146 bool perform_check) {
150 std::vector<std::string> no_default_obj = {
"cylinder",
"complex",
151 "rectangle_minus_rectangle",
152 "cuboid_minus_cuboid",
153 "circle_minus_circle",
154 "ellipse_minus_ellipse",
155 "sphere_minus_sphere",
156 "open_rect_channel_2d",
157 "open_cuboid_channel_3d"};
160 if (type !=
"complex")
166 std::ostringstream oss;
168 oss <<
"Error: Data maybe invalid. Can not create geometrical object: "
177 std::cerr << oss.str();
183 if (type ==
"circle") {
187 obj = std::make_shared<geom::Circle>(
188 params[0],
util::Point(params[1], params[2], params[3]));
191 if (params.size() < 1) {
193 std::cerr <<
"Error: need at least " << 1
194 <<
" parameters for creating circle. "
195 "Number of params provided = "
203 obj = std::make_shared<geom::Circle>(params[0],
207 else if (type ==
"rectangle") {
211 obj = std::make_shared<geom::Rectangle>(
212 params[0], params[1],
216 if (params.size() != 6 or params.size() != 5) {
218 std::cerr <<
"Error: need either 5 or 6"
219 <<
" parameters for creating Rectangle. "
220 "Number of params provided = "
228 if (params.size() == 6)
229 obj = std::make_shared<geom::Rectangle>(
232 else if (params.size() == 5)
233 obj = std::make_shared<geom::Rectangle>(
234 params[0], params[1],
238 else if (type ==
"square") {
242 obj = std::make_shared<geom::Square>(
247 if (params.size() != 6) {
249 std::cerr <<
"Error: need " << 6
250 <<
" parameters for creating Square. "
251 "Number of params provided = "
259 obj = std::make_shared<geom::Square>(
264 else if (type ==
"triangle") {
268 obj = std::make_shared<geom::Triangle>(
269 params[0],
util::Point(params[1], params[2], params[3]),
273 if (params.size() != 4) {
275 std::cerr <<
"Error: need at least " << 4
276 <<
" parameters for creating triangle. "
277 "Number of params provided = "
285 obj = std::make_shared<geom::Triangle>(
286 params[0],
util::Point(params[1], params[2], params[3]));
289 else if (type ==
"hexagon") {
293 obj = std::make_shared<geom::Hexagon>(
294 params[0],
util::Point(params[1], params[2], params[3]),
298 if (params.size() != 4) {
300 std::cerr <<
"Error: need at least " << 4
301 <<
" parameters for creating hexagon. "
302 "Number of params provided = "
310 obj = std::make_shared<geom::Hexagon>(
311 params[0],
util::Point(params[1], params[2], params[3]));
314 else if (type ==
"drum2d") {
318 obj = std::make_shared<geom::Drum2D>(
319 params[0], params[1],
324 if (params.size() < 5) {
326 std::cerr <<
"Error: need at least " << 5
327 <<
" parameters for creating drum2d. "
328 "Number of params provided = "
336 obj = std::make_shared<geom::Drum2D>(
337 params[0], params[1],
341 else if (type ==
"sphere") {
345 obj = std::make_shared<geom::Sphere>(
346 params[0],
util::Point(params[1], params[2], params[3]));
349 if (params.size() < 1) {
351 std::cerr <<
"Error: need at least " << 1
352 <<
" parameters for creating sphere. "
353 "Number of params provided = "
361 obj = std::make_shared<geom::Sphere>(params[0],
365 else if (type ==
"ellipse") {
368 obj = std::make_shared<geom::Ellipse>(
369 params[0], params[1], params[2],
372 std::cerr <<
"Error: need at least " << 6
373 <<
" parameters for creating ellipse (a, b, theta, cx, cy, cz). "
374 "Number of params provided = "
381 else if (type ==
"ellipsoid") {
384 if (params.size() == 6) {
385 obj = std::make_shared<geom::Ellipsoid>(
386 params[0], params[1], params[2],
389 obj = std::make_shared<geom::Ellipsoid>(
390 params[0], params[1], params[2], params[3],
395 std::cerr <<
"Error: need 6 parameters (cx, cy, cz, r1, r2, r3) or 10 parameters "
396 "(cx, cy, cz, r1, r2, r3, ax, ay, az, theta) for creating ellipsoid. "
397 "Number of params provided = "
404 else if (type ==
"cuboid") {
408 obj = std::make_shared<geom::Cuboid>(
409 params[0], params[1], params[2],
412 std::cerr <<
"Error: need at least " << 6
413 <<
" parameters for creating cuboid. "
414 "Number of params provided = "
421 else if (type ==
"cube") {
425 obj = std::make_shared<geom::Cube>(
430 if (params.size() < 6) {
432 std::cerr <<
"Error: need " << 6
433 <<
" parameters for creating Cube. "
434 "Number of params provided = "
442 obj = std::make_shared<geom::Cube>(
447 else if (type ==
"cylinder") {
451 obj = std::make_shared<geom::Cylinder>(
452 params[0],
util::Point(params[1], params[2], params[3]),
455 std::cerr <<
"Error: need at least " << 7
456 <<
" parameters for creating Cylinder. "
457 "Number of params provided = "
464 else if (type ==
"rectangle_minus_rectangle") {
478 obj = std::make_shared<geom::AnnulusGeomObject>
481 std::cerr <<
"Error: need at least " << 12
482 <<
" parameters for creating rectangle_minus_rectangle. "
483 "Number of params provided = "
490 else if (type ==
"cuboid_minus_cuboid") {
505 obj = std::make_shared<geom::AnnulusGeomObject>
508 std::cerr <<
"Error: need at least " << 12
509 <<
" parameters for creating cuboid_minus_cuboid. "
510 "Number of params provided = "
517 else if (type ==
"circle_minus_circle") {
520 const double cx = params[0];
521 const double cy = params[1];
522 const double cz = params[2];
523 const double r_outer = params[3];
524 const double r_inner = params[4];
525 if (r_inner <= 0. || r_outer <= r_inner)
526 throw std::runtime_error(
527 "circle_minus_circle: require 0 < r_inner < r_outer (params: cx,cy,cz,r_outer,r_inner).");
530 obj = std::make_shared<geom::AnnulusGeomObject>(cin, cout);
532 std::cerr <<
"Error: need " << 5
533 <<
" parameters for creating circle_minus_circle (cx, cy, cz, r_outer, r_inner). "
534 "Number of params provided = "
541 else if (type ==
"ellipse_minus_ellipse") {
545 const double a_out = params[0];
546 const double b_out = params[1];
547 const double a_in = params[2];
548 const double b_in = params[3];
549 const double theta = params[4];
550 const util::Point c(params[5], params[6], params[7]);
551 if (a_in <= 0. || b_in <= 0. || a_out <= a_in || b_out <= b_in)
552 throw std::runtime_error(
553 "ellipse_minus_ellipse: require 0 < a_in < a_out and 0 < b_in < b_out.");
556 obj = std::make_shared<geom::AnnulusGeomObject>(ein, eout);
558 std::cerr <<
"Error: need " << 8
559 <<
" parameters for creating ellipse_minus_ellipse "
560 "(a_out, b_out, a_in, b_in, theta, cx, cy, cz). "
561 "Number of params provided = "
568 else if (type ==
"sphere_minus_sphere") {
571 const double cx = params[0];
572 const double cy = params[1];
573 const double cz = params[2];
574 const double r_outer = params[3];
575 const double r_inner = params[4];
576 if (r_inner <= 0. || r_outer <= r_inner)
577 throw std::runtime_error(
578 "sphere_minus_sphere: require 0 < r_inner < r_outer (params: cx,cy,cz,r_outer,r_inner).");
581 obj = std::make_shared<geom::AnnulusGeomObject>(cin, cout);
583 std::cerr <<
"Error: need " << 5
584 <<
" parameters for creating sphere_minus_sphere (cx, cy, cz, r_outer, r_inner). "
585 "Number of params provided = "
592 else if (type ==
"open_rect_channel_2d") {
595 obj = std::make_shared<geom::OpenRectChannel2D>(
596 params[0], params[1], params[2], params[3], params[4], params[5]);
598 std::cerr <<
"Error: need " << 6
599 <<
" parameters for open_rect_channel_2d (x0,y0,x1,y1,t,z). "
600 "Number of params provided = "
607 else if (type ==
"open_cuboid_channel_3d") {
610 obj = std::make_shared<geom::OpenCuboidChannel3D>(
611 params[0], params[1], params[2], params[3], params[4], params[5], params[6],
612 static_cast<int>(params[7]));
614 std::cerr <<
"Error: need " << 8
615 <<
" parameters for open_cuboid_channel_3d "
616 "(x0,y0,z0,x1,y1,z1,t,open_face 0..5). "
617 "Number of params provided = "
624 else if (type ==
"complex") {
628 std::vector<std::shared_ptr<geom::GeomObject>> vec_obj(
631 size_t param_start = 0;
632 for (
size_t i = 0; i < vec_type.size(); i++) {
633 auto geom_type = vec_type[i];
634 auto geom_flag = vec_flag[i];
638 auto p1 = params.begin() + param_start;
639 auto p2 = params.begin() + param_start + num_params;
640 auto geom_param = std::vector<double>(p1, p2);
644 std::vector<std::string>(), vec_obj[i]);
646 param_start += num_params;
651 obj = std::make_shared<geom::ComplexGeomObject>(vec_obj,
655 std::cerr <<
"Error: Not enough parameters for creating complex. "
656 "Number of params provided = "
666 const std::vector<double> ¶ms,
667 const std::vector<std::string> &vec_type,
668 const std::vector<std::string> &vec_flag,
669 std::shared_ptr<geom::GeomObject> &obj,
670 bool perform_check) {
672 std::vector<size_t> num_params_needed;
674 if (geom_type ==
"line") {
676 num_params_needed = {1, 4, 6};
678 for (
auto n: num_params_needed) {
679 if (params.size() == n) {
681 obj = std::make_shared<geom::Line>(params[0]);
684 obj = std::make_shared<geom::Line>(params[0],
692 obj = std::make_shared<geom::Line>(
701 else if (geom_type ==
"plane") {
702 if (params.size() == 6) {
703 obj = std::make_shared<geom::Plane>(
709 else if (geom_type ==
"triangle") {
711 num_params_needed = {1, 4, 7, 9};
713 for (
auto n: num_params_needed) {
714 if (params.size() == n) {
716 obj = std::make_shared<geom::Triangle>(params[0]);
719 obj = std::make_shared<geom::Triangle>(
725 obj = std::make_shared<geom::Triangle>(
732 obj = std::make_shared<geom::Triangle>(
741 else if (geom_type ==
"square") {
743 num_params_needed = {1, 4, 6};
745 for (
auto n: num_params_needed) {
746 if (params.size() == n) {
748 obj = std::make_shared<geom::Square>(params[0]);
751 obj = std::make_shared<geom::Square>(params[0],
758 obj = std::make_shared<geom::Square>(
766 else if (geom_type ==
"rectangle") {
768 num_params_needed = {2, 5, 6};
770 for (
auto n: num_params_needed) {
771 if (params.size() == n) {
773 obj = std::make_shared<geom::Rectangle>(params[0],
777 obj = std::make_shared<geom::Rectangle>(
778 params[0], params[1],
782 obj = std::make_shared<geom::Rectangle>(
790 else if (geom_type ==
"hexagon") {
792 num_params_needed = {1, 4, 7};
794 for (
auto n: num_params_needed) {
795 if (params.size() == n) {
797 obj = std::make_shared<geom::Hexagon>(params[0]);
801 obj = std::make_shared<geom::Hexagon>(
802 params[0],
util::Point(params[1], params[2], params[3]));
805 obj = std::make_shared<geom::Hexagon>(
814 else if (geom_type ==
"drum2d") {
816 num_params_needed = {2, 5, 8};
818 for (
auto n: num_params_needed) {
819 if (params.size() == n) {
821 obj = std::make_shared<geom::Drum2D>(
822 params[0], params[1]);
825 obj = std::make_shared<geom::Drum2D>(
826 params[0], params[1],
830 obj = std::make_shared<geom::Drum2D>(
831 params[0], params[1],
839 else if (geom_type ==
"cube") {
841 num_params_needed = {1, 4, 6};
843 for (
auto n: num_params_needed) {
844 if (params.size() == n) {
846 obj = std::make_shared<geom::Cube>(params[0]);
849 obj = std::make_shared<geom::Cube>(
854 obj = std::make_shared<geom::Cube>(
862 else if (geom_type ==
"cuboid") {
864 num_params_needed = {3, 6};
866 for (
auto n: num_params_needed) {
867 if (params.size() == n) {
869 obj = std::make_shared<geom::Cuboid>(
870 params[0], params[1], params[2]);
873 obj = std::make_shared<geom::Cuboid>(
881 else if (geom_type ==
"circle") {
883 num_params_needed = {1, 4};
885 for (
auto n: num_params_needed) {
886 if (params.size() == n) {
888 obj = std::make_shared<geom::Circle>(params[0]);
891 obj = std::make_shared<geom::Circle>(
899 else if (geom_type ==
"sphere") {
901 num_params_needed = {1, 4};
903 for (
auto n: num_params_needed) {
904 if (params.size() == n) {
906 obj = std::make_shared<geom::Sphere>(params[0]);
909 obj = std::make_shared<geom::Sphere>(
917 else if (geom_type ==
"ellipse") {
919 num_params_needed = {6};
921 for (
auto n: num_params_needed) {
922 if (params.size() == n) {
924 obj = std::make_shared<geom::Ellipse>(
925 params[0], params[1], params[2],
932 else if (geom_type ==
"ellipsoid") {
934 num_params_needed = {6, 10};
936 for (
auto n: num_params_needed) {
937 if (params.size() == n) {
939 obj = std::make_shared<geom::Ellipsoid>(
940 params[0], params[1], params[2],
945 obj = std::make_shared<geom::Ellipsoid>(
946 params[0], params[1], params[2], params[3],
954 else if (geom_type ==
"cylinder") {
956 num_params_needed = {7, 8};
958 for (
auto n: num_params_needed) {
959 if (params.size() == n) {
962 obj = std::make_shared<geom::Cylinder>(
969 obj = std::make_shared<geom::Cylinder>(
970 params[0], params[1],
978 else if (geom_type ==
"angled_rectangle") {
980 num_params_needed = {6};
982 for (
auto n: num_params_needed) {
983 if (params.size() == n) {
985 obj = std::make_shared<geom::Rectangle>(
994 else if (geom_type ==
"angled_cuboid") {
996 num_params_needed = {6};
998 for (
auto n: num_params_needed) {
999 if (params.size() == n) {
1001 obj = std::make_shared<geom::Cuboid>(
1010 else if (geom_type ==
"rectangle_minus_rectangle") {
1012 num_params_needed = {12};
1014 for (
auto n: num_params_needed) {
1015 if (params.size() == n) {
1025 obj = std::make_shared<geom::AnnulusGeomObject>
1033 else if (geom_type ==
"cuboid_minus_cuboid") {
1035 num_params_needed = {12};
1037 for (
auto n: num_params_needed) {
1038 if (params.size() == n) {
1048 obj = std::make_shared<geom::AnnulusGeomObject>
1056 else if (geom_type ==
"circle_minus_circle") {
1058 num_params_needed = {5};
1060 for (
auto n: num_params_needed) {
1061 if (params.size() == n) {
1063 const double cx = params[0];
1064 const double cy = params[1];
1065 const double cz = params[2];
1066 const double r_outer = params[3];
1067 const double r_inner = params[4];
1068 if (r_inner <= 0. || r_outer <= r_inner)
1069 throw std::runtime_error(
1070 "circle_minus_circle: require 0 < r_inner < r_outer (cx,cy,cz,r_outer,r_inner).");
1073 obj = std::make_shared<geom::AnnulusGeomObject>(cin, cout);
1079 else if (geom_type ==
"ellipse_minus_ellipse") {
1081 num_params_needed = {8};
1083 for (
auto n: num_params_needed) {
1084 if (params.size() == n) {
1086 const double a_out = params[0];
1087 const double b_out = params[1];
1088 const double a_in = params[2];
1089 const double b_in = params[3];
1090 const double theta = params[4];
1091 const util::Point c(params[5], params[6], params[7]);
1092 if (a_in <= 0. || b_in <= 0. || a_out <= a_in || b_out <= b_in)
1093 throw std::runtime_error(
1094 "ellipse_minus_ellipse: require 0 < a_in < a_out and 0 < b_in < b_out.");
1097 obj = std::make_shared<geom::AnnulusGeomObject>(ein, eout);
1103 else if (geom_type ==
"sphere_minus_sphere") {
1105 num_params_needed = {5};
1107 for (
auto n: num_params_needed) {
1108 if (params.size() == n) {
1110 const double cx = params[0];
1111 const double cy = params[1];
1112 const double cz = params[2];
1113 const double r_outer = params[3];
1114 const double r_inner = params[4];
1115 if (r_inner <= 0. || r_outer <= r_inner)
1116 throw std::runtime_error(
1117 "sphere_minus_sphere: require 0 < r_inner < r_outer (cx,cy,cz,r_outer,r_inner).");
1120 obj = std::make_shared<geom::AnnulusGeomObject>(cin, cout);
1126 else if (geom_type ==
"open_rect_channel_2d") {
1128 num_params_needed = {6};
1130 for (
auto n: num_params_needed) {
1131 if (params.size() == n) {
1133 obj = std::make_shared<geom::OpenRectChannel2D>(
1134 params[0], params[1], params[2], params[3], params[4], params[5]);
1140 else if (geom_type ==
"open_cuboid_channel_3d") {
1142 num_params_needed = {8};
1144 for (
auto n: num_params_needed) {
1145 if (params.size() == n) {
1147 const int face =
static_cast<int>(params[7]);
1148 if (face < 0 || face > 5)
1149 throw std::runtime_error(
1150 "open_cuboid_channel_3d: open_face must be 0..5 (±x,±y,±z).");
1151 obj = std::make_shared<geom::OpenCuboidChannel3D>(
1152 params[0], params[1], params[2], params[3], params[4], params[5], params[6],
1159 else if (geom_type ==
"complex") {
1167 num_params_needed = {0};
1168 std::vector<size_t> params_level(vec_type.size());
1169 for (
size_t i = 0; i < vec_type.size(); i++) {
1174 params_level[i] = nps[nps.size() - 1];
1176 std::cerr <<
"Error: Geometry type = " << vec_type[i]
1177 <<
" has zero number of parameters required. \n";
1184 num_params_needed[0] += params_level[i];
1187 std::vector<std::shared_ptr<geom::GeomObject>> objs(vec_type.size());
1188 std::vector<std::string> obj_flags(vec_type.size());
1190 if (params.size() == num_params_needed[0]) {
1193 size_t param_start = 0;
1194 for (
size_t i = 0; i < vec_type.size(); i++) {
1196 auto geom_type_temp = vec_type[i];
1197 auto geom_flag_temp = vec_flag[i];
1199 std::vector<std::string> vec_type_temp;
1200 std::vector<std::string> vec_flag_temp;
1203 std::vector<double> params_temp;
1204 for (
size_t j=0; j<params_level[i]; j++)
1205 params_temp.push_back(params[j + param_start]);
1208 obj_flags[i] = vec_flag[i];
1210 geom_type_temp, params_temp, vec_type_temp, vec_flag_temp,
1211 objs[i], perform_check);
1213 param_start += params_level[i];
1217 obj = std::make_shared<geom::ComplexGeomObject>(objs, obj_flags);
1223 std::cerr <<
"Error: Invalid geometry type: " << geom_type << std::endl;
1228 std::cerr << printErrMsg(geom_type, params, num_params_needed);