#ifndef ROOT_TGeoChecker
#define ROOT_TGeoChecker
#ifndef ROOT_TObject
#include "TObject.h"
#endif
class TTree;
class TGeoShape;
class TGeoVolume;
class TGeoVoxelFinder;
class TGeoNode;
class TGeoManager;
class TGeoMatrix;
class TGeoOverlap;
class TBuffer3D;
class TH2F;
class TStopwatch;
class TGeoChecker : public TObject
{
private :
TGeoManager *fGeoManager;
TGeoVolume *fVsafe;
TBuffer3D *fBuff1;
TBuffer3D *fBuff2;
Bool_t fFullCheck;
Double_t *fVal1;
Double_t *fVal2;
Bool_t *fFlags;
TStopwatch *fTimer;
TGeoNode *fSelectedNode;
Int_t fNchecks;
Int_t fNmeshPoints;
void CleanPoints(Double_t *points, Int_t &numPoints) const;
Int_t NChecksPerVolume(TGeoVolume *vol);
Int_t PropagateInGeom(Double_t *, Double_t *);
void Score(TGeoVolume *, Int_t, Double_t);
Double_t TimingPerVolume(TGeoVolume *);
public:
TGeoChecker();
TGeoChecker(TGeoManager *geom);
virtual ~TGeoChecker();
virtual void CheckBoundaryErrors(Int_t ntracks=1000000, Double_t radius=-1.);
virtual void CheckBoundaryReference(Int_t icheck=-1);
void CheckGeometryFull(Bool_t checkoverlaps=kTRUE, Bool_t checkcrossings=kTRUE, Int_t nrays=10000, const Double_t *vertex=NULL);
void CheckGeometry(Int_t nrays, Double_t startx, Double_t starty, Double_t startz) const;
void CheckOverlaps(const TGeoVolume *vol, Double_t ovlp=0.1, Option_t *option="");
void CheckOverlapsBySampling(TGeoVolume *vol, Double_t ovlp=0.1, Int_t npoints=1000000) const;
void CheckPoint(Double_t x=0, Double_t y=0, Double_t z=0, Option_t *option="");
void CheckShape(TGeoShape *shape, Int_t testNo, Int_t nsamples, Option_t *option);
Double_t CheckVoxels(TGeoVolume *vol, TGeoVoxelFinder *voxels, Double_t *xyz, Int_t npoints);
TH2F *LegoPlot(Int_t ntheta=60, Double_t themin=0., Double_t themax=180.,
Int_t nphi=90, Double_t phimin=0., Double_t phimax=360.,
Double_t rmin=0., Double_t rmax=9999999, Option_t *option="");
void PrintOverlaps() const;
void RandomPoints(TGeoVolume *vol, Int_t npoints, Option_t *option);
void RandomRays(Int_t nrays, Double_t startx, Double_t starty, Double_t startz, const char *target_vol=0, Bool_t check_norm=kFALSE);
TGeoOverlap *MakeCheckOverlap(const char *name, TGeoVolume *vol1, TGeoVolume *vol2, TGeoMatrix *mat1, TGeoMatrix *mat2, Bool_t isovlp, Double_t ovlp);
void OpProgress(const char *opname, Long64_t current, Long64_t size, TStopwatch *watch=0, Bool_t last=kFALSE, Bool_t refresh=kFALSE, const char *msg="");
TGeoNode *SamplePoints(Int_t npoints, Double_t &dist, Double_t epsil, const char* g3path);
void ShapeDistances(TGeoShape *shape, Int_t nsamples, Option_t *option);
void ShapeSafety(TGeoShape *shape, Int_t nsamples, Option_t *option);
void ShapeNormal(TGeoShape *shape, Int_t nsamples, Option_t *option);
Double_t *ShootRay(Double_t *start, Double_t dirx, Double_t diry, Double_t dirz, Double_t *array, Int_t &nelem, Int_t &dim, Double_t *enpoint=0) const;
void SetSelectedNode(TGeoNode *node) {fSelectedNode=node;}
void SetNmeshPoints(Int_t npoints=1000);
void Test(Int_t npoints, Option_t *option);
void TestOverlaps(const char *path);
Bool_t TestVoxels(TGeoVolume *vol, Int_t npoints=1000000);
Double_t Weight(Double_t precision=0.01, Option_t *option="v");
ClassDef(TGeoChecker, 2)
};
#endif