bool Downsampler::operator() (const Streamline<>& in, Streamline<>& out) const { out.clear(); out.index = in.index; out.weight = in.weight; if (ratio <= 1 || in.empty()) return false; if (in.size() == 1) return true; out.push_back (in.front()); const size_t midpoint = in.size()/2; size_t index = (((midpoint - 1) % ratio) + 1); while (index < in.size() - 1) { out.push_back (in[index]); index += ratio; } out.push_back (in.back()); return true; }
bool Worker::operator() (Streamline<>& in, Streamline<>& out) const { out.clear(); out.index = in.index; out.weight = in.weight; if (!thresholds (in)) { // Want to test thresholds before wasting time on resampling if (inverse) in.swap (out); return true; } // Assign to ROIs if (properties.include.size() || properties.exclude.size()) { include_visited.assign (properties.include.size(), false); if (ends_only) { for (size_t i = 0; i != 2; ++i) { const Eigen::Vector3f& p (i ? in.back() : in.front()); properties.include.contains (p, include_visited); if (properties.exclude.contains (p)) { if (inverse) in.swap (out); return true; } } } else { for (const auto& p : in) { properties.include.contains (p, include_visited); if (properties.exclude.contains (p)) { if (inverse) in.swap (out); return true; } } } // Make sure all of the include regions were visited for (const auto& i : include_visited) { if (!i) { if (inverse) in.swap (out); return true; } } } if (properties.mask.size()) { // Split tck into separate tracks based on the mask vector<vector<Eigen::Vector3f>> cropped_tracks; vector<Eigen::Vector3f> temp; for (const auto& p : in) { const bool contains = properties.mask.contains (p); if (contains == inverse) { if (temp.size() >= 2) cropped_tracks.push_back (temp); temp.clear(); } else { temp.push_back (p); } } if (temp.size() >= 2) cropped_tracks.push_back (temp); if (cropped_tracks.empty()) return true; if (cropped_tracks.size() == 1) { cropped_tracks[0].swap (out); return true; } // Stitch back together in preparation for sending down queue as a single track out.push_back ({ NaN, NaN, NaN }); for (const auto& i : cropped_tracks) { for (const auto& p : i) out.push_back (p); out.push_back ({ NaN, NaN, NaN }); } return true; } else { if (!inverse) in.swap (out); return true; } }