r586: *** empty log message ***
[ctsim.git] / src / threadproj.cpp
index dc96cee4b31b5c5ddb8a6c0392c77cd467284f8b..dfdf2be26e43ceee7ed28b8464e937cb1e0d6a58 100644 (file)
@@ -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.4 2001/02/25 19:24:01 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
@@ -64,12 +64,12 @@ ProjectorSupervisorThread::ProjectorSupervisorThread (PhantomFileView* pProjView
 wxThread::ExitCode
 ProjectorSupervisorThread::Entry()
 {
-  ProjectorSupervisor projSupervisor (m_pPhantomView, m_iNDet, m_iNView, 
+  ProjectorSupervisor projSupervisor (this, m_pPhantomView, m_iNDet, m_iNView, 
    m_strGeometry.c_str(), m_iNSample, m_dRotation, m_dFocalLength, 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, 
+ProjectorSupervisor::ProjectorSupervisor (SupervisorThread* pThread, PhantomFileView* pPhantomView, int iNDet, int iNView, 
    const char* pszGeometry, int iNSample, double dRotation, double dFocalLength, 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)
+      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_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, iUnit, Trace::TRACE_NONE);
       wxPostEvent (m_pSupervisor, eventProgress);
     }
   }
-  delete pScanner;
 
   if (bFail) {
     wxCommandEvent eventFail (wxEVT_COMMAND_MENU_SELECTED, BackgroundSupervisor::MSG_WORKER_THREAD_FAIL);