The initial data are stored in TMultiGraphs. They represent the european countries. The histogram filling is done according to a Mercator projection, therefore the bin contains should be proportional to the real surface of the countries.
The script is shooting npoints (script argument) randomly over the Europe area. The number of points inside the countries should be proportional to the country surface The estimated surface is compared to the surfaces taken from wikipedia.
void th2polyEurope(
Int_t npoints=500000)
{
const char *countries[nx] = {
"france", "spain", "sweden", "germany", "finland",
"norway", "poland", "italy", "yugoslavia", "united_kingdom",
"romania", "belarus","greece", "czechoslovakia","bulgaria",
"iceland", "hungary","portugal","austria", "ireland",
"lithuania", "latvia", "estonia", "denmark", "netherlands",
"switzerland","moldova","belgium", "albania", "cyprus",
"luxembourg", "andorra","malta", "liechtenstein", "san_marino", "monaco" };
547030, 505580, 449964, 357021, 338145,
324220, 312685, 301230, 255438, 244820,
237500, 207600, 131940, 127711, 110910,
103000, 93030, 89242, 83870, 70280,
65200, 64589, 45226, 43094, 41526,
41290, 33843, 30528, 28748, 9250,
2586, 468, 316, 160, 61, 2};
TH1F *
h =
new TH1F(
"h",
"Countries surfaces (in km^{2})",3,0,3);
for (i=0; i<nx; i++)
h->Fill(countries[i],
surfaces[i]);
f =
TFile::Open(
"http://root.cern/files/europe.root",
"cacheread");
printf("Cannot access europe.root. Is internet working ?\n");
return;
}
"Europe",
"Europe (bin contents are normalized to the surfaces in km^{2})",
lon1,lon2,lat1,lat2);
p->GetXaxis()->SetNdivisions(520);
p->GetXaxis()->SetTitle(
"longitude");
p->GetYaxis()->SetTitle(
"latitude");
while ((key = (
TKey*)nextkey())) {
}
}
p->ChangePartition(100, 100);
for (i=0; i<npoints; i++) {
longitude =
r.Uniform(lon1,lon2);
latitude =
r.Uniform(lat1,lat2);
}
Int_t nbins =
p->GetNumberOfBins();
for (j=0; j<nx; j++) {
for (i=0; i<nbins; i++) {
if (strstr(countries[j],
p->GetBinName(i+1))) {
h2->Fill(countries[j],
p->GetBinContent(i+1));
h2->SetBinError(j,
p->GetBinError(i+1));
}
}
}
for (i=0; i<nbins; i++)
p->SetBinContent(i+1, scale*
p->GetBinContent(i+1));
c1->SetRightMargin(0.047);
scale =
h->GetMaximum()/
h2->GetMaximum();
h->GetXaxis()->SetLabelFont(42);
h->GetXaxis()->SetLabelSize(0.03);
h->GetYaxis()->SetLabelFont(42);
for (i=0; i<nx; i++)
h2->SetBinError(i+1, scale2*
h2->GetBinError(i+1));
leg->AddEntry(
h,
"Real countries surfaces from Wikipedia (in km^{2})",
"lp");
leg->AddEntry(h2,
"Countries surfaces from TH2Poly (with errors)",
"lp");
printf("THPoly Europe surface estimation error wrt wikipedia = %f per cent when using %d points\n",100*error,npoints);
}
R__EXTERN TBenchmark * gBenchmark
winID h TVirtualViewer3D TVirtualGLPainter p
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 r
R__EXTERN TStyle * gStyle
virtual void Start(const char *name)
Starts Benchmark with the specified name.
virtual void Show(const char *name)
Stops Benchmark name and Prints results.
virtual void ToggleEventStatus()
Toggle event statusbar.
A ROOT file is an on-disk file, usually with extension .root, that stores objects in a file-system-li...
static TFile * Open(const char *name, Option_t *option="", const char *ftitle="", Int_t compress=ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault, Int_t netopt=0)
Create / open a file.
static Bool_t SetCacheFileDir(std::string_view cacheDir, Bool_t operateDisconnected=kTRUE, Bool_t forceCacheread=kFALSE)
Sets the directory where to locally stage/cache remote files.
1-D histogram with a float per channel (see TH1 documentation)
2D Histogram with Polygonal Bins
Book space in a file, create I/O buffers, to fill them, (un)compress them.
virtual TObject * ReadObj()
To read a TObject* from the file.
This class displays a legend box (TPaveText) containing several legend entries.
A TMultiGraph is a collection of TGraph (or derived) objects.
Mother of all ROOT objects.
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
virtual void Draw(Option_t *option="")
Default Draw method for all objects.
void SetGridx(Int_t value=1) override
void SetGridy(Int_t value=1) override
This is the base class for the ROOT Random number generators.
void SetOptStat(Int_t stat=1)
The type of information printed in the histogram statistics box can be selected via the parameter mod...
void SetStatX(Float_t x=0)
void SetStatW(Float_t w=0.19)
void SetStatY(Float_t y=0)
Double_t Log(Double_t x)
Returns the natural logarithm of x.
Double_t Sqrt(Double_t x)
Returns the square root of x.
Double_t Tan(Double_t)
Returns the tangent of an angle of x radians.
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.