]> Creatis software - clitk.git/blob - tools/clitkWriteDicomSeriesGenericFilter.txx
Initial revision
[clitk.git] / tools / clitkWriteDicomSeriesGenericFilter.txx
1 #ifndef clitkWriteDicomSeriesGenericFilter_txx
2 #define clitkWriteDicomSeriesGenericFilter_txx
3
4 /* =================================================
5  * @file   clitkWriteDicomSeriesGenericFilter.txx
6  * @author 
7  * @date   
8  * 
9  * @brief 
10  * 
11  ===================================================*/
12
13
14 namespace clitk
15 {
16
17
18   //-----------------------------------------------------------
19   // Constructor
20   //-----------------------------------------------------------
21   template<class args_info_type>
22   WriteDicomSeriesGenericFilter<args_info_type>::WriteDicomSeriesGenericFilter()
23   {
24     m_Verbose=false;
25     m_InputFileName="";
26   }
27
28
29   //-----------------------------------------------------------
30   // Update
31   //-----------------------------------------------------------
32   template<class args_info_type>
33   void WriteDicomSeriesGenericFilter<args_info_type>::Update()
34   {
35     // Read the Dimension and PixelType
36     int Dimension;
37     std::string PixelType;
38     ReadImageDimensionAndPixelType(m_InputFileName, Dimension, PixelType);
39
40     
41     // Call UpdateWithDim
42     if(Dimension==2) UpdateWithDim<2>(PixelType);
43     else if(Dimension==3) UpdateWithDim<3>(PixelType);
44     // else if (Dimension==4)UpdateWithDim<4>(PixelType); 
45     else 
46       {
47         std::cout<<"Error, Only for 2 or 3  Dimensions!!!"<<std::endl ;
48         return;
49       }
50   }
51
52   //-------------------------------------------------------------------
53   // Update with the number of dimensions
54   //-------------------------------------------------------------------
55   template<class args_info_type>
56   template<unsigned int Dimension>
57   void 
58   WriteDicomSeriesGenericFilter<args_info_type>::UpdateWithDim(std::string PixelType)
59   {
60     if (m_Verbose) std::cout << "Image was detected to be "<<Dimension<<"D and "<< PixelType<<"..."<<std::endl;
61
62     if(PixelType == "short"){  
63       if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and signed short..." << std::endl;
64       UpdateWithDimAndPixelType<Dimension, signed short>(); 
65     }
66     //    else if(PixelType == "unsigned_short"){  
67     //       if (m_Verbose) std::cout  << "Launching filter in "<< Dimension <<"D and unsigned_short..." << std::endl;
68     //       UpdateWithDimAndPixelType<Dimension, unsigned short>(); 
69     //     }
70     
71     else if (PixelType == "unsigned_char"){ 
72       if (m_Verbose) std::cout  << "Launching filter in "<< Dimension <<"D and unsigned_char..." << std::endl;
73       UpdateWithDimAndPixelType<Dimension, unsigned char>();
74     }
75     
76     //     else if (PixelType == "char"){ 
77     //       if (m_Verbose) std::cout  << "Launching filter in "<< Dimension <<"D and signed_char..." << std::endl;
78     //       UpdateWithDimAndPixelType<Dimension, signed char>();
79     //     }
80     else {
81       if (m_Verbose) std::cout  << "Launching filter in "<< Dimension <<"D and float..." << std::endl;
82       UpdateWithDimAndPixelType<Dimension, float>();
83     }
84   }
85
86
87   //-------------------------------------------------------------------
88   // Update with the number of dimensions and the pixeltype
89   //-------------------------------------------------------------------
90   template<class args_info_type>
91   template <unsigned int Dimension, class  PixelType> 
92   void 
93   WriteDicomSeriesGenericFilter<args_info_type>::UpdateWithDimAndPixelType()
94   {
95
96     // ImageTypes
97     typedef itk::Image<PixelType, Dimension> InputImageType;
98     typedef itk::Image<PixelType, 2> OutputImageType;
99     
100     // Read the input (volumetric)
101     typedef itk::ImageFileReader<InputImageType> InputReaderType;
102     typename InputReaderType::Pointer volumeReader = InputReaderType::New();
103     volumeReader->SetFileName( m_InputFileName);
104     volumeReader->Update();
105     typename InputImageType::Pointer input= volumeReader->GetOutput();
106
107     // Read the dicom directory
108     typedef itk::ImageSeriesReader< InputImageType >     ReaderType;
109     typedef itk::GDCMImageIO ImageIOType;
110     typedef itk::GDCMSeriesFileNames NamesGeneratorType;
111     
112     ImageIOType::Pointer gdcmIO = ImageIOType::New();
113     NamesGeneratorType::Pointer namesGenerator = NamesGeneratorType::New();
114     namesGenerator->SetInputDirectory( m_ArgsInfo.inputDir_arg );
115     typename   ReaderType::FileNamesContainer filenames = namesGenerator->GetInputFileNames();
116
117     // Output the dicom files
118     unsigned int numberOfFilenames =  filenames.size();
119     if (m_Verbose) 
120       {
121         std::cout << numberOfFilenames <<" were read in the directory "<<m_ArgsInfo.inputDir_arg<<"..."<<std::endl<<std::endl; 
122         for(unsigned int fni = 0; fni<numberOfFilenames; fni++)
123           {
124             std::cout << "filename # " << fni << " = ";
125             std::cout << filenames[fni] << std::endl;
126           }
127       }
128     
129     // Read the series
130     typename ReaderType::Pointer reader = ReaderType::New();
131     reader->SetImageIO( gdcmIO );
132     reader->SetFileNames( filenames );
133     try
134       {
135         reader->Update();
136       }
137     catch (itk::ExceptionObject &excp)
138       {
139         std::cerr << "Error: Exception thrown while writing the DICOM series!!" << std::endl;
140         std::cerr << excp << std::endl;
141       }
142
143
144     // Modify the meta dictionary
145     typedef itk::MetaDataDictionary   DictionaryType;
146     const std::vector<DictionaryType*>* dictionary = reader->GetMetaDataDictionaryArray();
147     
148     // Get keys
149     unsigned int numberOfKeysGiven=0;
150     if(m_ArgsInfo.midP_flag && m_ArgsInfo.key_given)
151         std::cerr<<"Error: both keys and midP option are given"<<std::endl;
152     else if (m_ArgsInfo.midP_flag)
153         numberOfKeysGiven=1;
154     else
155       numberOfKeysGiven=m_ArgsInfo.key_given;
156     
157     for (unsigned int i = 0; i < numberOfKeysGiven; i++)
158       {
159         std::string entryId(m_ArgsInfo.key_arg[i]  );
160         std::string value( m_ArgsInfo.tag_arg[i] );
161         for(unsigned int fni = 0; fni<numberOfFilenames; fni++)
162           itk::EncapsulateMetaData<std::string>( *((*dictionary)[fni]), entryId, value );
163       }
164
165     // Output directory and filenames
166     itksys::SystemTools::MakeDirectory( m_ArgsInfo.outputDir_arg ); // create if it doesn't exist
167     typedef itk::ImageSeriesWriter<InputImageType, OutputImageType >  SeriesWriterType;
168     typename SeriesWriterType::Pointer seriesWriter = SeriesWriterType::New();
169
170     seriesWriter->SetInput( volumeReader->GetOutput() );
171     seriesWriter->SetImageIO( gdcmIO );
172     namesGenerator->SetOutputDirectory( m_ArgsInfo.outputDir_arg  );
173     seriesWriter->SetFileNames( namesGenerator->GetOutputFileNames() );
174     //seriesWriter->SetMetaDataDictionaryArray( dictionary );
175     seriesWriter->SetMetaDataDictionaryArray( dictionary );   
176     
177     // Write   
178     try
179       {
180         seriesWriter->Update();
181       }
182     catch( itk::ExceptionObject & excp )
183       {
184         std::cerr << "Error: Exception thrown while writing the series!!" << std::endl;
185         std::cerr << excp << std::endl;
186       }
187
188   }
189
190
191 }//end clitk
192  
193 #endif //#define clitkWriteDicomSeriesGenericFilter_txx