1#include "tknuclear_chart.h"
21tknuclear_chart::tknuclear_chart(
const char *_title,
int type,
bool _autofit):
22 mgrn(Form(
"%s_N",_title),
""),
23 mgrz(Form(
"%s_Z",_title),
""),
31 hzn.SetNameTitle(Form(
"%s_ZN",chart_title.Data()), chart_title.Data());
32 hz.SetNameTitle(Form(
"%s_Z",chart_title.Data()), chart_title.Data());
33 hn.SetNameTitle(Form(
"%s_N",chart_title.Data()), chart_title.Data());
37 hzn.SetBins(201,-.5,200.5,121,-.5,120.5);
38 hz.SetBins(100,0,1,121,-.5,120.5);
39 hn.SetBins(201,-.5,200.5,100,0,1);
42 hzn.SetBins(80,1,161,55,1,111);
43 hz.SetBins(100,0,1,55,1,111);
44 hn.SetBins(80,1,161,100,0,1);
47 hzn.SetBins(80,0,160,55,0,110);
48 hz.SetBins(100,0,1,55,0,110);
49 hn.SetBins(80,0,160,100,0,1);
56 min_val_histo = _min_val_histo;
57 hzn.SetMinimum(min_val_histo);
63 if(std::isnan(_val))
return;
64 hzn.Fill(_nn,_zz,_val);
69 return hzn.GetBinContent(_nn,_zz);
74 if(std::isnan(_val))
return;
75 if(_val==0.)_val=-9999999;
76 hzn.SetBinContent(hzn.FindBin(_nn,_zz),_val);
79void tknuclear_chart::calculate_projections()
81 if(mgrz.GetListOfGraphs()) mgrz.GetListOfGraphs()->Clear();
82 if(mgrn.GetListOfGraphs()) mgrn.GetListOfGraphs()->Clear();
91 for(
int i=1 ; i<=hzn.GetNbinsX() ; i++) {
92 for(
int j=1 ; j<=hzn.GetNbinsY() ; j++) {
93 int _nn = hzn.GetXaxis()->GetBinCenter(i);
94 int _zz = hzn.GetYaxis()->GetBinCenter(j);
95 double _val = hzn.GetBinContent(i,j);
96 if(_val==0 || _val==-9999999.)
continue;
98 if(_val>max_val) max_val = _val;
99 if(_val<min_val) min_val = _val;
101 if(_zz>max_z) max_z = _zz;
102 if(_zz<min_z) min_z = _zz;
104 if(_nn>max_n) max_n = _nn;
105 if(_nn<min_n) min_n = _nn;
107 TGraph* gg =
nullptr;
108 if(!mgrz.GetListOfGraphs()||!(gg = (TGraph*)mgrz.GetListOfGraphs()->FindObject(Form(
"%s_N%d",chart_title.Data(),_nn)))){
110 gg->SetNameTitle(Form(
"%s_N%d",chart_title.Data(),_nn),Form(
"%d",_nn));
111 gg->SetMarkerStyle(7);
112 gg->SetMarkerColor((_nn%2)?odd_col:even_col);
113 gg->SetLineColor((_nn%2)?odd_col:even_col);
116 gg->SetPoint(gg->GetN(),_val,_zz);
119 if(!mgrn.GetListOfGraphs()||!(gg = (TGraph*)mgrn.GetListOfGraphs()->FindObject(Form(
"%s_Z%d",chart_title.Data(),_zz)))){
121 gg->SetNameTitle(Form(
"%s_Z%d",chart_title.Data(),_zz),Form(
"%d",_nn));
122 gg->SetMarkerStyle(7);
123 gg->SetMarkerColor((_zz%2)?odd_col:even_col);
124 gg->SetLineColor((_zz%2)?odd_col:even_col);
127 gg->SetPoint(gg->GetN(),_nn,_val);
130 if(hzn.GetEntries()==0) {
131 min_val=0;max_val=1.;
144 gStyle->SetOptTitle(0);
145 gStyle->SetOptStat(0);
149 calculate_projections();
153 if(autofit && hzn.GetEntries()){
154 hzn.GetXaxis()->SetRangeUser(min_n-2,max_n+2);
155 hzn.GetYaxis()->SetRangeUser(min_z-2,max_z+2);
157 hn.GetXaxis()->SetRangeUser(min_n-2,max_n+2);
158 hz.GetYaxis()->SetRangeUser(min_z-2,max_z+2);
164 set_axis_att(hzn.GetXaxis());
165 set_axis_att(hzn.GetYaxis());
174 hzn.Draw(
"col,same");
175 if(!fset_min_val) hzn.GetZaxis()->SetRangeUser(min_val,max_val);
176 else hzn.GetZaxis()->SetRangeUser(min_val_histo,max_val);
179 hz.GetXaxis()->SetLimits(min_val*0.9,max_val*1.1);
182 TAxis* ax = hz.GetXaxis();
183 double min = ax->GetXmin();
184 double max = ax->GetXmax();
186 draw_line(2, min, max);
187 draw_line(8, min, max);
188 draw_line(20, min, max);
189 draw_line(28, min, max);
190 draw_line(50, min, max);
191 draw_line(82, min, max);
196 ax->SetTitle(
"proton number");
197 ax->SetTitleOffset(1.2);
199 ax->SetNdivisions(ndivy);
205 hn.GetYaxis()->SetLimits(min_val*0.9,max_val*1.1);
212 draw_line(2, min, max,0);
213 draw_line(8, min, max,0);
214 draw_line(20, min, max,0);
215 draw_line(28, min, max,0);
216 draw_line(50, min, max,0);
217 draw_line(82, min, max,0);
218 draw_line(126, min, max,0);
223 ax->SetTitle(
"neutron number");
224 ax->SetTitleOffset(.9);
226 ax->SetNdivisions(ndivx);
235 ftitletex =
new TLatex(0.625,0.98,chart_title);
236 ftitletex->SetTextAlign(22);
237 ftitletex->SetTextSize(.03);
238 ftitletex->SetTextFont(42);
244 p1->Modified(); p1->Update();
245 p2->Modified(); p2->Update();
246 p3->Modified(); p3->Update();
264void tknuclear_chart::draw_lines(
int nz)
266 double xxmin = hzn.GetXaxis()->GetBinLowEdge(hzn.GetXaxis()->GetFirst());
267 double xxmax = hzn.GetXaxis()->GetBinUpEdge(hzn.GetXaxis()->GetLast());
268 double yymin = hzn.GetYaxis()->GetBinLowEdge(hzn.GetYaxis()->GetFirst());
269 double yymax = hzn.GetYaxis()->GetBinUpEdge(hzn.GetYaxis()->GetLast());
271 if(nz>xxmax||nz<xxmin) {}
273 TLine *ll =
new TLine(nz,yymin,nz,yymax);
274 ll->SetLineColor(kGray);
275 ll->SetLineWidth(kLineWidth);
278 if(nz>yymax||nz<yymin) {}
280 TLine *ll =
new TLine(xxmin,nz,xxmax,nz);
281 ll->SetLineColor(kGray);
282 ll->SetLineWidth(kLineWidth);
287void tknuclear_chart::draw_line(
int nz,
double min,
double max,
bool onx)
292 double xxmin = hz.GetYaxis()->GetBinLowEdge(hzn.GetYaxis()->GetFirst());
293 double xxmax = hz.GetYaxis()->GetBinUpEdge(hzn.GetYaxis()->GetLast());
294 if(nz>xxmax||nz<xxmin)
return;
296 ll =
new TLine(min,nz,max,nz);
297 ll->SetLineColor(kGray);
298 ll->SetLineWidth(kLineWidth);
302 double xxmin = hn.GetXaxis()->GetBinLowEdge(hzn.GetXaxis()->GetFirst());
303 double xxmax = hn.GetXaxis()->GetBinUpEdge(hzn.GetXaxis()->GetLast());
304 if(nz>xxmax||nz<xxmin)
return;
306 ll =
new TLine(nz,min,nz,max);
307 ll->SetLineColor(kGray);
308 ll->SetLineWidth(kLineWidth);
318 xratio = ((double)height)/((double)width);
319 xoffset = 0.7 - (1-(1.-0.7-.08)*xratio-.08);
323void tknuclear_chart::draw_canvas()
325 if(cc&&p1&&p2&&p3){
return;}
327 cc =
new TCanvas(Form(
"canvas_%s",chart_title.Data()),chart_title.Data(),width,height);
330 p1 =
new TPad(Form(
"chartzn_%s",chart_title.Data()),
"chartzn",0,0,1,1);
334 p1->SetTopMargin(0.05);
335 p1->SetRightMargin(0.05);
336 p1->SetBottomMargin(0.3);
337 p1->SetLeftMargin(0.3+xoffset);
338 p1->SetBit(TObject::kCannotPick);
341 p2 =
new TPad(Form(
"chartz_%s",chart_title.Data()),
"chartz",0.,0,1,1);
345 p2->SetTopMargin(0.05);
346 p2->SetBottomMargin(0.3);
347 p2->SetRightMargin(0.7-xoffset);
348 p2->SetLeftMargin(.08);
349 p2->SetBit(TObject::kCannotPick);
352 p3 =
new TPad(Form(
"chartn_%s",chart_title.Data()),
"chartn",0.,0,1,1);
356 p3->SetTopMargin(0.7);
357 p3->SetLeftMargin(0.3+xoffset);
358 p3->SetRightMargin(.05);
359 p3->SetBottomMargin(.08);
360 p3->SetBit(TObject::kCannotPick);
363 p4 =
new TPad(Form(
"control_%s",chart_title.Data()),
"chartn",0.,0,1,1);
365 p4->SetBit(TObject::kCannotPick);
369void tknuclear_chart::draw_axes()
371 delete axX;
delete axY;
delete axZn;
delete axZz;
372 axX=
nullptr;axY=
nullptr;axZn=
nullptr;axZz=
nullptr;
373 if(hzn.GetEntries()==0)
return;
376 axX =
new TGaxis(.3+xoffset,0.08,.95,0.08,
377 hn.GetXaxis()->GetBinLowEdge(hn.GetXaxis()->GetFirst()),
378 hn.GetXaxis()->GetBinUpEdge(hn.GetXaxis()->GetLast()),
380 axX->SetTitle(
"neutron number");
381 axX->SetName(
"axis1");
383 axX->SetTitleOffset(.9);
386 axY =
new TGaxis(.08,0.3,.08,0.95,
387 hz.GetYaxis()->GetBinLowEdge(hz.GetYaxis()->GetFirst()),
388 hz.GetYaxis()->GetBinUpEdge(hz.GetYaxis()->GetLast()),
390 axY->SetTitle(
"proton number");
391 axY->SetName(
"axis2");
393 axY->SetTitleOffset(1.2*xratio);
397 axZn =
new TGaxis(.95,0.08,.95,0.3,
398 hn.GetYaxis()->GetBinLowEdge(hn.GetYaxis()->GetFirst()),
399 hn.GetYaxis()->GetBinUpEdge(hn.GetYaxis()->GetLast()),
401 axZn->SetName(
"axis3");
405 axZz =
new TGaxis(.08,0.95,.3+xoffset,0.95,
406 hz.GetXaxis()->GetBinLowEdge(hz.GetXaxis()->GetFirst()),
407 hz.GetXaxis()->GetBinUpEdge(hz.GetXaxis()->GetLast()),
409 axZz->SetName(
"axis4");
410 axZz->SetLabelOffset(0.01/xratio);
415void tknuclear_chart::style_axis(TGaxis* _ax)
417 _ax->SetTitleSize(.03);
418 _ax->SetLabelSize(.025);
419 _ax->SetTickLength(0);
421 _ax->SetTextFont(42);
422 _ax->SetLabelFont(42);
426void tknuclear_chart::set_axis_att(TAxis *_ax,
bool _show_labels)
428 _ax->SetNdivisions(4);
429 _ax->SetTitleSize(.03);
430 _ax->SetLabelSize(.025);
432 _ax->SetAxisColor(kWhite);
434 if(!_show_labels){ _ax->SetLabelColor(kWhite); _ax->SetLabelSize(0); _ax->SetTitle(
"");}
439 if(cc) cc->SetEditable(_ed);
440 if(p1) p1->SetEditable(_ed);
441 if(p2) p2->SetEditable(_ed);
442 if(p3) p3->SetEditable(_ed);
443 if(p4) p4->SetEditable(_ed);
450 axX->SetNdivisions(ndivx);
451 p3->Modified(); p3->Update();
459 axY->SetNdivisions(ndivy);
460 p2->Modified(); p2->Update();
469 axZn->SetNdivisions(ndivz);
470 axZz->SetNdivisions(ndivz);
471 p2->Modified(); p2->Update();
472 p3->Modified(); p3->Update();
478 if(cc) cc->SaveAs(file_name);
484 for(
int i=0 ; i<=hzn.GetNbinsX() ; i++) {
485 for(
int j=0 ; j<=hzn.GetNbinsY() ; j++) {
486 if(hzn.GetBinContent(i,j) == -9999999.) {
487 hzn.SetBinContent(i,j,0);
489 else if(hzn.GetBinContent(i,j) == 0) {
490 hzn.SetBinContent(i,j,-9999999.);
nuclear chart plot with ROOT
tknuclear_chart(const char *title, int type=kAll, bool autofit=false)
default constructor
void fill(int _zz, int _nn, double _val)
fill the bin for a given nucleus (increment by _val)
void set_ndivisions_y(int _ndiv)
define the number of tics on the y axis
void set_ndivisions_x(int _ndiv)
define the number of tics on the x axis
void draw(bool _update_only=false)
draw the tknucleus chart
void save_as(const char *file_name)
save the nuclear chart in the file file_name
void set_ndivisions_z(int _ndiv)
define the number of tics on the z axis
void set_value(int _zz, int _nn, double _val)
set the bin value for a given nucleus
void set_size(int _width, int _height)
set the canvas size in pixels (default 900x900)
void update()
update the tknucleus chart
double get_value(int _zz, int _nn)
get the bin content for a given nucleus
void reset()
reset the tknuclear chart
void set_log_scale(bool _log=true)
print the tknuclear chart in log scale
void set_editables(bool _ed=true)
allow to edit the canvases
void hide_empty_bins()
remove color on empty bins (usefull for plot with negative and positive values)