<div dir="ltr">Hi Panos,<div><br></div><div>I peeked at the vtkResliceImageViewer source code and I see that</div><div>its SetInputData() is not a simple setter method, it does a lot of work</div><div>internally.  This is very unusual for a VTK SetInputData() method.</div><div><br></div><div>Your hypothesis about GetScalarRange() seems to be mostly correct.</div><div>If things are done as follows, the SetInputData() method is fast:</div><div><br></div><div>reader->Update();</div><div>data->GetScalarRange();<br></div><div>viewer->SetInputData(data);</div><div><br></div><div>When GetScalarRange() is called, the result is cached so that when</div><div>it's called again from the viewer it's fast.</div><div><br></div><div>For case (3), I suspect that the viewer updates one slice of its input</div><div>(via streaming) before calling GetScalarRange().  So that's why it</div><div>would be fast in that case: the range is computed for just one slice,</div><div>instead of for the entire volume.</div><div><br></div><div> - David</div><div><br></div><div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Feb 14, 2018 at 8:24 AM, ochampao <span dir="ltr"><<a href="mailto:ochampao@hotmail.com" target="_blank">ochampao@hotmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi David and thanks for the detailed reply.<br>
<br>
Your reply makes clear the difference between "streaming" data vs. loading<br>
the whole volume in memory. However, with these in mind, I still can't<br>
explain the behaviour I observe in the minimal example that I have posted<br>
above (see [1], same code repeated below as well). Namely, if we assume that<br>
reader->Update() loads the whole volume in memory, then why calling<br>
resliceImageViewer-><wbr>SetInputData(data) takes longer to complete if Update()<br>
is called at positions (1) or (2)?<br>
<br>
When stepping through the code to see what causes this delay (when Update()<br>
is called at position (1) or (2) ) I have noticed that execution spends most<br>
of its time at the following line:<br>
<br>
  in->GetScalarRange(range);<br>
<br>
of the function vtkResliceImageViewer::<wbr>SetInputData(vtkImageData *in) (line<br>
450 in vtkResliceImageViewer.cxx).<br>
<br>
I guess, since the image is not yet loaded (when Update() is called at (3) )<br>
calculating the scalar range on an "empty" image takes no time. It is as if<br>
in case (3) we are "cheating" and skipping the GetScalarRange() calculation.<br>
Doesn't GetScalarRange() get executed at some point even for case (3), and<br>
if yes, why does it take less time?<br>
<br>
Thanks,<br>
P.<br>
<br>
=======================<br>
<br>
[1]<br>
<a href="http://vtk.1045678.n5.nabble.com/vtkResliceImageViewer-SetInputData-slow-when-executed-after-vtkDICOMImageReader-Update-td5746409.html#a5746426" rel="noreferrer" target="_blank">http://vtk.1045678.n5.nabble.<wbr>com/vtkResliceImageViewer-<wbr>SetInputData-slow-when-<wbr>executed-after-<wbr>vtkDICOMImageReader-Update-<wbr>td5746409.html#a5746426</a><br>
<div class="gmail-HOEnZb"><div class="gmail-h5"><br>
=======================<br>
<br>
#include "vtkDICOMImageReader.h"<br>
#include "vtkImageData.h"<br>
#include "vtkInteractorStyleImage.h"<br>
#include "vtkRenderer.h"<br>
#include "vtkRenderWindow.h"<br>
#include "vtkRenderWindowInteractor.h"<br>
#include "vtkResliceImageViewer.h"<br>
#include "vtkSmartPointer.h"<br>
<br>
int main(int argc, char** argv)<br>
{<br>
    vtkNew<vtkDICOMImageReader> reader;<br>
    vtkNew<vtkResliceImageViewer> resliceImageViewer;<br>
    vtkNew<<wbr>vtkRenderWindowInteractor> renderWindowInteractor;<br>
    vtkNew<<wbr>vtkInteractorStyleImage> style;<br>
    vtkNew<vtkRenderWindow> renderWindow;<br>
    vtkNew<vtkRenderer> renderer;<br>
    vtkSmartPointer<vtkImageData> data;<br>
<br>
    renderWindow->AddRenderer(<wbr>renderer);<br>
    renderer->SetBackground(0.0, 0.0, 0.0);<br>
    renderWindowInteractor-><wbr>SetInteractorStyle(style);<br>
<br>
    reader->SetDirectoryName("<wbr>path/to/dicom/series");<br>
    //reader->Update();  // --> (1) SetInputData() takes ~18 seconds<br>
    data = reader->GetOutput();<br>
    //reader->Update();  // --> (2) SetInputData() takes ~18 seconds<br>
<br>
    resliceImageViewer-><wbr>SetInputData(data);<br>
    reader->Update();  // --> (3) SetInputData() takes less than 1 seconds<br>
    resliceImageViewer-><wbr>SetRenderWindow(renderWindow);<br>
    resliceImageViewer-><wbr>SetupInteractor(<wbr>renderWindowInteractor);<br>
    resliceImageViewer-><wbr>SetResliceModeToAxisAligned();<br>
    resliceImageViewer->SetSlice(<wbr>50);<br>
    resliceImageViewer-><wbr>SetColorLevel(-27);<br>
    resliceImageViewer-><wbr>SetColorWindow(1358);<br>
<br>
    renderWindowInteractor->Start(<wbr>);<br>
<br>
    return 0;<br>
}<br>
<br>
=======================<br>
<br></div></div></blockquote></div></div></div></div>