//----------------------------------------------------------------------------------------
// 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);
}
Example #2
0
//----------------------------------------------------------------------------------------
// 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);
}