Пример #1
0
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;
}
Пример #2
0
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;

}