PixelRefine: profile multiplier as --profile-multiplier flag; outlier rejection default off
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 29m33s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 29m48s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 29m54s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 31m23s
Build Packages / build:rpm (rocky8) (push) Successful in 31m27s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 33m18s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 33m33s
Build Packages / XDS test (durin plugin) (push) Successful in 19m8s
Build Packages / Generate python client (push) Successful in 44s
Build Packages / Build documentation (push) Successful in 1m42s
Build Packages / Create release (push) Skipped
Build Packages / XDS test (neggia plugin) (push) Successful in 20m33s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 24m26s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 22m0s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 26m3s
Build Packages / build:rpm (rocky9) (push) Successful in 29m41s
Build Packages / DIALS test (push) Successful in 33m17s
Build Packages / Unit tests (push) Successful in 2h52m56s

(1) Promote the Term-2 profile-width multiplier from the PR_RMULT env knob to a real
BraggIntegrationSettings::profile_multiplier (default 6) + jfjoch_process
--profile-multiplier flag. Removes the last PR_* env knob; IndexAndRefine reads the
setting. (2) Flip the merge outlier rejection default to OFF (ScalingSettings
outlier_reject_nsigma 6 -> 0); it stays available via --reject-outliers <nsigma>, since
it helps the jet R-free but is dataset-dependent (drops crystal-2 CCref).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-15 13:48:11 +02:00
parent 102a2a7c81
commit 8a9d80eb71
5 changed files with 35 additions and 4 deletions
+11
View File
@@ -72,6 +72,17 @@ float BraggIntegrationSettings::GetR1() const {
return r_1;
}
float BraggIntegrationSettings::GetProfileMultiplier() const {
return profile_multiplier;
}
BraggIntegrationSettings &BraggIntegrationSettings::ProfileMultiplier(float input) {
if (input <= 0.0f)
throw JFJochException(JFJochExceptionCategory::InputParameterInvalid, "Profile multiplier must be positive");
profile_multiplier = input;
return *this;
}
float BraggIntegrationSettings::GetR2() const {
return r_2;
}
+6
View File
@@ -12,6 +12,10 @@ class BraggIntegrationSettings {
float d_min_limit_A = 1.0;
std::optional<float> fixed_profile_radius;
float minimum_sigma_in_regards_to_i = 0.02;
// PixelRefine only: the measured (physical) tangential profile width is multiplied by
// this for the integration template, so the aperture is generous (XDS-style ~6 sigma)
// and tolerant of the centroid-floor scatter. Ignored by the classical integrator.
float profile_multiplier = 6.0;
public:
BraggIntegrationSettings& R1(float input);
@@ -19,11 +23,13 @@ public:
BraggIntegrationSettings& R3(float input);
BraggIntegrationSettings& DMinLimit_A(float input);
BraggIntegrationSettings& FixedProfileRadius_recipA(std::optional<float> input);
BraggIntegrationSettings& ProfileMultiplier(float input);
[[nodiscard]] float GetR1() const;
[[nodiscard]] float GetR2() const;
[[nodiscard]] float GetR3() const;
[[nodiscard]] float GetProfileMultiplier() const;
[[nodiscard]] std::optional<float> GetFixedProfileRadius_recipA() const;
[[nodiscard]] float GetDMinLimit_A() const;
+1 -1
View File
@@ -23,7 +23,7 @@ class ScalingSettings {
std::optional<double> wedge_for_scaling;
double min_partiality = 0.02;
double min_cc_for_image = 0.0;
double outlier_reject_nsigma = 6.0; // per-observation merge outlier rejection (XDS/DIALS-style); <= 0 disables
double outlier_reject_nsigma = 0.0; // per-observation merge outlier rejection (XDS/DIALS-style); 0 = off, e.g. 6 enables
double rfree_fraction = 0.05;
IntensityFormat intensity_format = IntensityFormat::MTZ;
+1 -1
View File
@@ -448,7 +448,7 @@ bool IndexAndRefine::PixelRefineIntegrate(DataMessage &msg,
// Signal-box radius from the shared integration setting (same knob as BraggIntegrate2D).
prd.shoebox_radius = static_cast<int>(std::lround(experiment.GetBraggIntegrationSettings().GetR1()));
if (const char *m = std::getenv("PR_RMULT")) prd.r1_multiplier = std::stod(m); // Term-2 R1 multiplier (default 6)
prd.r1_multiplier = experiment.GetBraggIntegrationSettings().GetProfileMultiplier();
std::vector<uint8_t> buffer;
const uint8_t *ptr = image.GetUncompressedPtr(buffer);
+16 -2
View File
@@ -72,7 +72,7 @@ void print_usage() {
std::cout << " -w, --wedge[=num] Refine image wedge during scaling with starting wedge value" << std::endl;
std::cout << " --scaling-high-resolution <num> High resolution limit for spot finding (default: no limit)" << std::endl;
std::cout << " --min-partiality <num> Minimum partiality to accept reflection (default: 0.02)" << std::endl;
std::cout << " --reject-outliers <num> Per-observation merge outlier rejection, N sigma from the per-reflection median (default: 6; 0 disables)" << std::endl;
std::cout << " --reject-outliers <num> Per-observation merge outlier rejection, N sigma from the per-reflection median (default: off; e.g. 6, XDS/DIALS-style)" << std::endl;
std::cout << " --min-image-cc <num> Per-image CC limit in percent (default: no limit)" << std::endl;
std::cout << " --scaling-iterations <num> Number of scaling iterations with no reference data (default: 3)" << std::endl;
std::cout << " --scaling-output <txt> Output format for scaling results mtz|cif|txt (default: mtz)" << std::endl;
@@ -82,6 +82,7 @@ void print_usage() {
std::cout << " Pixel refinement (experimental, select via -r pixelrefine, needs --reference-mtz)" << std::endl;
std::cout << " --bandwidth <num> Relative X-ray bandwidth FWHM (e.g. 0.01 for 1% DMM); default from file or 0" << std::endl;
std::cout << " --integration-radius <r> Signal-box radius r1, or r1,r2,r3 (px). One value => r2=r1+2, r3=r1+4" << std::endl;
std::cout << " --profile-multiplier <num> PixelRefine: scale the measured tangential profile width R1 (default: 6; XDS-style generous aperture)" << std::endl;
}
enum {
@@ -99,7 +100,8 @@ enum {
OPT_FORCE_ROTATION_LATTICE,
OPT_BANDWIDTH,
OPT_INTEGRATION_RADIUS,
OPT_REJECT_OUTLIERS
OPT_REJECT_OUTLIERS,
OPT_PROFILE_MULTIPLIER
};
static option long_options[] = {
@@ -138,6 +140,7 @@ static option long_options[] = {
{"bandwidth", required_argument, nullptr, OPT_BANDWIDTH},
{"integration-radius", required_argument, nullptr, OPT_INTEGRATION_RADIUS},
{"reject-outliers", required_argument, nullptr, OPT_REJECT_OUTLIERS},
{"profile-multiplier", required_argument, nullptr, OPT_PROFILE_MULTIPLIER},
{nullptr, 0, nullptr, 0}
};
@@ -320,6 +323,7 @@ int main(int argc, char **argv) {
std::optional<float> d_min_scale_merge;
std::optional<std::string> integration_radius_arg; // "r1" or "r1,r2,r3"
std::optional<double> outlier_reject_nsigma; // merge per-observation outlier rejection
std::optional<float> profile_multiplier; // PixelRefine Term-2 profile-width multiplier
if (argc == 1) {
print_usage();
@@ -515,6 +519,9 @@ int main(int argc, char **argv) {
case OPT_REJECT_OUTLIERS:
outlier_reject_nsigma = std::stod(optarg);
break;
case OPT_PROFILE_MULTIPLIER:
profile_multiplier = std::stof(optarg);
break;
case OPT_MIN_IMAGE_CC:
min_image_cc = std::stod(optarg);
break;
@@ -707,6 +714,13 @@ int main(int argc, char **argv) {
logger.Info("Integration radii set to r1={:.1f} r2={:.1f} r3={:.1f}", r1, r2, r3);
}
if (profile_multiplier) {
BraggIntegrationSettings bis = experiment.GetBraggIntegrationSettings();
bis.ProfileMultiplier(*profile_multiplier);
experiment.ImportBraggIntegrationSettings(bis);
logger.Info("PixelRefine profile-width multiplier set to {:.1f}", *profile_multiplier);
}
SpotFindingSettings spot_settings;
spot_settings.enable = true;
spot_settings.indexing = true;