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
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:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user