** 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
//
/////////////////////////////////////////////////////////////////////
-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),
- m_strFilterMethod(pszFilterMethod), m_iZeropad(iZeropad), m_strFilterGenerationName(pszFilterGenerationName),
- m_strInterpName(pszInterpName), m_iInterpParam(iInterpParam), m_strBackprojectName(pszBackprojectName), m_strLabel(pszLabel),
- SupervisorThread()
+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, wxChar 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_bRebinToParallel(bRebinToParallel)
{
}
wxThread::ExitCode
ReconstructorSupervisorThread::Entry()
{
- ReconstructorSupervisor reconSupervisor (this, 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());
+ 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, &m_reconROI);
reconSupervisor.start();
while (! reconSupervisor.workersDone() && ! reconSupervisor.fail() && ! reconSupervisor.cancelled()) {
}
if (reconSupervisor.fail())
{
- wxString msg ("Error starting reconstructor supervisor: ");
- msg += reconSupervisor.getFailMessage().c_str();
- msg += "\n";
+ wxString msg (_T("Error starting reconstructor supervisor: "));
+ msg += reconSupervisor.getFailMessage();
+ msg += _T("\n");
wxCommandEvent eventLog (wxEVT_COMMAND_MENU_SELECTED, MAINMENU_LOG_EVENT );
eventLog.SetString( msg );
wxPostEvent( theApp->getMainFrame(), eventLog ); // send log event
}
if (! reconSupervisor.cancelled())
- reconSupervisor.onDone();
+ reconSupervisor.onDone();
reconSupervisor.deleteWorkers();
- return reinterpret_cast<wxThread::ExitCode>(0);
+ if (m_bRebinToParallel)
+ delete pProj;
+
+ return static_cast<wxThread::ExitCode>(0);
}
void
//
/////////////////////////////////////////////////////////////////////
-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()),
- m_iImageNX(iImageNX), m_iImageNY(iImageNY),
+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, wxChar const* pszLabel,
+ ReconstructionROI* pROI)
+ : BackgroundSupervisor (pThread, pProjView->GetFrame(), pProjView->GetDocument(),
+ _T("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_strLabel(pszLabel),
+ m_pReconROI(pROI)
{
m_vecpChildImageFile.reserve (getNumWorkers());
for (int iThread = 0; iThread < getNumWorkers(); iThread++) {
- m_vecpChildImageFile[iThread] = new ImageFile (m_iImageNX, m_iImageNY);
+ m_vecpChildImageFile[iThread] = new ImageFile (m_iImageNX, m_iImageNY);
}
}
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;
}
wxCriticalSectionLocker critsect (doneSection);
ImageFile* pImageFile = getImageFile();
- pImageFile->labelAdd (m_pProjView->GetDocument()->getProjections().getLabel());
- pImageFile->labelAdd (m_pszLabel, getTimerEnd());
+ pImageFile->labelAdd (m_pProj->getLabel());
+ pImageFile->labelAdd (m_strLabel.mb_str(wxConvUTF8), getTimerEnd());
wxCommandEvent eventLog (wxEVT_COMMAND_MENU_SELECTED, MAINMENU_LOG_EVENT );
- wxString msg (m_pszLabel);
- msg += "\n";
+ wxString msg (m_strLabel);
+ msg += _T("\n");
eventLog.SetString( msg );
wxPostEvent( theApp->getMainFrame(), eventLog ); // send log event
ImageFile* pImageFile = new ImageFile (m_iImageNX, m_iImageNY);
pImageFile->arrayDataClear();
ImageFileArray pArray = pImageFile->getArray();
-
+
int i;
for (i = 0; i < getNumWorkers(); i++) {
ImageFileArrayConst pChildArray = m_vecpChildImageFile[i]->getArray();
for (int iy = 0; iy < m_iImageNY; iy++)
pArray[ix][iy] += pChildArray[ix][iy];
}
-
+
return (pImageFile);
}
/////////////////////////////////////////////////////////////////////
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* pszFilterGenerationName, const char* pszInterpName, int iInterpParam,
+ const char* pszBackprojectName, ReconstructionROI* pROI)
{
+ m_pProj = pProj;
m_pProjView = pProjView;
m_pImageFile = pImageFile;
m_pszFilterName = pszFilterName;
- m_dFilterParam = dFilterParam;
+ m_dFilterParam = dFilterParam;
m_pszFilterMethod = pszFilterMethod;
m_iZeropad = iZeropad;
m_pszFilterGenerationName = pszFilterGenerationName;
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;
+ wxString failMsg;
if (bFail) {
- failMsg = "Unable to make reconstructor: ";
- failMsg += pReconstructor->failMessage().c_str();
+ failMsg = _T("Unable to make reconstructor: ");
+ failMsg += wxConvUTF8.cMB2WX(pReconstructor->failMessage().c_str());
wxCommandEvent event( wxEVT_COMMAND_MENU_SELECTED, MAINMENU_LOG_EVENT );
- event.SetString( failMsg.c_str() );
+ event.SetString( failMsg );
wxPostEvent( theApp->getMainFrame(), event );
}
else
#ifdef DEBUG
if (theApp->getVerboseLogging()) {
wxString msg;
- msg.Printf("Worker thread: Received destroy message at work unit #%d\n", iUnit);
+ msg.Printf(_T("Worker thread: Received destroy message at work unit #%d\n"), iUnit);
wxCommandEvent event( wxEVT_COMMAND_MENU_SELECTED, MAINMENU_LOG_EVENT );
event.SetString( msg );
- wxPostEvent( theApp->getMainFrame(), event );
+ wxPostEvent( theApp->getMainFrame(), event );
}
#endif
break;
delete pReconstructor;
if (bFail) {
- m_pSupervisor->onWorkerFail (m_iThread, failMsg);
+ m_pSupervisor->onWorkerFail (m_iThread, failMsg);
} else {
- m_pSupervisor->onWorkerDone (m_iThread);
+ m_pSupervisor->onWorkerDone (m_iThread);
}
while (! TestDestroy())