Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Scatter forward projector setter #1530

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions src/include/stir/scatter/ScatterEstimation.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@

#include "stir/stir_math.h"
#include "stir/FilePath.h"
#include <stir/recon_buildblock/ForwardProjectorByBin.h>

START_NAMESPACE_STIR

Expand Down Expand Up @@ -170,6 +171,11 @@ class ScatterEstimation : public ParsingObject
void set_recompute_mask_image(bool arg);
void set_recompute_mask_projdata(bool arg);

//! Sets the forward projector for the scatter estimation
void set_forward_projector_sptr(const shared_ptr<ForwardProjectorByBin> projector_sptr);
//!Get the forward projector used for the scatter estimation
shared_ptr<ForwardProjectorByBin> get_forward_projector_sptr() const;

inline void set_scatter_simulation_method_sptr(const shared_ptr<ScatterSimulation>);

inline void set_num_iterations(int);
Expand Down Expand Up @@ -275,6 +281,8 @@ class ScatterEstimation : public ParsingObject
//! The file name for the attenuation coefficients.
//! If they are to be recalculated they will be stored here, if set.
std::string atten_coeff_filename;
//! ForwardProjector
shared_ptr<ForwardProjectorByBin> forward_projector_sptr;

//! \details the set of parameters to obtain a mask from the attenuation image
/*! The attenuation image will be thresholded to find a plausible mask for where there
Expand Down
32 changes: 25 additions & 7 deletions src/scatter_buildblock/ScatterEstimation.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,10 @@ ScatterEstimation::initialise_keymap()
this->parser.add_key("mask projdata filename", &this->mask_projdata_filename);
this->parser.add_key("tail fitting parameter filename", &this->tail_mask_par_filename);
// END MASK

// Forward projector for mask projection
this->parser.add_parsing_key("forward projector type", &this->forward_projector_sptr);

this->parser.add_key("background projdata filename", &this->back_projdata_filename);
this->parser.add_parsing_key("Normalisation type", &this->norm_3d_sptr);
this->parser.add_key("attenuation correction factors filename", &this->atten_coeff_filename);
Expand Down Expand Up @@ -449,6 +453,18 @@ ScatterEstimation::set_recompute_mask_projdata(bool arg)
this->recompute_mask_projdata = arg;
}

void
ScatterEstimation::set_forward_projector_sptr(const shared_ptr<ForwardProjectorByBin> projector_sptr)
{
this->forward_projector_sptr = projector_sptr;
}

shared_ptr<ForwardProjectorByBin>
ScatterEstimation::get_forward_projector_sptr() const
{
return forward_projector_sptr;
}

bool
ScatterEstimation::already_setup() const
{
Expand Down Expand Up @@ -1235,30 +1251,32 @@ ScatterEstimation::project_mask_image()
}
}

shared_ptr<ForwardProjectorByBin> forw_projector_sptr;
shared_ptr<ProjMatrixByBin> PM(new ProjMatrixByBinUsingRayTracing());
forw_projector_sptr.reset(new ForwardProjectorByBinUsingProjMatrixByBin(PM));
if (!this->forward_projector_sptr)
{
shared_ptr<ProjMatrixByBin> PM(new ProjMatrixByBinUsingRayTracing());
forward_projector_sptr.reset(new ForwardProjectorByBinUsingProjMatrixByBin(PM));
}
info(boost::format("ScatterEstimation: Forward projector used for the calculation of "
"the tail mask: %1%")
% forw_projector_sptr->parameter_info());
% forward_projector_sptr->parameter_info());

shared_ptr<ProjData> mask_projdata;
if (run_in_2d_projdata)
{
forw_projector_sptr->set_up(this->input_projdata_2d_sptr->get_proj_data_info_sptr(), this->mask_image_sptr);
forward_projector_sptr->set_up(this->input_projdata_2d_sptr->get_proj_data_info_sptr(), this->mask_image_sptr);

mask_projdata.reset(new ProjDataInMemory(this->input_projdata_2d_sptr->get_exam_info_sptr(),
this->input_projdata_2d_sptr->get_proj_data_info_sptr()));
}
else
{
forw_projector_sptr->set_up(this->input_projdata_sptr->get_proj_data_info_sptr(), this->mask_image_sptr);
forward_projector_sptr->set_up(this->input_projdata_sptr->get_proj_data_info_sptr(), this->mask_image_sptr);

mask_projdata.reset(new ProjDataInMemory(this->input_projdata_sptr->get_exam_info_sptr(),
this->input_projdata_sptr->get_proj_data_info_sptr()));
}

forw_projector_sptr->forward_project(*mask_projdata, *this->mask_image_sptr);
forward_projector_sptr->forward_project(*mask_projdata, *this->mask_image_sptr);

// add 1 to be able to use create_tail_mask_from_ACFs (which expects ACFs,
// so complains if the threshold is too low)
Expand Down
Loading