bool Segmented_FOD_receiver::operator() (const FOD_lobes& in) { if (!in.size()) return true; if (afd) { assign_pos_of (in.vox).to (*afd); afd->value().set_size (in.size()); for (size_t i = 0; i != in.size(); ++i) { FixelMetric this_fixel (in[i].get_mean_dir(), in[i].get_integral(), in[i].get_integral()); afd->value()[i] = this_fixel; } } if (peak) { assign_pos_of (in.vox).to (*peak); peak->value().set_size (in.size()); for (size_t i = 0; i != in.size(); ++i) { FixelMetric this_fixel (in[i].get_peak_dir(), in[i].get_integral(), in[i].get_peak_value()); peak->value()[i] = this_fixel; } } if (disp) { assign_pos_of (in.vox).to (*disp); disp->value().set_size (in.size()); for (size_t i = 0; i != in.size(); ++i) { FixelMetric this_fixel (in[i].get_mean_dir(), in[i].get_integral(), in[i].get_integral() / in[i].get_peak_value()); disp->value()[i] = this_fixel; } } return true; }
bool Segmented_FOD_receiver::operator() (const FOD_lobes& in) { if (afd) { float sum_integrals = 0.0; for (FOD_lobes::const_iterator i = in.begin(); i != in.end(); ++i) sum_integrals += i->get_integral(); Image::Nav::set_value_at_pos (*afd, in.vox, sum_integrals); } if (count) Image::Nav::set_value_at_pos (*count, in.vox, in.size()); if (dec) { Point<float> sum_decs (0.0, 0.0, 0.0); for (FOD_lobes::const_iterator i = in.begin(); i != in.end(); ++i) sum_decs += Point<float> (Math::abs(i->get_mean_dir()[0]), Math::abs(i->get_mean_dir()[1]), Math::abs(i->get_mean_dir()[2])) * i->get_integral(); Image::Nav::set_pos (*dec, in.vox); (*dec)[3] = 0; dec->value() = sum_decs[0]; (*dec)[3] = 1; dec->value() = sum_decs[1]; (*dec)[3] = 2; dec->value() = sum_decs[2]; } if (gfa) { double sum = 0.0; std::vector<float> combined_values (dirs.size(), 0.0); for (FOD_lobes::const_iterator i = in.begin(); i != in.end(); ++i) { const std::vector<float>& values = i->get_values(); for (size_t j = 0; j != dirs.size(); ++j) { sum += values[j]; combined_values[j] += values[j]; } } if (sum) { const float fod_normaliser = 1.0 / sum; const float normalised_mean = 1.0 / float(dirs.size()); double sum_variance = 0.0, sum_of_squares = 0.0; for (size_t i = 0; i != dirs.size(); ++i) { sum_variance += Math::pow2((combined_values[i] * fod_normaliser) - normalised_mean); sum_of_squares += Math::pow2 (combined_values[i] * fod_normaliser); } const float mean_variance = sum_variance / double(dirs.size() - 1); const float mean_square = sum_of_squares / double(dirs.size()); const float value = Math::sqrt (mean_variance / mean_square); Image::Nav::set_value_at_pos (*gfa, in.vox, value); } } if (pseudo_fod) { Image::Nav::set_pos (*pseudo_fod, in.vox); Math::Vector<float> sum_pseudo_fod; sum_pseudo_fod.resize (Math::SH::NforL (lmax), 0.0); Math::SH::aPSF<float> aPSF (lmax); for (FOD_lobes::const_iterator i = in.begin(); i != in.end(); ++i) { Math::Vector<float> this_lobe; aPSF (this_lobe, i->get_mean_dir()); for (size_t c = 0; c != sum_pseudo_fod.size(); ++c) sum_pseudo_fod[c] += i->get_integral() * this_lobe[c]; } for (size_t c = 0; c != sum_pseudo_fod.size(); ++c) { (*pseudo_fod)[3] = c; pseudo_fod->value() = sum_pseudo_fod[c]; } } if (sf) { float sum = 0.0, maximum = 0.0; for (FOD_lobes::const_iterator i = in.begin(); i != in.end(); ++i) { sum += i->get_integral(); maximum = std::max (maximum, i->get_integral()); } const float value = sum ? (maximum / sum) : 0.0; Image::Nav::set_value_at_pos (*sf, in.vox, value); } if (fixel_afd && in.size()) { Image::Nav::set_pos (*fixel_afd, in.vox); fixel_afd->value().set_size (in.size()); for (size_t i = 0; i != in.size(); ++i) { FixelMetric this_fixel (in[i].get_mean_dir(), in[i].get_integral(), in[i].get_integral()); (*fixel_afd).value()[i] = this_fixel; } } if (fixel_peak && in.size()) { Image::Nav::set_pos (*fixel_peak, in.vox); fixel_peak->value().set_size (in.size()); for (size_t i = 0; i != in.size(); ++i) { FixelMetric this_fixel (in[i].get_peak_dir(), in[i].get_integral(), in[i].get_peak_value()); (*fixel_peak).value()[i] = this_fixel; } } if (fixel_disp && in.size()) { Image::Nav::set_pos (*fixel_disp, in.vox); fixel_disp->value().set_size (in.size()); for (size_t i = 0; i != in.size(); ++i) { FixelMetric this_fixel (in[i].get_mean_dir(), in[i].get_integral(), in[i].get_integral() / in[i].get_peak_value()); (*fixel_disp).value()[i] = this_fixel; } } return true; }