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