r254: Added binary output of projection file elements
[ctsim.git] / libctsim / projections.cpp
index 7de82039d629517652649bf741ede6ae4a5f454b..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.28 2000/12/06 01:46:43 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
@@ -329,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)
 {
@@ -465,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());
@@ -475,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");
+    }
   }
 }