<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://vrl.cs.brown.edu/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tom+Sgouros</id>
	<title>VrlWiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="http://vrl.cs.brown.edu/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tom+Sgouros"/>
	<link rel="alternate" type="text/html" href="http://vrl.cs.brown.edu/wiki/index.php/Special:Contributions/Tom_Sgouros"/>
	<updated>2026-04-20T07:07:35Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>http://vrl.cs.brown.edu/wiki/index.php?title=Automatic_Build_System&amp;diff=6525</id>
		<title>Automatic Build System</title>
		<link rel="alternate" type="text/html" href="http://vrl.cs.brown.edu/wiki/index.php?title=Automatic_Build_System&amp;diff=6525"/>
		<updated>2014-05-05T19:28:53Z</updated>

		<summary type="html">&lt;p&gt;Tom Sgouros: /* The cron Job */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Every night an automatic build system runs to compile and test the software in the VRL group. This page is for documenting that process. Unless you are working on the build process itself, you probably don&#039;t need to know or care about these details. However, they need to be recorded somewhere, and this is as good a place as any.&lt;br /&gt;
&lt;br /&gt;
=The cron Job=&lt;br /&gt;
&lt;br /&gt;
The machine called franklin has a cron job running that every day at 1am (see &#039;&#039;&#039;/etc/cron.d/regression_test&#039;&#039;&#039;), runs a perl script created by t-staff. The script (&#039;&#039;&#039;/tstaff/bin/regtest&#039;&#039;&#039;) executes (as root) whatever it finds in &#039;&#039;&#039;/systest/bin&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Most days, what it finds in that directory is a bunch of scripts tstaff uses to manage the process and a couple of scripts called &#039;&#039;&#039;vrl_fast&#039;&#039;&#039; and &#039;&#039;&#039;vrl_slow&#039;&#039;&#039; that actually do the work.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;vrl_fast&#039;&#039;&#039; executes the script &#039;&#039;&#039;/research/graphics/tools/gfxtools-startup.sh&#039;&#039;&#039;, and then executes &#039;&#039;&#039;$G/common/build/valid/test.platform.py&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;vrl_slow&#039;&#039;&#039; does the same thing, but executes &#039;&#039;&#039;test.platform.py&#039;&#039;&#039; with the option &#039;&#039;&#039;-config $G/common/build/site/test.platform_slow.cfg&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Any scripts found in the &#039;&#039;&#039;/systest/bin&#039;&#039;&#039; directory that end in &#039;&#039;&#039;.weekly&#039;&#039;&#039; will only be run on Sundays.&lt;br /&gt;
&lt;br /&gt;
To add more tests to the nightly run, use the systest tools, found in &#039;&#039;&#039;/systest/bin&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
;systest-link&lt;br /&gt;
:Add a link to the &#039;&#039;&#039;/systest/bin&#039;&#039;&#039; directory. If it links to something executable, the system will run it every night.  The script will run as the user (and group) of the file owner.&lt;br /&gt;
:Use it like this: &#039;&#039;/systest/bin/systest-link /systest/projects/vrl/vrl_critical.sh /systest/bin/vrl_crit&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
;systest-rem&lt;br /&gt;
:Remove a link in the &#039;&#039;&#039;/systest/bin&#039;&#039;&#039; directory.&lt;br /&gt;
&lt;br /&gt;
There is also a &#039;&#039;&#039;systest-req&#039;&#039;&#039; which stores metadata (i.e. documentation) about each of the links in &#039;&#039;&#039;/systest/bin&#039;&#039;&#039; and a &#039;&#039;&#039;systest-info&#039;&#039;&#039; which regurgitates it.&lt;br /&gt;
&lt;br /&gt;
=The Test Script (test.platform.py)=&lt;br /&gt;
&lt;br /&gt;
The test script is a python program at &#039;&#039;&#039;$G/common/build/valid/test.platform.py&#039;&#039;&#039;.  It runs a series of tests and sends an email to people if they fail.&lt;br /&gt;
&lt;br /&gt;
==Configuration File==&lt;br /&gt;
&lt;br /&gt;
The tests run by the &#039;&#039;&#039;test.platform.py&#039;&#039;&#039; script are listed and configured in &#039;&#039;&#039;$G/common/build/site/test.platform.cfg&#039;&#039;&#039; (by default) and &#039;&#039;&#039;test.platform_slow.cfg&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The configuration file has a line for the Developer and a line for the emails of whoever wants to receive the &#039;&#039;&#039;Summary&#039;&#039;&#039; email messages.  Each line after looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
testName  testList  archList  scriptName  outputDir&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;testName&#039;&#039;&#039; is an arbitrary string used to label this test.&lt;br /&gt;
* &#039;&#039;&#039;testList&#039;&#039;&#039; is a comma-separated list of email addresses who will hear about it if this test fails. Use &#039;&#039;&#039;none&#039;&#039;&#039; if nobody cares.&lt;br /&gt;
* &#039;&#039;&#039;archList&#039;&#039;&#039; is a comma-separated list of architectures for which this test is designed. This is just a string to be compared with the $GARCH environment variable set in &#039;&#039;&#039;gfxtools-startup.sh&#039;&#039;&#039; (see above).&lt;br /&gt;
* &#039;&#039;&#039;scriptName&#039;&#039;&#039;, &#039;&#039;&#039;outputDir&#039;&#039;&#039; The &#039;&#039;&#039;scriptName&#039;&#039;&#039; is executed in the &#039;&#039;&#039;outputDir&#039;&#039;&#039; directory.  The script should contain the build and all the tests that need to be run.  We encourage you to use a simple makefile, and to make the default target do a build and test.&lt;br /&gt;
&lt;br /&gt;
The arguments are separated by spaces so there should be no spaces within the arguments.&lt;br /&gt;
&lt;br /&gt;
Blank lines are ignored and the &#039;&#039;&#039;#&#039;&#039;&#039; indicates a comment.&lt;br /&gt;
&lt;br /&gt;
==Editing the Test Script==&lt;br /&gt;
&lt;br /&gt;
The actual copy of the test script that runs is the one in &#039;&#039;&#039;/research/graphics/common/build/valid&#039;&#039;&#039;. Please don&#039;t edit this (or the configuration file) directly.  Instead, edit the version that is in your sandbox and use CVS to check it in.  Note that the first thing test.platform.py does is check stuff out from the main CVS archive and run that. If you edit this script, expect your changes to take effect the night after whatever runs tonight because whatever you check in will be checked out into the appropriate place, but by that point, the build process is already running.&lt;/div&gt;</summary>
		<author><name>Tom Sgouros</name></author>
	</entry>
	<entry>
		<id>http://vrl.cs.brown.edu/wiki/index.php?title=Automatic_Build_System&amp;diff=6524</id>
		<title>Automatic Build System</title>
		<link rel="alternate" type="text/html" href="http://vrl.cs.brown.edu/wiki/index.php?title=Automatic_Build_System&amp;diff=6524"/>
		<updated>2014-05-05T19:28:34Z</updated>

		<summary type="html">&lt;p&gt;Tom Sgouros: /* The cron Job */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Every night an automatic build system runs to compile and test the software in the VRL group. This page is for documenting that process. Unless you are working on the build process itself, you probably don&#039;t need to know or care about these details. However, they need to be recorded somewhere, and this is as good a place as any.&lt;br /&gt;
&lt;br /&gt;
=The cron Job=&lt;br /&gt;
&lt;br /&gt;
The machine called franklin has a cron job running that every day at 1am (see &#039;&#039;&#039;/etc/cron.d/regression_test&#039;&#039;&#039;), runs a perl script created by t-staff. The script (&#039;&#039;&#039;/tstaff/bin/regtest&#039;&#039;&#039;) executes (as root) whatever it finds in &#039;&#039;&#039;/systest/bin&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Most days, what it finds in that directory is a bunch of scripts tstaff uses to manage the process and a couple of scripts called &#039;&#039;&#039;vrl_fast&#039;&#039;&#039; and &#039;&#039;&#039;vrl_slow&#039;&#039;&#039; that actually do the work.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;vrl_fast&#039;&#039;&#039; executes the script &#039;&#039;&#039;/research/graphics/tools/gfxtools-startup.sh&#039;&#039;&#039;, and then executes &#039;&#039;&#039;$G/common/build/valid/test.platform.py&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;vrl_slow&#039;&#039;&#039; does the same thing, but executes &#039;&#039;&#039;test.platform.py&#039;&#039;&#039; with the option &#039;&#039;&#039;-config $G/common/build/site/test.platform_slow.cfg&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Any scripts found in the &#039;&#039;&#039;/systest/bin&#039;&#039;&#039; directory that end in &#039;&#039;&#039;.weekly&#039;&#039;&#039; will only be run on Sundays.&lt;br /&gt;
&lt;br /&gt;
To add more tests to the nightly run, use the systest tools, found in &#039;&#039;&#039;/systest/bin&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
;systest-link&lt;br /&gt;
:Add a link to the &#039;&#039;&#039;/systest/bin&#039;&#039;&#039; directory. If it links to something executable, the system will run it every night.  The script will run as the user (and group) of the file owner.&lt;br /&gt;
:Use it like this: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;/systest/bin/systest-link /systest/projects/vrl/vrl_critical.sh /systest/bin/vrl_crit&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
;systest-rem&lt;br /&gt;
:Remove a link in the &#039;&#039;&#039;/systest/bin&#039;&#039;&#039; directory.&lt;br /&gt;
&lt;br /&gt;
There is also a &#039;&#039;&#039;systest-req&#039;&#039;&#039; which stores metadata (i.e. documentation) about each of the links in &#039;&#039;&#039;/systest/bin&#039;&#039;&#039; and a &#039;&#039;&#039;systest-info&#039;&#039;&#039; which regurgitates it.&lt;br /&gt;
&lt;br /&gt;
=The Test Script (test.platform.py)=&lt;br /&gt;
&lt;br /&gt;
The test script is a python program at &#039;&#039;&#039;$G/common/build/valid/test.platform.py&#039;&#039;&#039;.  It runs a series of tests and sends an email to people if they fail.&lt;br /&gt;
&lt;br /&gt;
==Configuration File==&lt;br /&gt;
&lt;br /&gt;
The tests run by the &#039;&#039;&#039;test.platform.py&#039;&#039;&#039; script are listed and configured in &#039;&#039;&#039;$G/common/build/site/test.platform.cfg&#039;&#039;&#039; (by default) and &#039;&#039;&#039;test.platform_slow.cfg&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The configuration file has a line for the Developer and a line for the emails of whoever wants to receive the &#039;&#039;&#039;Summary&#039;&#039;&#039; email messages.  Each line after looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
testName  testList  archList  scriptName  outputDir&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;testName&#039;&#039;&#039; is an arbitrary string used to label this test.&lt;br /&gt;
* &#039;&#039;&#039;testList&#039;&#039;&#039; is a comma-separated list of email addresses who will hear about it if this test fails. Use &#039;&#039;&#039;none&#039;&#039;&#039; if nobody cares.&lt;br /&gt;
* &#039;&#039;&#039;archList&#039;&#039;&#039; is a comma-separated list of architectures for which this test is designed. This is just a string to be compared with the $GARCH environment variable set in &#039;&#039;&#039;gfxtools-startup.sh&#039;&#039;&#039; (see above).&lt;br /&gt;
* &#039;&#039;&#039;scriptName&#039;&#039;&#039;, &#039;&#039;&#039;outputDir&#039;&#039;&#039; The &#039;&#039;&#039;scriptName&#039;&#039;&#039; is executed in the &#039;&#039;&#039;outputDir&#039;&#039;&#039; directory.  The script should contain the build and all the tests that need to be run.  We encourage you to use a simple makefile, and to make the default target do a build and test.&lt;br /&gt;
&lt;br /&gt;
The arguments are separated by spaces so there should be no spaces within the arguments.&lt;br /&gt;
&lt;br /&gt;
Blank lines are ignored and the &#039;&#039;&#039;#&#039;&#039;&#039; indicates a comment.&lt;br /&gt;
&lt;br /&gt;
==Editing the Test Script==&lt;br /&gt;
&lt;br /&gt;
The actual copy of the test script that runs is the one in &#039;&#039;&#039;/research/graphics/common/build/valid&#039;&#039;&#039;. Please don&#039;t edit this (or the configuration file) directly.  Instead, edit the version that is in your sandbox and use CVS to check it in.  Note that the first thing test.platform.py does is check stuff out from the main CVS archive and run that. If you edit this script, expect your changes to take effect the night after whatever runs tonight because whatever you check in will be checked out into the appropriate place, but by that point, the build process is already running.&lt;/div&gt;</summary>
		<author><name>Tom Sgouros</name></author>
	</entry>
	<entry>
		<id>http://vrl.cs.brown.edu/wiki/index.php?title=Automatic_Build_System&amp;diff=6523</id>
		<title>Automatic Build System</title>
		<link rel="alternate" type="text/html" href="http://vrl.cs.brown.edu/wiki/index.php?title=Automatic_Build_System&amp;diff=6523"/>
		<updated>2014-05-05T15:05:59Z</updated>

		<summary type="html">&lt;p&gt;Tom Sgouros: /* The cron Job */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Every night an automatic build system runs to compile and test the software in the VRL group. This page is for documenting that process. Unless you are working on the build process itself, you probably don&#039;t need to know or care about these details. However, they need to be recorded somewhere, and this is as good a place as any.&lt;br /&gt;
&lt;br /&gt;
=The cron Job=&lt;br /&gt;
&lt;br /&gt;
The machine called franklin has a cron job running that every day at 1am (see &#039;&#039;&#039;/etc/cron.d/regression_test&#039;&#039;&#039;), runs a perl script created by t-staff. The script (&#039;&#039;&#039;/tstaff/bin/regtest&#039;&#039;&#039;) executes (as root) whatever it finds in &#039;&#039;&#039;/systest/bin&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Most days, what it finds in that directory is a bunch of scripts tstaff uses to manage the process and a couple of scripts called &#039;&#039;&#039;vrl_fast&#039;&#039;&#039; and &#039;&#039;&#039;vrl_slow&#039;&#039;&#039; that actually do the work.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;vrl_fast&#039;&#039;&#039; executes the script &#039;&#039;&#039;/research/graphics/tools/gfxtools-startup.sh&#039;&#039;&#039;, and then executes &#039;&#039;&#039;$G/common/build/valid/test.platform.py&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;vrl_slow&#039;&#039;&#039; does the same thing, but executes &#039;&#039;&#039;test.platform.py&#039;&#039;&#039; with the option &#039;&#039;&#039;-config $G/common/build/site/test.platform_slow.cfg&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Any scripts found in the &#039;&#039;&#039;/systest/bin&#039;&#039;&#039; directory that end in &#039;&#039;&#039;.weekly&#039;&#039;&#039; will only be run on Sundays.&lt;br /&gt;
&lt;br /&gt;
To add more tests to the nightly run, use the systest tools, found in &#039;&#039;&#039;/systest/bin&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
;systest-link&lt;br /&gt;
:Add a link to the &#039;&#039;&#039;/systest/bin&#039;&#039;&#039; directory. If it links to something executable, the system will run it every night.  The script will run as the user (and group) of the file owner.&lt;br /&gt;
:Use it like this: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/systest/bin/systest-link /systest/projects/vrl/vrl_critical.sh /systest/bin/vrl_crit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;systest-rem&lt;br /&gt;
:Remove a link in the &#039;&#039;&#039;/systest/bin&#039;&#039;&#039; directory.&lt;br /&gt;
&lt;br /&gt;
There is also a &#039;&#039;&#039;systest-req&#039;&#039;&#039; which stores metadata (i.e. documentation) about each of the links in &#039;&#039;&#039;/systest/bin&#039;&#039;&#039; and a &#039;&#039;&#039;systest-info&#039;&#039;&#039; which regurgitates it.&lt;br /&gt;
&lt;br /&gt;
=The Test Script (test.platform.py)=&lt;br /&gt;
&lt;br /&gt;
The test script is a python program at &#039;&#039;&#039;$G/common/build/valid/test.platform.py&#039;&#039;&#039;.  It runs a series of tests and sends an email to people if they fail.&lt;br /&gt;
&lt;br /&gt;
==Configuration File==&lt;br /&gt;
&lt;br /&gt;
The tests run by the &#039;&#039;&#039;test.platform.py&#039;&#039;&#039; script are listed and configured in &#039;&#039;&#039;$G/common/build/site/test.platform.cfg&#039;&#039;&#039; (by default) and &#039;&#039;&#039;test.platform_slow.cfg&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The configuration file has a line for the Developer and a line for the emails of whoever wants to receive the &#039;&#039;&#039;Summary&#039;&#039;&#039; email messages.  Each line after looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
testName  testList  archList  scriptName  outputDir&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;testName&#039;&#039;&#039; is an arbitrary string used to label this test.&lt;br /&gt;
* &#039;&#039;&#039;testList&#039;&#039;&#039; is a comma-separated list of email addresses who will hear about it if this test fails. Use &#039;&#039;&#039;none&#039;&#039;&#039; if nobody cares.&lt;br /&gt;
* &#039;&#039;&#039;archList&#039;&#039;&#039; is a comma-separated list of architectures for which this test is designed. This is just a string to be compared with the $GARCH environment variable set in &#039;&#039;&#039;gfxtools-startup.sh&#039;&#039;&#039; (see above).&lt;br /&gt;
* &#039;&#039;&#039;scriptName&#039;&#039;&#039;, &#039;&#039;&#039;outputDir&#039;&#039;&#039; The &#039;&#039;&#039;scriptName&#039;&#039;&#039; is executed in the &#039;&#039;&#039;outputDir&#039;&#039;&#039; directory.  The script should contain the build and all the tests that need to be run.  We encourage you to use a simple makefile, and to make the default target do a build and test.&lt;br /&gt;
&lt;br /&gt;
The arguments are separated by spaces so there should be no spaces within the arguments.&lt;br /&gt;
&lt;br /&gt;
Blank lines are ignored and the &#039;&#039;&#039;#&#039;&#039;&#039; indicates a comment.&lt;br /&gt;
&lt;br /&gt;
==Editing the Test Script==&lt;br /&gt;
&lt;br /&gt;
The actual copy of the test script that runs is the one in &#039;&#039;&#039;/research/graphics/common/build/valid&#039;&#039;&#039;. Please don&#039;t edit this (or the configuration file) directly.  Instead, edit the version that is in your sandbox and use CVS to check it in.  Note that the first thing test.platform.py does is check stuff out from the main CVS archive and run that. If you edit this script, expect your changes to take effect the night after whatever runs tonight because whatever you check in will be checked out into the appropriate place, but by that point, the build process is already running.&lt;/div&gt;</summary>
		<author><name>Tom Sgouros</name></author>
	</entry>
	<entry>
		<id>http://vrl.cs.brown.edu/wiki/index.php?title=Automatic_Build_System&amp;diff=6522</id>
		<title>Automatic Build System</title>
		<link rel="alternate" type="text/html" href="http://vrl.cs.brown.edu/wiki/index.php?title=Automatic_Build_System&amp;diff=6522"/>
		<updated>2014-05-05T15:05:22Z</updated>

		<summary type="html">&lt;p&gt;Tom Sgouros: /* The cron Job */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Every night an automatic build system runs to compile and test the software in the VRL group. This page is for documenting that process. Unless you are working on the build process itself, you probably don&#039;t need to know or care about these details. However, they need to be recorded somewhere, and this is as good a place as any.&lt;br /&gt;
&lt;br /&gt;
=The cron Job=&lt;br /&gt;
&lt;br /&gt;
The machine called franklin has a cron job running that every day at 1am (see &#039;&#039;&#039;/etc/cron.d/regression_test&#039;&#039;&#039;), runs a perl script created by t-staff. The script (&#039;&#039;&#039;/tstaff/bin/regtest&#039;&#039;&#039;) executes (as root) whatever it finds in &#039;&#039;&#039;/systest/bin&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Most days, what it finds in that directory is a bunch of scripts tstaff uses to manage the process and a couple of scripts called &#039;&#039;&#039;vrl_fast&#039;&#039;&#039; and &#039;&#039;&#039;vrl_slow&#039;&#039;&#039; that actually do the work.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;vrl_fast&#039;&#039;&#039; executes the script &#039;&#039;&#039;/research/graphics/tools/gfxtools-startup.sh&#039;&#039;&#039;, and then executes &#039;&#039;&#039;$G/common/build/valid/test.platform.py&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;vrl_slow&#039;&#039;&#039; does the same thing, but executes &#039;&#039;&#039;test.platform.py&#039;&#039;&#039; with the option &#039;&#039;&#039;-config $G/common/build/site/test.platform_slow.cfg&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Any scripts found in the &#039;&#039;&#039;/systest/bin&#039;&#039;&#039; directory that end in &#039;&#039;&#039;.weekly&#039;&#039;&#039; will only be run on Sundays.&lt;br /&gt;
&lt;br /&gt;
To add more tests to the nightly run, use the systest tools, found in &#039;&#039;&#039;/systest/bin&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
;systest-link&lt;br /&gt;
:Add a link to the &#039;&#039;&#039;/systest/bin&#039;&#039;&#039; directory. If it links to something executable, the system will run it every night.  The script will run as the user (and group) of the file owner.&lt;br /&gt;
:Use it like this: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/systest/bin/systest-link /systest/projects/vrl/vrl_critical.sh /systest/bin/vrl_crit&amp;lt;/code&amp;gt;&lt;br /&gt;
;systest-rem&lt;br /&gt;
:Remove a link in the &#039;&#039;&#039;/systest/bin&#039;&#039;&#039; directory.&lt;br /&gt;
&lt;br /&gt;
There is also a &#039;&#039;&#039;systest-req&#039;&#039;&#039; which stores metadata (i.e. documentation) about each of the links in &#039;&#039;&#039;/systest/bin&#039;&#039;&#039; and a &#039;&#039;&#039;systest-info&#039;&#039;&#039; which regurgitates it.&lt;br /&gt;
&lt;br /&gt;
=The Test Script (test.platform.py)=&lt;br /&gt;
&lt;br /&gt;
The test script is a python program at &#039;&#039;&#039;$G/common/build/valid/test.platform.py&#039;&#039;&#039;.  It runs a series of tests and sends an email to people if they fail.&lt;br /&gt;
&lt;br /&gt;
==Configuration File==&lt;br /&gt;
&lt;br /&gt;
The tests run by the &#039;&#039;&#039;test.platform.py&#039;&#039;&#039; script are listed and configured in &#039;&#039;&#039;$G/common/build/site/test.platform.cfg&#039;&#039;&#039; (by default) and &#039;&#039;&#039;test.platform_slow.cfg&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The configuration file has a line for the Developer and a line for the emails of whoever wants to receive the &#039;&#039;&#039;Summary&#039;&#039;&#039; email messages.  Each line after looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
testName  testList  archList  scriptName  outputDir&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;testName&#039;&#039;&#039; is an arbitrary string used to label this test.&lt;br /&gt;
* &#039;&#039;&#039;testList&#039;&#039;&#039; is a comma-separated list of email addresses who will hear about it if this test fails. Use &#039;&#039;&#039;none&#039;&#039;&#039; if nobody cares.&lt;br /&gt;
* &#039;&#039;&#039;archList&#039;&#039;&#039; is a comma-separated list of architectures for which this test is designed. This is just a string to be compared with the $GARCH environment variable set in &#039;&#039;&#039;gfxtools-startup.sh&#039;&#039;&#039; (see above).&lt;br /&gt;
* &#039;&#039;&#039;scriptName&#039;&#039;&#039;, &#039;&#039;&#039;outputDir&#039;&#039;&#039; The &#039;&#039;&#039;scriptName&#039;&#039;&#039; is executed in the &#039;&#039;&#039;outputDir&#039;&#039;&#039; directory.  The script should contain the build and all the tests that need to be run.  We encourage you to use a simple makefile, and to make the default target do a build and test.&lt;br /&gt;
&lt;br /&gt;
The arguments are separated by spaces so there should be no spaces within the arguments.&lt;br /&gt;
&lt;br /&gt;
Blank lines are ignored and the &#039;&#039;&#039;#&#039;&#039;&#039; indicates a comment.&lt;br /&gt;
&lt;br /&gt;
==Editing the Test Script==&lt;br /&gt;
&lt;br /&gt;
The actual copy of the test script that runs is the one in &#039;&#039;&#039;/research/graphics/common/build/valid&#039;&#039;&#039;. Please don&#039;t edit this (or the configuration file) directly.  Instead, edit the version that is in your sandbox and use CVS to check it in.  Note that the first thing test.platform.py does is check stuff out from the main CVS archive and run that. If you edit this script, expect your changes to take effect the night after whatever runs tonight because whatever you check in will be checked out into the appropriate place, but by that point, the build process is already running.&lt;/div&gt;</summary>
		<author><name>Tom Sgouros</name></author>
	</entry>
	<entry>
		<id>http://vrl.cs.brown.edu/wiki/index.php?title=Automatic_Build_System&amp;diff=6521</id>
		<title>Automatic Build System</title>
		<link rel="alternate" type="text/html" href="http://vrl.cs.brown.edu/wiki/index.php?title=Automatic_Build_System&amp;diff=6521"/>
		<updated>2014-05-05T14:50:11Z</updated>

		<summary type="html">&lt;p&gt;Tom Sgouros: added documentation about systest tools.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Every night an automatic build system runs to compile and test the software in the VRL group. This page is for documenting that process. Unless you are working on the build process itself, you probably don&#039;t need to know or care about these details. However, they need to be recorded somewhere, and this is as good a place as any.&lt;br /&gt;
&lt;br /&gt;
=The cron Job=&lt;br /&gt;
&lt;br /&gt;
The machine called franklin has a cron job running that every day at 1am (see &#039;&#039;&#039;/etc/cron.d/regression_test&#039;&#039;&#039;), runs a perl script created by t-staff. The script (&#039;&#039;&#039;/tstaff/bin/regtest&#039;&#039;&#039;) executes (as root) whatever it finds in &#039;&#039;&#039;/systest/bin&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Most days, what it finds in that directory is a bunch of scripts tstaff uses to manage the process and a couple of scripts called &#039;&#039;&#039;vrl_fast&#039;&#039;&#039; and &#039;&#039;&#039;vrl_slow&#039;&#039;&#039; that actually do the work.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;vrl_fast&#039;&#039;&#039; executes the script &#039;&#039;&#039;/research/graphics/tools/gfxtools-startup.sh&#039;&#039;&#039;, and then executes &#039;&#039;&#039;$G/common/build/valid/test.platform.py&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;vrl_slow&#039;&#039;&#039; does the same thing, but executes &#039;&#039;&#039;test.platform.py&#039;&#039;&#039; with the option &#039;&#039;&#039;-config $G/common/build/site/test.platform_slow.cfg&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Any scripts found in the &#039;&#039;&#039;/systest/bin&#039;&#039;&#039; directory that end in &#039;&#039;&#039;.weekly&#039;&#039;&#039; will only be run on Sundays.&lt;br /&gt;
&lt;br /&gt;
To add more tests to the nightly run, use the systest tools, found in &#039;&#039;&#039;/systest/bin&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
;systest-link&lt;br /&gt;
:Add a link to the &#039;&#039;&#039;/systest/bin&#039;&#039;&#039; directory. If it links to something executable, the system will run it every night.  The script will run as the user (and group) of the file owner.&lt;br /&gt;
:Use it like this: &amp;lt;code&amp;gt;/systest/bin/systest-link /systest/projects/vrl/vrl_critical.sh /systest/bin/vrl_crit&amp;lt;/code&amp;gt;&lt;br /&gt;
;systest-rem&lt;br /&gt;
:Remove a link in the &#039;&#039;&#039;/systest/bin&#039;&#039;&#039; directory.&lt;br /&gt;
&lt;br /&gt;
There is also a &#039;&#039;&#039;systest-req&#039;&#039;&#039; which stores metadata (i.e. documentation) about each of the links in &#039;&#039;&#039;/systest/bin&#039;&#039;&#039; and a &#039;&#039;&#039;systest-info&#039;&#039;&#039; which regurgitates it.&lt;br /&gt;
&lt;br /&gt;
=The Test Script (test.platform.py)=&lt;br /&gt;
&lt;br /&gt;
The test script is a python program at &#039;&#039;&#039;$G/common/build/valid/test.platform.py&#039;&#039;&#039;.  It runs a series of tests and sends an email to people if they fail.&lt;br /&gt;
&lt;br /&gt;
==Configuration File==&lt;br /&gt;
&lt;br /&gt;
The tests run by the &#039;&#039;&#039;test.platform.py&#039;&#039;&#039; script are listed and configured in &#039;&#039;&#039;$G/common/build/site/test.platform.cfg&#039;&#039;&#039; (by default) and &#039;&#039;&#039;test.platform_slow.cfg&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The configuration file has a line for the Developer and a line for the emails of whoever wants to receive the &#039;&#039;&#039;Summary&#039;&#039;&#039; email messages.  Each line after looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
testName  testList  archList  scriptName  outputDir&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;testName&#039;&#039;&#039; is an arbitrary string used to label this test.&lt;br /&gt;
* &#039;&#039;&#039;testList&#039;&#039;&#039; is a comma-separated list of email addresses who will hear about it if this test fails. Use &#039;&#039;&#039;none&#039;&#039;&#039; if nobody cares.&lt;br /&gt;
* &#039;&#039;&#039;archList&#039;&#039;&#039; is a comma-separated list of architectures for which this test is designed. This is just a string to be compared with the $GARCH environment variable set in &#039;&#039;&#039;gfxtools-startup.sh&#039;&#039;&#039; (see above).&lt;br /&gt;
* &#039;&#039;&#039;scriptName&#039;&#039;&#039;, &#039;&#039;&#039;outputDir&#039;&#039;&#039; The &#039;&#039;&#039;scriptName&#039;&#039;&#039; is executed in the &#039;&#039;&#039;outputDir&#039;&#039;&#039; directory.  The script should contain the build and all the tests that need to be run.  We encourage you to use a simple makefile, and to make the default target do a build and test.&lt;br /&gt;
&lt;br /&gt;
The arguments are separated by spaces so there should be no spaces within the arguments.&lt;br /&gt;
&lt;br /&gt;
Blank lines are ignored and the &#039;&#039;&#039;#&#039;&#039;&#039; indicates a comment.&lt;br /&gt;
&lt;br /&gt;
==Editing the Test Script==&lt;br /&gt;
&lt;br /&gt;
The actual copy of the test script that runs is the one in &#039;&#039;&#039;/research/graphics/common/build/valid&#039;&#039;&#039;. Please don&#039;t edit this (or the configuration file) directly.  Instead, edit the version that is in your sandbox and use CVS to check it in.  Note that the first thing test.platform.py does is check stuff out from the main CVS archive and run that. If you edit this script, expect your changes to take effect the night after whatever runs tonight because whatever you check in will be checked out into the appropriate place, but by that point, the build process is already running.&lt;/div&gt;</summary>
		<author><name>Tom Sgouros</name></author>
	</entry>
	<entry>
		<id>http://vrl.cs.brown.edu/wiki/index.php?title=Automatic_Build_System&amp;diff=6520</id>
		<title>Automatic Build System</title>
		<link rel="alternate" type="text/html" href="http://vrl.cs.brown.edu/wiki/index.php?title=Automatic_Build_System&amp;diff=6520"/>
		<updated>2014-05-02T18:56:18Z</updated>

		<summary type="html">&lt;p&gt;Tom Sgouros: /* Configuration File */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Every night an automatic build system runs to compile and test the software in the VRL group. This page is for documenting that process. Unless you are working on the build process itself, you probably don&#039;t need to know or care about these details. However, they need to be recorded somewhere, and this is as good a place as any.&lt;br /&gt;
&lt;br /&gt;
=The cron Job=&lt;br /&gt;
&lt;br /&gt;
The machine called franklin has a cron job running that every day at 1am (see &#039;&#039;&#039;/etc/cron.d/regression_test&#039;&#039;&#039;), runs a perl script created by t-staff. The script (&#039;&#039;&#039;/tstaff/bin/regtest&#039;&#039;&#039;) executes (as root) whatever it finds in &#039;&#039;&#039;/systest/bin&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Most days, what it finds in that directory is a bunch of scripts tstaff uses to manage the process and a couple of scripts called &#039;&#039;&#039;vrl_fast&#039;&#039;&#039; and &#039;&#039;&#039;vrl_slow&#039;&#039;&#039; that actually do the work.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;vrl_fast&#039;&#039;&#039; executes the script &#039;&#039;&#039;/research/graphics/tools/gfxtools-startup.sh&#039;&#039;&#039;, and then executes &#039;&#039;&#039;$G/common/build/valid/test.platform.py&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;vrl_slow&#039;&#039;&#039; does the same thing, but executes &#039;&#039;&#039;test.platform.py&#039;&#039;&#039; with the option &#039;&#039;&#039;-config $G/common/build/site/test.platform_slow.cfg&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Any scripts found in the &#039;&#039;&#039;/systest/bin&#039;&#039;&#039; directory that end in &#039;&#039;&#039;.weekly&#039;&#039;&#039; will only be run on Sundays.&lt;br /&gt;
&lt;br /&gt;
=The Test Script (test.platform.py)=&lt;br /&gt;
&lt;br /&gt;
The test script is a python program at &#039;&#039;&#039;$G/common/build/valid/test.platform.py&#039;&#039;&#039;.  It runs a series of tests and sends an email to people if they fail.&lt;br /&gt;
&lt;br /&gt;
==Configuration File==&lt;br /&gt;
&lt;br /&gt;
The tests run by the &#039;&#039;&#039;test.platform.py&#039;&#039;&#039; script are listed and configured in &#039;&#039;&#039;$G/common/build/site/test.platform.cfg&#039;&#039;&#039; (by default) and &#039;&#039;&#039;test.platform_slow.cfg&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The configuration file has a line for the Developer and a line for the emails of whoever wants to receive the &#039;&#039;&#039;Summary&#039;&#039;&#039; email messages.  Each line after looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
testName  testList  archList  scriptName  outputDir&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;testName&#039;&#039;&#039; is an arbitrary string used to label this test.&lt;br /&gt;
* &#039;&#039;&#039;testList&#039;&#039;&#039; is a comma-separated list of email addresses who will hear about it if this test fails. Use &#039;&#039;&#039;none&#039;&#039;&#039; if nobody cares.&lt;br /&gt;
* &#039;&#039;&#039;archList&#039;&#039;&#039; is a comma-separated list of architectures for which this test is designed. This is just a string to be compared with the $GARCH environment variable set in &#039;&#039;&#039;gfxtools-startup.sh&#039;&#039;&#039; (see above).&lt;br /&gt;
* &#039;&#039;&#039;scriptName&#039;&#039;&#039;, &#039;&#039;&#039;outputDir&#039;&#039;&#039; The &#039;&#039;&#039;scriptName&#039;&#039;&#039; is executed in the &#039;&#039;&#039;outputDir&#039;&#039;&#039; directory.  The script should contain the build and all the tests that need to be run.  We encourage you to use a simple makefile, and to make the default target do a build and test.&lt;br /&gt;
&lt;br /&gt;
The arguments are separated by spaces so there should be no spaces within the arguments.&lt;br /&gt;
&lt;br /&gt;
Blank lines are ignored and the &#039;&#039;&#039;#&#039;&#039;&#039; indicates a comment.&lt;br /&gt;
&lt;br /&gt;
==Editing the Test Script==&lt;br /&gt;
&lt;br /&gt;
The actual copy of the test script that runs is the one in &#039;&#039;&#039;/research/graphics/common/build/valid&#039;&#039;&#039;. Please don&#039;t edit this (or the configuration file) directly.  Instead, edit the version that is in your sandbox and use CVS to check it in.  Note that the first thing test.platform.py does is check stuff out from the main CVS archive and run that. If you edit this script, expect your changes to take effect the night after whatever runs tonight because whatever you check in will be checked out into the appropriate place, but by that point, the build process is already running.&lt;/div&gt;</summary>
		<author><name>Tom Sgouros</name></author>
	</entry>
	<entry>
		<id>http://vrl.cs.brown.edu/wiki/index.php?title=Automatic_Build_System&amp;diff=6519</id>
		<title>Automatic Build System</title>
		<link rel="alternate" type="text/html" href="http://vrl.cs.brown.edu/wiki/index.php?title=Automatic_Build_System&amp;diff=6519"/>
		<updated>2014-05-02T17:05:09Z</updated>

		<summary type="html">&lt;p&gt;Tom Sgouros: /* Editing the Test Script */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Every night an automatic build system runs to compile and test the software in the VRL group. This page is for documenting that process. Unless you are working on the build process itself, you probably don&#039;t need to know or care about these details. However, they need to be recorded somewhere, and this is as good a place as any.&lt;br /&gt;
&lt;br /&gt;
=The cron Job=&lt;br /&gt;
&lt;br /&gt;
The machine called franklin has a cron job running that every day at 1am (see &#039;&#039;&#039;/etc/cron.d/regression_test&#039;&#039;&#039;), runs a perl script created by t-staff. The script (&#039;&#039;&#039;/tstaff/bin/regtest&#039;&#039;&#039;) executes (as root) whatever it finds in &#039;&#039;&#039;/systest/bin&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Most days, what it finds in that directory is a bunch of scripts tstaff uses to manage the process and a couple of scripts called &#039;&#039;&#039;vrl_fast&#039;&#039;&#039; and &#039;&#039;&#039;vrl_slow&#039;&#039;&#039; that actually do the work.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;vrl_fast&#039;&#039;&#039; executes the script &#039;&#039;&#039;/research/graphics/tools/gfxtools-startup.sh&#039;&#039;&#039;, and then executes &#039;&#039;&#039;$G/common/build/valid/test.platform.py&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;vrl_slow&#039;&#039;&#039; does the same thing, but executes &#039;&#039;&#039;test.platform.py&#039;&#039;&#039; with the option &#039;&#039;&#039;-config $G/common/build/site/test.platform_slow.cfg&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Any scripts found in the &#039;&#039;&#039;/systest/bin&#039;&#039;&#039; directory that end in &#039;&#039;&#039;.weekly&#039;&#039;&#039; will only be run on Sundays.&lt;br /&gt;
&lt;br /&gt;
=The Test Script (test.platform.py)=&lt;br /&gt;
&lt;br /&gt;
The test script is a python program at &#039;&#039;&#039;$G/common/build/valid/test.platform.py&#039;&#039;&#039;.  It runs a series of tests and sends an email to people if they fail.&lt;br /&gt;
&lt;br /&gt;
==Configuration File==&lt;br /&gt;
&lt;br /&gt;
The tests run by the &#039;&#039;&#039;test.platform.py&#039;&#039;&#039; script are listed and configured in &#039;&#039;&#039;$G/common/build/site/test.platform.cfg&#039;&#039;&#039; (by default) and &#039;&#039;&#039;test.platform_slow.cfg&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The configuration file has a line for the Developer and a line for the emails of whoever wants to receive the &#039;&#039;&#039;Summary&#039;&#039;&#039; email messages.  Each line after looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
testName  testList  archList  scriptName  outputDir&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;testName&#039;&#039;&#039; is an arbitrary string used to label this test.&lt;br /&gt;
* &#039;&#039;&#039;testList&#039;&#039;&#039; is a comma-separated list of email addresses who will hear about it if this test fails. Use &#039;&#039;&#039;none&#039;&#039;&#039; if nobody cares.&lt;br /&gt;
* &#039;&#039;&#039;archList&#039;&#039;&#039; is a comma-separated list of architectures for which this test is designed. This is just a string to be compared with the $GARCH environment variable set in &#039;&#039;&#039;gfxtools-startup.sh&#039;&#039;&#039; (see above).&lt;br /&gt;
* &#039;&#039;&#039;scriptName&#039;&#039;&#039;, &#039;&#039;&#039;outputDir&#039;&#039;&#039; The &#039;&#039;&#039;scriptName&#039;&#039;&#039; is executed in the &#039;&#039;&#039;outputDir&#039;&#039;&#039; directory.  The script should contain the build and all the tests that need to be run.  We encourage you to use a simple makefile, and to make the default target do a build and test.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Blank lines are ignored and the &#039;&#039;&#039;#&#039;&#039;&#039; indicates a comment.&lt;br /&gt;
&lt;br /&gt;
==Editing the Test Script==&lt;br /&gt;
&lt;br /&gt;
The actual copy of the test script that runs is the one in &#039;&#039;&#039;/research/graphics/common/build/valid&#039;&#039;&#039;. Please don&#039;t edit this (or the configuration file) directly.  Instead, edit the version that is in your sandbox and use CVS to check it in.  Note that the first thing test.platform.py does is check stuff out from the main CVS archive and run that. If you edit this script, expect your changes to take effect the night after whatever runs tonight because whatever you check in will be checked out into the appropriate place, but by that point, the build process is already running.&lt;/div&gt;</summary>
		<author><name>Tom Sgouros</name></author>
	</entry>
	<entry>
		<id>http://vrl.cs.brown.edu/wiki/index.php?title=Automatic_Build_System&amp;diff=6518</id>
		<title>Automatic Build System</title>
		<link rel="alternate" type="text/html" href="http://vrl.cs.brown.edu/wiki/index.php?title=Automatic_Build_System&amp;diff=6518"/>
		<updated>2014-05-02T14:37:46Z</updated>

		<summary type="html">&lt;p&gt;Tom Sgouros: /* Configuration File */  added config file element description&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Every night an automatic build system runs to compile and test the software in the VRL group. This page is for documenting that process. Unless you are working on the build process itself, you probably don&#039;t need to know or care about these details. However, they need to be recorded somewhere, and this is as good a place as any.&lt;br /&gt;
&lt;br /&gt;
=The cron Job=&lt;br /&gt;
&lt;br /&gt;
The machine called franklin has a cron job running that every day at 1am (see &#039;&#039;&#039;/etc/cron.d/regression_test&#039;&#039;&#039;), runs a perl script created by t-staff. The script (&#039;&#039;&#039;/tstaff/bin/regtest&#039;&#039;&#039;) executes (as root) whatever it finds in &#039;&#039;&#039;/systest/bin&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Most days, what it finds in that directory is a bunch of scripts tstaff uses to manage the process and a couple of scripts called &#039;&#039;&#039;vrl_fast&#039;&#039;&#039; and &#039;&#039;&#039;vrl_slow&#039;&#039;&#039; that actually do the work.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;vrl_fast&#039;&#039;&#039; executes the script &#039;&#039;&#039;/research/graphics/tools/gfxtools-startup.sh&#039;&#039;&#039;, and then executes &#039;&#039;&#039;$G/common/build/valid/test.platform.py&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;vrl_slow&#039;&#039;&#039; does the same thing, but executes &#039;&#039;&#039;test.platform.py&#039;&#039;&#039; with the option &#039;&#039;&#039;-config $G/common/build/site/test.platform_slow.cfg&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Any scripts found in the &#039;&#039;&#039;/systest/bin&#039;&#039;&#039; directory that end in &#039;&#039;&#039;.weekly&#039;&#039;&#039; will only be run on Sundays.&lt;br /&gt;
&lt;br /&gt;
=The Test Script (test.platform.py)=&lt;br /&gt;
&lt;br /&gt;
The test script is a python program at &#039;&#039;&#039;$G/common/build/valid/test.platform.py&#039;&#039;&#039;.  It runs a series of tests and sends an email to people if they fail.&lt;br /&gt;
&lt;br /&gt;
==Configuration File==&lt;br /&gt;
&lt;br /&gt;
The tests run by the &#039;&#039;&#039;test.platform.py&#039;&#039;&#039; script are listed and configured in &#039;&#039;&#039;$G/common/build/site/test.platform.cfg&#039;&#039;&#039; (by default) and &#039;&#039;&#039;test.platform_slow.cfg&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The configuration file has a line for the Developer and a line for the emails of whoever wants to receive the &#039;&#039;&#039;Summary&#039;&#039;&#039; email messages.  Each line after looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
testName  testList  archList  scriptName  outputDir&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;testName&#039;&#039;&#039; is an arbitrary string used to label this test.&lt;br /&gt;
* &#039;&#039;&#039;testList&#039;&#039;&#039; is a comma-separated list of email addresses who will hear about it if this test fails. Use &#039;&#039;&#039;none&#039;&#039;&#039; if nobody cares.&lt;br /&gt;
* &#039;&#039;&#039;archList&#039;&#039;&#039; is a comma-separated list of architectures for which this test is designed. This is just a string to be compared with the $GARCH environment variable set in &#039;&#039;&#039;gfxtools-startup.sh&#039;&#039;&#039; (see above).&lt;br /&gt;
* &#039;&#039;&#039;scriptName&#039;&#039;&#039;, &#039;&#039;&#039;outputDir&#039;&#039;&#039; The &#039;&#039;&#039;scriptName&#039;&#039;&#039; is executed in the &#039;&#039;&#039;outputDir&#039;&#039;&#039; directory.  The script should contain the build and all the tests that need to be run.  We encourage you to use a simple makefile, and to make the default target do a build and test.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Blank lines are ignored and the &#039;&#039;&#039;#&#039;&#039;&#039; indicates a comment.&lt;br /&gt;
&lt;br /&gt;
==Editing the Test Script==&lt;br /&gt;
&lt;br /&gt;
The actual copy of the test script that runs is the one in &#039;&#039;&#039;/research/graphics/common/build/valid&#039;&#039;&#039;. Please don&#039;t edit this (or the configuration file) directly.  Instead, edit the version that is in your sandbox and use CVS to check it in.  Note that the first thing test.platform.py does is check stuff out from the main CVS archive and run that. If you edit this script, expect your changes to take effect the night after whatever runs tonight.&lt;/div&gt;</summary>
		<author><name>Tom Sgouros</name></author>
	</entry>
	<entry>
		<id>http://vrl.cs.brown.edu/wiki/index.php?title=Automatic_Build_System&amp;diff=6517</id>
		<title>Automatic Build System</title>
		<link rel="alternate" type="text/html" href="http://vrl.cs.brown.edu/wiki/index.php?title=Automatic_Build_System&amp;diff=6517"/>
		<updated>2014-05-02T14:19:45Z</updated>

		<summary type="html">&lt;p&gt;Tom Sgouros: added detail&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Every night an automatic build system runs to compile and test the software in the VRL group. This page is for documenting that process. Unless you are working on the build process itself, you probably don&#039;t need to know or care about these details. However, they need to be recorded somewhere, and this is as good a place as any.&lt;br /&gt;
&lt;br /&gt;
=The cron Job=&lt;br /&gt;
&lt;br /&gt;
The machine called franklin has a cron job running that every day at 1am (see &#039;&#039;&#039;/etc/cron.d/regression_test&#039;&#039;&#039;), runs a perl script created by t-staff. The script (&#039;&#039;&#039;/tstaff/bin/regtest&#039;&#039;&#039;) executes (as root) whatever it finds in &#039;&#039;&#039;/systest/bin&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Most days, what it finds in that directory is a bunch of scripts tstaff uses to manage the process and a couple of scripts called &#039;&#039;&#039;vrl_fast&#039;&#039;&#039; and &#039;&#039;&#039;vrl_slow&#039;&#039;&#039; that actually do the work.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;vrl_fast&#039;&#039;&#039; executes the script &#039;&#039;&#039;/research/graphics/tools/gfxtools-startup.sh&#039;&#039;&#039;, and then executes &#039;&#039;&#039;$G/common/build/valid/test.platform.py&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;vrl_slow&#039;&#039;&#039; does the same thing, but executes &#039;&#039;&#039;test.platform.py&#039;&#039;&#039; with the option &#039;&#039;&#039;-config $G/common/build/site/test.platform_slow.cfg&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Any scripts found in the &#039;&#039;&#039;/systest/bin&#039;&#039;&#039; directory that end in &#039;&#039;&#039;.weekly&#039;&#039;&#039; will only be run on Sundays.&lt;br /&gt;
&lt;br /&gt;
=The Test Script (test.platform.py)=&lt;br /&gt;
&lt;br /&gt;
The test script is a python program at &#039;&#039;&#039;$G/common/build/valid/test.platform.py&#039;&#039;&#039;.  It runs a series of tests and sends an email to people if they fail.&lt;br /&gt;
&lt;br /&gt;
==Configuration File==&lt;br /&gt;
&lt;br /&gt;
The tests run by the &#039;&#039;&#039;test.platform.py&#039;&#039;&#039; script are listed and configured in &#039;&#039;&#039;$G/common/build/site/test.platform.cfg&#039;&#039;&#039; (by default) and &#039;&#039;&#039;test.platform_slow.cfg&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The configuration file has a line for the Developer and a line for the emails of whoever wants to receive the &#039;&#039;&#039;Summary&#039;&#039;&#039; email messages.  Each line after looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
testName  testList  archList  scriptName  outputDir&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Editing the Test Script==&lt;br /&gt;
&lt;br /&gt;
The actual copy of the test script that runs is the one in &#039;&#039;&#039;/research/graphics/common/build/valid&#039;&#039;&#039;. Please don&#039;t edit this (or the configuration file) directly.  Instead, edit the version that is in your sandbox and use CVS to check it in.  Note that the first thing test.platform.py does is check stuff out from the main CVS archive and run that. If you edit this script, expect your changes to take effect the night after whatever runs tonight.&lt;/div&gt;</summary>
		<author><name>Tom Sgouros</name></author>
	</entry>
	<entry>
		<id>http://vrl.cs.brown.edu/wiki/index.php?title=Automatic_Build_System&amp;diff=6516</id>
		<title>Automatic Build System</title>
		<link rel="alternate" type="text/html" href="http://vrl.cs.brown.edu/wiki/index.php?title=Automatic_Build_System&amp;diff=6516"/>
		<updated>2014-05-01T16:48:44Z</updated>

		<summary type="html">&lt;p&gt;Tom Sgouros: added page for build system&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Every night an automatic build system runs to compile and test the software in the VRL group. This page is for documenting that process. Unless you are working on the build process itself, you probably don&#039;t need to know or care about these details. However, they need to be recorded somewhere, and this is as good a place as any.&lt;br /&gt;
&lt;br /&gt;
=The cron Job=&lt;br /&gt;
&lt;br /&gt;
The machine called franklin has a cron job running that every day at 1am (see &#039;&#039;&#039;/etc/cron.d/regression_test&#039;&#039;&#039;), runs a perl script created by t-staff. The script (&#039;&#039;&#039;/tstaff/bin/regtest&#039;&#039;&#039;) executes (as root) whatever it finds in &#039;&#039;&#039;/systest/bin&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Most days, what it finds in that directory is a bunch of scripts tstaff uses to manage the process and a couple of scripts called &#039;&#039;&#039;vrl_fast&#039;&#039;&#039; and &#039;&#039;&#039;vrl_slow&#039;&#039;&#039; that actually do the work.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;vrl_fast&#039;&#039;&#039; executes the script &#039;&#039;&#039;/research/graphics/tools/gfxtools-startup.sh&#039;&#039;&#039;, and then executes &#039;&#039;&#039;$G/common/build/valid/test.platform.py&#039;&#039;&#039;.  &lt;br /&gt;
* &#039;&#039;&#039;vrl_slow&#039;&#039;&#039; does the same thing, but executes &#039;&#039;&#039;test.platform.py&#039;&#039;&#039; with the option &#039;&#039;&#039;-config $G/common/build/site/test.platform_slow.cfg&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Any scripts found in the &#039;&#039;&#039;/systest/bin&#039;&#039;&#039; directory that end in &#039;&#039;&#039;.weekly&#039;&#039;&#039; will only be run on Sundays.&lt;br /&gt;
&lt;br /&gt;
=The Test Script (test.platform.py)=&lt;br /&gt;
&lt;br /&gt;
==Editing the Test Script==&lt;br /&gt;
&lt;br /&gt;
The actual copy of the test script that runs is the one in &#039;&#039;&#039;/research/graphics/common/build/valid&#039;&#039;&#039;. Please don&#039;t edit this directly.  Instead, edit the version that is in your sandbox and use CVS to check it in.  Note that the first thing test.platform.py does is check stuff out from CVS. If you edit this script, expect your changes to take effect the night after whatever runs tonight.&lt;/div&gt;</summary>
		<author><name>Tom Sgouros</name></author>
	</entry>
	<entry>
		<id>http://vrl.cs.brown.edu/wiki/index.php?title=Shared_Public_Directory_Structure&amp;diff=6515</id>
		<title>Shared Public Directory Structure</title>
		<link rel="alternate" type="text/html" href="http://vrl.cs.brown.edu/wiki/index.php?title=Shared_Public_Directory_Structure&amp;diff=6515"/>
		<updated>2014-05-01T16:02:16Z</updated>

		<summary type="html">&lt;p&gt;Tom Sgouros: typos&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The graphics group has developed a system over many years that allows easy development of a large, shared base of software.  We give the whole thing the nickname &amp;lt;tt&amp;gt;[[$G]]&amp;lt;/tt&amp;gt; (&amp;quot;dollar gee&amp;quot;), named after the environment variable that represents the root of the source tree.&lt;br /&gt;
&lt;br /&gt;
The source code our group has created is modified and backed up through a source control system called CVS (Concurrent Versioning System).  You must have CVS set up properly in order to develop with our shared codebase.&lt;br /&gt;
&lt;br /&gt;
Source control works by allowing an individual user to make structured copies of the master versions of files (this process is called &amp;quot;checking out&amp;quot; the files).  The user then modifies his or her personal copies of the files, and then &amp;quot;checks in&amp;quot; the changes once they&#039;re certain that the code compiles and runs properly.  The location where a user modifies a personal copy of shared code is called a &amp;quot;sandbox&amp;quot;, because it is in some sense walled off from the master copy: destructive changes to the code in the sandbox do not affect the master copy, provided the user doesn&#039;t check them in.&lt;br /&gt;
&lt;br /&gt;
Environment variables are used to configure the development environment.  Visit this page for general instructions for [[Setting Environment Variables]] and using them.  The instructions in the remainder of this section require that you know how to set up environment variables.  For Windows the instructions use the native Windows (cmd.exe) command shell.  Unix command examples should work on most shells.&lt;br /&gt;
&lt;br /&gt;
Even if you intend to work on Windows you should set up your sandbox at Brown using Linux.  The instructions will include Windows specific instructions when applicable.  Explicit procedures for setting up a remote Windows system (like your laptop) are not yet in place.  If you are familiar with setting up Windows development environments you should be able to adapt these procedures.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a description of the directories you will find under &#039;&#039;&#039;/research/graphics/&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;data&#039;&#039;&#039;:  A directory for large datasets.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;users&#039;&#039;&#039;:  Space for students to set up sandboxes.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;tools/linux/import&#039;&#039;&#039;:  Pre-installed third party software.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;tools/linux/install_linux&#039;&#039;&#039;:  Shared copies of pre-built Linux projects.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;tools/linux/install_WIN32&#039;&#039;&#039;:  Shared copies of pre-built Windows projects.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;tools/public/yesterday&#039;&#039;&#039;:  Browse recent common and project directories.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;tools/public/raw_notes&#039;&#039;&#039;:  Unedited notes on a variety of development topics.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cvsroot&#039;&#039;&#039;:  The CVS repository.  The files in here are only for administrators to access.  Students should only access the repository through CVS commands.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Within the CVS repository the primary directories are:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;import&#039;&#039;&#039;:  Downloaded kits for third party software.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;common&#039;&#039;&#039;:  Software used by multiple projects.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;project&#039;&#039;&#039;:  Project software.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A copy of the &#039;&#039;&#039;common&#039;&#039;&#039; and &#039;&#039;&#039;project&#039;&#039;&#039; directories for you to browse is updated nightly at:&lt;br /&gt;
/research/graphics/tools/public/yesterday&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
See [[Using Public or Private Programs and Libraries]] for&lt;br /&gt;
a detailed overview of the environment variables and directories.&lt;br /&gt;
&lt;br /&gt;
At any given time there are several active versions of our software.  Students need to be aware of what version is appropriate for their work and set up their workspace to reflect this.&lt;br /&gt;
&lt;br /&gt;
* The latest source checked into CVS&lt;br /&gt;
&lt;br /&gt;
* The version in a students project directory at the time they last checked it out or changed it.&lt;br /&gt;
&lt;br /&gt;
* The version installed in a students sandbox the last time they built and installed it.&lt;br /&gt;
&lt;br /&gt;
* The public installed copy at:  /research/graphics/tools/linux/install_$GARCH&lt;br /&gt;
&lt;br /&gt;
* The copy used for cloning at:  /research/graphics/tools/public/clone&lt;/div&gt;</summary>
		<author><name>Tom Sgouros</name></author>
	</entry>
	<entry>
		<id>http://vrl.cs.brown.edu/wiki/index.php?title=Software_Development&amp;diff=6514</id>
		<title>Software Development</title>
		<link rel="alternate" type="text/html" href="http://vrl.cs.brown.edu/wiki/index.php?title=Software_Development&amp;diff=6514"/>
		<updated>2014-05-01T16:00:00Z</updated>

		<summary type="html">&lt;p&gt;Tom Sgouros: added page for build system&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &#039;&#039;&#039;Essential Background Reading&#039;&#039;&#039;&lt;br /&gt;
** [[Shared Public Directory Structure]]&lt;br /&gt;
** [[Understanding File Permissions]]&lt;br /&gt;
** [[Setting Environment Variables]]&lt;br /&gt;
** [[Introduction to CVS]]&lt;br /&gt;
** [[Minimal Coding Conventions|Coding Conventions and Programming Tips]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Create a Linux Sandbox&#039;&#039;&#039;&lt;br /&gt;
** [[Get a Linux Account]]&lt;br /&gt;
** Set up Your Sandbox&lt;br /&gt;
*** [[Automated Quick Start|Automated Quick Start - Linux only]]&lt;br /&gt;
*** [[Quick Start for CIT Users|Manual Quick Start - Windows and Linux]]&lt;br /&gt;
** [[Merge Installed Programs Into One Directory]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Software Development Tasks&#039;&#039;&#039;&lt;br /&gt;
** Before you start, [[Building and Installing Common Components]]&lt;br /&gt;
** Work on Existing Projects&lt;br /&gt;
*** [[Check out projects|Check out and build existing projects]]&lt;br /&gt;
**** [[Building CavePainting|For example: Building CavePainting (includes building VRG3D)]]&lt;br /&gt;
*** [[Contribute to projects|Contribute to existing projects]]&lt;br /&gt;
** Add a project&lt;br /&gt;
*** [[Add a new project]]&lt;br /&gt;
**** [[Build a Trivial Program]]&lt;br /&gt;
**** [[Build a Trivial Library]]&lt;br /&gt;
*** [[Port existing project|Port existing project to the new $G]]&lt;br /&gt;
**[[Writing Make Files]]&lt;br /&gt;
**[[Automatic Build System]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Advanced Topics&#039;&#039;&#039;&lt;br /&gt;
** [[Create a Windows Sandbox|Create a Windows Sandbox (In or out of CIT)]]&lt;br /&gt;
** [[Software tests|Create and automate software tests]]&lt;br /&gt;
** [[Install 3rd party code|Install 3rd-party programs or libraries]]&lt;br /&gt;
** [[Using Public or Private Programs and Libraries]]&lt;br /&gt;
** [[Multiple Directories|Set up a project with multiple directories]]&lt;br /&gt;
** [[Working With Multiple Sandboxes]]&lt;br /&gt;
** [[Working With Legacy Software]]&lt;br /&gt;
** [[Software demos|Create and install software demos]]&lt;br /&gt;
** [[Distribute software|Distribute software and data]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Software Development]]&lt;/div&gt;</summary>
		<author><name>Tom Sgouros</name></author>
	</entry>
	<entry>
		<id>http://vrl.cs.brown.edu/wiki/index.php?title=Registration_of_Bones_Across_Positions&amp;diff=6513</id>
		<title>Registration of Bones Across Positions</title>
		<link rel="alternate" type="text/html" href="http://vrl.cs.brown.edu/wiki/index.php?title=Registration_of_Bones_Across_Positions&amp;diff=6513"/>
		<updated>2014-04-15T14:50:54Z</updated>

		<summary type="html">&lt;p&gt;Tom Sgouros: /* What we have here is a failure to register */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The registration process uses bone surfaces extracted from the neutral position and CT volumes to calculate bone kinematics, i.e rotations and translations of the center of mass of each each bone, across each position. This method has 2 steps, classification and registration.  The classification step sorts through the voxels calculating a distance from each voxel to the nearest surface.  The registration step uses that data to place a surface in such a way as to minimize the total sum of the distances.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==Tissue Classification and Localized Distance Fields==&lt;br /&gt;
&lt;br /&gt;
Bone, soft tissue, and air are represented by different intensities in CT images. Our tissue classification algorithm goes through the non-neutral CT volumes and calculates a distance from the center of each voxel to the closest material boundary. The output of classification is a distance field for each material. We are interested only in the distance field of the bone material.&lt;br /&gt;
&lt;br /&gt;
==Bone Registration==&lt;br /&gt;
&lt;br /&gt;
The input data to this step is the distance field derived in the classification step and the geometrical model obtained from the neutral CT scans. These are used to retrieve bone kinematics across positions. It works by superimposing the geometrical model on the distance field. If a voxel intersects the model surface, the voxel&#039;s distance to the nearest material surface is recorded. The sum of these distances provides a measure of how far out of alignment the model surface is. The registration step consists of searching the rotation and translation space of the bone to minimize the sum of these distances.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Technical Notes==&lt;br /&gt;
&lt;br /&gt;
To run the classification and registration process, follow these steps:&lt;br /&gt;
&lt;br /&gt;
#Check whether a &amp;quot;crop_values.txt&amp;quot; file exists -- it helps reduce the number of voxels processed.&lt;br /&gt;
#cd to the top-level of your subject&#039;s data.&lt;br /&gt;
#ssh to a CS-LAB machine, e.g., &amp;quot;ssh cslab9g&amp;quot;.&lt;br /&gt;
#Run install_linux/bin64/batchGen.py and answer the questions. (The first time you process the data, accept all the defaults.)&lt;br /&gt;
#Type &amp;quot;./classify.py&amp;quot; wait a few hours.&lt;br /&gt;
#Type &amp;quot;./register.py&amp;quot; wait an hour or so.&lt;br /&gt;
&lt;br /&gt;
(For long-running jobs you want to leave and come back to, the [[screen program]] is your friend.)&lt;br /&gt;
&lt;br /&gt;
The result of this step is a set of scripts in $DATA/qsub that will be used for the classification and registration steps. The classify.py script executes the classification step, and unsurprisingly, register.py does the registration.  You&#039;ll also see a collector.py, which takes the output from the registration step and condenses it to a set of simple transposition matrices.  This script is run automatically at the end of the registration step, for the poses where registration succeeded.&lt;br /&gt;
&lt;br /&gt;
===Program inputs===&lt;br /&gt;
&lt;br /&gt;
The input to the classification stage is:&lt;br /&gt;
&lt;br /&gt;
* CT scans, stored in a directory called $DATA/original_scans&lt;br /&gt;
* A crop_values.txt file.&lt;br /&gt;
&lt;br /&gt;
The input to the registration step is:&lt;br /&gt;
&lt;br /&gt;
* The output from the classification stage, stored in $DATA/classified_scans.&lt;br /&gt;
* The digitized (segmented) bone shapes, stored in $DATA/original_stacks.&lt;br /&gt;
&lt;br /&gt;
Optionally, the input to this stage can include a [[registration configuration file]], which is used to set starting points for a registration match search, or to limit the range of such searches, or to eliminate the need for a search altogether, on a per-bone basis.&lt;br /&gt;
&lt;br /&gt;
Configuration files are generated each time the registration step is run, and put into the $DATA/warmBones directory.  You can use these files as raw material for creating a configuration file for your experiment.&lt;br /&gt;
&lt;br /&gt;
===Program outputs===&lt;br /&gt;
&lt;br /&gt;
The output of the two steps consists of files within the input data directory. For example, if the input data is in a directory called E50072_scan, the output of both steps will be files in subdirectories of that directory. In the following, we&#039;ll refer to the input data directory as $DATA.&lt;br /&gt;
&lt;br /&gt;
The output of the classification step is:&lt;br /&gt;
&lt;br /&gt;
* Classified scans in a folder called $DATA/classified_scans.&lt;br /&gt;
&lt;br /&gt;
* Log files found in $DATA/qsub_output/alpha_qsub.sh.oXXXXXX.Y and $DATA/qsub_output/subset_qsub.sh.oXXXXXX.Y, where XXXXXX is an identifier for the run and Y is the number of some process corresponding to that run.  The error output is in files called .eXXXXXX.YY. For successful runs, these files will be empty.&lt;br /&gt;
&lt;br /&gt;
The output of the registration step is:&lt;br /&gt;
&lt;br /&gt;
* The positions of the bones within a pose, stored in $DATA/auto_registr_results. There are two varieties of file in that directory.  The &#039;.txt&#039; files contain the output data, while the &#039;.log&#039; files contain potentially helpful output from the program.  If the --delete-log flag is used to invoke the registration step, the logs will be deleted upon successful execution.&lt;br /&gt;
&lt;br /&gt;
* The &#039;.txt&#039; files above are the output of the various attempts to find the rotations and translations of the various bones.  The registration step ends by executing &#039;collector.py&#039; that consolidates the rotations and translations in the &#039;.txt&#039; files.  These outputs are left in the $DATA/collected_results.&lt;br /&gt;
&lt;br /&gt;
* During the optimization step, the qsub program is used to run instances of the registration program on many different host machines.  The standard output of those runs can be found in files called $DATA/qsub_output/register_qsub.sh.oXXXXXX.Y, where XXXXXX is an identifier for the specific run and Y is the job number.  The error output is in files with the suffix eXXXXXX.Y.&lt;br /&gt;
&lt;br /&gt;
* You&#039;ll find configuration files that record the bone positions found in the $DATA/warmBones directory.  If you need to re-run your job, these files can save some time, since they use the optimized positions found in the registration run.  If any pose failed, the configuration file for that pose will include the correct positions of the bones found up to the failure point.&lt;br /&gt;
&lt;br /&gt;
===What we have here is a failure to register===&lt;br /&gt;
&lt;br /&gt;
The registration step often fails on one or more of the poses in a subject&#039;s data. You&#039;ll know the run has failed from the output to your terminal.  It will say something like &lt;br /&gt;
&lt;br /&gt;
   ERROR:  The WristRegistration runs failed with status = 1&lt;br /&gt;
           They need to be rerun.&lt;br /&gt;
&lt;br /&gt;
Probably only one or two of the poses failed; you can identify them from the text immediately before this. (An exit code of zero means success.)  Note that the job numbers you see on the program output are not the same as the numbers indicating a pose.  For example, a normal set of poses might be 2,3,4,5,6,7,8,9,10,11,12 and 15.  These will be executed as job numbers 1,2,3,4,5,6,7,8,9,10,11, and 12.&lt;br /&gt;
&lt;br /&gt;
Once you identify the offending pose, you need to use the Wrist Viewer program ([[WristViz]]) to find a good initial position for the bone alignments that failed.  Create or copy a configuration file and identify it in the corresponding $DATA/qsub/registerXX_qsub.sh file, where XX is the job number of the run you need to fix.  When you open that file, you&#039;ll see a messy long line that runs the WristRegistration program.  Add this to the end of that line:&lt;br /&gt;
&lt;br /&gt;
   --configFile config.txt&lt;br /&gt;
&lt;br /&gt;
Where config.txt is actually the path name of the [[registration configuration file]] you&#039;ve created.  There are sample configuration files in the $DATA/warmBones directory, and if you use the one that corresponds to the failed job, the registration process will use the data from the bones that succeeded and they don&#039;t have to be found again in the next run.  This can result in substantial time savings.&lt;br /&gt;
&lt;br /&gt;
Repeat the process above and it should succeed this time.&lt;/div&gt;</summary>
		<author><name>Tom Sgouros</name></author>
	</entry>
	<entry>
		<id>http://vrl.cs.brown.edu/wiki/index.php?title=Registration_of_Bones_Across_Positions&amp;diff=6512</id>
		<title>Registration of Bones Across Positions</title>
		<link rel="alternate" type="text/html" href="http://vrl.cs.brown.edu/wiki/index.php?title=Registration_of_Bones_Across_Positions&amp;diff=6512"/>
		<updated>2014-04-15T14:50:26Z</updated>

		<summary type="html">&lt;p&gt;Tom Sgouros: /* What we have here is a failure to register */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The registration process uses bone surfaces extracted from the neutral position and CT volumes to calculate bone kinematics, i.e rotations and translations of the center of mass of each each bone, across each position. This method has 2 steps, classification and registration.  The classification step sorts through the voxels calculating a distance from each voxel to the nearest surface.  The registration step uses that data to place a surface in such a way as to minimize the total sum of the distances.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==Tissue Classification and Localized Distance Fields==&lt;br /&gt;
&lt;br /&gt;
Bone, soft tissue, and air are represented by different intensities in CT images. Our tissue classification algorithm goes through the non-neutral CT volumes and calculates a distance from the center of each voxel to the closest material boundary. The output of classification is a distance field for each material. We are interested only in the distance field of the bone material.&lt;br /&gt;
&lt;br /&gt;
==Bone Registration==&lt;br /&gt;
&lt;br /&gt;
The input data to this step is the distance field derived in the classification step and the geometrical model obtained from the neutral CT scans. These are used to retrieve bone kinematics across positions. It works by superimposing the geometrical model on the distance field. If a voxel intersects the model surface, the voxel&#039;s distance to the nearest material surface is recorded. The sum of these distances provides a measure of how far out of alignment the model surface is. The registration step consists of searching the rotation and translation space of the bone to minimize the sum of these distances.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Technical Notes==&lt;br /&gt;
&lt;br /&gt;
To run the classification and registration process, follow these steps:&lt;br /&gt;
&lt;br /&gt;
#Check whether a &amp;quot;crop_values.txt&amp;quot; file exists -- it helps reduce the number of voxels processed.&lt;br /&gt;
#cd to the top-level of your subject&#039;s data.&lt;br /&gt;
#ssh to a CS-LAB machine, e.g., &amp;quot;ssh cslab9g&amp;quot;.&lt;br /&gt;
#Run install_linux/bin64/batchGen.py and answer the questions. (The first time you process the data, accept all the defaults.)&lt;br /&gt;
#Type &amp;quot;./classify.py&amp;quot; wait a few hours.&lt;br /&gt;
#Type &amp;quot;./register.py&amp;quot; wait an hour or so.&lt;br /&gt;
&lt;br /&gt;
(For long-running jobs you want to leave and come back to, the [[screen program]] is your friend.)&lt;br /&gt;
&lt;br /&gt;
The result of this step is a set of scripts in $DATA/qsub that will be used for the classification and registration steps. The classify.py script executes the classification step, and unsurprisingly, register.py does the registration.  You&#039;ll also see a collector.py, which takes the output from the registration step and condenses it to a set of simple transposition matrices.  This script is run automatically at the end of the registration step, for the poses where registration succeeded.&lt;br /&gt;
&lt;br /&gt;
===Program inputs===&lt;br /&gt;
&lt;br /&gt;
The input to the classification stage is:&lt;br /&gt;
&lt;br /&gt;
* CT scans, stored in a directory called $DATA/original_scans&lt;br /&gt;
* A crop_values.txt file.&lt;br /&gt;
&lt;br /&gt;
The input to the registration step is:&lt;br /&gt;
&lt;br /&gt;
* The output from the classification stage, stored in $DATA/classified_scans.&lt;br /&gt;
* The digitized (segmented) bone shapes, stored in $DATA/original_stacks.&lt;br /&gt;
&lt;br /&gt;
Optionally, the input to this stage can include a [[registration configuration file]], which is used to set starting points for a registration match search, or to limit the range of such searches, or to eliminate the need for a search altogether, on a per-bone basis.&lt;br /&gt;
&lt;br /&gt;
Configuration files are generated each time the registration step is run, and put into the $DATA/warmBones directory.  You can use these files as raw material for creating a configuration file for your experiment.&lt;br /&gt;
&lt;br /&gt;
===Program outputs===&lt;br /&gt;
&lt;br /&gt;
The output of the two steps consists of files within the input data directory. For example, if the input data is in a directory called E50072_scan, the output of both steps will be files in subdirectories of that directory. In the following, we&#039;ll refer to the input data directory as $DATA.&lt;br /&gt;
&lt;br /&gt;
The output of the classification step is:&lt;br /&gt;
&lt;br /&gt;
* Classified scans in a folder called $DATA/classified_scans.&lt;br /&gt;
&lt;br /&gt;
* Log files found in $DATA/qsub_output/alpha_qsub.sh.oXXXXXX.Y and $DATA/qsub_output/subset_qsub.sh.oXXXXXX.Y, where XXXXXX is an identifier for the run and Y is the number of some process corresponding to that run.  The error output is in files called .eXXXXXX.YY. For successful runs, these files will be empty.&lt;br /&gt;
&lt;br /&gt;
The output of the registration step is:&lt;br /&gt;
&lt;br /&gt;
* The positions of the bones within a pose, stored in $DATA/auto_registr_results. There are two varieties of file in that directory.  The &#039;.txt&#039; files contain the output data, while the &#039;.log&#039; files contain potentially helpful output from the program.  If the --delete-log flag is used to invoke the registration step, the logs will be deleted upon successful execution.&lt;br /&gt;
&lt;br /&gt;
* The &#039;.txt&#039; files above are the output of the various attempts to find the rotations and translations of the various bones.  The registration step ends by executing &#039;collector.py&#039; that consolidates the rotations and translations in the &#039;.txt&#039; files.  These outputs are left in the $DATA/collected_results.&lt;br /&gt;
&lt;br /&gt;
* During the optimization step, the qsub program is used to run instances of the registration program on many different host machines.  The standard output of those runs can be found in files called $DATA/qsub_output/register_qsub.sh.oXXXXXX.Y, where XXXXXX is an identifier for the specific run and Y is the job number.  The error output is in files with the suffix eXXXXXX.Y.&lt;br /&gt;
&lt;br /&gt;
* You&#039;ll find configuration files that record the bone positions found in the $DATA/warmBones directory.  If you need to re-run your job, these files can save some time, since they use the optimized positions found in the registration run.  If any pose failed, the configuration file for that pose will include the correct positions of the bones found up to the failure point.&lt;br /&gt;
&lt;br /&gt;
===What we have here is a failure to register===&lt;br /&gt;
&lt;br /&gt;
The registration step often fails on one or more of the poses in a subject&#039;s data. You&#039;ll know the run has failed from the output to your terminal.  It will say something like &lt;br /&gt;
&lt;br /&gt;
   ERROR:  The WristRegistration runs failed with status = 1&lt;br /&gt;
           They need to be rerun.&lt;br /&gt;
&lt;br /&gt;
Probably only one or two of the poses failed; you can identify them from the text immediately before this. (An exit code of zero means success.)  Note that the job numbers you see on the program output are not the same as the numbers indicating a pose.  For example, a normal set of poses might be 2,3,4,5,6,7,8,9,10,11,12 and 15.  These will be executed as job numbers 1,2,3,4,5,6,7,8,9,10,11, and 12.&lt;br /&gt;
&lt;br /&gt;
Once you identify the offending pose, you need to use the Wrist Viewer program ([[WristViz]]) to find a good initial position for the bone alignments that failed.  Create or copy a configuration file and identify it in the corresponding $DATA/qsub/registerXX_qsub.sh file, where XX is the job number of the run you need to fix.  When you open that file, you&#039;ll see a messy long line that runs the WristRegistration program.  Add this to the end of that line:&lt;br /&gt;
&lt;br /&gt;
   --configFile config.txt&lt;br /&gt;
&lt;br /&gt;
Where config.txt is actually the path name of the [registration configuration file] you&#039;ve created.  There are sample configuration files in the $DATA/warmBones directory, and if you use the one that corresponds to the failed job, the registration process will use the data from the bones that succeeded and they don&#039;t have to be found again in the next run.  This can result in substantial time savings.&lt;br /&gt;
&lt;br /&gt;
Repeat the process above and it should succeed this time.&lt;/div&gt;</summary>
		<author><name>Tom Sgouros</name></author>
	</entry>
	<entry>
		<id>http://vrl.cs.brown.edu/wiki/index.php?title=Registration_configuration_file&amp;diff=6511</id>
		<title>Registration configuration file</title>
		<link rel="alternate" type="text/html" href="http://vrl.cs.brown.edu/wiki/index.php?title=Registration_configuration_file&amp;diff=6511"/>
		<updated>2014-04-10T00:28:43Z</updated>

		<summary type="html">&lt;p&gt;Tom Sgouros: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The registration configuration file can be used to control or skip some of the steps in the registration process.  It consists of a header section and then a series of per-bone sections.&lt;br /&gt;
&lt;br /&gt;
The header section begins with a line reading &amp;lt;code&amp;gt;[main]&amp;lt;/code&amp;gt; and contains a &amp;lt;code&amp;gt;startBone&amp;lt;/code&amp;gt; declaration.  The declarations following define default values for all the bones in the scan.  The pound character &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; indicates a comment.&lt;br /&gt;
&lt;br /&gt;
 [main]&lt;br /&gt;
 startBone=rad&lt;br /&gt;
 decentFitValue=10                                                                   &lt;br /&gt;
 failFitValue=20                                                                     &lt;br /&gt;
 TranslationLimit=5                                                                  &lt;br /&gt;
 RotationLimit=0.5                                                                   &lt;br /&gt;
 ...&lt;br /&gt;
 [tpd]&lt;br /&gt;
 dependsOn=tpm&lt;br /&gt;
 runMode=fixed&lt;br /&gt;
 StartTranslation=-0.35307  0.28524  -0.301178&lt;br /&gt;
 StartRotation=0.0150448  -0.0528962  -0.000270465&lt;br /&gt;
&lt;br /&gt;
The fields have the following meaning.  All the bone names are the three-letter short versions.&lt;br /&gt;
&lt;br /&gt;
;startBone&lt;br /&gt;
:The first bone in the hierarchy.  Almost always the radius.&lt;br /&gt;
;dependsOn&lt;br /&gt;
:Required for each bone except the startBone.  Indicates the bone above this one in the bone hierarchy.&lt;br /&gt;
;decentFitValue&lt;br /&gt;
:A fit value less than this number counts as success.  The optimization does not use this value as a test; it only seeks to minimize the fit value.  This setting simply issues a warning when it is exceeded.&lt;br /&gt;
;failFitValue&lt;br /&gt;
:If the final fit value is greater than this number, it will trigger an error and several warning messages.  The system will try to repeat the optimization with an increased RotationLimit before it fails.&lt;br /&gt;
;TranslationLimit&lt;br /&gt;
:In the optimization step, translations are limited to this distance in any direction.&lt;br /&gt;
;RotationLimit&lt;br /&gt;
:In the optimization step, rotations are limited to the range (-pi * RotationLimit, pi * RotationLimit).&lt;br /&gt;
;runMode&lt;br /&gt;
:&#039;fixed&#039; or &#039;twice&#039;. For &#039;fixed&#039; mode, the optimization step is skipped and the values given by StartTranslation and StartRotation are returned. &#039;twice&#039; is not implemented and should not be used.  If you don&#039;t want fixed mode, omit this parameter.&lt;br /&gt;
;StartTranslation&lt;br /&gt;
:When runMode is &#039;fixed&#039; this is the final translation value, three coordinates separated by spaces.  When not in fixed run mode, this value is sent to the optimization step as an initial guess.&lt;br /&gt;
;StartRotation&lt;br /&gt;
:When runMode is &#039;fixed&#039; this is the final rotation value, three coordinates separated by spaces, to be multiplied by pi before being used.  When not in fixed run mode, this value is sent to the optimization step as an initial guess.&lt;br /&gt;
&lt;br /&gt;
After a registration run, you will find sample registration configuration files in the $DATA/warmBones directory.  These can be used in conjunction with the &amp;lt;code&amp;gt;--warmConfig&amp;lt;/code&amp;gt; option to skip the registration calculation for bones whose position has already been found.  Use this to recover from an error without having to re-run all the bones before the one that caused the failure.&lt;/div&gt;</summary>
		<author><name>Tom Sgouros</name></author>
	</entry>
	<entry>
		<id>http://vrl.cs.brown.edu/wiki/index.php?title=Registration_configuration_file&amp;diff=6510</id>
		<title>Registration configuration file</title>
		<link rel="alternate" type="text/html" href="http://vrl.cs.brown.edu/wiki/index.php?title=Registration_configuration_file&amp;diff=6510"/>
		<updated>2014-04-10T00:26:36Z</updated>

		<summary type="html">&lt;p&gt;Tom Sgouros: added&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The registration configuration file can be used to control or skip some of the steps in the registration process.  It consists of a header section and then a series of per-bone sections.&lt;br /&gt;
&lt;br /&gt;
The header section begins with a line reading &amp;lt;code&amp;gt;[main]&amp;lt;/code&amp;gt; and contains a &amp;lt;code&amp;gt;startBone&amp;lt;/code&amp;gt; declaration.  The declarations following define default values for all the bones in the scan.  The pound character &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; indicates a comment.&lt;br /&gt;
&lt;br /&gt;
 [main]&lt;br /&gt;
 startBone=rad&lt;br /&gt;
 decentFitValue=10                                                                   &lt;br /&gt;
 failFitValue=20                                                                     &lt;br /&gt;
 TranslationLimit=5                                                                  &lt;br /&gt;
 RotationLimit=0.5                                                                   &lt;br /&gt;
 ...&lt;br /&gt;
 [tpd]&lt;br /&gt;
 dependsOn=tpm&lt;br /&gt;
 runMode=fixed&lt;br /&gt;
 StartTranslation=-0.35307  0.28524  -0.301178&lt;br /&gt;
 StartRotation=0.0150448  -0.0528962  -0.000270465&lt;br /&gt;
&lt;br /&gt;
The fields have the following meaning.  All the bone names are the three-letter short versions.&lt;br /&gt;
&lt;br /&gt;
startBone: The first bone in the hierarchy.  Almost always the radius.&lt;br /&gt;
dependsOn: Required for each bone except the startBone.  Indicates the bone above this one in the bone hierarchy.&lt;br /&gt;
decentFitValue: A fit value less than this number counts as success.  The optimization does not use this value as a test; it only seeks to minimize the fit value.  This setting simply issues a warning when it is exceeded.&lt;br /&gt;
failFitValue: If the final fit value is greater than this number, it will trigger an error and several warning messages.  The system will try to repeat the optimization with an increased RotationLimit before it fails.&lt;br /&gt;
TranslationLimit: In the optimization step, translations are limited to this distance in any direction.&lt;br /&gt;
RotationLimit: In the optimization step, rotations are limited to the range (-pi * RotationLimit, pi * RotationLimit).&lt;br /&gt;
runMode: &#039;fixed&#039; or &#039;twice&#039;. For &#039;fixed&#039; mode, the optimization step is skipped and the values given by StartTranslation and StartRotation are returned. &#039;twice&#039; is not implemented and should not be used.  If you don&#039;t want fixed mode, omit this parameter.&lt;br /&gt;
StartTranslation: When runMode is &#039;fixed&#039; this is the final translation value, three coordinates separated by spaces.  When not in fixed run mode, this value is sent to the optimization step as an initial guess.&lt;br /&gt;
StartRotation: When runMode is &#039;fixed&#039; this is the final rotation value, three coordinates separated by spaces, to be multiplied by pi before being used.  When not in fixed run mode, this value is sent to the optimization step as an initial guess.&lt;br /&gt;
&lt;br /&gt;
After a registration run, you will find sample registration configuration files in the $DATA/warmBones directory.  These can be used in conjunction with the &amp;lt;code&amp;gt;--warmConfig&amp;lt;/code&amp;gt; option to skip the registration calculation for bones whose position has already been found.  Use this to recover from an error without having to re-run all the bones before the one that caused the failure.&lt;/div&gt;</summary>
		<author><name>Tom Sgouros</name></author>
	</entry>
	<entry>
		<id>http://vrl.cs.brown.edu/wiki/index.php?title=Registration_of_Bones_Across_Positions&amp;diff=6509</id>
		<title>Registration of Bones Across Positions</title>
		<link rel="alternate" type="text/html" href="http://vrl.cs.brown.edu/wiki/index.php?title=Registration_of_Bones_Across_Positions&amp;diff=6509"/>
		<updated>2014-04-09T23:03:00Z</updated>

		<summary type="html">&lt;p&gt;Tom Sgouros: /* Program outputs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The registration process uses bone surfaces extracted from the neutral position and CT volumes to calculate bone kinematics, i.e rotations and translations of the center of mass of each each bone, across each position. This method has 2 steps, classification and registration.  The classification step sorts through the voxels calculating a distance from each voxel to the nearest surface.  The registration step uses that data to place a surface in such a way as to minimize the total sum of the distances.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==Tissue Classification and Localized Distance Fields==&lt;br /&gt;
&lt;br /&gt;
Bone, soft tissue, and air are represented by different intensities in CT images. Our tissue classification algorithm goes through the non-neutral CT volumes and calculates a distance from the center of each voxel to the closest material boundary. The output of classification is a distance field for each material. We are interested only in the distance field of the bone material.&lt;br /&gt;
&lt;br /&gt;
==Bone Registration==&lt;br /&gt;
&lt;br /&gt;
The input data to this step is the distance field derived in the classification step and the geometrical model obtained from the neutral CT scans. These are used to retrieve bone kinematics across positions. It works by superimposing the geometrical model on the distance field. If a voxel intersects the model surface, the voxel&#039;s distance to the nearest material surface is recorded. The sum of these distances provides a measure of how far out of alignment the model surface is. The registration step consists of searching the rotation and translation space of the bone to minimize the sum of these distances.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Technical Notes==&lt;br /&gt;
&lt;br /&gt;
To run the classification and registration process, follow these steps:&lt;br /&gt;
&lt;br /&gt;
#Check whether a &amp;quot;crop_values.txt&amp;quot; file exists -- it helps reduce the number of voxels processed.&lt;br /&gt;
#cd to the top-level of your subject&#039;s data.&lt;br /&gt;
#ssh to a CS-LAB machine, e.g., &amp;quot;ssh cslab9g&amp;quot;.&lt;br /&gt;
#Run install_linux/bin64/batchGen.py and answer the questions. (The first time you process the data, accept all the defaults.)&lt;br /&gt;
#Type &amp;quot;./classify.py&amp;quot; wait a few hours.&lt;br /&gt;
#Type &amp;quot;./register.py&amp;quot; wait an hour or so.&lt;br /&gt;
&lt;br /&gt;
(For long-running jobs you want to leave and come back to, the [[screen program]] is your friend.)&lt;br /&gt;
&lt;br /&gt;
The result of this step is a set of scripts in $DATA/qsub that will be used for the classification and registration steps. The classify.py script executes the classification step, and unsurprisingly, register.py does the registration.  You&#039;ll also see a collector.py, which takes the output from the registration step and condenses it to a set of simple transposition matrices.  This script is run automatically at the end of the registration step, for the poses where registration succeeded.&lt;br /&gt;
&lt;br /&gt;
===Program inputs===&lt;br /&gt;
&lt;br /&gt;
The input to the classification stage is:&lt;br /&gt;
&lt;br /&gt;
* CT scans, stored in a directory called $DATA/original_scans&lt;br /&gt;
* A crop_values.txt file.&lt;br /&gt;
&lt;br /&gt;
The input to the registration step is:&lt;br /&gt;
&lt;br /&gt;
* The output from the classification stage, stored in $DATA/classified_scans.&lt;br /&gt;
* The digitized (segmented) bone shapes, stored in $DATA/original_stacks.&lt;br /&gt;
&lt;br /&gt;
Optionally, the input to this stage can include a [[registration configuration file]], which is used to set starting points for a registration match search, or to limit the range of such searches, or to eliminate the need for a search altogether, on a per-bone basis.&lt;br /&gt;
&lt;br /&gt;
Configuration files are generated each time the registration step is run, and put into the $DATA/warmBones directory.  You can use these files as raw material for creating a configuration file for your experiment.&lt;br /&gt;
&lt;br /&gt;
===Program outputs===&lt;br /&gt;
&lt;br /&gt;
The output of the two steps consists of files within the input data directory. For example, if the input data is in a directory called E50072_scan, the output of both steps will be files in subdirectories of that directory. In the following, we&#039;ll refer to the input data directory as $DATA.&lt;br /&gt;
&lt;br /&gt;
The output of the classification step is:&lt;br /&gt;
&lt;br /&gt;
* Classified scans in a folder called $DATA/classified_scans.&lt;br /&gt;
&lt;br /&gt;
* Log files found in $DATA/qsub_output/alpha_qsub.sh.oXXXXXX.Y and $DATA/qsub_output/subset_qsub.sh.oXXXXXX.Y, where XXXXXX is an identifier for the run and Y is the number of some process corresponding to that run.  The error output is in files called .eXXXXXX.YY. For successful runs, these files will be empty.&lt;br /&gt;
&lt;br /&gt;
The output of the registration step is:&lt;br /&gt;
&lt;br /&gt;
* The positions of the bones within a pose, stored in $DATA/auto_registr_results. There are two varieties of file in that directory.  The &#039;.txt&#039; files contain the output data, while the &#039;.log&#039; files contain potentially helpful output from the program.  If the --delete-log flag is used to invoke the registration step, the logs will be deleted upon successful execution.&lt;br /&gt;
&lt;br /&gt;
* The &#039;.txt&#039; files above are the output of the various attempts to find the rotations and translations of the various bones.  The registration step ends by executing &#039;collector.py&#039; that consolidates the rotations and translations in the &#039;.txt&#039; files.  These outputs are left in the $DATA/collected_results.&lt;br /&gt;
&lt;br /&gt;
* During the optimization step, the qsub program is used to run instances of the registration program on many different host machines.  The standard output of those runs can be found in files called $DATA/qsub_output/register_qsub.sh.oXXXXXX.Y, where XXXXXX is an identifier for the specific run and Y is the job number.  The error output is in files with the suffix eXXXXXX.Y.&lt;br /&gt;
&lt;br /&gt;
* You&#039;ll find configuration files that record the bone positions found in the $DATA/warmBones directory.  If you need to re-run your job, these files can save some time, since they use the optimized positions found in the registration run.  If any pose failed, the configuration file for that pose will include the correct positions of the bones found up to the failure point.&lt;br /&gt;
&lt;br /&gt;
===What we have here is a failure to register===&lt;br /&gt;
&lt;br /&gt;
The registration step often fails on one or more of the poses in a subject&#039;s data. You&#039;ll know the run has failed from the output to your terminal.  It will say something like &lt;br /&gt;
&lt;br /&gt;
   ERROR:  The WristRegistration runs failed with status = 1&lt;br /&gt;
           They need to be rerun.&lt;br /&gt;
&lt;br /&gt;
Probably only one or two of the poses failed; you can identify them from the text immediately before this. (An exit code of zero means success.)  Note that the job numbers you see on the program output are not the same as the numbers indicating a pose.  For example, a normal set of poses might be 2,3,4,5,6,7,8,9,10,11,12 and 15.  These will be executed as job numbers 1,2,3,4,5,6,7,8,9,10,11, and 12.&lt;br /&gt;
&lt;br /&gt;
Once you identify the offending pose, you need to use the Wrist Viewer program ([[WristViz]]) to find a good initial position for the bone alignments that failed.  Create or copy a configuration file and identify it in the corresponding $DATA/qsub/registerXX_qsub.sh file, where XX is the job number of the run you need to fix.  When you open that file, you&#039;ll see a messy long line that runs the WristRegistration program.  Add this to the end of that line:&lt;br /&gt;
&lt;br /&gt;
   --configFile config.txt&lt;br /&gt;
&lt;br /&gt;
Where config.txt is actually the path name of the configuration file you&#039;ve created.  There are sample configuration files in the $DATA/warmBones directory, and if you use the one that corresponds to the failed job, the registration process will use the data from the bones that succeeded and they don&#039;t have to be found again in the next run.  This can result in substantial time savings.&lt;br /&gt;
&lt;br /&gt;
Repeat the process above and it should succeed this time.&lt;/div&gt;</summary>
		<author><name>Tom Sgouros</name></author>
	</entry>
	<entry>
		<id>http://vrl.cs.brown.edu/wiki/index.php?title=Registration_of_Bones_Across_Positions&amp;diff=6508</id>
		<title>Registration of Bones Across Positions</title>
		<link rel="alternate" type="text/html" href="http://vrl.cs.brown.edu/wiki/index.php?title=Registration_of_Bones_Across_Positions&amp;diff=6508"/>
		<updated>2014-04-09T21:24:18Z</updated>

		<summary type="html">&lt;p&gt;Tom Sgouros: /* Technical Notes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The registration process uses bone surfaces extracted from the neutral position and CT volumes to calculate bone kinematics, i.e rotations and translations of the center of mass of each each bone, across each position. This method has 2 steps, classification and registration.  The classification step sorts through the voxels calculating a distance from each voxel to the nearest surface.  The registration step uses that data to place a surface in such a way as to minimize the total sum of the distances.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==Tissue Classification and Localized Distance Fields==&lt;br /&gt;
&lt;br /&gt;
Bone, soft tissue, and air are represented by different intensities in CT images. Our tissue classification algorithm goes through the non-neutral CT volumes and calculates a distance from the center of each voxel to the closest material boundary. The output of classification is a distance field for each material. We are interested only in the distance field of the bone material.&lt;br /&gt;
&lt;br /&gt;
==Bone Registration==&lt;br /&gt;
&lt;br /&gt;
The input data to this step is the distance field derived in the classification step and the geometrical model obtained from the neutral CT scans. These are used to retrieve bone kinematics across positions. It works by superimposing the geometrical model on the distance field. If a voxel intersects the model surface, the voxel&#039;s distance to the nearest material surface is recorded. The sum of these distances provides a measure of how far out of alignment the model surface is. The registration step consists of searching the rotation and translation space of the bone to minimize the sum of these distances.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Technical Notes==&lt;br /&gt;
&lt;br /&gt;
To run the classification and registration process, follow these steps:&lt;br /&gt;
&lt;br /&gt;
#Check whether a &amp;quot;crop_values.txt&amp;quot; file exists -- it helps reduce the number of voxels processed.&lt;br /&gt;
#cd to the top-level of your subject&#039;s data.&lt;br /&gt;
#ssh to a CS-LAB machine, e.g., &amp;quot;ssh cslab9g&amp;quot;.&lt;br /&gt;
#Run install_linux/bin64/batchGen.py and answer the questions. (The first time you process the data, accept all the defaults.)&lt;br /&gt;
#Type &amp;quot;./classify.py&amp;quot; wait a few hours.&lt;br /&gt;
#Type &amp;quot;./register.py&amp;quot; wait an hour or so.&lt;br /&gt;
&lt;br /&gt;
(For long-running jobs you want to leave and come back to, the [[screen program]] is your friend.)&lt;br /&gt;
&lt;br /&gt;
The result of this step is a set of scripts in $DATA/qsub that will be used for the classification and registration steps. The classify.py script executes the classification step, and unsurprisingly, register.py does the registration.  You&#039;ll also see a collector.py, which takes the output from the registration step and condenses it to a set of simple transposition matrices.  This script is run automatically at the end of the registration step, for the poses where registration succeeded.&lt;br /&gt;
&lt;br /&gt;
===Program inputs===&lt;br /&gt;
&lt;br /&gt;
The input to the classification stage is:&lt;br /&gt;
&lt;br /&gt;
* CT scans, stored in a directory called $DATA/original_scans&lt;br /&gt;
* A crop_values.txt file.&lt;br /&gt;
&lt;br /&gt;
The input to the registration step is:&lt;br /&gt;
&lt;br /&gt;
* The output from the classification stage, stored in $DATA/classified_scans.&lt;br /&gt;
* The digitized (segmented) bone shapes, stored in $DATA/original_stacks.&lt;br /&gt;
&lt;br /&gt;
Optionally, the input to this stage can include a [[registration configuration file]], which is used to set starting points for a registration match search, or to limit the range of such searches, or to eliminate the need for a search altogether, on a per-bone basis.&lt;br /&gt;
&lt;br /&gt;
Configuration files are generated each time the registration step is run, and put into the $DATA/warmBones directory.  You can use these files as raw material for creating a configuration file for your experiment.&lt;br /&gt;
&lt;br /&gt;
===Program outputs===&lt;br /&gt;
&lt;br /&gt;
The output of the two steps consists of files within the input data directory. For example, if the input data is in a directory called E50072_scan, the output of both steps will be files in subdirectories of that directory. In the following, we&#039;ll refer to the input data directory as $DATA.&lt;br /&gt;
&lt;br /&gt;
The output of the classification step is:&lt;br /&gt;
&lt;br /&gt;
The output of the registration step is:&lt;br /&gt;
&lt;br /&gt;
* You&#039;ll find the positions of the bones within a pose in $DATA/auto_registr_results. There are two varieties of file in that directory.  The &#039;.txt&#039; files contain the output data, while the &#039;.log&#039; files contain potentially helpful output from the program.  If the --delete-log flag is used to invoke the registration step, the logs will be deleted upon successful execution.&lt;br /&gt;
&lt;br /&gt;
* The &#039;.txt&#039; files above are the output of the various attempts to find the rotations and translations of the various bones.  The registration step ends by executing &#039;collector.py&#039; that consolidates the rotations and translations in the &#039;.txt&#039; files.  These outputs are left in the $DATA/collected_results.&lt;br /&gt;
&lt;br /&gt;
* During the optimization step, the qsub program is used to run instances of the registration program on many different host machines.  The standard output of those runs can be found in files called $DATA/qsub_output/register_qsub.sh.oXXXXXX.Y, where XXXXXX is an identifier for the specific run and Y is the job number.  The error output is in files with the suffix eXXXXXX.Y.&lt;br /&gt;
&lt;br /&gt;
* You&#039;ll find configuration files that record the bone positions found in the $DATA/warmBones directory.  If you need to re-run your job, these files can save some time, since they use the optimized positions found in the registration run.  If any pose failed, the configuration file for that pose will include the correct positions of the bones found up to the failure point.&lt;br /&gt;
&lt;br /&gt;
===What we have here is a failure to register===&lt;br /&gt;
&lt;br /&gt;
The registration step often fails on one or more of the poses in a subject&#039;s data. You&#039;ll know the run has failed from the output to your terminal.  It will say something like &lt;br /&gt;
&lt;br /&gt;
   ERROR:  The WristRegistration runs failed with status = 1&lt;br /&gt;
           They need to be rerun.&lt;br /&gt;
&lt;br /&gt;
Probably only one or two of the poses failed; you can identify them from the text immediately before this. (An exit code of zero means success.)  Note that the job numbers you see on the program output are not the same as the numbers indicating a pose.  For example, a normal set of poses might be 2,3,4,5,6,7,8,9,10,11,12 and 15.  These will be executed as job numbers 1,2,3,4,5,6,7,8,9,10,11, and 12.&lt;br /&gt;
&lt;br /&gt;
Once you identify the offending pose, you need to use the Wrist Viewer program ([[WristViz]]) to find a good initial position for the bone alignments that failed.  Create or copy a configuration file and identify it in the corresponding $DATA/qsub/registerXX_qsub.sh file, where XX is the job number of the run you need to fix.  When you open that file, you&#039;ll see a messy long line that runs the WristRegistration program.  Add this to the end of that line:&lt;br /&gt;
&lt;br /&gt;
   --configFile config.txt&lt;br /&gt;
&lt;br /&gt;
Where config.txt is actually the path name of the configuration file you&#039;ve created.  There are sample configuration files in the $DATA/warmBones directory, and if you use the one that corresponds to the failed job, the registration process will use the data from the bones that succeeded and they don&#039;t have to be found again in the next run.  This can result in substantial time savings.&lt;br /&gt;
&lt;br /&gt;
Repeat the process above and it should succeed this time.&lt;/div&gt;</summary>
		<author><name>Tom Sgouros</name></author>
	</entry>
	<entry>
		<id>http://vrl.cs.brown.edu/wiki/index.php?title=Registration&amp;diff=6507</id>
		<title>Registration</title>
		<link rel="alternate" type="text/html" href="http://vrl.cs.brown.edu/wiki/index.php?title=Registration&amp;diff=6507"/>
		<updated>2014-04-09T21:13:52Z</updated>

		<summary type="html">&lt;p&gt;Tom Sgouros: Most of these instructions have changed, and the linked page has the updated version.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://wiki.brown.edu/confluence/display/orthobio/Compiling+the+CS+Carpal+Pipeline|Compiling the CS Carpal Pipeline]&lt;br /&gt;
&lt;br /&gt;
[[Registration of Bones Across Positions#Technical Notes|Use instructions here]]&lt;/div&gt;</summary>
		<author><name>Tom Sgouros</name></author>
	</entry>
	<entry>
		<id>http://vrl.cs.brown.edu/wiki/index.php?title=Wrists&amp;diff=6506</id>
		<title>Wrists</title>
		<link rel="alternate" type="text/html" href="http://vrl.cs.brown.edu/wiki/index.php?title=Wrists&amp;diff=6506"/>
		<updated>2014-04-09T21:11:29Z</updated>

		<summary type="html">&lt;p&gt;Tom Sgouros: /* Specific Tools and Technical Details */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The wrist is a diarthrodial anatomical joint consisting of 8 small bones (scaphoid, capitate, hamate, lunate, trapezium, trapezoid, triquetrum, pisiform) and 7 long bones (radius, ulna, and 5 metacarpals). When subject to injury and disease the wrist undergoes changes in kinematics, inter-bone joint space areas, cartilage thickness, length of ligament paths, etc. Developing computational tools for the analysis of anatomical joint characteristics is important in understanding the cause of injury, tracing the progress of disease, and taking preventative measures.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;250px&amp;quot; heights=&amp;quot;250px&amp;quot;&amp;gt;&lt;br /&gt;
Image:Wrist.jpg.jpeg|  X-ray of the wrist with bone names&lt;br /&gt;
Image:Ligaments.jpg|  Ligaments: posterior view of left wrist&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description of Overall Pipeline==&lt;br /&gt;
&lt;br /&gt;
#[[Data]] &lt;br /&gt;
#[[Bone Surface Extraction]]&lt;br /&gt;
#[[Registration of Bones Across Positions]]&lt;br /&gt;
#[[Retrieval of Kinematics]]&lt;br /&gt;
#[[Inter-bone Joint Space Area Calculations]]&lt;br /&gt;
#[[Ligament Path Calculations]] &lt;br /&gt;
#[[Cartilage Maps (location &amp;amp; thickness)]]&lt;br /&gt;
#[[Cartilage Surface Deformations]]&lt;br /&gt;
#[[Joint Simulation]]&lt;br /&gt;
&lt;br /&gt;
==Specific Tools and Technical Details==&lt;br /&gt;
&lt;br /&gt;
#[[Registration of Bones Across Positions#Technical Notes|registration]]&lt;br /&gt;
#[[joint space area calculations]]&lt;br /&gt;
#[[cartilage building]]&lt;br /&gt;
#&amp;quot;wiggling&amp;quot; bones around&lt;br /&gt;
#ligament length measures&lt;br /&gt;
&lt;br /&gt;
[[Wrist Pipeline Technical Details | Technical Details on Wrist Pipeline and its relationship to the $G software framework]]&lt;/div&gt;</summary>
		<author><name>Tom Sgouros</name></author>
	</entry>
	<entry>
		<id>http://vrl.cs.brown.edu/wiki/index.php?title=Wrists&amp;diff=6505</id>
		<title>Wrists</title>
		<link rel="alternate" type="text/html" href="http://vrl.cs.brown.edu/wiki/index.php?title=Wrists&amp;diff=6505"/>
		<updated>2014-04-09T21:10:11Z</updated>

		<summary type="html">&lt;p&gt;Tom Sgouros: /* Specific Tools and Technical Details */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The wrist is a diarthrodial anatomical joint consisting of 8 small bones (scaphoid, capitate, hamate, lunate, trapezium, trapezoid, triquetrum, pisiform) and 7 long bones (radius, ulna, and 5 metacarpals). When subject to injury and disease the wrist undergoes changes in kinematics, inter-bone joint space areas, cartilage thickness, length of ligament paths, etc. Developing computational tools for the analysis of anatomical joint characteristics is important in understanding the cause of injury, tracing the progress of disease, and taking preventative measures.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;250px&amp;quot; heights=&amp;quot;250px&amp;quot;&amp;gt;&lt;br /&gt;
Image:Wrist.jpg.jpeg|  X-ray of the wrist with bone names&lt;br /&gt;
Image:Ligaments.jpg|  Ligaments: posterior view of left wrist&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description of Overall Pipeline==&lt;br /&gt;
&lt;br /&gt;
#[[Data]] &lt;br /&gt;
#[[Bone Surface Extraction]]&lt;br /&gt;
#[[Registration of Bones Across Positions]]&lt;br /&gt;
#[[Retrieval of Kinematics]]&lt;br /&gt;
#[[Inter-bone Joint Space Area Calculations]]&lt;br /&gt;
#[[Ligament Path Calculations]] &lt;br /&gt;
#[[Cartilage Maps (location &amp;amp; thickness)]]&lt;br /&gt;
#[[Cartilage Surface Deformations]]&lt;br /&gt;
#[[Joint Simulation]]&lt;br /&gt;
&lt;br /&gt;
==Specific Tools and Technical Details==&lt;br /&gt;
&lt;br /&gt;
#[Registration_of_Bones_Across_Positions#Technical_Notes registration]&lt;br /&gt;
#[[joint space area calculations]]&lt;br /&gt;
#[[cartilage building]]&lt;br /&gt;
#&amp;quot;wiggling&amp;quot; bones around&lt;br /&gt;
#ligament length measures&lt;br /&gt;
&lt;br /&gt;
[[Wrist Pipeline Technical Details | Technical Details on Wrist Pipeline and its relationship to the $G software framework]]&lt;/div&gt;</summary>
		<author><name>Tom Sgouros</name></author>
	</entry>
	<entry>
		<id>http://vrl.cs.brown.edu/wiki/index.php?title=Screen_program&amp;diff=6503</id>
		<title>Screen program</title>
		<link rel="alternate" type="text/html" href="http://vrl.cs.brown.edu/wiki/index.php?title=Screen_program&amp;diff=6503"/>
		<updated>2014-04-08T15:39:11Z</updated>

		<summary type="html">&lt;p&gt;Tom Sgouros: added external links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The [http://www.gnu.org/software/screen/ screen program] is a useful Linux utility that can leave a session running without a terminal window open.  Do &#039;man screen&#039; to get more information, but here are the basics:&lt;br /&gt;
&lt;br /&gt;
* Log into whatever machine you plan to run your program on.&lt;br /&gt;
* Type &#039;screen&#039; to start the program.&lt;br /&gt;
* Get everything ready and start your long-running job.&lt;br /&gt;
* Type &#039;ctrl-A&#039; and then &#039;d&#039; for &#039;detach&#039; and the screen you were just looking at will disappear.&lt;br /&gt;
* You can now log off and your job will keep on running.  &lt;br /&gt;
&lt;br /&gt;
Don&#039;t forget to make a note of which machine you were running it on, though.  There are a lot of machines in the sunlab and you don&#039;t want to have to log onto them all to find the program you left running.&lt;br /&gt;
&lt;br /&gt;
Later, when you want to resume work:&lt;br /&gt;
&lt;br /&gt;
* Log in to the same machine you were running on before.&lt;br /&gt;
* Type &#039;screen -r&#039; to resume where you left off. &lt;br /&gt;
* The screen you had before should reappear.&lt;br /&gt;
&lt;br /&gt;
Screen can manage multiple sessions, too, and is useful in dozens of other ways, but there is real documentation out there to consult for that purpose.  Type &#039;ctrl-A&#039; and &#039;?&#039; to get a tiny taste, but don&#039;t go much further without at least reading the man page or the [http://www.gnu.org/software/screen/manual/ rest of its ample documentation].&lt;/div&gt;</summary>
		<author><name>Tom Sgouros</name></author>
	</entry>
	<entry>
		<id>http://vrl.cs.brown.edu/wiki/index.php?title=Registration_of_Bones_Across_Positions&amp;diff=6502</id>
		<title>Registration of Bones Across Positions</title>
		<link rel="alternate" type="text/html" href="http://vrl.cs.brown.edu/wiki/index.php?title=Registration_of_Bones_Across_Positions&amp;diff=6502"/>
		<updated>2014-04-08T15:32:17Z</updated>

		<summary type="html">&lt;p&gt;Tom Sgouros: /* Technical Notes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The registration process uses bone surfaces extracted from the neutral position and CT volumes to calculate bone kinematics, i.e rotations and translations of the center of mass of each each bone, across each position. This method has 2 steps, classification and registration.  The classification step sorts through the voxels calculating a distance from each voxel to the nearest surface.  The registration step uses that data to place a surface in such a way as to minimize the total sum of the distances.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==Tissue Classification and Localized Distance Fields==&lt;br /&gt;
&lt;br /&gt;
Bone, soft tissue, and air are represented by different intensities in CT images. Our tissue classification algorithm goes through the non-neutral CT volumes and calculates a distance from the center of each voxel to the closest material boundary. The output of classification is a distance field for each material. We are interested only in the distance field of the bone material.&lt;br /&gt;
&lt;br /&gt;
==Bone Registration==&lt;br /&gt;
&lt;br /&gt;
The input data to this step is the distance field derived in the classification step and the geometrical model obtained from the neutral CT scans. These are used to retrieve bone kinematics across positions. It works by superimposing the geometrical model on the distance field. If a voxel intersects the model surface, the voxel&#039;s distance to the nearest material surface is recorded. The sum of these distances provides a measure of how far out of alignment the model surface is. The registration step consists of searching the rotation and translation space of the bone to minimize the sum of these distances.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Technical Notes==&lt;br /&gt;
&lt;br /&gt;
To run the classification and registration process, follow these steps:&lt;br /&gt;
&lt;br /&gt;
#Check whether a &amp;quot;crop_values.txt&amp;quot; file exists -- it helps reduce the number of voxels processed.&lt;br /&gt;
#cd to the top-level of your subject&#039;s data.&lt;br /&gt;
#ssh to a CS-LAB machine, e.g., &amp;quot;ssh cslab9g&amp;quot;.&lt;br /&gt;
#Run install_linux/bin64/batchGen.py and answer the questions. (The first time you process the data, accept all the defaults.)&lt;br /&gt;
#Type &amp;quot;./classify.py&amp;quot; wait a few hours.&lt;br /&gt;
#Type &amp;quot;./register.py&amp;quot; wait an hour or so.&lt;br /&gt;
&lt;br /&gt;
(For long-running jobs you want to leave and come back to, the [[screen program]] is your friend.)&lt;br /&gt;
&lt;br /&gt;
The result of this step is a set of scripts in $DATA/qsub that will be used for the classification and registration steps.&lt;br /&gt;
&lt;br /&gt;
===Program input===&lt;br /&gt;
&lt;br /&gt;
The input to the classification stage is:&lt;br /&gt;
&lt;br /&gt;
* CT scans, stored in a directory called $DATA/original_scans&lt;br /&gt;
* A crop_values.txt file.&lt;br /&gt;
&lt;br /&gt;
The input to the registration step is:&lt;br /&gt;
&lt;br /&gt;
* The output from the classification stage, stored in $DATA/classified_scans.&lt;br /&gt;
* The digitized (segmented) bone shapes, stored in $DATA/original_stacks.&lt;br /&gt;
&lt;br /&gt;
Optionally, the input to this stage can include a [[registration configuration file]], which is used to set starting points for a registration match search, or to limit the range of such searches, or to eliminate the need for a search altogether, on a per-bone basis.&lt;br /&gt;
&lt;br /&gt;
Configuration files are generated each time the registration step is run, and put into the $DATA/warmBones directory.  You can use these files as raw material for creating a configuration file for your experiment.&lt;br /&gt;
&lt;br /&gt;
===Program output===&lt;br /&gt;
&lt;br /&gt;
The output of the two steps consists of files within the input data directory. For example, if the input data is in a directory called E50072_scan, the output of both steps will be files in subdirectories of that directory. In the following, we&#039;ll refer to the input data directory as $DATA.&lt;br /&gt;
&lt;br /&gt;
The output of the classification step is:&lt;br /&gt;
&lt;br /&gt;
The output of the registration step is:&lt;br /&gt;
&lt;br /&gt;
* You&#039;ll find the positions of the bones within a pose in $DATA/auto_registr_results . There are two varieties of file in that directory.  The &#039;.txt&#039; files contain the output data, while the &#039;.log&#039; files contain potentially helpful output from the program.  If the --delete-log flag is used to invoke the registration step, the logs will be deleted upon successful execution.&lt;br /&gt;
&lt;br /&gt;
* During the optimization step, the qsub program is used to run instances of the registration program on many different host machines.  The standard output of those runs can be found in files called $DATA/qsub_output/register_qsub.sh.oXXXXXX.Y, where XXXXXX is an identifier for the specific run and Y is the job number.  The error output is in files with the suffix eXXXXXX.Y.&lt;br /&gt;
&lt;br /&gt;
* You&#039;ll find configuration files that record the bone positions found in the $DATA/warmBones directory.  If you need to re-run your job, these files can save some time, since they use the optimized positions found in the registration run.  If any pose failed, the configuration file for that pose will include the correct positions of the bones found up to the failure point.&lt;br /&gt;
&lt;br /&gt;
===What we have here is a failure to register===&lt;br /&gt;
&lt;br /&gt;
The registration step often fails on one or more of the poses in a subject&#039;s data. You&#039;ll know the run has failed from the output to your terminal.  It will say something like &lt;br /&gt;
&lt;br /&gt;
   ERROR:  The WristRegistration runs failed with status = 1&lt;br /&gt;
           They need to be rerun.&lt;br /&gt;
&lt;br /&gt;
Probably only one or two of the poses failed; you can identify them from the text immediately before this. (An exit code of zero means success.)  Note that the job numbers you see on the program output are not the same as the numbers indicating a pose.  For example, a normal set of poses might be 2,3,4,5,6,7,8,9,10,11,12 and 15.  These will be executed as job numbers 1,2,3,4,5,6,7,8,9,10,11, and 12.&lt;br /&gt;
&lt;br /&gt;
Once you identify the offending pose, you need to use the Wrist Viewer program ([[WristViz]]) to find a good initial position for the bone alignments that failed.  Create or copy a configuration file and identify it in the corresponding $DATA/qsub/registerXX_qsub.sh file, where XX is the job number of the run you need to fix.  When you open that file, you&#039;ll see a messy long line that runs the WristRegistration program.  Add this to the end of that line:&lt;br /&gt;
&lt;br /&gt;
   --configFile config.txt&lt;br /&gt;
&lt;br /&gt;
Where config.txt is actually the path name of the configuration file you&#039;ve created.  There are sample configuration files in the $DATA/warmBones directory, and if you use the one that corresponds to the failed job, the registration process will use the data from the bones that succeeded and they don&#039;t have to be found again in the next run.  This can result in substantial time savings.&lt;br /&gt;
&lt;br /&gt;
Repeat the process above and it should succeed this time.&lt;/div&gt;</summary>
		<author><name>Tom Sgouros</name></author>
	</entry>
	<entry>
		<id>http://vrl.cs.brown.edu/wiki/index.php?title=Registration_of_Bones_Across_Positions&amp;diff=6501</id>
		<title>Registration of Bones Across Positions</title>
		<link rel="alternate" type="text/html" href="http://vrl.cs.brown.edu/wiki/index.php?title=Registration_of_Bones_Across_Positions&amp;diff=6501"/>
		<updated>2014-04-08T15:13:22Z</updated>

		<summary type="html">&lt;p&gt;Tom Sgouros: /* Program input */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The registration process uses bone surfaces extracted from the neutral position and CT volumes to calculate bone kinematics, i.e rotations and translations of the center of mass of each each bone, across each position. This method has 2 steps, classification and registration.  The classification step sorts through the voxels calculating a distance from each voxel to the nearest surface.  The registration step uses that data to place a surface in such a way as to minimize the total sum of the distances.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==Tissue Classification and Localized Distance Fields==&lt;br /&gt;
&lt;br /&gt;
Bone, soft tissue, and air are represented by different intensities in CT images. Our tissue classification algorithm goes through the non-neutral CT volumes and calculates a distance from the center of each voxel to the closest material boundary. The output of classification is a distance field for each material. We are interested only in the distance field of the bone material.&lt;br /&gt;
&lt;br /&gt;
==Bone Registration==&lt;br /&gt;
&lt;br /&gt;
The input data to this step is the distance field derived in the classification step and the geometrical model obtained from the neutral CT scans. These are used to retrieve bone kinematics across positions. It works by superimposing the geometrical model on the distance field. If a voxel intersects the model surface, the voxel&#039;s distance to the nearest material surface is recorded. The sum of these distances provides a measure of how far out of alignment the model surface is. The registration step consists of searching the rotation and translation space of the bone to minimize the sum of these distances.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Technical Notes==&lt;br /&gt;
&lt;br /&gt;
To run the classification and registration process, follow these steps:&lt;br /&gt;
&lt;br /&gt;
#check whether a &amp;quot;crop_values.txt&amp;quot; file exists-- it helps reduce the number of voxels processed&lt;br /&gt;
#cd to the top-level of your subject&#039;s data&lt;br /&gt;
#ssh to a CS-LAB machine, e.g., &amp;quot;ssh cslab9g&amp;quot;&lt;br /&gt;
#run install_linux/bin64/batchGen.py and answer the questions&lt;br /&gt;
##The first time you process the data, accept all the defaults&lt;br /&gt;
#type &amp;quot;./classify.py&amp;quot; wait a few hours&lt;br /&gt;
#type &amp;quot;./register.py&amp;quot; wait an hour or so&lt;br /&gt;
&lt;br /&gt;
(For long-running jobs you want to leave and come back to, the [[screen program]] is your friend.)&lt;br /&gt;
&lt;br /&gt;
===Program input===&lt;br /&gt;
&lt;br /&gt;
The wrist registration program runs in a &lt;br /&gt;
&lt;br /&gt;
The input to the classification stage is:&lt;br /&gt;
&lt;br /&gt;
* CT scans, stored in a directory called $DATA/original_scans&lt;br /&gt;
* A crop_values.txt file.&lt;br /&gt;
&lt;br /&gt;
The input to the registration step is:&lt;br /&gt;
&lt;br /&gt;
* The output from the classification stage, stored in $DATA/classified_scans.&lt;br /&gt;
* The digitized (segmented) bone shapes, stored in $DATA/original_stacks.&lt;br /&gt;
&lt;br /&gt;
Optionally, the input to this stage can include a [[registration configuration file]], which is used to set starting points for a registration match search, or to limit the range of such searches, or to eliminate the need for a search altogether, on a per-bone basis.&lt;br /&gt;
&lt;br /&gt;
Configuration files are generated each time the registration step is run, and put into the $DATA/warmBones directory.  You can use these files as raw material for creating a configuration file for your experiment.&lt;br /&gt;
&lt;br /&gt;
===Program output===&lt;br /&gt;
&lt;br /&gt;
The output of the two steps consists of files within the input data directory. For example, if the input data is in a directory called E50072_scan, the output of both steps will be files in subdirectories of that directory. In the following, we&#039;ll refer to the input data directory as $DATA.&lt;br /&gt;
&lt;br /&gt;
The output of the classification step is:&lt;br /&gt;
&lt;br /&gt;
The output of the registration step is:&lt;br /&gt;
&lt;br /&gt;
* You&#039;ll find the positions of the bones within a pose in $DATA/auto_registr_results . There are two varieties of file in that directory.  The &#039;.txt&#039; files contain the output data, while the &#039;.log&#039; files contain potentially helpful output from the program.  If the --delete-log flag is used to invoke the registration step, the logs will be deleted upon successful execution.&lt;br /&gt;
&lt;br /&gt;
* During the optimization step, the qsub program is used to run instances of the registration program on many different host machines.  The standard output of those runs can be found in files called $DATA/qsub_output/register_qsub.sh.oXXXXXX.Y, where XXXXXX is an identifier for the specific run and Y is the job number.  The error output is in files with the suffix eXXXXXX.Y.&lt;br /&gt;
&lt;br /&gt;
* You&#039;ll find configuration files that record the bone positions found in the $DATA/warmBones directory.  If you need to re-run your job, these files can save some time, since they use the optimized positions found in the registration run.  If any pose failed, the configuration file for that pose will include the correct positions of the bones found up to the failure point.&lt;br /&gt;
&lt;br /&gt;
===What we have here is a failure to register===&lt;br /&gt;
&lt;br /&gt;
The registration step often fails on one or more of the poses in a subject&#039;s data. You&#039;ll know the run has failed from the output to your terminal.  It will say something like &lt;br /&gt;
&lt;br /&gt;
   ERROR:  The WristRegistration runs failed with status = 1&lt;br /&gt;
           They need to be rerun.&lt;br /&gt;
&lt;br /&gt;
Probably only one or two of the poses failed; you can identify them from the text immediately before this. (An exit code of zero means success.)  Note that the job numbers you see on the program output are not the same as the numbers indicating a pose.  For example, a normal set of poses might be 2,3,4,5,6,7,8,9,10,11,12 and 15.  These will be executed as job numbers 1,2,3,4,5,6,7,8,9,10,11, and 12.&lt;br /&gt;
&lt;br /&gt;
Once you identify the offending pose, you need to use the Wrist Viewer program ([[WristViz]]) to find a good initial position for the bone alignments that failed.  Create or copy a configuration file and identify it in the corresponding $DATA/qsub/registerXX_qsub.sh file, where XX is the job number of the run you need to fix.  When you open that file, you&#039;ll see a messy long line that runs the WristRegistration program.  Add this to the end of that line:&lt;br /&gt;
&lt;br /&gt;
   --configFile config.txt&lt;br /&gt;
&lt;br /&gt;
Where config.txt is actually the path name of the configuration file you&#039;ve created.  There are sample configuration files in the $DATA/warmBones directory, and if you use the one that corresponds to the failed job, the registration process will use the data from the bones that succeeded and they don&#039;t have to be found again in the next run.  This can result in substantial time savings.&lt;br /&gt;
&lt;br /&gt;
Repeat the process above and it should succeed this time.&lt;/div&gt;</summary>
		<author><name>Tom Sgouros</name></author>
	</entry>
	<entry>
		<id>http://vrl.cs.brown.edu/wiki/index.php?title=Registration_of_Bones_Across_Positions&amp;diff=6500</id>
		<title>Registration of Bones Across Positions</title>
		<link rel="alternate" type="text/html" href="http://vrl.cs.brown.edu/wiki/index.php?title=Registration_of_Bones_Across_Positions&amp;diff=6500"/>
		<updated>2014-04-07T21:22:11Z</updated>

		<summary type="html">&lt;p&gt;Tom Sgouros: /* Program output */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The registration process uses bone surfaces extracted from the neutral position and CT volumes to calculate bone kinematics, i.e rotations and translations of the center of mass of each each bone, across each position. This method has 2 steps, classification and registration.  The classification step sorts through the voxels calculating a distance from each voxel to the nearest surface.  The registration step uses that data to place a surface in such a way as to minimize the total sum of the distances.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==Tissue Classification and Localized Distance Fields==&lt;br /&gt;
&lt;br /&gt;
Bone, soft tissue, and air are represented by different intensities in CT images. Our tissue classification algorithm goes through the non-neutral CT volumes and calculates a distance from the center of each voxel to the closest material boundary. The output of classification is a distance field for each material. We are interested only in the distance field of the bone material.&lt;br /&gt;
&lt;br /&gt;
==Bone Registration==&lt;br /&gt;
&lt;br /&gt;
The input data to this step is the distance field derived in the classification step and the geometrical model obtained from the neutral CT scans. These are used to retrieve bone kinematics across positions. It works by superimposing the geometrical model on the distance field. If a voxel intersects the model surface, the voxel&#039;s distance to the nearest material surface is recorded. The sum of these distances provides a measure of how far out of alignment the model surface is. The registration step consists of searching the rotation and translation space of the bone to minimize the sum of these distances.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Technical Notes==&lt;br /&gt;
&lt;br /&gt;
To run the classification and registration process, follow these steps:&lt;br /&gt;
&lt;br /&gt;
#check whether a &amp;quot;crop_values.txt&amp;quot; file exists-- it helps reduce the number of voxels processed&lt;br /&gt;
#cd to the top-level of your subject&#039;s data&lt;br /&gt;
#ssh to a CS-LAB machine, e.g., &amp;quot;ssh cslab9g&amp;quot;&lt;br /&gt;
#run install_linux/bin64/batchGen.py and answer the questions&lt;br /&gt;
##The first time you process the data, accept all the defaults&lt;br /&gt;
#type &amp;quot;./classify.py&amp;quot; wait a few hours&lt;br /&gt;
#type &amp;quot;./register.py&amp;quot; wait an hour or so&lt;br /&gt;
&lt;br /&gt;
(For long-running jobs you want to leave and come back to, the [[screen program]] is your friend.)&lt;br /&gt;
&lt;br /&gt;
===Program input===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Program output===&lt;br /&gt;
&lt;br /&gt;
The output of the two steps consists of files within the input data directory. For example, if the input data is in a directory called E50072_scan, the output of both steps will be files in subdirectories of that directory. In the following, we&#039;ll refer to the input data directory as $DATA.&lt;br /&gt;
&lt;br /&gt;
The output of the classification step is:&lt;br /&gt;
&lt;br /&gt;
The output of the registration step is:&lt;br /&gt;
&lt;br /&gt;
* You&#039;ll find the positions of the bones within a pose in $DATA/auto_registr_results . There are two varieties of file in that directory.  The &#039;.txt&#039; files contain the output data, while the &#039;.log&#039; files contain potentially helpful output from the program.  If the --delete-log flag is used to invoke the registration step, the logs will be deleted upon successful execution.&lt;br /&gt;
&lt;br /&gt;
* During the optimization step, the qsub program is used to run instances of the registration program on many different host machines.  The standard output of those runs can be found in files called $DATA/qsub_output/register_qsub.sh.oXXXXXX.Y, where XXXXXX is an identifier for the specific run and Y is the job number.  The error output is in files with the suffix eXXXXXX.Y.&lt;br /&gt;
&lt;br /&gt;
* You&#039;ll find configuration files that record the bone positions found in the $DATA/warmBones directory.  If you need to re-run your job, these files can save some time, since they use the optimized positions found in the registration run.  If any pose failed, the configuration file for that pose will include the correct positions of the bones found up to the failure point.&lt;br /&gt;
&lt;br /&gt;
===What we have here is a failure to register===&lt;br /&gt;
&lt;br /&gt;
The registration step often fails on one or more of the poses in a subject&#039;s data. You&#039;ll know the run has failed from the output to your terminal.  It will say something like &lt;br /&gt;
&lt;br /&gt;
   ERROR:  The WristRegistration runs failed with status = 1&lt;br /&gt;
           They need to be rerun.&lt;br /&gt;
&lt;br /&gt;
Probably only one or two of the poses failed; you can identify them from the text immediately before this. (An exit code of zero means success.)  Note that the job numbers you see on the program output are not the same as the numbers indicating a pose.  For example, a normal set of poses might be 2,3,4,5,6,7,8,9,10,11,12 and 15.  These will be executed as job numbers 1,2,3,4,5,6,7,8,9,10,11, and 12.&lt;br /&gt;
&lt;br /&gt;
Once you identify the offending pose, you need to use the Wrist Viewer program ([[WristViz]]) to find a good initial position for the bone alignments that failed.  Create or copy a configuration file and identify it in the corresponding $DATA/qsub/registerXX_qsub.sh file, where XX is the job number of the run you need to fix.  When you open that file, you&#039;ll see a messy long line that runs the WristRegistration program.  Add this to the end of that line:&lt;br /&gt;
&lt;br /&gt;
   --configFile config.txt&lt;br /&gt;
&lt;br /&gt;
Where config.txt is actually the path name of the configuration file you&#039;ve created.  There are sample configuration files in the $DATA/warmBones directory, and if you use the one that corresponds to the failed job, the registration process will use the data from the bones that succeeded and they don&#039;t have to be found again in the next run.  This can result in substantial time savings.&lt;br /&gt;
&lt;br /&gt;
Repeat the process above and it should succeed this time.&lt;/div&gt;</summary>
		<author><name>Tom Sgouros</name></author>
	</entry>
	<entry>
		<id>http://vrl.cs.brown.edu/wiki/index.php?title=Registration_of_Bones_Across_Positions&amp;diff=6499</id>
		<title>Registration of Bones Across Positions</title>
		<link rel="alternate" type="text/html" href="http://vrl.cs.brown.edu/wiki/index.php?title=Registration_of_Bones_Across_Positions&amp;diff=6499"/>
		<updated>2014-04-07T21:20:00Z</updated>

		<summary type="html">&lt;p&gt;Tom Sgouros: /* What we have here is a failure to register */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The registration process uses bone surfaces extracted from the neutral position and CT volumes to calculate bone kinematics, i.e rotations and translations of the center of mass of each each bone, across each position. This method has 2 steps, classification and registration.  The classification step sorts through the voxels calculating a distance from each voxel to the nearest surface.  The registration step uses that data to place a surface in such a way as to minimize the total sum of the distances.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==Tissue Classification and Localized Distance Fields==&lt;br /&gt;
&lt;br /&gt;
Bone, soft tissue, and air are represented by different intensities in CT images. Our tissue classification algorithm goes through the non-neutral CT volumes and calculates a distance from the center of each voxel to the closest material boundary. The output of classification is a distance field for each material. We are interested only in the distance field of the bone material.&lt;br /&gt;
&lt;br /&gt;
==Bone Registration==&lt;br /&gt;
&lt;br /&gt;
The input data to this step is the distance field derived in the classification step and the geometrical model obtained from the neutral CT scans. These are used to retrieve bone kinematics across positions. It works by superimposing the geometrical model on the distance field. If a voxel intersects the model surface, the voxel&#039;s distance to the nearest material surface is recorded. The sum of these distances provides a measure of how far out of alignment the model surface is. The registration step consists of searching the rotation and translation space of the bone to minimize the sum of these distances.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Technical Notes==&lt;br /&gt;
&lt;br /&gt;
To run the classification and registration process, follow these steps:&lt;br /&gt;
&lt;br /&gt;
#check whether a &amp;quot;crop_values.txt&amp;quot; file exists-- it helps reduce the number of voxels processed&lt;br /&gt;
#cd to the top-level of your subject&#039;s data&lt;br /&gt;
#ssh to a CS-LAB machine, e.g., &amp;quot;ssh cslab9g&amp;quot;&lt;br /&gt;
#run install_linux/bin64/batchGen.py and answer the questions&lt;br /&gt;
##The first time you process the data, accept all the defaults&lt;br /&gt;
#type &amp;quot;./classify.py&amp;quot; wait a few hours&lt;br /&gt;
#type &amp;quot;./register.py&amp;quot; wait an hour or so&lt;br /&gt;
&lt;br /&gt;
(For long-running jobs you want to leave and come back to, the [[screen program]] is your friend.)&lt;br /&gt;
&lt;br /&gt;
===Program input===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Program output===&lt;br /&gt;
&lt;br /&gt;
The output of the two steps consists of files within the input data directory. For example, if the input data is in a directory called E50072_scan, the output of both steps will be files in subdirectories of that directory. In the following, we&#039;ll refer to the input data directory as $DATA.&lt;br /&gt;
&lt;br /&gt;
The output of the classification step is:&lt;br /&gt;
&lt;br /&gt;
The output of the registration step is:&lt;br /&gt;
&lt;br /&gt;
* You&#039;ll find the positions of the bones within a pose in $DATA/auto_registr_results . There are two varieties of file in that directory.  The &#039;.txt&#039; files contain the output data, while the &#039;.log&#039; files contain potentially helpful output from the program.  If the --delete-log flag is used to invoke the registration step, the logs will be deleted upon successful execution.&lt;br /&gt;
&lt;br /&gt;
* During the optimization step, the qsub program is used to run instances of the registration program on many different host machines.  The standard output of those runs can be found in files called $DATA/qsub_output/register_qsub.sh.oXXXXXX.Y, where XXXXXX is an identifier for the specific run and Y is the job number.  The error output is in files with the suffix eXXXXXX.Y.&lt;br /&gt;
&lt;br /&gt;
===What we have here is a failure to register===&lt;br /&gt;
&lt;br /&gt;
The registration step often fails on one or more of the poses in a subject&#039;s data. You&#039;ll know the run has failed from the output to your terminal.  It will say something like &lt;br /&gt;
&lt;br /&gt;
   ERROR:  The WristRegistration runs failed with status = 1&lt;br /&gt;
           They need to be rerun.&lt;br /&gt;
&lt;br /&gt;
Probably only one or two of the poses failed; you can identify them from the text immediately before this. (An exit code of zero means success.)  Note that the job numbers you see on the program output are not the same as the numbers indicating a pose.  For example, a normal set of poses might be 2,3,4,5,6,7,8,9,10,11,12 and 15.  These will be executed as job numbers 1,2,3,4,5,6,7,8,9,10,11, and 12.&lt;br /&gt;
&lt;br /&gt;
Once you identify the offending pose, you need to use the Wrist Viewer program ([[WristViz]]) to find a good initial position for the bone alignments that failed.  Create or copy a configuration file and identify it in the corresponding $DATA/qsub/registerXX_qsub.sh file, where XX is the job number of the run you need to fix.  When you open that file, you&#039;ll see a messy long line that runs the WristRegistration program.  Add this to the end of that line:&lt;br /&gt;
&lt;br /&gt;
   --configFile config.txt&lt;br /&gt;
&lt;br /&gt;
Where config.txt is actually the path name of the configuration file you&#039;ve created.  There are sample configuration files in the $DATA/warmBones directory, and if you use the one that corresponds to the failed job, the registration process will use the data from the bones that succeeded and they don&#039;t have to be found again in the next run.  This can result in substantial time savings.&lt;br /&gt;
&lt;br /&gt;
Repeat the process above and it should succeed this time.&lt;/div&gt;</summary>
		<author><name>Tom Sgouros</name></author>
	</entry>
	<entry>
		<id>http://vrl.cs.brown.edu/wiki/index.php?title=Screen_program&amp;diff=6498</id>
		<title>Screen program</title>
		<link rel="alternate" type="text/html" href="http://vrl.cs.brown.edu/wiki/index.php?title=Screen_program&amp;diff=6498"/>
		<updated>2014-04-07T21:02:55Z</updated>

		<summary type="html">&lt;p&gt;Tom Sgouros: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The screen program is a useful Linux utility that can leave a session running without a terminal window open.  Do &#039;man screen&#039; to get more information, but here are the basics:&lt;br /&gt;
&lt;br /&gt;
* Log into whatever machine you plan to run your program on.&lt;br /&gt;
* Type &#039;screen&#039; to start the program.&lt;br /&gt;
* Get everything ready and start your long-running job.&lt;br /&gt;
* Type &#039;ctrl-A&#039; and then &#039;d&#039; for &#039;detach&#039; and the screen you were just looking at will disappear.&lt;br /&gt;
* You can now log off and your job will keep on running.  &lt;br /&gt;
&lt;br /&gt;
Don&#039;t forget to make a note of which machine you were running it on, though.  There are a lot of machines in the sunlab and you don&#039;t want to have to log onto them all to find the program you left running.&lt;br /&gt;
&lt;br /&gt;
Later, when you want to resume work:&lt;br /&gt;
&lt;br /&gt;
* Log in to the same machine you were running on before.&lt;br /&gt;
* Type &#039;screen -r&#039; to resume where you left off. &lt;br /&gt;
* The screen you had before should reappear.&lt;br /&gt;
&lt;br /&gt;
Screen can manage multiple sessions, too, and is useful in dozens of other ways, but there is real documentation out there to consult for that purpose.  Type &#039;ctrl-A&#039; and &#039;?&#039; to get a tiny taste, but don&#039;t go much further without at least reading the man page.&lt;/div&gt;</summary>
		<author><name>Tom Sgouros</name></author>
	</entry>
	<entry>
		<id>http://vrl.cs.brown.edu/wiki/index.php?title=Screen_program&amp;diff=6497</id>
		<title>Screen program</title>
		<link rel="alternate" type="text/html" href="http://vrl.cs.brown.edu/wiki/index.php?title=Screen_program&amp;diff=6497"/>
		<updated>2014-04-07T21:00:50Z</updated>

		<summary type="html">&lt;p&gt;Tom Sgouros: brief introduction to the screen program&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The screen program is a useful Linux utility that can leave a session running without a terminal window open.  Do &#039;man screen&#039; to get more information, but here are the basics:&lt;br /&gt;
&lt;br /&gt;
* Type &#039;screen&#039; to start the program.&lt;br /&gt;
* Get everything ready and start your long-running job.&lt;br /&gt;
* Type &#039;ctrl-A&#039; and then &#039;d&#039; for &#039;detach&#039; and the screen you were just looking at will disappear.&lt;br /&gt;
* You can now log off and your job will keep on running.  Make a note of which machine you were running it on, though.&lt;br /&gt;
&lt;br /&gt;
Later, when you want to resume work:&lt;br /&gt;
&lt;br /&gt;
* Log in to the same machine you were running on before.&lt;br /&gt;
* Type &#039;screen -r&#039; to resume where you left off. &lt;br /&gt;
* The screen you had before should reappear.&lt;br /&gt;
&lt;br /&gt;
Screen can manage multiple sessions, too, and is useful in dozens of other ways, but there is real documentation out there to consult for that purpose.&lt;/div&gt;</summary>
		<author><name>Tom Sgouros</name></author>
	</entry>
	<entry>
		<id>http://vrl.cs.brown.edu/wiki/index.php?title=Registration_of_Bones_Across_Positions&amp;diff=6496</id>
		<title>Registration of Bones Across Positions</title>
		<link rel="alternate" type="text/html" href="http://vrl.cs.brown.edu/wiki/index.php?title=Registration_of_Bones_Across_Positions&amp;diff=6496"/>
		<updated>2014-04-07T20:55:38Z</updated>

		<summary type="html">&lt;p&gt;Tom Sgouros: /* What we have here is a failure to register */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The registration process uses bone surfaces extracted from the neutral position and CT volumes to calculate bone kinematics, i.e rotations and translations of the center of mass of each each bone, across each position. This method has 2 steps, classification and registration.  The classification step sorts through the voxels calculating a distance from each voxel to the nearest surface.  The registration step uses that data to place a surface in such a way as to minimize the total sum of the distances.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==Tissue Classification and Localized Distance Fields==&lt;br /&gt;
&lt;br /&gt;
Bone, soft tissue, and air are represented by different intensities in CT images. Our tissue classification algorithm goes through the non-neutral CT volumes and calculates a distance from the center of each voxel to the closest material boundary. The output of classification is a distance field for each material. We are interested only in the distance field of the bone material.&lt;br /&gt;
&lt;br /&gt;
==Bone Registration==&lt;br /&gt;
&lt;br /&gt;
The input data to this step is the distance field derived in the classification step and the geometrical model obtained from the neutral CT scans. These are used to retrieve bone kinematics across positions. It works by superimposing the geometrical model on the distance field. If a voxel intersects the model surface, the voxel&#039;s distance to the nearest material surface is recorded. The sum of these distances provides a measure of how far out of alignment the model surface is. The registration step consists of searching the rotation and translation space of the bone to minimize the sum of these distances.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Technical Notes==&lt;br /&gt;
&lt;br /&gt;
To run the classification and registration process, follow these steps:&lt;br /&gt;
&lt;br /&gt;
#check whether a &amp;quot;crop_values.txt&amp;quot; file exists-- it helps reduce the number of voxels processed&lt;br /&gt;
#cd to the top-level of your subject&#039;s data&lt;br /&gt;
#ssh to a CS-LAB machine, e.g., &amp;quot;ssh cslab9g&amp;quot;&lt;br /&gt;
#run install_linux/bin64/batchGen.py and answer the questions&lt;br /&gt;
##The first time you process the data, accept all the defaults&lt;br /&gt;
#type &amp;quot;./classify.py&amp;quot; wait a few hours&lt;br /&gt;
#type &amp;quot;./register.py&amp;quot; wait an hour or so&lt;br /&gt;
&lt;br /&gt;
(For long-running jobs you want to leave and come back to, the [[screen program]] is your friend.)&lt;br /&gt;
&lt;br /&gt;
===Program input===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Program output===&lt;br /&gt;
&lt;br /&gt;
The output of the two steps consists of files within the input data directory. For example, if the input data is in a directory called E50072_scan, the output of both steps will be files in subdirectories of that directory. In the following, we&#039;ll refer to the input data directory as $DATA.&lt;br /&gt;
&lt;br /&gt;
The output of the classification step is:&lt;br /&gt;
&lt;br /&gt;
The output of the registration step is:&lt;br /&gt;
&lt;br /&gt;
* You&#039;ll find the positions of the bones within a pose in $DATA/auto_registr_results . There are two varieties of file in that directory.  The &#039;.txt&#039; files contain the output data, while the &#039;.log&#039; files contain potentially helpful output from the program.  If the --delete-log flag is used to invoke the registration step, the logs will be deleted upon successful execution.&lt;br /&gt;
&lt;br /&gt;
* During the optimization step, the qsub program is used to run instances of the registration program on many different host machines.  The standard output of those runs can be found in files called $DATA/qsub_output/register_qsub.sh.oXXXXXX.Y, where XXXXXX is an identifier for the specific run and Y is the job number.  The error output is in files with the suffix eXXXXXX.Y.&lt;br /&gt;
&lt;br /&gt;
===What we have here is a failure to register===&lt;br /&gt;
&lt;br /&gt;
The registration step often fails on one or more of the poses in a subject&#039;s data. You&#039;ll know the run has failed from the output to your terminal.  It will say something like &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   ERROR:  The WristRegistration runs failed with status = 1&lt;br /&gt;
           They need to be rerun.&lt;br /&gt;
&lt;br /&gt;
Probably only one or two of the poses failed; you can identify them from the text immediately before this. (An exit code of zero means success.)  Note that the job numbers you see on the program output are not the same as the numbers indicating a pose.  For example, a normal set of poses might be 2,3,4,5,6,7,8,9,10,11,12 and 15.  These will be executed as job numbers 1,2,3,4,5,6,7,8,9,10,11, and 12.&lt;br /&gt;
&lt;br /&gt;
Once you identify the offending pose, you need to use the Wrist Viewer program ([[WristViz]]) to find a good initial position for the bone alignments that failed.  When you re-run the registration step&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This manually-found initial position information goes into files called &amp;quot;config_01L.ini&amp;quot;, for example, and should be saved into the subject&#039;s root data directory.&lt;br /&gt;
&lt;br /&gt;
Repeat the process above and it should succeed this time.&lt;/div&gt;</summary>
		<author><name>Tom Sgouros</name></author>
	</entry>
	<entry>
		<id>http://vrl.cs.brown.edu/wiki/index.php?title=Registration_of_Bones_Across_Positions&amp;diff=6495</id>
		<title>Registration of Bones Across Positions</title>
		<link rel="alternate" type="text/html" href="http://vrl.cs.brown.edu/wiki/index.php?title=Registration_of_Bones_Across_Positions&amp;diff=6495"/>
		<updated>2014-04-07T20:55:14Z</updated>

		<summary type="html">&lt;p&gt;Tom Sgouros: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The registration process uses bone surfaces extracted from the neutral position and CT volumes to calculate bone kinematics, i.e rotations and translations of the center of mass of each each bone, across each position. This method has 2 steps, classification and registration.  The classification step sorts through the voxels calculating a distance from each voxel to the nearest surface.  The registration step uses that data to place a surface in such a way as to minimize the total sum of the distances.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==Tissue Classification and Localized Distance Fields==&lt;br /&gt;
&lt;br /&gt;
Bone, soft tissue, and air are represented by different intensities in CT images. Our tissue classification algorithm goes through the non-neutral CT volumes and calculates a distance from the center of each voxel to the closest material boundary. The output of classification is a distance field for each material. We are interested only in the distance field of the bone material.&lt;br /&gt;
&lt;br /&gt;
==Bone Registration==&lt;br /&gt;
&lt;br /&gt;
The input data to this step is the distance field derived in the classification step and the geometrical model obtained from the neutral CT scans. These are used to retrieve bone kinematics across positions. It works by superimposing the geometrical model on the distance field. If a voxel intersects the model surface, the voxel&#039;s distance to the nearest material surface is recorded. The sum of these distances provides a measure of how far out of alignment the model surface is. The registration step consists of searching the rotation and translation space of the bone to minimize the sum of these distances.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Technical Notes==&lt;br /&gt;
&lt;br /&gt;
To run the classification and registration process, follow these steps:&lt;br /&gt;
&lt;br /&gt;
#check whether a &amp;quot;crop_values.txt&amp;quot; file exists-- it helps reduce the number of voxels processed&lt;br /&gt;
#cd to the top-level of your subject&#039;s data&lt;br /&gt;
#ssh to a CS-LAB machine, e.g., &amp;quot;ssh cslab9g&amp;quot;&lt;br /&gt;
#run install_linux/bin64/batchGen.py and answer the questions&lt;br /&gt;
##The first time you process the data, accept all the defaults&lt;br /&gt;
#type &amp;quot;./classify.py&amp;quot; wait a few hours&lt;br /&gt;
#type &amp;quot;./register.py&amp;quot; wait an hour or so&lt;br /&gt;
&lt;br /&gt;
(For long-running jobs you want to leave and come back to, the [[screen program]] is your friend.)&lt;br /&gt;
&lt;br /&gt;
===Program input===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Program output===&lt;br /&gt;
&lt;br /&gt;
The output of the two steps consists of files within the input data directory. For example, if the input data is in a directory called E50072_scan, the output of both steps will be files in subdirectories of that directory. In the following, we&#039;ll refer to the input data directory as $DATA.&lt;br /&gt;
&lt;br /&gt;
The output of the classification step is:&lt;br /&gt;
&lt;br /&gt;
The output of the registration step is:&lt;br /&gt;
&lt;br /&gt;
* You&#039;ll find the positions of the bones within a pose in $DATA/auto_registr_results . There are two varieties of file in that directory.  The &#039;.txt&#039; files contain the output data, while the &#039;.log&#039; files contain potentially helpful output from the program.  If the --delete-log flag is used to invoke the registration step, the logs will be deleted upon successful execution.&lt;br /&gt;
&lt;br /&gt;
* During the optimization step, the qsub program is used to run instances of the registration program on many different host machines.  The standard output of those runs can be found in files called $DATA/qsub_output/register_qsub.sh.oXXXXXX.Y, where XXXXXX is an identifier for the specific run and Y is the job number.  The error output is in files with the suffix eXXXXXX.Y.&lt;br /&gt;
&lt;br /&gt;
===What we have here is a failure to register===&lt;br /&gt;
&lt;br /&gt;
The registration step often fails on one or more of the poses in a subject&#039;s data. You&#039;ll know the run has failed from the output to your terminal.  It will say something like &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ERROR:  The WristRegistration runs failed with status = 1&lt;br /&gt;
        They need to be rerun.&lt;br /&gt;
&lt;br /&gt;
Probably only one or two of the poses failed; you can identify them from the text immediately before this. (An exit code of zero means success.)  Note that the job numbers you see on the program output are not the same as the numbers indicating a pose.  For example, a normal set of poses might be 2,3,4,5,6,7,8,9,10,11,12 and 15.  These will be executed as job numbers 1,2,3,4,5,6,7,8,9,10,11, and 12.&lt;br /&gt;
&lt;br /&gt;
Once you identify the offending pose, you need to use the Wrist Viewer program ([[WristViz]]) to find a good initial position for the bone alignments that failed.  When you re-run the registration step&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This manually-found initial position information goes into files called &amp;quot;config_01L.ini&amp;quot;, for example, and should be saved into the subject&#039;s root data directory.&lt;br /&gt;
&lt;br /&gt;
Repeat the process above and it should succeed this time.&lt;/div&gt;</summary>
		<author><name>Tom Sgouros</name></author>
	</entry>
	<entry>
		<id>http://vrl.cs.brown.edu/wiki/index.php?title=Registration_of_Bones_Across_Positions&amp;diff=6494</id>
		<title>Registration of Bones Across Positions</title>
		<link rel="alternate" type="text/html" href="http://vrl.cs.brown.edu/wiki/index.php?title=Registration_of_Bones_Across_Positions&amp;diff=6494"/>
		<updated>2014-04-07T20:54:27Z</updated>

		<summary type="html">&lt;p&gt;Tom Sgouros: revamp&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The registration process uses bone surfaces extracted from the neutral position and CT volumes to calculate bone kinematics, i.e rotations and translations of the center of mass of each each bone, across each position. This method has 2 steps, classification and registration.  The classification step sorts through the voxels calculating a distance from each voxel to the nearest surface.  The registration step uses that data to place a surface in such a way as to minimize the total sum of the distances.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==Tissue Classification and Localized Distance Fields==&lt;br /&gt;
&lt;br /&gt;
Bone, soft tissue, and air are represented by different intensities in CT images. Our tissue classification algorithm goes through the non-neutral CT volumes and calculates a distance from the center of each voxel to the closest material boundary. The output of classification is a distance field for each material. We are interested only in the distance field of the bone material.&lt;br /&gt;
&lt;br /&gt;
==Bone Registration==&lt;br /&gt;
&lt;br /&gt;
The input data to this step is the distance field derived in the classification step and the geometrical model obtained from the neutral CT scans. These are used to retrieve bone kinematics across positions. It works by superimposing the geometrical model on the distance field. If a voxel intersects the model surface, the voxel&#039;s distance to the nearest material surface is recorded. The sum of these distances provides a measure of how far out of alignment the model surface is. The registration step consists of searching the rotation and translation space of the bone to minimize the sum of these distances.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Technical Notes==&lt;br /&gt;
&lt;br /&gt;
To run the classification and registration process, follow these steps:&lt;br /&gt;
&lt;br /&gt;
#check whether a &amp;quot;crop_values.txt&amp;quot; file exists-- it helps reduce the number of voxels processed&lt;br /&gt;
#cd to the top-level of your subject&#039;s data&lt;br /&gt;
#ssh to a CS-LAB machine, e.g., &amp;quot;ssh cslab9g&amp;quot;&lt;br /&gt;
#run install_linux/bin64/batchGen.py and answer the questions&lt;br /&gt;
##The first time you process the data, accept all the defaults&lt;br /&gt;
#type &amp;quot;./classify.py&amp;quot; wait a few hours&lt;br /&gt;
#type &amp;quot;./register.py&amp;quot; wait an hour or so&lt;br /&gt;
&lt;br /&gt;
(For long-running jobs you want to leave and come back to, the [[screen program]] is your friend.)&lt;br /&gt;
&lt;br /&gt;
===Program input===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Program output===&lt;br /&gt;
&lt;br /&gt;
The output of the two steps consists of files within the input data directory. For example, if the input data is in a directory called E50072_scan, the output of both steps will be files in subdirectories of that directory. In the following, we&#039;ll refer to the input data directory as $DATA.&lt;br /&gt;
&lt;br /&gt;
The output of the classification step is:&lt;br /&gt;
&lt;br /&gt;
The output of the registration step is:&lt;br /&gt;
&lt;br /&gt;
* You&#039;ll find the positions of the bones within a pose in $DATA/auto_registr_results . There are two varieties of file in that directory.  The &#039;.txt&#039; files contain the output data, while the &#039;.log&#039; files contain potentially helpful output from the program.  If the --delete-log flag is used to invoke the registration step, the logs will be deleted upon successful execution.&lt;br /&gt;
&lt;br /&gt;
* During the optimization step, the qsub program is used to run instances of the registration program on many different host machines.  The standard output of those runs can be found in files called $DATA/qsub_output/register_qsub.sh.oXXXXXX.Y, where XXXXXX is an identifier for the specific run and Y is the job number.  The error output is in files with the suffix eXXXXXX.Y.&lt;br /&gt;
&lt;br /&gt;
===What we have here is a failure to register===&lt;br /&gt;
&lt;br /&gt;
The registration step often fails on one or more of the poses in a subject&#039;s data. You&#039;ll know the run has failed from the output to your terminal.  It will say something like &lt;br /&gt;
&lt;br /&gt;
[[code]]&lt;br /&gt;
ERROR:  The WristRegistration runs failed with status = 1&lt;br /&gt;
        They need to be rerun.&lt;br /&gt;
[[code]]&lt;br /&gt;
&lt;br /&gt;
Probably only one or two of the poses failed; you can identify them from the text immediately before this. (An exit code of zero means success.)  Note that the job numbers you see on the program output are not the same as the numbers indicating a pose.  For example, a normal set of poses might be 2,3,4,5,6,7,8,9,10,11,12 and 15.  These will be executed as job numbers 1,2,3,4,5,6,7,8,9,10,11, and 12.&lt;br /&gt;
&lt;br /&gt;
Once you identify the offending pose, you need to use the Wrist Viewer program ([[WristViz]]) to find a good initial position for the bone alignments that failed.  When you re-run the registration step&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This manually-found initial position information goes into files called &amp;quot;config_01L.ini&amp;quot;, for example, and should be saved into the subject&#039;s root data directory.&lt;br /&gt;
&lt;br /&gt;
Repeat the process above and it should succeed this time.&lt;/div&gt;</summary>
		<author><name>Tom Sgouros</name></author>
	</entry>
	<entry>
		<id>http://vrl.cs.brown.edu/wiki/index.php?title=Registration_of_Bones_Across_Positions&amp;diff=6493</id>
		<title>Registration of Bones Across Positions</title>
		<link rel="alternate" type="text/html" href="http://vrl.cs.brown.edu/wiki/index.php?title=Registration_of_Bones_Across_Positions&amp;diff=6493"/>
		<updated>2014-04-07T17:46:30Z</updated>

		<summary type="html">&lt;p&gt;Tom Sgouros: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The registration process uses bone surfaces extracted from the neutral position and CT volumes to calculate bone kinematics, i.e rotations and translations of the center of mass of each each bone, across each position. This method has 2 steps, classification and registration.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==Tissue Classification and Localized Distance Fields==&lt;br /&gt;
&lt;br /&gt;
Bone, soft tissue, and air are represented by different intensities in CT images. Our tissue classification algorithm goes through the non-neutral CT volumes and calculates a distance from the center of each voxel to the closest material boundary. The output of classification is a distance field for each material. We are interested only in the distance field of the bone material.&lt;br /&gt;
&lt;br /&gt;
==Object Tracking==&lt;br /&gt;
&lt;br /&gt;
The geometrical model obtained from the neutral CT scans and the classification results  are used to retrieve bone kinematics across positions. The model is registered in a given non-neutral position by searching until distance field similarity is maximized.&lt;br /&gt;
&lt;br /&gt;
==Technical Note==&lt;br /&gt;
&lt;br /&gt;
To run the classification and registration process, follow these steps:&lt;br /&gt;
&lt;br /&gt;
#check whether a &amp;quot;crop_values.txt&amp;quot; file exists-- it helps reduce the number of voxels processed&lt;br /&gt;
#cd to the top-level of your subject&#039;s data&lt;br /&gt;
#run $G/src/jspBin/batchGen.pl (this generates the files &amp;quot;unixbatch&amp;quot;, &amp;quot;regbatch&amp;quot;, &amp;quot;subsetbatch&amp;quot; in that directory)&lt;br /&gt;
##The first time you process the data, accept all the defaults&lt;br /&gt;
#ssh to a CS-LAB machine, e.g., &amp;quot;ssh cslab9g&amp;quot;&lt;br /&gt;
#cd to the subject&#039;s root directory again&lt;br /&gt;
#type &amp;quot;./unixbatch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The first pass often fails and you need to use the Wrist Viewer program to find a good initial position for the bone alignments that failed.  This manually-found initial position information goes into files called &amp;quot;config_01L.ini&amp;quot;, for example, and should be saved into the subject&#039;s root data directory.&lt;br /&gt;
&lt;br /&gt;
Repeat the process above and it should succeed this time.&lt;/div&gt;</summary>
		<author><name>Tom Sgouros</name></author>
	</entry>
	<entry>
		<id>http://vrl.cs.brown.edu/wiki/index.php?title=Registration_of_Bones_Across_Positions&amp;diff=6492</id>
		<title>Registration of Bones Across Positions</title>
		<link rel="alternate" type="text/html" href="http://vrl.cs.brown.edu/wiki/index.php?title=Registration_of_Bones_Across_Positions&amp;diff=6492"/>
		<updated>2014-04-07T17:45:45Z</updated>

		<summary type="html">&lt;p&gt;Tom Sgouros: /* Tissue Classification and Localized Distance Fields */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The registration process uses bone surfaces extracted from the neutral position and CT volumes to calculate bone kinematics, i.e rotations and translations of the center of mass of each each bone, across each position. This method has 2 steps.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==Tissue Classification and Localized Distance Fields==&lt;br /&gt;
&lt;br /&gt;
Bone, soft tissue, and air are represented by different intensities in CT images. Our tissue classification algorithm goes through the non-neutral CT volumes and calculates a distance from the center of each voxel to the closest material boundary. The output of classification is a distance field for each material. We are interested only in the distance field of the bone material.&lt;br /&gt;
&lt;br /&gt;
==Object Tracking==&lt;br /&gt;
&lt;br /&gt;
The geometrical model obtained from the neutral CT scans and the classification results  are used to retrieve bone kinematics across positions. The model is registered in a given non-neutral position by searching until distance field similarity is maximized.&lt;br /&gt;
&lt;br /&gt;
==Technical Note==&lt;br /&gt;
&lt;br /&gt;
To run the classification and registration process, follow these steps:&lt;br /&gt;
&lt;br /&gt;
#check whether a &amp;quot;crop_values.txt&amp;quot; file exists-- it helps reduce the number of voxes processed&lt;br /&gt;
#cd to the top-level of your subject&#039;s data&lt;br /&gt;
#run $G/src/jspBin/batchGen.pl (this generates the files &amp;quot;unixbatch&amp;quot;, &amp;quot;regbatch&amp;quot;, &amp;quot;subsetbatch&amp;quot; in that directory)&lt;br /&gt;
##The first time you process the data, accept all the defaults&lt;br /&gt;
#ssh to a CS-LAB machine, e.g., &amp;quot;ssh cslab9g&amp;quot;&lt;br /&gt;
#cd to the subject&#039;s root directory again&lt;br /&gt;
#type &amp;quot;./unixbatch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The first pass often fails and you need to use the Wrist Viewer program to find a good initial position for the bone alignments that failed.  This manually-found initial position information goes into files called &amp;quot;config_01L.ini&amp;quot;, for example, and should be saved into the subject&#039;s root data directory.&lt;br /&gt;
&lt;br /&gt;
Repeat the process above and it should succeed this time.&lt;/div&gt;</summary>
		<author><name>Tom Sgouros</name></author>
	</entry>
</feed>