Logo ROOT  
Reference Guide
TGeoPainter.h
Go to the documentation of this file.
1// Author: Andrei Gheata 05/03/02
2
3/*************************************************************************
4 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. *
5 * All rights reserved. *
6 * *
7 * For the licensing terms see $ROOTSYS/LICENSE. *
8 * For the list of contributors see $ROOTSYS/README/CREDITS. *
9 *************************************************************************/
10#ifndef ROOT_TGeoPainter
11#define ROOT_TGeoPainter
12
13//////////////////////////////////////////////////////////////////////////
14// //
15// TGeoPainter //
16// //
17// Painter class utility TGeo geometries. Interfaces visualization //
18// queries with the viewers. //
19// //
20//////////////////////////////////////////////////////////////////////////
21
22
23#include "TVirtualGeoPainter.h"
24
25#include "TGeoManager.h"
26
27class TString;
28class TGeoHMatrix;
29class TGeoNode;
30class TGeoVolume;
31class TGeoShape;
34class TGeoChecker;
35class TGeoOverlap;
36class TH2F;
37class TGeoBatemanSol;
38class TGeoPolygon;
39
41private:
42 Double_t fBombX; // bomb factor on X
43 Double_t fBombY; // bomb factor on Y
44 Double_t fBombZ; // bomb factor on Z
45 Double_t fBombR; // bomb factor on radius (cyl or sph)
46 Double_t fCheckedBox[6]; // bounding box of checked node
47 Double_t fMat[9]; // view rotation matrix
48 Int_t fNsegments; // number of segments approximating circles
49 Int_t fNVisNodes; // number of visible nodes
50 Int_t fVisLevel; // depth for drawing
51 Int_t fVisOption; // global visualization option
52 Int_t fExplodedView; // type of exploding current view
53 Bool_t fVisLock; // lock for adding visible volumes
54 Bool_t fTopVisible; // set top volume visible
55 Bool_t fPaintingOverlaps; // lock overlaps painting
56 Bool_t fIsRaytracing; // raytracing flag
57 Bool_t fIsPaintingShape; // flag for shape painting
58 TString fVisBranch; // drawn branch
59 TString fVolInfo; // volume info
60 TGeoNode *fCheckedNode; // checked node
61 TGeoOverlap *fOverlap; // current overlap
62 TGeoHMatrix *fGlobal; // current global matrix
63 TBuffer3D *fBuffer; // buffer used for painting
64 TGeoManager *fGeoManager; // geometry to which applies
65 TGeoChecker *fChecker; // geometry checker
66 TGeoShape *fClippingShape; // clipping shape
67 TGeoVolume *fTopVolume; // top drawn volume
68 TGeoVolume *fLastVolume; // last drawn volume
69 TGeoIteratorPlugin *fPlugin; // User iterator plugin for changing pain volume properties
70 TObjArray *fVisVolumes; // list of visible volumes
71 Bool_t fIsEditable; // flag that geometry is editable
72
73 void DefineColors() const;
74 void LocalToMasterVect(const Double_t *local, Double_t *master) const;
75
76protected:
78
79public:
80 TGeoPainter(TGeoManager *manager);
81 virtual ~TGeoPainter();
82
83 void AddSize3D(Int_t numpoints, Int_t numsegs, Int_t numpolys) override;
84 TVirtualGeoTrack *AddTrack(Int_t id, Int_t pdgcode, TObject *part) override;
85 void AddTrackPoint(Double_t *point, Double_t *box, Bool_t reset=kFALSE) override;
86 void BombTranslation(const Double_t *tr, Double_t *bombtr) override;
87 void CheckBoundaryErrors(Int_t ntracks=1000000, Double_t radius=-1.) override;
88 void CheckBoundaryReference(Int_t icheck=-1) override;
89 void CheckGeometryFull(Bool_t checkoverlaps=kTRUE, Bool_t checkcrossings=kTRUE, Int_t nrays=10000, const Double_t *vertex=nullptr) override;
90 void CheckGeometry(Int_t nrays, Double_t startx, Double_t starty, Double_t startz) const override;
91 void CheckEdit();
92 void CheckPoint(Double_t x=0, Double_t y=0, Double_t z=0, Option_t *option="") override;
93 void CheckShape(TGeoShape *shape, Int_t testNo, Int_t nsamples, Option_t *option) override;
94 void CheckOverlaps(const TGeoVolume *vol, Double_t ovlp=0.1, Option_t *option="") const override;
95 Int_t CountNodes(TGeoVolume *vol, Int_t level) const;
96 Int_t CountVisibleNodes() override;
97 void DefaultAngles() override;
98 void DefaultColors() override;
99 Int_t DistanceToPrimitiveVol(TGeoVolume *vol, Int_t px, Int_t py) override;
100 void Draw(Option_t *option="") override;
101 void DrawBatemanSol(TGeoBatemanSol *sol, Option_t *option="") override;
102 void DrawOverlap(void *ovlp, Option_t *option="") override;
103 void DrawCurrentPoint(Int_t color) override;
104 void DrawOnly(Option_t *option="") override;
105 void DrawPanel() override;
106 void DrawPath(const char *path, Option_t *option="") override;
107 void DrawPolygon(const TGeoPolygon *poly) override;
108 void DrawShape(TGeoShape *shape, Option_t *option="") override;
109 void DrawVolume(TGeoVolume *vol, Option_t *option="") override;
110 void EditGeometry(Option_t *option="") override;
111 void EstimateCameraMove(Double_t tmin, Double_t tmax, Double_t *start, Double_t *end) override;
112 void ExecuteManagerEvent(TGeoManager *geom, Int_t event, Int_t px, Int_t py) override;
113 void ExecuteShapeEvent(TGeoShape *shape, Int_t event, Int_t px, Int_t py) override;
114 void ExecuteVolumeEvent(TGeoVolume *volume, Int_t event, Int_t px, Int_t py) override;
115 const char *GetVolumeInfo(const TGeoVolume *volume, Int_t px, Int_t py) const override;
116 void GetBombFactors(Double_t &bombx, Double_t &bomby, Double_t &bombz, Double_t &bombr) const override
117 {bombx=fBombX; bomby=fBombY; bombz=fBombZ; bombr=fBombR;}
118 Int_t GetBombMode() const override {return fExplodedView;}
121 Int_t GetColor(Int_t base, Float_t light) const override;
122 const char *GetDrawPath() const override {return fVisBranch.Data();}
123 TGeoVolume *GetDrawnVolume() const override;
124 TGeoVolume *GetTopVolume() const override {return fTopVolume;}
125 Int_t GetVisLevel() const override {return fVisLevel;}
126 Int_t GetVisOption() const override {return fVisOption;}
127 Int_t GetNsegments() const override {return fNsegments;}
128 void GrabFocus(Int_t nfr=0, Double_t dlong=0, Double_t dlat=0, Double_t dpsi=0) override;
129 Double_t *GetViewBox() override {return &fCheckedBox[0];}
130 void GetViewAngles(Double_t &longitude, Double_t &latitude, Double_t &psi) override;
132 Bool_t IsRaytracing() const override {return fIsRaytracing;}
133 Bool_t IsPaintingShape() const override {return fIsPaintingShape;}
134 TH2F *LegoPlot(Int_t ntheta=60, Double_t themin=0., Double_t themax=180.,
135 Int_t nphi=90, Double_t phimin=0., Double_t phimax=360.,
136 Double_t rmin=0., Double_t rmax=9999999, Option_t *option="") override;
137 void Lock(Bool_t flag = kTRUE) { fVisLock = flag; }
138 void ModifiedPad(Bool_t update=kFALSE) const override;
139 void OpProgress(const char *opname, Long64_t current, Long64_t size, TStopwatch *watch=nullptr, Bool_t last=kFALSE, Bool_t refresh=kFALSE, const char *msg="") override;
140 void Paint(Option_t *option="") override;
141 void PaintNode(TGeoNode *node, Option_t *option="", TGeoMatrix *global=nullptr) override;
142 Bool_t PaintShape(const TGeoShape & shape, Option_t * option) const;
143 void PaintShape(TGeoShape *shape, Option_t *option="") override;
144 void PaintOverlap(void *ovlp, Option_t *option="") override;
145 void PaintVolume(TGeoVolume *vol, Option_t *option="", TGeoMatrix *global=nullptr) override;
146 void PrintOverlaps() const override;
147 void PaintPhysicalNode(TGeoPhysicalNode *node, Option_t *option="");
148 void RandomPoints(const TGeoVolume *vol, Int_t npoints, Option_t *option="") override;
149 void RandomRays(Int_t nrays, Double_t startx, Double_t starty, Double_t startz, const char *target_vol = nullptr, Bool_t check_norm = kFALSE) override;
150 void Raytrace(Option_t *option="") override;
151 TGeoNode *SamplePoints(Int_t npoints, Double_t &dist, Double_t epsil, const char* g3path) override;
152 void SetBombFactors(Double_t bombx=1.3, Double_t bomby=1.3, Double_t bombz=1.3, Double_t bombr=1.3) override;
153 void SetClippingShape(TGeoShape *shape) override {fClippingShape = shape;}
154 void SetExplodedView(Int_t iopt=0) override;
155 void SetNsegments(Int_t nseg=20) override;
156 void SetNmeshPoints(Int_t npoints) override;
157 void SetGeoManager(TGeoManager *geom) override {fGeoManager=geom;}
158 void SetIteratorPlugin(TGeoIteratorPlugin *plugin) override {fPlugin = plugin; ModifiedPad();}
159 void SetCheckedNode(TGeoNode *node) override;
160 void SetRaytracing(Bool_t flag=kTRUE) override {fIsRaytracing = flag;}
161 void SetTopVisible(Bool_t vis=kTRUE) override;
162 void SetTopVolume(TGeoVolume *vol) override {fTopVolume = vol;}
163 void SetVisLevel(Int_t level=3) override;
164 void SetVisOption(Int_t option=0) override;
165 Int_t ShapeDistancetoPrimitive(const TGeoShape *shape, Int_t numpoints, Int_t px, Int_t py) const override;
166 void Test(Int_t npoints, Option_t *option) override;
167 void TestOverlaps(const char *path) override;
168 Bool_t TestVoxels(TGeoVolume *vol) override;
169 void UnbombTranslation(const Double_t *tr, Double_t *bombtr) override;
170 Double_t Weight(Double_t precision, Option_t *option="v") override;
171
172 ClassDefOverride(TGeoPainter,0) //geometry painter
173};
174
175#endif
static void update(gsl_integration_workspace *workspace, double a1, double b1, double area1, double error1, double a2, double b2, double area2, double error2)
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
int Int_t
Definition: RtypesCore.h:45
const Bool_t kFALSE
Definition: RtypesCore.h:101
bool Bool_t
Definition: RtypesCore.h:63
double Double_t
Definition: RtypesCore.h:59
long long Long64_t
Definition: RtypesCore.h:80
float Float_t
Definition: RtypesCore.h:57
const Bool_t kTRUE
Definition: RtypesCore.h:100
const char Option_t
Definition: RtypesCore.h:66
#define ClassDefOverride(name, id)
Definition: Rtypes.h:329
Generic 3D primitive description class.
Definition: TBuffer3D.h:18
Geometry checking package.
Definition: TGeoChecker.h:38
Matrix class used for computing global transformations Should NOT be used for node definition.
Definition: TGeoMatrix.h:421
The manager class for any TGeo geometry.
Definition: TGeoManager.h:45
Geometrical transformation package.
Definition: TGeoMatrix.h:41
A node represent a volume positioned inside another.They store links to both volumes and to the TGeoM...
Definition: TGeoNode.h:41
Base class describing geometry overlaps.
Definition: TGeoOverlap.h:41
Class implementing all draw interfaces for a generic 3D viewer using TBuffer3D mechanism.
Definition: TGeoPainter.h:40
TVirtualGeoTrack * AddTrack(Int_t id, Int_t pdgcode, TObject *part) override
Create a primary TGeoTrack.
void PaintOverlap(void *ovlp, Option_t *option="") override
Paint an overlap.
Double_t fBombZ
Definition: TGeoPainter.h:44
void EstimateCameraMove(Double_t tmin, Double_t tmax, Double_t *start, Double_t *end) override
Estimate camera movement between tmin and tmax for best track display.
TObjArray * fVisVolumes
Definition: TGeoPainter.h:70
TGeoIteratorPlugin * fPlugin
Definition: TGeoPainter.h:69
Double_t fMat[9]
Definition: TGeoPainter.h:47
TGeoNode * SamplePoints(Int_t npoints, Double_t &dist, Double_t epsil, const char *g3path) override
Shoot npoints randomly in a box of 1E-5 around current point.
const char * GetDrawPath() const override
Definition: TGeoPainter.h:122
void PrintOverlaps() const override
Print overlaps (see TGeoChecker::PrintOverlaps())
Int_t GetBombMode() const override
Definition: TGeoPainter.h:118
TBuffer3D * fBuffer
Definition: TGeoPainter.h:63
void RandomRays(Int_t nrays, Double_t startx, Double_t starty, Double_t startz, const char *target_vol=nullptr, Bool_t check_norm=kFALSE) override
Shoot nrays in the current drawn geometry.
void BombTranslation(const Double_t *tr, Double_t *bombtr) override
Get the new 'bombed' translation vector according current exploded view mode.
Int_t GetNsegments() const override
Definition: TGeoPainter.h:127
void Paint(Option_t *option="") override
Paint current geometry according to option.
void EditGeometry(Option_t *option="") override
Start the geometry editor.
void GetViewAngles(Double_t &longitude, Double_t &latitude, Double_t &psi) override
Get the current view angles.
void SetGeoManager(TGeoManager *geom) override
Definition: TGeoPainter.h:157
TGeoManager * fGeoManager
Definition: TGeoPainter.h:64
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="") override
Generate a lego plot fot the top volume, according to option.
void Raytrace(Option_t *option="") override
Raytrace current drawn geometry.
TGeoNode * GetCheckedNode()
Definition: TGeoPainter.h:119
Bool_t IsPaintingShape() const override
Definition: TGeoPainter.h:133
TString fVisBranch
Definition: TGeoPainter.h:58
TGeoVolume * fTopVolume
Definition: TGeoPainter.h:67
TGeoChecker * GetChecker()
Create/return geometry checker.
virtual ~TGeoPainter()
Default destructor.
void SetVisOption(Int_t option=0) override
Set drawing mode :
Bool_t IsExplodedView() const override
Definition: TGeoPainter.h:131
Bool_t fIsPaintingShape
Definition: TGeoPainter.h:57
Double_t fBombR
Definition: TGeoPainter.h:45
void TestOverlaps(const char *path) override
Geometry overlap checker based on sampling.
void CheckGeometryFull(Bool_t checkoverlaps=kTRUE, Bool_t checkcrossings=kTRUE, Int_t nrays=10000, const Double_t *vertex=nullptr) override
Geometry checking method (see: TGeoManager::CheckGeometry())
Int_t ShapeDistancetoPrimitive(const TGeoShape *shape, Int_t numpoints, Int_t px, Int_t py) const override
Returns distance between point px,py on the pad an a shape.
void Draw(Option_t *option="") override
Draw method.
Int_t CountVisibleNodes() override
Count total number of visible nodes.
void DefineColors() const
Define 100 colors with increasing light intensities for each basic color (1-7) Register these colors ...
void SetExplodedView(Int_t iopt=0) override
Set type of exploding view.
void ExecuteManagerEvent(TGeoManager *geom, Int_t event, Int_t px, Int_t py) override
Execute mouse actions on a given volume.
void SetTopVolume(TGeoVolume *vol) override
Definition: TGeoPainter.h:162
void SetRaytracing(Bool_t flag=kTRUE) override
Definition: TGeoPainter.h:160
TGeoVolume * fLastVolume
Definition: TGeoPainter.h:68
void SetNmeshPoints(Int_t npoints) override
Set number of points to be generated on the shape outline when checking for overlaps.
Int_t DistanceToPrimitiveVol(TGeoVolume *vol, Int_t px, Int_t py) override
Compute the closest distance of approach from point px,py to a volume.
void UnbombTranslation(const Double_t *tr, Double_t *bombtr) override
Get the new 'unbombed' translation vector according current exploded view mode.
Bool_t fVisLock
Definition: TGeoPainter.h:53
void PaintNode(TGeoNode *node, Option_t *option="", TGeoMatrix *global=nullptr) override
Paint recursively a node and its content according to visualization options.
void DefaultAngles() override
Set default angles for the current view.
TGeoShape * fClippingShape
Definition: TGeoPainter.h:66
Bool_t PaintShape(const TGeoShape &shape, Option_t *option) const
Paint the supplied shape into the current 3D viewer.
Bool_t fIsEditable
Definition: TGeoPainter.h:71
Int_t CountNodes(TGeoVolume *vol, Int_t level) const
Count number of visible nodes down to a given level.
Double_t fCheckedBox[6]
Definition: TGeoPainter.h:46
void DrawShape(TGeoShape *shape, Option_t *option="") override
Draw a shape.
void DrawOnly(Option_t *option="") override
Draw only one volume.
TGeoOverlap * fOverlap
Definition: TGeoPainter.h:61
void CheckGeometry(Int_t nrays, Double_t startx, Double_t starty, Double_t startz) const override
Geometry checking method (see TGeoChecker).
Double_t fBombY
Definition: TGeoPainter.h:43
Bool_t fPaintingOverlaps
Definition: TGeoPainter.h:55
void CheckOverlaps(const TGeoVolume *vol, Double_t ovlp=0.1, Option_t *option="") const override
Check overlaps for the top volume of the geometry, within a limit OVLP.
void SetBombFactors(Double_t bombx=1.3, Double_t bomby=1.3, Double_t bombz=1.3, Double_t bombr=1.3) override
Set cartesian and radial bomb factors for translations.
void DefaultColors() override
Set default volume colors according to tracking media.
void CheckEdit()
Check if Ged library is loaded and load geometry editor classe.
Int_t GetVisLevel() const override
Definition: TGeoPainter.h:125
void CheckBoundaryErrors(Int_t ntracks=1000000, Double_t radius=-1.) override
Check pushes and pulls needed to cross the next boundary with respect to the position given by FindNe...
void ClearVisibleVolumes()
Clear the list of visible volumes reset the kVisOnScreen bit for volumes previously in the list.
Int_t GetColor(Int_t base, Float_t light) const override
Get index of a base color with given light intensity (0,1)
void LocalToMasterVect(const Double_t *local, Double_t *master) const
Convert a local vector according view rotation matrix.
void DrawVolume(TGeoVolume *vol, Option_t *option="") override
Draw method.
TGeoVolume * GetDrawnVolume() const override
Get currently drawn volume.
void DrawPolygon(const TGeoPolygon *poly) override
Draw a polygon in 3D.
Int_t fNsegments
Definition: TGeoPainter.h:48
void Test(Int_t npoints, Option_t *option) override
Check time of finding "Where am I" for n points.
void PaintVolume(TGeoVolume *vol, Option_t *option="", TGeoMatrix *global=nullptr) override
Paint recursively a node and its content according to visualization options.
TString fVolInfo
Definition: TGeoPainter.h:59
void CheckShape(TGeoShape *shape, Int_t testNo, Int_t nsamples, Option_t *option) override
Test for shape navigation methods.
void SetIteratorPlugin(TGeoIteratorPlugin *plugin) override
Definition: TGeoPainter.h:158
void RandomPoints(const TGeoVolume *vol, Int_t npoints, Option_t *option="") override
Draw random points in the bounding box of a volume.
Bool_t fTopVisible
Definition: TGeoPainter.h:54
TGeoVolume * GetTopVolume() const override
Definition: TGeoPainter.h:124
TGeoHMatrix * fGlobal
Definition: TGeoPainter.h:62
void GetBombFactors(Double_t &bombx, Double_t &bomby, Double_t &bombz, Double_t &bombr) const override
Definition: TGeoPainter.h:116
Int_t fVisLevel
Definition: TGeoPainter.h:50
void Lock(Bool_t flag=kTRUE)
Definition: TGeoPainter.h:137
void SetNsegments(Int_t nseg=20) override
Set number of segments to approximate circles.
void CheckBoundaryReference(Int_t icheck=-1) override
Check the boundary errors reference file created by CheckBoundaryErrors method.
void AddTrackPoint(Double_t *point, Double_t *box, Bool_t reset=kFALSE) override
Average center of view of all painted tracklets and compute view box.
void GrabFocus(Int_t nfr=0, Double_t dlong=0, Double_t dlat=0, Double_t dpsi=0) override
Move focus to current volume.
void DrawOverlap(void *ovlp, Option_t *option="") override
Draw an overlap.
void SetVisLevel(Int_t level=3) override
Set default level down to which visualization is performed.
void AddSize3D(Int_t numpoints, Int_t numsegs, Int_t numpolys) override
Add numpoints, numsegs, numpolys to the global 3D size.
TGeoNode * fCheckedNode
Definition: TGeoPainter.h:60
void PaintPhysicalNode(TGeoPhysicalNode *node, Option_t *option="")
Paints a physical node associated with a path.
Int_t fNVisNodes
Definition: TGeoPainter.h:49
Int_t fExplodedView
Definition: TGeoPainter.h:52
const char * GetVolumeInfo(const TGeoVolume *volume, Int_t px, Int_t py) const override
Get some info about the current selected volume.
void SetClippingShape(TGeoShape *shape) override
Definition: TGeoPainter.h:153
void CheckPoint(Double_t x=0, Double_t y=0, Double_t z=0, Option_t *option="") override
Check current point in the geometry.
void DrawCurrentPoint(Int_t color) override
Draw current point in the same view.
void DrawPath(const char *path, Option_t *option="") override
Draw all volumes for a given path.
void OpProgress(const char *opname, Long64_t current, Long64_t size, TStopwatch *watch=nullptr, Bool_t last=kFALSE, Bool_t refresh=kFALSE, const char *msg="") override
Text progress bar.
void SetCheckedNode(TGeoNode *node) override
Select a node to be checked for overlaps.
void DrawBatemanSol(TGeoBatemanSol *sol, Option_t *option="") override
Draw the time evolution of a radionuclide.
TGeoChecker * fChecker
Definition: TGeoPainter.h:65
Bool_t IsRaytracing() const override
Definition: TGeoPainter.h:132
Bool_t fIsRaytracing
Definition: TGeoPainter.h:56
void ExecuteShapeEvent(TGeoShape *shape, Int_t event, Int_t px, Int_t py) override
Execute mouse actions on a given shape.
Double_t * GetViewBox() override
Definition: TGeoPainter.h:129
Double_t Weight(Double_t precision, Option_t *option="v") override
Compute weight [kg] of the current volume.
void ExecuteVolumeEvent(TGeoVolume *volume, Int_t event, Int_t px, Int_t py) override
Execute mouse actions on a given volume.
TGeoPainter(TGeoManager *manager)
Default constructor.
Definition: TGeoPainter.cxx:65
Double_t fBombX
Definition: TGeoPainter.h:42
void ModifiedPad(Bool_t update=kFALSE) const override
Check if a pad and view are present and send signal "Modified" to pad.
void SetTopVisible(Bool_t vis=kTRUE) override
Set top geometry volume as visible.
void DrawPanel() override
Int_t GetVisOption() const override
Definition: TGeoPainter.h:126
Int_t fVisOption
Definition: TGeoPainter.h:51
Bool_t TestVoxels(TGeoVolume *vol) override
Check voxels efficiency per volume.
Physical nodes are the actual 'touchable' objects in the geometry, representing a path of positioned ...
An arbitrary polygon defined by vertices.
Definition: TGeoPolygon.h:20
Base abstract class for all shapes.
Definition: TGeoShape.h:26
TGeoVolume, TGeoVolumeMulti, TGeoVolumeAssembly are the volume classes.
Definition: TGeoVolume.h:49
2-D histogram with a float per channel (see TH1 documentation)}
Definition: TH2.h:251
An array of TObjects.
Definition: TObjArray.h:37
Mother of all ROOT objects.
Definition: TObject.h:37
Stopwatch class.
Definition: TStopwatch.h:28
Basic string class.
Definition: TString.h:136
const char * Data() const
Definition: TString.h:369
Abstract class for geometry painters.
Base class for user-defined tracks attached to a geometry.
void box(Int_t pat, Double_t x1, Double_t y1, Double_t x2, Double_t y2)
Definition: fillpatterns.C:1
Double_t y[n]
Definition: legend1.C:17
Double_t x[n]
Definition: legend1.C:17
double dist(Rotation3D const &r1, Rotation3D const &r2)
Definition: 3DDistances.cxx:48
REAL * vertex
Definition: triangle.c:513