** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: scanner.h,v 1.2 2000/06/19 15:48:23 kevin Exp $
+** $Id: scanner.h,v 1.9 2000/07/28 08:28:08 kevin Exp $
**
**
** This program is free software; you can redistribute it and/or modify
#ifndef SCANNER_H
#define SCANNER_H
-#include "projections.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
{ 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
};
-typedef enum {
- DETECTOR_PARALLEL,
- DETECTOR_EQUIANGLE,
- DETECTOR_EQUILINEAR
-} ScannerGeometry;
-
class Scanner
{
public:
- Scanner (const Phantom& phm, const ScannerGeometry geometry, int nDet, int nView, int nSample, const double rot_anglen);
+ static const int Scanner::GEOMETRY_INVALID;
+ static const int Scanner::GEOMETRY_PARALLEL;
+ static const int Scanner::GEOMETRY_EQUILINEAR;
+ static const int Scanner::GEOMETRY_EQUIANGULAR;
+
+
+ Scanner (const Phantom& phm, const char* const geometryName, int nDet, int nView, int nSample, const double rot_anglen);
~Scanner();
- void collectProjections (Projections& proj, const Phantom& phm, const int start_view, const int trace);
+ void collectProjections (Projections& proj, const Phantom& phm, const int start_view, const int trace = TRACE_NONE, SGP* pSGP = NULL);
+
+ void setNView (int nView);
+ 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 detInc(void) const {return m_detInc;}
const double radius(void) const {return m_radius;}
-
+ static const int getGeometryCount() {return s_iGeometryCount;}
+ static const char** getGeometryNameArray() {return s_aszGeometryName;}
+ static const char** 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:
- 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);
-
- 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, ...);
-
-
- ScannerGeometry m_geometry; /* Geometry of detectory */
- 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 */
+ bool m_fail;
+ 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_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 */
-
+ 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 */
+ 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 */
} m_initPos;
+ static const char* s_aszGeometryName[];
+ static const char* s_aszGeometryTitle[];
+ static const int s_iGeometryCount;
static const int N_EXTRA_DETECTORS=4; /* Number of extra detectors widths when calculating detlen */
- int m_trace;
+ 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, SGP* pSGP);
+
+ double projectSingleLine (const Phantom& phm, const double x1, const double y1, const double x2, const double y2, SGP* pSGP);
+
+ double projectLineAgainstPElem (const PhantomElement& pelem, const double x1, const double y1, const double x2, const double y2, SGP* pSGP);
+
+ void traceShowParam (const char *label, const char *fmt, int row, int color, ...);
+
};