If what you want is a complicate geometry you may regard TVolume class instead of TNode.
With this class we did describe the whole ATLAS detector. It contains 15 levels of hierarchy
and 30'000'000 nodes.
See:
http://connery.star.bnl.gov/~fine/Detectors/ATLAS/AtlasInne.gif
http://connery.star.bnl.gov/~fine/Detectors/ATLAS/AtlasOrtho.gif
http://connery.star.bnl.gov/~fine/Detectors/ATLAS/AtlasPer.gif
http://connery.star.bnl.gov/~fine/Detectors/ATLAS/AtlasPers2.gif
and ROOT 2000 Workshop: http://root.cern.ch/root/R2000Program.html
17h00: STAR Simulation (ppt) (html): Pavel Nevski
ftp://root.cern.ch/root2k/pavelR2000.ppt
To reproduce the picture above one needs an access to
the "atlas.root" file and macro (see attachment)
"atlas.root" file is available on afs:
/afs/rhic/star/user/fine/WWW/Detectors/ATLAS/atlas.root
or one can download it from Web:
http://connery.star.bnl.gov/~fine/Detectors/ATLAS/atlas.root
To its hierarchy one can use ROOT TBrowser then:
TBrowser bb("Atlas",ATLS);
Each instance of TVolume class (http://root.cern.ch/root/html/TVolume.html)
can be created alone and then one can build the whole TVolume tree with some methods:
virtual TVolumePosition* Add(TVolume* node, Double_t x = 0, Double_t y = 0, Double_t z = 0, TRotMatrix* matrix = 0, UInt_t id =
0, Option_t* option)
TVolumePosition* Add(TVolume *volume, Double_t x, Double_t y, Double_t z, const Text_t *matrixname, UInt_t id, Option_t *)
TVolumePosition* Add(TVolume *node, TVolumePosition *nodePosition)
To "navigate" that tree TDataSetIter class can be in use (since TVolume is derived from TDataSet)
but there is a special iterator too. See TVolumeViewIter.
Valery
----- Original Message -----
From: Max Sang <sang@mppmu.mpg.de>
To: <rootdev@pcroot.cern.ch>
Subject: TNode hierarchy question
> Hello again
>
> I'm trying to build a simple visualisation tool for our
> vertex detector. I want to build a 'geometry' where the
> TNodes correspond to the tracks (TTUBEs at various angles).
> Since the number of nodes in the "geometry" is not known until
> run time I want to put them all in a container and build my
> geometry at the end of the function, just before drawing.
>
> I read in the Root mailing list the following message:
>
> ----------------------------------------------------
> Frederic MACHEFERT wrote:
> >
> > Hi rooters,
> >
> > I define many different nodes whom the hierarchy is not defined from the
> > beginning. After the initialisation of the nodes, I wish to sort them
> > according to a certain hierarchy. I thought that the goud way was to use
> > the SetParent function. But what I plot doesn't seem to produce what I
> > expect and if I have a look at the browser and at the node hierarchy
> > nothing is modified.
> >
> > I think I missed something with respect to SetParent. I would like to
> know
> > how I can change the hierarchy without deleting and creating again my
> > nodes.
> >
>
> Salut Frederic,
> I suggest you look at the logic in the TNode constructor to understand
> the current logic. In your case, if you want to set the hierarchy only
> once you have defined all the nodes, I suggest;
> file://disable current node in geometry
> gGeometry->setCurrentNode(0);
>
> file://define your nodes
> TNode *node = new TNode(...)
> ......
>
> file://clear the list of nodes in the geometry
> gGeometry->GetListOfNodes()->Clear();
>
> file://now start creating your hierarchy
> file://if a node has descendants, do:
> node->BuildListOfNodes();
>
> file://to insert a node in its parent node, do
> node->SetParent(parentNode);
> parentNode->GetListOfNodes()->Add(node);
>
> Let me know if you still have problems.
> I am curious to know why you can only build the hierarchy at the end.
> This is may be an interesting case.
>
> Rene Brun
> -----------------------------------------
>
> I tried doing something like this, storing the TNodes in a STL
> vector but had lots of basic problems with segmentation faults,
> for example:
>
> vector<TNode> nodelist(200);
>
> causes a segmentation fault in TNode::~Tnode()
>
> I am not so interested in why - although I would be interested to
> see if you can replicate this behaviour or have some idea why it
> happens.
>
> I would just like a hint about how you would design such a function.
> All I need to do is loop over some objects representing the tracks
> or vertices etc. For each I need a new TRotMatrix, a new TTUBE, and
> obviously a new TNode. Once I reach the end of the loop, I just
> need to put them inside a global TNode and draw it. Could I use
> a TList? I have a feeling that there is a very simple way to
> proceed, but I don't know what it is!
>
> Many thanks for your time
> Max
>
> +--------------------------------------------------------------+
> | Max Sang Email: max.sang@cern.ch or max.sang@desy.de |
> +---------------------------------+----------------------------+
> | Max Planck Institut fuer Physik | GSM +44-(0)77 8866 7605 |
> | Foehringer Ring 6 | Office +49-(0)89 32354 327 |
> | 80805 Muenchen | Fax +49-(0)89 322 6704 |
> +---------------------------------+----------------------------+
>
>
>
>
>
This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:35 MET