diff --git a/render-ws-java-client/src/main/java/org/janelia/render/client/multisem/BackgroundCorrectedImageUrlClient.java b/render-ws-java-client/src/main/java/org/janelia/render/client/multisem/BackgroundCorrectedImageUrlClient.java deleted file mode 100644 index 752e0714b..000000000 --- a/render-ws-java-client/src/main/java/org/janelia/render/client/multisem/BackgroundCorrectedImageUrlClient.java +++ /dev/null @@ -1,126 +0,0 @@ -package org.janelia.render.client.multisem; - -import com.beust.jcommander.Parameter; -import com.beust.jcommander.ParametersDelegate; -import org.janelia.alignment.ImageAndMask; -import org.janelia.alignment.spec.ChannelSpec; -import org.janelia.alignment.spec.ResolvedTileSpecCollection; -import org.janelia.alignment.spec.TileSpec; -import org.janelia.alignment.spec.stack.StackMetaData; -import org.janelia.render.client.ClientRunner; -import org.janelia.render.client.RenderDataClient; -import org.janelia.render.client.parameter.CommandLineParameters; -import org.janelia.render.client.parameter.RenderWebServiceParameters; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; -import java.util.List; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * Java client to copy a stack's tiles, changing the image URL paths for all tiles in the resulting stack. - * In this case, the image URLs are changed to point to images that have been contrast-adjusted using the Hayworth - * pipeline. - */ -public class BackgroundCorrectedImageUrlClient { - - public static class Parameters extends CommandLineParameters { - - @ParametersDelegate - public RenderWebServiceParameters renderWeb = new RenderWebServiceParameters(); - - @Parameter( - names = "--stack", - description = "Name of stack from which tile specs should be read", - required = true) - private String stack; - - @Parameter( - names = "--targetStack", - description = "Name of stack to which updated tile specs should be written", - required = true) - private String targetStack; - } - - public static void main(final String[] args) { - - final ClientRunner clientRunner = new ClientRunner(args) { - @Override - public void runClient(final String[] args) - throws Exception { - - final Parameters parameters = new Parameters(); - parameters.parse(args); - - LOG.info("runClient: entry, parameters={}", parameters); - - final BackgroundCorrectedImageUrlClient client = new BackgroundCorrectedImageUrlClient(parameters); - client.fixStackData(); - } - }; - clientRunner.run(); - } - - private final Parameters parameters; - - private final RenderDataClient renderDataClient; - - private BackgroundCorrectedImageUrlClient(final Parameters parameters) { - this.parameters = parameters; - this.renderDataClient = parameters.renderWeb.getDataClient(); - } - - private void fixStackData() throws Exception { - final StackMetaData fromStackMetaData = renderDataClient.getStackMetaData(parameters.stack); - - // remove mipmap path builder if it is defined since we did not generate mipmaps for the hacked source images - fromStackMetaData.setCurrentMipmapPathBuilder(null); - - renderDataClient.setupDerivedStack(fromStackMetaData, parameters.targetStack); - - for (final Double z : renderDataClient.getStackZValues(parameters.stack)) { - final ResolvedTileSpecCollection resolvedTiles = renderDataClient.getResolvedTiles(parameters.stack, z); - for (final TileSpec tileSpec : resolvedTiles.getTileSpecs()) { - fixTileSpec(tileSpec); - } - renderDataClient.saveResolvedTiles(resolvedTiles, parameters.targetStack, z); - } - - renderDataClient.setStackState(parameters.targetStack, StackMetaData.StackState.COMPLETE); - } - - private void fixTileSpec(final TileSpec tileSpec) { - - final Integer zeroLevelKey = 0; - - for (final ChannelSpec channelSpec : tileSpec.getAllChannels()) { - - final Map.Entry entry = channelSpec.getFirstMipmapEntry(); - - if ((entry != null) && zeroLevelKey.equals(entry.getKey())) { - - final ImageAndMask sourceImageAndMask = entry.getValue(); - - // file:/nrs/hess/ibeammsem/system_02/wafers/wafer_60/acquisition/background_corrected/scans/scan_004/slabs/slab_0399/mfovs/mfov_0000/sfov_001.png - final String imageUrl = sourceImageAndMask.getImageUrl(); - final String newUrl = imageUrl.substring(5, 62) + "/background_corrected" + imageUrl.substring(62); - - final File newFile = new File(newUrl); - if (! newFile.exists()) { - throw new IllegalArgumentException("file does not exist: " + newFile); - } - - final ImageAndMask newImageAndMask = - sourceImageAndMask.copyWithDerivedUrls("file:" + newFile.getAbsolutePath(), - sourceImageAndMask.getMaskUrl()); - - channelSpec.putMipmap(zeroLevelKey, newImageAndMask); - } - } - } - - private static final Logger LOG = LoggerFactory.getLogger(BackgroundCorrectedImageUrlClient.class); -} diff --git a/render-ws-java-client/src/main/java/org/janelia/render/client/multisem/HackImageUrlPathClient.java b/render-ws-java-client/src/main/java/org/janelia/render/client/multisem/HackImageUrlPathClient.java index a734ddbd2..1905be008 100644 --- a/render-ws-java-client/src/main/java/org/janelia/render/client/multisem/HackImageUrlPathClient.java +++ b/render-ws-java-client/src/main/java/org/janelia/render/client/multisem/HackImageUrlPathClient.java @@ -5,6 +5,7 @@ import java.io.File; import java.util.Map; +import java.util.function.UnaryOperator; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -22,8 +23,11 @@ /** * Java client to copy a stack's tiles, changing the image URL paths for all tiles in the resulting stack. - * In this case, the image URLs are changed to point to images that have been contrast-adjusted using the Hayworth - * pipeline. + * Currently implemented URL transformations: + * - HayworthContrastPathTransformation: changes the image URL to point to images that have been contrast-adjusted using + * the Hayworth pipeline. + * - BasicBackgroundCorrectionPathTransformation: changes the image URL to point to images that have been + * background-corrected using the BaSiC background correction method. * * @author Eric Trautman */ @@ -48,6 +52,8 @@ public static class Parameters extends CommandLineParameters { private String targetStack; } + private static final Logger LOG = LoggerFactory.getLogger(HackImageUrlPathClient.class); + public static void main(final String[] args) { final ClientRunner clientRunner = new ClientRunner(args) { @@ -60,7 +66,8 @@ public void runClient(final String[] args) LOG.info("runClient: entry, parameters={}", parameters); - final HackImageUrlPathClient client = new HackImageUrlPathClient(parameters); + final UnaryOperator pathTransformation = new BasicBackgroundCorrectionPathTransformation(); + final HackImageUrlPathClient client = new HackImageUrlPathClient(parameters, pathTransformation); client.fixStackData(); } }; @@ -68,12 +75,13 @@ public void runClient(final String[] args) } private final Parameters parameters; - private final RenderDataClient renderDataClient; + private final UnaryOperator pathTransformation; - private HackImageUrlPathClient(final Parameters parameters) { + private HackImageUrlPathClient(final Parameters parameters, final UnaryOperator pathTransformation) { this.parameters = parameters; this.renderDataClient = parameters.renderWeb.getDataClient(); + this.pathTransformation = pathTransformation; } private void fixStackData() throws Exception { @@ -96,47 +104,59 @@ private void fixStackData() throws Exception { } private void fixTileSpec(final TileSpec tileSpec) { - final Integer zeroLevelKey = 0; for (final ChannelSpec channelSpec : tileSpec.getAllChannels()) { - final Map.Entry entry = channelSpec.getFirstMipmapEntry(); + if ((entry == null) || !zeroLevelKey.equals(entry.getKey())) { + continue; + } - if ((entry != null) && zeroLevelKey.equals(entry.getKey())) { - - final ImageAndMask sourceImageAndMask = entry.getValue(); + final ImageAndMask sourceImageAndMask = entry.getValue(); - // file:/nrs/hess/data/hess_wafer_53/raw/imaging/msem/scan_001/wafer_53_scan_001_20220427_23-16-30/402_/000005/402_000005_001_2022-04-28T1457426331720.png - final String imageUrl = sourceImageAndMask.getImageUrl(); + final String imageUrl = sourceImageAndMask.getImageUrl(); + final String transformedUrl = pathTransformation.apply(imageUrl); - final Matcher m = PATH_PATTERN.matcher(imageUrl); - if (m.matches()) { + if (transformedUrl == null) { + throw new IllegalArgumentException("could not transform image URL: " + imageUrl); + } - // file:/nrs/hess/data/hess_wafer_53/msem_with_hayworth_contrast/scan_001/402_/000005/402_000005_001_2022-04-28T1457426331720.png - final File hackFile = new File("/nrs/hess/data/hess_wafer_53/msem_with_hayworth_contrast/" + - m.group(1) + m.group(2)); - if (! hackFile.exists()) { - throw new IllegalArgumentException("file does not exist: " + hackFile); - } + final File hackFile = new File(transformedUrl); + if (! hackFile.exists()) { + throw new IllegalArgumentException("target file does not exist: " + hackFile); + } - final ImageAndMask hackedImageAndMask = - sourceImageAndMask.copyWithDerivedUrls("file:" + hackFile.getAbsolutePath(), - sourceImageAndMask.getMaskUrl()); + final ImageAndMask hackedImageAndMask = sourceImageAndMask.copyWithDerivedUrls("file:" + hackFile.getAbsolutePath(), + sourceImageAndMask.getMaskUrl()); + channelSpec.putMipmap(zeroLevelKey, hackedImageAndMask); + } + } - channelSpec.putMipmap(zeroLevelKey, hackedImageAndMask); - } else { - throw new IllegalArgumentException("invalid image URL: " + imageUrl); - } + private static class HayworthContrastPathTransformation implements UnaryOperator { + private final Pattern PATH_PATTERN = Pattern.compile("^file:/nrs.*/(scan_\\d\\d\\d/)wafer.*/(\\d\\d\\d_/.*png)$"); + // original: file:/nrs/hess/data/hess_wafer_53/raw/imaging/msem/scan_001/wafer_53_scan_001_20220427_23-16-30/402_/000005/402_000005_001_2022-04-28T1457426331720.png + // target: file:/nrs/hess/data/hess_wafer_53/msem_with_hayworth_contrast/scan_001/402_/000005/402_000005_001_2022-04-28T1457426331720.png + @Override + public String apply(final String path) { + final Matcher matcher = PATH_PATTERN.matcher(path); + if (matcher.matches()) { + return "/nrs/hess/data/hess_wafer_53/msem_with_hayworth_contrast/" + matcher.group(1) + matcher.group(2); + } else { + return null; } - } - } - private final Pattern PATH_PATTERN = Pattern.compile("^file:/nrs.*/(scan_\\d\\d\\d/)wafer.*/(\\d\\d\\d_/.*png)$"); + private static class BasicBackgroundCorrectionPathTransformation implements UnaryOperator { + + // original: file:/nrs/hess/ibeammsem/system_02/wafers/wafer_60/acquisition/scans/scan_004/slabs/slab_0399/mfovs/mfov_0000/sfov_001.png + // target: file:/nrs/hess/ibeammsem/system_02/wafers/wafer_60/acquisition/background_corrected/scans/scan_004/slabs/slab_0399/mfovs/mfov_0000/sfov_001.png + @Override + public String apply(final String path) { + return path.substring(5, 62) + "/background_corrected" + path.substring(62); + } + } - private static final Logger LOG = LoggerFactory.getLogger(HackImageUrlPathClient.class); }