X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=src%2Fthreadproj.cpp;fp=src%2Fthreadproj.cpp;h=2978c61c342ebb6b98cc63c366449e366ecaa6ef;hp=dc96cee4b31b5c5ddb8a6c0392c77cd467284f8b;hb=cb0608392968d4509c0fbcf9b029ac5e5923e171;hpb=df521cfe14a9e0b47bdcd98d1f67d03acf242162 diff --git a/src/threadproj.cpp b/src/threadproj.cpp index dc96cee..2978c61 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.2 2001/02/25 15:27:28 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 @@ -111,11 +111,16 @@ ProjectorSupervisor::ProjectorSupervisor (PhantomFileView* pPhantomView, int iND m_dViewRatio(dViewRatio), m_dScanRatio(dScanRatio), m_pszLabel(pszLabel), BackgroundSupervisor (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_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,13 +129,16 @@ 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_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); return pThread; @@ -169,18 +177,22 @@ 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); + iGlobalView++; + } } -#endif + return (pProjections); } @@ -192,10 +204,12 @@ ProjectorSupervisor::getProjections() ///////////////////////////////////////////////////////////////////// void -ProjectorWorker::SetParameters (PhantomFileView* pPhantomView, Projections* pProjections, int iNDet, int iView, +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) { + m_pScanner = pScanner; m_pPhantomView = pPhantomView; m_pProjections = pProjections; m_pszGeometry = pszGeometry; @@ -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, true, Trace::TRACE_NONE); wxPostEvent (m_pSupervisor, eventProgress); } } - delete pScanner; if (bFail) { wxCommandEvent eventFail (wxEVT_COMMAND_MENU_SELECTED, BackgroundSupervisor::MSG_WORKER_THREAD_FAIL);