95 for (
Int_t i = 0; i < 3; i++) {
149 for (
Int_t i = 0; i < 3; i++) {
190 if (first && verbose > 0)
191 Info(
"BuildCache",
"--- Maximum geometry depth set to 100");
193 if (first && verbose > 0)
194 Info(
"BuildCache",
"--- Maximum geometry depth is %i", nlevel);
218 if (ind1 == length - 1)
226 ind2 = spath.
Index(
"/", ind1 + 1);
227 if (ind2 < 0 || ind2 == length - 1) {
232 name = spath(ind1 + 1, ind2 - ind1 - 1);
243 Error(
"cd",
"Path %s not valid", path);
264 if (ind1 == length - 1)
272 ind2 = spath.
Index(
"/", ind1 + 1);
273 if (ind2 < 0 || ind2 == length - 1) {
278 name = spath(ind1 + 1, ind2 - ind1 - 1);
424 while (nextindex >= 0) {
426 nextindex =
fCurrentNode->GetVolume()->GetNextNodeIndex();
437 fCache->GetBranchNames(names);
445 fCache->GetBranchNumbers(copyNumbers, volumeNumbers);
453 fCache->GetBranchOnlys(isonly);
464 Fatal(
"CrossDivisionCell",
"Volume has no pattern finder");
470 Double_t point[3], newpoint[3], dir[3];
532 for (
Int_t i = 0; i < 10; ++i)
533 crtstate[i] =
nullptr;
554 while (nextindex >= 0) {
557 nextindex =
fCurrentNode->GetVolume()->GetNextNodeIndex();
560 printf(
"CrossBoundaryAndLocate: entered %s\n",
GetPath());
566 if (current == skipnode) {
570 for (
Int_t i = 1; i < level; i++) {
584 printf(
"CrossBoundaryAndLocate: Exited geometry\n");
594 printf(
"CrossBoundaryAndLocate: Exited geometry\n");
597 printf(
"CrossBoundaryAndLocate: entered %s\n",
GetPath());
604 printf(
"CrossBoundaryAndLocate: entered %s\n",
GetPath());
641 if (stepmax < 1E29) {
644 computeGlobal =
kTRUE;
674 printf(
"TGeoManager::FindNextBoundary: point=(%19.16f, %19.16f, %19.16f)\n",
fPoint[0],
fPoint[1],
fPoint[2]);
677 printf(
" pstep=%9.6g path=%s\n", stepmax,
GetPath());
692 printf(
"=== To path: %s\n", path);
693 printf(
"=== local to %s: (%19.16f, %19.16f, %19.16f, %19.16f, %19.16f, %19.16f)\n", tvol->
GetName(), point[0],
694 point[1], point[2], dir[0], dir[1], dir[2]);
698 printf(
"=== volume %s contains point\n", tvol->
GetName());
703 printf(
"=== volume %s does not contain point\n", tvol->
GetName());
704 printf(
"=== distance to path: %g\n",
fStep);
708 newpt[0] = point[0] +
fStep * dir[0];
709 newpt[1] = point[1] +
fStep * dir[1];
710 newpt[2] = point[2] +
fStep * dir[2];
711 printf(
"=== Propagated point: (%19.16f, %19.16f, %19.16f)", newpt[0], newpt[1], newpt[2]);
718 printf(
"=== local to %s: (%19.16f, %19.16f, %19.16f, %19.16f, %19.16f, %19.16f)\n", tvol->
GetName(),
719 point[0], point[1], point[2], dir[0], dir[1], dir[2]);
721 printf(
"=== volume %s contains point\n", tvol->
GetName());
723 printf(
"=== volume %s does not contain point\n", tvol->
GetName());
743 while (indnext >= 0) {
747 indnext =
fNextNode->GetVolume()->GetNextNodeIndex();
757 printf(
" -> from local=(%19.16f, %19.16f, %19.16f)\n", point[0], point[1], point[2]);
758 printf(
" ldir =(%19.16f, %19.16f, %19.16f)\n", dir[0], dir[1], dir[2]);
776 Int_t idaughter = -1;
813 for (
Int_t i = 0; i < novlps; i++) {
814 current = mother->
GetNode(ovlps[i]);
856 while (indnext >= 0) {
859 indnext =
fCurrentNode->GetVolume()->GetNextNodeIndex();
905 Fatal(
"FindNextBoundary",
"Cannot find mother node");
919 nmany -= imother - up;
925 if (ovlp || nextovlp) {
928 Fatal(
"FindNextBoundary",
"Cannot find mother matrix");
953 currentnode = mothernode;
973 while (nextindex >= 0) {
975 nextindex =
fNextNode->GetVolume()->GetNextNodeIndex();
1014 if ((index - 1) >= ifirst)
1018 if ((index + 1) <= ilast)
1024 current = vol->
GetNode(ifirst);
1038 nodefound = current;
1042 if (ilast == ifirst)
1045 current = vol->
GetNode(ilast);
1059 nodefound = current;
1069 printf(
" Checking distance to %d daughters...\n", nd);
1070 if (nd < 5 || !voxels) {
1071 for (i = 0; i < nd; i++) {
1086 printf(
" -> from local=(%19.16f, %19.16f, %19.16f)\n", lpoint[0], lpoint[1], lpoint[2]);
1087 printf(
" ldir =(%19.16f, %19.16f, %19.16f)\n", ldir[0], ldir[1], ldir[2]);
1088 printf(
" -> to: %s shape %s snext=%g\n", current->
GetName(),
1102 while (indnext >= 0) {
1107 nodefound = current;
1118 Int_t sumchecked = 0;
1119 Int_t *vlist =
nullptr;
1122 while ((sumchecked < nd) && (vlist = voxels->
GetNextVoxel(point, dir, ncheck, info))) {
1123 for (i = 0; i < ncheck; i++) {
1124 current = vol->
GetNode(vlist[i]);
1138 printf(
" -> from local=(%19.16f, %19.16f, %19.16f)\n", lpoint[0], lpoint[1], lpoint[2]);
1139 printf(
" ldir =(%19.16f, %19.16f, %19.16f)\n", ldir[0], ldir[1], ldir[2]);
1140 printf(
" -> to: %s shape %s snext=%g\n", current->
GetName(),
1153 idaughter = vlist[i];
1154 while (indnext >= 0) {
1159 nodefound = current;
1219 printf(
"TGeoManager::FindNextBAndStep: point=(%19.16f, %19.16f, %19.16f)\n",
fPoint[0],
fPoint[1],
fPoint[2]);
1222 printf(
" pstep=%9.6g path=%s\n", stepmax,
GetPath());
1235 fStep = snext + extra;
1239 nextindex =
fNextNode->GetVolume()->GetNextNodeIndex();
1240 while (nextindex >= 0) {
1243 nextindex =
fNextNode->GetVolume()->GetNextNodeIndex();
1270 Int_t icrossed = -2;
1276 printf(
" -> from local=(%19.16f, %19.16f, %19.16f)\n", point[0], point[1], point[2]);
1277 printf(
" ldir =(%19.16f, %19.16f, %19.16f)\n", dir[0], dir[1], dir[2]);
1297 if (!
fLevel && !is_assembly) {
1318 Int_t idaughter = -1;
1322 icrossed = idaughter;
1358 for (
Int_t i = 0; i < novlps; i++) {
1359 current = mother->
GetNode(ovlps[i]);
1372 icrossed = ovlps[i];
1388 icrossed = idaughter;
1406 icrossed = ovlps[i];
1439 nmany -= imother - up;
1445 if (ovlp || nextovlp) {
1469 currentnode = mothernode;
1492 nextindex =
fCurrentNode->GetVolume()->GetNextNodeIndex();
1493 while (nextindex >= 0) {
1496 nextindex =
fCurrentNode->GetVolume()->GetNextNodeIndex();
1505 if (icrossed == -2) {
1511 if (icrossed == -1) {
1515 if (!
fLevel && !is_assembly) {
1529 nextindex =
fCurrentNode->GetVolume()->GetNextNodeIndex();
1530 while (nextindex >= 0) {
1533 nextindex =
fCurrentNode->GetVolume()->GetNextNodeIndex();
1553 if (found != last) {
1579 if (found != last) {
1601 fNextNode->GetVolume()->GetShape()->ComputeNormal(local, ldir, lnorm);
1658 return fGeometry->GetParallelWorld()->Safety(cpoint, saf_max);
1668 auto pw =
fGeometry->GetParallelWorld();
1669 const auto newsafety = pw->Safety(cpoint );
1700 const bool have_PW =
fGeometry->IsParallelWorldNav();
1764 if (ilast == ifirst)
1784 for (
id = 0;
id < nd;
id++) {
1807 for (
id = 0;
id < nd;
id++) {
1820 dxyz += dxyz0 * dxyz0;
1822 dxyz += dxyz1 * dxyz1;
1824 dxyz += dxyz2 * dxyz2;
1863 if (safe < fSafety && safe >= 0)
1868 for (io = 0; io < novlp; io++) {
1869 nodeovlp = vol->
GetNode(ovlp[io]);
1879 if (safe < fSafety && safe >= 0)
1901 if (crtovlp || nextovlp) {
1932 while (crtindex >= 0) {
1935 crtindex =
fCurrentNode->GetVolume()->GetCurrentNodeIndex();
1956 inside_current =
kTRUE;
1958 if (!inside_current) {
1960 inside_current = vol->
Contains(point);
1966 if (!inside_current) {
1981 if (!inside_current && downwards) {
1984 inside_current =
kTRUE;
1986 inside_current = vol->
Contains(point);
1987 if (!inside_current) {
1996 printf(
"Search node local=(%19.16f, %19.16f, %19.16f) -> %s\n", point[0], point[1], point[2],
2010 while (crtindex >= 0 && downwards) {
2040 if (node && node != skipnode) {
2055 Int_t *check_list =
nullptr;
2078 for (
id = 0;
id < ncheck;
id++) {
2079 node = vol->
GetNode(check_list[
id]);
2080 if (node == skipnode)
2126 for (
id = 0;
id < nd;
id++) {
2128 if (node == skipnode)
2171 Int_t found_virtual = 0;
2175 for (i = 0; i < nc; i++) {
2189 if (found_virtual > deepest_virtual) {
2192 if (found_virtual == deepest_virtual) {
2196 if ((
fLevel == deepest) && (clnode == priority))
2205 if (i == (nc - 1)) {
2221 deepest_virtual = found_virtual;
2230 deepest_virtual = found_virtual;
2257 result[ntotal++] = check_list[
start];
2260 Int_t jst = 0, i, j;
2261 while ((jst < novlps) && (ovlps[jst] <= check_list[
start]))
2265 for (i =
start; i < ncheck; i++) {
2266 for (j = jst; j < novlps; j++) {
2267 if (check_list[i] == ovlps[j]) {
2274 result[ntotal++] = check_list[i];
2300 epsil = (cross) ? 1E-6 : -1E-6;
2306 for (
Int_t i = 0; i < 3; i++)
2335 Int_t new_media = 0;
2337 Int_t virtual_level = 1;
2340 while ((mother =
GetMother(virtual_level))) {
2343 new_media = (mother->
GetMedium() == medium) ? 0 : virtual_level;
2347 new_media = (mother->
GetMedium() == medium) ? 0 : virtual_level;
2350 return (new_media == 0) ? virtual_level : (new_media - 1);
2384 if (ovlp || nextovlp) {
2412 while (overlapping && level) {
2426 Info(
"InspectState",
"Current path is: %s",
GetPath());
2429 Bool_t is_offset, is_overlapping;
2430 for (level = 0; level <
fLevel + 1; level++) {
2436 Info(
"InspectState",
"level %i: %s div=%i many=%i", level, node->
GetName(), is_offset, is_overlapping);
2452 Double_t dsq = dx * dx + dy * dy + dz * dz;
2517 while (crtindex >= 0) {
2520 crtindex =
fCurrentNode->GetVolume()->GetCurrentNodeIndex();
2545 Int_t *check_list =
nullptr;
2556 for (
Int_t id = 0;
id < ncheck;
id++) {
2560 if (
fCurrentNode->GetVolume()->GetShape()->Contains(local1)) {
2583 if (
fCurrentNode->GetVolume()->GetShape()->Contains(local1)) {
2624 if (safe < proposed)
2685 return fCache->GetPath();
int Int_t
Signed integer 4 bytes (int).
bool Bool_t
Boolean (0=false, 1=true) (bool).
double Double_t
Double 8 bytes.
externTGeoIdentity * gGeoIdentity
const char * kGeoOutsidePath
static Double_t gTolerance
virtual void SetOwner(Bool_t enable=kTRUE)
Set whether this collection is the owner (enable==true) of its content.
Class storing the state of the cache at a given moment.
Matrix class used for computing global transformations Should NOT be used for node definition.
The manager class for any TGeo geometry.
static Int_t GetVerboseLevel()
Set verbosity level (static function).
static Int_t ThreadId()
Translates the current thread id to an ordinal number.
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
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
Media are used to store properties related to tracking and which are useful only when using geometry ...
TGeoNavigator * AddNavigator()
Add a new navigator to the array.
TGeoManager * fGeoManager
TGeoNavigator * SetCurrentNavigator(Int_t inav)
Class providing navigation API for TGeo geometries.
void CdUp()
Go one level up in geometry.
void DoBackupState()
Backup the current state without affecting the cache stack.
TGeoNode * GetMother(Int_t up=1) const
Double_t fLastPWSaftyPnt[3]
! last point for which parallel world safety was "evaluated"
void DoRestoreState()
Restore a backed-up state without affecting the cache stack.
Double_t fPoint[3]
! current point
Bool_t fSearchOverlaps
! flag set when an overlapping cluster is searched
Bool_t fIsExiting
! flag that current track is about to leave current node
TString fPath
! path to current node
TGeoHMatrix * fDivMatrix
! current local matrix of the selected division cell
TGeoNode * CrossBoundaryAndLocate(Bool_t downwards, TGeoNode *skipnode)
Cross next boundary and locate within current node The current point must be on the boundary of fCurr...
Double_t fLastPWSafety
! last safety returned from parallel world (negative if invalid)
TGeoHMatrix * GetHMatrix()
Return stored current matrix (global matrix of the next touched node).
TGeoNodeCache * fCache
! cache of states
Bool_t fStartSafe
! flag a safe start for point classification
void CdNext()
Do a cd to the node found next by FindNextBoundary.
Double_t Safety(Bool_t inside=kFALSE)
Compute safe distance from the current point.
Bool_t GotoSafeLevel()
Go upwards the tree until a non-overlapping node.
Double_t fNormal[3]
! cosine of incident angle on current checked surface
Bool_t cd(const char *path="")
Browse the tree of nodes starting from top node according to pathname.
Double_t fLastPoint[3]
! last point for which safety was computed
Bool_t IsSameLocation() const
Double_t fCldir[3]
! unit vector to current closest shape
Bool_t fIsStepEntering
! flag that next geometric step will enter new volume
Int_t GetVirtualLevel()
Find level of virtuality of current overlapping node (number of levels up having the same tracking me...
Int_t fOverlapSize
! current size of fOverlapClusters
TGeoNode * InitTrack(const Double_t *point, const Double_t *dir)
Initialize current point and current direction vector (normalized) in MARS.
void InspectState() const
Inspects path and all flags for the current state.
Int_t PushPoint(Int_t startlevel=0)
TGeoNode * Step(Bool_t is_geom=kTRUE, Bool_t cross=kTRUE)
Make a rectiliniar step of length fStep from current point (fPoint) on current direction (fDirection)...
TGeoNode * FindInCluster(Int_t *cluster, Int_t nc)
Find a node inside a cluster of overlapping nodes.
Double_t fStep
! step to be done from current point and direction
void SafetyOverlaps()
Compute safe distance from the current point within an overlapping node.
TGeoNode * CrossDivisionCell()
Cross a division cell.
void ResetState()
Reset current state flags.
static Bool_t IsPWSafetyCaching()
TGeoNode * FindNextDaughterBoundary(Double_t *point, Double_t *dir, Int_t &idaughter, Bool_t compmatrix=kFALSE)
Computes as fStep the distance to next daughter of the current volume.
Bool_t fIsSameLocation
! flag that a new point is in the same node as previous
void GetBranchNumbers(Int_t *copyNumbers, Int_t *volumeNumbers) const
Fill node copy numbers of current branch into an array.
Bool_t CheckPath(const char *path) const
Check if a geometry path is valid without changing the state of the navigator.
TGeoHMatrix * GetMotherMatrix(Int_t up=1) const
TGeoVolume * fCurrentVolume
! current volume
TGeoNode * fLastNode
! last searched node
Int_t fThreadId
! thread id for this navigator
Double_t GetPWSafetyEstimateFromCache(Double_t cpoint[3]) const
Double_t fDirection[3]
! current direction
void PopDummy(Int_t ipop=9999)
Int_t GetTouchedCluster(Int_t start, Double_t *point, Int_t *check_list, Int_t ncheck, Int_t *result)
Make the cluster of overlapping nodes in a voxel, containing point in reference of the mother.
TGeoNode * FindNextBoundary(Double_t stepmax=TGeoShape::Big(), const char *path="", Bool_t frombdr=kFALSE)
Find distance to next boundary and store it in fStep.
TGeoNode * FindNode(Bool_t safe_start=kTRUE)
Returns deepest node containing current point.
Int_t fOverlapMark
! current recursive position in fOverlapClusters
TGeoNode * FindNextBoundaryAndStep(Double_t stepmax=TGeoShape::Big(), Bool_t compsafe=kFALSE)
Compute distance to next boundary within STEPMAX.
void CdTop()
Make top level node the current node.
Int_t fNmany
! number of overlapping nodes on current branch
TGeoManager * fGeometry
! current geometry
TGeoHMatrix * fGlobalMatrix
! current pointer to cached global matrix
void MasterToTop(const Double_t *master, Double_t *top) const
Convert coordinates from master volume frame to top.
Int_t GetCurrentNodeId() const
Double_t * FindNormalFast()
Computes fast normal to next crossed boundary, assuming that the current point is close enough to the...
Int_t PushPath(Int_t startlevel=0)
Bool_t fIsStepExiting
! flag that next geometric step will exit current volume
Bool_t fIsOnBoundary
! flag that current point is on some boundary
static Bool_t fgUsePWSafetyCaching
! global mode is caching enabled for parallel world safety calls
void GetBranchOnlys(Int_t *isonly) const
Fill node copy numbers of current branch into an array.
void TopToMaster(const Double_t *top, Double_t *master) const
Convert coordinates from top volume frame to master.
void SetCurrentPoint(const Double_t *point)
TGeoHMatrix * fCurrentMatrix
! current stored global matrix
Int_t * fOverlapClusters
! internal array for overlaps
TGeoNode * fTopNode
! top physical node
Bool_t IsSafeStep(Double_t proposed, Double_t &newsafety) const
In case a previous safety value was computed, check if the safety region is still safe for the curren...
TGeoNode * SearchNode(Bool_t downwards=kFALSE, const TGeoNode *skipnode=nullptr)
Returns the deepest node containing fPoint, which must be set a priori.
Double_t fLastSafety
! last computed safety radius
~TGeoNavigator() override
Destructor.
TGeoNavigator()
Constructor.
void SetCurrentDirection(const Double_t *dir)
void BuildCache(Bool_t dummy=kFALSE, Bool_t nodeid=kFALSE)
Builds the cache for physical nodes and global matrices.
Int_t fNextDaughterIndex
! next daughter index after FindNextBoundary
Bool_t fIsNullStep
! flag that last geometric step was null
void CdNode(Int_t nodeid)
Change current path to point to the node having this id.
TGeoNode * fNextNode
! next node that will be crossed
Double_t fCldirChecked[3]
! unit vector to current checked shape
Int_t fLevel
! current geometry level;
Double_t GetPWSafety(Double_t cpoint[3], Double_t saf_max)
Wrapper for getting the safety from the parallel world.
void ResetAll()
Reset the navigator.
TGeoCacheState * fBackupState
! backup state
Bool_t IsSamePoint(Double_t x, Double_t y, Double_t z) const
Check if a new point with given coordinates is the same as the last located one.
Bool_t fCurrentOverlapping
! flags the type of the current node
Bool_t fIsOutside
! flag that current point is outside geometry
void CdDown(Int_t index)
Make a daughter of current node current.
Bool_t fIsEntering
! flag if current step just got into a new node
TGeoNode * fForcedNode
! current point is supposed to be inside this node
const char * GetPath() const
Get path to the current node in the form /node0/node1/...
Int_t GetSafeLevel() const
Go upwards the tree until a non-overlapping node.
TGeoNode * fCurrentNode
! current node
Double_t fSafety
! safety radius from current point
Double_t * FindNormal(Bool_t forward=kTRUE)
Computes normal vector to the next surface that will be or was already crossed when propagating on a ...
void GetBranchNames(Int_t *names) const
Fill volume names of current branch into an array.
Special pool of reusable nodes.
A node represent a volume positioned inside another.They store links to both volumes and to the TGeoM...
TGeoMedium * GetMedium() const
Bool_t IsOverlapping() const
TGeoVolume * GetVolume() const
TGeoNode * GetDaughter(Int_t ind) const
virtual TGeoMatrix * GetMatrix() const =0
Int_t * GetOverlaps(Int_t &novlp) const
virtual void MasterToLocal(const Double_t *master, Double_t *local) const
Convert the point coordinates from mother reference to local reference system.
virtual Int_t GetIndex() const
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
base finder class for patterns. A pattern is specifying a division type
virtual TGeoNode * CdNext()
Make next node (if any) current.
virtual TGeoNode * FindNode(Double_t *, const Double_t *=nullptr)
virtual Bool_t IsOnBoundary(const Double_t *) const
Int_t GetNext() const
Get index of next division.
Physical nodes are the actual 'touchable' objects in the geometry, representing a path of positioned ...
TGeoNode * GetNode(Int_t level=-1) const
Return node in branch at LEVEL. If not specified, return last leaf.
virtual 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 =0
virtual Double_t Safety(const Double_t *point, Bool_t in=kTRUE) 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
virtual Bool_t Contains(const Double_t *point) const =0
static Double_t Tolerance()
TGeoVolume, TGeoVolumeMulti, TGeoVolumeAssembly are the volume classes.
virtual Int_t GetNextNodeIndex() const
Bool_t IsActiveDaughters() const
Bool_t Contains(const Double_t *point) const
Int_t GetNdaughters() const
void FindOverlaps() const
loop all nodes marked as overlaps and find overlapping brothers
TGeoNode * GetNode(const char *name) const
get the pointer to a daughter node
Int_t GetIndex(const TGeoNode *node) const
get index number for a given daughter
TGeoPatternFinder * GetFinder() const
TGeoVoxelFinder * GetVoxels() const
Getter for optimization structure.
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.
void InspectShape() const
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")...
virtual void Voxelize(Option_t *option="")
Voxelize attached volume according to option If the volume is an assembly, make sure the bbox is comp...
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.
Bool_t NeedRebuild() const
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.
Int_t GetEntriesFast() const
TObject * UncheckedAt(Int_t i) const
void Add(TObject *obj) override
virtual const char * ClassName() const
Returns name of class to which the object belongs.
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.
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
Double_t Sqrt(Double_t x)
Returns the square root of x.
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.