void run() { auto input_image = Image<float>::open (argument[0]); Eigen::MatrixXd grad = DWI::get_valid_DW_scheme (input_image); // Want to support non-shell-like data if it's just a straight extraction // of all dwis or all bzeros i.e. don't initialise the Shells class std::vector<int> volumes; bool bzero = get_options ("bzero").size(); auto opt = get_options ("shell"); if (opt.size()) { DWI::Shells shells (grad); shells.select_shells (false, false); for (size_t s = 0; s != shells.count(); ++s) { DEBUG ("Including data from shell b=" + str(shells[s].get_mean()) + " +- " + str(shells[s].get_stdev())); for (const auto v : shells[s].get_volumes()) volumes.push_back (v); } bzero = (shells.count() == 1 && shells[0].is_bzero()); } else { const float bzero_threshold = File::Config::get_float ("BValueThreshold", 10.0); for (ssize_t row = 0; row != grad.rows(); ++row) { if ((bzero && (grad (row, 3) < bzero_threshold)) || (!bzero && (grad (row, 3) > bzero_threshold))) volumes.push_back (row); } } if (volumes.empty()) { auto type = (bzero) ? "b=0" : "dwi"; throw Exception ("No " + str(type) + " volumes present"); } std::sort (volumes.begin(), volumes.end()); Header header (input_image); Stride::set_from_command_line (header); header.size (3) = volumes.size(); Eigen::MatrixXd new_grad (volumes.size(), grad.cols()); for (size_t i = 0; i < volumes.size(); i++) new_grad.row (i) = grad.row (volumes[i]); header.set_DW_scheme (new_grad); auto output_image = Image<float>::create (argument[1], header); auto input_volumes = Adapter::make<Adapter::Extract1D> (input_image, 3, volumes); threaded_copy_with_progress_message ("extracting volumes", input_volumes, output_image); }
void run () { try { auto directions = DWI::Directions::load_cartesian (argument[0]); report (argument[0], directions); } catch (Exception& E) { auto directions = load_matrix<double> (argument[0]); DWI::normalise_grad (directions); if (directions.cols() < 3) throw Exception ("unexpected matrix size for DW scheme \"" + str(argument[0]) + "\""); print (str(argument[0]) + " [ " + str(directions.rows()) + " volumes ]\n"); DWI::Shells shells (directions); for (size_t n = 0; n < shells.count(); ++n) { Eigen::MatrixXd subset (shells[n].count(), 3); for (ssize_t i = 0; i < subset.rows(); ++i) subset.row(i) = directions.row(shells[n].get_volumes()[i]).head(3); report ("\nb = " + str(shells[n].get_mean(), precision), subset); } } }
void run () { try { Math::Matrix<value_type> directions = DWI::Directions::load_cartesian<value_type> (argument[0]); report (str(argument[0]), directions); } catch (Exception& E) { Math::Matrix<value_type> directions (str(argument[0])); DWI::normalise_grad (directions); if (directions.columns() < 3) throw Exception ("unexpected matrix size for DW scheme \"" + str(argument[0]) + "\""); print (str(argument[0]) + " [ " + str(directions.rows()) + " volumes ]\n"); DWI::Shells shells (directions); for (size_t n = 0; n < shells.count(); ++n) { Math::Matrix<value_type> subset (shells[n].count(), 3); for (size_t i = 0; i < subset.rows(); ++i) subset.row(i) = directions.row(shells[n].get_volumes()[i]).sub(0,3); report ("\nb = " + str(shells[n].get_mean()), subset); } } }
void run() { auto input_image = Image<float>::open (argument[0]).with_direct_io (3); Eigen::MatrixXd grad = DWI::get_valid_DW_scheme (input_image); // Want to support non-shell-like data if it's just a straight extraction // of all dwis or all bzeros i.e. don't initialise the Shells class std::vector<size_t> volumes; bool bzero = get_options ("bzero").size(); auto opt = get_options ("shell"); if (opt.size()) { DWI::Shells shells (grad); shells.select_shells (false, false); for (size_t s = 0; s != shells.count(); ++s) { DEBUG ("Including data from shell b=" + str(shells[s].get_mean()) + " +- " + str(shells[s].get_stdev())); for (std::vector<size_t>::const_iterator v = shells[s].get_volumes().begin(); v != shells[s].get_volumes().end(); ++v) volumes.push_back (*v); } // Remove DW information from header if b=0 is the only 'shell' selected bzero = (shells.count() == 1 && shells[0].is_bzero()); } else { const float bzero_threshold = File::Config::get_float ("BValueThreshold", 10.0); for (ssize_t row = 0; row != grad.rows(); ++row) { if ((bzero && (grad (row, 3) < bzero_threshold)) || (!bzero && (grad (row, 3) > bzero_threshold))) volumes.push_back (row); } } if (volumes.empty()) { auto type = (bzero) ? "b=0" : "dwi"; throw Exception ("No " + str(type) + " volumes present"); } std::sort (volumes.begin(), volumes.end()); Header header (input_image); if (volumes.size() == 1) header.set_ndim (3); else header.size (3) = volumes.size(); Eigen::MatrixXd new_grad (volumes.size(), grad.cols()); for (size_t i = 0; i < volumes.size(); i++) new_grad.row (i) = grad.row (volumes[i]); header.set_DW_scheme (new_grad); auto output_image = Image<float>::create (argument[1], header); auto outer = Loop ("extracting volumes", input_image, 0, 3); if (output_image.ndim() == 4) { for (auto i = outer (output_image, input_image); i; ++i) { for (size_t i = 0; i < volumes.size(); i++) { input_image.index(3) = volumes[i]; output_image.index(3) = i; output_image.value() = input_image.value(); } } } else { const size_t volume = volumes[0]; for (auto i = outer (output_image, input_image); i; ++i) { input_image.index(3) = volume; output_image.value() = input_image.value(); } } }
void run() { Image::BufferPreload<float> data_in (argument[0], Image::Stride::contiguous_along_axis (3)); auto voxel_in = data_in.voxel(); Math::Matrix<value_type> grad (DWI::get_valid_DW_scheme<float> (data_in)); // Want to support non-shell-like data if it's just a straight extraction // of all dwis or all bzeros i.e. don't initialise the Shells class std::vector<size_t> volumes; bool bzero = get_options ("bzero").size(); Options opt = get_options ("shell"); if (opt.size()) { DWI::Shells shells (grad); shells.select_shells (false, false); for (size_t s = 0; s != shells.count(); ++s) { DEBUG ("Including data from shell b=" + str(shells[s].get_mean()) + " +- " + str(shells[s].get_stdev())); for (std::vector<size_t>::const_iterator v = shells[s].get_volumes().begin(); v != shells[s].get_volumes().end(); ++v) volumes.push_back (*v); } // Remove DW information from header if b=0 is the only 'shell' selected bzero = (shells.count() == 1 && shells[0].is_bzero()); } else { const float bzero_threshold = File::Config::get_float ("BValueThreshold", 10.0); for (size_t row = 0; row != grad.rows(); ++row) { if ((bzero && (grad (row, 3) < bzero_threshold)) || (!bzero && (grad (row, 3) > bzero_threshold))) volumes.push_back (row); } } if (volumes.empty()) throw Exception ("No " + str(bzero ? "b=0" : "dwi") + " volumes present"); std::sort (volumes.begin(), volumes.end()); Image::Header header (data_in); if (volumes.size() == 1) header.set_ndim (3); else header.dim (3) = volumes.size(); Math::Matrix<value_type> new_grad (volumes.size(), grad.columns()); for (size_t i = 0; i < volumes.size(); i++) new_grad.row (i) = grad.row (volumes[i]); header.DW_scheme() = new_grad; Image::Buffer<value_type> data_out (argument[1], header); auto voxel_out = data_out.voxel(); Image::Loop outer ("extracting volumes...", 0, 3); if (voxel_out.ndim() == 4) { for (auto i = outer (voxel_out, voxel_in); i; ++i) { for (size_t i = 0; i < volumes.size(); i++) { voxel_in[3] = volumes[i]; voxel_out[3] = i; voxel_out.value() = voxel_in.value(); } } } else { const size_t volume = volumes[0]; for (auto i = outer (voxel_out, voxel_in); i; ++i) { voxel_in[3] = volume; voxel_out.value() = voxel_in.value(); } } }