33 stream <<
"RayIntercept: dist in/out " << ri.
fDistIn <<
"/" << ri.
fDistOut
34 <<
" hit=" << ((ri.
fIsHit)?
"true":
"false")
58 d =
d - (
a*zero.X() +
b*zero.Y() +
c*zero.Z() );
65 stream <<
"PlaneParam=[" <<
a <<
"," <<
b <<
"," <<
c <<
"," <<
d <<
"]";
76 Double_t loc2 = oc.Mag2();
80 const TVector3& d =
dir;
81 Double_t d2 = d.Mag2();
82 Double_t tca = oc.Dot(d)/d2;
84 Double_t lhc2 = ( r2 -loc2 )/d2 + tca*tca;
85 if ( lhc2 < 0.0 )
return intercept;
87 Double_t lhc = TMath::Sqrt(lhc2);
106 stream <<
"FidSphere @ ["
122 Double_t len = n.Mag();
138 if ( len != 1.0 ) n.SetMag(1.);
139 dist = TMath::Abs(rc.Dot(n));
146 Double_t t = - o.Dot(n)/len;
165 if ( ! intercept.
fIsHit )
return intercept;
166 for (
int icap=1; icap <= 2; ++icap ) {
168 if ( ! cap.
IsValid() )
continue;
169 Double_t vd = cap.
Vd(
dir);
170 Double_t vn = cap.
Vn(start);
175 if ( vn > 0 ) { intercept.
fIsHit =
false;
break; }
177 Double_t t = -vn / vd;
205 stream <<
"FidCylinder @ ["
225 Double_t tnear = -DBL_MAX;
226 Double_t tfar = DBL_MAX;
229 Bool_t parallel =
false;
232 for (
size_t iface=0; iface <
fPolyFaces.size(); ++iface ) {
234 if ( ! pln.
IsValid() )
continue;
237 Double_t vd = pln.
Vd(
dir);
238 Double_t vn = pln.
Vn(start);
248 if ( vn > 0.0 ) { parallel =
true;
break; }
251 Double_t t = -vn / vd;
273 if ( tnear < tfar ) {
298 for (
unsigned int i = 0; i <
fPolyFaces.size(); ++i ) {
306 stream <<
"FidPolyhedron n=" << nfaces;
307 for (
size_t i=0; i<nfaces; ++i) {
309 stream << std::endl <<
"[" << setw(2) << i <<
"]" << aface;
TVector3 fCylAxis
base point on cylinder axis
PlaneParam fCylCap2
define a plane for 1st cylinder cap
RayIntercept InterceptUncapped(const TVector3 &start, const TVector3 &dir) const
Double_t fCylRadius
direction cosines of cylinder axis
PlaneParam fCylCap1
radius of cylinder
RayIntercept Intercept(const TVector3 &start, const TVector3 &dir) const
void ConvertMaster2Top(const ROOTGeomAnalyzer *rgeom)
void Print(std::ostream &stream) const
std::vector< PlaneParam > fPolyFaces
void ConvertMaster2Top(const ROOTGeomAnalyzer *rgeom)
RayIntercept Intercept(const TVector3 &start, const TVector3 &dir) const
void Print(std::ostream &stream) const
Some simple volumes that know how to calculate where a ray intercepts them.
virtual void Print(std::ostream &stream) const =0
void ConvertMaster2Top(const ROOTGeomAnalyzer *rgeom)
Double_t fSRadius
center of the sphere
RayIntercept Intercept(const TVector3 &start, const TVector3 &dir) const
void Print(std::ostream &stream) const
void ConvertMaster2Top(const ROOTGeomAnalyzer *rgeom)
void Print(std::ostream &stream) const
Double_t Vd(const TVector3 &raycos) const
Double_t Vn(const TVector3 &raybase) const
A ROOT/GEANT4 geometry driver.
virtual void Master2TopDir(TVector3 &v) const
virtual void Master2Top(TVector3 &v) const
Int_t fSurfIn
was the volume hit
Int_t fSurfOut
what surface was hit on way in
Bool_t fIsHit
distance along ray to exit fid volume
Double_t fDistOut
distance along ray to enter fid volume
std::ostream & operator<<(std::ostream &stream, const genie::geometry::PlaneParam &pparam)
THE MAIN GENIE PROJECT NAMESPACE