Raw File
/*!
 * \file Tomato.h
 * \author Konrad Werys
 * \date 2018/08/14
 */

#ifndef Tomato_Tomato_H
#define Tomato_Tomato_H

#include "CmakeConfigForTomato.h"
#ifdef USE_ITK

#include "TomatoOptions.h"
#include "TomatoColormap.h"

#include "itkReadFileListFilter.h"
#include "itkReadDirectoryFilter.h"
#include "itkSortInvTimesImageFilter.h"
#include "itkCalculatorT1ImageFilter.h"
#include "itkColorbar2DImageFilter.h"
#include "itkNShmolliSamplesUsedTo123ImageFilter.h"

#include "itkTimeProbe.h"
// for exporting
#include "gdcmUIDGenerator.h"
#include "itkGDCMImageIO.h"
#include "itkGDCMSeriesFileNames.h"
#include "itkMultiplyImageFilter.h"
#include "itkImageFileWriter.h"
#include "itkFileTools.h"
#include "itkAdaptImageFilter.h"

#ifdef USE_VTK
#include "QuickView.h"
#endif //USE_VTK

namespace Ox {

    /**
     * \class Tomato
     * includes factories and methods needed for calculation
     */
    template< typename MeasureType >
    class Tomato {

    public:
        // typedefs primitive data types
        typedef MeasureType InputPixelType;
        typedef int16_t OutputPixelType; // int does not work with some dicom viewers, be sure to use short (int16)

        // typedefs image data types
        typedef itk::Image<InputPixelType, 3> ImageType3D;
        typedef itk::Image<InputPixelType, 2> ImageType2D;
        typedef itk::Image<OutputPixelType, 2> OutputImageType;
        typedef itk::ReadFileListFilter<ImageType3D> ReadFileListFilterType;
        typedef itk::ReadDirectoryFilter<ImageType3D> ReadDirectoryFilterType;
        typedef itk::SortInvTimesImageFilter<ImageType3D, ImageType3D> SortInvTimesImageFilterType;
        typedef itk::CalculatorT1ImageFilter<ImageType3D, ImageType2D> CalculatorT1ImageFilterType;
        typedef itk::MetaDataDictionary DictionaryType;

        // member variables
        TomatoOptions<InputPixelType> *_opts;
        InputPixelType *_invTimes;
        InputPixelType *_echoTimes;
        int _nSamples;
        typename ImageType3D::Pointer _imageMag;
        typename ImageType3D::Pointer _imagePha;

        typename CalculatorT1ImageFilterType::Pointer _imageCalculatorItk;
        //SortInvTimesImageFilterType::Pointer _sorterMag;
        //SortInvTimesImageFilterType::Pointer _sorterPha;

        DictionaryType _dictionaryInput;

        /**
         * readAndSort
         * @return success/failure
         */
        int readAndSort();

        /**
         * calculate
         * @return success/failure
         */
        int calculate();

        /**
         * visualise
         * @return success/failure
         */
        int visualise();

        /**
         * method so long and ugly, that I put it in a separate file
         * @return success/failure
         */
        int exportToDicom();

        /**
         * constructor
         * @param inputFileName
         */
        Tomato(std::string inputFileName);

        /**
         * \brief do not forget about the virtual destructor, see
         * https://stackoverflow.com/questions/461203/when-to-use-virtual-destructors
         */
        virtual ~Tomato();

    private:
        /**
         * We do not want the default constructor, so let's make it private.
         * I cant delete it to be compatible with c++98
         */
        Tomato(){};

        /**
         * readAndSortInputFileList
         * @return success/failure
         */
        int readAndSortInputFileList();

        /**
         * readAndSortInputDirs
         * @return success/failure
         */
        int readAndSortInputDirs();

    };

} // namespace Ox

#include "Tomato.hxx"
#include "Tomato_export.hxx"

#endif

#endif //Tomato_Tomato_H
back to top