Add --soft-weight (implies --adaptive-spots): give every detected spot a
continuous quality weight in (0,1] and keep the highest-weight spots rather than
the brightest, so a deliberately loose detector self-cleans -- bright ice / salt
/ jet blobs and single-pixel noise no longer evict faint clean Bragg spots from
the max-spots cut.
The weight is a product of dimensionless gates (AdaptiveSpotFinderCPU::ApplyWeights,
computed against the per-ring background the adaptive finder already builds): a
logistic ramp in the spot's SNR and a soft size band (rises from one pixel,
plateaus, falls for oversized ice/salt/streak blobs). It carries on
DiffractionSpot -> SpotToSave and is consumed by FilterSpotsByCount, which ranks
by {non-ice, weight, intensity} when requested and by intensity otherwise, so the
classic and FPGA paths are unchanged.
Honest result: on the serial-stills battery this is index-rate-NEUTRAL. The
weighted ranking only changes the outcome when the spot count exceeds the
max-spots cap and the weight disagrees with intensity in a way that affects
indexing; the adaptive detectors already produce clean spot lists and the weak
sets sit under the cap, so re-ranking is a wash there (and a wash, not a
regression, on the one set that floods). Its intended benefit -- robustness to
ice/jet-contaminated frames and to a loosened detector -- is not exercised by
this battery; kept opt-in as the substrate for that.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
25 lines
700 B
C
25 lines
700 B
C
// SPDX-FileCopyrightText: 2024 Filip Leonarski, Paul Scherrer Institute <filip.leonarski@psi.ch>
|
|
// SPDX-License-Identifier: GPL-3.0-only
|
|
|
|
#pragma once
|
|
|
|
#include "DiffractionGeometry.h"
|
|
|
|
struct SpotToSave {
|
|
float x = 0;
|
|
float y = 0;
|
|
float phi = 0;
|
|
float intensity = 0;
|
|
int64_t maxc = 0;
|
|
int64_t lattice = -1; // -1 non indexed
|
|
int64_t image = 0;
|
|
int64_t h = 0, k = 0, l= 0;
|
|
float d_A = 0.0;
|
|
float dist_ewald_sphere = 0.0;
|
|
float weight = 1.0f; // soft quality weight in (0,1]; used to rank the kept spots (see --soft-weight)
|
|
bool ice_ring = false;
|
|
bool indexed = false;
|
|
|
|
Coord ReciprocalCoord(const DiffractionGeometry &experiment) const;
|
|
};
|