** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: projections.cpp,v 1.28 2000/12/06 01:46:43 kevin Exp $
+** $Id: projections.cpp,v 1.33 2000/12/17 22:30:09 kevin Exp $
**
** 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
#if 0
if (m_geometry == Scanner::GEOMETRY_EQUILINEAR) {
m_detInc /= 2;
- cout << "Kludge: detInc /= 2 in Projections::initFromScanner" << endl;
+ std::cout << "Kludge: detInc /= 2 in Projections::initFromScanner" << endl;
}
#endif
}
}
bool
-Projections::read (const string& filename)
+Projections::read (const std::string& filename)
{
return read (filename.c_str());
}
bool
Projections::read (const char* filename)
{
- frnetorderstream fileRead (filename, ios::in | ios::binary);
- m_filename = filename;
-
- if (! fileRead)
+ m_filename = filename;\r
+#ifdef MSVC\r
+ frnetorderstream fileRead (m_filename.c_str(), std::ios::in | std::ios::binary);\r
+#else\r
+ frnetorderstream fileRead (m_filename.c_str(), std::ios::in | std::ios::binary | std::ios::nocreate);\r
+#endif\r
+
+ if (fileRead.fail())
return false;
if (! headerRead (fileRead))
}
+bool
+Projections::copyViewData (const std::string& filename, std::ostream& os, int startView, int endView)
+{
+ return copyViewData (filename.c_str(), os, startView, endView);
+}
+
+bool
+Projections::copyViewData (const char* const filename, std::ostream& os, int startView, int endView)
+{
+ frnetorderstream is (filename, ios::in | ios::binary);
+ kuint16 sizeHeader, signature;
+ kuint32 _nView, _nDet;
+
+ is.readInt16 (sizeHeader);
+ is.readInt16 (signature);
+ is.readInt32 (_nView);
+ is.readInt32 (_nDet);
+ int nView = _nView;
+ int nDet = _nDet;
+
+ if (signature != m_signature) {
+ sys_error (ERR_FATAL, "Illegal signature in projection file %s", filename);
+ return false;
+ }
+
+ if (startView < 0)
+ startView = 0;
+ if (startView > nView - 1)
+ startView = nView;
+ if (endView < 0 || endView > nView - 1)
+ endView = nView - 1;
+
+ if (startView > endView) { // swap if start > end
+ int tempView = endView;
+ endView = startView;
+ startView = tempView;
+ }
+
+ int sizeView = 8 /* view_angle */ + 4 /* nDet */ + (4 * nDet);
+ unsigned char* pViewData = new unsigned char [sizeView];
+
+ for (int i = startView; i <= endView; i++) {
+ is.seekg (sizeHeader + i * sizeView);
+ is.read (reinterpret_cast<char*>(pViewData), sizeView);
+ os.write (reinterpret_cast<char*>(pViewData), sizeView);
+ if (is.fail() || os.fail())
+ break;
+ }
+
+ delete pViewData;
+ if (is.fail())
+ sys_error (ERR_FATAL, "Error reading projection file");
+ if (os.fail())
+ sys_error (ERR_FATAL, "Error writing projection file");
+
+ return (! (is.fail() | os.fail()));
+}
+
+bool
+Projections::copyHeader (const std::string& filename, std::ostream& os)
+{
+ return copyHeader (filename.c_str(), os);
+}
+
+bool
+Projections::copyHeader (const char* const filename, std::ostream& os)
+{
+ frnetorderstream is (filename, std::ios::in | std::ios::binary);
+ kuint16 sizeHeader, signature;
+ is.readInt16 (sizeHeader);
+ is.readInt16 (signature);
+ is.seekg (0);
+ if (signature != m_signature) {
+ sys_error (ERR_FATAL, "Illegal signature in projection file %s", filename);
+ return false;
+ }
+
+ unsigned char* pHdrData = new unsigned char [sizeHeader];
+ is.read (reinterpret_cast<char*>(pHdrData), sizeHeader);
+ if (is.fail()) {
+ sys_error (ERR_FATAL, "Error reading header");
+ return false;
+ }
+
+ os.write (reinterpret_cast<char*>(pHdrData), sizeHeader);
+ if (os.fail()) {
+ sys_error (ERR_FATAL, "Error writing header");
+ return false;
+ }
+
+ return true;
+}
+
bool
-Projections::write (const string& filename)
+Projections::write (const std::string& filename)
{
return write (filename.c_str());
}
bool
Projections::write (const char* filename)
{
- frnetorderstream fs (filename, ios::out | ios::binary | ios::trunc | ios::ate);
+ frnetorderstream fs (filename, std::ios::out | std::ios::binary | std::ios::trunc | std::ios::ate);
m_filename = filename;
if (! fs) {
sys_error (ERR_SEVERE, "Error opening file %s for output [projections_create]", filename);
*/
void
-Projections::printProjectionData (void)
+Projections::printProjectionData ()
+{
+ printProjectionData (0, nView() - 1);
+}
+
+void
+Projections::printProjectionData (int startView, int endView)
{
printf("Projections Data\n\n");
printf("Description: %s\n", m_remark.c_str());
printf("rotStart = %8.4f rotInc = %8.4f\n", m_rotStart, m_rotInc);
printf("detStart = %8.4f detInc = %8.4f\n", m_detStart, m_detInc);
if (m_projData != NULL) {
- for (int ir = 0; ir < m_nView; ir++) {
- printf("View %d: angle %f\n", ir, m_projData[ir]->viewAngle());
- DetectorValue* detval = m_projData[ir]->detValues();
- for (int id = 0; id < m_projData[ir]->nDet(); id++)
- printf("%8.4f ", detval[id]);
- printf("\n");
- }
+ if (startView < 0)
+ startView = 0;
+ if (startView > m_nView - 1)
+ startView = m_nView - 1;
+ if (endView > m_nView - 1)
+ endView = m_nView - 1;
+ for (int ir = startView; ir <= endView - 1; ir++) {
+ printf("View %d: angle %f\n", ir, m_projData[ir]->viewAngle());
+ DetectorValue* detval = m_projData[ir]->detValues();
+ for (int id = 0; id < m_projData[ir]->nDet(); id++)
+ printf("%8.4f ", detval[id]);
+ printf("\n");
+ }
}
}
void
-Projections::printScanInfo (ostringstream& os) const
+Projections::printScanInfo (std::ostringstream& os) const
{
os << "Number of detectors: " << m_nDet << "\n";
os << " Number of views: " << m_nView<< "\n";