// // ******************************************************************** // * License and Disclaimer * // * * // * The Geant4 software is copyright of the Copyright Holders of * // * the Geant4 Collaboration. It is provided under the terms and * // * conditions of the Geant4 Software License, included in the file * // * LICENSE and available at http://cern.ch/geant4/license . These * // * include a list of copyright holders. * // * * // * Neither the authors of this software system, nor their employing * // * institutes,nor the agencies providing financial support for this * // * work make any representation or warranty, express or implied, * // * regarding this software system or assume any liability for its * // * use. Please see the license in the file LICENSE and URL above * // * for the full disclaimer and the limitation of liability. * // * * // * This code implementation is the result of the scientific and * // * technical work of the GEANT4 collaboration. * // * By using, copying, modifying or distributing the software (or * // * any work based on the software) you agree to acknowledge its * // * use in resulting scientific publications, and indicate your * // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // // // $Id: testG4Cons2.cc,v 1.21 2009/11/12 10:40:45 tnikitin Exp $ // GEANT4 tag $Name: geant4-09-04-ref-00 $ // // Simple test of G4Cons // Basic checks on each function + awkward cases for tracking / geom algorithms #include #include #include "G4ios.hh" #include "globals.hh" #include "geomdefs.hh" #include "ApproxEqual.hh" #include "G4ThreeVector.hh" #include "G4Cons.hh" #include "G4RotationMatrix.hh" #include "G4AffineTransform.hh" #include "G4VoxelLimits.hh" #include "G4GeometryTolerance.hh" #define DELTA 0.0001 // Returns false if actual is within wanted+/- DELTA // true if error G4bool OutRange(G4double actual,G4double wanted) { G4bool rng = false ; if (actual < wanted-DELTA || actual > wanted + DELTA ) rng = true ; return rng ; } G4bool OutRange(G4ThreeVector actual,G4ThreeVector wanted) { G4bool rng = false ; if (OutRange(actual.x(),wanted.x()) ||OutRange(actual.y(),wanted.y()) ||OutRange(actual.z(),wanted.z()) ) rng = true ; return rng ; } /////////////////////////////////////////////////////////////////// // // Dave's auxiliary function const G4String OutputInside(const EInside a) { switch(a) { case kInside: return "Inside"; case kOutside: return "Outside"; case kSurface: return "Surface"; } return "????"; } int main(void) { G4double dist, vol, volCheck; G4double kCarTolerance = G4GeometryTolerance::GetInstance()->GetSurfaceTolerance(); G4double kRadTolerance = G4GeometryTolerance::GetInstance()->GetRadialTolerance(); G4ThreeVector pzero(0,0,0); G4ThreeVector pplx(120,0,0),pply(0,120,0),pplz(0,0,120); G4ThreeVector pmix(-120,0,0),pmiy(0,-120,0),pmiz(0,0,-120); G4ThreeVector ponmiz(0,75,-50),ponplz(0,75,50); G4ThreeVector ponr1(std::sqrt(50*50/2.0),std::sqrt(50*50/2.0),0), ponr2(std::sqrt(100*100/2.0),std::sqrt(100*100/2.0),0), ponphi1(60*std::cos(pi/6),-60*std::sin(pi/6),0), ponphi2(60*std::cos(pi/6),60*std::sin(pi/6),0), ponr2b(150,0,0); G4ThreeVector pnearplz(45,45,45),pnearmiz(45,45,-45); G4ThreeVector pydx(60,150,0),pbigx(500,0,0); G4ThreeVector proot1(0,125,-1000),proot2(0,75,-1000); G4ThreeVector pparr1(0,25,-150); // Test case parallel to both rs of c8 G4ThreeVector pparr2(0,75,-50),pparr3(0,125,50); G4ThreeVector vparr(0,1./std::sqrt(5.),2./std::sqrt(5.)); G4ThreeVector vnphi1(-std::sin(pi/6),-std::cos(pi/6),0), vnphi2(-std::sin(pi/6),std::cos(pi/6),0); G4ThreeVector vx(1,0,0),vy(0,1,0),vz(0,0,1), vmx(-1,0,0),vmy(0,-1,0),vmz(0,0,-1), vxy(1./std::sqrt(2.),1./std::sqrt(2.),0), vxmy(1./std::sqrt(2.),-1./std::sqrt(2.),0), vmxmy(-1./std::sqrt(2.),-1./std::sqrt(2.),0), vmxy(-1./std::sqrt(2.),1./std::sqrt(2.),0), vx2mz(1.0/std::sqrt(5.0),0,-2.0/std::sqrt(5.0)), vxmz(1./std::sqrt(2.),0,-1./std::sqrt(2.)); G4RotationMatrix r90X,r90Y,r90Z,r180X,r45X,r30Y; G4Cons c1("Hollow Full Tube",50,100,50,100,50,0,twopi), cn1("cn1",45.,50.,45.,50.,50,halfpi,halfpi), cn2("cn1",45.,50.,45.,50.,50,halfpi,3*halfpi), c2("Hollow Full Cone",50,100,50,200,50,-1,twopi), c3("Hollow Cut Tube",50,100,50,100,50,-pi/6,pi/3), c4("Hollow Cut Cone",50,100,50,200,50,-pi/6,pi/3), c5("Hollow Cut Cone",25,50,75,150,50,0,3*halfpi), c6("Solid Full Tube",0,150,0,150,50,0,twopi), c7("Thin Tube",95,100,95,100,50,0,twopi), c8a("Solid Full Cone2",0,100,0,150,50,0,twopi), c8b("Hollow Full Cone2",50,100,100,150,50,0,twopi), c8c("Hollow Full Cone2inv",100,150,50,100,50,0,twopi), c9("Excotic Cone",50,60, 0, // 1.0e-7, 500*kRadTolerance, 10,50,0,twopi), cms("cms cone",0.0,70.0,0.0,157.8,2949.0,0.0,6.2831853071796); G4Cons cms2("RearAirCone",401.0,1450.0, 1020.0,1450.0,175.0,0.0,6.2831853071796) ; G4Cons ctest10( "aCone", 2*cm, 6*cm, 8*cm, 14*cm, 10*cm, 10*deg, 300*deg ); G4ThreeVector pct10(60,0,0); G4ThreeVector pct10mx(-50,0,0); G4ThreeVector pct10phi1(60*std::cos(10.*degree),60*std::sin(10*degree),0); G4ThreeVector pct10phi2(60*std::cos(50.*degree),-60*std::sin(50*degree),0); G4ThreeVector pct10e1(-691-500,174, 404 ); G4ThreeVector pct10e2( 400-500, 20.9, 5.89 ); G4ThreeVector pct10e3( 456-500, 13, -14.7 ); G4ThreeVector pct10e4( 537-500, 1.67, -44.1 ); // point P is outside G4ThreeVector pct10e5(537, 1.67, -44.1); G4ThreeVector pct10e6(1e+03, -63.5, -213 ); G4double a1,a2,a3,am; a1=pct10e2.x()-pct10e1.x(); a2=pct10e2.y()-pct10e1.y(); a3=pct10e2.z()-pct10e1.z(); am=std::sqrt(a1*a1+a2*a2+a3*a3); G4ThreeVector d1(a1/am,a2/am,a3/am); G4cout<unit(); if (OutRange(dist,30)||OutRange(*pNorm,vxmz)||!*pgoodNorm) G4cout << "Error Rmax1 " << dist << G4endl; dist=c2.DistanceToOut(pplx,vx,calcNorm,pgoodNorm,pNorm); *pNorm=pNorm->unit(); if (OutRange(dist,30)||OutRange(*pNorm,vxmz)||!*pgoodNorm) G4cout << "Error Rmax2 " << dist << G4endl; dist=c4.DistanceToOut(pplx,vmx,calcNorm,pgoodNorm,pNorm); *pNorm=pNorm->unit(); if (OutRange(dist,70)||*pgoodNorm) G4cout << "Error Rmin1 " << dist << G4endl; dist=c2.DistanceToOut(pplx,vmx,calcNorm,pgoodNorm,pNorm); *pNorm=pNorm->unit(); if (OutRange(dist,70)||*pgoodNorm) G4cout << "Error Rmin2 " << dist << G4endl; dist=c3.DistanceToOut(ponphi1,vmy,calcNorm,pgoodNorm,pNorm); *pNorm=pNorm->unit(); if (OutRange(dist,0)|| OutRange(*pNorm,vnphi1)|| !*pgoodNorm) G4cout << "Error PhiS 1" << dist << G4endl; dist=c3.DistanceToOut(ponphi1,vy,calcNorm,pgoodNorm,pNorm); *pNorm=pNorm->unit(); if (OutRange(dist,2*60*std::sin(pi/6))|| OutRange(*pNorm,vnphi2)|| !*pgoodNorm) G4cout << "Error PhiS 2" << dist << G4endl; dist=c3.DistanceToOut(ponphi2,vy,calcNorm,pgoodNorm,pNorm); *pNorm=pNorm->unit(); if (OutRange(dist,0)|| OutRange(*pNorm,vnphi2)|| !*pgoodNorm) G4cout << "Error PhiE 1" << dist << G4endl; dist=c3.DistanceToOut(ponphi2,vmy,calcNorm,pgoodNorm,pNorm); *pNorm=pNorm->unit(); if (OutRange(dist,2*60*std::sin(pi/6))|| OutRange(*pNorm,vnphi1)|| !*pgoodNorm) G4cout << "Error PhiS 2" << dist << G4endl; dist=c6.DistanceToOut(ponplz,vmz,calcNorm,pgoodNorm,pNorm); *pNorm=pNorm->unit(); if (OutRange(dist,100)|| OutRange(*pNorm,vmz)|| !*pgoodNorm) G4cout << "Error Top Z 1" << dist << G4endl; dist=c6.DistanceToOut(ponplz,vz,calcNorm,pgoodNorm,pNorm); *pNorm=pNorm->unit(); if (OutRange(dist,0)|| OutRange(*pNorm,vz)|| !*pgoodNorm) G4cout << "Error Top Z 2" << dist << G4endl; dist=c6.DistanceToOut(ponmiz,vz,calcNorm,pgoodNorm,pNorm); *pNorm=pNorm->unit(); if (OutRange(dist,100)|| OutRange(*pNorm,vz)|| !*pgoodNorm) G4cout << "Error Lower Z 1" << dist << G4endl; dist=c6.DistanceToOut(ponmiz,vmz,calcNorm,pgoodNorm,pNorm); *pNorm=pNorm->unit(); if (OutRange(dist,0)|| OutRange(*pNorm,vmz)|| !*pgoodNorm) G4cout << "Error Lower Z 2" << dist << G4endl; // Test case for rmax root bug dist=c7.DistanceToOut(ponr2,vmx,calcNorm,pgoodNorm,pNorm); if (OutRange(dist,100/std::sqrt(2.)-std::sqrt(95*95-100*100/2.))||*pgoodNorm) G4cout << "Error rmax root bug" << dist << G4endl; // Parallel radii test cases dist=c8a.DistanceToOut(pparr2,vparr,calcNorm,pgoodNorm,pNorm); *pNorm=pNorm->unit(); if (OutRange(dist,100.*std::sqrt(5.)/2.)|| !*pgoodNorm|| OutRange(*pNorm,vz)) G4cout << "Error solid parr2a " <unit(); if (OutRange(dist,0)|| !*pgoodNorm|| OutRange(*pNorm,vmz)) G4cout << "Error solid parr2b " <unit(); if (OutRange(dist,100)|| !*pgoodNorm|| OutRange(*pNorm,vz)) G4cout << "Error solid parr2c " <unit(); if (OutRange(dist,0)|| !*pgoodNorm|| OutRange(*pNorm,vmz)) G4cout << "Error solid parr2d " <unit(); if (OutRange(dist,0)|| !*pgoodNorm|| OutRange(*pNorm,vz)) G4cout << "Error solid parr3a " <unit(); if (OutRange(dist,100*std::sqrt(5.)/2.)|| !*pgoodNorm|| OutRange(*pNorm,vmz)) G4cout << "Error solid parr3b " <unit(); if (OutRange(dist,0)|| !*pgoodNorm|| OutRange(*pNorm,vz)) G4cout << "Error solid parr3c " <unit(); if (OutRange(dist,50)|| !*pgoodNorm|| OutRange(*pNorm,G4ThreeVector(0,2./std::sqrt(5.0),-1./std::sqrt(5.0)))) G4cout << "Error solid parr3d " <unit(); if (OutRange(dist,100*std::sqrt(5.)/2.)|| !*pgoodNorm|| OutRange(*pNorm,vz)) G4cout << "Error hollow parr2a " <unit(); if (OutRange(dist,0)|| !*pgoodNorm|| OutRange(*pNorm,vmz)) G4cout << "Error hollow parr2b " <unit(); if (OutRange(dist,50)||*pgoodNorm) G4cout << "Error hollow parr2c " <unit(); if (OutRange(dist,0)|| !*pgoodNorm|| OutRange(*pNorm,vmz)) G4cout << "Error hollow parr2d " <unit(); if (OutRange(dist,0)|| !*pgoodNorm|| OutRange(*pNorm,vz)) G4cout << "Error hollow parr3a " <unit(); if (OutRange(dist,100.*std::sqrt(5.)/2.)|| !*pgoodNorm|| OutRange(*pNorm,vmz)) G4cout << "Error hollow parr3b " <unit(); if (OutRange(dist,0)|| !*pgoodNorm|| OutRange(*pNorm,vz)) G4cout << "Error hollow parr3c " <unit(); if (OutRange(dist,50)|| !*pgoodNorm|| OutRange(*pNorm,G4ThreeVector(0,2./std::sqrt(5.),-1.0/std::sqrt(5.)))) G4cout << "Error hollow parr3d " <unit(); if (OutRange(dist,111.8033988)|| !*pgoodNorm|| OutRange(*pNorm,G4ThreeVector(0,0,-1.0))) G4cout<<"Error:c9.Out((1e3*kRadTolerance,0,50),vx2mz,...) = " <unit(); if (OutRange(dist,111.8033988)|| !*pgoodNorm|| OutRange(*pNorm,G4ThreeVector(0,0,-1.0))) G4cout << "Error:c9.Out((5,0,50),vx2mz,...) = " <unit(); if (OutRange(dist,111.8033988)|| !*pgoodNorm|| OutRange(*pNorm,G4ThreeVector(0,0,-1.0))) G4cout << "Error:c9.Out((10,0,50),vx2mz,...) = " < parallel to both radii dist=c8b.DistanceToIn(pparr1,vparr); if (OutRange(dist,100*std::sqrt(5.)/2.)) G4cout << "Error parr1 " << dist << G4endl; dist=c8b.DistanceToIn(pparr2,-vparr); if (OutRange(dist,kInfinity)) G4cout << "Error parr2 " << dist << G4endl; dist=c8b.DistanceToIn(pparr3,vparr); if (OutRange(dist,kInfinity)) G4cout << "Error parr3a " << dist << G4endl; dist=c8b.DistanceToIn(pparr3,-vparr); if (OutRange(dist,0)) G4cout << "Error parr3b " << dist << G4endl; // Check we don't Hit `shadow cone' at `-ve radius' on rmax or rmin dist=c8a.DistanceToIn(proot1,vz); if (OutRange(dist,1000)) G4cout << "Error shadow rmax root problem " << dist << G4endl; dist=c8c.DistanceToIn(proot2,vz); if (OutRange(dist,1000)) G4cout << "Error shadow rmin root problem " << dist << G4endl; dist = cms2.DistanceToIn(G4ThreeVector(-344.13684353113, 258.98049377272, -158.20772167926), G4ThreeVector(-0.30372022869765, -0.55811472925794, 0.77218001247454)) ; if (OutRange(dist,kInfinity)) G4cout<<"cms2.DistanceToIn(G4ThreeVector(-344.1 ... = "<