X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=src%2Fthreadrecon.cpp;h=fcda848cbc00339ed8ea7b7f59f901d29a7a19e2;hp=a3134a337d393f9abc1f707d19a78dced8039f55;hb=8a7697ce57b56cdc43698cd1241ad98d49f9b5ac;hpb=d77c9d135405e077047ef3426a54470c144cdd34 diff --git a/src/threadrecon.cpp b/src/threadrecon.cpp index a3134a3..fcda848 100644 --- a/src/threadrecon.cpp +++ b/src/threadrecon.cpp @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2001 Kevin Rosenberg ** -** $Id: threadrecon.cpp,v 1.21 2001/03/05 17:26:46 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 @@ -54,20 +54,25 @@ 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) -: m_pProjView(pProjView), m_iNX(iNX), m_iNY(iNY), m_strFilterName(pszFilterName), m_dFilterParam(dFilterParam), + 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), - SupervisorThread() + m_strInterpName(pszInterpName), m_iInterpParam(iInterpParam), m_strBackprojectName(pszBackprojectName), + 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_strInterpName.c_str(), m_iInterpParam, m_strBackprojectName.c_str(), m_strLabel.c_str(), &m_reconROI); reconSupervisor.start(); while (! reconSupervisor.workersDone() && ! reconSupervisor.fail() && ! reconSupervisor.cancelled()) { @@ -86,7 +91,10 @@ ReconstructorSupervisorThread::Entry() reconSupervisor.onDone(); reconSupervisor.deleteWorkers(); - return reinterpret_cast(0); + if (m_bRebinToParallel) + delete pProj; + + return static_cast(0); } void @@ -101,16 +109,18 @@ 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) - : m_pProjView(pProjView), m_pProjDoc(pProjView->GetDocument()), +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_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), - m_iInterpParam(iInterpParam), m_pszBackprojectName(pszBackprojectName), m_pszLabel(pszLabel), - BackgroundSupervisor (pThread, pProjView->GetFrame(), pProjView->GetDocument(), "Reconstructing", pProjView->GetDocument()->getProjections().nView()) + m_iInterpParam(iInterpParam), m_pszBackprojectName(pszBackprojectName), m_pszLabel(pszLabel), + m_pReconROI(pROI) { m_vecpChildImageFile.reserve (getNumWorkers()); for (int iThread = 0; iThread < getNumWorkers(); iThread++) { @@ -131,9 +141,9 @@ 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, - m_iInterpParam, m_pszBackprojectName); + 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; } @@ -145,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 ); @@ -188,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) + const char* pszBackprojectName, ReconstructionROI* pROI) { + m_pProj = pProj; m_pProjView = pProjView; m_pImageFile = pImageFile; m_pszFilterName = pszFilterName; @@ -203,14 +214,15 @@ ReconstructorWorker::SetParameters (ProjectionFileView* pProjView, ImageFile* pI m_pszInterpName = pszInterpName; m_iInterpParam = iInterpParam; m_pszBackprojectName = pszBackprojectName; + m_pReconROI = pROI; } 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); + 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;