ANIMA  4.0
animaSimuBlochIR-GRE.cxx
Go to the documentation of this file.
1 #include <tclap/CmdLine.h>
2 
3 #include <itkImage.h>
4 #include <itkImageFileReader.h>
5 #include <itkImageFileWriter.h>
6 
7 #include "animaSimuBlochIR-GRE.h"
8 
9 int main(int argc, char *argv[] )
10 {
11  TCLAP::CmdLine cmd("SimuBlochIR-GRE: Simulator for Inversion Recovery - Gradient Echo ( MPRAGE )\nINRIA / IRISA - VisAGeS/Empenn Team", ' ',ANIMA_VERSION);
12 
13  TCLAP::ValueArg<std::string> t1MapArg("","t1","Input T1 map",true,"","T1 map",cmd);
14  TCLAP::ValueArg<std::string> t2sMapArg("","t2s","Input T2* map",true,"","T2* map",cmd); //changed for IR-GRE
15  TCLAP::ValueArg<std::string> m0ImageArg("","m0","Input M0 image",true,"","M0 image",cmd);
16  TCLAP::ValueArg<std::string> resArg("o","output","Output simulated image for Inversion Recovery - Gradient Echo",true,"","output simulated image",cmd);
17 
18  TCLAP::ValueArg<double> trArg("r","tr","TR value (ms), default: 1900ms",false,1900,"TR value",cmd);//changed for IR-GRE
19  TCLAP::ValueArg<double> teArg("e","te","TE value (ms), default: 2.98ms",false,2.98,"TE value",cmd);//changed for IR-GRE
20  TCLAP::ValueArg<double> tiArg("i","ti","TI value (ms), default: 900ms",false,900,"TR value",cmd);//changed for IR-GRE
21 
22  try
23  {
24  cmd.parse(argc,argv);
25  }
26  catch (TCLAP::ArgException& e)
27  {
28  std::cerr << "Error: " << e.error() << "for argument " << e.argId() << std::endl;
29  return EXIT_FAILURE;//changed for IR-GRE
30  }
31 
32  // Parse arguments
33  std::string input1FileName = t1MapArg.getValue();
34  std::string input2FileName = t2sMapArg.getValue();//changed for IR-GRE
35  std::string input3FileName = m0ImageArg.getValue();
36  std::string outputFileName = resArg.getValue();
37  double TR = trArg.getValue();
38  double TE = teArg.getValue();
39  double TI = tiArg.getValue();//changed for IR-GRE
40 
41  // Verify range of TR, TE and TI
42  if ((TR < 0) || (TE < 0) || (TI < 0))
43  {
44  std::cerr << "Error: " << std::endl;
45  std::cerr << "TR(ms) < 0 or TE(ms) < 0 or TI(ms) < 0" << std::endl;
46  std::cerr << "Please set TR(ms) >= 0 and TE(ms) >= 0 and TI(ms) >= 0." << std::endl;
47  return EXIT_FAILURE;
48  }
49 
50  // Verify TE + TI < TR
51  if ( (TE + TI) >= TR)
52  {
53  std::cerr << "Error: " << std::endl;
54  std::cerr << "TE + TI >= TR" << std::endl;
55  std::cerr << "Please set TE, TI and TR values which satisfy TE + TI < TR." << std::endl;
56  return EXIT_FAILURE;
57 
58  }
59 
60  // Setup types
61  typedef itk::Image<double, 3> ImageType;
62  typedef anima::SimuBlochIRGRE<ImageType> FilterType;
63 
64  // Read T1 map
65  typedef itk::ImageFileReader<ImageType> ReaderType;
66  ReaderType::Pointer reader1 = ReaderType::New();
67  reader1->SetFileName(input1FileName);
68  reader1->Update();
69 
70  // Read T2s map
71  typedef itk::ImageFileReader<ImageType> ReaderType;
72  ReaderType::Pointer reader2 = ReaderType::New();
73  reader2->SetFileName(input2FileName);
74  reader2->Update();
75 
76  // Read M0 map
77  typedef itk::ImageFileReader<ImageType> ReaderType;
78  ReaderType::Pointer reader3 = ReaderType::New();
79  reader3->SetFileName(input3FileName);
80  reader3->Update();
81 
82  // Get the size of input image
83  ReaderType::SizeType size1 = reader1->GetOutput()->GetLargestPossibleRegion().GetSize();
84  ReaderType::SizeType size2 = reader2->GetOutput()->GetLargestPossibleRegion().GetSize();
85  ReaderType::SizeType size3 = reader3->GetOutput()->GetLargestPossibleRegion().GetSize();
86 
87  // Verify the dimension of the input image
88  if ( ((sizeof(size1)/sizeof(size1[0])) != (sizeof(size2)/sizeof(size2[0])))
89  || ((sizeof(size1)/sizeof(size1[0])) != (sizeof(size3)/sizeof(size3[0]))) )
90  {
91  std::cerr << "Error: " << std::endl;
92  std::cerr << "The dimensions of the input images are not the same." << std::endl;
93  std::cerr << "Please input the images with the same dimension." << std::endl;
94  return EXIT_FAILURE;
95  }
96 
97  // Verify the size of the input image
98  if (((size1[0] != size2[0]) || (size1[0] != size3[0]))
99  || ((size1[1] != size2[1]) || (size1[1] != size3[1]))
100  || ((size1[2] != size2[2]) || (size1[2] != size3[2])) )
101  {
102  std::cerr << "Error: " << std::endl;
103  std::cerr << "The sizes of the input images are not the same." << std::endl;
104  std::cerr << "Please input the images with the same size." << std::endl;
105  return EXIT_FAILURE;
106  }
107 
108  // Create the filter: estimate the sequence of IR-GRE
109  FilterType::Pointer filter = FilterType::New();
110  filter->SetInput(0,reader1->GetOutput());
111  filter->SetInput(1,reader2->GetOutput());
112  filter->SetInput(2,reader3->GetOutput());
113  filter->SetTR(TR);
114  filter->SetTE(TE);
115  filter->SetTI(TI);//changed for IR-GRE
116  filter->Update();
117 
118  // Save the output image
119  typedef itk::ImageFileWriter< ImageType > WriterType;
120  WriterType::Pointer writer = WriterType::New();
121  writer->SetFileName(outputFileName);
122  writer->SetInput(filter->GetOutput());
123  writer->Update();
124 
125  // return
126  return EXIT_SUCCESS;
127 }
128 
int main(int argc, char *argv[])