59 Fatal(
"ComputeBBox",
"Assembly shape %s without volume",
GetName());
77 for (
Int_t i = 0; i < nd; i++) {
83 box->SetBoxPoints(vert);
84 for (
Int_t ipt = 0; ipt < 8; ipt++) {
104 fDZ = 0.5 * (zmax - zmin);
105 fOrigin[2] = 0.5 * (zmin + zmax);
117 Warning(
"RecomputeBoxLast",
"No daughters for volume %s yet",
fVolume->GetName());
138 box->SetBoxPoints(vert);
139 for (
Int_t ipt = 0; ipt < 8; ipt++) {
158 fDZ = 0.5 * (zmax - zmin);
159 fOrigin[2] = 0.5 * (zmin + zmax);
173 inext =
fVolume->GetNextNodeIndex();
175 Error(
"ComputeNormal",
"Invalid inext=%i (Ncomponents=%i)", inext,
fVolume->GetNdaughters());
180 Double_t local[3], ldir[3], lnorm[3];
199 Int_t *check_list =
nullptr;
211 for (
id = 0;
id < ncheck;
id++) {
212 node =
fVolume->GetNode(check_list[
id]);
216 fVolume->SetCurrentNodeIndex(check_list[
id]);
217 fVolume->SetNextNodeIndex(check_list[
id]);
226 for (
id = 0;
id < nd;
id++) {
231 fVolume->SetCurrentNodeIndex(
id);
253 Info(
"DistFromInside",
"Cannot compute distance from inside the assembly (but from a component)");
274 if (iact < 3 && safe) {
281 if ((iact == 1) && (step <= *safe))
297 printf(
"%s[%d] assembly %s checking distance to %d daughters...\n", sindent.
Data(),
indent,
fVolume->GetName(),
306 if (idebug > 4 && snext > stepmax)
307 printf(
"%s[%d] %s: bbox not crossed\n", sindent.
Data(),
indent,
fVolume->GetName());
315 for (i = 0; i < 3; i++)
316 pt[i] += snext * dir[i];
333 if (nd < 5 || !voxels) {
334 for (i = 0; i < nd; i++) {
345 if (dist < stepmax) {
348 printf(
"%s[%d] %s -> from local=(%19.16f, %19.16f, %19.16f, %19.16f, %19.16f, %19.16f)\n",
349 sindent.
Data(),
indent,
fVolume->GetName(), lpoint[0], lpoint[1], lpoint[2], ldir[0], ldir[1],
351 printf(
"%s[%d] -> (l)to: %s shape %s snext=%g\n", sindent.
Data(),
indent, node->
GetName(),
365 printf(
"%s[%d] %s: found %s at %f\n", sindent.
Data(),
indent,
fVolume->GetName(),
373 printf(
"%s[%d] %s: no daughter crossed\n", sindent.
Data(),
indent,
fVolume->GetName());
380 Int_t *vlist =
nullptr;
386 for (i = 0; i < ncheck; i++) {
387 node =
fVolume->GetNode(vlist[i]);
395 if (dist < stepmax) {
398 printf(
"%s[%d] %s -> from local=(%19.16f, %19.16f, %19.16f, %19.16f, %19.16f, %19.16f)\n",
399 sindent.
Data(),
indent,
fVolume->GetName(), lpoint[0], lpoint[1], lpoint[2], ldir[0], ldir[1],
401 printf(
"%s[%d] -> to: %s shape %s snext=%g\n", sindent.
Data(),
indent, node->
GetName(),
406 fVolume->SetNextNodeIndex(vlist[i]);
416 printf(
"%s[%d] %s: found %s at %f\n", sindent.
Data(),
indent,
fVolume->GetName(),
424 printf(
"%s[%d] %s: no daughter crossed\n", sindent.
Data(),
indent,
fVolume->GetName());
436 Error(
"Divide",
"Assemblies cannot be divided. Division volume %s not created", divname);
446 Error(
"GetMakeRuntimeShape",
"Assemblies cannot be parametrized.");
455 printf(
"*** Shape %s: TGeoShapeAssembly ***\n",
GetName());
456 printf(
" Volume assembly %s with %i nodes\n",
fVolume->GetName(),
fVolume->GetNdaughters());
457 printf(
" Bounding box:\n");
468 Error(
"SetSegsAndPols",
"Drawing functions should not be called for assemblies, but rather for their content");
485 memcpy(loc, point, 3 *
sizeof(
Double_t));
506 for (
Int_t id = 0;
id < nd;
id++) {
507 if (boxes &&
id > 0) {
520 dxyz += dxyz0 * dxyz0;
522 dxyz += dxyz1 * dxyz1;
524 dxyz += dxyz2 * dxyz2;
525 if (dxyz >= safety * safety)
548 Error(
"SetPoints",
"Drawing functions should not be called for assemblies, but rather for their content");
556 Error(
"SetPoints",
"Drawing functions should not be called for assemblies, but rather for their content");
576 for (
Int_t i = 0; i < vecsize; i++)
587 for (
Int_t i = 0; i < vecsize; i++)
597 for (
Int_t i = 0; i < vecsize; i++)
607 for (
Int_t i = 0; i < vecsize; i++)
618 for (
Int_t i = 0; i < vecsize; i++)
int Int_t
Signed integer 4 bytes (int).
bool Bool_t
Boolean (0=false, 1=true) (bool).
double Double_t
Double 8 bytes.
float Float_t
Float 4 bytes (float).
const char Option_t
Option string (const char).
static void indent(ostringstream &buf, int indent_level)
externTGeoManager * gGeoManager
Generic 3D primitive description class.
Double_t DistFromOutside(const Double_t *point, const Double_t *dir, Int_t iact=1, Double_t step=TGeoShape::Big(), Double_t *safe=nullptr) const override
TGeoBBox(const TGeoBBox &)=delete
void InspectShape() const override
Bool_t Contains(const Double_t *point) const override
static Int_t GetVerboseLevel()
Set verbosity level (static function).
Geometrical transformation package.
virtual void MasterToLocal(const Double_t *master, Double_t *local) const
convert a point by multiplying its column vector (x, y, z, 1) to matrix
Class providing navigation API for TGeo geometries.
TGeoNodeCache * GetCache() const
TGeoStateInfo * GetInfo()
Get next state info pointer.
void ReleaseInfo()
Release last used state info pointer.
A node represent a volume positioned inside another.They store links to both volumes and to the TGeoM...
TGeoVolume * GetVolume() const
virtual TGeoMatrix * GetMatrix() const =0
virtual void LocalToMasterVect(const Double_t *local, Double_t *master) const
Convert a vector from local reference system to mother reference.
virtual void LocalToMaster(const Double_t *local, Double_t *master) const
Convert the point coordinates from local reference system to mother reference.
virtual void MasterToLocal(const Double_t *master, Double_t *local) const
Convert the point coordinates from mother reference to local reference system.
virtual void MasterToLocalVect(const Double_t *master, Double_t *local) const
Convert a vector from mother reference to local reference system.
Double_t Safety(const Double_t *point, Bool_t in=kTRUE) const
computes the closest distance from given point to this shape
Double_t DistFromOutside(const Double_t *point, const Double_t *dir, Int_t iact=1, Double_t step=TGeoShape::Big(), Double_t *safe=nullptr) const override
compute distance from outside point to surface of the hyperboloid.
~TGeoShapeAssembly() override
destructor
void SetPoints(Double_t *points) const override
No mesh for assemblies.
void InspectShape() const override
print shape parameters
TGeoShapeAssembly()
Default constructor.
TGeoShape * GetMakeRuntimeShape(TGeoShape *mother, TGeoMatrix *mat) const override
in case shape has some negative parameters, these has to be computed in order to fit the mother
void ComputeBBox() override
Compute bounding box of the assembly.
void DistFromOutside_v(const Double_t *points, const Double_t *dirs, Double_t *dists, Int_t vecsize, Double_t *step) const override
Compute distance from array of input points having directions specified by dirs. Store output in dist...
Int_t DistancetoPrimitive(Int_t px, Int_t py) override
compute closest distance from point px,py to each vertex. Should not be called.
TGeoVolumeAssembly * fVolume
void Contains_v(const Double_t *points, Bool_t *inside, Int_t vecsize) const override
Check the inside status for each of the points in the array.
void Safety_v(const Double_t *points, const Bool_t *inside, Double_t *safe, Int_t vecsize) const override
Compute safe distance from each of the points in the input array.
void ComputeNormal(const Double_t *point, const Double_t *dir, Double_t *norm) const override
Compute normal to closest surface from POINT. Should not be called.
void RecomputeBoxLast()
Recompute bounding box of the assembly after adding a node.
Double_t DistFromInside(const Double_t *point, const Double_t *dir, Int_t iact=1, Double_t step=TGeoShape::Big(), Double_t *safe=nullptr) const override
Compute distance from inside point to surface of the hyperboloid.
void SavePrimitive(std::ostream &out, Option_t *option="") override
Save a primitive as a C++ statement(s) on output stream "out".
Double_t Safety(const Double_t *point, Bool_t in=kTRUE) const override
computes the closest distance from given point to this shape, according to option.
Bool_t Contains(const Double_t *point) const override
Test if point is inside the assembly.
void DistFromInside_v(const Double_t *points, const Double_t *dirs, Double_t *dists, Int_t vecsize, Double_t *step) const override
Compute distance from array of input points having directions specified by dirs. Store output in dist...
void ComputeNormal_v(const Double_t *points, const Double_t *dirs, Double_t *norms, Int_t vecsize) override
Compute the normal for an array o points so that norm.dot.dir is positive Input: Arrays of point coor...
TGeoVolume * Divide(TGeoVolume *voldiv, const char *divname, Int_t iaxis, Int_t ndiv, Double_t start, Double_t step) override
Cannot divide assemblies.
void SetSegsAndPols(TBuffer3D &buff) const override
Fill TBuffer3D structure for segments and polygons.
void GetMeshNumbers(Int_t &nvert, Int_t &nsegs, Int_t &npols) const override
Returns numbers of vertices, segments and polygons composing the shape mesh.
TGeoShape()
Default constructor.
static Bool_t IsSameWithinTolerance(Double_t a, Double_t b)
Check if two numbers differ with less than a tolerance.
virtual Double_t Safety(const Double_t *point, Bool_t in=kTRUE) const =0
virtual void ComputeNormal(const Double_t *point, const Double_t *dir, Double_t *norm) const =0
virtual Double_t DistFromOutside(const Double_t *point, const Double_t *dir, Int_t iact=1, Double_t step=TGeoShape::Big(), Double_t *safe=nullptr) const =0
const char * GetName() const override
Get the shape name.
virtual void ComputeBBox()=0
virtual Bool_t Contains(const Double_t *point) const =0
TGeoVolume, TGeoVolumeMulti, TGeoVolumeAssembly are the volume classes.
TGeoNode * GetNode(const char *name) const
get the pointer to a daughter node
TGeoShape * GetShape() const
virtual Int_t GetCurrentNodeIndex() const
virtual Bool_t IsAssembly() const
Returns true if the volume is an assembly or a scaled assembly.
Finder class handling voxels.
Double_t * GetBoxes() const
virtual Int_t * GetCheckList(const Double_t *point, Int_t &nelem, TGeoStateInfo &td)
get the list of daughter indices for which point is inside their bbox
virtual Int_t * GetNextVoxel(const Double_t *point, const Double_t *dir, Int_t &ncheck, TGeoStateInfo &td)
get the list of new candidates for the next voxel crossed by current ray printf("### GetNextVoxel\n")...
Bool_t IsSafeVoxel(const Double_t *point, Int_t inode, Double_t minsafe) const
Computes squared distance from POINT to the voxel(s) containing node INODE.
virtual void SortCrossedVoxels(const Double_t *point, const Double_t *dir, TGeoStateInfo &td)
get the list in the next voxel crossed by a ray
const char * GetName() const override
Returns name of object.
virtual const char * ClassName() const
Returns name of class to which the object belongs.
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
virtual void Fatal(const char *method, const char *msgfmt,...) const
Issue fatal error message.
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
const char * Data() const
void box(Int_t pat, Double_t x1, Double_t y1, Double_t x2, Double_t y2)
Short_t Min(Short_t a, Short_t b)
Returns the smallest of a and b.
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.
Statefull info for the current geometry level.