2D plot in a circular domain?

Hi,

Is there a way to restrain the TF2::Draw to a circular domain (in place of a rectangular one) ?
I haven’t seen such a feature that could be very usefull in some cases (e.g. the Mexican-Hat function 1-x^2-y^2+(x^2+y^2)^2) where the values is very large in the corners.

Best,
Christophe.

Christophe,

Yes, this is implemented in ROOT via a TCutG. In the example below I create a circular cut.

Rene

{
double range = 3;
const Int_t n = 30;
Double_t x[n+1],y[n+1];
Double_t rcut = 0.85range;
Double_t dphi = TMath::TwoPi()/n;
for (Int_t i=0;i<n;i++) {
x[i] = rcut
TMath::Cos(idphi);
y[i] = rcut
TMath::Sin(i*dphi);
}
x[n] = x[0]; y[n] = y[0];
TCutG *mycut = new TCutG(“mycut”,n+1,x,y);
TF2 *f2 = new TF2(“f2”,“1-x^2-y^2+(x^2+y^2)^2”,-range,range,-range,range);
f2->Draw(“surf1 [mycut]”);
}

Thanks a lot, it gives very good results.
I just changed a bit the function to limit the value in the hidden region, since the z axis ranged is computed ignoring the TCutG:

TF2 f2 = new TF2(“TexMex”,"TMath::Min([0]-[1](x^2+y^2)+[2](x^2+y^2)^2,[3][0])",-range,range,-range,range);
f2->SetParameters(1,1.6,1,2);

Christophe.

Christophe,

Yes, your parameters make a nice mexican hat ::slight_smile:

In my previous mail, I forgot to mention that you can define multiple cuts
when calling Draw with
"surf1 [mycut1,mycut2]"

Rene

Is there a more general method to restrict the domain? Specifically, could we define a function O* Restrict_Domain(TF2* restriction) that accepts a TF2* function (R(x,y)) where the desired restriction R(x,y) < 0 is specified, and returns an O* object representing the necessary domain restriction? Since a TCutG object is a closed polygon defining a region in an x,y plot, it seems O must be a different type than TCutG.

Thank you in advance.