Well, I'm building a vtkDoubleArray, and the vtkArrayCalculator claims
it's returning a vtkDoubleArray.. So that shouldn't be the case in this
situation.<br><br><div><span class="gmail_quote">On 9/14/05, <b class="gmail_sendername">Berk Geveci</b> &lt;<a href="mailto:berk.geveci@gmail.com">berk.geveci@gmail.com</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
This is a guess but if the array calculator outputs a data type than<br>the input's scalars, no imaging filter can be used down the pipeline.<br>This is a known bug. Essentially no (non-imaging) filter that changes<br>the data type of the scalars is allowed in a pipeline with imaging
<br>filters. There is work (slow) going on to fix this issue. I would not<br>hold my breath for it's completion.<br><br>On 9/14/05, Randall Hand &lt;<a href="mailto:randall.hand@gmail.com">randall.hand@gmail.com</a>&gt; wrote:
<br>&gt; Ok, I posted this once before, but here it is again with some more<br>&gt; information.<br>&gt;<br>&gt;&nbsp;&nbsp;I've written a piece of code to create a synthetic dataset.&nbsp;&nbsp;It's a 128^3<br>&gt; dataset, each point with a 3-component double value consisting of (sin(x),
<br>&gt; junk, morejunk).&nbsp;&nbsp;I extract just the first component, and do an FFT.&nbsp;&nbsp;You'll<br>&gt; find the code at the end of this message, along with my &quot;PrintStatistics&quot;<br>&gt; function attached.<br>&gt;<br>&gt;&nbsp;&nbsp;You'll see from the #if/#endif blocks that there's two possible ways to do
<br>&gt; it.&nbsp;&nbsp;The first is with a vtkArrayCalculator, where I set a very trivial<br>&gt; function to simply copy out the one value.&nbsp;&nbsp;The other way is with a<br>&gt; vtkImageExtractComponents.&nbsp;&nbsp;When doing it with the vtkArrayCalculator, the
<br>&gt; filter seems to work just fine but then the FFT yields values like :<br>&gt;<br>&gt; p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Array [0]: vtkDoubleArray &quot;result&quot;, 2,097,152 points, 8 bytes per<br>&gt; point<br>&gt;&nbsp;&nbsp;p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Magnitude
Range:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.0000&nbsp;&nbsp;1482912.5793<br>&gt;&nbsp;&nbsp;p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Component 0 Range:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1048575.9848<br>&gt; 1048575.8760<br>&gt;&nbsp;&nbsp;p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Component 1 Range:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1048572.9243<br>&gt; 1048579.0968<br>&gt;&nbsp;&nbsp;With a simple sin wave, the result should be almost purely imaginary, so<br>&gt; the Component 0 range should be almost 0 to 0.<br>&gt;<br>&gt;&nbsp;&nbsp;When I switch to using the vtkImageExtractComponents, the results look
<br>&gt; better:<br>&gt;<br>&gt;<br>&gt; p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Array [0]: vtkDoubleArray &quot;image&quot;, 2,097,152 points, 8 bytes per<br>&gt; point<br>&gt;&nbsp;&nbsp;p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Magnitude
Range:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.0000&nbsp;&nbsp;1048576.0091<br>&gt;&nbsp;&nbsp;p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Component 0 Range:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-0.0557 0.0011<br>&gt;&nbsp;&nbsp;p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Component 1 Range:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1048576.0089<br>&gt; 1048576.0091<br>&gt;<br>&gt;<br>&gt;&nbsp;&nbsp;Unfortunately, when working with the vtkImageExtractComponents filter, I<br>&gt; lose the other two fields if I had planned on using them for coloring or
<br>&gt; something.&nbsp;&nbsp;Also, my results aren't quite what I expected.&nbsp;&nbsp;Much better, but<br>&gt; on more complex datasets I seem to get results that are a little off from<br>&gt; the expected result.&nbsp;&nbsp;I don't know if the cause of all this is related, but
<br>&gt; I'm chasing down what I can.<br>&gt;<br>&gt;&nbsp;&nbsp;So, any ideas?<br>&gt;<br>&gt;&nbsp;&nbsp;----- Code starts here -------<br>&gt;<br>&gt; #include &lt;stdio.h&gt;<br>&gt;&nbsp;&nbsp;#include &lt;string.h&gt;<br>&gt;&nbsp;&nbsp;#include &lt;stdlib.h
&gt;<br>&gt;&nbsp;&nbsp;#include &lt;unistd.h&gt;<br>&gt;&nbsp;&nbsp;#include &quot;stat.h&quot;<br>&gt;&nbsp;&nbsp;#include &lt;sys/types.h&gt;<br>&gt;&nbsp;&nbsp;#include &lt;sys/stat.h&gt;<br>&gt;&nbsp;&nbsp;#include &lt;sys/mman.h&gt;<br>&gt;&nbsp;&nbsp;#include &lt;fcntl.h&gt;
<br>&gt;&nbsp;&nbsp;#include &lt;vtkObject.h&gt;<br>&gt;&nbsp;&nbsp;#include &quot;vtkImageData.h&quot;<br>&gt;&nbsp;&nbsp;#include &quot;vtkPointData.h&quot;<br>&gt;&nbsp;&nbsp;#include &lt;vtkDataArray.h&gt;<br>&gt;&nbsp;&nbsp;#include &lt;vtkUnsignedCharArray.h&gt;<br>
&gt;&nbsp;&nbsp;#include &lt;vtkDoubleArray.h&gt;<br>&gt;&nbsp;&nbsp;#include &lt;vtkImageData.h&gt;<br>&gt;&nbsp;&nbsp;#include &lt;vtkImageFFT.h&gt;<br>&gt;&nbsp;&nbsp;#include &lt;vtkArrayCalculator.h&gt;<br>&gt;&nbsp;&nbsp;#include &lt;vtkImageExtractComponents.h&gt;
<br>&gt;<br>&gt;&nbsp;&nbsp;int main (int argc, char *argv[])<br>&gt;&nbsp;&nbsp;{<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double *data;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int xdim, ydim, zdim;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double kx;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int x,y,z;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long index;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xdim = 128;
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ydim = 128;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zdim = 128;<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((data =<br>&gt; (double*)malloc(sizeof(double)*xdim*ydim*zdim*3)) == NULL)<br>&gt; {<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(&quot;Unable to allocate memory!\n\t&quot;);
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Constructing sin(kx * x) dataset...\n&quot;);<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;kx = 2.0 * 3.1415926 / (double)xdim;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(x=0; x&lt;xdim; x++) {<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(y=0; y&lt;ydim; y++) {
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(z=0; z&lt;zdim; z++) {<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index
= z + (y*zdim) + (x * ydim * zdim);<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data[(index*3)+0]
= sin(kx * (double)x);<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data[(index*3)+1]
= cos(kx * (double)x);<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data[(index*3)+2]
= tan(kx * (double)x);<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vtkDoubleArray *ucPointer = vtkDoubleArray::New();<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ucPointer-&gt;SetNumberOfComponents(3);<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ucPointer-&gt;SetArray(data, xdim*ydim*zdim*3, 1);
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ucPointer-&gt;SetName(&quot;image&quot;);<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vtkImageData *image = vtkImageData::New();<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image-&gt;Initialize();<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image-&gt;SetDimensions(xdim, ydim, zdim);<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image-&gt;SetExtent(1, xdim, 1, ydim, 1, zdim);
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image-&gt;SetScalarTypeToDouble();<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image-&gt;SetNumberOfScalarComponents(3);<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image-&gt;GetPointData()-&gt;SetScalars(ucPointer);<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintStatistics(image);<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Extracting Velocity X-Component...\n&quot;);
<br>&gt;<br>&gt;&nbsp;&nbsp;#if 0<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vtkArrayCalculator *extract = vtkArrayCalculator::New();<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extract-&gt;SetInput(image);<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extract-&gt;SetResultArrayName(&quot;result&quot;);<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extract-&gt;AddScalarVariable(&quot;x&quot;, &quot;image&quot;, 0);
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extract-&gt;SetFunction(&quot;(x*1.0)+0.0&quot;);<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extract-&gt;ReplaceInvalidValuesOff();<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extract-&gt;Update();<br>&gt;<br>&gt; extract-&gt;GetOutput()-&gt;GetPointData()-&gt;RemoveArray(&quot;image&quot;);
<br>&gt;<br>&gt; extract-&gt;GetOutput()-&gt;GetPointData()-&gt;SetActiveScalars(&quot;result&quot;);<br>&gt;&nbsp;&nbsp;#else<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vtkImageExtractComponents *extract =<br>&gt; vtkImageExtractComponents::New();<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extract-&gt;SetInput(image);
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extract-&gt;SetComponents(0);<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extract-&gt;Update();<br>&gt;&nbsp;&nbsp;#endif<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintStatistics(extract-&gt;GetOutput());<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Computing FFT...\n&quot;);<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vtkImageFFT *fft = vtkImageFFT::New();
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fft-&gt;SetInput(extract-&gt;GetOutput());<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fft-&gt;Update();<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintStatistics(fft-&gt;GetOutput());<br>&gt;<br>&gt;&nbsp;&nbsp;}<br>&gt;<br>&gt;<br>&gt; --<br>&gt; Randall Hand<br>&gt; Visualization Scientist,
<br>&gt; ERDC-MSRC Vicksburg, MS<br>&gt; Homepage: <a href="http://www.yeraze.com">http://www.yeraze.com</a><br>&gt; _______________________________________________<br>&gt; vtk-developers mailing list<br>&gt; <a href="mailto:vtk-developers@vtk.org">
vtk-developers@vtk.org</a><br>&gt; <a href="http://www.vtk.org/mailman/listinfo/vtk-developers">http://www.vtk.org/mailman/listinfo/vtk-developers</a><br>&gt;<br>&gt;<br>&gt;<br>&gt;<br></blockquote></div><br><br clear="all">
<br>-- <br>Randall Hand<br>Visualization Scientist, <br>ERDC-MSRC Vicksburg, MS<br>Homepage: <a href="http://www.yeraze.com">http://www.yeraze.com</a>