** This is part of the CTSim program
** Copyright (c) 1983-2001 Kevin Rosenberg
**
-** $Id: projections.cpp,v 1.49 2001/02/22 18:22:40 kevin Exp $
+** $Id: projections.cpp,v 1.54 2001/03/05 21:59:55 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
m_detInc = scanner.detInc();
m_geometry = scanner.geometry();
m_dFocalLength = scanner.focalLength();
+ m_dSourceDetectorLength = scanner.sourceDetectorLength();
m_dViewDiameter = scanner.viewDiameter();
m_rotStart = 0;
m_detStart = -(scanner.detLen() / 2);
kfloat64 _detInc = m_detInc;
kfloat64 _viewDiameter = m_dViewDiameter;
kfloat64 _focalLength = m_dFocalLength;
+ kfloat64 _sourceDetectorLength = m_dSourceDetectorLength;
kfloat64 _fanBeamAngle = m_dFanBeamAngle;
fs.seekp(0);
fs.writeFloat64 (_detInc);
fs.writeFloat64 (_viewDiameter);
fs.writeFloat64 (_focalLength);
+ fs.writeFloat64 (_sourceDetectorLength);
fs.writeFloat64 (_fanBeamAngle);
fs.writeInt16 (_year);
fs.writeInt16 (_month);
{
kuint16 _hsize, _signature, _year, _month, _day, _hour, _minute, _second, _remarksize = 0;
kuint32 _nView, _nDet, _geom;
- kfloat64 _calcTime, _rotStart, _rotInc, _detStart, _detInc, _focalLength, _viewDiameter, _fanBeamAngle;
+ kfloat64 _calcTime, _rotStart, _rotInc, _detStart, _detInc, _focalLength, _sourceDetectorLength, _viewDiameter, _fanBeamAngle;
fs.seekg(0);
if (! fs)
fs.readFloat64 (_detInc);
fs.readFloat64 (_viewDiameter);
fs.readFloat64 (_focalLength);
+ fs.readFloat64 (_sourceDetectorLength);
fs.readFloat64 (_fanBeamAngle);
fs.readInt16 (_year);
fs.readInt16 (_month);
m_detStart = _detStart;
m_detInc = _detInc;
m_dFocalLength = _focalLength;
+ m_dSourceDetectorLength = _sourceDetectorLength;
m_dViewDiameter = _viewDiameter;
m_dFanBeamAngle = _fanBeamAngle;
m_year = _year;
printf("Projections Data\n\n");
printf("Description: %s\n", m_remark.c_str());
printf("Geometry: %s\n", Scanner::convertGeometryIDToName (m_geometry));
- printf("nView = %8d nDet = %8d\n", m_nView, m_nDet);
- printf("focalLength = %8.4f ViewDiameter = %8.4f\n", m_dFocalLength, m_dViewDiameter);
- printf("fanBeamAngle= %8.4f\n", convertRadiansToDegrees(m_dFanBeamAngle));
- printf("rotStart = %8.4f rotInc = %8.4f\n", m_rotStart, m_rotInc);
- printf("detStart = %8.4f detInc = %8.4f\n", m_detStart, m_detInc);
+ printf("nView = %8d nDet = %8d\n", m_nView, m_nDet);
+ printf("focalLength = %8.4f ViewDiameter = %8.4f\n", m_dFocalLength, m_dViewDiameter);
+ printf("fanBeamAngle= %8.4f SourceDetector = %8.4f\n", convertRadiansToDegrees(m_dFanBeamAngle), m_dSourceDetectorLength);
+ printf("rotStart = %8.4f rotInc = %8.4f\n", m_rotStart, m_rotInc);
+ printf("detStart = %8.4f detInc = %8.4f\n", m_detStart, m_detInc);
if (m_projData != NULL) {
if (startView < 0)
startView = 0;
os << "Description: " << m_remark.c_str()<< "\n";
os << "Geometry: " << Scanner::convertGeometryIDToName (m_geometry)<< "\n";
os << "Focal Length: " << m_dFocalLength<< "\n";
+ os << "Source Detector Length: " << m_dSourceDetectorLength << "\n";
os << "View Diameter: " << m_dViewDiameter<< "\n";
os << "Fan Beam Angle: " << convertRadiansToDegrees(m_dFanBeamAngle) << "\n";
os << "detStart: " << m_detStart<< "\n";
for (unsigned int ix = 0; ix < ny; ix++) {
for (unsigned int iy = 0; iy < ny; iy++) {
if (iInterpolationID == POLAR_INTERP_NEAREST) {
- int iView = nearest<int> (ppdView[ix][iy]);
- int iDet = nearest<int> (ppdDet[ix][iy]);
+ unsigned int iView = nearest<int> (ppdView[ix][iy]);
+ unsigned int iDet = nearest<int> (ppdDet[ix][iy]);
if (iView == nView) {
iView = 0;
// iDet = m_nDet - iDet;
v[ix][iy] = 0;
}
} else if (iInterpolationID == POLAR_INTERP_BILINEAR) {
- int iFloorView = static_cast<int>(ppdView[ix][iy]);
+ unsigned int iFloorView = static_cast<int>(ppdView[ix][iy]);
double dFracView = ppdView[ix][iy] - iFloorView;
- int iFloorDet = static_cast<int>(ppdDet[ix][iy]);
+ unsigned int iFloorDet = static_cast<int>(ppdDet[ix][iy]);
double dFracDet = ppdDet[ix][iy] - iFloorDet;
if (iFloorDet >= 0 && iFloorView >= 0) {
}
+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<double>(iNViews);
+ m_rotStart = HALFPI;
+ m_dViewDiameter = sin (m_dFanBeamAngle / 2) * m_dFocalLength * 2;
+
+ if (iNDets != 1024)
+ return false;
+ 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++) {
+ unsigned char* pArgBase = pData + lDataPos;
+ unsigned char* p = pArgBase+0;
+#ifndef WORDS_BIGENDIAN
+ SwapBytes4 (p);
+#endif
+ long lProjNumber = *reinterpret_cast<long*>(p);
+
+ p = pArgBase+20;
+#ifndef WORDS_BIGENDIAN
+ SwapBytes4 (p);
+#endif
+ long lEscale = *reinterpret_cast<long*>(p);
+
+ p = pArgBase+28;
+#ifndef WORDS_BIGENDIAN
+ SwapBytes4 (p);
+#endif
+ long lTime = *reinterpret_cast<long*>(p);
+
+ p = pArgBase + 4;
+#ifndef WORDS_BIGENDIAN
+ SwapBytes4 (p);
+#endif
+ double dAlpha = *reinterpret_cast<float*>(p) + HALFPI;
+
+ p = pArgBase+12;
+#ifndef WORDS_BIGENDIAN
+ SwapBytes4 (p);
+#endif
+ double dAlign = *reinterpret_cast<float*>(p);
+
+ p = pArgBase + 16;
+#ifndef WORDS_BIGENDIAN
+ SwapBytes4 (p);
+#endif
+ double dMaxValue = *reinterpret_cast<float*>(p);
+
+ 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;
+}
+