int main(int argc, char *argv[]) { double xSemiaxis(2. * cm); double ySemiAxis(2. * cm); double zHeight(2. * cm); std::string name("fred1"); // // 1. Box: // std::cout << "\n\nBox tests\n" << std::endl; doBox(name, xSemiaxis, ySemiAxis, zHeight); std::cout << std::endl; // // 2. Cylindrical Section or Tube: // std::cout << "\n\nTub tests\n" << std::endl; double rIn = 10. * cm; double rOut = 15. * cm; double zhalf = 20. * cm; double startPhi = 0. * deg; double deltaPhi = 90. * deg; doTubs(name, rIn, rOut, zhalf, startPhi, deltaPhi); std::cout << std::endl; // // 3. Cone or Conical section: // std::cout << "\n\nCons tests\n" << std::endl; double rIn2 = 20. * cm; double rOut2 = 25. * cm; doCons(name, rIn, rOut, rIn2, rOut2, zhalf, startPhi, deltaPhi); std::cout << std::endl; // // 5. Trapezoid: // std::cout << "\n\nTrapezoid tests\n" << std::endl; double dx1 = 10. * cm; double dx2 = 30. * cm; double dy1 = 15. * cm; double dy2 = 30. * cm; double dz = 60. * cm; doTrd(name, dx1, dx2, dy1, dy2, dz); std::cout << std::endl; // // 6. Generic Trapezoid: // std::cout << "\n\nGeneric Trapezoid tests\n" << std::endl; double pTheta = 0. * deg; double pPhi = 0. * deg; double pDy1 = 30. * cm; double pDx1 = 30. * cm; double pDx2 = 30. * cm; double pAlp1 = 0. * deg; double pDy2 = 15. * cm; double pDx3 = 10. * cm; double pDx4 = 10. * cm; double pAlp2 = 0. * deg; doTrap(name, dz, pTheta, pPhi, pDy1, pDx1, pDx2, pAlp1, pDy2, pDx3, pDx4, pAlp2); std::cout << std::endl; // // 7. Sphere or Spherical Shell Section: // std::cout << "\n\nSphere tests\n" << std::endl; std::cout << "This next should be the same as a 2cm ball: " << std::endl; doSphere("fred1", 0.0 * cm, 2.0 * cm, 0. * deg, 360. * deg, 0., 180. * deg); std::cout << "Manual computation gives: " << 4. / 3. * Geom::pi() * 2.0 * cm * 2.0 * cm * 2.0 * cm / cm3 << std::endl; std::cout << "If you mess up phi and theta you get: " << std::endl; doSphere("fred1", 0.0 * cm, 2.0 * cm, 0. * deg, 180. * deg, 0., 360. * deg); std::cout << "\n1 cm thick shell: " << std::endl; doSphere("fred1", 2.0 * cm, 3.0 * cm, 0. * deg, 360. * deg, 0., 180. * deg); std::cout << "Manual computation gives: " << 4. / 3. * Geom::pi() * 3.0 * cm * 3.0 * cm * 3.0 * cm / cm3 - 4. / 3. * Geom::pi() * 2.0 * cm * 2.0 * cm * 2.0 * cm / cm3 << std::endl; std::cout << "\nHALF of the above 1 cm thick shell: " << std::endl; doSphere("fred1", 2.0 * cm, 3.0 * cm, 0. * deg, 180. * deg, 0., 180. * deg); std::cout << "Manual computation gives: " << (4. / 3. * Geom::pi() * 3.0 * cm * 3.0 * cm * 3.0 * cm / cm3 - 4. / 3. * Geom::pi() * 2.0 * cm * 2.0 * cm * 2.0 * cm / cm3) / 2. << std::endl; std::cout << "\n30 degree span in theta; full phi \"top\" hemisphere" << std::endl; doSphere("fred1", 2.0 * cm, 3.0 * cm, 0. * deg, 360. * deg, 10. * deg, 30. * deg); std::cout << "\n30 degree span in theta; full phi \"bottom\" hemisphere; " "mirror of above, so should be same." << std::endl; doSphere("fred1", 2.0 * cm, 3.0 * cm, 0. * deg, 360. * deg, 140. * deg, 30. * deg); std::cout << "\n30 degree span in theta; full phi around equator (should be " "bigger than above)" << std::endl; doSphere("fred1", 2.0 * cm, 3.0 * cm, 0. * deg, 360. * deg, 75. * deg, 30. * deg); // // 9. Torus: // std::cout << "\n\nTorus tests\n" << std::endl; double radius = 200. * cm; doTorus(name, rIn, rOut, radius, startPhi, deltaPhi); std::cout << std::endl; // // 10. Polycons: // std::cout << "\n\nPolycons tests\n" << std::endl; double phiStart = 45. * deg; double phiTotal = 325. * deg; double inner[] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; std::vector<double> rInner(inner, inner + sizeof(inner) / sizeof(double)); double outer[] = {0, 10, 10, 5, 5, 10, 10, 2, 2}; std::vector<double> rOuter(outer, outer + sizeof(outer) / sizeof(double)); double pl[] = {5, 7, 9, 11, 25, 27, 29, 31, 35}; std::vector<double> z(pl, pl + sizeof(pl) / sizeof(double)); doPolycone1(name, phiStart, phiTotal, z, rInner, rOuter); std::cout << std::endl; doPolycone2(name, phiStart, phiTotal, z, rOuter); std::cout << std::endl; // // 11. Polyhedra (PGON): // std::cout << "\n\nPolyhedra tests\n" << std::endl; int sides = 3; doPolyhedra1(name, sides, phiStart, phiTotal, z, rInner, rOuter); std::cout << std::endl; doPolyhedra2(name, sides, phiStart, phiTotal, z, rOuter); std::cout << std::endl; // // 12. Tube with an elliptical cross section: // std::cout << "\n\nElliptical Tube tests\n" << std::endl; doEllipticalTube(name, xSemiaxis, ySemiAxis, zHeight); std::cout << std::endl; ySemiAxis = 3. * cm; doEllipticalTube(name, xSemiaxis, ySemiAxis, zHeight); std::cout << std::endl; xSemiaxis = 3. * cm; ySemiAxis = 2. * cm; zHeight = 10. * cm; doEllipticalTube(name, xSemiaxis, ySemiAxis, zHeight); std::cout << std::endl; xSemiaxis = 300. * cm; ySemiAxis = 400. * cm; zHeight = 3000. * cm; doEllipticalTube(name, xSemiaxis, ySemiAxis, zHeight); // // 14. Cone with Elliptical Cross Section: // // // 15. Paraboloid, a solid with parabolic profile: // // // 16. Tube with Hyperbolic Profile: // // // 17. Tetrahedra: // // // 18. Extruded Polygon: // // // 19. Box Twisted: // // // 20. Trapezoid Twisted along One Axis: // // // 21. Twisted Trapezoid with x and y dimensions varying along z: // // // 22. Generic trapezoid with optionally collapsing vertices: // // // 23. Tube Section Twisted along Its Axis: // // // 24. Cylindrical Cut Section or Cut Tube: // std::cout << "\n\nCutTub tests\n" << std::endl; std::array<double, 3> lowNorm = {{0, -0.7, -0.71}}; std::array<double, 3> highNorm = {{0.7, 0, 0.71}}; doCutTubs(name, rIn, rOut, zhalf, startPhi, deltaPhi, lowNorm, highNorm); std::cout << std::endl; // // 25. Extruded Polygon: // // The extrusion of an arbitrary polygon (extruded solid) // with fixed outline in the defined Z sections can be defined as follows // (in a general way, or as special construct with two Z sections): // // G4ExtrudedSolid(const G4String& pName, // std::vector<G4TwoVector> polygon, // std::vector<ZSection> zsections) // std::cout << "\n\nExtruded Polygon tests\n" << std::endl; std::vector<double> x = {-300, -300, 300, 300, 150, 150, -150, -150}; std::vector<double> y = {-300, 300, 300, -300, -300, 150, 150, -300}; std::vector<double> epz = {-600, -150, 100, 600}; std::vector<double> zx = {0, 0, 0, 0}; std::vector<double> zy = {300, -300, 0, 300}; std::vector<double> zscale = {8, 10, 6, 12}; doExtrudedPgon(name, x, y, epz, zx, zy, zscale); std::cout << std::endl; return EXIT_SUCCESS; }
int main( int argc, char *argv[] ) { double xSemiaxis(2.*cm); double ySemiAxis(2.*cm); double zHeight(2.*cm); std::string name("fred1"); // // 1. Box: // std::cout << "\n\nBox tests\n" << std::endl; doBox( name, xSemiaxis, ySemiAxis, zHeight ); std::cout << std::endl; // // 2. Cylindrical Section or Tube: // std::cout << "\n\nTub tests\n" << std::endl; double rIn = 10.*cm; double rOut = 15.*cm; double zhalf = 20.*cm; double startPhi = 0.*deg; double deltaPhi = 90.*deg; doTubs( name, rIn, rOut, zhalf, startPhi, deltaPhi ); std::cout << std::endl; // // 3. Cone or Conical section: // std::cout << "\n\nCons tests\n" << std::endl; double rIn2 = 20.*cm; double rOut2 = 25.*cm; doCons( name, rIn, rOut, rIn2, rOut2, zhalf, startPhi, deltaPhi ); std::cout << std::endl; // // 4. Parallelepiped: // std::cout << "\n\nParallelepiped tests\n" << std::endl; std::cout << "This next should be the same as a xhalf=5cm, yhalf=6cm, zhalf=7cm, alpha=15deg, theta=30deg, phi=45deg" << std::endl; doPara("fred1", 5.*cm, 6.*cm, 7.*cm, 15*deg, 30*deg, 45*deg); // // 5. Trapezoid: // std::cout << "\n\nTrapezoid tests\n" << std::endl; double dx1 = 10.*cm; double dx2 = 30.*cm; double dy1 = 15.*cm; double dy2 = 30.*cm; double dz = 60.*cm; doTrd( name, dx1, dx2, dy1, dy2, dz ); std::cout << std::endl; // // 6. Generic Trapezoid: // std::cout << "\n\nGeneric Trapezoid tests\n" << std::endl; double pTheta = 0.*deg; double pPhi = 0.*deg; double pDy1 = 30.*cm; double pDx1 = 30.*cm; double pDx2 = 30.*cm; double pAlp1 = 0.*deg; double pDy2 = 15.*cm; double pDx3 = 10.*cm; double pDx4 = 10.*cm; double pAlp2 = 0.*deg; doTrap( name, dz, pTheta, pPhi, pDy1, pDx1, pDx2, pAlp1, pDy2, pDx3, pDx4, pAlp2 ); std::cout << std::endl; // // 7. Sphere or Spherical Shell Section: // std::cout << "\n\nSphere tests\n" << std::endl; std::cout << "This next should be the same as a 2cm ball: " << std::endl; doSphere("fred1", 0.0*cm, 2.0*cm, 0.*deg, 360.*deg, 0., 180.*deg); std::cout << "Manual computation gives: " << 4./3. * Geom::pi() * 2.0*cm * 2.0*cm *2.0*cm / cm3 <<std::endl; std::cout << "If you mess up phi and theta you get: " << std::endl; doSphere("fred1", 0.0*cm, 2.0*cm, 0.*deg, 180.*deg, 0., 360.*deg); std::cout << "\n1 cm thick shell: " << std::endl; doSphere("fred1", 2.0*cm, 3.0*cm, 0.*deg, 360.*deg, 0., 180.*deg); std::cout << "Manual computation gives: " << 4./3. * Geom::pi() * 3.0*cm * 3.0*cm *3.0*cm / cm3 - 4./3. * Geom::pi() * 2.0*cm * 2.0*cm *2.0*cm / cm3 <<std::endl; std::cout << "\nHALF of the above 1 cm thick shell: " << std::endl; doSphere("fred1", 2.0*cm, 3.0*cm, 0.*deg, 180.*deg, 0., 180.*deg); std::cout << "Manual computation gives: " << (4./3. * Geom::pi() * 3.0*cm * 3.0*cm *3.0*cm / cm3 - 4./3. * Geom::pi() * 2.0*cm * 2.0*cm *2.0*cm / cm3) / 2. <<std::endl; std::cout << "\n30 degree span in theta; full phi \"top\" hemisphere" << std::endl; doSphere("fred1", 2.0*cm, 3.0*cm, 0.*deg, 360.*deg, 10.*deg, 30.*deg); std::cout << "\n30 degree span in theta; full phi \"bottom\" hemisphere; mirror of above, so should be same." << std::endl; doSphere("fred1", 2.0*cm, 3.0*cm, 0.*deg, 360.*deg, 140.*deg, 30.*deg); std::cout << "\n30 degree span in theta; full phi around equator (should be bigger than above)" << std::endl; doSphere("fred1", 2.0*cm, 3.0*cm, 0.*deg, 360.*deg, 75.*deg, 30.*deg); // // 8. Full Solid Sphere: // std::cout << "\n\nOrb\n" << std::endl; std::cout << "This next should be the same as a 2cm ball (also the sphere above): " << std::endl; doOrb("fred1", 2.0*cm); // // 9. Torus: // std::cout << "\n\nTorus tests\n" << std::endl; double radius = 200.*cm; doTorus( name, rIn, rOut, radius, startPhi, deltaPhi ); std::cout << std::endl; // // 10. Polycons: // std::cout << "\n\nPolycons tests\n" << std::endl; double phiStart = 45.*deg; double phiTotal = 325.*deg; double inner[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; std::vector<double> rInner( inner, inner + sizeof( inner ) / sizeof( double )); double outer[] = { 0, 10, 10, 5, 5, 10, 10, 2, 2 }; std::vector<double> rOuter( outer, outer + sizeof( outer ) / sizeof( double )); double pl[] = { 5, 7, 9, 11, 25, 27, 29, 31, 35 }; std::vector<double> z( pl, pl + sizeof( pl ) / sizeof( double )); doPolycone1( name, phiStart, phiTotal, z, rInner, rOuter ); std::cout << std::endl; doPolycone2( name, phiStart, phiTotal, z, rOuter); std::cout << std::endl; // // 11. Polyhedra (PGON): // std::cout << "\n\nPolyhedra tests\n" << std::endl; int sides = 3; doPolyhedra1( name, sides, phiStart, phiTotal, z, rInner, rOuter ); std::cout << std::endl; doPolyhedra2( name, sides, phiStart, phiTotal, z, rOuter ); std::cout << std::endl; // // 12. Tube with an elliptical cross section: // std::cout << "\n\nElliptical Tube tests\n" << std::endl; doEllipticalTube(name, xSemiaxis, ySemiAxis, zHeight); std::cout << std::endl; ySemiAxis = 3.*cm; doEllipticalTube(name, xSemiaxis, ySemiAxis, zHeight); std::cout << std::endl; xSemiaxis = 3.* cm; ySemiAxis = 2.* cm; zHeight = 10.* cm; doEllipticalTube(name, xSemiaxis, ySemiAxis, zHeight); std::cout << std::endl; xSemiaxis = 300.* cm; ySemiAxis = 400.* cm; zHeight = 3000. * cm; doEllipticalTube(name, xSemiaxis, ySemiAxis, zHeight); // // 13. General Ellipsoid: // std::cout << "\n\nEllipsoid tests\n" << std::endl; std::cout << "This next should be the same as a x = 3cm; y = 2cm; and z = 5cm " << std::endl; doEllipsoid("fred1", 3.0*cm, 2.0*cm, 5.*cm, 0.*cm, 0.*cm); std::cout << "\nThis one has a top cut off at z=1cm and should be half of the above + some bit." << std::endl; doEllipsoid("fred1", 3.0*cm, 2.0*cm, 5.*cm, 0.*cm, 1.*cm); std::cout << "\nThis has a bottom cut off at z= -1cm and should be the same as the above (symmetric)" << std::endl; doEllipsoid("fred1", 3.0*cm, 2.0*cm, 5.*cm, -1.*cm, 0.*cm); std::cout << "\nThis has a bottom cut off at z= -1cm and top cut at z=1cm and should be smaller (just the fat bit around the middle)." << std::endl; doEllipsoid("fred1", 3.0*cm, 2.0*cm, 5.*cm, -1.*cm, 1.*cm); // // 14. Cone with Elliptical Cross Section: // // // 15. Paraboloid, a solid with parabolic profile: // // // 16. Tube with Hyperbolic Profile: // // // 17. Tetrahedra: // // // 18. Extruded Polygon: // // // 19. Box Twisted: // // // 20. Trapezoid Twisted along One Axis: // // // 21. Twisted Trapezoid with x and y dimensions varying along z: // // // 22. Generic trapezoid with optionally collapsing vertices: // // // 23. Tube Section Twisted along Its Axis: // return EXIT_SUCCESS; }