]> Creatis software - clitk.git/blob - vv/vvToolRigidReg.cxx
added presets and GUI's for AutoReg
[clitk.git] / vv / vvToolRigidReg.cxx
1 /*=========================================================================
2   Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
3
4   Authors belong to:
5   - University of LYON              http://www.universite-lyon.fr/
6   - Léon Bérard cancer center       http://oncora1.lyon.fnclcc.fr
7   - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
8
9   This software is distributed WITHOUT ANY WARRANTY; without even
10   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11   PURPOSE.  See the copyright notices for more information.
12
13   It is distributed under dual licence
14
15   - BSD        See included LICENSE.txt file
16   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ======================================================================-====*/
18
19 // vv
20 #include "vvToolRigidReg.h"
21 #include "vvImageReader.h"
22 #include "vvSlicer.h"
23
24 // vtk
25 #include <vtkImageData.h>
26 #include <vtkSmartPointer.h>
27 #include <vtkTransform.h>
28
29 // clitk
30 #include "clitkTransformUtilities.h"
31 #include "clitkAffineRegistrationGenericFilter.h"       
32 // qt
33 #include <QMessageBox>
34 #include <QFileDialog>
35 #include <QTextStream>
36 #include <QComboBox>
37 #include <QCursor>
38
39
40 //------------------------------------------------------------------------------
41 // Create the tool and automagically (I like this word) insert it in
42 // the main window menu.
43 ADD_TOOL(vvToolRigidReg);
44 //------------------------------------------------------------------------------
45
46 //------------------------------------------------------------------------------
47 vvToolRigidReg::vvToolRigidReg(vvMainWindowBase * parent, Qt::WindowFlags f):
48     vvToolWidgetBase(parent, f),
49     vvToolBase<vvToolRigidReg>(parent),
50     Ui::vvToolRigidReg()
51 {
52   // GUI Initialization
53   Ui_vvToolRigidReg::setupUi(mToolWidget);
54    // QSize qsize;
55 //    qsize.setHeight(470);
56 //    qsize.setWidth(850);
57 //    mToolWidget->setFixedSize(qsize);
58   // Set how many inputs are needed for this tool
59   mFilter = new clitk::AffineRegistrationGenericFilter;
60   cb_transform->hide();
61   cb_interpolator->hide();
62   cb_optimizer->hide();
63   cb_metric->hide();
64   cb_selectoutput->hide();
65   cb_presets->hide();
66   translabel->hide();
67   metriclabel->hide();
68   outputlabel->hide();
69   optimlabel->hide();
70   interpollabel->hide();
71   presetlabel->hide();
72   
73   // Set how many inputs are needed for this tool
74  AddInputSelector("Select moving image",mFilter);
75  AddInputSelector("Select fixed image",mFilter);
76 }
77 //------------------------------------------------------------------------------
78
79 //------------------------------------------------------------------------------
80 vvToolRigidReg::~vvToolRigidReg()
81 {
82 }
83 //------------------------------------------------------------------------------
84
85 //------------------------------------------------------------------------------
86 bool vvToolRigidReg::close()
87 {
88   ResetTransform();
89   RemoveOverlay();
90   return vvToolWidgetBase::close();
91 }
92 //------------------------------------------------------------------------------
93
94 //------------------------------------------------------------------------------
95 void vvToolRigidReg::reject()
96 {
97
98   return vvToolWidgetBase::reject();
99 }
100 //------------------------------------------------------------------------------
101
102 //------------------------------------------------------------------------------
103 void vvToolRigidReg::GetArgsInfoFromGUI()
104 {   
105   QFont font=QFont("Courier",10);
106   tab2textedit->setTextColor(QColor(255,0,0));
107   tab2textedit->setCurrentFont(font);
108   tab2textedit->update();
109    
110   QString file = QFileDialog::getOpenFileName(
111                     this,
112                     "Locate the Config File",
113                     mMainWindow->GetInputPathName(),
114                     "Text (*.conf *.txt *.rtf *.doc)");
115   
116   DD(file.toStdString());                   
117   if (file.isEmpty())
118   return;
119   
120   QFile Qfile1(file);
121   mConfigFile= file.toStdString();
122   CmdlineParser(1, 1);//1,1 - override, initialize
123   cb_transform->show();
124   cb_metric->show();
125   cb_interpolator->show();
126   cb_optimizer->show();
127   cb_selectoutput->show();
128   translabel->show();
129   metriclabel->show();
130   outputlabel->show();
131   optimlabel->show();
132   interpollabel->show();
133   cb_transform->setCurrentIndex(mArgsInfo.transform_arg);
134   cb_interpolator->setCurrentIndex(mArgsInfo.interp_arg);
135   cb_optimizer->setCurrentIndex(mArgsInfo.optimizer_arg);
136   cb_metric->setCurrentIndex(mArgsInfo.metric_arg);
137   DD(cb_transform->currentIndex());
138   DD(mArgsInfo.transform_arg);
139 }
140 //------------------------------------------------------------------------------
141
142 //------------------------------------------------------------------------------
143 void vvToolRigidReg::Presets()
144 {
145   mConfigFile="Presets";
146 if(cb_presets->currentIndex()==0)
147 {
148     mArgsInfo.reference_arg=new char;   
149     mArgsInfo.reference_given=0;
150     mArgsInfo.target_arg=new char;       
151     mArgsInfo.target_given=0;
152     mArgsInfo.output_arg=new char;       
153     mArgsInfo.referenceMask_arg=new char;        
154     mArgsInfo.targetMask_arg=new char;   
155     mArgsInfo.initMatrix_arg=new char;   
156     mArgsInfo.matrix_arg=new char;
157     mArgsInfo.referenceMask_given=0;     
158     mArgsInfo.reference_given=0;         
159     mArgsInfo.reference_arg=new char;    
160     mArgsInfo.target_given=0;    
161     mArgsInfo.target_arg=new char;       
162     mArgsInfo.output_given=0;    
163     mArgsInfo.output_arg=new char;       
164     mArgsInfo.checker_after_given=0;     
165     mArgsInfo.checker_before_given=0;    
166     mArgsInfo.after_given=0;     
167     mArgsInfo.before_given=0;    
168     mArgsInfo.threads_given=1;   
169     mArgsInfo.threads_arg=3;     
170     mArgsInfo.normalize_flag=0;          
171     mArgsInfo.blur_arg=0.0;      
172     mArgsInfo.referenceMask_arg=new char;        
173     mArgsInfo.targetMask_arg=new char;   
174     mArgsInfo.targetMask_given=0;        
175     mArgsInfo.levels_given=1;    
176     mArgsInfo.levels_arg=2;      
177     mArgsInfo.moment_flag=1;     
178     mArgsInfo.intThreshold_given=0;      
179     mArgsInfo.intThreshold_arg=0.0;      
180     mArgsInfo.transX_arg=0.0;    
181     mArgsInfo.transY_arg=0.0;    
182     mArgsInfo.transZ_arg=0.0;    
183     mArgsInfo.transform_arg=2;   
184     mArgsInfo.gradient_flag=1;   
185     mArgsInfo.interp_given=1;    
186     mArgsInfo.interp_arg=1;      
187     mArgsInfo.interpOrder_given=1;       
188     mArgsInfo.interpOrder_arg=3;         
189     mArgsInfo.interpSF_given=1;          
190     mArgsInfo.interpSF_arg=20;//default          
191     mArgsInfo.metric_given=1;    
192     mArgsInfo.metric_arg=0;      
193     mArgsInfo.samples_arg=1;//default    
194     mArgsInfo.stdDev_arg=0.4;    
195     mArgsInfo.step_arg=2.0;      
196     mArgsInfo.relax_arg=0.7;     
197     mArgsInfo.valueTol_arg=0.01;         
198     mArgsInfo.stepTol_arg=0.1;   
199     mArgsInfo.gradTol_arg=1e-5;          
200     mArgsInfo.lineAcc_arg=0.9;   
201     mArgsInfo.convFactor_arg=1e+12;      
202     mArgsInfo.maxIt_arg=500;     
203     mArgsInfo.maxLineIt_arg=50;          
204     mArgsInfo.maxEval_arg=500;   
205     mArgsInfo.maxCorr_arg=5;     
206     mArgsInfo.selectBound_arg=0;         
207     mArgsInfo.inc_arg=1.2;       
208     mArgsInfo.dec_arg=4;         
209     mArgsInfo.optimizer_arg=1;   
210     mArgsInfo.initMatrix_given=0;        
211     mArgsInfo.initMatrix_arg=new char;   
212     mArgsInfo.tWeight_given=1;   
213     mArgsInfo.tWeight_arg=1.0;   
214     mArgsInfo.rWeight_given=1.0;         
215     mArgsInfo.rWeight_arg=50.0;          
216     mArgsInfo.matrix_given=1;
217     mArgsInfo.matrix_arg="/home/bharath/bin/writematrix.txt";
218     UpdateTextEditor2();
219 }
220 else {
221   QMessageBox::information(this,"Sorry", "Other Presets are not available for the moment!");
222   return;
223  }
224 }
225 //------------------------------------------------------------------------------
226
227 //------------------------------------------------------------------------------
228 void vvToolRigidReg::UpdateTextEditor2()
229 {
230     QString str1,str2,str3;
231     QColor color;
232     tab2textedit->clear();
233     tab2textedit->setAcceptRichText(true);
234     str2=tab2textedit->toPlainText();
235     tab2textedit->setTextColor(QColor(255,0,0));
236     str2.append(str3.append("threads="+str1.setNum(mArgsInfo.threads_arg)));
237     tab2textedit->setText(str2);
238     str3.clear();
239     str1.clear();
240
241     str2=tab2textedit->toPlainText();
242     str2.append("\n");
243     tab2textedit->setText(str2);
244
245     str2=tab2textedit->toPlainText();
246     str2.append(str3.append("reference="+str1.append(mArgsInfo.reference_arg)));
247     tab2textedit->setText(str2);
248     str3.clear();
249     str1.clear();
250
251     str2=tab2textedit->toPlainText();
252     str2.append("\n");
253     tab2textedit->setText(str2);
254     
255     str2=tab2textedit->toPlainText();
256     str2.append(str3.append("target="+str1.append(mArgsInfo.target_arg)));
257     tab2textedit->setText(str2);
258     str3.clear();
259     str1.clear();
260
261     str2=tab2textedit->toPlainText();
262     str2.append("\n");
263     tab2textedit->setText(str2);
264     
265     str2=tab2textedit->toPlainText();
266     str2.append(str3.append("matrix="+str1.append(mArgsInfo.matrix_arg)));
267     tab2textedit->setText(str2);
268     str3.clear();
269     str1.clear();
270
271     str2=tab2textedit->toPlainText();
272     str2.append("\n");
273     tab2textedit->setText(str2);
274     
275     str2=tab2textedit->toPlainText();
276     str2.append(str3.append("interp="+str1.setNum(mArgsInfo.interp_arg)));
277     tab2textedit->setText(str2);
278     str3.clear();
279     str1.clear();
280
281     str2=tab2textedit->toPlainText();
282     str2.append("\n");
283     tab2textedit->setText(str2);
284     
285     str2=tab2textedit->toPlainText();
286     str2.append(str3.append("transform="+str1.setNum(mArgsInfo.transform_arg)));
287     tab2textedit->setText(str2);
288     str3.clear();
289     str1.clear();
290
291     str2=tab2textedit->toPlainText();
292     str2.append("\n");
293     tab2textedit->setText(str2);
294     
295     str2=tab2textedit->toPlainText();
296     str2.append(str3.append("transX="+str1.setNum(mArgsInfo.transX_arg)));
297     tab2textedit->setText(str2);
298     str3.clear();
299     str1.clear();
300
301     str2=tab2textedit->toPlainText();
302     str2.append("\n");
303     tab2textedit->setText(str2);
304     
305     str2=tab2textedit->toPlainText();
306     str2.append(str3.append("transY="+str1.setNum(mArgsInfo.transY_arg)));
307     tab2textedit->setText(str2);
308     str3.clear();
309     str1.clear();
310
311     str2=tab2textedit->toPlainText();
312     str2.append("\n");
313     tab2textedit->setText(str2);
314     
315     str2=tab2textedit->toPlainText();
316     str2.append(str3.append("transZ="+str1.setNum(mArgsInfo.transZ_arg)));
317     tab2textedit->setText(str2);
318     str3.clear();
319     str1.clear();
320
321     str2=tab2textedit->toPlainText();
322     str2.append("\n");
323     tab2textedit->setText(str2);
324     
325     str2=tab2textedit->toPlainText();
326     str2.append(str3.append("metric="+str1.setNum(mArgsInfo.metric_arg)));
327     tab2textedit->setText(str2);
328     str3.clear();
329     str1.clear();
330
331     str2=tab2textedit->toPlainText();
332     str2.append("\n");
333     tab2textedit->setText(str2);
334     
335     str2=tab2textedit->toPlainText();
336     str2.append(str3.append("samples="+str1.setNum(mArgsInfo.samples_arg)));
337     tab2textedit->setText(str2);
338     str3.clear();
339     str1.clear();
340
341     str2=tab2textedit->toPlainText();
342     str2.append("\n");
343     tab2textedit->setText(str2);
344     
345     str2=tab2textedit->toPlainText();
346     str2.append(str3.append("intThreshold="+str1.setNum(mArgsInfo.intThreshold_arg)));
347     tab2textedit->setText(str2);
348     str3.clear();
349     str1.clear();
350
351     str2=tab2textedit->toPlainText();
352     str2.append("\n");
353     tab2textedit->setText(str2);
354     
355     str2=tab2textedit->toPlainText();
356     str2.append(str3.append("stdDev="+str1.setNum(mArgsInfo.stdDev_arg)));
357     tab2textedit->setText(str2);
358     str3.clear();
359     str1.clear();
360
361     str2=tab2textedit->toPlainText();
362     str2.append("\n");
363     tab2textedit->setText(str2);
364     
365     
366     str2=tab2textedit->toPlainText();
367     str2.append(str3.append("blur="+str1.setNum(mArgsInfo.blur_arg)));
368     tab2textedit->setText(str2);
369     str3.clear();
370     str1.clear();
371
372     str2=tab2textedit->toPlainText();
373     str2.append("\n");
374     tab2textedit->setText(str2);
375     
376     
377     str2=tab2textedit->toPlainText();
378     str2.append(str3.append("optimizer="+str1.setNum(mArgsInfo.optimizer_arg)));
379     tab2textedit->setText(str2);
380     str3.clear();
381     str1.clear();
382
383     str2=tab2textedit->toPlainText();
384     str2.append("\n");
385     tab2textedit->setText(str2);
386     
387     
388     str2=tab2textedit->toPlainText();
389     str2.append(str3.append("step="+str1.setNum(mArgsInfo.step_arg)));
390     tab2textedit->setText(str2);
391     str3.clear();
392     str1.clear();
393
394     str2=tab2textedit->toPlainText();
395     str2.append("\n");
396     tab2textedit->setText(str2);
397     
398     
399     str2=tab2textedit->toPlainText();
400     str2.append(str3.append("relax="+str1.setNum(mArgsInfo.relax_arg)));
401     tab2textedit->setText(str2);
402     str3.clear();
403     str1.clear();
404
405     str2=tab2textedit->toPlainText();
406     str2.append("\n");
407     tab2textedit->setText(str2);
408     
409     str2=tab2textedit->toPlainText();
410     str2.append(str3.append("valueTol="+str1.setNum(mArgsInfo.valueTol_arg)));
411     tab2textedit->setText(str2);
412     str3.clear();
413     str1.clear();
414     
415     str2=tab2textedit->toPlainText();
416     str2.append("\n");
417     tab2textedit->setText(str2);
418     
419     str2=tab2textedit->toPlainText();
420     str2.append(str3.append("stepTol="+str1.setNum(mArgsInfo.stepTol_arg)));
421     tab2textedit->setText(str2);
422     str3.clear();
423     str1.clear();
424
425     str2=tab2textedit->toPlainText();
426     str2.append("\n");
427     tab2textedit->setText(str2);
428     
429     
430     str2=tab2textedit->toPlainText();
431     str2.append(str3.append("gradTol="+str1.setNum(mArgsInfo.gradTol_arg)));
432     tab2textedit->setText(str2);
433     str3.clear();
434     str1.clear();
435
436     str2=tab2textedit->toPlainText();
437     str2.append("\n");
438     tab2textedit->setText(str2);
439     
440     str2=tab2textedit->toPlainText();
441     str2.append(str3.append("lineAcc="+str1.setNum(mArgsInfo.lineAcc_arg)));
442     tab2textedit->setText(str2);
443     str3.clear();
444     str1.clear();
445
446     str2=tab2textedit->toPlainText();
447     str2.append("\n");
448     tab2textedit->setText(str2);
449     str2=tab2textedit->toPlainText();
450     str2.append(str3.append("convFactor="+str1.setNum(mArgsInfo.convFactor_arg)));
451     tab2textedit->setText(str2);
452     str3.clear();
453     str1.clear();
454
455     str2=tab2textedit->toPlainText();
456     str2.append("\n");
457     tab2textedit->setText(str2);
458     
459     str2=tab2textedit->toPlainText();
460     str2.append(str3.append("maxIt="+str1.setNum(mArgsInfo.maxIt_arg)));
461     tab2textedit->setText(str2);
462     str3.clear();
463     str1.clear();
464  
465     str2=tab2textedit->toPlainText();
466     str2.append("\n");
467     tab2textedit->setText(str2);
468     
469     str2=tab2textedit->toPlainText();
470     str2.append(str3.append("maxLineIt="+str1.setNum(mArgsInfo.maxLineIt_arg)));
471     tab2textedit->setText(str2);
472     str3.clear();
473     str1.clear();
474
475     str2=tab2textedit->toPlainText();
476     str2.append("\n");
477     tab2textedit->setText(str2);
478     
479     str2=tab2textedit->toPlainText();
480     str2.append(str3.append("maxEval="+str1.setNum(mArgsInfo.maxEval_arg)));
481     tab2textedit->setText(str2);
482     str3.clear();
483     str1.clear();
484
485     str2=tab2textedit->toPlainText();
486     str2.append("\n");
487     tab2textedit->setText(str2);
488     
489       str2=tab2textedit->toPlainText();
490     str2.append(str3.append("maxCorr="+str1.setNum(mArgsInfo.maxCorr_arg)));
491     tab2textedit->setText(str2);
492     str3.clear();
493     str1.clear();
494
495     str2=tab2textedit->toPlainText();
496     str2.append("\n");
497     tab2textedit->setText(str2);
498     
499       str2=tab2textedit->toPlainText();
500     str2.append(str3.append("selectBound="+str1.setNum(mArgsInfo.selectBound_arg)));
501     tab2textedit->setText(str2);
502     str3.clear();
503     str1.clear();
504
505     str2=tab2textedit->toPlainText();
506     str2.append("\n");
507     tab2textedit->setText(str2);
508     
509       str2=tab2textedit->toPlainText();
510     str2.append(str3.append("rWeight="+str1.setNum(mArgsInfo.rWeight_arg)));
511     tab2textedit->setText(str2);
512     str3.clear();
513     str1.clear();
514
515     str2=tab2textedit->toPlainText();
516     str2.append("\n");
517     tab2textedit->setText(str2);
518     
519       str2=tab2textedit->toPlainText();
520     str2.append(str3.append("tWeight="+str1.setNum(mArgsInfo.tWeight_arg)));
521     tab2textedit->setText(str2);
522     str3.clear();
523     str1.clear();
524
525     str2=tab2textedit->toPlainText();
526     str2.append("\n");
527     tab2textedit->setText(str2);
528     
529       str2=tab2textedit->toPlainText();
530     str2.append(str3.append("levels="+str1.setNum(mArgsInfo.levels_arg)));
531     tab2textedit->setText(str2);
532     str3.clear();
533     str1.clear();
534
535     str2=tab2textedit->toPlainText();
536     str2.append("\n");
537     tab2textedit->setText(str2);
538     
539       str2=tab2textedit->toPlainText();
540     str2.append(str3.append("inc="+str1.setNum(mArgsInfo.inc_arg)));
541     tab2textedit->setText(str2);
542     str3.clear();
543     str1.clear();
544
545     str2=tab2textedit->toPlainText();
546     str2.append("\n");
547     tab2textedit->setText(str2);
548     
549       str2=tab2textedit->toPlainText();
550     str2.append(str3.append("dec="+str1.setNum(mArgsInfo.dec_arg)));
551     tab2textedit->setText(str2);
552     str3.clear();
553     str1.clear();
554
555     str2=tab2textedit->toPlainText();
556     str2.append("\n");
557     tab2textedit->setText(str2);
558 }
559 //------------------------------------------------------------------------------
560
561 //------------------------------------------------------------------------------
562 void vvToolRigidReg::TransformSelect()
563 {
564    mArgsInfo.transform_arg=cb_transform->currentIndex();
565    UpdateTextEditor2();
566 }
567 //------------------------------------------------------------------------------
568   
569 //------------------------------------------------------------------------------
570 void vvToolRigidReg::CmdlineParser(int override, int initialize)
571 {
572    //0 opened, 1 not opened fine
573    int opened=cmdline_parser_clitkAffineRegistration_configfile(const_cast<char*>(mConfigFile.c_str()),&mArgsInfo,override,initialize,1);
574    DD(opened);
575    mArgsInfo.gradient_flag=1;
576    QString str;
577    //Read the transformation parameters from the  path in the config file(mArgsInfo.matrix_arg) and display it on the TextBox 2
578    ifstream readfile;
579    std::vector<QString> Qstr;
580    
581    if(!opened){
582    readfile.open(mConfigFile.c_str());
583    }
584    else{
585    QMessageBox::information(this,"Warning","Load the Config File First..");
586    }
587    if (readfile.is_open()) 
588    { 
589     while (!readfile.eof())
590       {
591       readfile >> mConfigFile;
592       Qstr.push_back(QString(mConfigFile.c_str()));
593       }
594       readfile.close();
595    }
596     else {
597       QMessageBox::information(this,"Warning","Cannot Open File!");
598       return;
599     }
600      for(unsigned int i=0;i<Qstr.size()-1;i++)
601       {
602     str=tab2textedit->toPlainText();
603     str.append(Qstr.at(i));
604     tab2textedit->setText(str);
605     str.append("\n");
606     tab2textedit->setText(str);
607       }
608 }
609 //------------------------------------------------------------------------------
610
611 //------------------------------------------------------------------------------
612 void vvToolRigidReg::OptimizerSelect()
613 {
614  mArgsInfo.optimizer_arg=cb_optimizer->currentIndex();
615   UpdateTextEditor2();
616  
617 }
618 //------------------------------------------------------------------------------
619
620 //------------------------------------------------------------------------------
621 void vvToolRigidReg::InterpolatorSelect()
622 {
623  mArgsInfo.interp_arg=cb_interpolator->currentIndex();
624  UpdateTextEditor2();
625 }
626 //------------------------------------------------------------------------------
627
628 //------------------------------------------------------------------------------
629 void vvToolRigidReg::MetricSelect()
630 {
631  mArgsInfo.metric_arg=cb_metric->currentIndex();
632  UpdateTextEditor2();
633 }
634 //------------------------------------------------------------------------------
635
636 //------------------------------------------------------------------------------
637 void vvToolRigidReg::OutputSelect()
638 {
639  
640 }
641 //------------------------------------------------------------------------------
642
643 //------------------------------------------------------------------------------
644 void vvToolRigidReg::SaveTextEdit()
645 {
646      DD(mArgsInfo.transform_arg);
647    QString f1 = QFileDialog::getSaveFileName(this, tr("Save Config File"),
648                                               mMainWindow->GetInputPathName(),
649                                               tr("Text (*.mat *.txt *.doc *.rtf)"));
650    QFile file(f1);                                    
651    if(file.open(QFile::WriteOnly | QFile::Truncate) & !mConfigFile.empty() ){
652    QTextStream stream( &file );
653    stream << tab2textedit->toPlainText();
654      }
655     else
656      {
657       QMessageBox::information(this,"Warning","Nothing to Save!");
658       return;
659      }
660    tab2textedit->clear();
661    DD(mArgsInfo.transform_arg);
662 }
663 //------------------------------------------------------------------------------
664
665 //------------------------------------------------------------------------------
666 void vvToolRigidReg::InputIsSelected(std::vector<vvSlicerManager *> & l)
667 {
668   //inputs
669   mInput1 = l[0];
670   mInput2 = l[1];
671   UpdateTextEditor(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix(),textEdit_2);
672
673   DD(*mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix());
674   for(int i =0;i<4;i++)
675   {
676     for(int j=0;j<4;j++)
677     {
678       mInitialMatrix[i*4+j]=mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix()->GetElement(i,j);
679     }
680   }
681
682   if(mInput1->GetFileName()==mInput2->GetFileName())
683   {
684     QMessageBox::information(this, "Warning","Your Reference and Target Images are the same");
685   }
686   mTwoInputs = true;
687   SetOverlay(mInput2->GetImage());
688   mImageSize=mInput1->GetImage()->GetSize();
689   SetRotationCenter();
690   SetSliderRanges();
691
692     //connect all sigs to slots
693    connect(resetbutton, SIGNAL(pressed()), this, SLOT(ResetTransform()));
694    connect(tab2loadbutton, SIGNAL(pressed()), this, SLOT(GetArgsInfoFromGUI()));
695    connect(tab2applybutton, SIGNAL(pressed()), this, SLOT(AutoRegister()));
696
697
698    connect(Xval, SIGNAL(editingFinished()), this, SLOT(SetXvalue()));
699    connect(Yval, SIGNAL(editingFinished()), this, SLOT(SetYvalue()));
700    connect(Zval, SIGNAL(editingFinished()), this, SLOT(SetZvalue()));
701
702    connect(xtrans_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateTransform_sliders()));
703    connect(ytrans_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateTransform_sliders()));
704    connect(ztrans_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateTransform_sliders()));
705
706
707    connect(xrot_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateTransform_sliders()));
708    connect(yrot_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateTransform_sliders()));
709    connect(zrot_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateTransform_sliders()));
710
711    connect(xtrans_sb, SIGNAL(valueChanged(double)), this, SLOT(UpdateTransform_sb()));
712    connect(ytrans_sb, SIGNAL(valueChanged(double)), this, SLOT(UpdateTransform_sb()));
713    connect(ztrans_sb, SIGNAL(valueChanged(double)), this, SLOT(UpdateTransform_sb()));
714    connect(xrot_sb, SIGNAL(valueChanged(double)), this, SLOT(UpdateTransform_sb()));
715    connect(yrot_sb, SIGNAL(valueChanged(double)), this, SLOT(UpdateTransform_sb()));
716    connect(zrot_sb, SIGNAL(valueChanged(double)), this, SLOT(UpdateTransform_sb()));
717    
718    connect(loadbutton, SIGNAL(pressed()), this, SLOT(LoadFile()));
719    connect(savebutton, SIGNAL(pressed()), this, SLOT(SaveFile()));
720    
721    connect(cb_presets, SIGNAL(activated(int)), this, SLOT(Presets()));
722    connect(cb_transform, SIGNAL(activated(int)), this, SLOT(TransformSelect()));
723    connect(cb_optimizer, SIGNAL(activated(int)), this, SLOT(OptimizerSelect()));
724    connect(cb_interpolator, SIGNAL(activated(int)), this, SLOT(InterpolatorSelect()));
725    connect(cb_metric, SIGNAL(activated(int)), this, SLOT(MetricSelect()));
726    connect(cb_selectoutput, SIGNAL(activated(int)), this, SLOT(OutputSelect()));
727    connect(tab2savebutton, SIGNAL(pressed()), this, SLOT(SaveTextEdit()));
728    
729 }
730 //------------------------------------------------------------------------------
731
732 //------------------------------------------------------------------------------
733 void vvToolRigidReg::apply()
734 {
735   RemoveOverlay();
736 }
737 //------------------------------------------------------------------------------
738
739 //------------------------------------------------------------------------------
740 void vvToolRigidReg::SetOverlay(vvImage::Pointer Image)
741 {
742     for (int i =0; i<mCurrentSlicerManager->NumberOfSlicers(); i++) {
743    mCurrentSlicerManager->GetSlicer(i)->SetOverlay(Image);
744    mCurrentSlicerManager->GetSlicer(i)->SetActorVisibility("overlay",0,true);
745    mCurrentSlicerManager->SetColorMap();
746    mCurrentSlicerManager->Render();
747    }
748   }
749 //------------------------------------------------------------------------------
750
751 //------------------------------------------------------------------------------
752 void vvToolRigidReg::RemoveOverlay()
753 {
754    for(int i=0;i<mCurrentSlicerManager->NumberOfSlicers();i++)
755          {
756            mInput1->RemoveActor("overlay",0);
757            mInput1->SetColorMap(0);
758            mInput1->Render();
759            hide();
760          }
761 }
762 //------------------------------------------------------------------------------
763
764 //------------------------------------------------------------------------------
765 void vvToolRigidReg::SetXvalue()
766 {
767   QString xstr = Xval->text();
768 }
769 //------------------------------------------------------------------------------
770
771 //------------------------------------------------------------------------------
772 void vvToolRigidReg::SetYvalue()
773 {
774   QString ystr = Yval->text();
775 }
776 //------------------------------------------------------------------------------
777
778 //------------------------------------------------------------------------------
779 void vvToolRigidReg::SetZvalue()
780 {
781   QString zstr = Zval->text();
782 }
783 //------------------------------------------------------------------------------
784
785 //------------------------------------------------------------------------------
786 void vvToolRigidReg::SetTransform(double tX, double tY, double tZ, double aX, double aY, double aZ,bool update)
787 {
788   vtkSmartPointer<vtkTransform> transform = mInput1->GetImage()->GetTransform();
789   transform->PostMultiply();
790   //Rotations
791   if (aX!=0 || aY!=0 || aZ!=0) {
792     double x, y ,z;
793     x= Xval->text().toDouble();
794     y= Yval->text().toDouble();
795     z= Zval->text().toDouble();
796     transform->Translate(-x,-y,-z);
797     if (aX!=0) transform->RotateX(aX);
798     if (aY!=0) transform->RotateY(aY);
799     if (aZ!=0) transform->RotateZ(aZ);
800     transform->Translate(x,y,z);
801   }
802   //Translations
803   if (tX!=0||tY!=0||tZ!=0)
804     transform->Translate(tX*mInput1->GetImage()->GetSpacing()[0],tY*mInput1->GetImage()->GetSpacing()[1],tZ*mInput1->GetImage()->GetSpacing()[2]);
805 }
806 //------------------------------------------------------------------------------
807
808 //------------------------------------------------------------------------------
809 void vvToolRigidReg::SetTransform(vtkMatrix4x4 *matrix)
810 {
811    vtkSmartPointer<vtkTransform> transform=vtkSmartPointer<vtkTransform>::New();
812     for(int i=0; i<4;i++)
813       for(int j=0;j<4;j++)
814     mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix()->SetElement(i,j,matrix->GetElement(i,j));
815     
816     Render();
817 }
818 //------------------------------------------------------------------------------
819
820 //------------------------------------------------------------------------------
821 void vvToolRigidReg::LoadFile()
822 {
823   ReadFile(false);
824 }
825 //------------------------------------------------------------------------------
826   
827 //------------------------------------------------------------------------------
828 void vvToolRigidReg::Render()
829 {
830   for (int i=0; i<mCurrentSlicerManager->NumberOfSlicers(); i++) {
831        mCurrentSlicerManager->GetSlicer(i)->ForceUpdateDisplayExtent();
832        mCurrentSlicerManager->GetSlicer(i)->Render();
833       }
834 }
835 //------------------------------------------------------------------------------
836
837 //------------------------------------------------------------------------------
838   void vvToolRigidReg::UpdateTextEditor(vtkMatrix4x4 *matrix,QTextEdit* textEdit)
839 {
840     QFont font=QFont("Courier",11);
841     textEdit->setCurrentFont(font);
842     textEdit->update();
843
844     QString str1,str2,str3;
845     QColor color;
846     textEdit->clear();
847     textEdit->setAcceptRichText(true);
848     str2=textEdit->toPlainText();
849     str2.append("#Rotation Center(mm): \n#");
850     textEdit->setText(str2);
851
852     str2=textEdit->toPlainText();
853     textEdit->setTextColor(QColor(255,0,0));
854     str2.append(str3.append(Xval->text()));
855     textEdit->setText(str2);
856     str3.clear();
857
858     str2=textEdit->toPlainText();
859     str2.append("\t");
860     textEdit->setText(str2);
861
862     str2=textEdit->toPlainText();
863     str2.append(str3.append(Yval->text()));
864     textEdit->setText(str2);
865     str3.clear();
866
867     str2=textEdit->toPlainText();
868     str2.append("\t");
869     textEdit->setText(str2);
870
871
872     str2=textEdit->toPlainText();
873     str2.append(str3.append(Zval->text()));
874     textEdit->setText(str2);
875
876
877     str2=textEdit->toPlainText();
878     str2.append("\n");
879     textEdit->setText(str2);
880
881
882     str2=textEdit->toPlainText();
883     str2.append("#Transformation Matrix(mm):\n");
884     textEdit->setText(str2);
885     for(int i=0;i<4;i++)
886     {
887     for(int j=0;j<4;j++)
888       {
889     str2=textEdit->toPlainText();
890    // str2.append("\t"+str1.setNum(matrix->Element[i][j]));
891     str2.append(QString("%1\t").arg(str1.setNum(matrix->Element[i][j]),2));
892     textEdit->setText(str2);
893       }
894     str2=textEdit->toPlainText();
895     str2.append("\n");
896     textEdit->setText(str2);
897     }
898     //QString str = QFileDialog::getOpenFileName();
899     textEdit->setTextColor(QColor(255,0,0));
900     textEdit->setFont(QFont("courrier new",12,4,true));
901     textEdit->toPlainText().toAscii();
902
903     str2=textEdit->toPlainText();
904     textEdit->setText(str2);
905 }
906 //------------------------------------------------------------------------------
907
908 //------------------------------------------------------------------------------
909 void vvToolRigidReg::UpdateTransform_sliders()
910 {
911        InitializeSliders(xtrans_slider->value()*mInput1->GetImage()->GetSpacing()[0],
912                          ytrans_slider->value()*mInput1->GetImage()->GetSpacing()[1],
913                          ztrans_slider->value()*mInput1->GetImage()->GetSpacing()[2],
914                         xrot_slider->value(),yrot_slider->value(),zrot_slider->value(),false);
915         UpdateTransform(true);
916         Render();
917 }
918 //------------------------------------------------------------------------------
919
920 //------------------------------------------------------------------------------
921 void vvToolRigidReg::UpdateTransform_sb()
922 {
923    InitializeSliders(xtrans_sb->value(),
924       ytrans_sb->value(),
925       ztrans_sb->value(),
926                         xrot_sb->value(),yrot_sb->value(),zrot_sb->value(),false);
927       UpdateTransform(false);
928       Render();
929 }
930 //------------------------------------------------------------------------------
931
932 //------------------------------------------------------------------------------
933 void vvToolRigidReg::AutoRegister()
934
935     if (!mCurrentSlicerManager) close();
936     
937     if(!mConfigFile.empty()){
938     std::vector<vvImage::Pointer> inputs;
939     // Input
940     inputs.push_back(mInput1->GetImage());
941     inputs.push_back(mInput2->GetImage());
942     // Check input type
943     // Main filter
944     clitk::AffineRegistrationGenericFilter::Pointer filter =
945     clitk::AffineRegistrationGenericFilter::New();
946     filter->SetInputVVImages(inputs);
947     filter->SetArgsInfo(mArgsInfo);
948     DD("ArgsInfo given in");
949     filter->EnableReadOnDisk(false);
950     filter->Update();
951     vvImage::Pointer output = filter->GetOutputVVImage();
952     //osstream << "Registered" << "_ "
953       //     << mCurrentSlicerManager->GetSlicer(0)->GetFileName() << ".mhd";
954     //AddImage(output,osstream.str());
955     QApplication::restoreOverrideCursor();
956     ReadFile(true);
957     }
958     else
959     {
960       QMessageBox::information(this, "Warning","Load the Config File First!...");
961       return;
962     }
963 }
964 //------------------------------------------------------------------------------
965
966 //------------------------------------------------------------------------------
967 void vvToolRigidReg::UpdateTransform(bool slider_enabled)
968 {
969      vtkSmartPointer<vtkTransform> transform_final=mInput1->GetImage()->GetTransform();
970      transform_final->SetMatrix(mInitialMatrix);
971      transform_final->PostMultiply();
972   //Rotations
973     double x=0, y=0 ,z=0;
974     x= Xval->text().toDouble();
975     y= Yval->text().toDouble();
976     z= Zval->text().toDouble();
977     transform_final->Translate(-x,-y,-z);
978     if(slider_enabled){
979     transform_final->RotateY(yrot_slider->value());
980     transform_final->RotateX(xrot_slider->value());
981     transform_final->RotateZ(zrot_slider->value());
982     }
983     else{
984     transform_final->RotateY(yrot_sb->value());
985     transform_final->RotateX(xrot_sb->value());
986     transform_final->RotateZ(zrot_sb->value());
987     }
988     transform_final->Translate(x,y,z);
989     transform_final->PreMultiply();
990     if(slider_enabled){
991     transform_final->Translate(xtrans_slider->value()*mInput1->GetImage()->GetSpacing()[0],0,0);
992     transform_final->Translate(0,ytrans_slider->value()*mInput1->GetImage()->GetSpacing()[1],0);
993     transform_final->Translate(0,0,ztrans_slider->value()*mInput1->GetImage()->GetSpacing()[2]);
994     }
995     else{
996     transform_final->Translate(xtrans_sb->value(),0,0);
997     transform_final->Translate(0,ytrans_sb->value(),0);
998     transform_final->Translate(0,0,ztrans_sb->value());
999     }
1000     transform_final->Update();
1001     Render();
1002     UpdateTextEditor(transform_final->GetMatrix(),textEdit);
1003 }
1004 //------------------------------------------------------------------------------
1005
1006
1007 //------------------------------------------------------------------------------
1008 void vvToolRigidReg::SaveFile()
1009 {
1010   //Write the Transformation Matrix
1011     QString f1 = QFileDialog::getSaveFileName(this, tr("Save Transformation Matrix File"),
1012                                               mMainWindow->GetInputPathName(),
1013                                               tr("Text (*.mat *.txt *.doc *.rtf)"));
1014     QFile file1(f1);
1015     std::vector<QString> transparameters;
1016     QString line1;
1017
1018     for(int i =0;i<4;i++)
1019       for(int j=0;j<4;j++)
1020     transparameters.push_back(line1.setNum(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix()->Element[i][j]));
1021
1022     if (file1.open(QFile::WriteOnly | QFile::Truncate)) {
1023     QTextStream out1(&file1);
1024      for(int i =0;i<4;i++){
1025       for(int j=0;j<4;j++) {
1026       out1<<transparameters[i*4+j]+"\t";
1027       }
1028       out1<<"\n";
1029      }
1030     }
1031      else
1032      {
1033       QMessageBox::information(this,"Warning","Error Reading Parameters");
1034      }
1035 }
1036 //------------------------------------------------------------------------------
1037
1038 //------------------------------------------------------------------------------
1039 void vvToolRigidReg::ReadFile(bool matrix_given)
1040 {
1041    std::string x;
1042    QString center;
1043    double * orientations=new double[3];
1044    double * translations=new double[3];
1045    vtkMatrix4x4 *matrix=vtkMatrix4x4::New();
1046    std::string transfile;
1047    vtkSmartPointer<vtkTransform> transform = mCurrentSlicerManager->GetImage()->GetTransform();
1048    if(!matrix_given)
1049    {
1050    //Open File to read the transformation parameters
1051    QString file1 = QFileDialog::getOpenFileName(
1052                     this,
1053                     "Choose the Transformation Parameters file",
1054                     mMainWindow->GetInputPathName(),
1055                     "Text (*.mat *.txt *.rtf *.doc)");
1056     if (file1.isEmpty())
1057     return;
1058    QFile Qfile1(file1);
1059   // ifstream readfile;
1060    transfile= file1.toStdString();
1061    }
1062    else
1063    {
1064     transfile=mArgsInfo.matrix_arg;
1065     DD(transfile);
1066    }
1067    std::string filename1(transfile);
1068    std::ifstream f1(filename1.c_str());
1069    if(f1.is_open())
1070    {
1071    f1.close();
1072    itk::Matrix<double, 4, 4> itkMat = clitk::ReadMatrix3D(transfile);
1073    for(int j=0; j<4; j++)
1074       for(int i=0; i<4; i++)
1075     matrix->SetElement(i,j,rint(itkMat[i][j]));
1076    }
1077     UpdateTextEditor(matrix,textEdit);
1078     transform->SetMatrix(matrix);
1079     transform->GetOrientation(orientations);
1080     transform->PostMultiply();
1081
1082      //Obtain the Rotation Center , set it to origin
1083     Xval->setText(center.setNum(0));
1084     Yval->setText(center.setNum(0));
1085     Zval->setText(center.setNum(0));
1086
1087     //In the Order or Y X Z //
1088     //now  postmultiply for the rotations
1089     SetTransform(0,0,0,0,0,-rint(orientations[2]),false);
1090     SetTransform(0,0,0,-rint(orientations[0]),0,0,false);
1091     SetTransform(0,0,0,0,-rint(orientations[1]),0,false);
1092
1093     transform->GetPosition(translations);
1094     transform->Identity();
1095
1096     DD(translations[0]/mInput1->GetImage()->GetSpacing()[0]);
1097     DD(translations[1]/mInput1->GetImage()->GetSpacing()[1]);
1098     DD(translations[2]/mInput1->GetImage()->GetSpacing()[2]);
1099     DD(mInput1->GetImage()->GetSpacing()[0]);
1100     DD(mInput1->GetImage()->GetSpacing()[1]);
1101     DD(mInput1->GetImage()->GetSpacing()[2]);
1102     DD(orientations[0]);
1103     DD(orientations[1]);
1104     DD(orientations[2]);
1105       //set the sliders  and spin box values
1106     InitializeSliders(rint(translations[0]),rint(translations[1])
1107     ,rint(translations[2]),rint(orientations[0]),rint(orientations[1]),rint(orientations[2]),true);
1108     SetTransform(matrix);
1109 }
1110 //------------------------------------------------------------------------------
1111
1112 //------------------------------------------------------------------------------
1113 void vvToolRigidReg::ResetTransform()
1114 {
1115   vtkSmartPointer<vtkTransform> transform = mCurrentSlicerManager->GetImage()->GetTransform();
1116   transform->SetMatrix(mInitialMatrix);
1117   transform->Update();
1118   
1119    Render();
1120    SetRotationCenter();
1121    SetSliderRanges();
1122    UpdateTextEditor(transform->GetMatrix(),textEdit);
1123 }
1124 //------------------------------------------------------------------------------
1125
1126 //------------------------------------------------------------------------------
1127 void vvToolRigidReg::SetRotationCenter()
1128 {
1129     //default image rotation center is the center of the image
1130     QString xcord,ycord,zcord;
1131     std::vector<double> imageorigin;
1132     imageorigin=mInput1->GetImage()->GetOrigin();
1133     DD("before bug");
1134     xcord=xcord.setNum(imageorigin[0]+mImageSize[0]*mInput1->GetImage()->GetSpacing()[0]/2, 'g', 3);
1135     ycord=ycord.setNum(imageorigin[1]+mImageSize[1]*mInput1->GetImage()->GetSpacing()[1]/2, 'g', 3);
1136     zcord=zcord.setNum(imageorigin[2]+mImageSize[2]*mInput1->GetImage()->GetSpacing()[2]/2, 'g', 3);
1137
1138     Xval->setText(xcord);
1139     Yval->setText(ycord);
1140     Zval->setText(zcord);
1141     InitializeSliders(0,0,0,0,0,0,true);
1142 }
1143 //------------------------------------------------------------------------------
1144
1145 //------------------------------------------------------------------------------
1146 void vvToolRigidReg::InitializeSliders(double xtrans,double ytrans, double ztrans, double xrot, double yrot, double zrot,bool sliders)
1147 {
1148
1149     xtrans_sb->blockSignals(true);
1150     xtrans_sb->setSingleStep(mInput1->GetImage()->GetSpacing()[0]);
1151     xtrans_sb->setValue(xtrans);
1152     xtrans_sb->blockSignals(false);
1153     ytrans_sb->blockSignals(true);
1154     ytrans_sb->setSingleStep(mInput1->GetImage()->GetSpacing()[1]);
1155     ytrans_sb->setValue(ytrans);
1156     ytrans_sb->blockSignals(false);
1157     ztrans_sb->blockSignals(true);
1158     ztrans_sb->setSingleStep(mInput1->GetImage()->GetSpacing()[2]);
1159     ztrans_sb->setValue(ztrans);
1160     ztrans_sb->blockSignals(false);
1161
1162     if(sliders){
1163     xtrans_slider->blockSignals(true);
1164     xtrans_slider->setValue(rint(xtrans/mInput1->GetImage()->GetSpacing()[0]));
1165     xtrans_slider->blockSignals(false);
1166     ytrans_slider->blockSignals(true);
1167     ytrans_slider->setValue(rint(ytrans/mInput1->GetImage()->GetSpacing()[1]));
1168     ytrans_slider->blockSignals(false);
1169     ztrans_slider->blockSignals(true);
1170     ztrans_slider->setValue(rint(ztrans/mInput1->GetImage()->GetSpacing()[2]));
1171     ztrans_slider->blockSignals(false);
1172     }
1173     xrot_sb->blockSignals(true);
1174     xrot_sb->setValue(xrot);                                                                    
1175     xrot_sb->blockSignals(false);
1176     yrot_sb->blockSignals(true);
1177     yrot_sb->setValue(yrot);
1178     yrot_sb->blockSignals(false);
1179     zrot_sb->blockSignals(true);
1180     zrot_sb->setValue(zrot);
1181     zrot_sb->blockSignals(false);
1182     xrot_slider->blockSignals(true);
1183     xrot_slider->setValue(xrot);
1184     xrot_slider->blockSignals(false);
1185     yrot_slider->blockSignals(true);
1186     yrot_slider->setValue(yrot);
1187     yrot_slider->blockSignals(false);
1188     zrot_slider->blockSignals(true);
1189     zrot_slider->setValue(zrot);
1190     zrot_slider->blockSignals(false);
1191 }
1192 //------------------------------------------------------------------------------
1193
1194 //------------------------------------------------------------------------------
1195 void vvToolRigidReg::SetSliderRanges()
1196 {
1197   xtrans_slider->blockSignals(true);
1198   xtrans_slider->setRange(-2000,2000);
1199   xtrans_slider->blockSignals(false);
1200
1201   ytrans_slider->blockSignals(true);
1202   ytrans_slider->setRange(-2000,2000);
1203   ytrans_slider->blockSignals(false);
1204
1205   ztrans_slider->blockSignals(true);
1206   ztrans_slider->setRange(-2000,2000);
1207   ztrans_slider->blockSignals(false);
1208
1209   xtrans_sb->blockSignals(true);
1210   xtrans_sb->setRange(-2000,2000);
1211   xtrans_sb->setDecimals(3);
1212   xtrans_sb->blockSignals(false);
1213
1214   ytrans_sb->blockSignals(true);
1215   ytrans_sb->setRange(-2000,2000);
1216   ytrans_sb->setDecimals(3);
1217   ytrans_sb->blockSignals(false);
1218
1219   ztrans_sb->blockSignals(true);
1220   ztrans_sb->setRange(-2000,2000);
1221   ztrans_sb->setDecimals(3);
1222   ztrans_sb->blockSignals(false);
1223
1224   xrot_slider->blockSignals(true);
1225   xrot_slider->setRange(-360,360);
1226   xrot_slider->blockSignals(false);
1227
1228   yrot_slider->blockSignals(true);
1229   yrot_slider->setRange(-360,360);
1230   yrot_slider->blockSignals(false);
1231
1232   zrot_slider->blockSignals(true);
1233   zrot_slider->setRange(-360,360);
1234   zrot_slider->blockSignals(false);
1235
1236   xrot_sb->blockSignals(true);
1237   xrot_sb->setRange(-360,360);
1238   xrot_sb->blockSignals(false);
1239
1240   yrot_sb->blockSignals(true);
1241   yrot_sb->setRange(-360,360);
1242   yrot_sb->blockSignals(false);
1243
1244   zrot_sb->blockSignals(true);
1245   zrot_sb->setRange(-360,360);
1246   zrot_sb->blockSignals(false);
1247 }