X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=libctsim%2Fprojections.cpp;h=4c31b3808748681a62e7ae33ad1c25a69ad17307;hp=7fdda64bfd5603d5ebae628a50a484b92ea42278;hb=e3776d3d7bf82adfea545c1f06c8b4ce660190b0;hpb=4d3663b733242615ba3c5323f7105ef895b3c8bf diff --git a/libctsim/projections.cpp b/libctsim/projections.cpp index 7fdda64..4c31b38 100644 --- a/libctsim/projections.cpp +++ b/libctsim/projections.cpp @@ -8,7 +8,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: projections.cpp,v 1.26 2000/09/07 05:51:52 kevin Exp $ +** $Id: projections.cpp,v 1.34 2001/01/02 06:29:23 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 @@ -25,7 +25,8 @@ ******************************************************************************/ #include "ct.h" - + +const kuint16 Projections::m_signature = ('P'*256 + 'J'); /* NAME * Projections Constructor for projections matrix storage @@ -70,6 +71,15 @@ Projections::init (const int nView, const int nDet) m_nView = nView; m_nDet = nDet; newProjData (); + + time_t t = time (NULL); + tm* lt = localtime (&t); + m_year = lt->tm_year; + m_month = lt->tm_mon; + m_day = lt->tm_mday; + m_hour = lt->tm_hour; + m_minute = lt->tm_min; + m_second = lt->tm_sec; } void @@ -90,7 +100,7 @@ Projections::initFromScanner (const Scanner& scanner) #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 } @@ -253,14 +263,15 @@ Projections::headerRead (fnetorderstream& fs) return false; } - char remarkStorage[_remarksize+1]; - fs.read (remarkStorage, _remarksize); + char* pszRemarkStorage = new char [_remarksize+1]; + fs.read (pszRemarkStorage, _remarksize); if (! fs) { sys_error (ERR_SEVERE, "Error reading remark, _remarksize = %d", _remarksize); return false; } - remarkStorage[_remarksize] = 0; - m_remark = remarkStorage; + pszRemarkStorage[_remarksize] = 0; + m_remark = pszRemarkStorage; + delete pszRemarkStorage; off_t _hsizeread = fs.tellg(); if (!fs || _hsizeread != _hsize) { @@ -296,7 +307,7 @@ Projections::headerRead (fnetorderstream& fs) } bool -Projections::read (const string& filename) +Projections::read (const std::string& filename) { return read (filename.c_str()); } @@ -305,10 +316,14 @@ Projections::read (const string& filename) bool Projections::read (const char* filename) { - frnetorderstream fileRead (filename, ios::in | ios::binary); - m_filename = filename; - - if (! fileRead) + m_filename = filename; +#ifdef MSVC + frnetorderstream fileRead (m_filename.c_str(), std::ios::in | std::ios::binary); +#else + frnetorderstream fileRead (m_filename.c_str(), std::ios::in | std::ios::binary | std::ios::nocreate); +#endif + + if (fileRead.fail()) return false; if (! headerRead (fileRead)) @@ -327,8 +342,101 @@ Projections::read (const char* filename) } +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(pViewData), sizeView); + os.write (reinterpret_cast(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(pHdrData), sizeHeader); + if (is.fail()) { + sys_error (ERR_FATAL, "Error reading header"); + return false; + } + + os.write (reinterpret_cast(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()); } @@ -336,24 +444,13 @@ Projections::write (const string& filename) 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); return false; } -#ifdef HAVE_TIME - time_t t = time(NULL); - tm* lt = localtime(&t); - m_year = lt->tm_year; - m_month = lt->tm_mon; - m_day = lt->tm_mday; - m_hour = lt->tm_hour; - m_minute = lt->tm_min; - m_second = lt->tm_sec; -#endif - if (! headerWrite (fs)) return false; @@ -463,7 +560,13 @@ Projections::detarrayWrite (fnetorderstream& fs, const DetectorArray& darray, co */ 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()); @@ -473,18 +576,24 @@ Projections::printProjectionData (void) 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";