1 /*****************************************************************************
4 ** Name: projections.cpp Projection data classes
5 ** Programmer: Kevin Rosenberg
6 ** Date Started: Aug 84
8 ** This is part of the CTSim program
9 ** Copyright (C) 1983-2000 Kevin Rosenberg
11 ** $Id: projections.cpp,v 1.3 2000/06/20 17:54:51 kevin Exp $
13 ** This program is free software; you can redistribute it and/or modify
14 ** it under the terms of the GNU General Public License (version 2) as
15 ** published by the Free Software Foundation.
17 ** This program is distributed in the hope that it will be useful,
18 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
19 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 ** GNU General Public License for more details.
22 ** You should have received a copy of the GNU General Public License
23 ** along with this program; if not, write to the Free Software
24 ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25 ******************************************************************************/
31 * Projections Constructor for projections matrix storage
34 * proj = projections_create (filename, nView, nDet)
35 * Projections& proj Allocated projections structure & matrix
36 * int nView Number of rotated view
37 * int nDet Number of detectors
41 Projections::Projections (const Scanner& scanner)
44 initFromScanner (scanner);
48 Projections::Projections (const int nView, const int nDet)
54 Projections::Projections (void)
60 Projections::~Projections (void)
67 Projections::init (const int nView, const int nDet)
75 Projections::initFromScanner (const Scanner& scanner)
78 init (scanner.nView(), scanner.nDet());
80 m_phmLen = scanner.phmLen();
81 m_rotInc = scanner.rotInc();
82 m_detInc = scanner.detInc();
84 m_detStart = -scanner.radius() + (scanner.detInc() / 2);
85 m_phmLen = scanner.phmLen();
89 Projections::setNView (int nView) // used by MPI to reduce # of views
99 Projections::newProjData (void)
102 sys_error(ERR_WARNING, "m_projData != NULL [newProjData]");
104 if (m_nView > 0 && m_nDet) {
105 m_projData = new DetectorArray* [m_nView];
107 for (int i = 0; i < m_nView; i++)
108 m_projData[i] = new DetectorArray (m_nDet);
114 * projections_free Free memory allocated to projections
117 * projections_free(proj)
118 * Projections& proj Projectionss to be deallocated
122 Projections::deleteProjData (void)
124 if (m_projData != NULL) {
125 for (int i = 0; i < m_nView; i++)
126 delete m_projData[i];
135 * projections_write_header Write data header for projections file
140 Projections::headerWrite (fnetorderstream& fs)
142 kuint32 _hsize = m_headerSize;
143 kuint32 _nView = m_nView;
144 kuint32 _nDet = m_nDet;
145 kuint32 _geom = m_geometry;
146 kuint32 _remarksize = m_remark.length();
147 kfloat64 _calcTime = m_calcTime;
148 kfloat64 _rotStart = m_rotStart;
149 kfloat64 _rotInc = m_rotInc;
150 kfloat64 _detStart = m_detStart;
151 kfloat64 _detInc = m_detInc;
152 kfloat64 _phmLen = m_phmLen;
158 fs.writeInt32 (_hsize);
159 fs.writeInt32 (_nView);
160 fs.writeInt32 (_nDet);
161 fs.writeInt32 (_geom);
162 fs.writeFloat64 (_calcTime);
163 fs.writeFloat64 (_rotStart);
164 fs.writeFloat64 (_rotInc);
165 fs.writeFloat64 (_detStart);
166 fs.writeFloat64 (_detInc);
167 fs.writeFloat64 (_phmLen);
168 fs.writeInt32 (_remarksize);
169 fs.write (m_remark.c_str(), _remarksize);
171 m_headerSize = fs.tellp();
172 _hsize = m_headerSize;
174 fs.writeInt32 (_hsize);
182 * projections_read_header Read data header for projections file
186 Projections::headerRead (fnetorderstream& fs)
192 kuint32 _remarksize = 0;
205 fs.readInt32 (_hsize);
206 fs.readInt32 (_nView);
207 fs.readInt32 (_nDet);
208 fs.readInt32 (_geom);
209 fs.readFloat64 (_calcTime);
210 fs.readFloat64 (_rotStart);
211 fs.readFloat64 (_rotInc);
212 fs.readFloat64 (_detStart);
213 fs.readFloat64 (_detInc);
214 fs.readFloat64 (_phmLen);
215 fs.readInt32 (_remarksize);
216 if (_remarksize > 100000) {
217 sys_error (ERR_SEVERE, "Insane _remarksize %d [projections::headerRead]", _remarksize);
222 sys_error (ERR_SEVERE, "Error reading header information , _remarksize=%d [projections_read_header]", _remarksize);
226 char remarkStorage[_remarksize+1];
227 fs.read (remarkStorage, _remarksize);
229 sys_error (ERR_SEVERE, "Error reading remark, _remarksize = %d", _remarksize);
232 remarkStorage[_remarksize] = 0;
233 m_remark = remarkStorage;
235 off_t _hsizeread = fs.tellg();
236 if (!fs || _hsizeread != _hsize) {
237 sys_error (ERR_WARNING, "File header size read %ld != file header size stored %ld [read_projections_header]\n_remarksize=%ld", (long int) _hsizeread, _hsize, _remarksize);
241 m_headerSize = _hsize;
245 m_calcTime = _calcTime;
246 m_rotStart = _rotStart;
248 m_detStart = _detStart;
256 Projections::read (const char* filename)
258 frnetorderstream fileRead (filename, ios::in | ios::binary);
263 if (! headerRead (fileRead))
269 for (int i = 0; i < m_nView; i++) {
270 if (! detarrayRead (fileRead, *m_projData[i], i))
280 Projections::write (const char* filename)
282 frnetorderstream fs (filename, ios::out | ios::binary | ios::trunc | ios::ate);
285 sys_error (ERR_SEVERE, "Error opening file %s for output [projections_create]", filename);
288 if (! headerWrite (fs))
291 if (m_projData != NULL) {
292 for (int i = 0; i < m_nView; i++) {
293 if (! detarrayWrite (fs, *m_projData[i], i))
306 * detarrayRead Read a Detector Array structure from the disk
309 * detarrayRead (proj, darray, view_num)
310 * DETARRAY *darray Detector array storage location to be filled
311 * int view_num View number to read
315 Projections::detarrayRead (fnetorderstream& fs, DetectorArray& darray, const int iview)
317 const int detval_bytes = darray.nDet() * sizeof(kfloat32);
318 const int detheader_bytes = sizeof(kfloat64) /* view_angle */ + sizeof(kint32) /* nDet */;
319 const int view_bytes = detheader_bytes + detval_bytes;
320 const off_t start_data = m_headerSize + (iview * view_bytes);
321 DetectorValue* detval_ptr = darray.detValues();
325 fs.seekg (start_data);
327 fs.readFloat64 (view_angle);
329 darray.setViewAngle (view_angle);
330 // darray.setNDet ( nDet);
332 for (int i = 0; i < nDet; i++) {
334 fs.readFloat32 (detval);
335 detval_ptr[i] = detval;
345 * detarrayWrite Write detector array data to the disk
348 * detarrayWrite (darray, view_num)
349 * DETARRAY *darray Detector array data to be written
350 * int view_num View number to write
353 * This routine writes the detarray data from the disk sequentially to
354 * the file that was opened with open_projections(). Data is written in
359 Projections::detarrayWrite (fnetorderstream& fs, const DetectorArray& darray, const int iview)
361 const int detval_bytes = darray.nDet() * sizeof(float);
362 const int detheader_bytes = sizeof(kfloat64) /* view_angle */ + sizeof(kint32) /* nDet */;
363 const int view_bytes = detheader_bytes + detval_bytes;
364 const off_t start_data = m_headerSize + (iview * view_bytes);
365 const DetectorValue* const detval_ptr = darray.detValues();
366 kfloat64 view_angle = darray.viewAngle();
367 kuint32 nDet = darray.nDet();
369 fs.seekp (start_data);
371 sys_error (ERR_SEVERE, "Error seeking detectory array [detarrayWrite]");
375 fs.writeFloat64 (view_angle);
376 fs.writeInt32 (nDet);
378 for (int i = 0; i < nDet; i++) {
379 kfloat32 detval = detval_ptr[i];
380 fs.writeFloat32 (detval);
390 * prt_projections Print projections data
393 * prt_projections (proj)
394 * Projections& proj Projection data to be printed
398 Projections::printProjectionData (void)
400 printf("Projections Print\n\n");
401 printf("Description: %s\n", m_remark.c_str());
402 printf("nView = %d nDet = %d\n", m_nView, m_nDet);
403 printf("rotStart = %8.4f rotInc = %8.4f\n", m_rotStart, m_rotInc);
404 printf("detStart = %8.4f detInc = %8.4f\n", m_detStart, m_detInc);
406 if (m_projData != NULL) {
407 for (int ir = 0; ir < m_nView; ir++) {
408 DetectorValue* detval = m_projData[ir]->detValues();
409 for (int id = 0; id < m_projData[ir]->nDet(); id++)
410 printf("%8.4f ", detval[id]);
417 Projections::printScanInfo (void) const
419 printf ("Number of detectors: %d\n", m_nDet);
420 printf (" Number of views: %d\n", m_nView);
421 printf (" Remark: %s\n", m_remark.c_str());
422 printf (" phmLen: %f\n", m_phmLen);
423 printf (" detStart: %f\n", m_detStart);
424 printf (" detInc: %f\n", m_detInc);
425 printf (" rotStart: %f\n", m_rotStart);
426 printf (" rotInc: %f\n", m_rotInc);