Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
TMarker3DBox.cxx
Go to the documentation of this file.
1// @(#)root/g3d:$Id$
2// Author: Rene Brun , Olivier Couet 31/10/97
3
4/*************************************************************************
5 * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers. *
6 * All rights reserved. *
7 * *
8 * For the licensing terms see $ROOTSYS/LICENSE. *
9 * For the list of contributors see $ROOTSYS/README/CREDITS. *
10 *************************************************************************/
11
12#include <iostream>
13#include "TROOT.h"
14#include "TBuffer.h"
15#include "TView.h"
16#include "TMarker3DBox.h"
17#include "TVirtualPad.h"
18#include "TH1.h"
19#include "TBuffer3D.h"
20#include "TBuffer3DTypes.h"
21#include "TVirtualViewer3D.h"
22#include "TGeometry.h"
23#include "TMath.h"
24
25#include <cassert>
26
27
28/** \class TMarker3DBox
29\ingroup g3d
30A special 3-D marker designed for event display.
31
32It has the following parameters:
33 - fX: X coordinate of the center of the box
34 - fY: Y coordinate of the center of the box
35 - fZ: Z coordinate of the center of the box
36 - fDx: half length in X
37 - fDy: half length in Y
38 - fDz: half length in Z
39 - fTheta: Angle of box z axis with respect to main Z axis
40 - fPhi: Angle of box x axis with respect to main Xaxis
41 - fRefObject: A reference to an object
42*/
43
44////////////////////////////////////////////////////////////////////////////////
45/// Marker3DBox default constructor
46
48{
49 fRefObject = nullptr;
50 fDx = 1;
51 fDy = 1;
52 fDz = 1;
53 fX = 0;
54 fY = 0;
55 fZ = 0;
56 fTheta = 0;
57 fPhi = 0;
59}
60
61////////////////////////////////////////////////////////////////////////////////
62/// Marker3DBox normal constructor
63
66 Float_t theta, Float_t phi)
67 :TAttLine(1,1,1), TAttFill(1,0)
68{
69 fDx = dx;
70 fDy = dy;
71 fDz = dz;
72 fX = x;
73 fY = y;
74 fZ = z;
75 fTheta = theta;
76 fPhi = phi;
77 fRefObject = nullptr;
79}
80
81////////////////////////////////////////////////////////////////////////////////
82/// copy constructor
83
85 TObject(m3d),
88 TAtt3D(m3d),
89 fX(m3d.fX),
90 fY(m3d.fY),
91 fZ(m3d.fZ),
92 fDx(m3d.fDx),
93 fDy(m3d.fDy),
94 fDz(m3d.fDz),
95 fTheta(m3d.fTheta),
96 fPhi(m3d.fPhi),
97 fRefObject(m3d.fRefObject)
98{
99}
100
101////////////////////////////////////////////////////////////////////////////////
102/// assignment operator
103
105{
106 if(this!=&m3d) {
108 TAttLine::operator=(m3d);
109 TAttFill::operator=(m3d);
110 TAtt3D::operator=(m3d);
111 fX=m3d.fX;
112 fY=m3d.fY;
113 fZ=m3d.fZ;
114 fDx=m3d.fDx;
115 fDy=m3d.fDy;
116 fDz=m3d.fDz;
117 fTheta=m3d.fTheta;
118 fPhi=m3d.fPhi;
119 fRefObject=m3d.fRefObject;
120 }
121 return *this;
122}
123
124////////////////////////////////////////////////////////////////////////////////
125/// Marker3DBox shape default destructor
126
130
131
132////////////////////////////////////////////////////////////////////////////////
133/// Compute distance from point px,py to a Marker3DBox
134///
135/// Compute the closest distance of approach from point px,py to each corner
136/// point of the Marker3DBox.
137
139{
140 const Int_t numPoints = 8;
141 Int_t dist = 9999;
142 Double_t points[3*numPoints];
143
144 TView *view = gPad->GetView();
145 if (!view) return dist;
146 const Int_t seg1[12] = {0,1,2,3,4,5,6,7,0,1,2,3};
147 const Int_t seg2[12] = {1,2,3,0,5,6,7,4,4,5,6,7};
148
150
151 Int_t i, i1, i2, dsegment;
153 Double_t xndc[3];
154 for (i = 0; i < 12; i++) {
155 i1 = 3*seg1[i];
156 view->WCtoNDC(&points[i1], xndc);
157 x1 = xndc[0];
158 y1 = xndc[1];
159
160 i2 = 3*seg2[i];
161 view->WCtoNDC(&points[i2], xndc);
162 x2 = xndc[0];
163 y2 = xndc[1];
164 dsegment = DistancetoLine(px,py,x1,y1,x2,y2);
165 if (dsegment < dist) dist = dsegment;
166 }
167 if (dist < 5) {
168 gPad->SetCursor(kCross);
169 if (fRefObject) {gPad->SetSelected(fRefObject); return 0;}
170 }
171 return dist;
172}
173
174////////////////////////////////////////////////////////////////////////////////
175/// Execute action corresponding to one event
176///
177/// This member function must be implemented to realize the action
178/// corresponding to the mouse click on the object in the window
179
181{
182 if (!gPad) return;
183 if (gPad->GetView()) gPad->GetView()->ExecuteRotateView(event, px, py);
184}
185
186////////////////////////////////////////////////////////////////////////////////
187/// Paint marker 3D box.
188
189void TMarker3DBox::Paint(Option_t * /* option */ )
190{
191 static TBuffer3D buffer(TBuffer3DTypes::kGeneric);
192
193 buffer.ClearSectionsValid();
194
195 // Section kCore
196
197 // If we are just a temporary object then no 'real object' to
198 // pass to viewer
199 if (TestBit(kTemporary)) {
200 buffer.fID = nullptr;
201 } else {
202 buffer.fID = this;
203 }
204 buffer.fColor = GetLineColor();
205 buffer.fTransparency = 0;
206 buffer.fLocalFrame = kFALSE;
208
209 // We fill kCore and kRawSizes on first pass and try with viewer
210 TVirtualViewer3D * viewer3D = gPad->GetViewer3D();
211 if (!viewer3D) return;
212 Int_t reqSections = viewer3D->AddObject(buffer);
214 return;
215 }
216
218 Int_t nbPnts = 8;
219 Int_t nbSegs = 12;
220 Int_t nbPols = 6;
221 if (!buffer.SetRawSizes(nbPnts, 3*nbPnts, nbSegs, 3*nbSegs, nbPols, 6*nbPols)) {
222 return;
223 }
225 }
226
228 // Points
229 SetPoints(buffer.fPnts);
230
231 // Transform points
232 if (gGeometry && !buffer.fLocalFrame) {
233 Double_t dlocal[3];
234 Double_t dmaster[3];
235 for (UInt_t j=0; j<buffer.NbPnts(); j++) {
236 dlocal[0] = buffer.fPnts[3*j];
237 dlocal[1] = buffer.fPnts[3*j+1];
238 dlocal[2] = buffer.fPnts[3*j+2];
240 buffer.fPnts[3*j] = dmaster[0];
241 buffer.fPnts[3*j+1] = dmaster[1];
242 buffer.fPnts[3*j+2] = dmaster[2];
243 }
244 }
245
246 // Basic colors: 0, 1, ... 8
247 Int_t c = (((GetLineColor()) %8) -1) * 4;
248 if (c < 0) c = 0;
249
250 // Segments
251 buffer.fSegs[ 0] = c ; buffer.fSegs[ 1] = 0 ; buffer.fSegs[ 2] = 1;
252 buffer.fSegs[ 3] = c+1 ; buffer.fSegs[ 4] = 1 ; buffer.fSegs[ 5] = 2;
253 buffer.fSegs[ 6] = c+1 ; buffer.fSegs[ 7] = 2 ; buffer.fSegs[ 8] = 3;
254 buffer.fSegs[ 9] = c ; buffer.fSegs[10] = 3 ; buffer.fSegs[11] = 0;
255 buffer.fSegs[12] = c+2 ; buffer.fSegs[13] = 4 ; buffer.fSegs[14] = 5;
256 buffer.fSegs[15] = c+2 ; buffer.fSegs[16] = 5 ; buffer.fSegs[17] = 6;
257 buffer.fSegs[18] = c+3 ; buffer.fSegs[19] = 6 ; buffer.fSegs[20] = 7;
258 buffer.fSegs[21] = c+3 ; buffer.fSegs[22] = 7 ; buffer.fSegs[23] = 4;
259 buffer.fSegs[24] = c ; buffer.fSegs[25] = 0 ; buffer.fSegs[26] = 4;
260 buffer.fSegs[27] = c+2 ; buffer.fSegs[28] = 1 ; buffer.fSegs[29] = 5;
261 buffer.fSegs[30] = c+1 ; buffer.fSegs[31] = 2 ; buffer.fSegs[32] = 6;
262 buffer.fSegs[33] = c+3 ; buffer.fSegs[34] = 3 ; buffer.fSegs[35] = 7;
263
264 // Polygons
265 buffer.fPols[ 0] = c ; buffer.fPols[ 1] = 4 ; buffer.fPols[ 2] = 0;
266 buffer.fPols[ 3] = 9 ; buffer.fPols[ 4] = 4 ; buffer.fPols[ 5] = 8;
267 buffer.fPols[ 6] = c+1 ; buffer.fPols[ 7] = 4 ; buffer.fPols[ 8] = 1;
268 buffer.fPols[ 9] = 10 ; buffer.fPols[10] = 5 ; buffer.fPols[11] = 9;
269 buffer.fPols[12] = c ; buffer.fPols[13] = 4 ; buffer.fPols[14] = 2;
270 buffer.fPols[15] = 11 ; buffer.fPols[16] = 6 ; buffer.fPols[17] = 10;
271 buffer.fPols[18] = c+1 ; buffer.fPols[19] = 4 ; buffer.fPols[20] = 3;
272 buffer.fPols[21] = 8 ; buffer.fPols[22] = 7 ; buffer.fPols[23] = 11;
273 buffer.fPols[24] = c+2 ; buffer.fPols[25] = 4 ; buffer.fPols[26] = 0;
274 buffer.fPols[27] = 3 ; buffer.fPols[28] = 2 ; buffer.fPols[29] = 1;
275 buffer.fPols[30] = c+3 ; buffer.fPols[31] = 4 ; buffer.fPols[32] = 4;
276 buffer.fPols[33] = 5 ; buffer.fPols[34] = 6 ; buffer.fPols[35] = 7;
277
279
282 }
283
284 viewer3D->AddObject(buffer);
285}
286
287////////////////////////////////////////////////////////////////////////////////
288/// Paint 3-d histogram h with marker3dboxes
289
291{
292 Int_t bin,ix,iy,iz;
293 Double_t xmin,xmax,ymin,ymax,zmin,zmax,wmin,wmax,w;
294 TAxis *xaxis = h->GetXaxis();
295 TAxis *yaxis = h->GetYaxis();
296 TAxis *zaxis = h->GetZaxis();
297
298 wmin = h->GetMinimum();
299 wmax = h->GetMaximum();
300
301 //Create or modify 3-d view object
302 TView *view = gPad->GetView();
303 if (!view) {
304 gPad->Range(-1,-1,1,1);
305 view = TView::CreateView(1,nullptr,nullptr);
306 if (!view) return;
307 }
308 view->SetRange(xaxis->GetBinLowEdge(xaxis->GetFirst()),
309 yaxis->GetBinLowEdge(yaxis->GetFirst()),
310 zaxis->GetBinLowEdge(zaxis->GetFirst()),
311 xaxis->GetBinUpEdge(xaxis->GetLast()),
312 yaxis->GetBinUpEdge(yaxis->GetLast()),
313 zaxis->GetBinUpEdge(zaxis->GetLast()));
314
315 view->PadRange(gPad->GetFrameFillColor());
316
317 //Draw TMarker3DBox with size proportional to cell content
318 TMarker3DBox m3;
320 m3.SetRefObject(h);
321 m3.SetDirection(0,0);
322 m3.SetLineColor(h->GetMarkerColor());
324 for (ix=xaxis->GetFirst();ix<=xaxis->GetLast();ix++) {
325 xmin = h->GetXaxis()->GetBinLowEdge(ix);
326 xmax = xmin + h->GetXaxis()->GetBinWidth(ix);
327 for (iy=yaxis->GetFirst();iy<=yaxis->GetLast();iy++) {
328 ymin = h->GetYaxis()->GetBinLowEdge(iy);
329 ymax = ymin + h->GetYaxis()->GetBinWidth(iy);
330 for (iz=zaxis->GetFirst();iz<=zaxis->GetLast();iz++) {
331 zmin = h->GetZaxis()->GetBinLowEdge(iz);
332 zmax = zmin + h->GetZaxis()->GetBinWidth(iz);
333 bin = h->GetBin(ix,iy,iz);
334 w = h->GetBinContent(bin);
335 if (w < wmin) continue;
336 if (w > wmax) w = wmax;
337 scale = (TMath::Power((w-wmin)/(wmax-wmin),1./3.))/2.;
338 if (scale == 0) continue;
339 m3.SetPosition(0.5*(xmin+xmax),0.5*(ymin+ymax),0.5*(zmin+zmax));
340 m3.SetSize(scale*(xmax-xmin),scale*(ymax-ymin),scale*(zmax-zmin));
341 m3.Paint(option);
342 }
343 }
344 }
345}
346
347////////////////////////////////////////////////////////////////////////////////
348/// Save primitive as a C++ statement(s) on output stream out
349
351{
352 SavePrimitiveConstructor(out, Class(), "marker3DBox",
353 TString::Format("%g, %g, %g, %g, %g, %g, %g, %g", fX, fY, fZ, fDx, fDy, fDz, fTheta, fPhi));
354
355 SaveLineAttributes(out, "marker3DBox", 1, 1, 1);
356 SaveFillAttributes(out, "marker3DBox", 1, 0);
357
358 SavePrimitiveDraw(out, "marker3DBox", option);
359}
360
361////////////////////////////////////////////////////////////////////////////////
362/// Set direction.
363
365{
366 fTheta = theta;
367 fPhi = phi;
368}
369
370////////////////////////////////////////////////////////////////////////////////
371/// Set size.
372
374{
375 fDx = dx;
376 fDy = dy;
377 fDz = dz;
378}
379
380////////////////////////////////////////////////////////////////////////////////
381/// Set position.
382
384{
385 fX = x;
386 fY = y;
387 fZ = z;
388}
389
390////////////////////////////////////////////////////////////////////////////////
391/// Set points.
392
394{
395 if (points) {
396 points[ 0] = -fDx ; points[ 1] = -fDy ; points[ 2] = -fDz;
397 points[ 3] = -fDx ; points[ 4] = fDy ; points[ 5] = -fDz;
398 points[ 6] = fDx ; points[ 7] = fDy ; points[ 8] = -fDz;
399 points[ 9] = fDx ; points[10] = -fDy ; points[11] = -fDz;
400 points[12] = -fDx ; points[13] = -fDy ; points[14] = fDz;
401 points[15] = -fDx ; points[16] = fDy ; points[17] = fDz;
402 points[18] = fDx ; points[19] = fDy ; points[20] = fDz;
403 points[21] = fDx ; points[22] = -fDy ; points[23] = fDz;
404
405 Double_t x, y, z;
406 const Double_t kPI = TMath::Pi();
407 Double_t theta = fTheta*kPI/180;
408 Double_t phi = fPhi*kPI/180;
409 Double_t sinth = TMath::Sin(theta);
410 Double_t costh = TMath::Cos(theta);
413
414 // Matrix to convert from fruit frame to master frame
415 Double_t m[9];
416 m[0] = costh * cosfi; m[1] = -sinfi; m[2] = sinth*cosfi;
417 m[3] = costh * sinfi; m[4] = cosfi; m[5] = sinth*sinfi;
418 m[6] = -sinth; m[7] = 0; m[8] = costh;
419 for (Int_t i = 0; i < 8; i++) {
420 x = points[3*i];
421 y = points[3*i+1];
422 z = points[3*i+2];
423
424 points[3*i] = fX + m[0] * x + m[1] * y + m[2] * z;
425 points[3*i+1] = fY + m[3] * x + m[4] * y + m[5] * z;
426 points[3*i+2] = fZ + m[6] * x + m[7] * y + m[8] * z;
427 }
428 }
429}
430
431////////////////////////////////////////////////////////////////////////////////
432/// Stream an object of class TMarker3DBox.
433
435{
436 if (R__b.IsReading()) {
438 Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
439 if (R__v > 1) {
440 R__b.ReadClassBuffer(TMarker3DBox::Class(), this, R__v, R__s, R__c);
441 return;
442 }
443 //====process old versions before automatic schema evolution
448 R__b >> fX;
449 R__b >> fY;
450 R__b >> fZ;
451 R__b >> fDx;
452 R__b >> fDy;
453 R__b >> fDz;
454 R__b >> fTheta;
455 R__b >> fPhi;
456 R__b >> fRefObject;
457 R__b.CheckByteCount(R__s, R__c, TMarker3DBox::IsA());
458 //====end of old versions
459
460 } else {
461 R__b.WriteClassBuffer(TMarker3DBox::Class(),this);
462 }
463}
@ kCross
Definition GuiTypes.h:374
#define c(i)
Definition RSha256.hxx:101
#define h(i)
Definition RSha256.hxx:106
short Version_t
Class version identifier (short)
Definition RtypesCore.h:79
float Float_t
Float 4 bytes (float)
Definition RtypesCore.h:71
constexpr Bool_t kFALSE
Definition RtypesCore.h:108
constexpr Bool_t kTRUE
Definition RtypesCore.h:107
const char Option_t
Option string (const char)
Definition RtypesCore.h:80
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
constexpr Double_t kPI
Definition TEllipse.cxx:24
Option_t Option_t option
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t wmin
Option_t Option_t TPoint TPoint const char x2
Option_t Option_t TPoint TPoint const char x1
Option_t Option_t TPoint TPoint const char y2
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t points
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t wmax
Option_t Option_t TPoint TPoint const char y1
R__EXTERN TGeometry * gGeometry
Definition TGeometry.h:158
float xmin
float ymin
float xmax
float ymax
#define gPad
Use this attribute class when an object should have 3D capabilities.
Definition TAtt3D.h:19
virtual void Streamer(TBuffer &)
Fill Area Attributes class.
Definition TAttFill.h:20
virtual void Streamer(TBuffer &)
virtual void Modify()
Change current fill area attributes if necessary.
Definition TAttFill.cxx:215
virtual void SaveFillAttributes(std::ostream &out, const char *name, Int_t coldef=1, Int_t stydef=1001)
Save fill attributes as C++ statement(s) on output stream out.
Definition TAttFill.cxx:238
Line Attributes class.
Definition TAttLine.h:20
virtual void Streamer(TBuffer &)
virtual Color_t GetLineColor() const
Return the line color.
Definition TAttLine.h:35
virtual void SetLineColor(Color_t lcolor)
Set the line color.
Definition TAttLine.h:42
virtual void Modify()
Change current line attributes if necessary.
Definition TAttLine.cxx:246
Int_t DistancetoLine(Int_t px, Int_t py, Double_t xp1, Double_t yp1, Double_t xp2, Double_t yp2)
Compute distance from point px,py to a line.
Definition TAttLine.cxx:210
virtual void SaveLineAttributes(std::ostream &out, const char *name, Int_t coldef=1, Int_t stydef=1, Int_t widdef=1)
Save line attributes as C++ statement(s) on output stream out.
Definition TAttLine.cxx:274
Class to manage histogram axis.
Definition TAxis.h:32
Generic 3D primitive description class.
Definition TBuffer3D.h:18
Int_t * fPols
Definition TBuffer3D.h:115
UInt_t NbPnts() const
Definition TBuffer3D.h:80
Bool_t SectionsValid(UInt_t mask) const
Definition TBuffer3D.h:67
void ClearSectionsValid()
Clear any sections marked valid.
void SetSectionsValid(UInt_t mask)
Definition TBuffer3D.h:65
Int_t * fSegs
Definition TBuffer3D.h:114
Bool_t fLocalFrame
Definition TBuffer3D.h:90
Int_t fColor
Definition TBuffer3D.h:88
Short_t fTransparency
Definition TBuffer3D.h:89
TObject * fID
Definition TBuffer3D.h:87
Bool_t SetRawSizes(UInt_t reqPnts, UInt_t reqPntsCapacity, UInt_t reqSegs, UInt_t reqSegsCapacity, UInt_t reqPols, UInt_t reqPolsCapacity)
Set kRaw tessellation section of buffer with supplied sizes.
Double_t * fPnts
Definition TBuffer3D.h:113
Buffer base class used for serializing objects.
Definition TBuffer.h:43
virtual void Local2Master(Double_t *local, Double_t *master)
Convert one point from local system to master reference system.
TH1 is the base class of all histogram classes in ROOT.
Definition TH1.h:109
A special 3-D marker designed for event display.
virtual void SetPoints(Double_t *buff) const
Set points.
void ExecuteEvent(Int_t event, Int_t px, Int_t py) override
Execute action corresponding to one event.
virtual void SetSize(Float_t dx, Float_t dy, Float_t dz)
Set size.
TMarker3DBox & operator=(const TMarker3DBox &)
assignment operator
Int_t DistancetoPrimitive(Int_t px, Int_t py) override
Compute distance from point px,py to a Marker3DBox.
static void PaintH3(TH1 *h, Option_t *option)
Paint 3-d histogram h with marker3dboxes.
~TMarker3DBox() override
Marker3DBox shape default destructor.
TClass * IsA() const override
void Paint(Option_t *option) override
Paint marker 3D box.
static TClass * Class()
virtual void SetDirection(Float_t theta, Float_t phi)
Set direction.
virtual void SetPosition(Float_t x, Float_t y, Float_t z)
Set position.
TMarker3DBox()
Marker3DBox default constructor.
void SavePrimitive(std::ostream &out, Option_t *option="") override
Save primitive as a C++ statement(s) on output stream out.
virtual void SetRefObject(TObject *obj=nullptr)
void Streamer(TBuffer &) override
Stream an object of class TMarker3DBox.
Float_t fTheta
TObject * fRefObject
Mother of all ROOT objects.
Definition TObject.h:41
TObject & operator=(const TObject &rhs) noexcept
TObject assignment operator.
Definition TObject.h:299
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
Definition TObject.h:202
virtual void Streamer(TBuffer &)
Stream an object of class TObject.
Definition TObject.cxx:972
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
Definition TObject.cxx:864
static void SavePrimitiveDraw(std::ostream &out, const char *variable_name, Option_t *option=nullptr)
Save invocation of primitive Draw() method Skipped if option contains "nodraw" string.
Definition TObject.cxx:822
static void SavePrimitiveConstructor(std::ostream &out, TClass *cl, const char *variable_name, const char *constructor_agrs="", Bool_t empty_line=kTRUE)
Save object constructor in the output stream "out".
Definition TObject.cxx:771
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
Definition TString.cxx:2384
See TView3D.
Definition TView.h:25
virtual void WCtoNDC(const Float_t *pw, Float_t *pn)=0
static TView * CreateView(Int_t system=1, const Double_t *rmin=nullptr, const Double_t *rmax=nullptr)
Create a concrete default 3-d view via the plug-in manager.
Definition TView.cxx:26
virtual void PadRange(Int_t rback)=0
virtual void SetRange(const Double_t *min, const Double_t *max)=0
Abstract 3D shapes viewer.
Double_t y[n]
Definition legend1.C:17
Double_t x[n]
Definition legend1.C:17
LongDouble_t Power(LongDouble_t x, LongDouble_t y)
Returns x raised to the power y.
Definition TMath.h:732
Double_t Cos(Double_t)
Returns the cosine of an angle of x radians.
Definition TMath.h:605
constexpr Double_t Pi()
Definition TMath.h:40
Double_t Sin(Double_t)
Returns the sine of an angle of x radians.
Definition TMath.h:599
TMarker m
Definition textangle.C:8