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