https://github.com/ElsevierSoftwareX/SOFTX_2019_219
Revision 4f10946b10bb8caa05af252a9017b2a3e7b4cffa authored by Konrad Werys on 08 August 2018, 19:12:18 UTC, committed by Konrad Werys on 08 August 2018, 19:12:18 UTC
1 parent 0b3c382
Raw File
Tip revision: 4f10946b10bb8caa05af252a9017b2a3e7b4cffa authored by Konrad Werys on 08 August 2018, 19:12:18 UTC
working on image calculation.
Tip revision: 4f10946
OxTestImage.hxx
/*!
 * \file OxTestImage.hxx
 * \author Konrad Werys
 * \date 2018/08/07
 */

#ifndef OXShmolli2_OXTESTImage_HXX
#define OXShmolli2_OXTESTImage_HXX


namespace Ox {

    template< typename MeasureType >
    TestImage<MeasureType>
    ::TestImage(int nCols, int nRows, std::vector <std::string> filesPaths) {
        _nRows = nRows;
        _nCols = nCols;
        int nTissues = filesPaths.size();
        std::vector< TestData <MeasureType> > TestDataVector; // vector with TestData objects

        // I do want to have less 'tissues' (TestData objects) than columns, just for the sake of simplicity
        if (nTissues > _nCols){
            std::cerr << "Give me more nCols or less tissues" << std::endl;
            throw std::exception();
        }

        // populate TestDataVector
        for (int i = 0; i < nTissues; ++i){
            TestDataVector.push_back(TestData<MeasureType>((char*)filesPaths.at(i).c_str()));
        }

        // check if invTimes are equal
        for (int i = 1; i < nTissues; ++i){
            if(!(TestDataVector.at(i).getInvTimes() == TestDataVector.at(i-1).getInvTimes())){
                std::cerr << "InvTimes are different" << std::endl;
                throw std::exception();
            }
        }
        _invTimes = TestDataVector.at(0).getInvTimes();
        _nSamples = _invTimes.size();

        // allocate memory
        _imageMag = new MeasureType[_nRows*_nCols*_nSamples];
        _imagePha = new MeasureType[_nRows*_nCols*_nSamples];
        _imageResultsMolli = new MeasureType[_nSamples*_nRows*3];
        _imageResultsShmolli = new MeasureType[_nSamples*_nRows*3];

        // how to divide the memory?
        std::vector<int> ranges = KWUtil::bounds<int>(nTissues, _nCols);

//        std::cout << std::endl;
//        std::cout << std::endl;
//        for (int i = 0; i < ranges.size(); ++i ){
//            std::cout << ranges[i] << std::endl;
//        }

        // fill memory
        for (int iSample = 0; iSample < _nSamples; ++iSample){
            for (int iRow = 0; iRow < _nRows; ++iRow) {
                for (int iTissue = 0; iTissue < ranges.size()-1; ++iTissue) {
                    for (int iCol = ranges[iTissue]; iCol < ranges[iTissue+1]; ++iCol) {
                        _imageMag[iSample * (nCols * nRows) + iRow * nCols + iCol] = TestDataVector.at(iTissue).getSignalMagPtr()[iSample];
                        _imagePha[iSample * (nCols * nRows) + iRow * nCols + iCol] = TestDataVector.at(iTissue).getSignalPhaPtr()[iSample];
                    }
                }
            }
        }
        for (int iDim = 0; iDim < 3; ++iDim){
            for (int iRow = 0; iRow < _nRows; ++iRow) {
                for (int iTissue = 0; iTissue < ranges.size()-1; ++iTissue) {
                    for (int iCol = ranges[iTissue]; iCol < ranges[iTissue+1]; ++iCol) {
                        _imageResultsMolli[iDim * (nCols * nRows) + iRow * nCols + iCol] = TestDataVector.at(iTissue).getResultsMolliPtr()[iDim];
                        _imageResultsShmolli[iDim * (nCols * nRows) + iRow * nCols + iCol] = TestDataVector.at(iTissue).getResultsShmolliPtr()[iDim];
                    }
                }
            }
        }

    }

    template< typename MeasureType >
    TestImage<MeasureType>
    ::~TestImage(){
        delete [] _imageMag;
        delete [] _imagePha;
        delete [] _imageResultsMolli;
        delete [] _imageResultsShmolli;

    }
    template< typename MeasureType >
    std::vector<MeasureType>
    TestImage<MeasureType>
    ::getInvTimes() const {
        return _invTimes;
    }

    template< typename MeasureType >
    MeasureType *
    TestImage<MeasureType>
    ::getInvTimesPtr()  {
        return &_invTimes.at(0);
    }


    template< typename MeasureType >
    MeasureType *
    TestImage<MeasureType>
    ::getImageMagPtr() const {
        return _imageMag;
    }

    template< typename MeasureType >
    MeasureType *
    TestImage<MeasureType>
    ::getImagePhaPtr() const {
        return _imagePha;
    }

    template< typename MeasureType >
    MeasureType *
    TestImage<MeasureType>
    ::getImageResultsMolliPtr() const {
        return _imageResultsMolli;
    }

    template< typename MeasureType >
    MeasureType *
    TestImage<MeasureType>
    ::getImageResultsShmolliPtr() const {
        return _imageResultsShmolli;
    }

} // namespace Ox



#endif //OXShmolli2_OXTESTImage_HXX
back to top