27 std::vector<double> wavelengths;
28 wavelengths.reserve(
m_peaks.size());
30 std::transform(
m_peaks.begin(),
m_peaks.end(), std::back_inserter(wavelengths),
39 std::vector<double> intensities;
40 intensities.reserve(
m_peaks.size());
42 std::transform(
m_peaks.begin(),
m_peaks.end(), std::back_inserter(intensities),
51 std::vector<double> sigmas;
54 std::transform(
m_peaks.begin(),
m_peaks.end(), std::back_inserter(sigmas),
63 if (sigmaCritical <= 0.0) {
64 throw std::invalid_argument(
"Critical sigma value has to be greater than 0.");
71 std::vector<double> zScores;
79 for (
size_t i = 0; i < zScores.size(); ++i) {
80 if (zScores[i] <= sigmaCritical) {
85 for (
const auto &peak :
m_peaks) {
96 peak.setIntensity(intensity);
97 peak.setSigmaIntensity(
sigma);
116 : m_reflections(), m_pointgroup(
std::move(pointGroup)) {
118 auto dFilter = std::make_shared<const HKLFilterDRange>(cell, dLimits.first, dLimits.second);
119 auto centeringFilter = std::make_shared<const HKLFilterCentering>(centering);
120 auto filter = dFilter & centeringFilter;
123 for (
const auto &hkl : generator) {
124 if (filter->isAllowed(hkl)) {
134 for (
auto const &peak : peaks) {
135 V3D hkl = peak.getIntHKL();
136 V3D mnp = peak.getIntMNP();
138 if (mnp.
norm2() == 0.0) {
142 (*reflection).second.addPeak(peak);
160 return std::count_if(
162 [=](
const std::pair<Kernel::V3D, UniqueReflection> &item) { return item.second.count() > moreThan; });
167 std::vector<V3D> reflections;
171 if (reflection.second.count() == 0) {
172 reflections.emplace_back(reflection.first);
182 [](
size_t totalReflections,
const std::pair<Kernel::V3D, UniqueReflection> &item) {
183 return totalReflections + item.second.count();
209 std::string
const &equivalentIntensities,
double &sigmaCritical,
211 double rMergeNumerator = 0.0;
212 double rPimNumerator = 0.0;
213 double intensitySumRValues = 0.0;
214 double iOverSigmaSum = 0.0;
216 for (
const auto &unique : uniqueReflections) {
220 if (unique.second.count() > 0) {
224 auto outliersRemoved = unique.second.removeOutliers(sigmaCritical, weightedZ);
228 auto intensities = outliersRemoved.getIntensities();
229 auto sigmas = outliersRemoved.getSigmas();
234 if (outliersRemoved.count() > 1) {
239 double meanIntensity = intensityStatistics.mean;
240 if (equivalentIntensities ==
"Median")
241 meanIntensity = intensityStatistics.median;
247 m_chiSquared += intensityStatistics.standard_deviation / meanIntensity;
250 double sumOfDeviationsFromMean =
251 std::accumulate(intensities.begin(), intensities.end(), 0.0, [meanIntensity](
double sum,
double intensity) {
252 return sum + fabs(intensity - meanIntensity);
256 rMergeNumerator += sumOfDeviationsFromMean;
259 double rPimFactor = sqrt(1.0 / (
static_cast<double>(outliersRemoved.count()) - 1.0));
260 rPimNumerator += (rPimFactor * sumOfDeviationsFromMean);
263 intensitySumRValues += std::accumulate(intensities.begin(), intensities.end(), 0.0);
266 const std::vector<Peak> &reflectionPeaks = outliersRemoved.getPeaks();
267 m_peaks.insert(
m_peaks.end(), reflectionPeaks.begin(), reflectionPeaks.end());
279 if (intensitySumRValues > 0.0) {
280 m_rMerge = rMergeNumerator / intensitySumRValues;
281 m_rPim = rPimNumerator / intensitySumRValues;
296 const std::vector<double> &intensities)
const {
297 return std::inner_product(intensities.begin(), intensities.end(), sigmas.begin(), 0.0, std::plus<double>(),
298 std::divides<double>());
303 double sumOfSquares = std::inner_product(data.begin(), data.end(), data.begin(), 0.0);
305 return sqrt(sumOfSquares /
static_cast<double>(data.size()));
311 return std::make_pair(0.0, 0.0);
314 auto dspacingLimitIterators = std::minmax_element(peaks.begin(), peaks.end(), [](
const Peak &lhs,
const Peak &
rhs) {
315 return lhs.getDSpacing() < rhs.getDSpacing();
318 return std::make_pair((*(dspacingLimitIterators.first)).getDSpacing(),
319 (*(dspacingLimitIterators.second)).getDSpacing());
const std::vector< double > & rhs
Structure describing a single-crystal peak.
Class to implement unit cell of crystals.
constexpr double norm2() const noexcept
Vector length squared.
std::shared_ptr< ReflectionCondition > ReflectionCondition_sptr
Shared pointer to a ReflectionCondition.
std::shared_ptr< PointGroup > PointGroup_sptr
Shared pointer to a PointGroup.
Statistics getStatistics(const std::vector< TYPE > &data, const unsigned int flags=StatOptions::AllStats)
Return a statistics object for the given data set.
std::vector< double > getZscore(const std::vector< TYPE > &data)
Return the Z score values for a dataset.
std::vector< double > getWeightedZscore(const std::vector< TYPE > &data, const std::vector< TYPE > &weights)
There are enough special cases in determining the Z score where it useful to put it in a single funct...