package cz.cuni.lf1.lge.ThunderSTORM.rendering; import cz.cuni.lf1.lge.ThunderSTORM.rendering.ui.ASHRenderingUI; import ij.process.ImageProcessor; /** * Rendering using Averaged shifted histogram. */ public class ASHRendering extends AbstractRendering implements IncrementalRenderingMethod { protected int shifts; protected int zShifts; protected ASHRendering(Builder builder) { super(builder); this.shifts = builder.shifts; this.zShifts = threeDimensions ? builder.zShifts : 1; } @Override public String getRendererName() { return ASHRenderingUI.name; } public static class Builder extends AbstractBuilder<Builder, ASHRendering> { protected int shifts = 2; protected int zShifts = 1; /** * Number of shifts in one dimension. When one shift is set, the result is * the same as of HistogramRendering. * * @param shifts number of shifts, must be > 0 */ public Builder shifts(int shifts) { if (shifts <= 0) { throw new IllegalArgumentException("\"shifts\" argument must be positive integer. Passed value: " + shifts); } this.shifts = shifts; return this; } public Builder zShifts(int zShifts) { if (zShifts <= 0) { throw new IllegalArgumentException("\"zShifts\" argument must be positive integer. Passed value: " + shifts); } this.zShifts = zShifts; return this; } @Override public ASHRendering build() { super.validate(); return new ASHRendering(this); } } @Override protected void drawPoint(double x, double y, double z, double dx, double dz) { if (isInBounds(x, y)) { int u = (int) ((x - xmin) / resolution); int v = (int) ((y - ymin) / resolution); int w = 0; if (threeDimensions) { if (z == zTo) { w = zSlices - 1; } else { w = ((int) ((z - zFrom) / zStep)); } } for (int k = -zShifts + 1; k < zShifts; k++) { if (w + k < zSlices && w + k >= 0) { ImageProcessor img = slices[w + k]; for (int i = -shifts + 1; i < shifts; i++) { for (int j = -shifts + 1; j < shifts; j++) { if (u + i < imSizeX && u + i >= 0 && v + j < imSizeY && v + j >= 0) { img.setf(u + i, v + j, img.getf(u + i, v + j) + (shifts - Math.abs(i)) * (shifts - Math.abs(j)) * (zShifts - Math.abs(k))); } } } } } } } }