]> Creatis software - clitk.git/commitdiff
Merge branch 'master' of git.creatis.insa-lyon.fr:clitk
authorrblanc <rblanc33@gmail.com>
Tue, 15 Jan 2013 14:03:10 +0000 (15:03 +0100)
committerrblanc <rblanc33@gmail.com>
Tue, 15 Jan 2013 14:03:10 +0000 (15:03 +0100)
Conflicts:
vv/vvMainWindow.cxx
vv/vvMainWindow.h

25 files changed:
CMakeLists.txt
common/clitkCommon.h
common/rtkHndImageIO.cxx
common/vvImageReader.cxx
fast_make.sh [changed mode: 0755->0644]
make_meta.sh [changed mode: 0755->0644]
make_new_tool.sh [changed mode: 0755->0644]
tools/CMakeLists.txt
tools/make_new_tool.sh [changed mode: 0755->0644]
utilities/CxImage/CMakeLists.txt [changed mode: 0755->0644]
vv/CMakeLists.txt
vv/make_vv_class.sh [changed mode: 0755->0644]
vv/qt_ui/vvMainWindow.ui
vv/qt_ui/vvOverlayPanel.ui
vv/vv.cxx
vv/vvAnimatedGIFWriter.h
vv/vvMainWindow.cxx
vv/vvMainWindow.h
vv/vvOverlayPanel.cxx
vv/vvOverlayPanel.h
vv/vvSlicer.cxx
vv/vvSlicer.h
vv/vvSlicerManager.cxx
vv/vvSlicerManager.h
vv/vvToolBaseBase.h

index ca68aa390d608473f6c1968e34bc54242c7385d3..f64d0aa47e916c08cc921752550312deb4004ca5 100644 (file)
@@ -13,6 +13,11 @@ ENDIF(NOT DEFINED CLITK_SOURCE_DIR)
 
 SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
 
+IF(MSVC)
+  SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj" )
+  SET( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /bigobj" )
+ENDIF(MSVC)
+
 #=========================================================
 INCLUDE(${CLITK_SOURCE_DIR}/cmake/common.cmake)
 INCLUDE(${CLITK_SOURCE_DIR}/cmake/dependencies.cmake)
index 9eb36522004c172b9cfa6d8bb209f45821cb02f5..8f9ce0f0ee20fb8ad45b48f38876fc3d993695c5 100644 (file)
@@ -40,6 +40,7 @@
 #  include <sys/resource.h>
 #elif defined(_WIN32)
 #  include <windows.h>
+#  include <stdint.h>
 #endif
 
 //--------------------------------------------------------------------
index 8d59982f6d7d3819057f6812a1033ad45d9e3196..4791fd7920a56386435ae34accab7f578ace8631 100644 (file)
@@ -35,24 +35,24 @@ void rtk::HndImageIO::ReadImageInformation()
 
   size_t nelements = 0;
   nelements += fread ( (void *) hnd.sFileType, sizeof(char), 32, fp);
-  nelements += fread ( (void *) &hnd.FileLength, sizeof(uint32_t), 1, fp);
+  nelements += fread ( (void *) &hnd.FileLength, sizeof(itk::uint32_t), 1, fp);
   nelements += fread ( (void *) hnd.sChecksumSpec, sizeof(char), 4, fp);
-  nelements += fread ( (void *) &hnd.nCheckSum, sizeof(uint32_t), 1, fp);
+  nelements += fread ( (void *) &hnd.nCheckSum, sizeof(itk::uint32_t), 1, fp);
   nelements += fread ( (void *) hnd.sCreationDate, sizeof(char), 8, fp);
   nelements += fread ( (void *) hnd.sCreationTime, sizeof(char), 8, fp);
   nelements += fread ( (void *) hnd.sPatientID, sizeof(char), 16, fp);
-  nelements += fread ( (void *) &hnd.nPatientSer, sizeof(uint32_t), 1, fp);
+  nelements += fread ( (void *) &hnd.nPatientSer, sizeof(itk::uint32_t), 1, fp);
   nelements += fread ( (void *) hnd.sSeriesID, sizeof(char), 16, fp);
-  nelements += fread ( (void *) &hnd.nSeriesSer, sizeof(uint32_t), 1, fp);
+  nelements += fread ( (void *) &hnd.nSeriesSer, sizeof(itk::uint32_t), 1, fp);
   nelements += fread ( (void *) hnd.sSliceID, sizeof(char), 16, fp);
-  nelements += fread ( (void *) &hnd.nSliceSer, sizeof(uint32_t), 1, fp);
-  nelements += fread ( (void *) &hnd.SizeX, sizeof(uint32_t), 1, fp);
-  nelements += fread ( (void *) &hnd.SizeY, sizeof(uint32_t), 1, fp);
+  nelements += fread ( (void *) &hnd.nSliceSer, sizeof(itk::uint32_t), 1, fp);
+  nelements += fread ( (void *) &hnd.SizeX, sizeof(itk::uint32_t), 1, fp);
+  nelements += fread ( (void *) &hnd.SizeY, sizeof(itk::uint32_t), 1, fp);
   nelements += fread ( (void *) &hnd.dSliceZPos, sizeof(double), 1, fp);
   nelements += fread ( (void *) hnd.sModality, sizeof(char), 16, fp);
-  nelements += fread ( (void *) &hnd.nWindow, sizeof(uint32_t), 1, fp);
-  nelements += fread ( (void *) &hnd.nLevel, sizeof(uint32_t), 1, fp);
-  nelements += fread ( (void *) &hnd.nPixelOffset, sizeof(uint32_t), 1, fp);
+  nelements += fread ( (void *) &hnd.nWindow, sizeof(itk::uint32_t), 1, fp);
+  nelements += fread ( (void *) &hnd.nLevel, sizeof(itk::uint32_t), 1, fp);
+  nelements += fread ( (void *) &hnd.nPixelOffset, sizeof(itk::uint32_t), 1, fp);
   nelements += fread ( (void *) hnd.sImageType, sizeof(char), 4, fp);
   nelements += fread ( (void *) &hnd.dGantryRtn, sizeof(double), 1, fp);
   nelements += fread ( (void *) &hnd.dSAD, sizeof(double), 1, fp);
@@ -95,7 +95,7 @@ void rtk::HndImageIO::ReadImageInformation()
   nelements += fread ( (void *) &hnd.dGating4DInfoZ, sizeof(double), 1, fp);
   nelements += fread ( (void *) &hnd.dGating4DInfoTime, sizeof(double), 1, fp);
 
-  if(nelements != /*char*/120 + /*uint32_t*/10 +  /*double*/41)
+  if(nelements != /*char*/120 + /*itk::uint32_t*/10 +  /*double*/41)
     itkGenericExceptionMacro(<< "Could not read header data in " << m_FileName);
 
   if(fclose (fp) != 0)
@@ -133,16 +133,16 @@ void rtk::HndImageIO::Read(void * buffer)
 {
   FILE *fp;
 
-  uint32_t*      buf = (uint32_t*)buffer;
+  itk::uint32_t*      buf = (itk::uint32_t*)buffer;
   unsigned char *pt_lut;
-  uint32_t       a;
+  itk::uint32_t       a;
   unsigned char  v;
   int            lut_idx, lut_off;
   size_t         num_read;
   char           dc;
   short          ds;
   long           dl, diff=0;
-  uint32_t       i;
+  itk::uint32_t       i;
 
   fp = fopen (m_FileName.c_str(), "rb");
   if (fp == NULL)
@@ -160,13 +160,13 @@ void rtk::HndImageIO::Read(void * buffer)
 
   /* Read first row */
   for (i = 0; i < GetDimensions(0); i++) {
-    if(1 != fread (&a, sizeof(uint32_t), 1, fp))
+    if(1 != fread (&a, sizeof(itk::uint32_t), 1, fp))
       itkGenericExceptionMacro(<< "Could not read first row in: " << m_FileName);
     buf[i] = a;
     }
 
   /* Read first pixel of second row */
-  if(1 != fread (&a, sizeof(uint32_t), 1, fp))
+  if(1 != fread (&a, sizeof(itk::uint32_t), 1, fp))
     itkGenericExceptionMacro(<< "Could not read first pixel of second row");
   buf[i++] = a;
 
@@ -174,7 +174,7 @@ void rtk::HndImageIO::Read(void * buffer)
   lut_idx = 0;
   lut_off = 0;
   while (i < GetDimensions(0) * GetDimensions(1) ) {
-    uint32_t r11, r12, r21;
+    itk::uint32_t r11, r12, r21;
 
     r11 = buf[i-GetDimensions(0)-1];
     r12 = buf[i-GetDimensions(0)];
@@ -211,7 +211,7 @@ void rtk::HndImageIO::Read(void * buffer)
         diff = ds;
         break;
       case 2:
-        num_read = fread (&dl, sizeof(uint32_t), 1, fp);
+        num_read = fread (&dl, sizeof(itk::uint32_t), 1, fp);
         if (num_read != 1) goto read_error;
         diff = dl;
         break;
index c795cd9299697c7a34c784c1973541c7012e777d..f4f1a907214912b61b4bbe295a1c2652c6359c8e 100644 (file)
@@ -77,13 +77,13 @@ void vvImageReader::Update(int dim,std::string inputPixelType, LoadedImageType t
   switch(mDim)     {
   case 2:
     UpdateWithDim<2>(mInputPixelType);
-    break;;
+    break;
   case 3:
     UpdateWithDim<3>(mInputPixelType);
-    break;;
+    break;
   case 4:
     UpdateWithDim<4>(mInputPixelType);
-    break;;
+    break;
   default:
     std::cerr << "dimension unknown in Update ! " << std::endl;
   }
@@ -193,9 +193,21 @@ void vvImageReader::ReadMatImageTransform()
     }
 
     // TODO SR and BP: check on the list of transforms and not the first only
-    mImage->GetTransform()[0]->PostMultiply();
+    mImage->GetTransform()[0]->PreMultiply();
     mImage->GetTransform()[0]->Concatenate(matrix);
     mImage->GetTransform()[0]->Update();
+
+    //for image sequences, apply the transform to each images of the sequence
+    if (mImage->IsTimeSequence())
+    {
+       for (unsigned i = 1 ; i<mImage->GetTransform().size() ; i++)
+        {
+            mImage->GetTransform()[i]->PreMultiply();
+            mImage->GetTransform()[i]->Concatenate(matrix);
+            mImage->GetTransform()[i]->Update();
+        }
+    }
+
   }
 }
 //------------------------------------------------------------------------------
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 9df72e16716cef85164834183d5d5b779ab735c0..505c2109f1d2a0b48ea66394cd629df46290ebd2 100644 (file)
@@ -233,7 +233,7 @@ IF (CLITK_BUILD_TOOLS)
   IF(CLITK_EXPERIMENTAL)
     WRAP_GGO(clitkBinaryImageToMesh_GGO_C clitkBinaryImageToMesh.ggo)
     ADD_EXECUTABLE(clitkBinaryImageToMesh clitkBinaryImageToMesh.cxx ${clitkBinaryImageToMesh_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkBinaryImageToMesh itksys ${VTK_LIBRARIES})
+    TARGET_LINK_LIBRARIES(clitkBinaryImageToMesh itksys ${ITK_LIBRARIES} ${VTK_LIBRARIES})
     SET(TOOLS_INSTALL ${TOOLS_INSTALL} clitkBinaryImageToMesh)
 
     WRAP_GGO(clitkMeshToBinaryImage_GGO_C clitkMeshToBinaryImage.ggo)
@@ -243,7 +243,7 @@ IF (CLITK_BUILD_TOOLS)
 
     WRAP_GGO(clitkMeshViewer_GGO_C clitkMeshViewer.ggo)
     ADD_EXECUTABLE(clitkMeshViewer clitkMeshViewer.cxx ${clitkMeshViewer_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkMeshViewer ${VTK_LIBRARIES})
+    TARGET_LINK_LIBRARIES(clitkMeshViewer ${ITK_LIBRARIES} ${VTK_LIBRARIES})
     SET(TOOLS_INSTALL ${TOOLS_INSTALL} clitkMeshViewer)
   ENDIF(CLITK_EXPERIMENTAL)
 
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index dbb360c6085f2a235ad89444e2d8c022498da6af..c37c3f606bebc1cc2d3386b0a6227b90d324eabb 100644 (file)
@@ -251,7 +251,7 @@ ENDIF(UNIX OR APPLE)
 
 IF(WIN32)
   #INCLUDE(InstallRequiredSystemLibraries)
-  INSTALL(FILES ${EXECUTABLE_OUTPUT_PATH}/vv.exe DESTINATION .)
+  INSTALL(TARGETS vv DESTINATION bin)
   #INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/icons/ducky.png DESTINATION .)
 ENDIF(WIN32)
 #=========================================================
old mode 100755 (executable)
new mode 100644 (file)
index 8d3d8ff90806dbd4810e7a111be8650f0dd300ea..07ddeb2eeb520f2b49f97cb3012842a96522b844 100644 (file)
          </sizepolicy>
         </property>
         <property name="currentIndex">
-         <number>0</number>
+         <number>1</number>
         </property>
         <widget class="QWidget" name="DataTab">
          <attribute name="title">
      <x>0</x>
      <y>0</y>
      <width>1008</width>
-     <height>25</height>
+     <height>29</height>
     </rect>
    </property>
    <property name="defaultUp">
     <addaction name="actionAdd_VF_to_current_Image"/>
     <addaction name="actionAdd_overlay_image_to_current_image"/>
     <addaction name="actionAdd_fusion_image"/>
+    <addaction name="actionAdd_USSequence_toCT"/>
    </widget>
    <widget class="QMenu" name="menuScreenshots">
     <property name="title">
     <bool>true</bool>
    </property>
   </action>
+  <action name="actionAdd_USSequence_toCT">
+   <property name="icon">
+    <iconset resource="../vvIcons.qrc">
+     <normaloff>:/common/icons/rotateright.png</normaloff>:/common/icons/rotateright.png</iconset>
+   </property>
+   <property name="text">
+    <string>Test / Fusion of US &amp; CT sequences</string>
+   </property>
+   <property name="iconVisibleInMenu">
+    <bool>true</bool>
+   </property>
+  </action>
  </widget>
  <customwidgets>
   <customwidget>
index dd7c83ded7af10ed2fa143eb76697e3d00c8f7d1..0e5a01fcac5f9d197b211f7ed0f64c5976a617db 100644 (file)
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>344</width>
-    <height>480</height>
+    <width>444</width>
+    <height>612</height>
    </rect>
   </property>
   <property name="sizePolicy">
@@ -36,6 +36,134 @@ p, li { white-space: pre-wrap; }
      </property>
     </widget>
    </item>
+   <item>
+    <widget class="QFrame" name="fCTUSFrame">
+     <property name="enabled">
+      <bool>true</bool>
+     </property>
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="minimumSize">
+      <size>
+       <width>0</width>
+       <height>90</height>
+      </size>
+     </property>
+     <property name="frameShape">
+      <enum>QFrame::StyledPanel</enum>
+     </property>
+     <property name="frameShadow">
+      <enum>QFrame::Raised</enum>
+     </property>
+     <widget class="QCheckBox" name="fCTUSActivateTimeSyncCheckBox">
+      <property name="enabled">
+       <bool>false</bool>
+      </property>
+      <property name="geometry">
+       <rect>
+        <x>220</x>
+        <y>60</y>
+        <width>80</width>
+        <height>17</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>Temporal</string>
+      </property>
+     </widget>
+     <widget class="QCheckBox" name="fCTUSActivateSpaceSyncCheckBox">
+      <property name="geometry">
+       <rect>
+        <x>220</x>
+        <y>10</y>
+        <width>61</width>
+        <height>17</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>Spatial</string>
+      </property>
+      <property name="checkable">
+       <bool>true</bool>
+      </property>
+      <property name="checked">
+       <bool>false</bool>
+      </property>
+     </widget>
+     <widget class="QLabel" name="label_13">
+      <property name="geometry">
+       <rect>
+        <x>0</x>
+        <y>0</y>
+        <width>31</width>
+        <height>32</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string/>
+      </property>
+      <property name="pixmap">
+       <pixmap resource="../vvIcons.qrc">:/common/icons/rotateright.png</pixmap>
+      </property>
+     </widget>
+     <widget class="QLabel" name="label_14">
+      <property name="geometry">
+       <rect>
+        <x>30</x>
+        <y>0</y>
+        <width>171</width>
+        <height>32</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>Synchronized fusion of sequences</string>
+      </property>
+     </widget>
+     <widget class="QLabel" name="label_15">
+      <property name="geometry">
+       <rect>
+        <x>0</x>
+        <y>30</y>
+        <width>121</width>
+        <height>29</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>  Browse fused sequence  </string>
+      </property>
+     </widget>
+     <widget class="QSlider" name="fCTUSSlider">
+      <property name="geometry">
+       <rect>
+        <x>130</x>
+        <y>36</y>
+        <width>151</width>
+        <height>20</height>
+       </rect>
+      </property>
+      <property name="orientation">
+       <enum>Qt::Horizontal</enum>
+      </property>
+     </widget>
+     <widget class="QPushButton" name="fCTUSLoadSignalPushButton">
+      <property name="geometry">
+       <rect>
+        <x>20</x>
+        <y>60</y>
+        <width>131</width>
+        <height>23</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>Load Fused Seq. Signal</string>
+      </property>
+     </widget>
+    </widget>
+   </item>
    <item>
     <widget class="QFrame" name="vFFrame">
      <property name="enabled">
index 2b20ac914e648af30483917d443b4488a217ae7c..7506aa94b81d792f1f0d359ffe49ca0185e5bae9 100644 (file)
--- a/vv/vv.cxx
+++ b/vv/vv.cxx
@@ -74,7 +74,7 @@ void open_sequence(vvMainWindow &window,
                    std::vector<std::string> &sequence_filenames,
                    int n_image_loaded)
 {
-  const std::string open_mode_names[] = {"base", "overlay", "fusion", "vf", "contour"};
+  const std::string open_mode_names[] = {"base", "overlay", "fusion", "vf", "contour", "fusionSequence"};
   if(open_mode==O_BASE)
     window.LoadImages(sequence_filenames, vvImageReader::MERGEDWITHTIME);
   else if (open_mode==O_OVERLAY)
index 2fde827b8e25c7457b35a7c834a5347d39075299..1baf2b9359b510807bf3b58cb112bc0550934df8 100644 (file)
@@ -8,7 +8,7 @@
 
 class vtkImageAppend;
 
-class VTK_IO_EXPORT vvAnimatedGIFWriter : public vtkGenericMovieWriter
+class vvAnimatedGIFWriter : public vtkGenericMovieWriter //test this if link error...
 {
 public:
   static vvAnimatedGIFWriter *New();
index a44aadfb956311329c5b79e17d5c0076526efe73..eb5fe7ec96b6ffaee4501de96ffdb27438e63925 100644 (file)
@@ -1,19 +1,19 @@
 /*=========================================================================
-  Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
+Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
 
-  Authors belong to:
-  - University of LYON              http://www.universite-lyon.fr/
-  - Léon Bérard cancer center       http://www.centreleonberard.fr
-  - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
+Authors belong to:
+- University of LYON              http://www.universite-lyon.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
-  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-  PURPOSE.  See the copyright notices for more information.
+This software is distributed WITHOUT ANY WARRANTY; without even
+the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE.  See the copyright notices for more information.
 
-  It is distributed under dual licence
+It is distributed under dual licence
 
-  - BSD        See included LICENSE.txt file
-  - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+- BSD        See included LICENSE.txt file
+- CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
 ===========================================================================**/
 
 #include <algorithm>
 
 
 /*Data Tree values
-  0,Qt::UserRole full filename
-  1,Qt::CheckStateRole checkbutton UL View
-  1,Qt::UserRole overlay, fusion or vector
-  2,Qt::CheckStateRole checkbutton UR View
-  3,Qt::CheckStateRole checkbutton DL View
-  4,Qt::CheckStateRole checkbutton DR View
-  5,0  short filename
-  5,Qt::UserRole mSlicerManager id*/
+0,Qt::UserRole full filename
+1,Qt::CheckStateRole checkbutton UL View
+1,Qt::UserRole overlay, fusion or vector
+2,Qt::CheckStateRole checkbutton UR View
+3,Qt::CheckStateRole checkbutton DL View
+4,Qt::CheckStateRole checkbutton DR View
+5,0  short filename
+5,Qt::UserRole mSlicerManager id*/
 
 //------------------------------------------------------------------------------
 vvMainWindow::vvMainWindow():vvMainWindowBase()
@@ -137,34 +137,34 @@ vvMainWindow::vvMainWindow():vvMainWindowBase()
   this->setContextMenuPolicy(Qt::CustomContextMenu);
   contextActions.resize(0);
   QAction* actionOpen_new_image = contextMenu.addAction(QIcon(QString::fromUtf8(":/common/icons/fileopen.png")),
-                                  tr("O&pen new Image"));
+    tr("O&pen new Image"));
   actionOpen_new_image->setShortcut(QKeySequence(tr("Ctrl+O")));
   connect(actionOpen_new_image,SIGNAL(triggered()),this,SLOT(OpenImages()));
   contextActions.push_back(actionOpen_new_image);
   contextMenu.addSeparator();
 
   QAction* actionClose_Image = contextMenu.addAction(QIcon(QString::fromUtf8(":/common/icons/exit.png")),
-                               tr("Close Current Image"));
+    tr("Close Current Image"));
   connect(actionClose_Image,SIGNAL(triggered()),this,SLOT(CloseImage()));
   contextActions.push_back(actionClose_Image);
 
   QAction* actionReload_image = contextMenu.addAction(QIcon(QString::fromUtf8(":/common/icons/rotateright.png")),
-                                tr("Reload Current Image"));
+    tr("Reload Current Image"));
   connect(actionReload_image,SIGNAL(triggered()),this,SLOT(ReloadImage()));
   contextActions.push_back(actionReload_image);
 
   QAction* actionSave_image = contextMenu.addAction(QIcon(QString::fromUtf8(":/common/icons/filesave.png")),
-                              tr("Save Current Image"));
+    tr("Save Current Image"));
   connect(actionSave_image,SIGNAL(triggered()),this,SLOT(SaveAs()));
   contextActions.push_back(actionSave_image);
 
   QAction* actionSave_state = contextMenu.addAction(QIcon(QString::fromUtf8(":/common/icons/filesave.png")),
-                              tr("Save Current State"));
+    tr("Save Current State"));
   connect(actionSave_state,SIGNAL(triggered()),this,SLOT(SaveCurrentState()));
   contextActions.push_back(actionSave_state);
 
   QAction* actionRead_state = contextMenu.addAction(QIcon(QString::fromUtf8(":/common/icons/filesave.png")),
-                              tr("Read Saved State"));
+    tr("Read Saved State"));
   connect(actionRead_state,SIGNAL(triggered()),this,SLOT(ReadSavedState()));
   contextActions.push_back(actionRead_state);
 
@@ -181,9 +181,15 @@ vvMainWindow::vvMainWindow():vvMainWindowBase()
   contextMenu.addAction(actionAdd_fusion_image);
   contextActions.push_back(actionAdd_fusion_image);
 
+#ifdef CLITK_EXPERIMENTAL
+  contextMenu.addAction(actionAdd_USSequence_toCT);
+  contextActions.push_back(actionAdd_USSequence_toCT);
+#endif
+
+
   contextMenu.addSeparator();
   QAction* actionResetMatrix = contextMenu.addAction(QIcon(QString::fromUtf8(":/common/icons/identity.png")),
-                                                      tr("Reset transformation to identity"));
+    tr("Reset transformation to identity"));
   connect(actionResetMatrix, SIGNAL(triggered()), this,SLOT(ResetTransformationToIdentity()));
 
   // TRIAL DS
@@ -193,9 +199,9 @@ vvMainWindow::vvMainWindow():vvMainWindowBase()
   //  m->setObjectName(QString::fromUtf8("TOTOTO"));
   contextMenu.addMenu(m);
   QAction * a = m->addAction(QIcon(QString::fromUtf8(":/common/icons/GPSup.png")),
-                    tr("BIDON"));
+  tr("BIDON"));
   QAction * b = m->addAction(QIcon(QString::fromUtf8(":/common/icons/GPSup.png")),
-                    tr("BIDON2"));
+  tr("BIDON2"));
   m->addAction(a);
   m->addAction(b);
   connect(a,SIGNAL(triggered()),this,SLOT(AddFusionImage()));
@@ -234,6 +240,7 @@ vvMainWindow::vvMainWindow():vvMainWindowBase()
   actionSave_As->setEnabled(0);
   actionAdd_VF_to_current_Image->setEnabled(0);
   actionAdd_fusion_image->setEnabled(0);
+  actionAdd_USSequence_toCT->setEnabled(0);
 
   //init the sliders
   verticalSliders.push_back(NOVerticalSlider);
@@ -281,10 +288,15 @@ vvMainWindow::vvMainWindow():vvMainWindowBase()
   connect(actionExit,SIGNAL(triggered()),this,SLOT(close()));
   connect(actionAdd_VF_to_current_Image,SIGNAL(triggered()),this,SLOT(OpenField()));
   connect(actionAdd_fusion_image,SIGNAL(triggered()),this,SLOT(SelectFusionImage()));
-  connect(actionAdd_overlay_image_to_current_image,SIGNAL(triggered()), this,SLOT(SelectOverlayImage()));  connect(actionNavigation_Help,SIGNAL(triggered()),this,SLOT(ShowHelpDialog()));
+  connect(actionAdd_overlay_image_to_current_image,SIGNAL(triggered()), this,SLOT(SelectOverlayImage()));
+  connect(actionAdd_USSequence_toCT,SIGNAL(triggered()), this,SLOT(SelectFusionSequence()));
+  connect(actionNavigation_Help,SIGNAL(triggered()),this,SLOT(ShowHelpDialog()));
   connect(actionDocumentation,SIGNAL(triggered()),this,SLOT(ShowDocumentation()));
   connect(actionRegister_vv,SIGNAL(triggered()),this,SLOT(PopupRegisterForm()));
 
+  connect(overlayPanel, SIGNAL(FusionSequenceSignalButtonPressed()), this, SLOT(SelectFusionSequenceTemporalSignal()));
+
+
   ///////////////////////////////////////////////
   connect(actionSegmentation,SIGNAL(triggered()),this,SLOT(SegmentationOnCurrentImage()));
   connect(actionSurface_Viewer,SIGNAL(triggered()),this,SLOT(SurfaceViewerLaunch()));
@@ -303,7 +315,7 @@ vvMainWindow::vvMainWindow():vvMainWindowBase()
 
   connect(DataTree,SIGNAL(itemSelectionChanged()),this,SLOT(ImageInfoChanged()));
   connect(DataTree,SIGNAL(itemClicked(QTreeWidgetItem*, int)),this,
-          SLOT(DisplayChanged(QTreeWidgetItem*, int)));
+    SLOT(DisplayChanged(QTreeWidgetItem*, int)));
 
   connect(viewButton,SIGNAL(clicked()),this, SLOT(ChangeViewMode()) );
   connect(windowSpinBox,SIGNAL(editingFinished()),this,SLOT(WindowLevelEdited()));
@@ -320,12 +332,16 @@ vvMainWindow::vvMainWindow():vvMainWindowBase()
   connect(linkPanel,SIGNAL(removeLink(QString,QString)),this,SLOT(RemoveLink(QString,QString)));
   connect(overlayPanel,SIGNAL(VFPropertyUpdated(int,int,int,int,double,double,double)),this,SLOT(SetVFProperty(int,int,int,int,double,double,double)));
   connect(overlayPanel,SIGNAL(OverlayPropertyUpdated(int,int,double,double)),
-          this,SLOT(SetOverlayProperty(int,int,double,double)));
+    this,SLOT(SetOverlayProperty(int,int,double,double)));
   connect(overlayPanel,SIGNAL(FusionPropertyUpdated(int,int,int,double,double, bool)),
-          this,SLOT(SetFusionProperty(int,int,int,double,double, bool)));
+    this,SLOT(SetFusionProperty(int,int,int,double,double, bool)));
   connect(landmarksPanel,SIGNAL(UpdateRenderWindows()),this,SLOT(UpdateRenderWindows()));
   connect(landmarksPanel,SIGNAL(SelectedPointChanged()),this,SLOT(GoToLandmark()));
 
+  connect(overlayPanel,SIGNAL(FusionSequencePropertyUpdated(int, bool, unsigned int, bool)),
+    this,SLOT(SetFusionSequenceProperty(int, bool,unsigned int, bool)));
+
+
   playMode = 0;//pause
   mFrameRate = 10;
   playButton->setEnabled(0);
@@ -362,6 +378,7 @@ vvMainWindow::vvMainWindow():vvMainWindowBase()
   //timerMemory->setInterval(5);
   connect(timerMemory, SIGNAL(timeout()), this, SLOT(UpdateMemoryUsage()));
   timerMemory->start(2000);
+
 }
 //------------------------------------------------------------------------------
 void vvMainWindow::show()
@@ -414,7 +431,7 @@ void vvMainWindow::ComputeMidPosition()
   bool ok;
   int index=GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
   int ref = QInputDialog::getInteger(this,"Chose reference phase","Reference phase",0,0,\
-                                     mSlicerManagers[index]->GetImage()->GetVTKImages().size()-1,1,&ok);
+    mSlicerManagers[index]->GetImage()->GetVTKImages().size()-1,1,&ok);
   if (ok) {
     vvMidPosition midp;
     midp.slicer_manager = mSlicerManagers[index];
@@ -454,7 +471,7 @@ void vvMainWindow::AddContour(int image_index, vvMesh::Pointer contour, bool pro
   cButton->setToolTip(tr("close image"));
   cButton->setIcon(QIcon(QString::fromUtf8(":/common/icons/exit.png")));
   connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
-          this,SLOT(CloseImage(QTreeWidgetItem*, int)));
+    this,SLOT(CloseImage(QTreeWidgetItem*, int)));
 
   QTreePushButton* rButton = new QTreePushButton;
   rButton->setItem(item);
@@ -506,25 +523,25 @@ void vvMainWindow::OpenVTKContour()
 //------------------------------------------------------------------------------
 void vvMainWindow::AddDCStructContour(int index, QString file)
 {
-    vvMeshReader reader;
-    reader.SetFilename(file.toStdString());
-    vvStructSelector selector;
-    selector.SetStructures(reader.GetROINames());
-    if (!mSlicerManagers[index]->GetVF().IsNull())
-      selector.EnablePropagationCheckBox();
-    if (selector.exec()) {
-      QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
-      reader.SetSelectedItems(selector.getSelectedItems());
-      reader.SetImage(mSlicerManagers[index]->GetImage());
-      if (selector.PropagationEnabled())
-        reader.SetPropagationVF(mSlicerManagers[index]->GetVF());
-      reader.Update();
-      std::vector<vvMesh::Pointer> contours=reader.GetOutput();
-      for (std::vector<vvMesh::Pointer>::iterator i=contours.begin();
-           i!=contours.end(); i++)
-        AddContour(index,*i,selector.PropagationEnabled());
-      QApplication::restoreOverrideCursor();
-    }
+  vvMeshReader reader;
+  reader.SetFilename(file.toStdString());
+  vvStructSelector selector;
+  selector.SetStructures(reader.GetROINames());
+  if (!mSlicerManagers[index]->GetVF().IsNull())
+    selector.EnablePropagationCheckBox();
+  if (selector.exec()) {
+    QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
+    reader.SetSelectedItems(selector.getSelectedItems());
+    reader.SetImage(mSlicerManagers[index]->GetImage());
+    if (selector.PropagationEnabled())
+      reader.SetPropagationVF(mSlicerManagers[index]->GetVF());
+    reader.Update();
+    std::vector<vvMesh::Pointer> contours=reader.GetOutput();
+    for (std::vector<vvMesh::Pointer>::iterator i=contours.begin();
+      i!=contours.end(); i++)
+      AddContour(index,*i,selector.PropagationEnabled());
+    QApplication::restoreOverrideCursor();
+  }
 }
 
 //------------------------------------------------------------------------------
@@ -567,7 +584,7 @@ void vvMainWindow::WarpImage()
   if (!mSlicerManagers[index]->GetVF().IsNull()) {
     bool ok;
     int ref = QInputDialog::getInteger(this,"Chose reference phase","Reference phase",0,0,\
-                                       mSlicerManagers[index]->GetImage()->GetVTKImages().size()-1,1,&ok);
+      mSlicerManagers[index]->GetImage()->GetVTKImages().size()-1,1,&ok);
     if (ok) {
       WarpImage(mSlicerManagers[index],ref);
     }
@@ -584,7 +601,7 @@ void vvMainWindow::WarpImage(vvSlicerManager* selected_slicer,int reference_phas
     QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
     QFileInfo info(selected_slicer->GetFileName().c_str());
     vvImageWarp warp(selected_slicer->GetImage(),selected_slicer->GetVF(),
-                     reference_phase,this);
+      reference_phase,this);
     if (warp.ComputeWarpedImage()) {
       AddImage(warp.GetWarpedImage(),info.path().toStdString()+"/"+info.completeBaseName().toStdString()+"_warped.mhd");
       AddImage(warp.GetDiffImage()  ,info.path().toStdString()+"/"+info.completeBaseName().toStdString()+"_diff.mhd");
@@ -636,7 +653,7 @@ void vvMainWindow::MergeImages()
 
   for (int i = 0; i < files.size(); i++) {
     itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO(
-                                         files[i].toStdString().c_str(), itk::ImageIOFactory::ReadMode);
+      files[i].toStdString().c_str(), itk::ImageIOFactory::ReadMode);
     reader->SetFileName(files[i].toStdString().c_str());
     reader->ReadImageInformation();
     if (reader)        {
@@ -658,14 +675,14 @@ void vvMainWindow::MergeImages()
           currentSpacing[j] = reader->GetSpacing(j);
           currentSize[j] = reader->GetDimensions(j);
         } else if (currentDim != reader->GetNumberOfDimensions()
-                   || currentSpacing[j] != reader->GetSpacing(j)
-                   || currentSize[j] != (int)reader->GetDimensions(j)
-                   || currentOrigin[j] != reader->GetOrigin(j)) {
-          QString error = "Cannot read file (too different from others ";
-          error += files[i].toStdString().c_str();
-          QMessageBox::information(this,tr("Reading problem"),error);
-          IsOk = false;
-          break;
+          || currentSpacing[j] != reader->GetSpacing(j)
+          || currentSize[j] != (int)reader->GetDimensions(j)
+          || currentOrigin[j] != reader->GetOrigin(j)) {
+            QString error = "Cannot read file (too different from others ";
+            error += files[i].toStdString().c_str();
+            QMessageBox::information(this,tr("Reading problem"),error);
+            IsOk = false;
+            break;
         }
       }
       if (IsOk)
@@ -826,7 +843,6 @@ void vvMainWindow::LoadImages(std::vector<std::string> files, vvImageReader::Loa
   int numberofsuccesulreads=0;
   //open images as 1 or multiples
   for (int i = 0; i < fileSize; i++) {
-
     progress.SetText("Opening " + files[i]);
     progress.SetProgress(i,fileSize);
     qApp->processEvents();
@@ -846,6 +862,7 @@ void vvMainWindow::LoadImages(std::vector<std::string> files, vvImageReader::Loa
       else {
         SetImageSucceed = imageManager->SetImages(files,filetype, number);
       }
+
       if (!SetImageSucceed) {
         QApplication::restoreOverrideCursor();
         QString error = "Cannot open file \n";
@@ -872,7 +889,7 @@ void vvMainWindow::LoadImages(std::vector<std::string> files, vvImageReader::Loa
         cButton->setToolTip(tr("close image"));
         cButton->setIcon(QIcon(QString::fromUtf8(":/common/icons/exit.png")));
         connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
-                this,SLOT(CloseImage(QTreeWidgetItem*, int)));
+          this,SLOT(CloseImage(QTreeWidgetItem*, int)));
 
         QTreePushButton* rButton = new QTreePushButton;
         rButton->setItem(item);
@@ -880,7 +897,7 @@ void vvMainWindow::LoadImages(std::vector<std::string> files, vvImageReader::Loa
         rButton->setToolTip(tr("reload image"));
         rButton->setIcon(QIcon(QString::fromUtf8(":/common/icons/rotateright.png")));
         connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
-                this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
+          this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
 
         DataTree->addTopLevelItem(item);
         DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
@@ -894,34 +911,35 @@ void vvMainWindow::LoadImages(std::vector<std::string> files, vvImageReader::Loa
         linkPanel->addImage(imageManager->GetFileName(), id.toStdString());
 
         connect(mSlicerManagers.back(), SIGNAL(currentImageChanged(std::string)),
-                this,SLOT(CurrentImageChanged(std::string)));
+          this,SLOT(CurrentImageChanged(std::string)));
         connect(mSlicerManagers.back(), SIGNAL(currentPickedImageChanged(std::string)),
-                this, SLOT(CurrentPickedImageChanged(std::string)));
+          this, SLOT(CurrentPickedImageChanged(std::string)));
         connect(mSlicerManagers.back(), SIGNAL(UpdatePosition(int, double, double, double, double, double, double, double)),
-                this,SLOT(MousePositionChanged(int,double, double, double, double, double, double, double)));
+          this,SLOT(MousePositionChanged(int,double, double, double, double, double, double, double)));
         connect(mSlicerManagers.back(), SIGNAL(UpdateVector(int, double, double, double, double)),
-                this, SLOT(VectorChanged(int,double,double,double, double)));
+          this, SLOT(VectorChanged(int,double,double,double, double)));
         connect(mSlicerManagers.back(), SIGNAL(UpdateOverlay(int, double, double)),
-                this, SLOT(OverlayChanged(int,double,double)));
+          this, SLOT(OverlayChanged(int,double,double)));
         connect(mSlicerManagers.back(), SIGNAL(UpdateFusion(int, double)),
-                this, SLOT(FusionChanged(int,double)));
+          this, SLOT(FusionChanged(int,double)));
         connect(mSlicerManagers.back(), SIGNAL(WindowLevelChanged()),
-                this,SLOT(WindowLevelChanged()));
+          this,SLOT(WindowLevelChanged()));
         connect(mSlicerManagers.back(), SIGNAL(UpdateSlice(int,int)),
-                this,SLOT(UpdateSlice(int,int)));
-        connect(mSlicerManagers.back(), SIGNAL(UpdateTSlice(int, int)),
-                this,SLOT(UpdateTSlice(int, int)));
-        connect(mSlicerManagers.back(), SIGNAL(UpdateTSlice(int, int)),
-                this,SLOT(ImageInfoChanged()));
+          this,SLOT(UpdateSlice(int,int)));
+        connect(mSlicerManagers.back(), SIGNAL(UpdateTSlice(int, int, int)),
+          this,SLOT(UpdateTSlice(int, int, int)));
+        connect(mSlicerManagers.back(), SIGNAL(UpdateTSlice(int, int, int)),
+          this,SLOT(ImageInfoChanged()));
         connect(mSlicerManagers.back(), SIGNAL(UpdateSliceRange(int,int,int,int,int)),
-                this,SLOT(UpdateSliceRange(int,int,int,int,int)));
+          this,SLOT(UpdateSliceRange(int,int,int,int,int)));
         connect(mSlicerManagers.back(), SIGNAL(UpdateLinkManager(std::string,int,double,double,double,int)),
-                this,SLOT(UpdateLinkManager(std::string,int,double,double,double,int)));
+          this,SLOT(UpdateLinkManager(std::string,int,double,double,double,int)));
         connect(mSlicerManagers.back(), SIGNAL(UpdateLinkedNavigation(std::string,vvSlicerManager*,vvSlicer*)),
-                this,SLOT(UpdateLinkedNavigation(std::string,vvSlicerManager*,vvSlicer*)));
+          this,SLOT(UpdateLinkedNavigation(std::string,vvSlicerManager*,vvSlicer*)));
         connect(mSlicerManagers.back(), SIGNAL(ChangeImageWithIndexOffset(vvSlicerManager*,int,int)),
-                this,SLOT(ChangeImageWithIndexOffset(vvSlicerManager*,int,int)));
+          this,SLOT(ChangeImageWithIndexOffset(vvSlicerManager*,int,int)));
         connect(mSlicerManagers.back(),SIGNAL(LandmarkAdded()),landmarksPanel,SLOT(AddPoint()));
+
         InitSlicers();
         numberofsuccesulreads++;
       }
@@ -1020,6 +1038,7 @@ void vvMainWindow::ImageInfoChanged()
   actionAdd_VF_to_current_Image->setEnabled(1);
   actionAdd_fusion_image->setEnabled(1);
   actionAdd_overlay_image_to_current_image->setEnabled(1);
+  actionAdd_USSequence_toCT->setEnabled(1);
   actionNorth_East_Window->setEnabled(1);
   actionNorth_West_Window->setEnabled(1);
   actionSouth_East_Window->setEnabled(1);
@@ -1035,9 +1054,10 @@ void vvMainWindow::ImageInfoChanged()
     colorMapComboBox->setEnabled(1);
     for (int i = 0; i < DataTree->topLevelItem(index)->childCount(); i++) {
       if (DataTree->topLevelItem(index)->child(i)->data(1,Qt::UserRole).toString() == "overlay" ||
-          DataTree->topLevelItem(index)->child(i)->data(1,Qt::UserRole).toString() == "fusion") {
-        colorMapComboBox->setEnabled(0);
-        break;
+        DataTree->topLevelItem(index)->child(i)->data(1,Qt::UserRole).toString() == "fusion" ||
+        DataTree->topLevelItem(index)->child(i)->data(1,Qt::UserRole).toString() == "fusionSequence") {
+          colorMapComboBox->setEnabled(0);
+          break;
       }
     }
 
@@ -1052,6 +1072,7 @@ void vvMainWindow::ImageInfoChanged()
     QString image = DataTree->selectedItems()[0]->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
 
     int nframes = mSlicerManagers[index]->GetSlicer(0)->GetTMax();
+
     if (nframes > 1 || playMode == 1) {
       playButton->setEnabled(1);
       frameRateLabel->setEnabled(1);
@@ -1080,6 +1101,10 @@ void vvMainWindow::ImageInfoChanged()
       imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetFusion();
       tSlice = mSlicerManagers[index]->GetSlicer(0)->GetFusionTSlice();
     }
+    else if (DataTree->selectedItems()[0]->data(1,Qt::UserRole).toString() == "fusionSequence") {
+      imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetFusion();
+      tSlice = mSlicerManagers[index]->GetSlicer(0)->GetFusionTSlice();
+    }
     else if (DataTree->selectedItems()[0]->data(1,Qt::UserRole).toString() == "contour") {
       imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetImage();
       tSlice = mSlicerManagers[index]->GetSlicer(0)->GetTSlice();
@@ -1103,7 +1128,7 @@ void vvMainWindow::ImageInfoChanged()
       NPixel *= inputSize[i];
     }
     inputSizeInBytes = GetSizeInBytes(imageSelected->GetActualMemorySize()*1000);
-    
+
     QString dim = QString::number(dimension) + " (";
     dim += pixelType + ")";
 
@@ -1114,6 +1139,7 @@ void vvMainWindow::ImageInfoChanged()
     infoPanel->setOrigin(GetVectorDoubleAsString(origin));
     infoPanel->setSpacing(GetVectorDoubleAsString(inputSpacing));
     infoPanel->setNPixel(QString::number(NPixel)+" ("+inputSizeInBytes+")");
+
     transformation = imageSelected->GetTransform()[tSlice]->GetMatrix();
     infoPanel->setTransformation(Get4x4MatrixDoubleAsString(transformation));
 
@@ -1151,13 +1177,14 @@ void vvMainWindow::ImageInfoChanged()
 //       }
 //     }
     WindowLevelChanged();
+
     slicingPresetComboBox->setCurrentIndex(mSlicerManagers[index]->GetSlicingPreset());
 
     if (mSlicerManagers[index]->GetSlicer(0)->GetVF()) {
       overlayPanel->getVFName(mSlicerManagers[index]->GetVFName().c_str());
       overlayPanel->getVFProperty(mSlicerManagers[index]->GetSlicer(0)->GetVFSubSampling(),
-                                  mSlicerManagers[index]->GetSlicer(0)->GetVFScale(),
-                                  mSlicerManagers[index]->GetSlicer(0)->GetVFLog());
+        mSlicerManagers[index]->GetSlicer(0)->GetVFScale(),
+        mSlicerManagers[index]->GetSlicer(0)->GetVFLog());
     } else {
       overlayPanel->getVFName(mSlicerManagers[index]->GetVFName().c_str());
       overlayPanel->getVFProperty(-1,-1,-1);
@@ -1167,7 +1194,7 @@ void vvMainWindow::ImageInfoChanged()
     } else {
       overlayPanel->getOverlayName(mSlicerManagers[index]->GetOverlayName().c_str());
     }
-    
+
     if (mSlicerManagers[index]->GetSlicer(0)->GetFusion()) {
       overlayPanel->getFusionName(mSlicerManagers[index]->GetFusionName().c_str());
     } else {
@@ -1250,7 +1277,7 @@ void vvMainWindow::ChangeViewMode()
   sizes[3].cols[0] = 1;
   sizes[3].cols[1] = 2;
   sizes[3].cols[2] = 3;
-  
+
   int slicer = mSlicerManagers[mCurrentPickedImageIndex]->GetSelectedSlicer();
   if (viewMode == 1) {
     if (slicer >= 0) {
@@ -1280,12 +1307,12 @@ void vvMainWindow::ChangeViewMode()
   ** the associated Slicer to redraw crosses.
   */
   for (unsigned int i = 0; i < mSlicerManagers.size(); i++) {
-//     if (DataTree->topLevelItem(i)->data(COLUMN_UL_VIEW,Qt::CheckStateRole).toInt() > 1)
-      mSlicerManagers[i]->GetSlicer(0)->Render();
-      mSlicerManagers[i]->GetSlicer(1)->Render();
-//     if (DataTree->topLevelItem(i)->data(COLUMN_DL_VIEW,Qt::CheckStateRole).toInt() > 1)
-      mSlicerManagers[i]->GetSlicer(2)->Render();
-      mSlicerManagers[i]->GetSlicer(3)->Render();
+    //     if (DataTree->topLevelItem(i)->data(COLUMN_UL_VIEW,Qt::CheckStateRole).toInt() > 1)
+    mSlicerManagers[i]->GetSlicer(0)->Render();
+    mSlicerManagers[i]->GetSlicer(1)->Render();
+    //     if (DataTree->topLevelItem(i)->data(COLUMN_DL_VIEW,Qt::CheckStateRole).toInt() > 1)
+    mSlicerManagers[i]->GetSlicer(2)->Render();
+    mSlicerManagers[i]->GetSlicer(3)->Render();
   }
 }
 //------------------------------------------------------------------------------
@@ -1371,6 +1398,7 @@ QString vvMainWindow::GetVectorIntAsString(std::vector<int> vectorInt)
 //------------------------------------------------------------------------------
 
 //------------------------------------------------------------------------------
+//this actually returns the SlicerManager index!
 int vvMainWindow::GetSlicerIndexFromItem(QTreeWidgetItem* item)
 {
   QString id = item->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString();
@@ -1548,7 +1576,7 @@ void vvMainWindow::CloseImage(QTreeWidgetItem* item, int column)
     QString warning = "Do you really want to close the overlay : ";
     warning += item->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
     QMessageBox msgBox(QMessageBox::Warning, tr("Close Overlay"),
-                       warning, 0, this);
+      warning, 0, this);
     msgBox.addButton(tr("Close"), QMessageBox::AcceptRole);
     msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
     if (msgBox.exec() == QMessageBox::AcceptRole) {
@@ -1556,10 +1584,25 @@ void vvMainWindow::CloseImage(QTreeWidgetItem* item, int column)
       int overlay_index=0;
       for (int child = 0; child < DataTree->topLevelItem(index)->childCount(); child++) {
         if (DataTree->topLevelItem(index)->\
-            child(child)->data(1,Qt::UserRole).toString().toStdString() == overlay_type)
+          child(child)->data(1,Qt::UserRole).toString().toStdString() == overlay_type)
           overlay_index++;
         if (DataTree->topLevelItem(index)->child(child) == item) break;
       }
+      if (overlay_type=="fusionSequence") {
+        //removing the overlay sequence in a fusion sequence visualization mode 
+        //reset the transforms
+        overlayPanel->getFusionSequenceProperty(-1, false, 0, false);
+
+        //unlink and untie the slicer managers
+        RemoveLink(mSlicerManagers[index]->GetId().c_str(), mSlicerManagers[mSlicerManagers[index]->GetFusionSequenceIndexOfLinkedManager()]->GetId().c_str());
+        mSlicerManagers[index]->SetFusionSequenceInvolvmentCode(-1);
+        mSlicerManagers[mSlicerManagers[index]->GetFusionSequenceIndexOfLinkedManager()]->SetFusionSequenceInvolvmentCode(-1);
+        for (unsigned i=0 ; i<4 ; i++) {
+            mSlicerManagers[index]->GetSlicer(i)->SetFusionSequenceCode(-1);
+            mSlicerManagers[mSlicerManagers[index]->GetFusionSequenceIndexOfLinkedManager()]->GetSlicer(i)->SetFusionSequenceCode(-1);
+        }
+
+      }
       mSlicerManagers[index]->RemoveActor(overlay_type, overlay_index-1);
       mSlicerManagers[index]->SetColorMap(0);
       DataTree->topLevelItem(index)->takeChild(DataTree->topLevelItem(index)->indexOfChild(item));
@@ -1570,7 +1613,7 @@ void vvMainWindow::CloseImage(QTreeWidgetItem* item, int column)
     warning += item->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
     warning += "\nThis is the last image, you're about to close vv !!!";
     QMessageBox msgBox(QMessageBox::Warning, tr("Close Image"),
-                       warning, 0, this);
+      warning, 0, this);
     msgBox.addButton(tr("Close vv"), QMessageBox::AcceptRole);
     msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
     if (msgBox.exec() == QMessageBox::AcceptRole) {
@@ -1580,7 +1623,7 @@ void vvMainWindow::CloseImage(QTreeWidgetItem* item, int column)
     QString warning = "Do you really want to close the image : ";
     warning += item->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
     QMessageBox msgBox(QMessageBox::Warning, tr("Close Image"),
-                       warning, 0, this);
+      warning, 0, this);
     msgBox.addButton(tr("Close"), QMessageBox::AcceptRole);
     msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
     if (msgBox.exec() == QMessageBox::AcceptRole) {
@@ -1593,8 +1636,27 @@ void vvMainWindow::CloseImage(QTreeWidgetItem* item, int column)
       for (int i = 0; i < index; i++) {
         Manageriter++;
       }
+      //if the slicer manager was involved in a fusion sequence visualization...
+      if ( mSlicerManagers[index]->IsInvolvedInFusionSequence() ) {
+        //reset the transforms
+        overlayPanel->getFusionSequenceProperty(-1, false, 0, false);
+
+        //unlink and untie the slicer managers
+        RemoveLink(mSlicerManagers[index]->GetId().c_str(), mSlicerManagers[mSlicerManagers[index]->GetFusionSequenceIndexOfLinkedManager()]->GetId().c_str());
+        mSlicerManagers[index]->SetFusionSequenceInvolvmentCode(-1);
+        mSlicerManagers[mSlicerManagers[index]->GetFusionSequenceIndexOfLinkedManager()]->SetFusionSequenceInvolvmentCode(-1);
+        for (unsigned i=0 ; i<4 ; i++) {
+            mSlicerManagers[index]->GetSlicer(i)->SetFusionSequenceCode(-1);
+            mSlicerManagers[mSlicerManagers[index]->GetFusionSequenceIndexOfLinkedManager()]->GetSlicer(i)->SetFusionSequenceCode(-1);
+        }
+        
+        //TODO: also remove the image overlaid with the main sequence, as it is becoming invalid...
+      }
+
       linkPanel->removeImage(index);
       mSlicerManagers[index]->RemoveActors();
+
+      //remove the slicer manager
       delete mSlicerManagers[index];
       mSlicerManagers.erase(Manageriter);
 
@@ -1620,17 +1682,24 @@ void vvMainWindow::ReloadImage(QTreeWidgetItem* item, int column)
   int index = GetSlicerIndexFromItem(item);
   QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
   QString role=item->data(1,Qt::UserRole).toString();
-  if ( role == "vector"){
+  if ( role == "vector") {
     mSlicerManagers[index]->ReloadVF();
   }
-  else if (role == "overlay"){
+  else if (role == "overlay") {
     mSlicerManagers[index]->ReloadOverlay();
   }
-  else if (role == "fusion"){
+  else if (role == "fusion") {
     mSlicerManagers[index]->ReloadFusion();
   }
-  else{
+  else if (role == "fusionSequence") {
+    //both versions of the secondary sequence must be updated.
+    mSlicerManagers[index]->ReloadFusionSequence();
+    mSlicerManagers[mSlicerManagers[index]->GetFusionSequenceIndexOfLinkedManager()]->Reload(); 
+  }
+  else {
     mSlicerManagers[index]->Reload();
+    //if we update the secondary sequence, then the overlay of the main sequence should also be updated
+    if (mSlicerManagers[index]->IsSecondarySequenceOfFusionSequence()) mSlicerManagers[mSlicerManagers[index]->GetFusionSequenceIndexOfLinkedManager()]->ReloadFusionSequence(); 
   }
   // Update view and info
   ImageInfoChanged();
@@ -1668,6 +1737,9 @@ void vvMainWindow::FusionChanged(int visibility, double value)
 //------------------------------------------------------------------------------
 
 //------------------------------------------------------------------------------
+//called when AddOverlayImage, AddFusionSequence
+//or when UpdateWindowLevel() is called ; when slicerManager emits WindowLevelChanged
+//when ImageInfoChanged() is called
 void vvMainWindow::WindowLevelChanged()
 {
   // Base image
@@ -1681,21 +1753,44 @@ void vvMainWindow::WindowLevelChanged()
   // Overlay image
   if (mSlicerManagers[index]->GetSlicer(0)->GetOverlay())
     overlayPanel->getOverlayProperty(mSlicerManagers[index]->GetOverlayColor(),
-                                     mSlicerManagers[index]->GetLinkOverlayWindowLevel(),
-                                     mSlicerManagers[index]->GetOverlayColorWindow(),
-                                     mSlicerManagers[index]->GetOverlayColorLevel());
+    mSlicerManagers[index]->GetLinkOverlayWindowLevel(),
+    mSlicerManagers[index]->GetOverlayColorWindow(),
+    mSlicerManagers[index]->GetOverlayColorLevel());
   else
     overlayPanel->getOverlayProperty(-1,0,0.,0.);
 
-  // Fusion image
-  if (mSlicerManagers[index]->GetSlicer(0)->GetFusion())
+  // Fusion & SequenceFusion image
+  if (mSlicerManagers[index]->GetSlicer(0)->GetFusion()) {
     overlayPanel->getFusionProperty(mSlicerManagers[index]->GetFusionOpacity(),
-                                    mSlicerManagers[index]->GetFusionThresholdOpacity(),
-                                    mSlicerManagers[index]->GetFusionColorMap(),
-                                    mSlicerManagers[index]->GetFusionWindow(),
-                                    mSlicerManagers[index]->GetFusionLevel());
+      mSlicerManagers[index]->GetFusionThresholdOpacity(),
+      mSlicerManagers[index]->GetFusionColorMap(),
+      mSlicerManagers[index]->GetFusionWindow(),
+      mSlicerManagers[index]->GetFusionLevel());
+    if (mSlicerManagers[index]->IsMainSequenceOfFusionSequence()) {
+      overlayPanel->getFusionSequenceProperty(mSlicerManagers[index]->GetFusionSequenceFrameIndex(),
+        mSlicerManagers[index]->GetFusionSequenceSpatialSyncFlag(), 
+        mSlicerManagers[index]->GetFusionSequenceNbFrames(),
+        mSlicerManagers[index]->GetFusionSequenceTemporalSyncFlag());
+    }
+  }
+  else if ( mSlicerManagers[index]->IsSecondarySequenceOfFusionSequence() ) {
+    //if the image is involved in a fusion sequence, preserve the overlay panel!
+    int ind = mSlicerManagers[index]->GetFusionSequenceIndexOfLinkedManager();
+    overlayPanel->getFusionProperty(mSlicerManagers[ind]->GetFusionOpacity(),
+      mSlicerManagers[ind]->GetFusionThresholdOpacity(),
+      mSlicerManagers[ind]->GetFusionColorMap(),
+      mSlicerManagers[ind]->GetFusionWindow(),
+      mSlicerManagers[ind]->GetFusionLevel());
+    overlayPanel->getFusionSequenceProperty(mSlicerManagers[ind]->GetFusionSequenceFrameIndex(),
+      mSlicerManagers[ind]->GetFusionSequenceSpatialSyncFlag(), 
+      mSlicerManagers[ind]->GetFusionSequenceNbFrames(),
+      mSlicerManagers[ind]->GetFusionSequenceTemporalSyncFlag());
+  }
   else
+  {
     overlayPanel->getFusionProperty(-1, -1, -1, -1, -1);
+    overlayPanel->getFusionSequenceProperty(-1, false, 0, false);
+  }
 }
 //------------------------------------------------------------------------------
 
@@ -1814,7 +1909,6 @@ void vvMainWindow::UpdateLinkManager(std::string id, int slicer, double x, doubl
 {
   for (unsigned int i = 0; i < mSlicerManagers.size(); i++) {
     if (mSlicerManagers[i]->GetId() == id) {
-      //mSlicerManagers[i]->SetTSlice(temps);
       mSlicerManagers[i]->GetSlicer(slicer)->SetCurrentPosition(x,y,z,temps);
       mSlicerManagers[i]->UpdateViews(0,slicer);
       break;
@@ -1849,7 +1943,7 @@ void vvMainWindow::ShowContextMenu(QPoint point)
     contextActions[1]->setEnabled(1);
     contextActions[2]->setEnabled(
       DataTree->itemWidget(DataTree->selectedItems()[0],
-                           COLUMN_RELOAD_IMAGE)->isEnabled());
+      COLUMN_RELOAD_IMAGE)->isEnabled());
     contextActions[3]->setEnabled(1);
     contextActions[5]->setEnabled(1);
     contextActions[6]->setEnabled(1);
@@ -1892,17 +1986,17 @@ void vvMainWindow::SelectOverlayImage()
       return;
     }
 
-  QString Extensions = EXTENSIONS;
-  Extensions += ";;All Files (*)";
-  QStringList files = QFileDialog::getOpenFileNames(this,tr("Load Overlay image"),mInputPathName,Extensions);
-  if (files.isEmpty())
-    return;
+    QString Extensions = EXTENSIONS;
+    Extensions += ";;All Files (*)";
+    QStringList files = QFileDialog::getOpenFileNames(this,tr("Load Overlay image"),mInputPathName,Extensions);
+    if (files.isEmpty())
+      return;
 
-  std::vector<std::string> vecFileNames;
-  for (int i = 0; i < files.size(); i++) {
-    vecFileNames.push_back(files[i].toStdString());
-  }
-  AddOverlayImage(index,vecFileNames,vvImageReader::IMAGE);
+    std::vector<std::string> vecFileNames;
+    for (int i = 0; i < files.size(); i++) {
+      vecFileNames.push_back(files[i].toStdString());
+    }
+    AddOverlayImage(index,vecFileNames,vvImageReader::IMAGE);
 }
 //------------------------------------------------------------------------------
 
@@ -1914,7 +2008,7 @@ void vvMainWindow::AddOverlayImage(int index, std::vector<std::string> fileNames
   {
     mInputPathName = itksys::SystemTools::GetFilenamePath(file.toStdString()).c_str();
     itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO(
-        file.toStdString().c_str(), itk::ImageIOFactory::ReadMode);
+      file.toStdString().c_str(), itk::ImageIOFactory::ReadMode);
     reader->SetFileName(fileNames[0].c_str());
     reader->ReadImageInformation();
     std::string component = reader->GetComponentTypeAsString(reader->GetComponentType());
@@ -1946,7 +2040,7 @@ void vvMainWindow::AddOverlayImage(int index, std::vector<std::string> fileNames
       cButton->setToolTip(tr("close image"));
       cButton->setIcon(QIcon(QString::fromUtf8(":/common/icons/exit.png")));
       connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
-          this,SLOT(CloseImage(QTreeWidgetItem*, int)));
+        this,SLOT(CloseImage(QTreeWidgetItem*, int)));
 
       QTreePushButton* rButton = new QTreePushButton;
       rButton->setItem(item);
@@ -1954,7 +2048,7 @@ void vvMainWindow::AddOverlayImage(int index, std::vector<std::string> fileNames
       rButton->setToolTip(tr("reload image"));
       rButton->setIcon(QIcon(QString::fromUtf8(":/common/icons/rotateright.png")));
       connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
-          this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
+        this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
 
       DataTree->topLevelItem(index)->setExpanded(1);
       DataTree->topLevelItem(index)->addChild(item);
@@ -1998,12 +2092,12 @@ void vvMainWindow::AddROI(int index, QString file)
   mReader->SetInputFilename(filename.toStdString());
   mReader->Update(IMAGE);
   if (mReader->GetLastError().size() != 0) {
-    std::cerr << "Error while reading " << filename.toStdString() << std::endl;
-    QString error = "Cannot open file \n";
-    error += mReader->GetLastError().c_str();
-    QMessageBox::information(this,tr("Reading problem"),error);
-    delete mReader;
-    return;
+  std::cerr << "Error while reading " << filename.toStdString() << std::endl;
+  QString error = "Cannot open file \n";
+  error += mReader->GetLastError().c_str();
+  QMessageBox::information(this,tr("Reading problem"),error);
+  delete mReader;
+  return;
   }
   vvImage::Pointer roi = mReader->GetOutput();
 
@@ -2020,19 +2114,20 @@ void vvMainWindow::SelectFusionImage()
 
   //check if one fusion image is added
   for (int child = 0; child < DataTree->topLevelItem(index)->childCount(); child++)
-    if (DataTree->topLevelItem(index)->child(child)->data(1,Qt::UserRole).toString() == "fusion") {
-      QString error = "Cannot add more than one fusion image\n";
-      error += "Please remove first ";
-      error += DataTree->topLevelItem(index)->child(child)->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
-      QMessageBox::information(this,tr("Problem adding fusion image !"),error);
-      return;
+    if ( (DataTree->topLevelItem(index)->child(child)->data(1,Qt::UserRole).toString() == "fusion") ||
+      (DataTree->topLevelItem(index)->child(child)->data(1,Qt::UserRole).toString() == "fusionSequence") ) {
+        QString error = "Cannot add more than one fusion image\n";
+        error += "Please remove first ";
+        error += DataTree->topLevelItem(index)->child(child)->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
+        QMessageBox::information(this,tr("Problem adding fusion image !"),error);
+        return;
     }
 
-  QString Extensions = EXTENSIONS;
-  Extensions += ";;All Files (*)";
-  QString file = QFileDialog::getOpenFileName(this,tr("Load Fusion image"),mInputPathName,Extensions);
-  if (!file.isEmpty())
-    AddFusionImage(index,file);
+    QString Extensions = EXTENSIONS;
+    Extensions += ";;All Files (*)";
+    QString file = QFileDialog::getOpenFileName(this,tr("Load Fusion image"),mInputPathName,Extensions);
+    if (!file.isEmpty())
+      AddFusionImage(index,file);
 }
 //------------------------------------------------------------------------------
 
@@ -2053,7 +2148,7 @@ void vvMainWindow::AddFusionImage(int index, QString file)
   {
     mInputPathName = itksys::SystemTools::GetFilenamePath(file.toStdString()).c_str();
     itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO(
-        file.toStdString().c_str(), itk::ImageIOFactory::ReadMode);
+      file.toStdString().c_str(), itk::ImageIOFactory::ReadMode);
     reader->SetFileName(file.toStdString().c_str());
     reader->ReadImageInformation();
     std::string component = reader->GetComponentTypeAsString(reader->GetComponentType());
@@ -2064,50 +2159,50 @@ void vvMainWindow::AddFusionImage(int index, QString file)
 
       std::string filename = itksys::SystemTools::GetFilenameWithoutExtension(file.toStdString()).c_str();
       if (mSlicerManagers[index]->SetFusion(file.toStdString(),
-            reader->GetNumberOfDimensions(), component)) {
-        //create an item in the tree with good settings
-        QTreeWidgetItem *item = new QTreeWidgetItem();
-        item->setData(0,Qt::UserRole,file.toStdString().c_str());
-        item->setData(1,Qt::UserRole,tr("fusion"));
-        QFileInfo fileinfo(filename.c_str()); //Do not show the path
-        item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,fileinfo.fileName());
-        item->setToolTip(COLUMN_IMAGE_NAME, mSlicerManagers[index]->GetListOfAbsoluteFilePathInOneString("fusion").c_str());
-        qApp->processEvents();
-
-        for (int j = 1; j <= 4; j++) {
-          item->setData(j,Qt::CheckStateRole,DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole));
-        }
+        reader->GetNumberOfDimensions(), component)) {
+          //create an item in the tree with good settings
+          QTreeWidgetItem *item = new QTreeWidgetItem();
+          item->setData(0,Qt::UserRole,file.toStdString().c_str());
+          item->setData(1,Qt::UserRole,tr("fusion"));
+          QFileInfo fileinfo(filename.c_str()); //Do not show the path
+          item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,fileinfo.fileName());
+          item->setToolTip(COLUMN_IMAGE_NAME, mSlicerManagers[index]->GetListOfAbsoluteFilePathInOneString("fusion").c_str());
+          qApp->processEvents();
+
+          for (int j = 1; j <= 4; j++) {
+            item->setData(j,Qt::CheckStateRole,DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole));
+          }
 
-        //Create the buttons for reload and close
-        qApp->processEvents();
-        QTreePushButton* cButton = new QTreePushButton;
-        cButton->setItem(item);
-        cButton->setColumn(COLUMN_CLOSE_IMAGE);
-        cButton->setToolTip(tr("close image"));
-        cButton->setIcon(QIcon(QString::fromUtf8(":/common/icons/exit.png")));
-        connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
+          //Create the buttons for reload and close
+          qApp->processEvents();
+          QTreePushButton* cButton = new QTreePushButton;
+          cButton->setItem(item);
+          cButton->setColumn(COLUMN_CLOSE_IMAGE);
+          cButton->setToolTip(tr("close image"));
+          cButton->setIcon(QIcon(QString::fromUtf8(":/common/icons/exit.png")));
+          connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
             this,SLOT(CloseImage(QTreeWidgetItem*, int)));
 
-        QTreePushButton* rButton = new QTreePushButton;
-        rButton->setItem(item);
-        rButton->setColumn(COLUMN_RELOAD_IMAGE);
-        rButton->setToolTip(tr("reload image"));
-        rButton->setIcon(QIcon(QString::fromUtf8(":/common/icons/rotateright.png")));
-        connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
+          QTreePushButton* rButton = new QTreePushButton;
+          rButton->setItem(item);
+          rButton->setColumn(COLUMN_RELOAD_IMAGE);
+          rButton->setToolTip(tr("reload image"));
+          rButton->setIcon(QIcon(QString::fromUtf8(":/common/icons/rotateright.png")));
+          connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
             this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
 
-        DataTree->topLevelItem(index)->setExpanded(1);
-        DataTree->topLevelItem(index)->addChild(item);
-        DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
-        DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
-
-        //set the id of the image
-        QString id = DataTree->topLevelItem(index)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString();
-        item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
-        UpdateTree();
-        qApp->processEvents();
-        ImageInfoChanged();
-        QApplication::restoreOverrideCursor();
+          DataTree->topLevelItem(index)->setExpanded(1);
+          DataTree->topLevelItem(index)->addChild(item);
+          DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
+          DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
+
+          //set the id of the image
+          QString id = DataTree->topLevelItem(index)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString();
+          item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
+          UpdateTree();
+          qApp->processEvents();
+          ImageInfoChanged();
+          QApplication::restoreOverrideCursor();
       } else {
         QApplication::restoreOverrideCursor();
         QString error = "Cannot import the new image.\n";
@@ -2147,16 +2242,16 @@ void vvMainWindow::OpenField()
       return;
     }
 
-  QString Extensions = "Images ( *.mhd)";
-  Extensions += ";;Images ( *.mha)";
-  Extensions += ";;VF Images ( *.vf)";
-  Extensions += ";;nii Images ( *.nii)";
-  Extensions += ";;nrrd Images ( *.nrrd)";
-  Extensions += ";;nhdr Images ( *.nhdr)";
-  Extensions += ";;All Files (*)";
-  QString file = QFileDialog::getOpenFileName(this,tr("Load deformation field"),mInputPathName,Extensions);
-  if (!file.isEmpty())
-    AddField(file,index);
+    QString Extensions = "Images ( *.mhd)";
+    Extensions += ";;Images ( *.mha)";
+    Extensions += ";;VF Images ( *.vf)";
+    Extensions += ";;nii Images ( *.nii)";
+    Extensions += ";;nrrd Images ( *.nrrd)";
+    Extensions += ";;nhdr Images ( *.nhdr)";
+    Extensions += ";;All Files (*)";
+    QString file = QFileDialog::getOpenFileName(this,tr("Load deformation field"),mInputPathName,Extensions);
+    if (!file.isEmpty())
+      AddField(file,index);
 }
 //------------------------------------------------------------------------------
 
@@ -2185,7 +2280,7 @@ void vvMainWindow::AddFieldEntry(QString filename,int index,bool from_disk)
   cButton->setToolTip(tr("close vector field"));
   cButton->setIcon(QIcon(QString::fromUtf8(":/common/icons/exit.png")));
   connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
-          this,SLOT(CloseImage(QTreeWidgetItem*, int)));
+    this,SLOT(CloseImage(QTreeWidgetItem*, int)));
 
   QTreePushButton* rButton = new QTreePushButton;
   rButton->setItem(item);
@@ -2194,7 +2289,7 @@ void vvMainWindow::AddFieldEntry(QString filename,int index,bool from_disk)
   rButton->setEnabled(from_disk);
   rButton->setIcon(QIcon(QString::fromUtf8(":/common/icons/rotateright.png")));
   connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
-          this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
+    this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
 
   DataTree->topLevelItem(index)->setExpanded(1);
   DataTree->topLevelItem(index)->addChild(item);
@@ -2313,6 +2408,289 @@ void vvMainWindow::SetFusionProperty(int opacity, int thresOpacity, int colormap
 }
 //------------------------------------------------------------------------------
 
+
+//------------------------------------------------------------------------------
+void vvMainWindow::SelectFusionSequence()
+{
+  //get the index of the slicer manager of the main sequence (CT)
+  int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
+  //check if one overlay image is already associated
+  for (int child = 0; child < DataTree->topLevelItem(index)->childCount(); child++)
+    if ( (DataTree->topLevelItem(index)->child(child)->data(1,Qt::UserRole).toString() == "fusion") ||
+      (DataTree->topLevelItem(index)->child(child)->data(1,Qt::UserRole).toString() == "fusionSequence") ) {
+        QString error = "Cannot add more than one compared image\n";
+        error += "Please remove first ";
+        error += DataTree->topLevelItem(index)->child(child)->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
+        QMessageBox::information(this,tr("Problem adding compared image !"),error);
+        return;
+    }
+
+    QString Extensions = EXTENSIONS;
+    Extensions += ";;All Files (*)";
+    QStringList files = QFileDialog::getOpenFileNames(this,tr("Load Overlay image sequence"),mInputPathName,Extensions);
+    if (files.isEmpty())
+      return;
+
+    std::vector<std::string> vecFileNames;
+    for (int i = 0; i < files.size(); i++) {
+      vecFileNames.push_back(files[i].toStdString());
+    }
+
+    //associate the secondary sequence (US) to the main one
+    AddFusionSequence(index,vecFileNames,vvImageReader::MERGEDWITHTIME);
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvMainWindow::SelectFusionSequenceTemporalSignal() {
+
+  //make sure the index is right?
+  //in the end, I should attach the temporal data to the right sequence!
+  int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
+  //in case the other sequence got selected, make sure we select the primary sequence
+  if ( (!mSlicerManagers[index]->GetSlicer(0)->GetFusion()) && mSlicerManagers[index]->GetFusionSequenceIndexOfLinkedManager()>=0 ) {
+    index = mSlicerManagers[index]->GetFusionSequenceIndexOfLinkedManager();
+  }
+
+  //open a dialog box to find a file
+  QString Extensions = EXTENSIONS;
+  Extensions += ";;All Files (*)";
+  QString fileName = QFileDialog::getOpenFileName(this,tr("Load respiratory signal for fused sequence"),mInputPathName,Extensions);
+  if (fileName.isNull())
+    return;
+
+  //read it as a vector of values
+  std::vector<double> signal;
+  //...TODO, look for itk functions that can do that... vnl in the worst case.
+  signal.push_back(1);signal.push_back(2);
+
+  //TODO: instead: if the loaded signal is longer, just crop it...
+  //this allows loading only the first few frames when testing.
+  //->maybe raise a message that this behavior may be unsafe...
+
+  //if compatible with the fused image sequence (number of images = number of entries), enable the temporalSync
+  if ( signal.size() >= mSlicerManagers[index]->GetFusionSequenceNbFrames()) {
+    //for convenience, associate this sequence to both the current slicer manager, and to the linked one
+    mSlicerManagers[index]->SetFusionSequenceTemporalSignal(signal);
+    mSlicerManagers[ mSlicerManagers[index]->GetFusionSequenceIndexOfLinkedManager() ]->SetFusionSequenceTemporalSignal(signal);
+    overlayPanel->enableFusionSequenceTemporalSync();
+    QMessageBox::information(this,tr("Adding signal"),"would add the signal from file: "+ fileName);
+  }
+  else {//else, send a message to signal the failure...
+    QString error = "The provided signal doesn't have the same duration as the sequence\n";
+    error += "Ignoring file: " + fileName;
+    QMessageBox::information(this,tr("Problem adding signal!"),error);
+    return;
+  }
+
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+//when this function is called index is the slicer manager index corresponding to the main sequence (CT)
+//the files behind fileNames points to the data for the secondary sequence
+void vvMainWindow::AddFusionSequence(int index, std::vector<std::string> fileNames, vvImageReader::LoadedImageType type)
+{
+  QString file(fileNames[0].c_str());
+  if (QFile::exists(file))
+  {
+    mInputPathName = itksys::SystemTools::GetFilenamePath(file.toStdString()).c_str();
+    itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO(
+      file.toStdString().c_str(), itk::ImageIOFactory::ReadMode);
+    reader->SetFileName(fileNames[0].c_str());
+    reader->ReadImageInformation();
+    std::string component = reader->GetComponentTypeAsString(reader->GetComponentType());
+    int dimension = reader->GetNumberOfDimensions();
+    QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
+    vvProgressDialog progress("Opening " + file.toStdString());
+    qApp->processEvents();
+
+    std::string filename = itksys::SystemTools::GetFilenameWithoutExtension(file.toStdString()).c_str();
+
+    if (mSlicerManagers[index]->SetFusionSequence(fileNames,dimension, component,type)) {
+      //create an item in the tree with good settings
+      QTreeWidgetItem *item = new QTreeWidgetItem();
+      item->setData(0,Qt::UserRole,file.toStdString().c_str());
+      item->setData(1,Qt::UserRole,tr("fusionSequence"));
+
+      QFileInfo fileinfo(file); //Do not show the path
+      item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,fileinfo.fileName());
+      item->setToolTip(COLUMN_IMAGE_NAME, mSlicerManagers[index]->GetListOfAbsoluteFilePathInOneString("fusionSequence").c_str());
+      qApp->processEvents();
+      for (int j = 1; j <= 4; j++) {
+        item->setData(j,Qt::CheckStateRole,DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole));
+      }
+
+      //Create the buttons for reload and close
+      qApp->processEvents();
+      QTreePushButton* cButton = new QTreePushButton;
+      cButton->setItem(item);
+      cButton->setColumn(COLUMN_CLOSE_IMAGE);
+      cButton->setToolTip(tr("close image"));
+      cButton->setIcon(QIcon(QString::fromUtf8(":/common/icons/exit.png")));
+      connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
+        this,SLOT(CloseImage(QTreeWidgetItem*, int)));
+
+      QTreePushButton* rButton = new QTreePushButton;
+      rButton->setItem(item);
+      rButton->setColumn(COLUMN_RELOAD_IMAGE);
+      rButton->setToolTip(tr("reload image"));
+      rButton->setIcon(QIcon(QString::fromUtf8(":/common/icons/rotateright.png")));
+      connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
+        this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
+
+      DataTree->topLevelItem(index)->setExpanded(1);
+      DataTree->topLevelItem(index)->addChild(item);
+      DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
+      DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
+
+      //store the original transform matrix
+      int indexParent = GetSlicerIndexFromItem( DataTree->topLevelItem(index) );
+      mSlicerManagers[indexParent]->SetFusionSequenceMainTransformMatrix( mSlicerManagers[indexParent]->GetSlicer(0)->GetImage()->GetTransform()[0]->GetMatrix() );
+
+      //set the id of the image
+      QString id = DataTree->topLevelItem(index)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString();
+      item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
+      UpdateTree();
+      qApp->processEvents();
+
+      //ImageInfoChanged();
+
+      QApplication::restoreOverrideCursor();
+      // Update the display to update, e.g., the sliders
+      for(int i=0; i<4; i++)
+        DisplaySliders(index, i);
+
+
+      //This loads the secondary sequence (US) as an independent sequence
+      LoadImages(fileNames, type);
+      //reset the transforms to identiy
+      for (unsigned i=0 ; i<mSlicerManagers.back()->GetImage()->GetTransform().size() ; i++) {
+        mSlicerManagers.back()->GetImage()->GetTransform()[i]->Identity();
+        mSlicerManagers.back()->GetImage()->GetTransform()[i]->Update();
+      }
+
+      //automatically link both images...
+      AddLink(mSlicerManagers[indexParent]->GetId().c_str(), mSlicerManagers.back()->GetId().c_str(), false);
+
+      //tie the main and secondary sequences by raising flags and informing each another of their respective SlicerManager indices
+      mSlicerManagers[indexParent]->SetFusionSequenceIndexOfLinkedManager(mSlicerManagers.size()-1);
+      mSlicerManagers[indexParent]->SetFusionSequenceInvolvmentCode(0); //main sequence
+      mSlicerManagers.back()->SetFusionSequenceIndexOfLinkedManager(indexParent);
+      mSlicerManagers.back()->SetFusionSequenceInvolvmentCode(1); //secondary sequence
+      for (unsigned i=0 ; i<4 ; i++) {
+        mSlicerManagers.back()->GetSlicer(i)->SetFusionSequenceCode(1); //flag the slicers of the secondary sequence
+      }
+
+    } else {
+      QApplication::restoreOverrideCursor();
+      QString error = "Cannot import the new image.\n";
+      error += mSlicerManagers[index]->GetLastError().c_str();
+      QMessageBox::information(this,tr("Problem reading image !"),error);
+    }
+    //WindowLevelChanged();
+    ImageInfoChanged(); //this internally calls WindowLevelChanged...
+  }
+  else {
+    QMessageBox::information(this,tr("Problem reading fusion sequence !"),"File doesn't exist!");
+    return;
+  }
+
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+//fusionSequenceFrameIndex and fusionSequenceNbFrames are relative to the secondary sequence (US)
+void vvMainWindow::SetFusionSequenceProperty(int fusionSequenceFrameIndex, bool spatialSyncFlag, unsigned int fusionSequenceNbFrames, bool temporalSyncFlag)
+{
+  int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
+
+  if (!mSlicerManagers[index]->IsInvolvedInFusionSequence()) return; 
+
+  //check if the focus moved to the linked sequence, and in this case, select the master sequence instead
+  if (!mSlicerManagers[index]->IsMainSequenceOfFusionSequence()) {
+    index = mSlicerManagers[index]->GetFusionSequenceIndexOfLinkedManager();
+  }
+  int secondaryIndex = mSlicerManagers[index]->GetFusionSequenceIndexOfLinkedManager();
+  if (secondaryIndex==-1) return; //this should never happen
+  if ( (!mSlicerManagers[index]->IsMainSequenceOfFusionSequence()) || 
+    (!mSlicerManagers[secondaryIndex]->IsSecondarySequenceOfFusionSequence()) ) 
+  {return;} //this should never happen, raise an exception?
+
+  if (mSlicerManagers[index]->GetSlicer(0)->GetFusion()) {
+
+    //First, if the spatialSync button is unchecked, then reposition the parent sequence (CT) in its original coordinate frame
+    if ( (!spatialSyncFlag) && (mSlicerManagers[index]->GetFusionSequenceSpatialSyncFlag()) ) {
+      for ( unsigned i=0 ; i<mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetTransform().size() ; i++ ) {
+        mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetTransform()[i]->SetMatrix( mSlicerManagers[index]->GetFusionSequenceMainTransformMatrix() );
+        mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetTransform()[i]->Update();
+      }
+
+      for (int i=0; i<mSlicerManagers[index]->GetNumberOfSlicers(); i++) {
+        mSlicerManagers[index]->GetSlicer(i)->ForceUpdateDisplayExtent();
+        mSlicerManagers[index]->GetSlicer(i)->Render();
+      }
+    }
+
+    //then, update the property values in the slicer manager
+    mSlicerManagers[index]->SetFusionSequenceLength(fusionSequenceNbFrames);
+    mSlicerManagers[index]->SetFusionSequenceSpatialSyncFlag(spatialSyncFlag);
+    mSlicerManagers[index]->SetFusionSequenceTemporalSyncFlag(temporalSyncFlag);
+    mSlicerManagers[index]->SetFusionSequenceFrameIndex(fusionSequenceFrameIndex);
+
+    //select the right frame of the US sequence
+    mSlicerManagers[index]->SetFusionSequenceTSlice(fusionSequenceFrameIndex); //here, I should only update the overlayed sequence
+    mSlicerManagers[secondaryIndex]->SetTSlice(fusionSequenceFrameIndex, false); //this should update the secondary sequence (individual version)
+
+    //update the horizontal sliders of the main window
+    overlayPanel->updateFusionSequenceSliderValueFromWindow(fusionSequenceFrameIndex, false);
+
+    if (spatialSyncFlag) { //reslice the CT
+
+      if (temporalSyncFlag) { //do the temporal synchronisation
+        //TODO: add the temporal synchronisation stuff
+        //if the button is checked, get the phase of the requested US frame from the available signal
+        //and select the corresponding one in the CT. (check the one just before, and the one just after, and select the closest)
+
+        //TODO: do it also the other way around, when modifying the time index related to CT, select a close frame
+        //this should not be done here directly, but the code should be inspired from the one here
+        //->find a good US frame such that when calling this function with this US frame, it produces the expected result
+
+
+        //TODO: select the right CT image to display
+        int mainSequenceFrameIndex=0;
+        //estimate the TSlice to set to the CT
+
+        //and set it!
+        mSlicerManagers[index]->SetTSlice(mainSequenceFrameIndex, false);
+      }
+
+
+      //Set the transform matrix of the parent sequence (typically CT / 4DCT)
+      vtkSmartPointer<vtkMatrix4x4> tmpMat = vtkSmartPointer<vtkMatrix4x4>::New();
+      vtkMatrix4x4::Invert( mSlicerManagers[index]->GetFusionSequenceInitialTransformMatrixAtFrame(fusionSequenceFrameIndex), tmpMat );
+      for ( unsigned i=0 ; i<mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetTransform().size() ; i++ ) {
+        mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetTransform()[i]->SetMatrix( mSlicerManagers[index]->GetFusionSequenceMainTransformMatrix() );
+        mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetTransform()[i]->PreMultiply();
+        mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetTransform()[i]->Concatenate( tmpMat );
+        mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetTransform()[i]->Update();
+      }
+
+      for (int i=0; i<mSlicerManagers[index]->GetNumberOfSlicers(); i++) {
+        mSlicerManagers[index]->GetSlicer(i)->ForceUpdateDisplayExtent();
+        mSlicerManagers[index]->GetSlicer(i)->Render();
+      }
+
+    }
+
+  }
+}
+//------------------------------------------------------------------------------
+
+
 //------------------------------------------------------------------------------
 void vvMainWindow::SaveAs()
 {
@@ -2360,50 +2738,50 @@ void vvMainWindow::SaveAs()
     Extensions += ")";
   }
   QString fileName = QFileDialog::getSaveFileName(this,
-                     tr("Save As"),
-                     mSlicerManagers[index]->GetFileName().c_str(),
-                     Extensions);
+    tr("Save As"),
+    mSlicerManagers[index]->GetFileName().c_str(),
+    Extensions);
   if (!fileName.isEmpty()) {
     std::string fileformat = itksys::SystemTools::GetFilenameLastExtension(fileName.toStdString());
     if (OutputListeFormat.contains(
-          fileformat.c_str())) {
-      QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
-      std::string action = "Saving";
-      vvProgressDialog progress("Saving "+fileName.toStdString());
-      qApp->processEvents();
-      vvImageWriter::Pointer writer = vvImageWriter::New();
-      writer->SetOutputFileName(fileName.toStdString());
-      writer->SetInput(mSlicerManagers[index]->GetImage());
-
-      // Check on transform and prompt user
-      writer->SetSaveTransform(false);
-      bool bId = true;
-      for(int i=0; i<4; i++)
-        for(int j=0; j<4; j++) {
-          // TODO SR and BP: check on the list of transforms and not the first only
-          double elt = mSlicerManagers[index]->GetImage()->GetTransform()[0]->GetMatrix()->GetElement(i,j);
-          if(i==j && elt!=1.)
-            bId = false;
-          if(i!=j && elt!=0.)
-            bId = false;
-        }
-      if( !bId ) {
-        QString warning = "The image has an associated linear transform. Do you want to save it along?";
-        QMessageBox msgBox(QMessageBox::Warning, tr("Save transform"), warning, 0, this);
-        msgBox.addButton(tr("Yes"), QMessageBox::AcceptRole);
-        msgBox.addButton(tr("No"), QMessageBox::RejectRole);
-        if (msgBox.exec() == QMessageBox::AcceptRole)
-          writer->SetSaveTransform(true);
-      }
+      fileformat.c_str())) {
+        QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
+        std::string action = "Saving";
+        vvProgressDialog progress("Saving "+fileName.toStdString());
+        qApp->processEvents();
+        vvImageWriter::Pointer writer = vvImageWriter::New();
+        writer->SetOutputFileName(fileName.toStdString());
+        writer->SetInput(mSlicerManagers[index]->GetImage());
+
+        // Check on transform and prompt user
+        writer->SetSaveTransform(false);
+        bool bId = true;
+        for(int i=0; i<4; i++)
+          for(int j=0; j<4; j++) {
+            // TODO SR and BP: check on the list of transforms and not the first only
+            double elt = mSlicerManagers[index]->GetImage()->GetTransform()[0]->GetMatrix()->GetElement(i,j);
+            if(i==j && elt!=1.)
+              bId = false;
+            if(i!=j && elt!=0.)
+              bId = false;
+          }
+          if( !bId ) {
+            QString warning = "The image has an associated linear transform. Do you want to save it along?";
+            QMessageBox msgBox(QMessageBox::Warning, tr("Save transform"), warning, 0, this);
+            msgBox.addButton(tr("Yes"), QMessageBox::AcceptRole);
+            msgBox.addButton(tr("No"), QMessageBox::RejectRole);
+            if (msgBox.exec() == QMessageBox::AcceptRole)
+              writer->SetSaveTransform(true);
+          }
 
-      writer->Update();
-      QApplication::restoreOverrideCursor();
-      if (writer->GetLastError().size()) {
-        QString error = "Saving did not succeed\n";
-        error += writer->GetLastError().c_str();
-        QMessageBox::information(this,tr("Saving Problem"),error);
-        SaveAs();
-      }
+          writer->Update();
+          QApplication::restoreOverrideCursor();
+          if (writer->GetLastError().size()) {
+            QString error = "Saving did not succeed\n";
+            error += writer->GetLastError().c_str();
+            QMessageBox::information(this,tr("Saving Problem"),error);
+            SaveAs();
+          }
     } else {
       QString error = fileformat.c_str();
       if (error.isEmpty())
@@ -2422,10 +2800,10 @@ void vvMainWindow::SaveCurrentState()
 {
   QString Extensions = "XML Files(*.xml)";
   QString fileName = QFileDialog::getSaveFileName(this,
-                     tr("Save Current Window State"),
-                     "",
-                     Extensions);
-                     
+    tr("Save Current Window State"),
+    "",
+    Extensions);
+
   SaveCurrentStateAs(fileName.toStdString());
 }
 //------------------------------------------------------------------------------
@@ -2442,10 +2820,10 @@ void vvMainWindow::ReadSavedState()
 {
   QString Extensions = "XML Files(*.xml)";
   QString fileName = QFileDialog::getOpenFileName(this,
-                     tr("Load Window State"),
-                     "",
-                     Extensions);
-                     
+    tr("Load Window State"),
+    "",
+    Extensions);
+
   ReadSavedStateFile(fileName.toStdString());
 }
 //------------------------------------------------------------------------------
@@ -2461,7 +2839,7 @@ void vvMainWindow::ReadSavedStateFile(const std::string& stateFile)
 //------------------------------------------------------------------------------
 void vvMainWindow::LinkAllImages()
 {
-       linkPanel->linkAll();
+  linkPanel->linkAll();
 }
 
 //------------------------------------------------------------------------------
@@ -2472,7 +2850,7 @@ void vvMainWindow::AddLink(QString image1,QString image2,bool fromPanel)
     linkPanel->addLinkFromIds(image1, image2);
     return;
   }
-  
+
   unsigned int sm1 = 0;
   unsigned int sm2 = 0;
 
@@ -2529,15 +2907,32 @@ void vvMainWindow::ChangeImageWithIndexOffset(vvSlicerManager *sm, int slicer, i
   DisplayChanged(item,slicer+1);
 }
 //------------------------------------------------------------------------------
-
 void vvMainWindow::HorizontalSliderMoved(int value,int column, int slicer_index)
 {
   for (unsigned int i = 0; i < mSlicerManagers.size(); i++) {
     if (DataTree->topLevelItem(i)->data(column,Qt::CheckStateRole).toInt() > 1) {
+      //i is the SlicerManager that is in charge of this slicer.
+      if (mSlicerManagers[i]->IsInvolvedInFusionSequence()) {
+        //if the slicerManager is involved in a fusionSequence as the secondary sequence, then update the slider position in the overlay panel and everything accordingly
+        if (mSlicerManagers[i]->IsSecondarySequenceOfFusionSequence()) { 
+          overlayPanel->updateFusionSequenceSliderValueFromWindow(value, true); 
+        }
+        else { //if this is the primary sequence that has been modified
+          if (mSlicerManagers[i]->GetFusionSequenceTemporalSyncFlag()) {            
+            //WARNING: for some obscure reason, there are problems when accessing mSlicerManagers[mSlicerManagers[i]->GetFusionSequenceIndexOfLinkedManager()]->GetFusionSequenceFrameIndex();
+
+            //int estimatedValue=mSlicerManagers[mSlicerManagers[i]->GetFusionSequenceIndexOfLinkedManager()]->GetFusionSequenceFrameIndex();
+            int estimatedValue=0;
+            //TODO: if temporal sync is active
+            //estimate a corresponding time index for the secondary (US) sequence, and update it accordingly.
+            //estimatedValue = ...
+            overlayPanel->updateFusionSequenceSliderValueFromWindow(estimatedValue, true);
+          }
+        }
+      }
+
       for (int j = 0; j < 4; j++) {
         mSlicerManagers[i]->SetTSliceInSlicer(value,j);
-        //if (mSlicerManagers[i]->GetSlicer(j)->GetImageActor()->GetVisibility())
-        //UpdateTSlice(j,value);
       }
       mSlicerManagers[i]->GetSlicer(slicer_index)->Render();
       break;
@@ -2552,7 +2947,7 @@ void vvMainWindow::NOHorizontalSliderMoved()
 {
   // if (mCurrentTime == NOHorizontalSlider->value()) return;
   HorizontalSliderMoved(NOHorizontalSlider->value(),COLUMN_UL_VIEW,0);
-//  mCurrentTime = NOHorizontalSlider->value();
+  //  mCurrentTime = NOHorizontalSlider->value();
 }
 //------------------------------------------------------------------------------
 
@@ -2562,7 +2957,7 @@ void vvMainWindow::NEHorizontalSliderMoved()
 {
   // if (mCurrentTime == NEHorizontalSlider->value()) return;
   HorizontalSliderMoved(NEHorizontalSlider->value(),COLUMN_UR_VIEW,1);
-//  mCurrentTime = NEHorizontalSlider->value();
+  //  mCurrentTime = NEHorizontalSlider->value();
 }
 //------------------------------------------------------------------------------
 
@@ -2683,8 +3078,8 @@ void vvMainWindow::SEVerticalSliderChanged()
 void vvMainWindow::UpdateSlice(int slicer, int slice)
 {
   // DD("vvMainWindow::UpdateSlice");
-//   DD(slicer);
-//   DD(slice);
+  //   DD(slicer);
+  //   DD(slice);
   if (slicer == 0) {
     //    if (slice != NOVerticalSlider->value())
     NOVerticalSlider->setValue(slice);
@@ -2706,19 +3101,37 @@ void vvMainWindow::UpdateSlice(int slicer, int slice)
 
 
 //------------------------------------------------------------------------------
-void vvMainWindow::UpdateTSlice(int slicer, int slice)
+void vvMainWindow::UpdateTSlice(int slicer, int slice, int code)
 {
+  //FusionSequence: the slider value should be updated for slicers which show the same sequence as requested
+  bool doUpdate=false;
+  if (code==-1) doUpdate=true;
+  else {
+    for (unsigned int i = 0; i < mSlicerManagers.size(); i++) {
+      if (DataTree->topLevelItem(i)->data(slicer+1,Qt::CheckStateRole).toInt() > 1) {
+        //i is the active SlicerManager
+        if (mSlicerManagers[i]->GetFusionSequenceInvolvmentCode()==code) doUpdate=true;
+        break;
+      }
+    }
+  }
+  if (!doUpdate) return;
+
   switch (slicer) {
   case 0:
+    if (NOHorizontalSlider->value()==slice) return;
     NOHorizontalSlider->setValue(slice);
     break;
   case 1:
+    if (NEHorizontalSlider->value()==slice) return;
     NEHorizontalSlider->setValue(slice);
     break;
   case 2:
+    if (SOHorizontalSlider->value()==slice) return;
     SOHorizontalSlider->setValue(slice);
     break;
   case 3:
+    if (SEHorizontalSlider->value()==slice) return;
     SEHorizontalSlider->setValue(slice);
     break;
   }
@@ -2799,9 +3212,9 @@ void vvMainWindow::SaveScreenshotAllSlices()
 
   // Select filename base
   QString filename = QFileDialog::getSaveFileName(this,
-                                                  tr("Save As (filename will be completed by slice number)"),
-                                                  itksys::SystemTools::GetFilenamePath(mSlicerManagers[index]->GetFileName()).c_str(),
-                                                  "Images( *.png);;Images( *.jpg)");
+    tr("Save As (filename will be completed by slice number)"),
+    itksys::SystemTools::GetFilenamePath(mSlicerManagers[index]->GetFileName()).c_str(),
+    "Images( *.png);;Images( *.jpg)");
 
   // Loop on slices
   for(int i=0; i<nbSlices; i++) {
@@ -2816,7 +3229,7 @@ void vvMainWindow::SaveScreenshotAllSlices()
     windowToImageFilter->SetMagnification(1);
     windowToImageFilter->SetInputBufferTypeToRGBA(); //also record the alpha (transparency) channel
     windowToImageFilter->Update();
-    
+
     vtkSmartPointer<vtkPNGWriter> writer = vtkSmartPointer<vtkPNGWriter>::New();
     std::string fn = itksys::SystemTools::GetFilenameWithoutLastExtension(filename.toStdString());
     std::string num = clitk::toString(i);
@@ -2854,9 +3267,9 @@ void vvMainWindow::SaveScreenshot(QVTKWidget *widget)
 
   int smIndex=GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
   QString fileName = QFileDialog::getSaveFileName(this,
-                     tr("Save As"),
-                     itksys::SystemTools::GetFilenamePath(mSlicerManagers[smIndex]->GetFileName()).c_str(),
-                     Extensions);
+    tr("Save As"),
+    itksys::SystemTools::GetFilenamePath(mSlicerManagers[smIndex]->GetFileName()).c_str(),
+    Extensions);
 
   if (!fileName.isEmpty()) {
     vtkSmartPointer<vtkWindowToImageFilter> w2i = vtkSmartPointer<vtkWindowToImageFilter>::New();
@@ -2897,13 +3310,13 @@ void vvMainWindow::SaveScreenshot(QVTKWidget *widget)
       // FPS
       bool ok;
       int fps = QInputDialog::getInteger(this, tr("Number of frames per second"),
-                                     tr("FPS:"), 5, 0, 1000, 1, &ok);
+        tr("FPS:"), 5, 0, 1000, 1, &ok);
       if(ok)
         gif->SetRate(fps);
 
       // Loops
       int loops = QInputDialog::getInteger(this, tr("Loops"),
-                                     tr("Number of loops (0 means infinite):"), 0, 0, 1000000000, 1, &ok);
+        tr("Number of loops (0 means infinite):"), 0, 0, 1000000000, 1, &ok);
       if(ok)
         gif->SetLoops(loops);
 
@@ -2922,7 +3335,7 @@ void vvMainWindow::SaveScreenshot(QVTKWidget *widget)
       mpg->SetQuality(2);
       bool ok;
       int fps = QInputDialog::getInteger(this, tr("Number of frames per second"),
-                                     tr("FPS:"), 5, 0, 1024, 1, &ok);
+        tr("FPS:"), 5, 0, 1024, 1, &ok);
       if(!ok)
         fps = 5;
       mpg->SetRate(fps);
@@ -2935,7 +3348,7 @@ void vvMainWindow::SaveScreenshot(QVTKWidget *widget)
       mpg->SetQuality(2);
       bool ok;
       int fps = QInputDialog::getInteger(this, tr("Number of frames per second"),
-                                     tr("FPS:"), 5, 0, 1024, 1, &ok);
+        tr("FPS:"), 5, 0, 1024, 1, &ok);
       if(!ok)
         fps = 5;
       mpg->SetRate(fps);
@@ -3024,11 +3437,11 @@ void vvMainWindow::PlayPause()
         has_temporal=true;
         break;
       }
-    if (has_temporal) {
-      playMode = 1;
-      playButton->setIcon(QIcon(QString::fromUtf8(":/common/icons/player_pause.png")));
-      QTimer::singleShot(1000/mFrameRate, this, SLOT(PlayNext()));
-    }
+      if (has_temporal) {
+        playMode = 1;
+        playButton->setIcon(QIcon(QString::fromUtf8(":/common/icons/player_pause.png")));
+        QTimer::singleShot(1000/mFrameRate, this, SLOT(PlayNext()));
+      }
   }
 }
 //------------------------------------------------------------------------------
@@ -3042,11 +3455,11 @@ void vvMainWindow::PlayNext()
     for (int i=0; i<image_number; i++)
       for (int j=0; j<4; j++)
         if (mSlicerManagers[i]->GetSlicer(0)->GetTMax() > 0 &&
-            DataTree->topLevelItem(i)->data(j+1,Qt::CheckStateRole).toInt() > 0) {
-          mSlicerManagers[i]->SetNextTSlice(j);
-          break;
+          DataTree->topLevelItem(i)->data(j+1,Qt::CheckStateRole).toInt() > 0) {
+            mSlicerManagers[i]->SetNextTSlice(j);
+            break;
         }
-    QTimer::singleShot(1000/mFrameRate, this, SLOT(PlayNext()));
+        QTimer::singleShot(1000/mFrameRate, this, SLOT(PlayNext()));
   }
 }
 //------------------------------------------------------------------------------
@@ -3103,8 +3516,8 @@ int vvMainWindow::GetImageDuplicateFilenameNumber(std::string filename)
   for(unsigned int l=0; l<mSlicerManagers.size(); l++) {
     vvSlicerManager * v = mSlicerManagers[l];
     if (v->GetBaseFileName() ==
-        vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(filename))) {
-      number = std::max(number, v->GetBaseFileNameNumber()+1);
+      vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(filename))) {
+        number = std::max(number, v->GetBaseFileNameNumber()+1);
     }
   }
   return number;
@@ -3141,7 +3554,7 @@ vvSlicerManager* vvMainWindow::AddImage(vvImage::Pointer image,std::string filen
   cButton->setColumn(COLUMN_CLOSE_IMAGE);
   cButton->setIcon(QIcon(QString::fromUtf8(":/common/icons/exit.png")));
   connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
-          this,SLOT(CloseImage(QTreeWidgetItem*, int)));
+    this,SLOT(CloseImage(QTreeWidgetItem*, int)));
 
   QTreePushButton* rButton = new QTreePushButton;
   rButton->setItem(item);
@@ -3149,7 +3562,7 @@ vvSlicerManager* vvMainWindow::AddImage(vvImage::Pointer image,std::string filen
   rButton->setIcon(QIcon(QString::fromUtf8(":/common/icons/rotateright.png")));
   rButton->setEnabled(0);
   connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
-          this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
+    this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
 
   DataTree->addTopLevelItem(item);
   DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
@@ -3161,37 +3574,41 @@ vvSlicerManager* vvMainWindow::AddImage(vvImage::Pointer image,std::string filen
   mSlicerManagers.back()->SetId(id.toStdString());
 
   linkPanel->addImage(slicer_manager->GetFileName().c_str()// filename
-                      , id.toStdString());
+    , id.toStdString());
 
   connect(mSlicerManagers.back(), SIGNAL(currentImageChanged(std::string)),
-          this, SLOT(CurrentImageChanged(std::string)));
+    this, SLOT(CurrentImageChanged(std::string)));
   connect(mSlicerManagers.back(), SIGNAL(currentPickedImageChanged(std::string)),
-          this, SLOT(CurrentPickedImageChanged(std::string)));
+    this, SLOT(CurrentPickedImageChanged(std::string)));
   connect(mSlicerManagers.back(), SIGNAL(UpdatePosition(int, double, double, double, double, double, double, double)),
-          this, SLOT(MousePositionChanged(int,double, double, double, double, double, double, double)));
+    this, SLOT(MousePositionChanged(int,double, double, double, double, double, double, double)));
   connect(mSlicerManagers.back(), SIGNAL(UpdateVector(int, double, double, double, double)),
-          this, SLOT(VectorChanged(int,double,double,double, double)));
+    this, SLOT(VectorChanged(int,double,double,double, double)));
   connect(mSlicerManagers.back(), SIGNAL(UpdateOverlay(int, double, double)),
-          this, SLOT(OverlayChanged(int,double,double)));
+    this, SLOT(OverlayChanged(int,double,double)));
   connect(mSlicerManagers.back(), SIGNAL(UpdateFusion(int, double)),
-          this, SLOT(FusionChanged(int,double)));
+    this, SLOT(FusionChanged(int,double)));
+  //connect(mSlicerManagers.back(), SIGNAL(UpdateFusionSequence(int, bool, unsigned int)),
+  //  this, SLOT(FusionSequenceChanged(int, bool, unsigned int)));
   connect(mSlicerManagers.back(), SIGNAL(WindowLevelChanged()),
-          this,SLOT(WindowLevelChanged()));
+    this,SLOT(WindowLevelChanged()));
   connect(mSlicerManagers.back(), SIGNAL(UpdateSlice(int,int)),
-          this,SLOT(UpdateSlice(int,int)));
-  connect(mSlicerManagers.back(), SIGNAL(UpdateTSlice(int, int)),
-          this,SLOT(UpdateTSlice(int, int)));
-  connect(mSlicerManagers.back(), SIGNAL(UpdateTSlice(int, int)),
-          this,SLOT(ImageInfoChanged()));
+    this,SLOT(UpdateSlice(int,int)));
+  connect(mSlicerManagers.back(), SIGNAL(UpdateTSlice(int, int, int)),
+    this,SLOT(UpdateTSlice(int, int, int)));
+  connect(mSlicerManagers.back(), SIGNAL(UpdateTSlice(int, int, int)),
+    this,SLOT(ImageInfoChanged()));
   connect(mSlicerManagers.back(), SIGNAL(UpdateSliceRange(int,int,int,int,int)),
-          this,SLOT(UpdateSliceRange(int,int,int,int,int)));
+    this,SLOT(UpdateSliceRange(int,int,int,int,int)));
   connect(mSlicerManagers.back(), SIGNAL(UpdateLinkManager(std::string,int,double,double,double,int)),
-          this,SLOT(UpdateLinkManager(std::string,int,double,double,double,int)));
+    this,SLOT(UpdateLinkManager(std::string,int,double,double,double,int)));
   connect(mSlicerManagers.back(), SIGNAL(UpdateLinkedNavigation(std::string,vvSlicerManager*,vvSlicer*)),
-          this,SLOT(UpdateLinkedNavigation(std::string,vvSlicerManager*,vvSlicer*)));
+    this,SLOT(UpdateLinkedNavigation(std::string,vvSlicerManager*,vvSlicer*)));
   connect(mSlicerManagers.back(), SIGNAL(ChangeImageWithIndexOffset(vvSlicerManager*,int,int)),
-          this,SLOT(ChangeImageWithIndexOffset(vvSlicerManager*,int,int)));
+    this,SLOT(ChangeImageWithIndexOffset(vvSlicerManager*,int,int)));
   connect(mSlicerManagers.back(), SIGNAL(LandmarkAdded()),landmarksPanel,SLOT(AddPoint()));
+
+
   UpdateTree();
   qApp->processEvents();
   InitSlicers();
index a15ff8b1bb6e26817d2e7a1abe45704bc0299cdf..15ec68779abf129e1e2f39f987a2d242f275f33e 100644 (file)
@@ -57,6 +57,10 @@ class vvMainWindow: public vvMainWindowBase,
   void AddOverlayImage(int index, std::vector<std::string> fileNames, vvImageReader::LoadedImageType type);
   void AddFusionImage(int index, QString filename);
   void AddROI(int index, QString filename);
+
+  //Process the sequence for fusion:
+  void AddFusionSequence(int index, std::vector<std::string> fileNames, vvImageReader::LoadedImageType type);
+
   void AddLandmarks(int index, std::vector<std::string>);
 ///Adds a mesh to a SlicerManager, with optional warping by vector field
   void AddContour(int image_index, vvMesh::Pointer contour, bool propagation);
@@ -108,12 +112,13 @@ public slots:
   void VectorChanged(int visibility, double x, double y, double z, double value);
   void OverlayChanged(int visibility, double valueOver, double valueRef);
   void FusionChanged(int visibility, double value);
+  //void FusionSequenceChanged(int visibility, double value);
   void SegmentationOnCurrentImage();
   void SurfaceViewerLaunch();
 
   void WindowLevelChanged();
   void UpdateSlice(int slicer, int slice);
-  void UpdateTSlice(int slicer, int slice);
+  void UpdateTSlice(int slicer, int slice, int code=-1);
   void UpdateSliceRange(int slicer, int min, int max, int tmin, int tmax);
   void WindowLevelEdited();
   void SetWindowLevel(double w, double l);
@@ -154,11 +159,16 @@ public slots:
   void OpenField();
   void SelectOverlayImage();
   void SelectFusionImage();
+  //select the file(s) from the disk containing the image sequence to fuse
+  void SelectFusionSequence();
+  void SelectFusionSequenceTemporalSignal();
+
   void ResetTransformationToIdentity();
 
   void SetVFProperty(int subsampling,int scale,int lut, int width, double r, double g, double b);
   void SetOverlayProperty(int color, int linked, double window, double level);
   void SetFusionProperty(int opacity, int tresOpacity, int colormap,double window,double level, bool showLegend);
+  void SetFusionSequenceProperty(int fusionSequenceFrameIndex, bool spatialSyncFlag, unsigned int fusionSequenceNbFrames, bool temporalSyncFlag);
 
   void GoToCursor();
   void GoToLandmark();
@@ -200,7 +210,7 @@ private:
   QString GetSizeInBytes(unsigned long size);
   QString GetVectorDoubleAsString(std::vector<double> vectorDouble);
   QString GetVectorIntAsString(std::vector<int> vectorInt);
-  int GetSlicerIndexFromItem(QTreeWidgetItem* item);
+  int GetSlicerIndexFromItem(QTreeWidgetItem* item); //this actually returns the SlicerManager index TODO: rename it to GetSlicerManagerIndexFromItem
   QTreeWidgetItem* GetItemFromSlicerManager(vvSlicerManager* sm);
   void SaveScreenshot(QVTKWidget *widget);
   int GetImageDuplicateFilenameNumber(std::string filename);
index 346bd2c49b7c5c4a5a9f705c7755b4e49941922f..649f1fd9360f8fb44b9a6c3575141b69f96c4b56 100644 (file)
 //====================================================================
 vvOverlayPanel::vvOverlayPanel(QWidget * parent):QWidget(parent)
 {
+  disableFusionSignals = true;
+  disableFusionSequenceSignals = true;
+
   setupUi(this);
 
   vFFrame->hide();
   compareFrame->hide();
   fusionFrame->hide();
+  fCTUSFrame->hide();
   subSamplingSpinBox->setEnabled(0);
   scaleSpinBox->setEnabled(0);
   lutCheckBox->hide();
   lutCheckBox->setEnabled(0);
   fusionShowLegendCheckBox->setChecked(false);
-  
+
   connect(subSamplingSpinBox,SIGNAL(editingFinished()),this,SLOT(setVFProperty()));
   connect(scaleSpinBox,SIGNAL(editingFinished()),this,SLOT(setVFProperty()));
   connect(lutCheckBox,SIGNAL(clicked()),this,SLOT(setVFProperty()));
@@ -58,7 +62,10 @@ vvOverlayPanel::vvOverlayPanel(QWidget * parent):QWidget(parent)
   connect(overlayLevelSpinBox,SIGNAL(valueChanged(double)),this,SLOT(setOverlayProperty()));
   connect(overlayLinkCheckBox,SIGNAL(stateChanged(int)),this,SLOT(setOverlayProperty()));
 
-  disableFusionSignals = false;
+  connect(fCTUSSlider,SIGNAL(valueChanged(int)),this,SLOT(setFusionSequenceProperty()));
+  connect(fCTUSActivateSpaceSyncCheckBox,SIGNAL(stateChanged(int)),this,SLOT(setFusionSequenceProperty()));
+  connect(fCTUSActivateTimeSyncCheckBox,SIGNAL(stateChanged(int)),this,SLOT(setFusionSequenceProperty()));
+  connect(fCTUSLoadSignalPushButton,SIGNAL(clicked()),this,SIGNAL(FusionSequenceSignalButtonPressed()));
 }
 
 void vvOverlayPanel::getCurrentImageName(QString name)
@@ -225,7 +232,7 @@ void vvOverlayPanel::setFusionProperty()
 {
   if (disableFusionSignals)
     return;
-  
+
   fusionOpacitySpin->setValue(opacityHorizontalSlider->value()); 
   fusionThresSpin->setValue(thresOpacityHorizontalSlider->value());
 
@@ -248,6 +255,68 @@ void vvOverlayPanel::getCurrentFusionInfo(int visibility,double value)
   valueFusionnedLabel->setText(fusionValue);
 }
 
+
+void vvOverlayPanel::getFusionSequenceProperty(int sequenceFrameIndex, bool spatialSync, unsigned int sequenceLenth, bool temporalSync)
+{
+       if (sequenceFrameIndex > -1) {
+               disableFusionSequenceSignals = true;
+               fCTUSFrame->show();             
+               fCTUSFrame->setEnabled(1);
+               fCTUSSlider->setEnabled(1);
+               fCTUSSlider->setValue(sequenceFrameIndex);
+               fCTUSSlider->setMaximum(sequenceLenth);
+               if (spatialSync) fCTUSActivateSpaceSyncCheckBox->setCheckState(Qt::Checked);
+               else             fCTUSActivateSpaceSyncCheckBox->setCheckState(Qt::Unchecked);          
+               if (fCTUSActivateTimeSyncCheckBox->isEnabled()) {
+                       if ( temporalSync ) fCTUSActivateTimeSyncCheckBox->setCheckState(Qt::Checked);
+                       else                fCTUSActivateTimeSyncCheckBox->setCheckState(Qt::Unchecked);
+               }
+               disableFusionSequenceSignals = false;
+               setFusionSequenceProperty();
+       } else {
+    disableFusionSequenceSignals = true;
+               fCTUSFrame->hide();
+               fCTUSFrame->setEnabled(0);
+               fCTUSSlider->setEnabled(0);
+               fCTUSSlider->setValue(0);
+               fCTUSSlider->setMaximum(0);
+               fCTUSActivateSpaceSyncCheckBox->setCheckState(Qt::Unchecked);
+               fCTUSActivateTimeSyncCheckBox->setCheckState(Qt::Unchecked);
+    disableFusionSequenceSignals = false;
+    setFusionSequenceProperty();
+       }
+}
+
+
+void vvOverlayPanel::setFusionSequenceProperty()
+{
+  if (disableFusionSequenceSignals)
+    return;
+  emit FusionSequencePropertyUpdated(fCTUSSlider->value(), fCTUSActivateSpaceSyncCheckBox->isChecked(), fCTUSSlider->maximum(), fCTUSActivateTimeSyncCheckBox->isChecked());
+}
+
+void vvOverlayPanel::enableFusionSequenceTemporalSync() {
+  bool backup = disableFusionSequenceSignals;
+  disableFusionSequenceSignals=true; //not sure this is necessary, but just in case...
+       fCTUSActivateTimeSyncCheckBox->setEnabled(1);
+       fCTUSActivateTimeSyncCheckBox->setChecked(true);
+  disableFusionSequenceSignals = backup; //
+       
+       if (disableFusionSequenceSignals) return;
+       emit FusionSequencePropertyUpdated(fCTUSSlider->value(), fCTUSActivateSpaceSyncCheckBox->isChecked(), fCTUSSlider->maximum(), fCTUSActivateTimeSyncCheckBox->isChecked());
+}
+
+void vvOverlayPanel::updateFusionSequenceSliderValueFromWindow(int val, bool updateVisualization) {
+  if (fCTUSSlider->value()==val) return;
+
+  disableFusionSequenceSignals = true; //not sure this is necessary, but just in case...
+       fCTUSSlider->setValue(val); 
+  disableFusionSequenceSignals = false;
+
+  if (disableFusionSequenceSignals) return;
+       if (updateVisualization) emit FusionSequencePropertyUpdated(fCTUSSlider->value(), fCTUSActivateSpaceSyncCheckBox->isChecked(), fCTUSSlider->maximum(), fCTUSActivateTimeSyncCheckBox->isChecked());
+}
+
 void vvOverlayPanel::VFColorChangeRequest()
 {
   QColor color(vfColorButton->palette().color(QPalette::Background));
index bd9e9722771ed599d358fc70f2898fab73151ec2..b0e69db92f2726b0c6aec58314c6462c45b92156 100644 (file)
@@ -1,19 +1,19 @@
 /*=========================================================================
-  Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
+Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
 
-  Authors belong to: 
-  - University of LYON              http://www.universite-lyon.fr/
-  - Léon Bérard cancer center       http://www.centreleonberard.fr
-  - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
+Authors belong to: 
+- University of LYON              http://www.universite-lyon.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
-  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-  PURPOSE.  See the copyright notices for more information.
+This software is distributed WITHOUT ANY WARRANTY; without even
+the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE.  See the copyright notices for more information.
 
-  It is distributed under dual licence
+It is distributed under dual licence
 
-  - BSD        See included LICENSE.txt file
-  - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+- BSD        See included LICENSE.txt file
+- CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
 ===========================================================================**/
 #ifndef _vvOverlayPanel_H
 #define _vvOverlayPanel_H
 class vvOverlayPanel : public QWidget, private Ui::vvOverlayPanel
 {
 
-    Q_OBJECT
+  Q_OBJECT
 
 public:
-    // constructor - destructor
-    vvOverlayPanel(QWidget * parent=0);
-    ~vvOverlayPanel() {}
+  // constructor - destructor
+  vvOverlayPanel(QWidget * parent=0);
+  ~vvOverlayPanel() {}
 
-    void getCurrentImageName(QString name);
+  void getCurrentImageName(QString name);
 
-    void getVFProperty(int subsampling, int scale, int log);
-    void getVFName(QString name);
+  void getVFProperty(int subsampling, int scale, int log);
+  void getVFName(QString name);
 
-    void getOverlayProperty(int color, int linked, double window, double level);
-    void getOverlayName(QString name);
+  void getOverlayProperty(int color, int linked, double window, double level);
+  void getOverlayName(QString name);
 
-    void getFusionProperty(int opacity, int thresOpacity, int colormap, double window, double level);
-    void getFusionName(QString name);
+  void getFusionProperty(int opacity, int thresOpacity, int colormap, double window, double level);
+  void getFusionName(QString name);
 
-    void getCurrentVectorInfo(int visibility, double x, double y, double z, double value);
-    void getCurrentOverlayInfo(int visibility,double valueOver, double valueRef);
-    void getCurrentFusionInfo(int visibility,double value);
-    
-    bool getShowLegend();
+  void getFusionSequenceProperty(int sequenceFrameIndex, bool spatialSync, unsigned int sequenceLength, bool temporalSync);
+
+  void getCurrentVectorInfo(int visibility, double x, double y, double z, double value);
+  void getCurrentOverlayInfo(int visibility,double valueOver, double valueRef);
+  void getCurrentFusionInfo(int visibility,double value);
+
+  bool getShowLegend();
+
+  void updateFusionSequenceSliderValueFromWindow(int val, bool updateVisualization);
 
 public slots:
-    void setVFProperty();
-    void setOverlayProperty();
-    void setFusionProperty();
-    void setFusionSpinProperty();
-    void VFColorChangeRequest();
+  void setVFProperty();
+  void setOverlayProperty();
+  void setFusionProperty();
+  void setFusionSpinProperty();
+  void VFColorChangeRequest();
+  void setFusionSequenceProperty();
+  void enableFusionSequenceTemporalSync();
 
 signals:
-    void VFPropertyUpdated(int subsampling, int scale, int log, int width, double r, double g, double b);
-    void OverlayPropertyUpdated(int color, int linked, double window, double level);
-    void FusionPropertyUpdated(int opacity, int thresOpacity, int colormap, double window, double level, bool showLegend);
+  void VFPropertyUpdated(int subsampling, int scale, int log, int width, double r, double g, double b);
+  void OverlayPropertyUpdated(int color, int linked, double window, double level);
+  void FusionPropertyUpdated(int opacity, int thresOpacity, int colormap, double window, double level, bool showLegend);
+  void FusionSequencePropertyUpdated(int sequenceFrameIndex, bool spatialSync, unsigned int sequenceLength, bool temporalSync);
+  void FusionSequenceSignalButtonPressed();
 
-    
 private:
-    bool disableFusionSignals;
-    
+  bool disableFusionSignals;
+  bool disableFusionSequenceSignals;
+
 }; // end class vvOverlayPanel
 //====================================================================
 
index fd5240b29f06ad5931646559a3c7d9760cdb98b5..efaf80fde672006a3926428eb8b271163bd30eb5 100644 (file)
@@ -16,6 +16,9 @@
   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
   ===========================================================================**/
 
+#include <QMessageBox>
+#include <QString>
+
 #include "vvSlicer.h"
 #include "vvImage.h"
 #include "vvSlicerManagerCommand.h"
@@ -78,6 +81,7 @@ static void copyExtent(int* in, int* to){
 //------------------------------------------------------------------------------
 vvSlicer::vvSlicer()
 {
+       mFusionSequenceCode = -1;
   this->UnInstallPipeline();
   mImage = NULL;
   mReducedExtent = new int[6];
@@ -308,7 +312,7 @@ void vvSlicer::SetCurrentPosition(double x, double y, double z, int t)
   mCurrentBeforeSlicingTransform[1]=y;
   mCurrentBeforeSlicingTransform[2]=z;
   mSlicingTransform->GetInverse()->TransformPoint(mCurrentBeforeSlicingTransform,mCurrent);
-  SetTSlice(t);
+  if (t>=0) SetTSlice(t);
 }
 //------------------------------------------------------------------------------
 
@@ -411,8 +415,9 @@ void vvSlicer::SetOverlay(vvImage::Pointer overlay)
 
 
 //------------------------------------------------------------------------------
-void vvSlicer::SetFusion(vvImage::Pointer fusion)
+void vvSlicer::SetFusion(vvImage::Pointer fusion, int fusionSequenceCode)
 {
+       mFusionSequenceCode = fusionSequenceCode;
   if (fusion->GetVTKImages().size()) {
     mFusion = fusion;
 
@@ -475,7 +480,7 @@ bool vvSlicer::GetActorVisibility(const std::string& actor_type, int overlay_ind
   else if (actor_type == "overlay") {
     vis = this->mOverlayActor->GetVisibility();
   }
-  else if (actor_type == "fusion") {
+  else if ( (actor_type == "fusion") || (actor_type == "fusionSequence") ){
     vis = this->mFusionActor->GetVisibility();
   }
   else if (actor_type == "contour")
@@ -497,7 +502,7 @@ void vvSlicer::SetActorVisibility(const std::string& actor_type, int overlay_ind
   else if (actor_type == "overlay") {
     this->mOverlayActor->SetVisibility(vis);
   }
-  else if (actor_type == "fusion") {
+  else if ( (actor_type == "fusion") || (actor_type == "fusionSequence") ){
     this->mFusionActor->SetVisibility(vis);
   }
   else if (actor_type == "contour")
@@ -641,7 +646,7 @@ void vvSlicer::RemoveActor(const std::string& actor_type, int overlay_index)
     mOverlayActor = NULL;
     mOverlayMapper = NULL;
   }
-  if (actor_type == "fusion") {
+  if ( (actor_type == "fusion") || (actor_type == "fusionSequence") ) {
     Renderer->RemoveActor(mFusionActor);
     mFusion = NULL;
     mFusionActor = NULL;
@@ -706,8 +711,19 @@ void vvSlicer::SetVFLog(int log)
 
 
 //------------------------------------------------------------------------------
-void vvSlicer::SetTSlice(int t)
+void vvSlicer::SetTSlice(int t, bool updateLinkedImages)
 {
+       if (!updateLinkedImages) {
+               mCurrentTSlice = t;
+               mImageReslice->SetInput( mImage->GetVTKImages()[mCurrentTSlice] );
+               // Update transform
+               mConcatenatedTransform->Identity();
+               mConcatenatedTransform->Concatenate(mImage->GetTransform()[mCurrentTSlice]);
+               mConcatenatedTransform->Concatenate(mSlicingTransform);
+               UpdateDisplayExtent();
+               return;
+       }
+
   if (t < 0)
     mCurrentTSlice = 0;
   else if ((unsigned int)t >= mImage->GetVTKImages().size())
@@ -726,6 +742,7 @@ void vvSlicer::SetTSlice(int t)
     if (mVF->GetVTKImages().size() > (unsigned int)mCurrentTSlice)
       mVOIFilter->SetInput(mVF->GetVTKImages()[mCurrentTSlice]);
   }
+  //update the overlay
   if (mOverlay && mOverlayActor->GetVisibility()) {
     if (mOverlay->GetVTKImages().size() > (unsigned int)t) {
       mCurrentOverlayTSlice = t;
@@ -737,7 +754,8 @@ void vvSlicer::SetTSlice(int t)
       mConcatenatedOverlayTransform->Concatenate(mSlicingTransform);
     }
   }
-  if (mFusion && mFusionActor->GetVisibility()) {
+  //update the fusion ; except in case this is a fusionSequence, in which case both 'times' should be independent.
+  if (mFusion && mFusionActor->GetVisibility() && (mFusionSequenceCode<0)) {
     if (mFusion->GetVTKImages().size() > (unsigned int)t) {
       mCurrentFusionTSlice = t;
       mFusionReslice->SetInput( mFusion->GetVTKImages()[mCurrentFusionTSlice]);
@@ -757,6 +775,25 @@ void vvSlicer::SetTSlice(int t)
 //------------------------------------------------------------------------------
 
 
+//------------------------------------------------------------------------------
+void vvSlicer::SetFusionSequenceTSlice(int t)
+{
+  if (mFusion && mFusionActor->GetVisibility() && (mFusionSequenceCode>=0)) {
+    if (mFusion->GetVTKImages().size() > (unsigned int)t) {
+      mCurrentFusionTSlice = t;
+      mFusionReslice->SetInput( mFusion->GetVTKImages()[mCurrentFusionTSlice] );
+      // Update fusion transform
+      mConcatenatedFusionTransform->Identity();
+      mConcatenatedFusionTransform->Concatenate(mFusion->GetTransform()[mCurrentFusionTSlice]); //not really useful...
+      mConcatenatedFusionTransform->Concatenate(mSlicingTransform);
+    }
+  }
+
+  UpdateDisplayExtent();
+}
+//------------------------------------------------------------------------------
+
+
 //------------------------------------------------------------------------------
 int vvSlicer::GetTSlice()
 {
@@ -770,7 +807,7 @@ int vvSlicer::GetMaxCurrentTSlice()
   int t = mCurrentTSlice;
   if(mOverlay)
     t = std::max(t, mCurrentOverlayTSlice);
-  if(mFusion)
+  if(mFusion&& (mFusionSequenceCode<0)) //ignore fusionSequence data: for these, the times are not to be related (this way)
     t = std::max(t, mCurrentFusionTSlice);
   return t;
 }
@@ -1008,7 +1045,6 @@ void vvSlicer::UpdateDisplayExtent()
       }
     }
   }
-  
 }
 //----------------------------------------------------------------------------
 
@@ -1147,9 +1183,8 @@ void vvSlicer::ResetCamera()
 //----------------------------------------------------------------------------
 void vvSlicer::SetDisplayMode(bool i)
 {
-  this->GetRenderer()->SetDraw(i);
-  if (i)
-    UpdateDisplayExtent();
+       this->GetRenderer()->SetDraw(i);
+       if (i) UpdateDisplayExtent();
 }
 //----------------------------------------------------------------------------
 
@@ -1324,6 +1359,7 @@ double vvSlicer::GetScalarComponentAsDouble(vtkImageData *image, double X, doubl
   ix = lrint(X);
   iy = lrint(Y);
   iz = lrint(Z);
+
   if (ix < image->GetWholeExtent()[0] ||
       ix > image->GetWholeExtent()[1] ||
       iy < image->GetWholeExtent()[2] ||
index a738a788b192db47fb40859f233b5e31853a8569..7746331a21d3ad2f337f63bdb7df79b44c011dab 100644 (file)
@@ -20,6 +20,9 @@
 #include <iostream>
 #include <vector>
 
+#include <QString> //TODO delete
+#include <QMessageBox>
+
 #include "vvLandmarks.h"
 #include "vvImage.h"
 #include "vvMesh.h"
@@ -78,7 +81,7 @@ public:
   vtkActor* GetVFActor() ;
   vtkCornerAnnotation* GetAnnotation();
     
-  void SetFusion(vvImage::Pointer inputFusion);
+  void SetFusion(vvImage::Pointer inputFusion, int fusionSequenceCode = -1);
   vvImage::Pointer GetFusion() {
     return mFusion;
   }
@@ -97,7 +100,10 @@ public:
   }
 
   void SetLandmarks(vvLandmarks* landmarks);
-  void SetTSlice(int t);
+  void SetTSlice(int t, bool updateLinkedImages = true);
+
+  void SetFusionSequenceTSlice(int t);
+
   void SetSliceOrientation(int orientation);
   void AdjustResliceToSliceOrientation(vtkImageReslice *reslice);
   int GetTSlice();
@@ -200,6 +206,8 @@ public:
   }
   void SetVFColor(double r, double g, double b);
 
+  //necessary to flag the secondary sequence
+  void SetFusionSequenceCode(int code) {mFusionSequenceCode=code;}
 protected:
   vvSlicer();
   ~vvSlicer();
@@ -212,6 +220,8 @@ protected:
 
   vvLandmarks* mLandmarks;
 
+  int mFusionSequenceCode; //-1: not involved in a fusion sequence, 0: main sequence (CT), 1: secondary sequence (US)
+
   //                         __________ Image coordinates accounting for spacing and origin
   //                            Î›  Î›
   //                            |  | vvImage.GetTransform()
index b175c46ccc642665487641e20c102b2e8c8e5d37..67f78bc71158122f40901ed5231230e5dee76acd 100644 (file)
-/*=========================================================================
-  Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
-
-  Authors belong to:
-  - University of LYON              http://www.universite-lyon.fr/
-  - Léon Bérard cancer center       http://oncora1.lyon.fnclcc.fr
-  - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
-
-  This software is distributed WITHOUT ANY WARRANTY; without even
-  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-  PURPOSE.  See the copyright notices for more information.
-
-  It is distributed under dual licence
-
-  - BSD        See included LICENSE.txt file
-  - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
-  ======================================================================-====*/
-
-#include "vvSlicerManager.h"
-#include "vvSlicer.h"
-#include "vvImage.h"
-#include "vvSlicerManagerCommand.h"
-#include "vvInteractorStyleNavigator.h"
-#include "vvLandmarks.h"
-#include "vvMesh.h"
-#include "vvBlendImageActor.h"
-
-#include <vtkImageActor.h>
-#include <vtkImageData.h>
-#include <vtkRenderWindow.h>
-#include <vtkRendererCollection.h>
-#include <vtkRenderWindowInteractor.h>
-#include <vtkImageMapToWindowLevelColors.h>
-#include <vtkWindowLevelLookupTable.h>
-#include <vtkColorTransferFunction.h>
-#include <vtkImageClip.h>
-#include <vtkLODActor.h>
-#include <vtkPointData.h>
-#include <vtksys/SystemTools.hxx>
-#include <vtkCamera.h>
-
-#include <qfileinfo.h>
-
-//----------------------------------------------------------------------------
-vvSlicerManager::vvSlicerManager(int numberOfSlicers)
-{
-  mFileName = "";
-  mId = "";
-  mVFName = "";
-  mOverlayName = "";
-  mFusionName = "";
-  mVFId = "";
-  mLastError = "";
-  mType = vvImageReader::UNDEFINEDIMAGETYPE;
-  mColorMap = 0;
-  mPreset = 0;
-  mOverlayColor = 130;
-
-  mFusionOpacity = 30;
-  mFusionThresOpacity = 1;
-  mFusionColorMap = 3;
-  mFusionWindow = 1000;
-  mFusionLevel = 1000;
-  mFusionShowLegend = true;
-  
-  mLandmarks = NULL;
-  mLinkedId.resize(0);
-
-  for ( int i = 0; i < numberOfSlicers; i++)
-    mSlicers.push_back(vtkSmartPointer<vvSlicer>::New());
-  mSelectedSlicer = -1;
-  
-  mPreviousSlice.resize(numberOfSlicers);
-  mPreviousTSlice.resize(numberOfSlicers);
-  mSlicingPreset = WORLD_SLICING;
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-vvSlicerManager::~vvSlicerManager()
-{
-  if (mLandmarks)
-    delete mLandmarks;
-}
-//----------------------------------------------------------------------------
-
-
-//------------------------------------------------------------------------------
-void vvSlicerManager::SetFilename(std::string filename, int number)
-{
-  mFileName = filename;
-  mFileName = vtksys::SystemTools::GetFilenameName(mFileName);
-  mBaseFileName = vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(mFileName));
-  mBaseFileNameNumber = number;
-
-  mFileName = mBaseFileName;
-  if (number != 0) {
-    mFileName.append("_"+clitk::toString(number));
-  }
-  mFileName.append(vtksys::SystemTools::GetFilenameLastExtension(filename));
-
-  for(unsigned int i=0; i<mSlicers.size(); i++) {
-    mSlicers[i]->SetFileName(mFileName);//vtksys::SystemTools::GetFilenameWithoutLastExtension(filename));
-  }
-  
-}
-//------------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::AddContour(vvMesh::Pointer contour,bool propagate)
-{
-  for ( unsigned int i = 0; i < mSlicers.size(); i++) {
-    mSlicers[i]->AddContour(contour,propagate);
-  }
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::ToggleContourSuperposition()
-{
-  for ( unsigned int i = 0; i < mSlicers.size(); i++)
-    mSlicers[i]->ToggleContourSuperposition();
-}
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-std::string vvSlicerManager::GetListOfAbsoluteFilePathInOneString(const std::string &actorType)
-{
-  vvImageReader *reader = NULL;
-
-  if(actorType=="image")
-    reader = mReader;
-  else if(actorType=="overlay")
-    reader = mOverlayReader;
-  else if(actorType=="fusion")
-    reader = mFusionReader;
-  else if(actorType=="vector")
-    reader = mVectorReader;
-
-  if(!reader)
-    return "";
-
-  std::string list;
-  for(unsigned int i=0; i<reader->GetInputFilenames().size(); i++){
-    QFileInfo fileinfo(reader->GetInputFilenames()[i].c_str()); //Do not show the path
-    if(i)
-      list += '\n';
-    list += fileinfo.absoluteFilePath().toStdString();
-  }
-  return list;
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-bool vvSlicerManager::SetImage(std::string filename, vvImageReader::LoadedImageType type, int n, unsigned int slice)
-{
-  mType = type;
-  if (mReader.IsNull())
-    mReader = vvImageReader::New();
-  std::vector<std::string> filenames;
-  filenames.push_back(filename);
-  mReader->SetInputFilenames(filenames);
-  mReader->SetSlice(slice); // Only used for SLICED type
-  mReader->Update(type);
-
-  SetFilename(filename, n);
-  //  mFileName = vtksys::SystemTools::GetFilenameName(mFileName);
-  //mBaseFileName = vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(mFileName));
-  //mBaseFileNameNumber = n;
-
-  if (mReader->GetLastError().size() == 0) {
-    mImage=mReader->GetOutput();
-    for ( unsigned int i = 0; i < mSlicers.size(); i++) {
-      mSlicers[i]->SetFileName(vtksys::SystemTools::GetFilenameWithoutLastExtension(filename));
-      mSlicers[i]->SetImage(mReader->GetOutput());
-    }
-  } else {
-    mLastError = mReader->GetLastError();
-    return false;
-  }
-  // if (n!=0) {
-  //   mFileName.append("_"+clitk::toString(n));
-  // }
-  return true;
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetImage(vvImage::Pointer image)
-{
-  mImage=image;
-  for (unsigned int i = 0; i < mSlicers.size(); i++) {
-    mSlicers[i]->SetImage(image);
-  }
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-bool vvSlicerManager::SetImages(std::vector<std::string> filenames, vvImageReader::LoadedImageType type, int n)
-{
-  mType = type;
-  std::string fileWithoutExtension = vtksys::SystemTools::GetFilenameWithoutExtension(filenames[0]);
-  if (type == vvImageReader::DICOM)
-    fileWithoutExtension += "_dicom";
-  else if (type == vvImageReader::MERGED)
-    fileWithoutExtension += "_merged";
-  else if (type == vvImageReader::MERGEDWITHTIME)
-    fileWithoutExtension += "_merged_wt";
-
-  mFileName = vtksys::SystemTools::GetFilenameName(mFileName);
-  mFileName = fileWithoutExtension + vtksys::SystemTools::GetFilenameExtension(filenames[0]);
-  if (mReader.IsNull())
-    mReader = vvImageReader::New();
-  mReader->SetInputFilenames(filenames);
-  mReader->Update(type);
-
-  mBaseFileName = vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(mFileName));
-  mBaseFileNameNumber = n;
-
-  if (mReader->GetLastError().size() == 0) {
-    mImage=mReader->GetOutput();
-    for ( unsigned int i = 0; i < mSlicers.size(); i++) {
-      mSlicers[i]->SetFileName(fileWithoutExtension);
-      mSlicers[i]->SetImage(mReader->GetOutput());
-    }
-  } else {
-    mLastError = mReader->GetLastError();
-    return false;
-  }
-  if (n!=0) {
-    mFileName.append("_"+clitk::toString(n));
-  }
-  return true;
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-bool vvSlicerManager::SetOverlay(std::vector<std::string> filenames,int dim, std::string component, vvImageReader::LoadedImageType type)
-{
-  mOverlayName = filenames[0];
-  mOverlayComponent = component;
-  if (dim > mImage->GetNumberOfDimensions()) {
-    mLastError = " Overlay dimension cannot be greater than reference image!";
-    return false;
-  }
-  if (mOverlayReader.IsNull())
-    mOverlayReader = vvImageReader::New();
-  mOverlayReader->SetInputFilenames(filenames);
-  mOverlayReader->Update(type);
-  if (mOverlayReader->GetLastError().size() == 0) {
-    for ( unsigned int i = 0; i < mSlicers.size(); i++) {
-      mSlicers[i]->SetOverlay(mOverlayReader->GetOutput());
-    }
-  } else {
-    mLastError = mOverlayReader->GetLastError();
-    return false;
-  }
-  return true;
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-bool vvSlicerManager::SetFusion(std::string filename,int dim, std::string component)
-{
-  mFusionName = filename;
-  mFusionComponent = component;
-  if (dim > mImage->GetNumberOfDimensions()) {
-    mLastError = " Overlay dimension cannot be greater then reference image!";
-    return false;
-  }
-  if (mFusionReader.IsNull())
-    mFusionReader = vvImageReader::New();
-  std::vector<std::string> filenames;
-  filenames.push_back(filename);
-  mFusionReader->SetInputFilenames(filenames);
-  mFusionReader->Update(mImage->GetNumberOfDimensions(),component.c_str(),mType);
-  if (mFusionReader->GetLastError().size() == 0) {
-    for ( unsigned int i = 0; i < mSlicers.size(); i++) {
-      mSlicers[i]->SetFusion(mFusionReader->GetOutput());
-    }
-  } else {
-    mLastError = mFusionReader->GetLastError();
-    return false;
-  }
-  double *fusRange = mFusionReader->GetOutput()->GetVTKImages()[0]->GetScalarRange();
-  mFusionLevel = (fusRange[0]+fusRange[1])/2;
-  mFusionWindow = fusRange[1]-fusRange[0];
-
-  return true;
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-bool vvSlicerManager::SetVF(std::string filename)
-{
-  if (mVectorReader.IsNull())
-    mVectorReader = vvImageReader::New();
-  mVectorReader->SetInputFilename(filename);
-  
-  if (mType == vvImageReader::IMAGEWITHTIME)
-    mVectorReader->Update(vvImageReader::VECTORFIELDWITHTIME);
-  else
-    mVectorReader->Update(vvImageReader::VECTORFIELD);
-  if (mVectorReader->GetLastError().size() != 0) {
-    mLastError = mVectorReader->GetLastError();
-    return false;
-  } else
-    return SetVF(mVectorReader->GetOutput(),filename);
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-bool vvSlicerManager::SetVF(vvImage::Pointer vf,std::string filename)
-{
-  if (vf->GetNumberOfDimensions() > mImage->GetNumberOfDimensions()) {
-    mLastError = "Sorry, vector field dimension cannot be greater then reference image.";
-    return false;
-  }
-  if (vf->GetNumberOfDimensions() == 4) {
-    if (vf->GetSpacing()[3] != mImage->GetSpacing()[3]) {
-      mLastError = "Sorry, vector field time spacing cannot be different from time spacing of the reference image.";
-      return false;
-    }
-    if (vf->GetOrigin()[3] != mImage->GetOrigin()[3]) {
-      mLastError = "Sorry, vector field time origin cannot be different from time origin of the reference image.";
-      return false;
-    }
-  }
-  mVF=vf;
-  mVFName = filename;
-  for ( unsigned int i = 0; i < mSlicers.size(); i++) {
-    mSlicers[i]->SetVF(vf);
-  }
-  return true;
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-vvSlicer* vvSlicerManager::GetSlicer(int i)
-{
-  return mSlicers[i];
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::UpdateSlicer(int num, bool state)
-{
-  if (mSlicers[num]->GetImage())
-    mSlicers[num]->SetDisplayMode(state);
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetSlicerWindow(int i, vtkRenderWindow* RW)
-{
-  mSlicers[i]->SetRenderWindow(i,RW);
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetInteractorStyleNavigator(int i, vtkInteractorStyle* style)
-{
-  vvSlicerManagerCommand *smc = vvSlicerManagerCommand::New();
-  smc->SM = this;
-  smc->SetSlicerNumber(i);
-  mSlicers[i]->GetRenderWindow()->GetInteractor()->SetInteractorStyle(style);
-
-  mSlicers[i]->GetRenderWindow()->GetInteractor()->
-    GetInteractorStyle()->AddObserver(vtkCommand::KeyPressEvent, smc);
-  mSlicers[i]->GetRenderWindow()->GetInteractor()->
-    GetInteractorStyle()->AddObserver(vtkCommand::WindowLevelEvent, smc);
-  mSlicers[i]->GetRenderWindow()->GetInteractor()->
-    GetInteractorStyle()->AddObserver(vtkCommand::EndWindowLevelEvent, smc);
-  mSlicers[i]->GetRenderWindow()->GetInteractor()->
-    GetInteractorStyle()->AddObserver(vtkCommand::StartWindowLevelEvent, smc);
-  mSlicers[i]->GetRenderWindow()->GetInteractor()->
-    GetInteractorStyle()->AddObserver(vtkCommand::PickEvent, smc);
-  mSlicers[i]->GetRenderWindow()->GetInteractor()->
-    GetInteractorStyle()->AddObserver(vtkCommand::StartPickEvent, smc);
-  mSlicers[i]->GetRenderWindow()->GetInteractor()->
-    GetInteractorStyle()->AddObserver(vtkCommand::LeaveEvent, smc);
-  mSlicers[i]->GetRenderWindow()->GetInteractor()->
-    GetInteractorStyle()->AddObserver(vtkCommand::UserEvent, smc);
-  mSlicers[i]->GetRenderWindow()->GetInteractor()->
-    GetInteractorStyle()->AddObserver(vtkCommand::MouseWheelForwardEvent, smc);
-  mSlicers[i]->GetRenderWindow()->GetInteractor()->
-    GetInteractorStyle()->AddObserver(vtkCommand::MouseWheelBackwardEvent, smc);
-  // mSlicers[i]->GetRenderWindow()->GetInteractor()->
-  //   GetInteractorStyle()->AddObserver(vtkCommand::LeftButtonReleaseEvent, smc);
-  mSlicers[i]->GetRenderWindow()->GetInteractor()->
-    GetInteractorStyle()->AddObserver(vtkCommand::EndPickEvent, smc);
-  mSlicers[i]->GetRenderWindow()->GetInteractor()->
-    GetInteractorStyle()->AddObserver(vtkCommand::EndInteractionEvent, smc);
-  smc->Delete();
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::LeftButtonReleaseEvent(int slicer)
-{
-  emit LeftButtonReleaseSignal(slicer);
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::EmitMousePositionUpdated(int slicer)
-{
-  emit MousePositionUpdatedSignal(slicer);
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::EmitKeyPressed(std::string KeyPress)
-{
-  emit KeyPressedSignal(KeyPress);
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetSliceOrientation(int slicer, int orientation)
-{
-  mSlicers[slicer]->SetSliceOrientation(orientation);
-  emit UpdateOrientation(slicer, orientation);
-}
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-int vvSlicerManager::GetTSlice()
-{
-  return mSlicers[0]->GetTSlice();
-}
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetTSlice(int slice)
-{
-  if (slice < 0)
-    slice = 0;
-  else if (slice > mSlicers[0]->GetTMax())
-    slice = mSlicers[0]->GetTMax();
-  if (mLandmarks)
-    mLandmarks->SetTime(slice);
-  for ( unsigned int i = 0; i < mSlicers.size(); i++) {
-    if (slice != mSlicers[i]->GetMaxCurrentTSlice()) {
-      mSlicers[i]->SetTSlice(slice);
-      UpdateTSlice(i);
-    }
-  }
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetNextTSlice(int originating_slicer)
-{
-  int t = mSlicers[0]->GetMaxCurrentTSlice();
-  t++;
-  if (t > mSlicers[0]->GetTMax())
-    t = 0;
-  //std::cout << "vvSlicerManager::SetNextTSlice" << std::endl;
-  emit UpdateTSlice(originating_slicer,t);
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetPreviousTSlice(int originating_slicer)
-{
-  int t = mSlicers[0]->GetMaxCurrentTSlice();
-  t--;
-  if (t < 0)
-    t = mSlicers[0]->GetTMax();
-  //std::cout << "vvSlicerManager::SetPreviousTSlice" << std::endl;
-  emit UpdateTSlice(originating_slicer,t);
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::ToggleInterpolation()
-{
-  bool interpolate=!(mSlicers[0]->GetImageActor()->GetInterpolate());
-  for ( unsigned int i = 0; i < mSlicers.size(); i++) {
-    mSlicers[i]->GetImageActor()->SetInterpolate(interpolate);
-    if (mSlicers[i]->GetOverlayActor())
-      mSlicers[i]->GetOverlayActor()->SetInterpolate(interpolate);
-    if (mSlicers[i]->GetFusionActor())
-      mSlicers[i]->GetFusionActor()->SetInterpolate(interpolate);
-  }
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetTSliceInSlicer(int tslice, int slicer)
-{
-  if (tslice < 0)
-    tslice = 0;
-  else if (tslice > mSlicers[slicer]->GetTMax())
-    tslice = mSlicers[slicer]->GetTMax();
-  if (mLandmarks)
-    mLandmarks->SetTime(tslice);
-
-  if (mSlicers[slicer]->GetMaxCurrentTSlice() == tslice) return;
-
-  mSlicers[slicer]->SetTSlice(tslice);
-
-  if(mSlicingPreset==VOXELS_SLICING) {
-    vtkMatrix4x4 *imageTransformInverse = vtkMatrix4x4::New();
-    mImage->GetTransform()[mSlicers[slicer]->GetTSlice()]->GetInverse(imageTransformInverse);
-    this->GetSlicer(slicer)->GetSlicingTransform()->SetMatrix(imageTransformInverse);
-    imageTransformInverse->Delete();
-  }
-
-  UpdateTSlice(slicer);
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetColorWindow(double s)
-{
-  for ( unsigned int i = 0; i < mSlicers.size(); i++) {
-    mSlicers[i]->SetColorWindow(s);
-  }
-}
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetColorLevel(double s)
-{
-  for ( unsigned int i = 0; i < mSlicers.size(); i++) {
-    mSlicers[i]->SetColorLevel(s);
-  }
-}
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetOverlayColorWindow(double s)
-{
-  for ( unsigned int i = 0; i < mSlicers.size(); i++) {
-    mSlicers[i]->SetOverlayColorWindow(s);
-  }
-}
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetOverlayColorLevel(double s)
-{
-  for ( unsigned int i = 0; i < mSlicers.size(); i++) {
-    mSlicers[i]->SetOverlayColorLevel(s);
-  }
-}
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetLinkOverlayWindowLevel(bool b)
-{
-  for ( unsigned int i = 0; i < mSlicers.size(); i++) {
-    mSlicers[i]->SetLinkOverlayWindowLevel(b);
-  }
-}
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetCursorAndCornerAnnotationVisibility(int s)
-{
-  for ( unsigned int i = 0; i < mSlicers.size(); i++) {
-    mSlicers[i]->SetCursorVisibility(s);
-    mSlicers[i]->SetCornerAnnotationVisibility(s);
-  }
-}
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetOpacity(int i, double factor)
-{
-  mSlicers[i]->SetOpacity(1/factor);
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::UpdateViews(int current,int slicer)
-{
-  double p[3], pt[3];
-  p[0] = mSlicers[slicer]->GetCurrentPosition()[0];
-  p[1] = mSlicers[slicer]->GetCurrentPosition()[1];
-  p[2] = mSlicers[slicer]->GetCurrentPosition()[2];
-  mSlicers[slicer]->GetSlicingTransform()->GetInverse()->TransformPoint(p, pt);
-
-  double x = (pt[0] - mSlicers[slicer]->GetInput()->GetOrigin()[0])
-    /mSlicers[slicer]->GetInput()->GetSpacing()[0];
-  double y = (pt[1] - mSlicers[slicer]->GetInput()->GetOrigin()[1])
-    /mSlicers[slicer]->GetInput()->GetSpacing()[1];
-  double z = (pt[2] - mSlicers[slicer]->GetInput()->GetOrigin()[2])
-    /mSlicers[slicer]->GetInput()->GetSpacing()[2];
-
-  if (x >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0]-0.5 &&
-      x <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1]+0.5 &&
-      y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2]-0.5 &&
-      y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3]+0.5 &&
-      z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4]-0.5 &&
-      z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]+0.5) {
-    mSlicers[slicer]->UpdateCursorPosition();
-    mSlicers[slicer]->SetCursorColor(10,212,255);
-    mSelectedSlicer = slicer;
-
-    switch (mSlicers[slicer]->GetSliceOrientation()) {
-    case vtkImageViewer2::SLICE_ORIENTATION_XY:
-      if (mSlicers[slicer]->GetSlice() != (int)lrint(z))
-        mSlicers[slicer]->SetSlice((int)lrint(z));
-      break;
-
-    case vtkImageViewer2::SLICE_ORIENTATION_XZ:
-      if (mSlicers[slicer]->GetSlice() != (int)lrint(y))
-        mSlicers[slicer]->SetSlice((int)lrint(y));
-      break;
-
-    case vtkImageViewer2::SLICE_ORIENTATION_YZ:
-      if (mSlicers[slicer]->GetSlice() != (int)lrint(x))
-        mSlicers[slicer]->SetSlice((int)lrint(x));
-      break;
-    }
-    mSlicers[slicer]->Render();
-
-    for ( unsigned int i = 0; i < mSlicers.size(); i++) {
-      if (i != (unsigned int)slicer
-          && mSlicers[i]->GetRenderer()->GetDraw()
-          && mSlicers[i]->GetRenderWindow()->GetSize()[0] > 2
-          && mSlicers[i]->GetRenderWindow()->GetSize()[1] > 2) {
-        mSlicers[i]->SetCurrentPosition(p[0], p[1], p[2], mSlicers[slicer]->GetMaxCurrentTSlice());
-        mSlicers[i]->UpdateCursorPosition();
-        if (current) { //do not display corner annotation if image is the one picked
-          mSlicers[i]->SetCurrentPosition(-VTK_DOUBLE_MAX,-VTK_DOUBLE_MAX,
-                                          -VTK_DOUBLE_MAX, mSlicers[slicer]->GetMaxCurrentTSlice());
-          mSlicers[i]->SetCursorColor(255,10,212);
-        } else {
-          mSlicers[i]->SetCursorColor(150,10,282);
-        }
-        switch (mSlicers[i]->GetSliceOrientation()) {
-        case vtkImageViewer2::SLICE_ORIENTATION_XY:
-          if (mSlicers[i]->GetSlice() != (int)lrint(z))
-            mSlicers[i]->SetSlice((int)lrint(z));
-          break;
-
-        case vtkImageViewer2::SLICE_ORIENTATION_XZ:
-          if (mSlicers[i]->GetSlice() != (int)lrint(y))
-            mSlicers[i]->SetSlice((int)lrint(y));
-          break;
-
-        case vtkImageViewer2::SLICE_ORIENTATION_YZ:
-          if (mSlicers[i]->GetSlice() != (int)lrint(x))
-            mSlicers[i]->SetSlice((int)lrint(x));
-          break;
-        }
-        
-        mSlicers[i]->Render();
-        
-        UpdateSlice(i);
-        UpdateTSlice(i);
-      }
-    }
-  }
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::UpdateLinked(int slicer)
-{
-  double p[3], pt[3];
-  p[0] = mSlicers[slicer]->GetCurrentPosition()[0];
-  p[1] = mSlicers[slicer]->GetCurrentPosition()[1];
-  p[2] = mSlicers[slicer]->GetCurrentPosition()[2];
-  mSlicers[slicer]->GetSlicingTransform()->GetInverse()->TransformPoint(p, pt);
-  double x = (pt[0] - mSlicers[slicer]->GetInput()->GetOrigin()[0]) / mSlicers[slicer]->GetInput()->GetSpacing()[0];
-  double y = (pt[1] - mSlicers[slicer]->GetInput()->GetOrigin()[1]) / mSlicers[slicer]->GetInput()->GetSpacing()[1];
-  double z = (pt[2] - mSlicers[slicer]->GetInput()->GetOrigin()[2]) / mSlicers[slicer]->GetInput()->GetSpacing()[2];
-
-  if (x >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0]-0.5 &&
-      x <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1]+0.5 &&
-      y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2]-0.5 &&
-      y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3]+0.5 &&
-      z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4]-0.5 &&
-      z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]+0.5) {
-    for (std::list<std::string>::const_iterator i = mLinkedId.begin(); i != mLinkedId.end(); i++) {
-      emit UpdateLinkManager(*i, slicer, p[0], p[1], p[2], mSlicers[slicer]->GetMaxCurrentTSlice());
-    }
-  }
-}
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::UpdateLinkedNavigation(vvSlicer *refSlicer, bool bPropagate)
-{
-  vtkCamera *refCam = refSlicer->GetRenderer()->GetActiveCamera();
-
-  double refPosition[3];
-  refCam->GetPosition(refPosition);
-  refPosition[refSlicer->GetSliceOrientation()] = refSlicer->GetSlice() *
-      refSlicer->GetInput()->GetSpacing()[refSlicer->GetSliceOrientation()] +
-      refSlicer->GetInput()->GetOrigin()[refSlicer->GetSliceOrientation()];
-
-  refSlicer->GetSlicingTransform()->TransformPoint(refPosition, refPosition);
-  mSlicers[0]->GetSlicingTransform()->GetInverse()->TransformPoint(refPosition, refPosition);
-
-  for ( unsigned int i = 0; i < mSlicers.size(); i++) {
-    vtkCamera *camera = mSlicers[i]->GetRenderer()->GetActiveCamera();
-    camera->SetParallelScale(refCam->GetParallelScale());
-
-    double position[3], focal[3];
-    camera->GetPosition(position);
-    camera->GetFocalPoint(focal);
-
-    for(int j=0; j<3; j++) {
-      if(j!=mSlicers[i]->GetSliceOrientation()) {
-        position[j] = refPosition[j];
-        focal[j]    = refPosition[j];
-      }
-    }
-
-    camera->SetFocalPoint(focal);
-    camera->SetPosition(position);
-
-    //Fix for bug #243
-    mSlicers[i]->ForceUpdateDisplayExtent();
-  }
-  
-  Render();
-  if(bPropagate)
-    for (std::list<std::string>::const_iterator i = mLinkedId.begin(); i != mLinkedId.end(); i++)
-      emit UpdateLinkedNavigation(*i, this, refSlicer);
-}
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-double vvSlicerManager::GetColorWindow() const
-{
-  if (mSlicers.size())
-    return mSlicers[0]->GetColorWindow();
-  return -1;
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-double vvSlicerManager::GetColorLevel() const
-{
-  if (mSlicers.size())
-    return mSlicers[0]->GetColorLevel();
-  return -1;
-}
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-double vvSlicerManager::GetOverlayColorWindow() const
-{
-  if (mSlicers.size())
-    return mSlicers[0]->GetOverlayColorWindow();
-  return -1;
-}
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-double vvSlicerManager::GetOverlayColorLevel() const
-{
-  if (mSlicers.size())
-    return mSlicers[0]->GetOverlayColorLevel();
-  return -1;
-}
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-bool vvSlicerManager::GetLinkOverlayWindowLevel() const
-{
-  if (mSlicers.size())
-    return mSlicers[0]->GetLinkOverlayWindowLevel();
-  return -1;
-}
-//----------------------------------------------------------------------------
-
-//------------------------------------------------------------------------------
-void vvSlicerManager::ResetTransformationToIdentity(const std::string actorType)
-{
-  if(actorType == "image")
-    for(unsigned int i=0; i<this->GetImage()->GetTransform().size(); i++)
-      this->GetImage()->GetTransform()[i]->Identity();
-  else if(actorType == "overlay")
-    for(unsigned int i=0; i<this->GetImage()->GetTransform().size(); i++)
-      this->GetSlicer(0)->GetOverlay()->GetTransform()[i]->Identity();
-  else if(actorType == "fusion")
-    for(unsigned int i=0; i<this->GetImage()->GetTransform().size(); i++)
-      this->GetSlicer(0)->GetFusion()->GetTransform()[i]->Identity();
-  else if(actorType == "vf")
-    for(unsigned int i=0; i<this->GetImage()->GetTransform().size(); i++)
-      this->GetVF()->GetTransform()[i]->Identity();
-  else
-    return;
-
-  for(int i=0; i< this->GetNumberOfSlicers(); i++){
-    this->GetSlicer(i)->ForceUpdateDisplayExtent();
-    this->GetSlicer(i)->ResetCamera();
-    this->GetSlicer(i)->Render();
-  }
-}
-//------------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::Render()
-{
-  for ( unsigned int i = 0; i < mSlicers.size(); i++) {
-    mSlicers[i]->Render();
-  }
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::GenerateDefaultLookupTable()
-{
-  SetPreset(mPreset);
-  SetColorMap(mColorMap);
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::Reload()
-{
-  mReader->Update(mType);
-  mImage=mReader->GetOutput();
-  for ( unsigned int i = 0; i < mSlicers.size(); i++) {
-    mSlicers[i]->SetImage(mImage);
-  }
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::ReloadFusion()
-{
-  mFusionReader->Update(mImage->GetNumberOfDimensions(),mFusionComponent.c_str(),mType);
-
-  for ( unsigned int i = 0; i < mSlicers.size(); i++) {
-    mSlicers[i]->SetFusion(mFusionReader->GetOutput());
-    mSlicers[i]->Render();
-  }
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::ReloadOverlay()
-{
-  mOverlayReader->Update(mImage->GetNumberOfDimensions(),mOverlayComponent.c_str(),mType);
-  for ( unsigned int i = 0; i < mSlicers.size(); i++) {
-    mSlicers[i]->SetOverlay(mOverlayReader->GetOutput());
-    mSlicers[i]->Render();
-  }
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::ReloadVF()
-{
-  mVectorReader->Update(vvImageReader::VECTORFIELD); //deletes the old images through the VF::Init() function
-  mVF=mVectorReader->GetOutput();
-  for ( unsigned int i = 0; i < mSlicers.size(); i++) {
-    mSlicers[i]->SetVF(mVF);
-    mSlicers[i]->Render();
-  }
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::RemoveActor(const std::string& actor_type, int overlay_index)
-{
-  if (actor_type =="overlay")
-    mOverlayReader = NULL;
-
-  if (actor_type =="fusion")
-    mFusionReader = NULL;
-
-  for (unsigned int i = 0; i < mSlicers.size(); i++)
-    mSlicers[i]->RemoveActor(actor_type,overlay_index);
-
-  if (actor_type=="vector") {
-    mVF=NULL;
-    mVectorReader=NULL;
-  }
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::RemoveActors()
-{
-  ///This method leaks a few objects. See RemoveActor for what a
-  ///correct implementation would look like
-  //DS -> probably due to the reader (now released in the
-  //RemoveActor() function. (I hope)
-  for ( unsigned int i = 0; i < mSlicers.size(); i++) {
-    mSlicers[i]->SetDisplayMode(0);
-    mSlicers[i]->GetRenderer()->RemoveActor(mSlicers[i]->GetImageActor());
-  }
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::UpdateInfoOnCursorPosition(int slicer)
-{
-  //  int view = mSlicers[slicer]->GetSliceOrientation();
-  //  int slice = mSlicers[slicer]->GetSlice();
-  double x = mSlicers[slicer]->GetCursorPosition()[0];
-  double y = mSlicers[slicer]->GetCursorPosition()[1];
-  double z = mSlicers[slicer]->GetCursorPosition()[2];
-  double X = (x - mSlicers[slicer]->GetInput()->GetOrigin()[0])/
-    mSlicers[slicer]->GetInput()->GetSpacing()[0];
-  double Y = (y - mSlicers[slicer]->GetInput()->GetOrigin()[1])/
-    mSlicers[slicer]->GetInput()->GetSpacing()[1];
-  double Z = (z - mSlicers[slicer]->GetInput()->GetOrigin()[2])/
-    mSlicers[slicer]->GetInput()->GetSpacing()[2];
-  double value = -VTK_DOUBLE_MAX;
-  int displayVec = 0;
-  double xVec=0, yVec=0, zVec=0, valueVec=0;
-  int displayOver = 0;
-  int displayFus = 0;
-  double valueOver=0, valueFus=0;
-  if (X >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0] &&
-      X <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1] &&
-      Y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2] &&
-      Y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3] &&
-      Z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4] &&
-      Z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]) {
-    value = this->GetScalarComponentAsDouble(mSlicers[slicer]->GetInput(), X, Y, Z);
-
-    if (mSlicers[slicer]->GetVFActor() ) {
-      displayVec = 1;
-      unsigned int currentTime = mSlicers[slicer]->GetMaxCurrentTSlice();
-      vtkImageData *vf = NULL;
-
-      if (mSlicers[slicer]->GetVF()->GetVTKImages().size() > currentTime)
-        vf = mSlicers[slicer]->GetVF()->GetVTKImages()[currentTime];
-      else
-        vf = mSlicers[slicer]->GetVF()->GetVTKImages()[0];
-
-      if (vf) {
-        double Xvf = (x - vf->GetOrigin()[0])/ vf->GetSpacing()[0];
-        double Yvf = (y - vf->GetOrigin()[1])/ vf->GetSpacing()[1];
-        double Zvf = (z - vf->GetOrigin()[2])/ vf->GetSpacing()[2];
-        xVec = this->GetScalarComponentAsDouble( vf, Xvf, Yvf, Zvf, 0);
-        yVec = this->GetScalarComponentAsDouble( vf, Xvf, Yvf, Zvf, 1);
-        zVec = this->GetScalarComponentAsDouble( vf, Xvf, Yvf, Zvf, 2);
-        valueVec = sqrt(xVec*xVec + yVec*yVec + zVec*zVec);
-      }
-    }
-    if (mSlicers[slicer]->GetOverlayActor() ) {
-      displayOver = 1;
-      vtkImageData *overlay = dynamic_cast<vtkImageData*>(mSlicers[slicer]->GetOverlayMapper()->GetInput());
-      double Xover = (x - overlay->GetOrigin()[0]) / overlay->GetSpacing()[0];
-      double Yover = (y - overlay->GetOrigin()[1]) / overlay->GetSpacing()[1];
-      double Zover = (z - overlay->GetOrigin()[2]) / overlay->GetSpacing()[2];
-      valueOver = this->GetScalarComponentAsDouble(overlay, Xover, Yover, Zover);
-    }
-    if (mSlicers[slicer]->GetFusionActor() ) {
-      displayFus = 1;
-      vtkImageData *fusion = dynamic_cast<vtkImageData*>(mSlicers[slicer]->GetFusionMapper()->GetInput());
-      double Xover = (x - fusion->GetOrigin()[0]) / fusion->GetSpacing()[0];
-      double Yover = (y - fusion->GetOrigin()[1]) / fusion->GetSpacing()[1];
-      double Zover = (z - fusion->GetOrigin()[2]) / fusion->GetSpacing()[2];
-      valueFus = this->GetScalarComponentAsDouble(fusion, Xover, Yover, Zover);
-    }
-    emit UpdatePosition(mSlicers[slicer]->GetCursorVisibility(),
-                        x,y,z,X,Y,Z,value);
-    emit UpdateVector(displayVec,xVec, yVec, zVec, valueVec);
-    emit UpdateOverlay(displayOver,valueOver,value);
-    emit UpdateFusion(displayFus,valueFus);
-  }
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::Activated()
-{
-  emit currentImageChanged(mId);
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::Picked()
-{
-  emit currentPickedImageChanged(mId);
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::UpdateWindowLevel()
-{
-  emit WindowLevelChanged();
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::UpdateSlice(int slicer)
-{
-  if (mPreviousSlice[slicer] == mSlicers[slicer]->GetSlice()) {
-    //DD("============= NOTHING");
-    return;
-  }
-  //std::cout << "vvSlicerManager::UpdateSlice " << slicer << " " << mSlicers[slicer]->GetSlice() << std::endl;
-  emit UpdateSlice(slicer, mSlicers[slicer]->GetSlice());
-  mSlicers[slicer]->Render(); // DS <-- I add this, this could/must be the only Render ...
-  mPreviousSlice[slicer] = mSlicers[slicer]->GetSlice();
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::UpdateTSlice(int slicer)
-{
-  int slice = mSlicers[slicer]->GetSlice();
-  int tslice = mSlicers[slicer]->GetMaxCurrentTSlice();
-  if (mPreviousSlice[slicer] == slice) {
-    if (mPreviousTSlice[slicer] == tslice) {
-      //      DD("************** NOTHING ***********");
-      return;
-    }
-  }
-  mPreviousSlice[slicer] = slice;
-  mPreviousTSlice[slicer] = tslice;
-  //std::cout << "vvSlicerManager::UpdateTSlice " << slicer << " " << tslice << std::endl;
-  emit UpdateTSlice(slicer, tslice);
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::UpdateSliceRange(int slicer)
-{
-  emit UpdateSliceRange(slicer,
-                        mSlicers[slicer]->GetSliceRange()[0], mSlicers[slicer]->GetSliceRange()[1],
-                        0,mSlicers[slicer]->GetTMax());
-}
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetSlicingPreset(SlicingPresetType preset)
-{
-  if(mSlicingPreset==preset)
-    return;
-
-  vtkMatrix4x4 *imageTransformInverse = vtkMatrix4x4::New();
-  mImage->GetTransform()[this->GetTSlice()]->GetInverse(imageTransformInverse);
-
-  for(int i=0; i< this->GetNumberOfSlicers(); i++){
-    vvSlicer *s = this->GetSlicer(i);
-    switch(preset)
-    {
-    case WORLD_SLICING:
-      s->GetSlicingTransform()->Identity();
-      break;
-    case VOXELS_SLICING:
-      s->GetSlicingTransform()->SetMatrix(imageTransformInverse);
-      break;
-    default:
-      imageTransformInverse->Delete();
-      return;
-    }
-    s->ForceUpdateDisplayExtent();
-    s->SetSlice((s->GetInput()->GetWholeExtent()[s->GetSliceOrientation()*2+1]
-                +s->GetInput()->GetWholeExtent()[s->GetSliceOrientation()*2])/2.0);
-    s->ResetCamera();
-    s->Render();
-  }
-
-  imageTransformInverse->Delete();
-  mSlicingPreset = preset;
-}
-
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetPreset(int preset)
-{
-  //vtkLookupTable* LUT = static_cast<vtkLookupTable*>(mSlicers[0]->GetWindowLevel()->GetLookupTable());
-  double window = mSlicers[0]->GetColorWindow();
-  double level = mSlicers[0]->GetColorLevel();
-
-  std::string component_type=mImage->GetScalarTypeAsITKString();
-  switch (preset) {
-  case 0:
-    double range[2];
-    mImage->GetScalarRange(range);
-    window = range[1] - range[0];
-    level = (range[1] + range[0])* 0.5;
-    break;
-  case 1:
-    window = 2000;
-    level = 0;
-    break;
-  case 2:
-    window = 400;
-    level = 20;
-    break;
-  case 3: // lungs (same as FOCAL)
-    window = 1700;
-    level = -300;
-    break;
-  case 4:
-    window = 1000;
-    level = 500;
-    break;
-  case 5:
-    window = 1;
-    level = 0.5;
-    break;
-  case 6:
-    break;
-  case 7:
-    window=1.;
-    level=0.;
-    break;
-  }
-  mPreset = preset;
-  this->SetColorWindow(window);
-  this->SetColorLevel(level);
-
-  //if (LUT)
-  //{
-  //    SetColorMap(-1);
-  //}
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetLocalColorWindowing(const int slicer, const bool bCtrlKey)
-{
-  double min, max;
-  if(bCtrlKey && this->mSlicers[slicer]->GetFusion()) {
-    int t = mSlicers[slicer]->GetFusionTSlice();
-    this->mSlicers[slicer]->GetExtremasAroundMousePointer(min, max,
-                                                          this->mSlicers[slicer]->GetFusion()->GetVTKImages()[t],
-                                                          this->mSlicers[slicer]->GetConcatenatedFusionTransform());
-    this->SetFusionWindow(max-min);
-    this->SetFusionLevel(0.5*(min+max));
-    this->SetColorMap(mColorMap);
-  }
-  else if(bCtrlKey && this->mSlicers[slicer]->GetOverlay()) {
-    int t = mSlicers[slicer]->GetOverlayTSlice();
-    this->mSlicers[slicer]->GetExtremasAroundMousePointer(min, max,
-                                                          this->mSlicers[slicer]->GetOverlay()->GetVTKImages()[t],
-                                                          this->mSlicers[slicer]->GetConcatenatedOverlayTransform());
-    if(this->mSlicers[slicer]->GetLinkOverlayWindowLevel()){
-      this->SetColorWindow(max-min);
-      this->SetColorLevel(0.5*(min+max));
-    } else {
-      this->SetOverlayColorWindow(max-min);
-      this->SetOverlayColorLevel(0.5*(min+max));
-    }
-  }
-  else {
-    int t = this->GetTSlice();
-    this->mSlicers[slicer]->GetExtremasAroundMousePointer(min, max,
-                                                          this->mSlicers[slicer]->GetImage()->GetVTKImages()[t],
-                                                          this->mSlicers[slicer]->GetConcatenatedTransform());
-    this->SetColorWindow(max-min);
-    this->SetColorLevel(0.5*(min+max));
-    this->SetPreset(6);
-  }
-  this->Render();
-  this->UpdateWindowLevel();
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetColorMap(int colormap)
-{
-  double range[2];
-  range[0] = mSlicers[0]->GetInput()->GetScalarRange()[0];
-  range[1] = mSlicers[0]->GetInput()->GetScalarRange()[1];
-
-  double window = mSlicers[0]->GetWindowLevel()->GetWindow();
-  double level = mSlicers[0]->GetWindowLevel()->GetLevel();
-
-  vtkLookupTable* LUT = static_cast<vtkLookupTable*>(mSlicers[0]->GetWindowLevel()->GetLookupTable());
-  switch (colormap) {
-  case -1:
-    break;
-  case 0:
-    LUT = NULL;
-    break;
-  case 1:
-    if (LUT == NULL)
-      LUT = vtkLookupTable::New();
-    LUT->SetValueRange(0,1);
-    LUT->SetSaturationRange(1,1);
-    LUT->SetHueRange(0,0.18);
-    break;
-  case 2:
-    if (LUT == NULL)
-      LUT = vtkLookupTable::New();
-    LUT->SetValueRange(0,1);
-    LUT->SetSaturationRange(1,1);
-    LUT->SetHueRange(0.4,0.80);
-    break;
-  case 3:
-    if (LUT == NULL)
-      LUT = vtkLookupTable::New();
-    LUT->SetValueRange(0.5,1);
-    LUT->SetSaturationRange(1,1);
-    LUT->SetHueRange(0.666,0);
-    break;
-  case 4:
-    if (LUT == NULL)
-      LUT = vtkLookupTable::New();
-    LUT->SetValueRange(1,1);
-    LUT->SetSaturationRange(1,1);
-    LUT->SetHueRange(0,1);
-    LUT->SetAlphaRange(1, 1);
-    break;
-  case 5:
-    if (LUT == NULL)
-      LUT = vtkLookupTable::New();
-    LUT->SetValueRange(1,1);
-    LUT->SetSaturationRange(1,1);
-    LUT->SetHueRange(1,0.1);
-    //LUT->SetRampToLinear();
-    break;
-  }
-  if (LUT) {
-    LUT->SetTableRange(level-fabs(window)/2,level+fabs(window)/2);
-    LUT->Build();
-  }
-  vtkWindowLevelLookupTable* fusLUT = NULL;
-  if (mSlicers[0]->GetFusion()) { // && mFusionColorMap >= 0) {
-    fusLUT = vtkWindowLevelLookupTable::New();
-    double fusRange [2];
-    fusRange[0] = mFusionLevel - mFusionWindow/2;
-    fusRange[1] = mFusionLevel + mFusionWindow/2;
-    double* frange = mFusionReader->GetOutput()->GetVTKImages()[0]->GetScalarRange();
-    fusLUT->SetTableRange(frange);
-    fusLUT->SetValueRange(1,1);
-    fusLUT->SetSaturationRange(1,1);
-    fusLUT->SetAlphaRange(1, 1);
-    fusLUT->SetWindow(mFusionWindow);
-    fusLUT->SetLevel(mFusionLevel);
-    if (mFusionColorMap == 1)
-      fusLUT->SetHueRange(0,0.18);
-    else if (mFusionColorMap == 2)
-      fusLUT->SetHueRange(0.4,0.80);
-    else if (mFusionColorMap == 3)
-    {
-      fusLUT->SetHueRange(0.666, 0);
-      fusLUT->SetValueRange(0.5, 1);
-    }
-    else if (mFusionColorMap == 4)
-      fusLUT->SetHueRange(0,1);
-    else if (mFusionColorMap <= 0)
-    {
-      fusLUT->SetValueRange(0,1);
-      fusLUT->SetSaturationRange(0,0);
-    }
-    
-    fusLUT->ForceBuild();
-    double v[4];
-    
-    // set color table transparency
-    //double alpha_range=(double)mFusionThresOpacity/10;
-    double range_end = fusRange[0] + (double)mFusionThresOpacity*(fusRange[1] - fusRange[0])/100;
-    double curr_value = fusRange[0];
-    int nvalues = fusLUT->GetNumberOfTableValues();
-    for (double i = 0; curr_value < range_end; i++) {  
-      fusLUT->GetTableValue(i, v);
-      v[3] = 0;
-      //if (curr_value >= -alpha_range && curr_value <= alpha_range) v[3] = pow(fabs(curr_value/alpha_range),2);
-      //else v[3] = 1;
-      fusLUT->SetTableValue(i, v);
-      curr_value += (fusRange[1] - fusRange[0])/nvalues;
-    }
-  }
-  for ( unsigned int i = 0; i < mSlicers.size(); i++) {
-    
-    if (mSlicers[i]->GetOverlay()) {
-      vtkLookupTable* supLUT = vtkLookupTable::New();
-      supLUT->SetTableRange(range[0],range[1]);
-      supLUT->SetValueRange(1,1);
-      supLUT->SetSaturationRange(1,1);
-      supLUT->SetHueRange(double(mOverlayColor)/360,double(mOverlayColor)/360);
-      supLUT->Build();
-      vtkLookupTable* invLUT = vtkLookupTable::New();
-      invLUT->SetTableRange(range[0],range[1]);
-      invLUT->SetValueRange(1,1);
-      invLUT->SetSaturationRange(1,1);
-      invLUT->SetHueRange(double((mOverlayColor+180)%360)/360,double((mOverlayColor+180)%360)/360);
-      invLUT->Build();
-      mSlicers[i]->GetWindowLevel()->SetLookupTable(supLUT);
-      mSlicers[i]->GetOverlayMapper()->SetLookupTable(invLUT);
-      invLUT->Delete();
-      supLUT->Delete();
-    } else if (mSlicers[i]->GetOverlay()) {
-      mSlicers[i]->GetWindowLevel()->SetLookupTable(LUT);
-    } else {
-      mSlicers[i]->GetWindowLevel()->SetLookupTable(LUT);
-    }
-    
-    if (mSlicers[i]->GetFusion()) {
-      mSlicers[i]->ShowFusionLegend(mFusionShowLegend);
-      mSlicers[i]->GetFusionMapper()->SetLookupTable(fusLUT);
-      mSlicers[i]->GetFusionActor()->SetOpacity(double(mFusionOpacity)/100);
-    }
-  }
-  if (fusLUT)
-    fusLUT->Delete();
-  if (colormap >= 0)
-    mColorMap = colormap;
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-vvLandmarks* vvSlicerManager::GetLandmarks()
-{
-  if (mLandmarks == NULL) {
-    mLandmarks = new vvLandmarks(mSlicers[0]->GetTMax()+1);
-    for (unsigned int i = 0; i < mSlicers.size(); i++)
-      mSlicers[i]->SetLandmarks(mLandmarks);
-  }
-  return mLandmarks;
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::AddLandmark(float x,float y,float z,float t)
-{
-  double x_index = (x - mSlicers[0]->GetInput()->GetOrigin()[0])/mSlicers[0]->GetInput()->GetSpacing()[0];
-  double y_index = (y - mSlicers[0]->GetInput()->GetOrigin()[1])/mSlicers[0]->GetInput()->GetSpacing()[1];
-  double z_index = (z - mSlicers[0]->GetInput()->GetOrigin()[2])/mSlicers[0]->GetInput()->GetSpacing()[2];
-  if (x_index >= mSlicers[0]->GetInput()->GetWholeExtent()[0]-0.5 &&
-      x_index <= mSlicers[0]->GetInput()->GetWholeExtent()[1]+0.5 &&
-      y_index >= mSlicers[0]->GetInput()->GetWholeExtent()[2]-0.5 &&
-      y_index <= mSlicers[0]->GetInput()->GetWholeExtent()[3]+0.5 &&
-      z_index >= mSlicers[0]->GetInput()->GetWholeExtent()[4]-0.5 &&
-      z_index <= mSlicers[0]->GetInput()->GetWholeExtent()[5]+0.5) {
-    double value = this->GetScalarComponentAsDouble(mSlicers[0]->GetInput(), x_index, y_index, z_index);
-    this->GetLandmarks()->AddLandmark(x,y,z,t,value);
-    emit LandmarkAdded();
-  }
-}
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::PrevImage(int slicer)
-{
-  emit ChangeImageWithIndexOffset(this, slicer, -1);
-}
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::NextImage(int slicer)
-{
-  emit ChangeImageWithIndexOffset(this, slicer,  1);
-}
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::VerticalSliderHasChanged(int slicer, int slice)
-{
-  emit AVerticalSliderHasChanged(slicer, slice);
-}
-
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-double vvSlicerManager::GetScalarComponentAsDouble(vtkImageData *image, double X, double Y, double Z, int component)
-{
-  int ix, iy, iz;
-  return mSlicers[0]->GetScalarComponentAsDouble(image, X, Y, Z, ix, iy, iz, component);
-}
-//----------------------------------------------------------------------------
+/*=========================================================================\r
+  Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv\r
+\r
+  Authors belong to:\r
+  - University of LYON              http://www.universite-lyon.fr/\r
+  - Léon Bérard cancer center       http://oncora1.lyon.fnclcc.fr\r
+  - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr\r
+\r
+  This software is distributed WITHOUT ANY WARRANTY; without even\r
+  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\r
+  PURPOSE.  See the copyright notices for more information.\r
+\r
+  It is distributed under dual licence\r
+\r
+  - BSD        See included LICENSE.txt file\r
+  - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html\r
+  ======================================================================-====*/\r
+\r
+#include "vvSlicerManager.h"\r
+#include "vvSlicer.h"\r
+#include "vvImage.h"\r
+#include "vvSlicerManagerCommand.h"\r
+#include "vvInteractorStyleNavigator.h"\r
+#include "vvLandmarks.h"\r
+#include "vvMesh.h"\r
+#include "vvBlendImageActor.h"\r
+\r
+#include <vtkImageActor.h>\r
+#include <vtkImageData.h>\r
+#include <vtkRenderWindow.h>\r
+#include <vtkRendererCollection.h>\r
+#include <vtkRenderWindowInteractor.h>\r
+#include <vtkImageMapToWindowLevelColors.h>\r
+#include <vtkWindowLevelLookupTable.h>\r
+#include <vtkColorTransferFunction.h>\r
+#include <vtkImageClip.h>\r
+#include <vtkLODActor.h>\r
+#include <vtkPointData.h>\r
+#include <vtksys/SystemTools.hxx>\r
+#include <vtkCamera.h>\r
+\r
+#include <qfileinfo.h>\r
+#include <QMessageBox>\r
+//----------------------------------------------------------------------------\r
+vvSlicerManager::vvSlicerManager(int numberOfSlicers)\r
+{\r
+  mFileName = "";\r
+  mId = "";\r
+  mVFName = "";\r
+  mOverlayName = "";\r
+  mFusionName = "";\r
+  mVFId = "";\r
+  mLastError = "";\r
+  mType = vvImageReader::UNDEFINEDIMAGETYPE;\r
+  mColorMap = 0;\r
+  mPreset = 0;\r
+  mOverlayColor = 130;\r
+\r
+  mFusionOpacity = 30;\r
+  mFusionThresOpacity = 1;\r
+  mFusionColorMap = 3;\r
+  mFusionWindow = 1000;\r
+  mFusionLevel = 1000;\r
+  mFusionShowLegend = true;\r
+  \r
+  mFusionSequenceInvolvementCode = -1;\r
+  mFusionSequenceIndexLinkedManager = -1;\r
+  mFusionSequenceFrameIndex = -1;\r
+  mFusionSequenceNbFrames = 0;\r
+  mFusionSequenceSpatialSyncFlag = false;\r
+  mFusionSequenceTemporalSyncFlag = false;\r
+\r
+  mLandmarks = NULL;\r
+  mLinkedId.resize(0);\r
+\r
+  for ( int i = 0; i < numberOfSlicers; i++)\r
+    mSlicers.push_back(vtkSmartPointer<vvSlicer>::New());\r
+  mSelectedSlicer = -1;\r
+  \r
+  mPreviousSlice.resize(numberOfSlicers, 0);\r
+  mPreviousTSlice.resize(numberOfSlicers, 0);\r
+  mSlicingPreset = WORLD_SLICING;\r
+\r
+  \r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+vvSlicerManager::~vvSlicerManager()\r
+{\r
+  if (mLandmarks)\r
+    delete mLandmarks;\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//------------------------------------------------------------------------------\r
+void vvSlicerManager::SetFilename(std::string filename, int number)\r
+{\r
+  mFileName = filename;\r
+  mFileName = vtksys::SystemTools::GetFilenameName(mFileName);\r
+  mBaseFileName = vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(mFileName));\r
+  mBaseFileNameNumber = number;\r
+\r
+  mFileName = mBaseFileName;\r
+  if (number != 0) {\r
+    mFileName.append("_"+clitk::toString(number));\r
+  }\r
+  mFileName.append(vtksys::SystemTools::GetFilenameLastExtension(filename));\r
+\r
+  for(unsigned int i=0; i<mSlicers.size(); i++) {\r
+    mSlicers[i]->SetFileName(mFileName);//vtksys::SystemTools::GetFilenameWithoutLastExtension(filename));\r
+  }\r
+  \r
+}\r
+//------------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::AddContour(vvMesh::Pointer contour,bool propagate)\r
+{\r
+  for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+    mSlicers[i]->AddContour(contour,propagate);\r
+  }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::ToggleContourSuperposition()\r
+{\r
+  for ( unsigned int i = 0; i < mSlicers.size(); i++)\r
+    mSlicers[i]->ToggleContourSuperposition();\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+std::string vvSlicerManager::GetListOfAbsoluteFilePathInOneString(const std::string &actorType)\r
+{\r
+  vvImageReader *reader = NULL;\r
+\r
+  if(actorType=="image")\r
+    reader = mReader;\r
+  else if(actorType=="overlay")\r
+    reader = mOverlayReader;\r
+  else if(actorType=="fusion")\r
+    reader = mFusionReader;\r
+  else if(actorType=="vector")\r
+    reader = mVectorReader;\r
+  else if(actorType=="fusionSequence")\r
+       reader = mFusionSequenceReader;\r
+\r
+  if(!reader)\r
+    return "";\r
+\r
+  std::string list;\r
+  for(unsigned int i=0; i<reader->GetInputFilenames().size(); i++){\r
+    QFileInfo fileinfo(reader->GetInputFilenames()[i].c_str()); //Do not show the path\r
+    if(i)\r
+      list += '\n';\r
+    list += fileinfo.absoluteFilePath().toStdString();\r
+  }\r
+  return list;\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+bool vvSlicerManager::SetImage(std::string filename, vvImageReader::LoadedImageType type, int n, unsigned int slice)\r
+{\r
+  mType = type;\r
+  if (mReader.IsNull())\r
+    mReader = vvImageReader::New();\r
+  std::vector<std::string> filenames;\r
+  filenames.push_back(filename);\r
+  mReader->SetInputFilenames(filenames);\r
+  mReader->SetSlice(slice); // Only used for SLICED type\r
+  mReader->Update(type);\r
+\r
+  SetFilename(filename, n);\r
+  //  mFileName = vtksys::SystemTools::GetFilenameName(mFileName);\r
+  //mBaseFileName = vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(mFileName));\r
+  //mBaseFileNameNumber = n;\r
+\r
+  if (mReader->GetLastError().size() == 0) {\r
+    mImage=mReader->GetOutput();\r
+    for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+      mSlicers[i]->SetFileName(vtksys::SystemTools::GetFilenameWithoutLastExtension(filename));\r
+      mSlicers[i]->SetImage(mReader->GetOutput());\r
+    }\r
+  } else {\r
+    mLastError = mReader->GetLastError();\r
+    return false;\r
+  }\r
+  // if (n!=0) {\r
+  //   mFileName.append("_"+clitk::toString(n));\r
+  // }\r
+  return true;\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetImage(vvImage::Pointer image)\r
+{\r
+  mImage=image;\r
+  for (unsigned int i = 0; i < mSlicers.size(); i++) {\r
+    mSlicers[i]->SetImage(image);\r
+  }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+bool vvSlicerManager::SetImages(std::vector<std::string> filenames, vvImageReader::LoadedImageType type, int n)\r
+{\r
+  mType = type;\r
+  std::string fileWithoutExtension = vtksys::SystemTools::GetFilenameWithoutExtension(filenames[0]);\r
+  if (type == vvImageReader::DICOM)\r
+    fileWithoutExtension += "_dicom";\r
+  else if (type == vvImageReader::MERGED)\r
+    fileWithoutExtension += "_merged";\r
+  else if (type == vvImageReader::MERGEDWITHTIME)\r
+    fileWithoutExtension += "_merged_wt";\r
+\r
+  mFileName = vtksys::SystemTools::GetFilenameName(mFileName);\r
+  mFileName = fileWithoutExtension + vtksys::SystemTools::GetFilenameExtension(filenames[0]);\r
+  if (mReader.IsNull())\r
+    mReader = vvImageReader::New();\r
+  mReader->SetInputFilenames(filenames);\r
+  mReader->Update(type);\r
+\r
+  mBaseFileName = vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(mFileName));\r
+  mBaseFileNameNumber = n;\r
+\r
+  if (mReader->GetLastError().size() == 0) {\r
+    mImage=mReader->GetOutput();\r
+    for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+      mSlicers[i]->SetFileName(fileWithoutExtension);\r
+      mSlicers[i]->SetImage(mReader->GetOutput());\r
+    }\r
+  } else {\r
+    mLastError = mReader->GetLastError();\r
+    return false;\r
+  }\r
+  if (n!=0) {\r
+    mFileName.append("_"+clitk::toString(n));\r
+  }\r
+  return true;\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+bool vvSlicerManager::SetOverlay(std::vector<std::string> filenames,int dim, std::string component, vvImageReader::LoadedImageType type)\r
+{\r
+  mOverlayName = filenames[0];\r
+  mOverlayComponent = component;\r
+  if (dim > mImage->GetNumberOfDimensions()) {\r
+    mLastError = " Overlay dimension cannot be greater than reference image!";\r
+    return false;\r
+  }\r
+  if (mOverlayReader.IsNull())\r
+    mOverlayReader = vvImageReader::New();\r
+  mOverlayReader->SetInputFilenames(filenames);\r
+  mOverlayReader->Update(type);\r
+  if (mOverlayReader->GetLastError().size() == 0) {\r
+    for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+      mSlicers[i]->SetOverlay(mOverlayReader->GetOutput());\r
+    }\r
+  } else {\r
+    mLastError = mOverlayReader->GetLastError();\r
+    return false;\r
+  }\r
+  return true;\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+bool vvSlicerManager::SetFusion(std::string filename,int dim, std::string component)\r
+{\r
+  mFusionName = filename;\r
+  mFusionComponent = component;\r
+  if (dim > mImage->GetNumberOfDimensions()) {\r
+    mLastError = " Overlay dimension cannot be greater then reference image!";\r
+    return false;\r
+  }\r
+  if (mFusionReader.IsNull())\r
+    mFusionReader = vvImageReader::New();\r
+  std::vector<std::string> filenames;\r
+  filenames.push_back(filename);\r
+  mFusionReader->SetInputFilenames(filenames);\r
+  mFusionReader->Update(mImage->GetNumberOfDimensions(),component.c_str(),mType);\r
+  if (mFusionReader->GetLastError().size() == 0) {\r
+    for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+      mSlicers[i]->SetFusion(mFusionReader->GetOutput());\r
+    }\r
+  } else {\r
+    mLastError = mFusionReader->GetLastError();\r
+    return false;\r
+  }\r
+  double *fusRange = mFusionReader->GetOutput()->GetVTKImages()[0]->GetScalarRange();\r
+  mFusionLevel = (fusRange[0]+fusRange[1])/2;\r
+  mFusionWindow = fusRange[1]-fusRange[0];\r
+\r
+  return true;\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+//this function is called by vvMainWindow::AddFusionSequence for the primary sequence (CT), while the given files constitute the secondary sequence.\r
+bool vvSlicerManager::SetFusionSequence(std::vector<std::string> filenames, int dim, std::string component, vvImageReader::LoadedImageType type)\r
+{\r
+       mFusionSequenceInvolvementCode = 0;\r
+\r
+       mFusionName = filenames[0];\r
+       mFusionComponent = component;\r
+\r
+       if (dim > mImage->GetNumberOfDimensions()) {\r
+               mLastError = " Fusion Sequence dimension cannot be greater than reference image!";\r
+               return false;\r
+       }\r
+\r
+       if (mFusionSequenceReader.IsNull())\r
+               mFusionSequenceReader = vvImageReader::New();\r
+\r
+       mFusionSequenceReader->SetInputFilenames(filenames);\r
+       mFusionSequenceReader->Update(type);\r
+\r
+\r
+       if (mFusionSequenceReader->GetLastError().size() == 0) {\r
+               for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+                       mSlicers[i]->SetFusion(mFusionSequenceReader->GetOutput(), mFusionSequenceInvolvementCode);\r
+               }\r
+       } else {\r
+               mLastError = mFusionSequenceReader->GetLastError();\r
+               return false;\r
+       }\r
+       double *fusRange = mFusionSequenceReader->GetOutput()->GetVTKImages()[0]->GetScalarRange();\r
+       mFusionLevel = (fusRange[0]+fusRange[1])/2;\r
+       mFusionWindow = fusRange[1]-fusRange[0];\r
+\r
+       //store the initial transform matrices of each frame, and reset them to identity\r
+       mFusionSequenceListInitialTransformMatrices.clear();\r
+       for (unsigned i=0 ; i<mFusionSequenceReader->GetOutput()->GetTransform().size() ; i++) {\r
+               AddFusionSequenceInitialTransformMatrices( mFusionSequenceReader->GetOutput()->GetTransform()[i]->GetMatrix() );\r
+               mFusionSequenceReader->GetOutput()->GetTransform()[i]->Identity();\r
+               mFusionSequenceReader->GetOutput()->GetTransform()[i]->Update();\r
+       }\r
+\r
+       //adjust the time slider in the overlay panel\r
+       mFusionSequenceNbFrames = mFusionSequenceReader->GetOutput()->GetTransform().size()-1; //actually, this is the maximum index...\r
+       mFusionSequenceFrameIndex = std::max<int>( 0, std::min<int>(mFusionSequenceFrameIndex, mFusionSequenceNbFrames));\r
+\r
+       return true;\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+bool vvSlicerManager::SetVF(std::string filename)\r
+{\r
+  if (mVectorReader.IsNull())\r
+    mVectorReader = vvImageReader::New();\r
+  mVectorReader->SetInputFilename(filename);\r
+  \r
+  if (mType == vvImageReader::IMAGEWITHTIME)\r
+    mVectorReader->Update(vvImageReader::VECTORFIELDWITHTIME);\r
+  else\r
+    mVectorReader->Update(vvImageReader::VECTORFIELD);\r
+  if (mVectorReader->GetLastError().size() != 0) {\r
+    mLastError = mVectorReader->GetLastError();\r
+    return false;\r
+  } else\r
+    return SetVF(mVectorReader->GetOutput(),filename);\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+bool vvSlicerManager::SetVF(vvImage::Pointer vf,std::string filename)\r
+{\r
+  if (vf->GetNumberOfDimensions() > mImage->GetNumberOfDimensions()) {\r
+    mLastError = "Sorry, vector field dimension cannot be greater then reference image.";\r
+    return false;\r
+  }\r
+  if (vf->GetNumberOfDimensions() == 4) {\r
+    if (vf->GetSpacing()[3] != mImage->GetSpacing()[3]) {\r
+      mLastError = "Sorry, vector field time spacing cannot be different from time spacing of the reference image.";\r
+      return false;\r
+    }\r
+    if (vf->GetOrigin()[3] != mImage->GetOrigin()[3]) {\r
+      mLastError = "Sorry, vector field time origin cannot be different from time origin of the reference image.";\r
+      return false;\r
+    }\r
+  }\r
+  mVF=vf;\r
+  mVFName = filename;\r
+  for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+    mSlicers[i]->SetVF(vf);\r
+  }\r
+  return true;\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+vvSlicer* vvSlicerManager::GetSlicer(int i)\r
+{\r
+  return mSlicers[i];\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::UpdateSlicer(int num, bool state)\r
+{\r
+  if (mSlicers[num]->GetImage()) {\r
+    mSlicers[num]->SetDisplayMode(state);\r
+  }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetSlicerWindow(int i, vtkRenderWindow* RW)\r
+{\r
+  mSlicers[i]->SetRenderWindow(i,RW);\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetInteractorStyleNavigator(int i, vtkInteractorStyle* style)\r
+{\r
+  vvSlicerManagerCommand *smc = vvSlicerManagerCommand::New();\r
+  smc->SM = this;\r
+  smc->SetSlicerNumber(i);\r
+  mSlicers[i]->GetRenderWindow()->GetInteractor()->SetInteractorStyle(style);\r
+\r
+  mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
+    GetInteractorStyle()->AddObserver(vtkCommand::KeyPressEvent, smc);\r
+  mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
+    GetInteractorStyle()->AddObserver(vtkCommand::WindowLevelEvent, smc);\r
+  mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
+    GetInteractorStyle()->AddObserver(vtkCommand::EndWindowLevelEvent, smc);\r
+  mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
+    GetInteractorStyle()->AddObserver(vtkCommand::StartWindowLevelEvent, smc);\r
+  mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
+    GetInteractorStyle()->AddObserver(vtkCommand::PickEvent, smc);\r
+  mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
+    GetInteractorStyle()->AddObserver(vtkCommand::StartPickEvent, smc);\r
+  mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
+    GetInteractorStyle()->AddObserver(vtkCommand::LeaveEvent, smc);\r
+  mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
+    GetInteractorStyle()->AddObserver(vtkCommand::UserEvent, smc);\r
+  mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
+    GetInteractorStyle()->AddObserver(vtkCommand::MouseWheelForwardEvent, smc);\r
+  mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
+    GetInteractorStyle()->AddObserver(vtkCommand::MouseWheelBackwardEvent, smc);\r
+  // mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
+  //   GetInteractorStyle()->AddObserver(vtkCommand::LeftButtonReleaseEvent, smc);\r
+  mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
+    GetInteractorStyle()->AddObserver(vtkCommand::EndPickEvent, smc);\r
+  mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
+    GetInteractorStyle()->AddObserver(vtkCommand::EndInteractionEvent, smc);\r
+  smc->Delete();\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::LeftButtonReleaseEvent(int slicer)\r
+{\r
+  emit LeftButtonReleaseSignal(slicer);\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::EmitMousePositionUpdated(int slicer)\r
+{\r
+  emit MousePositionUpdatedSignal(slicer);\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::EmitKeyPressed(std::string KeyPress)\r
+{\r
+  emit KeyPressedSignal(KeyPress);\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetSliceOrientation(int slicer, int orientation)\r
+{\r
+  mSlicers[slicer]->SetSliceOrientation(orientation);\r
+  emit UpdateOrientation(slicer, orientation);\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+int vvSlicerManager::GetTSlice()\r
+{\r
+  return mSlicers[0]->GetTSlice();\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetTSlice(int slice, bool updateLinkedImages)\r
+{\r
+       if (!updateLinkedImages) { //for fusionSequence, TMax / MaxCurrentTSlice are irrelevant.\r
+               for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+                       mSlicers[i]->SetTSlice(slice, updateLinkedImages);\r
+                       UpdateTSlice(i);\r
+               }\r
+               return;\r
+       }\r
+\r
+  if (slice < 0)\r
+    slice = 0;\r
+  else if (slice > mSlicers[0]->GetTMax())\r
+    slice = mSlicers[0]->GetTMax();\r
+  if (mLandmarks)\r
+    mLandmarks->SetTime(slice);\r
+  for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+    if (slice != mSlicers[i]->GetMaxCurrentTSlice()) {\r
+      mSlicers[i]->SetTSlice(slice, updateLinkedImages);\r
+      UpdateTSlice(i);\r
+    }\r
+  }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetFusionSequenceTSlice(int slice)\r
+{\r
+       for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+               mSlicers[i]->SetFusionSequenceTSlice(slice);\r
+               UpdateTSlice(i);\r
+       }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetNextTSlice(int originating_slicer)\r
+{\r
+  int t = mSlicers[0]->GetMaxCurrentTSlice();\r
+  t++;\r
+  if (t > mSlicers[0]->GetTMax())\r
+    t = 0;\r
+  //std::cout << "vvSlicerManager::SetNextTSlice" << std::endl;\r
+  emit UpdateTSlice(originating_slicer,t, mFusionSequenceInvolvementCode);\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetPreviousTSlice(int originating_slicer)\r
+{\r
+  int t = mSlicers[0]->GetMaxCurrentTSlice();\r
+  t--;\r
+  if (t < 0)\r
+    t = mSlicers[0]->GetTMax();\r
+  //std::cout << "vvSlicerManager::SetPreviousTSlice" << std::endl;\r
+  emit UpdateTSlice(originating_slicer,t, mFusionSequenceInvolvementCode);\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::ToggleInterpolation()\r
+{\r
+  bool interpolate=!(mSlicers[0]->GetImageActor()->GetInterpolate());\r
+  for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+    mSlicers[i]->GetImageActor()->SetInterpolate(interpolate);\r
+    if (mSlicers[i]->GetOverlayActor())\r
+      mSlicers[i]->GetOverlayActor()->SetInterpolate(interpolate);\r
+    if (mSlicers[i]->GetFusionActor())\r
+      mSlicers[i]->GetFusionActor()->SetInterpolate(interpolate);\r
+  }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetTSliceInSlicer(int tslice, int slicer)\r
+{\r
+  if (tslice < 0)\r
+    tslice = 0;\r
+  else if (tslice > mSlicers[slicer]->GetTMax())\r
+    tslice = mSlicers[slicer]->GetTMax();\r
+  if (mLandmarks)\r
+    mLandmarks->SetTime(tslice);\r
+\r
+  if (mSlicers[slicer]->GetMaxCurrentTSlice() == tslice) return;\r
+\r
+  mSlicers[slicer]->SetTSlice(tslice);\r
+\r
+  if(mSlicingPreset==VOXELS_SLICING) {\r
+    vtkMatrix4x4 *imageTransformInverse = vtkMatrix4x4::New();\r
+    mImage->GetTransform()[mSlicers[slicer]->GetTSlice()]->GetInverse(imageTransformInverse);\r
+    this->GetSlicer(slicer)->GetSlicingTransform()->SetMatrix(imageTransformInverse);\r
+    imageTransformInverse->Delete();\r
+  }\r
+\r
+  UpdateTSlice(slicer);\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetColorWindow(double s)\r
+{\r
+  for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+    mSlicers[i]->SetColorWindow(s);\r
+  }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetColorLevel(double s)\r
+{\r
+  for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+    mSlicers[i]->SetColorLevel(s);\r
+  }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetOverlayColorWindow(double s)\r
+{\r
+  for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+    mSlicers[i]->SetOverlayColorWindow(s);\r
+  }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetOverlayColorLevel(double s)\r
+{\r
+  for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+    mSlicers[i]->SetOverlayColorLevel(s);\r
+  }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetLinkOverlayWindowLevel(bool b)\r
+{\r
+  for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+    mSlicers[i]->SetLinkOverlayWindowLevel(b);\r
+  }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetCursorAndCornerAnnotationVisibility(int s)\r
+{\r
+  for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+    mSlicers[i]->SetCursorVisibility(s);\r
+    mSlicers[i]->SetCornerAnnotationVisibility(s);\r
+  }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetOpacity(int i, double factor)\r
+{\r
+  mSlicers[i]->SetOpacity(1/factor);\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::UpdateViews(int current,int slicer)\r
+{\r
+  double p[3], pt[3];\r
+  p[0] = mSlicers[slicer]->GetCurrentPosition()[0];\r
+  p[1] = mSlicers[slicer]->GetCurrentPosition()[1];\r
+  p[2] = mSlicers[slicer]->GetCurrentPosition()[2];\r
+  mSlicers[slicer]->GetSlicingTransform()->GetInverse()->TransformPoint(p, pt);\r
+\r
+  double x = (pt[0] - mSlicers[slicer]->GetInput()->GetOrigin()[0])\r
+    /mSlicers[slicer]->GetInput()->GetSpacing()[0];\r
+  double y = (pt[1] - mSlicers[slicer]->GetInput()->GetOrigin()[1])\r
+    /mSlicers[slicer]->GetInput()->GetSpacing()[1];\r
+  double z = (pt[2] - mSlicers[slicer]->GetInput()->GetOrigin()[2])\r
+    /mSlicers[slicer]->GetInput()->GetSpacing()[2];\r
+\r
+  if (x >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0]-0.5 &&\r
+      x <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1]+0.5 &&\r
+      y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2]-0.5 &&\r
+      y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3]+0.5 &&\r
+      z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4]-0.5 &&\r
+      z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]+0.5) {\r
+    mSlicers[slicer]->UpdateCursorPosition();\r
+    mSlicers[slicer]->SetCursorColor(10,212,255);\r
+    mSelectedSlicer = slicer;\r
+\r
+    switch (mSlicers[slicer]->GetSliceOrientation()) {\r
+    case vtkImageViewer2::SLICE_ORIENTATION_XY:\r
+      if (mSlicers[slicer]->GetSlice() != (int)lrint(z))\r
+        mSlicers[slicer]->SetSlice((int)lrint(z));\r
+      break;\r
+\r
+    case vtkImageViewer2::SLICE_ORIENTATION_XZ:\r
+      if (mSlicers[slicer]->GetSlice() != (int)lrint(y))\r
+        mSlicers[slicer]->SetSlice((int)lrint(y));\r
+      break;\r
+\r
+    case vtkImageViewer2::SLICE_ORIENTATION_YZ:\r
+      if (mSlicers[slicer]->GetSlice() != (int)lrint(x))\r
+        mSlicers[slicer]->SetSlice((int)lrint(x));\r
+      break;\r
+    }\r
+    mSlicers[slicer]->Render();\r
+\r
+    for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+      if (i != (unsigned int)slicer\r
+          && mSlicers[i]->GetRenderer()->GetDraw()\r
+          && mSlicers[i]->GetRenderWindow()->GetSize()[0] > 2\r
+          && mSlicers[i]->GetRenderWindow()->GetSize()[1] > 2) {\r
+        mSlicers[i]->SetCurrentPosition(p[0], p[1], p[2], mSlicers[slicer]->GetMaxCurrentTSlice());\r
+        mSlicers[i]->UpdateCursorPosition();\r
+        if (current) { //do not display corner annotation if image is the one picked\r
+          mSlicers[i]->SetCurrentPosition(-VTK_DOUBLE_MAX,-VTK_DOUBLE_MAX,\r
+                                          -VTK_DOUBLE_MAX, mSlicers[slicer]->GetMaxCurrentTSlice());\r
+          mSlicers[i]->SetCursorColor(255,10,212);\r
+        } else {\r
+          mSlicers[i]->SetCursorColor(150,10,282);\r
+        }\r
+        switch (mSlicers[i]->GetSliceOrientation()) {\r
+        case vtkImageViewer2::SLICE_ORIENTATION_XY:\r
+          if (mSlicers[i]->GetSlice() != (int)lrint(z))\r
+            mSlicers[i]->SetSlice((int)lrint(z));\r
+          break;\r
+\r
+        case vtkImageViewer2::SLICE_ORIENTATION_XZ:\r
+          if (mSlicers[i]->GetSlice() != (int)lrint(y))\r
+            mSlicers[i]->SetSlice((int)lrint(y));\r
+          break;\r
+\r
+        case vtkImageViewer2::SLICE_ORIENTATION_YZ:\r
+          if (mSlicers[i]->GetSlice() != (int)lrint(x))\r
+            mSlicers[i]->SetSlice((int)lrint(x));\r
+          break;\r
+        }\r
+        \r
+        mSlicers[i]->Render();\r
+        \r
+        UpdateSlice(i);\r
+        UpdateTSlice(i);\r
+      }\r
+    }\r
+  }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::UpdateLinked(int slicer)\r
+{\r
+  double p[3], pt[3];\r
+  p[0] = mSlicers[slicer]->GetCurrentPosition()[0];\r
+  p[1] = mSlicers[slicer]->GetCurrentPosition()[1];\r
+  p[2] = mSlicers[slicer]->GetCurrentPosition()[2];\r
+  mSlicers[slicer]->GetSlicingTransform()->GetInverse()->TransformPoint(p, pt);\r
+  double x = (pt[0] - mSlicers[slicer]->GetInput()->GetOrigin()[0]) / mSlicers[slicer]->GetInput()->GetSpacing()[0];\r
+  double y = (pt[1] - mSlicers[slicer]->GetInput()->GetOrigin()[1]) / mSlicers[slicer]->GetInput()->GetSpacing()[1];\r
+  double z = (pt[2] - mSlicers[slicer]->GetInput()->GetOrigin()[2]) / mSlicers[slicer]->GetInput()->GetSpacing()[2];\r
+\r
+  if (x >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0]-0.5 &&\r
+      x <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1]+0.5 &&\r
+      y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2]-0.5 &&\r
+      y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3]+0.5 &&\r
+      z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4]-0.5 &&\r
+      z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]+0.5) {\r
+    for (std::list<std::string>::const_iterator i = mLinkedId.begin(); i != mLinkedId.end(); i++) {\r
+               if (this->IsInvolvedInFusionSequence()) {\r
+                       //this SlicerManager is involved in fusionSequence => do not synchronize the times\r
+                       emit UpdateLinkManager(*i, slicer, p[0], p[1], p[2], -1);\r
+               }\r
+               else {\r
+                       emit UpdateLinkManager(*i, slicer, p[0], p[1], p[2], mSlicers[slicer]->GetMaxCurrentTSlice());\r
+               }\r
+    }\r
+  }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::UpdateLinkedNavigation(vvSlicer *refSlicer, bool bPropagate)\r
+{\r
+  vtkCamera *refCam = refSlicer->GetRenderer()->GetActiveCamera();\r
+\r
+  double refPosition[3];\r
+  refCam->GetPosition(refPosition);\r
+  refPosition[refSlicer->GetSliceOrientation()] = refSlicer->GetSlice() *\r
+      refSlicer->GetInput()->GetSpacing()[refSlicer->GetSliceOrientation()] +\r
+      refSlicer->GetInput()->GetOrigin()[refSlicer->GetSliceOrientation()];\r
+\r
+  refSlicer->GetSlicingTransform()->TransformPoint(refPosition, refPosition);\r
+  mSlicers[0]->GetSlicingTransform()->GetInverse()->TransformPoint(refPosition, refPosition);\r
+\r
+  for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+    vtkCamera *camera = mSlicers[i]->GetRenderer()->GetActiveCamera();\r
+    camera->SetParallelScale(refCam->GetParallelScale());\r
+\r
+    double position[3], focal[3];\r
+    camera->GetPosition(position);\r
+    camera->GetFocalPoint(focal);\r
+\r
+    for(int j=0; j<3; j++) {\r
+      if(j!=mSlicers[i]->GetSliceOrientation()) {\r
+        position[j] = refPosition[j];\r
+        focal[j]    = refPosition[j];\r
+      }\r
+    }\r
+\r
+    camera->SetFocalPoint(focal);\r
+    camera->SetPosition(position);\r
+\r
+    //Fix for bug #243\r
+    mSlicers[i]->ForceUpdateDisplayExtent();\r
+  }\r
+  \r
+  Render();\r
+  if(bPropagate)\r
+    for (std::list<std::string>::const_iterator i = mLinkedId.begin(); i != mLinkedId.end(); i++)\r
+      emit UpdateLinkedNavigation(*i, this, refSlicer);\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+double vvSlicerManager::GetColorWindow() const\r
+{\r
+  if (mSlicers.size())\r
+    return mSlicers[0]->GetColorWindow();\r
+  return -1;\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+double vvSlicerManager::GetColorLevel() const\r
+{\r
+  if (mSlicers.size())\r
+    return mSlicers[0]->GetColorLevel();\r
+  return -1;\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+double vvSlicerManager::GetOverlayColorWindow() const\r
+{\r
+  if (mSlicers.size())\r
+    return mSlicers[0]->GetOverlayColorWindow();\r
+  return -1;\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+double vvSlicerManager::GetOverlayColorLevel() const\r
+{\r
+  if (mSlicers.size())\r
+    return mSlicers[0]->GetOverlayColorLevel();\r
+  return -1;\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+bool vvSlicerManager::GetLinkOverlayWindowLevel() const\r
+{\r
+  if (mSlicers.size())\r
+    return mSlicers[0]->GetLinkOverlayWindowLevel();\r
+  return -1;\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//------------------------------------------------------------------------------\r
+void vvSlicerManager::ResetTransformationToIdentity(const std::string actorType)\r
+{\r
+  if(actorType == "image")\r
+    for(unsigned int i=0; i<this->GetImage()->GetTransform().size(); i++)\r
+      this->GetImage()->GetTransform()[i]->Identity();\r
+  else if(actorType == "overlay")\r
+    for(unsigned int i=0; i<this->GetImage()->GetTransform().size(); i++)\r
+      this->GetSlicer(0)->GetOverlay()->GetTransform()[i]->Identity();\r
+  else if(actorType == "fusion")\r
+    for(unsigned int i=0; i<this->GetImage()->GetTransform().size(); i++)\r
+      this->GetSlicer(0)->GetFusion()->GetTransform()[i]->Identity();\r
+  else if(actorType == "fusionSequence") //TODO: Check what should really be done here\r
+    for(unsigned int i=0; i<this->GetImage()->GetTransform().size(); i++)\r
+      this->GetSlicer(0)->GetFusion()->GetTransform()[i]->Identity();\r
+  else if(actorType == "vf")\r
+    for(unsigned int i=0; i<this->GetImage()->GetTransform().size(); i++)\r
+      this->GetVF()->GetTransform()[i]->Identity();\r
+  else\r
+    return;\r
+\r
+  for(int i=0; i< this->GetNumberOfSlicers(); i++){\r
+    this->GetSlicer(i)->ForceUpdateDisplayExtent();\r
+    this->GetSlicer(i)->ResetCamera();\r
+    this->GetSlicer(i)->Render();\r
+  }\r
+}\r
+//------------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::Render()\r
+{\r
+  for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+    mSlicers[i]->Render();\r
+  }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::GenerateDefaultLookupTable()\r
+{\r
+  SetPreset(mPreset);\r
+  SetColorMap(mColorMap);\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::Reload()\r
+{\r
+  mReader->Update(mType);\r
+  mImage=mReader->GetOutput();\r
+  for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+    mSlicers[i]->SetImage(mImage);\r
+  }\r
+  \r
+  //if this image is the primary sequence of a fusion sequence, then the main transform matrix should be updated.\r
+  if (this->IsMainSequenceOfFusionSequence()) {\r
+         SetFusionSequenceMainTransformMatrix( mImage->GetTransform()[0]->GetMatrix() );\r
+  }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::ReloadFusion()\r
+{\r
+  mFusionReader->Update(mImage->GetNumberOfDimensions(),mFusionComponent.c_str(),mType);\r
+\r
+  for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+    mSlicers[i]->SetFusion(mFusionReader->GetOutput());\r
+    mSlicers[i]->Render();\r
+  }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+//the secondary sequence is being reloaded.\r
+void vvSlicerManager::ReloadFusionSequence()\r
+{\r
+  mFusionSequenceReader->Update(mImage->GetNumberOfDimensions(),mFusionComponent.c_str(),vvImageReader::MERGEDWITHTIME);\r
+\r
+  for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+    mSlicers[i]->SetFusion(mFusionSequenceReader->GetOutput(), 1);\r
+    mSlicers[i]->Render();\r
+  }\r
+\r
+  //Update the slider\r
+  mFusionSequenceNbFrames = mFusionSequenceReader->GetOutput()->GetTransform().size();\r
+  if (mFusionSequenceFrameIndex>=mFusionSequenceNbFrames) {\r
+         mFusionSequenceFrameIndex=0;\r
+  }\r
+\r
+  //Update the list of initial transforms\r
+  mFusionSequenceListInitialTransformMatrices.clear();\r
+  for (unsigned i=0 ; i<mFusionSequenceNbFrames ; i++) {\r
+         this->AddFusionSequenceInitialTransformMatrices( mFusionSequenceReader->GetOutput()->GetTransform()[i]->GetMatrix() );\r
+  }\r
+\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::ReloadOverlay()\r
+{\r
+  mOverlayReader->Update(mImage->GetNumberOfDimensions(),mOverlayComponent.c_str(),mType);\r
+  for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+    mSlicers[i]->SetOverlay(mOverlayReader->GetOutput());\r
+    mSlicers[i]->Render();\r
+  }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::ReloadVF()\r
+{\r
+  mVectorReader->Update(vvImageReader::VECTORFIELD); //deletes the old images through the VF::Init() function\r
+  mVF=mVectorReader->GetOutput();\r
+  for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+    mSlicers[i]->SetVF(mVF);\r
+    mSlicers[i]->Render();\r
+  }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::RemoveActor(const std::string& actor_type, int overlay_index)\r
+{\r
+  if (actor_type =="overlay")\r
+    mOverlayReader = NULL;\r
+\r
+  if (actor_type =="fusion")\r
+    mFusionReader = NULL;\r
+\r
+  if (actor_type =="fusionSequence") {\r
+    mFusionSequenceReader = NULL;\r
+  }\r
+\r
+  for (unsigned int i = 0; i < mSlicers.size(); i++)\r
+    mSlicers[i]->RemoveActor(actor_type,overlay_index);\r
+\r
+  if (actor_type=="vector") {\r
+    mVF=NULL;\r
+    mVectorReader=NULL;\r
+  }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::RemoveActors()\r
+{\r
+  ///This method leaks a few objects. See RemoveActor for what a\r
+  ///correct implementation would look like\r
+  //DS -> probably due to the reader (now released in the\r
+  //RemoveActor() function. (I hope)\r
+  for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+    mSlicers[i]->SetDisplayMode(0);\r
+    mSlicers[i]->GetRenderer()->RemoveActor(mSlicers[i]->GetImageActor());\r
+  }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::UpdateInfoOnCursorPosition(int slicer)\r
+{\r
+  //  int view = mSlicers[slicer]->GetSliceOrientation();\r
+  //  int slice = mSlicers[slicer]->GetSlice();\r
+  double x = mSlicers[slicer]->GetCursorPosition()[0];\r
+  double y = mSlicers[slicer]->GetCursorPosition()[1];\r
+  double z = mSlicers[slicer]->GetCursorPosition()[2];\r
+  double X = (x - mSlicers[slicer]->GetInput()->GetOrigin()[0])/\r
+    mSlicers[slicer]->GetInput()->GetSpacing()[0];\r
+  double Y = (y - mSlicers[slicer]->GetInput()->GetOrigin()[1])/\r
+    mSlicers[slicer]->GetInput()->GetSpacing()[1];\r
+  double Z = (z - mSlicers[slicer]->GetInput()->GetOrigin()[2])/\r
+    mSlicers[slicer]->GetInput()->GetSpacing()[2];\r
+  double value = -VTK_DOUBLE_MAX;\r
+  int displayVec = 0;\r
+  double xVec=0, yVec=0, zVec=0, valueVec=0;\r
+  int displayOver = 0;\r
+  int displayFus = 0;\r
+  double valueOver=0, valueFus=0;\r
+  if (X >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0] &&\r
+      X <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1] &&\r
+      Y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2] &&\r
+      Y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3] &&\r
+      Z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4] &&\r
+      Z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]) {\r
+\r
+    value = this->GetScalarComponentAsDouble(mSlicers[slicer]->GetInput(), X, Y, Z);\r
+\r
+    if (mSlicers[slicer]->GetVFActor() ) {\r
+      displayVec = 1;\r
+      unsigned int currentTime = mSlicers[slicer]->GetMaxCurrentTSlice();\r
+      vtkImageData *vf = NULL;\r
+\r
+      if (mSlicers[slicer]->GetVF()->GetVTKImages().size() > currentTime)\r
+        vf = mSlicers[slicer]->GetVF()->GetVTKImages()[currentTime];\r
+      else\r
+        vf = mSlicers[slicer]->GetVF()->GetVTKImages()[0];\r
+\r
+      if (vf) {\r
+        double Xvf = (x - vf->GetOrigin()[0])/ vf->GetSpacing()[0];\r
+        double Yvf = (y - vf->GetOrigin()[1])/ vf->GetSpacing()[1];\r
+        double Zvf = (z - vf->GetOrigin()[2])/ vf->GetSpacing()[2];\r
+        xVec = this->GetScalarComponentAsDouble( vf, Xvf, Yvf, Zvf, 0);\r
+        yVec = this->GetScalarComponentAsDouble( vf, Xvf, Yvf, Zvf, 1);\r
+        zVec = this->GetScalarComponentAsDouble( vf, Xvf, Yvf, Zvf, 2);\r
+        valueVec = sqrt(xVec*xVec + yVec*yVec + zVec*zVec);\r
+      }\r
+    }\r
+    if (mSlicers[slicer]->GetOverlayActor() ) {\r
+      displayOver = 1;\r
+      vtkImageData *overlay = dynamic_cast<vtkImageData*>(mSlicers[slicer]->GetOverlayMapper()->GetInput());\r
+      double Xover = (x - overlay->GetOrigin()[0]) / overlay->GetSpacing()[0];\r
+      double Yover = (y - overlay->GetOrigin()[1]) / overlay->GetSpacing()[1];\r
+      double Zover = (z - overlay->GetOrigin()[2]) / overlay->GetSpacing()[2];\r
+      valueOver = this->GetScalarComponentAsDouble(overlay, Xover, Yover, Zover);\r
+    }\r
+\r
+       if ( mSlicers[slicer]->GetFusionActor() ) {\r
+               displayFus = 1;\r
+               vtkImageData *fusion = dynamic_cast<vtkImageData*>(mSlicers[slicer]->GetFusionMapper()->GetInput());\r
+               double Xover = (x - fusion->GetOrigin()[0]) / fusion->GetSpacing()[0];\r
+               double Yover = (y - fusion->GetOrigin()[1]) / fusion->GetSpacing()[1];\r
+               double Zover = (z - fusion->GetOrigin()[2]) / fusion->GetSpacing()[2];\r
+               valueFus = this->GetScalarComponentAsDouble(fusion, Xover, Yover, Zover);\r
+       }\r
+       else if (this->IsInvolvedInFusionSequence()) { \r
+    //if the cursor moves over the 'independent' version of the secondary sequence\r
+    //do not update the panel, just keep it as it is.\r
+               displayFus = 1;\r
+               valueFus = std::numeric_limits<double>::quiet_NaN();\r
+       }\r
+\r
+    emit UpdatePosition(mSlicers[slicer]->GetCursorVisibility(),\r
+                        x,y,z,X,Y,Z,value);\r
+    emit UpdateVector(displayVec,xVec, yVec, zVec, valueVec);\r
+    emit UpdateOverlay(displayOver,valueOver,value);\r
+    emit UpdateFusion(displayFus,valueFus);\r
+  }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::Activated()\r
+{\r
+  emit currentImageChanged(mId);\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::Picked()\r
+{\r
+  emit currentPickedImageChanged(mId);\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::UpdateWindowLevel()\r
+{\r
+  emit WindowLevelChanged();\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::UpdateSlice(int slicer)\r
+{\r
+  if (mPreviousSlice[slicer] == mSlicers[slicer]->GetSlice()) {\r
+    //DD("============= NOTHING");\r
+    return;\r
+  }\r
+  //std::cout << "vvSlicerManager::UpdateSlice " << slicer << " " << mSlicers[slicer]->GetSlice() << std::endl;\r
+  emit UpdateSlice(slicer, mSlicers[slicer]->GetSlice());\r
+  mSlicers[slicer]->Render(); // DS <-- I add this, this could/must be the only Render ...\r
+  mPreviousSlice[slicer] = mSlicers[slicer]->GetSlice();\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::UpdateTSlice(int slicer)\r
+{\r
+  int slice = mSlicers[slicer]->GetSlice();\r
+\r
+  int tslice = mSlicers[slicer]->GetMaxCurrentTSlice();\r
+  //if (this->IsInvolvedInFusionSequence()) tslice = mSlicers[slicer]->GetTSlice(); //actually, this is handled by the Slicer\r
+\r
+  if (mPreviousSlice[slicer] == slice) {\r
+    if (mPreviousTSlice[slicer] == tslice) {\r
+      //      DD("************** NOTHING ***********");\r
+      return;\r
+    }\r
+  }\r
+  mPreviousSlice[slicer] = slice;\r
+  mPreviousTSlice[slicer] = tslice;\r
+\r
+  emit UpdateTSlice(slicer, tslice, mFusionSequenceInvolvementCode);\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::UpdateSliceRange(int slicer)\r
+{\r
+  emit UpdateSliceRange(slicer,\r
+                        mSlicers[slicer]->GetSliceRange()[0], mSlicers[slicer]->GetSliceRange()[1],\r
+                        0,mSlicers[slicer]->GetTMax());\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetSlicingPreset(SlicingPresetType preset)\r
+{\r
+  if(mSlicingPreset==preset)\r
+    return;\r
+\r
+  vtkMatrix4x4 *imageTransformInverse = vtkMatrix4x4::New();\r
+  mImage->GetTransform()[this->GetTSlice()]->GetInverse(imageTransformInverse);\r
+\r
+  for(int i=0; i< this->GetNumberOfSlicers(); i++){\r
+    vvSlicer *s = this->GetSlicer(i);\r
+    switch(preset)\r
+    {\r
+    case WORLD_SLICING:\r
+      s->GetSlicingTransform()->Identity();\r
+      break;\r
+    case VOXELS_SLICING:\r
+      s->GetSlicingTransform()->SetMatrix(imageTransformInverse);\r
+      break;\r
+    default:\r
+      imageTransformInverse->Delete();\r
+      return;\r
+    }\r
+    s->ForceUpdateDisplayExtent();\r
+    s->SetSlice((s->GetInput()->GetWholeExtent()[s->GetSliceOrientation()*2+1]\r
+                +s->GetInput()->GetWholeExtent()[s->GetSliceOrientation()*2])/2.0);\r
+    s->ResetCamera();\r
+    s->Render();\r
+  }\r
+\r
+  imageTransformInverse->Delete();\r
+  mSlicingPreset = preset;\r
+}\r
+\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetPreset(int preset)\r
+{\r
+  //vtkLookupTable* LUT = static_cast<vtkLookupTable*>(mSlicers[0]->GetWindowLevel()->GetLookupTable());\r
+  double window = mSlicers[0]->GetColorWindow();\r
+  double level = mSlicers[0]->GetColorLevel();\r
+\r
+  std::string component_type=mImage->GetScalarTypeAsITKString();\r
+  switch (preset) {\r
+  case 0:\r
+    double range[2];\r
+    mImage->GetScalarRange(range);\r
+    window = range[1] - range[0];\r
+    level = (range[1] + range[0])* 0.5;\r
+    break;\r
+  case 1:\r
+    window = 2000;\r
+    level = 0;\r
+    break;\r
+  case 2:\r
+    window = 400;\r
+    level = 20;\r
+    break;\r
+  case 3: // lungs (same as FOCAL)\r
+    window = 1700;\r
+    level = -300;\r
+    break;\r
+  case 4:\r
+    window = 1000;\r
+    level = 500;\r
+    break;\r
+  case 5:\r
+    window = 1;\r
+    level = 0.5;\r
+    break;\r
+  case 6:\r
+    break;\r
+  case 7:\r
+    window=1.;\r
+    level=0.;\r
+    break;\r
+  }\r
+  mPreset = preset;\r
+  this->SetColorWindow(window);\r
+  this->SetColorLevel(level);\r
+\r
+  //if (LUT)\r
+  //{\r
+  //    SetColorMap(-1);\r
+  //}\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetLocalColorWindowing(const int slicer, const bool bCtrlKey)\r
+{\r
+  double min, max;\r
+  if(bCtrlKey && this->mSlicers[slicer]->GetFusion()) {\r
+    int t = mSlicers[slicer]->GetFusionTSlice();\r
+    this->mSlicers[slicer]->GetExtremasAroundMousePointer(min, max,\r
+                                                          this->mSlicers[slicer]->GetFusion()->GetVTKImages()[t],\r
+                                                          this->mSlicers[slicer]->GetConcatenatedFusionTransform());\r
+    this->SetFusionWindow(max-min);\r
+    this->SetFusionLevel(0.5*(min+max));\r
+    this->SetColorMap(mColorMap);\r
+  }\r
+  else if(bCtrlKey && this->mSlicers[slicer]->GetOverlay()) {\r
+    int t = mSlicers[slicer]->GetOverlayTSlice();\r
+    this->mSlicers[slicer]->GetExtremasAroundMousePointer(min, max,\r
+                                                          this->mSlicers[slicer]->GetOverlay()->GetVTKImages()[t],\r
+                                                          this->mSlicers[slicer]->GetConcatenatedOverlayTransform());\r
+    if(this->mSlicers[slicer]->GetLinkOverlayWindowLevel()){\r
+      this->SetColorWindow(max-min);\r
+      this->SetColorLevel(0.5*(min+max));\r
+    } else {\r
+      this->SetOverlayColorWindow(max-min);\r
+      this->SetOverlayColorLevel(0.5*(min+max));\r
+    }\r
+  }\r
+  else {\r
+    int t = this->GetTSlice();\r
+    this->mSlicers[slicer]->GetExtremasAroundMousePointer(min, max,\r
+                                                          this->mSlicers[slicer]->GetImage()->GetVTKImages()[t],\r
+                                                          this->mSlicers[slicer]->GetConcatenatedTransform());\r
+    this->SetColorWindow(max-min);\r
+    this->SetColorLevel(0.5*(min+max));\r
+    this->SetPreset(6);\r
+  }\r
+  this->Render();\r
+  this->UpdateWindowLevel();\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetColorMap(int colormap)\r
+{\r
+  double range[2];\r
+\r
+  range[0] = mSlicers[0]->GetInput()->GetScalarRange()[0];\r
+  range[1] = mSlicers[0]->GetInput()->GetScalarRange()[1];\r
+\r
+  double window = mSlicers[0]->GetWindowLevel()->GetWindow();\r
+  double level = mSlicers[0]->GetWindowLevel()->GetLevel();\r
+\r
+  vtkLookupTable* LUT = static_cast<vtkLookupTable*>(mSlicers[0]->GetWindowLevel()->GetLookupTable());\r
+  switch (colormap) {\r
+  case -1:\r
+    break;\r
+  case 0:\r
+    LUT = NULL;\r
+    break;\r
+  case 1:\r
+    if (LUT == NULL)\r
+      LUT = vtkLookupTable::New();\r
+    LUT->SetValueRange(0,1);\r
+    LUT->SetSaturationRange(1,1);\r
+    LUT->SetHueRange(0,0.18);\r
+    break;\r
+  case 2:\r
+    if (LUT == NULL)\r
+      LUT = vtkLookupTable::New();\r
+    LUT->SetValueRange(0,1);\r
+    LUT->SetSaturationRange(1,1);\r
+    LUT->SetHueRange(0.4,0.80);\r
+    break;\r
+  case 3:\r
+    if (LUT == NULL)\r
+      LUT = vtkLookupTable::New();\r
+    LUT->SetValueRange(0.5,1);\r
+    LUT->SetSaturationRange(1,1);\r
+    LUT->SetHueRange(0.666,0);\r
+    break;\r
+  case 4:\r
+    if (LUT == NULL)\r
+      LUT = vtkLookupTable::New();\r
+    LUT->SetValueRange(1,1);\r
+    LUT->SetSaturationRange(1,1);\r
+    LUT->SetHueRange(0,1);\r
+    LUT->SetAlphaRange(1, 1);\r
+    break;\r
+  case 5:\r
+    if (LUT == NULL)\r
+      LUT = vtkLookupTable::New();\r
+    LUT->SetValueRange(1,1);\r
+    LUT->SetSaturationRange(1,1);\r
+    LUT->SetHueRange(1,0.1);\r
+    //LUT->SetRampToLinear();\r
+    break;\r
+  }\r
+  if (LUT) {\r
+    LUT->SetTableRange(level-fabs(window)/2,level+fabs(window)/2);\r
+    LUT->Build();\r
+  }\r
+  vtkWindowLevelLookupTable* fusLUT = NULL;\r
+\r
+  //FUSION / FUSION SEQUENCE\r
+  if (mSlicers[0]->GetFusion()) { // && mFusionColorMap >= 0) {\r
+    fusLUT = vtkWindowLevelLookupTable::New();\r
+    double fusRange [2];\r
+    fusRange[0] = mFusionLevel - mFusionWindow/2;\r
+    fusRange[1] = mFusionLevel + mFusionWindow/2;\r
+\r
+    //check whether it is actually a fusionSequence or a fusion, before invoking mFusionReader...\r
+    double* frange;\r
+    if (this->IsInvolvedInFusionSequence()) \r
+      frange = mFusionSequenceReader->GetOutput()->GetVTKImages()[0]->GetScalarRange();\r
+    else\r
+      frange = mFusionReader->GetOutput()->GetVTKImages()[0]->GetScalarRange();\r
+\r
+    fusLUT->SetTableRange(frange);\r
+    fusLUT->SetValueRange(1,1);\r
+    fusLUT->SetSaturationRange(1,1);\r
+    fusLUT->SetAlphaRange(1, 1);\r
+    fusLUT->SetWindow(mFusionWindow);\r
+    fusLUT->SetLevel(mFusionLevel);\r
+    if (mFusionColorMap == 1)\r
+      fusLUT->SetHueRange(0,0.18);\r
+    else if (mFusionColorMap == 2)\r
+      fusLUT->SetHueRange(0.4,0.80);\r
+    else if (mFusionColorMap == 3)\r
+    {\r
+      fusLUT->SetHueRange(0.666, 0);\r
+      fusLUT->SetValueRange(0.5, 1);\r
+    }\r
+    else if (mFusionColorMap == 4)\r
+      fusLUT->SetHueRange(0,1);\r
+    else if (mFusionColorMap <= 0)\r
+    {\r
+      fusLUT->SetValueRange(0,1);\r
+      fusLUT->SetSaturationRange(0,0);\r
+    }\r
+\r
+    fusLUT->ForceBuild();\r
+    double v[4];\r
+\r
+    // set color table transparency\r
+    //double alpha_range=(double)mFusionThresOpacity/10;\r
+    double range_end = fusRange[0] + (double)mFusionThresOpacity*(fusRange[1] - fusRange[0])/100;\r
+    double curr_value = fusRange[0];\r
+    int nvalues = fusLUT->GetNumberOfTableValues();\r
+    for (double i = 0; curr_value < range_end; i++) {  \r
+      fusLUT->GetTableValue(i, v);\r
+      v[3] = 0;\r
+      //if (curr_value >= -alpha_range && curr_value <= alpha_range) v[3] = pow(fabs(curr_value/alpha_range),2);\r
+      //else v[3] = 1;\r
+      fusLUT->SetTableValue(i, v);\r
+      curr_value += (fusRange[1] - fusRange[0])/nvalues;\r
+    }\r
+  }\r
+  for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+\r
+    if (mSlicers[i]->GetOverlay()) {\r
+      vtkLookupTable* supLUT = vtkLookupTable::New();\r
+      supLUT->SetTableRange(range[0],range[1]);\r
+      supLUT->SetValueRange(1,1);\r
+      supLUT->SetSaturationRange(1,1);\r
+      supLUT->SetHueRange(double(mOverlayColor)/360,double(mOverlayColor)/360);\r
+      supLUT->Build();\r
+      vtkLookupTable* invLUT = vtkLookupTable::New();\r
+      invLUT->SetTableRange(range[0],range[1]);\r
+      invLUT->SetValueRange(1,1);\r
+      invLUT->SetSaturationRange(1,1);\r
+      invLUT->SetHueRange(double((mOverlayColor+180)%360)/360,double((mOverlayColor+180)%360)/360);\r
+      invLUT->Build();\r
+      mSlicers[i]->GetWindowLevel()->SetLookupTable(supLUT);\r
+      mSlicers[i]->GetOverlayMapper()->SetLookupTable(invLUT);\r
+      invLUT->Delete();\r
+      supLUT->Delete();\r
+    } else if (mSlicers[i]->GetOverlay()) {\r
+      mSlicers[i]->GetWindowLevel()->SetLookupTable(LUT);\r
+    } else {\r
+      mSlicers[i]->GetWindowLevel()->SetLookupTable(LUT);\r
+    }\r
+\r
+    if (mSlicers[i]->GetFusion()) {\r
+      mSlicers[i]->ShowFusionLegend(mFusionShowLegend);\r
+      mSlicers[i]->GetFusionMapper()->SetLookupTable(fusLUT);\r
+      mSlicers[i]->GetFusionActor()->SetOpacity(double(mFusionOpacity)/100);\r
+    }\r
+  }\r
+  if (fusLUT)\r
+    fusLUT->Delete();\r
+  if (colormap >= 0)\r
+    mColorMap = colormap;\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+vvLandmarks* vvSlicerManager::GetLandmarks()\r
+{\r
+  if (mLandmarks == NULL) {\r
+    mLandmarks = new vvLandmarks(mSlicers[0]->GetTMax()+1);\r
+    for (unsigned int i = 0; i < mSlicers.size(); i++)\r
+      mSlicers[i]->SetLandmarks(mLandmarks);\r
+  }\r
+  return mLandmarks;\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::AddLandmark(float x,float y,float z,float t)\r
+{\r
+  double x_index = (x - mSlicers[0]->GetInput()->GetOrigin()[0])/mSlicers[0]->GetInput()->GetSpacing()[0];\r
+  double y_index = (y - mSlicers[0]->GetInput()->GetOrigin()[1])/mSlicers[0]->GetInput()->GetSpacing()[1];\r
+  double z_index = (z - mSlicers[0]->GetInput()->GetOrigin()[2])/mSlicers[0]->GetInput()->GetSpacing()[2];\r
+  if (x_index >= mSlicers[0]->GetInput()->GetWholeExtent()[0]-0.5 &&\r
+      x_index <= mSlicers[0]->GetInput()->GetWholeExtent()[1]+0.5 &&\r
+      y_index >= mSlicers[0]->GetInput()->GetWholeExtent()[2]-0.5 &&\r
+      y_index <= mSlicers[0]->GetInput()->GetWholeExtent()[3]+0.5 &&\r
+      z_index >= mSlicers[0]->GetInput()->GetWholeExtent()[4]-0.5 &&\r
+      z_index <= mSlicers[0]->GetInput()->GetWholeExtent()[5]+0.5) {\r
+    double value = this->GetScalarComponentAsDouble(mSlicers[0]->GetInput(), x_index, y_index, z_index);\r
+    this->GetLandmarks()->AddLandmark(x,y,z,t,value);\r
+    emit LandmarkAdded();\r
+  }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::PrevImage(int slicer)\r
+{\r
+  emit ChangeImageWithIndexOffset(this, slicer, -1);\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::NextImage(int slicer)\r
+{\r
+  emit ChangeImageWithIndexOffset(this, slicer,  1);\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::VerticalSliderHasChanged(int slicer, int slice)\r
+{\r
+  emit AVerticalSliderHasChanged(slicer, slice);\r
+}\r
+\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+double vvSlicerManager::GetScalarComponentAsDouble(vtkImageData *image, double X, double Y, double Z, int component)\r
+{\r
+  int ix, iy, iz;\r
+  return mSlicers[0]->GetScalarComponentAsDouble(image, X, Y, Z, ix, iy, iz, component);\r
+}\r
+//----------------------------------------------------------------------------\r
index 4fc274c5e4723ce460984cc7850de60ea60dbc58..d634fbddafd779ecf7ae817178e5536fad5ed1fb 100644 (file)
@@ -66,6 +66,7 @@ class vvSlicerManager : public QObject {
 
   bool SetOverlay(std::vector<std::string> filenames, int dim, std::string component, vvImageReader::LoadedImageType type);
   bool SetFusion(std::string filename, int dim, std::string component);
+  bool SetFusionSequence(std::vector<std::string> filenames, int dim, std::string component, vvImageReader::LoadedImageType type);
   ///Set a VF by loading it from the disk
   bool SetVF(std::string filename);
   ///Set a VF from memory
@@ -109,11 +110,13 @@ class vvSlicerManager : public QObject {
 
   void SetSliceOrientation(int slicer, int orientation);
   int GetTSlice();
-  void SetTSlice(int slice);
+  void SetTSlice(int slice, bool updateLinkedImages = true);
   void SetNextTSlice(int originating_slicer);
   void SetPreviousTSlice(int originating_slicer);
   void SetTSliceInSlicer(int tslice, int slicer);
 
+  void SetFusionSequenceTSlice(int slice);
+
   void GenerateDefaultLookupTable();
   void SetColorWindow(double s);
   void SetColorLevel(double s);
@@ -146,6 +149,42 @@ class vvSlicerManager : public QObject {
     mFusionShowLegend = show;
   }
 
+
+  //set/get fusionSequence related data
+  void SetFusionSequenceFrameIndex(int sequenceFrameIndex) { mFusionSequenceFrameIndex = sequenceFrameIndex; }
+  void SetFusionSequenceSpatialSyncFlag(bool spatialSync) { mFusionSequenceSpatialSyncFlag = spatialSync; }
+  void SetFusionSequenceTemporalSyncFlag(bool temporalSync) { mFusionSequenceTemporalSyncFlag = temporalSync; }
+  void SetFusionSequenceLength(unsigned int fusionSequenceNbFrames) { mFusionSequenceNbFrames = fusionSequenceNbFrames; }
+  void SetFusionSequenceMainTransformMatrix(vtkSmartPointer<vtkMatrix4x4> mat) { 
+         mFusionSequenceMainTransform = vtkSmartPointer<vtkMatrix4x4>::New();
+         mFusionSequenceMainTransform->DeepCopy(mat);
+  }
+  void AddFusionSequenceInitialTransformMatrices(vtkSmartPointer<vtkMatrix4x4> mat) { 
+               vtkSmartPointer<vtkMatrix4x4> tmpMat = vtkSmartPointer<vtkMatrix4x4>::New();
+               tmpMat->DeepCopy(mat);
+               mFusionSequenceListInitialTransformMatrices.push_back( tmpMat );
+  }
+  void SetFusionSequenceIndexOfLinkedManager(int index) { mFusionSequenceIndexLinkedManager = index; }
+  void SetFusionSequenceTemporalSignal(std::vector<double> s) { mFusionSequenceTemporalSignal = s; }
+  
+  void SetFusionSequenceInvolvmentCode(int code) { mFusionSequenceInvolvementCode=code; }
+  int GetFusionSequenceInvolvmentCode() { return mFusionSequenceInvolvementCode;}
+  bool IsInvolvedInFusionSequence() {return (!(mFusionSequenceInvolvementCode==-1));}
+  bool IsMainSequenceOfFusionSequence() {return (mFusionSequenceInvolvementCode==0);}
+  bool IsSecondarySequenceOfFusionSequence() {return (mFusionSequenceInvolvementCode==1);}
+
+  int GetFusionSequenceIndexOfLinkedManager() { return mFusionSequenceIndexLinkedManager; }
+  int GetFusionSequenceFrameIndex() { return mFusionSequenceFrameIndex; }
+  bool GetFusionSequenceSpatialSyncFlag() { return mFusionSequenceSpatialSyncFlag; }
+  bool GetFusionSequenceTemporalSyncFlag() { return mFusionSequenceTemporalSyncFlag; }
+  unsigned int GetFusionSequenceNbFrames() { return mFusionSequenceNbFrames; }
+  const vtkSmartPointer<vtkMatrix4x4>& GetFusionSequenceMainTransformMatrix() {return mFusionSequenceMainTransform;}
+  const std::vector< vtkSmartPointer<vtkMatrix4x4> >& GetFusionSequenceInitialTransformMatrices() {return mFusionSequenceListInitialTransformMatrices;}
+  const vtkSmartPointer<vtkMatrix4x4>& GetFusionSequenceInitialTransformMatrixAtFrame(unsigned i) {
+         return mFusionSequenceListInitialTransformMatrices[i];
+  }
+  const std::vector<double>& GetFusionSequenceTemporalSignal() {return mFusionSequenceTemporalSignal;}
+
   double GetColorWindow() const;
   double GetColorLevel() const;
   double GetOverlayColorWindow() const;
@@ -179,6 +218,7 @@ class vvSlicerManager : public QObject {
     return mFusionLevel;
   }
 
+
   void SetCursorAndCornerAnnotationVisibility(int s);
   void UpdateViews(int current, int slicer);
   void UpdateLinked(int slicer);
@@ -207,6 +247,7 @@ class vvSlicerManager : public QObject {
   void Reload();
   void ReloadOverlay();
   void ReloadFusion();
+  void ReloadFusionSequence();
   void ReloadVF();
 
   void Activated();
@@ -236,11 +277,12 @@ signals :
   void UpdateVector(int display, double x, double y, double z, double value);
   void UpdateOverlay(int display, double valueOver, double valueRef);
   void UpdateFusion(int display, double valueFus);
+  void UpdateFusionSequence(int fusionSequenceFrameIndex, bool fusionSequenceSpatialSyncFlag, unsigned int fusionSequenceNbFrames);
   void MousePositionUpdatedSignal(int slicer);
   void KeyPressedSignal(std::string KeyPressed);
   void UpdateOrientation(int slicer, int orientation);
   void UpdateSlice(int slicer, int slice);
-  void UpdateTSlice(int slicer, int slice);
+  void UpdateTSlice(int slicer, int slice, int code);
   void UpdateSliceRange(int slice, int min, int max, int tmin, int tmax);
   void WindowLevelChanged();
   void UpdateLinkManager(std::string, int slicer, double x, double y, double z, int temps);
@@ -256,6 +298,7 @@ protected:
   vvImageReader::Pointer mReader;
   vvImageReader::Pointer mOverlayReader;
   vvImageReader::Pointer mFusionReader;
+  vvImageReader::Pointer mFusionSequenceReader;
   vvImageReader::Pointer mVectorReader;
   vvImage::Pointer mImage;
   vvImage::Pointer mVF;
@@ -269,6 +312,16 @@ protected:
   double mFusionLevel;
   bool mFusionShowLegend;
 
+  //Fusion of sequences related data
+  int mFusionSequenceInvolvementCode; //-1: not involved, 0: main sequence(CT), 1: secondary sequence (US)
+  int mFusionSequenceIndexLinkedManager; //index of the other sequence involved in the visualization
+  int mFusionSequenceFrameIndex; //temporal index of the current image in the sequence (<->TSlice)
+  unsigned int mFusionSequenceNbFrames; //number of frames in the temporal sequence
+  bool mFusionSequenceSpatialSyncFlag, mFusionSequenceTemporalSyncFlag; //flags indicating whether the spatial/temporal synchronization are actives
+  vtkSmartPointer<vtkMatrix4x4> mFusionSequenceMainTransform;
+  std::vector< vtkSmartPointer<vtkMatrix4x4> > mFusionSequenceListInitialTransformMatrices;
+  std::vector<double> mFusionSequenceTemporalSignal;
+  
   int mPreset;
   SlicingPresetType mSlicingPreset;
   vvImageReader::LoadedImageType mType;
index 37d974a38db900711df65315a4578f992fa00f76..fa93d14d7e8085588c11d30aa69d0c139621a2b4 100644 (file)
@@ -19,6 +19,7 @@
 #ifndef VVTOOLBASEBASE_H
 #define VVTOOLBASEBASE_H
 
+#include <algorithm>
 #include "vvMainWindowBase.h"
 #include "vvToolCreatorBase.h"
 class QXmlStreamWriter;