diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkFiberProcessingViewControls.ui b/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkFiberProcessingViewControls.ui
index 40c46f33cc..d473bad6b1 100644
--- a/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkFiberProcessingViewControls.ui
+++ b/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkFiberProcessingViewControls.ui
@@ -1,650 +1,653 @@
QmitkFiberProcessingViewControls
0
0
665
587
Form
+
+ 0
+
- 5
+ 9
- 0
+ 3
- 5
+ 9
- 0
+ 3
-
Fiber Bundle Modification
-
0
0
200
0
16777215
60
QFrame::NoFrame
QFrame::Raised
0
-
30
30
- Draw circular ROI
+ Draw circular ROI.
:/QmitkDiffusionImaging/circle.png:/QmitkDiffusionImaging/circle.png
32
32
false
true
-
30
30
- Draw rectangular ROI
+ Draw rectangular ROI.
:/QmitkDiffusionImaging/rectangle.png:/QmitkDiffusionImaging/rectangle.png
32
32
true
true
-
30
30
- Draw polygonal ROI
+ Draw polygonal ROI.
:/QmitkDiffusionImaging/polygon.png:/QmitkDiffusionImaging/polygon.png
32
32
true
true
-
Qt::Horizontal
40
20
-
QFrame::NoFrame
QFrame::Raised
0
-
false
0
0
200
16777215
11
- Extract fibers passing through selected ROI or composite ROI
+ Extract fibers passing through selected ROI or composite ROI.
Extract
-
false
0
0
200
16777215
11
- Returns fiber bundle containing all fibers the two selected bundles dont't have in common
+ Returns fiber bundle containing all fibers the two selected bundles dont't have in common.
Substract
- -
-
+
-
+
false
0
0
- 16777215
+ 200
16777215
11
- Generate a binary image containing all selected ROIs
+ Merge selected fiber bundles.
- ROI Image
+ Join
- -
-
+
-
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+ -
+
false
0
0
200
16777215
11
- Merge selected fiber bundles
+ Extract fibers passing through selected surface mesh.
- Join
+ Extract 3D
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
-
-
+
false
0
0
- 200
+ 16777215
16777215
11
- Extract fibers passing through selected surface mesh
+ Generate a binary image containing all selected ROIs.
- Extract 3D
+ ROI Image
-
0
0
200
0
16777215
60
QFrame::NoFrame
QFrame::Raised
0
-
Qt::Horizontal
40
20
-
false
60
16777215
- Create AND composition with selected ROIs
+ Create AND composition with selected ROIs.
AND
-
false
60
16777215
- Create OR composition with selected ROIs
+ Create OR composition with selected ROIs.
OR
-
false
60
16777215
- Create NOT composition from selected ROI
+ Create NOT composition from selected ROI.
NOT
-
Fiber Bundle Processing
-
0
0
-
Tract Density Image (TDI)
-
Binary Envelope
-
Fiber Bundle Image
-
Fiber Endings Image
-
Fiber Endings Pointset
-
- Upsampling Factor
+ Upsampling factor
1
10
2
-
false
0
0
200
16777215
11
- Perform selected operation on fiber bundle
+ Perform selected operation on fiber bundle.
Generate
-
- If selected operation generates an image, the inverse image is returned
+ If selected operation generates an image, the inverse image is returned.
Invert
-
false
0
0
200
16777215
11
- Resample fibers using a Kochanek spline interpolation
+ Resample fibers using a Kochanek spline interpolation.
Smooth Fibers
-
Points per cm
1
50
10
-
Fiber Bundle Statistics
-
Courier 10 Pitch
false
true
-
Qt::Vertical
20
40
diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkGibbsTrackingView.cpp b/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkGibbsTrackingView.cpp
index 9b84a43183..269b2de3aa 100644
--- a/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkGibbsTrackingView.cpp
+++ b/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkGibbsTrackingView.cpp
@@ -1,767 +1,765 @@
/*=========================================================================
Copyright (c) German Cancer Research Center, Division of Medical and
Biological Informatics. All rights reserved.
See MITKCopyright.txt or http://www.mitk.org/copyright.html for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
// Blueberry
#include
#include
// Qmitk
#include "QmitkGibbsTrackingView.h"
#include
// Qt
#include
#include
#include
// MITK
#include
#include
#include
#include
#include
// ITK
#include
#include
#include
// MISC
#include
QmitkTrackingWorker::QmitkTrackingWorker(QmitkGibbsTrackingView* view)
: m_View(view)
{
}
void QmitkTrackingWorker::run()
{
m_View->m_GlobalTracker = QmitkGibbsTrackingView::GibbsTrackingFilterType::New();
MITK_INFO << "Resampling mask images";
// setup resampler
typedef itk::ResampleImageFilter ResamplerType;
ResamplerType::Pointer resampler = ResamplerType::New();
resampler->SetOutputSpacing( m_View->m_ItkQBallImage->GetSpacing() );
resampler->SetOutputOrigin( m_View->m_ItkQBallImage->GetOrigin() );
resampler->SetOutputDirection( m_View->m_ItkQBallImage->GetDirection() );
resampler->SetSize( m_View->m_ItkQBallImage->GetLargestPossibleRegion().GetSize() );
// resample mask image
resampler->SetInput( m_View->m_MaskImage );
resampler->SetDefaultPixelValue(0);
resampler->Update();
m_View->m_MaskImage = resampler->GetOutput();
m_View->m_GlobalTracker->SetInput0(m_View->m_ItkQBallImage.GetPointer());
m_View->m_GlobalTracker->SetMaskImage(m_View->m_MaskImage);
m_View->m_GlobalTracker->SetTempStart((float)m_View->m_Controls->m_StartTempSlider->value()/100);
m_View->m_GlobalTracker->SetTempEnd((float)m_View->m_Controls->m_EndTempSlider->value()/10000);
m_View->m_GlobalTracker->SetNumIt(m_View->m_Iterations);
m_View->m_GlobalTracker->SetParticleWeight((float)m_View->m_Controls->m_ParticleWeightSlider->value()/10000);
m_View->m_GlobalTracker->SetSubtractMean(m_View->m_Controls->m_MeanSubtractionCheckbox->isChecked());
m_View->m_GlobalTracker->SetParticleWidth((float)(m_View->m_Controls->m_ParticleWidthSlider->value())/10);
m_View->m_GlobalTracker->SetParticleLength((float)(m_View->m_Controls->m_ParticleLengthSlider->value())/10);
m_View->m_GlobalTracker->SetInexBalance((float)m_View->m_Controls->m_InExBalanceSlider->value()/10);
m_View->m_GlobalTracker->SetFiberLength(m_View->m_Controls->m_FiberLengthSlider->value());
m_View->m_GlobalTracker->SetCurvatureHardThreshold(cos((float)m_View->m_Controls->m_CurvatureThresholdSlider->value()*3.14159265/180));
m_View->m_GlobalTracker->Update();
m_View->m_TrackingThread.quit();
}
const std::string QmitkGibbsTrackingView::VIEW_ID =
"org.mitk.views.gibbstracking";
QmitkGibbsTrackingView::QmitkGibbsTrackingView()
: QmitkFunctionality()
, m_Controls( 0 )
, m_MultiWidget( NULL )
, m_ThreadIsRunning(false)
, m_GlobalTracker(NULL)
, m_QBallImage(NULL)
, m_MaskImage(NULL)
, m_QBallImageNode(NULL)
, m_ItkQBallImage(NULL)
, m_FiberBundleNode(NULL)
+ , m_MaskImageNode(NULL)
, m_TrackingWorker(this)
- , m_QBallSelected(false)
, m_Iterations(10000000)
, m_LastStep(0)
- , m_SaveCounter(0)
{
m_TrackingWorker.moveToThread(&m_TrackingThread);
connect(&m_TrackingThread, SIGNAL(started()), this, SLOT(BeforeThread()));
connect(&m_TrackingThread, SIGNAL(started()), &m_TrackingWorker, SLOT(run()));
connect(&m_TrackingThread, SIGNAL(finished()), this, SLOT(AfterThread()));
connect(&m_TrackingThread, SIGNAL(terminated()), this, SLOT(AfterThread()));
m_TrackingTimer = new QTimer(this);
}
QmitkGibbsTrackingView::~QmitkGibbsTrackingView()
{
delete m_TrackingTimer;
}
// update tracking status and generate fiber bundle
void QmitkGibbsTrackingView::TimerUpdate()
{
int currentStep = m_GlobalTracker->GetCurrentStep();
mitk::ProgressBar::GetInstance()->Progress(currentStep-m_LastStep);
UpdateTrackingStatus();
GenerateFiberBundle(false);
m_LastStep = currentStep;
}
// tell global tractography filter to stop after current step
void QmitkGibbsTrackingView::StopGibbsTracking()
{
if (m_GlobalTracker.IsNull())
return;
//mitk::ProgressBar::GetInstance()->Progress(m_GlobalTracker->GetSteps()-m_LastStep+1);
m_GlobalTracker->SetAbortTracking(true);
m_Controls->m_TrackingStop->setEnabled(false);
m_Controls->m_TrackingStop->setText("Stopping Tractography ...");
}
// update gui elements and generate fiber bundle after tracking is finished
void QmitkGibbsTrackingView::AfterThread()
{
m_ThreadIsRunning = false;
m_TrackingTimer->stop();
mitk::ProgressBar::GetInstance()->Progress(m_GlobalTracker->GetSteps()-m_LastStep+1);
UpdateGUI();
UpdateTrackingStatus();
- GenerateFiberBundle(true);
- QString paramMessage;
+
if(m_Controls->m_ParticleWeightSlider->value()==0)
{
m_Controls->m_ParticleWeightLabel->setText(QString::number(m_GlobalTracker->GetParticleWeight()));
m_Controls->m_ParticleWeightSlider->setValue(m_GlobalTracker->GetParticleWeight()*10000);
- paramMessage += "Particle weight was set to " + QString::number(m_GlobalTracker->GetParticleWeight()) + "\n";
}
if(m_Controls->m_ParticleWidthSlider->value()==0)
{
m_Controls->m_ParticleWidthLabel->setText(QString::number(m_GlobalTracker->GetParticleWidth()));
m_Controls->m_ParticleWidthSlider->setValue(m_GlobalTracker->GetParticleWidth()*10);
- paramMessage += "Particle width was set to " + QString::number(m_GlobalTracker->GetParticleWidth()) + " mm\n";
}
if(m_Controls->m_ParticleLengthSlider->value()==0)
{
m_Controls->m_ParticleLengthLabel->setText(QString::number(m_GlobalTracker->GetParticleLength()));
m_Controls->m_ParticleLengthSlider->setValue(m_GlobalTracker->GetParticleLength()*10);
- paramMessage += "Particle length was set to " + QString::number(m_GlobalTracker->GetParticleLength()) + " mm\n";
}
+ GenerateFiberBundle(true);
m_FiberBundleNode = NULL;
-
- if (paramMessage.length()>0)
- QMessageBox::information(NULL, "Automatically selected parameters", paramMessage);
}
// start tracking timer and update gui elements before tracking is started
void QmitkGibbsTrackingView::BeforeThread()
{
m_ThreadIsRunning = true;
m_TrackingTime = QTime::currentTime();
m_ElapsedTime = 0;
m_TrackingTimer->start(1000);
m_LastStep = 0;
UpdateGUI();
}
// setup gui elements and signal/slot connections
void QmitkGibbsTrackingView::CreateQtPartControl( QWidget *parent )
{
// build up qt view, unless already done
if ( !m_Controls )
{
// create GUI widgets from the Qt Designer's .ui file
m_Controls = new Ui::QmitkGibbsTrackingViewControls;
m_Controls->setupUi( parent );
AdvancedSettings();
connect( m_TrackingTimer, SIGNAL(timeout()), this, SLOT(TimerUpdate()) );
connect( m_Controls->m_TrackingStop, SIGNAL(clicked()), this, SLOT(StopGibbsTracking()) );
connect( m_Controls->m_TrackingStart, SIGNAL(clicked()), this, SLOT(StartGibbsTracking()) );
- connect( m_Controls->m_SetMaskButton, SIGNAL(clicked()), this, SLOT(SetMask()) );
connect( m_Controls->m_AdvancedSettingsCheckbox, SIGNAL(clicked()), this, SLOT(AdvancedSettings()) );
connect( m_Controls->m_SaveTrackingParameters, SIGNAL(clicked()), this, SLOT(SaveTrackingParameters()) );
connect( m_Controls->m_LoadTrackingParameters, SIGNAL(clicked()), this, SLOT(LoadTrackingParameters()) );
connect( m_Controls->m_IterationsSlider, SIGNAL(valueChanged(int)), this, SLOT(SetIterations(int)) );
connect( m_Controls->m_ParticleWidthSlider, SIGNAL(valueChanged(int)), this, SLOT(SetParticleWidth(int)) );
connect( m_Controls->m_ParticleLengthSlider, SIGNAL(valueChanged(int)), this, SLOT(SetParticleLength(int)) );
connect( m_Controls->m_InExBalanceSlider, SIGNAL(valueChanged(int)), this, SLOT(SetInExBalance(int)) );
connect( m_Controls->m_FiberLengthSlider, SIGNAL(valueChanged(int)), this, SLOT(SetFiberLength(int)) );
connect( m_Controls->m_ParticleWeightSlider, SIGNAL(valueChanged(int)), this, SLOT(SetParticleWeight(int)) );
connect( m_Controls->m_StartTempSlider, SIGNAL(valueChanged(int)), this, SLOT(SetStartTemp(int)) );
connect( m_Controls->m_EndTempSlider, SIGNAL(valueChanged(int)), this, SLOT(SetEndTemp(int)) );
connect( m_Controls->m_CurvatureThresholdSlider, SIGNAL(valueChanged(int)), this, SLOT(SetCurvatureThreshold(int)) );
connect( m_Controls->m_OutputFileButton, SIGNAL(clicked()), this, SLOT(SetOutputFile()) );
}
}
void QmitkGibbsTrackingView::SetInExBalance(int value)
{
m_Controls->m_InExBalanceLabel->setText(QString::number((float)value/10));
}
void QmitkGibbsTrackingView::SetFiberLength(int value)
{
m_Controls->m_FiberLengthLabel->setText(QString::number(value)+"mm");
}
void QmitkGibbsTrackingView::SetParticleWeight(int value)
{
if (value>0)
m_Controls->m_ParticleWeightLabel->setText(QString::number((float)value/10000));
else
m_Controls->m_ParticleWeightLabel->setText("auto");
}
void QmitkGibbsTrackingView::SetStartTemp(int value)
{
m_Controls->m_StartTempLabel->setText(QString::number((float)value/100));
}
void QmitkGibbsTrackingView::SetEndTemp(int value)
{
m_Controls->m_EndTempLabel->setText(QString::number((float)value/10000));
}
void QmitkGibbsTrackingView::SetParticleWidth(int value)
{
if (value>0)
m_Controls->m_ParticleWidthLabel->setText(QString::number((float)value/10)+" mm");
else
m_Controls->m_ParticleWidthLabel->setText("auto");
}
void QmitkGibbsTrackingView::SetParticleLength(int value)
{
if (value>0)
m_Controls->m_ParticleLengthLabel->setText(QString::number((float)value/10)+" mm");
else
m_Controls->m_ParticleLengthLabel->setText("auto");
}
void QmitkGibbsTrackingView::SetCurvatureThreshold(int value)
{
m_Controls->m_CurvatureThresholdLabel->setText(QString::number(value)+"°");
}
void QmitkGibbsTrackingView::SetIterations(int value)
{
switch(value)
{
case 0:
m_Controls->m_IterationsLabel->setText("Iterations: 1x10^4");
m_Iterations = 10000;
break;
case 1:
m_Controls->m_IterationsLabel->setText("Iterations: 5x10^4");
m_Iterations = 50000;
break;
case 2:
m_Controls->m_IterationsLabel->setText("Iterations: 1x10^5");
m_Iterations = 100000;
break;
case 3:
m_Controls->m_IterationsLabel->setText("Iterations: 5x10^5");
m_Iterations = 500000;
break;
case 4:
m_Controls->m_IterationsLabel->setText("Iterations: 1x10^6");
m_Iterations = 1000000;
break;
case 5:
m_Controls->m_IterationsLabel->setText("Iterations: 5x10^6");
m_Iterations = 5000000;
break;
case 6:
m_Controls->m_IterationsLabel->setText("Iterations: 1x10^7");
m_Iterations = 10000000;
break;
case 7:
m_Controls->m_IterationsLabel->setText("Iterations: 5x10^7");
m_Iterations = 50000000;
break;
case 8:
m_Controls->m_IterationsLabel->setText("Iterations: 1x10^8");
m_Iterations = 100000000;
break;
case 9:
m_Controls->m_IterationsLabel->setText("Iterations: 5x10^8");
m_Iterations = 500000000;
break;
case 10:
m_Controls->m_IterationsLabel->setText("Iterations: 1x10^9");
m_Iterations = 1000000000;
break;
}
}
void QmitkGibbsTrackingView::StdMultiWidgetAvailable(QmitkStdMultiWidget &stdMultiWidget)
{
m_MultiWidget = &stdMultiWidget;
}
void QmitkGibbsTrackingView::StdMultiWidgetNotAvailable()
{
m_MultiWidget = NULL;
}
// called if datamanager selection changes
void QmitkGibbsTrackingView::OnSelectionChanged( std::vector nodes )
{
- m_QBallSelected = false;
+ if (m_ThreadIsRunning)
+ return;
+
+ m_QBallImageNode = NULL;
+ m_MaskImageNode = NULL;
// iterate all selected objects
for( std::vector::iterator it = nodes.begin(); it != nodes.end(); ++it )
{
mitk::DataNode::Pointer node = *it;
if( node.IsNotNull() && dynamic_cast(node->GetData()) )
- {
- m_QBallSelected = true;
m_QBallImageNode = node;
+ else if( node.IsNotNull() && dynamic_cast(node->GetData()) )
+ {
+ bool isBinary = false;
+ node->GetPropertyValue("binary", isBinary);
+ if (isBinary)
+ m_MaskImageNode = node;
}
}
UpdateGUI();
}
// update gui elements displaying trackings status
void QmitkGibbsTrackingView::UpdateTrackingStatus()
{
if (m_GlobalTracker.IsNull())
return;
m_ElapsedTime += m_TrackingTime.elapsed()/1000;
m_TrackingTime.restart();
unsigned long hours = m_ElapsedTime/3600;
unsigned long minutes = (m_ElapsedTime%3600)/60;
unsigned long seconds = m_ElapsedTime%60;
m_Controls->m_ProposalAcceptance->setText(QString::number(m_GlobalTracker->GetProposalAcceptance()*100)+"%");
m_Controls->m_TrackingTimeLabel->setText( QString::number(hours)+QString("h ")+QString::number(minutes)+QString("m ")+QString::number(seconds)+QString("s") );
m_Controls->m_NumConnectionsLabel->setText( QString::number(m_GlobalTracker->GetNumConnections()) );
m_Controls->m_NumParticlesLabel->setText( QString::number(m_GlobalTracker->GetNumParticles()) );
m_Controls->m_CurrentStepLabel->setText( QString::number(100*(float)m_GlobalTracker->GetCurrentStep()/m_GlobalTracker->GetSteps())+"%" );
m_Controls->m_AcceptedFibersLabel->setText( QString::number(m_GlobalTracker->GetNumAcceptedFibers()) );
}
// update gui elements (enable/disable elements and set tooltips)
void QmitkGibbsTrackingView::UpdateGUI()
{
- if (!m_ThreadIsRunning && m_QBallSelected)
+ if (m_QBallImageNode.IsNotNull())
+ m_Controls->m_QballImageLabel->setText(m_QBallImageNode->GetName().c_str());
+ else
+ m_Controls->m_QballImageLabel->setText("-");
+ if (m_MaskImageNode.IsNotNull())
+ m_Controls->m_MaskImageLabel->setText(m_MaskImageNode->GetName().c_str());
+ else
+ m_Controls->m_MaskImageLabel->setText("-");
+
+ if (!m_ThreadIsRunning && m_QBallImageNode.IsNotNull())
{
m_Controls->m_TrackingStop->setEnabled(false);
m_Controls->m_TrackingStart->setEnabled(true);
m_Controls->m_LoadTrackingParameters->setEnabled(true);
- m_Controls->m_MaskFrame->setEnabled(true);
m_Controls->m_IterationsSlider->setEnabled(true);
m_Controls->m_AdvancedFrame->setEnabled(true);
m_Controls->m_TrackingStop->setText("Stop Tractography");
m_Controls->m_TrackingStart->setToolTip("Start tractography. No further change of parameters possible.");
m_Controls->m_TrackingStop->setToolTip("");
}
else if (!m_ThreadIsRunning)
{
m_Controls->m_TrackingStop->setEnabled(false);
m_Controls->m_TrackingStart->setEnabled(false);
m_Controls->m_LoadTrackingParameters->setEnabled(true);
- m_Controls->m_MaskFrame->setEnabled(true);
m_Controls->m_IterationsSlider->setEnabled(true);
m_Controls->m_AdvancedFrame->setEnabled(true);
m_Controls->m_TrackingStop->setText("Stop Tractography");
m_Controls->m_TrackingStart->setToolTip("No Q-Ball image selected.");
m_Controls->m_TrackingStop->setToolTip("");
}
else
{
m_Controls->m_TrackingStop->setEnabled(true);
m_Controls->m_TrackingStart->setEnabled(false);
m_Controls->m_LoadTrackingParameters->setEnabled(false);
- m_Controls->m_MaskFrame->setEnabled(false);
m_Controls->m_IterationsSlider->setEnabled(false);
m_Controls->m_AdvancedFrame->setEnabled(false);
m_Controls->m_AdvancedFrame->setVisible(false);
m_Controls->m_AdvancedSettingsCheckbox->setChecked(false);
m_Controls->m_TrackingStart->setToolTip("Tracking in progress.");
m_Controls->m_TrackingStop->setToolTip("Stop tracking and display results.");
}
}
// show/hide advanced settings frame
void QmitkGibbsTrackingView::AdvancedSettings()
{
m_Controls->m_AdvancedFrame->setVisible(m_Controls->m_AdvancedSettingsCheckbox->isChecked());
}
// set mask image data node
void QmitkGibbsTrackingView::SetMask()
{
std::vector nodes = GetDataManagerSelection();
if (nodes.empty())
{
m_MaskImageNode = NULL;
- m_Controls->m_MaskImageEdit->setText("N/A");
+ m_Controls->m_MaskImageLabel->setText("-");
return;
}
for( std::vector::iterator it = nodes.begin();
it != nodes.end();
++it )
{
mitk::DataNode::Pointer node = *it;
if (node.IsNotNull() && dynamic_cast(node->GetData()))
{
m_MaskImageNode = node;
- m_Controls->m_MaskImageEdit->setText(node->GetName().c_str());
+ m_Controls->m_MaskImageLabel->setText(node->GetName().c_str());
return;
}
}
}
// cast image to float
template
void QmitkGibbsTrackingView::CastToFloat(InputImageType* image, mitk::Image::Pointer outImage)
{
typedef itk::CastImageFilter ItkCastFilter;
typename ItkCastFilter::Pointer itkCaster = ItkCastFilter::New();
itkCaster->SetInput(image);
itkCaster->Update();
outImage->InitializeByItk(itkCaster->GetOutput());
outImage->SetVolume(itkCaster->GetOutput()->GetBufferPointer());
}
// check for mask and qbi and start tracking thread
void QmitkGibbsTrackingView::StartGibbsTracking()
{
if(m_ThreadIsRunning)
{
MITK_WARN("QmitkGibbsTrackingView")<<"Thread already running!";
return;
}
- if (!m_QBallSelected)
+ if (m_QBallImageNode.IsNull())
{
// Nothing selected. Inform the user and return
QMessageBox::information( NULL, "Warning", "Please load and select a qball image before starting image processing.");
return;
}
// a node itself is not very useful, we need its data item (the image)
mitk::BaseData* data = m_QBallImageNode->GetData();
if (!data)
return;
// test if this data item is an image or not (could also be a surface or something totally different)
m_QBallImage = dynamic_cast( data );
if (m_QBallImage.IsNull())
return;
// cast qbi to itk
m_ItkQBallImage = ItkQBallImgType::New();
mitk::CastToItkImage(m_QBallImage, m_ItkQBallImage);
// mask image found?
// catch exceptions thrown by the itkAccess macros
try{
- if(m_Controls->m_MaskImageEdit->text().compare("N/A") != 0)
+ if(m_MaskImageNode.IsNotNull())
{
m_MaskImage = 0;
if (dynamic_cast(m_MaskImageNode->GetData()))
mitk::CastToItkImage(dynamic_cast(m_MaskImageNode->GetData()),
m_MaskImage);
}
}
catch(...)
{
QMessageBox::warning(NULL, "Warning", "Incompatible mask image chosen. Processing without masking.");
//reset mask image
m_MaskImage = NULL;
}
// if no mask image is selected generate it
if( m_MaskImage.IsNull() )
{
m_MaskImage = MaskImgType::New();
m_MaskImage->SetSpacing( m_ItkQBallImage->GetSpacing() ); // Set the image spacing
m_MaskImage->SetOrigin( m_ItkQBallImage->GetOrigin() ); // Set the image origin
m_MaskImage->SetDirection( m_ItkQBallImage->GetDirection() ); // Set the image direction
m_MaskImage->SetLargestPossibleRegion( m_ItkQBallImage->GetLargestPossibleRegion());
m_MaskImage->SetBufferedRegion( m_ItkQBallImage->GetLargestPossibleRegion() );
m_MaskImage->Allocate();
itk::ImageRegionIterator it (m_MaskImage, m_MaskImage->GetLargestPossibleRegion() );
for (it = it.Begin(); !it.IsAtEnd(); ++it)
{
it.Set(1);
}
}
unsigned int steps = m_Iterations/10000;
if (steps<10)
steps = 10;
m_LastStep = 1;
mitk::ProgressBar::GetInstance()->AddStepsToDo(steps);
- m_SaveCounter = 0;
-
// start worker thread
m_TrackingThread.start(QThread::LowestPriority);
}
// generate mitkFiberBundle from tracking filter output
void QmitkGibbsTrackingView::GenerateFiberBundle(bool smoothFibers)
{
if (m_GlobalTracker.IsNull() || (!(m_Controls->m_VisualizationCheckbox->isChecked() || m_Controls->m_VisualizeOnceButton->isChecked()) && m_ThreadIsRunning))
return;
if (m_Controls->m_VisualizeOnceButton->isChecked())
m_Controls->m_VisualizeOnceButton->setChecked(false);
vtkSmartPointer fiberBundle = m_GlobalTracker->GetFiberBundle();
if ( fiberBundle->GetNumberOfLines()==0 )
return;
m_FiberBundle = mitk::FiberBundleX::New(fiberBundle);
if (smoothFibers)
m_FiberBundle->DoFiberSmoothing(10);
if (m_FiberBundleNode.IsNotNull()){
GetDefaultDataStorage()->Remove(m_FiberBundleNode);
m_FiberBundleNode = 0;
}
m_FiberBundleNode = mitk::DataNode::New();
m_FiberBundleNode->SetData(m_FiberBundle);
QString name(m_QBallImageNode->GetName().c_str());
name += "_FiberBundle";
m_FiberBundleNode->SetName(name.toStdString());
m_FiberBundleNode->SetVisibility(true);
if (!m_OutputFileName.isEmpty())
{
QString filename = m_OutputFileName;
- if (m_SaveCounter>0 && m_Controls->m_SaveIntermediateCheckbox->isChecked())
- {
- filename = QString(itksys::SystemTools::GetFilenamePath(filename.toStdString()).c_str())+"/"+QString(itksys::SystemTools::GetFilenameWithoutExtension(filename.toStdString()).c_str());
- filename += "_"+QString::number(m_SaveCounter)+".fib";
- }
mitk::FiberBundleXWriter::Pointer writer = mitk::FiberBundleXWriter::New();
writer->SetFileName(filename.toStdString());
writer->SetInputFiberBundleX(m_FiberBundle.GetPointer());
try
{
- MITK_INFO << "Saving " << filename.toStdString();
writer->Update();
- m_SaveCounter++;
+ QMessageBox::information(NULL, "Fiber bundle saved to", filename);
}
catch (itk::ExceptionObject &ex)
{
- MITK_ERROR << QString("%1\n%2\n%3\n%4\n%5\n%6").arg(ex.GetNameOfClass()).arg(ex.GetFile()).arg(ex.GetLine()).arg(ex.GetLocation()).arg(ex.what()).arg(ex.GetDescription()).toStdString();
+ QMessageBox::information(NULL, "Fiber bundle could not be saved", QString("%1\n%2\n%3\n%4\n%5\n%6").arg(ex.GetNameOfClass()).arg(ex.GetFile()).arg(ex.GetLine()).arg(ex.GetLocation()).arg(ex.what()).arg(ex.GetDescription()));
+
if(m_QBallImageNode.IsNull())
GetDataStorage()->Add(m_FiberBundleNode);
else
GetDataStorage()->Add(m_FiberBundleNode, m_QBallImageNode);
}
}
else {
if(m_QBallImageNode.IsNull())
GetDataStorage()->Add(m_FiberBundleNode);
else
GetDataStorage()->Add(m_FiberBundleNode, m_QBallImageNode);
}
}
void QmitkGibbsTrackingView::SetOutputFile()
{
// SELECT FOLDER DIALOG
m_OutputFileName = QFileDialog::getSaveFileName(0,
tr("Set file name"),
QDir::currentPath()+"/FiberBundle.fib",
tr("Fiber Bundle (*.fib)") );
if (m_OutputFileName.isEmpty())
m_Controls->m_OutputFileLabel->setText("N/A");
else
m_Controls->m_OutputFileLabel->setText(m_OutputFileName);
- m_SaveCounter = 0;
}
// save current tracking paramters as xml file (.gtp)
void QmitkGibbsTrackingView::SaveTrackingParameters()
{
TiXmlDocument documentXML;
TiXmlDeclaration* declXML = new TiXmlDeclaration( "1.0", "", "" );
documentXML.LinkEndChild( declXML );
TiXmlElement* mainXML = new TiXmlElement("global_tracking_parameter_file");
mainXML->SetAttribute("file_version", "0.1");
documentXML.LinkEndChild(mainXML);
TiXmlElement* paramXML = new TiXmlElement("parameter_set");
paramXML->SetAttribute("iterations", QString::number(m_Iterations).toStdString());
paramXML->SetAttribute("particle_length", QString::number((float)m_Controls->m_ParticleLengthSlider->value()/10).toStdString());
paramXML->SetAttribute("particle_width", QString::number((float)m_Controls->m_ParticleWidthSlider->value()/10).toStdString());
paramXML->SetAttribute("particle_weight", QString::number((float)m_Controls->m_ParticleWeightSlider->value()/10000).toStdString());
paramXML->SetAttribute("temp_start", QString::number((float)m_Controls->m_StartTempSlider->value()/100).toStdString());
paramXML->SetAttribute("temp_end", QString::number((float)m_Controls->m_EndTempSlider->value()/10000).toStdString());
paramXML->SetAttribute("inexbalance", QString::number((float)m_Controls->m_InExBalanceSlider->value()/10).toStdString());
paramXML->SetAttribute("fiber_length", QString::number(m_Controls->m_FiberLengthSlider->value()).toStdString());
paramXML->SetAttribute("curvature_threshold", QString::number(m_Controls->m_CurvatureThresholdSlider->value()).toStdString());
mainXML->LinkEndChild(paramXML);
QString filename = QFileDialog::getSaveFileName(
0,
tr("Save Parameters"),
QDir::currentPath()+"/param.gtp",
tr("Global Tracking Parameters (*.gtp)") );
if(filename.isEmpty() || filename.isNull())
return;
if(!filename.endsWith(".gtp"))
filename += ".gtp";
documentXML.SaveFile( filename.toStdString() );
}
void QmitkGibbsTrackingView::UpdateIteraionsGUI(unsigned long iterations)
{
switch(iterations)
{
case 10000:
m_Controls->m_IterationsSlider->setValue(0);
m_Controls->m_IterationsLabel->setText("Iterations: 10^4");
break;
case 50000:
m_Controls->m_IterationsSlider->setValue(1);
m_Controls->m_IterationsLabel->setText("Iterations: 5x10^4");
break;
case 100000:
m_Controls->m_IterationsSlider->setValue(2);
m_Controls->m_IterationsLabel->setText("Iterations: 10^5");
break;
case 500000:
m_Controls->m_IterationsSlider->setValue(3);
m_Controls->m_IterationsLabel->setText("Iterations: 5x10^5");
break;
case 1000000:
m_Controls->m_IterationsSlider->setValue(4);
m_Controls->m_IterationsLabel->setText("Iterations: 10^6");
break;
case 5000000:
m_Controls->m_IterationsSlider->setValue(5);
m_Controls->m_IterationsLabel->setText("Iterations: 5x10^6");
break;
case 10000000:
m_Controls->m_IterationsSlider->setValue(6);
m_Controls->m_IterationsLabel->setText("Iterations: 10^7");
break;
case 50000000:
m_Controls->m_IterationsSlider->setValue(7);
m_Controls->m_IterationsLabel->setText("Iterations: 5x10^7");
break;
case 100000000:
m_Controls->m_IterationsSlider->setValue(8);
m_Controls->m_IterationsLabel->setText("Iterations: 10^8");
break;
case 500000000:
m_Controls->m_IterationsSlider->setValue(9);
m_Controls->m_IterationsLabel->setText("Iterations: 5x10^8");
break;
case 1000000000:
m_Controls->m_IterationsSlider->setValue(10);
m_Controls->m_IterationsLabel->setText("Iterations: 10^9");
break;
case 5000000000:
m_Controls->m_IterationsSlider->setValue(11);
m_Controls->m_IterationsLabel->setText("Iterations: 5x10^9");
break;
}
}
// load current tracking paramters from xml file (.gtp)
void QmitkGibbsTrackingView::LoadTrackingParameters()
{
QString filename = QFileDialog::getOpenFileName(0, tr("Load Parameters"), QDir::currentPath(), tr("Global Tracking Parameters (*.gtp)") );
if(filename.isEmpty() || filename.isNull())
return;
TiXmlDocument doc( filename.toStdString() );
doc.LoadFile();
TiXmlHandle hDoc(&doc);
TiXmlElement* pElem;
TiXmlHandle hRoot(0);
pElem = hDoc.FirstChildElement().Element();
hRoot = TiXmlHandle(pElem);
pElem = hRoot.FirstChildElement("parameter_set").Element();
QString iterations(pElem->Attribute("iterations"));
m_Iterations = iterations.toULong();
UpdateIteraionsGUI(m_Iterations);
QString particleLength(pElem->Attribute("particle_length"));
float pLength = particleLength.toFloat();
QString particleWidth(pElem->Attribute("particle_width"));
float pWidth = particleWidth.toFloat();
if (pLength==0)
m_Controls->m_ParticleLengthLabel->setText("auto");
else
m_Controls->m_ParticleLengthLabel->setText(particleLength+" mm");
if (pWidth==0)
m_Controls->m_ParticleWidthLabel->setText("auto");
else
m_Controls->m_ParticleWidthLabel->setText(particleWidth+" mm");
m_Controls->m_ParticleWidthSlider->setValue(pWidth*10);
m_Controls->m_ParticleLengthSlider->setValue(pLength*10);
QString partWeight(pElem->Attribute("particle_weight"));
m_Controls->m_ParticleWeightSlider->setValue(partWeight.toFloat()*10000);
m_Controls->m_ParticleWeightLabel->setText(partWeight);
QString startTemp(pElem->Attribute("temp_start"));
m_Controls->m_StartTempSlider->setValue(startTemp.toFloat()*100);
m_Controls->m_StartTempLabel->setText(startTemp);
QString endTemp(pElem->Attribute("temp_end"));
m_Controls->m_EndTempSlider->setValue(endTemp.toFloat()*10000);
m_Controls->m_EndTempLabel->setText(endTemp);
QString inExBalance(pElem->Attribute("inexbalance"));
m_Controls->m_InExBalanceSlider->setValue(inExBalance.toFloat()*10);
m_Controls->m_InExBalanceLabel->setText(inExBalance);
QString fiberLength(pElem->Attribute("fiber_length"));
m_Controls->m_FiberLengthSlider->setValue(fiberLength.toInt());
m_Controls->m_FiberLengthLabel->setText(fiberLength+"mm");
QString curvThres(pElem->Attribute("curvature_threshold"));
m_Controls->m_CurvatureThresholdSlider->setValue(curvThres.toInt());
m_Controls->m_CurvatureThresholdLabel->setText(curvThres+"°");
}
diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkGibbsTrackingView.h b/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkGibbsTrackingView.h
index 6d85a900da..0285ee11ec 100644
--- a/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkGibbsTrackingView.h
+++ b/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkGibbsTrackingView.h
@@ -1,168 +1,165 @@
/*=========================================================================
Program: Medical Imaging & Interaction Toolkit
Language: C++
Date: $Date: 2010-03-31 16:40:27 +0200 (Mi, 31 Mrz 2010) $
Version: $Revision: 21975 $
Copyright (c) German Cancer Research Center, Division of Medical and
Biological Informatics. All rights reserved.
See MITKCopyright.txt or http://www.mitk.org/copyright.html for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
#ifndef QmitkGibbsTrackingView_h
#define QmitkGibbsTrackingView_h
#include
#include
#include "ui_QmitkGibbsTrackingViewControls.h"
#include
#include
#include
#include
#include
#include
#include
class QmitkGibbsTrackingView;
class QmitkTrackingWorker : public QObject
{
Q_OBJECT
public:
QmitkTrackingWorker(QmitkGibbsTrackingView* view);
public slots:
void run();
private:
QmitkGibbsTrackingView* m_View;
};
/*!
\brief QmitkGibbsTrackingView
\warning This application module is not yet documented. Use "svn blame/praise/annotate" and ask the author to provide basic documentation.
\sa QmitkFunctionality
\ingroup Functionalities
*/
typedef itk::Image< float, 3 > FloatImageType;
namespace itk
{
template
class GibbsTrackingFilter;
}
class QmitkGibbsTrackingView : public QmitkFunctionality
{
// this is needed for all Qt objects that should have a Qt meta-object
// (everything that derives from QObject and wants to have signal/slots)
Q_OBJECT
public:
typedef itk::Image MaskImgType;
typedef itk::Vector OdfVectorType;
typedef itk::Image ItkQBallImgType;
typedef itk::GibbsTrackingFilter GibbsTrackingFilterType;
static const std::string VIEW_ID;
QmitkGibbsTrackingView();
virtual ~QmitkGibbsTrackingView();
virtual void CreateQtPartControl(QWidget *parent);
virtual void StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget);
virtual void StdMultiWidgetNotAvailable();
signals:
protected slots:
void StartGibbsTracking();
void StopGibbsTracking();
void AfterThread();
void BeforeThread();
void TimerUpdate();
void SetMask();
void AdvancedSettings();
void SaveTrackingParameters();
void LoadTrackingParameters();
void SetIterations(int value);
void SetParticleWidth(int value);
void SetParticleLength(int value);
void SetInExBalance(int value);
void SetFiberLength(int value);
void SetParticleWeight(int value);
void SetStartTemp(int value);
void SetEndTemp(int value);
void SetCurvatureThreshold(int value);
void SetOutputFile();
private:
// Visualization & GUI
void GenerateFiberBundle(bool smoothFibers);
void UpdateGUI();
void UpdateTrackingStatus();
/// \brief called by QmitkFunctionality when DataManager's selection has changed
virtual void OnSelectionChanged( std::vector nodes );
template
void CastToFloat(InputImageType* image, typename mitk::Image::Pointer outImage);
void UpdateIteraionsGUI(unsigned long iterations);
Ui::QmitkGibbsTrackingViewControls* m_Controls;
QmitkStdMultiWidget* m_MultiWidget;
// data objects
mitk::FiberBundleX::Pointer m_FiberBundle;
MaskImgType::Pointer m_MaskImage;
mitk::QBallImage::Pointer m_QBallImage;
ItkQBallImgType::Pointer m_ItkQBallImage;
// data nodes
mitk::DataNode::Pointer m_QBallImageNode;
mitk::DataNode::Pointer m_MaskImageNode;
mitk::DataNode::Pointer m_FiberBundleNode;
// flags etc.
bool m_ThreadIsRunning;
QTimer* m_TrackingTimer;
QTime m_TrackingTime;
unsigned long m_ElapsedTime;
- bool m_QBallSelected;
- bool m_FibSelected;
unsigned long m_Iterations;
int m_LastStep;
QString m_OutputFileName;
- int m_SaveCounter;
// global tracker and friends
itk::SmartPointer m_GlobalTracker;
QmitkTrackingWorker m_TrackingWorker;
QThread m_TrackingThread;
friend class QmitkTrackingWorker;
};
#endif // _QMITKGibbsTrackingVIEW_H_INCLUDED
diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkGibbsTrackingViewControls.ui b/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkGibbsTrackingViewControls.ui
index 8b8172f6a9..b99d3213ef 100644
--- a/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkGibbsTrackingViewControls.ui
+++ b/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkGibbsTrackingViewControls.ui
@@ -1,1111 +1,1045 @@
QmitkGibbsTrackingViewControls
0
0
463
1011
0
0
0
0
QmitkTemplate
0
- 3
+ 9
- 0
+ 3
- 3
+ 9
- 0
+ 3
-
-
+
-
+ Data
-
- false
+
+
-
+
+
+ Q-Ball Image:
+
+
+
+ -
+
+
+ Mandatory input
+
+
+ -
+
+
+
+ -
+
+
+ Mask Image:
+
+
+
+ -
+
+
+ Optional input to limit the algorithms search space.
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+ Parameters
-
-
- 0
-
-
+
+
0
-
-
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+ Iterations: 10^7
+
+
+
+ -
+
+
+ Specify number of iterations for the tracking algorithm.
+
+
+ 10
+
+
+ 6
+
+
+ Qt::Horizontal
+
+
+ QSlider::TicksBelow
+
+
+
+ -
+
true
-
- false
+
+ Activate continuous visualization of intermediate results.
+
+
+ Visualize Tractography
+
+
+ true
+
+
+
+ -
+
+
+ Visualize intermediate result.
+
+
+
+
+
+
+ :/QmitkDiffusionImaging/Refresh_48.png:/QmitkDiffusionImaging/Refresh_48.png
+
+
+ true
+
+
+
+ -
+
+
+ Advanced Settings
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+ Output File:
+
+
+
+ -
+
QFrame::NoFrame
- QFrame::Raised
+ QFrame::Plain
-
-
- QFormLayout::AllNonFixedFieldsGrow
-
-
+
+ 0
+
+
+
0
-
- 4
-
-
+
0
-
-
-
-
- Mask Image
-
-
-
-
-
-
- Binary mask image to reduce the algorithms search space.
-
-
- QFrame::StyledPanel
-
-
- QFrame::Raised
-
-
-
- 0
-
-
-
-
-
- true
-
-
- =>
-
-
-
- -
-
-
- true
-
-
- N/A
-
-
- true
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
- Iterations: 10^7
-
-
-
- -
-
-
- Specify number of iterations for the tracking algorithm.
-
-
- 10
-
-
- 6
-
-
- Qt::Horizontal
-
-
- QSlider::TicksBelow
-
-
-
- -
-
-
- true
-
-
- Activate continuous visualization of intermediate results.
-
-
- Visualize Tractography
-
-
- true
-
-
-
- -
-
-
- Advanced Settings
-
-
-
- -
-
-
- true
-
-
- QFrame::StyledPanel
-
-
- QFrame::Raised
-
-
-
- 0
-
-
- 4
-
-
- 0
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- auto
-
-
- Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
-
-
-
- -
-
-
- auto = 1.5 * min. spacing; l
-
-
- 100
-
-
- 1
-
-
- Qt::Horizontal
-
-
- QSlider::NoTicks
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
- auto
-
-
- Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
-
-
-
- -
-
-
- auto = 0.5 * min. spacing; sigma
-
-
- 100
-
-
- 1
-
-
- Qt::Horizontal
-
-
- QSlider::NoTicks
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
- auto
-
-
- Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
-
-
-
- -
-
-
- automatic estimation from gfa map and q-ball data.
-
-
- 0
-
-
- 1000
-
-
- 1
-
-
- 0
-
-
- Qt::Horizontal
-
-
- true
-
-
- QSlider::NoTicks
-
-
-
- -
-
-
- 0.1
-
-
- Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
-
-
-
- -
-
-
- 1
-
-
- 100
-
-
- 1
-
-
- 10
-
-
- Qt::Horizontal
-
-
- false
-
-
- false
-
-
- QSlider::NoTicks
-
-
-
- -
-
-
- 0.001
-
-
- Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
-
-
-
- -
-
-
- 1
-
-
- 99
-
-
- 1
-
-
- 10
-
-
- Qt::Horizontal
-
-
- QSlider::NoTicks
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
- 0
-
-
- Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
-
-
-
- -
-
-
- IE Bias < 0 < EE Bias
-
-
- -50
-
-
- 50
-
-
- 1
-
-
- Qt::Horizontal
-
-
- QSlider::NoTicks
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
- 40mm
-
-
- Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
-
-
-
- -
-
-
- Only fibers longer than specified are accepted.
-
-
- 100
-
-
- 1
-
-
- 40
-
-
- Qt::Horizontal
-
-
- QSlider::NoTicks
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
- Particle Length:
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
- Particle Width:
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
- Particle Weight:
-
-
-
- -
-
-
- Start Temperature:
-
-
-
- -
-
-
- End Temperature:
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
- Balance In/Ex Energy:
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
- Min. Fiber Length:
-
-
-
- -
-
-
- true
-
-
- Use mean subtracted ODFs (recommended).
-
-
- Subtract ODF Mean
-
-
- true
-
-
-
- -
-
-
- Qt::Horizontal
-
-
- QSizePolicy::Fixed
-
-
-
- 60
- 20
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
- Curvature Threshold:
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
- 45°
-
-
- Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
-
-
-
- -
-
-
- Allow only fiber curvature values smaller than the selected threshold.
-
-
- 180
-
-
- 1
-
-
- 45
-
-
- Qt::Horizontal
-
-
- QSlider::NoTicks
-
-
-
-
-
-
- -
-
-
- true
-
-
- Save current parameters as xml (.gtp)
-
-
- Qt::LeftToRight
-
-
- Save Parameters
-
-
-
- :/qmitk/btnMoveDown.png:/qmitk/btnMoveDown.png
-
-
-
- -
-
-
- true
-
-
- Load parameters from xml file (.gtp)
-
-
- Qt::LeftToRight
-
-
- Load Parameters
-
-
-
- :/qmitk/btnMoveUp.png:/qmitk/btnMoveUp.png
-
-
-
- -
-
-
- false
-
-
- No Q-Ball image selected.
-
-
- Qt::LeftToRight
-
-
- Start Tractography
-
-
-
- :/qmitk/play.xpm:/qmitk/play.xpm
-
-
-
- -
-
-
- false
-
+
-
-
-
- Qt::LeftToRight
+ Select output file name and folder.
- Stop Tractography
-
-
-
- :/qmitk/stop.xpm:/qmitk/stop.xpm
+ ...
- -
-
-
- Visualize intermediate result.
-
+
-
+
-
-
-
-
- :/QmitkDiffusionImaging/Refresh_48.png:/QmitkDiffusionImaging/Refresh_48.png
+ N/A
-
+
true
- -
-
-
-
- 0
- 0
-
-
-
-
- 0
- 0
-
+
+
+
+ -
+
+
+ true
+
+
+ QFrame::StyledPanel
+
+
+ QFrame::Raised
+
+
+
+ 9
+
+
+ 0
+
+
+ 9
+
+
+ 0
+
+
+ 4
+
+
-
+
+
+
-
- QFrame::StyledPanel
+
+
-
- QFrame::Raised
+
+
+
+
+ auto
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
-
-
- 0
-
-
- 7
-
-
- 0
-
-
-
-
-
- Will only be updated if tracking is visualized
-
-
- Will only be updated if tracking is visualized
-
-
-
-
-
- Accepted Fibers:
-
-
-
- -
-
-
- Will only be updated if tracking is visualized
-
-
-
-
-
-
-
-
- -
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
- Progress:
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
- Connections:
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
- Particles:
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
- Tracking Time:
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
- Proposal Acceptance Rate:
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
- -
-
-
- QFrame::NoFrame
+
-
+
+
+
-
- QFrame::Plain
+
+
+
+
+
+
+
+ auto
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ -
+
+
+ auto = 0.5 * min. spacing; sigma
+
+
+ 100
+
+
+ 1
+
+
+ Qt::Horizontal
+
+
+ QSlider::NoTicks
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+ auto
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ -
+
+
+ automatic estimation from gfa map and q-ball data.
+
+
+ 0
+
+
+ 1000
+
+
+ 1
+
+
+ 0
+
+
+ Qt::Horizontal
+
+
+ true
+
+
+ QSlider::NoTicks
+
+
+
+ -
+
+
+ 0.1
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ -
+
+
+ 1
+
+
+ 100
+
+
+ 1
+
+
+ 10
+
+
+ Qt::Horizontal
+
+
+ false
+
+
+ false
+
+
+ QSlider::NoTicks
+
+
+
+ -
+
+
+ 0.001
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ -
+
+
+ 1
+
+
+ 99
+
+
+ 1
+
+
+ 10
+
+
+ Qt::Horizontal
+
+
+ QSlider::NoTicks
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ -
+
+
+ IE Bias < 0 < EE Bias
+
+
+ -50
+
+
+ 50
+
+
+ 1
+
+
+ Qt::Horizontal
+
+
+ QSlider::NoTicks
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+ 40mm
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ -
+
+
+ Only fibers longer than specified are accepted.
+
+
+ 100
+
+
+ 1
+
+
+ 40
+
+
+ Qt::Horizontal
+
+
+ QSlider::NoTicks
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+ Particle Length:
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+ Particle Width:
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+ Particle Weight:
+
+
+
+ -
+
+
+ Start Temperature:
+
+
+
+ -
+
+
+ End Temperature:
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+ Balance In/Ex Energy:
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+ Min. Fiber Length:
+
+
+
+ -
+
+
+ true
+
+
+ Use mean subtracted ODFs (recommended).
+
+
+ Subtract ODF Mean
+
+
+ true
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+ QSizePolicy::Fixed
+
+
+
+ 60
+ 20
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+ Curvature Threshold:
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+ 45°
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ -
+
+
+ Allow only fiber curvature values smaller than the selected threshold.
+
+
+ 180
+
+
+ 1
+
+
+ 45
+
+
+ Qt::Horizontal
+
+
+ QSlider::NoTicks
+
+
+
+ -
+
+
+ auto = 1.5 * min. spacing; l
+
+
+ 100
+
+
+ 1
+
+
+ Qt::Horizontal
+
+
+ QSlider::NoTicks
+
+
+
+
+
+
+ -
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Plain
+
+
+ 0
+
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+ true
+
+
+ Save current parameters as xml (.gtp)
+
+
+ Qt::LeftToRight
+
+
+ Save Parameters
+
+
+
+ :/qmitk/btnMoveDown.png:/qmitk/btnMoveDown.png
+
+
+
+ -
+
+
+ true
+
+
+ Load parameters from xml file (.gtp)
+
+
+ Qt::LeftToRight
+
+
+ Load Parameters
+
+
+
+ :/qmitk/btnMoveUp.png:/qmitk/btnMoveUp.png
+
+
+
+ -
+
+
+ false
+
+
+ No Q-Ball image selected.
+
+
+ Qt::LeftToRight
+
+
+ Start Tractography
+
+
+
+ :/qmitk/play.xpm:/qmitk/play.xpm
+
+
+
+ -
+
+
+ false
+
+
+
+
+
+ Qt::LeftToRight
+
+
+ Stop Tractography
+
+
+
+ :/qmitk/stop.xpm:/qmitk/stop.xpm
+
+
+
+
+
+
+ -
+
+
+ Monitor
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+ Progress:
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+ -
+
+
+ Will only be updated if tracking is visualized
+
+
+ Will only be updated if tracking is visualized
+
+
+
+
+
+ Accepted Fibers:
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+ Connections:
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+ Particles:
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+ Proposal Acceptance Rate:
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+ Tracking Time:
+
+
+
+ -
+
+
+ Will only be updated if tracking is visualized
+
+
+
+
+
+
+
+
+ -
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+ -
-
-
- 0
-
-
- 10
-
-
- 0
-
-
- 0
-
-
- 0
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Output File:
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
- N/A
-
-
-
- -
-
-
- Select output file name and folder.
-
-
- ...
-
-
-
- -
-
-
- true
-
-
- Results are enumerated and saved separately.
-
-
- save intermediate results
-
-
- false
-
-
-
-
-
Qt::Vertical
QSizePolicy::Expanding
0
0
+
-
diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkStochasticFiberTrackingViewControls.ui b/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkStochasticFiberTrackingViewControls.ui
index 7d32869673..b613f909e5 100644
--- a/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkStochasticFiberTrackingViewControls.ui
+++ b/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkStochasticFiberTrackingViewControls.ui
@@ -1,200 +1,212 @@
QmitkStochasticFiberTrackingViewControls
0
0
480
553
0
0
QmitkTemplate
+
+ 3
+
+
+ 3
+
+
+ 0
+
-
Data
-
Diffusion Image:
-
-
-
ROI Image:
-
-
-
Parameters
-
- Maximum tract length in voxel
+ Maximum tract length in #voxel.
1
500
100
Qt::Horizontal
-
- Length of single tracts
+ Maximum tract length in #voxel.
Max. Tract Length: 100
-
- Number of tracts for each seedpoint
+ Number of tracts started in each voxel of the seed ROI.
Seeds per Voxel: 1
-
- Likelihood cache in Megabytes
+ Likelihood cache in Megabytes.
Max. Chache Size: 1GB
-
- Number of tracts started in each voxel of the seed ROI
+ Number of tracts started in each voxel of the seed ROI.
1
10
Qt::Horizontal
-
+
+ Likelihood cache in Megabytes.
+
1
10
1
Qt::Horizontal
-
Qt::Horizontal
QSizePolicy::Fixed
200
0
-
false
Start Tracking
-
Qt::Vertical
QSizePolicy::Expanding
20
220
commandLinkButton