201 if(contour<zmin || contour>zmax) {
202 Error(
"GetContourList",
"Contour level (%g) outside the Z scope [%g,%g]",
219 Int_t t[3],i,it,i0,i1,i2;
228 for (i=0;i<
fNdt;i++) {
241 for(it=0; it<
fNdt; it++) {
249 y0 =
fY[p0]; y2 =
fY[p0];
250 z0 =
fZ[p0]; z2 =
fZ[p0];
255 if (
fZ[p1]<=z0) {z0=
fZ[p1]; x0=
fX[p1]; y0=
fY[p1]; i0=1;}
256 if (
fZ[p1]>z2) {z2=
fZ[p1];
x2=
fX[p1]; y2=
fY[p1]; i2=1;}
257 if (
fZ[p2]<=z0) {z0=
fZ[p2]; x0=
fX[p2]; y0=
fY[p2]; i0=2;}
258 if (
fZ[p2]>z2) {z2=
fZ[p2];
x2=
fX[p2]; y2=
fY[p2]; i2=2;}
259 if (i0==0 && i2==0) {
260 Error(
"GetContourList",
"wrong vertices ordering");
279 if(contour >= z0 && contour <=z2) {
280 r20 = (contour-z0)/(z2-z0);
281 xs0c = r20*(
x2-x0)+x0;
282 ys0c = r20*(y2-y0)+y0;
283 if(contour >= z1 && contour <=z2) {
284 r21 = (contour-z1)/(z2-z1);
286 ys1c = r21*(y2-y1)+y1;
288 r10 = (contour-z0)/(z1-z0);
289 xs1c = r10*(
x1-x0)+x0;
290 ys1c = r10*(y1-y0)+y0;
293 if(xs0c != xs1c || ys0c != ys1c) {
310 x0 =
fX[p[0]];
x2 =
fX[p[0]];
311 y0 =
fY[p[0]]; y2 =
fY[p[0]];
312 z0 =
fZ[p[0]]; z2 =
fZ[p[0]];
317 if (
fZ[p[1]]<=z0) {z0=
fZ[p[1]]; x0=
fX[p[1]]; y0=
fY[p[1]]; i0=1;}
318 if (
fZ[p[1]]>z2) {z2=
fZ[p[1]];
x2=
fX[p[1]]; y2=
fY[p[1]]; i2=1;}
319 if (
fZ[p[2]]<=z0) {z0=
fZ[p[2]]; x0=
fX[p[2]]; y0=
fY[p[2]]; i0=2;}
320 if (
fZ[p[2]]>z2) {z2=
fZ[p[2]];
x2=
fX[p[2]]; y2=
fY[p[2]]; i2=2;}
321 if (i0==0 && i2==0) {
322 Error(
"GetContourList",
"wrong vertices ordering");
341 if(contour >= z0 && contour <=z2) {
342 r20 = (contour-z0)/(z2-z0);
343 xs0c = r20*(
x2-x0)+x0;
344 ys0c = r20*(y2-y0)+y0;
345 if(contour >= z1 && contour <=z2) {
346 r21 = (contour-z1)/(z2-z1);
348 ys1c = r21*(y2-y1)+y1;
350 r10 = (contour-z0)/(z1-z0);
351 xs1c = r10*(
x1-x0)+x0;
352 ys1c = r10*(y1-y0)+y0;
355 if(xs0c != xs1c || ys0c != ys1c) {
379 for (is=0; is<nbSeg; is++) {
380 if (segUsed[is])
continue;
385 for (js=0; js<nbSeg; js++) {
386 if (is==js)
continue;
387 if (xs0[is]==xs0[js] && ys0[is]==ys0[js])
s0 =
kTRUE;
388 if (xs0[is]==xs1[js] && ys0[is]==ys1[js])
s0 =
kTRUE;
389 if (xs1[is]==xs0[js] && ys1[is]==ys0[js])
s1 =
kTRUE;
390 if (xs1[is]==xs1[js] && ys1[is]==ys1[js])
s1 =
kTRUE;
397 graph->SetPoint(npg,xs0[is],ys0[is]); npg++;
398 graph->SetPoint(npg,xs1[is],ys1[is]); npg++;
409 if (
s0) {xc = xs0[is]; yc = ys0[is]; xnc = xs1[is]; ync = ys1[is];}
410 if (
s1) {xc = xs1[is]; yc = ys1[is]; xnc = xs0[is]; ync = ys0[is];}
411 graph->SetPoint(npg,xnc,ync); npg++;
416 if (js < nbSeg && segUsed[js]) {
419 }
else if (xc==xs0[js] && yc==ys0[js]) {
423 }
else if (xc==xs1[js] && yc==ys1[js]) {
430 graph->SetPoint(npg,xc,yc); npg++;
435 if (js<nbSeg)
goto L01;
443 for (is=0; is<nbSeg; is++) {
444 if (segUsed[is])
continue;
452 graph->SetPoint(npg,xc,yc); npg++;
455 if (js < nbSeg && segUsed[js]) {
458 }
else if (xc==xs0[js] && yc==ys0[js]) {
462 }
else if (xc==xs1[js] && yc==ys1[js]) {
469 graph->SetPoint(npg,xc,yc); npg++;
474 if (js<nbSeg)
goto L02;
476 graph->SetPoint(npg,xs0[is],ys0[is]); npg++;
569 for (
Int_t k=0; k<ndiv; k++) {
573 while ((obj = next())) {
583 if (
l) {
l->Delete();
delete l; }
597 Error(
"PaintErrors",
"No TView in current pad");
615 temp1[0] =
fX[it]-
fEX[it];
625 view->
WCtoNDC(temp1, &temp2[0]);
629 temp1[0] =
fX[it]+
fEX[it];
632 view->
WCtoNDC(temp1, &temp2[0]);
635 gPad->PaintPolyLine(2,xm,ym);
639 temp1[1] =
fY[it]-
fEY[it];
648 view->
WCtoNDC(temp1, &temp2[0]);
652 temp1[1] =
fY[it]+
fEY[it];
655 view->
WCtoNDC(temp1, &temp2[0]);
658 gPad->PaintPolyLine(2,xm,ym);
663 temp1[2] =
fZ[it]-
fEZ[it];
671 view->
WCtoNDC(temp1, &temp2[0]);
675 temp1[2] =
fZ[it]+
fEZ[it];
679 view->
WCtoNDC(temp1, &temp2[0]);
682 gPad->PaintPolyLine(2,xm,ym);
699 Int_t i, fillColor, ncolors, theColor0, theColor2;
719 if (zmin==-1111 && zmax==-1111) {
727 Int_t i0=0, i1=0, i2=0;
728 if (
fZ[p[1]]<=z0) {z0=
fZ[p[1]]; x0=
x[1]; y0=
y[1]; i0=1;}
729 if (
fZ[p[1]]>z2) {z2=
fZ[p[1]];
x2=
x[1]; y2=
y[1]; i2=1;}
730 if (
fZ[p[2]]<=z0) {z0=
fZ[p[2]]; x0=
x[2]; y0=
y[2]; i0=2;}
731 if (
fZ[p[2]]>z2) {z2=
fZ[p[2]];
x2=
x[2]; y2=
y[2]; i2=2;}
737 if (z0>zmax) z0 = zmax;
738 if (z2>zmax) z2 = zmax;
739 if (z0<zmin) z0 = zmin;
740 if (z2<zmin) z2 = zmin;
741 if (z1>zmax) z1 = zmax;
742 if (z1<zmin) z1 = zmin;
761 theColor0 = (
Int_t)( ((z0-zmin)/(zmax-zmin))*(ncolors-1) );
762 theColor2 = (
Int_t)( ((z2-zmin)/(zmax-zmin))*(ncolors-1) );
779 if(theColor0 == theColor2) {
782 gPad->PaintFillArea(3,
x,
y);
786 for(ci=theColor0; ci<=theColor2; ci++) {
790 zi = (((ci+1)*(zmax-zmin))/(ncolors-1))+zmin;
793 rl = (zi-z0)/(z2-z0);
794 xp[1] = rl*(
x2-x0)+x0;
795 yp[1] = rl*(y2-y0)+y0;
796 if (zi>=z1 || z0==z1) {
797 rs = (zi-z1)/(z2-z1);
799 yp[2] = rs*(y2-y1)+y1;
804 rs = (zi-z0)/(z1-z0);
805 xp[2] = rs*(
x1-x0)+x0;
806 yp[2] = rs*(y1-y0)+y0;
809 }
else if (ci==theColor2) {
814 if (zi<z1 || z2==z1) {
824 zi = (((ci+1)*(zmax-zmin))/(ncolors-1))+zmin;
827 rl = (zi-z0)/(z2-z0);
828 xp[1] = rl*(
x2-x0)+x0;
829 yp[1] = rl*(y2-y0)+y0;
830 if ( zi>=z1 && zip<=z1) {
842 rs = (zi-z0)/(z1-z0);
843 xp[2] = rs*(
x1-x0)+x0;
844 yp[2] = rs*(y1-y0)+y0;
846 rs = (zi-z1)/(z2-z1);
848 yp[2] = rs*(y2-y1)+y1;
853 gPad->PaintFillArea(npf,xp,yp);
863 for(i=0; i<nblev; i++){
865 if(zl >= z0 && zl <=z2) {
869 xl[0]=r20*(
x2-x0)+x0;
870 yl[0]=r20*(y2-y0)+y0;
871 if(zl >= z1 && zl <=z2) {
873 yl[1]=r21*(y2-y1)+y1;
875 xl[1]=r10*(
x1-x0)+x0;
876 yl[1]=r10*(y1-y0)+y0;
878 gPad->PaintPolyLine(2,xl,yl);
896 Error(
"PaintPolyMarker",
"No TView in current pad");
926 if (hzmincol==-1111 && hzmaxcol==-1111) {
938 Double_t Zeps = (hzmax-hzmin)*0.0001;
946 if(hzmin -
fZ[it] > Zeps ||
fZ[it] - hzmax > Zeps)
continue;
957 view->
WCtoNDC(temp1, &temp2[0]);
967 for (it=0; it<npd; it++) {
968 theColor = (
Int_t)( ((zm[it]-hzmincol)/(hzmaxcol-hzmincol))*(ncolors-1) );
971 gPad->PaintPolyMarker(1,&xm[it],&ym[it]);
979 gPad->PaintPolyMarker(npd,xm,ym);
996 Error(
"PaintPolyLine",
"No TView in current pad");
1024 view->
WCtoNDC(temp1, &temp2[0]);
1025 xm[npd - 1] = temp2[0];
1026 ym[npd - 1] = temp2[1];
1032 gPad->PaintPolyLine(npd,xm,ym);
1046 for (
Int_t i=0; i<
n; i++) {
1050 gPad->PaintPolyMarker(1,&
x[i],&
y[i]);
1054 gPad->PaintPolyMarker(1,&
x[i],&
y[i]);
1084 Error(
"PaintTriangles",
"No TView in current pad");
1100 if (!tri1 && !tri2 && !wire) {
1103 Double_t binLow = 0, binHigh = 0, binWidth = 0;
1108 if (!r0 || !r1)
return;
1112 binLow, binHigh, nbins, binWidth,
" ");
1117 binWidth = (binHigh-binLow)/nbins;
1122 for (
Int_t i = 0; i < nblev; ++i) glev[i] = binLow+i*binWidth;
1146 for (it=0; it<
fNdt; it++) {
1152 if ((cp >= 0) && (sp >= 0.)) {
1154 }
else if ((cp <= 0) && (sp >= 0.)) {
1157 }
else if ((cp <= 0) && (sp <= 0.)) {
1174 for (it=0; it<
fNdt; it++) {
1178 for (
Int_t k=0; k<3; k++) {
1181 temp1[0] =
fX[t[k]-1];
1182 temp1[1] =
fY[t[k]-1];
1183 temp1[2] =
fZ[t[k]-1];
1191 view->
WCtoNDC(temp1, &temp2[0]);
1198 if (!tri1 && !tri2 && !wire) {
1199 gPad->PaintFillArea(3,
x,
y);
1202 if (!tri2)
gPad->PaintPolyLine(4,
x,
y);
1211 gPad->PaintPolyMarker(3,
x,
y);
1223 if (glev)
delete [] glev;
1238 Error(
"PaintTriangles",
"No TView in current pad");
1254 if (!tri1 && !tri2 && !wire) {
1257 Double_t binLow = 0, binHigh = 0, binWidth = 0;
1262 if (!r0 || !r1)
return;
1266 binLow, binHigh, nbins, binWidth,
" ");
1271 binWidth = (binHigh-binLow)/nbins;
1276 for (
Int_t i = 0; i < nblev; ++i) glev[i] = binLow+i*binWidth;
1299 if ((cp >= 0) && (sp >= 0.)) {
1301 }
else if ((cp <= 0) && (sp >= 0.)) {
1304 }
else if ((cp <= 0) && (sp <= 0.)) {
1311 typedef std::pair<Double_t, TGraphDelaunay2D::Triangles::const_iterator> DistEntry;
1312 std::vector<DistEntry> dist;
1315 Double_t xd = (face.x[0] + face.x[1] + face.x[2]) / 3;
1316 Double_t yd = (face.y[0] + face.y[1] + face.y[2]) / 3;
1318 dist.emplace_back(fDist(xd, yd), it);
1321 std::sort(dist.begin(), dist.end(),
1322 [&](
const DistEntry &
a,
const DistEntry &
b){ return !reverse ? (a.first < b.first) : (b.first < a .first); });
1332 for (
const auto & it : dist) {
1333 p[0] = it.second->idx[0];
1334 p[1] = it.second->idx[1];
1335 p[2] = it.second->idx[2];
1336 for (
Int_t k=0; k<3; k++) {
1339 temp1[0] =
fX[p[k]];
1340 temp1[1] =
fY[p[k]];
1341 temp1[2] =
fZ[p[k]];
1349 view->
WCtoNDC(temp1, &temp2[0]);
1356 if (!tri1 && !tri2 && !wire) {
1357 gPad->PaintFillArea(3,
x,
y);
1360 if (!tri2)
gPad->PaintPolyLine(4,
x,
y);
1369 gPad->PaintPolyMarker(3,
x,
y);
1380 if (glev)
delete [] glev;
static const double x2[5]
static const double x1[5]
R__EXTERN TH1 * gCurrentHist
R__EXTERN Hoption_t Hoption
R__EXTERN TStyle * gStyle
virtual Int_t GetNdivisions() const
virtual Color_t GetFillColor() const
Return the fill area color.
virtual Style_t GetFillStyle() const
Return the fill area style.
virtual void SetFillColor(Color_t fcolor)
Set the fill area color.
virtual void SetFillStyle(Style_t fstyle)
Set the fill area style.
virtual Color_t GetLineColor() const
Return the line color.
virtual void SetLineStyle(Style_t lstyle)
Set the line style.
virtual Width_t GetLineWidth() const
Return the line width.
virtual void SetLineWidth(Width_t lwidth)
Set the line width.
virtual void SetLineColor(Color_t lcolor)
Set the line color.
virtual Style_t GetLineStyle() const
Return the line style.
virtual Style_t GetMarkerStyle() const
Return the marker style.
virtual void SetMarkerColor(Color_t mcolor=1)
Set the marker color.
virtual Color_t GetMarkerColor() const
Return the marker color.
virtual Size_t GetMarkerSize() const
Return the marker size.
virtual void SetMarkerStyle(Style_t mstyle=1)
Set the marker style.
virtual void SetMarkerSize(Size_t msize=1)
Set the marker size.
Class to manage histogram axis.
virtual Double_t GetBinLowEdge(Int_t bin) const
Return low edge of bin.
virtual Int_t FindFixBin(Double_t x) const
Find bin number corresponding to abscissa x.
Int_t GetLast() const
Return last bin on the axis i.e.
virtual Double_t GetBinWidth(Int_t bin) const
Return bin width.
virtual Double_t GetBinUpEdge(Int_t bin) const
Return up edge of bin.
Int_t GetFirst() const
Return first bin on the axis i.e.
The TGraphDelaunay painting class.
void PaintContour(Option_t *option)
Paints the 2D graph as a contour plot.
void Paint(Option_t *option)
Paint a TGraphDelaunay according to the value of "option":
Int_t * fNTried
! Pointer to fDelaunay->fNTried
Double_t * fYN
! Pointer to fDelaunay->fYN
TGraphDelaunay * fDelaunay
! Pointer to the TGraphDelaunay2D to be painted
Double_t fYmin
! fGraph2D->fHistogram Ymin
Double_t * fZ
! Pointer to fGraph2D->fZ
TGraphDelaunay2D * fDelaunay2D
! Pointer to the TGraphDelaunay2D to be painted
virtual ~TGraph2DPainter()
TGraph2DPainter destructor.
TGraph2D * fGraph2D
! Pointer to the TGraph2D in fDelaunay
void PaintErrors(Option_t *option)
Paints the 2D graph as error bars.
Double_t * fXN
! Pointer to fDelaunay->fXN
Int_t * fMTried
! Pointer to fDelaunay->fMTried
void FindTriangles()
Find triangles in fDelaunay and initialise the TGraph2DPainter values needed to paint triangles or fi...
Int_t * fPTried
! Pointer to fDelaunay->fPTried
Double_t fXNmin
! Equal to fDelaunay->fXNmin
Double_t fXmax
! fGraph2D->fHistogram Xmax
Int_t fNpoints
! Equal to fGraph2D->fNpoints
Double_t fZmin
! fGraph2D->fHistogram Zmin
void PaintLevels(Int_t *v, Double_t *x, Double_t *y, Int_t nblev=0, Double_t *glev=0)
Paints one triangle.
Int_t fNdt
! Equal to fDelaunay->fNdt
Double_t * fEZ
! Pointer to fGraph2D->fZE
TList * GetContourList(Double_t contour)
Returns the X and Y graphs building a contour.
Double_t * fX
! Pointer to fGraph2D->fX
Double_t fYmax
! fGraph2D->fHistogram Ymax
void PaintPolyMarker0(Int_t n, Double_t *x, Double_t *y)
Paints a circle at each vertex. Each circle background is white.
void PaintTriangles(Option_t *option)
Paints the 2D graph as triangles.
void PaintPolyMarker(Option_t *option)
Paints the 2D graph as PaintPolyMarker.
Double_t * fY
! Pointer to fGraph2D->fY
Double_t fYNmin
! Equal to fDelaunay->fYNmin
Double_t * fEY
! Pointer to fGraph2D->fYE
void PaintPolyLine(Option_t *option)
Paints the 2D graph as PaintPolyLine.
TGraph2DPainter()
TGraph2DPainter default constructor.
Double_t fZmax
! fGraph2D->fHistogram Zmax
void PaintTriangles_old(Option_t *option)
Paints the 2D graph as triangles (old implementation)
Double_t fYNmax
! Equal to fDelaunay->fYNmax
Double_t fXmin
! fGraph2D->fHistogram Xmin
Double_t * fEX
! Pointer to fGraph2D->fXE
Double_t fXNmax
! Equal to fDelaunay->fXNmax
void PaintTriangles_new(Option_t *option)
Paints the 2D graph as triangles (new implementation)
Double_t GetMaximum() const
virtual Double_t GetZminE() const
Double_t GetMinimum() const
virtual Double_t GetZmaxE() const
virtual Double_t * GetEZ() const
Double_t GetZmax() const
Returns the Z maximum.
virtual Double_t * GetEY() const
virtual Double_t * GetEX() const
TGraphDelaunay2D generates a Delaunay triangulation of a TGraph2D.
Triangles::const_iterator begin() const
Double_t GetXNmax() const
TGraph2D * GetGraph2D() const
Triangles::const_iterator end() const
Double_t GetXNmin() const
Double_t GetYNmax() const
Double_t GetYNmin() const
TGraphDelaunay generates a Delaunay triangulation of a TGraph2D.
Double_t GetYNmax() const
Int_t * GetMTried() const
Double_t GetXNmin() const
TGraph2D * GetGraph2D() const
Double_t GetXNmax() const
void FindAllTriangles()
Attempt to find all the Delaunay triangles of the point set.
Int_t * GetPTried() const
Int_t * GetNTried() const
Double_t GetYNmin() const
A TGraph is an object made of two arrays X and Y with npoints each.
TH1 is the base class of all histogram classes in ROOT.
virtual Double_t GetContourLevelPad(Int_t level) const
Return the value of contour number "level" in Pad coordinates.
@ kUserContour
User specified contour levels.
TAxis * GetXaxis()
Get the behaviour adopted by the object about the statoverflows. See EStatOverflows for more informat...
virtual Double_t GetMaximum(Double_t maxval=FLT_MAX) const
Return maximum value smaller than maxval of bins in the range, unless the value has been overridden b...
virtual void SetContour(Int_t nlevels, const Double_t *levels=0)
Set the number and values of contour levels.
virtual Double_t GetMinimum(Double_t minval=-FLT_MAX) const
Return minimum value larger than minval of bins in the range, unless the value has been overridden by...
virtual Int_t GetContour(Double_t *levels=0)
Return contour values into array levels if pointer levels is non zero.
static void Optimize(Double_t A1, Double_t A2, Int_t nold, Double_t &BinLow, Double_t &BinHigh, Int_t &nbins, Double_t &BWID, Option_t *option="")
Static function to compute reasonable axis limits.
virtual void Add(TObject *obj)
Mother of all ROOT objects.
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
void ToLower()
Change string to lower-case.
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
Int_t GetColorPalette(Int_t i) const
Return color number i in current palette.
Int_t GetNumberOfColors() const
Return number of colors in the color palette.
Int_t GetNumberContours() const
virtual Double_t * GetRmax()=0
virtual Double_t * GetRmin()=0
virtual Double_t GetLongitude()=0
virtual void WCtoNDC(const Float_t *pw, Float_t *pn)=0
Short_t Max(Short_t a, Short_t b)
Short_t Min(Short_t a, Short_t b)
void Sort(Index n, const Element *a, Index *index, Bool_t down=kTRUE)
Double_t Log10(Double_t x)
Histograms' drawing options structure.
int Logx
log scale in X. Also set by histogram option
int Logz
log scale in Z. Also set by histogram option
int Logy
log scale in Y. Also set by histogram option