Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
TGraph.cxx
Go to the documentation of this file.
1// @(#)root/hist:$Id$
2// Author: Rene Brun, Olivier Couet 12/12/94
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
13#include "TROOT.h"
14#include "TBuffer.h"
15#include "TEnv.h"
16#include "TGraph.h"
17#include "TGraphErrors.h"
18#include "TGraphAsymmErrors.h"
19#include "TGraphBentErrors.h"
20#include "TH1.h"
21#include "TF1.h"
22#include "TStyle.h"
23#include "TMath.h"
24#include "TVectorD.h"
25#include "Foption.h"
26#include "TRandom.h"
27#include "TSpline.h"
28#include "TVirtualFitter.h"
29#include "TVirtualPad.h"
31#include "TBrowser.h"
32#include "TSystem.h"
33#include "TPluginManager.h"
34#include "strtok.h"
35
36#include <cstdlib>
37#include <string>
38#include <cassert>
39#include <iostream>
40#include <fstream>
41#include <cstring>
42#include <numeric>
43#include <limits>
44#include <iomanip>
45
46#include "HFitInterface.h"
47#include "Fit/DataRange.h"
49
51
52
53////////////////////////////////////////////////////////////////////////////////
54
55/** \class TGraph
56 \ingroup Graphs
57A TGraph is an object made of two arrays X and Y with npoints each.
58The TGraph painting is performed thanks to the TGraphPainter
59class. All details about the various painting options are given in this class.
60
61#### Notes
62
63 - Unlike histogram or tree (or even TGraph2D), TGraph objects
64 are not automatically attached to the current TFile, in order to keep the
65 management and size of the TGraph as small as possible.
66 - The TGraph constructors do not have the TGraph title and name as parameters.
67 A TGraph has the default title and name "Graph". To change the default title
68 and name `SetTitle` and `SetName` should be called on the TGraph after its creation.
69 TGraph was a light weight object to start with, like TPolyline or TPolyMarker.
70 That’s why it did not have any title and name parameters in the constructors.
71
72#### Example
73
74The picture below gives an example:
75
76Begin_Macro(source)
77{
78 double x[100], y[100];
79 int n = 20;
80 for (int i=0;i<n;i++) {
81 x[i] = i*0.1;
82 y[i] = 10*sin(x[i]+0.2);
83 }
84 auto g = new TGraph(n,x,y);
85 g->SetTitle("Graph title;X title;Y title");
86 g->Draw("AC*");
87}
88End_Macro
89
90#### Default X-Points
91
92If one doesn't specify the points in the x-axis, they will get the default values 0, 1, 2, 3, (etc. depending
93on the length of the y-points):
94
95Begin_Macro(source)
96{
97 double y[6] = {3, 8, 1, 10, 5, 7};
98 auto g = new TGraph(6,y);
99 g->SetTitle("A Graph with default X points");
100 g->Draw();
101}
102End_Macro
103
104#### X-axis zooming
105
106The underlying x axis of a TGraph is based on a virtual fixed binwidth histogram, which means that one can not infinitely zoom on it, just down to one bin.
107The number of virtual bins is the maximum between 100 and the number of points in the TGraph. If you find a case where you would like to zoom deeper than allowed,
108you can either start canvas in web mode, or keep in classic mode but predefine the histogram before the first drawing of the graph:
109
110\code{.cpp}
111TGraph gr;
112for(auto i = 0; i < 100; ++i) gr.AddPoint(i,i);
113gr.AddPoint(10000, 0);
114// If one draws here, one can not zoom between x = 0 and x = 50, since first bin goes from x = 0 to 100.
115auto h1 = new TH1F("hist", "hist", 10000, -10., 11000.); // Define underlying hist with 10000 instead of 101 bins
116h1->SetMaximum(120);
117h1->SetStats(0);
118h1->SetDirectory(nullptr);
119gr.SetHistogram(h1);
120gr.Draw("A*")
121\endcode
122
123*/
124
125////////////////////////////////////////////////////////////////////////////////
126/// Graph default constructor.
127
129{
130 fNpoints = -1; //will be reset to 0 in CtorAllocate
131 if (!CtorAllocate()) return;
132}
133
134////////////////////////////////////////////////////////////////////////////////
135/// Constructor with only the number of points set
136/// the arrays x and y will be set later
137
139 : TNamed("Graph", "Graph"), TAttFill(0, 1000)
140{
141 fNpoints = n;
142 if (!CtorAllocate()) return;
143 FillZero(0, fNpoints);
144}
145
146////////////////////////////////////////////////////////////////////////////////
147/// Graph normal constructor with ints.
148
150 : TNamed("Graph", "Graph"), TAttFill(0, 1000)
151{
152 if (!x || !y) {
153 fNpoints = 0;
154 } else {
155 fNpoints = n;
156 }
157 if (!CtorAllocate()) return;
158 for (Int_t i = 0; i < n; i++) {
159 fX[i] = (Double_t)x[i];
160 fY[i] = (Double_t)y[i];
161 }
162}
163
164////////////////////////////////////////////////////////////////////////////////
165/// Graph normal constructor with floats.
166
168 : TNamed("Graph", "Graph"), TAttFill(0, 1000)
169{
170 if (!x || !y) {
171 fNpoints = 0;
172 } else {
173 fNpoints = n;
174 }
175 if (!CtorAllocate()) return;
176 for (Int_t i = 0; i < n; i++) {
177 fX[i] = x[i];
178 fY[i] = y[i];
179 }
180}
181
182////////////////////////////////////////////////////////////////////////////////
183/// Default X-Points constructor. The points along the x-axis get the default
184/// values `start`, `start+step`, `start+2*step`, `start+3*step`, etc ...
185
187 : TNamed("Graph", "Graph"), TAttFill(0, 1000)
188{
189 if (!y) {
190 fNpoints = 0;
191 } else {
192 fNpoints = n;
193 }
194 if (!CtorAllocate()) return;
195 for (Int_t i = 0; i < n; i++) {
196 fX[i] = start+i*step;
197 fY[i] = y[i];
198 }
199}
200
201////////////////////////////////////////////////////////////////////////////////
202/// Graph normal constructor with doubles.
203
205 : TNamed("Graph", "Graph"), TAttFill(0, 1000)
206{
207 if (!x || !y) {
208 fNpoints = 0;
209 } else {
210 fNpoints = n;
211 }
212 if (!CtorAllocate()) return;
213 n = fNpoints * sizeof(Double_t);
214 memcpy(fX, x, n);
215 memcpy(fY, y, n);
216}
217
218////////////////////////////////////////////////////////////////////////////////
219/// Copy constructor for this graph
220
223{
227 else fFunctions = new TList;
228 if (gr.fHistogram) {
230 fHistogram->SetDirectory(nullptr);
231 } else {
232 fHistogram = nullptr;
233 }
236 if (!fMaxSize) {
237 fX = fY = nullptr;
238 return;
239 } else {
240 fX = new Double_t[fMaxSize];
241 fY = new Double_t[fMaxSize];
242 }
243
244 Int_t n = gr.GetN() * sizeof(Double_t);
245 memcpy(fX, gr.fX, n);
246 memcpy(fY, gr.fY, n);
247}
248
249////////////////////////////////////////////////////////////////////////////////
250/// Equal operator for this graph
251
253{
254 if (this != &gr) {
256 TAttLine::operator=(gr);
257 TAttFill::operator=(gr);
258 TAttMarker::operator=(gr);
259
262
263 // delete list of functions and their contents before copying it
264 if (fFunctions) {
265 // delete previous lists of functions
266 if (!fFunctions->IsEmpty()) {
268 // use TList::Remove to take into account the case the same object is
269 // added multiple times in the list
270 TObject *obj;
271 while ((obj = fFunctions->First())) {
272 while (fFunctions->Remove(obj)) { }
273 delete obj;
274 }
275 }
276 delete fFunctions;
277 }
278
280 else fFunctions = new TList;
281
282 if (fHistogram) delete fHistogram;
283 if (gr.fHistogram) {
284 fHistogram = new TH1F(*(gr.fHistogram));
285 fHistogram->SetDirectory(nullptr);
286 } else {
287 fHistogram = nullptr;
288 }
289
292 if (fX) delete [] fX;
293 if (fY) delete [] fY;
294 if (!fMaxSize) {
295 fX = fY = nullptr;
296 return *this;
297 } else {
298 fX = new Double_t[fMaxSize];
299 fY = new Double_t[fMaxSize];
300 }
301
302 Int_t n = gr.GetN() * sizeof(Double_t);
303 if (n > 0) {
304 memcpy(fX, gr.fX, n);
305 memcpy(fY, gr.fY, n);
306 }
307 }
308 return *this;
309}
310
311////////////////////////////////////////////////////////////////////////////////
312/// Graph constructor with two vectors of floats in input
313/// A graph is build with the X coordinates taken from vx and Y coord from vy
314/// The number of points in the graph is the minimum of number of points
315/// in vx and vy.
316
318 : TNamed("Graph", "Graph"), TAttFill(0, 1000)
319{
320 fNpoints = TMath::Min(vx.GetNrows(), vy.GetNrows());
321 if (!CtorAllocate()) return;
322 Int_t ivxlow = vx.GetLwb();
323 Int_t ivylow = vy.GetLwb();
324 for (Int_t i = 0; i < fNpoints; i++) {
325 fX[i] = vx(i + ivxlow);
326 fY[i] = vy(i + ivylow);
327 }
328}
329
330////////////////////////////////////////////////////////////////////////////////
331/// Graph constructor with two vectors of doubles in input
332/// A graph is build with the X coordinates taken from vx and Y coord from vy
333/// The number of points in the graph is the minimum of number of points
334/// in vx and vy.
335
337 : TNamed("Graph", "Graph"), TAttFill(0, 1000)
338{
339 fNpoints = TMath::Min(vx.GetNrows(), vy.GetNrows());
340 if (!CtorAllocate()) return;
341 Int_t ivxlow = vx.GetLwb();
342 Int_t ivylow = vy.GetLwb();
343 for (Int_t i = 0; i < fNpoints; i++) {
344 fX[i] = vx(i + ivxlow);
345 fY[i] = vy(i + ivylow);
346 }
347}
348
349////////////////////////////////////////////////////////////////////////////////
350/// Graph constructor importing its parameters from the TH1 object passed as argument
351
353 : TNamed("Graph", "Graph"), TAttFill(0, 1000)
354{
355 if (!h) {
356 Error("TGraph", "Pointer to histogram is null");
357 fNpoints = 0;
358 return;
359 }
360 if (h->GetDimension() != 1) {
361 Error("TGraph", "Histogram must be 1-D; h %s is %d-D", h->GetName(), h->GetDimension());
362 fNpoints = 0;
363 } else {
364 fNpoints = ((TH1*)h)->GetXaxis()->GetNbins();
365 }
366
367 if (!CtorAllocate()) return;
368
369 TAxis *xaxis = ((TH1*)h)->GetXaxis();
370 for (Int_t i = 0; i < fNpoints; i++) {
371 fX[i] = xaxis->GetBinCenter(i + 1);
372 fY[i] = h->GetBinContent(i + 1);
373 }
374 h->TAttLine::Copy(*this);
375 h->TAttFill::Copy(*this);
376 h->TAttMarker::Copy(*this);
377
378 std::string gname = "Graph_from_" + std::string(h->GetName());
379 SetName(gname.c_str());
380 SetTitle(h->GetTitle());
381}
382
383////////////////////////////////////////////////////////////////////////////////
384/// Graph constructor importing its parameters from the TF1 object passed as argument
385/// - if option =="" (default), a TGraph is created with points computed
386/// at the fNpx points of f.
387/// - if option =="d", a TGraph is created with points computed with the derivatives
388/// at the fNpx points of f.
389/// - if option =="i", a TGraph is created with points computed with the integral
390/// at the fNpx points of f.
391/// - if option =="I", a TGraph is created with points computed with the integral
392/// at the fNpx+1 points of f and the integral is normalized to 1.
393
395 : TNamed("Graph", "Graph"), TAttFill(0, 1000)
396{
397 char coption = ' ';
398 if (!f) {
399 Error("TGraph", "Pointer to function is null");
400 fNpoints = 0;
401 } else {
402 fNpoints = f->GetNpx();
403 if (option) coption = *option;
404 if (coption == 'i' || coption == 'I') fNpoints++;
405 }
406 if (!CtorAllocate()) return;
407
408 Double_t xmin = f->GetXmin();
409 Double_t xmax = f->GetXmax();
410 Double_t dx = (xmax - xmin) / fNpoints;
411 Double_t integ = 0;
412 Int_t i;
413 for (i = 0; i < fNpoints; i++) {
414 if (coption == 'i' || coption == 'I') {
415 fX[i] = xmin + i * dx;
416 if (i == 0) fY[i] = 0;
417 else fY[i] = integ + ((TF1*)f)->Integral(fX[i] - dx, fX[i]);
418 integ = fY[i];
419 } else if (coption == 'd' || coption == 'D') {
420 fX[i] = xmin + (i + 0.5) * dx;
421 fY[i] = ((TF1*)f)->Derivative(fX[i]);
422 } else {
423 fX[i] = xmin + (i + 0.5) * dx;
424 fY[i] = ((TF1*)f)->Eval(fX[i]);
425 }
426 }
427 if (integ != 0 && coption == 'I') {
428 for (i = 1; i < fNpoints; i++) fY[i] /= integ;
429 }
430
431 f->TAttLine::Copy(*this);
432 f->TAttFill::Copy(*this);
433 f->TAttMarker::Copy(*this);
434
435 SetName(f->GetName());
436 SetTitle(f->GetTitle());
437}
438
439////////////////////////////////////////////////////////////////////////////////
440/// Graph constructor reading input from filename.
441///
442/// `filename` is assumed to contain at least two columns of numbers.
443/// The string format is by default `"%lg %lg"`.
444/// This is a standard c formatting for `scanf()`.
445/// For example, set format to `"%lg,%lg"` for a comma-separated file.
446///
447/// If columns of numbers should be skipped, a `"%*lg"` or `"%*s"` for each column
448/// can be added, e.g. `"%lg %*lg %lg"` would read x-values from the first and
449/// y-values from the third column.
450///
451/// For files separated by a specific delimiter different from ' ' and '\\t' (e.g.
452/// ';' in csv files) you can avoid using `%*s` to bypass this delimiter by explicitly
453/// specify the `option` argument,
454/// e.g. option=`" \\t,;"` for columns of figures separated by any of these characters
455/// (' ', '\\t', ',', ';')
456/// used once (e.g. `"1;1"`) or in a combined way (`" 1;,;; 1"`).
457/// Note in that case, the instantiation is about two times slower.
458
459TGraph::TGraph(const char *filename, const char *format, Option_t *option)
460 : TNamed("Graph", filename), TAttFill(0, 1000)
461{
462 Double_t x, y;
465
466 std::ifstream infile(fname.Data());
467 if (!infile.good()) {
468 MakeZombie();
469 Error("TGraph", "Cannot open file: %s, TGraph is Zombie", filename);
470 fNpoints = 0;
471 return;
472 } else {
473 fNpoints = 100; //initial number of points
474 }
475 if (!CtorAllocate()) return;
476 std::string line;
477 Int_t np = 0;
478
479 // No delimiters specified (standard constructor).
480 if (strcmp(option, "") == 0) {
481
482 while (std::getline(infile, line, '\n')) {
483 if (2 != sscanf(line.c_str(), format, &x, &y)) {
484 continue; //skip empty and ill-formed lines
485 }
486 SetPoint(np, x, y);
487 np++;
488 }
489 Set(np);
490
491 // A delimiter has been specified in "option"
492 } else {
493
494 // Checking format and creating its boolean counterpart
496 format_.ReplaceAll(" ", "") ;
497 format_.ReplaceAll("\t", "") ;
498 format_.ReplaceAll("lg", "") ;
499 format_.ReplaceAll("s", "") ;
500 format_.ReplaceAll("%*", "0") ;
501 format_.ReplaceAll("%", "1") ;
502 if (!format_.IsDigit()) {
503 Error("TGraph", "Incorrect input format! Allowed formats are {\"%%lg\",\"%%*lg\" or \"%%*s\"}");
504 return;
505 }
506 Int_t ntokens = format_.Length() ;
507 if (ntokens < 2) {
508 Error("TGraph", "Incorrect input format! Only %d tag(s) in format whereas 2 \"%%lg\" tags are expected!", ntokens);
509 return;
510 }
513 for (Int_t idx = 0; idx < ntokens; idx++) {
514 isTokenToBeSaved[idx] = TString::Format("%c", format_[idx]).Atoi() ; //atoi(&format_[idx]) does not work for some reason...
515 if (isTokenToBeSaved[idx] == 1) {
517 }
518 }
519 if (ntokens >= 2 && ntokensToBeSaved != 2) { //first condition not to repeat the previous error message
520 Error("TGraph", "Incorrect input format! There are %d \"%%lg\" tag(s) in format whereas 2 and only 2 are expected!", ntokensToBeSaved);
521 delete [] isTokenToBeSaved ;
522 return;
523 }
524
525 // Initializing loop variables
526 Bool_t isLineToBeSkipped = kFALSE ; //empty and ill-formed lines
527 char * token = nullptr ;
528 TString token_str = "" ;
529 Int_t token_idx = 0 ;
530 Double_t * value = new Double_t [2] ; //x,y buffers
531 Int_t value_idx = 0 ;
532
533 // Looping
534 char *rest;
535 while (std::getline(infile, line, '\n')) {
536 if (!line.empty()) {
537 if (line[line.size() - 1] == char(13)) { // removing DOS CR character
538 line.erase(line.end() - 1, line.end()) ;
539 }
540 //token = R__STRTOK_R(const_cast<char *>(line.c_str()), option, rest);
541 token = R__STRTOK_R(const_cast<char *>(line.c_str()), option, &rest);
542 while (token != nullptr && value_idx < 2) {
544 token_str = TString(token) ;
545 token_str.ReplaceAll("\t", "") ;
546 if (!token_str.IsFloat()) {
548 break ;
549 } else {
550 value[value_idx] = token_str.Atof() ;
551 value_idx++ ;
552 }
553 }
554 token = R__STRTOK_R(nullptr, option, &rest); // next token
555 token_idx++ ;
556 }
557 if (!isLineToBeSkipped && value_idx == 2) {
558 x = value[0] ;
559 y = value[1] ;
560 SetPoint(np, x, y) ;
561 np++ ;
562 }
563 }
565 token = nullptr ;
566 token_idx = 0 ;
567 value_idx = 0 ;
568 }
569 Set(np) ;
570
571 // Cleaning
572 delete [] isTokenToBeSaved ;
573 delete [] value ;
574 delete token ;
575 }
576 infile.close();
577 if (fNpoints == 0) {
578 Warning("TGraph", "No points were found in file %s with the specified input format %s", filename, format);
579 return;
580 }
581}
582
583////////////////////////////////////////////////////////////////////////////////
584/// Graph default destructor.
585
587{
588 delete [] fX;
589 delete [] fY;
590 if (fFunctions) {
592 //special logic to support the case where the same object is
593 //added multiple times in fFunctions.
594 //This case happens when the same object is added with different
595 //drawing modes
596 TObject *obj;
597 while ((obj = fFunctions->First())) {
598 while (fFunctions->Remove(obj)) { }
599 delete obj;
600 }
601 delete fFunctions;
602 fFunctions = nullptr; //to avoid accessing a deleted object in RecursiveRemove
603 }
604 delete fHistogram;
605}
606
607////////////////////////////////////////////////////////////////////////////////
608/// Allocate internal data structures for `newsize` points.
609
614
615////////////////////////////////////////////////////////////////////////////////
616/// Allocate arrays.
617
619{
620 if (arraySize < 0) {
621 arraySize = 0;
622 }
624 if (!arraySize) {
625 for (Int_t i = 0; i < Narrays; ++i)
626 newarrays[i] = nullptr;
627 } else {
628 for (Int_t i = 0; i < Narrays; ++i)
629 newarrays[i] = new Double_t[arraySize];
630 }
631 fMaxSize = arraySize;
632 return newarrays;
633}
634
635////////////////////////////////////////////////////////////////////////////////
636/// Performs the operation: `y = y + c1*f(x,y)`
637/// Errors are not recalculated.
638///
639/// \param f may be a 1-D function TF1 or 2-d function TF2
640/// \param c1 a scaling factor, 1 by default
641
643{
645
646 for (Int_t i = 0; i < fNpoints; i++) {
647 fY[i] += c1*f->Eval(fX[i], fY[i]);
648 }
649 if (gPad) gPad->Modified();
650}
651
652////////////////////////////////////////////////////////////////////////////////
653/// Apply function f to all the data points
654/// f may be a 1-D function TF1 or 2-d function TF2
655/// The Y values of the graph are replaced by the new values computed
656/// using the function
657
659{
661
662 for (Int_t i = 0; i < fNpoints; i++) {
663 fY[i] = f->Eval(fX[i], fY[i]);
664 }
665 if (gPad) gPad->Modified();
666}
667
668////////////////////////////////////////////////////////////////////////////////
669/// Browse
670
672{
673 TString opt = gEnv->GetValue("TGraph.BrowseOption", "");
674 if (opt.IsNull()) {
675 opt = b ? b->GetDrawOption() : "alp";
676 opt = (opt == "") ? "alp" : opt.Data();
677 }
678 Draw(opt.Data());
679 gPad->Update();
680}
681
682////////////////////////////////////////////////////////////////////////////////
683/// Return the chisquare of this graph with respect to f1.
684/// The chisquare is computed as the sum of the quantity below at each point:
685/// \f[
686/// \frac{(y-f1(x))^{2}}{ey^{2}+(\frac{1}{2}(exl+exh)f1'(x))^{2}}
687/// \f]
688/// where x and y are the graph point coordinates and f1'(x) is the derivative of function f1(x).
689/// This method to approximate the uncertainty in y because of the errors in x, is called
690/// "effective variance" method.
691/// In case of a pure TGraph, the denominator is 1.
692/// In case of a TGraphErrors or TGraphAsymmErrors the errors are taken
693/// into account.
694/// By default the range of the graph is used whatever function range.
695/// Use option "R" to use the function range
696
698{
699 if (!func) {
700 Error("Chisquare","Function pointer is Null - return -1");
701 return -1;
702 }
703
704 TString opt(option); opt.ToUpper();
705 bool useRange = opt.Contains("R");
706
707 return ROOT::Fit::Chisquare(*this, *func,useRange);
708}
709
710////////////////////////////////////////////////////////////////////////////////
711/// Return kTRUE if point number "left"'s argument (angle with respect to positive
712/// x-axis) is bigger than that of point number "right". Can be used by Sort.
713
715{
716 Double_t xl = 0, yl = 0, xr = 0, yr = 0;
717 gr->GetPoint(left, xl, yl);
718 gr->GetPoint(right, xr, yr);
719 return (TMath::ATan2(yl, xl) > TMath::ATan2(yr, xr));
720}
721
722////////////////////////////////////////////////////////////////////////////////
723/// Return kTRUE if fX[left] > fX[right]. Can be used by Sort.
724
726{
727 return gr->fX[left] > gr->fX[right];
728}
729
730////////////////////////////////////////////////////////////////////////////////
731/// Return kTRUE if fY[left] > fY[right]. Can be used by Sort.
732
734{
735 return gr->fY[left] > gr->fY[right];
736}
737
738////////////////////////////////////////////////////////////////////////////////
739/// Return kTRUE if point number "left"'s distance to origin is bigger than
740/// that of point number "right". Can be used by Sort.
741
743{
744 return gr->fX[left] * gr->fX[left] + gr->fY[left] * gr->fY[left]
745 > gr->fX[right] * gr->fX[right] + gr->fY[right] * gr->fY[right];
746}
747
748////////////////////////////////////////////////////////////////////////////////
749/// Compute the x/y range of the points in this graph
750
752{
753 if (fNpoints <= 0) {
754 xmin = xmax = ymin = ymax = 0;
755 return;
756 }
757 xmin = xmax = fX[0];
758 ymin = ymax = fY[0];
759
760 Double_t xminl = 0; // Positive minimum. Used in case of log scale along X axis.
761 Double_t yminl = 0; // Positive minimum. Used in case of log scale along Y axis.
762
763 for (Int_t i = 1; i < fNpoints; i++) {
764 if (fX[i] < xmin) xmin = fX[i];
765 if (fX[i] > xmax) xmax = fX[i];
766 if (fY[i] < ymin) ymin = fY[i];
767 if (fY[i] > ymax) ymax = fY[i];
768 if (ymin>0 && (yminl==0 || ymin<yminl)) yminl = ymin;
769 if (xmin>0 && (xminl==0 || xmin<xminl)) xminl = xmin;
770 }
771
772 if (gPad && gPad->GetLogy() && yminl>0) ymin = yminl;
773 if (gPad && gPad->GetLogx() && xminl>0) xmin = xminl;
774}
775
776////////////////////////////////////////////////////////////////////////////////
777/// Copy points from fX and fY to arrays[0] and arrays[1]
778/// or to fX and fY if arrays == 0 and ibegin != iend.
779/// If newarrays is non null, replace fX, fY with pointers from newarrays[0,1].
780/// Delete newarrays, old fX and fY
781
784{
786 if (newarrays) {
787 delete[] fX;
788 fX = newarrays[0];
789 delete[] fY;
790 fY = newarrays[1];
791 delete[] newarrays;
792 }
793}
794
795////////////////////////////////////////////////////////////////////////////////
796/// Copy points from fX and fY to arrays[0] and arrays[1]
797/// or to fX and fY if arrays == 0 and ibegin != iend.
798
801{
802 if (ibegin < 0 || iend <= ibegin || obegin < 0) { // Error;
803 return kFALSE;
804 }
805 if (!arrays && ibegin == obegin) { // No copying is needed
806 return kFALSE;
807 }
808 Int_t n = (iend - ibegin) * sizeof(Double_t);
809 if (arrays) {
810 memmove(&arrays[0][obegin], &fX[ibegin], n);
811 memmove(&arrays[1][obegin], &fY[ibegin], n);
812 } else {
813 memmove(&fX[obegin], &fX[ibegin], n);
814 memmove(&fY[obegin], &fY[ibegin], n);
815 }
816 return kTRUE;
817}
818
819////////////////////////////////////////////////////////////////////////////////
820/// In constructors set fNpoints than call this method.
821/// Return kFALSE if the graph will contain no points.
822///Note: This function should be called only from the constructor
823/// since it does not delete previously existing arrays
824
826{
827 fHistogram = nullptr;
828 fMaximum = -1111;
829 fMinimum = -1111;
831 fFunctions = new TList;
832 if (fNpoints <= 0) {
833 fNpoints = 0;
834 fMaxSize = 0;
835 fX = nullptr;
836 fY = nullptr;
837 return kFALSE;
838 } else {
840 fX = new Double_t[fMaxSize];
841 fY = new Double_t[fMaxSize];
842 }
843 return kTRUE;
844}
845
846////////////////////////////////////////////////////////////////////////////////
847/// Draw this graph with its current attributes.
848///
849/// The options to draw a graph are described in TGraphPainter class.
850
852{
853 TString opt = option;
854 opt.ToLower();
855
856 if (opt.Contains("same")) {
857 opt.ReplaceAll("same", "");
858 }
859
860 // in case of option *, set marker style to 3 (star) and replace
861 // * option by option P.
862 Ssiz_t pos;
863 if ((pos = opt.Index("*")) != kNPOS) {
865 opt.Replace(pos, 1, "p");
866 }
867
868 // If no option is specified, it is defined as "alp" in case there is
869 // no current pad or if the current pad has no axis defined and if there is
870 // no default option set using TGraph::SetOption. If fOption is set using
871 // TGraph::SetOption, it is used as default option.
872 if ((!option || !strlen(option))) {
873 Option_t *topt = (!fOption.IsNull()) ? fOption.Data() : "alp";
874 if (gPad) {
875 if (!gPad->GetListOfPrimitives()->FindObject("TFrame"))
876 opt = topt;
877 } else {
878 opt = topt;
879 }
880 }
881
882 if (gPad) {
883 if (!gPad->IsEditable()) gROOT->MakeDefCanvas();
884 if (opt.Contains("a")) gPad->Clear();
885 }
886
887 AppendPad(opt);
888
889 gPad->IncrementPaletteColor(1, opt);
890
891}
892
893////////////////////////////////////////////////////////////////////////////////
894/// Compute distance from point px,py to a graph.
895///
896/// Compute the closest distance of approach from point px,py to this line.
897/// The distance is computed in pixels units.
898
900{
902 if (painter) return painter->DistancetoPrimitiveHelper(this, px, py);
903 else return 0;
904}
905
906////////////////////////////////////////////////////////////////////////////////
907/// Draw this graph with new attributes.
908
910{
911 TGraph *newgraph = new TGraph(n, x, y);
915 newgraph->SetBit(kCanDelete);
916 newgraph->AppendPad(option);
917}
918
919////////////////////////////////////////////////////////////////////////////////
920/// Draw this graph with new attributes.
921
923{
924 TGraph *newgraph = new TGraph(n, x, y);
928 newgraph->SetBit(kCanDelete);
929 newgraph->AppendPad(option);
930}
931
932////////////////////////////////////////////////////////////////////////////////
933/// Draw this graph with new attributes.
934
936{
937 const Double_t *xx = x;
938 const Double_t *yy = y;
939 if (!xx) xx = fX;
940 if (!yy) yy = fY;
941 TGraph *newgraph = new TGraph(n, xx, yy);
945 newgraph->SetBit(kCanDelete);
946 newgraph->AppendPad(option);
947}
948
949////////////////////////////////////////////////////////////////////////////////
950/// Display a panel with all graph drawing options.
951
953{
955 if (painter) painter->DrawPanelHelper(this);
956}
957
958////////////////////////////////////////////////////////////////////////////////
959/// Interpolate points in this graph at x using a TSpline.
960///
961/// - if spline==0 and option="" a linear interpolation between the two points
962/// close to x is computed. If x is outside the graph range, a linear
963/// extrapolation is computed.
964/// - if spline==0 and option="S" a TSpline3 object is created using this graph
965/// and the interpolated value from the spline is returned.
966/// the internally created spline is deleted on return.
967/// - if spline is specified, it is used to return the interpolated value.
968///
969/// If the points are sorted in X a binary search is used (significantly faster)
970/// One needs to set the bit TGraph::SetBit(TGraph::kIsSortedX) before calling
971/// TGraph::Eval to indicate that the graph is sorted in X.
972
974{
975
976 if (spline) {
977 //spline interpolation using the input spline
978 return spline->Eval(x);
979 }
980
981 if (fNpoints == 0) return 0;
982 if (fNpoints == 1) return fY[0];
983
984 if (option && *option) {
985 TString opt = option;
986 opt.ToLower();
987 // create a TSpline every time when using option "s" and no spline pointer is given
988 if (opt.Contains("s")) {
989
990 // points must be sorted before using a TSpline
991 std::vector<Double_t> xsort(fNpoints);
992 std::vector<Double_t> ysort(fNpoints);
993 std::vector<Int_t> indxsort(fNpoints);
994 TMath::Sort(fNpoints, fX, &indxsort[0], false);
995 for (Int_t i = 0; i < fNpoints; ++i) {
996 xsort[i] = fX[ indxsort[i] ];
997 ysort[i] = fY[ indxsort[i] ];
998 }
999
1000 // spline interpolation creating a new spline
1001 TSpline3 s("", &xsort[0], &ysort[0], fNpoints);
1002 Double_t result = s.Eval(x);
1003 return result;
1004 }
1005 }
1006 //linear interpolation
1007 //In case x is < fX[0] or > fX[fNpoints-1] return the extrapolated point
1008
1009 //find points in graph around x assuming points are not sorted
1010 // (if point are sorted use a binary search)
1011 Int_t low = -1;
1012 Int_t up = -1;
1015 if (low == -1) {
1016 // use first two points for doing an extrapolation
1017 low = 0;
1018 }
1019 if (fX[low] == x) return fY[low];
1020 if (low == fNpoints-1) low--; // for extrapolating
1021 up = low+1;
1022 }
1023 else {
1024 // case TGraph is not sorted
1025
1026 // find neighbours simply looping all points
1027 // and find also the 2 adjacent points: (low2 < low < x < up < up2 )
1028 // needed in case x is outside the graph ascissa interval
1029 Int_t low2 = -1;
1030 Int_t up2 = -1;
1031
1032 for (Int_t i = 0; i < fNpoints; ++i) {
1033 if (fX[i] < x) {
1034 if (low == -1 || fX[i] > fX[low]) {
1035 low2 = low;
1036 low = i;
1037 } else if (low2 == -1) low2 = i;
1038 } else if (fX[i] > x) {
1039 if (up == -1 || fX[i] < fX[up]) {
1040 up2 = up;
1041 up = i;
1042 } else if (up2 == -1) up2 = i;
1043 } else // case x == fX[i]
1044 return fY[i]; // no interpolation needed
1045 }
1046
1047 // treat cases when x is outside graph min max abscissa
1048 if (up == -1) {
1049 up = low;
1050 low = low2;
1051 }
1052 if (low == -1) {
1053 low = up;
1054 up = up2;
1055 }
1056 }
1057 // do now the linear interpolation
1058 assert(low != -1 && up != -1);
1059
1060 if (fX[low] == fX[up]) return fY[low];
1061 Double_t yn = fY[up] + (x - fX[up]) * (fY[low] - fY[up]) / (fX[low] - fX[up]);
1062 return yn;
1063}
1064
1065////////////////////////////////////////////////////////////////////////////////
1066/// Execute action corresponding to one event.
1067///
1068/// This member function is called when a graph is clicked with the locator
1069///
1070/// If Left button clicked on one of the line end points, this point
1071/// follows the cursor until button is released.
1072///
1073/// if Middle button clicked, the line is moved parallel to itself
1074/// until the button is released.
1075
1077{
1079 if (painter) painter->ExecuteEventHelper(this, event, px, py);
1080}
1081
1082////////////////////////////////////////////////////////////////////////////////
1083/// If array sizes <= newsize, expand storage to 2*newsize.
1084
1086{
1088 CopyAndRelease(ps, 0, 0, 0);
1089}
1090
1091////////////////////////////////////////////////////////////////////////////////
1092/// If graph capacity is less than newsize points then make array sizes
1093/// equal to least multiple of step to contain newsize points.
1094
1096{
1097 if (newsize <= fMaxSize) {
1098 return;
1099 }
1100 Double_t **ps = Allocate(step * (newsize / step + (newsize % step ? 1 : 0)));
1101 CopyAndRelease(ps, 0, fNpoints, 0);
1102}
1103
1104////////////////////////////////////////////////////////////////////////////////
1105/// if size > fMaxSize allocate new arrays of 2*size points and copy iend first
1106/// points.
1107/// Return pointer to new arrays.
1108
1110{
1111 if (size <= fMaxSize)
1112 return nullptr;
1114 CopyPoints(newarrays, 0, iend, 0);
1115 return newarrays;
1116}
1117
1118////////////////////////////////////////////////////////////////////////////////
1119/// Set zero values for point arrays in the range [begin, end)
1120/// Should be redefined in descendant classes
1121
1123{
1124 memset(fX + begin, 0, (end - begin)*sizeof(Double_t));
1125 memset(fY + begin, 0, (end - begin)*sizeof(Double_t));
1126}
1127
1128////////////////////////////////////////////////////////////////////////////////
1129/// Search object named name in the list of functions
1130
1132{
1133 return fFunctions ? fFunctions->FindObject(name) : nullptr;
1134}
1135
1136////////////////////////////////////////////////////////////////////////////////
1137/// Search object obj in the list of functions
1138
1140{
1141 return fFunctions ? fFunctions->FindObject(obj) : nullptr;
1142}
1143
1144////////////////////////////////////////////////////////////////////////////////
1145/// Fit this graph with function f1.
1146///
1147/// \param[in] f1 pointer to the function object
1148/// \param[in] option string defining the fit options (see table below).
1149/// \param[in] goption specify a list of graphics options. See TGraph::Draw and TGraphPainter for a complete list of these possible options.
1150/// \param[in] rxmin lower fitting range
1151/// \param[in] rxmax upper fitting range
1152///
1153/// \anchor GFitOpt
1154/// ### Graph Fitting Options
1155/// The list of fit options is given in parameter option.
1156///
1157/// option | description
1158/// -------|------------
1159/// "S" | The full result of the fit is returned in the `TFitResultPtr`. This is needed to get the covariance matrix of the fit. See `TFitResult` and the base class `ROOT::Math::FitResult`.
1160/// "W" | Ignore all point errors when fitting a TGraphErrors or TGraphAsymmErrors
1161/// "F" | Uses the default minimizer (e.g. Minuit) when fitting a linear function (e.g. polN) instead of the linear fitter.
1162/// "U" | Uses a user specified objective function (e.g. user providedlikelihood function) defined using `TVirtualFitter::SetFCN`
1163/// "E" | Performs a better parameter errors estimation using the Minos technique for all fit parameters.
1164/// "M" | Uses the IMPROVE algorithm (available only in TMinuit). This algorithm attempts improve the found local minimum by searching for a better one.
1165/// "Q" | Quiet mode (minimum printing)
1166/// "V" | Verbose mode (default is between Q and V)
1167/// "+" | Adds this new fitted function to the list of fitted functions. By default, the previous function is deleted and only the last one is kept.
1168/// "N" | Does not store the graphics function, does not draw the histogram with the function after fitting.
1169/// "0" | Does not draw the histogram and the fitted function after fitting, but in contrast to option "N", it stores the fitted function in the histogram list of functions.
1170/// "R" | Fit using a fitting range specified in the function range with `TF1::SetRange`.
1171/// "B" | Use this option when you want to fix one or more parameters and the fitting function is a predefined one (e.g gaus, expo,..), otherwise in case of pre-defined functions, some default initial values and limits are set.
1172/// "C" | In case of linear fitting, do no calculate the chisquare (saves CPU time).
1173/// "G" | Uses the gradient implemented in `TF1::GradientPar` for the minimization. This allows to use Automatic Differentiation when it is supported by the provided TF1 function.
1174/// "EX0" | When fitting a TGraphErrors or TGraphAsymErrors do not consider errors in the X coordinates
1175/// "ROB" | In case of linear fitting, compute the LTS regression coefficients (robust (resistant) regression), using the default fraction of good points "ROB=0.x" - compute the LTS regression coefficients, using 0.x as a fraction of good points
1176///
1177///
1178/// This function is used for fitting also the derived TGraph classes such as TGraphErrors or TGraphAsymmErrors.
1179/// See the note below on how the errors are used when fitting a TGraphErrors or TGraphAsymmErrors.
1180///
1181/// The fitting of the TGraph, i.e simple data points without any error associated, is performed using the
1182/// un-weighted least-square (chi-square) method.
1183///
1184///
1185///\anchor GFitErrors
1186/// ### TGraphErrors fit:
1187///
1188/// In case of a TGraphErrors or TGraphAsymmErrors object, when `x` errors are present, the error along x,
1189/// is projected along the y-direction by calculating the function at the points `x-ex_low` and
1190/// `x+ex_high`, where `ex_low` and `ex_high` are the corresponding lower and upper error in x.
1191/// The chi-square is then computed as the sum of the quantity below at each data point:
1192///
1193/// \f[
1194/// \frac{(y-f(x))^{2}}{ey^{2}+(\frac{1}{2}(exl+exh)f'(x))^{2}}
1195/// \f]
1196///
1197/// where `x` and `y` are the point coordinates, and `f'(x)` is the derivative of the
1198/// function `f(x)`.
1199///
1200/// In case of asymmetric errors, if the function lies below (above) the data point, `ey` is `ey_low` (`ey_high`).
1201///
1202/// The approach used to approximate the uncertainty in y because of the
1203/// errors in x is to make it equal the error in x times the slope of the line.
1204/// This approach is called "effective variance method" and
1205/// the implementation is provided in the function FitUtil::EvaluateChi2Effective
1206///
1207/// \anchor GFitLinear
1208/// ### Linear fitting:
1209/// When the fitting function is linear (contains the `++` sign) or the fitting
1210/// function is a polynomial, a linear fitter is initialised.
1211/// To create a linear function, use the following syntax: linear parts
1212/// separated by `++` sign.
1213/// Example: to fit the parameters of the function `p0*x + p1*sin(x)`, you can create a
1214/// TF1 object as
1215///
1216/// TF1 *f1 = new TF1("f1", "x++sin(x)", xmin, xmax);
1217///
1218/// For such a TF1 you don't have to set the initial conditions and the linear fitter is used.
1219/// Going via the linear fitter for functions, linear in parameters, gives a
1220/// considerable advantage in speed.
1221/// When using the linear fitting it is also possible to perform a robust fitting with the
1222/// Least Trimmed Square (LTS) regression algorithm, by using the fit option `ROB`.
1223/// See the tutorial `fitLinearRobust.C`.
1224///
1225/// ### Notes on TGraph/TGraphErrors Fitting:
1226///
1227/// 1. By using the "effective variance" method a simple linear regression
1228/// becomes a non-linear case, which takes several iterations
1229/// instead of 0 as in the linear case.
1230/// 2. The effective variance technique assumes that there is no correlation
1231/// between the x and y coordinate.
1232/// 3. The standard chi2 (least square) method without error in the coordinates (x) can
1233/// be forced by using option "EX0"
1234/// 4. The linear fitter doesn't take into account the errors in x. When fitting a
1235/// TGraphErrors with a linear functions the errors in x will not be considered.
1236/// If errors in x are important, use option "F" for linear function fitting.
1237/// 5. When fitting a TGraph (i.e. no errors associated with each point),
1238/// a correction is applied to the errors on the parameters with the following
1239/// formula:
1240/// `parameter_error *= sqrt(chisquare/(ndf-1))`
1241///
1242/// ### General Fitting documentation
1243///
1244/// See in TH1::Fit for the documentation of
1245/// - [Fit Result](\ref HFitRes)
1246/// - [Fit Status](\ref HFitStatus)
1247/// - [Fit Statistics Box](\ref HFitStatBox)
1248/// - [Fitting in a Range](\ref HFitRange)
1249/// - [Setting Initial Conditions](\ref HFitInitial)
1250
1260
1261////////////////////////////////////////////////////////////////////////////////
1262/// Fit this graph with function with name `fname`.
1263///
1264/// This is a different interface to TGraph fitting using TGraph::Fit(TF1 *f1,Option_t *, Option_t *, Axis_t, Axis_t)
1265/// See there for the details about fitting a TGraph.
1266///
1267/// The parameter `fname` is the name of an already predefined function created by TF1 or TF2
1268/// Predefined functions such as gaus, expo and poln are automatically
1269/// created by ROOT.
1270///
1271/// The parameter `fname` can also be a formula, accepted by the linear fitter (linear parts divided
1272/// by "++" sign), for example "x++sin(x)" for fitting "[0]*x+[1]*sin(x)"
1273
1275{
1276 const char *linear = fname ? strstr(fname, "++") : nullptr;
1277 if (linear) {
1278 TF1 f1(fname, fname, xmin, xmax);
1279 return Fit(&f1, option, "", xmin, xmax);
1280 }
1281 TF1 * f1 = (TF1*)gROOT->GetFunction(fname);
1282 if (!f1) {
1283 Printf("Unknown function: %s", fname);
1284 return -1;
1285 }
1286 return Fit(f1, option, "", xmin, xmax);
1287}
1288
1289////////////////////////////////////////////////////////////////////////////////
1290/// Display a GUI panel with all graph fit options.
1291///
1292/// See class TFitEditor for example
1293
1295{
1296 if (!gPad)
1297 gROOT->MakeDefCanvas();
1298
1299 if (!gPad) {
1300 Error("FitPanel", "Unable to create a default canvas");
1301 return;
1302 }
1303
1304 // use plugin manager to create instance of TFitEditor
1305 TPluginHandler *handler = gROOT->GetPluginManager()->FindHandler("TFitEditor");
1306 if (handler && handler->LoadPlugin() != -1) {
1307 if (handler->ExecPlugin(2, gPad, this) == 0)
1308 Error("FitPanel", "Unable to crate the FitPanel");
1309 } else
1310 Error("FitPanel", "Unable to find the FitPanel plug-in");
1311}
1312
1313////////////////////////////////////////////////////////////////////////////////
1314/// Return graph correlation factor
1315
1317{
1318 Double_t rms1 = GetRMS(1);
1319 if (rms1 == 0) return 0;
1320 Double_t rms2 = GetRMS(2);
1321 if (rms2 == 0) return 0;
1322 return GetCovariance() / rms1 / rms2;
1323}
1324
1325////////////////////////////////////////////////////////////////////////////////
1326/// Return covariance of vectors x,y
1327
1329{
1330 if (fNpoints <= 0) return 0;
1331 Double_t sum = fNpoints, sumx = 0, sumy = 0, sumxy = 0;
1332
1333 for (Int_t i = 0; i < fNpoints; i++) {
1334 sumx += fX[i];
1335 sumy += fY[i];
1336 sumxy += fX[i] * fY[i];
1337 }
1338 return sumxy / sum - sumx / sum * sumy / sum;
1339}
1340
1341////////////////////////////////////////////////////////////////////////////////
1342/// Return mean value of X (axis=1) or Y (axis=2)
1343
1345{
1346 if (axis < 1 || axis > 2) return 0;
1347 if (fNpoints <= 0) return 0;
1348 Double_t sumx = 0;
1349 for (Int_t i = 0; i < fNpoints; i++) {
1350 if (axis == 1) sumx += fX[i];
1351 else sumx += fY[i];
1352 }
1353 return sumx / fNpoints;
1354}
1355
1356////////////////////////////////////////////////////////////////////////////////
1357/// Return RMS of X (axis=1) or Y (axis=2)
1358
1360{
1361 if (axis < 1 || axis > 2) return 0;
1362 if (fNpoints <= 0) return 0;
1363 Double_t sumx = 0, sumx2 = 0;
1364 for (Int_t i = 0; i < fNpoints; i++) {
1365 if (axis == 1) {
1366 sumx += fX[i];
1367 sumx2 += fX[i] * fX[i];
1368 } else {
1369 sumx += fY[i];
1370 sumx2 += fY[i] * fY[i];
1371 }
1372 }
1373 Double_t x = sumx / fNpoints;
1375 return TMath::Sqrt(rms2);
1376}
1377
1378////////////////////////////////////////////////////////////////////////////////
1379/// It always returns a negative value. Real implementation in TGraphErrors
1380
1382{
1383 return -1;
1384}
1385
1386////////////////////////////////////////////////////////////////////////////////
1387/// It always returns a negative value. Real implementation in TGraphErrors
1388
1390{
1391 return -1;
1392}
1393
1394////////////////////////////////////////////////////////////////////////////////
1395/// It always returns a negative value. Real implementation in TGraphErrors
1396/// and TGraphAsymmErrors
1397
1399{
1400 return -1;
1401}
1402
1403////////////////////////////////////////////////////////////////////////////////
1404/// It always returns a negative value. Real implementation in TGraphErrors
1405/// and TGraphAsymmErrors
1406
1408{
1409 return -1;
1410}
1411
1412////////////////////////////////////////////////////////////////////////////////
1413/// It always returns a negative value. Real implementation in TGraphErrors
1414/// and TGraphAsymmErrors
1415
1417{
1418 return -1;
1419}
1420
1421////////////////////////////////////////////////////////////////////////////////
1422/// It always returns a negative value. Real implementation in TGraphErrors
1423/// and TGraphAsymmErrors
1424
1426{
1427 return -1;
1428}
1429
1430////////////////////////////////////////////////////////////////////////////////
1431/// Return pointer to function with name.
1432///
1433/// Functions such as TGraph::Fit store the fitted function in the list of
1434/// functions of this graph.
1435
1436TF1 *TGraph::GetFunction(const char *name) const
1437{
1438 return dynamic_cast<TF1*>(FindObject(name));
1439}
1440
1441////////////////////////////////////////////////////////////////////////////////
1442/// Returns a pointer to the histogram used to draw the axis
1443/// Takes into account the two following cases.
1444/// 1. option 'A' was specified in TGraph::Draw. Return fHistogram
1445/// 2. user had called TPad::DrawFrame. return pointer to hframe histogram
1446
1448{
1451
1452 ComputeRange(rwxmin, rwymin, rwxmax, rwymax); //this is redefined in TGraphErrors
1453
1454 // (if fHistogram exist) && (if the log scale is on) &&
1455 // (if the computed range minimum is > 0) && (if the fHistogram minimum is zero)
1456 // then it means fHistogram limits have been computed in linear scale
1457 // therefore they might be too strict and cut some points. In that case the
1458 // fHistogram limits should be recomputed ie: the existing fHistogram
1459 // should not be returned.
1460 TH1F *histogr = nullptr;
1461 if (fHistogram) {
1462 if (!TestBit(kResetHisto)) {
1463 if (gPad && gPad->GetLogx()) {
1464 if (rwxmin <= 0 || fHistogram->GetXaxis()->GetXmin() != 0) return fHistogram;
1465 } else if (gPad && gPad->GetLogy()) {
1467 } else {
1468 return fHistogram;
1469 }
1470 } else {
1471 const_cast <TGraph*>(this)->ResetBit(kResetHisto);
1472 }
1474 }
1475
1476 if (rwxmin == rwxmax) rwxmax += 1.;
1477 if (rwymin == rwymax) rwymax += 1.;
1478 dx = 0.1 * (rwxmax - rwxmin);
1479 dy = 0.1 * (rwymax - rwymin);
1480 uxmin = rwxmin - dx;
1481 uxmax = rwxmax + dx;
1482 minimum = rwymin - dy;
1483 maximum = rwymax + dy;
1484
1485 if (fMinimum != -1111) minimum = fMinimum;
1486 if (fMaximum != -1111) maximum = fMaximum;
1487
1488 // the graph is created with at least as many channels as there are points
1489 // to permit zooming on the full range
1490 if (uxmin < 0 && rwxmin >= 0) {
1491 if (gPad && gPad->GetLogx()) uxmin = 0.9 * rwxmin;
1492 else uxmin = 0;
1493 }
1494 if (uxmax > 0 && rwxmax <= 0) {
1495 if (gPad && gPad->GetLogx()) uxmax = 1.1 * rwxmax;
1496 else uxmax = 0;
1497 }
1498
1499 if (minimum < 0 && rwymin >= 0) minimum = 0.9 * rwymin;
1500
1501 if (minimum <= 0 && gPad && gPad->GetLogy()) minimum = 0.001 * maximum;
1502 if (uxmin <= 0 && gPad && gPad->GetLogx()) {
1503 if (uxmax > 1000) uxmin = 1;
1504 else uxmin = 0.001 * uxmax;
1505 }
1506
1507 rwxmin = uxmin;
1508 rwxmax = uxmax;
1509 Int_t npt = 100;
1510 if (fNpoints > npt) npt = fNpoints;
1511 const char *gname = GetName();
1512 if (!gname[0]) gname = "Graph";
1513 // do not add the histogram to gDirectory
1514 // use local TDirectory::TContext that will set temporarly gDirectory to a nullptr and
1515 // will avoid that histogram is added in the global directory
1516 {
1517 TDirectory::TContext ctx(nullptr);
1518 ((TGraph*)this)->fHistogram = new TH1F(gname, GetTitle(), npt, rwxmin, rwxmax);
1519 }
1520 if (!fHistogram) return nullptr;
1525 // Restore the axis attributes if needed
1526 if (histogr) {
1527 fHistogram->GetXaxis()->SetTitle(histogr->GetXaxis()->GetTitle());
1528 fHistogram->GetXaxis()->CenterTitle(histogr->GetXaxis()->GetCenterTitle());
1529 fHistogram->GetXaxis()->RotateTitle(histogr->GetXaxis()->GetRotateTitle());
1530 fHistogram->GetXaxis()->SetNoExponent(histogr->GetXaxis()->GetNoExponent());
1531 fHistogram->GetXaxis()->SetTimeDisplay(histogr->GetXaxis()->GetTimeDisplay());
1532 fHistogram->GetXaxis()->SetTimeFormat(histogr->GetXaxis()->GetTimeFormat());
1533 histogr->GetXaxis()->TAttAxis::Copy(*(fHistogram->GetXaxis()));
1534
1535 fHistogram->GetYaxis()->SetTitle(histogr->GetYaxis()->GetTitle());
1536 fHistogram->GetYaxis()->CenterTitle(histogr->GetYaxis()->GetCenterTitle());
1537 fHistogram->GetYaxis()->RotateTitle(histogr->GetYaxis()->GetRotateTitle());
1538 fHistogram->GetYaxis()->SetNoExponent(histogr->GetYaxis()->GetNoExponent());
1539 fHistogram->GetYaxis()->SetTimeDisplay(histogr->GetYaxis()->GetTimeDisplay());
1540 fHistogram->GetYaxis()->SetTimeFormat(histogr->GetYaxis()->GetTimeFormat());
1541 histogr->GetYaxis()->TAttAxis::Copy(*(fHistogram->GetYaxis()));
1542
1543 delete histogr;
1544 }
1545 return fHistogram;
1546}
1547
1548////////////////////////////////////////////////////////////////////////////////
1549/// Get x and y values for point number i.
1550/// The function returns -1 in case of an invalid request or the point number otherwise
1551
1553{
1554 if (i < 0 || i >= fNpoints || !fX || !fY) return -1;
1555 x = fX[i];
1556 y = fY[i];
1557 return i;
1558}
1559
1560////////////////////////////////////////////////////////////////////////////////
1561/// Get x value for point i.
1562
1564{
1565 if (i < 0 || i >= fNpoints || !fX)
1566 return -1.;
1567
1568 return fX[i];
1569}
1570
1571////////////////////////////////////////////////////////////////////////////////
1572/// Get y value for point i.
1573
1575{
1576 if (i < 0 || i >= fNpoints || !fY)
1577 return -1.;
1578
1579 return fY[i];
1580}
1581
1582////////////////////////////////////////////////////////////////////////////////
1583/// Get x axis of the graph.
1584
1586{
1587 auto h = GetHistogram();
1588 return h ? h->GetXaxis() : nullptr;
1589}
1590
1591////////////////////////////////////////////////////////////////////////////////
1592/// Get y axis of the graph.
1593
1595{
1596 auto h = GetHistogram();
1597 return h ? h->GetYaxis() : nullptr;
1598}
1599
1600////////////////////////////////////////////////////////////////////////////////
1601/// Implementation to get information on point of graph at cursor position
1602/// Adapted from class TH1
1603
1605{
1606 if (!gPad) {
1607 Error("GetObjectInfo", "Cannot be used without gPad");
1608 return nullptr;
1609 }
1610
1611 // localize point
1612 Int_t ipoint = -2;
1613 // start with a small window (in case the mouse is very close to one point)
1614 for (Int_t i = 0; i < fNpoints; i++) {
1615 Int_t dpx = px - gPad->XtoAbsPixel(gPad->XtoPad(fX[i]));
1616 Int_t dpy = py - gPad->YtoAbsPixel(gPad->YtoPad(fY[i]));
1617
1618 if (dpx * dpx + dpy * dpy < 25) {
1619 ipoint = i;
1620 break;
1621 }
1622 }
1623
1624 Double_t x = gPad->PadtoX(gPad->AbsPixeltoX(px));
1625 Double_t y = gPad->PadtoY(gPad->AbsPixeltoY(py));
1626
1627 if (ipoint == -2)
1628 return Form("x=%g, y=%g", x, y);
1629
1632
1633 return Form("x=%g, y=%g, point=%d, xval=%g, yval=%g", x, y, ipoint, xval, yval);
1634}
1635
1636////////////////////////////////////////////////////////////////////////////////
1637/// Compute Initial values of parameters for a gaussian.
1638
1640{
1641 Double_t allcha, sumx, sumx2, x, val, rms, mean;
1642 Int_t bin;
1643 const Double_t sqrtpi = 2.506628;
1644
1645 // Compute mean value and RMS of the graph in the given range
1646 if (xmax <= xmin) {
1647 xmin = fX[0];
1648 xmax = fX[fNpoints-1];
1649 }
1650 Int_t np = 0;
1651 allcha = sumx = sumx2 = 0;
1652 for (bin = 0; bin < fNpoints; bin++) {
1653 x = fX[bin];
1654 if (x < xmin || x > xmax) continue;
1655 np++;
1656 val = fY[bin];
1657 sumx += val * x;
1658 sumx2 += val * x * x;
1659 allcha += val;
1660 }
1661 if (np == 0 || allcha == 0) return;
1662 mean = sumx / allcha;
1663 rms = TMath::Sqrt(sumx2 / allcha - mean * mean);
1665 if (rms == 0) rms = 1;
1667 TF1 *f1 = (TF1*)grFitter->GetUserFunc();
1668 f1->SetParameter(0, binwidx * allcha / (sqrtpi * rms));
1669 f1->SetParameter(1, mean);
1670 f1->SetParameter(2, rms);
1671 f1->SetParLimits(2, 0, 10 * rms);
1672}
1673
1674////////////////////////////////////////////////////////////////////////////////
1675/// Compute Initial values of parameters for an exponential.
1676
1678{
1680 Int_t ifail;
1681 if (xmax <= xmin) {
1682 xmin = fX[0];
1683 xmax = fX[fNpoints-1];
1684 }
1686
1688
1690 TF1 *f1 = (TF1*)grFitter->GetUserFunc();
1692 f1->SetParameter(1, slope);
1693}
1694
1695////////////////////////////////////////////////////////////////////////////////
1696/// Compute Initial values of parameters for a polynom.
1697
1699{
1700 Double_t fitpar[25];
1701
1703 TF1 *f1 = (TF1*)grFitter->GetUserFunc();
1704 Int_t npar = f1->GetNpar();
1705 if (xmax <= xmin) {
1706 xmin = fX[0];
1707 xmax = fX[fNpoints-1];
1708 }
1709
1711
1712 for (Int_t i = 0; i < npar; i++) f1->SetParameter(i, fitpar[i]);
1713}
1714
1715////////////////////////////////////////////////////////////////////////////////
1716/// Insert a new point at the mouse position
1717
1719{
1720 if (!gPad) {
1721 Error("InsertPoint", "Cannot be used without gPad, requires last mouse position");
1722 return -1;
1723 }
1724
1725 Int_t px = gPad->GetEventX();
1726 Int_t py = gPad->GetEventY();
1727
1728 //localize point where to insert
1729 Int_t ipoint = -2;
1730 Int_t i, d = 0;
1731 // start with a small window (in case the mouse is very close to one point)
1732 for (i = 0; i < fNpoints - 1; i++) {
1733 d = DistancetoLine(px, py, gPad->XtoPad(fX[i]), gPad->YtoPad(fY[i]), gPad->XtoPad(fX[i+1]), gPad->YtoPad(fY[i+1]));
1734 if (d < 5) {
1735 ipoint = i + 1;
1736 break;
1737 }
1738 }
1739 if (ipoint == -2) {
1740 //may be we are far from one point, try again with a larger window
1741 for (i = 0; i < fNpoints - 1; i++) {
1742 d = DistancetoLine(px, py, gPad->XtoPad(fX[i]), gPad->YtoPad(fY[i]), gPad->XtoPad(fX[i+1]), gPad->YtoPad(fY[i+1]));
1743 if (d < 10) {
1744 ipoint = i + 1;
1745 break;
1746 }
1747 }
1748 }
1749 if (ipoint == -2) {
1750 //distinguish between first and last point
1751 Int_t dpx = px - gPad->XtoAbsPixel(gPad->XtoPad(fX[0]));
1752 Int_t dpy = py - gPad->YtoAbsPixel(gPad->XtoPad(fY[0]));
1753 if (dpx * dpx + dpy * dpy < 25) ipoint = 0;
1754 else ipoint = fNpoints;
1755 }
1756
1757
1758 InsertPointBefore(ipoint, gPad->AbsPixeltoX(px), gPad->AbsPixeltoY(py));
1759
1760 gPad->Modified();
1761 return ipoint;
1762}
1763
1764
1765////////////////////////////////////////////////////////////////////////////////
1766/// Insert a new point with coordinates (x,y) before the point number `ipoint`.
1767
1769{
1770 if (ipoint < 0) {
1771 Error("TGraph", "Inserted point index should be >= 0");
1772 return;
1773 }
1774
1775 if (ipoint > fNpoints) {
1776 Error("TGraph", "Inserted point index should be <= %d", fNpoints);
1777 return;
1778 }
1779
1780 if (ipoint == fNpoints) {
1781 SetPoint(ipoint, x, y);
1782 return;
1783 }
1784
1786 CopyAndRelease(ps, ipoint, fNpoints++, ipoint + 1);
1787
1788 // To avoid redefinitions in descendant classes
1789 FillZero(ipoint, ipoint + 1);
1790
1791 fX[ipoint] = x;
1792 fY[ipoint] = y;
1793}
1794
1795
1796////////////////////////////////////////////////////////////////////////////////
1797/// Integrate the TGraph data within a given (index) range.
1798/// Note that this function computes the area of the polygon enclosed by the points of the TGraph.
1799/// The polygon segments, which are defined by the points of the TGraph, do not need to form a closed polygon,
1800/// since the last polygon segment, which closes the polygon, is taken as the line connecting the last TGraph point
1801/// with the first one. It is clear that the order of the point is essential in defining the polygon.
1802/// Also note that the segments should not intersect.
1803///
1804/// NB:
1805/// - if last=-1 (default) last is set to the last point.
1806/// - if (first <0) the first point (0) is taken.
1807///
1808/// ### Method:
1809///
1810/// There are many ways to calculate the surface of a polygon. It all depends on what kind of data
1811/// you have to deal with. The most evident solution would be to divide the polygon in triangles and
1812/// calculate the surface of them. But this can quickly become complicated as you will have to test
1813/// every segments of every triangles and check if they are intersecting with a current polygon's
1814/// segment or if it goes outside the polygon. Many calculations that would lead to many problems...
1815///
1816/// ### The solution (implemented by R.Brun)
1817/// Fortunately for us, there is a simple way to solve this problem, as long as the polygon's
1818/// segments don't intersect.
1819/// It takes the x coordinate of the current vertex and multiply it by the y coordinate of the next
1820/// vertex. Then it subtracts from it the result of the y coordinate of the current vertex multiplied
1821/// by the x coordinate of the next vertex. Then divide the result by 2 to get the surface/area.
1822///
1823/// ### Sources
1824/// - http://forums.wolfram.com/mathgroup/archive/1998/Mar/msg00462.html
1825/// - http://stackoverflow.com/questions/451426/how-do-i-calculate-the-surface-area-of-a-2d-polygon
1826
1828{
1829 if (first < 0) first = 0;
1830 if (last < 0) last = fNpoints - 1;
1831 if (last >= fNpoints) last = fNpoints - 1;
1832 if (first >= last) return 0;
1833 Int_t np = last - first + 1;
1834 Double_t sum = 0.0;
1835 //for(Int_t i=first;i<=last;i++) {
1836 // Int_t j = first + (i-first+1)%np;
1837 // sum += TMath::Abs(fX[i]*fY[j]);
1838 // sum -= TMath::Abs(fY[i]*fX[j]);
1839 //}
1840 for (Int_t i = first; i <= last; i++) {
1841 Int_t j = first + (i - first + 1) % np;
1842 sum += (fY[i] + fY[j]) * (fX[j] - fX[i]);
1843 }
1844 return 0.5 * TMath::Abs(sum);
1845}
1846
1847////////////////////////////////////////////////////////////////////////////////
1848/// Return 1 if the point (x,y) is inside the polygon defined by
1849/// the graph vertices 0 otherwise.
1850///
1851/// Algorithm:
1852///
1853/// The loop is executed with the end-point coordinates of a line segment
1854/// (X1,Y1)-(X2,Y2) and the Y-coordinate of a horizontal line.
1855/// The counter inter is incremented if the line (X1,Y1)-(X2,Y2) intersects
1856/// the horizontal line. In this case XINT is set to the X-coordinate of the
1857/// intersection point. If inter is an odd number, then the point x,y is within
1858/// the polygon.
1859
1861{
1862 return (Int_t)TMath::IsInside(x, y, fNpoints, fX, fY);
1863}
1864
1865////////////////////////////////////////////////////////////////////////////////
1866/// Least squares polynomial fitting without weights.
1867///
1868/// \param [in] m number of parameters
1869/// \param [in] a array of parameters
1870/// \param [in] xmin 1st point number to fit (default =0)
1871/// \param [in] xmax last point number to fit (default=fNpoints-1)
1872///
1873/// based on CERNLIB routine LSQ: Translated to C++ by Rene Brun
1874
1876{
1877 const Double_t zero = 0.;
1878 const Double_t one = 1.;
1879 const Int_t idim = 20;
1880
1881 Double_t b[400] /* was [20][20] */;
1882 Int_t i, k, l, ifail;
1884 Double_t da[20], xk, yk;
1885 Int_t n = fNpoints;
1886 if (xmax <= xmin) {
1887 xmin = fX[0];
1888 xmax = fX[fNpoints-1];
1889 }
1890
1891 if (m <= 2) {
1892 LeastSquareLinearFit(n, a[0], a[1], ifail, xmin, xmax);
1893 return;
1894 }
1895 if (m > idim || m > n) return;
1896 da[0] = zero;
1897 for (l = 2; l <= m; ++l) {
1898 b[l-1] = zero;
1899 b[m + l*20 - 21] = zero;
1900 da[l-1] = zero;
1901 }
1902 Int_t np = 0;
1903 for (k = 0; k < fNpoints; ++k) {
1904 xk = fX[k];
1905 if (xk < xmin || xk > xmax) continue;
1906 np++;
1907 yk = fY[k];
1908 power = one;
1909 da[0] += yk;
1910 for (l = 2; l <= m; ++l) {
1911 power *= xk;
1912 b[l-1] += power;
1913 da[l-1] += power * yk;
1914 }
1915 for (l = 2; l <= m; ++l) {
1916 power *= xk;
1917 b[m + l*20 - 21] += power;
1918 }
1919 }
1920 b[0] = Double_t(np);
1921 for (i = 3; i <= m; ++i) {
1922 for (k = i; k <= m; ++k) {
1923 b[k - 1 + (i-1)*20 - 21] = b[k + (i-2)*20 - 21];
1924 }
1925 }
1927
1928 if (ifail < 0) {
1929 a[0] = fY[0];
1930 for (i = 1; i < m; ++i) a[i] = 0;
1931 return;
1932 }
1933 for (i = 0; i < m; ++i) a[i] = da[i];
1934}
1935
1936////////////////////////////////////////////////////////////////////////////////
1937/// Least square linear fit without weights.
1938///
1939/// Fit a straight line (a0 + a1*x) to the data in this graph.
1940///
1941/// \param [in] ndata if ndata<0, fits the logarithm of the graph (used in InitExpo() to set
1942/// the initial parameter values for a fit with exponential function.
1943/// \param [in] a0 constant
1944/// \param [in] a1 slope
1945/// \param [in] ifail return parameter indicating the status of the fit (ifail=0, fit is OK)
1946/// \param [in] xmin, xmax fitting range
1947///
1948/// extracted from CERNLIB LLSQ: Translated to C++ by Rene Brun
1949
1951{
1953 Int_t i;
1955 Double_t fn, xk, yk;
1956 Double_t det;
1957 if (xmax <= xmin) {
1958 xmin = fX[0];
1959 xmax = fX[fNpoints-1];
1960 }
1961
1962 ifail = -2;
1963 xbar = ybar = x2bar = xybar = 0;
1964 Int_t np = 0;
1965 for (i = 0; i < fNpoints; ++i) {
1966 xk = fX[i];
1967 if (xk < xmin || xk > xmax) continue;
1968 np++;
1969 yk = fY[i];
1970 if (ndata < 0) {
1971 if (yk <= 0) yk = 1e-9;
1972 yk = TMath::Log(yk);
1973 }
1974 xbar += xk;
1975 ybar += yk;
1976 x2bar += xk * xk;
1977 xybar += xk * yk;
1978 }
1979 fn = Double_t(np);
1980 det = fn * x2bar - xbar * xbar;
1981 ifail = -1;
1982 if (det <= 0) {
1983 if (fn > 0) a0 = ybar / fn;
1984 else a0 = 0;
1985 a1 = 0;
1986 return;
1987 }
1988 ifail = 0;
1989 a0 = (x2bar * ybar - xbar * xybar) / det;
1990 a1 = (fn * xybar - xbar * ybar) / det;
1991}
1992
1993////////////////////////////////////////////////////////////////////////////////
1994/// Draw this graph with its current attributes.
1995
2001
2002////////////////////////////////////////////////////////////////////////////////
2003/// Draw the (x,y) as a graph.
2004
2010
2011////////////////////////////////////////////////////////////////////////////////
2012/// Draw the (x,y) as a histogram.
2013
2019
2020////////////////////////////////////////////////////////////////////////////////
2021/// Draw the stats
2022
2024{
2026 if (painter) painter->PaintStats(this, fit);
2027}
2028
2029////////////////////////////////////////////////////////////////////////////////
2030/// Print graph values.
2031
2033{
2034 for (Int_t i = 0; i < fNpoints; i++) {
2035 printf("x[%d]=%g, y[%d]=%g\n", i, fX[i], i, fY[i]);
2036 }
2037}
2038
2039////////////////////////////////////////////////////////////////////////////////
2040/// Recursively remove object from the list of functions
2041
2043{
2044 if (fFunctions) {
2047 }
2048 if (fHistogram == obj)
2049 fHistogram = nullptr;
2050}
2051
2052////////////////////////////////////////////////////////////////////////////////
2053/// Delete point close to the mouse position
2054/// Returns index of removed point (or -1 if nothing was changed)
2055
2057{
2058 if (!gPad) {
2059 Error("RemovePoint", "Cannot be used without gPad, requires last mouse position");
2060 return -1;
2061 }
2062
2063 Int_t px = gPad->GetEventX();
2064 Int_t py = gPad->GetEventY();
2065
2066 //localize point to be deleted
2067 Int_t ipoint = -2;
2068 // start with a small window (in case the mouse is very close to one point)
2069 for (Int_t i = 0; i < fNpoints; i++) {
2070 Int_t dpx = px - gPad->XtoAbsPixel(gPad->XtoPad(fX[i]));
2071 Int_t dpy = py - gPad->YtoAbsPixel(gPad->YtoPad(fY[i]));
2072 if (dpx * dpx + dpy * dpy < 100) {
2073 ipoint = i;
2074 break;
2075 }
2076 }
2077 return RemovePoint(ipoint);
2078}
2079
2080////////////////////////////////////////////////////////////////////////////////
2081/// Delete point number ipoint
2082/// Returns index of removed point (or -1 if nothing was changed)
2083
2085{
2086 if ((ipoint < 0) || (ipoint >= fNpoints))
2087 return -1;
2088
2090 CopyAndRelease(ps, ipoint + 1, fNpoints--, ipoint);
2091 if (gPad) gPad->Modified();
2092 return ipoint;
2093}
2094
2095////////////////////////////////////////////////////////////////////////////////
2096/// Save the graph as .csv, .tsv or .txt. In case of any other extension, fall
2097/// back to TObject::SaveAs
2098///
2099/// The result can be immediately imported into Excel, gnuplot, Python or whatever,
2100/// without the needing to install pyroot, etc.
2101///
2102/// \param filename the name of the file where to store the graph
2103/// \param option some tuning options
2104///
2105/// The file extension defines the delimiter used:
2106/// - `.csv` : comma
2107/// - `.tsv` : tab
2108/// - `.txt` : space
2109///
2110/// If option = "title" a title line is generated with the axis titles.
2111
2112void TGraph::SaveAs(const char *filename, Option_t *option) const
2113{
2114 char del = '\0';
2115 TString ext = "";
2117 TString opt = option;
2118
2119 if (filename) {
2120 if (fname.EndsWith(".csv")) {del = ','; ext = "csv";}
2121 else if (fname.EndsWith(".tsv")) {del = '\t'; ext = "tsv";}
2122 else if (fname.EndsWith(".txt")) {del = ' '; ext = "txt";}
2123 }
2124 if (del) {
2125 std::ofstream out;
2126 out.open(filename, std::ios::out);
2127 if (!out.good ()) {
2128 Error("SaveAs", "cannot open file: %s", filename);
2129 return;
2130 }
2132 if(opt.Contains("title"))
2133 out << "# " << GetXaxis()->GetTitle() << "\tex\t" << GetYaxis()->GetTitle() << "\tey" << std::endl;
2134 double *ex = this->GetEX();
2135 double *ey = this->GetEY();
2136 for(int i=0 ; i<fNpoints ; i++)
2137 out << fX[i] << del << (ex?ex[i]:0) << del << fY[i] << del << (ey?ey[i]:0) << std::endl;
2139 if(opt.Contains("title"))
2140 out << "# " << GetXaxis()->GetTitle() << "\texl\t" << "\texh\t" << GetYaxis()->GetTitle() << "\teyl" << "\teyh" << std::endl;
2141 double *exl = this->GetEXlow();
2142 double *exh = this->GetEXhigh();
2143 double *eyl = this->GetEYlow();
2144 double *eyh = this->GetEYhigh();
2145 for(int i=0 ; i<fNpoints ; i++)
2146 out << fX[i] << del << (exl?exl[i]:0) << del << (exh?exh[i]:0) << del << fY[i] << del << (eyl?eyl[i]:0) << del << (eyh?eyh[i]:0) << std::endl;
2147 } else {
2148 if(opt.Contains("title"))
2149 out << "# " << GetXaxis()->GetTitle() << "\t" << GetYaxis()->GetTitle() << std::endl;
2150 for (int i=0 ; i<fNpoints ; i++)
2151 out << fX[i] << del << fY[i] << std::endl;
2152 }
2153 out.close();
2154 Info("SaveAs", "%s file: %s has been generated", ext.Data(), filename);
2155 } else {
2157 }
2158}
2159
2160
2161////////////////////////////////////////////////////////////////////////////////
2162/// Save primitive as a C++ statement(s) on output stream out
2163
2164void TGraph::SavePrimitive(std::ostream &out, Option_t *option /*= ""*/)
2165{
2166 TString args;
2167 if (fNpoints >= 1) {
2168 TString xname = SavePrimitiveVector(out, "graph_x", fNpoints, fX, kTRUE);
2169 TString yname = SavePrimitiveVector(out, "graph_y", fNpoints, fY);
2170 args.Form("%d, %s.data(), %s.data()", fNpoints, xname.Data(), yname.Data());
2171 }
2172
2173 SavePrimitiveConstructor(out, Class(), "graph", args, fNpoints < 1);
2174
2175 SaveHistogramAndFunctions(out, "graph", option);
2176}
2177
2178////////////////////////////////////////////////////////////////////////////////
2179/// Save histogram and list of functions of TGraph as C++ statement
2180/// Used in all TGraph-derived classes
2181
2182void TGraph::SaveHistogramAndFunctions(std::ostream &out, const char *varname, Option_t *option)
2183{
2184 thread_local Int_t frameNumber = 0;
2185
2187
2188 SaveFillAttributes(out, varname, 0, 1001);
2189 SaveLineAttributes(out, varname, 1, 1, 1);
2190 SaveMarkerAttributes(out, varname, 1, 1, 1);
2191
2192 if (fHistogram) {
2194 fHistogram->SetName(TString::Format("Graph_histogram%d", ++frameNumber).Data());
2195 fHistogram->SavePrimitive(out, "nodraw");
2196 out << " " <<varname << "->SetHistogram(" << fHistogram->GetName() << ");\n";
2197 out << " \n";
2198 fHistogram->SetName(hname.Data());
2199 }
2200
2202
2203 if (!option)
2204 option = "";
2205 const char *l = strstr(option, "multigraph");
2206 if (l) {
2207 out << " multigraph->Add(" << varname << ",\"" << l + 10 << "\");\n";
2208 return;
2209 }
2210 l = strstr(option, "th2poly");
2211 if (l) {
2212 out << " " << l + 7 << "->AddBin(" << varname << ");\n";
2213 return;
2214 }
2215
2217}
2218
2219////////////////////////////////////////////////////////////////////////////////
2220/// Multiply the values of a TGraph by a constant c1.
2221///
2222/// If option contains "x" the x values are scaled
2223/// If option contains "y" the y values are scaled
2224/// If option contains "xy" both x and y values are scaled
2225
2227{
2228 TString opt = option; opt.ToLower();
2229 if (opt.Contains("x")) {
2230 for (Int_t i=0; i<GetN(); i++)
2231 GetX()[i] *= c1;
2232 }
2233 if (opt.Contains("y")) {
2234 for (Int_t i=0; i<GetN(); i++)
2235 GetY()[i] *= c1;
2236 }
2237}
2238
2239////////////////////////////////////////////////////////////////////////////////
2240/// Set number of points in the graph
2241/// Existing coordinates are preserved
2242/// New coordinates above fNpoints are preset to 0.
2243
2245{
2246 if (n < 0) n = 0;
2247 if (n == fNpoints) return;
2248 Double_t **ps = Allocate(n);
2249 CopyAndRelease(ps, 0, TMath::Min(fNpoints, n), 0);
2250 if (n > fNpoints) {
2252 }
2253 fNpoints = n;
2254}
2255
2256////////////////////////////////////////////////////////////////////////////////
2257/// Return kTRUE if kNotEditable bit is not set, kFALSE otherwise.
2258
2260{
2261 return TestBit(kNotEditable) ? kFALSE : kTRUE;
2262}
2263
2264////////////////////////////////////////////////////////////////////////////////
2265/// if editable=kFALSE, the graph cannot be modified with the mouse
2266/// by default a TGraph is editable
2267
2273
2274////////////////////////////////////////////////////////////////////////////////
2275/// Set highlight (enable/disable) mode for the graph
2276/// by default highlight mode is disable
2277
2279{
2280 if (IsHighlight() == set) return;
2281
2283 if (!painter) return;
2284 SetBit(kIsHighlight, set);
2285 painter->SetHighlight(this);
2286}
2287
2288/// Set the histogram underlying the TGraph. This transfers the ownership of h to the TGraph. The preexisting fHistogram will be deleted.
2290{
2291 delete fHistogram;
2292 fHistogram = h;
2293}
2294
2295////////////////////////////////////////////////////////////////////////////////
2296/// Set the maximum of the graph.
2297
2299{
2300 fMaximum = maximum;
2301 GetHistogram()->SetMaximum(maximum);
2302}
2303
2304////////////////////////////////////////////////////////////////////////////////
2305/// Set the minimum of the graph.
2306
2308{
2309 fMinimum = minimum;
2310 GetHistogram()->SetMinimum(minimum);
2311}
2312
2313////////////////////////////////////////////////////////////////////////////////
2314/// Set x and y values for point number i.
2315
2317{
2318 if (i < 0) return;
2320
2321 if (i >= fMaxSize) {
2322 Double_t **ps = ExpandAndCopy(i + 1, fNpoints);
2323 CopyAndRelease(ps, 0, 0, 0);
2324 }
2325 if (i >= fNpoints) {
2326 // points above i can be not initialized
2327 // set zero up to i-th point to avoid redefinition
2328 // of this method in descendant classes
2329 FillZero(fNpoints, i + 1);
2330 fNpoints = i + 1;
2331 }
2332 fX[i] = x;
2333 fY[i] = y;
2334 if (gPad) gPad->Modified();
2335}
2336
2337////////////////////////////////////////////////////////////////////////////////
2338/// Set x value for point i.
2339
2341{
2342 SetPoint(i, x, GetPointY(i));
2343}
2344
2345////////////////////////////////////////////////////////////////////////////////
2346/// Set y value for point i.
2347
2349{
2350 SetPoint(i, GetPointX(i), y);
2351}
2352
2353////////////////////////////////////////////////////////////////////////////////
2354/// Set graph name.
2355void TGraph::SetName(const char *name)
2356{
2357 fName = name;
2359}
2360
2361////////////////////////////////////////////////////////////////////////////////
2362/// Change (i.e. set) the title
2363///
2364/// if title is in the form `stringt;stringx;stringy;stringz`
2365/// the graph title is set to `stringt`, the x axis title to `stringx`,
2366/// the y axis title to `stringy`, and the z axis title to `stringz`.
2367///
2368/// To insert the character `;` in one of the titles, one should use `#;`
2369/// or `#semicolon`.
2370
2371void TGraph::SetTitle(const char* title)
2372{
2373 fTitle = title;
2374 fTitle.ReplaceAll("#;",2,"#semicolon",10);
2375 Int_t p = fTitle.Index(";");
2376
2377 if (p>0) {
2378 if (!fHistogram) GetHistogram();
2379 fHistogram->SetTitle(title);
2380 Int_t n = fTitle.Length()-p;
2381 if (p>0) fTitle.Remove(p,n);
2382 fTitle.ReplaceAll("#semicolon",10,"#;",2);
2383 } else {
2384 if (fHistogram) fHistogram->SetTitle(title);
2385 }
2386}
2387
2388////////////////////////////////////////////////////////////////////////////////
2389/// Set graph name and title
2390
2391void TGraph::SetNameTitle(const char *name, const char *title)
2392{
2393 SetName(name);
2394 SetTitle(title);
2395}
2396
2397////////////////////////////////////////////////////////////////////////////////
2398/// Set statistics option on/off.
2399///
2400/// By default, the statistics box is drawn.
2401/// The paint options can be selected via gStyle->SetOptStat.
2402/// This function sets/resets the kNoStats bit in the graph object.
2403/// It has priority over the Style option.
2404
2406{
2408 if (!stats) {
2410 //remove the "stats" object from the list of functions
2411 if (fFunctions) {
2412 TObject *obj = fFunctions->FindObject("stats");
2413 if (obj) {
2414 fFunctions->Remove(obj);
2415 delete obj;
2416 }
2417 }
2418 }
2419}
2420
2421////////////////////////////////////////////////////////////////////////////////
2422/// if size*2 <= fMaxSize allocate new arrays of size points,
2423/// copy points [0,oend).
2424/// Return newarray (passed or new instance if it was zero
2425/// and allocations are needed)
2426
2428{
2429 if (size * 2 > fMaxSize || !fMaxSize)
2430 return nullptr;
2431
2433 CopyPoints(newarrays, 0, oend, 0);
2434 return newarrays;
2435}
2436
2437////////////////////////////////////////////////////////////////////////////////
2438/// Sorts the points of this TGraph using in-place quicksort (see e.g. older glibc).
2439/// To compare two points the function parameter greaterfunc is used (see TGraph::CompareX for an
2440/// example of such a method, which is also the default comparison function for Sort). After
2441/// the sort, greaterfunc(this, i, j) will return kTRUE for all i>j if ascending == kTRUE, and
2442/// kFALSE otherwise.
2443///
2444/// The last two parameters are used for the recursive quick sort, stating the range to be sorted
2445///
2446/// Examples:
2447/// ~~~ {.cpp}
2448/// // sort points along x axis
2449/// graph->Sort();
2450/// // sort points along their distance to origin
2451/// graph->Sort(&TGraph::CompareRadius);
2452///
2453/// Bool_t CompareErrors(const TGraph* gr, Int_t i, Int_t j) {
2454/// const TGraphErrors* ge=(const TGraphErrors*)gr;
2455/// return (ge->GetEY()[i]>ge->GetEY()[j]); }
2456/// // sort using the above comparison function, largest errors first
2457/// graph->Sort(&CompareErrors, kFALSE);
2458/// ~~~
2459
2460void TGraph::Sort(Bool_t (*greaterfunc)(const TGraph *, Int_t, Int_t) /*=TGraph::CompareX()*/,
2461 Bool_t ascending /*=kTRUE*/, Int_t low /*=0*/, Int_t high /*=-1111*/)
2462{
2463 // set the bit in case of an ascending =sort in X
2464 if (greaterfunc == TGraph::CompareX && ascending && low == 0 && high == -1111)
2466
2467 if (high == -1111)
2468 high = fNpoints - 1;
2469
2470 // Create a vector to store the indices of the graph data points.
2471 // We use std::vector<Int_t> instead of std::vector<ULong64_t> to match the input type
2472 // required by the comparison operator's signature provided as `greaterfunc`
2473 std::vector<int> sorting_indices(fNpoints);
2474 std::iota(sorting_indices.begin(), sorting_indices.end(), 0);
2475
2476 // Sort the indices using the provided comparison function
2477 // We use std::stable_sort here because the libc++ implementation of std::sort
2478 // is not standard-compliant until LLVM 14 which caused errors on the mac nodes
2479 // of our CI, related issue: https://github.com/llvm/llvm-project/issues/21211
2480 std::stable_sort(sorting_indices.begin() + low, sorting_indices.begin() + high + 1,
2481 [&](int left, int right) { return left != right && greaterfunc(this, left, right) != ascending; });
2482
2483 Int_t numSortedPoints = high - low + 1;
2485}
2486
2487////////////////////////////////////////////////////////////////////////////////
2488/// Stream an object of class TGraph.
2489
2491{
2492 if (b.IsReading()) {
2493 UInt_t R__s, R__c;
2494 Version_t R__v = b.ReadVersion(&R__s, &R__c);
2495 if (R__v > 2) {
2496 b.ReadClassBuffer(TGraph::Class(), this, R__v, R__s, R__c);
2497 if (fHistogram) fHistogram->SetDirectory(nullptr);
2498 TIter next(fFunctions);
2499 TObject *obj;
2500 while ((obj = next())) {
2501 if (obj->InheritsFrom(TF1::Class())) {
2502 TF1 *f1 = (TF1*)obj;
2503 f1->SetParent(this);
2504 }
2505 }
2507 return;
2508 }
2509 //====process old versions before automatic schema evolution
2514 b >> fNpoints;
2516 fX = new Double_t[fNpoints];
2517 fY = new Double_t[fNpoints];
2518 if (R__v < 2) {
2519 Float_t *x = new Float_t[fNpoints];
2520 Float_t *y = new Float_t[fNpoints];
2521 b.ReadFastArray(x, fNpoints);
2522 b.ReadFastArray(y, fNpoints);
2523 for (Int_t i = 0; i < fNpoints; i++) {
2524 fX[i] = x[i];
2525 fY[i] = y[i];
2526 }
2527 delete [] y;
2528 delete [] x;
2529 } else {
2530 b.ReadFastArray(fX, fNpoints);
2531 b.ReadFastArray(fY, fNpoints);
2532 }
2533 b >> fFunctions;
2534 b >> fHistogram;
2535 if (fHistogram) fHistogram->SetDirectory(nullptr);
2536 if (R__v < 2) {
2537 Float_t mi, ma;
2538 b >> mi;
2539 b >> ma;
2540 fMinimum = mi;
2541 fMaximum = ma;
2542 } else {
2543 b >> fMinimum;
2544 b >> fMaximum;
2545 }
2546 b.CheckByteCount(R__s, R__c, TGraph::IsA());
2547 //====end of old versions
2548
2549 } else {
2550 b.WriteClassBuffer(TGraph::Class(), this);
2551 }
2552}
2553
2554////////////////////////////////////////////////////////////////////////////////
2555/// Swap points.
2556
2562
2563////////////////////////////////////////////////////////////////////////////////
2564/// Update the fX and fY arrays with the sorted values.
2565
2567{
2568 std::vector<Double_t> fXSorted(numSortedPoints);
2569 std::vector<Double_t> fYSorted(numSortedPoints);
2570
2571 // Fill the sorted X and Y values based on the sorted indices
2572 std::generate(fXSorted.begin(), fXSorted.end(),
2573 [begin = low, &sorting_indices, this]() mutable { return fX[sorting_indices[begin++]]; });
2574 std::generate(fYSorted.begin(), fYSorted.end(),
2575 [begin = low, &sorting_indices, this]() mutable { return fY[sorting_indices[begin++]]; });
2576
2577 // Copy the sorted X and Y values back to the original arrays
2578 std::copy(fXSorted.begin(), fXSorted.end(), fX + low);
2579 std::copy(fYSorted.begin(), fYSorted.end(), fY + low);
2580}
2581
2582////////////////////////////////////////////////////////////////////////////////
2583/// Swap values.
2584
2586{
2587 Double_t tmp = arr[pos1];
2588 arr[pos1] = arr[pos2];
2589 arr[pos2] = tmp;
2590}
2591
2592////////////////////////////////////////////////////////////////////////////////
2593/// Set current style settings in this graph
2594/// This function is called when either TCanvas::UseCurrentStyle
2595/// or TROOT::ForceStyle have been invoked.
2596
2627
2628////////////////////////////////////////////////////////////////////////////////
2629/// Adds all graphs from the collection to this graph.
2630/// Returns the total number of points in the result or -1 in case of an error.
2631
2633{
2634 TIter next(li);
2635 while (TObject* o = next()) {
2636 TGraph *g = dynamic_cast<TGraph*>(o);
2637 if (!g) {
2638 Error("Merge",
2639 "Cannot merge - an object which doesn't inherit from TGraph found in the list");
2640 return -1;
2641 }
2642 DoMerge(g);
2643 }
2644 return GetN();
2645}
2646
2647////////////////////////////////////////////////////////////////////////////////
2648/// protected function to perform the merge operation of a graph
2649
2651{
2652 Double_t x = 0, y = 0;
2653 for (Int_t i = 0 ; i < g->GetN(); i++) {
2654 g->GetPoint(i, x, y);
2655 SetPoint(GetN(), x, y);
2656 }
2657 return kTRUE;
2658}
2659
2660////////////////////////////////////////////////////////////////////////////////
2661/// Move all graph points on specified values dx,dy
2662/// If log argument specified, calculation done in logarithmic scale like:
2663/// new_value = exp( log(old_value) + delta );
2664
2666{
2667 Double_t x = 0, y = 0;
2668 for (Int_t i = 0 ; i < GetN(); i++) {
2669 GetPoint(i, x, y);
2670 if (!logx) {
2671 x += dx;
2672 } else if (x > 0) {
2673 x = TMath::Exp(TMath::Log(x) + dx);
2674 }
2675 if (!logy) {
2676 y += dy;
2677 } else if (y > 0) {
2678 y = TMath::Exp(TMath::Log(y) + dy);
2679 }
2680 SetPoint(i, x, y);
2681 }
2682}
2683
2684
2685////////////////////////////////////////////////////////////////////////////////
2686/// Find zero of a continuous function.
2687/// This function finds a real zero of the continuous real
2688/// function Y(X) in a given interval (A,B). See accompanying
2689/// notes for details of the argument list and calling sequence
2690
2693{
2694 static Double_t a, b, ya, ytest, y1, x1, h;
2695 static Int_t j1, it, j3, j2;
2696 Double_t yb, x2;
2697 yb = 0;
2698
2699 // Calculate Y(X) at X=AZ.
2700 if (k <= 0) {
2701 a = AZ;
2702 b = BZ;
2703 X = a;
2704 j1 = 1;
2705 it = 1;
2706 k = j1;
2707 return;
2708 }
2709
2710 // Test whether Y(X) is sufficiently small.
2711
2712 if (TMath::Abs(Y) <= E2) {
2713 k = 2;
2714 return;
2715 }
2716
2717 // Calculate Y(X) at X=BZ.
2718
2719 if (j1 == 1) {
2720 ya = Y;
2721 X = b;
2722 j1 = 2;
2723 return;
2724 }
2725 // Test whether the signs of Y(AZ) and Y(BZ) are different.
2726 // if not, begin the binary subdivision.
2727
2728 if (j1 != 2) goto L100;
2729 if (ya * Y < 0) goto L120;
2730 x1 = a;
2731 y1 = ya;
2732 j1 = 3;
2733 h = b - a;
2734 j2 = 1;
2735 x2 = a + 0.5 * h;
2736 j3 = 1;
2737 it++; //*-*- Check whether (maxiterations) function values have been calculated.
2738 if (it >= maxiterations) k = j1;
2739 else X = x2;
2740 return;
2741
2742 // Test whether a bracket has been found .
2743 // If not,continue the search
2744
2745L100:
2746 if (j1 > 3) goto L170;
2747 if (ya*Y >= 0) {
2748 if (j3 >= j2) {
2749 h = 0.5 * h;
2750 j2 = 2 * j2;
2751 a = x1;
2752 ya = y1;
2753 x2 = a + 0.5 * h;
2754 j3 = 1;
2755 } else {
2756 a = X;
2757 ya = Y;
2758 x2 = X + h;
2759 j3++;
2760 }
2761 it++;
2762 if (it >= maxiterations) k = j1;
2763 else X = x2;
2764 return;
2765 }
2766
2767 // The first bracket has been found.calculate the next X by the
2768 // secant method based on the bracket.
2769
2770L120:
2771 b = X;
2772 yb = Y;
2773 j1 = 4;
2774L130:
2775 if (TMath::Abs(ya) > TMath::Abs(yb)) {
2776 x1 = a;
2777 y1 = ya;
2778 X = b;
2779 Y = yb;
2780 } else {
2781 x1 = b;
2782 y1 = yb;
2783 X = a;
2784 Y = ya;
2785 }
2786
2787 // Use the secant method based on the function values y1 and Y.
2788 // check that x2 is inside the interval (a,b).
2789
2790L150:
2791 x2 = X - Y * (X - x1) / (Y - y1);
2792 x1 = X;
2793 y1 = Y;
2795 if ((x2 - a)*(x2 - b) < 0) {
2796 it++;
2797 if (it >= maxiterations) k = j1;
2798 else X = x2;
2799 return;
2800 }
2801
2802 // Calculate the next value of X by bisection . Check whether
2803 // the maximum accuracy has been achieved.
2804
2805L160:
2806 x2 = 0.5 * (a + b);
2807 ytest = 0;
2808 if ((x2 - a)*(x2 - b) >= 0) {
2809 k = 2;
2810 return;
2811 }
2812 it++;
2813 if (it >= maxiterations) k = j1;
2814 else X = x2;
2815 return;
2816
2817
2818 // Revise the bracket (a,b).
2819
2820L170:
2821 if (j1 != 4) return;
2822 if (ya * Y < 0) {
2823 b = X;
2824 yb = Y;
2825 } else {
2826 a = X;
2827 ya = Y;
2828 }
2829
2830 // Use ytest to decide the method for the next value of X.
2831
2832 if (ytest <= 0) goto L130;
2833 if (TMath::Abs(Y) - ytest <= 0) goto L150;
2834 goto L160;
2835}
#define d(i)
Definition RSha256.hxx:102
#define b(i)
Definition RSha256.hxx:100
#define f(i)
Definition RSha256.hxx:104
#define g(i)
Definition RSha256.hxx:105
#define a(i)
Definition RSha256.hxx:99
#define h(i)
Definition RSha256.hxx:106
#define e(i)
Definition RSha256.hxx:103
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
int Int_t
Signed integer 4 bytes (int)
Definition RtypesCore.h:59
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
double Double_t
Double 8 bytes.
Definition RtypesCore.h:73
constexpr Ssiz_t kNPOS
The equivalent of std::string::npos for the ROOT class TString.
Definition RtypesCore.h:131
constexpr Bool_t kTRUE
Definition RtypesCore.h:107
const char Option_t
Option string (const char)
Definition RtypesCore.h:80
#define X(type, name)
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
R__EXTERN TEnv * gEnv
Definition TEnv.h:170
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t option
Option_t Option_t SetLineWidth
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 SetFillStyle
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 del
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 char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t result
Option_t Option_t SetLineColor
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 x2
Option_t Option_t TPoint TPoint const char x1
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
Option_t Option_t SetFillColor
Option_t Option_t SetMarkerStyle
Option_t Option_t TPoint TPoint const char y1
char name[80]
Definition TGX11.cxx:110
void H1LeastSquareSeqnd(Int_t n, Double_t *a, Int_t idim, Int_t &ifail, Int_t k, Double_t *b)
Extracted from CERN Program library routine DSEQN.
Definition TH1.cxx:4885
float xmin
float ymin
float xmax
float ymax
#define gROOT
Definition TROOT.h:411
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
Definition TString.cxx:2495
void Printf(const char *fmt,...)
Formats a string in a circular formatting buffer and prints the string.
Definition TString.cxx:2509
R__EXTERN TStyle * gStyle
Definition TStyle.h:442
R__EXTERN TSystem * gSystem
Definition TSystem.h:572
#define gPad
class describing the range in the coordinates it supports multiple range in a coordinate.
Definition DataRange.h:35
const_iterator begin() const
const_iterator end() const
Fill Area Attributes class.
Definition TAttFill.h:20
virtual void Streamer(TBuffer &)
virtual Color_t GetFillColor() const
Return the fill area color.
Definition TAttFill.h:31
void Copy(TAttFill &attfill) const
Copy this fill attributes to a new TAttFill.
Definition TAttFill.cxx:206
virtual Style_t GetFillStyle() const
Return the fill area style.
Definition TAttFill.h:32
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 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 Style_t GetLineStyle() const
Return the line style.
Definition TAttLine.h:36
void Copy(TAttLine &attline) const
Copy this line attributes to a new TAttLine.
Definition TAttLine.cxx:176
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
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
void Copy(TAttMarker &attmarker) const
Copy this marker attributes to a new TAttMarker.
virtual void Streamer(TBuffer &)
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
virtual void SetTimeDisplay(Int_t value)
Definition TAxis.h:173
void RotateTitle(Bool_t rotate=kTRUE)
Rotate title by 180 degrees.
Definition TAxis.h:205
void CenterTitle(Bool_t center=kTRUE)
Center axis title.
Definition TAxis.h:196
void SetNoExponent(Bool_t noExponent=kTRUE)
Set the NoExponent flag By default, an exponent of the form 10^N is used when the label value are eit...
Definition TAxis.h:235
virtual void SetLimits(Double_t xmin, Double_t xmax)
Definition TAxis.h:166
virtual void SetTimeFormat(const char *format="")
Change the format used for time plotting.
Definition TAxis.cxx:1149
Using a TBrowser one can browse all ROOT objects.
Definition TBrowser.h:37
Buffer base class used for serializing objects.
Definition TBuffer.h:43
Collection abstract base class.
Definition TCollection.h:65
virtual Bool_t IsEmpty() const
TObject * Clone(const char *newname="") const override
Make a clone of an collection using the Streamer facility.
TDirectory::TContext keeps track and restore the current directory.
Definition TDirectory.h:89
virtual Int_t GetValue(const char *name, Int_t dflt) const
Returns the integer value for a resource.
Definition TEnv.cxx:505
1-Dim function class
Definition TF1.h:182
static TClass * Class()
virtual Int_t GetNpar() const
Definition TF1.h:461
virtual void SetParent(TObject *p=nullptr)
Definition TF1.h:662
virtual void SetParLimits(Int_t ipar, Double_t parmin, Double_t parmax)
Set lower and upper limits for parameter ipar.
Definition TF1.cxx:3538
virtual void SetParameter(Int_t param, Double_t value)
Definition TF1.h:623
Provides an indirection to the TFitResult class and with a semantics identical to a TFitResult pointe...
static TClass * Class()
static TClass * Class()
static TClass * Class()
A TGraph is an object made of two arrays X and Y with npoints each.
Definition TGraph.h:41
virtual Double_t GetPointX(Int_t i) const
Get x value for point i.
Definition TGraph.cxx:1563
static TClass * Class()
virtual Double_t Integral(Int_t first=0, Int_t last=-1) const
Integrate the TGraph data within a given (index) range.
Definition TGraph.cxx:1827
Int_t fNpoints
Number of points <= fMaxSize.
Definition TGraph.h:46
virtual Int_t IsInside(Double_t x, Double_t y) const
Return 1 if the point (x,y) is inside the polygon defined by the graph vertices 0 otherwise.
Definition TGraph.cxx:1860
virtual void LeastSquareFit(Int_t m, Double_t *a, Double_t xmin=0, Double_t xmax=0)
Least squares polynomial fitting without weights.
Definition TGraph.cxx:1875
virtual Double_t Chisquare(TF1 *f1, Option_t *option="") const
Return the chisquare of this graph with respect to f1.
Definition TGraph.cxx:697
void UseCurrentStyle() override
Set current style settings in this graph This function is called when either TCanvas::UseCurrentStyle...
Definition TGraph.cxx:2597
virtual void SetPoint(Int_t i, Double_t x, Double_t y)
Set x and y values for point number i.
Definition TGraph.cxx:2316
Double_t * GetY() const
Definition TGraph.h:139
virtual Int_t Merge(TCollection *list)
Adds all graphs from the collection to this graph.
Definition TGraph.cxx:2632
Int_t fMaxSize
!Current dimension of arrays fX and fY
Definition TGraph.h:45
TString fOption
Options used for drawing the graph.
Definition TGraph.h:53
~TGraph() override
Graph default destructor.
Definition TGraph.cxx:586
Double_t ** ShrinkAndCopy(Int_t size, Int_t iend)
if size*2 <= fMaxSize allocate new arrays of size points, copy points [0,oend).
Definition TGraph.cxx:2427
virtual Double_t GetRMS(Int_t axis=1) const
Return RMS of X (axis=1) or Y (axis=2)
Definition TGraph.cxx:1359
TH1F * fHistogram
Pointer to histogram used for drawing axis.
Definition TGraph.h:50
void Paint(Option_t *chopt="") override
Draw this graph with its current attributes.
Definition TGraph.cxx:1996
@ kNotEditable
Bit set if graph is non editable.
Definition TGraph.h:77
@ kIsHighlight
Bit set if graph is highlight.
Definition TGraph.h:79
@ kIsSortedX
Graph is sorted in X points.
Definition TGraph.h:78
@ kClipFrame
Clip to the frame boundary.
Definition TGraph.h:75
@ kResetHisto
fHistogram must be reset in GetHistogram
Definition TGraph.h:76
@ kNoStats
Don't draw stats box.
Definition TGraph.h:74
virtual Double_t GetErrorXlow(Int_t bin) const
It always returns a negative value.
Definition TGraph.cxx:1407
virtual void MovePoints(Double_t dx, Double_t dy, Bool_t logx=kFALSE, Bool_t logy=kFALSE)
Move all graph points on specified values dx,dy If log argument specified, calculation done in logari...
Definition TGraph.cxx:2665
virtual Double_t GetErrorYlow(Int_t bin) const
It always returns a negative value.
Definition TGraph.cxx:1425
virtual void UpdateArrays(const std::vector< Int_t > &sorting_indices, Int_t numSortedPoints, Int_t low)
Update the fX and fY arrays with the sorted values.
Definition TGraph.cxx:2566
virtual void CopyAndRelease(Double_t **newarrays, Int_t ibegin, Int_t iend, Int_t obegin)
Copy points from fX and fY to arrays[0] and arrays[1] or to fX and fY if arrays == 0 and ibegin !...
Definition TGraph.cxx:782
Double_t GetMinimum() const
Definition TGraph.h:151
void Print(Option_t *chopt="") const override
Print graph values.
Definition TGraph.cxx:2032
virtual Double_t * GetEYlow() const
Definition TGraph.h:145
virtual void SetMaximum(Double_t maximum=-1111)
Set the maximum of the graph.
Definition TGraph.cxx:2298
virtual Double_t * GetEX() const
Definition TGraph.h:140
static Bool_t CompareY(const TGraph *gr, Int_t left, Int_t right)
Return kTRUE if fY[left] > fY[right]. Can be used by Sort.
Definition TGraph.cxx:733
static Bool_t CompareRadius(const TGraph *gr, Int_t left, Int_t right)
Return kTRUE if point number "left"'s distance to origin is bigger than that of point number "right".
Definition TGraph.cxx:742
virtual Double_t GetErrorYhigh(Int_t bin) const
It always returns a negative value.
Definition TGraph.cxx:1416
TClass * IsA() const override
Definition TGraph.h:202
static Bool_t CompareX(const TGraph *gr, Int_t left, Int_t right)
Return kTRUE if fX[left] > fX[right]. Can be used by Sort.
Definition TGraph.cxx:725
Int_t GetN() const
Definition TGraph.h:131
TF1 * GetFunction(const char *name) const
Return pointer to function with name.
Definition TGraph.cxx:1436
virtual void LeastSquareLinearFit(Int_t n, Double_t &a0, Double_t &a1, Int_t &ifail, Double_t xmin=0, Double_t xmax=0)
Least square linear fit without weights.
Definition TGraph.cxx:1950
Double_t * fY
[fNpoints] array of Y points
Definition TGraph.h:48
Bool_t CtorAllocate()
In constructors set fNpoints than call this method.
Definition TGraph.cxx:825
virtual void DrawGraph(Int_t n, const Int_t *x, const Int_t *y, Option_t *option="")
Draw this graph with new attributes.
Definition TGraph.cxx:909
virtual TFitResultPtr Fit(const char *formula, Option_t *option="", Option_t *goption="", Axis_t xmin=0, Axis_t xmax=0)
Fit this graph with function with name fname.
Definition TGraph.cxx:1274
virtual void Sort(Bool_t(*greater)(const TGraph *, Int_t, Int_t)=&TGraph::CompareX, Bool_t ascending=kTRUE, Int_t low=0, Int_t high=-1111)
Sorts the points of this TGraph using in-place quicksort (see e.g.
Definition TGraph.cxx:2460
static Bool_t CompareArg(const TGraph *gr, Int_t left, Int_t right)
Return kTRUE if point number "left"'s argument (angle with respect to positive x-axis) is bigger than...
Definition TGraph.cxx:714
virtual void ComputeRange(Double_t &xmin, Double_t &ymin, Double_t &xmax, Double_t &ymax) const
Compute the x/y range of the points in this graph.
Definition TGraph.cxx:751
char * GetObjectInfo(Int_t px, Int_t py) const override
Implementation to get information on point of graph at cursor position Adapted from class TH1.
Definition TGraph.cxx:1604
Double_t ** AllocateArrays(Int_t Narrays, Int_t arraySize)
Allocate arrays.
Definition TGraph.cxx:618
virtual void Scale(Double_t c1=1., Option_t *option="y")
Multiply the values of a TGraph by a constant c1.
Definition TGraph.cxx:2226
TList * fFunctions
Pointer to list of functions (fits and user)
Definition TGraph.h:49
virtual Double_t GetCovariance() const
Return covariance of vectors x,y.
Definition TGraph.cxx:1328
static void SwapValues(Double_t *arr, Int_t pos1, Int_t pos2)
Swap values.
Definition TGraph.cxx:2585
void Streamer(TBuffer &) override
Stream an object of class TGraph.
Definition TGraph.cxx:2490
void Zero(Int_t &k, Double_t AZ, Double_t BZ, Double_t E2, Double_t &X, Double_t &Y, Int_t maxiterations)
Find zero of a continuous function.
Definition TGraph.cxx:2691
virtual Double_t ** Allocate(Int_t newsize)
Allocate internal data structures for newsize points.
Definition TGraph.cxx:610
virtual void FitPanel()
Display a GUI panel with all graph fit options.
Definition TGraph.cxx:1294
void Browse(TBrowser *b) override
Browse.
Definition TGraph.cxx:671
virtual Bool_t DoMerge(const TGraph *g)
protected function to perform the merge operation of a graph
Definition TGraph.cxx:2650
virtual void InsertPointBefore(Int_t ipoint, Double_t x, Double_t y)
Insert a new point with coordinates (x,y) before the point number ipoint.
Definition TGraph.cxx:1768
TList * GetListOfFunctions() const
Definition TGraph.h:125
void ExecuteEvent(Int_t event, Int_t px, Int_t py) override
Execute action corresponding to one event.
Definition TGraph.cxx:1076
Double_t * GetX() const
Definition TGraph.h:138
void SaveAs(const char *filename="graph", Option_t *option="") const override
Save the graph as .csv, .tsv or .txt.
Definition TGraph.cxx:2112
virtual Double_t Eval(Double_t x, TSpline *spline=nullptr, Option_t *option="") const
Interpolate points in this graph at x using a TSpline.
Definition TGraph.cxx:973
virtual void InitExpo(Double_t xmin=0, Double_t xmax=0)
Compute Initial values of parameters for an exponential.
Definition TGraph.cxx:1677
virtual Int_t RemovePoint()
Delete point close to the mouse position Returns index of removed point (or -1 if nothing was changed...
Definition TGraph.cxx:2056
virtual void InitGaus(Double_t xmin=0, Double_t xmax=0)
Compute Initial values of parameters for a gaussian.
Definition TGraph.cxx:1639
virtual Bool_t IsHighlight() const
Definition TGraph.h:166
virtual void Add(TF1 *f, Double_t c1=1)
Performs the operation: y = y + c1*f(x,y) Errors are not recalculated.
Definition TGraph.cxx:642
virtual void Apply(TF1 *f)
Apply function f to all the data points f may be a 1-D function TF1 or 2-d function TF2 The Y values ...
Definition TGraph.cxx:658
void SetName(const char *name="") override
Set graph name.
Definition TGraph.cxx:2355
virtual void SetHighlight(Bool_t set=kTRUE)
Set highlight (enable/disable) mode for the graph by default highlight mode is disable.
Definition TGraph.cxx:2278
virtual void SwapPoints(Int_t pos1, Int_t pos2)
Swap points.
Definition TGraph.cxx:2557
void Draw(Option_t *chopt="") override
Draw this graph with its current attributes.
Definition TGraph.cxx:851
TAxis * GetXaxis() const
Get x axis of the graph.
Definition TGraph.cxx:1585
Bool_t GetEditable() const
Return kTRUE if kNotEditable bit is not set, kFALSE otherwise.
Definition TGraph.cxx:2259
virtual Double_t * GetEXhigh() const
Definition TGraph.h:142
virtual Double_t GetCorrelationFactor() const
Return graph correlation factor.
Definition TGraph.cxx:1316
virtual void FillZero(Int_t begin, Int_t end, Bool_t from_ctor=kTRUE)
Set zero values for point arrays in the range [begin, end) Should be redefined in descendant classes.
Definition TGraph.cxx:1122
virtual Double_t * GetEYhigh() const
Definition TGraph.h:144
Double_t ** ExpandAndCopy(Int_t size, Int_t iend)
if size > fMaxSize allocate new arrays of 2*size points and copy iend first points.
Definition TGraph.cxx:1109
virtual void Expand(Int_t newsize)
If array sizes <= newsize, expand storage to 2*newsize.
Definition TGraph.cxx:1085
void SaveHistogramAndFunctions(std::ostream &out, const char *varname, Option_t *option)
Save histogram and list of functions of TGraph as C++ statement Used in all TGraph-derived classes.
Definition TGraph.cxx:2182
virtual Double_t GetMean(Int_t axis=1) const
Return mean value of X (axis=1) or Y (axis=2)
Definition TGraph.cxx:1344
Double_t * fX
[fNpoints] array of X points
Definition TGraph.h:47
virtual void PaintStats(TF1 *fit)
Draw the stats.
Definition TGraph.cxx:2023
TAxis * GetYaxis() const
Get y axis of the graph.
Definition TGraph.cxx:1594
TObject * FindObject(const char *name) const override
Search object named name in the list of functions.
Definition TGraph.cxx:1131
virtual void SetStats(Bool_t stats=kTRUE)
Set statistics option on/off.
Definition TGraph.cxx:2405
virtual TH1F * GetHistogram() const
Returns a pointer to the histogram used to draw the axis Takes into account the two following cases.
Definition TGraph.cxx:1447
virtual Double_t GetErrorY(Int_t bin) const
It always returns a negative value. Real implementation in TGraphErrors.
Definition TGraph.cxx:1389
virtual Double_t * GetEY() const
Definition TGraph.h:141
void SavePrimitive(std::ostream &out, Option_t *option="") override
Save primitive as a C++ statement(s) on output stream out.
Definition TGraph.cxx:2164
virtual Double_t GetPointY(Int_t i) const
Get y value for point i.
Definition TGraph.cxx:1574
Double_t fMinimum
Minimum value for plotting along y.
Definition TGraph.h:51
void PaintGraph(Int_t npoints, const Double_t *x, const Double_t *y, Option_t *chopt)
Draw the (x,y) as a graph.
Definition TGraph.cxx:2005
void SetTitle(const char *title="") override
Change (i.e.
Definition TGraph.cxx:2371
virtual Int_t InsertPoint()
Insert a new point at the mouse position.
Definition TGraph.cxx:1718
virtual Double_t * GetEXlow() const
Definition TGraph.h:143
void RecursiveRemove(TObject *obj) override
Recursively remove object from the list of functions.
Definition TGraph.cxx:2042
virtual void SetPointY(Int_t i, Double_t y)
Set y value for point i.
Definition TGraph.cxx:2348
Int_t DistancetoPrimitive(Int_t px, Int_t py) override
Compute distance from point px,py to a graph.
Definition TGraph.cxx:899
virtual void SetHistogram(TH1F *h)
Set the histogram underlying the TGraph. This transfers the ownership of h to the TGraph....
Definition TGraph.cxx:2289
virtual void DrawPanel()
Display a panel with all graph drawing options.
Definition TGraph.cxx:952
void PaintGrapHist(Int_t npoints, const Double_t *x, const Double_t *y, Option_t *chopt)
Draw the (x,y) as a histogram.
Definition TGraph.cxx:2014
void SetNameTitle(const char *name="", const char *title="") override
Set graph name and title.
Definition TGraph.cxx:2391
virtual void SetPointX(Int_t i, Double_t x)
Set x value for point i.
Definition TGraph.cxx:2340
virtual void Set(Int_t n)
Set number of points in the graph Existing coordinates are preserved New coordinates above fNpoints a...
Definition TGraph.cxx:2244
virtual Int_t GetPoint(Int_t i, Double_t &x, Double_t &y) const
Get x and y values for point number i.
Definition TGraph.cxx:1552
virtual void SetEditable(Bool_t editable=kTRUE)
if editable=kFALSE, the graph cannot be modified with the mouse by default a TGraph is editable
Definition TGraph.cxx:2268
virtual void SetMinimum(Double_t minimum=-1111)
Set the minimum of the graph.
Definition TGraph.cxx:2307
TGraph()
Graph default constructor.
Definition TGraph.cxx:128
virtual Bool_t CopyPoints(Double_t **newarrays, Int_t ibegin, Int_t iend, Int_t obegin)
Copy points from fX and fY to arrays[0] and arrays[1] or to fX and fY if arrays == 0 and ibegin !...
Definition TGraph.cxx:799
Double_t fMaximum
Maximum value for plotting along y.
Definition TGraph.h:52
virtual Double_t GetErrorXhigh(Int_t bin) const
It always returns a negative value.
Definition TGraph.cxx:1398
TGraph & operator=(const TGraph &)
Equal operator for this graph.
Definition TGraph.cxx:252
virtual void InitPolynom(Double_t xmin=0, Double_t xmax=0)
Compute Initial values of parameters for a polynom.
Definition TGraph.cxx:1698
virtual Double_t GetErrorX(Int_t bin) const
It always returns a negative value. Real implementation in TGraphErrors.
Definition TGraph.cxx:1381
1-D histogram with a float per channel (see TH1 documentation)
Definition TH1.h:878
TH1 is the base class of all histogram classes in ROOT.
Definition TH1.h:109
virtual void SetDirectory(TDirectory *dir)
By default, when a histogram is created, it is added to the list of histogram objects in the current ...
Definition TH1.cxx:8978
void SetTitle(const char *title) override
Change/set the title.
Definition TH1.cxx:6766
void UseCurrentStyle() override
Copy current attributes from/to current style.
Definition TH1.cxx:7505
@ kNoStats
Don't draw stats box.
Definition TH1.h:403
TAxis * GetXaxis()
Definition TH1.h:571
virtual void SetMaximum(Double_t maximum=-1111)
Definition TH1.h:652
TAxis * GetYaxis()
Definition TH1.h:572
virtual void SetMinimum(Double_t minimum=-1111)
Definition TH1.h:653
void SavePrimitive(std::ostream &out, Option_t *option="") override
Save primitive as a C++ statement(s) on output stream out.
Definition TH1.cxx:7312
void SetName(const char *name) override
Change the name of this histogram.
Definition TH1.cxx:9001
TObject * Clone(const char *newname="") const override
Make a complete copy of the underlying object.
Definition TH1.cxx:2734
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:7471
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:575
void RecursiveRemove(TObject *obj) override
Remove object from this collection and recursively remove the object from all other objects (and coll...
Definition TList.cxx:761
TObject * Remove(TObject *obj) override
Remove object from the list.
Definition TList.cxx:819
TObject * First() const override
Return the first object in the list. Returns 0 when list is empty.
Definition TList.cxx:656
The TNamed class is the base class for all named ROOT classes.
Definition TNamed.h:29
void SavePrimitiveNameTitle(std::ostream &out, const char *variable_name)
Save object name and title into the output stream "out".
Definition TNamed.cxx:135
virtual void SetTitle(const char *title="")
Set the title of the TNamed.
Definition TNamed.cxx:173
const char * GetName() const override
Returns name of object.
Definition TNamed.h:49
void Streamer(TBuffer &) override
Stream an object of class TObject.
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
TNamed & operator=(const TNamed &rhs)
TNamed assignment operator.
Definition TNamed.cxx:50
Mother of all ROOT objects.
Definition TObject.h:41
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
Definition TObject.h:202
static TString SavePrimitiveVector(std::ostream &out, const char *prefix, Int_t len, Double_t *arr, Bool_t empty_line=kFALSE)
Save array in the output stream "out" as vector.
Definition TObject.cxx:788
virtual void UseCurrentStyle()
Set current style settings in this object This function is called when either TCanvas::UseCurrentStyl...
Definition TObject.cxx:885
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
Definition TObject.cxx:1057
virtual void AppendPad(Option_t *option="")
Append graphics object to current pad.
Definition TObject.cxx:203
virtual void SaveAs(const char *filename="", Option_t *option="") const
Save this object in the file specified by filename.
Definition TObject.cxx:705
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
Definition TObject.cxx:864
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
Definition TObject.cxx:543
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
Definition TObject.cxx:1071
void MakeZombie()
Definition TObject.h:53
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
void ResetBit(UInt_t f)
Definition TObject.h:201
@ kCanDelete
if object in a list can be deleted
Definition TObject.h:68
@ kInvalidObject
if object ctor succeeded but object should not be used
Definition TObject.h:78
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
Definition TObject.cxx:1045
Longptr_t ExecPlugin(int nargs)
Int_t LoadPlugin()
Load the plugin library for this handler.
Class to create third splines to interpolate knots Arbitrary conditions can be introduced for first a...
Definition TSpline.h:182
Double_t Eval(Double_t x) const override
Eval this spline at x.
Definition TSpline.cxx:780
Base class for spline implementation containing the Draw/Paint methods.
Definition TSpline.h:31
Basic string class.
Definition TString.h:138
Ssiz_t Length() const
Definition TString.h:425
void ToLower()
Change string to lower-case.
Definition TString.cxx:1189
void Clear()
Clear string without changing its capacity.
Definition TString.cxx:1241
TString & Replace(Ssiz_t pos, Ssiz_t n, const char *s)
Definition TString.h:702
const char * Data() const
Definition TString.h:384
TString & ReplaceAll(const TString &s1, const TString &s2)
Definition TString.h:712
void ToUpper()
Change string to upper case.
Definition TString.cxx:1202
Bool_t IsNull() const
Definition TString.h:422
TString & Remove(Ssiz_t pos)
Definition TString.h:693
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
void Form(const char *fmt,...)
Formats a string using a printf style format descriptor.
Definition TString.cxx:2362
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
Definition TString.h:640
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
Definition TString.h:659
void SetHistFillColor(Color_t color=1)
Definition TStyle.h:383
Color_t GetHistLineColor() const
Definition TStyle.h:235
Bool_t IsReading() const
Definition TStyle.h:300
void SetHistLineStyle(Style_t styl=0)
Definition TStyle.h:386
Style_t GetHistFillStyle() const
Definition TStyle.h:236
Color_t GetHistFillColor() const
Definition TStyle.h:234
void SetHistLineColor(Color_t color=1)
Definition TStyle.h:384
Style_t GetHistLineStyle() const
Definition TStyle.h:237
void SetHistFillStyle(Style_t styl=0)
Definition TStyle.h:385
Width_t GetHistLineWidth() const
Definition TStyle.h:238
void SetHistLineWidth(Width_t width=1)
Definition TStyle.h:387
virtual Bool_t ExpandPathName(TString &path)
Expand a pathname getting rid of special shell characters like ~.
Definition TSystem.cxx:1285
TVectorT.
Definition TVectorT.h:29
Abstract Base Class for Fitting.
static TVirtualFitter * GetFitter()
static: return the current Fitter
Abstract interface to a histogram painter.
static TVirtualGraphPainter * GetPainter()
Static function returning a pointer to the current graph painter.
TLine * line
Double_t y[n]
Definition legend1.C:17
return c1
Definition legend1.C:41
Double_t x[n]
Definition legend1.C:17
Double_t ey[n]
Definition legend1.C:17
const Int_t n
Definition legend1.C:16
TGraphErrors * gr
Definition legend1.C:25
Double_t ex[n]
Definition legend1.C:17
TF1 * f1
Definition legend1.C:11
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
double Chisquare(const TH1 &h1, TF1 &f1, bool useRange, EChisquareType type)
compute the chi2 value for an histogram given a function (see TH1::Chisquare for the documentation)
void FitOptionsMake(EFitObjectType type, const char *option, Foption_t &fitOption)
Decode list of options into fitOption.
Definition HFitImpl.cxx:685
Bool_t IsInside(T xp, T yp, Int_t np, T *x, T *y)
Function which returns kTRUE if point xp,yp lies inside the polygon defined by the np points in array...
Definition TMath.h:1320
Double_t Exp(Double_t x)
Returns the base-e exponential function of x, which is e raised to the power x.
Definition TMath.h:720
Double_t ATan2(Double_t y, Double_t x)
Returns the principal value of the arc tangent of y/x, expressed in radians.
Definition TMath.h:657
Double_t Log(Double_t x)
Returns the natural logarithm of x.
Definition TMath.h:767
Double_t Sqrt(Double_t x)
Returns the square root of x.
Definition TMath.h:673
Short_t Min(Short_t a, Short_t b)
Returns the smallest of a and b.
Definition TMathBase.h:199
void Sort(Index n, const Element *a, Index *index, Bool_t down=kTRUE)
Sort the n elements of the array a of generic templated type Element.
Definition TMathBase.h:432
Long64_t BinarySearch(Long64_t n, const T *array, T value)
Binary search in an array of n values to locate value.
Definition TMathBase.h:348
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.
Definition TMathBase.h:124
th1 Draw()
TMarker m
Definition textangle.C:8
TLine l
Definition textangle.C:4
static uint64_t sum(uint64_t i)
Definition Factory.cxx:2339