X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=src%2Fthreadproj.cpp;h=c4fa9aeabdbad87ae5b86a1c03bc09b4f90abd7c;hp=dc96cee4b31b5c5ddb8a6c0392c77cd467284f8b;hb=c953cbb6ffc2fd50e736230f4e6976a025983cff;hpb=df521cfe14a9e0b47bdcd98d1f67d03acf242162 diff --git a/src/threadproj.cpp b/src/threadproj.cpp index dc96cee..c4fa9ae 100644 --- a/src/threadproj.cpp +++ b/src/threadproj.cpp @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2001 Kevin Rosenberg ** -** $Id: threadproj.cpp,v 1.1 2001/02/25 10:52:55 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 @@ -52,11 +52,11 @@ ///////////////////////////////////////////////////////////////////// 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,20 +102,25 @@ 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_dCenterDetectorLength, m_dViewRatio, m_dScanRatio); + m_vecpChildProjections.reserve (getNumWorkers()); for (unsigned int iThread = 0; iThread < getNumWorkers(); iThread++) { - m_vecpChildProjections[iThread] = new Projections (m_iNDet, m_iNView); + m_vecpChildProjections[iThread] = new Projections (*m_pScanner); } + + } ProjectorSupervisor::~ProjectorSupervisor() @@ -124,14 +129,17 @@ ProjectorSupervisor::~ProjectorSupervisor() delete m_vecpChildProjections[i]; m_vecpChildProjections[i] = NULL; } + + delete m_pScanner; } BackgroundWorkerThread* ProjectorSupervisor::createWorker (int iThread, int iStartUnit, int iNumUnits) { ProjectorWorker* pThread = new ProjectorWorker (this, iThread, iStartUnit, iNumUnits); - pThread->SetParameters (m_pPhantomView, m_vecpChildProjections[iThread], m_iNDet, m_iNView, - m_pszGeometry, m_iNSample, m_dRotation, m_dFocalLength, m_dViewRatio, m_dScanRatio); + 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_dCenterDetectorLength, m_dViewRatio, m_dScanRatio); return pThread; } @@ -169,18 +177,21 @@ ProjectorSupervisor::onDone() Projections* ProjectorSupervisor::getProjections() { - Projections* pProjections = new Projections (m_iNDet, m_iNView); -#if 0 - ImageFileArray pArray = pImageFile->getArray(); - - int i; - for (i = 0; i < getNumWorkers(); i++) { - ImageFileArrayConst pChildArray = m_vecpChildImageFile[i]->getArray(); - for (int ix = 0; ix < m_iImageNX; ix++) - for (int iy = 0; iy < m_iImageNY; iy++) - pArray[ix][iy] += pChildArray[ix][iy]; + Projections* pProjections = new Projections (*m_pScanner); + + int iGlobalView = 0; + size_t detArraySize = pProjections->nDet() * sizeof (DetectorValue); + 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++); + globalDetArray.setViewAngle (childDetArray.viewAngle()); + DetectorValue* childDetval = childDetArray.detValues(); + DetectorValue* globalDetval = globalDetArray.detValues(); + memcpy (globalDetval, childDetval, detArraySize); + } } -#endif + return (pProjections); } @@ -192,15 +203,18 @@ ProjectorSupervisor::getProjections() ///////////////////////////////////////////////////////////////////// void -ProjectorWorker::SetParameters (PhantomFileView* pPhantomView, Projections* pProjections, int iNDet, int iView, - const char* pszGeometry, int iNSample, double dRotation, double dFocalLength, double dViewRatio, - double dScanRatio) +ProjectorWorker::SetParameters (PhantomFileView* pPhantomView, Projections* pProjections, Scanner* pScanner, + int iNDet, int iView, + const char* pszGeometry, int iNSample, double dRotation, double dFocalLength, double dCenterDetectorLength, + double dViewRatio, double dScanRatio) { + m_pScanner = pScanner; m_pPhantomView = pPhantomView; m_pProjections = pProjections; m_pszGeometry = pszGeometry; m_iNSample = iNSample; m_dFocalLength = dFocalLength; + m_dCenterDetectorLength = dCenterDetectorLength; m_dViewRatio = dViewRatio; m_dScanRatio = dScanRatio; } @@ -209,14 +223,11 @@ wxThread::ExitCode ProjectorWorker::Entry () { const Phantom& rPhantom = m_pPhantomView->GetDocument()->getPhantom(); - Scanner* pScanner = new Scanner (rPhantom, m_pszGeometry, m_iNDet, - m_iNView, m_iNSample, m_dRotation, m_dFocalLength, m_dViewRatio, m_dScanRatio); - - bool bFail = pScanner->fail(); + bool bFail = m_pScanner->fail(); wxString failMsg; if (bFail) { failMsg = "Unable to make Projector: "; - failMsg += pScanner->failMessage().c_str(); + failMsg += m_pScanner->failMessage().c_str(); wxCommandEvent event( wxEVT_COMMAND_MENU_SELECTED, MAINMENU_LOG_EVENT ); event.SetString( failMsg ); wxPostEvent( theApp->getMainFrame(), event ); @@ -237,11 +248,10 @@ ProjectorWorker::Entry () #endif break; } - pScanner->collectProjections (*m_pProjections, rPhantom, iUnit + m_iStartUnit, 1, true, Trace::TRACE_NONE); + m_pScanner->collectProjections (*m_pProjections, rPhantom, iUnit + m_iStartUnit, 1, iUnit, Trace::TRACE_NONE); wxPostEvent (m_pSupervisor, eventProgress); } } - delete pScanner; if (bFail) { wxCommandEvent eventFail (wxEVT_COMMAND_MENU_SELECTED, BackgroundSupervisor::MSG_WORKER_THREAD_FAIL);