]> Creatis software - clitk.git/blobdiff - registration/clitkCalculateTREGenericFilter.cxx
Debug RTStruct conversion with empty struc
[clitk.git] / registration / clitkCalculateTREGenericFilter.cxx
old mode 100755 (executable)
new mode 100644 (file)
index 1da773b..adb0d1c
@@ -3,7 +3,7 @@
 
   Authors belong to: 
   - University of LYON              http://www.universite-lyon.fr/
-  - Léon Bérard cancer center       http://oncora1.lyon.fnclcc.fr
+  - Léon Bérard cancer center       http://www.centreleonberard.fr
   - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
 
   This software is distributed WITHOUT ANY WARRANTY; without even
@@ -14,7 +14,7 @@
 
   - BSD        See included LICENSE.txt file
   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
-======================================================================-====*/
+===========================================================================**/
 #ifndef clitkCalculateTREGenericFilter_cxx
 #define clitkCalculateTREGenericFilter_cxx
 
@@ -41,6 +41,9 @@ namespace clitk
   {
     m_Verbose=false;
     m_InputFileName="";
+    m_NumberOfFields=0;
+    m_NumberOfLists=0;
+    m_NumberOfPoints=0;
   }
 
 
@@ -50,39 +53,64 @@ namespace clitk
   void CalculateTREGenericFilter::Update()
   {
     // Read the Dimension and PixelType
+    if (m_ArgsInfo.vf_given && m_ArgsInfo.coeff_given)
+      {
+        std::cout << "Error, You have to supply either vector fields or coefficient images. Supplying both is not allowed. See clitkCalculateTRE --help for details."<<std::endl;;
+        return;
+      }
+    else if (!m_ArgsInfo.vf_given && !m_ArgsInfo.coeff_given)
+      {
+        std::cout << "Error, You have to supply either vector fields or coefficient images. Supplying none is not allowed. See clitkCalculateTRE --help for details."<<std::endl;;
+        return;
+      }
+    else if (m_ArgsInfo.vf_given)
+      m_InputFileName=m_ArgsInfo.vf_arg[0];
+    else
+      {
+        m_InputFileName=m_ArgsInfo.coeff_arg[0];
+      }
+
     int Dimension, Components;
     std::string PixelType;
     ReadImageDimensionAndPixelType(m_InputFileName, Dimension, PixelType, Components);
+    if (Dimension < 2 || Dimension > 4)
+      {
+        std::cout<<"Error, Only for 2, 3 or 4  Dimensions!!!"<<std::endl ;
+        return;
+      }
 
-    
     // Call UpdateWithDim
-    if(Dimension==2) ReadVectorFields<2,2>();
-    else if(Dimension==3) ReadVectorFields<3,3>();
-    else if (Dimension==4)ReadVectorFields<4,3>(); 
-    else 
+    if (m_ArgsInfo.vf_given)
       {
-       std::cout<<"Error, Only for 2, 3 or 4  Dimensions!!!"<<std::endl ;
-       return;
+        if(Dimension==2) ReadVectorFields<2,2>();
+        else 
+        if(Dimension==3) ReadVectorFields<3,3>();
+        else if (Dimension==4)ReadVectorFields<4,3>(); 
       }
+    else
+      {
+        if(Dimension==2) ReadCoefficientImages<2,2>();
+        else 
+        if(Dimension==3) ReadCoefficientImages<3,3>();
+        else if (Dimension==4)ReadCoefficientImages<4,3>(); 
+      }        
   }
 
-
-
   //-----------------------------
   // Process DVF
   //-----------------------------
   template< >
   void 
-  CalculateTREGenericFilter::ProcessVectorFields<4,3>(std::vector<itk::Image<itk::Vector<float, 3>, 4>::Pointer > dvfs,  char** filenames )
+  CalculateTREGenericFilter::ProcessVectorFields<4,3>(std::vector<itk::Image<itk::Vector<double, 3>, 4>::Pointer > dvfs,  char** filenames )
   {
     // Typedefs
-    typedef itk::Vector<float,3> PixelType;
+    typedef itk::Vector<double,3> PixelType;
     typedef itk::Image<PixelType, 4> InputImageType;
     typedef itk::Image<PixelType, 3> OutputImageType;
 
     // IO
     InputImageType::Pointer input=dvfs[0];
-    std::vector<itk::Image<itk::Vector<float, 3>, 3>::Pointer > new_dvfs;
+    std::vector<itk::Image<itk::Vector<double, 3>, 3>::Pointer > new_dvfs;
     
     // Split vector field
     typedef itk::ExtractImageFilter<InputImageType,OutputImageType> FilterType;
@@ -124,11 +152,69 @@ namespace clitk
       }
 
     // Update
-    this->UpdateWithDim<3>(new_dvfs, new_filenames); 
+    this->UpdateDVFWithDim<3>(new_dvfs, new_filenames); 
 
   }
 
+  //-----------------------------
+  // Process Coefficient images
+  //-----------------------------
+  template< >
+  void 
+  CalculateTREGenericFilter::ProcessCoefficientImages<4,3>(std::vector<itk::Image<itk::Vector<double, 3>, 4>::Pointer > coeffs,  char** filenames )
+  {
+    // Typedefs
+    typedef itk::Vector<double,3> PixelType;
+    typedef itk::Image<PixelType, 4> InputImageType;
+    typedef itk::Image<PixelType, 3> OutputImageType;
 
+    // IO
+    InputImageType::Pointer input=coeffs[0];
+    std::vector<itk::Image<itk::Vector<double, 3>, 3>::Pointer > new_coeffs;
+    
+    // Split vector field
+    typedef itk::ExtractImageFilter<InputImageType,OutputImageType> FilterType;
+    unsigned int splitDimension=3;
+
+    // Make new file names
+    std::vector<std::string> new_filenames;
+    std::string base = filenames[0];
+
+    // Set the extract region
+    InputImageType::SizeType size=input->GetLargestPossibleRegion().GetSize();
+    size[splitDimension]=0;
+    InputImageType::RegionType extracted_region;
+    extracted_region.SetSize(size);
+    InputImageType::IndexType index=input->GetLargestPossibleRegion().GetIndex();
+    
+  
+    // Loop
+    for (unsigned int i=0;i<input->GetLargestPossibleRegion().GetSize()[splitDimension];i++)
+      {
+        
+        // Skip?
+        if (m_ArgsInfo.skip_given && i==(unsigned int) m_ArgsInfo.skip_arg) continue;
+
+        // extract dvf
+         FilterType::Pointer filter= FilterType::New();
+        filter->SetInput(input);
+        index[splitDimension]=i;
+        extracted_region.SetIndex(index);
+        filter->SetExtractionRegion(extracted_region);
+        filter->Update();
+        new_coeffs.push_back(filter->GetOutput());
+        
+        // make name
+        std::ostringstream number_dvf;
+        number_dvf << i;
+        std::string number =  number_dvf.str();
+        new_filenames.push_back(base+"_"+number);
+      }
+
+    // Update
+    this->UpdateCoeffsWithDim<3>(new_coeffs, new_filenames); 
+
+  }