LeWhoo
February 6, 2020, 5:30am
1
Dear ROOTers,
I am trying to draw a function which is a “conical gaussian” in 3D. There are two problems:
TF3 draw result is empty
I can fill a histogram with TF3 and successfully draw it, unles I try gl options. Then any refresh in the canvas causes a crash or a hang. OpenGL viewer draws everything OK, but its drawing options are quite limited…
I would apprieciate help.
___3dcone.py (809 Bytes)
Please read tips for efficient and successful posting and posting code
ROOT Version: 6.18
Platform: Fedora 31
Compiler: Not Provided
couet
February 6, 2020, 8:46am
2
You may have something wrong with your equation.
I tried the following simpler one and it works:
void cone3d()
{
gStyle->SetCanvasPreferGL(1);
TCanvas *cnv = new TCanvas("3dcone", "3dcome", 200, 10, 600, 600);
double xs = -10, ys=-10, zs = 1;
double xe = 10 , ye=10, ze = 10;
auto f5 = new TF3("f5", "x*x + y*y + (z-5)*(z-5)-9", xs, xe, ys, ye, zs, ze);
f5->Draw("gl");
}
May be the equation is not correct ? may be the limits are out of the range of the equation ?
linev
February 6, 2020, 9:25am
3
Hi,
Seems to be, when TF3::Draw() is called, it does not draw function itself, but solution of TF3(x,y,z) = 0.
Here is method used for painting:
https://root.cern/doc/master/classTPainter3dAlgorithms.html#a21eab91f04ce6c7d036e395d0462ee22
Therefore if you want to draw TF3 values, you should create and draw histogram
Regards,
Sergey
couet
February 6, 2020, 9:37am
4
Exactly. In the example I posted a sphere of radius 3 center on (0,0,5) is drawn.
The equation is:
xˆ2 + yˆ2 + (z-5)ˆ2 = 9
and you should write in TF3:
xˆ2 + yˆ2 + (z-5)ˆ2 - 9 = 0
So, for instance: x*x + y*y + (z-5)*(z-5)-9
LeWhoo
February 6, 2020, 1:16pm
5
Thanks, I understand, this makes sense (although some automatic conversion from TF3 to TH3 would make things much simpler).
However, can you comment on the crashes of the histogram?
couet
February 6, 2020, 1:56pm
6
void cone3d()
{
gStyle->SetCanvasPreferGL(1);
TCanvas *cnv = new TCanvas("3dcone", "3dcome", 200, 10, 600, 600);
double xs = -10, ys=-10, zs = 1;
double xe = 10 , ye=10, ze = 10;
auto f5 = new TF3("f5", "x*x + y*y + (z-5)*(z-5)-9", xs, xe, ys, ye, zs, ze);
int n = 20;
auto h5 = new TH3F("h5","h5",n,xs,xe,n,ys,ye,n,zs,ze);
double x,y,z;
TAxis *ax = h5->GetXaxis();
TAxis *ay = h5->GetYaxis();
TAxis *az = h5->GetZaxis();
for (int i=1; i<=n; i++) {
for (int j=1; j<=n; j++) {
for (int k=1; k<=n; k++) {
x = ax->GetBinCenter(i);
y = ay->GetBinCenter(j);
z = az->GetBinCenter(k);
h5->SetBinContent(i,j,k,f5->Eval(x, y, z));
}
}
}
h5->Draw("BOX2");
}
LeWhoo
February 6, 2020, 1:59pm
7
This is not the function that I have. I understand that something may be wrong with the function, but I guess it should not end with a crash. And nothing is obviously wrong if I can draw the histogram, but trying to rotate it, etc., causes a crash…
couet
February 6, 2020, 2:18pm
10
This one works:
void cone3d()
{
gStyle->SetCanvasPreferGL(1);
TCanvas *cnv = new TCanvas("3dcone", "3dcome", 200, 10, 600, 600);
double xs = -10, ys=-10, zs = 1;
double xe = 10 , ye=10, ze = 10;
auto f5 = new TF3("f5", "[0]*exp(-(sqrt(x*x+y*y)-[1]*z)^2/(2*[2]^2))", xs, xe, ys, ye, zs, ze);
f5->SetParameters(1,1,1);
int n = 20;
auto h5 = new TH3F("h5","h5",n,xs,xe,n,ys,ye,n,zs,ze);
double x,y,z;
TAxis *ax = h5->GetXaxis();
TAxis *ay = h5->GetYaxis();
TAxis *az = h5->GetZaxis();
for (int i=1; i<=n; i++) {
for (int j=1; j<=n; j++) {
for (int k=1; k<=n; k++) {
x = ax->GetBinCenter(i);
y = ay->GetBinCenter(j);
z = az->GetBinCenter(k);
h5->SetBinContent(i,j,k,f5->Eval(x, y, z));
}
}
}
h5->Draw("box2");
}
I do not get any crash and I get the following picture:
LeWhoo
February 6, 2020, 2:37pm
11
Indeed, your code does not crash. Thanks! Due to that, I found out what was the issue. In python, one needs to execute
ROOT.PyConfig.StartGuiThread = ‘inputhook’
otherwise keeping script alive, so that canvas does not close, causes crashes.
couet
February 6, 2020, 2:50pm
12
So that was more a python issue.
LeWhoo
February 6, 2020, 3:17pm
13
Well, pyROOT. And it is interesting, that it crashes with OpenGL, but not without it.
couet
February 6, 2020, 3:29pm
14
May be @etejedor has something to say about it.
Hi,
If the inputhook mechanism for the graphics in your system works, I would use it.
On the other hand, if you run your script with python -i my_script.sh
to keep the canvas alive, it crashes? What does the error message say?
LeWhoo
February 7, 2020, 4:19am
16
When I run python2 -i 3dcone.py after commenting the keep-alive loop, the canvas with contents is displayed, but I can’t rotate the histogram inside, resizing the canvas does make the interior all black, etc. Still, it doesn’t crash. Surprisingly, if I run it through ipython2, everything works fine.
If I add the inputhook, then it works fine both in python2 and ipython2.
system
Closed
February 21, 2020, 4:28am
17
This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.