96 std::vector<ThreadData_t*>::iterator i =
fThreadData.begin();
115 for (
Int_t tid=0; tid<nthreads; tid++) {
188 Error(
"ctor",
"left shape is NULL");
192 Error(
"ctor",
"right shape is NULL");
213 TString sleft, sright, stransf;
216 Error(
"MakeBranch",
"invalid expression");
223 if (stransf.
Length() == 0) {
229 Error(
"MakeBranch",
"transformation %s not found", stransf.
Data());
237 Error(
"MakeBranch",
"shape %s not found", sleft.
Data());
263 if (boolop && (!shape || !shape->
IsValid())) {
264 Error(
"MakeBranch",
"Shape %s not valid", newshape.
Data());
265 if (shape)
delete shape;
339 Error(
"ReplaceMatrix",
"Matrices should not be gGeoIdentity. Use default matrix constructor to represent identities.");
342 if (!mat || !newmat) {
343 Error(
"ReplaceMatrix",
"Matrices should not be null pointers.");
392 for (
Int_t i=0; i<3*npoints; i++) points[i] =
fPoints[i];
422 Error(
"Paint",
"gPad->GetViewer3D() returned 0, cannot work with composite!\n");
453 Fatal(
"TGeoUnion",
"Unions with a half-space (%s + %s) not allowed", left->
GetName(), right->
GetName());
478 ((
TGeoBBox*)fLeft)->SetBoxPoints(&vert[0]);
479 ((
TGeoBBox*)fRight)->SetBoxPoints(&vert[24]);
480 for (i=0; i<8; i++) {
482 if (pt[0]<xmin) xmin=pt[0];
483 if (pt[0]>xmax) xmax=pt[0];
484 if (pt[1]<ymin) ymin=pt[1];
485 if (pt[1]>ymax) ymax=pt[1];
486 if (pt[2]<zmin) zmin=pt[2];
487 if (pt[2]>zmax) zmax=pt[2];
489 for (i=8; i<16; i++) {
491 if (pt[0]<xmin) xmin=pt[0];
492 if (pt[0]>xmax) xmax=pt[0];
493 if (pt[1]<ymin) ymin=pt[1];
494 if (pt[1]>ymax) ymax=pt[1];
495 if (pt[2]<zmin) zmin=pt[2];
496 if (pt[2]>zmax) zmax=pt[2];
498 dx = 0.5*(xmax-
xmin);
499 origin[0] = 0.5*(xmin+
xmax);
500 dy = 0.5*(ymax-
ymin);
501 origin[1] = 0.5*(ymin+
ymax);
502 dz = 0.5*(zmax-zmin);
503 origin[2] = 0.5*(zmin+zmax);
514 if (inside)
return kTRUE;
526 norm[0] = norm[1] = 0.;
559 local[0] = point[0] + 1
E-5*dir[0];
560 local[1] = point[1] + 1
E-5*dir[1];
561 local[2] = point[2] + 1
E-5*dir[2];
564 local[0] = point[0] - 1
E-5*dir[0];
565 local[1] = point[1] - 1
E-5*dir[1];
566 local[2] = point[2] - 1
E-5*dir[2];
586 if (iact<3 && safe) {
593 Double_t local[3], local1[3], master[3], ldir[3], rdir[3], pushed[3];
594 memcpy(master, point, 3*
sizeof(
Double_t));
597 Double_t d1=0., d2=0., snxt=0., eps=0.;
603 else memcpy(local1, local, 3*
sizeof(
Double_t));
607 if (!(inside1 | inside2)) {
612 for (i=0; i<3; i++) local1[i] += eps*ldir[i];
620 for (i=0; i<3; i++) local[i] += eps*rdir[i];
627 while (inside1 || inside2) {
628 if (inside1 && inside2) {
634 for (i=0; i<3; i++) master[i] += d1*dir[i];
638 if (!inside2)
return snxt;
646 for (i=0; i<3; i++) master[i] += d2*dir[i];
650 if (!inside1)
return snxt;
660 for (i=0; i<3; i++) {
661 master[i] += d1*dir[i];
667 if (!inside2)
return snxt;
677 for (i=0; i<3; i++) {
678 master[i] += d2*dir[i];
684 if (!inside1)
return snxt;
699 if (iact<3 && safe) {
706 Double_t local[3], ldir[3], rdir[3];
742 for (
Int_t i=0; i<nleft; i++) {
748 for (
Int_t i=0; i<nright; i++) {
773 Bool_t intrue = in1 | in2;
774 if (intrue^in)
return 0.0;
777 if (in1 && in2)
return TMath::Min(saf1, saf2);
778 if (in1)
return saf1;
779 if (in2)
return saf2;
789 out <<
" pBoolNode = new TGeoUnion(";
795 else out <<
"0);" << std::endl;
825 Error(
"Paint",
"gPad->GetViewer3D() returned 0, cannot work with composite!\n");
856 Fatal(
"TGeoSubstraction",
"Subtractions from a half-space (%s) not allowed", left->
GetName());
882 for (i=0; i<8; i++) {
884 if (pt[0]<xmin) xmin=pt[0];
885 if (pt[0]>xmax) xmax=pt[0];
886 if (pt[1]<ymin) ymin=pt[1];
887 if (pt[1]>ymax) ymax=pt[1];
888 if (pt[2]<zmin) zmin=pt[2];
889 if (pt[2]>zmax) zmax=pt[2];
891 dx = 0.5*(xmax-
xmin);
892 origin[0] = 0.5*(xmin+
xmax);
893 dy = 0.5*(ymax-
ymin);
894 origin[1] = 0.5*(ymin+
ymax);
895 dz = 0.5*(zmax-zmin);
896 origin[2] = 0.5*(zmin+zmax);
905 norm[0] = norm[1] = 0.;
907 Double_t local[3], ldir[3], lnorm[3];
937 local[0] = point[0]+1
E-5*dir[0];
938 local[1] = point[1]+1
E-5*dir[1];
939 local[2] = point[2]+1
E-5*dir[2];
941 local[0] = point[0]-1
E-5*dir[0];
942 local[1] = point[1]-1
E-5*dir[1];
943 local[2] = point[2]-1
E-5*dir[2];
957 if (!inside)
return kFALSE;
977 if (iact<3 && safe) {
984 Double_t local[3], ldir[3], rdir[3];
1008 if (iact<3 && safe) {
1015 Double_t local[3], master[3], ldir[3], rdir[3];
1016 memcpy(&master[0], point, 3*
sizeof(
Double_t));
1031 for (i=0; i<3; i++) master[i] += (d1+1
E-8)*dir[i];
1051 for (i=0; i<3; i++) master[i] += (d1+1
E-8)*dir[i];
1073 for (
Int_t i=0; i<nleft; i++) {
1081 for (
Int_t i=0; i<nright; i++) {
1106 Bool_t intrue = in1 && (!in2);
1107 if (in^intrue)
return 0.0;
1110 if (in1 && in2)
return saf2;
1122 out <<
" pBoolNode = new TGeoSubtraction(";
1128 else out <<
"0);" << std::endl;
1157 Error(
"Paint",
"gPad->GetViewer3D() returned 0, cannot work with composite!\n");
1189 if (hs1 && hs2)
Fatal(
"ctor",
"cannot intersect two half-spaces: %s * %s", left->
GetName(), right->
GetName());
1210 Double_t xmin1, xmax1, ymin1, ymax1, zmin1, zmax1;
1211 Double_t xmin2, xmax2, ymin2, ymax2, zmin2, zmax2;
1212 xmin1 = ymin1 = zmin1 = xmin2 = ymin2 = zmin2 =
TGeoShape::Big();
1213 xmax1 = ymax1 = zmax1 = xmax2 = ymax2 = zmax2 = -
TGeoShape::Big();
1216 ((
TGeoBBox*)fLeft)->SetBoxPoints(&vert[0]);
1217 for (i=0; i<8; i++) {
1219 if (pt[0]<xmin1) xmin1=pt[0];
1220 if (pt[0]>xmax1) xmax1=pt[0];
1221 if (pt[1]<ymin1) ymin1=pt[1];
1222 if (pt[1]>ymax1) ymax1=pt[1];
1223 if (pt[2]<zmin1) zmin1=pt[2];
1224 if (pt[2]>zmax1) zmax1=pt[2];
1229 ((
TGeoBBox*)fRight)->SetBoxPoints(&vert[24]);
1230 for (i=8; i<16; i++) {
1232 if (pt[0]<xmin2) xmin2=pt[0];
1233 if (pt[0]>xmax2) xmax2=pt[0];
1234 if (pt[1]<ymin2) ymin2=pt[1];
1235 if (pt[1]>ymax2) ymax2=pt[1];
1236 if (pt[2]<zmin2) zmin2=pt[2];
1237 if (pt[2]>zmax2) zmax2=pt[2];
1241 dx = 0.5*(xmax2-xmin2);
1242 origin[0] = 0.5*(xmax2+xmin2);
1243 dy = 0.5*(ymax2-ymin2);
1244 origin[1] = 0.5*(ymax2+ymin2);
1245 dz = 0.5*(zmax2-zmin2);
1246 origin[2] = 0.5*(zmax2+zmin2);
1250 dx = 0.5*(xmax1-xmin1);
1251 origin[0] = 0.5*(xmax1+xmin1);
1252 dy = 0.5*(ymax1-ymin1);
1253 origin[1] = 0.5*(ymax1+ymin1);
1254 dz = 0.5*(zmax1-zmin1);
1255 origin[2] = 0.5*(zmax1+zmin1);
1268 memset(origin, 0, 3*
sizeof(
Double_t));
1271 dx = 0.5*(sort[isort[2]]-sort[isort[1]]);
1272 origin[0] = 0.5*(sort[isort[1]]+sort[isort[2]]);
1281 memset(origin, 0, 3*
sizeof(
Double_t));
1284 dy = 0.5*(sort[isort[2]]-sort[isort[1]]);
1285 origin[1] = 0.5*(sort[isort[1]]+sort[isort[2]]);
1294 memset(origin, 0, 3*
sizeof(
Double_t));
1297 dz = 0.5*(sort[isort[2]]-sort[isort[1]]);
1298 origin[2] = 0.5*(sort[isort[1]]+sort[isort[2]]);
1307 Double_t local[3], ldir[3], lnorm[3];
1308 norm[0] = norm[1] = 0.;
1339 local[0] = point[0] + 1
E-5*dir[0];
1340 local[1] = point[1] + 1
E-5*dir[1];
1341 local[2] = point[2] + 1
E-5*dir[2];
1343 local[0] = point[0] - 1
E-5*dir[0];
1344 local[1] = point[1] - 1
E-5*dir[1];
1345 local[2] = point[2] - 1
E-5*dir[2];
1359 if (!inside)
return kFALSE;
1379 if (iact<3 && safe) {
1386 Double_t local[3], ldir[3], rdir[3];
1411 if (iact<3 && safe) {
1418 Double_t lpt[3], rpt[3], master[3], ldir[3], rdir[3];
1419 memcpy(master, point, 3*
sizeof(
Double_t));
1431 if (inleft && inright) {
1436 if (d1<1.
E-3) inleft =
kFALSE;
1437 if (d2<1.
E-3) inright =
kFALSE;
1438 if (inleft && inright)
return snext;
1459 for (i=0; i<3; i++) master[i] += d1*dir[i];
1462 for (i=0; i<3; i++) rpt[i] += tol*rdir[i];
1465 if (inright)
return snext;
1472 for (i=0; i<3; i++) master[i] += d2*dir[i];
1475 for (i=0; i<3; i++) lpt[i] += tol*ldir[i];
1478 if (inleft)
return snext;
1499 for (
Int_t i=0; i<nleft; i++) {
1507 for (
Int_t i=0; i<nright; i++) {
1532 Bool_t intrue = in1 & in2;
1533 if (in^intrue)
return 0.0;
1536 if (in1 && in2)
return TMath::Min(saf1, saf2);
1537 if (in1)
return saf2;
1538 if (in2)
return saf1;
1548 out <<
" pBoolNode = new TGeoIntersection(";
1554 else out <<
"0);" << std::endl;
virtual Double_t DistFromInside(const Double_t *point, const Double_t *dir, Int_t iact=1, Double_t step=0, Double_t *safe=0) const
Compute distance from a given point inside to the shape boundary.
virtual Int_t DistanceToPrimitive(Int_t px, Int_t py)
Compute minimum distance to shape vertices.
virtual void Sizeof3D() const =0
virtual Int_t GetNpoints()
Returns number of vertices for the composite shape described by this subtraction. ...
TGeoUnion()
Default constructor.
virtual void MasterToLocalVect(const Double_t *master, Double_t *local) const
convert a point by multiplying its column vector (x, y, z, 1) to matrix
virtual ~TGeoUnion()
Destructor — deletion of components handled by TGeoManager class.
virtual Double_t DistFromInside(const Double_t *point, const Double_t *dir, Int_t iact=1, Double_t step=0, Double_t *safe=0) const
Compute distance from a given point inside to the shape boundary.
#define snext(osub1, osub2)
virtual void ComputeNormal(const Double_t *point, const Double_t *dir, Double_t *norm)
Normal computation in POINT. The orientation is chosen so that DIR.dot.NORM>0.
virtual void ComputeBBox(Double_t &dx, Double_t &dy, Double_t &dz, Double_t *origin)
Compute bounding box corresponding to a subtraction of two shapes.
virtual void Sizeof3D() const
Register 3D size of this shape.
virtual void ComputeNormal(const Double_t *point, const Double_t *dir, Double_t *norm)=0
Geometrical transformation package.
std::vector< ThreadData_t * > fThreadData
array of mesh points
virtual Double_t Safety(const Double_t *point, Bool_t in=kTRUE) const
Compute safety distance for a union node;.
virtual void CreateThreadData(Int_t)
void SetSelected(Int_t sel)
Set the selected branch.
virtual void SavePrimitive(std::ostream &out, Option_t *option="")
Save a primitive as a C++ statement(s) on output stream "out".
virtual void Paint(Option_t *option)
Paint method.
virtual Int_t DistanceToPrimitive(Int_t px, Int_t py)
Compute minimum distance to shape vertices.
TGeoIntersection()
Default constructor.
virtual void Sizeof3D() const
Register 3D size of this shape.
virtual Int_t GetNpoints()=0
virtual void Sizeof3D() const
Register 3D size of this shape.
virtual Bool_t Contains(const Double_t *point) const
Find if a union of two shapes contains a given point.
Matrix class used for computing global transformations Should NOT be used for node definition...
void Multiply(const TGeoMatrix *right)
multiply to the right with an other transformation if right is identity matrix, just return ...
Short_t Min(Short_t a, Short_t b)
virtual void SetPoints(Double_t *points) const
Fill buffer with shape vertices.
static Int_t Parse(const char *expr, TString &expr1, TString &expr2, TString &expr3)
Parse a string boolean expression and do a syntax check.
void RegisterMatrices()
Register all matrices of the boolean node and descendents.
void box(Int_t pat, Double_t x1, Double_t y1, Double_t x2, Double_t y2)
virtual TGeoBoolNode * MakeClone() const =0
virtual void ComputeBBox()
Compute bounding box - nothing to do in this case.
virtual ~TGeoSubtraction()
Destructor — deletion of components handled by TGeoManager class.
virtual void ComputeNormal(const Double_t *point, const Double_t *dir, Double_t *norm)
Normal computation in POINT. The orientation is chosen so that DIR.dot.NORM>0.
virtual Double_t Safety(const Double_t *point, Bool_t in=kTRUE) const
Compute safety distance for a union node;.
static Double_t Tolerance()
virtual Bool_t Contains(const Double_t *point) const =0
Bool_t MakeBranch(const char *expr, Bool_t left)
Size for the navigation data array.
virtual void Paint(Option_t *option)
Special schema for feeding the 3D buffers to the painter client.
virtual TObject * FindObject(const char *name) const
Find an object in this collection using its name.
virtual TGeoBoolNode * MakeClone() const
Make a clone of this. Pointers are preserved.
virtual Int_t GetNpoints()
Returns number of vertices for the composite shape described by this union.
Bool_t IsIdentity() const
void Sort(Index n, const Element *a, Index *index, Bool_t down=kTRUE)
virtual Double_t DistFromOutside(const Double_t *point, const Double_t *dir, Int_t iact=1, Double_t step=0, Double_t *safe=0) const
Compute distance from a given point outside to the shape.
Abstract 3D shapes viewer.
virtual void LocalToMasterVect(const Double_t *local, Double_t *master) const
convert a vector by multiplying its column vector (x, y, z, 1) to matrix inverse
char * GetPointerName() const
Provide a pointer name containing uid.
TGeoBoolNode()
Default constructor.
virtual void SetPoints(Double_t *points) const =0
void SetBoxPoints(Double_t *points) const
Fill box vertices to an array.
const char * GetPointerName() const
Provide a pointer name containing uid.
virtual ~TGeoBoolNode()
Destructor.
virtual Double_t Safety(const Double_t *point, Bool_t in=kTRUE) const
Compute safety distance for a union node;.
Class handling Boolean composition of shapes.
virtual const char * GetName() const
Get the shape name.
TGeoSubtraction()
Default constructor.
virtual Double_t DistFromOutside(const Double_t *point, const Double_t *dir, Int_t iact=1, Double_t step=0, Double_t *safe=0) const
Compute distance from a given outside point to the shape.
virtual Int_t GetNpoints()
Returns number of vertices for the composite shape described by this intersection.
Base abstract class for all shapes.
ThreadData_t()
Constructor.
Int_t fThreadSize
Navigation data per thread.
virtual Bool_t Contains(const Double_t *point) const
Find if a intersection of two shapes contains a given point.
virtual Double_t Safety(const Double_t *point, Bool_t in=kTRUE) const =0
virtual Bool_t IsComposite() const
virtual Bool_t Contains(const Double_t *point) const
Find if a subtraction of two shapes contains a given point.
virtual const TBuffer3D & GetBuffer3D(Int_t reqSections, Bool_t localFrame) const
Stub implementation to avoid forcing implementation at this stage.
virtual void SavePrimitive(std::ostream &out, Option_t *option="")
Save a primitive as a C++ statement(s) on output stream "out".
virtual Int_t GetNmeshVertices() const
TObjArray * GetListOfShapes() const
virtual Double_t DistFromInside(const Double_t *point, const Double_t *dir, Int_t iact=1, Double_t step=0, Double_t *safe=0) const
Computes distance from a given point inside the shape to its boundary.
virtual Int_t AddObject(const TBuffer3D &buffer, Bool_t *addChildren=0)=0
~ThreadData_t()
Destructor.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
virtual void ComputeNormal(const Double_t *point, const Double_t *dir, Double_t *norm)
Normal computation in POINT. The orientation is chosen so that DIR.dot.NORM>0.
virtual void RegisterYourself()
Register the matrix in the current manager, which will become the owner.
virtual Double_t DistFromOutside(const Double_t *point, const Double_t *dir, Int_t iact=1, Double_t step=0, Double_t *safe=0) const
Compute distance from a given point outside to the shape.
virtual void ComputeBBox(Double_t &dx, Double_t &dy, Double_t &dz, Double_t *origin)
Compute bounding box corresponding to a intersection of two shapes.
void CreateThreadData(Int_t nthreads)
Create thread data for n threads max.
Generic 3D primitive description class.
virtual void SavePrimitive(std::ostream &out, Option_t *option="")
Save a primitive as a C++ statement(s) on output stream "out".
Bool_t ReplaceMatrix(TGeoMatrix *mat, TGeoMatrix *newmat)
Replace one of the matrices.
static Int_t Lock()
Static method to lock the main thread mutex.
Double_t * fPoints
number of points on the mesh
virtual Double_t DistFromOutside(const Double_t *point, const Double_t *dir, Int_t iact=1, Double_t step=TGeoShape::Big(), Double_t *safe=0) const =0
TObjArray * GetListOfMatrices() const
virtual void SavePrimitive(std::ostream &out, Option_t *option="")
Save a primitive as a C++ statement(s) on output stream "out".
virtual void LocalToMaster(const Double_t *local, Double_t *master) const
convert a point by multiplying its column vector (x, y, z, 1) to matrix inverse
virtual Bool_t IsNullBox() const
virtual Double_t DistFromInside(const Double_t *point, const Double_t *dir, Int_t iact=1, Double_t step=TGeoShape::Big(), Double_t *safe=0) const =0
static Int_t UnLock()
Static method to unlock the main thread mutex.
ThreadData_t & GetThreadData() const
virtual ~TGeoIntersection()
Destructor — deletion of components handled by TGeoManager class.
R__EXTERN TGeoManager * gGeoManager
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
Bool_t TestShapeBit(UInt_t f) const
virtual void Paint(Option_t *option)
Paint method.
virtual TGeoBoolNode * MakeClone() const
Make a clone of this. Pointers are preserved.
virtual void Sizeof3D() const
Register size of this 3D object.
virtual void AddCompositeOp(UInt_t operation)=0
virtual void ComputeBBox()=0
static TGeoMatrix * GetTransform()
Returns current transformation matrix that applies to shape.
R__EXTERN TGeoIdentity * gGeoIdentity
static Int_t ThreadId()
Translates the current thread id to an ordinal number.
Base class for Boolean operations between two shapes.
Short_t Max(Short_t a, Short_t b)
void ClearThreadData() const
virtual void Fatal(const char *method, const char *msgfmt,...) const
Issue fatal error message.
double norm(double *x, double *p)
virtual void ComputeBBox(Double_t &dx, Double_t &dy, Double_t &dz, Double_t *origin)
Compute bounding box corresponding to a union of two shapes.
virtual Int_t DistanceToPrimitive(Int_t px, Int_t py)
Compute minimum distance to shape vertices.
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
virtual void Paint(Option_t *option)
Paint method.
const char * Data() const
virtual void SavePrimitive(std::ostream &out, Option_t *option="")
Save a primitive as a C++ statement(s) on output stream "out".