]> Creatis software - clitk.git/blobdiff - vv/vvToolRigidReg.cxx
changes in license header
[clitk.git] / vv / vvToolRigidReg.cxx
index 41c226424539f769d20084eea0c0e1b73c2e7ece..e99d8674b628fe06f0e9da5ca6d325b68aa74cd6 100644 (file)
@@ -3,7 +3,7 @@
 
   Authors belong to:
   - University of LYON              http://www.universite-lyon.fr/
-  - Léon Bérard cancer center       http://oncora1.lyon.fnclcc.fr
+  - Léon Bérard cancer center       http://www.centreleonberard.fr
   - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
 
   This software is distributed WITHOUT ANY WARRANTY; without even
 
   - BSD        See included LICENSE.txt file
   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
-======================================================================-====*/
+===========================================================================**/
+
+// vv
 #include "vvToolRigidReg.h"
-#include <QComboBox>
-#include <QCursor>
-#include <QApplication>
+#include "vvImageReader.h"
+#include "vvSlicer.h"
+
+// vtk
 #include <vtkImageData.h>
 #include <vtkSmartPointer.h>
 #include <vtkTransform.h>
-#include "vvImage.h"
-#include "vvSlicer.h"
-#include <QFile>
-#include <QString>
+
+// clitk
+#include "clitkTransformUtilities.h"
+#include "clitkAffineRegistrationGenericFilter.h"      
+// qt
 #include <QMessageBox>
-#include <vvMainWindow.h>
 #include <QFileDialog>
 #include <QTextStream>
+#include <QComboBox>
+#include <QCursor>
+
+
 //------------------------------------------------------------------------------
 // Create the tool and automagically (I like this word) insert it in
 // the main window menu.
@@ -44,14 +51,28 @@ vvToolRigidReg::vvToolRigidReg(vvMainWindowBase * parent, Qt::WindowFlags f):
 {
   // GUI Initialization
   Ui_vvToolRigidReg::setupUi(mToolWidget);
-   QSize qsize;
-   qsize.setHeight(170);
-   qsize.setWidth(650);
-   textEdit->setFixedSize(qsize);
-
+   // QSize qsize;
+//    qsize.setHeight(470);
+//    qsize.setWidth(850);
+//    mToolWidget->setFixedSize(qsize);
   // Set how many inputs are needed for this tool
-  AddInputSelector("Select the Reference Image");
-  AddInputSelector("Select the Target Image");
+  cb_transform->hide();
+  cb_interpolator->hide();
+  cb_optimizer->hide();
+  cb_metric->hide();
+  cb_selectoutput->hide();
+  cb_presets->hide();
+  translabel->hide();
+  metriclabel->hide();
+  outputlabel->hide();
+  optimlabel->hide();
+  interpollabel->hide();
+  presetlabel->hide();
+  
+  
+  // Set how many inputs are needed for this tool
+  AddInputSelector("Select moving image");
+  AddInputSelector("Select fixed image");
 }
 //------------------------------------------------------------------------------
 
@@ -63,8 +84,9 @@ vvToolRigidReg::~vvToolRigidReg()
 
 //------------------------------------------------------------------------------
 bool vvToolRigidReg::close()
-{ 
-  
+{
+  ResetTransform();
+  RemoveOverlay();
   return vvToolWidgetBase::close();
 }
 //------------------------------------------------------------------------------
@@ -72,105 +94,763 @@ bool vvToolRigidReg::close()
 //------------------------------------------------------------------------------
 void vvToolRigidReg::reject()
 {
-    ResetTransform();
+
   return vvToolWidgetBase::reject();
 }
 //------------------------------------------------------------------------------
 
+//------------------------------------------------------------------------------
+void vvToolRigidReg::GetArgsInfoFromGUI()
+{   
+  QFont font=QFont("Courier",10);
+  tab2textedit->setTextColor(QColor(255,0,0));
+  tab2textedit->setCurrentFont(font);
+  tab2textedit->update();
+   
+  QString file = QFileDialog::getOpenFileName(
+                    this,
+                   "Locate the Config File",
+                    mMainWindow->GetInputPathName(),
+                    "Text (*.conf *.txt *.rtf *.doc)");
+  
+  if (file.isEmpty())
+  return;
+  
+  QFile Qfile1(file);
+  mConfigFile= file.toStdString();
+  CmdlineParser(1, 1);//1,1 - override, initialize
+  cb_transform->setCurrentIndex(mArgsInfo.transform_arg);
+  cb_interpolator->setCurrentIndex(mArgsInfo.interp_arg);
+  cb_optimizer->setCurrentIndex(mArgsInfo.optimizer_arg);
+  cb_metric->setCurrentIndex(mArgsInfo.metric_arg);
+}
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+void vvToolRigidReg::Presets()
+{
+  mConfigFile="Presets";
+  std::string matrixfilename;
+if(cb_presets->currentIndex()==0)
+{
+    mArgsInfo.reference_arg=new char;  
+    mArgsInfo.reference_given=0;
+    mArgsInfo.target_arg=new char;      
+    mArgsInfo.target_given=0;
+    mArgsInfo.output_arg=new char;      
+    mArgsInfo.referenceMask_arg=new char;       
+    mArgsInfo.targetMask_arg=new char;          
+    mArgsInfo.initMatrix_arg=new char;          
+    mArgsInfo.matrix_arg=new char;
+    mArgsInfo.referenceMask_given=0;    
+    mArgsInfo.reference_given=0;        
+    mArgsInfo.reference_arg=new char;   
+    mArgsInfo.target_given=0;   
+    mArgsInfo.target_arg=new char;      
+    mArgsInfo.output_given=0;   
+    mArgsInfo.output_arg=new char;      
+    mArgsInfo.checker_after_given=0;    
+    mArgsInfo.checker_before_given=0;   
+    mArgsInfo.after_given=0;    
+    mArgsInfo.before_given=0;   
+    mArgsInfo.threads_given=1;          
+    mArgsInfo.threads_arg=3;    
+    mArgsInfo.normalize_flag=0;         
+    mArgsInfo.blur_arg=0.0;     
+    mArgsInfo.referenceMask_arg=new char;       
+    mArgsInfo.targetMask_arg=new char;          
+    mArgsInfo.targetMask_given=0;       
+    mArgsInfo.levels_given=1;   
+    mArgsInfo.levels_arg=2;     
+    mArgsInfo.moment_flag=1;    
+    mArgsInfo.intThreshold_given=0;     
+    mArgsInfo.intThreshold_arg=0.0;     
+    mArgsInfo.transX_arg=0.0;   
+    mArgsInfo.transY_arg=0.0;   
+    mArgsInfo.transZ_arg=0.0;   
+    mArgsInfo.transform_arg=2;          
+    mArgsInfo.gradient_flag=1;          
+    mArgsInfo.interp_given=1;   
+    mArgsInfo.interp_arg=1;     
+    mArgsInfo.interpOrder_given=1;      
+    mArgsInfo.interpOrder_arg=3;        
+    mArgsInfo.interpSF_given=1;         
+    mArgsInfo.interpSF_arg=20;//default         
+    mArgsInfo.metric_given=1;   
+    mArgsInfo.metric_arg=0;     
+    mArgsInfo.samples_arg=1;//default   
+    mArgsInfo.stdDev_arg=0.4;   
+    mArgsInfo.step_arg=2.0;     
+    mArgsInfo.relax_arg=0.7;    
+    mArgsInfo.valueTol_arg=0.01;        
+    mArgsInfo.stepTol_arg=0.1;          
+    mArgsInfo.gradTol_arg=1e-5;         
+    mArgsInfo.lineAcc_arg=0.9;          
+    mArgsInfo.convFactor_arg=1e+12;     
+    mArgsInfo.maxIt_arg=500;    
+    mArgsInfo.maxLineIt_arg=50;         
+    mArgsInfo.maxEval_arg=500;          
+    mArgsInfo.maxCorr_arg=5;    
+    mArgsInfo.selectBound_arg=0;        
+    mArgsInfo.inc_arg=1.2;      
+    mArgsInfo.dec_arg=4;        
+    mArgsInfo.optimizer_arg=1;          
+    mArgsInfo.initMatrix_given=0;       
+    mArgsInfo.initMatrix_arg=new char;          
+    mArgsInfo.tWeight_given=1;          
+    mArgsInfo.tWeight_arg=1.0;          
+    mArgsInfo.rWeight_given=1.0;        
+    mArgsInfo.rWeight_arg=50.0;         
+    mArgsInfo.matrix_given=1;
+    matrixfilename="/home/bharath/bin/writematrix.txt";//put ur path here for retreiving your matrix
+    mArgsInfo.matrix_arg=const_cast<char*>(matrixfilename.c_str()); 
+    UpdateTextEditor2();
+}
+else {
+  QMessageBox::information(this,"Sorry", "Other Presets are not available for the moment!");
+  return;
+ }
+}
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+void vvToolRigidReg::UpdateTextEditor2()
+{
+  
+    QString str1,str2,str3;
+    QColor color;
+    tab2textedit->clear();
+    tab2textedit->setAcceptRichText(true);
+    str2=tab2textedit->toPlainText();
+    tab2textedit->setTextColor(QColor(255,0,0));
+    str2.append(str3.append("threads="+str1.setNum(mArgsInfo.threads_arg)));
+    tab2textedit->setText(str2);
+    str3.clear();
+    str1.clear();
+
+    str2=tab2textedit->toPlainText();
+    str2.append("\n");
+    tab2textedit->setText(str2);
+
+    str2=tab2textedit->toPlainText();
+    str2.append(str3.append("reference="+str1.append(mArgsInfo.reference_arg)));
+    tab2textedit->setText(str2);
+    str3.clear();
+    str1.clear();
+
+    str2=tab2textedit->toPlainText();
+    str2.append("\n");
+    tab2textedit->setText(str2);
+    
+    str2=tab2textedit->toPlainText();
+    str2.append(str3.append("target="+str1.append(mArgsInfo.target_arg)));
+    tab2textedit->setText(str2);
+    str3.clear();
+    str1.clear();
+
+    str2=tab2textedit->toPlainText();
+    str2.append("\n");
+    tab2textedit->setText(str2);
+    
+    str2=tab2textedit->toPlainText();
+    str2.append(str3.append("matrix="+str1.append(mArgsInfo.matrix_arg)));
+    tab2textedit->setText(str2);
+    str3.clear();
+    str1.clear();
+
+    str2=tab2textedit->toPlainText();
+    str2.append("\n");
+    tab2textedit->setText(str2);
+    
+    str2=tab2textedit->toPlainText();
+    str2.append(str3.append("interp="+str1.setNum(mArgsInfo.interp_arg)));
+    tab2textedit->setText(str2);
+    str3.clear();
+    str1.clear();
+
+    str2=tab2textedit->toPlainText();
+    str2.append("\n");
+    tab2textedit->setText(str2);
+    
+    str2=tab2textedit->toPlainText();
+    str2.append(str3.append("transform="+str1.setNum(mArgsInfo.transform_arg)));
+    tab2textedit->setText(str2);
+    str3.clear();
+    str1.clear();
+
+    str2=tab2textedit->toPlainText();
+    str2.append("\n");
+    tab2textedit->setText(str2);
+    
+    str2=tab2textedit->toPlainText();
+    str2.append(str3.append("transX="+str1.setNum(mArgsInfo.transX_arg)));
+    tab2textedit->setText(str2);
+    str3.clear();
+    str1.clear();
+
+    str2=tab2textedit->toPlainText();
+    str2.append("\n");
+    tab2textedit->setText(str2);
+    
+    str2=tab2textedit->toPlainText();
+    str2.append(str3.append("transY="+str1.setNum(mArgsInfo.transY_arg)));
+    tab2textedit->setText(str2);
+    str3.clear();
+    str1.clear();
+
+    str2=tab2textedit->toPlainText();
+    str2.append("\n");
+    tab2textedit->setText(str2);
+    
+    str2=tab2textedit->toPlainText();
+    str2.append(str3.append("transZ="+str1.setNum(mArgsInfo.transZ_arg)));
+    tab2textedit->setText(str2);
+    str3.clear();
+    str1.clear();
+
+    str2=tab2textedit->toPlainText();
+    str2.append("\n");
+    tab2textedit->setText(str2);
+    
+    str2=tab2textedit->toPlainText();
+    str2.append(str3.append("metric="+str1.setNum(mArgsInfo.metric_arg)));
+    tab2textedit->setText(str2);
+    str3.clear();
+    str1.clear();
+
+    str2=tab2textedit->toPlainText();
+    str2.append("\n");
+    tab2textedit->setText(str2);
+    
+    str2=tab2textedit->toPlainText();
+    str2.append(str3.append("samples="+str1.setNum(mArgsInfo.samples_arg)));
+    tab2textedit->setText(str2);
+    str3.clear();
+    str1.clear();
+
+    str2=tab2textedit->toPlainText();
+    str2.append("\n");
+    tab2textedit->setText(str2);
+    
+    str2=tab2textedit->toPlainText();
+    str2.append(str3.append("intThreshold="+str1.setNum(mArgsInfo.intThreshold_arg)));
+    tab2textedit->setText(str2);
+    str3.clear();
+    str1.clear();
+
+    str2=tab2textedit->toPlainText();
+    str2.append("\n");
+    tab2textedit->setText(str2);
+    
+    str2=tab2textedit->toPlainText();
+    str2.append(str3.append("stdDev="+str1.setNum(mArgsInfo.stdDev_arg)));
+    tab2textedit->setText(str2);
+    str3.clear();
+    str1.clear();
+
+    str2=tab2textedit->toPlainText();
+    str2.append("\n");
+    tab2textedit->setText(str2);
+    
+    
+    str2=tab2textedit->toPlainText();
+    str2.append(str3.append("blur="+str1.setNum(mArgsInfo.blur_arg)));
+    tab2textedit->setText(str2);
+    str3.clear();
+    str1.clear();
+
+    str2=tab2textedit->toPlainText();
+    str2.append("\n");
+    tab2textedit->setText(str2);
+    
+    
+    str2=tab2textedit->toPlainText();
+    str2.append(str3.append("optimizer="+str1.setNum(mArgsInfo.optimizer_arg)));
+    tab2textedit->setText(str2);
+    str3.clear();
+    str1.clear();
+
+    str2=tab2textedit->toPlainText();
+    str2.append("\n");
+    tab2textedit->setText(str2);
+    
+    
+    str2=tab2textedit->toPlainText();
+    str2.append(str3.append("step="+str1.setNum(mArgsInfo.step_arg)));
+    tab2textedit->setText(str2);
+    str3.clear();
+    str1.clear();
+
+    str2=tab2textedit->toPlainText();
+    str2.append("\n");
+    tab2textedit->setText(str2);
+    
+    
+    str2=tab2textedit->toPlainText();
+    str2.append(str3.append("relax="+str1.setNum(mArgsInfo.relax_arg)));
+    tab2textedit->setText(str2);
+    str3.clear();
+    str1.clear();
+
+    str2=tab2textedit->toPlainText();
+    str2.append("\n");
+    tab2textedit->setText(str2);
+    
+    str2=tab2textedit->toPlainText();
+    str2.append(str3.append("valueTol="+str1.setNum(mArgsInfo.valueTol_arg)));
+    tab2textedit->setText(str2);
+    str3.clear();
+    str1.clear();
+    
+    str2=tab2textedit->toPlainText();
+    str2.append("\n");
+    tab2textedit->setText(str2);
+    
+    str2=tab2textedit->toPlainText();
+    str2.append(str3.append("stepTol="+str1.setNum(mArgsInfo.stepTol_arg)));
+    tab2textedit->setText(str2);
+    str3.clear();
+    str1.clear();
+
+    str2=tab2textedit->toPlainText();
+    str2.append("\n");
+    tab2textedit->setText(str2);
+    
+    
+    str2=tab2textedit->toPlainText();
+    str2.append(str3.append("gradTol="+str1.setNum(mArgsInfo.gradTol_arg)));
+    tab2textedit->setText(str2);
+    str3.clear();
+    str1.clear();
+
+    str2=tab2textedit->toPlainText();
+    str2.append("\n");
+    tab2textedit->setText(str2);
+    
+    str2=tab2textedit->toPlainText();
+    str2.append(str3.append("lineAcc="+str1.setNum(mArgsInfo.lineAcc_arg)));
+    tab2textedit->setText(str2);
+    str3.clear();
+    str1.clear();
+
+    str2=tab2textedit->toPlainText();
+    str2.append("\n");
+    tab2textedit->setText(str2);
+    str2=tab2textedit->toPlainText();
+    str2.append(str3.append("convFactor="+str1.setNum(mArgsInfo.convFactor_arg)));
+    tab2textedit->setText(str2);
+    str3.clear();
+    str1.clear();
+
+    str2=tab2textedit->toPlainText();
+    str2.append("\n");
+    tab2textedit->setText(str2);
+    
+    str2=tab2textedit->toPlainText();
+    str2.append(str3.append("maxIt="+str1.setNum(mArgsInfo.maxIt_arg)));
+    tab2textedit->setText(str2);
+    str3.clear();
+    str1.clear();
+    str2=tab2textedit->toPlainText();
+    str2.append("\n");
+    tab2textedit->setText(str2);
+    
+    str2=tab2textedit->toPlainText();
+    str2.append(str3.append("maxLineIt="+str1.setNum(mArgsInfo.maxLineIt_arg)));
+    tab2textedit->setText(str2);
+    str3.clear();
+    str1.clear();
+
+    str2=tab2textedit->toPlainText();
+    str2.append("\n");
+    tab2textedit->setText(str2);
+    
+    str2=tab2textedit->toPlainText();
+    str2.append(str3.append("maxEval="+str1.setNum(mArgsInfo.maxEval_arg)));
+    tab2textedit->setText(str2);
+    str3.clear();
+    str1.clear();
+
+    str2=tab2textedit->toPlainText();
+    str2.append("\n");
+    tab2textedit->setText(str2);
+    
+      str2=tab2textedit->toPlainText();
+    str2.append(str3.append("maxCorr="+str1.setNum(mArgsInfo.maxCorr_arg)));
+    tab2textedit->setText(str2);
+    str3.clear();
+    str1.clear();
+
+    str2=tab2textedit->toPlainText();
+    str2.append("\n");
+    tab2textedit->setText(str2);
+    
+      str2=tab2textedit->toPlainText();
+    str2.append(str3.append("selectBound="+str1.setNum(mArgsInfo.selectBound_arg)));
+    tab2textedit->setText(str2);
+    str3.clear();
+    str1.clear();
+
+    str2=tab2textedit->toPlainText();
+    str2.append("\n");
+    tab2textedit->setText(str2);
+    
+      str2=tab2textedit->toPlainText();
+    str2.append(str3.append("rWeight="+str1.setNum(mArgsInfo.rWeight_arg)));
+    tab2textedit->setText(str2);
+    str3.clear();
+    str1.clear();
+
+    str2=tab2textedit->toPlainText();
+    str2.append("\n");
+    tab2textedit->setText(str2);
+    
+      str2=tab2textedit->toPlainText();
+    str2.append(str3.append("tWeight="+str1.setNum(mArgsInfo.tWeight_arg)));
+    tab2textedit->setText(str2);
+    str3.clear();
+    str1.clear();
+
+    str2=tab2textedit->toPlainText();
+    str2.append("\n");
+    tab2textedit->setText(str2);
+    
+      str2=tab2textedit->toPlainText();
+    str2.append(str3.append("levels="+str1.setNum(mArgsInfo.levels_arg)));
+    tab2textedit->setText(str2);
+    str3.clear();
+    str1.clear();
+
+    str2=tab2textedit->toPlainText();
+    str2.append("\n");
+    tab2textedit->setText(str2);
+    
+      str2=tab2textedit->toPlainText();
+    str2.append(str3.append("inc="+str1.setNum(mArgsInfo.inc_arg)));
+    tab2textedit->setText(str2);
+    str3.clear();
+    str1.clear();
+
+    str2=tab2textedit->toPlainText();
+    str2.append("\n");
+    tab2textedit->setText(str2);
+    
+      str2=tab2textedit->toPlainText();
+    str2.append(str3.append("dec="+str1.setNum(mArgsInfo.dec_arg)));
+    tab2textedit->setText(str2);
+    str3.clear();
+    str1.clear();
+
+    str2=tab2textedit->toPlainText();
+    str2.append("\n");
+    tab2textedit->setText(str2);
+}
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+void vvToolRigidReg::TransformSelect()
+{
+  if(!mConfigFile.empty()){
+   mArgsInfo.transform_arg=cb_transform->currentIndex();
+   UpdateTextEditor2();
+  }
+  else{
+    QMessageBox::information(this,"Warning","Load the Config File First!..");
+  }
+}
+//------------------------------------------------------------------------------
+  
+//------------------------------------------------------------------------------
+void vvToolRigidReg::CmdlineParser(int override, int initialize)
+{
+   //0 opened, 1 not opened fine
+   int opened=cmdline_parser_clitkAffineRegistration_configfile(const_cast<char*>(mConfigFile.c_str()),&mArgsInfo,override,initialize,1);
+   DD(opened);
+   mArgsInfo.gradient_flag=1;
+   QString str;
+   //Read the transformation parameters from the  path in the config file(mArgsInfo.matrix_arg) and display it on the TextBox 2
+   ifstream readfile;
+   std::vector<QString> Qstr;
+   
+   if(!opened){
+   readfile.open(mConfigFile.c_str());
+   }
+   else{
+   QMessageBox::information(this,"Warning","Load the Config File First..");
+   }
+   if (readfile.is_open()) 
+   { 
+    while (!readfile.eof())
+      {
+      readfile >> mConfigFile;
+      Qstr.push_back(QString(mConfigFile.c_str()));
+      }
+      readfile.close();
+   }
+    else {
+      QMessageBox::information(this,"Warning","Cannot Open File!");
+      return;
+    }
+     for(unsigned int i=0;i<Qstr.size()-1;i++)
+      {
+    str=tab2textedit->toPlainText();
+    str.append(Qstr.at(i));
+    tab2textedit->setText(str);
+    str.append("\n");
+    tab2textedit->setText(str);
+      }
+}
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+void vvToolRigidReg::OptimizerSelect()
+{
+  if(!mConfigFile.empty()){
+  mArgsInfo.optimizer_arg=cb_optimizer->currentIndex();
+  UpdateTextEditor2();
+   }
+  else{
+    QMessageBox::information(this,"Warning","Load the Config File First!..");
+  }
+}
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+void vvToolRigidReg::InterpolatorSelect()
+{
+  if(!mConfigFile.empty()){
+  mArgsInfo.interp_arg=cb_interpolator->currentIndex();
+  UpdateTextEditor2();
+   }
+  else{
+    QMessageBox::information(this,"Warning","Load the Config File First!..");
+  }
+}
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+void vvToolRigidReg::MetricSelect()
+{
+  if(!mConfigFile.empty()){
+ mArgsInfo.metric_arg=cb_metric->currentIndex();
+ UpdateTextEditor2();
+   }
+  else{
+    QMessageBox::information(this,"Warning","Load the Config File First!..");
+  }
+}
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+void vvToolRigidReg::OutputSelect()
+{
+  std::ostringstream osstream;
+  if(!mConfigFile.empty()){
+    if(cb_selectoutput->currentIndex()==0){
+      mArgsInfo.output_given=0;
+      mArgsInfo.checker_after_given=0;
+      mArgsInfo.checker_before_given=0;
+      mArgsInfo.after_given=0;
+      mArgsInfo.before_given=0;
+    }//get transformed output image
+    if(cb_selectoutput->currentIndex()==1){ 
+      mArgsInfo.output_given=0;
+      mArgsInfo.checker_after_given=1;
+      mArgsInfo.checker_before_given=0;
+      mArgsInfo.after_given=0;
+      mArgsInfo.before_given=0;
+    }//get checkered image after reg
+    if(cb_selectoutput->currentIndex()==2){  
+      mArgsInfo.output_given=0;
+      mArgsInfo.checker_after_given=0;
+      mArgsInfo.checker_before_given=1;
+      mArgsInfo.after_given=0;
+      mArgsInfo.before_given=0;
+    }//get checkered  image before reg
+    if(cb_selectoutput->currentIndex()==3){
+      mArgsInfo.output_given=0;
+      mArgsInfo.checker_after_given=0;
+      mArgsInfo.checker_before_given=0;
+      mArgsInfo.after_given=1;
+      mArgsInfo.before_given=0;
+    }//get difference image after reg
+    if(cb_selectoutput->currentIndex()==4){  
+      mArgsInfo.output_given=0;
+      mArgsInfo.checker_after_given=0;
+      mArgsInfo.checker_before_given=0;
+      mArgsInfo.after_given=0;
+      mArgsInfo.before_given=1;
+    }//get difference image before reg
+  }
+  else{
+    QMessageBox::information(this,"Warning","Load the Config File First!..");
+  }
+}
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+void vvToolRigidReg::SaveTextEdit()
+{
+     DD(mArgsInfo.transform_arg);
+   QString f1 = QFileDialog::getSaveFileName(this, tr("Save Config File"),
+                                              mMainWindow->GetInputPathName(),
+                                              tr("Text (*.mat *.txt *.doc *.rtf)"));
+   QFile file(f1);                                   
+   if(file.open(QFile::WriteOnly | QFile::Truncate) & !mConfigFile.empty() ){
+   QTextStream stream( &file );
+   stream << tab2textedit->toPlainText();
+     }
+    else
+     {
+      QMessageBox::information(this,"Warning","Nothing to Save!");
+      return;
+     }
+   tab2textedit->clear();
+   DD(mArgsInfo.transform_arg);
+}
+//------------------------------------------------------------------------------
+
 //------------------------------------------------------------------------------
 void vvToolRigidReg::InputIsSelected(std::vector<vvSlicerManager *> & l)
 {
   //inputs
   mInput1 = l[0];
   mInput2 = l[1];
+  UpdateTextEditor(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix(),textEdit_2);
+
+  for(int i =0;i<4;i++)
+  {
+    for(int j=0;j<4;j++)
+    {
+      mInitialMatrix[i*4+j]=mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix()->GetElement(i,j);
+    }
+  }
+
   if(mInput1->GetFileName()==mInput2->GetFileName())
-  {  
+  {
     QMessageBox::information(this, "Warning","Your Reference and Target Images are the same");
-  } 
+  }
   mTwoInputs = true;
-  SetOverlay();
+  SetOverlay(mInput2->GetImage());
   mImageSize=mInput1->GetImage()->GetSize();
-  
   SetRotationCenter();
   SetSliderRanges();
-  
-    //connect all sigs to slots        
-  connect(resetbutton, SIGNAL(pressed()), this, SLOT(ResetTransform()));
-  
-  connect(Xval, SIGNAL(editingFinished()), this, SLOT(SetXvalue()));
-  connect(Yval, SIGNAL(editingFinished()), this, SLOT(SetYvalue()));
-  connect(Zval, SIGNAL(editingFinished()), this, SLOT(SetZvalue()));
-  connect(xtrans_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateXtranslider()));
-    
-  connect(ytrans_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateYtranslider()));
-  connect(ztrans_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateZtranslider()));
-  
-  
-  connect(xrot_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateXrotslider()));
-  connect(yrot_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateYrotslider()));
-  connect(zrot_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateZrotslider()));
-  
-       
-   connect(xtrans_sb, SIGNAL(valueChanged(int)), this, SLOT(UpdateXtransb()));
-   connect(ytrans_sb, SIGNAL(valueChanged(int)), this, SLOT(UpdateYtransb()));
-   connect(ztrans_sb, SIGNAL(valueChanged(int)), this, SLOT(UpdateZtransb()));
-   connect(xrot_sb, SIGNAL(valueChanged(int)), this, SLOT(UpdateXrotsb()));
-   connect(yrot_sb, SIGNAL(valueChanged(int)), this, SLOT(UpdateYrotsb()));
-   connect(zrot_sb, SIGNAL(valueChanged(int)), this, SLOT(UpdateZrotsb()));
+
+    //connect all sigs to slots
+   connect(resetbutton, SIGNAL(pressed()), this, SLOT(ResetTransform()));
+   connect(tab2loadbutton, SIGNAL(pressed()), this, SLOT(GetArgsInfoFromGUI()));
+   connect(tab2applybutton, SIGNAL(pressed()), this, SLOT(AutoRegister()));
+
+
+   connect(Xval, SIGNAL(editingFinished()), this, SLOT(SetXvalue()));
+   connect(Yval, SIGNAL(editingFinished()), this, SLOT(SetYvalue()));
+   connect(Zval, SIGNAL(editingFinished()), this, SLOT(SetZvalue()));
+
+   connect(xtrans_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateTransform_sliders()));
+   connect(ytrans_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateTransform_sliders()));
+   connect(ztrans_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateTransform_sliders()));
+
+
+   connect(xrot_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateTransform_sliders()));
+   connect(yrot_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateTransform_sliders()));
+   connect(zrot_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateTransform_sliders()));
+
+   connect(xtrans_sb, SIGNAL(valueChanged(double)), this, SLOT(UpdateTransform_sb()));
+   connect(ytrans_sb, SIGNAL(valueChanged(double)), this, SLOT(UpdateTransform_sb()));
+   connect(ztrans_sb, SIGNAL(valueChanged(double)), this, SLOT(UpdateTransform_sb()));
+   connect(xrot_sb, SIGNAL(valueChanged(double)), this, SLOT(UpdateTransform_sb()));
+   connect(yrot_sb, SIGNAL(valueChanged(double)), this, SLOT(UpdateTransform_sb()));
+   connect(zrot_sb, SIGNAL(valueChanged(double)), this, SLOT(UpdateTransform_sb()));
+   
+   connect(loadbutton, SIGNAL(pressed()), this, SLOT(LoadFile()));
+   connect(savebutton, SIGNAL(pressed()), this, SLOT(SaveFile()));
+   
+   connect(checkBox_rigid, SIGNAL(clicked(bool)), this, SLOT(CheckRigidReg()));
+   connect(checkBox_deformable, SIGNAL(clicked(bool)), this, SLOT(CheckDeformableReg()));
+   
+   connect(cb_presets, SIGNAL(activated(int)), this, SLOT(Presets()));
+   connect(cb_transform, SIGNAL(activated(int)), this, SLOT(TransformSelect()));
+   connect(cb_optimizer, SIGNAL(activated(int)), this, SLOT(OptimizerSelect()));
+   connect(cb_interpolator, SIGNAL(activated(int)), this, SLOT(InterpolatorSelect()));
+   connect(cb_metric, SIGNAL(activated(int)), this, SLOT(MetricSelect()));
+   connect(cb_selectoutput, SIGNAL(activated(int)), this, SLOT(OutputSelect()));
+   connect(tab2savebutton, SIGNAL(pressed()), this, SLOT(SaveTextEdit()));
    
-  
-  connect(loadbutton, SIGNAL(pressed()), this, SLOT(ReadFile()));
-  connect(savebutton, SIGNAL(pressed()), this, SLOT(SaveFile()));
 }
 //------------------------------------------------------------------------------
 
 //------------------------------------------------------------------------------
 void vvToolRigidReg::apply()
 {
- QMessageBox mb( "Keep Overlay",
-                    "Do you want to keep the overlay on?\n"
-                    "You can switch it off anytime by pressing 'x'",
-                    QMessageBox::Information,
-                    QMessageBox::Yes | QMessageBox::Default,
-                    QMessageBox::No,
-                    QMessageBox::Cancel | QMessageBox::Escape );
-    mb.setButtonText( QMessageBox::Yes, "Yes" );
-    mb.setButtonText( QMessageBox::No, "No" );
-    switch( mb.exec() ) {
-        case QMessageBox::Yes:
-          hide();
-         break;
-        case QMessageBox::No:
-         mInput2->Reload();
-        mInput2->Render();
-        mInput1->Reload(); 
-        mInput1->Render();
-        for(int i=0;i<mCurrentSlicerManager->NumberOfSlicers();i++)
-        {
-          mInput1->RemoveActor("overlay",0);
-          mInput1->SetColorMap(0);
-          mInput1->Render();
-          hide();
-        }
-        break;
-        case QMessageBox::Cancel:
-            break;
-    }
+  RemoveOverlay();
+}
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+void vvToolRigidReg::CheckRigidReg()
+{
+  checkBox_deformable->setChecked(false);
+  cb_transform->show();
+  cb_presets->show();
+  cb_metric->show();
+  cb_interpolator->show();
+  cb_optimizer->show();
+  cb_selectoutput->show();
+  translabel->show();
+  metriclabel->show();
+  outputlabel->show();
+  optimlabel->show();
+  interpollabel->show();
+  presetlabel->show();
+  
+}
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+void vvToolRigidReg::CheckDeformableReg()
+{
+  checkBox_rigid->setChecked(false);
+  presetlabel->hide();
+  cb_transform->show();
+  cb_metric->show();
+  cb_interpolator->show();
+  cb_optimizer->show();
+  cb_selectoutput->show();
+  cb_presets->hide();
+  translabel->show();
+  metriclabel->show();
+  outputlabel->show();
+  optimlabel->show();
+  interpollabel->show();
 }
 //------------------------------------------------------------------------------
 
 //------------------------------------------------------------------------------
-void vvToolRigidReg::SetOverlay()
+void vvToolRigidReg::SetOverlay(vvImage::Pointer Image)
 {
-    for (int i =0; i<mCurrentSlicerManager->NumberOfSlicers(); i++) {
-   mCurrentSlicerManager->GetSlicer(i)->SetOverlay(mInput2->GetImage());
-   mCurrentSlicerManager->GetSlicer(i)->SetActorVisibility("overlay",0,true);  
+    for (int i =0; i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
+   mCurrentSlicerManager->GetSlicer(i)->SetOverlay(Image);
+   mCurrentSlicerManager->GetSlicer(i)->SetActorVisibility("overlay",0,true);
    mCurrentSlicerManager->SetColorMap();
    mCurrentSlicerManager->Render();
    }
   }
 //------------------------------------------------------------------------------
 
+//------------------------------------------------------------------------------
+void vvToolRigidReg::RemoveOverlay()
+{
+   for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers();i++)
+  {
+     mInput1->RemoveActor("overlay",0);
+     mInput1->SetColorMap(0);
+     mInput1->Render();
+     hide();
+  }
+}
+//------------------------------------------------------------------------------
+
 //------------------------------------------------------------------------------
 void vvToolRigidReg::SetXvalue()
 {
@@ -195,8 +875,7 @@ void vvToolRigidReg::SetZvalue()
 //------------------------------------------------------------------------------
 void vvToolRigidReg::SetTransform(double tX, double tY, double tZ, double aX, double aY, double aZ,bool update)
 {
-   
-  vtkSmartPointer<vtkTransform> transform = mCurrentSlicerManager->GetImage()->GetTransform();
+  vtkSmartPointer<vtkTransform> transform = mInput1->GetImage()->GetTransform();
   transform->PostMultiply();
   //Rotations
   if (aX!=0 || aY!=0 || aZ!=0) {
@@ -212,50 +891,56 @@ void vvToolRigidReg::SetTransform(double tX, double tY, double tZ, double aX, do
   }
   //Translations
   if (tX!=0||tY!=0||tZ!=0)
-    transform->Translate(tX*mInput1->GetImage()->GetSpacing()[0],tY*mInput1->GetImage()->GetSpacing()[1],tZ*mInput1->GetImage()->GetSpacing()[2]);
-
-    transform->Update();
-  if(update)
-  {
-    for (int i=0; i<mCurrentSlicerManager->NumberOfSlicers(); i++) {
-      mCurrentSlicerManager->GetImage()->UpdateReslice();
-      mCurrentSlicerManager->GetSlicer(i)->ForceUpdateDisplayExtent();
-      mCurrentSlicerManager->GetSlicer(i)->Render();
-    }
-  }
+    transform->Translate(tX*mInput1->GetImage()->GetSpacing()[0],
+                         tY*mInput1->GetImage()->GetSpacing()[1],
+                         tZ*mInput1->GetImage()->GetSpacing()[2]);
 }
 //------------------------------------------------------------------------------
 
 //------------------------------------------------------------------------------
 void vvToolRigidReg::SetTransform(vtkMatrix4x4 *matrix)
 {
-    vtkSmartPointer<vtkTransform> transform =mCurrentSlicerManager->GetImage()->GetTransform();
-    transform->SetMatrix(matrix);
-    transform->PostMultiply();
-    transform->Concatenate(matrix);
-    transform->Update();
-    mCurrentSlicerManager->GetImage()->SetTransform(transform);
-   
-    for (int i=0; i<mCurrentSlicerManager->NumberOfSlicers(); i++) {
-      mCurrentSlicerManager->GetImage()->UpdateReslice();
-      mCurrentSlicerManager->GetSlicer(i)->ForceUpdateDisplayExtent();
-      mCurrentSlicerManager->GetSlicer(i)->Render();
+   vtkSmartPointer<vtkTransform> transform=vtkSmartPointer<vtkTransform>::New();
+    for(int i=0; i<4;i++)
+      for(int j=0;j<4;j++)
+    mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix()->SetElement(i,j,matrix->GetElement(i,j));
+    
+    Render();
+}
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+void vvToolRigidReg::LoadFile()
+{
+  ReadFile(false);
+}
+//------------------------------------------------------------------------------
+  
+//------------------------------------------------------------------------------
+void vvToolRigidReg::Render()
+{
+  for (int i=0; i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
+       mCurrentSlicerManager->GetSlicer(i)->ForceUpdateDisplayExtent();
+       mCurrentSlicerManager->GetSlicer(i)->Render();
       }
 }
 //------------------------------------------------------------------------------
 
 //------------------------------------------------------------------------------
-  void vvToolRigidReg::UpdateTextEditor(vtkMatrix4x4 *matrix)
+  void vvToolRigidReg::UpdateTextEditor(vtkMatrix4x4 *matrix,QTextEdit* textEdit)
 {
-   QString str1,str2,str3;
+    QFont font=QFont("Courier",11);
+    textEdit->setCurrentFont(font);
+    textEdit->update();
+
+    QString str1,str2,str3;
     QColor color;
     textEdit->clear();
     textEdit->setAcceptRichText(true);
-
     str2=textEdit->toPlainText();
-    str2.append("Rotation Center(mm): \n");
+    str2.append("#Rotation Center(mm): \n#");
     textEdit->setText(str2);
-    
+
     str2=textEdit->toPlainText();
     textEdit->setTextColor(QColor(255,0,0));
     str2.append(str3.append(Xval->text()));
@@ -270,11 +955,11 @@ void vvToolRigidReg::SetTransform(vtkMatrix4x4 *matrix)
     str2.append(str3.append(Yval->text()));
     textEdit->setText(str2);
     str3.clear();
-    
+
     str2=textEdit->toPlainText();
     str2.append("\t");
     textEdit->setText(str2);
-    
+
 
     str2=textEdit->toPlainText();
     str2.append(str3.append(Zval->text()));
@@ -284,288 +969,261 @@ void vvToolRigidReg::SetTransform(vtkMatrix4x4 *matrix)
     str2=textEdit->toPlainText();
     str2.append("\n");
     textEdit->setText(str2);
-    
+
 
     str2=textEdit->toPlainText();
-    str2.append("Transformation Matrix(mm):\n");
+    str2.append("#Transformation Matrix(mm):\n");
     textEdit->setText(str2);
-
     for(int i=0;i<4;i++)
     {
     for(int j=0;j<4;j++)
       {
     str2=textEdit->toPlainText();
    // str2.append("\t"+str1.setNum(matrix->Element[i][j]));
-    str2.append(QString("%1\t").arg(str1.setNum(matrix->Element[i][j]),20));  
+    str2.append(QString("%1\t").arg(str1.setNum(matrix->Element[i][j]),2));
     textEdit->setText(str2);
       }
     str2=textEdit->toPlainText();
-    str2.append("\n");  
+    str2.append("\n");
     textEdit->setText(str2);
     }
     //QString str = QFileDialog::getOpenFileName();
     textEdit->setTextColor(QColor(255,0,0));
     textEdit->setFont(QFont("courrier new",12,4,true));
     textEdit->toPlainText().toAscii();
-    
+
     str2=textEdit->toPlainText();
     textEdit->setText(str2);
 }
 //------------------------------------------------------------------------------
 
 //------------------------------------------------------------------------------
-void vvToolRigidReg::UpdateXtransb()
-{
-  int diff=0;
-  diff=xtrans_sb->value()-xtrans_slider->value();
-  this->SetTransform(diff, 0, 0, 0, 0, 0,true);
-  xtrans_slider->setValue(xtrans_sb->value());
-   UpdateTextEditor(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix());
-    
-}
-//------------------------------------------------------------------------------
-
-//------------------------------------------------------------------------------
-void vvToolRigidReg::UpdateXtranslider()
-{
-  int diff=0;
-  diff=xtrans_slider->value()-xtrans_sb->value();
-  this->SetTransform(diff, 0, 0, 0, 0, 0,true);
-  xtrans_sb->setValue(xtrans_slider->value());
-  UpdateTextEditor(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix());
-}
-//------------------------------------------------------------------------------
-
-//------------------------------------------------------------------------------
-void vvToolRigidReg::UpdateYtransb()
+void vvToolRigidReg::UpdateTransform_sliders()
 {
-
-  int diff=0;
-  diff=ytrans_sb->value()-ytrans_slider->value();
-  this->SetTransform(0, diff, 0, 0, 0, 0,true);
-  ytrans_slider->setValue(ytrans_sb->value());
UpdateTextEditor(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix());
+       InitializeSliders(xtrans_slider->value()*mInput1->GetImage()->GetSpacing()[0],
+                        ytrans_slider->value()*mInput1->GetImage()->GetSpacing()[1],
+                        ztrans_slider->value()*mInput1->GetImage()->GetSpacing()[2],
+                       xrot_slider->value(),yrot_slider->value(),zrot_slider->value(),false);
+        UpdateTransform(true);
       Render();
 }
-
 //------------------------------------------------------------------------------
 
 //------------------------------------------------------------------------------
-void vvToolRigidReg::UpdateYtranslider()
+void vvToolRigidReg::UpdateTransform_sb()
 {
-  int diff=0;
-  diff=ytrans_slider->value()-ytrans_sb->value();
-  this->SetTransform(0, diff, 0, 0, 0, 0,true);
-  ytrans_sb->setValue(ytrans_slider->value());
-  UpdateTextEditor(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix());
+   InitializeSliders(xtrans_sb->value(),
+      ytrans_sb->value(),
+      ztrans_sb->value(),
+                       xrot_sb->value(),yrot_sb->value(),zrot_sb->value(),false);
+      UpdateTransform(false);
+      Render();
 }
 //------------------------------------------------------------------------------
 
 //------------------------------------------------------------------------------
-void vvToolRigidReg::UpdateZtransb()
-{
-
-  int diff=0;
-  diff=ztrans_sb->value()-ztrans_slider->value();
-  this->SetTransform(0, 0, diff, 0, 0, 0,true);
-  ztrans_slider->setValue(ztrans_sb->value());
-   UpdateTextEditor(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix());
-}
-
-//------------------------------------------------------------------------------
-
-//------------------------------------------------------------------------------
-void vvToolRigidReg::UpdateZtranslider()
-{
-  int diff=0;
-  diff=ztrans_slider->value()-ztrans_sb->value();
-  this->SetTransform(0, 0, diff, 0, 0, 0,true);
-  ztrans_sb->setValue(ztrans_slider->value());
-  UpdateTextEditor(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix());
-}
-//------------------------------------------------------------------------------
-
-//------------------------------------------------------------------------------
-void vvToolRigidReg::UpdateXrotsb()
-{
-
-  int diff=0;
-  diff=xrot_sb->value()-xrot_slider->value();
-  this->SetTransform(0, 0, 0, diff, 0, 0,true);
-  xrot_slider->setValue(xrot_sb->value());
-  UpdateTextEditor(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix());
-}
-
-//------------------------------------------------------------------------------
-
-//------------------------------------------------------------------------------
-void vvToolRigidReg::UpdateXrotslider()
-{
-  int diff=0;
-  diff=xrot_slider->value()-xrot_sb->value();
-  this->SetTransform(0, 0, 0, diff, 0, 0,true);
-  xrot_sb->setValue(xrot_slider->value());
-  UpdateTextEditor(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix());
+void vvToolRigidReg::AutoRegister()
+{ 
+    if (!mCurrentSlicerManager) close();
+    
+    if(!mConfigFile.empty()){
+    std::vector<vvImage::Pointer> inputs;
+    // Input
+    inputs.push_back(mInput1->GetImage());
+    inputs.push_back(mInput2->GetImage());
+    // Check input type
+    // Main filter
+    clitk::AffineRegistrationGenericFilter::Pointer filter =
+    clitk::AffineRegistrationGenericFilter::New();
+    filter->SetInputVVImages(inputs);
+    filter->SetArgsInfo(mArgsInfo);
+    filter->EnableReadOnDisk(false);
+    filter->Update();
+    std::ostringstream osstream;
+    vvImage::Pointer output;
+    output = filter->GetOutputVVImage();
+    SetOverlay(output);
+    
+    if(!cb_selectoutput->currentIndex()==0){
+     std::string outputstring;
+     output = filter->GetOutputVVImages()[1];
+     if(cb_selectoutput->currentIndex()==1){outputstring="Checkered_after_reg";}
+     if(cb_selectoutput->currentIndex()==2){outputstring="Checkered_before_reg";}
+     if(cb_selectoutput->currentIndex()==3){outputstring="Diff_after_reg";}
+     if(cb_selectoutput->currentIndex()==4){outputstring="Diff_before_reg";}
+    osstream << outputstring << mCurrentSlicerManager->GetSlicer(0)->GetFileName() << ".mhd";
+    AddImage(output,osstream.str());
+    filter->DeleteLastOutputImage();
+    }
+    DD(filter->GetOutputVVImages().capacity());
+    QApplication::restoreOverrideCursor();
+    ReadFile(true);
+    }
+    else
+    {
+      QMessageBox::information(this, "Warning","Load the Config File First!...");
+      return;
+    }
 }
 //------------------------------------------------------------------------------
 
 //------------------------------------------------------------------------------
-void vvToolRigidReg::UpdateYrotsb()
+void vvToolRigidReg::UpdateTransform(bool slider_enabled)
 {
-
-  int diff=0;
-  diff=yrot_sb->value()-yrot_slider->value();
-  this->SetTransform(0, 0, 0, 0, diff, 0,true);
-  yrot_slider->setValue(yrot_sb->value());
-  UpdateTextEditor(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix());
+     vtkSmartPointer<vtkTransform> transform_final=mInput1->GetImage()->GetTransform();
+     transform_final->SetMatrix(mInitialMatrix);
+     transform_final->PostMultiply();
+  //Rotations
+    double x=0, y=0 ,z=0;
+    x= Xval->text().toDouble();
+    y= Yval->text().toDouble();
+    z= Zval->text().toDouble();
+    transform_final->Translate(-x,-y,-z);
+    if(slider_enabled){
+    transform_final->RotateY(yrot_slider->value());
+    transform_final->RotateX(xrot_slider->value());
+    transform_final->RotateZ(zrot_slider->value());
+    }
+    else{
+    transform_final->RotateY(yrot_sb->value());
+    transform_final->RotateX(xrot_sb->value());
+    transform_final->RotateZ(zrot_sb->value());
+    }
+    transform_final->Translate(x,y,z);
+    transform_final->PreMultiply();
+    if(slider_enabled){
+    transform_final->Translate(xtrans_slider->value()*mInput1->GetImage()->GetSpacing()[0],0,0);
+    transform_final->Translate(0,ytrans_slider->value()*mInput1->GetImage()->GetSpacing()[1],0);
+    transform_final->Translate(0,0,ztrans_slider->value()*mInput1->GetImage()->GetSpacing()[2]);
+    }
+    else{
+    transform_final->Translate(xtrans_sb->value(),0,0);
+    transform_final->Translate(0,ytrans_sb->value(),0);
+    transform_final->Translate(0,0,ztrans_sb->value());
+    }
+    transform_final->Update();
+    Render();
+    UpdateTextEditor(transform_final->GetMatrix(),textEdit);
 }
-
 //------------------------------------------------------------------------------
 
-//------------------------------------------------------------------------------
-void vvToolRigidReg::UpdateYrotslider()
-{
-  int diff=0;
-  diff=yrot_slider->value()-yrot_sb->value();
-  this->SetTransform(0, 0, 0, 0, diff, 0,true);
-  yrot_sb->setValue(yrot_slider->value());
-  UpdateTextEditor(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix());
-}
-//------------------------------------------------------------------------------
 
 //------------------------------------------------------------------------------
-void vvToolRigidReg::UpdateZrotsb()
+void vvToolRigidReg::SaveFile()
 {
+  //Write the Transformation Matrix
+    QString f1 = QFileDialog::getSaveFileName(this, tr("Save Transformation Matrix File"),
+                                              mMainWindow->GetInputPathName(),
+                                              tr("Text (*.mat *.txt *.doc *.rtf)"));
+    QFile file1(f1);
+    std::vector<QString> transparameters;
+    QString line1;
 
-  int diff=0;
-  diff=zrot_sb->value()-zrot_slider->value();
-  this->SetTransform(0, 0, 0, 0, 0,diff,true);
-  zrot_slider->setValue(zrot_sb->value());
-  UpdateTextEditor(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix());
-}
-
-//------------------------------------------------------------------------------
-
-//------------------------------------------------------------------------------
-void vvToolRigidReg::UpdateZrotslider()
-{
-  int diff=0;
-  diff=zrot_slider->value()-zrot_sb->value();
-  this->SetTransform(0, 0, 0, 0, 0, diff,true);
-  zrot_sb->setValue(zrot_slider->value());
-  UpdateTextEditor(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix());
-}
-//------------------------------------------------------------------------------
+    for(int i =0;i<4;i++)
+      for(int j=0;j<4;j++)
+    transparameters.push_back(line1.setNum(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix()->Element[i][j]));
 
-//------------------------------------------------------------------------------
-void vvToolRigidReg::SaveFile()
-{      
-   QString s = QFileDialog::getSaveFileName(this, tr("Save File"),
-                            "/home",
-                            tr("Text (*.txt *.doc *.rtf)"));
-    QFile file(s);
-    if (file.open(QFile::WriteOnly | QFile::Truncate)) {
-    QTextStream out(&file);
-    out<<textEdit->toPlainText() ;
+    if (file1.open(QFile::WriteOnly | QFile::Truncate)) {
+    QTextStream out1(&file1);
+     for(int i =0;i<4;i++){
+      for(int j=0;j<4;j++) {
+      out1<<transparameters[i*4+j]+"\t";
+      }
+      out1<<"\n";
+     }
     }
+     else
+     {
+      QMessageBox::information(this,"Warning","Error Reading Parameters");
+     }
 }
 //------------------------------------------------------------------------------
 
 //------------------------------------------------------------------------------
-void vvToolRigidReg::ReadFile()
+void vvToolRigidReg::ReadFile(bool matrix_given)
 {
-  vtkMatrix4x4 *matrix=vtkMatrix4x4::New();
+   std::string x;
+   QString center;
+   double * orientations=new double[3];
+   double * translations=new double[3];
+   vtkMatrix4x4 *matrix=vtkMatrix4x4::New();
+   std::string transfile;
    vtkSmartPointer<vtkTransform> transform = mCurrentSlicerManager->GetImage()->GetTransform();
-   QString s = QFileDialog::getOpenFileName(
+   if(!matrix_given)
+   {
+   //Open File to read the transformation parameters
+   QString file1 = QFileDialog::getOpenFileName(
                     this,
-                    "Choose a file",
-                    "/home",
-                    "Text (*.txt *.rtf *.doc)");
-    if (s.isEmpty())
+                   "Choose the Transformation Parameters file",
+                    mMainWindow->GetInputPathName(),
+                    "Text (*.mat *.txt *.rtf *.doc)");
+    if (file1.isEmpty())
     return;
-    
-   QFile file(s);
-   ifstream readfile;
-   std::string x= s.toStdString();
-   std::vector<QString> Qstr;
-   readfile.open(x.c_str());
-   if (readfile.is_open()) 
+   QFile Qfile1(file1);
+  // ifstream readfile;
+   transfile= file1.toStdString();
+   }
+   else
    {
-    while (!readfile.eof())
-      {
-      readfile >> x;
-      Qstr.push_back(QString(x.c_str()));
-      }
-      readfile.close();
+    transfile=mArgsInfo.matrix_arg;
+    DD(transfile);
    }
-    else {
-      cout << "Unable to open file";
-    }
-    //Set the transformation matrix
-    int index =7;
-   for(int i=0;i<4;i++)
+   std::string filename1(transfile);
+   std::ifstream f1(filename1.c_str());
+   if(f1.is_open())
    {
-     for(int j=0;j<4;j++)
-     {
-       matrix->Element[i][j]=Qstr.at(index).toDouble();
-       index++;
-     }
+   f1.close();
+   itk::Matrix<double, 4, 4> itkMat = clitk::ReadMatrix3D(transfile);
+   for(int j=0; j<4; j++)
+      for(int i=0; i<4; i++)
+    matrix->SetElement(i,j,rint(itkMat[i][j]));
    }
-   transform->SetMatrix(matrix);
-   // SetTransform(matrix);
-    double * orientations=new double[3];
-    double * translations=new double[3];
+    UpdateTextEditor(matrix,textEdit);
+    transform->SetMatrix(matrix);
     transform->GetOrientation(orientations);
     transform->PostMultiply();
-    
-       //Obtain the Rotation Center 
-    Xval->setText(Qstr.at(2));
-    Yval->setText(Qstr.at(3));
-    Zval->setText(Qstr.at(4));
+
+     //Obtain the Rotation Center , set it to origin
+    Xval->setText(center.setNum(0));
+    Yval->setText(center.setNum(0));
+    Zval->setText(center.setNum(0));
+
     //In the Order or Y X Z //
-    //now  postmultiply for the rotations 
-     SetTransform(0,0,0,0,0,-orientations[2],false);
-     SetTransform(0,0,0,-orientations[0],0,0,false);
-     SetTransform(0,0,0,0,-orientations[1],0,false);
-      
+    //now  postmultiply for the rotations
+    SetTransform(0,0,0,0,0,-rint(orientations[2]),false);
+    SetTransform(0,0,0,-rint(orientations[0]),0,0,false);
+    SetTransform(0,0,0,0,-rint(orientations[1]),0,false);
+
     transform->GetPosition(translations);
-    transform->Identity();     
-  /*  DD(translations[0]/mInput1->GetImage()->GetSpacing()[0]);
+    transform->Identity();
+
+    DD(translations[0]/mInput1->GetImage()->GetSpacing()[0]);
     DD(translations[1]/mInput1->GetImage()->GetSpacing()[1]);
     DD(translations[2]/mInput1->GetImage()->GetSpacing()[2]);
+    DD(mInput1->GetImage()->GetSpacing()[0]);
+    DD(mInput1->GetImage()->GetSpacing()[1]);
+    DD(mInput1->GetImage()->GetSpacing()[2]);
     DD(orientations[0]);
     DD(orientations[1]);
-    DD(orientations[2]);*/
-  //set the sliders  and spin box values 
-    xtrans_slider->setValue(round(translations[0]/mInput1->GetImage()->GetSpacing()[0]));
-    UpdateXtranslider();
-    ytrans_slider->setValue(round(translations[1]/mInput1->GetImage()->GetSpacing()[1]));
-    UpdateYtranslider();       
-    ztrans_slider->setValue(round(translations[2]/mInput1->GetImage()->GetSpacing()[2]));
-    UpdateZtranslider();
-    yrot_slider->setValue(round(orientations[1]));
-    UpdateYrotslider();
-    xrot_slider->setValue(round(orientations[0]));
-    UpdateXrotslider();        
-    zrot_slider->setValue(round(orientations[2]));
-    UpdateZrotslider();
+    DD(orientations[2]);
+      //set the sliders  and spin box values
+    InitializeSliders(rint(translations[0]),rint(translations[1])
+    ,rint(translations[2]),rint(orientations[0]),rint(orientations[1]),rint(orientations[2]),true);
+    SetTransform(matrix);
 }
 //------------------------------------------------------------------------------
 
 //------------------------------------------------------------------------------
 void vvToolRigidReg::ResetTransform()
 {
-  vtkMatrix4x4 *matrix = vtkMatrix4x4::New();
-   matrix->Identity();
-   mInput1->Reload();
-   mInput1->Render();
-   mInput2->Reload();
-   mInput2->Render(); 
+  vtkSmartPointer<vtkTransform> transform = mCurrentSlicerManager->GetImage()->GetTransform();
+  transform->SetMatrix(mInitialMatrix);
+  transform->Update();
+  
+   Render();
    SetRotationCenter();
    SetSliderRanges();
-   SetTransform(matrix);
-   UpdateTextEditor(matrix);
+   UpdateTextEditor(transform->GetMatrix(),textEdit);
 }
 //------------------------------------------------------------------------------
 
@@ -576,7 +1234,7 @@ void vvToolRigidReg::SetRotationCenter()
     QString xcord,ycord,zcord;
     std::vector<double> imageorigin;
     imageorigin=mInput1->GetImage()->GetOrigin();
-    
+    DD("before bug");
     xcord=xcord.setNum(imageorigin[0]+mImageSize[0]*mInput1->GetImage()->GetSpacing()[0]/2, 'g', 3);
     ycord=ycord.setNum(imageorigin[1]+mImageSize[1]*mInput1->GetImage()->GetSpacing()[1]/2, 'g', 3);
     zcord=zcord.setNum(imageorigin[2]+mImageSize[2]*mInput1->GetImage()->GetSpacing()[2]/2, 'g', 3);
@@ -584,72 +1242,110 @@ void vvToolRigidReg::SetRotationCenter()
     Xval->setText(xcord);
     Yval->setText(ycord);
     Zval->setText(zcord);
-    InitializeSliders();
+    InitializeSliders(0,0,0,0,0,0,true);
 }
 //------------------------------------------------------------------------------
 
 //------------------------------------------------------------------------------
-void vvToolRigidReg::InitializeSliders()
+void vvToolRigidReg::InitializeSliders(double xtrans,double ytrans, double ztrans, double xrot, double yrot, double zrot,bool sliders)
 {
-     xtrans_slider->signalsBlocked();
-     ytrans_slider->signalsBlocked();
-     ztrans_slider->signalsBlocked();
-     xtrans_sb->signalsBlocked();
-     ytrans_sb->signalsBlocked();
-     ztrans_sb->signalsBlocked();
-     xrot_slider->signalsBlocked();
-     yrot_slider->signalsBlocked();
-     zrot_slider->signalsBlocked();
-     xrot_sb->signalsBlocked();
-     yrot_sb->signalsBlocked();
-     zrot_sb->signalsBlocked();
-     
-    xtrans_sb->setValue(0);
-    ytrans_sb->setValue(0);
-    ztrans_sb->setValue(0);
-    
-    xtrans_slider->setValue(0);
-    ytrans_slider->setValue(0);
-    ztrans_slider->setValue(0);
-    
-    xrot_sb->setValue(0);
-    yrot_sb->setValue(0);
-    zrot_sb->setValue(0);
 
-    xrot_slider->setValue(0);
-    yrot_slider->setValue(0);
-    zrot_slider->setValue(0);
+    xtrans_sb->blockSignals(true);
+    xtrans_sb->setSingleStep(mInput1->GetImage()->GetSpacing()[0]);
+    xtrans_sb->setValue(xtrans);
+    xtrans_sb->blockSignals(false);
+    ytrans_sb->blockSignals(true);
+    ytrans_sb->setSingleStep(mInput1->GetImage()->GetSpacing()[1]);
+    ytrans_sb->setValue(ytrans);
+    ytrans_sb->blockSignals(false);
+    ztrans_sb->blockSignals(true);
+    ztrans_sb->setSingleStep(mInput1->GetImage()->GetSpacing()[2]);
+    ztrans_sb->setValue(ztrans);
+    ztrans_sb->blockSignals(false);
+
+    if(sliders){
+    xtrans_slider->blockSignals(true);
+    xtrans_slider->setValue(rint(xtrans/mInput1->GetImage()->GetSpacing()[0]));
+    xtrans_slider->blockSignals(false);
+    ytrans_slider->blockSignals(true);
+    ytrans_slider->setValue(rint(ytrans/mInput1->GetImage()->GetSpacing()[1]));
+    ytrans_slider->blockSignals(false);
+    ztrans_slider->blockSignals(true);
+    ztrans_slider->setValue(rint(ztrans/mInput1->GetImage()->GetSpacing()[2]));
+    ztrans_slider->blockSignals(false);
+    }
+    xrot_sb->blockSignals(true);
+    xrot_sb->setValue(xrot);                                                                   
+    xrot_sb->blockSignals(false);
+    yrot_sb->blockSignals(true);
+    yrot_sb->setValue(yrot);
+    yrot_sb->blockSignals(false);
+    zrot_sb->blockSignals(true);
+    zrot_sb->setValue(zrot);
+    zrot_sb->blockSignals(false);
+    xrot_slider->blockSignals(true);
+    xrot_slider->setValue(xrot);
+    xrot_slider->blockSignals(false);
+    yrot_slider->blockSignals(true);
+    yrot_slider->setValue(yrot);
+    yrot_slider->blockSignals(false);
+    zrot_slider->blockSignals(true);
+    zrot_slider->setValue(zrot);
+    zrot_slider->blockSignals(false);
 }
 //------------------------------------------------------------------------------
 
 //------------------------------------------------------------------------------
 void vvToolRigidReg::SetSliderRanges()
 {
-  xtrans_slider->setMaximum(1000);
-  xtrans_slider->setMinimum(-1000);
-  ytrans_slider->setMaximum(1000);
-  ytrans_slider->setMinimum(-1000);
-  ztrans_slider->setMaximum(1000);
-  ztrans_slider->setMinimum(-1000);
-
-  xtrans_sb->setMaximum(1000);
-  xtrans_sb->setMinimum(-1000);
-  ytrans_sb->setMaximum(1000);
-  ytrans_sb->setMinimum(-1000);
-  ztrans_sb->setMaximum(1000);
-  ztrans_sb->setMinimum(-1000);
-
-  xrot_slider->setMaximum(360);
-  xrot_slider->setMinimum(-360);
-  yrot_slider->setMaximum(360);
-  yrot_slider->setMinimum(-360);
-  zrot_slider->setMaximum(360);
-  zrot_slider->setMinimum(-360);
-
-  xrot_sb->setMaximum(360);
-  xrot_sb->setMinimum(-360);
-  yrot_sb->setMaximum(360);
-  yrot_sb->setMinimum(-360);
-  zrot_sb->setMaximum(360);
-  zrot_sb->setMinimum(-360);
+  xtrans_slider->blockSignals(true);
+  xtrans_slider->setRange(-2000,2000);
+  xtrans_slider->blockSignals(false);
+
+  ytrans_slider->blockSignals(true);
+  ytrans_slider->setRange(-2000,2000);
+  ytrans_slider->blockSignals(false);
+
+  ztrans_slider->blockSignals(true);
+  ztrans_slider->setRange(-2000,2000);
+  ztrans_slider->blockSignals(false);
+
+  xtrans_sb->blockSignals(true);
+  xtrans_sb->setRange(-2000,2000);
+  xtrans_sb->setDecimals(3);
+  xtrans_sb->blockSignals(false);
+
+  ytrans_sb->blockSignals(true);
+  ytrans_sb->setRange(-2000,2000);
+  ytrans_sb->setDecimals(3);
+  ytrans_sb->blockSignals(false);
+
+  ztrans_sb->blockSignals(true);
+  ztrans_sb->setRange(-2000,2000);
+  ztrans_sb->setDecimals(3);
+  ztrans_sb->blockSignals(false);
+
+  xrot_slider->blockSignals(true);
+  xrot_slider->setRange(-360,360);
+  xrot_slider->blockSignals(false);
+
+  yrot_slider->blockSignals(true);
+  yrot_slider->setRange(-360,360);
+  yrot_slider->blockSignals(false);
+
+  zrot_slider->blockSignals(true);
+  zrot_slider->setRange(-360,360);
+  zrot_slider->blockSignals(false);
+
+  xrot_sb->blockSignals(true);
+  xrot_sb->setRange(-360,360);
+  xrot_sb->blockSignals(false);
+
+  yrot_sb->blockSignals(true);
+  yrot_sb->setRange(-360,360);
+  yrot_sb->blockSignals(false);
+
+  zrot_sb->blockSignals(true);
+  zrot_sb->setRange(-360,360);
+  zrot_sb->blockSignals(false);
 }