98 std::vector<ThreadData_t*>::iterator i =
fThreadData.begin();
117 for (
Int_t tid=0; tid<nthreads; tid++) {
190 Error(
"ctor",
"left shape is NULL");
194 Error(
"ctor",
"right shape is NULL");
215 TString sleft, sright, stransf;
218 Error(
"MakeBranch",
"invalid expression");
225 if (stransf.
Length() == 0) {
231 Error(
"MakeBranch",
"transformation %s not found", stransf.
Data());
239 Error(
"MakeBranch",
"shape %s not found", sleft.
Data());
265 if (boolop && (!shape || !shape->
IsValid())) {
266 Error(
"MakeBranch",
"Shape %s not valid", newshape.
Data());
267 if (shape)
delete shape;
341 Error(
"ReplaceMatrix",
"Matrices should not be gGeoIdentity. Use default matrix constructor to repersent identities.");
344 if (!mat || !newmat) {
345 Error(
"ReplaceMatrix",
"Matrices should not be null pointers.");
394 for (
Int_t i=0; i<3*npoints; i++) points[i] =
fPoints[i];
424 Error(
"Paint",
"gPad->GetViewer3D() returned 0, cannot work with composite!\n");
455 Fatal(
"TGeoUnion",
"Unions with a half-space (%s + %s) not allowed", left->
GetName(), right->
GetName());
482 for (i=0; i<8; i++) {
484 if (pt[0]<xmin) xmin=pt[0];
485 if (pt[0]>xmax) xmax=pt[0];
486 if (pt[1]<ymin) ymin=pt[1];
487 if (pt[1]>ymax) ymax=pt[1];
488 if (pt[2]<zmin) zmin=pt[2];
489 if (pt[2]>zmax) zmax=pt[2];
491 for (i=8; i<16; i++) {
493 if (pt[0]<xmin) xmin=pt[0];
494 if (pt[0]>xmax) xmax=pt[0];
495 if (pt[1]<ymin) ymin=pt[1];
496 if (pt[1]>ymax) ymax=pt[1];
497 if (pt[2]<zmin) zmin=pt[2];
498 if (pt[2]>zmax) zmax=pt[2];
500 dx = 0.5*(xmax-
xmin);
501 origin[0] = 0.5*(xmin+
xmax);
502 dy = 0.5*(ymax-
ymin);
503 origin[1] = 0.5*(ymin+
ymax);
504 dz = 0.5*(zmax-zmin);
505 origin[2] = 0.5*(zmin+zmax);
516 if (inside)
return kTRUE;
528 norm[0] = norm[1] = 0.;
561 local[0] = point[0] + 1
E-5*dir[0];
562 local[1] = point[1] + 1
E-5*dir[1];
563 local[2] = point[2] + 1
E-5*dir[2];
566 local[0] = point[0] - 1
E-5*dir[0];
567 local[1] = point[1] - 1
E-5*dir[1];
568 local[2] = point[2] - 1
E-5*dir[2];
588 if (iact<3 && safe) {
595 Double_t local[3], local1[3], master[3], ldir[3], rdir[3], pushed[3];
596 memcpy(master, point, 3*
sizeof(
Double_t));
599 Double_t d1=0., d2=0., snxt=0., eps=0.;
605 else memcpy(local1, local, 3*
sizeof(
Double_t));
609 if (!(inside1 | inside2)) {
614 for (i=0; i<3; i++) local1[i] += eps*ldir[i];
622 for (i=0; i<3; i++) local[i] += eps*rdir[i];
629 while (inside1 || inside2) {
630 if (inside1 && inside2) {
636 for (i=0; i<3; i++) master[i] += d1*dir[i];
640 if (!inside2)
return snxt;
648 for (i=0; i<3; i++) master[i] += d2*dir[i];
652 if (!inside1)
return snxt;
662 for (i=0; i<3; i++) {
663 master[i] += d1*dir[i];
669 if (!inside2)
return snxt;
679 for (i=0; i<3; i++) {
680 master[i] += d2*dir[i];
686 if (!inside1)
return snxt;
701 if (iact<3 && safe) {
708 Double_t local[3], ldir[3], rdir[3];
744 for (
Int_t i=0; i<nleft; i++) {
750 for (
Int_t i=0; i<nright; i++) {
775 Bool_t intrue = in1 | in2;
776 if (intrue^in)
return 0.0;
779 if (in1 && in2)
return TMath::Min(saf1, saf2);
780 if (in1)
return saf1;
781 if (in2)
return saf2;
791 out <<
" pBoolNode = new TGeoUnion(";
797 else out <<
"0);" << std::endl;
827 Error(
"Paint",
"gPad->GetViewer3D() returned 0, cannot work with composite!\n");
858 Fatal(
"TGeoSubstraction",
"Substractions from a half-space (%s) not allowed", left->
GetName());
884 for (i=0; i<8; i++) {
886 if (pt[0]<xmin) xmin=pt[0];
887 if (pt[0]>xmax) xmax=pt[0];
888 if (pt[1]<ymin) ymin=pt[1];
889 if (pt[1]>ymax) ymax=pt[1];
890 if (pt[2]<zmin) zmin=pt[2];
891 if (pt[2]>zmax) zmax=pt[2];
893 dx = 0.5*(xmax-
xmin);
894 origin[0] = 0.5*(xmin+
xmax);
895 dy = 0.5*(ymax-
ymin);
896 origin[1] = 0.5*(ymin+
ymax);
897 dz = 0.5*(zmax-zmin);
898 origin[2] = 0.5*(zmin+zmax);
907 norm[0] = norm[1] = 0.;
909 Double_t local[3], ldir[3], lnorm[3];
939 local[0] = point[0]+1
E-5*dir[0];
940 local[1] = point[1]+1
E-5*dir[1];
941 local[2] = point[2]+1
E-5*dir[2];
943 local[0] = point[0]-1
E-5*dir[0];
944 local[1] = point[1]-1
E-5*dir[1];
945 local[2] = point[2]-1
E-5*dir[2];
959 if (!inside)
return kFALSE;
979 if (iact<3 && safe) {
986 Double_t local[3], ldir[3], rdir[3];
1010 if (iact<3 && safe) {
1017 Double_t local[3], master[3], ldir[3], rdir[3];
1018 memcpy(&master[0], point, 3*
sizeof(
Double_t));
1033 for (i=0; i<3; i++) master[i] += (d1+1
E-8)*dir[i];
1053 for (i=0; i<3; i++) master[i] += (d1+1
E-8)*dir[i];
1075 for (
Int_t i=0; i<nleft; i++) {
1083 for (
Int_t i=0; i<nright; i++) {
1108 Bool_t intrue = in1 && (!in2);
1109 if (in^intrue)
return 0.0;
1112 if (in1 && in2)
return saf2;
1124 out <<
" pBoolNode = new TGeoSubtraction(";
1130 else out <<
"0);" << std::endl;
1159 Error(
"Paint",
"gPad->GetViewer3D() returned 0, cannot work with composite!\n");
1191 if (hs1 && hs2)
Fatal(
"ctor",
"cannot intersect two half-spaces: %s * %s", left->
GetName(), right->
GetName());
1212 Double_t xmin1, xmax1, ymin1, ymax1, zmin1, zmax1;
1213 Double_t xmin2, xmax2, ymin2, ymax2, zmin2, zmax2;
1214 xmin1 = ymin1 = zmin1 = xmin2 = ymin2 = zmin2 =
TGeoShape::Big();
1215 xmax1 = ymax1 = zmax1 = xmax2 = ymax2 = zmax2 = -
TGeoShape::Big();
1219 for (i=0; i<8; i++) {
1221 if (pt[0]<xmin1) xmin1=pt[0];
1222 if (pt[0]>xmax1) xmax1=pt[0];
1223 if (pt[1]<ymin1) ymin1=pt[1];
1224 if (pt[1]>ymax1) ymax1=pt[1];
1225 if (pt[2]<zmin1) zmin1=pt[2];
1226 if (pt[2]>zmax1) zmax1=pt[2];
1232 for (i=8; i<16; i++) {
1234 if (pt[0]<xmin2) xmin2=pt[0];
1235 if (pt[0]>xmax2) xmax2=pt[0];
1236 if (pt[1]<ymin2) ymin2=pt[1];
1237 if (pt[1]>ymax2) ymax2=pt[1];
1238 if (pt[2]<zmin2) zmin2=pt[2];
1239 if (pt[2]>zmax2) zmax2=pt[2];
1243 dx = 0.5*(xmax2-xmin2);
1244 origin[0] = 0.5*(xmax2+xmin2);
1245 dy = 0.5*(ymax2-ymin2);
1246 origin[1] = 0.5*(ymax2+ymin2);
1247 dz = 0.5*(zmax2-zmin2);
1248 origin[2] = 0.5*(zmax2+zmin2);
1252 dx = 0.5*(xmax1-xmin1);
1253 origin[0] = 0.5*(xmax1+xmin1);
1254 dy = 0.5*(ymax1-ymin1);
1255 origin[1] = 0.5*(ymax1+ymin1);
1256 dz = 0.5*(zmax1-zmin1);
1257 origin[2] = 0.5*(zmax1+zmin1);
1270 memset(origin, 0, 3*
sizeof(
Double_t));
1273 dx = 0.5*(sort[isort[2]]-sort[isort[1]]);
1274 origin[0] = 0.5*(sort[isort[1]]+sort[isort[2]]);
1283 memset(origin, 0, 3*
sizeof(
Double_t));
1286 dy = 0.5*(sort[isort[2]]-sort[isort[1]]);
1287 origin[1] = 0.5*(sort[isort[1]]+sort[isort[2]]);
1296 memset(origin, 0, 3*
sizeof(
Double_t));
1299 dz = 0.5*(sort[isort[2]]-sort[isort[1]]);
1300 origin[2] = 0.5*(sort[isort[1]]+sort[isort[2]]);
1309 Double_t local[3], ldir[3], lnorm[3];
1310 norm[0] = norm[1] = 0.;
1341 local[0] = point[0] + 1
E-5*dir[0];
1342 local[1] = point[1] + 1
E-5*dir[1];
1343 local[2] = point[2] + 1
E-5*dir[2];
1345 local[0] = point[0] - 1
E-5*dir[0];
1346 local[1] = point[1] - 1
E-5*dir[1];
1347 local[2] = point[2] - 1
E-5*dir[2];
1361 if (!inside)
return kFALSE;
1381 if (iact<3 && safe) {
1388 Double_t local[3], ldir[3], rdir[3];
1413 if (iact<3 && safe) {
1420 Double_t lpt[3], rpt[3], master[3], ldir[3], rdir[3];
1421 memcpy(master, point, 3*
sizeof(
Double_t));
1433 if (inleft && inright) {
1438 if (d1<1.
E-3) inleft =
kFALSE;
1439 if (d2<1.
E-3) inright =
kFALSE;
1440 if (inleft && inright)
return snext;
1461 for (i=0; i<3; i++) master[i] += d1*dir[i];
1464 for (i=0; i<3; i++) rpt[i] += tol*rdir[i];
1467 if (inright)
return snext;
1474 for (i=0; i<3; i++) master[i] += d2*dir[i];
1477 for (i=0; i<3; i++) lpt[i] += tol*ldir[i];
1480 if (inleft)
return snext;
1501 for (
Int_t i=0; i<nleft; i++) {
1509 for (
Int_t i=0; i<nright; i++) {
1534 Bool_t intrue = in1 & in2;
1535 if (in^intrue)
return 0.0;
1538 if (in1 && in2)
return TMath::Min(saf1, saf2);
1539 if (in1)
return saf2;
1540 if (in2)
return saf1;
1550 out <<
" pBoolNode = new TGeoIntersection(";
1556 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
Computes distance from a given point inside the shape to its boundary.
virtual Double_t Safety(const Double_t *point, Bool_t in=kTRUE) const
Compute safety distance for a union node;.
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. ...
virtual void Paint(Option_t *option)
Special schema for feeding the 3D buffers to the painter client.
ClassImp(TGeoBoolNode) TGeoBoolNode
Constructor.
TGeoUnion()
Default constructor.
virtual ~TGeoUnion()
Destructor — deletion of components handled by TGeoManager class.
#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 ComputeNormal(const Double_t *point, const Double_t *dir, Double_t *norm)=0
std::vector< ThreadData_t * > fThreadData
array of mesh points
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 Int_t DistanceToPrimitive(Int_t px, Int_t py)
Compute minimum distance to shape vertices.
TGeoIntersection()
Default constructor.
virtual Int_t GetNpoints()=0
virtual void Sizeof3D() const
Register size of this 3D object.
void Multiply(const TGeoMatrix *right)
multiply to the right with an other transformation if right is identity matrix, just return ...
TObjArray * GetListOfShapes() const
Short_t Min(Short_t a, Short_t b)
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.
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
void box(Int_t pat, Double_t x1, Double_t y1, Double_t x2, Double_t y2)
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 TGeoBoolNode * MakeClone() const =0
virtual void Sizeof3D() const
Register 3D size of this shape.
virtual void Sizeof3D() const
Register 3D size of this shape.
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.
static Double_t Tolerance()
virtual void Sizeof3D() const
Register 3D size of this shape.
const char * Data() const
virtual TObject * FindObject(const char *name) const
Find an object in this collection using its name.
virtual void Fatal(const char *method, const char *msgfmt,...) const
Issue fatal error message.
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 Int_t GetNpoints()
Returns number of vertices for the composite shape described by this union.
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.
Bool_t IsIdentity() const
void Sort(Index n, const Element *a, Index *index, Bool_t down=kTRUE)
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
Abstract 3D shapes viewer.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
TGeoBoolNode()
Default constructor.
virtual void SetPoints(Double_t *points) const =0
virtual ~TGeoBoolNode()
Destructor.
ThreadData_t & GetThreadData() const
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 Int_t GetNmeshVertices() const
TGeoSubtraction()
Default constructor.
char * GetPointerName() const
Provide a pointer name containing uid.
virtual Int_t GetNpoints()
Returns number of vertices for the composite shape described by this intersection.
Int_t fThreadSize
Navigation data per thread.
void SetBoxPoints(Double_t *points) const
Fill box vertices to an array.
virtual Double_t Safety(const Double_t *point, Bool_t in=kTRUE) const =0
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 Int_t AddObject(const TBuffer3D &buffer, Bool_t *addChildren=0)=0
~ThreadData_t()
Destructor.
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 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
TObjArray * GetListOfMatrices() const
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
virtual const char * GetName() const
Get the shape name.
virtual void SavePrimitive(std::ostream &out, Option_t *option="")
Save a primitive as a C++ statement(s) on output stream "out".
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 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
virtual Double_t Safety(const Double_t *point, Bool_t in=kTRUE) const
Compute safety distance for a union node;.
static Int_t UnLock()
Static method to unlock the main thread mutex.
virtual ~TGeoIntersection()
Destructor — deletion of components handled by TGeoManager class.
R__EXTERN TGeoManager * gGeoManager
virtual void Paint(Option_t *option)
Special schema for feeding the 3D buffers to the painter client.
virtual void SetPoints(Double_t *points) const
Fill buffer with shape vertices.
virtual Bool_t IsComposite() const
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 Bool_t Contains(const Double_t *point) const
Find if a intersection of two shapes contains a given point.
virtual void AddCompositeOp(UInt_t operation)=0
virtual Bool_t Contains(const Double_t *point) const
Find if a subtraction of two shapes contains a given point.
virtual void ComputeBBox()=0
const char * GetPointerName() const
Provide a pointer name containing uid.
static TGeoMatrix * GetTransform()
Returns current transformation matrix that applies to shape.
R__EXTERN TGeoIdentity * gGeoIdentity
Bool_t TestShapeBit(UInt_t f) const
static Int_t ThreadId()
Translates the current thread id to an ordinal number.
virtual Double_t Safety(const Double_t *point, Bool_t in=kTRUE) const
Compute safety distance for a union node;.
Short_t Max(Short_t a, Short_t b)
virtual Bool_t Contains(const Double_t *point) const
Find if a union of two shapes contains a given point.
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.
void ClearThreadData() const
virtual const TBuffer3D & GetBuffer3D(Int_t reqSections, Bool_t localFrame) const
Stub implementation to avoid forcing implementation at this stage.
virtual void Paint(Option_t *option)
Special schema for feeding the 3D buffers to the painter client.
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 SavePrimitive(std::ostream &out, Option_t *option="")
Save a primitive as a C++ statement(s) on output stream "out".
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.