r591: Added Center-Detector length to scanning and reconstruction
[ctsim.git] / src / threadproj.cpp
index db6070c1484a8a5b12bd92ddc9fb228556aca137..c4fa9aeabdbad87ae5b86a1c03bc09b4f90abd7c 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2001 Kevin Rosenberg
 **
-**  $Id: threadproj.cpp,v 1.3 2001/02/25 16:21:36 kevin Exp $
+**  $Id: threadproj.cpp,v 1.6 2001/03/01 07:30:49 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
 /////////////////////////////////////////////////////////////////////
 
 ProjectorSupervisorThread::ProjectorSupervisorThread (PhantomFileView* pProjView, int iNDet, int iNView, 
-   const char* pszGeometry, int iNSample, double dRotation, double dFocalLength, double dViewRatio, 
-   double dScanRatio, const char* const pszLabel)
+   const char* pszGeometry, int iNSample, double dRotation, double dFocalLength, double dCenterDetectorLength,
+   double dViewRatio, double dScanRatio, const char* const pszLabel)
 : m_pPhantomView(pProjView), m_iNDet(iNDet), m_iNView(iNView), m_strGeometry(pszGeometry), 
-  m_iNSample(iNSample), m_dRotation(dRotation), m_dFocalLength(dFocalLength), m_dViewRatio(dViewRatio),
-  m_dScanRatio(dScanRatio), m_strLabel(pszLabel),
+  m_iNSample(iNSample), m_dRotation(dRotation), m_dFocalLength(dFocalLength), m_dCenterDetectorLength(dCenterDetectorLength),
+  m_dViewRatio(dViewRatio), m_dScanRatio(dScanRatio), m_strLabel(pszLabel),
   SupervisorThread()
 {
 }
@@ -64,12 +64,12 @@ ProjectorSupervisorThread::ProjectorSupervisorThread (PhantomFileView* pProjView
 wxThread::ExitCode
 ProjectorSupervisorThread::Entry()
 {
-  ProjectorSupervisor projSupervisor (m_pPhantomView, m_iNDet, m_iNView, 
-   m_strGeometry.c_str(), m_iNSample, m_dRotation, m_dFocalLength, m_dViewRatio, m_dScanRatio, m_strLabel.c_str());
+  ProjectorSupervisor projSupervisor (this, m_pPhantomView, m_iNDet, m_iNView, 
+   m_strGeometry.c_str(), m_iNSample, m_dRotation, m_dFocalLength, m_dCenterDetectorLength, m_dViewRatio, m_dScanRatio, m_strLabel.c_str());
 
   projSupervisor.start();
   while (! projSupervisor.isDone() && ! projSupervisor.fail()) {
-    Sleep(50);
+    Sleep(100);
     Yield();
   }
   if (projSupervisor.fail())
@@ -102,17 +102,17 @@ ProjectorSupervisorThread::OnExit()
 //
 /////////////////////////////////////////////////////////////////////
 
-ProjectorSupervisor::ProjectorSupervisor (PhantomFileView* pPhantomView, int iNDet, int iNView, 
-   const char* pszGeometry, int iNSample, double dRotation, double dFocalLength, double dViewRatio, 
-   double dScanRatio, const char* const pszLabel)
+ProjectorSupervisor::ProjectorSupervisor (SupervisorThread* pThread, PhantomFileView* pPhantomView, int iNDet, int iNView, 
+   const char* pszGeometry, int iNSample, double dRotation, double dFocalLength, double dCenterDetectorLength,
+   double dViewRatio, double dScanRatio, const char* const pszLabel)
     : m_pPhantomView(pPhantomView), m_pPhantomDoc(pPhantomView->GetDocument()), 
       m_iNDet(iNDet), m_iNView(iNView),
       m_pszGeometry(pszGeometry), m_iNSample(iNSample), m_dRotation(dRotation), m_dFocalLength(dFocalLength),
-      m_dViewRatio(dViewRatio), m_dScanRatio(dScanRatio), m_pszLabel(pszLabel), 
-      BackgroundSupervisor (pPhantomView->GetFrame(), pPhantomView->GetDocument(), "Projecting", iNView)
+      m_dCenterDetectorLength(dCenterDetectorLength), m_dViewRatio(dViewRatio), m_dScanRatio(dScanRatio), m_pszLabel(pszLabel), 
+      BackgroundSupervisor (pThread, pPhantomView->GetFrame(), pPhantomView->GetDocument(), "Projecting", iNView)
 {
   m_pScanner = new Scanner (m_pPhantomDoc->getPhantom(), m_pszGeometry, m_iNDet,
-                  m_iNView, m_iNSample, m_dRotation, m_dFocalLength, m_dViewRatio, m_dScanRatio);
+                  m_iNView, m_iNSample, m_dRotation, m_dFocalLength, m_dCenterDetectorLength, m_dViewRatio, m_dScanRatio);
 
   m_vecpChildProjections.reserve (getNumWorkers());
   for (unsigned int iThread = 0; iThread < getNumWorkers(); iThread++) {
@@ -139,7 +139,7 @@ ProjectorSupervisor::createWorker (int iThread, int iStartUnit, int iNumUnits)
    ProjectorWorker* pThread = new ProjectorWorker (this, iThread, iStartUnit, iNumUnits);
    m_vecpChildProjections[iThread]->setNView (iNumUnits);
    pThread->SetParameters (m_pPhantomView, m_vecpChildProjections[iThread], m_pScanner, m_iNDet, m_iNView, 
-     m_pszGeometry, m_iNSample, m_dRotation, m_dFocalLength, m_dViewRatio, m_dScanRatio);
+     m_pszGeometry, m_iNSample, m_dRotation, m_dFocalLength, m_dCenterDetectorLength, m_dViewRatio, m_dScanRatio);
 
    return pThread;
 }
@@ -184,12 +184,11 @@ ProjectorSupervisor::getProjections()
   for (int iw = 0; iw < getNumWorkers(); iw++) {
     for (int iView = 0; iView < m_vecpChildProjections[iw]->nView(); iView++) {
       DetectorArray& childDetArray = m_vecpChildProjections[iw]->getDetectorArray(iView);
-      DetectorArray& globalDetArray = pProjections->getDetectorArray(iGlobalView);
+      DetectorArray& globalDetArray = pProjections->getDetectorArray(iGlobalView++);
       globalDetArray.setViewAngle (childDetArray.viewAngle());
       DetectorValue* childDetval = childDetArray.detValues();
       DetectorValue* globalDetval = globalDetArray.detValues();
       memcpy (globalDetval, childDetval, detArraySize);
-      iGlobalView++;
     }
   }
 
@@ -206,8 +205,8 @@ ProjectorSupervisor::getProjections()
 void
 ProjectorWorker::SetParameters (PhantomFileView* pPhantomView, Projections* pProjections, Scanner* pScanner,
  int iNDet, int iView,
- const char* pszGeometry, int iNSample, double dRotation, double dFocalLength, double dViewRatio,
- double dScanRatio)
+ const char* pszGeometry, int iNSample, double dRotation, double dFocalLength, double dCenterDetectorLength,
+ double dViewRatio, double dScanRatio)
 {
    m_pScanner = pScanner;
    m_pPhantomView = pPhantomView;
@@ -215,6 +214,7 @@ ProjectorWorker::SetParameters (PhantomFileView* pPhantomView, Projections* pPro
    m_pszGeometry = pszGeometry;
    m_iNSample = iNSample;
    m_dFocalLength = dFocalLength;
+   m_dCenterDetectorLength = dCenterDetectorLength;
    m_dViewRatio = dViewRatio;
    m_dScanRatio = dScanRatio;
 }