Optics: parameterize PSF relative tail
This commit is contained in:
1 parent
ff2ba43333
commit
8662064044
7 files changed
+111
-47
No files matched your search
+25
-11
@@ -60,6 +60,7 @@ static int mesh_has_same_winding_shared_edge(const FrameLensMesh *mesh) {
|
||||
int main(void) {
|
||||
const int width = 100, height = 100;
|
||||
const double test_exposure = 1e-3;
|
||||
const double psf_relative_tail = 1e-8;
|
||||
const PointSpreadFunction psf = {.fwhm_pixels = 2.7, .moffat_beta = 4.5};
|
||||
const GeodesicTraceConfig trace = {.coordinate_time_step = 0.25,
|
||||
.max_steps = 100};
|
||||
@@ -77,7 +78,8 @@ int main(void) {
|
||||
goto done;
|
||||
const size_t images =
|
||||
frame_splat_catalog(&mesh, &catalog, hdr, width, height, test_exposure,
|
||||
&psf, NULL, INFINITY, 1.0, 0, 1, NULL, NULL, NULL);
|
||||
&psf, NULL, INFINITY, 1.0, psf_relative_tail,
|
||||
0, 1, NULL, NULL, NULL);
|
||||
if (images != 1 || hdr[3 * (50 * width + 50)] <= 0.0) {
|
||||
fputs("flat-space inverse lens-map regression failed\n", stderr);
|
||||
goto done;
|
||||
@@ -95,11 +97,11 @@ int main(void) {
|
||||
omp_set_num_threads(1);
|
||||
const size_t serial_images = frame_splat_catalog(
|
||||
&mesh, &catalog, serial_hdr, width, height, test_exposure, &psf, NULL,
|
||||
INFINITY, 1.0, 0, 1, NULL, NULL, NULL);
|
||||
INFINITY, 1.0, psf_relative_tail, 0, 1, NULL, NULL, NULL);
|
||||
omp_set_num_threads(4);
|
||||
const size_t parallel_images = frame_splat_catalog(
|
||||
&mesh, &catalog, parallel_hdr, width, height, test_exposure, &psf, NULL,
|
||||
INFINITY, 1.0, 0, 1, NULL, NULL, NULL);
|
||||
INFINITY, 1.0, psf_relative_tail, 0, 1, NULL, NULL, NULL);
|
||||
omp_set_num_threads(original_threads);
|
||||
for (int value = 0; value < width * height * 3; ++value)
|
||||
if (fabs(serial_hdr[value] - parallel_hdr[value]) >
|
||||
@@ -126,7 +128,7 @@ int main(void) {
|
||||
* beyond the former Gaussian's 3-sigma raster box. */
|
||||
memset(hdr, 0, (size_t)width * height * 3 * sizeof *hdr);
|
||||
splat_moffat(hdr, width, height, 50.5, 50.5,
|
||||
(LinearRgb){1.0, 1.0, 1.0}, 1.0, &psf);
|
||||
(LinearRgb){1.0, 1.0, 1.0}, 1.0, &psf, psf_relative_tail);
|
||||
double moffat_flux = 0.0;
|
||||
for (int pixel = 0; pixel < width * height; ++pixel)
|
||||
moffat_flux += hdr[3 * pixel];
|
||||
@@ -142,27 +144,37 @@ int main(void) {
|
||||
double *cached_hdr = calloc((size_t)width * height * 3, sizeof *cached_hdr);
|
||||
double *reference_hdr = calloc((size_t)width * height * 3, sizeof *reference_hdr);
|
||||
if (cached_hdr == NULL || reference_hdr == NULL ||
|
||||
psf_kernel_cache_init(&cache, &psf)) {
|
||||
psf_kernel_cache_init(&cache, &psf, psf_relative_tail)) {
|
||||
free(cached_hdr);
|
||||
free(reference_hdr);
|
||||
psf_kernel_cache_destroy(&cache);
|
||||
fputs("PSF cache construction regression failed\n", stderr);
|
||||
goto done;
|
||||
}
|
||||
PsfKernelCache loose_tail_cache = {0};
|
||||
if (psf_kernel_cache_init(&loose_tail_cache, &psf, 1e-5) ||
|
||||
loose_tail_cache.relative_tail_fraction != 1e-5 ||
|
||||
loose_tail_cache.radius_pixels >= cache.radius_pixels) {
|
||||
fputs("PSF relative-tail cache-radius regression failed\n", stderr);
|
||||
psf_kernel_cache_destroy(&loose_tail_cache);
|
||||
free(cached_hdr); free(reference_hdr); psf_kernel_cache_destroy(&cache);
|
||||
goto done;
|
||||
}
|
||||
psf_kernel_cache_destroy(&loose_tail_cache);
|
||||
const double phases[][2] = {{0.01, 0.99}, {0.499, 0.501}, {0.999, 0.001}};
|
||||
for (size_t phase = 0; phase < sizeof phases / sizeof *phases; ++phase) {
|
||||
memset(cached_hdr, 0, (size_t)width * height * 3 * sizeof *cached_hdr);
|
||||
memset(reference_hdr, 0, (size_t)width * height * 3 * sizeof *reference_hdr);
|
||||
if (splat_moffat_cached(cached_hdr, width, height, 50.0 + phases[phase][0],
|
||||
50.0 + phases[phase][1], (LinearRgb){1.0, 1.0, 1.0},
|
||||
1.0, &psf, &cache, 1.0) != 0) {
|
||||
1.0, &psf, &cache, 1.0, psf_relative_tail) != 0) {
|
||||
fputs("ordinary PSF cache unexpectedly fell back\n", stderr);
|
||||
free(cached_hdr); free(reference_hdr); psf_kernel_cache_destroy(&cache);
|
||||
goto done;
|
||||
}
|
||||
splat_moffat_direct(reference_hdr, width, height,
|
||||
50.0 + phases[phase][0], 50.0 + phases[phase][1],
|
||||
(LinearRgb){1.0, 1.0, 1.0}, 1.0, &psf);
|
||||
(LinearRgb){1.0, 1.0, 1.0}, 1.0, &psf, psf_relative_tail);
|
||||
double peak = 0.0, max_error = 0.0;
|
||||
for (int value = 0; value < width * height * 3; ++value) {
|
||||
peak = fmax(peak, reference_hdr[value]);
|
||||
@@ -177,7 +189,8 @@ int main(void) {
|
||||
/* A bright event must avoid a cached hard cutoff by selecting the direct
|
||||
* reference path when the requested support exceeds the cache. */
|
||||
if (splat_moffat_cached(cached_hdr, width, height, 50.5, 50.5,
|
||||
(LinearRgb){1.0, 1.0, 1.0}, 1000.0, &psf, &cache, 1.0) != 1) {
|
||||
(LinearRgb){1.0, 1.0, 1.0}, 1000.0, &psf, &cache, 1.0,
|
||||
psf_relative_tail) != 1) {
|
||||
fputs("bright PSF direct-fallback regression failed\n", stderr);
|
||||
free(cached_hdr); free(reference_hdr); psf_kernel_cache_destroy(&cache);
|
||||
goto done;
|
||||
@@ -186,13 +199,13 @@ int main(void) {
|
||||
memset(reference_hdr, 0, (size_t)width * height * 3 * sizeof *reference_hdr);
|
||||
if (splat_moffat_cached(cached_hdr, width, height, 50.5, 50.5,
|
||||
(LinearRgb){1.0, 1.0, 1.0}, 1000.0, &psf, &cache,
|
||||
1000.0) != 2) {
|
||||
1000.0, psf_relative_tail) != 2) {
|
||||
fputs("bright PSF cached-wing-clipping regression failed\n", stderr);
|
||||
free(cached_hdr); free(reference_hdr); psf_kernel_cache_destroy(&cache);
|
||||
goto done;
|
||||
}
|
||||
splat_moffat_direct(reference_hdr, width, height, 50.5, 50.5,
|
||||
(LinearRgb){1.0, 1.0, 1.0}, 1000.0, &psf);
|
||||
(LinearRgb){1.0, 1.0, 1.0}, 1000.0, &psf, psf_relative_tail);
|
||||
const size_t center = 3 * (50 * width + 50);
|
||||
if (cached_hdr[center] <= 0.0 ||
|
||||
fabs(cached_hdr[center] - reference_hdr[center]) >
|
||||
@@ -223,7 +236,8 @@ int main(void) {
|
||||
if (frame_lens_mesh_build_coarse(&fine_mesh, width, height, 1, 0.1) ||
|
||||
frame_lens_mesh_trace(&fine_mesh, &spacetime, &observer, &trace) ||
|
||||
frame_splat_catalog(&fine_mesh, &fine_catalog, hdr, width, height,
|
||||
test_exposure, &psf, NULL, INFINITY, 1.0, 0, 1, NULL,
|
||||
test_exposure, &psf, NULL, INFINITY, 1.0,
|
||||
psf_relative_tail, 0, 1, NULL,
|
||||
NULL, NULL) != 1) {
|
||||
fputs("fine source-triangle containment regression failed\n", stderr);
|
||||
frame_lens_mesh_destroy(&fine_mesh);
|
||||
|
||||
Reference in new issue
Block a user