r7061: initial property settings
[ctsim.git] / src / threadrecon.cpp
index e8deca41e6809f065135d49d6eaa946d88d7e144..fcda848cbc00339ed8ea7b7f59f901d29a7a19e2 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2001 Kevin Rosenberg
 **
-**  $Id: threadrecon.cpp,v 1.24 2001/03/11 15:27:30 kevin Exp $
+**  $Id$
 **
 **  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
 ReconstructorSupervisorThread::ReconstructorSupervisorThread (ProjectionFileView* pProjView, int iNX, int iNY, 
    const char* pszFilterName, double dFilterParam, const char* pszFilterMethod, int iZeropad, 
    const char* pszFilterGenerationName, const char* pszInterpName, int iInterpParam, 
-   const char* pszBackprojectName, const char* const pszLabel, ReconstructionROI* pROI)
+   const char* pszBackprojectName, const char* const pszLabel, ReconstructionROI* pROI, bool bRebinToParallel)
 :   SupervisorThread(), m_pProjView(pProjView), m_iNX(iNX), m_iNY(iNY), m_strFilterName(pszFilterName), m_dFilterParam(dFilterParam), 
   m_strFilterMethod(pszFilterMethod), m_iZeropad(iZeropad), m_strFilterGenerationName(pszFilterGenerationName), 
   m_strInterpName(pszInterpName), m_iInterpParam(iInterpParam), m_strBackprojectName(pszBackprojectName), 
-  m_strLabel(pszLabel), m_reconROI(*pROI)
+  m_strLabel(pszLabel), m_reconROI(*pROI), m_bRebinToParallel(bRebinToParallel)
 {
 }
 
 wxThread::ExitCode
 ReconstructorSupervisorThread::Entry()
 {
-  ReconstructorSupervisor reconSupervisor (this, m_pProjView, m_iNX, m_iNY, 
+  Projections* pProj = &m_pProjView->GetDocument()->getProjections();
+
+  if (m_bRebinToParallel)
+    pProj = pProj->interpolateToParallel();
+
+  ReconstructorSupervisor reconSupervisor (this, pProj, m_pProjView, m_iNX, m_iNY, 
    m_strFilterName.c_str(), m_dFilterParam, m_strFilterMethod.c_str(), m_iZeropad, m_strFilterGenerationName.c_str(), 
    m_strInterpName.c_str(), m_iInterpParam, m_strBackprojectName.c_str(), m_strLabel.c_str(), &m_reconROI);
 
@@ -86,6 +91,9 @@ ReconstructorSupervisorThread::Entry()
          reconSupervisor.onDone();
   reconSupervisor.deleteWorkers();
 
+  if (m_bRebinToParallel)
+    delete pProj;
+
   return static_cast<wxThread::ExitCode>(0);
 }
 
@@ -101,12 +109,13 @@ ReconstructorSupervisorThread::OnExit()
 //
 /////////////////////////////////////////////////////////////////////
 
-ReconstructorSupervisor::ReconstructorSupervisor (SupervisorThread* pThread, ProjectionFileView* pProjView, 
-  int iImageNX, int iImageNY, const char* pszFilterName, double dFilterParam, const char* pszFilterMethod, 
-  int iZeropad, const char* pszFilterGenerationName, const char* pszInterpName, int iInterpParam,
-  const char* pszBackprojectName, const char* const pszLabel, ReconstructionROI* pROI)
+ReconstructorSupervisor::ReconstructorSupervisor (SupervisorThread* pThread, Projections* pProj,
+  ProjectionFileView* pProjView, int iImageNX, int iImageNY, const char* pszFilterName, double dFilterParam, 
+  const char* pszFilterMethod, int iZeropad, const char* pszFilterGenerationName, 
+  const char* pszInterpName, int iInterpParam, const char* pszBackprojectName, const char* const pszLabel, 
+  ReconstructionROI* pROI)
     : BackgroundSupervisor (pThread, pProjView->GetFrame(), pProjView->GetDocument(), "Reconstructing", pProjView->GetDocument()->getProjections().nView()),
-      m_pProjView(pProjView), m_pProjDoc(pProjView->GetDocument()), 
+      m_pProj(pProj), m_pProjView(pProjView), m_pProjDoc(pProjView->GetDocument()), 
       m_iImageNX(iImageNX), m_iImageNY(iImageNY), 
       m_pszFilterName(pszFilterName), m_dFilterParam(dFilterParam), m_pszFilterMethod(pszFilterMethod),
       m_iZeropad(iZeropad), m_pszFilterGenerationName(pszFilterGenerationName), m_pszInterpName(pszInterpName),
@@ -132,8 +141,8 @@ BackgroundWorkerThread*
 ReconstructorSupervisor::createWorker (int iThread, int iStartUnit, int iNumUnits)
 {
    ReconstructorWorker* pThread = new ReconstructorWorker (this, iThread, iStartUnit, iNumUnits);
-   pThread->SetParameters (m_pProjView, m_vecpChildImageFile[iThread], m_pszFilterName, m_dFilterParam
-     m_pszFilterMethod, m_iZeropad, m_pszFilterGenerationName, m_pszInterpName,
+   pThread->SetParameters (m_pProj, m_pProjView, m_vecpChildImageFile[iThread], m_pszFilterName
+     m_dFilterParam, m_pszFilterMethod, m_iZeropad, m_pszFilterGenerationName, m_pszInterpName,
      m_iInterpParam, m_pszBackprojectName, m_pReconROI);
 
    return pThread;
@@ -146,7 +155,7 @@ ReconstructorSupervisor::onDone()
   wxCriticalSectionLocker critsect (doneSection);
 
   ImageFile* pImageFile = getImageFile();
-  pImageFile->labelAdd (m_pProjView->GetDocument()->getProjections().getLabel());
+  pImageFile->labelAdd (m_pProj->getLabel());
   pImageFile->labelAdd (m_pszLabel, getTimerEnd());
 
   wxCommandEvent eventLog (wxEVT_COMMAND_MENU_SELECTED, MAINMENU_LOG_EVENT );
@@ -189,11 +198,12 @@ ReconstructorSupervisor::getImageFile()
 /////////////////////////////////////////////////////////////////////
 
 void
-ReconstructorWorker::SetParameters (ProjectionFileView* pProjView, ImageFile* pImageFile, 
+ReconstructorWorker::SetParameters (const Projections* pProj, ProjectionFileView* pProjView, ImageFile* pImageFile, 
  const char* pszFilterName, double dFilterParam, const char* pszFilterMethod, int iZeropad,
  const char* pszFilterGenerationName, const char* pszInterpName, int iInterpParam, 
  const char* pszBackprojectName, ReconstructionROI* pROI)
 {
+   m_pProj = pProj;
    m_pProjView = pProjView;
    m_pImageFile = pImageFile;
    m_pszFilterName = pszFilterName;
@@ -210,10 +220,9 @@ ReconstructorWorker::SetParameters (ProjectionFileView* pProjView, ImageFile* pI
 wxThread::ExitCode
 ReconstructorWorker::Entry ()
 {
-  Reconstructor* pReconstructor = new Reconstructor (m_pProjView->GetDocument()->getProjections(), 
-    *m_pImageFile, m_pszFilterName, m_dFilterParam, m_pszFilterMethod, m_iZeropad, 
-    m_pszFilterGenerationName, m_pszInterpName, m_iInterpParam, m_pszBackprojectName, Trace::TRACE_NONE,
-    m_pReconROI);
+  Reconstructor* pReconstructor = new Reconstructor (*m_pProj, *m_pImageFile, m_pszFilterName, 
+    m_dFilterParam, m_pszFilterMethod, m_iZeropad, m_pszFilterGenerationName, m_pszInterpName, 
+    m_iInterpParam, m_pszBackprojectName, Trace::TRACE_NONE, m_pReconROI, false);
 
   bool bFail = pReconstructor->fail();
   std::string failMsg;