X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=libctsim%2Fprojections.cpp;h=49aaa9942b078ea417817adb45789a0de5df26bc;hp=fb24e0d897bf065d9d348a5b09f827eacf1b8b8d;hb=9703ace3c451ce079967284bf191783736dbc77f;hpb=bfcc769cf8019eabc8c65c07257c8dbee4b4c977 diff --git a/libctsim/projections.cpp b/libctsim/projections.cpp index fb24e0d..49aaa99 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.25 2000/09/02 05:10:39 kevin Exp $ +** $Id: projections.cpp,v 1.29 2000/12/16 02:31:00 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 @@ -253,14 +254,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) { @@ -327,6 +329,99 @@ Projections::read (const char* filename) } +bool +Projections::copyViewData (const string& filename, ostream& os, int startView, int endView) +{ + return copyViewData (filename.c_str(), os, startView, endView); +} + +bool +Projections::copyViewData (const char* const filename, 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 (pViewData, sizeView); + os.write (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 string& filename, ostream& os) +{ + return copyHeader (filename.c_str(), os); +} + +bool +Projections::copyHeader (const char* const filename, ostream& os) +{ + frnetorderstream is (filename, ios::in | 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 (pHdrData, sizeHeader); + if (is.fail()) { + sys_error (ERR_FATAL, "Error reading header"); + return false; + } + + os.write (pHdrData, sizeHeader); + if (os.fail()) { + sys_error (ERR_FATAL, "Error writing header"); + return false; + } + + return true; +} + bool Projections::write (const string& filename) { @@ -343,6 +438,7 @@ Projections::write (const char* filename) return false; } +#ifdef HAVE_TIME time_t t = time(NULL); tm* lt = localtime(&t); m_year = lt->tm_year; @@ -351,6 +447,7 @@ Projections::write (const char* filename) m_hour = lt->tm_hour; m_minute = lt->tm_min; m_second = lt->tm_sec; +#endif if (! headerWrite (fs)) return false; @@ -461,7 +558,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()); @@ -471,13 +574,19 @@ 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"); + } } }