Dynamic::~Dynamic() { INFO ("Dynamic seeeding required " + str (total_samples) + " samples to draw " + str (total_seeds) + " seeds"); #ifdef DYNAMIC_SEED_DEBUGGING const double final_mu = mu(); // Output seeding probabilites at end of execution Image::Header H; H.info() = info(); H.datatype() = DataType::Float32; Image::Buffer<float> prob_mean_data ("seed_prob_mean.mif", H), prob_sum_data ("seed_prob_sum.mif", H); Image::Buffer<float>::voxel_type prob_mean (prob_mean_data), prob_sum (prob_sum_data); VoxelAccessor v (accessor); Image::Loop loop; for (loop.start (v, prob_mean, prob_sum); loop.ok(); loop.next (v, prob_mean, prob_sum)) { if (v.value()) { float sum = 0.0; size_t count = 0; for (Fixel_map<Fixel_TD_seed>::ConstIterator i = begin (v); i; ++i) { sum += i().get_seed_prob (final_mu); ++count; } prob_mean.value() = sum / float(count); prob_sum .value() = sum; } } #endif }
bool Dynamic::operator() (const FMLS::FOD_lobes& in) { if (!SIFT::ModelBase<Fixel_TD_seed>::operator() (in)) return false; VoxelAccessor v (accessor); Image::Nav::set_pos (v, in.vox); if (v.value()) { for (DWI::Fixel_map<Fixel>::Iterator i = begin (v); i; ++i) i().set_voxel (in.vox); } return true; }
value_type AFDConnectivity::get (const std::string& path) { Tractography::Properties properties; Tractography::Reader<value_type> reader (path, properties); const size_t track_count = (properties.find ("count") == properties.end() ? 0 : to<size_t>(properties["count"])); DWI::Tractography::Mapping::TrackLoader loader (reader, track_count, "summing apparent fibre density within track"); // If WBFT is provided, this is the sum of (volume/length) across streamlines // Otherwise, it's a sum of lengths of all streamlines (for later scaling by mean streamline length) double sum_contributions = 0.0; size_t count = 0; Tractography::Streamline<value_type> tck; while (loader (tck)) { ++count; SetDixel dixels; mapper (tck, dixels); double this_length = 0.0, this_volume = 0.0; for (SetDixel::const_iterator i = dixels.begin(); i != dixels.end(); ++i) { this_length += i->get_length(); // If wbft has not been provided (i.e. FODs have not been pre-segmented), need to // check to see if any data have been provided for this voxel; and if not yet, // run the segmenter if (!have_wbft) { VoxelAccessor v (accessor()); assign_pos_of (*i, 0, 3).to (v); if (!v.value()) { assign_pos_of (*i, 0, 3).to (v_fod); DWI::FMLS::SH_coefs fod_data; DWI::FMLS::FOD_lobes fod_lobes; fod_data.vox[0] = v_fod.index (0); fod_data.vox[1] = v_fod.index (1); fod_data.vox[2] = v_fod.index (2); fod_data.resize (v_fod.size (3)); for (auto i = Loop(3) (v_fod); i; ++i) fod_data[v_fod.index (3)] = v_fod.value(); (*fmls) (fod_data, fod_lobes); (*this) (fod_lobes); } } const size_t fixel_index = dixel2fixel (*i); Fixel& fixel = fixels[fixel_index]; fixel.add_to_selection (i->get_length()); if (have_wbft) this_volume += fixel.get_selected_volume (i->get_length()); } if (have_wbft) sum_contributions += (this_volume / this_length); else sum_contributions += this_length; } if (!have_wbft) { // Streamlines define a fixel mask; go through and get all the fibre volumes double sum_volumes = 0.0; if (all_fixels) { // All fixels contribute to the result for (std::vector<Fixel>::const_iterator i = fixels.begin(); i != fixels.end(); ++i) { if (i->is_selected()) sum_volumes += i->get_FOD(); } } else { // Only allow one fixel per voxel to contribute to the result VoxelAccessor v (accessor()); for (auto l = Loop(v) (v); l; ++l) { if (v.value()) { value_type voxel_afd = 0.0, max_td = 0.0; for (Fixel_map<Fixel>::Iterator i = begin (v); i; ++i) { if (i().get_selected_length() > max_td) { max_td = i().get_selected_length(); voxel_afd = i().get_FOD(); } } sum_volumes += voxel_afd; } } } // sum_contributions currently stores sum of streamline lengths; // turn into a mean length, then combine with volume to get a connectivity value const double mean_length = sum_contributions / double(count); sum_contributions = sum_volumes / mean_length; } return sum_contributions; }