Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
TGraph2D.cxx
Go to the documentation of this file.
1// @(#)root/hist:$Id: TGraph2D.cxx,v 1.00
2// Author: Olivier Couet
3
4/*************************************************************************
5 * Copyright (C) 1995-2000, 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 "TROOT.h"
13#include "TBuffer.h"
14#include "TMath.h"
15#include "TH2.h"
16#include "TF2.h"
17#include "TList.h"
18#include "TGraph2D.h"
19#include "TGraphDelaunay.h"
20#include "TGraphDelaunay2D.h"
21#include "TVirtualPad.h"
22#include "TVirtualFitter.h"
23#include "TVirtualHistPainter.h"
24#include "TPluginManager.h"
25#include "TSystem.h"
26#include "strtok.h"
27#include "snprintf.h"
28
29#include <cstdlib>
30#include <cassert>
31#include <iostream>
32#include <fstream>
33
34#include "HFitInterface.h"
35#include "Fit/DataRange.h"
37
39
40
41/** \class TGraph2D
42 \ingroup Graphs
43Graphics object made of three arrays X, Y and Z with the same number of points each.
44
45- [Creating a TGraph2D](\ref G2D00)
46- [Drawing options](\ref G2D01)
47- [Examples](\ref G2D02)
48 - [SURF1 Example](\ref G2D021)
49 - [Fitting Example](\ref G2D022)
50 - [PCOL Example](\ref G2D023)
51- [Definition of the Delaunay triangulation (After B. Delaunay)](\ref G2D03)
52
53
54\anchor G2D00
55## Creating a TGraph2D
56
57This class has different constructors:
58- With an array's dimension and three arrays x, y, and z:
59~~~ {.cpp}
60 auto g = new TGraph2D(n, x, y, z);
61~~~
62 x, y, z arrays can be doubles, floats, or ints.
63- With an array's dimension only:
64~~~ {.cpp}
65 auto g = new TGraph2D(n);
66~~~
67 The internal arrays are then filled with `SetPoint()`. The following line
68 fills the internal arrays at the position `i` with the values
69 `x`, `y`, `z`.
70~~~ {.cpp}
71 g->SetPoint(i, x, y, z);
72~~~
73- Without parameters:
74~~~ {.cpp}
75 auto g = new TGraph2D();
76~~~
77 again `SetPoint()` must be used to fill the internal arrays.
78- From a file:
79~~~ {.cpp}
80 auto g = new TGraph2D("graph.dat");
81~~~
82 Arrays are read from the ASCII file "graph.dat" according to a specifies
83 format. The default format is `%%lg %%lg %%lg`
84
85Note that in any of these three cases, `SetPoint()` can be used to change a data
86point or add a new one. If the data point index (`i`) is greater than the
87current size of the internal arrays, they are automatically extended.
88
89Like TGraph some TGraph2D constructors do not have the TGraph2D title and name as parameters.
90For these constructors TGraph2D has the default title and name "Graph2D". To change the
91default title and name `SetTitle` and `SetName` should be called on the TGraph2D after its
92creation.
93
94\anchor G2D01
95## Drawing options
96
97Specific drawing options can be used to paint a TGraph2D:
98
99| Option | Description |
100|----------|-------------------------------------------------------------------|
101| "TRI" | The Delaunay triangles are drawn using filled area. An hidden surface drawing technique is used. The surface is painted with the current fill area color. The edges of each triangles are painted with the current line color. |
102| "TRIW" | The Delaunay triangles are drawn as wire frame. |
103| "TRI1" | The Delaunay triangles are painted with color levels. The edges of each triangles are painted with the current line color. |
104| "TRI2" | The Delaunay triangles are painted with color levels. |
105| "P" | Draw a marker at each vertex. |
106| "P0" | Draw a circle at each vertex. Each circle background is white. |
107| "PCOL" | Draw a marker at each vertex. The color of each marker is defined according to its Z position. |
108| "LINE" | Draw a 3D polyline. |
109| "CONT5" | Draw a contour plot using Delaunay triangles.|
110
111A TGraph2D can be also drawn with any options valid to draw a 2D histogram
112(like `COL`, `SURF`, `LEGO`, `CONT` etc..).
113
114When a TGraph2D is drawn with one of the 2D histogram drawing option,
115an intermediate 2D histogram is filled using the Delaunay triangles
116to interpolate the data set. The 2D histogram has equidistant bins along the X
117and Y directions. The number of bins along each direction can be change using
118`SetNpx()` and `SetNpy()`. Each bin is filled with the Z
119value found via a linear interpolation on the plane defined by the triangle above
120the (X,Y) coordinates of the bin center.
121
122The existing (X,Y,Z) points can be randomly scattered.
123The Delaunay triangles are build in the (X,Y) plane. These 2D triangles are then
124used to define flat planes in (X,Y,Z) over which the interpolation is done to fill
125the 2D histogram. The 3D triangles int takes build a 3D surface in
126the form of tessellating triangles at various angles. The triangles found can be
127drawn in 3D with one of the TGraph2D specific drawing options.
128
129The histogram generated by the Delaunay interpolation can be accessed using the
130`GetHistogram()` method.
131
132The axis settings (title, ranges etc ...) can be changed accessing the axis via
133the GetXaxis GetYaxis and GetZaxis methods. They access the histogram axis created
134at drawing time only. Therefore they should called after the TGraph2D is drawn:
135
136~~~ {.cpp}
137 auto g = new TGraph2D();
138
139 [...]
140
141 g->Draw("tri1");
142 gPad->Update();
143 g->GetXaxis()->SetTitle("X axis title");
144~~~
145
146\anchor G2D02
147## Examples
148
149\anchor G2D021
150### SURF1 Example
151
152Begin_Macro(source)
153{
154 auto c = new TCanvas("c","Graph2D example",0,0,600,400);
155 Double_t x, y, z, P = 6.;
156 Int_t np = 200;
157 auto dt = new TGraph2D();
158 dt->SetTitle("Graph title; X axis title; Y axis title; Z axis title");
159 auto r = new TRandom();
160 for (Int_t N=0; N<np; N++) {
161 x = 2*P*(r->Rndm(N))-P;
162 y = 2*P*(r->Rndm(N))-P;
163 z = (sin(x)/x)*(sin(y)/y)+0.2;
164 dt->SetPoint(N,x,y,z);
165 }
166 gStyle->SetPalette(1);
167 dt->Draw("surf1");
168}
169End_Macro
170
171\anchor G2D022
172### Fitting Example
173
1742D graphs can be fitted as shown by the following example:
175
176Begin_Macro(source)
177../../../tutorials/math/fit/graph2dfit.C
178End_Macro
179
180\anchor G2D023
181### PCOL Example
182
183Example showing the PCOL option.
184
185Begin_Macro(source)
186{
187 auto c = new TCanvas("c","Graph2D example",0,0,600,400);
188 Double_t P = 5.;
189 Int_t npx = 20 ;
190 Int_t npy = 20 ;
191 Double_t x = -P;
192 Double_t y = -P;
193 Double_t z;
194 Int_t k = 0;
195 Double_t dx = (2*P)/npx;
196 Double_t dy = (2*P)/npy;
197 auto dt = new TGraph2D(npx*npy);
198 dt->SetNpy(41);
199 dt->SetNpx(40);
200 for (Int_t i=0; i<npx; i++) {
201 for (Int_t j=0; j<npy; j++) {
202 z = sin(sqrt(x*x+y*y))+1;
203 dt->SetPoint(k,x,y,z);
204 k++;
205 y = y+dy;
206 }
207 x = x+dx;
208 y = -P;
209 }
210 gStyle->SetPalette(1);
211 dt->SetMarkerStyle(20);
212 dt->Draw("pcol");
213}
214End_Macro
215
216\anchor G2D03
217## Definition of the Delaunay triangulation (After B. Delaunay)
218
219For a set S of points in the Euclidean plane, the unique triangulation DT(S)
220of S such that no point in S is inside the circumcircle of any triangle in
221DT(S). DT(S) is the dual of the Voronoi diagram of S.
222If n is the number of points in S, the Voronoi diagram of S is the partitioning
223of the plane containing S points into n convex polygons such that each polygon
224contains exactly one point and every point in a given polygon is closer to its
225central point than to any other. A Voronoi diagram is sometimes also known as
226a Dirichlet tessellation.
227
228\image html tgraph2d_delaunay.png
229
230[This applet](http://www.cs.cornell.edu/Info/People/chew/Delaunay.html)
231gives a nice practical view of Delaunay triangulation and Voronoi diagram.
232*/
233
234
235////////////////////////////////////////////////////////////////////////////////
236/// Graph2D default constructor
237
239 : TNamed("Graph2D", "Graph2D"), TAttLine(1, 1, 1), TAttFill(0, 1001), fNpoints(0)
240{
241 fSize = 0;
242 fMargin = 0.;
243 fNpx = 40;
244 fNpy = 40;
245 fDirectory = nullptr;
246 fHistogram = nullptr;
247 fDelaunay = nullptr;
248 fMaximum = -1111;
249 fMinimum = -1111;
250 fX = nullptr;
251 fY = nullptr;
252 fZ = nullptr;
253 fZout = 0;
254 fMaxIter = 100000;
255 fPainter = nullptr;
256 fFunctions = new TList;
258}
259
260
261////////////////////////////////////////////////////////////////////////////////
262/// Graph2D constructor with three vectors of ints as input.
263
265 : TNamed("Graph2D", "Graph2D"), TAttLine(1, 1, 1), TAttFill(0, 1001), fNpoints(n)
266{
267 Build(n);
268
269 // Copy the input vectors into local arrays
270 for (Int_t i = 0; i < fNpoints; ++i) {
271 fX[i] = (Double_t)x[i];
272 fY[i] = (Double_t)y[i];
273 fZ[i] = (Double_t)z[i];
274 }
275}
276
277
278////////////////////////////////////////////////////////////////////////////////
279/// Graph2D constructor with three vectors of floats as input.
280
282 : TNamed("Graph2D", "Graph2D"), TAttLine(1, 1, 1), TAttFill(0, 1001), fNpoints(n)
283{
284 Build(n);
285
286 // Copy the input vectors into local arrays
287 for (Int_t i = 0; i < fNpoints; ++i) {
288 fX[i] = x[i];
289 fY[i] = y[i];
290 fZ[i] = z[i];
291 }
292}
293
294
295////////////////////////////////////////////////////////////////////////////////
296/// Graph2D constructor with three vectors of doubles as input.
297
299 : TNamed("Graph2D", "Graph2D"), TAttLine(1, 1, 1), TAttFill(0, 1001), fNpoints(n)
300{
301 Build(n);
302
303 // Copy the input vectors into local arrays
304 for (Int_t i = 0; i < fNpoints; ++i) {
305 fX[i] = x[i];
306 fY[i] = y[i];
307 fZ[i] = z[i];
308 }
309}
310
311
312////////////////////////////////////////////////////////////////////////////////
313/// Graph2D constructor with a TH2 (h2) as input.
314/// Only the h2's bins within the X and Y axis ranges are used.
315/// Empty bins, recognized when both content and errors are zero, are excluded.
316
318 : TNamed("Graph2D", "Graph2D"), TAttLine(1, 1, 1), TAttFill(0, 1001), fNpoints(0)
319{
320 Build(h2->GetNbinsX()*h2->GetNbinsY());
321
322 TString gname = "Graph2D_from_" + TString(h2->GetName());
323 SetName(gname);
324 // need to call later because sets title in ref histogram
325 SetTitle(h2->GetTitle());
326
327 TAxis *xaxis = h2->GetXaxis();
328 TAxis *yaxis = h2->GetYaxis();
329 Int_t xfirst = xaxis->GetFirst();
330 Int_t xlast = xaxis->GetLast();
331 Int_t yfirst = yaxis->GetFirst();
332 Int_t ylast = yaxis->GetLast();
333
334 Double_t x, y, z;
335 Int_t k = 0;
336
337 for (Int_t i = xfirst; i <= xlast; i++) {
338 for (Int_t j = yfirst; j <= ylast; j++) {
339 x = xaxis->GetBinCenter(i);
340 y = yaxis->GetBinCenter(j);
341 z = h2->GetBinContent(i, j);
342 Double_t ez = h2->GetBinError(i, j);
343 if (z != 0. || ez != 0) {
344 SetPoint(k, x, y, z);
345 k++;
346 }
347 }
348 }
349}
350
351
352////////////////////////////////////////////////////////////////////////////////
353/// Graph2D constructor with name, title and three vectors of doubles as input.
354/// name : name of 2D graph (avoid blanks)
355/// title : 2D graph title
356/// if title is of the form "stringt;stringx;stringy;stringz"
357/// the 2D graph title is set to stringt, the x axis title to stringx,
358/// the y axis title to stringy,etc
359
360TGraph2D::TGraph2D(const char *name, const char *title,
362 : TNamed(name, title), TAttLine(1, 1, 1), TAttFill(0, 1001), fNpoints(n)
363{
364 Build(n);
365
366 // Copy the input vectors into local arrays
367 for (Int_t i = 0; i < fNpoints; ++i) {
368 fX[i] = x[i];
369 fY[i] = y[i];
370 fZ[i] = z[i];
371 }
372}
373
374
375////////////////////////////////////////////////////////////////////////////////
376/// Graph2D constructor. The arrays fX, fY and fZ should be filled via
377/// calls to SetPoint
378
380 : TNamed("Graph2D", "Graph2D"), TAttLine(1, 1, 1), TAttFill(0, 1001), fNpoints(n)
381{
382 Build(n);
383 for (Int_t i = 0; i < fNpoints; i++) {
384 fX[i] = 0.;
385 fY[i] = 0.;
386 fZ[i] = 0.;
387 }
388}
389
390
391////////////////////////////////////////////////////////////////////////////////
392/// Graph2D constructor reading input from filename
393/// filename is assumed to contain at least three columns of numbers.
394/// For files separated by a specific delimiter different from ' ' and '\\t' (e.g. ';' in csv files)
395/// you can avoid using %*s to bypass this delimiter by explicitly specify the "option" argument,
396/// e.g. option=" \\t,;" for columns of figures separated by any of these characters (' ', '\\t', ',', ';')
397/// used once (e.g. "1;1") or in a combined way (" 1;,;; 1").
398/// Note in that case, the instantiation is about 2 times slower.
399
401 : TNamed("Graph2D", filename), TAttLine(1, 1, 1), TAttFill(0, 1001), fNpoints(0)
402{
403 Double_t x, y, z;
406
407 std::ifstream infile(fname.Data());
408 if (!infile.good()) {
409 MakeZombie();
410 Error("TGraph2D", "Cannot open file: %s, TGraph2D is Zombie", filename);
411 return;
412 } else {
413 Build(100);
414 }
415 std::string line;
416 Int_t np = 0;
417
418 if (strcmp(option, "") == 0) { // No delimiters specified (standard constructor).
419
420 while (std::getline(infile, line, '\n')) {
421 if (3 != sscanf(line.c_str(), format, &x, &y, &z)) {
422 continue; // skip empty and ill-formed lines
423 }
424 SetPoint(np, x, y, z);
425 np++;
426 }
427
428 } else { // A delimiter has been specified in "option"
429
430 // Checking format and creating its boolean equivalent
432 format_.ReplaceAll(" ", "") ;
433 format_.ReplaceAll("\t", "") ;
434 format_.ReplaceAll("lg", "") ;
435 format_.ReplaceAll("s", "") ;
436 format_.ReplaceAll("%*", "0") ;
437 format_.ReplaceAll("%", "1") ;
438 if (!format_.IsDigit()) {
439 Error("TGraph2D", "Incorrect input format! Allowed format tags are {\"%%lg\",\"%%*lg\" or \"%%*s\"}");
440 return;
441 }
442 Int_t ntokens = format_.Length() ;
443 if (ntokens < 3) {
444 Error("TGraph2D", "Incorrect input format! Only %d tag(s) in format whereas 3 \"%%lg\" tags are expected!", ntokens);
445 return;
446 }
449 for (Int_t idx = 0; idx < ntokens; idx++) {
450 isTokenToBeSaved[idx] = TString::Format("%c", format_[idx]).Atoi() ; //atoi(&format_[idx]) does not work for some reason...
451 if (isTokenToBeSaved[idx] == 1) {
453 }
454 }
455 if (ntokens >= 3 && ntokensToBeSaved != 3) { //first condition not to repeat the previous error message
456 Error("TGraph2D", "Incorrect input format! There are %d \"%%lg\" tag(s) in format whereas 3 and only 3 are expected!", ntokensToBeSaved);
457 delete [] isTokenToBeSaved ;
458 return;
459 }
460
461 // Initializing loop variables
462 Bool_t isLineToBeSkipped = kFALSE ; //empty and ill-formed lines
463 char * token = nullptr ;
464 TString token_str = "" ;
465 Int_t token_idx = 0 ;
466 Double_t * value = new Double_t [3] ; //x,y,z buffers
467 Int_t value_idx = 0 ;
468
469 // Looping
470 char *rest;
471 while (std::getline(infile, line, '\n')) {
472 if (!line.empty()) {
473 if (line[line.size() - 1] == char(13)) { // removing DOS CR character
474 line.erase(line.end() - 1, line.end()) ;
475 }
476 token = R__STRTOK_R(const_cast<char*>(line.c_str()), option, &rest);
477 while (token != nullptr && value_idx < 3) {
480 token_str.ReplaceAll("\t", "") ;
481 if (!token_str.IsFloat()) {
483 break ;
484 } else {
485 value[value_idx] = token_str.Atof() ;
486 value_idx++ ;
487 }
488 }
489 token = R__STRTOK_R(nullptr, option, &rest); // next token
490 token_idx++ ;
491 }
492 if (!isLineToBeSkipped && value_idx == 3) {
493 x = value[0] ;
494 y = value[1] ;
495 z = value[2] ;
496 SetPoint(np, x, y, z) ;
497 np++ ;
498 }
499 }
501 token = nullptr ;
502 token_idx = 0 ;
503 value_idx = 0 ;
504 }
505
506 // Cleaning
507 delete [] isTokenToBeSaved ;
508 delete [] value ;
509 delete token ;
510 }
511 infile.close();
512}
513
514
515////////////////////////////////////////////////////////////////////////////////
516/// Graph2D copy constructor.
517/// copy everything apart from the list of contained functions
518
521 fX(nullptr), fY(nullptr), fZ(nullptr),
522 fHistogram(nullptr), fDirectory(nullptr), fPainter(nullptr)
523{
524 fFunctions = new TList(); // do not copy the functions
525
526 // use operator=
527 (*this) = g;
528
529 // append TGraph2D to gdirectory
532 if (fDirectory) {
533 // append without replacing existing objects
534 fDirectory->Append(this);
535 }
536 }
537}
538
539
540////////////////////////////////////////////////////////////////////////////////
541/// TGraph2D destructor.
542
544{
545 Clear();
546}
547
548
549////////////////////////////////////////////////////////////////////////////////
550/// Graph2D operator "="
551
553{
554 if (this == &g) return *this;
555
556 // delete before existing contained objects
557 if (fX) delete [] fX;
558 if (fY) delete [] fY;
559 if (fZ) delete [] fZ;
560 if (fHistogram && !fUserHisto) {
561 delete fHistogram;
562 fHistogram = nullptr;
563 fDelaunay = nullptr;
564 }
565 // copy everything except the function list
566 fNpoints = g.fNpoints;
567 fNpx = g.fNpx;
568 fNpy = g.fNpy;
569 fMaxIter = g.fMaxIter;
570 fSize = fNpoints; // force size to be the same of npoints
571 fX = (fSize > 0) ? new Double_t[fSize] : nullptr;
572 fY = (fSize > 0) ? new Double_t[fSize] : nullptr;
573 fZ = (fSize > 0) ? new Double_t[fSize] : nullptr;
574 fMinimum = g.fMinimum;
575 fMaximum = g.fMaximum;
576 fMargin = g.fMargin;
577 fZout = g.fZout;
578 fUserHisto = g.fUserHisto;
579 if (g.fHistogram)
580 fHistogram = (fUserHisto ) ? g.fHistogram : new TH2D(*g.fHistogram);
581
582 // copy the points
583 for (Int_t n = 0; n < fSize; n++) {
584 fX[n] = g.fX[n];
585 fY[n] = g.fY[n];
586 fZ[n] = g.fZ[n];
587 }
588
589 return *this;
590}
591
592////////////////////////////////////////////////////////////////////////////////
593/// Creates the 2D graph basic data structure
594
596{
597 if (n <= 0) {
598 Error("TGraph2D", "Invalid number of points (%d)", n);
599 return;
600 }
601
602 fSize = n;
603 fMargin = 0.;
604 fNpx = 40;
605 fNpy = 40;
606 fDirectory = nullptr;
607 fHistogram = nullptr;
608 fDelaunay = nullptr;
609 fMaximum = -1111;
610 fMinimum = -1111;
611 fX = new Double_t[fSize];
612 fY = new Double_t[fSize];
613 fZ = new Double_t[fSize];
614 fZout = 0;
615 fMaxIter = 100000;
616 fFunctions = new TList;
617 fPainter = nullptr;
619
622 if (fDirectory) {
623 fDirectory->Append(this, kTRUE);
624 }
625 }
626}
627
628////////////////////////////////////////////////////////////////////////////////
629/// Performs the operation: `z = z + c1*f(x,y,z)`
630/// Errors are not recalculated.
631///
632/// \param f may be a 2-D function TF2 or 3-d function TF3
633/// \param c1 a scaling factor, 1 by default
634
636{
637 //if (fHistogram) SetBit(kResetHisto);
638
639 for (Int_t i = 0; i < fNpoints; i++) {
640 fZ[i] += c1*f->Eval(fX[i], fY[i], fZ[i]);
641 }
642 if (gPad) gPad->Modified();
643}
644
645////////////////////////////////////////////////////////////////////////////////
646/// Apply function f to all the data points
647/// f may be a 2-D function TF2 or 3-d function TF3
648/// The Z values of the 2D graph are replaced by the new values computed
649/// using the function
650
652{
653 //if (fHistogram) SetBit(kResetHisto);
654
655 for (Int_t i = 0; i < fNpoints; i++) {
656 fZ[i] = f->Eval(fX[i], fY[i], fZ[i]);
657 }
658 if (gPad) gPad->Modified();
659}
660
661////////////////////////////////////////////////////////////////////////////////
662/// Browse
663
665{
666 Draw("p0");
667 gPad->Update();
668}
669
670
671////////////////////////////////////////////////////////////////////////////////
672/// Free all memory allocated by this object.
673
674void TGraph2D::Clear(Option_t * /*option = "" */)
675{
676 if (fX) delete [] fX;
677 fX = nullptr;
678 if (fY) delete [] fY;
679 fY = nullptr;
680 if (fZ) delete [] fZ;
681 fZ = nullptr;
682 fSize = fNpoints = 0;
683 if (fHistogram && !fUserHisto) {
684 delete fHistogram;
685 fHistogram = nullptr;
686 fDelaunay = nullptr;
687 }
688 if (fFunctions) {
691 delete fFunctions;
692 fFunctions = nullptr;
693 }
694 if (fDirectory) {
695 fDirectory->Remove(this);
696 fDirectory = nullptr;
697 }
698}
699
700
701////////////////////////////////////////////////////////////////////////////////
702/// Perform the automatic addition of the graph to the given directory
703///
704/// Note this function is called in place when the semantic requires
705/// this object to be added to a directory (I.e. when being read from
706/// a TKey or being Cloned)
707
709{
711 if (addStatus) {
712 SetDirectory(dir);
713 if (dir) {
715 }
716 }
717}
718
719
720////////////////////////////////////////////////////////////////////////////////
721/// Computes distance from point px,py to a graph
722
729
730
731////////////////////////////////////////////////////////////////////////////////
732/// Specific drawing options can be used to paint a TGraph2D:
733///
734/// - "TRI" : The Delaunay triangles are drawn using filled area.
735/// An hidden surface drawing technique is used. The surface is
736/// painted with the current fill area color. The edges of each
737/// triangles are painted with the current line color.
738/// - "TRIW" : The Delaunay triangles are drawn as wire frame
739/// - "TRI1" : The Delaunay triangles are painted with color levels. The edges
740/// of each triangles are painted with the current line color.
741/// - "TRI2" : the Delaunay triangles are painted with color levels.
742/// - "P" : Draw a marker at each vertex
743/// - "P0" : Draw a circle at each vertex. Each circle background is white.
744/// - "PCOL" : Draw a marker at each vertex. The color of each marker is
745/// defined according to its Z position.
746/// - "CONT" : Draw contours
747/// - "LINE" : Draw a 3D polyline
748///
749/// A TGraph2D can be also drawn with ANY options valid to draw a 2D histogram.
750///
751/// When a TGraph2D is drawn with one of the 2D histogram drawing option,
752/// a intermediate 2D histogram is filled using the Delaunay triangles
753/// technique to interpolate the data set.
754
756{
757 TString opt = option;
758 opt.ToLower();
759 if (gPad) {
760 if (!gPad->IsEditable()) gROOT->MakeDefCanvas();
761 if (!opt.Contains("same")) {
762 //the following statement is necessary in case one attempts to draw
763 //a temporary histogram already in the current pad
764 if (TestBit(kCanDelete)) gPad->GetListOfPrimitives()->Remove(this);
765 gPad->Clear();
766 }
767 }
768 AppendPad(opt.Data());
769}
770
771
772////////////////////////////////////////////////////////////////////////////////
773/// Executes action corresponding to one event
774
776{
777 if (fHistogram) fHistogram->ExecuteEvent(event, px, py);
778}
779
780
781////////////////////////////////////////////////////////////////////////////////
782/// search object named name in the list of functions
783
785{
786 return fFunctions ? fFunctions->FindObject(name) : nullptr;
787}
788
789
790////////////////////////////////////////////////////////////////////////////////
791/// search object obj in the list of functions
792
794{
795 return fFunctions ? fFunctions->FindObject(obj) : nullptr;
796}
797
798
799////////////////////////////////////////////////////////////////////////////////
800/// Fits this graph with function with name fname
801/// Predefined functions such as gaus, expo and poln are automatically
802/// created by ROOT.
803/// fname can also be a formula, accepted by the linear fitter (linear parts divided
804/// by "++" sign), for example "x++sin(y)" for fitting "[0]*x+[1]*sin(y)"
805
807{
808
809 char *linear;
810 linear = (char*)strstr(fname, "++");
811
812 if (linear) {
813 TF2 f2(fname, fname);
814 return Fit(&f2, option, "");
815 }
816 TF2 * f2 = (TF2*)gROOT->GetFunction(fname);
817 if (!f2) {
818 Printf("Unknown function: %s", fname);
819 return -1;
820 }
821 return Fit(f2, option, "");
822
823}
824
825
826////////////////////////////////////////////////////////////////////////////////
827/// Fits this 2D graph with function f2
828///
829/// f2 is an already predefined function created by TF2.
830///
831/// See TGraph::Fit for the available fitting options and fitting notes
832///
834{
835 // internal graph2D fitting methods
837 Option_t *goption = "";
839
840 // create range and minimizer options with default values
844}
845
846
847////////////////////////////////////////////////////////////////////////////////
848/// Display a GUI panel with all graph fit options.
849///
850/// See class TFitEditor for example
851
853{
854 if (!gPad)
855 gROOT->MakeDefCanvas();
856
857 if (!gPad) {
858 Error("FitPanel", "Unable to create a default canvas");
859 return;
860 }
861
862 // use plugin manager to create instance of TFitEditor
863 TPluginHandler *handler = gROOT->GetPluginManager()->FindHandler("TFitEditor");
864 if (handler && handler->LoadPlugin() != -1) {
865 if (handler->ExecPlugin(2, gPad, this) == 0)
866 Error("FitPanel", "Unable to crate the FitPanel");
867 } else
868 Error("FitPanel", "Unable to find the FitPanel plug-in");
869
870}
871
872
873////////////////////////////////////////////////////////////////////////////////
874/// Get x axis of the graph.
875
877{
878 TH1 *h = ((TGraph2D*)this)->GetHistogram("empty");
879 if (!h) return nullptr;
880 return h->GetXaxis();
881}
882
883
884////////////////////////////////////////////////////////////////////////////////
885/// Get y axis of the graph.
886
888{
889 TH1 *h = ((TGraph2D*)this)->GetHistogram("empty");
890 if (!h) return nullptr;
891 return h->GetYaxis();
892}
893
894
895////////////////////////////////////////////////////////////////////////////////
896/// Get z axis of the graph.
897
899{
900 TH1 *h = ((TGraph2D*)this)->GetHistogram("empty");
901 if (!h) return nullptr;
902 return h->GetZaxis();
903}
904
905
906////////////////////////////////////////////////////////////////////////////////
907/// Returns the X and Y graphs building a contour. A contour level may
908/// consist in several parts not connected to each other. This function
909/// returns them in a graphs' list.
910
912{
913 if (fNpoints <= 0) {
914 Error("GetContourList", "Empty TGraph2D");
915 return nullptr;
916 }
917
918 if (!fHistogram) GetHistogram("empty");
919
921
922 return fPainter->GetContourList(contour);
923}
924
925
926////////////////////////////////////////////////////////////////////////////////
927/// This function is called by Graph2DFitChisquare.
928/// It always returns a negative value. Real implementation in TGraph2DErrors
929
931{
932 return -1;
933}
934
935
936////////////////////////////////////////////////////////////////////////////////
937/// This function is called by Graph2DFitChisquare.
938/// It always returns a negative value. Real implementation in TGraph2DErrors
939
941{
942 return -1;
943}
944
945
946////////////////////////////////////////////////////////////////////////////////
947/// This function is called by Graph2DFitChisquare.
948/// It always returns a negative value. Real implementation in TGraph2DErrors
949
951{
952 return -1;
953}
954
955
956////////////////////////////////////////////////////////////////////////////////
957/// Add a TGraphDelaunay in the list of the fHistogram's functions
958
960{
961
963
964 if (oldInterp) {
965 TGraphDelaunay *dt = new TGraphDelaunay(this);
966 dt->SetMaxIter(fMaxIter);
967 dt->SetMarginBinsContent(fZout);
968 fDelaunay = dt;
970 if (!hl->FindObject("TGraphDelaunay")) hl->Add(fDelaunay);
971 } else {
973 dt->SetMarginBinsContent(fZout);
974 fDelaunay = dt;
976 if (!hl->FindObject("TGraphDelaunay2D")) hl->Add(fDelaunay);
977 }
978}
979
980////////////////////////////////////////////////////////////////////////////////
981/// Return pointer to function with name.
982///
983/// Functions such as TGraph2D::Fit store the fitted function in the list of
984/// functions of this graph.
985
986TF2 *TGraph2D::GetFunction(const char *name) const
987{
988 return dynamic_cast<TF2*>(FindObject(name));
989}
990
991////////////////////////////////////////////////////////////////////////////////
992/// By default returns a pointer to the Delaunay histogram. If fHistogram
993/// doesn't exist, books the 2D histogram fHistogram with a margin around
994/// the hull. Calls TGraphDelaunay::Interpolate at each bin centre to build up
995/// an interpolated 2D histogram.
996///
997/// If the "empty" option is selected, returns an empty histogram booked with
998/// the limits of fX, fY and fZ. This option is used when the data set is
999/// drawn with markers only. In that particular case there is no need to
1000/// find the Delaunay triangles.
1001///
1002/// By default use the new interpolation routine based on Triangles
1003/// If the option "old" the old interpolation is used
1004
1006{
1007 // for an empty graph create histogram in [0,1][0,1]
1008 if (fNpoints <= 0) {
1009 if (!fHistogram) {
1010 // do not add the histogram to gDirectory
1011 TDirectory::TContext ctx(nullptr);
1012 fHistogram = new TH2D(GetName(), GetTitle(), fNpx , 0., 1., fNpy, 0., 1.);
1014 }
1015 return fHistogram;
1016 }
1017
1018 TString opt = option;
1019 opt.ToLower();
1020 Bool_t empty = opt.Contains("empty");
1021 Bool_t oldInterp = opt.Contains("old");
1022
1023 if (fHistogram) {
1024 if (!empty && fHistogram->GetEntries() == 0) {
1025 if (!fUserHisto) {
1026 delete fHistogram;
1027 fHistogram = nullptr;
1028 fDelaunay = nullptr;
1029 }
1030 } else if (fHistogram->GetEntries() == 0)
1031 {; }
1032 // check case if interpolation type has changed
1033 else if ( (TestBit(kOldInterpolation) && !oldInterp) || ( !TestBit(kOldInterpolation) && oldInterp ) ) {
1034 delete fHistogram;
1035 fHistogram = nullptr;
1036 fDelaunay = nullptr;
1037 }
1038 // normal case return existing histogram
1039 else {
1040 return fHistogram;
1041 }
1042 }
1043
1045
1046 // Book fHistogram if needed. It is not added in the current directory
1047 if (!fUserHisto) {
1052 hxmin = xmin - fMargin * (xmax - xmin);
1053 hymin = ymin - fMargin * (ymax - ymin);
1054 hxmax = xmax + fMargin * (xmax - xmin);
1055 hymax = ymax + fMargin * (ymax - ymin);
1056 Double_t epsilon = 1e-9;
1057 if (TMath::AreEqualRel(hxmax,hxmin,epsilon)) {
1058 if (TMath::Abs(hxmin) < epsilon) {
1059 hxmin = -0.001;
1060 hxmax = 0.001;
1061 } else {
1062 hxmin = hxmin-TMath::Abs(hxmin)*(epsilon/2.);
1063 hxmax = hxmax+TMath::Abs(hxmax)*(epsilon/2.);
1064 }
1065 }
1066 if (TMath::AreEqualRel(hymax, hymin, epsilon)) {
1067 if (TMath::Abs(hymin) < epsilon) {
1068 hymin = -0.001;
1069 hymax = 0.001;
1070 } else {
1071 hymin = hymin-TMath::Abs(hymin)*(epsilon/2.);
1072 hymax = hymax+TMath::Abs(hymax)*(epsilon/2.);
1073 }
1074 }
1075 if (fHistogram) {
1078 } else {
1079 TDirectory::TContext ctx(nullptr); // to avoid adding fHistogram to gDirectory
1080 fHistogram = new TH2D(GetName(), GetTitle(),
1081 fNpx , hxmin, hxmax,
1082 fNpy, hymin, hymax);
1084 }
1087 } else {
1092 }
1093
1094 // Option "empty" is selected. An empty histogram is returned.
1096 if (empty) {
1097 if (fMinimum != -1111) {
1098 hzmin = fMinimum;
1099 } else {
1100 hzmin = GetZminE();
1101 }
1102 if (fMaximum != -1111) {
1103 hzmax = fMaximum;
1104 } else {
1105 hzmax = GetZmaxE();
1106 }
1107 if (hzmin == hzmax) {
1108 Double_t hz = hzmin;
1109 if (hz==0) {
1110 hzmin = -0.01;
1111 hzmax = 0.01;
1112 } else {
1113 hzmin = hz - 0.01 * TMath::Abs(hz);
1114 hzmax = hz + 0.01 * TMath::Abs(hz);
1115 }
1116 }
1119 return fHistogram;
1120 }
1121
1122 Double_t dx = (hxmax - hxmin) / fNpx;
1123 Double_t dy = (hymax - hymin) / fNpy;
1124
1125 Double_t x, y, z;
1126
1127 for (Int_t ix = 1; ix <= fNpx; ix++) {
1128 x = hxmin + (ix - 0.5) * dx;
1129 for (Int_t iy = 1; iy <= fNpy; iy++) {
1130 y = hymin + (iy - 0.5) * dy;
1131 // do interpolation
1132 if (oldInterp)
1133 z = ((TGraphDelaunay*)fDelaunay)->ComputeZ(x, y);
1134 else
1135 z = ((TGraphDelaunay2D*)fDelaunay)->ComputeZ(x, y);
1136
1137 fHistogram->Fill(x, y, z);
1138 }
1139 }
1140
1141 hzmin = GetZminE();
1142 hzmax = GetZmaxE();
1145
1146 if (fMinimum != -1111) fHistogram->SetMinimum(fMinimum);
1147 if (fMaximum != -1111) fHistogram->SetMaximum(fMaximum);
1148
1149 return fHistogram;
1150}
1151
1152
1153////////////////////////////////////////////////////////////////////////////////
1154/// Returns the X maximum
1155
1157{
1158 Double_t v = fX[0];
1159 for (Int_t i = 1; i < fNpoints; i++) if (fX[i] > v) v = fX[i];
1160 return v;
1161}
1162
1163
1164////////////////////////////////////////////////////////////////////////////////
1165/// Returns the X minimum
1166
1168{
1169 Double_t v = fX[0];
1170 for (Int_t i = 1; i < fNpoints; i++) if (fX[i] < v) v = fX[i];
1171 return v;
1172}
1173
1174
1175////////////////////////////////////////////////////////////////////////////////
1176/// Returns the Y maximum
1177
1179{
1180 Double_t v = fY[0];
1181 for (Int_t i = 1; i < fNpoints; i++) if (fY[i] > v) v = fY[i];
1182 return v;
1183}
1184
1185
1186////////////////////////////////////////////////////////////////////////////////
1187/// Returns the Y minimum
1188
1190{
1191 Double_t v = fY[0];
1192 for (Int_t i = 1; i < fNpoints; i++) if (fY[i] < v) v = fY[i];
1193 return v;
1194}
1195
1196
1197////////////////////////////////////////////////////////////////////////////////
1198/// Returns the Z maximum
1199
1201{
1202 Double_t v = fZ[0];
1203 for (Int_t i = 1; i < fNpoints; i++) if (fZ[i] > v) v = fZ[i];
1204 return v;
1205}
1206
1207
1208////////////////////////////////////////////////////////////////////////////////
1209/// Returns the Z minimum
1210
1212{
1213 Double_t v = fZ[0];
1214 for (Int_t i = 1; i < fNpoints; i++) if (fZ[i] < v) v = fZ[i];
1215 return v;
1216}
1217
1218////////////////////////////////////////////////////////////////////////////////
1219/// Get x, y and z values for point number i.
1220/// The function returns -1 in case of an invalid request or the point number otherwise
1221
1223{
1224 if (i < 0 || i >= fNpoints) return -1;
1225 if (!fX || !fY || !fZ) return -1;
1226 x = fX[i];
1227 y = fY[i];
1228 z = fZ[i];
1229 return i;
1230}
1231
1232////////////////////////////////////////////////////////////////////////////////
1233/// Finds the z value at the position (x,y) thanks to
1234/// the Delaunay interpolation.
1235
1237{
1238 if (fNpoints <= 0) {
1239 Error("Interpolate", "Empty TGraph2D");
1240 return 0;
1241 }
1242
1243 if (!fHistogram) GetHistogram("empty");
1244 if (!fDelaunay) {
1246 if (!TestBit(kOldInterpolation) ) {
1247 fDelaunay = hl->FindObject("TGraphDelaunay2D");
1248 if (!fDelaunay) fDelaunay = hl->FindObject("TGraphDelaunay");
1249 }
1250 else {
1251 // if using old implementation
1252 fDelaunay = hl->FindObject("TGraphDelaunay");
1253 if (!fDelaunay) fDelaunay = hl->FindObject("TGraphDelaunay2D");
1254 }
1255 }
1256
1257 if (!fDelaunay) return TMath::QuietNaN();
1258
1260 return ((TGraphDelaunay2D*)fDelaunay)->ComputeZ(x, y);
1261 else if (fDelaunay->IsA() == TGraphDelaunay::Class() )
1262 return ((TGraphDelaunay*)fDelaunay)->ComputeZ(x, y);
1263
1264 // cannot be here
1265 assert(false);
1266 return TMath::QuietNaN();
1267}
1268
1269
1270////////////////////////////////////////////////////////////////////////////////
1271/// Paints this 2D graph with its current attributes
1272
1274{
1275 if (fNpoints <= 0) {
1276 Error("Paint", "Empty TGraph2D");
1277 return;
1278 }
1279
1280 TString opt = option;
1281 opt.ToLower();
1282 if (opt.Contains("p") && !opt.Contains("tri")) {
1283 if (!opt.Contains("pol") &&
1284 !opt.Contains("sph") &&
1285 !opt.Contains("psr")) opt.Append("tri0");
1286 }
1287
1288 if (opt.Contains("line") && !opt.Contains("tri")) opt.Append("tri0");
1289
1290 if (opt.Contains("err") && !opt.Contains("tri")) opt.Append("tri0");
1291
1292 if (opt.Contains("tri0")) {
1293 GetHistogram("empty");
1294 } else if (opt.Contains("old")) {
1295 GetHistogram("old");
1296 } else {
1297 GetHistogram();
1298 }
1299
1308 fHistogram->Paint(opt.Data());
1309}
1310
1311
1312////////////////////////////////////////////////////////////////////////////////
1313/// Print 2D graph values.
1314
1316{
1317 for (Int_t i = 0; i < fNpoints; i++) {
1318 printf("x[%d]=%g, y[%d]=%g, z[%d]=%g\n", i, fX[i], i, fY[i], i, fZ[i]);
1319 }
1320}
1321
1322
1323////////////////////////////////////////////////////////////////////////////////
1324/// Projects a 2-d graph into 1 or 2-d histograms depending on the option parameter.
1325/// option may contain a combination of the characters x,y,z:
1326///
1327/// - option = "x" return the x projection into a TH1D histogram
1328/// - option = "y" return the y projection into a TH1D histogram
1329/// - option = "xy" return the x versus y projection into a TH2D histogram
1330/// - option = "yx" return the y versus x projection into a TH2D histogram
1331
1333{
1334 if (fNpoints <= 0) {
1335 Error("Project", "Empty TGraph2D");
1336 return nullptr;
1337 }
1338
1339 TString opt = option;
1340 opt.ToLower();
1341
1342 Int_t pcase = 0;
1343 if (opt.Contains("x")) pcase = 1;
1344 if (opt.Contains("y")) pcase = 2;
1345 if (opt.Contains("xy")) pcase = 3;
1346 if (opt.Contains("yx")) pcase = 4;
1347
1348 // Create the projection histogram
1349 TH1D *h1 = nullptr;
1350 TH2D *h2 = nullptr;
1351 Int_t nch = strlen(GetName()) + opt.Length() + 2;
1352 char *name = new char[nch];
1353 snprintf(name, nch, "%s_%s", GetName(), option);
1354 nch = strlen(GetTitle()) + opt.Length() + 2;
1355 char *title = new char[nch];
1356 snprintf(title, nch, "%s_%s", GetTitle(), option);
1357
1362
1363 switch (pcase) {
1364 case 1:
1365 // "x"
1366 h1 = new TH1D(name, title, fNpx, hxmin, hxmax);
1367 break;
1368 case 2:
1369 // "y"
1370 h1 = new TH1D(name, title, fNpy, hymin, hymax);
1371 break;
1372 case 3:
1373 // "xy"
1374 h2 = new TH2D(name, title, fNpx, hxmin, hxmax, fNpy, hymin, hymax);
1375 break;
1376 case 4:
1377 // "yx"
1378 h2 = new TH2D(name, title, fNpy, hymin, hymax, fNpx, hxmin, hxmax);
1379 break;
1380 }
1381
1382 delete [] name;
1383 delete [] title;
1384 TH1 *h = h1;
1385 if (h2) h = h2;
1386 if (h == nullptr) return nullptr;
1387
1388 // Fill the projected histogram
1389 Double_t entries = 0;
1390 for (Int_t n = 0; n < fNpoints; n++) {
1391 switch (pcase) {
1392 case 1:
1393 // "x"
1394 h1->Fill(fX[n], fZ[n]);
1395 break;
1396 case 2:
1397 // "y"
1398 h1->Fill(fY[n], fZ[n]);
1399 break;
1400 case 3:
1401 // "xy"
1402 h2->Fill(fX[n], fY[n], fZ[n]);
1403 break;
1404 case 4:
1405 // "yx"
1406 h2->Fill(fY[n], fX[n], fZ[n]);
1407 break;
1408 }
1409 entries += fZ[n];
1410 }
1411 h->SetEntries(entries);
1412 return h;
1413}
1414
1415
1416////////////////////////////////////////////////////////////////////////////////
1417/// Recursively remove object from the list of functions
1418
1420{
1421 if (fFunctions) {
1424 }
1425 if (fHistogram == obj)
1426 fHistogram = nullptr;
1427}
1428
1429////////////////////////////////////////////////////////////////////////////////
1430/// Deletes point number ipoint
1431
1433{
1434 if (ipoint < 0) return -1;
1435 if (ipoint >= fNpoints) return -1;
1436
1437 fNpoints--;
1441 Int_t j = -1;
1442 for (Int_t i = 0; i < fNpoints + 1; i++) {
1443 if (i == ipoint) continue;
1444 j++;
1445 newX[j] = fX[i];
1446 newY[j] = fY[i];
1447 newZ[j] = fZ[i];
1448 }
1449 delete [] fX;
1450 delete [] fY;
1451 delete [] fZ;
1452 fX = newX;
1453 fY = newY;
1454 fZ = newZ;
1455 fSize = fNpoints;
1456 if (fHistogram) {
1457 delete fHistogram;
1458 fHistogram = nullptr;
1459 fDelaunay = nullptr;
1460 }
1461 return ipoint;
1462}
1463
1464
1465////////////////////////////////////////////////////////////////////////////////
1466/// Saves primitive as a C++ statement(s) on output stream out
1467
1468void TGraph2D::SavePrimitive(std::ostream &out, Option_t *option)
1469{
1470 TString arrx = SavePrimitiveArray(out, "graph2d_x", fNpoints, fX, kTRUE);
1471 TString arry = SavePrimitiveArray(out, "graph2d_y", fNpoints, fY);
1472 TString arrz = SavePrimitiveArray(out, "graph2d_z", fNpoints, fZ);
1473
1474 SavePrimitiveConstructor(out, Class(), "graph2d",
1475 TString::Format("%d, %s, %s, %s", fNpoints, arrx.Data(), arry.Data(), arrz.Data()), kFALSE);
1476
1477 if (strcmp(GetName(), "Graph2D"))
1478 out << " graph2d->SetName(\"" << TString(GetName()).ReplaceSpecialCppChars() << "\");\n";
1479
1480 TString title = GetTitle();
1481 if (fHistogram)
1482 title = TString(fHistogram->GetTitle()) + ";" + fHistogram->GetXaxis()->GetTitle() + ";" +
1484
1485 out << " graph2d->SetTitle(\"" << title.ReplaceSpecialCppChars() << "\");\n";
1486
1487 if (!fDirectory)
1488 out << " graph2d->SetDirectory(nullptr);\n";
1489
1490 SaveFillAttributes(out, "graph2d", 0, 1001);
1491 SaveLineAttributes(out, "graph2d", 1, 1, 1);
1492 SaveMarkerAttributes(out, "graph2d", 1, 1, 1);
1493
1494 TH1::SavePrimitiveFunctions(out, "graph2d", fFunctions);
1495
1496 if (!option || !strstr(option, "nodraw"))
1497 out << " graph2d->Draw(\"" << TString(option).ReplaceSpecialCppChars() << "\");\n";
1498}
1499
1500////////////////////////////////////////////////////////////////////////////////
1501/// Multiply the values of a TGraph2D by a constant c1.
1502///
1503/// If option contains "x" the x values are scaled
1504/// If option contains "y" the y values are scaled
1505/// If option contains "z" the z values are scaled
1506/// If option contains "xyz" all three x, y and z values are scaled
1507
1509{
1510 TString opt = option; opt.ToLower();
1511 if (opt.Contains("x")) {
1512 for (Int_t i=0; i<GetN(); i++)
1513 GetX()[i] *= c1;
1514 }
1515 if (opt.Contains("y")) {
1516 for (Int_t i=0; i<GetN(); i++)
1517 GetY()[i] *= c1;
1518 }
1519 if (opt.Contains("z")) {
1520 for (Int_t i=0; i<GetN(); i++)
1521 GetZ()[i] *= c1;
1522 }
1523}
1524
1525////////////////////////////////////////////////////////////////////////////////
1526/// Set number of points in the 2D graph.
1527/// Existing coordinates are preserved.
1528/// New coordinates above fNpoints are preset to 0.
1529
1531{
1532 if (n < 0) n = 0;
1533 if (n == fNpoints) return;
1534 if (n > fNpoints) SetPoint(n, 0, 0, 0);
1535 fNpoints = n;
1536}
1537
1538
1539////////////////////////////////////////////////////////////////////////////////
1540/// By default when an 2D graph is created, it is added to the list
1541/// of 2D graph objects in the current directory in memory.
1542/// This method removes reference to this 2D graph from current directory and add
1543/// reference to new directory dir. dir can be 0 in which case the
1544/// 2D graph does not belong to any directory.
1545
1547{
1548 if (fDirectory == dir) return;
1549 if (fDirectory) fDirectory->Remove(this);
1550 fDirectory = dir;
1551 if (fDirectory) fDirectory->Append(this);
1552}
1553
1554
1555////////////////////////////////////////////////////////////////////////////////
1556/// Sets the histogram to be filled.
1557/// If the 2D graph needs to be save in a TFile the following set should be
1558/// followed to read it back:
1559/// 1. Create TGraph2D
1560/// 2. Call g->SetHistogram(h), and do whatever you need to do
1561/// 3. Save g and h to the TFile, exit
1562/// 4. Open the TFile, retrieve g and h
1563/// 5. Call h->SetDirectory(0)
1564/// 6. Call g->SetHistogram(h) again
1565/// 7. Carry on as normal
1566///
1567/// By default use the new interpolation routine based on Triangles
1568/// If the option "old" the old interpolation is used
1569
1571{
1572 TString opt = option;
1573 opt.ToLower();
1574 Bool_t oldInterp = opt.Contains("old");
1575
1576 fUserHisto = kTRUE;
1577 fHistogram = (TH2D*)h;
1578 fNpx = h->GetNbinsX();
1579 fNpy = h->GetNbinsY();
1581}
1582
1583
1584////////////////////////////////////////////////////////////////////////////////
1585/// Sets the extra space (in %) around interpolated area for the 2D histogram
1586
1588{
1589 if (m < 0 || m > 1) {
1590 Warning("SetMargin", "The margin must be >= 0 && <= 1, fMargin set to 0.1");
1591 fMargin = 0.1;
1592 } else {
1593 fMargin = m;
1594 }
1595 if (fHistogram) {
1596 delete fHistogram;
1597 fHistogram = nullptr;
1598 fDelaunay = nullptr;
1599 }
1600}
1601
1602
1603////////////////////////////////////////////////////////////////////////////////
1604/// Sets the histogram bin height for points lying outside the TGraphDelaunay
1605/// convex hull ie: the bins in the margin.
1606
1608{
1609 fZout = z;
1610 if (fHistogram) {
1611 delete fHistogram;
1612 fHistogram = nullptr;
1613 fDelaunay = nullptr;
1614 }
1615}
1616
1617
1618////////////////////////////////////////////////////////////////////////////////
1619/// Set maximum.
1620
1622{
1623 fMaximum = maximum;
1624 TH1 * h = GetHistogram();
1625 if (h) h->SetMaximum(maximum);
1626}
1627
1628
1629////////////////////////////////////////////////////////////////////////////////
1630/// Set minimum.
1631
1633{
1634 fMinimum = minimum;
1635 TH1 * h = GetHistogram();
1636 if (h) h->SetMinimum(minimum);
1637}
1638
1639
1640////////////////////////////////////////////////////////////////////////////////
1641/// Changes the name of this 2D graph
1642
1643void TGraph2D::SetName(const char *name)
1644{
1645 // 2D graphs are named objects in a THashList.
1646 // We must update the hashlist if we change the name
1647 if (fDirectory) fDirectory->Remove(this);
1648 fName = name;
1649 if (fDirectory) fDirectory->Append(this);
1650}
1651
1652
1653////////////////////////////////////////////////////////////////////////////////
1654/// Change the name and title of this 2D graph
1655///
1656
1657void TGraph2D::SetNameTitle(const char *name, const char *title)
1658{
1659 // 2D graphs are named objects in a THashList.
1660 // We must update the hashlist if we change the name
1661 if (fDirectory) fDirectory->Remove(this);
1662 fName = name;
1663 SetTitle(title);
1664 if (fDirectory) fDirectory->Append(this);
1665}
1666
1667
1668////////////////////////////////////////////////////////////////////////////////
1669/// Sets the number of bins along X used to draw the function
1670
1672{
1673 if (npx < 4) {
1674 Warning("SetNpx", "Number of points must be >4 && < 500, fNpx set to 4");
1675 fNpx = 4;
1676 } else if (npx > 500) {
1677 Warning("SetNpx", "Number of points must be >4 && < 500, fNpx set to 500");
1678 fNpx = 500;
1679 } else {
1680 fNpx = npx;
1681 }
1682 if (fHistogram) {
1683 delete fHistogram;
1684 fHistogram = nullptr;
1685 fDelaunay = nullptr;
1686 }
1687}
1688
1689
1690////////////////////////////////////////////////////////////////////////////////
1691/// Sets the number of bins along Y used to draw the function
1692
1694{
1695 if (npy < 4) {
1696 Warning("SetNpy", "Number of points must be >4 && < 500, fNpy set to 4");
1697 fNpy = 4;
1698 } else if (npy > 500) {
1699 Warning("SetNpy", "Number of points must be >4 && < 500, fNpy set to 500");
1700 fNpy = 500;
1701 } else {
1702 fNpy = npy;
1703 }
1704 if (fHistogram) {
1705 delete fHistogram;
1706 fHistogram = nullptr;
1707 fDelaunay = nullptr;
1708 }
1709}
1710
1711
1712////////////////////////////////////////////////////////////////////////////////
1713/// Sets point number n.
1714/// If n is greater than the current size, the arrays are automatically
1715/// extended.
1716
1718{
1719 if (n < 0) return;
1720
1721 if (!fX || !fY || !fZ || n >= fSize) {
1722 // re-allocate the object
1723 Int_t newN = TMath::Max(2 * fSize, n + 1);
1724 Double_t *savex = new Double_t [newN];
1725 Double_t *savey = new Double_t [newN];
1726 Double_t *savez = new Double_t [newN];
1727 if (fX && fSize) {
1728 memcpy(savex, fX, fSize * sizeof(Double_t));
1729 memset(&savex[fSize], 0, (newN - fSize)*sizeof(Double_t));
1730 delete [] fX;
1731 }
1732 if (fY && fSize) {
1733 memcpy(savey, fY, fSize * sizeof(Double_t));
1734 memset(&savey[fSize], 0, (newN - fSize)*sizeof(Double_t));
1735 delete [] fY;
1736 }
1737 if (fZ && fSize) {
1738 memcpy(savez, fZ, fSize * sizeof(Double_t));
1739 memset(&savez[fSize], 0, (newN - fSize)*sizeof(Double_t));
1740 delete [] fZ;
1741 }
1742 fX = savex;
1743 fY = savey;
1744 fZ = savez;
1745 fSize = newN;
1746 }
1747 fX[n] = x;
1748 fY[n] = y;
1749 fZ[n] = z;
1750 fNpoints = TMath::Max(fNpoints, n + 1);
1751}
1752
1753
1754////////////////////////////////////////////////////////////////////////////////
1755/// Sets the 2D graph title.
1756///
1757/// This method allows to change the global title and the axis' titles of a 2D
1758/// graph. If `g` is the 2D graph one can do:
1759///
1760/// ~~~ {.cpp}
1761/// g->SetTitle("Graph title; X axis title; Y axis title; Z axis title");
1762/// ~~~
1763
1764void TGraph2D::SetTitle(const char* title)
1765{
1766 fTitle = title;
1767 if (fHistogram) fHistogram->SetTitle(title);
1768}
1769
1770
1771////////////////////////////////////////////////////////////////////////////////
1772/// Stream a class object
1773
1775{
1776 if (b.IsReading()) {
1777 UInt_t R__s, R__c;
1778 Version_t R__v = b.ReadVersion(&R__s, &R__c);
1779 b.ReadClassBuffer(TGraph2D::Class(), this, R__v, R__s, R__c);
1780
1782 } else {
1783 b.WriteClassBuffer(TGraph2D::Class(), this);
1784 }
1785}
#define b(i)
Definition RSha256.hxx:100
#define f(i)
Definition RSha256.hxx:104
#define g(i)
Definition RSha256.hxx:105
#define h(i)
Definition RSha256.hxx:106
#define e(i)
Definition RSha256.hxx:103
short Version_t
Definition RtypesCore.h:65
float Float_t
Definition RtypesCore.h:57
constexpr Bool_t kFALSE
Definition RtypesCore.h:94
double Double_t
Definition RtypesCore.h:59
constexpr Bool_t kTRUE
Definition RtypesCore.h:93
const char Option_t
Definition RtypesCore.h:66
#define ClassImp(name)
Definition Rtypes.h:374
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
#define gDirectory
Definition TDirectory.h:384
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 WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char filename
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t np
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t format
char name[80]
Definition TGX11.cxx:110
float xmin
float ymin
float xmax
float ymax
#define gROOT
Definition TROOT.h:406
void Printf(const char *fmt,...)
Formats a string in a circular formatting buffer and prints the string.
Definition TString.cxx:2503
R__EXTERN TSystem * gSystem
Definition TSystem.h:572
#define gPad
#define snprintf
Definition civetweb.c:1540
class describing the range in the coordinates it supports multiple range in a coordinate.
Definition DataRange.h:35
Fill Area Attributes class.
Definition TAttFill.h:20
virtual Color_t GetFillColor() const
Return the fill area color.
Definition TAttFill.h:31
virtual Style_t GetFillStyle() const
Return the fill area style.
Definition TAttFill.h:32
virtual void SetFillColor(Color_t fcolor)
Set the fill area color.
Definition TAttFill.h:38
virtual void SetFillStyle(Style_t fstyle)
Set the fill area style.
Definition TAttFill.h:40
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:239
Line Attributes class.
Definition TAttLine.h:20
virtual Color_t GetLineColor() const
Return the line color.
Definition TAttLine.h:35
virtual void SetLineStyle(Style_t lstyle)
Set the line style.
Definition TAttLine.h:44
virtual Width_t GetLineWidth() const
Return the line width.
Definition TAttLine.h:37
virtual void SetLineWidth(Width_t lwidth)
Set the line width.
Definition TAttLine.h:45
virtual void SetLineColor(Color_t lcolor)
Set the line color.
Definition TAttLine.h:42
virtual Style_t GetLineStyle() const
Return the line style.
Definition TAttLine.h:36
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:275
Marker Attributes class.
Definition TAttMarker.h:20
virtual void SaveMarkerAttributes(std::ostream &out, const char *name, Int_t coldef=1, Int_t stydef=1, Int_t sizdef=1)
Save line attributes as C++ statement(s) on output stream out.
virtual Style_t GetMarkerStyle() const
Return the marker style.
Definition TAttMarker.h:33
virtual void SetMarkerColor(Color_t mcolor=1)
Set the marker color.
Definition TAttMarker.h:39
virtual Color_t GetMarkerColor() const
Return the marker color.
Definition TAttMarker.h:32
virtual Size_t GetMarkerSize() const
Return the marker size.
Definition TAttMarker.h:34
virtual void SetMarkerStyle(Style_t mstyle=1)
Set the marker style.
Definition TAttMarker.h:41
virtual void SetMarkerSize(Size_t msize=1)
Set the marker size.
Definition TAttMarker.h:46
Class to manage histogram axis.
Definition TAxis.h:32
const char * GetTitle() const override
Returns title of object.
Definition TAxis.h:137
Double_t GetXmax() const
Definition TAxis.h:142
virtual void SetLimits(Double_t xmin, Double_t xmax)
Definition TAxis.h:166
Double_t GetXmin() const
Definition TAxis.h:141
Using a TBrowser one can browse all ROOT objects.
Definition TBrowser.h:37
Buffer base class used for serializing objects.
Definition TBuffer.h:43
TDirectory::TContext keeps track and restore the current directory.
Definition TDirectory.h:89
Describe directory structure in memory.
Definition TDirectory.h:45
virtual void Append(TObject *obj, Bool_t replace=kFALSE)
Append object to this directory.
virtual TObject * Remove(TObject *)
Remove an object from the in-memory list.
A 2-Dim function with parameters.
Definition TF2.h:29
Provides an indirection to the TFitResult class and with a semantics identical to a TFitResult pointe...
Graphics object made of three arrays X, Y and Z with the same number of points each.
Definition TGraph2D.h:41
static TClass * Class()
Int_t fMaxIter
Maximum number of iterations to find Delaunay triangles.
Definition TGraph2D.h:48
TF2 * GetFunction(const char *name) const
Return pointer to function with name.
Definition TGraph2D.cxx:986
TObject * FindObject(const char *name) const override
search object named name in the list of functions
Definition TGraph2D.cxx:784
void SetNameTitle(const char *name, const char *title) override
Change the name and title of this 2D graph.
virtual Double_t GetYminE() const
Definition TGraph2D.h:143
TGraph2D()
Graph2D default constructor.
Definition TGraph2D.cxx:238
void Build(Int_t n)
Creates the 2D graph basic data structure.
Definition TGraph2D.cxx:595
Double_t Interpolate(Double_t x, Double_t y)
Finds the z value at the position (x,y) thanks to the Delaunay interpolation.
Int_t fNpoints
Number of points in the data set.
Definition TGraph2D.h:45
virtual Double_t GetZminE() const
Definition TGraph2D.h:145
virtual Double_t GetErrorZ(Int_t bin) const
This function is called by Graph2DFitChisquare.
Definition TGraph2D.cxx:950
Double_t GetMinimum() const
Definition TGraph2D.h:117
Double_t * GetY() const
Definition TGraph2D.h:123
virtual void FitPanel()
Display a GUI panel with all graph fit options.
Definition TGraph2D.cxx:852
virtual void Apply(TF2 *f)
Apply function f to all the data points f may be a 2-D function TF2 or 3-d function TF3 The Z values ...
Definition TGraph2D.cxx:651
void SetMarginBinsContent(Double_t z=0.)
Sets the histogram bin height for points lying outside the TGraphDelaunay convex hull ie: the bins in...
Int_t fNpx
Number of bins along X in fHistogram.
Definition TGraph2D.h:46
void SavePrimitive(std::ostream &out, Option_t *option="") override
Saves primitive as a C++ statement(s) on output stream out.
virtual Double_t GetYmaxE() const
Definition TGraph2D.h:142
Double_t GetYmin() const
Returns the Y minimum.
Bool_t fUserHisto
Definition TGraph2D.h:67
Double_t GetZmin() const
Returns the Z minimum.
void Browse(TBrowser *) override
Browse.
Definition TGraph2D.cxx:664
Double_t * GetX() const
Definition TGraph2D.h:122
virtual Double_t GetZmaxE() const
Definition TGraph2D.h:144
void RecursiveRemove(TObject *obj) override
Recursively remove object from the list of functions.
Double_t * fZ
[fNpoints]
Definition TGraph2D.h:52
void Streamer(TBuffer &) override
Stream a class object.
virtual Double_t GetErrorX(Int_t bin) const
This function is called by Graph2DFitChisquare.
Definition TGraph2D.cxx:930
Double_t fMargin
Extra space (in %) around interpolated area for fHistogram.
Definition TGraph2D.h:55
Double_t fMinimum
Minimum value for plotting along z.
Definition TGraph2D.h:53
Double_t GetXmin() const
Returns the X minimum.
void Print(Option_t *chopt="") const override
Print 2D graph values.
TH2D * GetHistogram(Option_t *option="")
By default returns a pointer to the Delaunay histogram.
TVirtualHistPainter * fPainter
!Pointer to histogram painter
Definition TGraph2D.h:61
virtual TFitResultPtr Fit(const char *formula, Option_t *option="", Option_t *goption="")
Fits this graph with function with name fname Predefined functions such as gaus, expo and poln are au...
Definition TGraph2D.cxx:806
Double_t GetZmax() const
Returns the Z maximum.
Int_t RemovePoint(Int_t ipoint)
Deletes point number ipoint.
Double_t fMaximum
Maximum value for plotting along z.
Definition TGraph2D.h:54
~TGraph2D() override
TGraph2D destructor.
Definition TGraph2D.cxx:543
TAxis * GetZaxis() const
Get z axis of the graph.
Definition TGraph2D.cxx:898
void SetMargin(Double_t m=0.1)
Sets the extra space (in %) around interpolated area for the 2D histogram.
void SetName(const char *name) override
Changes the name of this 2D graph.
void SetNpy(Int_t npx=40)
Sets the number of bins along Y used to draw the function.
Double_t fZout
fHistogram bin height for points lying outside the interpolated area
Definition TGraph2D.h:56
void SetTitle(const char *title="") override
Sets the 2D graph title.
TH2D * fHistogram
!2D histogram of z values linearly interpolated on the triangles
Definition TGraph2D.h:58
virtual Double_t GetXminE() const
Definition TGraph2D.h:141
TList * GetContourList(Double_t contour)
Returns the X and Y graphs building a contour.
Definition TGraph2D.cxx:911
Double_t GetXmax() const
Returns the X maximum.
virtual Int_t GetPoint(Int_t i, Double_t &x, Double_t &y, Double_t &z) const
Get x, y and z values for point number i.
TAxis * GetYaxis() const
Get y axis of the graph.
Definition TGraph2D.cxx:887
virtual Double_t GetErrorY(Int_t bin) const
This function is called by Graph2DFitChisquare.
Definition TGraph2D.cxx:940
TObject * fDelaunay
! Pointer to Delaunay interpolator object
Definition TGraph2D.h:59
TH1 * Project(Option_t *option="x") const
Projects a 2-d graph into 1 or 2-d histograms depending on the option parameter.
Int_t GetN() const
Definition TGraph2D.h:121
virtual Double_t GetXmaxE() const
Definition TGraph2D.h:140
virtual void Set(Int_t n)
Set number of points in the 2D graph.
void SetMinimum(Double_t minimum=-1111)
Set minimum.
TGraph2D & operator=(const TGraph2D &)
Graph2D operator "=".
Definition TGraph2D.cxx:552
Double_t * fX
[fNpoints]
Definition TGraph2D.h:50
Double_t * fY
[fNpoints] Data set to be plotted
Definition TGraph2D.h:51
virtual void SetHistogram(TH2 *h, Option_t *option="")
Sets the histogram to be filled.
void SetMaximum(Double_t maximum=-1111)
Set maximum.
virtual void Add(TF2 *f, Double_t c1=1)
Performs the operation: z = z + c1*f(x,y,z) Errors are not recalculated.
Definition TGraph2D.cxx:635
Double_t GetYmax() const
Returns the Y maximum.
Int_t DistancetoPrimitive(Int_t px, Int_t py) override
Computes distance from point px,py to a graph.
Definition TGraph2D.cxx:723
virtual void SetDirectory(TDirectory *dir)
By default when an 2D graph is created, it is added to the list of 2D graph objects in the current di...
TDirectory * fDirectory
!Pointer to directory holding this 2D graph
Definition TGraph2D.h:60
void Clear(Option_t *option="") override
Free all memory allocated by this object.
Definition TGraph2D.cxx:674
virtual void Scale(Double_t c1=1., Option_t *option="z")
Multiply the values of a TGraph2D by a constant c1.
virtual void DirectoryAutoAdd(TDirectory *)
Perform the automatic addition of the graph to the given directory.
Definition TGraph2D.cxx:708
void CreateInterpolator(Bool_t oldInterp)
Add a TGraphDelaunay in the list of the fHistogram's functions.
Definition TGraph2D.cxx:959
Int_t fNpy
Number of bins along Y in fHistogram.
Definition TGraph2D.h:47
TList * fFunctions
Pointer to list of functions (fits and user)
Definition TGraph2D.h:57
virtual void SetPoint(Int_t point, Double_t x, Double_t y, Double_t z)
Sets point number n.
void Paint(Option_t *option="") override
Paints this 2D graph with its current attributes.
void ExecuteEvent(Int_t event, Int_t px, Int_t py) override
Executes action corresponding to one event.
Definition TGraph2D.cxx:775
void Draw(Option_t *option="P0") override
Specific drawing options can be used to paint a TGraph2D:
Definition TGraph2D.cxx:755
Int_t fSize
!Real size of fX, fY and fZ
Definition TGraph2D.h:49
@ kOldInterpolation
Definition TGraph2D.h:70
TAxis * GetXaxis() const
Get x axis of the graph.
Definition TGraph2D.cxx:876
Double_t * GetZ() const
Definition TGraph2D.h:124
void SetNpx(Int_t npx=40)
Sets the number of bins along X used to draw the function.
TGraphDelaunay2D generates a Delaunay triangulation of a TGraph2D.
static TClass * Class()
TGraphDelaunay generates a Delaunay triangulation of a TGraph2D.
static TClass * Class()
1-D histogram with a double per channel (see TH1 documentation)
Definition TH1.h:695
TH1 is the base class of all histogram classes in ROOT.
Definition TH1.h:59
TAxis * GetZaxis()
Definition TH1.h:343
Int_t DistancetoPrimitive(Int_t px, Int_t py) override
Compute distance from point px,py to a line.
Definition TH1.cxx:2795
void SetTitle(const char *title) override
Change/set the title.
Definition TH1.cxx:6721
@ kNoStats
Don't draw stats box.
Definition TH1.h:176
TAxis * GetXaxis()
Definition TH1.h:341
TVirtualHistPainter * GetPainter(Option_t *option="")
Return pointer to painter.
Definition TH1.cxx:4489
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...
Definition TH1.cxx:8537
virtual void SetMaximum(Double_t maximum=-1111)
Definition TH1.h:421
virtual Int_t Fill(Double_t x)
Increment bin with abscissa X by 1.
Definition TH1.cxx:3316
TAxis * GetYaxis()
Definition TH1.h:342
virtual void SetMinimum(Double_t minimum=-1111)
Definition TH1.h:422
virtual Double_t GetEntries() const
Return the current number of entries.
Definition TH1.cxx:4401
TList * GetListOfFunctions() const
Definition TH1.h:261
void Paint(Option_t *option="") override
Control routine to paint any kind of histograms.
Definition TH1.cxx:6209
void ExecuteEvent(Int_t event, Int_t px, Int_t py) override
Execute action corresponding to one event.
Definition TH1.cxx:3212
virtual void Sumw2(Bool_t flag=kTRUE)
Create structure to store sum of squares of weights.
Definition TH1.cxx:9012
static Bool_t AddDirectoryStatus()
Static function: cannot be inlined on Windows/NT.
Definition TH1.cxx:742
static void SavePrimitiveFunctions(std::ostream &out, const char *varname, TList *lst)
Save list of functions Also can be used by TGraph classes.
Definition TH1.cxx:7427
2-D histogram with a double per channel (see TH1 documentation)
Definition TH2.h:356
Service class for 2-D histogram classes.
Definition TH2.h:30
Int_t Fill(Double_t) override
Invalid Fill method.
Definition TH2.cxx:357
A doubly linked list.
Definition TList.h:38
TObject * FindObject(const char *name) const override
Find an object in this list using its name.
Definition TList.cxx:576
void RecursiveRemove(TObject *obj) override
Remove object from this collection and recursively remove the object from all other objects (and coll...
Definition TList.cxx:762
void Delete(Option_t *option="") override
Remove all objects from the list AND delete all heap based objects.
Definition TList.cxx:468
The TNamed class is the base class for all named ROOT classes.
Definition TNamed.h:29
const char * GetName() const override
Returns name of object.
Definition TNamed.h:49
const char * GetTitle() const override
Returns title of object.
Definition TNamed.h:50
TString fTitle
Definition TNamed.h:33
TString fName
Definition TNamed.h:32
Mother of all ROOT objects.
Definition TObject.h:41
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
Definition TObject.h:203
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
Definition TObject.cxx:1040
virtual void AppendPad(Option_t *option="")
Append graphics object to current pad.
Definition TObject.cxx:203
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
Definition TObject.cxx:847
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
Definition TObject.cxx:1054
virtual TClass * IsA() const
Definition TObject.h:247
void MakeZombie()
Definition TObject.h:53
static TString SavePrimitiveArray(std::ostream &out, const char *prefix, Int_t len, Double_t *arr, Bool_t empty_line=kFALSE)
Save array in the output stream "out".
Definition TObject.cxx:786
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
void ResetBit(UInt_t f)
Definition TObject.h:202
@ kCanDelete
if object in a list can be deleted
Definition TObject.h:66
@ kInvalidObject
if object ctor succeeded but object should not be used
Definition TObject.h:76
@ kMustCleanup
if object destructor must call RecursiveRemove()
Definition TObject.h:68
Longptr_t ExecPlugin(int nargs)
Int_t LoadPlugin()
Load the plugin library for this handler.
Basic string class.
Definition TString.h:139
Ssiz_t Length() const
Definition TString.h:417
void ToLower()
Change string to lower-case.
Definition TString.cxx:1182
TString & ReplaceSpecialCppChars()
Find special characters which are typically used in printf() calls and replace them by appropriate es...
Definition TString.cxx:1114
const char * Data() const
Definition TString.h:376
TString & Append(const char *cs)
Definition TString.h:572
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:2378
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
Definition TString.h:632
virtual Bool_t ExpandPathName(TString &path)
Expand a pathname getting rid of special shell characters like ~.
Definition TSystem.cxx:1274
virtual TList * GetContourList(Double_t contour) const =0
TLine * line
Double_t y[n]
Definition legend1.C:17
return c1
Definition legend1.C:41
Double_t x[n]
Definition legend1.C:17
const Int_t n
Definition legend1.C:16
TH1F * h1
Definition legend1.C:5
TFitResultPtr FitObject(TH1 *h1, TF1 *f1, Foption_t &option, const ROOT::Math::MinimizerOptions &moption, const char *goption, ROOT::Fit::DataRange &range)
fitting function for a TH1 (called from TH1::Fit)
Definition HFitImpl.cxx:977
void FitOptionsMake(EFitObjectType type, const char *option, Foption_t &fitOption)
Decode list of options into fitOption.
Definition HFitImpl.cxx:685
Short_t Max(Short_t a, Short_t b)
Returns the largest of a and b.
Definition TMathBase.h:250
Double_t QuietNaN()
Returns a quiet NaN as defined by IEEE 754.
Definition TMath.h:906
Bool_t AreEqualRel(Double_t af, Double_t bf, Double_t relPrec)
Comparing floating points.
Definition TMath.h:426
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.
Definition TMathBase.h:123
th1 Draw()
TMarker m
Definition textangle.C:8