Hi Thijs<br><br>For that code, the voxel set is interpreted slightly differently between TDI and directionally-encoded colour (DEC) TDI, both within the MapWriter and TrackMapper classes.<br><br>For standard greyscale TDIs, inserting a voxel into the std::set fails if that voxel has already been traversed by that streamline (no duplicate entries permitted in this container), so when this data is fed to MapWriter, only one entry exists for each voxel traversed, and the &quot;+= 1&quot; operation only occurs once per voxel.<br>
<br>For DEC processing, I had expected all std::set::insert() operations to succeed (since the local tangent should pretty much always be different, two elements should never be &#39;identical&#39;), so each voxel would have multiple entries in this set, corresponding to the tangent at each point along the streamline residing within that voxel. The MapWriterColour class is then responsible for combining these tangents, exploiting the fact that the std::set orders the elements using the &quot;&lt;&quot; operator (so all of the entries for the same voxel occur in sequence), to ensure that the contribution to a voxel in the buffer by a single streamline would always be normalised to a vector of length 1.<br>
<br>Unfortunately the code in 0.2.9 doesn&#39;t quite work as I had intended; only the tangent at the first point to enter the voxel contributes to the map at that voxel, because std::set::insert() fails when contributing to a voxel multiple times (even though the tangents are different; not quite sure why std::set is behaving like this...). Realistically the difference to the DEC TDIs will be minimal; colours might be ever-so-slightly off in regions of low density and high curvature. Standard TDIs are obviously unaffected.<br>
<br>If you want the colour TDI mapping to behave <i>exactly</i> as intended, the easiest fix is to change SetVoxelDir from a std::set to a std::multiset. Alternatively you can download the latest code version <a href="http://code.google.com/p/mrtrix/source/browse/trunk/cmd/tracks2prob.cpp">here</a>.<br clear="all">
<br>Best regards<br>Rob<br><br>--<br><br>Robert Smith<br>Melbourne Brain Centre<br>245 Burgundy Street<br>Heidelberg VIC 3084<br>Telephone: (+61 3) 9035 7128<br>Fax: (+61 3) 9035 7301<br>Email:  <a href="mailto:r.smith@brain.org.au" target="_blank">r.smith@brain.org.au</a><br>
<a href="http://www.fni.edu.au" target="_blank">www.florey.edu.au</a>        <a href="http://www.brain.org.au" target="_blank">www.brain.org.au</a><br><span style="font-size:9pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;color:red"></span><br>

<br><br><div class="gmail_quote">On Thu, Jan 19, 2012 at 4:13 AM, Thijs Dhollander <span dir="ltr">&lt;<a href="mailto:thijs.dhollander@uzleuven.be">thijs.dhollander@uzleuven.be</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
Hi all,<br>
<br>
I have been trying to find my way around the tracks2prob sourcecode (in 0.2.9) in order to find out how some things are exactly defined/calculated in practice by the current code.<br>
In this process, I&#39;ve stumbled upon something I don&#39;t fully seem to understand.  It concerns a slight difference in logic between the &quot;write&quot; methods of the MapWriter class...<br>
<br>
----------------------------------------------------------------------<br>
void write (const std::set&lt;Voxel&gt;&amp; voxels)<br>
{<br>
  for (std::set&lt;Voxel&gt;::const_iterator i = voxels.begin(); i != voxels.end(); ++i)<br>
    buffer[voxel_to_index(*i)] += 1;<br>
}<br>
----------------------------------------------------------------------<br>
<br>
...and the MapWriterColour class...<br>
<br>
----------------------------------------------------------------------<br>
void write (const std::set&lt;VoxelDir&gt;&amp; voxels)<br>
{<br>
  std::set&lt;VoxelDir&gt;::const_iterator i = voxels.begin();<br>
  while (i != voxels.end()) {<br>
    const std::set&lt;VoxelDir&gt;::const_iterator this_voxel = i;<br>
    Point this_voxel_dir(0.0, 0.0, 0.0);<br>
    do {<br>
      this_voxel_dir += i-&gt;dir;<br>
    } while ((++i) != voxels.end() &amp;&amp; *i == *this_voxel);<br>
    buffer[voxel_to_index(*this_voxel)] += this_voxel_dir.normalise();<br>
  }<br>
}<br>
----------------------------------------------------------------------<br>
<br>
In MapWriter&#39;s write method, every separate entry in the &quot;voxels&quot; set has a &quot;footprint&quot; of exactly 1 in the buffer.  So if the same entry (i.e. voxel) appears more than once in a row in the set, it will also result in the corresponding number of &quot;+= 1&quot; operations on the matching index in the buffer.<br>

<br>
In MapWriterColour&#39;s write method, however, the inner do{...}while-loop combined with the &quot;this_voxel_dir.normalise()&quot; seems to result in the fact that multiple concatenated entries of the same voxel in the set only get a total footprint of &quot;1&quot; (i.e. a normalised &quot;Point&quot;) on the matching index in the buffer.<br>

<br>
So, why this difference?  Or have I missed something (else) in the code? :-)<br>
<br>
Kind regards,<br>
Thijs<br>
_______________________________________________<br>
Mrtrix-discussion mailing list<br>
<a href="mailto:Mrtrix-discussion@www.nitrc.org">Mrtrix-discussion@www.nitrc.org</a><br>
<a href="http://www.nitrc.org/mailman/listinfo/mrtrix-discussion" target="_blank">http://www.nitrc.org/mailman/listinfo/mrtrix-discussion</a><br>
</blockquote></div><br>