===== Fiji MVR (Multiview Reconstruction) ===== This software is for registering and fusing the datasets from two views. It was originally developed for OpenSPIM-like setups but works well for diSPIM data as well. See homepage at [[http://fiji.sc/Multiview-Reconstruction]]. As of April 2015 the MVR plugin allows for direct importing of Micro-Manager datasets. Previously the Micro-Manager plugin's export function was used (it is still required for [[MIPAV GenerateFusion]]). ==== Fiji MVR scripts ==== This script was used during the 2018 EMBO Practical Course for Light sheet microscopy in Dresden to roughly align two views collected on the ct-dSPIM: #@File (label="Freshly loaded BDV XML File Location") xml_file /** * Simple script to deskew, flip and move a DiSPIM dataset * * Olivier BURRI, Jon Daniels * EMBO Lightsheet Course 2018 * * INPUT: XML file which contains two angles named 0 and 90 * * This will apply the transformations to the XML file and reopen the multiview applications * * Last modification: August 8 2018 */ import groovy.util.XmlSlurper import ij.IJ def meta = new XmlSlurper().parse( xml_file ) //def size = meta.SpimData.SequenceDescription.ViewSetups.ViewSetup.sizexml_file def size = meta.SequenceDescription.ViewSetups.ViewSetup.size[0] as String def dimensions = size.tokenize(" "); def width = dimensions[0] as double def height = dimensions[1] as double def depth = dimensions[2] as double println("Width: "+width) println("Height: "+height) println("Depth: "+depth) def deskew = "1.0, 0.0, -1.0, 0.0, "+ "0.0, 1.0, 0.0, 0.0, "+ "0.0, 0.0, 1.0, 0.0" println(deskew) def flip = "0.0, 0.0, -1.0, 0.0, "+ "0.0, -1.0, 0.0, 0.0, "+ "-1.0, 0.0, 0.0, 0.0" def trans = "1.0, 0.0, 0.0, "+(height/2)+", "+ "0.0, 1.0, 0.0, "+(width)+", "+ "0.0, 0.0, 1.0, "+depth // Return to calibration only, if necessary IJ.run("Apply Transformations", "select=["+xml_file.getAbsolutePath()+"] "+ "apply_to_angle=[All angles] apply_to_channel=[All channels] apply_to_illumination=[All illuminations] apply_to_tile=[All tiles] apply_to_timepoint=[All Timepoints] "+ "transformation=[Identity (no transformation)] "+ "apply=[Calibration (removes any existing transforms)] "+ "same_transformation_for_all_angles"); // Apply deskew to all angles IJ.run("Apply Transformations", "select=["+xml_file.getAbsolutePath()+"] "+ "apply_to_angle=[All angles] apply_to_channel=[All channels] apply_to_illumination=[All illuminations] apply_to_tile=[All tiles] apply_to_timepoint=[All Timepoints] "+ "transformation=Affine apply=[Current view transformations (appends to current transforms)] "+ "same_transformation_for_all_angles "+ "timepoint_0_channel_0_illumination_0_all_angles=["+deskew+"]"); // Apply Flip to angle 90 IJ.run("Apply Transformations", "select=["+xml_file.getAbsolutePath()+"] "+ "apply_to_angle=[Single angle (Select from List)] apply_to_channel=[All channels] apply_to_illumination=[All illuminations] apply_to_tile=[All tiles] apply_to_timepoint=[All Timepoints] "+ "processing_angle=[angle 90] "+ "transformation=Affine apply=[Current view transformations (appends to current transforms)] "+ ""+ "timepoint_0_channel_0_illumination_0_angle_90=["+flip+"]"); // Aplly Rough translation to angle 90 IJ.run("Apply Transformations", "select=["+xml_file.getAbsolutePath()+"] "+ "apply_to_angle=[Single angle (Select from List)] apply_to_channel=[All channels] apply_to_illumination=[All illuminations] apply_to_tile=[All tiles] apply_to_timepoint=[All Timepoints] "+ "processing_angle=[angle 90] "+ "transformation=Affine apply=[Current view transformations (appends to current transforms)] "+ ""+ "timepoint_0_channel_0_illumination_0_angle_90=["+trans+"]"); // Open MultiView Application IJ.run("MultiView Reconstruction Application", "select_xml=["+xml_file.getAbsolutePath()+"]"); This script did some other pre-processing: #@File main_folder (label="Main Folder", style="directory") // Iterate and find all files import static groovy.io.FileType.FILES import ij.IJ import ij.plugin.ChannelSplitter import ij.io.Opener import groovyx.gpars.GParsPool def save_folder = new File(main_folder, "exploded_channels_views") save_folder.mkdir() def opener = new Opener() // Find all files. def all_files = [] main_folder.eachFile(FILES) { file -> if(file.getName().endsWith(".tif") && !file.getName().contains("_1")) { all_files.add(file) //println(file) } } Collections.reverse(all_files) // reverse order //all_files = all_files.take(1) //GParsPool.withPool(10) { //all_files.eachParallel{ file -> all_files.each { file -> //def temp_image = opener.openTiff(file.getParent()+File.separator, file.getName()) println("starting " + file) def temp_image = IJ.openImage(file.getAbsolutePath()) def images = ChannelSplitter.split(temp_image) // 0 is ch1 view 1 // 1 is ch1 view 2 // 2 is ch2 view 1 // 3 is ch2 view 2 //resave all def image_name = file.name.take(file.name.lastIndexOf('.')) IJ.saveAsTiff(images[0], new File(save_folder, sprintf("%s_Ch%d_Angle%d.tif",image_name, 1, 0)).getAbsolutePath()) IJ.saveAsTiff(images[1], new File(save_folder, sprintf("%s_Ch%d_Angle%d.tif",image_name, 1, 90)).getAbsolutePath()) IJ.saveAsTiff(images[2], new File(save_folder, sprintf("%s_Ch%d_Angle%d.tif",image_name, 2, 0)).getAbsolutePath()) IJ.saveAsTiff(images[3], new File(save_folder, sprintf("%s_Ch%d_Angle%d.tif",image_name, 2, 90)).getAbsolutePath()) images.each{it.close()} temp_image.close() println("finished " + file) } //}