Commit c9b0452a authored by Andrey Filippov's avatar Andrey Filippov

CLAUDE: RT-RENDER* hyperstacks organized like -INDIVIDUAL-CUAS-DBG (merged first, 2 average frames)

t (channels): merged FIRST then s00..s15; z (frames): 'average' (all scenes) +
'average-f:l' (middle-half, renderSceneSequence default range) then scenes -
same dimensions as -CUAS-INDIVIDUAL-CUAS-DBG (17 x 499 x H x W) so ImageJ can
subtract the stacks directly. NaN-tolerant per-pixel averages. Applies to all
three products (RT-RENDER, -LOG-ORACLE, -LOG-FOLDED). Per Andrey 07/06/2026.
Co-Authored-By: 's avatarClaude Fable 5 <noreply@anthropic.com>
parent 0fe8f5c1
...@@ -447,8 +447,14 @@ public class CuasRender { ...@@ -447,8 +447,14 @@ public class CuasRender {
return rendered; return rendered;
} }
/** Save a render-product hyperstack [t: s00..s15, merged][z: scenes]. /** Save a render-product hyperstack organized like -CUAS-INDIVIDUAL-CUAS-DBG so
* By Claude on 07/06/2026 (extracted from testRenderSequence for the LoG A/B products). */ * ImageJ can subtract the two directly (Andrey 07/06/2026):
* t (channels): merged FIRST, then s00..s15;
* z (frames): "average" (all scenes), "average-f:l" (middle-half range,
* the renderSceneSequence default f=last/4, l=3*last/4),
* then the scenes.
* Averages are NaN-tolerant per pixel (same as renderSceneSequence).
* By Claude on 07/06/2026 (extracted + reorganized from testRenderSequence). */
private static void saveRenderHyper( private static void saveRenderHyper(
final QuadCLT center_CLT, final QuadCLT center_CLT,
final String suffix, final String suffix,
...@@ -457,21 +463,45 @@ public class CuasRender { ...@@ -457,21 +463,45 @@ public class CuasRender {
final int img_width, final int img_width,
final int img_height, final int img_height,
final int num_comps) { final int num_comps) {
final float [] nan_slice = new float [img_width * img_height]; final int npix = img_width * img_height;
final float [] nan_slice = new float [npix];
java.util.Arrays.fill(nan_slice, Float.NaN); java.util.Arrays.fill(nan_slice, Float.NaN);
final int last_scene = rendered.size() - 1;
final int [][] avg_ranges = {{0, last_scene}, {last_scene / 4, (3 * last_scene) / 4}};
final String [] avg_names = {"average", "average-"+avg_ranges[1][0]+":"+avg_ranges[1][1]};
final ImageStack stack = new ImageStack(img_width, img_height); final ImageStack stack = new ImageStack(img_width, img_height);
for (int nc = 0; nc < num_comps; nc++) { for (int nc = 0; nc < num_comps; nc++) {
final String comp = (nc < (num_comps - 1)) ? String.format("s%02d", nc) : "merged"; // merged (rendered index num_comps-1) goes FIRST, then s00..s15
final int nr = (nc == 0) ? (num_comps - 1) : (nc - 1);
final String comp = (nc == 0) ? "merged" : String.format("s%02d", nc - 1);
for (int navg = 0; navg < avg_ranges.length; navg++) {
final float [] avg = new float [npix];
final int [] cnt = new int [npix];
for (int ns = avg_ranges[navg][0]; ns <= avg_ranges[navg][1]; ns++) {
final float [][] r = rendered.get(ns);
if ((r == null) || (r[nr] == null)) continue;
for (int i = 0; i < npix; i++) if (!Float.isNaN(r[nr][i])) {
avg[i] += r[nr][i];
cnt[i]++;
}
}
for (int i = 0; i < npix; i++) {
avg[i] = (cnt[i] > 0) ? (avg[i] / cnt[i]) : Float.NaN;
}
stack.addSlice(comp+":"+avg_names[navg], avg);
}
for (int ns = 0; ns < rendered.size(); ns++) { for (int ns = 0; ns < rendered.size(); ns++) {
final float [][] r = rendered.get(ns); final float [][] r = rendered.get(ns);
stack.addSlice(comp+":"+ts_names.get(ns), ((r != null) && (r[nc] != null)) ? r[nc] : nan_slice); stack.addSlice(comp+":"+ts_names.get(ns), ((r != null) && (r[nr] != null)) ? r[nr] : nan_slice);
} }
} }
final int num_frames = rendered.size() + avg_ranges.length;
final ImagePlus imp = new ImagePlus(center_CLT.getImageName()+suffix, stack); final ImagePlus imp = new ImagePlus(center_CLT.getImageName()+suffix, stack);
imp.setDimensions(1, rendered.size(), num_comps); imp.setDimensions(1, num_frames, num_comps);
imp.setOpenAsHyperStack(true); imp.setOpenAsHyperStack(true);
imp.getProcessor().resetMinAndMax(); imp.getProcessor().resetMinAndMax();
center_CLT.saveImagePlusInModelDirectory(null, imp); // title as filename center_CLT.saveImagePlusInModelDirectory(null, imp); // title as filename
System.out.println("testRenderSequence(): saved "+suffix+" ("+num_comps+" components x "+rendered.size()+" scenes)"); System.out.println("testRenderSequence(): saved "+suffix+" ("+num_comps+" components x "+
num_frames+" frames = 2 averages + "+rendered.size()+" scenes; merged first)");
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment