[ROOT] TGeoShape->DistToIn();

From: Kevin Reil (reil@SLAC.stanford.edu)
Date: Sat May 31 2003 - 07:19:18 MEST


Hi all,

If I create a TShape *shape= new TGeoBBox(dx,dy,dz,origin) I can find the
distance to that shape using shape->DistToIn(point,dir); However, I cannot
rotate the TShape at its location.

Instead I use the TGeoManager and.... now I can position and rotate but
cannot get shape->DistToIn(point,dir) since the position and rotation are
not part of the TShape (they describe the node inside a volume).

...

I create a TopVolume (top) and inside it place several volumes at
different positions and rotations. I wish to know the distance from a
point to the surface of

if (pos not contained) {
dist=top->GetNode(i)->GetVolume()->GetShape()->DistToIn(pos,dir);
}

But the TGeoMatrix used to position the node inside of TopVolume does not
do anything to the shape.

For nonrotated objects I can adjust the pos by
pos[i]-=top->GetNode(i)->GetGetMatrix()->GetTranslation()[i];

But when the object has been rotated the distance to the surface isn't
correct.

Is there a way to use DistToIn(pos,dir) in a TGeoVolume->AddNode() manner?

An example script is attached.

Cheers,
Kevin

|------------------------------------|---------------------------------|
| Kevin Reil                         | 2575 Sand Hill Road, MS 26      |
| X2447, 103D A&E Bldg. 041          | Menlo Park, CA 94025            |
|------------------------------------|---------------------------------|
| http://www.slac.stanford.edu/~reil | Office (650) 926-2447           |
| reil@slac.stanford.edu             | Home   (650) 938-1767           |
| http://reil.no-ip.org              | Fax    (650) 926-5368           |
|----------------------------------------------------------------------|
|                    And my father dwelt in a tent.                    |
|----------------------------------------------------------------------|

On Fri, 30 May 2003, Axel Naumann wrote:

>Hi,
>
>Int_t GetNtuple(Int_t stage, TFile* &fin, TNtuple* &nin)
>
>You'll need to pass the arg by ref (better but uncommonway of stating
>that: You'll need to define the method such that the arg gets passed by
>ref), to allow GetNtuple to change the arg.
>
>Cheers, Axel.
>
>> Hi all,
>>
>> I should know this but
>>
>> I have files
>> photon_1.root with ntuple phot1
>> photon_2.root with ntuple phot2
>> photon_3.root with ntuple phot3
>>
>> If the file is there I want to return a pointer to it and a pointer to the
>> ntuple it contains.
>>
>> If it is not there, I want to return a pointer to a file ready to write to
>> and a pointer to an ntuple ready to fill.
>>
>> the new TFile and new TNtuple are lost when I go out of scope (I believe)
>> so when I do nin->GetEntries() before leaving I get the anwer when I do it
>> after leaving the function, I get a seg fault. I now its a scope thing but
>> I cannot recall the solution.
>>
>> Core example it is below.
>>
>> Thanks,
>> Kevin
>>
>>
>>
>> Int_t GetNtuple(Int_t stage, TFile *fin, TNtuple *nin)
>> {
>>   char fname[256];
>>   sprintf(fname,"photons_%d.root",stage);
>>   char ntname[256];
>>   sprintf(ntname,"phot%d",stage);
>>   cout << ntname << " " << fname << endl;
>>   TFile *tfin = new TFile("photons_1.root","READ");
>>   if (!fin->IsOpen()) {
>>     fin = new TFile(fname,"RECREATE");
>>     nin=new TNtuple(ntname,"photons","x:y:z:dx:dy:dz:lambda");
>>   } else {
>>     tnin = (TNtuple*)gROOT->FindObject(ntname);
>>   }
>>   fin=tfin->Copy((TObject*)tfin);
>>   nin=tnin->Copy((TObject*)tnin);
>>   cout << nin->GetEntries() << endl;
>>   //works here (there are 10,000 if file is there else 0)
>>   return 0;
>> }
>>
>> int main()
>> {
>> TNtuple *phot1;
>> TFile *f1;
>>
>> Int_t nocode=GetNtuple(1,f1,phot1);
>> cout << phot1->GetEntries() << endl; // segfault
>> }
>>
>> |------------------------------------|---------------------------------|
>> | Kevin Reil                         | 2575 Sand Hill Road, MS 26      |
>> | X2447, 103D A&E Bldg. 041          | Menlo Park, CA 94025            |
>> |------------------------------------|---------------------------------|
>> | http://www.slac.stanford.edu/~reil | Office (650) 926-2447           |
>> | reil@slac.stanford.edu             | Home   (650) 938-1767           |
>> | http://reil.no-ip.org              | Fax    (650) 926-5368           |
>> |----------------------------------------------------------------------|
>> |                    And my father dwelt in a tent.                    |
>> |----------------------------------------------------------------------|
>>
>> On Thu, 29 May 2003, Mayly Sanchez wrote:
>>
>>>
>>>Hi Rene,
>>>the root file is here:
>>>http://minos.phy.tufts.edu/msanchez/dchisq90_c.root
>>>Mayly
>>>
>>>On Thursday, May 29, 2003, at 01:47  PM, Rene Brun wrote:
>>>
>>>> Hi Mayly,
>>>>
>>>> Could you send the canvas.root file instead of canvas.gif?
>>>>
>>>> Rene Brun
>>>>
>>>> On Thu, 29 May
>>>> 2003, Mayly Sanchez wrote:
>>>>
>>>>>
>>>>> Thanks Rene, that fixed the contours but now it has a funny problem in
>>>>> the lego plots. For some cases (I still have to determine the
>>>>> pattern),
>>>>> it draws lego plots where part of it shows as a wireframe while the
>>>>> rest seems ok. The best way to explain is a picture:
>>>>> http://minos.phy.tufts.edu/msanchez/dchisq90_lego.gif
>>>>>
>>>>> Any ideas?
>>>>> Mayly
>>>>>
>>>>> On Wednesday, May 21, 2003, at 06:42  PM, Rene Brun wrote:
>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> Some changes have been made in the past few weeks by Olivier Couet
>>>>>> to solve the kind of problems you are reporting.
>>>>>> Take the version from CVS head and install from source.
>>>>>>
>>>>>> Rene Brun
>>>>>>
>>>>>> On Wed,
>>>>>> 21 May 2003, Mayly Sanchez wrote:
>>>>>>
>>>>>>>
>>>>>>> Hi,
>>>>>>> I have a macro for drawing non-equidistant 2d contours that used to
>>>>>>> work before but fails in most recent versions of root. The latest
>>>>>>> test
>>>>>>> has been done with 3.05/05.
>>>>>>>
>>>>>>> Here are the steps I follow:
>>>>>>> {TH2F *ch = new
>>>>>>> TH2F("ch","",nbinx,nbinxmin,nbinxmax,nbiny,nbinymin,nbinymax);
>>>>>>> ch->Fill(x,y,weight);
>>>>>>> ch->SetContour(2);
>>>>>>> ch->SetContourLevel(0,0.0)
>>>>>>> ch->SetContourLevel(1,2.0)
>>>>>>>
>>>>>>> ch->Draw("cont2");
>>>>>>> }
>>>>>>>
>>>>>>> Now what happens is: that if I do a lego2 plot before drawing the
>>>>>>> contours, the levels are set at the proper heights. Once I have run
>>>>>>> Draw("cont2") or any of the other cont options it recalculates the
>>>>>>> levels in a weird way. It seems to put the first level at the
>>>>>>> GetMinimum value and the second half way between the maximum and the
>>>>>>> minimum, as if it wanted to do equidistant contours.
>>>>>>>
>>>>>>> Did something change? Can I force it to do non-equidistant contours
>>>>>>> again? I need this urgently so any workarounds are welcome, thanks,
>>>>>>>
>>>>>>> Mayly
>>>>>>>
>>>>>>> ps. the method with SetContourLevels(2,vector) was also tested and
>>>>>>> gave
>>>>>>> the same results
>>>>>>>
>>>>>>>
>>>>>
>>>
>>>
>>
>
>





This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:12 MET