X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=include%2Fscanner.h;h=d302b67b657ce1dcbf660d2df85075c2e3dc2924;hp=000aba1860117dc913d71f23364deb39f23f0b58;hb=f13a8c004b8f182b42d9e4df2bcd7c7f030bf1ad;hpb=27a474e0622ebb7229fd5705552021f63d8f932d diff --git a/include/scanner.h b/include/scanner.h index 000aba1..d302b67 100644 --- a/include/scanner.h +++ b/include/scanner.h @@ -7,10 +7,7 @@ ** Date Started: July 1, 1984 ** ** This is part of the CTSim program -** Copyright (C) 1983-2000 Kevin Rosenberg -** -** $Id: scanner.h,v 1.7 2000/07/20 11:17:31 kevin Exp $ -** +** 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 @@ -29,9 +26,12 @@ #ifndef SCANNER_H #define SCANNER_H +#include "trace.h" + class Projections; class Phantom; class PhantomElement; +class SGP; // Projections are collected along an array of ndet detectors. The data // for these detectors is stored in the class DetectorArray @@ -42,106 +42,152 @@ class DetectorArray { public: DetectorArray (const int ndet); - ~DetectorArray (void); + ~DetectorArray (); - const int nDet(void) const {return m_nDet;} - const double viewAngle(void) const {return m_viewAngle;} - DetectorValue* detValues(void) {return m_detValues;} - const DetectorValue* detValues(void) const {return m_detValues;} + const int nDet() const {return m_nDet;} + const double viewAngle() const {return m_viewAngle;} + DetectorValue* detValues() {return m_detValues;} + const DetectorValue* detValues() const {return m_detValues;} void setViewAngle (double viewAngle) { m_viewAngle = viewAngle; } private: - DetectorValue* m_detValues; // Pointer to array of values recorded by detector - int m_nDet; // Number of detectors in array */ - double m_viewAngle; // View angle in radians + DetectorValue* m_detValues; // Pointer to array of values recorded by detector + int m_nDet; // Number of detectors in array */ + double m_viewAngle; // View angle in radians DetectorArray& operator=(const DetectorArray& rhs); // assignment DetectorArray (const DetectorArray& rhs); // copy constructor }; + class Scanner { public: - typedef enum { - GEOMETRY_INVALID, - GEOMETRY_PARALLEL, - GEOMETRY_EQUILINEAR, - GEOMETRY_EQUIANGULAR, - } GeometryID; - - static const char GEOMETRY_PARALLEL_STR[]; - static const char GEOMETRY_EQUILINEAR_STR[]; - static const char GEOMETRY_EQUIANGULAR_STR[]; - - static const char GEOMETRY_PARALLEL_TITLE_STR[]; - static const char GEOMETRY_EQUILINEAR_TITLE_STR[]; - static const char GEOMETRY_EQUIANGULAR_TITLE_STR[]; - - Scanner (const Phantom& phm, const char* const geometryName, int nDet, int nView, int nSample, const double rot_anglen); + static const int GEOMETRY_INVALID; + static const int GEOMETRY_PARALLEL; + static const int GEOMETRY_EQUILINEAR; + static const int GEOMETRY_EQUIANGULAR; + static const int GEOMETRY_LINOGRAM; + + + Scanner (const Phantom& phm, const char* const geometryName, int nDet, + int nView, int iOffsetView, int nSample, const double rot_anglen, + double dFocalLengthRatio, double dCenterDetectorRatio, double dViewRatio, double dScanRatio); ~Scanner(); - - void collectProjections (Projections& proj, const Phantom& phm, const int start_view, const int trace); - void setNView (int nView); + void collectProjections (Projections& proj, const Phantom& phm, const int trace = Trace::TRACE_NONE, + SGP* pSGP = NULL); - const bool fail(void) const {return m_fail;} - const string& failMessage(void) const {return m_failMessage;} - const unsigned int nDet(void) const {return m_nDet;} - const unsigned int nView(void) const {return m_nView;} - const double phmLen(void) const {return m_phmLen;} - const double rotInc(void) const {return m_rotInc;} - const double detInc(void) const {return m_detInc;} - const double radius(void) const {return m_radius;} + void collectProjections (Projections& proj, const Phantom& phm, const int iStartView, const int iNumViews, const int iOffsetView, bool bStoreAtViewPosition, const int trace = Trace::TRACE_NONE, SGP* pSGP = NULL); + void collectProjections (Projections& proj, const Phantom& phm, const int iStartView, const int iNumViews, const int iOffsetView, int iStorageOffset, const int trace = Trace::TRACE_NONE, SGP* pSGP = NULL); + + void setNView (int nView); + void setOffsetView (int iOffsetView); + + bool fail() const {return m_fail;} + const std::string& failMessage() const {return m_failMessage;} + unsigned int nDet() const {return m_nDet;} + unsigned int nView() const {return m_nView;} + unsigned int offsetView() const {return m_iOffsetView;} + unsigned int startView() const {return m_startView;} + double rotInc() const {return m_rotInc;} + double detInc() const {return m_detInc;} + double detLen() const {return m_detLen;} + double detStart() const {return m_detStart;} + double focalLength() const {return m_dFocalLength;} + double sourceDetectorLength() const {return m_dSourceDetectorLength;} + double centerDetectorLength() const {return m_dCenterDetectorLength;} + + double viewDiameter() const {return m_dViewDiameter;} + double scanDiameter() const {return m_dScanDiameter;} + double fanBeamAngle() const {return m_dFanBeamAngle;} + + int geometry() const {return m_idGeometry;} + + static int getGeometryCount() {return s_iGeometryCount;} + static const char* const* getGeometryNameArray() {return s_aszGeometryName;} + static const char* const* getGeometryTitleArray() {return s_aszGeometryTitle;} + static int convertGeometryNameToID (const char* const geometryName); + static const char* convertGeometryIDToName (const int idGeometry); + static const char* convertGeometryIDToTitle (const int idGeometry); private: bool m_fail; - string m_failMessage; - GeometryID m_idGeometry; - unsigned int m_nDet; /* Number of detectors in array */ - unsigned int m_nView; /* Number of rotated views */ - unsigned int m_nSample; /* Number of rays per detector */ - double m_detLen; /* Total length of detector array */ - double m_rotLen; /* Rotation angle length in radians (norm 2PI) */ - double m_detInc; /* Increment between centers of detectors */ - double m_rotInc; /* Increment in rotation angle between views */ - double m_radius; /* Radius of rotation. Distance from center of phm to center of det */ - double m_phmLen; /* Maximum Length of phantom or area of interest */ + std::string m_failMessage; + int m_idGeometry; + unsigned int m_nDet; /* Number of detectors in array */ + unsigned int m_nView; /* Number of rotated views */ + unsigned int m_iOffsetView; + unsigned int m_startView; + unsigned int m_nSample; /* Number of rays per detector */ + double m_dFocalLength; // Focal Length, distance from source to center + double m_dSourceDetectorLength; // Distance from source to detectors + double m_dCenterDetectorLength; // Distance from center to detectors + double m_dViewDiameter; // Diameter of area being processed + double m_dScanDiameter; // Diamer of area being scanned + double m_dViewRatio; // View Ratio to diameter phantom + double m_dFocalLengthRatio; // Source to Center Length as ratio to viewDiameter radius + double m_dCenterDetectorRatio; // Center to Detector Length as ratio of viewDiameter radius + double m_dScanRatio; // Scan length to view length ratio + double m_dFanBeamAngle; + double m_detLen; // Total length of detector array + double m_rotLen; // Rotation angle length in radians (norm 2PI) + double m_detInc; // Increment between centers of detectors + double m_rotInc; // Increment in rotation angle between views + double m_detStart; + double m_dXCenter; // Center of Phantom + double m_dYCenter; + double m_dAngularDetIncrement; + double m_dAngularDetLen; + int m_trace; struct { - double xd1,yd1,xd2,yd2; /* Coordinates of detector endpoints */ - double xs1,ys1,xs2,ys2; /* Coordinates of source endpoints */ - double angle; /* Starting angle */ + double xd1,yd1,xd2,yd2; /* Coordinates of detector endpoints */ + double xs1,ys1,xs2,ys2; /* Coordinates of source endpoints */ + double angle; /* Starting angle */ + double dAngularDet; } m_initPos; - static const int N_EXTRA_DETECTORS=4; /* Number of extra detectors widths when calculating detlen */ + GRFMTX_2D m_rotmtxIncrement; + +#ifdef HAVE_SGP + SGP* m_pSGP; // Pointer to graphics device + double m_dXMinWin; // Extent of graphics window + double m_dXMaxWin; + double m_dYMinWin; + double m_dYMaxWin; + double m_dTextHeight; +#endif + + static const char* const s_aszGeometryName[]; + static const char* const s_aszGeometryTitle[]; + static const int s_iGeometryCount; - static GeometryID convertGeometryNameToID (const char* const geometryName); - - void projectSingleView (const Phantom& phm, DetectorArray& darray, const double xd1, const double yd1, const double xd2, const double yd2, const double xs1, const double ys1, const double xs2, const double ys2); + void projectSingleView (const Phantom& phm, DetectorArray& darray, const double xd1, const double yd1, const double xd2, const double yd2, const double xs1, const double ys1, const double xs2, const double ys2, const double dDetAngle); double projectSingleLine (const Phantom& phm, const double x1, const double y1, const double x2, const double y2); double projectLineAgainstPElem (const PhantomElement& pelem, const double x1, const double y1, const double x2, const double y2); - void traceShowParam (const char *label, const char *fmt, int row, int color, ...); + void traceShowParam (const char* szLabel, const char *fmt, int row, int color, ...); + void traceShowParamXOR (const char* szLabel, const char *fmt, int row, int color, ...); + void traceShowParamRasterOp (int iRasterOp, const char* szLabel, const char* fmt, int row, int color, va_list va); }; -const static int RAYSUM_TRACE_ROW_TITLE=1; -const static int RAYSUM_TRACE_ROW_TITLE2=2; -const static int RAYSUM_TRACE_ROW_PHANT_ID=4; -const static int RAYSUM_TRACE_ROW_CHROMATIC=7; -const static int RAYSUM_TRACE_ROW_SCATTER=8; -const static int RAYSUM_TRACE_ROW_PHOT_STAT=9; -const static int RAYSUM_TRACE_ROW_NDET=12; -const static int RAYSUM_TRACE_ROW_NVIEW=13; -const static int RAYSUM_TRACE_ROW_SAMPLES=14; -const static int RAYSUM_TRACE_ROW_CURR_VIEW=17; -const static int RAYSUM_TRACE_ROW_ATTEN=18; +const static int PROJECTION_TRACE_ROW_PHANT_ID=0; +const static int PROJECTION_TRACE_ROW_GEOMETRY=1; +const static int PROJECTION_TRACE_ROW_FOCAL_LENGTH=2; +const static int PROJECTION_TRACE_ROW_FIELD_OF_VIEW=3; +const static int PROJECTION_TRACE_ROW_NDET=4; +const static int PROJECTION_TRACE_ROW_NVIEW=5; +const static int PROJECTION_TRACE_ROW_SAMPLES=6; +const static int PROJECTION_TRACE_ROW_CURR_VIEW=7; +const static int PROJECTION_TRACE_ROW_ATTEN=8;