File: scanner.h

package info (click to toggle)
ctsim 4.5.2-1.1
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 6,536 kB
  • ctags: 3,720
  • sloc: cpp: 26,768; sh: 3,691; ansic: 1,254; perl: 296; makefile: 263
file content (197 lines) | stat: -rw-r--r-- 7,894 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
/*****************************************************************************
** FILE IDENTIFICATION
**
**   Name:          scanner.h
**   Purpose:       Scanner header file
**   Programmer:    Kevin Rosenberg
**   Date Started:  July 1, 1984
**
**  This is part of the CTSim program
**  Copyright (C) 1983-2000 Kevin Rosenberg
**
**  $Id: scanner.h 10902 2006-03-17 03:48:48Z kevin $
**
**
**  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
**  published by the Free Software Foundation.
**
**  This program is distributed in the hope that it will be useful,
**  but WITHOUT ANY WARRANTY; without even the implied warranty of
**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
**  GNU General Public License for more details.
**
**  You should have received a copy of the GNU General Public License
**  along with this program; if not, write to the Free Software
**  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
******************************************************************************/

#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

typedef float DetectorValue;

class DetectorArray
{
 public:
  DetectorArray (const int ndet);
  ~DetectorArray ();

  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 

  DetectorArray& operator=(const DetectorArray& rhs);   // assignment
  DetectorArray (const DetectorArray& rhs);             // copy constructor
};


class Scanner
{
 public:
  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 trace = Trace::TRACE_NONE,
    SGP* pSGP = NULL);

  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;
  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 dAngularDet;
  } m_initPos;

  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;

  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* 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 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;



#endif