//---------------------------------------------------------------------------------------- // Iterate void CSirtAlgorithm::run(int _iNrIterations) { // check initialized ASTRA_ASSERT(m_bIsInitialized); m_bShouldAbort = false; int iIteration = 0; // data projectors CDataProjectorInterface* pForwardProjector; CDataProjectorInterface* pBackProjector; CDataProjectorInterface* pFirstForwardProjector; m_pTotalRayLength->setData(0.0f); m_pTotalPixelWeight->setData(0.0f); // forward projection data projector pForwardProjector = dispatchDataProjector( m_pProjector, SinogramMaskPolicy(m_pSinogramMask), // sinogram mask ReconstructionMaskPolicy(m_pReconstructionMask), // reconstruction mask DiffFPPolicy(m_pReconstruction, m_pDiffSinogram, m_pSinogram), // forward projection with difference calculation m_bUseSinogramMask, m_bUseReconstructionMask, true // options on/off ); // backprojection data projector pBackProjector = dispatchDataProjector( m_pProjector, SinogramMaskPolicy(m_pSinogramMask), // sinogram mask ReconstructionMaskPolicy(m_pReconstructionMask), // reconstruction mask DefaultBPPolicy(m_pTmpVolume, m_pDiffSinogram), // backprojection m_bUseSinogramMask, m_bUseReconstructionMask, true // options on/off ); // first time forward projection data projector, // also computes total pixel weight and total ray length pFirstForwardProjector = dispatchDataProjector( m_pProjector, SinogramMaskPolicy(m_pSinogramMask), // sinogram mask ReconstructionMaskPolicy(m_pReconstructionMask), // reconstruction mask Combine3Policy<DiffFPPolicy, TotalPixelWeightPolicy, TotalRayLengthPolicy>( // 3 basic operations DiffFPPolicy(m_pReconstruction, m_pDiffSinogram, m_pSinogram), // forward projection with difference calculation TotalPixelWeightPolicy(m_pTotalPixelWeight), // calculate the total pixel weights TotalRayLengthPolicy(m_pTotalRayLength)), // calculate the total ray lengths m_bUseSinogramMask, m_bUseReconstructionMask, true // options on/off ); // forward projection, difference calculation and raylength/pixelweight computation pFirstForwardProjector->project(); float32* pfT = m_pTotalPixelWeight->getData(); for (int i = 0; i < m_pTotalPixelWeight->getSize(); ++i) { float32 x = pfT[i]; if (x < -eps || x > eps) x = 1.0f / x; else x = 0.0f; pfT[i] = x; } pfT = m_pTotalRayLength->getData(); for (int i = 0; i < m_pTotalRayLength->getSize(); ++i) { float32 x = pfT[i]; if (x < -eps || x > eps) x = 1.0f / x; else x = 0.0f; pfT[i] = x; } // divide by line weights (*m_pDiffSinogram) *= (*m_pTotalRayLength); // backprojection m_pTmpVolume->setData(0.0f); pBackProjector->project(); // divide by pixel weights (*m_pTmpVolume) *= (*m_pTotalPixelWeight); (*m_pReconstruction) += (*m_pTmpVolume); if (m_bUseMinConstraint) m_pReconstruction->clampMin(m_fMinValue); if (m_bUseMaxConstraint) m_pReconstruction->clampMax(m_fMaxValue); // update iteration count m_iIterationCount++; iIteration++; // iteration loop for (; iIteration < _iNrIterations && !m_bShouldAbort; ++iIteration) { // forward projection and difference calculation pForwardProjector->project(); // divide by line weights (*m_pDiffSinogram) *= (*m_pTotalRayLength); // backprojection m_pTmpVolume->setData(0.0f); pBackProjector->project(); // divide by pixel weights (*m_pTmpVolume) *= (*m_pTotalPixelWeight); (*m_pReconstruction) += (*m_pTmpVolume); if (m_bUseMinConstraint) m_pReconstruction->clampMin(m_fMinValue); if (m_bUseMaxConstraint) m_pReconstruction->clampMax(m_fMaxValue); // update iteration count m_iIterationCount++; } ASTRA_DELETE(pForwardProjector); ASTRA_DELETE(pBackProjector); ASTRA_DELETE(pFirstForwardProjector); }
//---------------------------------------------------------------------------------------- // Iterate void CSirtAlgorithm::run(int _iNrIterations) { // check initialized ASTRA_ASSERT(m_bIsInitialized); m_bShouldAbort = false; // data projectors CDataProjectorInterface* pForwardProjector; CDataProjectorInterface* pBackProjector; CDataProjectorInterface* pFirstForwardProjector; // Initialize m_pReconstruction to zero. if (m_bClearReconstruction) { m_pReconstruction->setData(0.f); } // forward projection data projector pForwardProjector = dispatchDataProjector( m_pProjector, SinogramMaskPolicy(m_pSinogramMask), // sinogram mask ReconstructionMaskPolicy(m_pReconstructionMask), // reconstruction mask DiffFPPolicy(m_pReconstruction, m_pDiffSinogram, m_pSinogram), // forward projection with difference calculation m_bUseSinogramMask, m_bUseReconstructionMask, true // options on/off ); // backprojection data projector pBackProjector = dispatchDataProjector( m_pProjector, SinogramMaskPolicy(m_pSinogramMask), // sinogram mask ReconstructionMaskPolicy(m_pReconstructionMask), // reconstruction mask SIRTBPPolicy(m_pReconstruction, m_pDiffSinogram, m_pTotalPixelWeight, m_pTotalRayLength, m_fAlpha), // SIRT backprojection m_bUseSinogramMask, m_bUseReconstructionMask, true // options on/off ); // first time forward projection data projector, // also computes total pixel weight and total ray length pFirstForwardProjector = dispatchDataProjector( m_pProjector, SinogramMaskPolicy(m_pSinogramMask), // sinogram mask ReconstructionMaskPolicy(m_pReconstructionMask), // reconstruction mask Combine3Policy<DiffFPPolicy, TotalPixelWeightPolicy, TotalRayLengthPolicy>( // 3 basic operations DiffFPPolicy(m_pReconstruction, m_pDiffSinogram, m_pSinogram), // forward projection with difference calculation TotalPixelWeightPolicy(m_pTotalPixelWeight), // calculate the total pixel weights TotalRayLengthPolicy(m_pTotalRayLength)), // calculate the total ray lengths m_bUseSinogramMask, m_bUseReconstructionMask, true // options on/off ); // Perform the first forward projection to compute ray lengths and pixel weights m_pTotalRayLength->setData(0.0f); m_pTotalPixelWeight->setData(0.0f); pFirstForwardProjector->project(); // iteration loop, each iteration loops over all available projections for (int iIteration = 0; iIteration < _iNrIterations && !m_bShouldAbort; ++iIteration) { // start timer m_ulTimer = CPlatformDepSystemCode::getMSCount(); // forward projection to compute differences. pForwardProjector->project(); // backprojection pBackProjector->project(); // update iteration count m_iIterationCount++; if (m_bUseMinConstraint) m_pReconstruction->clampMin(m_fMinValue); if (m_bUseMaxConstraint) m_pReconstruction->clampMax(m_fMaxValue); // end timer m_ulTimer = CPlatformDepSystemCode::getMSCount() - m_ulTimer; // Compute metrics. computeIterationMetrics(iIteration, _iNrIterations, m_pDiffSinogram); } ASTRA_DELETE(pForwardProjector); ASTRA_DELETE(pBackProjector); ASTRA_DELETE(pFirstForwardProjector); //// check initialized //ASTRA_ASSERT(m_bIsInitialized); //m_bShouldAbort = false; //int iIteration = 0; //// data projectors //CDataProjectorInterface* pForwardProjector; //CDataProjectorInterface* pBackProjector; //CDataProjectorInterface* pFirstForwardProjector; //m_pTotalRayLength->setData(0.0f); //m_pTotalPixelWeight->setData(0.0f); //// forward projection data projector //pForwardProjector = dispatchDataProjector( // m_pProjector, // SinogramMaskPolicy(m_pSinogramMask), // sinogram mask // ReconstructionMaskPolicy(m_pReconstructionMask), // reconstruction mask // DiffFPPolicy(m_pReconstruction, m_pDiffSinogram, m_pSinogram), // forward projection with difference calculation // m_bUseSinogramMask, m_bUseReconstructionMask, true // options on/off // ); //// backprojection data projector //pBackProjector = dispatchDataProjector( // m_pProjector, // SinogramMaskPolicy(m_pSinogramMask), // sinogram mask // ReconstructionMaskPolicy(m_pReconstructionMask), // reconstruction mask // DefaultBPPolicy(m_pTmpVolume, m_pDiffSinogram), // backprojection // m_bUseSinogramMask, m_bUseReconstructionMask, true // options on/off // ); //// first time forward projection data projector, //// also computes total pixel weight and total ray length //pFirstForwardProjector = dispatchDataProjector( // m_pProjector, // SinogramMaskPolicy(m_pSinogramMask), // sinogram mask // ReconstructionMaskPolicy(m_pReconstructionMask), // reconstruction mask // Combine3Policy<DiffFPPolicy, TotalPixelWeightPolicy, TotalRayLengthPolicy>( // 3 basic operations // DiffFPPolicy(m_pReconstruction, m_pDiffSinogram, m_pSinogram), // forward projection with difference calculation // TotalPixelWeightPolicy(m_pTotalPixelWeight), // calculate the total pixel weights // TotalRayLengthPolicy(m_pTotalRayLength)), // calculate the total ray lengths // m_bUseSinogramMask, m_bUseReconstructionMask, true // options on/off // ); //// forward projection, difference calculation and raylength/pixelweight computation //pFirstForwardProjector->project(); //float32* pfT = m_pTotalPixelWeight->getData(); //for (int i = 0; i < m_pTotalPixelWeight->getSize(); ++i) { // float32 x = pfT[i]; // if (x < -eps || x > eps) // x = 1.0f / x; // else // x = 0.0f; // pfT[i] = x; //} //pfT = m_pTotalRayLength->getData(); //for (int i = 0; i < m_pTotalRayLength->getSize(); ++i) { // float32 x = pfT[i]; // if (x < -eps || x > eps) // x = 1.0f / x; // else // x = 0.0f; // pfT[i] = x; //} //// divide by line weights //(*m_pDiffSinogram) *= (*m_pTotalRayLength); //// backprojection //m_pTmpVolume->setData(0.0f); //pBackProjector->project(); //// divide by pixel weights //(*m_pTmpVolume) *= (*m_pTotalPixelWeight); //(*m_pReconstruction) += (*m_pTmpVolume); //if (m_bUseMinConstraint) // m_pReconstruction->clampMin(m_fMinValue); //if (m_bUseMaxConstraint) // m_pReconstruction->clampMax(m_fMaxValue); //// update iteration count //m_iIterationCount++; //iIteration++; // //// iteration loop //for (; iIteration < _iNrIterations && !m_bShouldAbort; ++iIteration) { // // forward projection and difference calculation // pForwardProjector->project(); // // divide by line weights // (*m_pDiffSinogram) *= (*m_pTotalRayLength); // // backprojection // m_pTmpVolume->setData(0.0f); // pBackProjector->project(); // // divide by pixel weights // (*m_pTmpVolume) *= (*m_pTotalPixelWeight); // (*m_pReconstruction) += (*m_pTmpVolume); // if (m_bUseMinConstraint) // m_pReconstruction->clampMin(m_fMinValue); // if (m_bUseMaxConstraint) // m_pReconstruction->clampMax(m_fMaxValue); // // update iteration count // m_iIterationCount++; //} //ASTRA_DELETE(pForwardProjector); //ASTRA_DELETE(pBackProjector); //ASTRA_DELETE(pFirstForwardProjector); }