Logo ROOT  
Reference Guide
Loading...
Searching...
No Matches
tree200_temperature.C
Go to the documentation of this file.
1/// \file
2/// \ingroup tutorial_tree
3///
4/// This tutorial illustrates how to use the highlight mode with trees.
5/// It first creates a TTree from a temperature data set in Prague between 1775
6/// and 2004. Then it defines three pads representing the temperature per year,
7/// month and day. Thanks to the highlight mechanism it is possible to explore the
8/// data set only by moving the mouse on the plots. Movements on the years' plot
9/// will update the months' and days' plot. Movements on the months plot will update
10/// the days plot. Movements on the days' plot will display the exact temperature
11/// for a given day.
12///
13/// \macro_code
14///
15/// \date March 2018
16/// \author Jan Musinsky
17
18Int_t year, month, day;
19TTree *tree = nullptr;
20TProfile *hYear = nullptr, *hMonth = nullptr, *hDay = nullptr;
21TCanvas *Canvas = nullptr;
22Int_t customhb = -2;
23TLatex *info = nullptr;
24
25// Ranges for year, month, day and temperature
26Int_t rYear[3]; // from tree/data
27Int_t rMonth[3] = { 12, 1, 13 };
28Int_t rDay[3] = { 31, 1, 32 };
29Double_t rTemp[3] = { 55.0, -20.0, 35.0 };
30
31void HighlightDay(Int_t xhb)
32{
33 if (!info) {
34 info = new TLatex();
35 info->SetTextSizePixels(25);
36 Canvas->cd(3);
37 info->Draw();
38 gPad->Update();
39 }
40
41 if (xhb != customhb)
42 day = xhb;
43 TString temp = TString::Format(" %5.1f #circC", hDay->GetBinContent(day));
44 if (hDay->GetBinEntries(day) == 0)
45 temp = " ";
46 TString m = " ";
47 if (month > 0)
48 m = TString::Format("-%02d", month);
49 TString d = " ";
50 if (day > 0)
51 d = TString::Format("-%02d", day);
52 info->SetText(2.0, hDay->GetMinimum() * 0.8, TString::Format("%4d%s%s%s", year, m.Data(), d.Data(), temp.Data()));
53 Canvas->GetPad(3)->Modified();
54}
55
56void HighlightMonth(Int_t xhb)
57{
58 if (!hDay) {
59 hDay = new TProfile("hDay", "; day; temp, #circC", rDay[0], rDay[1], rDay[2]);
60 hDay->SetMinimum(rTemp[1]);
61 hDay->SetMaximum(rTemp[2]);
62 hDay->GetYaxis()->SetNdivisions(410);
63 hDay->SetFillColor(kGray);
64 hDay->SetMarkerStyle(kFullDotMedium);
65 Canvas->cd(3);
66 hDay->Draw("HIST, CP");
67 gPad->Update();
68 hDay->SetHighlight();
69 }
70
71 if (xhb != customhb)
72 month = xhb;
73 tree->Draw("T:DAY>>hDay", TString::Format("MONTH==%d && YEAR==%d", month, year), "goff");
74 hDay->SetTitle(TString::Format("temperature by day (month = %02d, year = %d)", month, year));
75 Canvas->GetPad(3)->Modified();
76
77 HighlightDay(customhb); // custom call HighlightDay
78}
79
80void HighlightYear(Int_t xhb)
81{
82 if (!hMonth) {
83 hMonth = new TProfile("hMonth", "; month; temp, #circC", rMonth[0], rMonth[1], rMonth[2]);
84 hMonth->SetMinimum(rTemp[1]);
85 hMonth->SetMaximum(rTemp[2]);
86 hMonth->GetXaxis()->SetNdivisions(112);
87 hMonth->GetXaxis()->CenterLabels();
88 hMonth->GetYaxis()->SetNdivisions(410);
89 hMonth->SetFillColor(kGray+1);
90 hMonth->SetMarkerStyle(kFullDotMedium);
91 Canvas->cd(2)->SetGridx();
92 hMonth->Draw("HIST, CP");
93 gPad->Update();
94 hMonth->SetHighlight();
95 }
96
97 year = xhb - 1 + rYear[1];
98 tree->Draw("T:MONTH>>hMonth", TString::Format("YEAR==%d", year), "goff");
99 hMonth->SetTitle(TString::Format("temperature by month (year = %d)", year));
100 Canvas->GetPad(2)->Modified();
101
102 HighlightMonth(customhb); // custom call HighlightMonth
103}
104
105void HighlightTemp(TVirtualPad *pad, TObject *obj, Int_t xhb, Int_t yhb)
106{
107 if (obj == hYear)
108 HighlightYear(xhb);
109 if (obj == hMonth)
110 HighlightMonth(xhb);
111 if (obj == hDay)
112 HighlightDay(xhb);
113 Canvas->Update();
114}
115
116void tree200_temperature()
117{
118 // Read file (data from Global Historical Climatology Network)
119 tree = new TTree("tree", "GHCN-Daily");
120 // data format: YEAR/I:MONTH/I:DAY/I:T/F
121
122 // Read file $ROOTSYS/tutorials/io/tree/temperature_Prague.dat
123 auto dir = gROOT->GetTutorialDir();
124 dir.Append("/io/tree/");
125 dir.ReplaceAll("/./","/");
126 if (tree->ReadFile(Form("%stemperature_Prague.dat", dir.Data())) == 0)
127 return;
128
129 // Compute range of years
130 tree->GetEntry(0);
131 rYear[1] = (Int_t)tree->GetLeaf("YEAR")->GetValue(); // first year
132 tree->GetEntry(tree->GetEntries() - 1);
133 rYear[2] = (Int_t)tree->GetLeaf("YEAR")->GetValue(); // last year
134 rYear[2] = rYear[2] + 1;
135 rYear[0] = rYear[2] - rYear[1];
136
137 // Create a TProfile for the average temperature by years
138 hYear = new TProfile("hYear", "temperature (average) by year; year; temp, #circC", rYear[0], rYear[1], rYear[2]);
139 tree->Draw("T:YEAR>>hYear", "", "goff");
140 hYear->SetMaximum(hYear->GetMean(2)*1.50);
141 hYear->SetMinimum(hYear->GetMean(2)*0.50);
142 hYear->GetXaxis()->SetNdivisions(410);
143 hYear->GetYaxis()->SetNdivisions(309);
144 hYear->SetLineColor(kGray+2);
145 hYear->SetMarkerStyle(8);
146 hYear->SetMarkerSize(0.75);
147
148 // Draw the average temperature by years
149 gStyle->SetOptStat("em");
150 Canvas = new TCanvas("Canvas", "Canvas", 0, 0, 700, 900);
151 Canvas->HighlightConnect("HighlightTemp(TVirtualPad*,TObject*,Int_t,Int_t)");
152 Canvas->Divide(1, 3, 0.001, 0.001);
153 Canvas->cd(1);
154 hYear->Draw("HIST, LP");
155 gPad->Update();
156
157 // Connect the highlight procedure to the temperature profile
158 hYear->SetHighlight();
159}
#define d(i)
Definition RSha256.hxx:102
int Int_t
Signed integer 4 bytes (int).
Definition RtypesCore.h:59
double Double_t
Double 8 bytes.
Definition RtypesCore.h:73
@ kGray
Definition Rtypes.h:66
@ kFullDotMedium
Definition TAttMarker.h:59
#define gROOT
Definition TROOT.h:417
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
Definition TString.cxx:2496
externTStyle * gStyle
Definition TStyle.h:442
#define gPad
virtual void SetNdivisions(Int_t n=510, Bool_t optim=kTRUE)
Set the number of divisions for this axis.
Definition TAttAxis.cxx:214
virtual void SetLineColor(Color_t lcolor)
Set the line color.
Definition TAttLine.h:44
virtual void SetMarkerStyle(Style_t mstyle=1)
Set the marker style.
Definition TAttMarker.h:43
virtual void SetMarkerSize(Size_t msize=1)
Set the marker size.
Definition TAttMarker.h:48
virtual void SetTextSizePixels(Int_t npixels)
Set the text size in pixel.
The Canvas class.
Definition TCanvas.h:23
virtual void HighlightConnect(const char *slot)
This is "simplification" for function TCanvas::Connect with Highlighted signal for specific slot.
Definition TCanvas.cxx:1624
TVirtualPad * cd(Int_t subpadnumber=0) override
Set current canvas & pad.
Definition TCanvas.cxx:716
void Update() override
Update canvas pad buffers.
Definition TCanvas.cxx:2486
virtual Double_t GetMean(Int_t axis=1) const
For axis = 1,2 or 3 returns the mean value of the histogram along X,Y or Z axis.
Definition TH1.cxx:7648
TAxis * GetXaxis()
Definition TH1.h:571
virtual void SetMaximum(Double_t maximum=-1111)
Definition TH1.h:652
TAxis * GetYaxis()
Definition TH1.h:572
void Draw(Option_t *option="") override
Draw this histogram with options.
Definition TH1.cxx:3097
virtual void SetMinimum(Double_t minimum=-1111)
Definition TH1.h:653
virtual void SetHighlight(Bool_t set=kTRUE)
Set highlight (enable/disable) mode for the histogram by default highlight mode is disable.
Definition TH1.cxx:4537
virtual Double_t GetValue(Int_t i=0) const
Definition TLeaf.h:186
Mother of all ROOT objects.
Definition TObject.h:42
virtual void Draw(Option_t *option="")
Default Draw method for all objects.
Definition TObject.cxx:293
void Divide(Int_t nx=1, Int_t ny=1, Float_t xmargin=0.01, Float_t ymargin=0.01, Int_t color=0) override
Automatic pad generation by division.
Definition TPad.cxx:1295
TVirtualPad * GetPad(Int_t subpadnumber) const override
Get a pointer to subpadnumber of this pad.
Definition TPad.cxx:3027
Profile Histogram.
Definition TProfile.h:32
Basic string class.
Definition TString.h:138
const char * Data() const
Definition TString.h:384
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:2385
virtual void SetText(Double_t x, Double_t y, const char *text)
Definition TText.h:74
A TTree represents a columnar dataset.
Definition TTree.h:89
virtual Int_t GetEntry(Long64_t entry, Int_t getall=0)
Read all branches of entry and return total number of bytes read.
Definition TTree.cxx:5718
void Draw(Option_t *opt) override
Default Draw method for all objects.
Definition TTree.h:478
virtual Long64_t GetEntries() const
Definition TTree.h:510
virtual TLeaf * GetLeaf(const char *branchname, const char *leafname)
Return pointer to the 1st Leaf named name in any Branch of this Tree or any branch in the list of fri...
Definition TTree.cxx:6306
virtual Long64_t ReadFile(const char *filename, const char *branchDescriptor="", char delimiter=' ')
Create or simply read branches from filename.
Definition TTree.cxx:7757
TVirtualPad is an abstract base class for the Pad and Canvas classes.
Definition TVirtualPad.h:51
virtual void Modified(Bool_t flag=1)=0
void Draw(Option_t *option="") override=0
Default Draw method for all objects.
virtual void SetGridx(Int_t value=1)=0
TMarker m
Definition textangle.C:8