X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=libctsim%2Fprojections.cpp;h=f6b8cb15a48fd3b3362d79b89505de4740b96271;hb=1f72f3289ee6be64ec607ea93b4fcfe8b5dff3eb;hp=22171504420064543e7d958bb168e461f9f9f79c;hpb=c6cda8844a491b71759e5dd5edba830d0b809cfd;p=ctsim.git diff --git a/libctsim/projections.cpp b/libctsim/projections.cpp index 2217150..f6b8cb1 100644 --- a/libctsim/projections.cpp +++ b/libctsim/projections.cpp @@ -6,9 +6,9 @@ ** Date Started: Aug 84 ** ** This is part of the CTSim program -** Copyright (C) 1983-2000 Kevin Rosenberg +** Copyright (c) 1983-2001 Kevin Rosenberg ** -** $Id: projections.cpp,v 1.38 2001/01/06 15:33:15 kevin Exp $ +** $Id: projections.cpp,v 1.46 2001/01/28 19:10:18 kevin Exp $ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -404,10 +404,16 @@ Projections::copyViewData (const std::string& filename, std::ostream& os, int st bool Projections::copyViewData (const char* const filename, std::ostream& os, int startView, int endView) { - frnetorderstream is (filename, ios::in | ios::binary); + frnetorderstream is (filename, std::ios::in | std::ios::binary); kuint16 sizeHeader, signature; kuint32 _nView, _nDet; + is.seekg (0); + if (is.fail()) { + sys_error (ERR_SEVERE, "Unable to read projection file %s", filename); + return false; + } + is.readInt16 (sizeHeader); is.readInt16 (signature); is.readInt32 (_nView); @@ -416,7 +422,7 @@ Projections::copyViewData (const char* const filename, std::ostream& os, int sta int nDet = _nDet; if (signature != m_signature) { - sys_error (ERR_FATAL, "Illegal signature in projection file %s", filename); + sys_error (ERR_SEVERE, "Illegal signature in projection file %s", filename); return false; } @@ -446,9 +452,9 @@ Projections::copyViewData (const char* const filename, std::ostream& os, int sta delete pViewData; if (is.fail()) - sys_error (ERR_FATAL, "Error reading projection file"); + sys_error (ERR_SEVERE, "Error reading projection file"); if (os.fail()) - sys_error (ERR_FATAL, "Error writing projection file"); + sys_error (ERR_SEVERE, "Error writing projection file"); return (! (is.fail() | os.fail())); } @@ -468,20 +474,20 @@ Projections::copyHeader (const char* const filename, std::ostream& os) is.readInt16 (signature); is.seekg (0); if (signature != m_signature) { - sys_error (ERR_FATAL, "Illegal signature in projection file %s", filename); + sys_error (ERR_SEVERE, "Illegal signature in projection file %s", filename); return false; } unsigned char* pHdrData = new unsigned char [sizeHeader]; is.read (reinterpret_cast(pHdrData), sizeHeader); if (is.fail()) { - sys_error (ERR_FATAL, "Error reading header"); + sys_error (ERR_SEVERE, "Error reading header"); return false; } os.write (reinterpret_cast(pHdrData), sizeHeader); if (os.fail()) { - sys_error (ERR_FATAL, "Error writing header"); + sys_error (ERR_SEVERE, "Error writing header"); return false; } @@ -631,6 +637,8 @@ Projections::printProjectionData (int startView, int endView) if (m_projData != NULL) { if (startView < 0) startView = 0; + if (endView < 0) + endView = m_nView - 1; if (startView > m_nView - 1) startView = m_nView - 1; if (endView > m_nView - 1) @@ -681,7 +689,8 @@ Projections::convertPolar (ImageFile& rIF, int iInterpolationID) calcArrayPolarCoordinates (nx, ny, ppdView, ppdDet); std::complex** ppcDetValue = new std::complex* [m_nView]; - for (unsigned int iView = 0; iView < m_nView; iView++) { + unsigned int iView; + for (iView = 0; iView < m_nView; iView++) { ppcDetValue[iView] = new std::complex [m_nDet]; for (unsigned int iDet = 0; iDet < m_nDet; iDet++) ppcDetValue[iView][iDet] = std::complex(getDetectorArray (iView).detValues()[iDet], 0); @@ -710,6 +719,9 @@ Projections::convertFFTPolar (ImageFile& rIF, int iInterpolationID, int iZeropad if (! v || nx == 0 || ny == 0) return false; +#ifndef HAVE_FFT + return false; +#else Array2d adView (nx, ny); Array2d adDet (nx, ny); double** ppdView = adView.getArray(); @@ -722,16 +734,16 @@ Projections::convertFFTPolar (ImageFile& rIF, int iInterpolationID, int iZeropad fftw_plan plan = fftw_create_plan (m_nDet, FFTW_FORWARD, FFTW_IN_PLACE); for (iView = 0; iView < m_nView; iView++) { - ppcDetValue[iView] = new std::complex [m_nDet]; unsigned int iDet; for (iDet = 0; iDet < m_nDet; iDet++) { pcIn[iDet].re = getDetectorArray(iView).detValues()[iDet]; pcIn[iDet].im = 0; } fftw_one (plan, pcIn, NULL); + ppcDetValue[iView] = new std::complex [m_nDet]; for (iDet = 0; iDet < m_nDet; iDet++) - ppcDetValue[iView][iDet] = std::complex (pcIn[iDet].re, pcIn[iDet].im); - Fourier::shuffleFourierToNaturalOrder (ppcDetValue[iView], m_nDet); + ppcDetValue[iView][iDet] = std::complex (pcIn[iDet].re, pcIn[iDet].im); + Fourier::shuffleFourierToNaturalOrder (ppcDetValue[iView], m_nDet); } fftw_destroy_plan (plan); @@ -746,8 +758,10 @@ Projections::convertFFTPolar (ImageFile& rIF, int iInterpolationID, int iZeropad delete [] ppcDetValue; return true; +#endif } + void Projections::calcArrayPolarCoordinates (unsigned int nx, unsigned int ny, double** ppdView, double** ppdDet) { @@ -763,8 +777,10 @@ Projections::calcArrayPolarCoordinates (unsigned int nx, unsigned int ny, double if (m_geometry != Scanner::GEOMETRY_PARALLEL) { sys_error (ERR_WARNING, "convertPolar supports Parallel only"); + return; } + // Calculates polar coordinates (view#, det#) for each point on phantom grid double x = xMin + xInc / 2; // Rectang coords of center of pixel for (unsigned int ix = 0; ix < nx; x += xInc, ix++) { double y = yMin + yInc / 2; @@ -809,9 +825,9 @@ Projections::interpolatePolar (ImageFileArray& v, ImageFileArray& vImag, v[ix][iy] = 0; } } else if (iInterpolationID == POLAR_INTERP_BILINEAR) { - int iFloorView = ppdView[ix][iy]; + int iFloorView = static_cast(ppdView[ix][iy]); double dFracView = ppdView[ix][iy] - iFloorView; - int iFloorDet = ppdDet[ix][iy]; + int iFloorDet = static_cast(ppdDet[ix][iy]); double dFracDet = ppdDet[ix][iy] - iFloorDet; if (iFloorDet >= 0 && iFloorView >= 0) {