X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=libctsim%2Fprojections.cpp;h=bec5c0af5fdad93201d403bedfb5cf66dadac009;hp=878f50c1fb04357363171c6847ab3836791eaa7b;hb=0ec398f6f64d51a3a6cc3005d404c74c0c91b271;hpb=505de7e90b7c4a6ab3e81ee3192a7d9837701806 diff --git a/libctsim/projections.cpp b/libctsim/projections.cpp index 878f50c..bec5c0a 100644 --- a/libctsim/projections.cpp +++ b/libctsim/projections.cpp @@ -8,7 +8,7 @@ ** This is part of the CTSim program ** Copyright (c) 1983-2001 Kevin Rosenberg ** -** $Id: projections.cpp,v 1.51 2001/03/02 02:08:14 kevin Exp $ +** $Id: projections.cpp,v 1.53 2001/03/02 20:07:10 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 @@ -885,9 +885,80 @@ bool Projections::initFromSomatomAR_STAR (int iNViews, int iNDets, unsigned char* pData, unsigned long lDataLength) { init (iNViews, iNDets); + m_geometry = Scanner::GEOMETRY_EQUIANGULAR; + m_dFanBeamAngle = iNDets * convertDegreesToRadians (3.06976 / 60); + m_dFocalLength = 51; + m_dSourceDetectorLength = 89; + m_detInc = convertDegreesToRadians (3.06976 / 60); + m_detStart = -m_dFanBeamAngle / 2; + m_rotInc = TWOPI / static_cast(iNViews); + m_rotStart = HALFPI; + m_dViewDiameter = sin (m_dFanBeamAngle / 2) * m_dFocalLength * 2; if (iNDets != 1024) return false; - if (iNViews == 750 && + bool bValid = (iNViews == 750 && lDataLength == 1560000L) || (iNViews == 950 && lDataLength == 1976000L) || (iNViews == 1500 && lDataLength == 3120000); + if (! bValid) + return false; + + long lDataPos = 0; + for (int iv = 0; iv < iNViews; iv++) { + long* pLong = reinterpret_cast(pData + lDataPos+0); +#ifndef WORDS_BIGENDIAN + SwapBytes4 (pLong); +#endif + long lProjNumber = *pLong; + + pLong = reinterpret_cast(pData + lDataPos+20); +#ifndef WORDS_BIGENDIAN + SwapBytes4 (pLong); +#endif + long lEscale = *pLong; + + pLong = reinterpret_cast(pData + lDataPos+28); +#ifndef WORDS_BIGENDIAN + SwapBytes4 (pLong); +#endif + long lTime = *pLong; + + float* pFloat = reinterpret_cast(pData + lDataPos+4); +#ifndef WORDS_BIGENDIAN + SwapBytes4 (pFloat); +#endif + double dAlpha = *pFloat + HALFPI; + + pFloat = reinterpret_cast(pData + lDataPos+12); +#ifndef WORDS_BIGENDIAN + SwapBytes4 (pFloat); +#endif + double dAlign = *pFloat; + + pFloat = reinterpret_cast(pData + lDataPos+16); +#ifndef WORDS_BIGENDIAN + SwapBytes4 (pFloat); +#endif + double dMaxValue = *pFloat; + + lDataPos += 32; + double dEScale = pow (2.0, -lEscale); + double dBetaInc = convertDegreesToRadians (3.06976 / 60); + int iCenter = (iNDets + 1) / 2; + + DetectorArray& detArray = getDetectorArray( iv ); + detArray.setViewAngle (dAlpha); + DetectorValue* detval = detArray.detValues(); + + double dTempScale = 2294.4871 * dEScale; + for (int id = 0; id < iNDets; id++) { + int iV = pData[lDataPos+1] + 256 * pData[lDataPos]; + if (iV > 32767) + iV = iV - 65536; + double dCosScale = cos ((id + 1 - iCenter) * dBetaInc); + detval[id] = iV / (dTempScale * dCosScale); + lDataPos += 2; + } + } + + return true; }