Hi Ilektra,
The feature you are asking for is not yet implemented in TGeo, due to
the following reason:
Suppose that you have a volume C positioned 2 times into a volume B -
this creates two different nodes C_1 and C_2. If B at its turn is
positioned 2 times into a mother volume A, you will also get B_1 and
B_2. Therefore you will get the following hierarchy:
A - volumes
/ \
B_1 B_2 - nodes
\ /
B
/ \
C_1 C_2
\ /
C
This means that for instance the node C_1 does not represent a unique
object, but two, corresponding to the paths:
A/B_1/C_1 and A/B_2/C_1
These have different transformations w.r.t the coordinate frame of A.
Which one to draw having a pointer to C_1... ? This is why visualization
is implemented only at the level of volumes.
About the question of retreiving a node pointer by name - I suppose
you have a hit structure having a node name attached. A node name is
made by: volumeName_copyNumber. I can implement a method :
TGeoNode *TGeoManager::GetNode(const char* nodename)
The gGeoManager->GetListOfNodes() list does not contain all nodes in the
geometry, but just the current branch. If your hits have volumeName +
copyNumber information, you can retreive yourself the node like:
gGeoManager->GetVolume(volName)->GetNode(copyNumber);
You can also use FindNode() with the x,y,z information of hits to
retreive not only the logical node, but also the full path to it
(corresponding unique physical object) :
TGeoNode* hitNode = gGeoManager->FindNode(x,y,z);
cout << gGeoManager->GetPath() << endl;
// now hitNode is known as the current node by the manager class
I hope this helps. Let me know if you have other questions.
Best regards,
Andrei
Ilektra-atha Christidi wrote:
> Hello
> I'm trying to draw objects from a GEANT3 geometry, which I have
> successfully read into ROOT. I managed to get a pointer to a certain
> volume and then draw it, using (name is a character string variable
> containing the name of the volume I want to draw)
>
> TGeoVolume *volu = gGeoManager->GetListOfVolumes()->FindObject(name);
> name->Draw();
>
> but I need to do the same for TGeoNodes, because I want to draw only the
> parts of the detector that saw a hit. The same recipe to get the pointer
> doesn't work, though, (I mean
> TGeoNode *node = gGeoManager->GetListOfNodes()->FindObject(name);
> node->Draw(); )
> giving the message
>
> Error: illegal pointer to class object node 0x0 803 FILE:(tmpfile) LINE:1
> *** Interpreter error recovered ***
>
> and neither does GetNode(), GetNodes() and FindNode(). The message I get
> is
>
> Error: Can't call TObjArray::GetNode("SDSC") in current scope
> FILE:(tmpfile) LINE:1
> Possible candidates are...
> filename line:size busy function type and name (in TObjArray)
> filename line:size busy function type and name (in TSeqCollection)
> filename line:size busy function type and name (in TCollection)
> filename line:size busy function type and name (in TObject)
> Error: non class,struct,union object GetListOfNodes() used with . or ->
> FILE:(tmpfile) LINE:1
> *** Interpreter error recovered ***
>
> I guess I have to set the node I want to retrieve as current node, but how
> do I do that? Or do I also need to specify the copy number when I call
> TGeoNode functions?
>
> In the next step, when I'll draw the nodes, is it possible to draw only
> the ones that saw a hit but in global coordinates (if the node appears
> always in the middle of the screen, as it happens for volumes, it's not
> very helpful...)? Maybe if I overlay them with a basic drawing of the
> whole detector?
>
> Thanks
>
> Ilektra Christidi
>
>
This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:14 MET