** Date Started: 1984
**
** This is part of the CTSim program
-** Copyright (c) 1983-2001 Kevin Rosenberg
-**
-** $Id$
+** Copyright (c) 1983-2009 Kevin Rosenberg
**
** 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
{
int id = GEOMETRY_INVALID;
- for (int i = 0; i < s_iGeometryCount; i++)
+ for (int i = 0; i < s_iGeometryCount; i++) {
if (strcasecmp (geomName, s_aszGeometryName[i]) == 0) {
id = i;
break;
}
-
- return (id);
+ }
+ return (id);
}
collectProjections (proj, phm, iStartView, iNumViews, iOffsetView, iStorageOffset, trace, pSGP);
}
+static void mtx2_offset_rot (GRFMTX_2D m, double angle, double x, double y) {
+ GRFMTX_2D temp;
+ xlat_mtx2 (m, -x, -y);
+ rot_mtx2 (temp, angle);
+ mult_mtx2 (m, temp, m);
+ xlat_mtx2 (temp, x, y);
+ mult_mtx2 (m, temp, m);
+}
+
void
Scanner::collectProjections (Projections& proj, const Phantom& phm, const int iStartView,
const int iNumViews, const int iOffsetView, int iStorageOffset,
m_trace = trace;
double start_angle = (iStartView + iOffsetView) * proj.rotInc();
- // Calculate initial rotation matrix
- GRFMTX_2D rotmtx_initial, temp;
- xlat_mtx2 (rotmtx_initial, -m_dXCenter, -m_dYCenter);
- rot_mtx2 (temp, start_angle);
- mult_mtx2 (rotmtx_initial, temp, rotmtx_initial);
- xlat_mtx2 (temp, m_dXCenter, m_dYCenter);
- mult_mtx2 (rotmtx_initial, temp, rotmtx_initial);
-
- double xd1=0, yd1=0, xd2=0, yd2=0;
- if (m_idGeometry != GEOMETRY_EQUIANGULAR) {
- xd1 = m_initPos.xd1;
- yd1 = m_initPos.yd1;
- xd2 = m_initPos.xd2;
- yd2 = m_initPos.yd2;
- xform_mtx2 (rotmtx_initial, xd1, yd1); // rotate detector endpoints
- xform_mtx2 (rotmtx_initial, xd2, yd2); // to initial view_angle
- }
-
- double xs1 = m_initPos.xs1;
- double ys1 = m_initPos.ys1;
- double xs2 = m_initPos.xs2;
- double ys2 = m_initPos.ys2;
- xform_mtx2 (rotmtx_initial, xs1, ys1); // rotate source endpoints to
- xform_mtx2 (rotmtx_initial, xs2, ys2); // initial view angle
-
- int iView;
- double viewAngle;
- for (iView = 0, viewAngle = start_angle; iView < iNumViews; iView++, viewAngle += proj.rotInc()) {
+#ifdef HAVE_OPENMP
+ #pragma omp parallel for
+#endif
+
+ for (int iView = 0; iView < iNumViews; iView++) {
+ double viewAngle = start_angle + (iView * proj.rotInc());
+
+ // With OpenMP, need to calculate source and detector positions at each view
+ GRFMTX_2D rotmtx;
+ mtx2_offset_rot (rotmtx, viewAngle, m_dXCenter, m_dYCenter);
+ double xd1=0, yd1=0, xd2=0, yd2=0;
+ if (m_idGeometry != GEOMETRY_EQUIANGULAR) {
+ xd1 = m_initPos.xd1; yd1 = m_initPos.yd1;
+ xd2 = m_initPos.xd2; yd2 = m_initPos.yd2;
+ xform_mtx2 (rotmtx, xd1, yd1); // rotate detector endpoints
+ xform_mtx2 (rotmtx, xd2, yd2); // to initial view_angle
+ }
+
+ double xs1 = m_initPos.xs1, ys1 = m_initPos.ys1;
+ double xs2 = m_initPos.xs2, ys2 = m_initPos.ys2;
+ xform_mtx2 (rotmtx, xs1, ys1); // rotate source endpoints to
+ xform_mtx2 (rotmtx, xs2, ys2); // initial view angle
+
int iStoragePosition = iView + iStorageOffset;
-
DetectorArray& detArray = proj.getDetectorArray( iStoragePosition );
#ifdef HAVE_SGP
m_pSGP->setColor (C_GREEN);
m_pSGP->drawCircle (m_dFocalLength);
m_pSGP->setColor (C_BLUE);
-#if MSVC
m_pSGP->setTextPointSize (9);
-#else
- m_pSGP->setTextPointSize (14);
-#endif
phm.draw (*m_pSGP);
m_dTextHeight = m_pSGP->getCharHeight ();
traceShowParam ("Samples / Ray:", "%d", PROJECTION_TRACE_ROW_SAMPLES, C_BLUE, m_nSample);
m_pSGP->setMarker (SGP::MARKER_BDIAMOND);
- }
-#endif
-#ifdef HAVE_SGP
- if (m_pSGP && m_trace >= Trace::TRACE_PHANTOM) {
+
m_pSGP->setColor (C_BLACK);
m_pSGP->setPenWidth (2);
if (m_idGeometry == GEOMETRY_PARALLEL) {
if (m_trace > Trace::TRACE_CONSOLE)
traceShowParam ("Current View:", "%d (%.0f%%)", PROJECTION_TRACE_ROW_CURR_VIEW, C_RED, iView + iStartView, (iView + iStartView) / static_cast<double>(m_nView) * 100.);
#endif
+
if (m_trace == Trace::TRACE_CONSOLE)
std::cout << "Current View: " << iView+iStartView << std::endl;
// rs_plot (detArray, xd1, yd1, dXCenter, dYCenter, theta);
}
#endif
- xform_mtx2 (m_rotmtxIncrement, xs1, ys1);
- xform_mtx2 (m_rotmtxIncrement, xs2, ys2);
- if (m_idGeometry != GEOMETRY_EQUIANGULAR) {
- xform_mtx2 (m_rotmtxIncrement, xd1, yd1); // rotate detector endpoints
- xform_mtx2 (m_rotmtxIncrement, xd2, yd2);
- }
+
} /* for each iView */
}