Macro for splitting 4 channels, then stack to images, each slice saved with its z (slice) position added onto the file name


I am very new to this, and am completely overwhelmed and confused. I’ve been trying to read up on what to do here but am totally at a loss. Have tried using the recorder tool but to no avail. I would be SO grateful if someone could help me with this. Here is what I have going on:

I have many 4-channel z-stacks (with between 16-70 slices each). They are currently .lsm files but can easily be saved as .tif files.

I am trying to find a macro that does the following things:
-Splits the channels into four individual channels
-Runs the stack to images function on each channel
-Saves EACH slice from EACH channel with an indication of its channel AND z-position, preferably to a specific folder (ie one folder per channel, within a larger folder. But even one folder with all the slices for all the channels would be fine at this point)

Ex: my image is called “Male Control”, and has four channels (DAPI, 488, rhodamine, 633), and 12 slices. I need it to become…
-“Ch-1-Male Control” (or DAPI-Male Control, or whatever)
-“Ch-2-Male Control”
-“Ch-3-Male Control”
-“Ch-4-Male Control”
And then to have each of those channels split into its component slices, becoming:
-“Ch-1-Male Control-z1”
-“Ch-1-Male Control-z2”
-“Ch-1-Male Control-z3” (etc, for all 12 slices).

It’s the renaming and saving that I am having particular trouble with. Currently, even if I can get the channels to split and the get individual images, I still have to go through and rename each one individually, which will take hundreds of hours.

If someone could walk me through this I would be so happy.

This is just an example code that I quickly came up with… using the Macro Recorder and the list of Built In Macro Functions - this is what I came up with using this dataset as a test:

confocal-series.tif (1.5 MB)

#@ File (label = "Output directory", style = "directory") output

// run this macro code with opened image...

// get dimensions
getDimensions(width, height, channels, slices, frames)
// get the image name
name = getTitle();

// split channels
run("Split Channels");

for (i = 1; i <= channels; i++) {
	// get Channel 1
	waitForUser("Select the Channel " + i + " stack.");
	rename(name + "-Ch" + i);
	chName = getTitle();
	run("Stack to Images");
	for (j = slices; j > 0; j--) {
		rename(chName + "-z" + j);
		sliceName = getTitle();
		saveAs("Tiff", output + File.separator + sliceName + ".tif");

You can adapt it as you need… and it’s always good to double-check that the saved tifs are labeled correctly and are referencing the correct z slice.

Hope this helps get you a start!