00001 /*========================================================================= 00002 00003 Program: Medical Imaging & Interaction Toolkit 00004 Language: C++ 00005 Date: $Date$ 00006 Version: $Revision: -1 $ 00007 00008 Copyright (c) German Cancer Research Center, Division of Medical and 00009 Biological Informatics. All rights reserved. 00010 See MITKCopyright.txt or https://www.mitk.org/copyright.html for details. 00011 00012 This software is distributed WITHOUT ANY WARRANTY; without even 00013 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 00014 PURPOSE. See the above copyright notices for more information. 00015 00016 =========================================================================*/ 00017 00018 #include "QmitkAmoebaOptimizerView.h" 00019 #include "mitkImageAccessByItk.h" 00020 #include <itkAmoebaOptimizer.h> 00021 00022 QmitkAmoebaOptimizerView::QmitkAmoebaOptimizerView(QWidget* parent, Qt::WindowFlags f ) : QmitkRigidRegistrationOptimizerGUIBase (parent, f), 00023 m_NumberTransformParameters(15) 00024 { 00025 } 00026 00027 QmitkAmoebaOptimizerView::~QmitkAmoebaOptimizerView() 00028 { 00029 } 00030 00031 itk::Object::Pointer QmitkAmoebaOptimizerView::GetOptimizer() 00032 { 00033 itk::AmoebaOptimizer::Pointer OptimizerPointer = itk::AmoebaOptimizer::New(); 00034 OptimizerPointer->SetMaximize( m_Controls.m_Maximize->isChecked() ); 00035 OptimizerPointer->SetParametersConvergenceTolerance(m_Controls.m_ParametersConvergenceToleranceAmoeba->text().toFloat()); 00036 OptimizerPointer->SetFunctionConvergenceTolerance(m_Controls.m_FunctionConvergenceToleranceAmoeba->text().toFloat()); 00037 typedef itk::SingleValuedNonLinearOptimizer OptimizerType; 00038 OptimizerType::ParametersType simplexDelta( m_NumberTransformParameters ); 00039 itk::Array<double> simplexDeltaAmoeba = this->GetOptimizerParameters(); 00040 for (int i = 0; i < m_NumberTransformParameters; i++) 00041 { 00042 simplexDelta[i] = simplexDeltaAmoeba[i+1]; 00043 } 00044 OptimizerPointer->AutomaticInitialSimplexOff(); 00045 OptimizerPointer->SetInitialSimplexDelta( simplexDelta ); 00046 OptimizerPointer->SetMaximumNumberOfIterations( m_Controls.m_IterationsAmoeba->text().toInt() ); 00047 return OptimizerPointer.GetPointer(); 00048 } 00049 00050 itk::Array<double> QmitkAmoebaOptimizerView::GetOptimizerParameters() 00051 { 00052 itk::Array<double> optimizerValues; 00053 optimizerValues.SetSize(19); 00054 optimizerValues.fill(0); 00055 optimizerValues[0] = m_Controls.m_Maximize->isChecked(); 00056 optimizerValues[1] = m_Controls.m_SimplexDeltaAmoeba1->text().toDouble(); 00057 optimizerValues[2] = m_Controls.m_SimplexDeltaAmoeba2->text().toDouble(); 00058 optimizerValues[3] = m_Controls.m_SimplexDeltaAmoeba3->text().toDouble(); 00059 optimizerValues[4] = m_Controls.m_SimplexDeltaAmoeba4->text().toDouble(); 00060 optimizerValues[5] = m_Controls.m_SimplexDeltaAmoeba5->text().toDouble(); 00061 optimizerValues[6] = m_Controls.m_SimplexDeltaAmoeba6->text().toDouble(); 00062 optimizerValues[7] = m_Controls.m_SimplexDeltaAmoeba7->text().toDouble(); 00063 optimizerValues[8] = m_Controls.m_SimplexDeltaAmoeba8->text().toDouble(); 00064 optimizerValues[9] = m_Controls.m_SimplexDeltaAmoeba9->text().toDouble(); 00065 optimizerValues[10] = m_Controls.m_SimplexDeltaAmoeba10->text().toDouble(); 00066 optimizerValues[11] = m_Controls.m_SimplexDeltaAmoeba11->text().toDouble(); 00067 optimizerValues[12] = m_Controls.m_SimplexDeltaAmoeba12->text().toDouble(); 00068 optimizerValues[13] = m_Controls.m_SimplexDeltaAmoeba13->text().toDouble(); 00069 optimizerValues[14] = m_Controls.m_SimplexDeltaAmoeba14->text().toDouble(); 00070 optimizerValues[15] = m_Controls.m_SimplexDeltaAmoeba15->text().toDouble(); 00071 optimizerValues[16] = m_Controls.m_ParametersConvergenceToleranceAmoeba->text().toFloat(); 00072 optimizerValues[17] = m_Controls.m_FunctionConvergenceToleranceAmoeba->text().toFloat(); 00073 optimizerValues[18] = m_Controls.m_IterationsAmoeba->text().toInt(); 00074 return optimizerValues; 00075 } 00076 00077 void QmitkAmoebaOptimizerView::SetOptimizerParameters(itk::Array<double> optimizerValues) 00078 { 00079 m_Controls.m_Maximize->setChecked(optimizerValues[0]); 00080 m_Controls.m_SimplexDeltaAmoeba1->setText(QString::number(optimizerValues[1])); 00081 m_Controls.m_SimplexDeltaAmoeba2->setText(QString::number(optimizerValues[2])); 00082 m_Controls.m_SimplexDeltaAmoeba3->setText(QString::number(optimizerValues[3])); 00083 m_Controls.m_SimplexDeltaAmoeba4->setText(QString::number(optimizerValues[4])); 00084 m_Controls.m_SimplexDeltaAmoeba5->setText(QString::number(optimizerValues[5])); 00085 m_Controls.m_SimplexDeltaAmoeba6->setText(QString::number(optimizerValues[6])); 00086 m_Controls.m_SimplexDeltaAmoeba7->setText(QString::number(optimizerValues[7])); 00087 m_Controls.m_SimplexDeltaAmoeba8->setText(QString::number(optimizerValues[8])); 00088 m_Controls.m_SimplexDeltaAmoeba9->setText(QString::number(optimizerValues[9])); 00089 m_Controls.m_SimplexDeltaAmoeba10->setText(QString::number(optimizerValues[10])); 00090 m_Controls.m_SimplexDeltaAmoeba11->setText(QString::number(optimizerValues[11])); 00091 m_Controls.m_SimplexDeltaAmoeba12->setText(QString::number(optimizerValues[12])); 00092 m_Controls.m_SimplexDeltaAmoeba13->setText(QString::number(optimizerValues[13])); 00093 m_Controls.m_SimplexDeltaAmoeba14->setText(QString::number(optimizerValues[14])); 00094 m_Controls.m_SimplexDeltaAmoeba15->setText(QString::number(optimizerValues[15])); 00095 m_Controls.m_ParametersConvergenceToleranceAmoeba->setText(QString::number(optimizerValues[16])); 00096 m_Controls.m_FunctionConvergenceToleranceAmoeba->setText(QString::number(optimizerValues[17])); 00097 m_Controls.m_IterationsAmoeba->setText(QString::number(optimizerValues[18])); 00098 } 00099 00100 void QmitkAmoebaOptimizerView::SetNumberOfTransformParameters(int transformParameters) 00101 { 00102 m_NumberTransformParameters = transformParameters; 00103 this->ShowSimplexDelta(); 00104 } 00105 00106 QString QmitkAmoebaOptimizerView::GetName() 00107 { 00108 return "Amoeba"; 00109 } 00110 00111 void QmitkAmoebaOptimizerView::SetupUI(QWidget* parent) 00112 { 00113 m_Controls.setupUi(parent); 00114 QValidator* validatorLineEditInput = new QIntValidator(0, 20000000, this); 00115 m_Controls.m_IterationsAmoeba->setValidator(validatorLineEditInput); 00116 QValidator* validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); 00117 m_Controls.m_SimplexDeltaAmoeba1->setValidator(validatorLineEditInputFloat); 00118 m_Controls.m_SimplexDeltaAmoeba2->setValidator(validatorLineEditInputFloat); 00119 m_Controls.m_SimplexDeltaAmoeba3->setValidator(validatorLineEditInputFloat); 00120 m_Controls.m_SimplexDeltaAmoeba4->setValidator(validatorLineEditInputFloat); 00121 m_Controls.m_SimplexDeltaAmoeba5->setValidator(validatorLineEditInputFloat); 00122 m_Controls.m_SimplexDeltaAmoeba6->setValidator(validatorLineEditInputFloat); 00123 m_Controls.m_SimplexDeltaAmoeba7->setValidator(validatorLineEditInputFloat); 00124 m_Controls.m_SimplexDeltaAmoeba8->setValidator(validatorLineEditInputFloat); 00125 m_Controls.m_SimplexDeltaAmoeba9->setValidator(validatorLineEditInputFloat); 00126 m_Controls.m_SimplexDeltaAmoeba10->setValidator(validatorLineEditInputFloat); 00127 m_Controls.m_SimplexDeltaAmoeba11->setValidator(validatorLineEditInputFloat); 00128 m_Controls.m_SimplexDeltaAmoeba12->setValidator(validatorLineEditInputFloat); 00129 m_Controls.m_SimplexDeltaAmoeba13->setValidator(validatorLineEditInputFloat); 00130 m_Controls.m_SimplexDeltaAmoeba14->setValidator(validatorLineEditInputFloat); 00131 m_Controls.m_SimplexDeltaAmoeba15->setValidator(validatorLineEditInputFloat); 00132 m_Controls.m_ParametersConvergenceToleranceAmoeba->setValidator(validatorLineEditInputFloat); 00133 m_Controls.m_FunctionConvergenceToleranceAmoeba->setValidator(validatorLineEditInputFloat); 00134 simplexDeltaLineEdits.clear(); 00135 simplexDeltaLineEdits.push_back(m_Controls.m_SimplexDeltaAmoeba1); 00136 simplexDeltaLineEdits.push_back(m_Controls.m_SimplexDeltaAmoeba2); 00137 simplexDeltaLineEdits.push_back(m_Controls.m_SimplexDeltaAmoeba3); 00138 simplexDeltaLineEdits.push_back(m_Controls.m_SimplexDeltaAmoeba4); 00139 simplexDeltaLineEdits.push_back(m_Controls.m_SimplexDeltaAmoeba5); 00140 simplexDeltaLineEdits.push_back(m_Controls.m_SimplexDeltaAmoeba6); 00141 simplexDeltaLineEdits.push_back(m_Controls.m_SimplexDeltaAmoeba7); 00142 simplexDeltaLineEdits.push_back(m_Controls.m_SimplexDeltaAmoeba8); 00143 simplexDeltaLineEdits.push_back(m_Controls.m_SimplexDeltaAmoeba9); 00144 simplexDeltaLineEdits.push_back(m_Controls.m_SimplexDeltaAmoeba10); 00145 simplexDeltaLineEdits.push_back(m_Controls.m_SimplexDeltaAmoeba11); 00146 simplexDeltaLineEdits.push_back(m_Controls.m_SimplexDeltaAmoeba12); 00147 simplexDeltaLineEdits.push_back(m_Controls.m_SimplexDeltaAmoeba13); 00148 simplexDeltaLineEdits.push_back(m_Controls.m_SimplexDeltaAmoeba14); 00149 simplexDeltaLineEdits.push_back(m_Controls.m_SimplexDeltaAmoeba15); 00150 simplexDeltaLabels.clear(); 00151 simplexDeltaLabels.push_back(m_Controls.m_SimplexDeltaAmoebaLabel1); 00152 simplexDeltaLabels.push_back(m_Controls.m_SimplexDeltaAmoebaLabel2); 00153 simplexDeltaLabels.push_back(m_Controls.m_SimplexDeltaAmoebaLabel3); 00154 simplexDeltaLabels.push_back(m_Controls.m_SimplexDeltaAmoebaLabel4); 00155 simplexDeltaLabels.push_back(m_Controls.m_SimplexDeltaAmoebaLabel5); 00156 simplexDeltaLabels.push_back(m_Controls.m_SimplexDeltaAmoebaLabel6); 00157 simplexDeltaLabels.push_back(m_Controls.m_SimplexDeltaAmoebaLabel7); 00158 simplexDeltaLabels.push_back(m_Controls.m_SimplexDeltaAmoebaLabel8); 00159 simplexDeltaLabels.push_back(m_Controls.m_SimplexDeltaAmoebaLabel9); 00160 simplexDeltaLabels.push_back(m_Controls.m_SimplexDeltaAmoebaLabel10); 00161 simplexDeltaLabels.push_back(m_Controls.m_SimplexDeltaAmoebaLabel11); 00162 simplexDeltaLabels.push_back(m_Controls.m_SimplexDeltaAmoebaLabel12); 00163 simplexDeltaLabels.push_back(m_Controls.m_SimplexDeltaAmoebaLabel13); 00164 simplexDeltaLabels.push_back(m_Controls.m_SimplexDeltaAmoebaLabel14); 00165 simplexDeltaLabels.push_back(m_Controls.m_SimplexDeltaAmoebaLabel15); 00166 } 00167 00168 void QmitkAmoebaOptimizerView::ShowSimplexDelta() 00169 { 00170 std::list<QLineEdit*>::iterator it_edit = simplexDeltaLineEdits.begin(); 00171 for (it_edit = simplexDeltaLineEdits.begin(); it_edit != simplexDeltaLineEdits.end(); it_edit++) 00172 { 00173 (*it_edit)->hide(); 00174 } 00175 it_edit = simplexDeltaLineEdits.begin(); 00176 for (int i = 0; i < m_NumberTransformParameters; i++) 00177 { 00178 (*it_edit)->show(); 00179 it_edit++; 00180 } 00181 std::list<QLabel*>::iterator it_label = simplexDeltaLabels.begin(); 00182 for (it_label = simplexDeltaLabels.begin(); it_label != simplexDeltaLabels.end(); it_label++) 00183 { 00184 (*it_label)->hide(); 00185 } 00186 it_label = simplexDeltaLabels.begin(); 00187 for (int i = 0; i < m_NumberTransformParameters; i++) 00188 { 00189 (*it_label)->show(); 00190 it_label++; 00191 } 00192 this->updateGeometry(); 00193 }