I like it. These should be good tools to have on hand as we figure out the new kit boundaries.<div><div><br></div><div>Jeff<br><br><div class="gmail_quote">On Sun, Aug 22, 2010 at 6:28 PM, Andrew Maclean <span dir="ltr"><<a href="mailto:a.maclean@cas.edu.au">a.maclean@cas.edu.au</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Hi Jeff,<br>
   This extends your idea of looking at the includes, by allowing the<br>
user to specify a particular class and (optionally) restrict the depth<br>
of the subsequent tree.<br>
<br>
You can select a particular class and view all the includes for that<br>
class. Optionally you can control the depth of the tree and create an<br>
output suitable for graphviz. To do this, use get_subgraph.py and run it<br>
using vtkdepends.py as input.<br>
<br>
python depends.py > vtkdepends.txt<br>
<br>
Here we select a particular class (vtkParametricTorus), the topmost two<br>
levels of the tree and format for subsequent use by graphviz.<br>
python get_subgraph.py -i vtkdepends.txt -c vtkParametricTorus -g -d 2 ><br>
x<br>
dot -Tps -O x<br>
<br>
Here we select a particular class (vtkParametricTorus), all levels of<br>
the tree and run it dependsview.py.<br>
python get_subgraph.py -i vtkdepends.txt -c vtkParametricTorus > x<br>
vtkpython dependsview.py x<br>
<br>
<br>
<br>
One issue I have is that I get a segfault if I restrich the depth of the<br>
tree output and run dependsview.py.<br>
e.g<br>
python get_subgraph.py -i vtkdepends.txt -c vtkParametricTorus -d 2 > x<br>
vtkpython dependsview.py x<br>
<br>
Produces this output:<br>
Total number of classes:  5<br>
Top Ten:<br>
 18<br>
vtkMath 7<br>
vtkObjectFactory 7<br>
vtkParametricTorus 3<br>
vtkParametricFunction 1<br>
 0<br>
Segmentation fault<br>
<br>
<br>
Regards<br>
   Andrew<br>
<br>
<br>
<br>
On Thu, 2010-08-19 at 11:43 -0400, Jeff Baumes wrote:<br>
> I attempted some custom scripts to see the include structure of VTK.<br>
><br>
><br>
> python depends.py > vtkdepends.txt<br>
> vtkpython dependsview.py vtkdepends.txt<br>
><br>
><br>
> The first will create a two-column list of all includes from one class<br>
> to another in VTK and must be called from the root of VTK source. The<br>
> second visualizes the data with VTK itself and prints out the classes<br>
> with the highest number of connections. Since the network makes a<br>
> so-called "hairball", the second script optionally takes a maximum<br>
> linkage cutoff to simplify the graph, e.g.<br>
><br>
><br>
> vtkpython dependsview.py vtkdepends.txt 10<br>
><br>
><br>
> will remove any classes with more than 10 links. Nodes are colored by<br>
> number of connections.<br>
><br>
><br>
> Jeff<br>
><br>
> On Wed, Aug 18, 2010 at 10:31 PM, Andrew Maclean<br>
> <<a href="mailto:a.maclean@cas.edu.au">a.maclean@cas.edu.au</a>> wrote:<br>
>         Hey Bill, need some python practice?<br>
><br>
>         This could be useful in looking at the examples.<br>
><br>
>         I attach a python script taken from<br>
>         <a href="http://furius.ca/pubcode/pub/conf/common/bin/depends-dot.html" target="_blank">http://furius.ca/pubcode/pub/conf/common/bin/depends-dot.html</a><br>
>         And modified so that just the executable and the VTK nodes of<br>
>         the graph<br>
>         are traversed.<br>
><br>
>         Run it as:<br>
>         python depends-dot ./Executable_File > depends.dot<br>
>         Then:<br>
>         neato -Tps -O depends.dot<br>
>         Or:<br>
>         dot -Tps -O depends.dot<br>
><br>
>         As you know you can also run:<br>
>         cmake --graphviz=g.dot ..<br>
>         Assuming the source is in ..<br>
>         Then:<br>
>         neato -Tps -O g.dot<br>
>         Or:<br>
>         dot -Tps -O g.dot<br>
><br>
>         However the python script (as modified) displays a lot more<br>
>         information.<br>
>         My modifications are:<br>
>                    # Eliminate /usr or /lib libraries and keep the<br>
>         first level<br>
>         VTK links.<br>
>                    #if fn.find('/usr') == -1 and fn.find('/lib') == -1<br>
>         and<br>
>         dfn.find('VTK') != -1:<br>
>                    # Just the executable and the VTK nodes of the<br>
>         graph are<br>
>         traversed.<br>
>                    if dfn.find('VTK') != -1:<br>
>                       print '"%s" -> "%s";' % (fn, dfn)<br>
><br>
>         Just uncomment the first if statement to just get the<br>
>         first-level<br>
>         linkages to libraries.<br>
><br>
>         This might be a good start in visualising dependencies.<br>
><br>
>         I also found  perl script called cinclude2dot that  produces<br>
>         an include<br>
>         dependency graph see: <a href="http://www.flourish.org/cinclude2dot/" target="_blank">http://www.flourish.org/cinclude2dot/</a> .<br>
>         The<br>
>         problem with this one is that it cannot follow links to<br>
>         includes in<br>
>         other directories. My perl is not good enough but it may be<br>
>         possible to<br>
>         parse CMakeCache.txt to pick up the include paths and traverse<br>
>         those<br>
>         directories too.<br>
>         I ran this on the vtk directory and the output is ... well ...<br>
>         spectacular and unreadable.<br>
>         Try:<br>
>         ./cinclude2dot --merge module > source.dot<br>
><br>
><br>
>         The python script focuses on libraries and the perl one<br>
>         focuses on<br>
>         includes. So the approaches are different. However I feel the<br>
>         perl one<br>
>         could be more useful with the --merge module option since in<br>
>         general vtk<br>
>         include names reflect class names.<br>
><br>
>         Regards<br>
>           Andrew<br>
><br>
><br>
>         --<br>
>         ___________________________________________<br>
>         Andrew J. P. Maclean<br>
>         Centre for Autonomous Systems<br>
>         The Rose Street Building J04<br>
>         The University of Sydney  2006  NSW<br>
>         AUSTRALIA<br>
>         Ph: +61 2 9351 3283<br>
>         Fax: +61 2 9351 7474<br>
>         URL: <a href="http://www.acfr.usyd.edu.au/" target="_blank">http://www.acfr.usyd.edu.au/</a><br>
>         ___________________________________________<br>
><br>
>         _______________________________________________<br>
>         Arb mailing list<br>
>         <a href="mailto:Arb@vtk.org">Arb@vtk.org</a><br>
>         <a href="http://public.kitware.com/cgi-bin/mailman/listinfo/arb" target="_blank">http://public.kitware.com/cgi-bin/mailman/listinfo/arb</a><br>
><br>
><br>
><br>
><br>
> --<br>
> Jeff Baumes, Ph.D.<br>
> Technical Lead, Kitware Inc.<br>
> (518) 881-4932<br>
><br>
<br>
--<br>
___________________________________________<br>
Andrew J. P. Maclean<br>
Centre for Autonomous Systems<br>
The Rose Street Building J04<br>
The University of Sydney  2006  NSW<br>
AUSTRALIA<br>
Ph: +61 2 9351 3283<br>
Fax: +61 2 9351 7474<br>
URL: <a href="http://www.acfr.usyd.edu.au/" target="_blank">http://www.acfr.usyd.edu.au/</a><br>
___________________________________________<br>
<br>
</blockquote></div><br><br clear="all"><br>-- <br>Jeff Baumes, Ph.D.<br>Technical Lead, Kitware Inc.<br>(518) 881-4932<br>
</div></div>