r254: Added binary output of projection file elements
[ctsim.git] / libctsim / projections.cpp
index 7fdda64bfd5603d5ebae628a50a484b92ea42278..49aaa9942b078ea417817adb45789a0de5df26bc 100644 (file)
@@ -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.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"
-
+\r
+const kuint16 Projections::m_signature = ('P'*256 + 'J');\r
 
 /* 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;\r
 
   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)
 {
@@ -463,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());
@@ -473,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");
+    }
   }
 }