Please Note: This version of the software is outdated. We highly recommend using the new automated workflow. It is much more user friendly, efficient and versatile using full automation of the processing.
Latest release: May 2013
简介
SPIM 等光片显微镜会产生大量数据,尤其是在长期延时模式下使用时。为了查看并在某些情况下分析数据,有必要对其进行处理,其中涉及时间点内视图的配准、延时配准中样本漂移的校正、每个时间点将数据融合成单个 3D 图像,这可能需要对融合体积进行多视图反卷积和 3D 渲染。这里我们描述如何在集群计算机上并行执行此类处理。
我们将使用源自蔡司提供的 SPIM 商业实现Lightsheet Z.1的数据。 Lightsheet Z.1 数据可能非常庞大,集群计算很可能是应对显微镜带来的海量数据的唯一方法。
每个集群在使用的硬件和运行的软件方面都不同,特别是调度系统。在这里,我们在 MPI-CBG 上使用一台集群计算机,该计算机由 44 节点组成,每个节点具有 12 Intel Xeon E5-2640 内核,运行频率为 2.50 GHz,并拥有 128GB 内存。集群节点可以访问由专用 Lustre Server 架构提供的 200TB 数据存储。有关 Lustre 的更多信息,请参阅第 here,足以说明它针对高性能输入/输出(读/写)操作进行了优化,这对于 SPIM 数据量至关重要。
该集群的每个节点都运行 CentOS 6.3 Linux 发行版。 MPI-CBG 集群上运行的排队系统是 LSF - Load Sharing Facility。各个排队系统的作业提交的基本原理是相同的,但确切的语法当然会有所不同。
版本说明
SPIM 注册是一个正在持续开发的软件。在插件 SPIM 注册 下收集的原始版本已于 2014 年被在 多视图重建 下收集的新插件集取代。此外,集群管道已更改为使用集中式 Linux 风格的主文件。 2015 年,该管道使用工作流程管理器 Snakemake 重新实现为 automated workflow。它允许在单个机器或 HPC 集群上自动映射和调度工作流逻辑。因此有 4 个版本可用。我们强烈建议使用最新版本:
-
Original SPIM registration pipeline - 包含使用 SPIM 注册 插件的集群管道的最详细描述。如果您没有太多 HPC/Linux 经验,请从这里开始。
-
NEW PIPELINE - 还使用 SPIM 注册 插件并引入主文件,不太冗长,需要一些命令行和 HPC 经验。
-
New Multiview Reconstruction pipeline - 基于多视图重建插件,使用主文件,为专家编写
-
Automated workflow for parallel Multiview Reconstruction - 使用工作流程管理器Snakemake实现自动化工作流程。
因此,如果您是新手,请阅读第一章(原始流程)的一些内容以熟悉,然后跳至更新的第三章(多视图重建流程)。要了解主文件的工作原理,请参阅第 2 章(新管道)。
原始 SPIM 注册管道
先决条件
在 Lightsheet Z.1 上保存数据
Lightsheet Z.1 数据保存为专有的 Zeiss 文件格式*.czi。蔡司正在与 Bio-Formats 合作,使 .czi 文件与包括 Fiji 在内的开源平台兼容。目前 Fiji 只能打开 .czi 文件,这些文件在每个视图中保存为单个文件,其中左照明图像和右照明图像已在 Zeiss ZEN 软件内融合为一张图像。这种情况将会改变,目前,如果你想用斐济处理数据,就以这种方式保存它们(待定)。
熟悉Linux命令行环境
集群计算机很可能不运行任何图形用户界面,而是完全依赖于命令行。从命令行控制集群相当简单 - 我使用大约 10 个不同的命令来完成我需要做的一切。由于大多数生物学家可能不熟悉 Linux 命令行,因此我们创建了一个单独的 Linux command line tutorial 页面来解释基本要点。
传输数据
首先我们必须将数据获取到集群。这说起来容易做起来难,因为我们可能正在谈论 TB 级的数据。强烈建议通过 10Gb 以太网移动数据,否则数据传输将需要数天时间。
请注意,目前蔡司处理计算机不支持采集计算机采集时的数据传输,这意味着您在预订仪器时需要包含传输时间。通过共享 1Gb 网络连接传输 5TB 数据将需要一段时间…
在集群上安装 Fiji
In case you use the MPI-CBG cluster ‘madmax’ you might spare yourself some minutes and just hijack Pavel’s well maintained Fiji installation. Just skip the Fiji installation section and do not change the path to the Fiji executables (/sw/people/tomancak/packages/...) used in the example scripts shown below.)
更改为您有足够权限安装软件的目录。
cd /sw/people/tomancak/packages从 Fiji’s download page 下载 Fiji 夜间版本。
wget http://jenkins.imagej.net/job/Stable-Fiji/lastSuccessfulBuild/artifact/fiji-linux64.tar.gz或
卷曲-O http://jenkins.imagej.net/job/Stable-Fiji/lastSuccessfulBuild/artifact/fiji-linux64.tar.gz您很可能需要 Linux(64 位)版本(当然,除非您使用某种 Windows/Mac 集群)。解压缩并解压缩 tarball
gunzip fiji-linux64.tar.gz
tar -xvf fiji-linux64.tar从命令行更改为新创建的 Fiji-app 目录和 update Fiji
./ImageJ-linux64 --update 更新The output that follows may have some warnings and errors, but as long as it says somewhere “Done: Checksummer” and “Done: Downloading…” everything should be fine.
完成后,您就可以在集群上使用 Fiji 了。
重命名文件
我们需要将文件名从简单的索引更改为包含时间点和角度信息的模式。
Zeiss SPIM 的输出文件如下所示:
cd /projects/tomancak_lightsheet/Christopher/29072013_HisRuby_Stock1
LS
29072013_HisRuby_Stock1.czi
29072013_HisRuby_Stock1(1).czi
29072013_HisRuby_Stock1(2).czi
29072013_HisRuby_Stock1(3).czi
29072013_HisRuby_Stock1(4).czi
...在此示例中,我们有 5 个角度。显示的文件显示该时间序列的第一个时间点。第一个文件(不包含索引)是主文件。该文件将打开蔡司程序中的所有后续文件,但也包含第一个时间点的第一个角度。我们需要为该文件指定索引 (0) 才能使用它。忽略此文件将导致数据发生移帧。
cd /projects/tomancak_lightsheet/Christopher/29072013_HisRuby_Stock1
LS
29072013_HisRuby_Stock1(0).czi
29072013_HisRuby_Stock1(1).czi
29072013_HisRuby_Stock1(2).czi
29072013_HisRuby_Stock1(3).czi
29072013_HisRuby_Stock1(4).czi
...现在我们可以使用以下 shell 脚本重命名文件。制作一个名为 rename-zeis-files.sh 的脚本,修改 angles、last index 和 source pattern。
#角度数=5
角度=( 320 32 104 176 248 )
#索引
第一个索引=0
最后索引=344
#时间点
第一个时间点=1
#源模式
source_pattern=../29072013_HisRuby_Stock1\{index\}.czi
target_pattern=../spim_TL\{时间点\}_Angle\{角度\}.czi
#--------------------------------------------------------
我=${first_index}
t=${first_timepoint}
while [ $i -le ${last_index} ];做
#a=1
# while [ $a -le ${num_angles} ];做
for a in "${angles[@]}"; do
source=${source_pattern/\{index\}/${i}}
tmp=${target_pattern/\{timepoint\}/${t}}
target=${tmp/\{angle\}/${a}}
echo ${source} ${target}
mv ${source} ${target}
let i=i+1
# let a=a+1
done
let t=t+1
完成
chmod a+x
./重命名-zeiss_files.sh这些文件现在应该这样命名:
cd /projects/tomancak_lightsheet/Christopher/29072013_HisRuby_Stock1
LS
spim_TL1_Angle32.czi
spim_TL1_Angle104.czi
spim_TL1_Angle176.czi
spim_TL1_Angle248.czi
spim_TL1_Angle320.czi
...要检查所有时间点和时间点的角度是否都存在,可以使用以下脚本。修改时间点和角度数。
#!/bin/bash
#时间点
对于 `seq 1 72` 中的 i
做
num=$(ls ../spim_TL"$i"_Angle*.czi |wc -l)
#角度数
如果 [ $num -ne 5 ]
那么
echo "TL"$i" TP 或角度缺失"
菲
完成该脚本将返回缺失的特定时间点或缺失角度的时间点。
将数据保存为tif
第一步,我们将打开 .czi 文件并将其另存为 .tif。这是必要的,因为斐济基于珠子的注册当前无法打开 .czi 文件。在一台计算机上,连续打开数百个文件(每个文件数 GB)并将它们重新保存为 tif 可能需要很长时间。我们将使用集群来显着加速该操作。
The Lustre filesystem on MPI-CBG cluster is made to be able to handle such situation, where hundreds of nodes are going to simultaneously read and write big files to it. If your cluster is using a Network File System (NFS) this may not be such a good idea…
我们的目录中有 240 个时间点、3 个视图的数据集(角度 325、235 和 280)
cd /projects/tomancak_lightsheet/Tassos/
LS -1
spim_TL1_Angle235.czi
spim_TL1_Angle280.czi
spim_TL1_Angle325.czi
spim_TL1_Angle235.czi
spim_TL1_Angle280.czi
spim_TL1_Angle325.czi
...我们创建一个子目录 jobs/resaving 并更改为它
mkdir -p 作业/重新保存
cd 作业/重新保存现在我们创建一个 bash 脚本 create-re saving-jobs that will generate the so called job files that will be submitted to the cluster nodes (I use nano but any editor will do. Using nano type nano create-re saving-jobs` and cut&paste the script from below into that file.)
#!/bin/bash
dir="/projects/tomancak_lightsheet/Tassos"
jobs="$dir/jobs/resaving"
mkdir -p $jobs
for i in `seq 1 240`
做
job="$jobs/resave-$i.job"
echo $job
echo "#!/bin/bash" > "$job"
echo "xvfb-run -a /sw/people/tomancak/packages/Fiji.app/ImageJ-linux64 \
-Ddir=$dir -Dtimepoint=$i -Dangle=280 \
-- --no-splash ${jobs}/resaving.bsh" >> "$job"
chmod a+x "$job"
完成我们通过编辑其中的参数来自定义脚本。人们可以将其视为一个模板,用作适应特定情况的起点。例如,我们可以更改要查找数据的目录dir、输出的位置jobs、要处理的时间点数量for i in $(seq 1 240)以及最重要的是要处理的角度-Dangle=280。我们在这里遵循的策略是创造就业机会,在所有可用时间点一次处理一个角度。
为了能够运行此脚本(以及我们将在下面进一步创建的其他脚本),您可能必须执行以下命令:chmod a+x create-resaving-jobs。最后通过调用 ./create-resaving-jobs 执行脚本(您必须位于包含脚本的文件夹中)。
这将在当前目录中生成 240 个resave-<number>.job文件
/projects/tomancak_lightsheet/Tassos/jobs/resaving/resave-1.job
/projects/tomancak_lightsheet/Tassos/jobs/resaving/resave-2.job
/projects/tomancak_lightsheet/Tassos/jobs/resaving/resave-3.job
...
/projects/tomancak_lightsheet/Tassos/jobs/resaving/resave-240.job
这些文件中的每一个看起来都是这样的
#!/bin/bash
xvfb-run -a /sw/people/tomancak/packages/Fiji.app/ImageJ-linux64
-Ddir=/projects/tomancak_lightsheet/Tassos
-Dtimepoint=38 -Dangle=280 -- --无飞溅
/projects/tomancak_lightsheet/Tassos/jobs/re saving/re saving.bsh运行此作业的任何集群节点都会在所谓的虚拟帧缓冲区中启动 fiji(这些节点没有启用图形功能,但我们可以模拟它),然后在 Fiji 内部它将启动名为 resaving.bsh 的 BeanShell 脚本,并向其传递参数:目录 (/projects/tomancak_lightsheet/Tassos)、时间点 (38) 和角度 (280)。
让我们在当前目录中创建该脚本
导入 ij.IJ;
导入 ij.ImagePlus;
导入java.lang.Runtime;
导入java.io.File;
导入 java.io.FilenameFilter;
运行时 = Runtime.getRuntime();
dir = System.getProperty( "dir" );
时间点 = System.getProperty( "时间点" );
角度 = System.getProperty( "角度" );
IJ.run("生物格式导入器", "open=" + dir + "spim_TL" + 时间点 + "_Angle" + 角度 + ".czi" +
" autoscale color_mode=默认指定_范围视图=[Standard ImageJ] stack_order=默认
t_begin=1000 t_end=1000 t_step=1");
IJ.saveAs("Tiff ", dir + "spim_TL" + 时间点 + "_Angle" + 角度 + ".tif");
/* 关闭 */
运行时.退出(0);The t_begin=1000 t_end=1000 are parameters passed to Bio-Formats Importer. This is a hack. The .czi files think that they are part of a long time-lapse despite the fact that they were saved as single, per angle .czi. In order to trick bioformats into opening just the timepoint which contains actual data we set the time coordinate way beyond the actual length of the time-course (in this case 240). This results in Bio-Formats importing the “last” timepoint in the series which contains the data. This will change!
现在我们需要创建另一个名为 submit-jobs 的 bash 脚本(最后一个)
#!/bin/bash
`ls ${1} | grep ".job$"`中的文件
做
bsub -q short -n 1 -R span[hosts=1] -o "out.%J" -e "err.%J" ${1}/$file
完毕这将查找当前目录中以 .job 结尾的所有文件(我们之前创建了它们),并使用 bsub 命令将所有文件提交到集群。
bsub -q短-n 1 -R跨度[主机= 1] -o“out.123345”-e“err.123456”./resave-1.job-q short选择作业将提交到的队列(该队列允许作业在 MPI-CBG 集群上运行长达 4 小时)。-n 1指定作业将请求多少个处理器,在本例中只有一个(我们将仅打开并保存一个文件)-R span[hosts=1]说,如果我们请求多个处理器,它们将位于一台物理机器(主机)上。-o "out.%J"将在当前目录中创建名为out.<job_number>的输出文件-e "err.%J"会将错误发送到当前目录中名为err.<job_number>的文件${1}/$file将计算为./resave-<number>.job,即集群节点将运行的 bash 脚本 - 见上文
让我们回顾一下。我们创建了 create-resaving-jobs,执行时会创建许多 resave-<number>.job 文件。这些将使用 submit-jobs 提交到集群,并且在集群节点上将使用 Fiji 和指定参数运行 resaving.bsh。
那么让我们运行它吧。我们需要发出以下命令
./提交工作。末尾的点告诉提交作业在哪里查找 .job 文件,即在当前目录中。你应该看到的是这样的
[tomancak@madmax 保存]$ ./submit-jobs .
作业 <445490> 已提交至队列 <short>。
作业 <445491> 已提交至队列 <short>。
作业 <445492> 已提交至队列 <short>。
....我们可以监控正在运行的作业
bjobs-r
作业 ID 用户统计队列 FROM_HOST EXEC_HOST JOB_NAME SUBMIT_TIME
445490 tomanca RUN 短 madmax n17 *ave-1.job 5 月 1 日 11:36
445491 tomanca RUN 短 madmax n33 *ave-2.job 5 月 1 日 11:36
445492 tomanca RUN 短 madmax n01 *ave-3.job 5 月 1 日 11:36
445493 tomanca RUN 短 madmax n18 *ave-4.job 5 月 1 日 11:36
445494 tomanca RUN 短 madmax n21 *ave-5.job 5 月 1 日 11:36或您的提交系统提供的任何内容。运行结束时,我们的工作目录中将有许多 err.<job_number> 和 out.<job_number> 文件。
err.445490
out.445490
err.445491
out.445491
....
err.* 希望是空的。 out.*包含斐济日志输出(如果有)。在本例中,它应该类似于 this。最重要的是,在目录 /projects/tomancak_lightsheet/Tassos 中,我们现在为每个 .czi 文件提供了相应的 .tif 文件,这是整个练习的目标
ls *角度280*
spim_TL1_Angle280.czi
spim_TL1_Angle280.tif
spim_TL2_Angle280.czi
spim_TL2_Angle280.tif
spim_TL3_Angle280.czi
spim_TL3_Angle280.tif
...我们可以删除 .czi 文件 (rm *.czi),因为我们不再需要它们(但首先检查一些 TIF!)。
现在我们必须对另外两个角度(325 和 235)重复整个过程。打开 create-reserving-jobs 并将 280 更改为 325,然后再次按照配方操作。当然有一些方法可以实现自动化。
在我们由 Lustre 文件系统支持的集群上,重新保存操作只需几分钟。想象一下发生了什么 - 多达 480 个处理器正在访问文件系统,读取 .czi 文件,并立即将其重新保存到与 tif 相同的文件系统中 - 所有这些都是同时进行的。每个文件大小为 1.8GB。请注意:这在较小的文件系统上可能根本不起作用 - Lustre 就是为此而设计的。
注册
SPIM 注册包括时间点内视图注册和跨时间点时间序列注册。两者都是使用 Fiji 的基于珠子的 SPIM 注册插件来实现的。按时间点配准是延时配准的先决条件。有关详细概述,请参阅here。
基于珠子的多视图注册
重新保存为 .tif, 后,SPIMage 处理管道中的第一个实际步骤是注册每个时间点内的视图。为此,我们将在斐济使用基于珠子的注册插件。第 here 描述了插件的原理,第 here 讨论了参数。
此描述重点关注集群处理,不太冗长,详细信息请参阅第 resaving 部分,因为原理是相同的。
在 jobs/registration 目录中创建 bash 脚本 create-registration-jobs
#!/bin/bash
dir="/projects/tomancak_lightsheet/Tassos"
工作=“$dir/jobs/registration_integral_img”
mkdir -p $作业
对于 `seq 1 240` 中的 i
做
job="$jobs/register-$i.job"
echo $job
echo "#!/bin/bash" > "$job"
echo "xvfb-run -a /sw/people/tomancak/packages/Fiji.app/ImageJ-linux64 \
-Ddir=$dir -Dtimepoint=$i -Dangles=325,280,235 \
-- --no-splash ${jobs}/registration.bsh$
chmod a+x "$job"
完成运行它来创建 240 个 registration-<number>.job bash 脚本
#!/bin/bash
xvfb-run -a /sw/people/tomancak/packages/Fiji.app/ImageJ-linux64
-Ddir=/projects/tomancak_lightsheet/Tassos -Dtimepoint=603
-悬挂=325,280,235,10,190 -- --无飞溅
/projects/tomancak_lightsheet/Tassos/jobs/registration_integral_img/registration.bsh将使用斐济运行registration.bsh
导入 ij.IJ;
导入 ij.ImagePlus;
导入java.lang.Runtime;
导入java.io.File;
导入 java.io.FilenameFilter;
运行时 = Runtime.getRuntime();
System.out.println(runtime.availableProcessors() + " 可用于多线程的核心");
dir = System.getProperty( "dir" );
时间点 = System.getProperty( "时间点" );
角度 = System.getProperty( "角度" );
IJ.run("基于微珠的配准", "select_type_of_registration=单通道" + " " +
"select_type_of_detection=[Difference-of-Mean (Integral image based)] " + " " +
"spim_data_directory=" + dir + " " +
"pattern_of_spim=spim_TL{t}_Angle{a}.tif" + " " +
"timepoints_to_process=" + timepoint + " " +
"angles_to_process=" + angles + " " +
"bead_brightness=[Advanced ...]" + " " +
"subpixel_localization=[3-dimensional quadratic fit (all detections)]" + " " +
"specify_calibration_manually xy_resolution=1.000 z_resolution=3.934431791305542" + " " +
"transformation_model=Affine" + " " +
"channel_0_radius_1=2" + " " +
"channel_0_radius_2=3" + " " +
"channel_0_threshold=0.0069"
);
/* 关闭 */
运行时.退出(0);由 submit-jobs 提交时在集群节点上
#!/bin/bash
`ls ${1} | grep ".job$"`中的文件
做
bsub -q short -n 1 -R span[hosts=1] -o "out.%J" -e "err.%J" ${1}/$file
完成一些提示和技巧
- 基于珠子的注册代码不是多线程,因此 1 个处理器就足够了 (
bsub -n 1) - 注册至少需要节点上尽可能多的内存才能同时打开所有视图(此处为 3x1.8GB)。由于我们的节点有 128GB 共享内存,所以这里并不是真正的问题,我们可以在一台机器上同时使用 12 个内核运行注册。
- 基于珠子的注册的关键参数是
channel_0_threshold=0.0069;使用 Fiji GUI 在本地工作站上确定它。集群通常没有图形界面。
延时注册
一旦每个时间点的配准完成,就需要将时间序列中的所有时间点配准到参考时间点(以消除成像期间潜在的样本漂移)。时间序列注册的参数在第 here 中进行了描述。
时间序列注册实际上并不是集群类型的任务,因为它以线性方式在单个处理器上运行。但到目前为止,我们在集群文件系统上拥有所有内容,因此在这里执行它很有用。 注意:我并不是说延时注册不能并行化,我们只是还没有实现它,因为它以当前的线性方式运行得相当快。
在簇头节点上执行除提交作业之外的任何操作都是一个非常糟糕的主意。 LSF 提供了一个有用的替代方案 - 一个特殊的交互式队列,允许我们直接连接到集群的空闲节点并交互式地执行命令。
bsub -q 交互式 -Is bash
作业 <445547> 已提交至队列 <interactive>。
<<Waiting for dispatch ...>>
<<Starting on n27>>我们现在位于节点 27 上,可以像在头节点上一样使用文件系统(并非每个排队系统都会启用此功能)。
我们创建一个 bash 脚本timelapse.interactive
#!/bin/bash
xvfb-run -a /sw/people/tomancak/packages/Fiji.app/ImageJ-linux64 \
-Ddir=/projects/tomancak_lightsheet/Tassos/ -Dtimepoint=1-240 \
-Dangles=325,280,235 \
-- --no-splash ./time-lapse.bsh它调用 time-lapse.bsh,它将使用适当的参数运行 fiji 来进行延时注册插件
导入 ij.IJ;
导入java.lang.Runtime;
运行时 = Runtime.getRuntime();
System.out.println(runtime.availableProcessors() + " 可用于多线程的核心");
dir = System.getProperty( "dir" );
时间点 = System.getProperty( "时间点" );
角度 = System.getProperty( "角度" );
IJ.run("基于微珠的配准", "select_type_of_registration=单通道" + " " +
"select_type_of_detection=[Difference-of-Mean (Integral image based)]" + " " +
"spim_data_directory=" + dir + " " +
"pattern_of_spim=spim_TL{t}_Angle{a}.tif" + " " +
"timepoints_to_process=" + timepoint + " " +
"angles_to_process=" + angles + " " +
"load_segmented_beads" + " " +
"subpixel_localization=[3-dimensional quadratic fit (all detections)]" + " " +
"specify_calibration_manually xy_resolution=1.000 z_resolution=3.934431791305542" + " " +
"transformation_model=Affine" + " " +
"channel_0_radius_1=2" + " " +
"channel_0_radius_2=3" + " " +
"channel_0_threshold=0.0098" + " " +
"re-use_per_timepoint_registration" + " " +
"timelapse_registration" + " " +
"select_reference=[Manually (specify)]" + " " +
"reference_timepoint=709"
);
/* 关闭 */
运行时.退出(0);执行timelapse.interactive
./timelapse.interactive将启动一长串延时拍摄注册输出。将其重定向到如下文件是个好主意:
./timelapse.interactive > timelapse_reg.out我们也可以通过发出以下命令从头节点运行延时注册
bsub -q 短 -n 1 -R 跨度[主机=1] -o "out.%J" -e "err.%J" ./timelapse.interactive在这种情况下,输出将进入工作目录中的 out.<job_number> 文件。
提示和技巧
- 延时注册的关键参数是
reference_timepoint=709。它可以是配准误差较低的时间点,也可以是时间序列中间的时间点。 - 在
timelapse.bsh(specify_calibration_manually xy_resolution=1.000 z_resolution=3.934431791305542)中指定z_resolution非常重要,否则插件将打开每个原始数据文件来读取元数据,这可能需要很长时间。 xy_resolution可以设置为 1,因为插件仅使用 xy 和 z 之间的比率- 对于很长的时间序列,样本可能会在视野中跳跃,可能需要分别注册该序列的多个片段。
融合
在多视图 SPIM 成像融合中,意味着将配准视图组合成单个输出图像。斐济目前实施两种不同的融合策略:基于内容的融合和多视图反卷积。有关详细概述,请参阅第 SPIM registration 页。
基于内容的多视图融合
配准后,我们需要将视图组合成单个输出图像。斐济的基于内容的融合算法通过评估局部图像熵并对多个视图重叠的区域中的信息进行差异加权来解决该问题。详细信息请参见here。
和之前一样,我们创建一个目录 jobs/fusion 并在其中 bash 脚本 create-fusion-jobs
#!/bin/bash
dir="/projects/tomancak_lightsheet/Tassos/"
工作=“$目录/工作”
mkdir -p $作业
对于 `seq 1 240` 中的 i
做
job="$jobs/fusion/fusion-$i.job"
echo $job
echo "#!/bin/bash" > "$job"
echo "xvfb-run -a /sw/people/tomancak/packages/Fiji.app/ImageJ-linux64 \
-Xms100g -Xmx100g -Ddir=$dir -Dtimepoint=$i -Dangles=325,280,235 \
-Dreference=120 -Dx=0 -Dy=0 -Dz=0 -Dw=1936 -Dh=1860 -Dd=1868 \
-- --no-splash /projects/tomancak_lightsheet/Tassos/jobs/fusion/fusion.bsh" \
>> "$job"
chmod a+x "$job"
完成这将生成许多fusion-<number>.job脚本
#!/bin/bash
xvfb-run -a /sw/people/tomancak/packages/Fiji.app/ImageJ-linux64 -Xms100g -Xmx100g
-Ddir=/projects/tomancak_lightsheet/Tassos/ -Dtimepoint=10 -Dangles=325,280,235
-Dreference=120 -Dx=0 -Dy=0 -Dz=0 -Dw=1936 -Dh=1860 -Dd=1868 -- --无飞溅
/projects/tomancak_lightsheet/Tassos/jobs/fusion/fusion.bsh其中每一个都将运行 fusion.bsh
导入 ij.IJ;
导入java.lang.Runtime;
运行时 = Runtime.getRuntime();
System.out.println(runtime.availableProcessors() + " 可用于多线程的核心");
dir = System.getProperty( "dir" );
时间点 = System.getProperty( "时间点" );
角度 = System.getProperty( "角度" );
参考 = System.getProperty(“参考”);
x = System.getProperty( "x" );
y = System.getProperty( "y" );
z = System.getProperty( "z" );
w = System.getProperty( "w" );
h = System.getProperty( "h" );
d = System.getProperty( "d" );
iter = System.getProperty( "iter" );
IJ.run("多视图融合", "select_channel=单通道" + " " +
"spim_data_directory=" + 目录 + " " +
"pattern_of_spim=spim_TL{t}_Angle{a}.tif timepoints_to_process=" + 时间点 + " " +
“角度=”+角度+“”+
"fusion_method=[融合成单个图像]" + " " +
"process_views_in_parallell=全部" + " " +
“混合”+“”+
“基于内容的权重_(快速,”+“”+
“downsample_output=4”+“”+
"registration=[通道0的时间点注册(reference="+reference+")]" + " " +
"crop_output_image_offset_x=" + x + " " +
“crop_output_image_offset_y=” + y + “” +
“crop_output_image_offset_z=” + z + “” +
"crop_output_image_size_x=" + w + " " +
“crop_output_image_size_y=” + h + “” +
“crop_output_image_size_z=” + d + “” +
"fused_image_output=[保存 2d 切片,每个时间点一个目录]");
/* 关闭 */
运行时.退出(0);由 submit-jobs 提交时在集群节点上
#!/bin/bash
`ls ${1} | grep ".job$"`中的文件
做
bsub -q short -n 12 -R span[hosts=1] -o "out.%J" -e "err.%J" ${1}/$file
完成提示和技巧:
- 无论如何,融合都是内存密集型的。
- 基于内容的融合必然会降低图像质量。因此,只有出于可视化目的(例如 3D 渲染)融合图像才有意义。
- 没有必要甚至不可能对全分辨率数据进行 3D 渲染。因此,我们使用
downsample_output=4选项将其缩小 4 倍。 - 下采样还降低了融合数据的存储要求,这对于全分辨率数据(数十 TB)来说是不现实的。
- 融合代码是多线程的,因此我们在一台主机上请求 12 个处理器
bsub -n 12 -R span[hosts=1],并请求尽可能多的内存fiji-linux64 -Xms100g -Xmx100g。请求 12 个主机可保证单个节点上的所有内存均可用于该作业 (128GB)。当其他人在集群上运行小型单处理器作业时,可能很难做到这一点。 - 积分图像介导的加权比传统的高斯方法快得多,对于大图像,它可能是唯一的选择,因为也可以用完此数据的 128GB RAM。
多视图反卷积
另一种更先进的融合注册数据的方法是多视图反卷积,如第 here 节所述。
反卷积可以在 CPU(中央处理单元 - 即计算机的主处理器)或 GPU(图形处理单元 - 即显卡)上执行。 GPU 处理的先决条件是拥有一个或多个具有CUDA功能的显卡,例如 NVIDIA Tesla 或 Quadro 或 GeForce。由于 GPU 加速的多视图反卷积尚未发布,并且必须根据请求从 Stephan Preibisch 获取必要的 C 代码,因此我们现在将重点关注使用 CPU 的反卷积。
GPU 介导的反卷积速度更快,但目前只有 2-3 倍,因此 CPU 版本是有意义的,特别是当您拥有大量 CPU 且没有或很少有 GPU 时。
CPU 上的多视图解卷积
与上述多视图融合插件相反,Stephan Preibisch,以他无限的智慧;-),没有实现在反卷积开始之前缩小数据的选项。由于反卷积是一项非常昂贵的操作,因此在全分辨率数据上将花费很长的时间(数小时)。如果通过反卷积融合数据的唯一目的是以 3D 方式渲染它们,则不需要全分辨率图像,因此我们需要下采样。幸运的是,Stephan 以脚本的形式实现了一种解决方法,该脚本将转换(例如缩放)添加到原始 SPIM 数据中。
该脚本可以在 Plugins › SPIM registration › Utilities › Apply external transformation 下找到(或按 L 并输入 Apply external transformation)。最初的对话框让人想起 SPIM 注册,但随后出现的屏幕则不然。
我们看到的是所谓的仿射变换矩阵,它将通过基于珠的配准预先连接到配准文件中的变换矩阵。矩阵的 m00、m11 和 m22 项代表图像的缩放比例,因此通过将它们全部设置为 0.5,我们会将图像缩小 2 倍。
运行应用外部转换的输出将如下所示:
预连接模型:
3d-affine: (0.5, 0.0, 0.0, 0.0, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.5, 0.0)
Applying model to: spim_TL400_Angle1.tif.registration.to_400
Applying model to: spim_TL400_Angle2.tif.registration.to_400
Applying model to: spim_TL400_Angle3.tif.registration.to_400
Applying model to: spim_TL400_Angle4.tif.registration.to_400
Applying model to: spim_TL400_Angle5.tif.registration.to_400
Applying model to: spim_TL400_Angle6.tif.registration.to_400
registration/目录中的注册文件spim_TL400_Angle1.tif.registration.to_400现在将以如下内容结尾:
Previous model: (0.996656, 0.0014411004, 0.003138572, -5.4490294, -0.0019162297, 0.9955152, -8.5441023E-4, -81.664116, -5.4249633E-4, -2.910602E-4, 0.9978538, 10.278229)
Pre-concatenated model: (0.5, 0.0, 0.0, 0.0, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.5, 0.0)
现在这看起来很优雅,但有几个注意事项。转换模型的预串联是不可逆的(或者至少在当前代码框架中不容易),因此在应用外部转换之前,我们建议归档旧的、未修改的注册文件。例如,将它们打包到 tar 存档中
tar -cvf all_to_400_regs.tar *.to_400并解压缩以获得原始的、未改变的变换模型
tar -xvf all_to_400_regs.tar第二期,也是重要的一期。新的转换(缩放)必须应用于注册时间序列中的每个时间点,包括参考时间点。为了更好地衡量,还需要仅将转换应用于参考时间点的原始非时间序列.registration 文件。不要问我为什么……这两个步骤(将转换模型预连接到参考时间点一次)实际上是不可集群的,因此我们建议在斐济的本地计算机上手动执行这些步骤,并将修改后的注册文件复制到集群上的 registration/ 目录中。是的,它很笨重,但总比没有好。
现在我们已经准备好对缩小的数据进行集群介导的反卷积。现在你应该知道该怎么做了…创建一个目录 jobs/devolve 并在其中添加一个 bash 脚本 create-deconvolution-jobs
#!/bin/bash
dir="/projects/tomancak_lightsheet/Tassos"
工作=“$dir/工作/反卷积”
mkdir -p $作业
对于 `seq 1 240` 中的 i
做
job="$jobs/deconvolution-$i.job"
echo $job
echo "#!/bin/bash" > "$job"
echo "xvfb-run -a /sw/people/tomancak/packages/Fiji.app/ImageJ-linux64 \
-Xms100g -Xmx100g -Ddir=$dir -Dtimepoint=$i -Dangles=1-6 -Dreference=714 \
-Dx=36 -Dy=168 -Dz=282 -Dw=1824 -Dh=834 -Dd=810 -Diter=10 \
-- --no-splash /projects/tomancak_lightsheet/Tassos/jobs/deconvolution/deconvolution.bsh" \
>> "$job"
chmod a+x "$job"
完成这将生成许多deconvolution-<number>.job脚本
#!/bin/bash
xvfb-run -a /sw/people/tomancak/packages/Fiji.app/ImageJ-linux64 -Xms100g -Xmx100g
-Ddir=/projects/tomancak_lightsheet/Valia/Valia -Dtimepoint=1 -Dangles=1-6 -Dreference=714
-Dx=36 -Dy=168 -Dz=282 -Dw=1824 -Dh=834 -Dd=810 -Diter=10 -- --无飞溅
/projects/tomancak_lightsheet/Tassos/jobs/devolve/devolve.bsh注意新参数iter,它指定我们要运行多少次多视图反卷积迭代。这应根据斐济本地 GUI 设置凭经验确定。
每个*反卷积-
导入 ij.IJ;
导入java.lang.Runtime;
fiji.plugin.Multi_View_Devolving.psfSize = 31;
fiji.plugin.Multi_View_Devolving.isotropic = true;
运行时 = Runtime.getRuntime();
System.out.println(runtime.availableProcessors() + " 可用于多线程的核心");
dir = System.getProperty( "dir" );
时间点 = System.getProperty( "时间点" );
角度 = System.getProperty( "角度" );
参考 = System.getProperty(“参考”);
x = System.getProperty( "x" );
y = System.getProperty( "y" );
z = System.getProperty( "z" );
w = System.getProperty( "w" );
h = System.getProperty( "h" );
d = System.getProperty( "d" );
iter = System.getProperty( "iter" );
//首先我们预连接一个变换矩阵,将图像缩小 2 倍,
//如果要对全分辨率数据进行反卷积,请注释掉以下宏命令。
IJ.run("应用外部变换",
"spim_data_directory=" + dir + " " +
"pattern_of_spim=spim_TL{t}_Angle{a}.tif" + " " +
"timepoints_to_process=" + timepoint + " " +
"angles=" + angles + " " +
"how_to_provide_affine_matrix=[As individual entries]" + " " +
"m00=0.5 m01=0 m02=0 m03=0 m10=0 m11=0.5 m12=0 m13=0 m20=0 m21=0 m22=0.5 m23=0" + " " +
"apply_to=[Time-point registration (reference=" + reference + ")]");
IJ.run("多视图解卷积", "spim_data_directory=" + dir + " " +
"pattern_of_spim=spim_TL{t}_Angle{a}.tif" + " " +
"timepoints_to_process=" + timepoint + " " +
"angles=" + angles + " " +
"registration=[Time-point registration (reference=" + reference + ") of channel 0]" + " " +
"crop_output_image_offset_x=" + x + " " +
"crop_output_image_offset_y=" + y + " " +
"crop_output_image_offset_z=" + z + " " +
"crop_output_image_size_x=" + w + " " +
"crop_output_image_size_y=" + h + " " +
"crop_output_image_size_z=" + d + " " +
"type_of_iteration=[Conditional Probability (fast, precise)]" + " " +
"number_of_iterations=" + iter + " " +
"use_tikhonov_regularization tikhonov_parameter=0.0060" + " " +
"imglib_container=[Array container]" + " " +
"compute=[in 512x512x512 blocks]" + " " +
//“blocksize_x=1024blocksize_y=1024blocksize_z=1024”+“”+
"compute_on=[CPU (Java)]" + " " +
"fused_image_output=[Save 2d-slices, one directory per time-point]"
);
/* 关闭 */
运行时.退出(0);这里重要的是以下参数:
number_of_iterations=10指定迭代次数(10是一个不错的猜测)compute_on=[CPU (Java)]这里我们表明我们想要使用CPUcompute=[in 512x512x512 blocks]除非我们确实有大量可用内存,否则我们很可能必须以块为单位进行计算。fiji.plugin.Multi_View_Deconvolution.psfSize = 31;这个参数现在应该被认为是高级的,它指定用于从图像中的珠子中提取点扩散函数(PSF)的区域的大小。默认值为 19。
否则参数类似于基于内容的融合或常数。
由 submit-jobs 提交时在集群节点上
#!/bin/bash
`ls ${1} | grep ".job$"`中的文件
做
bsub -q medium -n 12 -R span[hosts=1] -o "out.%J" -e "err.%J" ${1}/$file
完成提示和技巧:
- 多视图反卷积需要尽可能多的内存。
- 可以通过使用较小的块来减轻内存需求,并且处理将花费更长的时间。
- 输出的反卷积图像将具有极其压缩的动态范围,即打开时看起来漆黑。将最小值和最大值设置为 0.0 和 0.05 以查看任何内容。
- 珠子的 PSF 将变得更小(理想情况下是点)但更亮。
- 与内容融合或原始数据相比,图像会显得更加嘈杂。
- devolving.bsh 脚本默认在反卷积开始之前缩小图像。如果您想这样做,请不要忘记首先手动缩小参考时间点(如所述 - 原始和延时注册版本),使用它来定义本地计算机上的裁剪区域,并将参考时间点的
.registration和.registration.to_<reference timepoint>文件传输到集群。 - 事实上最好在本地执行参考时间点的整个反卷积过程并将结果传输到集群。首先,最好尝试迭代次数并查看反卷积对数据的影响。其次,由于在集群上,我们将缩小范围应用于所有时间点 - 这包括我们在本地计算机上应用转换的参考(请参阅上面的提示)。因此,参考时间点最终缩小了两次。如果你不明白 - 给我打电话;-)。
- 为了对全分辨率数据进行反卷积,无需执行上一步,但必须在反卷积脚本中注释掉预连接宏。不然事情会变得很奇怪!
GPU 上的多视图反卷积
即将推出。
3D 渲染
最后,我们希望对下采样、融合的数据生成漂亮的 3D 渲染,并在会议上将其作为电影运行……;-)。
3D 渲染的准备阶段有点复杂。我们将使用interactive Stack Rotation插件以我们想要的渲染方式定位样本,然后将其发送到3DViewer插件。这是食谱:
-
打开融合图像堆栈并启动交互式堆栈旋转插件 (Plugins › Transform › Interactive Stack Rotation)。 注意:熟悉导航交互式堆栈旋转的按键。这是一种查看来自 SPIM 的近各向同性 3D 数据的极其强大的方法。遵循这些击键约定的更高级版本即将登陆斐济(由 Tobias Pietzsch 编写)。
-
使用键盘命令将样本旋转到您想要对其进行 3D 渲染的位置。 请注意,在 3d 查看器中渲染时,具有较低 z 索引的顶部切片将面向您。
-
按E记录变换。变换矩阵将出现在斐济日志窗口中。
-
将转换复制到如下所示的第 41 行的
render.bsh脚本中(如果不确定,请阅读注释)。 -
按↵ Enter 将转换应用到堆栈。
-
现在使用矩形工具定义一个裁剪区域,其中将包括具有最小背景的样本。记下裁剪区域的x、y坐标宽度和高度并将它们粘贴到
render.bsh脚本中(第128行)。 注意:捕获数字的更有效方法是先开始宏记录,然后简单地从宏记录器窗口复制并粘贴它们。 -
应用作物(Image › Crop)。
-
确定样本开始和结束的 z 索引并将其粘贴到 render.bsh 脚本中(第 131 行)。
-
运行“复制”命令 (Image › Duplicate) 并输入 z 索引作为范围(例如 20-200)。这一系列操作的结果应该是一个剪裁紧凑的样本堆。
-
调整堆栈上的亮度和对比度以良好地查看数据,也许稍微饱和,并将最小值和最大值写入 render.bsh 脚本(第 31 行)。
-
启动 3d 查看器并尝试阈值(3d 查看器然后 Edit › Adjust Threshold)和透明度(3DViewer 然后Edit › Change Transparency)并将它们输入到 render.bsh 脚本中(第 154 和 156 行)。
-
最后修改 3D 查看器拍摄的快照尺寸,以匹配第 161 行裁剪区域的尺寸(宽度和高度)。
我们准备通过在目录 jobs/3d_rendering 中创建我们的老朋友 create-render-job bash 脚本来开始集群处理
#!/bin/bash
dir="/projects/tomancak_lightsheet/Tassos/"
工作=“$目录/工作”
mkdir -p $作业
对于 `seq 1 241` 中的 i
做
job="$jobs/3d_rendering/render-$i.job"
echo $job
echo "#!/bin/bash" > "$job"
echo "xvfb-run -as\"-screen 0 1280x1024x24\" \
/sw/people/tomancak/packages/Fiji.app/ImageJ-linux64 \
-Xms20g -Xmx20g -Ddir=$dir -Dtimepoint=$i -Dangle=1 \
-- --no-splash $dir/jobs/3d_rendering/render.bsh" >> "$job"
chmod a+x "$job"
完成谁将创造render-<number>.job
#!/bin/bash
xvfb-run -as"-screen 0 1280x1024x24" /sw/people/tomancak/packages/Fiji.app/ImageJ-linux64 -Xms20g -Xmx20g -Ddir=/projects/tomancak_lightsheet/Tassos \
-Dtimepoint=1 -Dangle=1 -- --no-splash /projects/tomancak_lightsheet/Tassos/jobs/3d_rendering/render.bsh每个 bash 脚本都会向 render.bsh BeanShell 脚本传递目录、时间点和渲染角度参数。脚本比以前复杂一点。它结合了 Saalfeld 的 BeanShell 魔法和我笨拙的宏编程。对于每个单独的渲染运行,有必要根据上面的配方更改脚本内的参数。
导入java.lang.Runtime;
导入 ij.ImagePlus;
导入 ij.ImageStack;
导入 ij.process.ImageProcessor;
导入 ij.IJ;
导入 ij.measure.Calibration;
导入 mpicbg.ij.stack.InverseTransformMapping;
导入 mpicbg.models.TranslationModel3D;
导入 mpicbg.models.AffineModel3D;
导入 mpicbg.models.InverseCooperativeTransformList;
运行时 = Runtime.getRuntime();
dir = System.getProperty("dir");
时间点 = System.getProperty( "时间点" );
角度 = System.getProperty("角度");
System.out.println("开幕");
System.out.println(dir);
System.out.println(时间点);
/*宏*/
/* 打开融合图像堆栈*/
IJ.run("图像序列...", "open=" + dir + "/output_fusion/" + " " +
"number=809 starting=1 increment=1 scale=100" + " " +
"file=img_tl" + timepoint + "_" + " " +
"or=[] sort");
/* !!!!!!!!!!!!调整输入图像的最小值和最大值!!!!!!!!! */
ij.IJ.setMinAndMax(200, 600);
/* 如果需要的话用宏缩小规模 */
System.out.println("缩放");
IJ.run("缩放...", "x=0.5 y=0.5 z=0.5 深度=405 插值=双线性平均过程创建标题=缩放");
System.out.println("旋转");
/* !!!!!!!!!!!!将交互式堆栈旋转中的 3d 变换矩阵粘贴到此处。删除任何文本,仅删除必须以大括号开头和结尾的数字!!!!!!!!!! */
am = 新浮点[]{
0.97536975, -0.14100166, 0.16962992, 0.0, -0.18503368, -0.9416376, 0.28122446, 0.0, 0.12007594, -0.30568472, -0.9445343, 0.0};
imp = IJ.getImage();
System.out.println(imp);
/* 取消缩放 */
c = imp.getCalibration();
zFactor = (float)(c.pixelDepth / c.pixelWidth);
unScale = new AffineModel3D();
取消缩放.设置(
1.0f, 0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f, 0.0f,
0.0f, 0.0f, zFactor, 0.0f);
/* 中心偏移 */
centerShift = new TranslationModel3D();
centerShift.set(-imp.getWidth() / 2, -imp.getHeight() / 2, -imp.getStack().getSize() / 2 * zFactor);
/* 居中不移位 */
centerUnShift = new TranslationModel3D();
centerUnShift.set(imp.getWidth() / 2, imp.getHeight() / 2, imp.getStack().getSize() / 2 * zFactor);
/* 旋转 */
旋转 = new AffineModel3D();
旋转.设置(
am[0], am[1], am[2], am[3],
am[4], am[5], am[6], am[7],
am[8], am[9], am[10], am[11]);
变换 = new AffineModel3D();
变换.preConcatenate(unScale);
变换.preConcatenate(centerShift);
变换.preConcatenate(旋转);
变换.preConcatenate(centerUnShift);
/* 边界体积 */
min = new float[]{0, 0, 0};
max = new float[]{imp.getWidth(), imp.getHeight(), imp.getStack().getSize()};
变换.estimateBounds(最小值,最大值);
w = (int)Math.ceil(max[0] - min[0]);
h = (int)Math.ceil(max[1] - min[1]);
d = (int)Math.ceil(max[2] - min[2]);
/* 包围体偏移 */
minShift = new TranslationModel3D();
minShift.set(-min[0], -min[1], -min[2]);
变换.preConcatenate(minShift);
/* 渲染目标堆栈 */
映射=新的InverseTransformMapping(变换);
ip = imp.getStack().getProcessor(1).createProcessor(imp.getWidth(), imp.getHeight());
System.out.println(ip);
targetStack = new ImageStack(w, h);
for (s = 0; s < d; ++s) {
ip = ip.createProcessor(w, h);
mapping.setSlice(s);
try {
mapping.mapInterpolated(imp.getStack(), ip);
}
catch (Exception e) {
e.printStackTrace();
}
targetStack.addSlice("", ip);
}
/* 设置适当的校准(现在在以前的 x,y 尺度上是各向同性的) */
impTarget = new ImagePlus("目标", targetStack);
System.out.println(impTarget);
校准= imp.getCalibration().copy();
校准.像素深度 = 校准.像素宽度;
impTarget.setCalibration(校准);
impTarget.show();
/* 宏 */
System.out.println("裁剪");
IJ.run("选择边界框");
/* !!!!!!!!!!!! 输入裁剪区域的 x、y、宽度和高度。当处理上/下采样图像时,相应地乘或除数字!!!!!!!!!! */
ij.IJ.makeRectangle(24, 170, 960, 362);
IJ.run(“作物”);
/* !!!!!!!!!!!! 输入样本开始和结束处的 z 索引。当处理上/下采样图像时,相应地乘或除数字!!!!!!!!!! */
IJ.run("重复...", "重复范围=146-480");
impdupl = IJ.getImage(); // 捕获新窗口 - 谁知道为什么......
impdupl.show();
IJ.run("8 位");
IJ.run("添加...", "value=1 堆栈"); // 因为 3d 查看器会重新缩放边界框
System.out.println("渲染");
IJ.run("3D 查看器");
ij.IJ.等待(1000);
ij3d.ImageJ3DViewer.setCooperativeSystem(“假”);
ij3d.ImageJ3DViewer.add("target-1", "无", "target-1", "0", "true", "true", "true", "1", "0");
ij.IJ.等待(1000);
ij3d.ImageJ3DViewer.select("target-1");
ij.IJ.等待(1000);
ij3d.ImageJ3DViewer.setTransform("1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 -1050.0 0.0 0.0 0.0 1.0");
ij.IJ.等待(5000);
/* !!!!!!!!!!!! 输入 3D 查看器阈值!!!!!!!!! */
ij3d.ImageJ3DViewer.setThreshold("50");
/* !!!!!!!!!!!! 输入 3D 查看器透明度!!!!!!!!!! */
ij3d.ImageJ3DViewer.setTransparency("0.15");
ij.IJ.等待(5000);
ij3d.ImageJ3DViewer.select("虚拟");
/* !!!!!!!!!!!! 输入裁剪区域的宽度和高度。 !!!!!!!!!!!! */
ij3d.ImageJ3DViewer.snapshot("961", "356");
IJ.selectWindow("快照");
IJ.saveAs("Tiff", dir + "/rendering/render_tp" + 时间点 + "_Angle" + 角度 + ".tif");
/* 关闭 */
运行时.退出(0);我们像往常一样使用./submit-jobs .提交
#!/bin/bash
`ls ${1} | grep ".job$"`中的文件
做
bsub -q short -n 1 -R span[hosts=1] -o "out.%J" -e "err.%J" ${1}/$file
完成提示和技巧
- 这种制作 3D 渲染电影的方法仍然是一种 hack,尽管它比纯宏和 TransformJ 更好。我们正在研究更好的解决方案。
- 我们使用交互式堆栈旋转的相互作用来预处理图像,将其旋转到所需的位置,然后调用 3dVIewer 在该位置渲染它,同时放大一点。
- 您还可以使用 TransformJ 命令将融合堆栈旋转到您喜欢的方向,如果它太大,则可以将其裁剪,然后在 3dViewer 中打开它。将其记录为宏并使其工作(ala Stephan Preibisch)是可能的,但这是非常费力且令人伤脑筋的。
- 非常欢迎任何想将
render.bsh的宏部分重写为真实脚本的人。 - 显然,更好的方法是将变换矩阵传递给 3D 查看器,但事实证明这是不可靠的。
- 使其在集群上运行的关键是向
xvfb-run脚本提供有关屏幕尺寸的特定参数 (-as"-screen 0 1280x1024x24")。否则它不起作用。感谢斯蒂芬·萨尔菲尔德(Stephan Saalfeld)解决了这个问题。 - 集群使得试验参数和视角变得相当容易 - 在一台计算机上,相同的任务将需要几天的时间,而且由于我们使用 ImageJ 宏,您将无法触摸计算机。即使在其他用户满负载的情况下,MPI-CBG 集群也能在半小时内渲染 800 多个时间点。
3D 渲染相对复杂(我们正在研究更简单的解决方案),但非常有价值。 果蝇胚胎发生电影即将在这里上映。
处理2个通道
这部分将涉及2个通道的SPIM数据的处理。注册和融合的工作原理非常相似,只需要对上面的脚本进行一些调整,我将特别指出这一点。有两个主要区别:
-
Zeiss SPIM 目前不允许在快帧模式下采集 2 个通道时导出单个通道。因此,我们需要分割通道并将它们保存为单独的 .tif 文件。使用顺序模式时可以跳过此步骤。
-
在我们的例子中,只有 1 个通道有可见的珠子。因此,我们将仅在此频道上进行注册。然而,融合程序要求两个通道都存在注册文件。为了解决这个问题,我们只需从包含珠子的通道复制注册文件。
分离通道
按照上述步骤将数据重命名并保存为 .tif。数据现在应采用以下格式:
cd /projects/tomancak_lightsheet/Christopher/29072013_HisRuby_Stock1
LS
spim_TL1_Angle32.tif
spim_TL1_Angle104.tif
spim_TL1_Angle176.tif
spim_TL1_Angle248.tif
spim_TL1_Angle320.tif
...每个文件包含 2 个通道,我们需要将其拆分为单独的文件才能继续。我们将把各个频道保存到一个新的子目录中:
mkdir 分割为了分离通道,我们创建了一个 bash 脚本create-split-jobs。将此脚本保存在 jobs 目录的新子目录中。
mkdir 作业/split_channels
cd 作业/split_channelscreat-split-jobs 将创建发送到集群的作业。您需要编辑目录、时间点的数量和角度。
#!/bin/bash
#查找文件的目录路径
dir="/projects/tomancak_lightsheet/Christopher/29072013_HisRuby_Stock1/"
#path 在哪里可以找到作业脚本
工作=“$dir/工作/split_channels”
mkdir -p $作业
#修改时间点数量
对于 `seq 1 72` 中的 i
做
#修改角度
32 104 176 248 320 内
做
job="$jobs/split-$i-$a.job"
echo $job
echo "#!/bin/bash" > "$job"
echo "xvfb-run -a /sw/people/tomancak/packages/Fiji.app/ImageJ-linux64 \
-Ddir=$dir -Dtimepoint=$i -Dangle=$a \
-- --no-splash ${jobs}/split.bsh" >> "$job"
chmod a+x "$job"
done
完成运行这个脚本:
./创建分割作业creat-split-jobs 将使用 split.bsh (由 Stephan Saalfeld 编写)。该脚本会将每个文件分割成单独的通道,并将它们保存到目录split中。
导入 ij.IJ;
导入 ij.ImagePlus;
导入 ij.ImageStack;
导入java.lang.Runtime;
导入java.io.File;
导入 java.io.FilenameFilter;
运行时 = Runtime.getRuntime();
dir = System.getProperty( "dir" );
时间点 = System.getProperty( "时间点" );
角度 = System.getProperty( "角度" );
//打开图像
System.out.println( 目录 );
imp = new ImagePlus( dir + "spim_TL" + 时间点 + "_Angle" + 角度 + ".tif" );
System.out.println( imp.getTitle() );
/* 分割通道 */
堆栈 = imp.getStack();
for ( c = 0; c < imp.getNChannels(); ++c )
{
channelStack = new ImageStack( imp.getWidth(), imp.getHeight() );
for ( z = 0; z < imp.getNSlices(); ++z )
channelStack.addSlice(
"",
stack.getProcessor(
imp.getStackIndex( c + 1, z + 1, 1 ) ) );
impc = new ImagePlus( imp.getTitle() + " #" + ( c + 1 ), channelStack );
/*将各个文件保存在/split目录中*/
IJ.save( impc, dir + "/split/" + imp.getTitle().replaceFirst( ".tif$", "_Channel" + ( c ) + ".tif" ) );
}
/* 关闭 */
运行时.退出(0);使用脚本“submit-jobs”将作业发送到集群。
用一小部分设备进行测试运行是值得的。然后,您可以通过查看输出文件来确定作业的粗略运行时间和内存要求。这些信息将使排队系统更快地安排您并消除失败的作业。分割速度相当快,需要 1-2 分钟,并且需要很少的内存。
#!/bin/bash
`ls ${1} | grep ".job$"`中的文件
做
bsub -q short -n 1 -W 00:05 -R span[hosts=1] -o "out.%J" -e "err.%J" ${1}/$file
完成- “-W 00:05”将作业的有效时间限制为 5 分钟。
通过以下方式运行脚本:
./提交工作。最后,您应该在目录split中找到各个频道。在时间点和角度的信息中添加频道信息。
cd /projects/tomancak_lightsheet/Christopher/29072013_HisRuby_Stock1/split
LS
spim_TL1_Angle32_Channel0.tif
spim_TL1_Angle32_Channel1.tif
spim_TL1_Angle104_Channel0.tif
spim_TL1_Angle104_Channel1.tif
spim_TL1_Angle176_Channel0.tif
spim_TL1_Angle176_Channel1.tif
spim_TL1_Angle248_Channel0.tif
spim_TL1_Angle248_Channel1.tif
spim_TL1_Angle320_Channel0.tif
spim_TL1_Angle320_Channel1.tif
...您现在可以删除包含两个通道的 .tif 文件。确定哪个通道包含珠子。仅在该通道上进行多视图配准和延时配准。
2 个频道的多视图注册
在此示例中,珠子在通道 1 中可见。因此,我们将继续注册该通道。在create-registration-jobs脚本中修改目录、时间点数量和角度(-Dangles)。
#!/bin/bash
#修改目录
dir="/projects/tomancak_lightsheet/Christopher/29072013_HisRuby_Stock1/split/"
工作=“/projects/tomancak_lightsheet/Christopher/29072013_HisRuby_Stock1/jobs/registration”
mkdir -p $作业
#时间点数量
对于 `seq 1 72` 中的 i
做
job="$jobs/register-$i.job"
echo $job
echo "#!/bin/bash" > "$job"
#修改-悬挂物
echo "xvfb-run -a /sw/people/tomancak/packages/Fiji.app/ImageJ-linux64 \
-Ddir=$dir -Dtimepoint=$i -Dangles=32,104,176,248,320 \
-- --no-splash ${jobs}/registration.bsh" >> "$job"
chmod a+x "$job"
完成
./创建注册职位registration.bsh 原则上与单通道中的相同。您唯一需要修改的是pattern_of_spim,否则程序将无法识别这些文件。只需将频道名称添加到文件名中即可。
与之前一样,您可以根据手动确定的参数更改 z 分辨率、半径 channel_0_radius_1、channel_0_radius_2 和 channel_0_threshold。
导入 ij.IJ;
导入 ij.ImagePlus;
导入java.lang.Runtime;
导入java.io.File;
导入 java.io.FilenameFilter;
运行时 = Runtime.getRuntime();
System.out.println(runtime.availableProcessors() + " 可用于多线程的核心");
dir = System.getProperty( "dir" );
时间点 = System.getProperty( "时间点" );
角度 = System.getProperty( "角度" );
IJ.run("基于微珠的配准", "select_type_of_registration=单通道" + " " +
"select_type_of_detection=[Difference-of-Mean (Integral image based)] " + " " +
"spim_data_directory=" + dir + " " +
/*修改文件格式*/
"pattern_of_spim=spim_TL{t}_Angle{a}_Channel1.tif" + " " +
"timepoints_to_process=" + timepoint + " " +
"angles_to_process=" + angles + " " +
//“load_segmented_beads”+“”+
"bead_brightness=[Advanced ...]" + " " +
"subpixel_localization=[3-dimensional quadratic fit (all detections)]" + " " +
"specify_calibration_manually xy_resolution=1.000 z_resolution=3.4972729682922363" + " " +
"transformation_model=Affine" + " " +
"channel_0_radius_1=3" + " " +
"channel_0_radius_2=5" + " " +
"channel_0_threshold=0.0070"
);
/* 关闭 */
运行时.退出(0);submit-jobs 脚本已根据注册要求进行修改。在将这些参数应用到所有文件之前,先确定一小组参数。
-n 5每个角度使用一个处理器。-W 00:15工作时间限制为 15 分钟。-R rusage[mem=10000]需要 10000MB 内存。
#!/bin/bash
`ls ${1} | grep ".job$"`中的文件
做
bsub -q short -n 5 -W 00:15 -R rusage[mem=10000] -R span[hosts=1] -o "out.%J" -e "err.%J" ${1}/$file
完成
./提交工作。注册文件现在应该写入registration目录中。对于每个时间点的每个角度,应存在 3 个配准文件:
cd /projects/tomancak_lightsheet/Christopher/29072013_HisRuby_Stock1/split/registration
LS
spim_TL1_Angle32_Channel1.tif.beads.txt
spim_TL1_Angle32_Channel1.tif.dim
spim_TL1_Angle32_Channel1.tif.registration
...2 个通道的延时注册
在脚本timelapse.interactive中修改-Ddir=、-Dtimepoint=、-Dreferencetp=(选择一个好的时间点作为参考)和-Dangles=。
#!/bin/bash
xvfb-run -a /sw/people/tomancak/packages/Fiji.app/ImageJ-linux64 \
-Ddir=/projects/tomancak_lightsheet/Christopher/29072013_HisRuby_Stock1/split/ \
-Dtimepoint=1-72 -Dreferencetp=1 -Dangles=32,104,176,248,320 \
-- --no-splash ./time-lapse.bsh与多视图注册类似,将频道信息添加到脚本第 pattern_of_spim 部分的文件名中。
像以前一样给出 z 分辨率、channel_0_radius_1、channel_0_radius_2 和 channel_0_threshold。
导入 ij.IJ;
导入java.lang.Runtime;
运行时 = Runtime.getRuntime();
System.out.println(runtime.availableProcessors() + " 可用于多线程的核心");
dir = System.getProperty( "dir" );
时间点 = System.getProperty( "时间点" );
角度 = System.getProperty( "角度" );
Referencetp = System.getProperty( "referencetp" );
IJ.run("基于微珠的配准", "select_type_of_registration=单通道" + " " +
"select_type_of_detection=[Difference-of-Mean (Integral image based)]" + " " +
"spim_data_directory=" + dir + " " +
/*修改pattern_of_spim*/
"pattern_of_spim=spim_TL{t}_Angle{a}_Channel1.tif" + " " +
"timepoints_to_process=" + timepoint + " " +
"angles_to_process=" + angles + " " +
"load_segmented_beads" + " " +
"subpixel_localization=[3-dimensional quadratic fit (all detections)]" + " " +
"specify_calibration_manually xy_resolution=1.000 z_resolution=3.278693914413452" + " " +
"transformation_model=Affine" + " " +
"channel_0_radius_1=3" + " " +
"channel_0_radius_2=5" + " " +
"channel_0_threshold=0.007" + " " +
"re-use_per_timepoint_registration" + " " +
"timelapse_registration" + " " +
"select_reference=[Manually (specify)]" + " " +
"reference_timepoint=" + referencetp
);
/* 关闭 */
运行时.退出(0);根据您延时注册的需要再次修改submit-jobs脚本。对于我的示例,这些修改有效:
-W 0025-R rusage[mem=5000]``` shell #!/bin/bash
bsub -q short -n 12 -W 00:25 -R rusage[mem=5000] -R span[hosts=1] -o “out.%J” -e “err.%J” ./timelapse.interactive
./submit-jobs .
将在目录 `registration` 中创建一个附加注册文件。
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nb">cd</span> /projects/tomancak_lightsheet/Christopher/29072013_HisRuby_Stock1/split/registration
LS
spim_TL1_Angle32_Channel1.tif.beads.txt
spim_TL1_Angle32_Channel1.tif.dim
spim_TL1_Angle32_Channel1.tif.registration
spim_TL1_Angle32_Channel1.tif.registration.to_1
...</code></pre></figure>
#### 重复的注册文件
由于融合需要提供两个通道的注册文件,因此我们将复制通道 1 的现有文件并将它们保存为通道 0 的注册文件。以下脚本`duplicate_rename_registration.bsh`将执行此操作。在 jobs 目录中创建此脚本。
您需要修改**时间点**、**角度**、`registration.to_{your reference}`中使用的参考时间点和**目录**。
该脚本将复制现有文件并以新名称保存它们,仅更改通道名称。
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bsh</span>
<span class="c">#修改时间点</span>
对于 <span class="sb">`</span><span class="nb">seq </span>1 72<span class="sb">`</span> 中的 i
做
<span class="c">#修改角度 </span>
32 104 176 248 320 内
做
<span class="c">#修改延时注册文件结尾处的引用</span>
以“beads.txt”“dim”“registration”“registration.to_1”结尾
<span class="k">do</span>
<span class="c"># 相应修改目录</span>
<span class="nb">cd</span> /projects/tomancak_lightsheet/Christopher/29072013_HisRuby_Stock1/split/registration/
<span class="nb">cp</span> ./spim_TL<span class="s2">"</span><span class="nv">$i</span><span class="s2">"</span>_Angle<span class="s2">"</span><span class="nv">$a</span><span class="s2">"</span>_Channel1.tif.<span class="s2">"</span><span class="nv">$end</span><span class="s2">"</span> ./spim_TL<span class="s2">"</span><span class="nv">$i</span><span class="s2">"</span>_Angle<span class="s2">"</span><span class="nv">$a</span><span class="s2">"</span>_Channel0.tif.<span class="s2">"</span><span class="nv">$end</span><span class="s2">"</span>
<span class="k">done
</span>完成
完成
<span class="nb">echo </span>复制完成!祝你今天过得愉快!
出口0</code></pre></figure>
执行脚本:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">sh 重复重命名注册.bsh</code></pre></figure>
现在,对于每个角度和时间点的每个通道,都应该存在注册文件。
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nb">cd</span> /projects/tomancak_lightsheet/Christopher/29072013_HisRuby_Stock1/split/registration
LS
spim_TL1_Angle32_Channel0.tif.beads.txt
spim_TL1_Angle32_Channel0.tif.dim
spim_TL1_Angle32_Channel0.tif.registration
spim_TL1_Angle32_Channel0.tif.registration.to_1
spim_TL1_Angle32_Channel1.tif.beads.txt
spim_TL1_Angle32_Channel1.tif.dim
spim_TL1_Angle32_Channel1.tif.registration
spim_TL1_Angle32_Channel1.tif.registration.to_1
...</code></pre></figure>
#### 2 通道融合
2 通道的`create_fusion_jobs` 与单通道融合的工作方式相同。只需修改**目录**、**时间点数**、`-Dangles`下的角度并选择**裁剪区域(`-Dx`、`-Dy`、`-Dz`、`-Dw`、`-Dh`、`-Dd`)**。
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
<span class="c">#修改目录</span>
<span class="nb">dir</span><span class="o">=</span><span class="s2">"/projects/tomancak_lightsheet/Christopher/29072013_HisRuby_Stock1/split"</span>
工作<span class="o">=</span>“/projects/tomancak_lightsheet/Christopher/29072013_HisRuby_Stock1/jobs/fusion”
<span class="nb">mkdir</span> <span class="nt">-p</span> <span class="nv">$作</span>业
<span class="c"># 修改时间点数量</span>
对于 <span class="sb">`</span><span class="nb">seq </span>1 72<span class="sb">`</span> 中的 i
做
<span class="nv">job</span><span class="o">=</span><span class="s2">"</span><span class="nv">$jobs</span><span class="s2">/fusion-</span><span class="nv">$i</span><span class="s2">.job"</span>
<span class="nb">echo</span> <span class="nv">$job</span>
<span class="nb">echo</span> <span class="s2">"#!/bin/bash"</span> <span class="o">></span> <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
<span class="c">#modify - 悬挂物和裁剪区域</span>
<span class="nb">echo</span> <span class="s2">"xvfb-run -a /sw/people/tomancak/packages/Fiji.app/ImageJ-linux64 </span><span class="se">\</span><span class="s2">
-Xms100g -Xmx100g -Ddir=</span><span class="nv">$dir</span><span class="s2"> -Dtimepoint=</span><span class="nv">$i</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dangles=32,104,176,248,320 -Dchannels=0,1 -Dreference=0 </span><span class="se">\</span><span class="s2">
-Dx=68 -Dy=250 -Dz=404 -Dw=1746 -Dh=846 -Dd=654 </span><span class="se">\</span><span class="s2">
-- --no-splash </span><span class="nv">$jobs</span><span class="s2">/fusion.bsh"</span> <span class="o">>></span> <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
<span class="nb">chmod </span>a+x <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
完成</code></pre></figure>
执行脚本
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">./创建融合工作</code></pre></figure>
多通道注册需要设置`fusion.bsh`脚本。根据`select_channel`,将设置`Multi-channel registration=[Individual registration of channel 1] registration=[Individual registration of channel 1]`。在本例中,`downsample_output` 设置为 4。
<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="n">导入</span> <span class="n">ij</span><span class="o">.</span><span class="na">IJ</span><span class="o">;</span>
<span class="n">导入java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">Runtime</span><span class="err">;</span>
<span class="n">运行时</span> <span class="o">=</span> <span class="nc">Runtime</span><span class="o">.</span><span class="na">getRuntime</span><span class="o">();</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">runtime</span><span class="o">.</span><span class="na">availableProcessors</span><span class="o">()</span> <span class="o">+</span> <span class="s">" 可用于多线程的核心"</span><span class="o">);</span>
<span class="n">dir</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"dir"</span> <span class="o">);</span>
<span class="n">时间点</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"时间点"</span> <span class="o">);</span>
<span class="n">角度</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"角度"</span> <span class="o">);</span>
<span class="n">频道</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span><span class="err">“</span><span class="n">频道</span><span class="err">”</span><span class="o">);</span>
<span class="n">参考</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span><span class="err">“</span><span class="n">参考</span><span class="err">”</span><span class="o">);</span>
<span class="n">x</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"x"</span> <span class="o">);</span>
<span class="n">y</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"y"</span> <span class="o">);</span>
<span class="n">z</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"z"</span> <span class="o">);</span>
<span class="n">w</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"w"</span> <span class="o">);</span>
<span class="n">h</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"h"</span> <span class="o">);</span>
<span class="n">d</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"d"</span> <span class="o">);</span>
<span class="n">iter</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"iter"</span> <span class="o">);</span>
<span class="no">IJ</span><span class="o">.</span><span class="na">run</span><span class="o">(</span><span class="s">"多视图融合"</span><span class="o">,</span> <span class="s">"select_channel=多通道注册=[通道1单独注册] Registration=[通道1单独注册]"</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"spim_data_directory="</span> <span class="o">+</span> <span class="n">目录</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"pattern_of_spim=spim_TL{t}_Angle{a}_Channel{c}.tif timepoints_to_process="</span> <span class="o">+</span> <span class="n">时间点</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="err">“</span><span class="n">角度</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">角度</span><span class="o">+</span><span class="err">“”</span><span class="o">+</span>
<span class="err">“</span><span class="n">频道</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">频道</span><span class="o">+</span><span class="err">“”</span><span class="o">+</span>
<span class="s">"fusion_method=[融合成单个图像]"</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"process_views_in_parallell=全部"</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="err">“</span><span class="n">混合</span><span class="err">”</span><span class="o">+</span><span class="err">“”</span><span class="o">+</span>
<span class="err">“</span><span class="n">基于内容的权重_</span><span class="err">(</span><span class="n">快速</span><span class="err">,”</span><span class="o">+</span><span class="err">“”</span><span class="o">+</span>
<span class="err">“</span><span class="n">downsample_output</span><span class="o">=</span><span class="mi">4</span><span class="err">”</span><span class="o">+</span><span class="err">“”</span><span class="o">+</span>
<span class="s">"registration=[频道0个人注册]"</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"crop_output_image_offset_x="</span> <span class="o">+</span> <span class="n">x</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="err">“</span><span class="n">crop_output_image_offset_y</span><span class="o">=</span><span class="err">”</span> <span class="o">+</span> <span class="n">y</span> <span class="o">+</span> <span class="err">“”</span> <span class="o">+</span>
<span class="err">“</span><span class="n">crop_output_image_offset_z</span><span class="o">=</span><span class="err">”</span> <span class="o">+</span> <span class="n">z</span> <span class="o">+</span> <span class="err">“”</span> <span class="o">+</span>
<span class="s">"crop_output_image_size_x="</span> <span class="o">+</span> <span class="n">w</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="err">“</span><span class="n">crop_output_image_size_y</span><span class="o">=</span><span class="err">”</span> <span class="o">+</span> <span class="n">h</span> <span class="o">+</span> <span class="err">“”</span> <span class="o">+</span>
<span class="err">“</span><span class="n">crop_output_image_size_z</span><span class="o">=</span><span class="err">”</span> <span class="o">+</span> <span class="n">d</span> <span class="o">+</span> <span class="err">“”</span> <span class="o">+</span>
<span class="s">"fused_image_output=[保存 2d 切片,每个时间点一个目录]"</span><span class="o">);</span>
<span class="cm">/* 关闭 */</span>
<span class="n">运行时</span><span class="o">.</span><span class="na">退出</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span></code></pre></figure>
`submit-jobs`脚本根据融合要求修改:
- `-W 00:20`
- `-R rusage[mem=50000]`
在我的示例中有效,但我再次建议您使用自己的一小组数据中的信息来修改它。
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
<span class="sb">`</span><span class="nb">ls</span> <span class="k">${</span><span class="nv">1</span><span class="k">}</span> | <span class="nb">grep</span> <span class="s2">".job$"</span><span class="sb">`</span>中的文件
做
bsub <span class="nt">-q</span> short <span class="nt">-n</span> 12 <span class="nt">-W</span> 00:20 <span class="nt">-R</span> rusage[mem<span class="o">=</span>50000] <span class="nt">-R</span> span[hosts<span class="o">=</span>1] <span class="nt">-o</span> <span class="s2">"out.%J"</span> <span class="nt">-e</span> <span class="s2">"err.%J"</span> <span class="k">${</span><span class="nv">1</span><span class="k">}</span>/<span class="nv">$file</span>
完成
./提交工作。</code></pre></figure>
融合图像将针对每个时间点保存到输出目录中的单独子目录中。
# 新管道
新管道以配置文件(**主文件**)为中心,其中包含所有相关的处理参数。它显着提高了处理效率,因为主要是针对每个数据集操作该文件,而不是单独处理每个处理步骤中的脚本。
主文件有两部分。第一部分包含每个单独处理步骤的所有相关处理参数。第二部分包含一些更高级的设置以及作业脚本和目录的链接。
新管道还附带了一组新脚本,这些脚本经过专门修改以与主文件一起使用。总体思路是让这些作业脚本与主文件一起独立于数据集。脚本将使用主文件作为处理参数的来源。作业将像以前一样在作业目录中创建和执行,可以使用输出和错误文件来评估作业是否成功。主文件可以保存并作为处理的文档。
目前主文件可用于以下步骤。
1、单通道处理:
- 重命名`.czi`文件
- 重新保存`.czi`文件
- 重新保存`.ome.tiff`文件
- 多视图注册
- 延时摄影注册
- 基于内容的多视图融合
- 外部改造
- 多视图反卷积
- 3D 渲染
- 导出为 hdf5 格式
2.多通道处理:
- 重命名`.czi`文件
- 重新保存`.czi`文件
- 注册
- 延时摄影注册
- 基于内容的多视图融合
- 2 个通道的 3D 渲染
- 导出为 hdf5 格式
所有脚本都使用填充零。
目前,本教程是为已经使用过之前管道的高级用户编写的。更详细的介绍请阅读之前管道的描述。
## 主文件
该文件中有两部分:
一、加工参数
2. 脚本目录和处理高级设置
第一部分包含与处理相关的所有内容,并将针对每个数据集进行修改。它根据每个处理步骤进一步构造。
第二部分包含工作目录和脚本的链接。由于作业脚本应位于一个特定位置,因此在第一次开始处理时需要更改这些链接。这部分还包含配准、融合和反卷积的更高级设置。只有在完全理解这些步骤后才应该接触它。
我们将讨论该文件的每个部分以及相关的处理步骤。
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
<span class="c">####============================== 处理参数================================</span>
<span class="c">####--------------------------------- 一般参数--------------------------------</span>
<span class="c">###数据目录</span>
<span class="nb">dir</span><span class="o">=</span><span class="s2">"/projects/tomancak_lightsheet/Christopher/Test_scripts/single-channel/"</span>
<span class="c">###数据集核心参数</span>
时间点<span class="o">=</span>“<span class="sb">`</span><span class="nb">seq </span>1 3<span class="sb">`</span>”
角度<span class="o">=</span>“1,2,3”
数字角度<span class="o">=</span>“3”
<span class="c">###垃圾邮件数据的模式:</span>
<span class="nv">pattern_of_spim</span><span class="o">=</span><span class="s2">"spim_TL{tt}_Angle{a}.tif"</span>
<span class="c">#pattern_of_spim="spim_TL{tt}_Angle{a}_Channel{c}.tif"</span>
<span class="c">##单通道的更改模式:(例如 spim_TL{tt}_Angle{a}.tif)</span>
<span class="c">##或多通道处理:(例如 spim_TL{tt}_Angle{a}_Channel{c}.tif)</span>
<span class="c">##对于填充零,使用 tt 作为占位符</span>
<span class="c">###延时摄影注册</span>
参考tp<span class="o">=</span>“1”
<span class="c">###手动校准</span>
xy_分辨率<span class="o">=</span>“1”
z_scaling <span class="o">=</span>“3.2643520832”
<span class="c">###---------- 重命名 .czi 文件 ----------</span>
第一个索引<span class="o">=</span>“0”
最后索引<span class="o">=</span>“8”
第一时间点<span class="o">=</span>“1”
角度重命名<span class="o">=(</span>1 2 3<span class="o">)</span>
<span class="c">##对于填充零 2 = 01; 3 = 001</span>
pad_rename_czi <span class="o">=</span>“2”
<span class="c">##更改目录和模式</span>
<span class="nv">source_pattern</span><span class="o">=</span>/2013-11-14_His-YFP<span class="se">\(\{</span>index<span class="se">\}\)</span>.czi
<span class="nv">target_pattern</span><span class="o">=</span>/spim_TL<span class="se">\{</span>时间点<span class="se">\}</span>_Angle<span class="se">\{</span>角度<span class="se">\}</span>.czi
<span class="c">###---------- 将 .czi 或 ome.tiff 重新保存为 .tif ----------</span>
<span class="c">##对 ome.tiff 使用 ometiff_resave,对 .czi 使用 czi_resave</span>
angle_re <span class="nv">saving</span><span class="o">=</span><span class="s2">"1 2 3"</span>
<span class="c">##对于填充零 2 = 01; 3 = 001</span>
<span class="nv">pad_resave</span><span class="o">=</span>“2”
<span class="c">###---------- 分割通道(仅适用于多通道数据) ----------</span>
<span class="c">##输出通道为 spim_TL{tt}_Angle{a}_Channel0,spim_TL{tt}_Angle{a}_Channel1 ...</span>
Angles_split <span class="o">=</span>“1 2 3 4 5”
<span class="c">##目标目录</span>
target_split <span class="o">=</span>“/channel_split /”
<span class="c">###---------- 多视图配准(均值差或高斯差)----------</span>
<span class="c">##指定珠子单通道检测模式:spim_TL{t}_Angle{a}.tif</span>
<span class="c">##multi-channel: spim_TL{t}_Angle{a}_Channel1.tif 其中 1 是包含珠子的通道</span>
<span class="nv">channel_pattern_beads</span><span class="o">=</span><span class="s2">"spim_TL{tt}_Angle{a}.tif"</span>
<span class="c">#channel_pattern_beads="spim_TL{tt}_Angle{a}_Channel1.tif"</span>
<span class="c">##均值差异(注释掉registration.bsh脚本中高斯部分的差异)</span>
<span class="nv">type_of_detection</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">均值差(基于积分图像)</span><span class="se">\"</span><span class="s2">"</span>
半径1<span class="o">=</span>“2”
半径2<span class="o">=</span>“3”
阈值<span class="o">=</span>“0.008”
<span class="c">##高斯差异(注释掉registration.bsh脚本中平均部分的差异)</span>
<span class="c">#type_of_detection="\"高斯差分\""</span>
<span class="c">#initial_sigma="1.8000"</span>
<span class="c">#threshold_gaussian="0.0080"</span>
<span class="c">###---------- 延时拍摄注册 ----------</span>
timelapse_timepoint <span class="o">=</span>“1-3”
<span class="c">###---------- 重复注册文件(仅适用于多通道数据) ----------</span>
<span class="c">#包含珠子的通道</span>
频道源<span class="o">=</span>“1”
频道目标<span class="o">=</span>“0”
<span class="c">###---------- 基于多视图内容融合----------</span>
<span class="c">##单通道或多通道融合之间的变化</span>
<span class="c">##如果是单通道则注释掉 fusion.bsh 脚本中的第二个 fusion 命令</span>
<span class="nv">select_channel</span><span class="o">=</span>“单通道”
<span class="c">#select_channel="多通道"</span>
<span class="c">##使用延时注册或个人注册</span>
<span class="c">##对于延时注册指定参考时间点:</span>
<span class="nv">Registration_fusion</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">通道0的时间点注册(reference=1)</span><span class="se">\"</span><span class="s2">"</span>
<span class="c">##个人报名:</span>
<span class="c">#registration_fusion="\"通道0单独注册\""</span>
下采样输出<span class="o">=</span>“2”
<span class="c">##全分辨率裁剪参数</span>
<span class="nv">x</span><span class="o">=</span>“100”
<span class="nv">y</span><span class="o">=</span>“226”
<span class="nv">z</span><span class="o">=</span>“355”
<span class="nv">w</span><span class="o">=</span>“1731”
<span class="nv">h</span><span class="o">=</span>“820”
<span class="nv">d</span><span class="o">=</span>“755”
<span class="c">###---------- 多视图反卷积的外部变换 ----------</span>
<span class="c">##注意:在应用外部转换之前,请复制注册文件</span>
<span class="c">##仅单个通道,对每个单独通道使用外部转换</span>
<span class="nv">pattern_extrans</span><span class="o">=</span><span class="s2">"spim_TL{tt}_Angle{a}.tif"</span>
<span class="c">#pattern_extrans="spim_TL{tt}_Angle{a}_Channel1.tif"</span>
<span class="c">##时间点:</span>
external_transformation_timepoint <span class="o">=</span>“1-3”
<span class="c">##对于下采样 2x 使用 0.5</span>
<span class="nv">m00</span><span class="o">=</span>“0.5”
<span class="nv">m11</span><span class="o">=</span>“0.5”
<span class="nv">m22</span><span class="o">=</span>“0.5”
<span class="c">###---------- 多视图反卷积 ----------</span>
<span class="c">##仅针对单通道,对每个单独通道使用反卷积</span>
<span class="nv">pattern_deconvo</span><span class="o">=</span><span class="s2">"spim_TL{tt}_Angle{a}.tif"</span>
<span class="c">#pattern_deconvo="spim_TL{tt}_Angle{a}_Channel1.tif"</span>
迭代<span class="o">=</span>“1”
<span class="c">##Cropping参数:如果下采样除以该因子的融合裁剪参数</span>
解毒剂<span class="o">=</span>“50”
诱饵<span class="o">=</span>“113”
德科兹<span class="o">=</span>“177”
德科<span class="o">=</span>“865”
德科<span class="o">=</span>“410”
解码<span class="o">=</span>“377”
<span class="c">###---------- 渲染 ----------</span>
<span class="c">##两套不同的脚本,一套用于单通道,一套用于多通道;选择:</span>
<span class="c">##工作目录</span>
<span class="nv">jobs_rendering</span><span class="o">=</span><span class="s2">"/projects/pilot_spim/Christopher/pipeline/jobs_master_beta_2.0/3d_rendering_cpu"</span>
<span class="c">##工作脚本</span>
<span class="c">#rendering="/projects/pilot_spim/Christopher/pipeline/jobs_master_beta_2.0/3d_rendering_cpu/single-render-mov.bsh"</span>
渲染<span class="o">=</span>“/projects/pilot_spim/Christopher/pipeline/jobs_master_beta_2.0/3d_rendering_cpu/multi-render-mov.bsh”
<span class="c">##来源</span>
<span class="nv">source_rendering</span><span class="o">=</span><span class="s2">"/output_fusion"</span>
<span class="c">##目标目录</span>
<span class="nv">target_rendering</span><span class="o">=</span><span class="s2">"/渲染"</span>
<span class="nv">nframes</span><span class="o">=</span>“6”
<span class="c">##单通道最小最大</span>
<span class="c">#minimum_rendering="0.6"</span>
<span class="c">#maximum_rendering="0.005"</span>
<span class="c">##最小最大多通道</span>
最小通道0<span class="o">=</span>0.9
最大通道0<span class="o">=</span>0.01
<span class="nv">min_ch1</span><span class="o">=</span>0.9
最大通道1<span class="o">=</span>0.01
<span class="c">##对于多通道渲染:</span>
zSlices <span class="o">=</span>“369”
<span class="c">##方向或旋转</span>
<span class="c">#仍然需要直接放入脚本中</span>
<span class="c">#建设中</span>
<span class="c">###---------- hdf5 导出 ----------</span>
<span class="c">##目标目录</span>
<span class="nv">target_hdf5</span><span class="o">=</span>“/hdf5/”
<span class="c">##职位数量</span>
<span class="nv">num_export_job</span><span class="o">=</span><span class="s2">"</span><span class="sb">`</span><span class="nb">seq </span>0 3<span class="sb">`</span><span class="s2">"</span>
<span class="c">#路径目录</span>
路径<span class="o">=</span>“<span class="se">\”</span>/projects/pilot_spim/Christopher/Test_scripts/single-channel<span class="se">\“</span>”
<span class="c">#path="\"/projects/pilot_spim/Christopher/Test_scripts/multi-channel/channel_split\""</span>
<span class="c">#Xml文件名</span>
<span class="nv">exportXmlFilename</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">/hdf5/Test_single.xml</span><span class="se">\"</span><span class="s2">"</span>
<span class="c">##Spim 模式</span>
<span class="c">##对于单通道:spim_TL{tt}_Angle{a}.tif</span>
<span class="c">##对于 2 通道:spim_TL{tt}_Angle{a}_Channel{c}.tif</span>
<span class="nv">inputFilePattern</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">spim_TL{tt}_Angle{a}.tif</span><span class="se">\"</span><span class="s2">"</span>
<span class="c">#inputFilePattern="\"spim_TL{tt}_Angle{a}_Channel{c}.tif\""</span>
<span class="c">##Channels:更改为2通道数据</span>
<span class="nv">channels_export</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">0</span><span class="se">\"</span><span class="s2">"</span>
<span class="c">#channels_export="\"0,1\""</span>
<span class="nv">Angles_export</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">1,2,3</span><span class="se">\"</span><span class="s2">"</span>
<span class="nv">timepoint_export</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">1-3</span><span class="se">\"</span><span class="s2">"</span>
<span class="nv">Referencetp_export</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">1</span><span class="se">\"</span><span class="s2">"</span>
文件路径<span class="o">=</span>“<span class="se">\”</span>/output_fusion/<span class="se">\“</span>”
<span class="nv">filepattern</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">%1</span><span class="se">\\\$</span><span class="s2">d/img_tl%1</span><span class="se">\\\$</span><span class="s2">d_ch%2</span><span class="se">\\\$</span><span class="s2">d_z%3</span><span class="se">\\\$</span><span class="s2">03d.tif</span><span class="se">\"</span><span class="s2">"</span>
导出_numSlices <span class="o">=</span>“376”
切片值最小值<span class="o">=</span>“0”
切片值最大<span class="o">=</span>“60000”
作物偏移X <span class="o">=</span>“100”
作物偏移Y <span class="o">=</span>“226”
作物偏移Z <span class="o">=</span>“355”
比例<span class="o">=</span>“2”
<span class="c">####============== 脚本目录和处理高级设置 ==============</span>
<span class="c">####--------------------------------- 斐济环境--------------------------------</span>
<span class="nv">XVFB_RUN</span><span class="o">=</span><span class="s2">"/sw/bin/xvfb-run"</span>
斐济<span class="o">=</span>“/sw/people/tomancak/packages/Fiji.app/ImageJ-linux64”
<span class="c">####--------------------------------- 预处理--------------------------------</span>
<span class="c">### 将 .czi 重新保存为 .tif 文件</span>
<span class="c">##工作目录</span>
jobs_re saving <span class="o">=</span>“/projects/tomancak_lightsheet/Christopher/pipeline/jobs_master_beta_2.0/czi_resave/”
<span class="c">##工作脚本</span>
重新保存<span class="o">=</span>“/projects/tomancak_lightsheet/Christopher/pipeline/jobs_master_beta_2.0/czi_resave/re saving.bsh”
<span class="c">###将 ome.tiff 重新保存到 .tif 文件中</span>
<span class="c">##工作目录</span>
jobs_re saving_ometiff <span class="o">=</span>“/projects/tomancak_lightsheet/Christopher/pipeline/jobs_master_beta_2.0/ometiff_resave/”
<span class="c">##工作脚本</span>
re saving_ometiff <span class="o">=</span>“/projects/tomancak_lightsheet/Christopher/pipeline/jobs_master_beta_2.0/ometiff_resave/re saving-ometiff.bsh”
<span class="c">###分割频道</span>
<span class="c">##工作目录</span>
jobs_split <span class="o">=</span>“/projects/tomancak_lightsheet/Christopher/pipeline/jobs_master_beta_2.0/split_channels/”
<span class="c">##工作脚本</span>
<span class="nb">split</span> <span class="o">=</span>“/projects/tomancak_lightsheet/Christopher/pipeline/jobs_master_beta_2.0/split_channels/split.bsh”
<span class="c">####--------------------------------- 多视图注册--------------------------------</span>
<span class="c">##工作目录</span>
jobs_registration <span class="o">=</span>“/projects/tomancak_lightsheet/Christopher/pipeline/jobs_master_beta_2.0/registration/”
<span class="c">##工作脚本</span>
注册<span class="o">=</span>“/projects/tomancak_lightsheet/Christopher/pipeline/jobs_master_beta_2.0/registration/registration.bsh”
<span class="c">##注册参数</span>
<span class="nv">type_of_registration</span><span class="o">=</span><span class="s2">"单通道"</span>
<span class="nv">bead_brightness</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">高级...</span><span class="se">\"</span><span class="s2">"</span>
<span class="nv">subpixel_localization</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">3 维二次拟合(所有检测)</span><span class="se">\"</span><span class="s2">"</span>
<span class="nv">conversion_model</span><span class="o">=</span>“仿射”
<span class="nv">imglib_container</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">数组容器(图像较小~2048x2048x450 px)</span><span class="se">\"</span><span class="s2">"</span>
<span class="c">####--------------------------------- 延时摄影注册--------------------------------</span>
<span class="c">##工作目录</span>
<span class="nv">jobs_timelapse</span><span class="o">=</span><span class="s2">"/projects/tomancak_lightsheet/Christopher/pipeline/jobs_master_beta_2.0/timelapse_registration/"</span>
<span class="c">##工作脚本</span>
<span class="nv">timelapse_registration</span><span class="o">=</span><span class="s2">"/projects/tomancak_lightsheet/Christopher/pipeline/jobs_master_beta_2.0/timelapse_registration/time-lapse.bsh"</span>
<span class="c">####--------------------------------- 多视图融合----------------------------------------------------</span>
<span class="c">##工作目录</span>
<span class="nv">jobs_fusion</span><span class="o">=</span><span class="s2">"/projects/tomancak_lightsheet/Christopher/pipeline/jobs_master_beta_2.0/fusion/"</span>
<span class="c">##工作脚本</span>
<span class="nv">fusion</span><span class="o">=</span><span class="s2">"/projects/tomancak_lightsheet/Christopher/pipeline/jobs_master_beta_2.0/fusion/fusion.bsh"</span>
<span class="c">##融合参数</span>
<span class="nv">fusion_method</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">融合成单个图像</span><span class="se">\"</span><span class="s2">"</span>
<span class="nv">process_views_in_parallell</span><span class="o">=</span><span class="s2">"全部"</span>
混合<span class="o">=</span>“混合”
权重<span class="o">=</span>“<span class="se">\”</span>content_based_weights_(快,<span class="se">\“</span>”
<span class="nv">fused_image_output</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">保存 2d 切片,每个时间点一个目录</span><span class="se">\"</span><span class="s2">"</span>
<span class="c">####--------------------------------- 外部改造--------------------------------</span>
<span class="c">##工作目录</span>
<span class="nv">jobs_external_transformation</span><span class="o">=</span><span class="s2">"/projects/tomancak_lightsheet/Christopher/pipeline/jobs_master_beta_2.0/external_transformation/"</span>
<span class="c">##工作脚本</span>
external_transformation <span class="o">=</span>“/projects/tomancak_lightsheet/Christopher/pipeline/jobs_master_beta_2.0/external_transformation/external_transformation.bsh”
<span class="c">####--------------------------------- 多视图反卷积--------------------------------</span>
<span class="c">##工作目录</span>
<span class="nv">jobs_devolve</span><span class="o">=</span><span class="s2">"/projects/tomancak_lightsheet/Christopher/pipeline/jobs_master_beta_2.0/devolve/"</span>
<span class="c">##工作脚本</span>
反卷积<span class="o">=</span>“/projects/tomancak_lightsheet/Christopher/pipeline/jobs_master_beta_2.0/devolving/devolving.bsh”
<span class="c">##反卷积参数</span>
<span class="nv">type_of_iteration</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">高效贝叶斯 - 优化 I(快速、精确)</span><span class="se">\"</span><span class="s2">"</span>
<span class="nv">osem_acceleration</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">1(平衡)</span><span class="se">\"</span><span class="s2">"</span>
<span class="nv">use_tikhonov_regularization</span><span class="o">=</span><span class="s2">"use_tikhonov_regularization"</span>
<span class="nv">Tikhonov_parameter</span><span class="o">=</span><span class="s2">"0.0006"</span>
计算<span class="o">=</span>“<span class="se">\”</span>512x512x512块<span class="se">\“</span>”
<span class="nv">compute_on</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">CPU (Java)</span><span class="se">\"</span><span class="s2">"</span>
<span class="nv">psf_estimation</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">从珠子中提取</span><span class="se">\"</span><span class="s2">"</span>
<span class="nv">psf_display</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">不显示 PSF 的</span><span class="se">\"</span><span class="s2">"</span>
load_input_images_sequentially <span class="o">=</span>“load_input_images_sequentially”
<span class="nv">fused_image_output</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">保存 2d 切片,每个时间点一个目录</span><span class="se">\"</span><span class="s2">"</span>
<span class="c">####--------------------------------- 渲染 ---------------------------------</span>
<span class="c">##斐济渲染</span>
<span class="nv">Fiji_rendering</span><span class="o">=</span><span class="s2">"/sw/people/tomancak/packages/Fiji.app.render/ImageJ-linux64"</span>
<span class="c">####--------------------------------- HDF5 导出--------------------------------</span>
<span class="c">##斐济-托比亚斯</span>
<span class="nv">Fiji_export</span><span class="o">=</span><span class="s2">"/sw/users/pietzsch/packages/Fiji.app/ImageJ-linux64"</span>
<span class="c">##工作目录</span>
<span class="nv">jobs_export</span><span class="o">=</span><span class="s2">"/projects/pilot_spim/Christopher/pipeline/jobs_master_beta_2.0/hdf5/"</span>
<span class="c">##工作脚本</span>
导出<span class="o">=</span>“/projects/pilot_spim/Christopher/pipeline/jobs_master_beta_2.0/hdf5/export.bsh”</code></pre></figure>
## 第一次使用主文件
第一次使用主文件时,请更改斐济的链接、文件第二部分中的工作目录和脚本:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">####============== 脚本目录和处理高级设置 ==============</span>
<span class="c">####--------------------------------- 斐济环境--------------------------------</span>
<span class="nv">XVFB_RUN</span><span class="o">=</span><span class="s2">"/sw/bin/xvfb-run"</span>
斐济<span class="o">=</span>“/sw/people/tomancak/packages/Fiji.app/ImageJ-linux64”
<span class="c">####--------------------------------- 预处理--------------------------------</span>
<span class="c">### 将 .czi 重新保存为 .tif 文件</span>
<span class="c">##工作目录</span>
jobs_re saving <span class="o">=</span>“/projects/tomancak_lightsheet/Christopher/pipeline/jobs_master_beta_2.0/czi_resave/”
<span class="c">##工作脚本</span>
重新保存<span class="o">=</span>“/projects/tomancak_lightsheet/Christopher/pipeline/jobs_master_beta_2.0/czi_resave/re saving.bsh”
<span class="c">###将 ome.tiff 重新保存到 .tif 文件中</span>
<span class="c">##工作目录</span>
jobs_re saving_ometiff <span class="o">=</span>“/projects/tomancak_lightsheet/Christopher/pipeline/jobs_master_beta_2.0/ometiff_resave/”
<span class="c">##工作脚本</span>
re saving_ometiff <span class="o">=</span>“/projects/tomancak_lightsheet/Christopher/pipeline/jobs_master_beta_2.0/ometiff_resave/re saving-ometiff.bsh”
<span class="c">###分割频道</span>
<span class="c">##工作目录</span>
jobs_split <span class="o">=</span>“/projects/tomancak_lightsheet/Christopher/pipeline/jobs_master_beta_2.0/split_channels/”
<span class="c">##工作脚本</span>
<span class="nb">split</span> <span class="o">=</span>“/projects/tomancak_lightsheet/Christopher/pipeline/jobs_master_beta_2.0/split_channels/split.bsh”
<span class="c">####--------------------------------- 多视图注册--------------------------------</span>
<span class="c">##工作目录</span>
jobs_registration <span class="o">=</span>“/projects/tomancak_lightsheet/Christopher/pipeline/jobs_master_beta_2.0/registration/”
<span class="c">##工作脚本</span>
注册<span class="o">=</span>“/projects/tomancak_lightsheet/Christopher/pipeline/jobs_master_beta_2.0/registration/registration.bsh”
<span class="c">##注册参数</span>
<span class="nv">type_of_registration</span><span class="o">=</span><span class="s2">"单通道"</span>
<span class="nv">bead_brightness</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">高级...</span><span class="se">\"</span><span class="s2">"</span>
<span class="nv">subpixel_localization</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">3 维二次拟合(所有检测)</span><span class="se">\"</span><span class="s2">"</span>
<span class="nv">conversion_model</span><span class="o">=</span>“仿射”
<span class="nv">imglib_container</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">数组容器(图像较小~2048x2048x450 px)</span><span class="se">\"</span><span class="s2">"</span>
<span class="c">####--------------------------------- 延时摄影注册--------------------------------</span>
<span class="c">##工作目录</span>
<span class="nv">jobs_timelapse</span><span class="o">=</span><span class="s2">"/projects/tomancak_lightsheet/Christopher/pipeline/jobs_master_beta_2.0/timelapse_registration/"</span>
<span class="c">##工作脚本</span>
<span class="nv">timelapse_registration</span><span class="o">=</span><span class="s2">"/projects/tomancak_lightsheet/Christopher/pipeline/jobs_master_beta_2.0/timelapse_registration/time-lapse.bsh"</span>
<span class="c">####--------------------------------- 多视图融合----------------------------------------------------</span>
<span class="c">##工作目录</span>
<span class="nv">jobs_fusion</span><span class="o">=</span><span class="s2">"/projects/tomancak_lightsheet/Christopher/pipeline/jobs_master_beta_2.0/fusion/"</span>
<span class="c">##工作脚本</span>
<span class="nv">fusion</span><span class="o">=</span><span class="s2">"/projects/tomancak_lightsheet/Christopher/pipeline/jobs_master_beta_2.0/fusion/fusion.bsh"</span>
<span class="c">##融合参数</span>
<span class="nv">fusion_method</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">融合成单个图像</span><span class="se">\"</span><span class="s2">"</span>
<span class="nv">process_views_in_parallell</span><span class="o">=</span><span class="s2">"全部"</span>
混合<span class="o">=</span>“混合”
权重<span class="o">=</span>“<span class="se">\”</span>content_based_weights_(快,<span class="se">\“</span>”
<span class="nv">fused_image_output</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">保存 2d 切片,每个时间点一个目录</span><span class="se">\"</span><span class="s2">"</span>
<span class="c">####--------------------------------- 外部改造--------------------------------</span>
<span class="c">##工作目录</span>
<span class="nv">jobs_external_transformation</span><span class="o">=</span><span class="s2">"/projects/tomancak_lightsheet/Christopher/pipeline/jobs_master_beta_2.0/external_transformation/"</span>
<span class="c">##工作脚本</span>
external_transformation <span class="o">=</span>“/projects/tomancak_lightsheet/Christopher/pipeline/jobs_master_beta_2.0/external_transformation/external_transformation.bsh”
<span class="c">####--------------------------------- 多视图反卷积--------------------------------</span>
<span class="c">##工作目录</span>
<span class="nv">jobs_devolve</span><span class="o">=</span><span class="s2">"/projects/tomancak_lightsheet/Christopher/pipeline/jobs_master_beta_2.0/devolve/"</span>
<span class="c">##工作脚本</span>
反卷积<span class="o">=</span>“/projects/tomancak_lightsheet/Christopher/pipeline/jobs_master_beta_2.0/devolving/devolving.bsh”
<span class="c">##反卷积参数</span>
<span class="nv">type_of_iteration</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">高效贝叶斯 - 优化 I(快速、精确)</span><span class="se">\"</span><span class="s2">"</span>
<span class="nv">osem_acceleration</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">1(平衡)</span><span class="se">\"</span><span class="s2">"</span>
<span class="nv">use_tikhonov_regularization</span><span class="o">=</span><span class="s2">"use_tikhonov_regularization"</span>
<span class="nv">Tikhonov_parameter</span><span class="o">=</span><span class="s2">"0.0006"</span>
计算<span class="o">=</span>“<span class="se">\”</span>512x512x512块<span class="se">\“</span>”
<span class="nv">compute_on</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">CPU (Java)</span><span class="se">\"</span><span class="s2">"</span>
<span class="nv">psf_estimation</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">从珠子中提取</span><span class="se">\"</span><span class="s2">"</span>
<span class="nv">psf_display</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">不显示 PSF 的</span><span class="se">\"</span><span class="s2">"</span>
load_input_images_sequentially <span class="o">=</span>“load_input_images_sequentially”
<span class="nv">fused_image_output</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">保存 2d 切片,每个时间点一个目录</span><span class="se">\"</span><span class="s2">"</span>
<span class="c">####--------------------------------- 渲染 ---------------------------------</span>
<span class="c">##斐济渲染</span>
<span class="nv">Fiji_rendering</span><span class="o">=</span><span class="s2">"/sw/people/tomancak/packages/Fiji.app.render/ImageJ-linux64"</span>
<span class="c">####--------------------------------- HDF5 导出--------------------------------</span>
<span class="c">##斐济-托比亚斯</span>
<span class="nv">Fiji_export</span><span class="o">=</span><span class="s2">"/sw/users/pietzsch/packages/Fiji.app/ImageJ-linux64"</span>
<span class="c">##工作目录</span>
<span class="nv">jobs_export</span><span class="o">=</span><span class="s2">"/projects/pilot_spim/Christopher/pipeline/jobs_master_beta_2.0/hdf5/"</span>
<span class="c">##工作脚本</span>
导出<span class="o">=</span>“/projects/pilot_spim/Christopher/pipeline/jobs_master_beta_2.0/hdf5/export.bsh”</code></pre></figure>
然后,您需要在每个 shell 脚本中更改,特别是在 `create-jobs` 脚本中更改到 **主文件** 的链接。
该链接在每个 shell 脚本的第三行中给出。例如在`rename-zeiss-files.sh`中:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
源/projects/tomancak_lightsheet/Christopher/pipeline/master
<span class="nv">source_pattern</span><span class="o">=</span><span class="k">${</span><span class="p">目录</span><span class="k">}${</span><span class="nv">source_pattern</span><span class="k">}</span>
<span class="nv">target_pattern</span><span class="o">=</span><span class="k">${</span><span class="p">目录</span><span class="k">}${</span><span class="nv">target_pattern</span><span class="k">}</span>
<span class="c">#--------------------------------------------------------</span>
我<span class="o">=</span><span class="k">${</span><span class="nv">first_index</span><span class="k">}</span>
<span class="nv">t</span><span class="o">=</span><span class="k">${</span><span class="nv">first_timepoint</span><span class="k">}</span>
<span class="nv">t</span><span class="o">=</span><span class="sb">`</span><span class="nb">printf</span> <span class="s2">"%0</span><span class="k">${</span><span class="nv">pad_rename_czi</span><span class="k">}</span><span class="s2">d"</span> <span class="s2">"</span><span class="nv">$t</span><span class="s2">"</span><span class="sb">`</span>
<span class="k">while</span> <span class="o">[</span> <span class="nv">$i</span> <span class="nt">-le</span> <span class="nv">$last_index</span> <span class="o">]</span><span class="p">;</span>做
<span class="k">for </span>a <span class="k">in</span> <span class="s2">"</span><span class="k">${</span><span class="nv">angles_renaming</span><span class="p">[@]</span><span class="k">}</span><span class="s2">"</span><span class="p">;</span> <span class="k">do
</span><span class="nb">source</span><span class="o">=</span><span class="k">${</span><span class="nv">source_pattern</span><span class="p">/\{index\</span><span class="k">}</span>/<span class="k">${</span><span class="nv">i</span><span class="k">}</span><span class="o">}</span>
<span class="nv">tmp</span><span class="o">=</span><span class="k">${</span><span class="nv">target_pattern</span><span class="p">/\{timepoint\</span><span class="k">}</span>/<span class="k">${</span><span class="nv">t</span><span class="k">}</span><span class="o">}</span>
<span class="nv">target</span><span class="o">=</span><span class="k">${</span><span class="nv">tmp</span><span class="p">/\{angle\</span><span class="k">}</span>/<span class="k">${</span><span class="nv">a</span><span class="k">}</span><span class="o">}</span>
<span class="nb">echo</span> <span class="k">${</span><span class="nv">source</span><span class="k">}</span> <span class="k">${</span><span class="nv">target</span><span class="k">}</span>
<span class="nb">mv</span> <span class="k">${</span><span class="nv">source</span><span class="k">}</span> <span class="k">${</span><span class="nv">target</span><span class="k">}</span>
<span class="c">#cp ${source} ${target}</span>
<span class="nb">let </span><span class="nv">i</span><span class="o">=</span>i+1
<span class="k">done
</span><span class="nb">let </span><span class="nv">t</span><span class="o">=</span>t+1
<span class="nv">t</span><span class="o">=</span><span class="sb">`</span><span class="nb">printf</span> <span class="s2">"%0</span><span class="k">${</span><span class="nv">pad_rename_czi</span><span class="k">}</span><span class="s2">d"</span> <span class="s2">"</span><span class="nv">$t</span><span class="s2">"</span><span class="sb">`</span>
完成</code></pre></figure>
或者`create-resaving-jobs`文件:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
源/projects/tomancak_lightsheet/Christopher/pipeline/master
<span class="nb">mkdir</span> <span class="nt">-p</span> <span class="nv">$jobs_re</span> saving
对于我在 <span class="nv">$timepoint</span>
做
<span class="k">for </span>a <span class="k">in</span> <span class="nv">$angle_resaving</span>
<span class="k">do
</span><span class="nv">job</span><span class="o">=</span><span class="s2">"</span><span class="nv">$jobs_resaving</span><span class="s2">/resave-</span><span class="nv">$i</span><span class="s2">-</span><span class="nv">$a</span><span class="s2">.job"</span>
<span class="nb">echo</span> <span class="nv">$job</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="nv">$XVFB_RUN</span><span class="s2"> -a </span><span class="nv">$Fiji</span><span class="s2"> -Ddir=</span><span class="nv">$dir</span><span class="s2"> -Dtimepoint=</span><span class="nv">$i</span><span class="s2"> -Dangle=</span><span class="nv">$a</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dpad=</span><span class="nv">$pad_resave</span><span class="s2"> -- --no-splash </span><span class="nv">$resaving</span><span class="s2">"</span> <span class="o">>></span> <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
<span class="nb">chmod </span>a+x <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
<span class="k">done
</span>完成</code></pre></figure>
如果作业脚本和主文件位于同一目录中,这些设置只需更改一次。
## 单通道处理
### 第一步
我们首先在主文件中定义 spim 数据集的一般参数。首先我们给出包含数据的目录。然后我们定义时间点和角度的数量,我们的示例有 3 个时间点和 3 个角度。最后我们需要修改 spim 数据的模式,定义参考时间点和校准。为了演示,我们在模式中包含了填充零,并将在整个教程中使用填充零:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">####--------------------------------- 一般参数--------------------------------</span>
<span class="c">###数据目录</span>
<span class="nb">dir</span><span class="o">=</span><span class="s2">"/projects/tomancak_lightsheet/Christopher/Test_scripts/single-channel/"</span>
<span class="c">###数据集核心参数</span>
时间点<span class="o">=</span>“<span class="sb">`</span><span class="nb">seq </span>1 3<span class="sb">`</span>”
角度<span class="o">=</span>“1,2,3”
数字角度<span class="o">=</span>“3”
<span class="c">###垃圾邮件数据的模式:</span>
<span class="nv">pattern_of_spim</span><span class="o">=</span><span class="s2">"spim_TL{tt}_Angle{a}.tif"</span>
<span class="c">#pattern_of_spim="spim_TL{tt}_Angle{a}_Channel{c}.tif"</span>
<span class="c">##单通道的更改模式:(例如 spim_TL{tt}_Angle{a}.tif)</span>
<span class="c">##或多通道处理:(例如 spim_TL{tt}_Angle{a}_Channel{c}.tif)</span>
<span class="c">##对于填充零,使用 tt 作为占位符</span>
<span class="c">###延时摄影注册</span>
参考tp<span class="o">=</span>“1”
<span class="c">###手动校准</span>
xy_分辨率<span class="o">=</span>“1”
z_scaling <span class="o">=</span>“3.2643520832”</code></pre></figure>
### 重命名.czi 文件
示例数据集位于上述目录中:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nb">cd</span> /projects/tomancak_lightsheet/Christopher/Test_scripts/single-channel
LS
2013-11-14_His-YFP.czi
2013-11-14_His-YFP<span class="o">(</span>1<span class="o">)</span>.czi
2013-11-14_His-YFP<span class="o">(</span>2<span class="o">)</span>.czi
2013-11-14_His-YFP<span class="o">(</span>3<span class="o">)</span>.czi
2013-11-14_His-YFP<span class="o">(</span>4<span class="o">)</span>.czi
2013-11-14_His-YFP<span class="o">(</span>5<span class="o">)</span>.czi
2013-11-14_His-YFP<span class="o">(</span>6<span class="o">)</span>.czi
2013-11-14_His-YFP<span class="o">(</span>7<span class="o">)</span>.czi
2013-11-14_His-YFP<span class="o">(</span>8<span class="o">)</span>.czi</code></pre></figure>
需要注意的是,**Lightsheet Z.1** 写的是第一个时间点的第一个角度,没有索引。因此我们需要添加 (0) 作为该文件的第一个索引。忘记此步骤将导致重命名期间数据集发生移码。
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nb">mv </span>2013-11-14_His-YFP.czi 2013-11-14_His-YFP<span class="o">(</span>0<span class="o">)</span>.czi
LS
2013-11-14_His-YFP<span class="o">(</span>0<span class="o">)</span>.czi
2013-11-14_His-YFP<span class="o">(</span>1<span class="o">)</span>.czi
2013-11-14_His-YFP<span class="o">(</span>2<span class="o">)</span>.czi
2013-11-14_His-YFP<span class="o">(</span>3<span class="o">)</span>.czi
2013-11-14_His-YFP<span class="o">(</span>4<span class="o">)</span>.czi
2013-11-14_His-YFP<span class="o">(</span>5<span class="o">)</span>.czi
2013-11-14_His-YFP<span class="o">(</span>6<span class="o">)</span>.czi
2013-11-14_His-YFP<span class="o">(</span>7<span class="o">)</span>.czi
2013-11-14_His-YFP<span class="o">(</span>8<span class="o">)</span>.czi</code></pre></figure>
对于重命名 `.czi` 文件,主文件中的相关部分如下所示:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">###---------- 重命名 .czi 文件 ----------</span>
第一个索引<span class="o">=</span>“0”
最后索引<span class="o">=</span>“8”
第一时间点<span class="o">=</span>“1”
角度重命名<span class="o">=(</span>1 2 3<span class="o">)</span>
<span class="c">##对于填充零 2 = 01; 3 = 001</span>
pad_rename_czi <span class="o">=</span>“2”
<span class="c">##更改目录和模式</span>
<span class="nv">source_pattern</span><span class="o">=</span>/2013-11-14_His-YFP<span class="se">\(\{</span>index<span class="se">\}\)</span>.czi
<span class="nv">target_pattern</span><span class="o">=</span>/spim_TL<span class="se">\{</span>时间点<span class="se">\}</span>_Angle<span class="se">\{</span>角度<span class="se">\}</span>.czi</code></pre></figure>
第一个索引是 **0**。由于我们有 3 个时间点和 3 个角度,因此总共有 9 个时间点。因此最后一个索引是**8**。然后我们定义新名称的开始方式。第一个时间点将为 **1** 并且有三个角度,因此`(1 2 3)`。为了演示,我们将使用填充零。 `pad_rename_czi="2"` 表示输出将如下所示: 01.“源模式”说明旧 .czi 的命名方式,`target_pattern` 定义新文件的命名方式。重要的是这些模式是正确的。
为了重命名 .czi 文件,我们使用 `rename-zeiss-files.sh` 脚本:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
源/projects/tomancak_lightsheet/Christopher/pipeline/master
<span class="nv">source_pattern</span><span class="o">=</span><span class="k">${</span><span class="p">目录</span><span class="k">}${</span><span class="nv">source_pattern</span><span class="k">}</span>
<span class="nv">target_pattern</span><span class="o">=</span><span class="k">${</span><span class="p">目录</span><span class="k">}${</span><span class="nv">target_pattern</span><span class="k">}</span>
<span class="c">#--------------------------------------------------------</span>
我<span class="o">=</span><span class="k">${</span><span class="nv">first_index</span><span class="k">}</span>
<span class="nv">t</span><span class="o">=</span><span class="k">${</span><span class="nv">first_timepoint</span><span class="k">}</span>
<span class="nv">t</span><span class="o">=</span><span class="sb">`</span><span class="nb">printf</span> <span class="s2">"%0</span><span class="k">${</span><span class="nv">pad_rename_czi</span><span class="k">}</span><span class="s2">d"</span> <span class="s2">"</span><span class="nv">$t</span><span class="s2">"</span><span class="sb">`</span>
<span class="k">while</span> <span class="o">[</span> <span class="nv">$i</span> <span class="nt">-le</span> <span class="nv">$last_index</span> <span class="o">]</span><span class="p">;</span>做
<span class="k">for </span>a <span class="k">in</span> <span class="s2">"</span><span class="k">${</span><span class="nv">angles_renaming</span><span class="p">[@]</span><span class="k">}</span><span class="s2">"</span><span class="p">;</span> <span class="k">do
</span><span class="nb">source</span><span class="o">=</span><span class="k">${</span><span class="nv">source_pattern</span><span class="p">/\{index\</span><span class="k">}</span>/<span class="k">${</span><span class="nv">i</span><span class="k">}</span><span class="o">}</span>
<span class="nv">tmp</span><span class="o">=</span><span class="k">${</span><span class="nv">target_pattern</span><span class="p">/\{timepoint\</span><span class="k">}</span>/<span class="k">${</span><span class="nv">t</span><span class="k">}</span><span class="o">}</span>
<span class="nv">target</span><span class="o">=</span><span class="k">${</span><span class="nv">tmp</span><span class="p">/\{angle\</span><span class="k">}</span>/<span class="k">${</span><span class="nv">a</span><span class="k">}</span><span class="o">}</span>
<span class="nb">echo</span> <span class="k">${</span><span class="nv">source</span><span class="k">}</span> <span class="k">${</span><span class="nv">target</span><span class="k">}</span>
<span class="nb">mv</span> <span class="k">${</span><span class="nv">source</span><span class="k">}</span> <span class="k">${</span><span class="nv">target</span><span class="k">}</span>
<span class="c">#cp ${source} ${target}</span>
<span class="nb">let </span><span class="nv">i</span><span class="o">=</span>i+1
<span class="k">done
</span><span class="nv">t</span><span class="o">=</span><span class="s2">"</span><span class="k">$((</span> <span class="m">10</span><span class="c">#$t ))"</span>
<span class="nb">let </span><span class="nv">t</span><span class="o">=</span>t+1
<span class="nv">t</span><span class="o">=</span><span class="sb">`</span><span class="nb">printf</span> <span class="s2">"%0</span><span class="k">${</span><span class="nv">pad_rename_czi</span><span class="k">}</span><span class="s2">d"</span> <span class="s2">"</span><span class="nv">$t</span><span class="s2">"</span><span class="sb">`</span>
完成</code></pre></figure>
该脚本现在应该从 **主文件** 获取所有必要的参数。执行脚本(第一次执行脚本时使用 chmod a+x)。
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nb">chmod </span>a+x 重命名-zeiss_files.sh
./重命名-zeiss_files.sh</code></pre></figure>
`.czi` 文件现已相应重命名:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nb">cd</span> /projects/tomancak_lightsheet/Christopher/Test_scripts/single-channel
LS
spim_TL01_Angle1.czi
spim_TL01_Angle2.czi
spim_TL01_Angle3.czi
spim_TL02_Angle1.czi
spim_TL02_Angle2.czi
spim_TL02_Angle3.czi
spim_TL03_Angle1.czi
spim_TL03_Angle2.czi
spim_TL03_Angle3.czi</code></pre></figure>
### 重新保存.czi 文件
下一步是将 `.czi` 文件重新保存为 `.tif` 文件。在主文件的相关部分中,我们只需要指定角度以及是否使用填充零:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">###---------- 将 .czi 或 ome.tiff 重新保存为 .tif ----------</span>
<span class="c">##对 ome.tiff 使用 ometiff_resave,对 .czi 使用 czi_resave</span>
angle_re <span class="nv">saving</span><span class="o">=</span><span class="s2">"1 2 3"</span>
<span class="c">##对于填充零 2 = 01; 3 = 001</span>
<span class="nv">pad_resave</span><span class="o">=</span>“2”</code></pre></figure>
要创建用于重新保存的作业,请使用 `create-resaving-jobs` 脚本:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
源/projects/tomancak_lightsheet/Christopher/pipeline/master
<span class="nb">mkdir</span> <span class="nt">-p</span> <span class="nv">$jobs_re</span> saving
对于我在 <span class="nv">$timepoint</span>
做
<span class="k">for </span>a <span class="k">in</span> <span class="nv">$angle_resaving</span>
<span class="k">do
</span><span class="nv">job</span><span class="o">=</span><span class="s2">"</span><span class="nv">$jobs_resaving</span><span class="s2">/resave-</span><span class="nv">$i</span><span class="s2">-</span><span class="nv">$a</span><span class="s2">.job"</span>
<span class="nb">echo</span> <span class="nv">$job</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="nv">$XVFB_RUN</span><span class="s2"> -a </span><span class="nv">$Fiji</span><span class="s2"> -Ddir=</span><span class="nv">$dir</span><span class="s2"> -Dtimepoint=</span><span class="nv">$i</span><span class="s2"> -Dangle=</span><span class="nv">$a</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dpad=</span><span class="nv">$pad_resave</span><span class="s2"> -- --no-splash </span><span class="nv">$resaving</span><span class="s2">"</span> <span class="o">>></span> <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
<span class="nb">chmod </span>a+x <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
<span class="k">done
</span>完成</code></pre></figure>
执行这个脚本:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">./创建保留工作</code></pre></figure>
这将为每个 `.czi` 文件创造就业机会。
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nb">cd</span> /projects/tomancak_lightsheet/Christopher/pipeline/jobs_master_beta_2.0/czi_resave/
LS
创造-保留-就业机会
重新保存-1-1.job
重新保存-1-2.job
重新保存-1-3.job
重新保存-2-1.job
重新保存-2-2.job
重新保存-2-3.job
重新保存-3-1.job
重新保存-3-2.job
重新保存-3-3.job
重新保存.bsh
提交作业</code></pre></figure>
每个作业文件应包含作业的相关参数、在哪里可以找到 Fiji 以及实际的作业脚本:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nb">cd</span> /projects/tomancak_lightsheet/Christopher/pipeline/jobs_master_beta_2.0/czi_resave/
猫 resave-1-1.job
/sw/bin/xvfb-run <span class="nt">-a</span> /sw/people/tomancak/packages/Fiji.app/ImageJ-linux64 <span class="nt">-Ddir</span><span class="o">=</span>/projects/tomancak_lightsheet/Christopher/Test_scripts/single-channel/ <span class="nt">-Dtimepoint</span><span class="o">=</span>1 <span class="nt">-Dangle</span><span class="o">=</span>1
<span class="nt">-Dpad</span><span class="o">=</span>2 <span class="nt">--</span> <span class="nt">--no-splash</span> /projects/tomancak_lightsheet/Christopher/pipeline/jobs_master_beta_2.0/czi_resave/re saving.bsh</code></pre></figure>
处理作业时,必要的参数将从作业文件传递到 `resaving.bsh` 脚本。脚本`resaving.bsh`如下所示:
<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="n">导入</span> <span class="n">ij</span><span class="o">.</span><span class="na">IJ</span><span class="o">;</span>
<span class="n">导入</span> <span class="n">ij</span><span class="o">.</span><span class="na">ImagePlus</span><span class="err">;</span>
<span class="n">导入java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">Runtime</span><span class="err">;</span>
<span class="n">导入java</span><span class="o">.</span><span class="na">io</span><span class="o">.</span><span class="na">File</span><span class="err">;</span>
<span class="n">导入</span> <span class="n">java</span><span class="o">.</span><span class="na">io</span><span class="o">.</span><span class="na">FilenameFilter</span><span class="o">;</span>
<span class="n">运行时</span> <span class="o">=</span> <span class="nc">Runtime</span><span class="o">.</span><span class="na">getRuntime</span><span class="o">();</span>
<span class="n">dir</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"dir"</span> <span class="o">);</span>
<span class="kt">int</span> <span class="n">时间点</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"时间点"</span> <span class="o">)</span> <span class="o">);</span>
<span class="n">角度</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"角度"</span> <span class="o">);</span>
<span class="kt">int</span> <span class="n">pad</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"pad"</span> <span class="o">)</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"时间点"</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">垫</span><span class="err">”</span><span class="o">);</span>
<span class="c1">//重新保存为tif</span>
<span class="no">IJ</span><span class="o">.</span><span class="na">run</span><span class="o">(</span><span class="s">"生物格式导入器"</span><span class="o">,</span> <span class="s">"open="</span> <span class="o">+</span> <span class="n">dir</span> <span class="o">+</span> <span class="s">"spim_TL"</span> <span class="o">+</span> <span class="no">IJ</span><span class="o">.</span><span class="na">pad</span><span class="o">(</span> <span class="n">timepoint</span><span class="o">,</span> <span class="n">pad</span> <span class="o">)</span> <span class="o">+</span> <span class="s">"_Angle"</span> <span class="o">+</span> <span class="n">angle</span> <span class="o">+</span> <span class="s">".czi"</span> <span class="o">+</span>
<span class="err">“</span> <span class="n">autoscale</span> <span class="n">color_mode</span> <span class="o">=</span><span class="n">默认指定_范围视图</span><span class="o">=</span> <span class="o">[</span><span class="n">标准ImageJ</span><span class="o">]</span> <span class="n">stack_order</span> <span class="o">=</span><span class="n">默认t_begin</span> <span class="o">=</span> <span class="mi">1000</span> <span class="n">t_end</span> <span class="o">=</span> <span class="mi">1000</span> <span class="n">t_step</span> <span class="o">=</span> <span class="mi">1</span><span class="err">”)</span><span class="o">;</span>
<span class="no">IJ</span><span class="o">.</span><span class="na">saveAs</span><span class="o">(</span><span class="s">"Tiff "</span><span class="o">,</span> <span class="n">dir</span> <span class="o">+</span> <span class="s">"spim_TL"</span> <span class="o">+</span> <span class="no">IJ</span><span class="o">.</span><span class="na">pad</span><span class="o">(</span> <span class="n">时间点</span><span class="o">,</span> <span class="n">pad</span> <span class="o">)</span> <span class="o">+</span> <span class="s">"_Angle"</span> <span class="o">+</span> <span class="n">角度</span> <span class="o">+</span> <span class="s">".tif"</span><span class="o">);</span>
<span class="cm">/* 关闭 */</span>
<span class="n">运行时</span><span class="o">.</span><span class="na">退出</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span></code></pre></figure>
通过执行提交脚本`submit-jobs`来提交作业:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
<span class="sb">`</span><span class="nb">ls</span> <span class="k">${</span><span class="nv">1</span><span class="k">}</span> | <span class="nb">grep</span> <span class="s2">".job$"</span><span class="sb">`</span>中的文件
做
bsub <span class="nt">-q</span> short <span class="nt">-n</span> 1 <span class="nt">-R</span> span[hosts<span class="o">=</span>1] <span class="nt">-o</span> <span class="s2">"out.%J"</span> <span class="nt">-e</span> <span class="s2">"err.%J"</span> <span class="k">${</span><span class="nv">1</span><span class="k">}</span>/<span class="nv">$file</span>
完成
./提交工作。</code></pre></figure>
现在可以在数据目录中找到 `.tif` 文件以及 `.czi` 文件:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nb">cd</span> /projects/tomancak_lightsheet/Christopher/Test_scripts/single-channel
LS
spim_TL01_Angle1.czi
spim_TL01_Angle1.tif
spim_TL01_Angle2.czi
spim_TL01_Angle2.tif
spim_TL01_Angle3.czi
spim_TL01_Angle3.tif
spim_TL02_Angle1.czi
spim_TL02_Angle1.tif
spim_TL02_Angle2.czi
spim_TL02_Angle2.tif
spim_TL02_Angle3.czi
spim_TL02_Angle3.tif
spim_TL03_Angle1.czi
spim_TL03_Angle1.tif
spim_TL03_Angle2.czi
spim_TL03_Angle2.tif
spim_TL03_Angle3.czi
spim_TL03_Angle3.tif</code></pre></figure>
执行此步骤后,检查 `.tif` 文件并检查它们是否全部存在以及它们是否与 `.czi` 文件相对应。如果是这种情况,请将 `.czi` 文件传输到磁带上以便长期存储。
要检查所有文件是否都存在,请使用 `checkpoint.sh` 脚本:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
源/projects/tomancak_lightsheet/Christopher/pipeline/master
对于我在 <span class="nv">$timepoint</span>
<span class="k">do
</span><span class="nv">i</span><span class="o">=</span><span class="sb">`</span><span class="nb">printf</span> <span class="s2">"%0</span><span class="k">${</span><span class="nv">pad_resave</span><span class="k">}</span><span class="s2">d"</span> <span class="s2">"</span><span class="nv">$i</span><span class="s2">"</span><span class="sb">`</span>
<span class="nv">num</span><span class="o">=</span><span class="si">$(</span><span class="nb">ls</span> <span class="nv">$dir</span>/spim_TL<span class="s2">"</span><span class="nv">$i</span><span class="s2">"</span>_Angle<span class="k">*</span>.tif |wc <span class="nt">-l</span><span class="si">)</span>
<span class="k">if</span> <span class="o">[</span> <span class="nv">$num</span> <span class="nt">-ne</span> <span class="nv">$num_angles</span> <span class="o">]</span>
<span class="k">then
</span><span class="nb">echo</span> <span class="s2">"TL"</span><span class="nv">$i</span><span class="s2">": TP or angles missing"</span>
<span class="k">else
</span><span class="nb">echo</span> <span class="s2">"TL"</span><span class="nv">$i</span><span class="s2">": Correct"</span>
菲
完成</code></pre></figure>
该脚本将返回丢失或具有丢失角度的时间点的数量。
### 重新保存 .ome.tiff 文件
要将 `.ome.tiff` 文件重新保存为 `.tif`,我们在主文件中使用与重新保存 `.czi` 文件时相同的部分。在主文件的相关部分中,我们只需要指定角度以及是否有填充零:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">###---------- 将 .czi 或 ome.tiff 重新保存为 .tif ----------</span>
<span class="c">##对 ome.tiff 使用 ometiff_resave,对 .czi 使用 czi_resave</span>
angle_re <span class="nv">saving</span><span class="o">=</span><span class="s2">"1 2 3"</span>
<span class="c">##对于填充零 2 = 01; 3 = 001</span>
<span class="nv">pad_resave</span><span class="o">=</span>“2”</code></pre></figure>
创建`create-ometiff-jobs`文件。通过执行以下脚本创建保存作业:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
源/projects/tomancak_lightsheet/Christopher/pipeline/master
<span class="nb">mkdir</span> <span class="nt">-p</span> <span class="nv">$jobs_re</span> saving
对于我在 <span class="nv">$timepoint</span>
做
<span class="k">for </span>a <span class="k">in</span> <span class="nv">$angle_resaving</span>
<span class="k">do
</span><span class="nv">job</span><span class="o">=</span><span class="s2">"</span><span class="nv">$jobs_resaving_ometiff</span><span class="s2">/resave-</span><span class="nv">$i</span><span class="s2">-</span><span class="nv">$a</span><span class="s2">.job"</span>
<span class="nb">echo</span> <span class="nv">$job</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="nv">$XVFB_RUN</span><span class="s2"> -a </span><span class="nv">$Fiji</span><span class="s2"> -Ddir=</span><span class="nv">$dir</span><span class="s2"> -Dtimepoint=</span><span class="nv">$i</span><span class="s2"> -Dangle=</span><span class="nv">$a</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dpad=</span><span class="nv">$pad_resave</span><span class="s2"> -- --no-splash </span><span class="nv">$resaving_ometiff</span><span class="s2">"</span> <span class="o">>></span> <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
<span class="nb">chmod </span>a+x <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
<span class="k">done
</span>完成</code></pre></figure>
`resaving-ometiff.bsh`脚本:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">导入 ij.IJ<span class="p">;</span>
导入 ij.ImagePlus;
导入java.lang.Runtime;
导入java.io.File;
导入 java.io.FilenameFilter<span class="p">;</span>
运行时 <span class="o">=</span> Runtime.getRuntime<span class="o">()</span><span class="p">;</span>
<span class="nb">dir</span> <span class="o">=</span> System.getProperty<span class="o">(</span> <span class="s2">"dir"</span> <span class="o">)</span><span class="p">;</span>
int 时间点 <span class="o">=</span> Integer.parseInt<span class="o">(</span> System.getProperty<span class="o">(</span> <span class="s2">"时间点"</span> <span class="o">)</span> <span class="o">)</span><span class="p">;</span>
角度 <span class="o">=</span> System.getProperty<span class="o">(</span> <span class="s2">"角度"</span> <span class="o">)</span><span class="p">;</span>
int pad <span class="o">=</span> Integer.parseInt<span class="o">(</span> System.getProperty<span class="o">(</span> <span class="s2">"pad"</span> <span class="o">)</span> <span class="o">)</span><span class="p">;</span>
//重新保存为tif
IJ.open<span class="o">(</span> <span class="nb">dir</span> + <span class="s2">"spim_TL"</span> + IJ.pad<span class="o">(</span> 时间点, pad <span class="o">)</span> + <span class="s2">"_Angle"</span> + 角度 + <span class="s2">".ome.tiff"</span> <span class="o">)</span><span class="p">;</span>
IJ.saveAs<span class="o">(</span><span class="s2">"Tiff"</span>, <span class="nb">dir</span> + <span class="s2">"spim_TL"</span> + IJ.pad<span class="o">(</span> 时间点, pad <span class="o">)</span> + <span class="s2">"_Angle"</span> + 角度 + <span class="s2">".tif"</span><span class="o">)</span><span class="p">;</span>
/<span class="k">*</span> 关闭 <span class="k">*</span>/
运行时.退出<span class="o">(</span>0<span class="o">)</span><span class="p">;</span></code></pre></figure>
使用 `submit-jobs` 脚本提交作业文件:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
<span class="sb">`</span><span class="nb">ls</span> <span class="k">${</span><span class="nv">1</span><span class="k">}</span> | <span class="nb">grep</span> <span class="s2">".job$"</span><span class="sb">`</span>中的文件
做
bsub <span class="nt">-q</span> short <span class="nt">-n</span> 1 <span class="nt">-R</span> span[hosts<span class="o">=</span>1] <span class="nt">-o</span> <span class="s2">"out.%J"</span> <span class="nt">-e</span> <span class="s2">"err.%J"</span> <span class="k">${</span><span class="nv">1</span><span class="k">}</span>/<span class="nv">$file</span>
完成</code></pre></figure>
### 多视图注册
对于注册,请使用**主文件**中的相关部分。相应地更改垃圾邮件数据的模式。您可以在均值差和高斯配准差之间进行选择,并相应地更改参数。例如,当您想要使用均值配准差值时,注释掉 `registration.bsh` 脚本中的高斯差值部分非常重要。否则会出现错误。
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">###---------- 多视图配准(均值差或高斯差)----------</span>
<span class="c">##指定珠子单通道检测模式:spim_TL{t}_Angle{a}.tif</span>
<span class="c">##multi-channel: spim_TL{t}_Angle{a}_Channel1.tif 其中 1 是包含珠子的通道</span>
<span class="nv">channel_pattern_beads</span><span class="o">=</span><span class="s2">"spim_TL{tt}_Angle{a}.tif"</span>
<span class="c">#channel_pattern_beads="spim_TL{tt}_Angle{a}_Channel1.tif"</span>
<span class="c">##均值差异(注释掉registration.bsh脚本中高斯部分的差异)</span>
<span class="nv">type_of_detection</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">均值差(基于积分图像)</span><span class="se">\"</span><span class="s2">"</span>
半径1<span class="o">=</span>“2”
半径2<span class="o">=</span>“3”
阈值<span class="o">=</span>“0.008”
<span class="c">##高斯差异(注释掉registration.bsh脚本中平均部分的差异)</span>
<span class="c">#type_of_detection="\"高斯差分\""</span>
<span class="c">#initial_sigma="1.8000"</span>
<span class="c">#threshold_gaussian="0.0080"</span></code></pre></figure>
`create-registration-jobs`脚本。执行此脚本以创建注册作业。
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
源/projects/tomancak_lightsheet/Christopher/pipeline/master
<span class="nb">mkdir</span> <span class="nt">-p</span> <span class="nv">$jobs_registration</span>
对于我在 <span class="nv">$timepoint</span>
做
<span class="nv">job</span><span class="o">=</span><span class="s2">"</span><span class="nv">$jobs_registration</span><span class="s2">/register-</span><span class="nv">$i</span><span class="s2">.job"</span>
<span class="nb">echo</span> <span class="nv">$job</span>
<span class="nb">echo</span> <span class="s2">"#!/bin/bash"</span> <span class="o">></span> <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="nv">$XVFB_RUN</span><span class="s2"> -a </span><span class="nv">$Fiji</span><span class="s2"> -Dtype_of_registration=</span><span class="nv">$type_of_registration</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dtype_of_detection=</span><span class="nv">$type_of_detection</span><span class="s2"> -Ddir=</span><span class="nv">$dir</span><span class="s2"> -Dpattern=</span><span class="nv">$channel_pattern_beads</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dtimepoint=</span><span class="nv">$i</span><span class="s2"> -Dangles=</span><span class="nv">$angles</span><span class="s2"> -Dbead_brightness=</span><span class="nv">$bead_brightness</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dsubpixel_localization=</span><span class="nv">$subpixel_localization</span><span class="s2"> -Dxy_resolution=</span><span class="nv">$xy_resolution</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dz_scaling=</span><span class="nv">$z_scaling</span><span class="s2"> -Dtransformation_model=</span><span class="nv">$transformation_model</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dimglib_container=</span><span class="nv">$imglib_container</span><span class="s2"> -Dradius1=</span><span class="nv">$radius1</span><span class="s2"> -Dradius2=</span><span class="nv">$radius2</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dthreshold=</span><span class="nv">$threshold</span><span class="s2"> -Dinitial_sigma=</span><span class="nv">$initial_sigma</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dthreshold_gaussian=</span><span class="nv">$threshold_gaussian</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-- --no-splash </span><span class="nv">$registration</span><span class="s2">"</span> <span class="o">>></span> <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
<span class="nb">chmod </span>a+x <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
完成</code></pre></figure>
`registration.bsh`脚本。这里重要的是根据注册方法注释掉指示的部分。否则脚本可能无法正常工作。对于均值差配准,请在第 33-34 行和第 68-69 行注释掉高斯差。对于高斯差分,请注释掉第 28-30 行和第 65-67 行。
<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="n">导入</span> <span class="n">ij</span><span class="o">.</span><span class="na">IJ</span><span class="o">;</span>
<span class="n">导入</span> <span class="n">ij</span><span class="o">.</span><span class="na">ImagePlus</span><span class="err">;</span>
<span class="n">导入java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">Runtime</span><span class="err">;</span>
<span class="n">导入java</span><span class="o">.</span><span class="na">io</span><span class="o">.</span><span class="na">File</span><span class="err">;</span>
<span class="n">导入</span> <span class="n">java</span><span class="o">.</span><span class="na">io</span><span class="o">.</span><span class="na">FilenameFilter</span><span class="o">;</span>
<span class="n">运行时</span> <span class="o">=</span> <span class="nc">Runtime</span><span class="o">.</span><span class="na">getRuntime</span><span class="o">();</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">runtime</span><span class="o">.</span><span class="na">availableProcessors</span><span class="o">()</span> <span class="o">+</span> <span class="s">" 可用于多线程的核心"</span><span class="o">);</span>
<span class="n">type_of_registration</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"type_of_registration"</span> <span class="o">);</span>
<span class="n">检测类型</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"检测类型"</span> <span class="o">);</span>
<span class="n">dir</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"dir"</span> <span class="o">);</span>
<span class="n">模式</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span><span class="err">“</span><span class="n">模式</span><span class="err">”</span><span class="o">);</span>
<span class="n">时间点</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"时间点"</span> <span class="o">);</span>
<span class="n">角度</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"角度"</span> <span class="o">);</span>
<span class="n">bead_brightness</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"bead_brightness"</span> <span class="o">);</span>
<span class="n">subpixel_localization</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"subpixel_localization"</span> <span class="o">);</span>
<span class="kt">int</span> <span class="n">xy_resolution</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"xy_resolution"</span> <span class="o">));</span>
<span class="kt">float</span> <span class="n">z_scaling</span> <span class="o">=</span> <span class="nc">Float</span><span class="o">.</span><span class="na">parseFloat</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"z_scaling"</span> <span class="o">)</span> <span class="o">);</span>
<span class="n">conversion_model</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"transformation_model"</span> <span class="o">);</span>
<span class="n">imglib_container</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"imglib_container"</span> <span class="o">);</span>
<span class="c1">//均值差的参数!!高斯差注释掉!!</span>
<span class="kt">int</span> <span class="n">radius1</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"radius1"</span> <span class="o">)</span> <span class="o">);</span>
<span class="kt">int</span> <span class="n">radius2</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"radius2"</span> <span class="o">)</span> <span class="o">);</span>
<span class="n">浮动阈值</span> <span class="o">=</span> <span class="nc">Float</span><span class="o">.</span><span class="na">parseFloat</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"threshold"</span> <span class="o">)</span> <span class="o">);</span>
<span class="c1">//高斯差值的参数!!均值差值注释掉!!</span>
<span class="c1">//浮点initial_sigma = Float.parseFloat( System.getProperty( "initial_sigma" ) );</span>
<span class="c1">//浮点threshold_gaussian = Float.parseFloat( System.getProperty( "threshold_gaussian" ) );</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"type_of_registration="</span> <span class="o">+</span> <span class="n">type_of_registration</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">检测类型</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">检测类型</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">dir</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">dir</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"pattern_of_spim="</span> <span class="o">+</span> <span class="n">模式</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"时间点= "</span> <span class="o">+</span> <span class="n">时间点</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">角度</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">角度</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"bead_brightness="</span> <span class="o">+</span> <span class="n">bead_brightness</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"subpixel_localization="</span> <span class="o">+</span> <span class="n">subpixel_localization</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">xy_分辨率</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">xy_分辨率</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">z_分辨率</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">z_缩放</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">transformation_model</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">transformation_model</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"imglib_container="</span> <span class="o">+</span> <span class="n">imglib_container</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"radius1="</span> <span class="o">+</span> <span class="n">radius1</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"radius2="</span> <span class="o">+</span> <span class="n">radius2</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">阈值</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">阈值</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">initial_sigma</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">initial_sigma</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">threshold_gaussian</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">threshold_gaussian</span><span class="o">);</span>
<span class="no">IJ</span><span class="o">.</span><span class="na">run</span><span class="o">(</span><span class="s">"基于珠的注册"</span><span class="o">,</span> <span class="s">"select_type_of_registration="</span> <span class="o">+</span> <span class="n">type_of_registration</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"select_type_of_detection=["</span> <span class="o">+</span> <span class="n">type_of_detection</span> <span class="o">+</span> <span class="s">"]"</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"spim_data_directory="</span> <span class="o">+</span> <span class="n">dir</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"pattern_of_spim="</span> <span class="o">+</span> <span class="n">pattern</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"timepoints_to_process="</span> <span class="o">+</span> <span class="n">timepoint</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"angles_to_process="</span> <span class="o">+</span> <span class="n">angles</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"bead_brightness=["</span> <span class="o">+</span> <span class="n">bead_brightness</span> <span class="o">+</span> <span class="s">"]"</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"subpixel_localization=["</span> <span class="o">+</span> <span class="n">subpixel_localization</span> <span class="o">+</span> <span class="s">"]"</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"specify_calibration_manually xy_resolution="</span> <span class="o">+</span> <span class="n">xy_resolution</span> <span class="o">+</span> <span class="s">" z_resolution="</span> <span class="o">+</span> <span class="n">z_scaling</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"transformation_model="</span> <span class="o">+</span> <span class="n">transformation_model</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="c1">// "imglib_container=[" + imglib_container + "]" + " " +</span>
<span class="s">"channel_0_radius_1="</span> <span class="o">+</span> <span class="n">radius1</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span> <span class="c1">//Comment out for Difference of Gaussian</span>
<span class="s">"channel_0_radius_2="</span> <span class="o">+</span> <span class="n">radius2</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span> <span class="c1">//Comment out for Difference of Gaussian</span>
<span class="s">"channel_0_threshold="</span> <span class="o">+</span> <span class="n">threshold</span> <span class="o">+</span> <span class="s">" "</span> <span class="c1">//Comment out for Difference of Gaussian</span>
<span class="c1">// "channel_0_initial_sigma=" + initial_sigma + " " + //注释掉均值差</span>
<span class="c1">// "channel_0_threshold=" + Threshold_gaussian + " " //注释掉均值差</span>
<span class="o">);</span>
<span class="cm">/* 关闭 */</span>
<span class="n">运行时</span><span class="o">.</span><span class="na">退出</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span></code></pre></figure>
使用 `submit-jobs` 脚本提交作业:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
<span class="sb">`</span><span class="nb">ls</span> <span class="k">${</span><span class="nv">1</span><span class="k">}</span> | <span class="nb">grep</span> <span class="s2">".job$"</span><span class="sb">`</span>中的文件
做
bsub <span class="nt">-q</span> short <span class="nt">-n</span> 1 <span class="nt">-W</span> 00:15 <span class="nt">-R</span> rusage[mem<span class="o">=</span>50000] <span class="nt">-R</span> span[hosts<span class="o">=</span>1] <span class="nt">-o</span> <span class="s2">"out.%J"</span> <span class="nt">-e</span> <span class="s2">"err.%J"</span> <span class="k">${</span><span class="nv">1</span><span class="k">}</span>/<span class="nv">$file</span>
完成</code></pre></figure>
### 延时拍摄注册
延时配准是使用之前指定的配准参数和通用参数中指定的参考时间点。主文件中用于延时注册的部分如下所示:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">###---------- 延时拍摄注册 ----------</span>
timelapse_timepoint <span class="o">=</span>“1-3”</code></pre></figure>
要创建延时拍摄注册作业(仅一项作业),请执行 `create-timelapse-jobs` 脚本:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
源/projects/tomancak_lightsheet/Christopher/pipeline/master
<span class="nb">mkdir</span> <span class="nt">-p</span> <span class="nv">$jobs_timelapse</span>
<span class="nv">job</span><span class="o">=</span><span class="s2">"</span><span class="nv">$jobs_timelapse</span><span class="s2">/register-timelapse.job"</span>
<span class="nb">echo</span> <span class="nv">$job</span>
<span class="nb">echo</span> <span class="s2">"#!/bin/bash"</span> <span class="o">></span> <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="nv">$XVFB_RUN</span><span class="s2"> -a </span><span class="nv">$Fiji</span><span class="s2"> -Dtype_of_registration=</span><span class="nv">$type_of_registration</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dtype_of_detection=</span><span class="nv">$type_of_detection</span><span class="s2"> -Ddir=</span><span class="nv">$dir</span><span class="s2"> -Dpattern=</span><span class="nv">$channel_pattern_beads</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dtimepoint=</span><span class="nv">$timelapse_timepoint</span><span class="s2"> -Dangles=</span><span class="nv">$angles</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dsubpixel_localization=</span><span class="nv">$subpixel_localization</span><span class="s2"> -Dxy_resolution=</span><span class="nv">$xy_resolution</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dz_scaling=</span><span class="nv">$z_scaling</span><span class="s2"> -Dtransformation_model=</span><span class="nv">$transformation_model</span><span class="s2"> -Dimglib_container=</span><span class="nv">$imglib_container</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dradius1=</span><span class="nv">$radius1</span><span class="s2"> -Dradius2=</span><span class="nv">$radius2</span><span class="s2"> -Dthreshold=</span><span class="nv">$threshold</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dinitial_sigma=</span><span class="nv">$initial_sigma</span><span class="s2"> -Dthreshold_gaussian=</span><span class="nv">$threshold_gaussian</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dreferencetp=</span><span class="nv">$referencetp</span><span class="s2"> -- --no-splash </span><span class="nv">$timelapse_registration</span><span class="s2">"</span> <span class="o">>></span> <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
<span class="nb">chmod </span>a+x <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span></code></pre></figure>
对于 `time-lapse.bsh` 脚本,请注释掉您为 `registration.bsh` 脚本注释掉的相同部分。
<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="n">导入</span> <span class="n">ij</span><span class="o">.</span><span class="na">IJ</span><span class="o">;</span>
<span class="n">导入java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">Runtime</span><span class="err">;</span>
<span class="n">运行时</span> <span class="o">=</span> <span class="nc">Runtime</span><span class="o">.</span><span class="na">getRuntime</span><span class="o">();</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">runtime</span><span class="o">.</span><span class="na">availableProcessors</span><span class="o">()</span> <span class="o">+</span> <span class="s">" 可用于多线程的核心"</span><span class="o">);</span>
<span class="n">type_of_registration</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"type_of_registration"</span> <span class="o">);</span>
<span class="n">检测类型</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"检测类型"</span> <span class="o">);</span>
<span class="n">dir</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"dir"</span> <span class="o">);</span>
<span class="n">模式</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span><span class="err">“</span><span class="n">模式</span><span class="err">”</span><span class="o">);</span>
<span class="n">时间点</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"时间点"</span> <span class="o">);</span>
<span class="n">角度</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"角度"</span> <span class="o">);</span>
<span class="n">subpixel_localization</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"subpixel_localization"</span> <span class="o">);</span>
<span class="kt">int</span> <span class="n">xy_resolution</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"xy_resolution"</span> <span class="o">)</span> <span class="o">);</span>
<span class="kt">float</span> <span class="n">z_scaling</span> <span class="o">=</span><span class="nc">Float</span><span class="o">.</span><span class="na">parseFloat</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"z_scaling"</span> <span class="o">)</span> <span class="o">);</span>
<span class="n">conversion_model</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"transformation_model"</span> <span class="o">);</span>
<span class="n">imglib_container</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"imglib_container"</span> <span class="o">);</span>
<span class="c1">//均值差的参数!!高斯差注释掉!!</span>
<span class="kt">int</span> <span class="n">radius1</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"radius1"</span> <span class="o">)</span> <span class="o">);</span>
<span class="kt">int</span> <span class="n">radius2</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"radius2"</span> <span class="o">)</span> <span class="o">);</span>
<span class="n">浮动阈值</span> <span class="o">=</span> <span class="nc">Float</span><span class="o">.</span><span class="na">parseFloat</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"threshold"</span> <span class="o">)</span> <span class="o">);</span>
<span class="c1">//高斯差值的参数!!均值差值注释掉!!</span>
<span class="c1">//浮点initial_sigma = Float.parseFloat( System.getProperty( "initial_sigma" ) );</span>
<span class="c1">//浮点threshold_gaussian = Float.parseFloat( System.getProperty( "threshold_gaussian" ) );</span>
<span class="nc">Referencetp</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"referencetp"</span> <span class="o">)</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"type_of_registration="</span> <span class="o">+</span> <span class="n">type_of_registration</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">检测类型</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">检测类型</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">dir</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">dir</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"pattern_of_spim="</span> <span class="o">+</span> <span class="n">模式</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"时间点= "</span> <span class="o">+</span> <span class="n">时间点</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">角度</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">角度</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">xy_分辨率</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">xy_分辨率</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">z_分辨率</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">z_缩放</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">transformation_model</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">transformation_model</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"imglib_container="</span> <span class="o">+</span> <span class="n">imglib_container</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"radius1="</span> <span class="o">+</span> <span class="n">radius1</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"radius2="</span> <span class="o">+</span> <span class="n">radius2</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">阈值</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">阈值</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">initial_sigma</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">initial_sigma</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">threshold_gaussian</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">threshold_gaussian</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">referencetp</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">referencetp</span><span class="o">);</span>
<span class="no">IJ</span><span class="o">.</span><span class="na">run</span><span class="o">(</span><span class="s">"基于珠的注册"</span><span class="o">,</span> <span class="s">"select_type_of_registration="</span> <span class="o">+</span> <span class="n">type_of_registration</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"select_type_of_detection=["</span> <span class="o">+</span> <span class="n">type_of_detection</span> <span class="o">+</span> <span class="s">"]"</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"spim_data_directory="</span> <span class="o">+</span> <span class="n">dir</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"pattern_of_spim="</span> <span class="o">+</span> <span class="n">pattern</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"timepoints_to_process="</span> <span class="o">+</span> <span class="n">timepoint</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"angles_to_process="</span> <span class="o">+</span> <span class="n">angles</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"load_segmented_beads"</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"subpixel_localization=["</span> <span class="o">+</span> <span class="n">subpixel_localization</span> <span class="o">+</span> <span class="s">"]"</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"specify_calibration_manually xy_resolution="</span> <span class="o">+</span> <span class="n">xy_resolution</span> <span class="o">+</span> <span class="s">" z_resolution="</span> <span class="o">+</span> <span class="n">z_scaling</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"transformation_model="</span> <span class="o">+</span> <span class="n">transformation_model</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="c1">// "imglib_container=[" + imglib_container + "] + " " +</span>
<span class="s">"channel_0_radius_1="</span> <span class="o">+</span> <span class="n">radius1</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span> <span class="c1">//Comment out for Difference of Gaussian</span>
<span class="s">"channel_0_radius_2="</span> <span class="o">+</span> <span class="n">radius2</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span> <span class="c1">//Comment out for Difference of Gaussian</span>
<span class="s">"channel_0_threshold="</span> <span class="o">+</span> <span class="n">threshold</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span> <span class="c1">//Comment out for Difference of Gaussian</span>
<span class="c1">// "channel_0_initial_sigma=" + initial_sigma + " " + //注释掉均值差</span>
<span class="c1">// "channel_0_threshold=" + Threshold_gaussian + " " + //注释掉均值差</span>
<span class="s">"re-use_per_timepoint_registration"</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"timelapse_registration"</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"select_reference=[Manually (specify)]"</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"reference_timepoint="</span> <span class="o">+</span> <span class="n">referencetp</span> <span class="o">+</span> <span class="s">" "</span>
<span class="o">);</span>
<span class="cm">/* 关闭 */</span>
<span class="n">运行时</span><span class="o">.</span><span class="na">退出</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span></code></pre></figure>
使用 `submit-jobs` 脚本将 `register-timelapse.job` 提交到集群:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
bsub <span class="nt">-q</span> 短 <span class="nt">-n</span> 12 <span class="nt">-W</span> 00:10 <span class="nt">-R</span> rusage[mem<span class="o">=</span>10000] <span class="nt">-R</span> span[hosts<span class="o">=</span>1] <span class="nt">-o</span> <span class="s2">"out.%J"</span> <span class="nt">-e</span> <span class="s2">"err.%J"</span> ./register-timelapse.job</code></pre></figure>
### 基于内容的多视图融合
**主文件**中的相关部分:
对于单通道数据,请使用`select_channel="Single-channel"`。要使用延时注册,请选择`registration_fusion="\"Time-point registration (reference=1) of channel 0\""`并在`(reference=1)`中指定正确的参考时间点。如果您想使用融合的各个时间点的注册,请选择`registration_fusion="\"Individual registration of channel 0\"`。
指定您想要对融合进行下采样的程度。但是,在定义裁剪区域时,请始终使用全分辨率的裁剪参数。
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">###---------- 基于多视图内容融合----------</span>
<span class="c">##单通道或多通道融合之间的变化</span>
<span class="c">##如果是单通道则注释掉 fusion.bsh 脚本中的第二个 fusion 命令</span>
<span class="nv">select_channel</span><span class="o">=</span>“单通道”
<span class="c">#select_channel="多通道"</span>
<span class="c">##使用延时注册或个人注册</span>
<span class="c">##对于延时注册指定参考时间点:</span>
<span class="nv">Registration_fusion</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">通道0的时间点注册(reference=1)</span><span class="se">\"</span><span class="s2">"</span>
<span class="c">##个人报名:</span>
<span class="c">#registration_fusion="\"通道0单独注册\""</span>
下采样输出<span class="o">=</span>“2”
<span class="c">##全分辨率裁剪参数</span>
<span class="nv">x</span><span class="o">=</span>“100”
<span class="nv">y</span><span class="o">=</span>“226”
<span class="nv">z</span><span class="o">=</span>“355”
<span class="nv">w</span><span class="o">=</span>“1731”
<span class="nv">h</span><span class="o">=</span>“820”
<span class="nv">d</span><span class="o">=</span>“755”</code></pre></figure>
执行 `create_fusion_jobs` 脚本来编写融合作业:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
源/projects/tomancak_lightsheet/Christopher/pipeline/master
<span class="nb">mkdir</span> <span class="nt">-p</span> <span class="nv">$jobs_fusion</span>
对于我在 <span class="nv">$timepoint</span>
做
<span class="nv">job</span><span class="o">=</span><span class="s2">"</span><span class="nv">$jobs_fusion</span><span class="s2">/fusion-</span><span class="nv">$i</span><span class="s2">.job"</span>
<span class="nb">echo</span> <span class="nv">$job</span>
<span class="nb">echo</span> <span class="s2">"#!/bin/bash"</span> <span class="o">></span> <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="nv">$XVFB_RUN</span><span class="s2"> -a </span><span class="nv">$Fiji</span><span class="s2"> -Xms100g -Xmx100g -Dselect_channel=</span><span class="nv">$select_channel</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dregistration_fusion=</span><span class="nv">$registration_fusion</span><span class="s2"> -Ddir=</span><span class="nv">$dir</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dpattern_of_spim=</span><span class="nv">$pattern_of_spim</span><span class="s2"> -Dtimepoint=</span><span class="nv">$i</span><span class="s2"> -Dangles=</span><span class="nv">$angles</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dfusion_method=</span><span class="nv">$fusion_method</span><span class="s2"> -Dprocess_views_in_paralell=</span><span class="nv">$process_views_in_paralell</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dblending=</span><span class="nv">$blending</span><span class="s2"> -Dweights=</span><span class="nv">$weights</span><span class="s2"> -Ddownsample_output=</span><span class="nv">$downsample_output</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dx=</span><span class="nv">$x</span><span class="s2"> -Dy=</span><span class="nv">$y</span><span class="s2"> -Dz=</span><span class="nv">$z</span><span class="s2"> -Dw=</span><span class="nv">$w</span><span class="s2"> -Dh=</span><span class="nv">$h</span><span class="s2"> -Dd=</span><span class="nv">$d</span><span class="s2"> -Dfused_image_output=</span><span class="nv">$fused_image_output</span><span class="se">\</span><span class="s2">
-- --no-splash </span><span class="nv">$fusion</span><span class="s2">"</span> <span class="o">>></span> <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
<span class="nb">chmod </span>a+x <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
完成</code></pre></figure>
`fusion.bsh`脚本,对于单通道注释掉额外的`"registration=[" + registration_fusion + "]" + " " +`行:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">导入 ij.IJ<span class="p">;</span>
导入java.lang.Runtime;
运行时 <span class="o">=</span> Runtime.getRuntime<span class="o">()</span><span class="p">;</span>
System.out.println<span class="o">(</span>runtime.availableProcessors<span class="o">()</span> + <span class="s2">" 可用于多线程的核心"</span><span class="o">)</span><span class="p">;</span>
select_channel <span class="o">=</span> System.getProperty<span class="o">(</span>“select_channel”<span class="o">)</span><span class="p">;</span>
<span class="nb">dir</span> <span class="o">=</span> System.getProperty<span class="o">(</span> <span class="s2">"dir"</span> <span class="o">)</span><span class="p">;</span>
pattern_of_spim <span class="o">=</span> System.getProperty<span class="o">(</span> <span class="s2">"pattern_of_spim"</span> <span class="o">)</span><span class="p">;</span>
时间点 <span class="o">=</span> System.getProperty<span class="o">(</span> <span class="s2">"时间点"</span> <span class="o">)</span><span class="p">;</span>
角度 <span class="o">=</span> System.getProperty<span class="o">(</span> <span class="s2">"角度"</span> <span class="o">)</span><span class="p">;</span>
fusion_method <span class="o">=</span> System.getProperty<span class="o">(</span> <span class="s2">"fusion_method"</span> <span class="o">)</span><span class="p">;</span>
process_views_in_parallell <span class="o">=</span> System.getProperty<span class="o">(</span> <span class="s2">"process_views_in_parallell"</span> <span class="o">)</span><span class="p">;</span>
混合 <span class="o">=</span> System.getProperty<span class="o">(</span> <span class="s2">"混合"</span> <span class="o">)</span><span class="p">;</span>
权重 <span class="o">=</span> System.getProperty<span class="o">(</span> <span class="s2">"权重"</span> <span class="o">)</span><span class="p">;</span>
downsample_output <span class="o">=</span> Integer.parseInt<span class="o">(</span> System.getProperty<span class="o">(</span> <span class="s2">"downsample_output"</span> <span class="o">)</span> <span class="o">)</span><span class="p">;</span>
Registration_fusion <span class="o">=</span> System.getProperty<span class="o">(</span>“registration_fusion”<span class="o">)</span><span class="p">;</span>
x <span class="o">=</span> System.getProperty<span class="o">(</span> <span class="s2">"x"</span> <span class="o">)</span><span class="p">;</span>
y <span class="o">=</span> System.getProperty<span class="o">(</span> <span class="s2">"y"</span> <span class="o">)</span><span class="p">;</span>
z <span class="o">=</span> System.getProperty<span class="o">(</span> <span class="s2">"z"</span> <span class="o">)</span><span class="p">;</span>
w <span class="o">=</span> System.getProperty<span class="o">(</span> <span class="s2">"w"</span> <span class="o">)</span><span class="p">;</span>
h <span class="o">=</span> System.getProperty<span class="o">(</span> <span class="s2">"h"</span> <span class="o">)</span><span class="p">;</span>
d <span class="o">=</span> System.getProperty<span class="o">(</span> <span class="s2">"d"</span> <span class="o">)</span><span class="p">;</span>
fused_image_output <span class="o">=</span> System.getProperty<span class="o">(</span>“fused_image_output”<span class="o">)</span><span class="p">;</span>
System.out.println<span class="o">(</span> <span class="s2">"Channel="</span> + select_channel <span class="o">)</span><span class="p">;</span>
System.out.println<span class="o">(</span>“注册<span class="o">=</span>”+registration_fusion<span class="o">)</span><span class="p">;</span>
System.out.println<span class="o">(</span>“dir<span class="o">=</span>”+dir<span class="o">)</span><span class="p">;</span>
System.out.println<span class="o">(</span>“Pattern<span class="o">=</span>”+pattern_of_spim<span class="o">)</span><span class="p">;</span>
System.out.println<span class="o">(</span> <span class="s2">"时间点= "</span> + 时间点 <span class="o">)</span><span class="p">;</span>
System.out.println<span class="o">(</span>“角度<span class="o">=</span>”+角度<span class="o">)</span><span class="p">;</span>
System.out.println<span class="o">(</span> <span class="s2">"fusion_method="</span> + fusion_method <span class="o">)</span><span class="p">;</span>
System.out.println<span class="o">(</span> <span class="s2">"process_views_in_parallell="</span> + process_views_in_parallell <span class="o">)</span><span class="p">;</span>
System.out.println<span class="o">(</span>混合<span class="o">)</span><span class="p">;</span>
System.out.println<span class="o">(</span> 权重 <span class="o">)</span><span class="p">;</span>
System.out.println<span class="o">(</span> <span class="s2">"Downsample="</span> + downsample_output <span class="o">)</span><span class="p">;</span>
System.out.println<span class="o">(</span> <span class="s2">"裁剪="</span> + x + <span class="s2">" "</span> + y + <span class="s2">" "</span> + z + <span class="s2">" "</span> + w + <span class="s2">" "</span> + h + <span class="s2">" "</span> + d <span class="o">)</span><span class="p">;</span>
System.out.println<span class="o">(</span> <span class="s2">"fused_image_output="</span> + fused_image_output <span class="o">)</span><span class="p">;</span>
IJ.run<span class="o">(</span><span class="s2">"多视图融合"</span>, <span class="s2">"select_channel="</span> + select_channel + <span class="s2">" "</span> +
<span class="s2">"registration=["</span> + registration_fusion + <span class="s2">"]"</span> + <span class="s2">" "</span> +
// <span class="s2">"registration=["</span> + Registration_fusion + <span class="s2">"]"</span> + <span class="s2">" "</span> + //注释掉单通道融合
<span class="s2">"spim_data_directory="</span> + <span class="nb">dir</span> + <span class="s2">" "</span> +
<span class="s2">"pattern_of_spim="</span> + pattern_of_spim + <span class="s2">" "</span> +
<span class="s2">"timepoints_to_process="</span> + timepoint + <span class="s2">" "</span> +
<span class="s2">"angles="</span> + angles + <span class="s2">" "</span> +
<span class="s2">"fusion_method=["</span> + fusion_method + <span class="s2">"]"</span> + <span class="s2">" "</span> +
<span class="s2">"process_views_in_paralell="</span> + process_views_in_paralell + <span class="s2">" "</span> +
<span class="s2">" + blending + "</span> + <span class="s2">" "</span> +
<span class="s2">" + weights + "</span> + <span class="s2">" "</span> +
<span class="s2">"downsample_output="</span> + downsample_output + <span class="s2">" "</span> +
<span class="s2">"crop_output_image_offset_x="</span> + x + <span class="s2">" "</span> +
<span class="s2">"crop_output_image_offset_y="</span> + y + <span class="s2">" "</span> +
<span class="s2">"crop_output_image_offset_z="</span> + z + <span class="s2">" "</span> +
<span class="s2">"crop_output_image_size_x="</span> + w + <span class="s2">" "</span> +
<span class="s2">"crop_output_image_size_y="</span> + h + <span class="s2">" "</span> +
<span class="s2">"crop_output_image_size_z="</span> + d + <span class="s2">" "</span> +
<span class="s2">"fused_image_output=["</span> + fused_image_output + <span class="s2">"]"</span><span class="o">)</span><span class="p">;</span>
/<span class="k">*</span> 关闭 <span class="k">*</span>/
运行时.退出<span class="o">(</span>0<span class="o">)</span><span class="p">;</span></code></pre></figure>
要提交融合作业,请执行 `submit-jobs` 脚本:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
<span class="sb">`</span><span class="nb">ls</span> <span class="k">${</span><span class="nv">1</span><span class="k">}</span> | <span class="nb">grep</span> <span class="s2">".job$"</span><span class="sb">`</span>中的文件
做
bsub <span class="nt">-q</span> short <span class="nt">-n</span> 12 <span class="nt">-W</span> 00:20 <span class="nt">-R</span> rusage[mem<span class="o">=</span>30000] <span class="nt">-R</span> span[hosts<span class="o">=</span>1] <span class="nt">-o</span> <span class="s2">"out.%J"</span> <span class="nt">-e</span> <span class="s2">"err.%J"</span> <span class="k">${</span><span class="nv">1</span><span class="k">}</span>/<span class="nv">$file</span>
完成</code></pre></figure>
### 多视图反卷积
在执行多视图反卷积之前,我们需要将外部变换应用于配准文件以对反卷积进行下采样。在应用外部转换之前,复制注册文件作为备份。
#### 外部改造
对于主文件中的外部转换,指定 spim 文件的模式、需要转换的时间点以及两次下采样使用 0.5:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">###---------- 多视图反卷积的外部变换 ----------</span>
<span class="c">##注意:在应用外部转换之前,请复制注册文件!</span>
<span class="c">##仅单个通道,对每个单独通道使用外部转换</span>
<span class="nv">pattern_extrans</span><span class="o">=</span><span class="s2">"spim_TL{tt}_Angle{a}.tif"</span>
<span class="c">#pattern_extrans="spim_TL{tt}_Angle{a}_Channel1.tif"</span>
<span class="c">##时间点:</span>
external_transformation_timepoint <span class="o">=</span>“1-3”
<span class="c">##对于 2x 下采样,使用 0.5:</span>
<span class="nv">m00</span><span class="o">=</span>“0.5”
<span class="nv">m11</span><span class="o">=</span>“0.5”
<span class="nv">m22</span><span class="o">=</span>“0.5”</code></pre></figure>
`create_external_transformation`脚本:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
源/projects/tomancak_lightsheet/Christopher/pipeline/master
<span class="nb">mkdir</span> <span class="nt">-p</span> <span class="nv">$jobs_external_transformation</span>
<span class="nv">job</span><span class="o">=</span><span class="s2">"</span><span class="nv">$jobs_external_transformation</span><span class="s2">/external_transformation.job"</span>
<span class="nb">echo</span> <span class="nv">$job</span>
<span class="nb">echo</span> <span class="s2">"#!/bin/bash"</span> <span class="o">></span> <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="nv">$XVFB_RUN</span><span class="s2"> -a </span><span class="nv">$Fiji</span><span class="s2"> -Xms40g -Xmx40g -Ddir=</span><span class="nv">$dir</span><span class="s2"> -Dpattern_of_spim=</span><span class="nv">$pattern_extrans</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dtimepoint=</span><span class="nv">$external_transformation_timepoint</span><span class="s2"> -Dangles=</span><span class="nv">$angles</span><span class="s2"> -Dreferencetp=</span><span class="nv">$referencetp</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dm00=</span><span class="nv">$m00</span><span class="s2"> -Dm11=</span><span class="nv">$m11</span><span class="s2"> -Dm22=</span><span class="nv">$m22</span><span class="s2"> -- --no-splash </span><span class="nv">$external_transformation</span><span class="s2">"</span> <span class="o">>></span> <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
<span class="nb">chmod </span>a+x <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span></code></pre></figure>
`external_transformation.bsh`脚本:
<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="n">导入</span> <span class="n">ij</span><span class="o">.</span><span class="na">IJ</span><span class="o">;</span>
<span class="n">导入java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">Runtime</span><span class="err">;</span>
<span class="n">运行时</span> <span class="o">=</span> <span class="nc">Runtime</span><span class="o">.</span><span class="na">getRuntime</span><span class="o">();</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">runtime</span><span class="o">.</span><span class="na">availableProcessors</span><span class="o">()</span> <span class="o">+</span> <span class="s">" 可用于多线程的核心"</span><span class="o">);</span>
<span class="n">dir</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"dir"</span> <span class="o">);</span>
<span class="n">pattern_of_spim</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"pattern_of_spim"</span> <span class="o">);</span>
<span class="n">时间点</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"时间点"</span> <span class="o">);</span>
<span class="n">角度</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"角度"</span> <span class="o">);</span>
<span class="nc">Referencetp</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"referencetp"</span> <span class="o">);</span>
<span class="n">how_to_provide_affine_matrix</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"how_to_provide_affine_matrix"</span> <span class="o">);</span>
<span class="kt">float</span> <span class="n">m00</span> <span class="o">=</span> <span class="nc">Float</span><span class="o">.</span><span class="na">parseFloat</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"m00"</span> <span class="o">)</span> <span class="o">);</span>
<span class="kt">float</span> <span class="n">m11</span> <span class="o">=</span> <span class="nc">Float</span><span class="o">.</span><span class="na">parseFloat</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"m11"</span> <span class="o">)</span> <span class="o">);</span>
<span class="kt">float</span> <span class="n">m22</span> <span class="o">=</span> <span class="nc">Float</span><span class="o">.</span><span class="na">parseFloat</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"m22"</span> <span class="o">)</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">dir</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">dir</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">pattern_of_spim</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">pattern_of_spim</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"时间点= "</span> <span class="o">+</span> <span class="n">时间点</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">角度</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">角度</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"参考时间点= "</span> <span class="o">+</span><span class="n">referencetp</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"转换 m00="</span> <span class="o">+</span> <span class="n">m00</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span> <span class="s">"m11="</span> <span class="o">+</span> <span class="n">m11</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span> <span class="s">"m22="</span> <span class="o">+</span> <span class="n">m22</span> <span class="o">);</span>
<span class="no">IJ</span><span class="o">.</span><span class="na">run</span><span class="o">(</span><span class="s">"应用外部变换"</span><span class="o">,</span>
<span class="s">"spim_data_directory="</span> <span class="o">+</span> <span class="n">dir</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"pattern_of_spim="</span> <span class="o">+</span> <span class="n">pattern_of_spim</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"timepoints_to_process="</span> <span class="o">+</span> <span class="n">timepoint</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"angles="</span> <span class="o">+</span> <span class="n">angles</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"how_to_provide_affine_matrix=[As individual entries]"</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="c1">// "m00=0.5 m01=0 m02=0 m03=0 m10=0 m11=0.5 m12=0 m13=0 m20=0 m21=0 m22=0.5 m23=0" + " " +</span>
<span class="s">"m00="</span> <span class="o">+</span> <span class="n">m00</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span> <span class="s">"m01=0 m02=0 m03=0 m10=0 m11="</span> <span class="o">+</span> <span class="n">m11</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span> <span class="s">"m12=0 m13=0 m20=0 m21=0 m22="</span> <span class="o">+</span> <span class="n">m22</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span> <span class="s">"m23=0"</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"apply_to=[Time-point registration (reference="</span> <span class="o">+</span> <span class="n">referencetp</span> <span class="o">+</span> <span class="s">")]"</span><span class="o">);</span>
<span class="no">IJ</span><span class="o">.</span><span class="na">run</span><span class="o">(</span><span class="s">"应用外部变换"</span><span class="o">,</span>
<span class="s">"spim_data_directory="</span> <span class="o">+</span> <span class="n">dir</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"pattern_of_spim="</span> <span class="o">+</span> <span class="n">pattern_of_spim</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"timepoints_to_process="</span> <span class="o">+</span> <span class="n">referencetp</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"angles="</span> <span class="o">+</span> <span class="n">angles</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"how_to_provide_affine_matrix=[As individual entries]"</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="c1">// "m00=0.5 m01=0 m02=0 m03=0 m10=0 m11=0.5 m12=0 m13=0 m20=0 m21=0 m22=0.5 m23=0" + " " +</span>
<span class="s">"m00="</span> <span class="o">+</span> <span class="n">m00</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span> <span class="s">"m01=0 m02=0 m03=0 m10=0 m11="</span> <span class="o">+</span> <span class="n">m11</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span> <span class="s">"m12=0 m13=0 m20=0 m21=0 m22="</span> <span class="o">+</span> <span class="n">m22</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span> <span class="s">"m23=0"</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"apply_to=[Individual registration]"</span><span class="o">);</span>
<span class="cm">/* 关闭 */</span>
<span class="n">运行时</span><span class="o">.</span><span class="na">退出</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span></code></pre></figure>
使用 `submit-jobs` 脚本将外部转换作业提交到集群:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
<span class="sb">`</span><span class="nb">ls</span> <span class="k">${</span><span class="nv">1</span><span class="k">}</span> | <span class="nb">grep</span> <span class="s2">".job$"</span><span class="sb">`</span>中的文件
做
bsub <span class="nt">-q</span> short <span class="nt">-n</span> 12 <span class="nt">-W</span> 00:05 <span class="nt">-R</span> rusage[mem<span class="o">=</span>10000] <span class="nt">-R</span> span[hosts<span class="o">=</span>1] <span class="nt">-o</span> <span class="s2">"out.%J"</span> <span class="nt">-e</span> <span class="s2">"err.%J"</span> <span class="k">${</span><span class="nv">1</span><span class="k">}</span>/<span class="nv">$file</span>
完成</code></pre></figure>
#### 反卷积
对于反卷积,再次指定 spim 模式、迭代次数和裁剪参数。裁剪区域是在下采样数据上定义的。因此,将全分辨率裁剪区域除以对配准文件进行下采样的系数。
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">###---------- 多视图反卷积 ----------</span>
<span class="c">##仅针对单通道,对每个单独通道使用反卷积</span>
<span class="nv">pattern_deconvo</span><span class="o">=</span><span class="s2">"spim_TL{tt}_Angle{a}.tif"</span>
<span class="c">#pattern_deconvo="spim_TL{tt}_Angle{a}_Channel1.tif"</span>
迭代<span class="o">=</span>“1”
<span class="c">##Cropping参数:如果下采样除以该因子的融合裁剪参数</span>
解毒剂<span class="o">=</span>“50”
诱饵<span class="o">=</span>“113”
德科兹<span class="o">=</span>“177”
德科<span class="o">=</span>“865”
德科<span class="o">=</span>“410”
解码<span class="o">=</span>“377”</code></pre></figure>
`create_deconvolution_jobs`脚本:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
源/projects/tomancak_lightsheet/Christopher/pipeline/master
<span class="nb">mkdir</span> <span class="nt">-p</span> <span class="nv">$jobs_</span>反卷积
对于我在 <span class="nv">$timepoint</span>
做
<span class="nv">job</span><span class="o">=</span><span class="s2">"</span><span class="nv">$jobs_deconvolution</span><span class="s2">/deconvolution-</span><span class="nv">$i</span><span class="s2">.job"</span>
<span class="nb">echo</span> <span class="nv">$job</span>
<span class="nb">echo</span> <span class="s2">"#!/bin/bash"</span> <span class="o">></span> <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="nv">$XVFB_RUN</span><span class="s2"> -a </span><span class="nv">$Fiji</span><span class="s2"> -Xms110g -Xmx110g -Ddir=</span><span class="nv">$dir</span><span class="s2"> -Dpattern_of_spim=</span><span class="nv">$pattern_deconvo</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dtimepoint=</span><span class="nv">$i</span><span class="s2"> -Dangles=</span><span class="nv">$angles</span><span class="s2"> -Dreferencetp=</span><span class="nv">$referencetp</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dx=</span><span class="nv">$decox</span><span class="s2"> -Dy=</span><span class="nv">$decoy</span><span class="s2"> -Dz=</span><span class="nv">$decoz</span><span class="s2"> -Dw=</span><span class="nv">$decow</span><span class="s2"> -Dh=</span><span class="nv">$decoh</span><span class="s2"> -Dd=</span><span class="nv">$decod</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dtype_of_iteration=</span><span class="nv">$type_of_iteration</span><span class="s2"> -Dosem_acceleration=</span><span class="nv">$osem_acceleration</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Duse_tikhonov_regularization=</span><span class="nv">$use_tikhonov_regularization</span><span class="s2"> -DTikhonov_parameter=</span><span class="nv">$Tikhonov_parameter</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dcompute=</span><span class="nv">$compute</span><span class="s2"> -Dcompute_on=</span><span class="nv">$compute_on</span><span class="s2"> -Dpsf_estimation=</span><span class="nv">$psf_estimation</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dpsf_display=</span><span class="nv">$psf_display</span><span class="s2"> -Dload_input_images_sequentially=</span><span class="nv">$load_input_images_sequentially</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dfused_image_output=</span><span class="nv">$fused_image_output</span><span class="s2"> -Diter=</span><span class="nv">$iter</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-- --no-splash </span><span class="nv">$deconvolution</span><span class="s2">"</span> <span class="o">>></span> <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
<span class="nb">chmod </span>a+x <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
完成</code></pre></figure>
`deconvolution.bsh`脚本:
<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="n">导入</span> <span class="n">ij</span><span class="o">.</span><span class="na">IJ</span><span class="o">;</span>
<span class="n">导入java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">Runtime</span><span class="err">;</span>
<span class="n">fiji</span><span class="o">.</span><span class="na">plugin</span><span class="o">.</span><span class="na">Multi_View_Devolving</span><span class="o">.</span><span class="na">psfSize</span> <span class="o">=</span> <span class="mi">31</span><span class="o">;</span>
<span class="n">fiji</span><span class="o">.</span><span class="na">plugin</span><span class="o">.</span><span class="na">Multi_View_Devolving</span><span class="o">.</span><span class="na">isotropic</span> <span class="o">=</span> <span class="kc">true</span><span class="o">;</span>
<span class="n">运行时</span> <span class="o">=</span> <span class="nc">Runtime</span><span class="o">.</span><span class="na">getRuntime</span><span class="o">();</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">runtime</span><span class="o">.</span><span class="na">availableProcessors</span><span class="o">()</span> <span class="o">+</span> <span class="s">" 可用于多线程的核心"</span><span class="o">);</span>
<span class="n">dir</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"dir"</span> <span class="o">);</span>
<span class="n">pattern_of_spim</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"pattern_of_spim"</span> <span class="o">);</span>
<span class="n">时间点</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"时间点"</span> <span class="o">);</span>
<span class="n">角度</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"角度"</span> <span class="o">);</span>
<span class="nc">Referencetp</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"referencetp"</span> <span class="o">);</span>
<span class="n">x</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"x"</span> <span class="o">);</span>
<span class="n">y</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"y"</span> <span class="o">);</span>
<span class="n">z</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"z"</span> <span class="o">);</span>
<span class="n">w</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"w"</span> <span class="o">);</span>
<span class="n">h</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"h"</span> <span class="o">);</span>
<span class="n">d</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"d"</span> <span class="o">);</span>
<span class="n">type_of_iteration</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"type_of_iteration"</span> <span class="o">);</span>
<span class="n">osem_acceleration</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"osem_acceleration"</span> <span class="o">);</span>
<span class="n">use_tikhonov_regularization</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"use_tikhonov_regularization"</span> <span class="o">);</span>
<span class="kt">float</span> <span class="n">Tikhonov_parameter</span> <span class="o">=</span> <span class="nc">Float</span><span class="o">.</span><span class="na">parseFloat</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"Tikhonov_parameter"</span> <span class="o">)</span> <span class="o">);</span>
<span class="n">计算</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"计算"</span> <span class="o">);</span>
<span class="n">计算_on</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span><span class="err">“</span><span class="n">计算_on</span><span class="err">”</span><span class="o">);</span>
<span class="n">psf_estimation</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"psf_estimation"</span> <span class="o">);</span>
<span class="n">psf_display</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"psf_display"</span> <span class="o">);</span>
<span class="n">load_input_images_sequentially</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span><span class="err">“</span><span class="n">load_input_images_sequentially</span><span class="err">”</span><span class="o">);</span>
<span class="n">fused_image_output</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span><span class="err">“</span><span class="n">fused_image_output</span><span class="err">”</span><span class="o">);</span>
<span class="n">iter</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"iter"</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">dir</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">dir</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">pattern_of_spim</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">pattern_of_spim</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"时间点= "</span> <span class="o">+</span> <span class="n">时间点</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">角度</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">角度</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"参考时间点= "</span> <span class="o">+</span><span class="n">referencetp</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"裁剪参数= "</span> <span class="o">+</span> <span class="n">x</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span> <span class="n">y</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span> <span class="n">z</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span> <span class="n">w</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span> <span class="n">h</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span> <span class="n">d</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"type_of_iteration="</span> <span class="o">+</span> <span class="n">type_of_iteration</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"osem_acceleration="</span> <span class="o">+</span> <span class="n">osem_acceleration</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="n">use_tikhonov_regularization</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"Tikhonov_parameter="</span> <span class="o">+</span> <span class="n">Tikhonov_parameter</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">计算</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">计算</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">compute_on</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">compute_on</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"psf_estimation="</span> <span class="o">+</span> <span class="n">psf_estimation</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"psf_display="</span> <span class="o">+</span> <span class="n">psf_display</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="n">load_input_images_sequentially</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"fused_image_output="</span> <span class="o">+</span> <span class="n">fused_image_output</span> <span class="o">);</span>
<span class="no">IJ</span><span class="o">.</span><span class="na">run</span><span class="o">(</span><span class="s">"多视图解卷积"</span><span class="o">,</span> <span class="s">"spim_data_directory="</span> <span class="o">+</span> <span class="n">dir</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"pattern_of_spim="</span> <span class="o">+</span> <span class="n">pattern_of_spim</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"timepoints_to_process="</span> <span class="o">+</span> <span class="n">timepoint</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"angles="</span> <span class="o">+</span> <span class="n">angles</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"registration=[Time-point registration (reference="</span> <span class="o">+</span> <span class="n">referencetp</span> <span class="o">+</span> <span class="s">") of channel 0]"</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"crop_output_image_offset_x="</span> <span class="o">+</span> <span class="n">x</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"crop_output_image_offset_y="</span> <span class="o">+</span> <span class="n">y</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"crop_output_image_offset_z="</span> <span class="o">+</span> <span class="n">z</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"crop_output_image_size_x="</span> <span class="o">+</span> <span class="n">w</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"crop_output_image_size_y="</span> <span class="o">+</span> <span class="n">h</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"crop_output_image_size_z="</span> <span class="o">+</span> <span class="n">d</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"type_of_iteration=["</span> <span class="o">+</span> <span class="n">type_of_iteration</span> <span class="o">+</span> <span class="s">"]"</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"osem_acceleration=["</span> <span class="o">+</span> <span class="n">osem_acceleration</span> <span class="o">+</span> <span class="s">"]"</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"number_of_iterations="</span> <span class="o">+</span> <span class="n">iter</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">" + use_tikhonov_regularization + "</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"tikhonov_parameter="</span> <span class="o">+</span> <span class="n">Tikhonov_parameter</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="c1">//“计算=[以512x512x512块为单位]”+“”+</span>
<span class="s">"compute=["</span> <span class="o">+</span> <span class="n">compute</span> <span class="o">+</span> <span class="s">"]"</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"compute_on=["</span> <span class="o">+</span> <span class="n">compute_on</span> <span class="o">+</span> <span class="s">"]"</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"psf_estimation=["</span> <span class="o">+</span> <span class="n">psf_estimation</span> <span class="o">+</span> <span class="s">"]"</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="c1">// "psf_display=[" + psf_display + "]" + " " +</span>
<span class="s">"psf_display=[Do not show PSF's]"</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">" + load_input_images_sequentially + "</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"fused_image_output=["</span> <span class="o">+</span> <span class="n">fused_image_output</span> <span class="o">+</span> <span class="s">"]"</span>
<span class="o">);</span>
<span class="cm">/* 关闭 */</span>
<span class="n">运行时</span><span class="o">.</span><span class="na">退出</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span></code></pre></figure>
使用 `submit-jobs` 脚本提交反卷积作业:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
<span class="sb">`</span><span class="nb">ls</span> <span class="k">${</span><span class="nv">1</span><span class="k">}</span> | <span class="nb">grep</span> <span class="s2">".job$"</span><span class="sb">`</span>中的文件
做
bsub <span class="nt">-q</span> short <span class="nt">-n</span> 12 <span class="nt">-R</span> rusage[mem<span class="o">=</span>117000] <span class="nt">-R</span> span[hosts<span class="o">=</span>1] <span class="nt">-o</span> <span class="s2">"out.%J"</span> <span class="nt">-e</span> <span class="s2">"err.%J"</span> <span class="k">${</span><span class="nv">1</span><span class="k">}</span>/<span class="nv">$file</span>
完成</code></pre></figure>
### 3D 渲染
在**主文件**中指定用于渲染单通道数据的工作目录和脚本。在`source_rendering`下给出了在哪里可以找到融合或反卷积输出的目录。在`target_directory`下给出数据目录中保存数据的目录名称。将为您制作一个目录。指定帧数和最小最大值以设置渲染的亮度和对比度。
目前无法从主文件中输入方向或旋转参数。我们将致力于这一部分。因此您需要相应地修改`render-mov1.bsh`。
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">###---------- 渲染 ----------</span>
<span class="c">##工作目录</span>
<span class="nv">jobs_rendering</span><span class="o">=</span><span class="s2">"/projects/pilot_spim/Christopher/pipeline/jobs_master_beta_2.0/3d_rendering_cpu"</span>
<span class="c">##两套不同的脚本,一套用于单通道,一套用于多通道;选择:</span>
<span class="c">##工作脚本</span>
<span class="c">#rendering="/projects/pilot_spim/Christopher/pipeline/jobs_master_beta_2.0/3d_rendering_cpu/single-render-mov.bsh"</span>
渲染<span class="o">=</span>“/projects/pilot_spim/Christopher/pipeline/jobs_master_beta_2.0/3d_rendering_cpu/multi-render-mov.bsh”
<span class="c">##来源</span>
<span class="nv">source_rendering</span><span class="o">=</span><span class="s2">"/output_fusion"</span>
<span class="c">##目标目录</span>
<span class="nv">target_rendering</span><span class="o">=</span><span class="s2">"/渲染"</span>
<span class="c">#用于旋转</span>
<span class="nv">nframes</span><span class="o">=</span>“6”
<span class="c">##单通道最小最大</span>
最小渲染<span class="o">=</span>“0.6”
最大渲染<span class="o">=</span>“0.005”
<span class="c">##最小最大多通道</span>
<span class="c">#min_ch0=0.9</span>
<span class="c">#max_ch0=0.01</span>
<span class="c">#min_ch1=0.9</span>
<span class="c">#最大通道1=0.01</span>
<span class="c">##对于多通道渲染:</span>
<span class="c">#zSlices =“369”</span>
<span class="c">##方向或旋转</span>
<span class="c">#仍然需要直接放入脚本中</span>
<span class="c">#建设中</span></code></pre></figure>
`create_render_jobs`脚本:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
源 /projects/pilot_spim/Christopher/pipeline/master
<span class="nv">source_rendering</span><span class="o">=</span><span class="k">${</span><span class="nv">dir</span><span class="k">}${</span><span class="nv">source_rendering</span><span class="k">}</span>
<span class="nv">target_rendering</span><span class="o">=</span><span class="k">${</span><span class="nv">dir</span><span class="k">}${</span><span class="nv">target_rendering</span><span class="k">}</span>
<span class="nb">mkdir</span> <span class="nt">-p</span> <span class="nv">$jobs_rendering</span>
<span class="nb">mkdir</span> <span class="nt">-p</span> <span class="nv">$target_rendering</span>
对于我在 <span class="nv">$timepoint</span>
做
<span class="nv">job</span><span class="o">=</span><span class="s2">"</span><span class="nv">$jobs_rendering</span><span class="s2">/render-</span><span class="nv">$i</span><span class="s2">.job"</span>
<span class="nb">echo</span> <span class="nv">$job</span>
<span class="nb">echo</span> <span class="s2">"#!/bin/bash"</span> <span class="o">></span> <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="nv">$XVFB_RUN</span><span class="s2"> -as</span><span class="se">\"</span><span class="s2">-screen 0 1280x1024x24</span><span class="se">\"</span><span class="s2"> </span><span class="se">\</span><span class="s2">
</span><span class="nv">$Fiji_rendering</span><span class="s2"> -Xms20g -Xmx20g -Ddir=</span><span class="nv">$source_rendering</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dtimepoint=</span><span class="nv">$i</span><span class="s2"> -Dnframes=</span><span class="nv">$nframes</span><span class="s2"> -Dtarget_rendering=</span><span class="nv">$target_rendering</span><span class="se">\</span><span class="s2">
-Dminimum_rendering=</span><span class="nv">$minimum_rendering</span><span class="s2"> -Dmaximum_rendering=</span><span class="nv">$maximum_rendering</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dmin_ch0=</span><span class="nv">$min_ch0</span><span class="s2"> -Dmax_ch0=</span><span class="nv">$max_ch0</span><span class="s2"> -Dmin_ch1=</span><span class="nv">$min_ch1</span><span class="s2"> -Dmax_ch1=</span><span class="nv">$max_ch1</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-DzSlices=</span><span class="nv">$zSlices</span><span class="s2"> -- --no-splash </span><span class="nv">$rendering</span><span class="s2">"</span> <span class="o">>></span> <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
<span class="nb">chmod </span>a+x <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
完成</code></pre></figure>
在获取固定方向的`single-render-mov.bsh`脚本中,修改变换矩阵并注释掉脚本渲染部分中的旋转函数(第99-103行)以及旋转命令(第116行:`transform`)。对于旋转,请在脚本的渲染部分注释掉变换矩阵(第 93-94 行)和方向命令(第 115 行:`orientation`)。
<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="n">导入java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">Runtime</span><span class="err">;</span>
<span class="n">导入</span> <span class="n">ij</span><span class="o">.</span><span class="na">ImagePlus</span><span class="err">;</span>
<span class="n">导入</span> <span class="n">ij</span><span class="o">.</span><span class="na">ImageStack</span><span class="o">;</span>
<span class="n">导入</span> <span class="n">ij</span><span class="o">.</span><span class="na">process</span><span class="o">.</span><span class="na">ImageProcessor</span><span class="o">;</span>
<span class="n">导入</span> <span class="n">ij</span><span class="o">.</span><span class="na">IJ</span><span class="o">;</span>
<span class="n">导入</span> <span class="n">ij</span><span class="o">.</span><span class="na">measure</span><span class="o">.</span><span class="na">Calibration</span><span class="err">;</span>
<span class="n">导入</span> <span class="n">mpicbg</span><span class="o">.</span><span class="na">ij</span><span class="o">.</span><span class="na">stack</span><span class="o">.</span><span class="na">InverseTransformMapping</span><span class="err">;</span>
<span class="n">导入</span> <span class="n">mpicbg</span><span class="o">.</span><span class="na">models</span><span class="o">.</span><span class="na">TranslationModel3D</span><span class="o">;</span>
<span class="n">导入</span> <span class="n">mpicbg</span><span class="o">.</span><span class="na">models</span><span class="o">.</span><span class="na">AffineModel3D</span><span class="o">;</span>
<span class="n">导入</span> <span class="n">mpicbg</span><span class="o">.</span><span class="na">models</span><span class="o">.</span><span class="na">InverseCooperativeTransformList</span><span class="o">;</span>
<span class="n">导入</span> <span class="n">ij</span><span class="o">.</span><span class="na">process</span><span class="o">.</span><span class="na">ImageStatistics</span><span class="err">;</span>
<span class="n">导入</span> <span class="n">ij</span><span class="o">.</span><span class="na">process</span><span class="o">.</span><span class="na">StackStatistics</span><span class="err">;</span>
<span class="n">运行时</span> <span class="o">=</span> <span class="nc">Runtime</span><span class="o">.</span><span class="na">getRuntime</span><span class="o">();</span>
<span class="n">dir</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"dir"</span> <span class="o">);</span>
<span class="n">时间点</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"时间点"</span> <span class="o">)</span> <span class="o">);</span>
<span class="kt">int</span> <span class="n">nFrames</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"nframes"</span> <span class="o">)</span> <span class="o">);</span>
<span class="n">target_rendering</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"target_rendering"</span> <span class="o">);</span>
<span class="n">floatminimum_rendering</span> <span class="o">=</span> <span class="nc">Float</span><span class="o">.</span><span class="na">parseFloat</span><span class="o">(</span><span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span><span class="err">“</span><span class="n">minimum_rendering</span><span class="err">”</span><span class="o">));</span>
<span class="kt">float</span> <span class="n">max_rendering</span> <span class="o">=</span> <span class="nc">Float</span><span class="o">.</span><span class="na">parseFloat</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"maximum_rendering"</span> <span class="o">));</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"正在打开"</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">dir</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">dir</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">时间点</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">时间点</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"帧数= "</span> <span class="o">+</span> <span class="n">nFrames</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"target_directory="</span> <span class="o">+</span> <span class="n">target_rendering</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"MinMax="</span> <span class="o">+</span> <span class="n">最小渲染</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span> <span class="n">最大渲染</span> <span class="o">);</span>
<span class="no">IJ</span><span class="o">.</span><span class="na">run</span><span class="o">(</span><span class="s">"图像序列..."</span><span class="o">,</span> <span class="s">"open="</span> <span class="o">+</span> <span class="n">dir</span> <span class="o">+</span> <span class="s">"/"</span> <span class="o">+</span> <span class="n">时间点</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"number=1000 starting=1 increment=1 scale=100"</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"file=.tif"</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"or=[] sort"</span><span class="o">);</span>
<span class="n">imp</span> <span class="o">=</span> <span class="no">IJ</span><span class="o">.</span><span class="na">getImage</span><span class="o">();</span>
<span class="cm">/*
* 使用堆栈直方图获取最小值和最大值。
* @param sat_lov
* 允许有多少像素低于最小值。
* @参数 sat_high
* 允许有多少像素高于最大值。
* @参数统计
* 堆栈直方图。
* @return double[2] {最小值,最大值}
*/</span>
<span class="kt">double</span><span class="o">[]</span> <span class="nf">getMinAndMax</span><span class="o">(</span> <span class="kt">double</span> <span class="n">sat_low</span><span class="o">,</span> <span class="kt">double</span> <span class="n">sat_high</span><span class="o">,</span> <span class="nc">ImageStatistics</span> <span class="n">stats</span> <span class="o">)</span> <span class="o">{</span>
<span class="kt">int</span> <span class="n">hmin</span><span class="o">,</span> <span class="n">hmax</span><span class="o">;</span>
<span class="kt">int</span><span class="o">[]</span> <span class="n">histogram</span> <span class="o">=</span> <span class="n">stats</span><span class="o">.</span><span class="na">histogram</span><span class="o">;</span>
<span class="kt">int</span> <span class="n">hsize</span> <span class="o">=</span> <span class="n">histogram</span><span class="o">.</span><span class="na">length</span><span class="o">;</span>
<span class="kt">int</span> <span class="n">t_low</span> <span class="o">=</span> <span class="o">(</span><span class="kt">int</span><span class="o">)(</span><span class="n">stats</span><span class="o">.</span><span class="na">pixelCount</span><span class="o">*</span><span class="n">sat_low</span><span class="o">);</span>
<span class="kt">int</span> <span class="n">t_high</span> <span class="o">=</span> <span class="o">(</span><span class="kt">int</span><span class="o">)(</span><span class="n">stats</span><span class="o">.</span><span class="na">pixelCount</span><span class="o">*</span><span class="n">sat_high</span><span class="o">);</span>
<span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="o">;</span>
<span class="kt">boolean</span> <span class="n">found</span> <span class="o">=</span> <span class="kc">false</span><span class="o">;</span>
<span class="kt">int</span> <span class="n">count</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
<span class="kt">int</span> <span class="n">maxindex</span> <span class="o">=</span> <span class="n">hsize</span><span class="o">-</span><span class="mi">1</span><span class="o">;</span>
<span class="k">do</span> <span class="o">{</span>
<span class="n">i</span><span class="o">++;</span>
<span class="n">count</span> <span class="o">+=</span> <span class="n">histogram</span><span class="o">[</span><span class="n">i</span><span class="o">];</span>
<span class="n">found</span> <span class="o">=</span> <span class="n">count</span><span class="o">></span><span class="n">t_low</span><span class="o">;</span>
<span class="o">}</span> <span class="k">while</span> <span class="o">(!</span><span class="n">found</span> <span class="o">&&</span> <span class="n">i</span><span class="o"><</span><span class="n">maxindex</span><span class="o">);</span>
<span class="n">hmin</span> <span class="o">=</span> <span class="n">i</span><span class="o">;</span>
<span class="n">i</span> <span class="o">=</span> <span class="n">hsize</span><span class="o">;</span>
<span class="n">count</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
<span class="k">do</span> <span class="o">{</span>
<span class="n">i</span><span class="o">--;</span>
<span class="n">count</span> <span class="o">+=</span> <span class="n">histogram</span><span class="o">[</span><span class="n">i</span><span class="o">];</span>
<span class="n">found</span> <span class="o">=</span> <span class="n">count</span><span class="o">></span><span class="n">t_high</span><span class="o">;</span>
<span class="o">}</span> <span class="k">while</span> <span class="o">(!</span><span class="n">found</span> <span class="o">&&</span> <span class="n">i</span><span class="o">></span><span class="mi">0</span><span class="o">);</span>
<span class="n">hmax</span> <span class="o">=</span> <span class="n">i</span><span class="o">;</span>
<span class="kt">double</span> <span class="n">scale</span> <span class="o">=</span> <span class="o">(</span><span class="kt">double</span><span class="o">)</span><span class="n">hsize</span> <span class="o">/</span> <span class="o">(</span><span class="n">stats</span><span class="o">.</span><span class="na">histMax</span> <span class="o">-</span> <span class="n">stats</span><span class="o">.</span><span class="na">histMin</span><span class="o">);</span>
<span class="kt">double</span><span class="o">[]</span> <span class="n">a</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">double</span><span class="o">[</span><span class="mi">2</span><span class="o">];</span>
<span class="n">a</span><span class="o">[</span><span class="mi">0</span><span class="o">]=</span> <span class="o">(</span><span class="kt">double</span><span class="o">)</span><span class="n">hmin</span> <span class="o">/</span> <span class="n">scale</span> <span class="o">+</span> <span class="n">stats</span><span class="o">.</span><span class="na">histMin</span><span class="o">;</span>
<span class="n">a</span><span class="o">[</span><span class="mi">1</span><span class="o">]=</span> <span class="o">((</span><span class="kt">double</span><span class="o">)</span><span class="n">hmax</span> <span class="o">+</span> <span class="mf">1.0</span><span class="o">)</span> <span class="o">/</span> <span class="n">scale</span> <span class="o">+</span> <span class="n">stats</span><span class="o">.</span><span class="na">histMin</span><span class="o">;</span>
<span class="k">return</span> <span class="n">a</span><span class="o">;</span>
<span class="o">}</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"分析直方图"</span><span class="o">);</span>
<span class="cm">/*
* 计算最大值、最小值并转换为8位
*/</span>
<span class="n">stats</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">StackStatistics</span><span class="o">(</span> <span class="n">imp</span><span class="o">,</span> <span class="mi">10000</span><span class="o">,</span> <span class="mf">0.0</span><span class="o">,</span> <span class="mf">0.0</span> <span class="o">);</span>
<span class="kt">double</span><span class="o">[]</span> <span class="n">minmax</span> <span class="o">=</span> <span class="n">getMinAndMax</span><span class="o">(</span> <span class="n">最小渲染</span><span class="err">、</span><span class="n">最大渲染</span><span class="err">、</span><span class="n">统计数据</span><span class="o">);</span>
<span class="no">IJ</span><span class="o">.</span><span class="na">setMinAndMax</span><span class="o">(</span> <span class="n">imp</span><span class="o">,</span> <span class="n">minmax</span><span class="o">[</span><span class="mi">0</span><span class="o">],</span> <span class="n">minmax</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"定向"</span><span class="o">);</span>
<span class="cm">/* 旋转方向注释掉 */</span>
<span class="cm">/*方向 = new net.imglib2.realtransform.AffineTransform3D();
*方向.set(1.0, 0.0, 0.0, 0.0, 0.0, -0.978154, -0.20791358, 0.0, 0.0, 0.20791358, -0.978154, 0.0);
*/</span>
<span class="cm">/* 旋转 注释掉方向 */</span>
<span class="n">theta</span> <span class="o">=</span> <span class="o">(</span> <span class="kt">double</span> <span class="o">)</span><span class="n">时间点</span> <span class="o">/</span> <span class="mf">180.0</span> <span class="o">*</span> <span class="nc">Math</span><span class="o">.</span><span class="na">PI</span><span class="o">;</span>
<span class="n">方向</span> <span class="o">=</span> <span class="k">new</span> <span class="n">net</span><span class="o">.</span><span class="na">imglib2</span><span class="o">.</span><span class="na">realtransform</span><span class="o">.</span><span class="na">AffineTransform3D</span><span class="o">();</span>
<span class="n">方向</span><span class="o">.</span><span class="na">旋转</span><span class="o">(</span> <span class="mi">0</span><span class="o">,</span> <span class="n">θ</span> <span class="o">);</span>
<span class="n">变换</span><span class="o">=</span><span class="n">新net</span><span class="o">.</span><span class="na">imglib2</span><span class="o">.</span><span class="na">realtransform</span><span class="o">.</span><span class="na">AffineTransform3D</span><span class="o">();</span>
<span class="n">变换</span><span class="o">.</span><span class="na">preConcatenate</span><span class="o">(</span><span class="n">方向</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"渲染"</span><span class="o">);</span>
<span class="c1">//相应地注释掉方向或变换:</span>
<span class="n">omp</span> <span class="o">=</span> <span class="n">net</span><span class="o">.</span><span class="na">imglib2</span><span class="o">.</span><span class="na">render</span><span class="o">.</span><span class="na">volume</span><span class="o">.</span><span class="na">Renderer</span><span class="o">.</span><span class="na">runGray</span><span class="o">(</span>
<span class="n">imp</span><span class="o">,</span> <span class="c1">//impSource 3d image, will be converted to singel channel float even if it is ARGB-color</span>
<span class="n">imp</span><span class="o">.</span><span class="na">getWidth</span><span class="o">(),</span> <span class="c1">//@param width width of the target canvas</span>
<span class="n">imp</span><span class="o">.</span><span class="na">getHeight</span><span class="o">(),</span> <span class="c1">//@param height height of the target canvas</span>
<span class="mi">0</span><span class="o">,</span> <span class="c1">//@param min minimum intensity</span>
<span class="n">minmax</span><span class="o">[</span> <span class="mi">1</span> <span class="o">]</span> <span class="o">*</span> <span class="mi">2</span><span class="o">,</span> <span class="c1">//@param max maximum intensity</span>
<span class="c1">//orientation, //orientation from transformation matrix comment out for rotation</span>
<span class="n">transform</span><span class="o">,</span> <span class="c1">//orientation initial transformation assuming that the 3d volume is centered (e.g. export of Interactive Stack Rotation) Comment out if orientation is used!</span>
<span class="c1">//( double )timepoint / ( double )nFrames,//animation a value between 0 and 1 that specifies the camera position along a predefined path</span>
<span class="mi">0</span><span class="o">,</span>
<span class="mi">1</span><span class="o">,</span> <span class="c1">//stepSize z-stepping for the volume renderer higher is faster but less beautiful</span>
<span class="mi">0</span><span class="o">,</span> <span class="c1">//bg background intensity</span>
<span class="mi">1</span><span class="o">,</span> <span class="c1">//interpolationMethod 0 NN, 1 NL</span>
<span class="mf">1.0</span> <span class="o">/</span> <span class="o">(</span> <span class="n">minmax</span><span class="o">[</span> <span class="mi">1</span> <span class="o">]</span> <span class="o">),</span> <span class="c1">//alphaScale scale factor for linear intensity to alpha transfer</span>
<span class="c1">// - (minmax[0] + (minmax[0]*0.2)));</span>
<span class="o">-(</span> <span class="n">minmax</span><span class="o">[</span> <span class="mi">1</span> <span class="o">]</span> <span class="o">-</span> <span class="n">minmax</span><span class="o">[</span> <span class="mi">0</span> <span class="o">]</span> <span class="o">)</span> <span class="o">*</span> <span class="mf">0.5</span><span class="o">);</span> <span class="c1">//alphaOffset offset for linear intensity to alpha transfer</span>
<span class="n">omp</span><span class="o">.</span><span class="na">show</span><span class="o">();</span>
<span class="no">IJ</span><span class="o">.</span><span class="na">save</span><span class="o">(</span> <span class="n">omp</span><span class="o">,</span> <span class="n">target_rendering</span> <span class="o">+</span> <span class="s">"/render_tp"</span> <span class="o">+</span> <span class="no">IJ</span><span class="o">.</span><span class="na">pad</span><span class="o">(</span><span class="n">时间点</span><span class="o">,</span> <span class="mi">4</span><span class="o">)</span> <span class="o">+</span> <span class="s">".tif"</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"全部完成"</span><span class="o">);</span>
<span class="cm">/* 关闭 */</span>
<span class="n">运行时</span><span class="o">.</span><span class="na">退出</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span></code></pre></figure>
使用 `submit-jobs` 脚本提交渲染作业:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
<span class="sb">`</span><span class="nb">ls</span> <span class="k">${</span><span class="nv">1</span><span class="k">}</span> | <span class="nb">grep</span> <span class="s2">".job$"</span><span class="sb">`</span>中的文件
做
bsub <span class="nt">-q</span> short <span class="nt">-n</span> 1 <span class="nt">-R</span> span[hosts<span class="o">=</span>1] <span class="nt">-o</span> <span class="s2">"out.%J"</span> <span class="nt">-e</span> <span class="s2">"err.%J"</span> <span class="k">${</span><span class="nv">1</span><span class="k">}</span>/<span class="nv">$file</span>
完成</code></pre></figure>
### Hdf5 导出
主文件中涵盖 hdf5 导出的部分:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">###---------- hdf5 导出 ----------</span>
<span class="c">##目标目录</span>
<span class="nv">target_hdf5</span><span class="o">=</span>“/hdf5/”
<span class="c">##职位数量</span>
<span class="nv">num_export_job</span><span class="o">=</span><span class="s2">"</span><span class="sb">`</span><span class="nb">seq </span>0 3<span class="sb">`</span><span class="s2">"</span>
<span class="c">#路径目录</span>
<span class="c">#path="\"/projects/pilot_spim/Christopher/Test_scripts/single-channel\""</span>
路径 <span class="o">=</span>“<span class="se">\”</span>/projects/pilot_spim/Christopher/Test_scripts/multi-channel/channel_split<span class="se">\"</span><span class="s2">"
#Xml文件名
exportXmlFilename="</span><span class="se">\"</span>/hdf5/Test_single.xml<span class="se">\"</span><span class="s2">"
##Spim 模式
##对于单通道:spim_TL{tt}_Angle{a}.tif
##对于 2 通道:spim_TL{tt}_Angle{a}_Channel{c}.tif
#inputFilePattern="</span><span class="se">\"</span>spim_TL<span class="o">{</span>tt<span class="o">}</span>_Angle<span class="o">{</span>a<span class="o">}</span>.tif<span class="se">\"</span><span class="s2">"
inputFilePattern="</span><span class="se">\"</span>spim_TL<span class="o">{</span>tt<span class="o">}</span>_Angle<span class="o">{</span>a<span class="o">}</span>_Channel<span class="o">{</span>c<span class="o">}</span>.tif<span class="se">\"</span><span class="s2">"
##Channels:更改为2通道数据
channels_export="</span><span class="se">\"</span>0<span class="se">\"</span><span class="s2">"
#channels_export="</span><span class="se">\"</span>0,1<span class="se">\"</span><span class="s2">"
Angles_export="</span><span class="se">\"</span>1,2,3,4,5<span class="se">\"</span><span class="s2">"
timepoint_export="</span><span class="se">\"</span>1-3<span class="se">\"</span><span class="s2">"
Referencetp_export="</span><span class="se">\"</span>1<span class="se">\"</span><span class="s2">"
文件路径=“</span><span class="se">\”</span><span class="s2">/output_fusion/</span><span class="se">\“</span><span class="s2">”
filepattern="</span><span class="se">\"</span>%1<span class="se">\\\$</span>d/img_tl%1<span class="se">\\\$</span>d_ch%2<span class="se">\\\$</span>d_z%3<span class="se">\\\$</span>03d.tif<span class="se">\"</span><span class="s2">"
导出_numSlices =“369”
切片值最小值=“0”
切片值最大=“60000”
作物偏移X =“100”
作物偏移Y =“226”
作物偏移Z =“355”
比例=“2”</span></code></pre></figure>
第一步是确定必要的工作数量。执行`run_numjobs`脚本。该作业贯穿 `export.bsh` 脚本并计算必要作业的数量。
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
源 /projects/pilot_spim/Christopher/pipeline/master
工作<span class="o">=</span>“<span class="nv">$jobs_export</span>/getnumjobs”
<span class="nb">echo</span> <span class="nv">$job</span>
<span class="nb">echo</span> <span class="s2">"#!/bin/bash"</span> <span class="o">></span> <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="nv">$XVFB_RUN</span><span class="s2"> -a </span><span class="nv">$Fiji_export</span><span class="s2"> -Xmx10g -Dprintnumjobs=true </span><span class="se">\</span><span class="s2">
-Dpath=</span><span class="nv">$path</span><span class="s2"> -DexportXmlFilename=</span><span class="nv">$exportXmlFilename</span><span class="s2"> -Dspimresolutions=</span><span class="nv">$spimresolutions</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dspimsubdivisions=</span><span class="nv">$spimsubdivisions</span><span class="s2"> -DinputFilePattern=</span><span class="nv">$inputFilePattern</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dchannels=</span><span class="nv">$channels_export</span><span class="s2"> -Dangles=</span><span class="nv">$angles_export</span><span class="s2"> -Dtimepoints=</span><span class="nv">$timepoint_export</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-DreferenceTimePoint=</span><span class="nv">$referencetp_export</span><span class="s2"> -DoverrideImageZStretching=</span><span class="nv">$overrideImageZStretching</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-DzStretching=</span><span class="nv">$z_scaling</span><span class="s2"> -Dfusionresolutions=</span><span class="nv">$fusionresolutions</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dfusionsubdivisions=</span><span class="nv">$fusionsubdivisions</span><span class="s2"> -Dfilepath=</span><span class="nv">$filepath</span><span class="s2"> -Dfilepattern=</span><span class="nv">$filepattern</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-DnumSlices=</span><span class="nv">$export_numSlices</span><span class="s2"> -DsliceValueMin=</span><span class="nv">$sliceValueMin</span><span class="s2"> -DsliceValueMax=</span><span class="nv">$sliceValueMax</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-DcropOffsetX=</span><span class="nv">$cropOffsetX</span><span class="s2"> -DcropOffsetY=</span><span class="nv">$cropOffsetY</span><span class="s2"> -DcropOffsetZ=</span><span class="nv">$cropOffsetZ</span><span class="s2"> -Dscale=</span><span class="nv">$scale</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-- --no-splash </span><span class="nv">$export</span><span class="s2">"</span> <span class="o">>></span> <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
<span class="nb">chmod </span>a+x <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
bsub <span class="nt">-q</span> 短 <span class="nt">-n</span> 1 <span class="nt">-R</span> span[主机<span class="o">=</span>1] <span class="nt">-o</span> <span class="s2">"numjobsout"</span> <span class="nt">-e</span> <span class="s2">"输出/err.%J"</span> <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span></code></pre></figure>
该脚本将写入一个作业文件`getnumjobs`,该文件将直接发送到集群。
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
/sw/bin/xvfb-run <span class="nt">-a</span> /sw/users/pietzsch/packages/Fiji.app/ImageJ-linux64 <span class="nt">-Xmx10g</span> <span class="nt">-Dprintnumjobs</span><span class="o">=</span><span class="nb">true</span>
<span class="nt">-Dpath</span><span class="o">=</span><span class="s2">"/projects/pilot_spim/Christopher/Test_scripts/single-channel"</span>
<span class="nt">-DexportXmlFilename</span><span class="o">=</span><span class="s2">"/hdf5/Test_single.xml"</span> <span class="nt">-Dspimresolutions</span><span class="o">=</span>
<span class="nt">-Dspimsubdivisions</span><span class="o">=</span> <span class="nt">-DinputFilePattern</span><span class="o">=</span><span class="s2">"spim_TL{tt}_Angle{a}.tif"</span>
<span class="nt">-Dchannels</span><span class="o">=</span><span class="s2">"0"</span> <span class="nt">-Dangles</span><span class="o">=</span><span class="s2">"1,2,3"</span> <span class="nt">-Dtimepoints</span><span class="o">=</span><span class="s2">"1-3"</span>
<span class="nt">-DreferenceTimePoint</span><span class="o">=</span><span class="s2">"1"</span> <span class="nt">-DoverrideImageZStretching</span><span class="o">=</span>
<span class="nt">-DzStretching</span><span class="o">=</span>3.2643520832 <span class="nt">-Dfusionresolutions</span><span class="o">=</span>
<span class="nt">-Dfusionsubdivisions</span><span class="o">=</span> <span class="nt">-Dfilepath</span><span class="o">=</span><span class="s2">"/output_fusion/"</span>
<span class="nt">-Dfilepattern</span><span class="o">=</span><span class="s2">"%1</span><span class="se">\$</span><span class="s2">d/img_tl%1</span><span class="se">\$</span><span class="s2">d_ch%2</span><span class="se">\$</span><span class="s2">d_z%3</span><span class="se">\$</span><span class="s2">03d.tif"</span> <span class="nt">-DnumSlices</span><span class="o">=</span>376
<span class="nt">-DsliceValueMin</span><span class="o">=</span>0 <span class="nt">-DsliceValueMax</span><span class="o">=</span>60000 <span class="nt">-DcropOffsetX</span><span class="o">=</span>100 <span class="nt">-DcropOffsetY</span><span class="o">=</span>226
<span class="nt">-DcropOffsetZ</span><span class="o">=</span>226 <span class="nt">-Dscale</span><span class="o">=</span>355
<span class="nt">--</span> <span class="nt">--no-splash</span> /projects/pilot_spim/Christopher/pipeline/jobs_master_beta_2.0/hdf5/export.bsh</code></pre></figure>
该作业的输出将是 `numjobsout` 文件:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">猫 numjobsout
你的工作看起来像:
<span class="nt">------------------------------------------------------------------------</span>
<span class="c"># LSBATCH:用户输入</span>
/projects/pilot_spim/Christopher/pipeline/jobs_master_beta_2.0/hdf5//getnumjobs
<span class="nt">------------------------------------------------------------------------</span>
顺利完成。
资源使用总结:
CPU <span class="nb">time</span> : 3.39 sec.
Max Memory : 3 MB
Max Swap : 33 MB
Max Processes : 1
Max Threads : 1
输出(如果有)如下:
路径<span class="o">=</span>/projects/pilot_spim/Christopher/Test_scripts/single-channel
Xml 文件名<span class="o">=</span>/projects/pilot_spim/Christopher/Test_scripts/single-channel/hdf5/Test_single.xml
<span class="nv">inputFilePattern</span><span class="o">=</span>spim_TL<span class="o">{</span>tt<span class="o">}</span>_Angle<span class="o">{</span>a<span class="o">}</span>.tif
频道<span class="o">=</span>0
角度<span class="o">=</span>1,2,3
时间点<span class="o">=</span>1-3
参考时间点<span class="o">=</span>1
<span class="nv">overrideImageZStretching</span><span class="o">=</span><span class="nb">true
</span>z拉伸<span class="o">=</span>3.481975
文件路径<span class="o">=</span>/projects/pilot_spim/Christopher/Test_scripts/single-channel/output_fusion/
文件模式<span class="o">=</span>%1<span class="nv">$d</span>/img_tl%1<span class="nv">$d_ch</span>%2<span class="nv">$d_z</span>%3<span class="nv">$03d</span>.tif
切片值最小值<span class="o">=</span>0
切片值最大<span class="o">=</span>60000
裁剪偏移X<span class="o">=</span>100
裁剪偏移Y<span class="o">=</span>226
作物偏移Z<span class="o">=</span>355
比例<span class="o">=</span>2
通道模式:0
频道:<span class="o">(</span>0<span class="o">)</span>
注册频道:0
通道寄存器:<span class="o">(</span>0<span class="o">)</span>
熔断通道:0
通道保险丝: <span class="o">(</span>0<span class="o">)</span>
(欧洲中部时间 2014 年 3 月 13 日星期四 09:44:10):加载时间点 1
使用模型:mpicbg.models.AffineModel3D
(欧洲中部时间 2014 年 3 月 13 日星期四 09:44:10):加载时间点 2
使用模型:mpicbg.models.AffineModel3D
(欧洲中部时间 2014 年 3 月 13 日星期四 09:44:10):加载时间点 3
使用模型:mpicbg.models.AffineModel3D
使用模型:mpicbg.models.AffineModel3D
使用模型:mpicbg.models.AffineModel3D
使用模型:mpicbg.models.AffineModel3D
使用模型:mpicbg.models.AffineModel3D
最终输出图像的尺寸:
从:(-4.3802876、-48.357666、-589.2959)到(1932.7172、1272.5442、761.48395)
大小:(1937.0974、1320.9019、1350.7798)需要 13185 MB RAM
缩放大小<span class="o">(</span>2<span class="o">)</span>:<span class="o">(</span>969, 660, 675<span class="o">)</span> 需要 1648 MB RAM
tx <span class="o">=</span> 96.0 ty <span class="o">=</span> 178.0 tz <span class="o">=</span> <span class="nt">-234</span>.0 比例 <span class="o">=</span> 2
职位数量:3
PS:stderr 输出(如果有)如下:
附:
无法打开 stderr 文件输出/err.861957:没有这样的文件或目录。
stderr 输出包含在此报告中。</code></pre></figure>
您可以检查所有参数是否正确。重要的一行是最后 `number of jobs: 3`。这意味着我们需要相应地调整`master file`:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">##职位数量</span>
<span class="nv">num_export_job</span><span class="o">=</span><span class="s2">"</span><span class="sb">`</span><span class="nb">seq </span>0 3<span class="sb">`</span><span class="s2">"</span></code></pre></figure>
必须始终存在“0”工作。此作业生成 `.xml` 文件。其他作业将写入包含实际数据的 `.h5` 文件。其余部分的工作方式与管道的其他部分类似。使用 `create_export_jobs` 脚本创建作业。该脚本还将在 spim 数据目录中创建一个新目录。
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
源 /projects/pilot_spim/Christopher/pipeline/master
<span class="nv">target_hdf5</span><span class="o">=</span><span class="k">${</span><span class="p">目录</span><span class="k">}${</span><span class="nv">target_hdf5</span><span class="k">}</span>
回显<span class="nv">$target_hdf5</span>
<span class="nb">mkdir</span> <span class="nt">-p</span> <span class="nv">$target_hdf5</span>
对于 <span class="nv">$num_export_job</span> 中的我
做
<span class="nv">job</span><span class="o">=</span><span class="s2">"</span><span class="nv">$jobs_export</span><span class="s2">/export-</span><span class="nv">$i</span><span class="s2">.job"</span>
<span class="nb">echo</span> <span class="nv">$job</span>
<span class="nb">echo</span> <span class="s2">"#!/bin/bash"</span> <span class="o">></span> <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
<span class="c">#echo "source $config" >> "$job"</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="nv">$XVFB_RUN</span><span class="s2"> -a </span><span class="nv">$Fiji_export</span><span class="s2"> -Xmx10g -Dpartition=</span><span class="nv">$i</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dpath=</span><span class="nv">$path</span><span class="s2"> -DexportXmlFilename=</span><span class="nv">$exportXmlFilename</span><span class="s2"> -Dspimresolutions=</span><span class="nv">$spimresolutions</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dspimsubdivisions=</span><span class="nv">$spimsubdivisions</span><span class="s2"> -DinputFilePattern=</span><span class="nv">$inputFilePattern</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dchannels=</span><span class="nv">$channels_export</span><span class="s2"> -Dangles=</span><span class="nv">$angles_export</span><span class="s2"> -Dtimepoints=</span><span class="nv">$timepoint_export</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-DreferenceTimePoint=</span><span class="nv">$referencetp_export</span><span class="s2"> -DoverrideImageZStretching=</span><span class="nv">$overrideImageZStretching</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-DzStretching=</span><span class="nv">$z_scaling</span><span class="s2"> -Dfusionresolutions=</span><span class="nv">$fusionresolutions</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dfusionsubdivisions=</span><span class="nv">$fusionsubdivisions</span><span class="s2"> -Dfilepath=</span><span class="nv">$filepath</span><span class="s2"> -Dfilepattern=</span><span class="nv">$filepattern</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-DnumSlices=</span><span class="nv">$export_numSlices</span><span class="s2"> -DsliceValueMin=</span><span class="nv">$sliceValueMin</span><span class="s2"> -DsliceValueMax=</span><span class="nv">$sliceValueMax</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-DcropOffsetX=</span><span class="nv">$cropOffsetX</span><span class="s2"> -DcropOffsetY=</span><span class="nv">$cropOffsetY</span><span class="s2"> -DcropOffsetZ=</span><span class="nv">$cropOffsetZ</span><span class="s2"> -Dscale=</span><span class="nv">$scale</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-- --no-splash </span><span class="nv">$export</span><span class="s2">"</span> <span class="o">>></span> <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
<span class="nb">chmod </span>a+x <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
完成</code></pre></figure>
每个作业将使用 `export.bsh` 脚本:
<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="n">导入创建者</span><span class="err">。</span><span class="n">脚本</span><span class="err">;</span>
<span class="n">导入creator</span><span class="o">.</span><span class="na">Scripting</span><span class="o">.</span><span class="na">PartitionedSequenceWriter</span><span class="err">;</span>
<span class="n">导入创建者</span><span class="o">.</span><span class="na">SetupAggregator</span><span class="err">;</span>
<span class="n">导入creator</span><span class="o">.</span><span class="na">spim</span><span class="o">.</span><span class="na">imgloader</span><span class="o">.</span><span class="na">StackImageLoader</span><span class="err">;</span>
<span class="n">导入</span> <span class="n">mpicbg</span><span class="o">.</span><span class="na">spim</span><span class="o">.</span><span class="na">data</span><span class="o">.</span><span class="na">SequenceDescription</span><span class="err">;</span>
<span class="n">导入</span> <span class="n">mpicbg</span><span class="o">.</span><span class="na">spim</span><span class="o">.</span><span class="na">data</span><span class="o">.</span><span class="na">ViewRegistration</span><span class="o">;</span>
<span class="n">导入</span> <span class="n">mpicbg</span><span class="o">.</span><span class="na">spim</span><span class="o">.</span><span class="na">data</span><span class="o">.</span><span class="na">ViewRegistrations</span><span class="err">;</span>
<span class="n">导入</span> <span class="n">mpicbg</span><span class="o">.</span><span class="na">spim</span><span class="o">.</span><span class="na">data</span><span class="o">.</span><span class="na">ViewSetup</span><span class="o">;</span>
<span class="n">导入</span> <span class="n">net</span><span class="o">.</span><span class="na">imglib2</span><span class="o">.</span><span class="na">realtransform</span><span class="o">.</span><span class="na">AffineTransform3D</span><span class="o">;</span>
<span class="n">导入viewer</span><span class="o">.</span><span class="na">hdf5</span><span class="o">.</span><span class="na">Partition</span><span class="err">;</span>
<span class="n">字符串路径</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span><span class="err">“</span><span class="n">路径</span><span class="err">”</span><span class="o">);</span>
<span class="nc">String</span> <span class="n">exportXmlFilename</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"exportXmlFilename"</span> <span class="o">);</span>
<span class="c1">//int[][] spimresolutions = System.getProperty( "spimresolutions" );</span>
<span class="c1">//int[][] spimsubdivisions = System.getProperty( "spimsubdivisions" );</span>
<span class="n">inputFilePattern</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"inputFilePattern"</span> <span class="o">);</span>
<span class="n">频道</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"频道"</span> <span class="o">);</span>
<span class="n">角度</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"角度"</span> <span class="o">);</span>
<span class="n">时间点</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"时间点"</span> <span class="o">);</span>
<span class="kt">int</span> <span class="n">referenceTimePoint</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"referenceTimePoint"</span> <span class="o">)</span> <span class="o">);</span>
<span class="c1">//overrideImageZStretching = System.getProperty( "overrideImageZStretching" );</span>
<span class="kt">float</span> <span class="n">zStretching</span> <span class="o">=</span> <span class="nc">Float</span><span class="o">.</span><span class="na">parseFloat</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"zStretching"</span> <span class="o">)</span> <span class="o">);</span>
<span class="c1">//int[][] fusionresolutions = System.getProperty( "fusionresolutions" );</span>
<span class="c1">//int[][] fusionsubdivisions = System.getProperty( "fusionsubdivisions" );</span>
<span class="nc">String</span> <span class="n">filepath</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"filepath"</span> <span class="o">);</span>
<span class="nc">String</span> <span class="n">filepattern</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"filepattern"</span> <span class="o">);</span>
<span class="kt">int</span> <span class="n">numSlices</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"numSlices"</span> <span class="o">)</span> <span class="o">);</span>
<span class="kt">int</span> <span class="n">sliceValueMin</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"sliceValueMin"</span> <span class="o">)</span> <span class="o">);</span>
<span class="kt">int</span> <span class="n">sliceValueMax</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"sliceValueMax"</span> <span class="o">)</span> <span class="o">);</span>
<span class="kt">int</span> <span class="nc">CropOffsetX</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"cropOffsetX"</span> <span class="o">)</span> <span class="o">);</span>
<span class="kt">int</span> <span class="nc">CropOffsetY</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"cropOffsetY"</span> <span class="o">)</span> <span class="o">);</span>
<span class="kt">int</span> <span class="nc">CropOffsetZ</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"cropOffsetZ"</span> <span class="o">)</span> <span class="o">);</span>
<span class="kt">int</span> <span class="n">scale</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"scale"</span> <span class="o">)</span> <span class="o">);</span>
<span class="n">字符串exportXmlFilename</span> <span class="o">=</span> <span class="n">路径</span><span class="o">+</span><span class="n">exportXmlFilename</span><span class="o">;</span>
<span class="n">输入目录</span><span class="o">=</span><span class="n">路径</span><span class="o">+</span><span class="err">“</span><span class="o">/</span><span class="err">”;</span>
<span class="n">overrideImageZStretching</span> <span class="o">=</span> <span class="kc">true</span><span class="o">;</span>
<span class="n">字符串文件路径</span><span class="o">=</span><span class="n">路径</span><span class="o">+</span><span class="n">文件路径</span><span class="err">;</span>
<span class="c1">// ====================================================================================</span>
<span class="kt">int</span><span class="o">[][]</span> <span class="n">spimresolutions</span> <span class="o">=</span> <span class="o">{</span> <span class="o">{</span> <span class="mi">1</span><span class="o">,</span> <span class="mi">1</span><span class="o">,</span> <span class="mi">1</span> <span class="o">},</span> <span class="o">{</span> <span class="mi">2</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="mi">1</span> <span class="o">},</span> <span class="o">{</span> <span class="mi">4</span><span class="o">,</span> <span class="mi">4</span><span class="o">,</span> <span class="mi">2</span> <span class="o">},</span> <span class="o">{</span> <span class="mi">8</span><span class="o">,</span> <span class="mi">8</span><span class="o">,</span> <span class="mi">4</span> <span class="o">}</span> <span class="o">};</span>
<span class="kt">int</span><span class="o">[][]</span> <span class="n">spimsubdivisions</span> <span class="o">=</span> <span class="o">{</span> <span class="o">{</span> <span class="mi">32</span><span class="o">,</span> <span class="mi">32</span><span class="o">,</span> <span class="mi">4</span> <span class="o">},</span> <span class="o">{</span> <span class="mi">16</span><span class="o">,</span> <span class="mi">16</span><span class="o">,</span> <span class="mi">8</span> <span class="o">},</span> <span class="o">{</span> <span class="mi">8</span><span class="o">,</span> <span class="mi">8</span><span class="o">,</span> <span class="mi">8</span> <span class="o">},</span> <span class="o">{</span> <span class="mi">8</span><span class="o">,</span> <span class="mi">8</span><span class="o">,</span> <span class="mi">8</span> <span class="o">}</span> <span class="o">};</span>
<span class="c1">// int[][] spimresolutions = { { 1, 1, 1 }, { 2, 2, 1 }, { 4, 4, 2 } };</span>
<span class="c1">// int[][] spimsubdivisions = { { 32, 32, 4 }, { 16, 16, 8 }, { 8, 8, 8 } };</span>
<span class="kt">int</span><span class="o">[][]</span> <span class="n">fusionresolutions</span> <span class="o">=</span> <span class="o">{</span> <span class="o">{</span> <span class="mi">1</span><span class="o">,</span> <span class="mi">1</span><span class="o">,</span> <span class="mi">1</span> <span class="o">},</span> <span class="o">{</span> <span class="mi">2</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="mi">2</span> <span class="o">},</span> <span class="o">{</span> <span class="mi">4</span><span class="o">,</span> <span class="mi">4</span><span class="o">,</span> <span class="mi">4</span> <span class="o">},</span> <span class="o">{</span> <span class="mi">8</span><span class="o">,</span> <span class="mi">8</span><span class="o">,</span> <span class="mi">8</span> <span class="o">}</span> <span class="o">};</span>
<span class="kt">int</span><span class="o">[][]</span> <span class="n">fusionsubdivisions</span> <span class="o">=</span> <span class="o">{</span> <span class="o">{</span> <span class="mi">16</span><span class="o">,</span> <span class="mi">16</span><span class="o">,</span> <span class="mi">16</span> <span class="o">},</span> <span class="o">{</span> <span class="mi">16</span><span class="o">,</span> <span class="mi">16</span><span class="o">,</span> <span class="mi">16</span> <span class="o">},</span> <span class="o">{</span> <span class="mi">8</span><span class="o">,</span> <span class="mi">8</span><span class="o">,</span> <span class="mi">8</span> <span class="o">},</span> <span class="o">{</span> <span class="mi">8</span><span class="o">,</span> <span class="mi">8</span><span class="o">,</span> <span class="mi">8</span> <span class="o">}</span> <span class="o">};</span>
<span class="c1">// =================================================================================</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">路径</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">路径</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Xml 文件名="</span><span class="o">+</span><span class="n">exportXmlFilename</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"inputFilePattern="</span> <span class="o">+</span> <span class="n">inputFilePattern</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">通道</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">通道</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">角度</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">角度</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"timepoints="</span> <span class="o">+</span> <span class="n">时间点</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">referenceTimePoint</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">referenceTimePoint</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"overrideImageZStretching="</span> <span class="o">+</span> <span class="n">overrideImageZStretching</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"zStretching="</span> <span class="o">+</span> <span class="n">zStretching</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">文件路径</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">文件路径</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"filepattern="</span> <span class="o">+</span> <span class="n">filepattern</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"sliceValueMin="</span> <span class="o">+</span> <span class="n">sliceValueMin</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"sliceValueMax="</span> <span class="o">+</span> <span class="n">sliceValueMax</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">cropOffsetX</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">cropOffsetX</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">cropOffsetY</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">cropOffsetY</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">cropOffsetZ</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">cropOffsetZ</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">scale</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">scale</span><span class="o">);</span>
<span class="c1">// =================================================================================</span>
<span class="n">spimseq</span> <span class="o">=</span> <span class="nc">Scripting</span><span class="o">.</span><span class="na">createSpimRegistrationSequence</span><span class="o">(</span> <span class="n">inputDirectory</span><span class="o">,</span> <span class="n">inputFilePattern</span><span class="o">,</span> <span class="n">通道</span><span class="o">,</span> <span class="n">角度</span><span class="o">,</span> <span class="n">时间点</span><span class="o">,</span> <span class="n">referenceTimePoint</span><span class="o">,</span> <span class="n">overrideImageZStretching</span><span class="o">,</span> <span class="n">zStretching</span> <span class="o">);</span>
<span class="n">fusionTransforms</span> <span class="o">=</span> <span class="nc">Scripting</span><span class="o">.</span><span class="na">getFusionTransforms</span><span class="o">(</span> <span class="n">spimseq</span><span class="o">,</span><span class="n">scale</span><span class="o">,</span><span class="n">cropOffsetX</span><span class="o">,</span><span class="n">cropOffsetY</span><span class="o">,</span><span class="n">cropOffsetZ</span><span class="o">);</span>
<span class="n">fusion</span> <span class="o">=</span> <span class="nc">Scripting</span><span class="o">.</span><span class="na">createFusionResult</span><span class="o">(</span> <span class="n">spimseq</span><span class="o">,</span> <span class="n">文件路径</span><span class="o">,</span> <span class="n">filepattern</span><span class="o">,</span> <span class="n">numSlices</span><span class="o">,</span> <span class="n">sliceValueMin</span><span class="o">,</span> <span class="n">sliceValueMax</span><span class="o">,</span> <span class="n">fusionTransforms</span> <span class="o">);</span>
<span class="nc">SetupAggregator</span> <span class="n">聚合器</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">SetupAggregator</span><span class="o">();</span>
<span class="n">aggregator</span><span class="o">.</span><span class="na">addSetups</span><span class="o">(</span> <span class="n">spimseq</span><span class="o">,</span> <span class="n">spimresolutions</span><span class="o">,</span> <span class="n">spimsubdivisions</span> <span class="o">);</span>
<span class="n">aggregator</span><span class="o">.</span><span class="na">addSetups</span><span class="err">(</span><span class="n">融合</span><span class="err">,</span><span class="n">融合分辨率</span><span class="err">,</span><span class="n">融合细分</span><span class="err">);</span>
<span class="c1">// 分裂...</span>
<span class="kt">int</span> <span class="n">每个分区的时间点</span> <span class="o">=</span> <span class="mi">2</span><span class="o">;</span>
<span class="kt">int</span> <span class="n">setupsPerPartition</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
<span class="nc">ArrayList</span> <span class="n">分区</span> <span class="o">=</span> <span class="nc">Scripting</span><span class="o">.</span><span class="na">split</span><span class="o">(</span> <span class="n">聚合器</span><span class="o">,</span> <span class="n">timepointsPerPartition</span><span class="o">,</span> <span class="n">setupsPerPartition</span><span class="o">,</span> <span class="n">exportXmlFilename</span> <span class="o">);</span>
<span class="nc">PartitionedSequenceWriter</span> <span class="n">writer</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">PartitionedSequenceWriter</span><span class="o">(</span> <span class="n">聚合器</span><span class="o">,</span> <span class="n">exportXmlFilename</span><span class="o">,</span> <span class="n">分区</span> <span class="o">);</span>
<span class="n">printnumjobs</span> <span class="o">=</span> <span class="nc">Boolean</span><span class="o">.</span><span class="na">parseBoolean</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"printnumjobs"</span> <span class="o">)</span> <span class="o">);</span>
<span class="k">if</span> <span class="o">(</span> <span class="n">打印作业数</span> <span class="o">)</span>
<span class="o">{</span>
<span class="n">print</span><span class="o">(</span> <span class="s">"number of jobs: "</span> <span class="o">+</span> <span class="o">(</span> <span class="n">writer</span><span class="o">.</span><span class="na">numPartitions</span><span class="o">()</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">)</span> <span class="o">);</span>
<span class="o">}</span>
<span class="n">别的</span>
<span class="o">{</span>
<span class="n">jobid</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"partition"</span> <span class="o">)</span> <span class="o">);</span>
<span class="k">if</span> <span class="o">(</span> <span class="n">jobid</span> <span class="o">==</span> <span class="mi">0</span> <span class="o">)</span>
<span class="o">{</span>
<span class="n">writer</span><span class="o">.</span><span class="na">writeXmlAndLinks</span><span class="o">();</span>
<span class="o">}</span>
<span class="k">else</span>
<span class="o">{</span>
<span class="n">writer</span><span class="o">.</span><span class="na">writePartition</span><span class="o">(</span> <span class="n">jobid</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">);</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="cm">/* 关闭 */</span>
<span class="n">系统</span><span class="o">.</span><span class="na">退出</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span></code></pre></figure>
使用 `submit-jobs` 脚本将作业发送到集群:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
<span class="sb">`</span><span class="nb">ls</span> <span class="k">${</span><span class="nv">1</span><span class="k">}</span> | <span class="nb">grep</span> <span class="s2">".job$"</span><span class="sb">`</span>中的文件
做
bsub <span class="nt">-q</span> short <span class="nt">-n</span> 8 <span class="nt">-W</span> 01:00 <span class="nt">-R</span> rusage[mem<span class="o">=</span>10000] <span class="nt">-R</span> span[hosts<span class="o">=</span>1] <span class="nt">-o</span> <span class="s2">"out.%J"</span> <span class="nt">-e</span> <span class="s2">"err.%J"</span> <span class="k">${</span><span class="nv">1</span><span class="k">}</span>/<span class="nv">$file</span>
完毕</code></pre></figure>
## 多通道处理
**主文件**拥有在单通道和多通道数据之间轻松切换所需的所有信息。您只需要在主文件中进行正确的设置,并为当前管道使用2个附加脚本来处理多通道数据集。在本章中我将具体指出必要的修改。
### 第一步
由于我们已经正确设置了主文件和脚本,这次我们唯一需要操作的是处理参数(请参阅第一次使用主文件)
更改数据目录`dir=`。示例数据集有 3 个时间点和 5 个角度。对于多通道处理,请选择多通道数据选项:`pattern_of_spim="spim_TL{tt}_Angle{a}_Channel{c}.tif"`。还要更改参考时间点和校准设置。
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">####--------------------------------- 一般参数--------------------------------</span>
<span class="c">###数据目录</span>
<span class="nb">dir</span><span class="o">=</span><span class="s2">"/projects/tomancak_lightsheet/Christopher/Test_scripts/multi-channel/"</span>
<span class="c">###数据集核心参数</span>
时间点<span class="o">=</span>“<span class="sb">`</span><span class="nb">seq </span>1 3<span class="sb">`</span>”
角度<span class="o">=</span>“1,2,3,4,5”
数字角度<span class="o">=</span>“5”
<span class="c">###垃圾邮件数据的模式:</span>
<span class="c">#pattern_of_spim="spim_TL{tt}_Angle{a}.tif"</span>
<span class="nv">pattern_of_spim</span><span class="o">=</span><span class="s2">"spim_TL{tt}_Angle{a}_Channel{c}.tif"</span>
<span class="c">##单通道的更改模式:(例如 spim_TL{tt}_Angle{a}.tif)</span>
<span class="c">##或多通道处理:(例如 spim_TL{tt}_Angle{a}_Channel{c}.tif)</span>
<span class="c">##对于填充零,使用 tt 作为占位符</span>
<span class="c">###延时摄影注册</span>
参考tp<span class="o">=</span>“1”
<span class="c">###手动校准</span>
xy_分辨率<span class="o">=</span>“1”
z_scaling <span class="o">=</span>“3.481975”</code></pre></figure>
数据集位于指定目录中:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nb">cd</span> /projects/tomancak_lightsheet/Christopher/Test_scripts/多通道/
LS
2014-02-14_Stock19_Stock17.czi
2014-02-14_Stock19_Stock17<span class="o">(</span>1<span class="o">)</span>.czi
2014-02-14_Stock19_Stock17<span class="o">(</span>2<span class="o">)</span>.czi
2014-02-14_Stock19_Stock17<span class="o">(</span>3<span class="o">)</span>.czi
2014-02-14_Stock19_Stock17<span class="o">(</span>4<span class="o">)</span>.czi
2014-02-14_Stock19_Stock17<span class="o">(</span>5<span class="o">)</span>.czi
2014-02-14_Stock19_Stock17<span class="o">(</span>6<span class="o">)</span>.czi
2014-02-14_Stock19_Stock17<span class="o">(</span>7<span class="o">)</span>.czi
2014-02-14_Stock19_Stock17<span class="o">(</span>8<span class="o">)</span>.czi
2014-02-14_Stock19_Stock17<span class="o">(</span>9<span class="o">)</span>.czi
2014-02-14_Stock19_Stock17<span class="o">(</span>10<span class="o">)</span>.czi
2014-02-14_Stock19_Stock17<span class="o">(</span>11<span class="o">)</span>.czi
2014-02-14_Stock19_Stock17<span class="o">(</span>12<span class="o">)</span>.czi
2014-02-14_Stock19_Stock17<span class="o">(</span>13<span class="o">)</span>.czi
2014-02-14_Stock19_Stock17<span class="o">(</span>14<span class="o">)</span>.czi</code></pre></figure>
将 (0) 索引添加到第一个 `.czi` 文件中:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">MV 2014-02-14_Stock19_Stock17.czi 2014-02-14_Stock19_Stock17<span class="o">(</span>0<span class="o">)</span>.czi
LS
2014-02-14_Stock19_Stock17<span class="o">(</span>0<span class="o">)</span>.czi
2014-02-14_Stock19_Stock17<span class="o">(</span>1<span class="o">)</span>.czi
2014-02-14_Stock19_Stock17<span class="o">(</span>2<span class="o">)</span>.czi
2014-02-14_Stock19_Stock17<span class="o">(</span>3<span class="o">)</span>.czi
2014-02-14_Stock19_Stock17<span class="o">(</span>4<span class="o">)</span>.czi
2014-02-14_Stock19_Stock17<span class="o">(</span>5<span class="o">)</span>.czi
2014-02-14_Stock19_Stock17<span class="o">(</span>6<span class="o">)</span>.czi
2014-02-14_Stock19_Stock17<span class="o">(</span>7<span class="o">)</span>.czi
2014-02-14_Stock19_Stock17<span class="o">(</span>8<span class="o">)</span>.czi
2014-02-14_Stock19_Stock17<span class="o">(</span>9<span class="o">)</span>.czi
2014-02-14_Stock19_Stock17<span class="o">(</span>10<span class="o">)</span>.czi
2014-02-14_Stock19_Stock17<span class="o">(</span>11<span class="o">)</span>.czi
2014-02-14_Stock19_Stock17<span class="o">(</span>12<span class="o">)</span>.czi
2014-02-14_Stock19_Stock17<span class="o">(</span>13<span class="o">)</span>.czi
2014-02-14_Stock19_Stock17<span class="o">(</span>14<span class="o">)</span>.czi</code></pre></figure>
### 重命名.czi 文件
多通道数据中的重命名遵循与单通道数据中完全相同的原理。只需相应修改主文件,然后执行`rename-zeiss-files.sh`脚本即可。
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">###---------- 重命名 .czi 文件 ----------</span>
第一个索引<span class="o">=</span>“0”
最后索引<span class="o">=</span>“14”
第一时间点<span class="o">=</span>“1”
角度重命名<span class="o">=(</span>1 2 3 4 5<span class="o">)</span>
<span class="c">##对于填充零 2 = 01; 3 = 001</span>
pad_rename_czi <span class="o">=</span>“2”
<span class="c">##更改目录和模式</span>
<span class="nv">source_pattern</span><span class="o">=</span>/2014-02-14_Stock19_Stock17<span class="se">\(\{</span>index<span class="se">\}\)</span>.czi
<span class="nv">target_pattern</span><span class="o">=</span>/spim_TL<span class="se">\{</span>时间点<span class="se">\}</span>_Angle<span class="se">\{</span>角度<span class="se">\}</span>.czi</code></pre></figure>
`.czi` 文件现在应重命名:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nb">cd</span> /projects/tomancak_lightsheet/Christopher/Test_scripts/多通道/
LS
spim_TL01_Angle1.czi
spim_TL01_Angle2.czi
spim_TL01_Angle3.czi
spim_TL01_Angle4.czi
spim_TL01_Angle5.czi
spim_TL02_Angle1.czi
spim_TL02_Angle2.czi
spim_TL02_Angle3.czi
spim_TL02_Angle4.czi
spim_TL02_Angle5.czi
spim_TL03_Angle1.czi
spim_TL03_Angle2.czi
spim_TL03_Angle3.czi
spim_TL03_Angle4.czi
spim_TL03_Angle5.czi</code></pre></figure>
### Resave .czi files
重新保存还依赖于与单通道数据相同的脚本。指定填充零的正确角度和正确参数:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">###---------- Resaving .czi or ome.tiff as .tif ----------</span>
<span class="c">##use ometiff_resave for ome.tiff and czi_resave for .czi</span>
angle_re <span class="nv">saving</span><span class="o">=</span><span class="s2">"1 2 3 4 5"</span>
<span class="c">##对于填充零 2 = 01; 3 = 001</span>
<span class="nv">pad_resave</span><span class="o">=</span>“2”</code></pre></figure>
通过执行 `create-resaving-jobs` 脚本创建作业并使用 `submit-jobs` 脚本提交作业。
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nb">cd</span> /projects/tomancak_lightsheet/Christopher/Test_scripts/多通道/
LS
spim_TL01_Angle1.czi
spim_TL01_Angle1.tif
spim_TL01_Angle2.czi
spim_TL01_Angle2.tif
spim_TL01_Angle3.czi
spim_TL01_Angle3.tif
spim_TL01_Angle4.czi
spim_TL01_Angle4.tif
spim_TL01_Angle5.czi
spim_TL01_Angle5.tif
spim_TL02_Angle1.czi
spim_TL02_Angle1.tif
spim_TL02_Angle2.czi
spim_TL02_Angle2.tif
spim_TL02_Angle3.czi
spim_TL02_Angle3.tif
spim_TL02_Angle4.czi
spim_TL02_Angle4.tif
spim_TL02_Angle5.czi
spim_TL02_Angle5.tif
spim_TL03_Angle1.czi
spim_TL03_Angle1.tif
spim_TL03_Angle2.czi
spim_TL03_Angle2.tif
spim_TL03_Angle3.czi
spim_TL03_Angle3.tif
spim_TL03_Angle4.czi
spim_TL03_Angle4.tif
spim_TL03_Angle5.czi
spim_TL03_Angle5.tif</code></pre></figure>
### Split channels
然后这些通道被分成单独的文件。该算法将输出具有以下命名模式的文件:
spim_TL{tt}_Angle{a}_Channel0 spim_TL{tt}_Angle{a}_Channel1 etc…
In the **master file** Specify the number of angles and give a name for a new directory within the data directory where you want to save the resulting files. This directory will be created for you:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">###---------- 分割通道(仅适用于多通道数据) ----------</span>
<span class="c">##输出通道为 spim_TL{tt}_Angle{a}_Channel0,spim_TL{tt}_Angle{a}_Channel1 ...</span>
<span class="nv">angles_split</span><span class="o">=</span><span class="s2">"1 2 3 4 5"</span>
<span class="c">##目标目录</span>
<span class="nv">target_split</span><span class="o">=</span><span class="s2">"/channel_split/"</span></code></pre></figure>
`create-split-jobs`脚本:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
源/projects/tomancak_lightsheet/Christopher/pipeline/master
<span class="nv">target_split</span><span class="o">=</span><span class="k">${</span><span class="nv">dir</span><span class="k">}${</span><span class="nv">target_split</span><span class="k">}</span>
<span class="nb">mkdir</span> <span class="nt">-p</span> <span class="k">${</span><span class="nv">jobs_split</span><span class="k">}</span>
<span class="nb">mkdir</span> <span class="nt">-p</span> <span class="k">${</span><span class="nv">target_split</span><span class="k">}</span>
对于我在 <span class="nv">$timepoint</span>
<span class="c">#对于我在1</span>
做
对于 <span class="nv">$angles_split</span> 中的 a
做
<span class="nv">job</span><span class="o">=</span><span class="s2">"</span><span class="nv">$jobs_split</span><span class="s2">/split-</span><span class="nv">$i</span><span class="s2">-</span><span class="nv">$a</span><span class="s2">.job"</span>
<span class="nb">echo</span> <span class="nv">$job</span>
<span class="nb">echo</span> <span class="s2">"#!/bin/bash"</span> <span class="o">></span> <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="nv">$XVFB_RUN</span><span class="s2"> -a </span><span class="nv">$Fiji</span><span class="s2"> -Ddir=</span><span class="nv">$dir</span><span class="s2"> -Dtimepoint=</span><span class="nv">$i</span><span class="s2"> -Dangle=</span><span class="nv">$a</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dpad=</span><span class="nv">$pad_resave</span><span class="s2"> -Dtarget_split=</span><span class="nv">$target_split</span><span class="s2"> -- --no-splash </span><span class="nv">$split</span><span class="s2">"</span> <span class="o">>></span> <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
<span class="nb">chmod </span>a+x <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
<span class="k">done
</span>完成</code></pre></figure>
`split.bsh`脚本:
<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="kn">import</span> <span class="nn">ij.IJ</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">ij.ImagePlus</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">ij.ImageStack</span><span class="o">;</span>
<span class="n">导入java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">Runtime</span><span class="err">;</span>
<span class="n">导入java</span><span class="o">.</span><span class="na">io</span><span class="o">.</span><span class="na">File</span><span class="err">;</span>
<span class="n">导入</span> <span class="n">java</span><span class="o">.</span><span class="na">io</span><span class="o">.</span><span class="na">FilenameFilter</span><span class="o">;</span>
<span class="n">运行时</span> <span class="o">=</span> <span class="nc">Runtime</span><span class="o">.</span><span class="na">getRuntime</span><span class="o">();</span>
<span class="n">dir</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"dir"</span> <span class="o">);</span>
<span class="kt">int</span> <span class="n">timepoint</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"timepoint"</span> <span class="o">)</span> <span class="o">);</span>
<span class="n">角度</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"角度"</span> <span class="o">);</span>
<span class="n">target_split</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"target_split"</span> <span class="o">);</span>
<span class="kt">int</span> <span class="n">pad</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"pad"</span> <span class="o">)</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"timpoint="</span> <span class="o">+</span> <span class="n">时间点</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">角度</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">角度</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"target_split="</span> <span class="o">+</span> <span class="n">target_split</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"pad="</span> <span class="o">+</span> <span class="n">pad</span> <span class="o">);</span>
<span class="c1">//打开图像</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="n">目录</span> <span class="o">);</span>
<span class="n">imp</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">ImagePlus</span><span class="o">(</span> <span class="n">dir</span> <span class="o">+</span> <span class="s">"spim_TL"</span> <span class="o">+</span> <span class="no">IJ</span><span class="o">.</span><span class="na">pad</span><span class="o">(</span> <span class="n">timepoint</span> <span class="o">,</span> <span class="n">pad</span> <span class="o">)</span> <span class="o">+</span> <span class="s">"_Angle"</span> <span class="o">+</span> <span class="n">angle</span> <span class="o">+</span> <span class="s">".tif"</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="n">imp</span><span class="o">.</span><span class="na">getTitle</span><span class="o">()</span> <span class="o">);</span>
<span class="cm">/* split channels */</span>
<span class="n">stack</span> <span class="o">=</span> <span class="n">imp</span><span class="o">.</span><span class="na">getStack</span><span class="o">();</span>
<span class="k">for</span> <span class="o">(</span> <span class="n">c</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">c</span> <span class="o"><</span> <span class="n">imp</span><span class="o">.</span><span class="na">getNChannels</span><span class="o">();</span> <span class="o">++</span><span class="n">c</span> <span class="o">)</span>
<span class="o">{</span>
<span class="n">channelStack</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">ImageStack</span><span class="o">(</span> <span class="n">imp</span><span class="o">.</span><span class="na">getWidth</span><span class="o">(),</span> <span class="n">imp</span><span class="o">.</span><span class="na">getHeight</span><span class="o">()</span> <span class="o">);</span>
<span class="k">for</span> <span class="o">(</span> <span class="n">z</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">z</span> <span class="o"><</span> <span class="n">imp</span><span class="o">.</span><span class="na">getNSlices</span><span class="o">();</span> <span class="o">++</span><span class="n">z</span> <span class="o">)</span>
<span class="n">channelStack</span><span class="o">.</span><span class="na">addSlice</span><span class="o">(</span>
<span class="s">""</span><span class="o">,</span>
<span class="n">stack</span><span class="o">.</span><span class="na">getProcessor</span><span class="o">(</span>
<span class="n">imp</span><span class="o">.</span><span class="na">getStackIndex</span><span class="o">(</span> <span class="n">c</span> <span class="o">+</span> <span class="mi">1</span><span class="o">,</span> <span class="n">z</span> <span class="o">+</span> <span class="mi">1</span><span class="o">,</span> <span class="mi">1</span> <span class="o">)</span> <span class="o">)</span> <span class="o">);</span>
<span class="n">impc</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">ImagePlus</span><span class="o">(</span> <span class="n">imp</span><span class="o">.</span><span class="na">getTitle</span><span class="o">()</span> <span class="o">+</span> <span class="s">" #"</span> <span class="o">+</span> <span class="o">(</span> <span class="n">c</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">),</span> <span class="n">channelStack</span> <span class="o">);</span>
<span class="no">IJ</span><span class="o">.</span><span class="na">save</span><span class="o">(</span> <span class="n">impc</span><span class="o">,</span> <span class="n">target_split</span> <span class="o">+</span> <span class="n">imp</span><span class="o">.</span><span class="na">getTitle</span><span class="o">().</span><span class="na">replaceFirst</span><span class="o">(</span> <span class="s">".tif$"</span><span class="o">,</span> <span class="s">"_Channel"</span> <span class="o">+</span> <span class="o">(</span> <span class="n">c</span> <span class="o">)</span> <span class="o">+</span> <span class="s">".tif"</span> <span class="o">)</span> <span class="o">);</span>
<span class="o">}</span>
<span class="cm">/* shutdown */</span>
<span class="n">runtime</span><span class="o">.</span><span class="na">exit</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span></code></pre></figure>
Submit the jobs using the `submit-jobs` script:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
<span class="k">for </span>file <span class="k">in</span> <span class="sb">`</span><span class="nb">ls</span> <span class="k">${</span><span class="nv">1</span><span class="k">}</span> | <span class="nb">grep</span> <span class="s2">".job$"</span><span class="sb">`</span>
做
bsub <span class="nt">-q</span> short <span class="nt">-n</span> 1 <span class="nt">-R</span> span[hosts<span class="o">=</span>1] <span class="nt">-o</span> <span class="s2">"out.%J"</span> <span class="nt">-e</span> <span class="s2">"err.%J"</span> <span class="k">${</span><span class="nv">1</span><span class="k">}</span>/<span class="nv">$file</span>
完成</code></pre></figure>
The split files will be now saved in a new directory:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nb">cd</span> /projects/tomancak_lightsheet/Christopher/Test_scripts/multi-channel/channel_split
LS
spim_TL01_Angle1_Channel0.tif
spim_TL01_Angle1_Channel1.tif
spim_TL01_Angle2_Channel0.tif
spim_TL01_Angle2_Channel1.tif
spim_TL01_Angle3_Channel0.tif
spim_TL01_Angle3_Channel1.tif
spim_TL01_Angle4_Channel0.tif
spim_TL01_Angle4_Channel1.tif
spim_TL01_Angle5_Channel0.tif
spim_TL01_Angle5_Channel1.tif
spim_TL02_Angle1_Channel0.tif
spim_TL02_Angle1_Channel1.tif
spim_TL02_Angle2_Channel0.tif
spim_TL02_Angle2_Channel1.tif
spim_TL02_Angle3_Channel0.tif
spim_TL02_Angle3_Channel1.tif
spim_TL02_Angle4_Channel0.tif
spim_TL02_Angle4_Channel1.tif
spim_TL02_Angle5_Channel0.tif
spim_TL02_Angle5_Channel1.tif
spim_TL03_Angle1_Channel0.tif
spim_TL03_Angle1_Channel1.tif
spim_TL03_Angle2_Channel0.tif
spim_TL03_Angle2_Channel1.tif
spim_TL03_Angle3_Channel0.tif
spim_TL03_Angle3_Channel1.tif
spim_TL03_Angle4_Channel0.tif
spim_TL03_Angle4_Channel1.tif
spim_TL03_Angle5_Channel0.tif
spim_TL03_Angle5_Channel1.tif</code></pre></figure>
We will proceed to work with the files were the channels are split. Since the data directory in these files is now different we need to use a different directory in the master file. From then on, all the output will be saved into this directory:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">####--------------------------------- General Parameters ---------------------------------</span>
<span class="c">###Data directory</span>
<span class="c">#dir="/projects/tomancak_lightsheet/Christopher/Test_scripts/single-channel/"</span>
<span class="nb">dir</span><span class="o">=</span><span class="s2">"/projects/tomancak_lightsheet/Christopher/Test_scripts/single-channel/channel-split"</span></code></pre></figure>
### 多视图注册
In the example dataset the beads were only visible in Channel1. We will perform a single-channel bead registration only on this channel. We therefore need to specify the spim data pattern accordingly:
channel_pattern_beads=”spim_TL{tt}_Angle{a}_Channel1.tif”
Change the detection parameters for the chosen detection method.
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">###---------- Multi-view registration (Difference of mean or Difference of Gaussian) ----------</span>
<span class="c">##Specify the Pattern for Detection of the beads single channel: spim_TL{t}_Angle{a}.tif</span>
<span class="c">##multi-channel: spim_TL{t}_Angle{a}_Channel1.tif were 1 is the Channel that contains the beads</span>
<span class="c">#channel_pattern_beads="spim_TL{tt}_Angle{a}.tif"</span>
<span class="nv">channel_pattern_beads</span><span class="o">=</span><span class="s2">"spim_TL{tt}_Angle{a}_Channel1.tif"</span>
<span class="c">##Difference of mean (Comment out Difference of Gaussian parts in registration.bsh script)</span>
<span class="nv">type_of_detection</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">Difference-of-Mean (Integral image based)</span><span class="se">\"</span><span class="s2">"</span>
半径1<span class="o">=</span>“2”
半径2<span class="o">=</span>“3”
阈值<span class="o">=</span>“0.009”
<span class="c">##Difference of Gaussian (Comment out Differnce of Mean parts in registration.bsh script)</span>
<span class="c">#type_of_detection="\"Difference-of-Gaussian\""</span>
<span class="c">#initial_sigma="1.8000"</span>
<span class="c">#threshold_gaussian="0.0080"</span></code></pre></figure>
Execute the `create-registration-jobs` script to create the jobs for registration and send them to the cluster by executing the `submit-jobs` script.
### 延时拍摄注册
The time-lapse registration uses the already defined multi-view registration. Specify the timepoints you want to use for timelapse registration.
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">###---------- Timelapse registration ----------</span>
<span class="nv">timelapse_timepoint</span><span class="o">=</span><span class="s2">"1-3"</span></code></pre></figure>
Create the register-timelapse.job by executing the `create-timelapse-jobs` and then submit them to the cluster.
### Dublicate registration files
For further processing we need registration files for both channels. Therefore we dublicate the existing registration files and rename them to the missing channel. We advise to make a backup of the registration files at this point.
In the master file specify which channel was registered (`channel_source`) and which channel still needs registration files (`channel_target`).
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">###---------- Dublicate Registration files (Only for multi-channel data) ----------</span>
<span class="c">#Channel that contain the beads</span>
<span class="nv">channel_source</span><span class="o">=</span><span class="s2">"1"</span>
<span class="nv">channel_target</span><span class="o">=</span><span class="s2">"0"</span></code></pre></figure>
For dublicating the registration files just execute the `dublicate_rename_registration.sh` script.
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
源/projects/tomancak_lightsheet/Christopher/pipeline/master
<span class="nv">reftp</span><span class="o">=</span><span class="k">${</span><span class="nv">referencetp</span><span class="k">}</span>
<span class="nv">ref</span><span class="o">=</span>registration.to_<span class="s2">"</span><span class="k">${</span><span class="nv">reftp</span><span class="k">}</span><span class="s2">"</span>
<span class="c">#echo "${ref}"</span>
<span class="nv">channel_source</span><span class="o">=</span><span class="k">${</span><span class="nv">channel_source</span><span class="k">}</span>
<span class="nv">channel_target</span><span class="o">=</span><span class="k">${</span><span class="nv">channel_target</span><span class="k">}</span>
对于我在 <span class="nv">$timepoint</span>
做
<span class="nv">i</span><span class="o">=</span><span class="sb">`</span><span class="nb">printf</span> <span class="s2">"%0</span><span class="k">${</span><span class="nv">pad_resave</span><span class="k">}</span><span class="s2">d"</span> <span class="s2">"</span><span class="nv">$i</span><span class="s2">"</span><span class="sb">`</span>
<span class="k">for </span>a <span class="k">in</span> <span class="nv">$angles_split</span>
<span class="k">do
for </span>end <span class="k">in</span> <span class="s2">"beads.txt"</span> <span class="s2">"dim"</span> <span class="s2">"registration"</span> <span class="s2">"</span><span class="nv">$ref</span><span class="s2">"</span>
<span class="k">do</span>
<span class="c">#echo $dir/registration/spim_TL"$i"_Angle"$a"_Channel"${channel_source}".tif."$end" $dir/registration/spim_TL"$i"_Angle"$a"_Channel"${channel_target}".tif."$end"</span>
<span class="nb">cp</span> <span class="nv">$dir</span>/registration/spim_TL<span class="s2">"</span><span class="nv">$i</span><span class="s2">"</span>_Angle<span class="s2">"</span><span class="nv">$a</span><span class="s2">"</span>_Channel1.tif.<span class="s2">"</span><span class="nv">$end</span><span class="s2">"</span> <span class="nv">$dir</span>/registration/spim_TL<span class="s2">"</span><span class="nv">$i</span><span class="s2">"</span>_Angle<span class="s2">"</span><span class="nv">$a</span><span class="s2">"</span>_Channel0.tif.<span class="s2">"</span><span class="nv">$end</span><span class="s2">"</span>
<span class="k">done
</span>完成
完成
<span class="nb">echo </span>Dublication <span class="nb">complete</span><span class="o">!</span>祝你今天过得愉快!
出口0
<span class="nb">chmod </span>a+x dublicate_rename_registration.sh
./dublicate_rename_registration.sh</code></pre></figure>
### Content based multi-view fusion
对于基于内容的多视图融合,请使用`select_channel="Multi-channel"`。相应地指定配准、下采样和裁剪:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">###---------- 基于多视图内容融合----------</span>
<span class="c">##单通道或多通道融合之间的变化</span>
<span class="c">##如果是单通道则注释掉 fusion.bsh 脚本中的第二个 fusion 命令</span>
<span class="c">#select_channel="Single-channel"</span>
<span class="nv">select_channel</span><span class="o">=</span><span class="s2">"Multi-channel"</span>
<span class="c">##使用延时注册或个人注册</span>
<span class="c">##对于延时注册指定参考时间点:</span>
<span class="nv">Registration_fusion</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">通道0的时间点注册(reference=1)</span><span class="se">\"</span><span class="s2">"</span>
<span class="c">##Individual registration:</span>
<span class="c">#"\"Individual registration of channel 0\""</span>
<span class="nv">downsample_output</span><span class="o">=</span><span class="s2">"2"</span>
<span class="c">##Cropping parameters of full resolution</span>
<span class="nv">x</span><span class="o">=</span>“0”
<span class="nv">y</span><span class="o">=</span><span class="s2">"314"</span>
<span class="nv">z</span><span class="o">=</span>“320”
<span class="nv">w</span><span class="o">=</span><span class="s2">"1858"</span>
<span class="nv">h</span><span class="o">=</span><span class="s2">"758"</span>
<span class="nv">d</span><span class="o">=</span>“740”</code></pre></figure>
在第 `fusion.bsh` 脚本注释中附加注册第 `"registration=[" + registration_fusion + "]" + " " +` 行(第 46 行)。
<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="n">导入</span> <span class="n">ij</span><span class="o">.</span><span class="na">IJ</span><span class="o">;</span>
<span class="n">导入java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">Runtime</span><span class="err">;</span>
<span class="n">运行时</span> <span class="o">=</span> <span class="nc">Runtime</span><span class="o">.</span><span class="na">getRuntime</span><span class="o">();</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">runtime</span><span class="o">.</span><span class="na">availableProcessors</span><span class="o">()</span> <span class="o">+</span> <span class="s">" 可用于多线程的核心"</span><span class="o">);</span>
<span class="n">select_channel</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span><span class="err">“</span><span class="n">select_channel</span><span class="err">”</span><span class="o">);</span>
<span class="n">dir</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"dir"</span> <span class="o">);</span>
<span class="n">pattern_of_spim</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"pattern_of_spim"</span> <span class="o">);</span>
<span class="n">timepoint</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"timepoint"</span> <span class="o">);</span>
<span class="n">angles</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"angles"</span> <span class="o">);</span>
<span class="n">fusion_method</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"fusion_method"</span> <span class="o">);</span>
<span class="n">process_views_in_parallell</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"process_views_in_parallell"</span> <span class="o">);</span>
<span class="n">blending</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"blending"</span> <span class="o">);</span>
<span class="n">weights</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"weights"</span> <span class="o">);</span>
<span class="n">downsample_output</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"downsample_output"</span> <span class="o">)</span> <span class="o">);</span>
<span class="n">Registration_fusion</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span><span class="err">“</span><span class="n">registration_fusion</span><span class="err">”</span><span class="o">);</span>
<span class="n">x</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"x"</span> <span class="o">);</span>
<span class="n">y</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"y"</span> <span class="o">);</span>
<span class="n">z</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"z"</span> <span class="o">);</span>
<span class="n">w</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"w"</span> <span class="o">);</span>
<span class="n">h</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"h"</span> <span class="o">);</span>
<span class="n">d</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"d"</span> <span class="o">);</span>
<span class="n">fused_image_output</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span><span class="err">“</span><span class="n">fused_image_output</span><span class="err">”</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"Channel="</span> <span class="o">+</span> <span class="n">select_channel</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">注册</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">registration_fusion</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"dir="</span> <span class="o">+</span> <span class="n">dir</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="nc">Pattern</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">pattern_of_spim</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"timepoint="</span> <span class="o">+</span> <span class="n">timepoint</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">角度</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">角度</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"fusion_method="</span> <span class="o">+</span> <span class="n">fusion_method</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"process_views_in_parallell="</span> <span class="o">+</span> <span class="n">process_views_in_parallell</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="n">blending</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="n">weights</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"Downsample="</span> <span class="o">+</span> <span class="n">downsample_output</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"裁剪="</span> <span class="o">+</span> <span class="n">x</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span> <span class="n">y</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span> <span class="n">z</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span> <span class="n">w</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span> <span class="n">h</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span> <span class="n">d</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"fused_image_output="</span> <span class="o">+</span> <span class="n">fused_image_output</span> <span class="o">);</span>
<span class="no">IJ</span><span class="o">.</span><span class="na">run</span><span class="o">(</span><span class="s">"多视图融合"</span><span class="o">,</span> <span class="s">"select_channel="</span> <span class="o">+</span> <span class="n">select_channel</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"registration=["</span> <span class="o">+</span> <span class="n">registration_fusion</span> <span class="o">+</span> <span class="s">"]"</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"registration=["</span> <span class="o">+</span> <span class="n">registration_fusion</span> <span class="o">+</span> <span class="s">"]"</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span> <span class="c1">//Comment out for Single-Channel fusion</span>
<span class="s">"spim_data_directory="</span> <span class="o">+</span> <span class="n">dir</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"pattern_of_spim="</span> <span class="o">+</span> <span class="n">pattern_of_spim</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"timepoints_to_process="</span> <span class="o">+</span> <span class="n">timepoint</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"angles="</span> <span class="o">+</span> <span class="n">angles</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"fusion_method=["</span> <span class="o">+</span> <span class="n">fusion_method</span> <span class="o">+</span> <span class="s">"]"</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"process_views_in_paralell="</span> <span class="o">+</span> <span class="n">process_views_in_paralell</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">" + blending + "</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">" + weights + "</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"downsample_output="</span> <span class="o">+</span> <span class="n">downsample_output</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"crop_output_image_offset_x="</span> <span class="o">+</span> <span class="n">x</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"crop_output_image_offset_y="</span> <span class="o">+</span> <span class="n">y</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"crop_output_image_offset_z="</span> <span class="o">+</span> <span class="n">z</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"crop_output_image_size_x="</span> <span class="o">+</span> <span class="n">w</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"crop_output_image_size_y="</span> <span class="o">+</span> <span class="n">h</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"crop_output_image_size_z="</span> <span class="o">+</span> <span class="n">d</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"fused_image_output=["</span> <span class="o">+</span> <span class="n">fused_image_output</span> <span class="o">+</span> <span class="s">"]"</span><span class="o">);</span>
<span class="cm">/* shutdown */</span>
<span class="n">runtime</span><span class="o">.</span><span class="na">exit</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span></code></pre></figure>
Create the fusion jobs by executing the `create_fusion_jobs` and submit them to the cluster.
### 2 个通道的 3D 渲染
主文件中的相关部分:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">###---------- 渲染 ----------</span>
<span class="c">##Two different sets of scripts, one for single channel and one for multi-channel; choose:</span>
<span class="c">##Working directory</span>
<span class="nv">jobs_rendering</span><span class="o">=</span><span class="s2">"/projects/pilot_spim/Christopher/pipeline/jobs_master_beta_2.0/3d_rendering_cpu"</span>
<span class="c">##Working script</span>
<span class="c">#rendering="/projects/pilot_spim/Christopher/pipeline/jobs_master_beta_2.0/3d_rendering_cpu/single-render-mov.bsh"</span>
<span class="nv">rendering</span><span class="o">=</span><span class="s2">"/projects/pilot_spim/Christopher/pipeline/jobs_master_beta_2.0/3d_rendering_cpu/multi-render-mov.bsh"</span>
<span class="c">##来源</span>
<span class="nv">source_rendering</span><span class="o">=</span><span class="s2">"/output_fusion"</span>
<span class="c">##target directory</span>
<span class="nv">target_rendering</span><span class="o">=</span><span class="s2">"/渲染"</span>
<span class="nv">nframes</span><span class="o">=</span><span class="s2">"6"</span>
<span class="c">##单通道最小最大</span>
<span class="c">#minimum_rendering="0.6"</span>
<span class="c">#maximum_rendering="0.005"</span>
<span class="c">##Min Max multi channel</span>
最小通道0<span class="o">=</span>0.9
最大通道0<span class="o">=</span>0.01
<span class="nv">min_ch1</span><span class="o">=</span>0.9
最大通道1<span class="o">=</span>0.01
<span class="c">##对于多通道渲染:</span>
zSlices <span class="o">=</span>“369”
<span class="c">##方向或旋转</span>
<span class="c">#仍然需要直接放入脚本中</span>
<span class="c">#建设中</span></code></pre></figure>
首先指定作业的目录。 The 2 channel rendering uses the `multi-render-mov.bsh` script, you need to select this script for rendering. Specify which output you want to process and where you want to save the results of the rendering within in the original directory. Finally give the number of frames, the min and max values and the number of slices of the output.
`create-render-jobs`脚本:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
<span class="nb">source</span> /projects/pilot_spim/Christopher/pipeline/master
<span class="nv">source_rendering</span><span class="o">=</span><span class="k">${</span><span class="nv">dir</span><span class="k">}${</span><span class="nv">source_rendering</span><span class="k">}</span>
<span class="nv">target_rendering</span><span class="o">=</span><span class="k">${</span><span class="nv">dir</span><span class="k">}${</span><span class="nv">target_rendering</span><span class="k">}</span>
<span class="nb">mkdir</span> <span class="nt">-p</span> <span class="nv">$jobs_rendering</span>
<span class="nb">mkdir</span> <span class="nt">-p</span> <span class="nv">$target_rendering</span>
对于我在 <span class="nv">$timepoint</span>
做
<span class="nv">job</span><span class="o">=</span><span class="s2">"</span><span class="nv">$jobs_rendering</span><span class="s2">/render-</span><span class="nv">$i</span><span class="s2">.job"</span>
<span class="nb">echo</span> <span class="nv">$job</span>
<span class="nb">echo</span> <span class="s2">"#!/bin/bash"</span> <span class="o">></span> <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="nv">$XVFB_RUN</span><span class="s2"> -as</span><span class="se">\"</span><span class="s2">-screen 0 1280x1024x24</span><span class="se">\"</span><span class="s2"> </span><span class="se">\</span><span class="s2">
</span><span class="nv">$Fiji_rendering</span><span class="s2"> -Xms20g -Xmx20g -Ddir=</span><span class="nv">$source_rendering</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dtimepoint=</span><span class="nv">$i</span><span class="s2"> -Dnframes=</span><span class="nv">$nframes</span><span class="s2"> -Dtarget_rendering=</span><span class="nv">$target_rendering</span><span class="se">\</span><span class="s2">
-Dminimum_rendering=</span><span class="nv">$minimum_rendering</span><span class="s2"> -Dmaximum_rendering=</span><span class="nv">$maximum_rendering</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dmin_ch0=</span><span class="nv">$min_ch0</span><span class="s2"> -Dmax_ch0=</span><span class="nv">$max_ch0</span><span class="s2"> -Dmin_ch1=</span><span class="nv">$min_ch1</span><span class="s2"> -Dmax_ch1=</span><span class="nv">$max_ch1</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-DzSlices=</span><span class="nv">$zSlices</span><span class="s2"> -- --no-splash </span><span class="nv">$rendering</span><span class="s2">"</span> <span class="o">>></span> <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
<span class="nb">chmod </span>a+x <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
完成</code></pre></figure>
The jobs will use the `multi-render-mov.bsh` script for rendering. The postion can be set by changing the transformation matrix (line 141-143). For rotation comment in Line 147-149.
<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="cm">/*
* 两个通道复合形成两个独立的文件
*/</span>
<span class="n">导入java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">Runtime</span><span class="err">;</span>
<span class="kn">import</span> <span class="nn">ij.CompositeImage</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">ij.ImagePlus</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">ij.ImageStack</span><span class="o">;</span>
<span class="n">导入</span> <span class="n">ij</span><span class="o">.</span><span class="na">process</span><span class="o">.</span><span class="na">ImageProcessor</span><span class="o">;</span>
<span class="n">导入</span> <span class="n">ij</span><span class="o">.</span><span class="na">IJ</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">ij.measure.Calibration</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">mpicbg.ij.stack.InverseTransformMapping</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">mpicbg.models.TranslationModel3D</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">mpicbg.models.AffineModel3D</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">mpicbg.models.InverseCoordinateTransformList</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">ij.process.ImageStatistics</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">ij.process.StackStatistics</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">ij.plugin.filter.GaussianBlur</span><span class="o">;</span>
<span class="n">导入</span> <span class="n">net</span><span class="o">.</span><span class="na">imglib2</span><span class="o">.</span><span class="na">type</span><span class="o">.</span><span class="na">numeric</span><span class="o">.</span><span class="na">ARGBDoubleType</span><span class="o">;</span>
<span class="n">导入</span> <span class="n">net</span><span class="o">.</span><span class="na">imglib2</span><span class="o">.</span><span class="na">type</span><span class="o">.</span><span class="na">numeric</span><span class="o">.</span><span class="na">ARGBType</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">net.imglib2.type.numeric.AbstractARGBDoubleType</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">net.imglib2.type.numeric.NativeARGBDoubleType</span><span class="o">;</span>
<span class="n">运行时</span> <span class="o">=</span> <span class="nc">Runtime</span><span class="o">.</span><span class="na">getRuntime</span><span class="o">();</span>
<span class="cm">/* 从命令行读取参数 */</span>
<span class="n">dir2</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"target_rendering"</span> <span class="o">);</span>
<span class="n">dir</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"dir"</span> <span class="o">);</span>
<span class="kt">int</span> <span class="n">timepoint</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"timepoint"</span> <span class="o">)</span> <span class="o">);</span>
<span class="kt">int</span> <span class="n">nFrames</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"nframes"</span> <span class="o">)</span> <span class="o">);</span>
<span class="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"zSlices"</span> <span class="o">)</span> <span class="o">);</span>
<span class="kt">float</span> <span class="n">min_ch0</span> <span class="o">=</span> <span class="nc">Float</span><span class="o">.</span><span class="na">parseFloat</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"min_ch0"</span> <span class="o">)</span> <span class="o">);</span>
<span class="kt">float</span> <span class="n">max_ch0</span> <span class="o">=</span> <span class="nc">Float</span><span class="o">.</span><span class="na">parseFloat</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"max_ch0"</span> <span class="o">)</span> <span class="o">);</span>
<span class="kt">float</span> <span class="n">min_ch1</span> <span class="o">=</span> <span class="nc">Float</span><span class="o">.</span><span class="na">parseFloat</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"min_ch1"</span> <span class="o">)</span> <span class="o">);</span>
<span class="kt">float</span> <span class="n">max_ch1</span> <span class="o">=</span> <span class="nc">Float</span><span class="o">.</span><span class="na">parseFloat</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"max_ch1"</span> <span class="o">)</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"开幕"</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">dir</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">dir2</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">时间点</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">nFrames</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">n</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"MinMax channel0 ="</span> <span class="o">+</span> <span class="n">min_ch0</span> <span class="o">+</span> <span class="s">";"</span> <span class="o">+</span> <span class="n">max_ch0</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"MinMax channel1 ="</span> <span class="o">+</span> <span class="n">min_ch1</span> <span class="o">+</span> <span class="s">";"</span> <span class="o">+</span> <span class="n">max_ch1</span> <span class="o">);</span>
<span class="c1">// Open channel 0</span>
<span class="no">IJ</span><span class="o">.</span><span class="na">run</span><span class="o">(</span><span class="s">"Image Sequence..."</span><span class="o">,</span> <span class="s">"open="</span> <span class="o">+</span> <span class="n">dir</span> <span class="o">+</span> <span class="s">"/"</span> <span class="o">+</span> <span class="n">timepoint</span> <span class="o">+</span> <span class="s">"/img_tl"</span> <span class="o">+</span> <span class="n">timepoint</span> <span class="o">+</span> <span class="s">"_ch0_z000.tif number="</span> <span class="o">+</span> <span class="n">n</span> <span class="o">+</span> <span class="s">" starting=1 increment=1 scale=100 file=ch0 sort"</span><span class="o">);</span>
<span class="n">imp1</span> <span class="o">=</span> <span class="no">IJ</span><span class="o">.</span><span class="na">getImage</span><span class="o">();</span>
<span class="c1">// Open channel 1</span>
<span class="no">IJ</span><span class="o">.</span><span class="na">run</span><span class="o">(</span><span class="s">"Image Sequence..."</span><span class="o">,</span> <span class="s">"open="</span> <span class="o">+</span> <span class="n">dir</span> <span class="o">+</span> <span class="s">"/"</span> <span class="o">+</span> <span class="n">timepoint</span> <span class="o">+</span> <span class="s">"/img_tl"</span> <span class="o">+</span> <span class="n">timepoint</span> <span class="o">+</span> <span class="s">"_ch1_z000.tif number="</span> <span class="o">+</span> <span class="n">n</span> <span class="o">+</span> <span class="s">" starting=1 increment=1 scale=100 file=ch1 sort"</span><span class="o">);</span>
<span class="n">imp2</span> <span class="o">=</span> <span class="no">IJ</span><span class="o">.</span><span class="na">getImage</span><span class="o">();</span>
<span class="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="n">imp1</span><span class="o">.</span><span class="na">getNSlices</span><span class="o">();</span>
<span class="cm">/*
* 使用堆栈直方图获取最小值和最大值。
* @param sat_lov
* 允许有多少像素低于最小值。
* @param sat_high
* how many pixels are allowed to be above max.
* @param stats
* 堆栈直方图。
* @return double[2] {最小值,最大值}
*/</span>
<span class="kt">double</span><span class="o">[]</span> <span class="nf">getMinAndMax</span><span class="o">(</span> <span class="kt">double</span> <span class="n">sat_low</span><span class="o">,</span> <span class="kt">double</span> <span class="n">sat_high</span><span class="o">,</span> <span class="nc">ImageStatistics</span> <span class="n">stats</span> <span class="o">)</span> <span class="o">{</span>
<span class="kt">int</span> <span class="n">hmin</span><span class="o">,</span> <span class="n">hmax</span><span class="o">;</span>
<span class="kt">int</span><span class="o">[]</span> <span class="n">histogram</span> <span class="o">=</span> <span class="n">stats</span><span class="o">.</span><span class="na">histogram</span><span class="o">;</span>
<span class="kt">int</span> <span class="n">hsize</span> <span class="o">=</span> <span class="n">histogram</span><span class="o">.</span><span class="na">length</span><span class="o">;</span>
<span class="kt">int</span> <span class="n">t_low</span> <span class="o">=</span> <span class="o">(</span><span class="kt">int</span><span class="o">)(</span><span class="n">stats</span><span class="o">.</span><span class="na">pixelCount</span><span class="o">*</span><span class="n">sat_low</span><span class="o">);</span>
<span class="kt">int</span> <span class="n">t_high</span> <span class="o">=</span> <span class="o">(</span><span class="kt">int</span><span class="o">)(</span><span class="n">stats</span><span class="o">.</span><span class="na">pixelCount</span><span class="o">*</span><span class="n">sat_high</span><span class="o">);</span>
<span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="o">;</span>
<span class="kt">boolean</span> <span class="n">found</span> <span class="o">=</span> <span class="kc">false</span><span class="o">;</span>
<span class="kt">int</span> <span class="n">count</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
<span class="kt">int</span> <span class="n">maxindex</span> <span class="o">=</span> <span class="n">hsize</span><span class="o">-</span><span class="mi">1</span><span class="o">;</span>
<span class="k">do</span> <span class="o">{</span>
<span class="n">i</span><span class="o">++;</span>
<span class="n">count</span> <span class="o">+=</span> <span class="n">histogram</span><span class="o">[</span><span class="n">i</span><span class="o">];</span>
<span class="n">found</span> <span class="o">=</span> <span class="n">count</span><span class="o">></span><span class="n">t_low</span><span class="o">;</span>
<span class="o">}</span> <span class="k">while</span> <span class="o">(!</span><span class="n">found</span> <span class="o">&&</span> <span class="n">i</span><span class="o"><</span><span class="n">maxindex</span><span class="o">);</span>
<span class="n">hmin</span> <span class="o">=</span> <span class="n">i</span><span class="o">;</span>
<span class="n">i</span> <span class="o">=</span> <span class="n">hsize</span><span class="o">;</span>
<span class="n">count</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
<span class="k">do</span> <span class="o">{</span>
<span class="n">i</span><span class="o">--;</span>
<span class="n">count</span> <span class="o">+=</span> <span class="n">histogram</span><span class="o">[</span><span class="n">i</span><span class="o">];</span>
<span class="n">found</span> <span class="o">=</span> <span class="n">count</span><span class="o">></span><span class="n">t_high</span><span class="o">;</span>
<span class="o">}</span> <span class="k">while</span> <span class="o">(!</span><span class="n">found</span> <span class="o">&&</span> <span class="n">i</span><span class="o">></span><span class="mi">0</span><span class="o">);</span>
<span class="n">hmax</span> <span class="o">=</span> <span class="n">i</span><span class="o">;</span>
<span class="kt">double</span> <span class="n">scale</span> <span class="o">=</span> <span class="o">(</span><span class="kt">double</span><span class="o">)</span><span class="n">hsize</span> <span class="o">/</span> <span class="o">(</span><span class="n">stats</span><span class="o">.</span><span class="na">histMax</span> <span class="o">-</span> <span class="n">stats</span><span class="o">.</span><span class="na">histMin</span><span class="o">);</span>
<span class="kt">double</span><span class="o">[]</span> <span class="n">a</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">double</span><span class="o">[</span><span class="mi">2</span><span class="o">];</span>
<span class="n">a</span><span class="o">[</span><span class="mi">0</span><span class="o">]=</span> <span class="o">(</span><span class="kt">double</span><span class="o">)</span><span class="n">hmin</span> <span class="o">/</span> <span class="n">scale</span> <span class="o">+</span> <span class="n">stats</span><span class="o">.</span><span class="na">histMin</span><span class="o">;</span>
<span class="n">a</span><span class="o">[</span><span class="mi">1</span><span class="o">]=</span> <span class="o">((</span><span class="kt">double</span><span class="o">)</span><span class="n">hmax</span> <span class="o">+</span> <span class="mf">1.0</span><span class="o">)</span> <span class="o">/</span> <span class="n">scale</span> <span class="o">+</span> <span class="n">stats</span><span class="o">.</span><span class="na">histMin</span><span class="o">;</span>
<span class="k">return</span> <span class="n">a</span><span class="o">;</span>
<span class="o">}</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Analyzing histogram"</span><span class="o">);</span>
<span class="cm">/*
* 计算最大值、最小值
*/</span>
<span class="n">stats</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">StackStatistics</span><span class="o">(</span> <span class="n">imp1</span><span class="o">,</span> <span class="mi">10000</span><span class="o">,</span> <span class="mf">0.0</span><span class="o">,</span> <span class="mf">0.0</span> <span class="o">);</span>
<span class="kt">double</span><span class="o">[]</span> <span class="n">minmax1</span> <span class="o">=</span> <span class="n">getMinAndMax</span><span class="o">(</span> <span class="n">min_ch0</span><span class="o">,</span> <span class="n">max_ch0</span><span class="o">,</span> <span class="n">stats</span> <span class="o">);</span>
<span class="no">IJ</span><span class="o">.</span><span class="na">setMinAndMax</span><span class="o">(</span> <span class="n">imp1</span><span class="o">,</span> <span class="n">minmax1</span><span class="o">[</span><span class="mi">0</span><span class="o">],</span> <span class="n">minmax1</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span> <span class="o">);</span>
<span class="n">stats</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">StackStatistics</span><span class="o">(</span> <span class="n">imp2</span><span class="o">,</span> <span class="mi">10000</span><span class="o">,</span> <span class="mf">0.0</span><span class="o">,</span> <span class="mf">0.0</span> <span class="o">);</span>
<span class="kt">double</span><span class="o">[]</span> <span class="n">minmax2</span> <span class="o">=</span> <span class="n">getMinAndMax</span><span class="o">(</span> <span class="n">min_ch1</span><span class="o">,</span> <span class="n">max_ch1</span><span class="o">,</span> <span class="n">stats</span> <span class="o">);</span>
<span class="no">IJ</span><span class="o">.</span><span class="na">setMinAndMax</span><span class="o">(</span> <span class="n">imp2</span><span class="o">,</span> <span class="n">minmax2</span><span class="o">[</span><span class="mi">0</span><span class="o">],</span> <span class="n">minmax2</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span> <span class="o">);</span>
<span class="n">stack</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">ImageStack</span><span class="o">(</span> <span class="n">imp1</span><span class="o">.</span><span class="na">getWidth</span><span class="o">(),</span> <span class="n">imp1</span><span class="o">.</span><span class="na">getHeight</span><span class="o">()</span> <span class="o">);</span>
<span class="k">for</span> <span class="o">(</span> <span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o"><</span> <span class="n">n</span><span class="o">;</span> <span class="o">++</span><span class="n">i</span> <span class="o">)</span> <span class="o">{</span>
<span class="n">stack</span><span class="o">.</span><span class="na">addSlice</span><span class="o">(</span> <span class="s">""</span><span class="o">,</span> <span class="n">imp1</span><span class="o">.</span><span class="na">getStack</span><span class="o">().</span><span class="na">getProcessor</span><span class="o">(</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">).</span><span class="na">duplicate</span><span class="o">()</span> <span class="o">);</span>
<span class="n">stack</span><span class="o">.</span><span class="na">addSlice</span><span class="o">(</span> <span class="s">""</span><span class="o">,</span> <span class="n">imp2</span><span class="o">.</span><span class="na">getStack</span><span class="o">().</span><span class="na">getProcessor</span><span class="o">(</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">).</span><span class="na">duplicate</span><span class="o">()</span> <span class="o">);</span>
<span class="o">}</span>
<span class="n">imp</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">ImagePlus</span><span class="o">(</span><span class="s">""</span><span class="o">,</span> <span class="n">堆栈</span><span class="o">);</span>
<span class="n">imp</span><span class="o">.</span><span class="na">setDimensions</span><span class="o">(</span><span class="mi">2</span><span class="o">,</span> <span class="n">n</span><span class="o">,</span> <span class="mi">1</span><span class="o">);</span>
<span class="n">imp</span><span class="o">.</span><span class="na">setOpenAsHyperStack</span><span class="o">(</span><span class="kc">true</span><span class="o">);</span>
<span class="n">imp</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">CompositeImage</span><span class="o">(</span><span class="n">imp</span><span class="o">,</span><span class="nc">CompositeImage</span><span class="o">.</span><span class="na">COMPOSITE</span><span class="o">);</span>
<span class="n">imp</span><span class="o">.</span><span class="na">show</span><span class="o">();</span>
<span class="n">imp1</span><span class="o">.</span><span class="na">changes</span> <span class="o">=</span> <span class="kc">false</span><span class="err">;</span>
<span class="n">imp2</span><span class="o">.</span><span class="na">changes</span> <span class="o">=</span> <span class="kc">false</span><span class="o">;</span>
<span class="n">imp1</span><span class="o">.</span><span class="na">close</span><span class="o">();</span>
<span class="n">imp2</span><span class="o">.</span><span class="na">close</span><span class="o">();</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"转换"</span><span class="o">);</span>
<span class="cm">/* 变换 */</span>
<span class="n">仿射</span> <span class="o">=</span> <span class="k">new</span> <span class="n">net</span><span class="o">.</span><span class="na">imglib2</span><span class="o">.</span><span class="na">realtransform</span><span class="o">.</span><span class="na">AffineTransform3D</span><span class="o">();</span>
<span class="cm">/* 恒定方向 */</span>
<span class="n">方向</span> <span class="o">=</span> <span class="k">new</span> <span class="n">net</span><span class="o">.</span><span class="na">imglib2</span><span class="o">.</span><span class="na">realtransform</span><span class="o">.</span><span class="na">AffineTransform3D</span><span class="o">();</span>
<span class="n">方向</span><span class="o">.</span><span class="na">设置</span><span class="o">(</span>
<span class="mf">0.9902683</span><span class="o">,</span> <span class="o">-</span><span class="mf">0.09312532</span><span class="o">,</span> <span class="mf">0.10342625</span><span class="o">,</span> <span class="mf">0.0</span><span class="o">,</span>
<span class="o">-</span><span class="mf">0.13917312</span><span class="o">,</span> <span class="o">-</span><span class="mf">0.66262114</span><span class="o">,</span> <span class="mf">0.735916</span><span class="o">,</span> <span class="mf">0.0</span><span class="o">,</span>
<span class="mf">0.0</span><span class="o">,</span> <span class="o">-</span><span class="mf">0.74314815</span><span class="o">,</span> <span class="o">-</span><span class="mf">0.669133</span><span class="o">,</span> <span class="mf">0.0</span><span class="o">);</span>
<span class="n">affine</span><span class="o">.</span><span class="na">preConcatenate</span><span class="o">(</span> <span class="n">方向</span> <span class="o">);</span>
<span class="cm">/* rotation */</span>
<span class="c1">//theta = ( double )时间点 / 180.0 * Math.PI;</span>
<span class="c1">//仿射.旋转( 0, θ );</span>
<span class="cm">/* color conversion */</span>
<span class="cm">/*背景*/</span>
<span class="n">bgARGB</span> <span class="o">=</span> <span class="n">新</span> <span class="nc">ARGBDoubleType</span><span class="o">(</span> <span class="mi">1</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="mi">0</span> <span class="o">);</span>
<span class="cm">/* 强度抵消预处理 */</span>
<span class="cm">/* gfp */</span>
<span class="k">for</span> <span class="o">(</span> <span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o"><</span> <span class="n">n</span><span class="o">;</span> <span class="o">++</span><span class="n">i</span> <span class="o">)</span> <span class="o">{</span>
<span class="n">ip</span> <span class="o">=</span> <span class="n">imp</span><span class="o">.</span><span class="na">getStack</span><span class="o">().</span><span class="na">getProcessor</span><span class="o">(</span><span class="n">imp</span><span class="o">.</span><span class="na">getStackIndex</span><span class="o">(</span><span class="mi">1</span><span class="o">,</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="o">,</span><span class="mi">1</span><span class="o">));</span>
<span class="n">ip</span><span class="o">.</span><span class="na">subtract</span><span class="o">(</span><span class="n">minmax1</span><span class="o">[</span><span class="mi">0</span><span class="o">]);</span>
<span class="n">ip</span><span class="o">.</span><span class="na">multiply</span><span class="o">(</span><span class="mf">1.0</span> <span class="o">/</span> <span class="o">(</span><span class="n">minmax1</span><span class="o">[</span><span class="mi">1</span><span class="o">]-</span><span class="n">minmax1</span><span class="o">[</span><span class="mi">0</span><span class="o">]));</span>
<span class="o">}</span>
<span class="cm">/* ruby */</span>
<span class="n">偏移量</span> <span class="o">=</span> <span class="o">(</span> <span class="n">minmax2</span><span class="o">[</span> <span class="mi">1</span> <span class="o">]</span> <span class="o">-</span> <span class="n">minmax2</span><span class="o">[</span> <span class="mi">0</span> <span class="o">]</span> <span class="o">)</span> <span class="o">*</span> <span class="mf">0.35</span><span class="o">;</span>
<span class="k">for</span> <span class="o">(</span> <span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o"><</span> <span class="n">n</span><span class="o">;</span> <span class="o">++</span><span class="n">i</span> <span class="o">)</span> <span class="o">{</span>
<span class="n">ip</span> <span class="o">=</span> <span class="n">imp</span><span class="o">.</span><span class="na">getStack</span><span class="o">().</span><span class="na">getProcessor</span><span class="o">(</span><span class="n">imp</span><span class="o">.</span><span class="na">getStackIndex</span><span class="o">(</span><span class="mi">2</span><span class="o">,</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="o">,</span><span class="mi">1</span><span class="o">));</span>
<span class="c1">// new GaussianBlur().blurGaussian(ip, 1.5, 1.5, 0.001);</span>
<span class="n">ip</span><span class="o">.</span><span class="na">subtract</span><span class="o">(</span><span class="n">minmax2</span><span class="o">[</span><span class="mi">0</span><span class="o">]);</span>
<span class="n">ip</span><span class="o">.</span><span class="na">multiply</span><span class="o">(</span><span class="mf">1.0</span> <span class="o">/</span> <span class="o">(</span><span class="n">minmax2</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span> <span class="o">-</span> <span class="n">minmax2</span><span class="o">[</span><span class="mi">0</span><span class="o">]));</span>
<span class="o">}</span>
<span class="n">s1</span> <span class="o">=</span> <span class="mf">1.0</span><span class="o">;</span>
<span class="n">s2</span> <span class="o">=</span> <span class="mf">1.0</span><span class="o">;</span>
<span class="n">a1</span> <span class="o">=</span> <span class="mf">1.0</span><span class="o">;</span>
<span class="n">a2</span> <span class="o">=</span> <span class="mf">1.0</span><span class="o">;</span>
<span class="n">composite2ARGBDouble</span> <span class="o">=</span>
<span class="k">new</span> <span class="n">net</span><span class="o">.</span><span class="na">imglib2</span><span class="o">.</span><span class="na">render</span><span class="o">.</span><span class="na">volume</span><span class="o">.</span><span class="na">RealCompositeARGBDoubleConverter</span><span class="o">(</span> <span class="mi">2</span> <span class="o">);</span>
<span class="n">composite2ARGBDouble</span><span class="o">.</span><span class="na">setARGB</span><span class="o">(</span> <span class="k">new</span> <span class="nc">ARGBDoubleType</span><span class="o">(</span> <span class="n">a1</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="n">s1</span><span class="o">,</span> <span class="mi">0</span> <span class="o">),</span> <span class="mi">0</span> <span class="o">);</span>
<span class="n">composite2ARGBDouble</span><span class="o">.</span><span class="na">setARGB</span><span class="o">(</span> <span class="k">new</span> <span class="nc">ARGBDoubleType</span><span class="o">(</span> <span class="n">a2</span><span class="o">,</span> <span class="n">s2</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="n">s2</span> <span class="o">),</span> <span class="mi">1</span> <span class="o">);</span>
<span class="n">omp</span> <span class="o">=</span> <span class="n">net</span><span class="o">.</span><span class="na">imglib2</span><span class="o">.</span><span class="na">render</span><span class="o">.</span><span class="na">volume</span><span class="o">.</span><span class="na">Renderer</span><span class="o">.</span><span class="na">runARGB</span><span class="o">(</span>
<span class="n">imp</span><span class="o">,</span>
<span class="n">imp</span><span class="o">.</span><span class="na">getWidth</span><span class="o">(),</span>
<span class="n">imp</span><span class="o">.</span><span class="na">getHeight</span><span class="o">(),</span>
<span class="n">affine</span><span class="o">,</span>
<span class="mi">0</span><span class="o">,</span>
<span class="mi">1</span><span class="o">,</span>
<span class="n">bgARGB</span><span class="o">,</span>
<span class="mi">1</span><span class="o">,</span>
<span class="n">composite2ARGBDouble</span> <span class="o">);</span>
<span class="c1">//omp = net.imglib2.render.volume.Renderer.runARGB(</span>
<span class="c1">// imp,</span>
<span class="c1">// imp.getWidth(),</span>
<span class="c1">// imp.getHeight(),</span>
<span class="c1">// 仿射,</span>
<span class="c1">// 1.0,</span>
<span class="c1">// 1.0,</span>
<span class="c1">// 新的 Translation3D(),</span>
<span class="c1">// 1,</span>
<span class="c1">// bgARGB,</span>
<span class="c1">// net.imglib2.render.volume.Renderer.Interpolation.NN,</span>
<span class="c1">// composite2ARGBDouble );</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Saving="</span> <span class="o">+</span> <span class="n">dir2</span> <span class="o">);</span>
<span class="n">omp</span><span class="o">.</span><span class="na">show</span><span class="o">();</span>
<span class="no">IJ</span><span class="o">.</span><span class="na">save</span><span class="o">(</span> <span class="n">omp</span><span class="o">,</span> <span class="n">dir2</span> <span class="o">+</span> <span class="s">"/render_tp"</span> <span class="o">+</span> <span class="no">IJ</span><span class="o">.</span><span class="na">pad</span><span class="o">(</span><span class="n">timepoint</span><span class="o">,</span> <span class="mi">4</span><span class="o">)</span> <span class="o">+</span> <span class="s">".tif"</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"All done"</span><span class="o">);</span>
<span class="cm">/* shutdown */</span>
<span class="n">运行时</span><span class="o">.</span><span class="na">退出</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span></code></pre></figure>
Execute the `create-render-jobs` script and submit the jobs to the cluster with the `submit-jobs` script.
### Hdf5 导出
Change the necessary parameters in the **master file**:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">###---------- hdf5 export ----------</span>
<span class="c">##目标目录</span>
<span class="nv">target_hdf5</span><span class="o">=</span>“/hdf5/”
<span class="c">##职位数量</span>
<span class="nv">num_export_job</span><span class="o">=</span><span class="s2">"</span><span class="sb">`</span><span class="nb">seq </span>0 3<span class="sb">`</span><span class="s2">"</span>
<span class="c">#路径目录</span>
<span class="c">#path="\"/projects/pilot_spim/Christopher/Test_scripts/single-channel\""</span>
<span class="nv">path</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">/projects/pilot_spim/Christopher/Test_scripts/multi-channel/channel_split</span><span class="se">\"</span><span class="s2">"</span>
<span class="c">#Xml文件名</span>
<span class="nv">exportXmlFilename</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">/hdf5/Test_single.xml</span><span class="se">\"</span><span class="s2">"</span>
<span class="c">##Spim 模式</span>
<span class="c">##For single channel:spim_TL{tt}_Angle{a}.tif</span>
<span class="c">##For 2 channel: spim_TL{tt}_Angle{a}_Channel{c}.tif</span>
<span class="c">#inputFilePattern="\"spim_TL{tt}_Angle{a}.tif\""</span>
<span class="nv">inputFilePattern</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">spim_TL{tt}_Angle{a}_Channel{c}.tif</span><span class="se">\"</span><span class="s2">"</span>
<span class="c">##Channels: change for 2 channel data</span>
<span class="c">#channels_export="\"0\""</span>
<span class="nv">channels_export</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">0,1</span><span class="se">\"</span><span class="s2">"</span>
<span class="nv">angles_export</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">1,2,3,4,5</span><span class="se">\"</span><span class="s2">"</span>
<span class="nv">timepoint_export</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">1-3</span><span class="se">\"</span><span class="s2">"</span>
<span class="nv">referencetp_export</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">1</span><span class="se">\"</span><span class="s2">"</span>
<span class="nv">filepath</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">/output_fusion/</span><span class="se">\"</span><span class="s2">"</span>
<span class="nv">filepattern</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">%1</span><span class="se">\\\$</span><span class="s2">d/img_tl%1</span><span class="se">\\\$</span><span class="s2">d_ch%2</span><span class="se">\\\$</span><span class="s2">d_z%3</span><span class="se">\\\$</span><span class="s2">03d.tif</span><span class="se">\"</span><span class="s2">"</span>
<span class="nv">export_numSlices</span><span class="o">=</span><span class="s2">"369"</span>
切片值最小值<span class="o">=</span>“0”
<span class="nv">sliceValueMax</span><span class="o">=</span><span class="s2">"60000"</span>
<span class="nv">cropOffsetX</span><span class="o">=</span><span class="s2">"0"</span>
<span class="nv">cropOffsetY</span><span class="o">=</span><span class="s2">"314"</span>
<span class="nv">cropOffsetZ</span><span class="o">=</span><span class="s2">"355"</span>
<span class="nv">scale</span><span class="o">=</span><span class="s2">"2"</span></code></pre></figure>
The `getnumjobs` file:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
/sw/bin/xvfb-run <span class="nt">-a</span> /sw/users/pietzsch/packages/Fiji.app/ImageJ-linux64
<span class="nt">-Xmx10g</span> <span class="nt">-Dprintnumjobs</span><span class="o">=</span><span class="nb">true</span>
<span class="nt">-Dpath</span><span class="o">=</span><span class="s2">"/projects/pilot_spim/Christopher/Test_scripts/multi-channel/channel_split"</span>
<span class="nt">-DexportXmlFilename</span><span class="o">=</span><span class="s2">"/hdf5/Test_single.xml"</span> <span class="nt">-Dspimresolutions</span><span class="o">=</span>
<span class="nt">-Dspimsubdivisions</span><span class="o">=</span> <span class="nt">-DinputFilePattern</span><span class="o">=</span><span class="s2">"spim_TL{tt}_Angle{a}_Channel{c}.tif"</span>
<span class="nt">-Dchannels</span><span class="o">=</span><span class="s2">"0,1"</span> <span class="nt">-Dangles</span><span class="o">=</span><span class="s2">"1,2,3,4,5"</span> <span class="nt">-Dtimepoints</span><span class="o">=</span><span class="s2">"1-3"</span>
<span class="nt">-DreferenceTimePoint</span><span class="o">=</span><span class="s2">"1"</span> <span class="nt">-DoverrideImageZStretching</span><span class="o">=</span>
<span class="nt">-DzStretching</span><span class="o">=</span>3.481975 <span class="nt">-Dfusionresolutions</span><span class="o">=</span> <span class="nt">-Dfusionsubdivisions</span><span class="o">=</span>
<span class="nt">-Dfilepath</span><span class="o">=</span><span class="s2">"/output_fusion/"</span> <span class="nt">-Dfilepattern</span><span class="o">=</span><span class="s2">"%1</span><span class="se">\$</span><span class="s2">d/img_tl%1</span><span class="se">\$</span><span class="s2">d_ch%2</span><span class="se">\$</span><span class="s2">d_z%3</span><span class="se">\$</span><span class="s2">03d.tif"</span>
<span class="nt">-DnumSlices</span><span class="o">=</span>369 <span class="nt">-DsliceValueMin</span><span class="o">=</span>0 <span class="nt">-DsliceValueMax</span><span class="o">=</span>60000
<span class="nt">-DcropOffsetX</span><span class="o">=</span>0 <span class="nt">-DcropOffsetY</span><span class="o">=</span>314 <span class="nt">-DcropOffsetZ</span><span class="o">=</span>320 <span class="nt">-Dscale</span><span class="o">=</span>2
<span class="nt">--</span> <span class="nt">--no-splash</span> /projects/pilot_spim/Christopher/pipeline/jobs_master_beta_2.0/hdf5/export.bsh</code></pre></figure>
The output of the `getnumjobs`:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nb">cat </span>numjobsout
Your job looked like:
<span class="nt">------------------------------------------------------------------------</span>
<span class="c"># LSBATCH: User input</span>
/projects/pilot_spim/Christopher/pipeline/jobs_master_beta_2.0/hdf5//getnumjobs
<span class="nt">------------------------------------------------------------------------</span>
Successfully completed.
Resource usage summary:
CPU <span class="nb">time</span> : 3.86 sec.
Max Memory : 3 MB
Max Swap : 33 MB
Max Processes : 1
Max Threads : 1
The output <span class="o">(</span><span class="k">if </span>any<span class="o">)</span> follows:
<span class="nv">path</span><span class="o">=</span>/projects/pilot_spim/Christopher/Test_scripts/multi-channel/channel_split
Xml <span class="nv">Filename</span><span class="o">=</span>/projects/pilot_spim/Christopher/Test_scripts/multi-channel/channel_split/hdf5/Test_single.xml
<span class="nv">inputFilePattern</span><span class="o">=</span>spim_TL<span class="o">{</span>tt<span class="o">}</span>_Angle<span class="o">{</span>a<span class="o">}</span>_Channel<span class="o">{</span>c<span class="o">}</span>.tif
通道<span class="o">=</span>0,1
角度<span class="o">=</span>1,2,3,4,5
时间点<span class="o">=</span>1-3
参考时间点<span class="o">=</span>1
<span class="nv">overrideImageZStretching</span><span class="o">=</span><span class="nb">true
</span>z拉伸<span class="o">=</span>3.481975
<span class="nv">filepath</span><span class="o">=</span>/projects/pilot_spim/Christopher/Test_scripts/multi-channel/channel_split/output_fusion/
<span class="nv">filepattern</span><span class="o">=</span>%1<span class="nv">$d</span>/img_tl%1<span class="nv">$d_ch</span>%2<span class="nv">$d_z</span>%3<span class="nv">$03d</span>.tif
切片值最小值<span class="o">=</span>0
切片值最大<span class="o">=</span>60000
裁剪偏移X<span class="o">=</span>0
裁剪偏移Y<span class="o">=</span>314
作物偏移Z<span class="o">=</span>320
比例<span class="o">=</span>2
通道模式:0,1
通道:<span class="o">(</span>0, 1<span class="o">)</span>
注册通道:0,1
通道寄存器:<span class="o">(</span>0, 1<span class="o">)</span>
熔断通道:0,1
通道保险丝: <span class="o">(</span>0, 1<span class="o">)</span>
<span class="o">(</span>Thu Mar 13 09:01:08 CET 2014<span class="o">)</span>: Loading timepoint 1
Using model: mpicbg.models.AffineModel3D
<span class="o">(</span>Thu Mar 13 09:01:08 CET 2014<span class="o">)</span>: Loading timepoint 2
Using model: mpicbg.models.AffineModel3D
<span class="o">(</span>Thu Mar 13 09:01:08 CET 2014<span class="o">)</span>: Loading timepoint 3
Using model: mpicbg.models.AffineModel3D
Using model: mpicbg.models.AffineModel3D
Using model: mpicbg.models.AffineModel3D
Using model: mpicbg.models.AffineModel3D
Using model: mpicbg.models.AffineModel3D
Dimension of final output image:
From : <span class="o">(</span><span class="nt">-4</span>.7491517, <span class="nt">-72</span>.81616, <span class="nt">-577</span>.69653<span class="o">)</span> to <span class="o">(</span>1935.009, 1301.533, 950.0663<span class="o">)</span>
Size: <span class="o">(</span>1939.7582, 1374.3491, 1527.7628<span class="o">)</span> needs 15537 MB of RAM
Scaled size<span class="o">(</span>2<span class="o">)</span>: <span class="o">(</span>970, 687, 764<span class="o">)</span> needs 1942 MB of RAM
tx <span class="o">=</span> <span class="nt">-4</span>.0 ty <span class="o">=</span> 242.0 tz <span class="o">=</span> <span class="nt">-257</span>.0 scale <span class="o">=</span> 2
职位数量:3
PS: The stderr output <span class="o">(</span><span class="k">if </span>any<span class="o">)</span> follows:</code></pre></figure>
Modify the **master file** accordingly. Create the jobs using the `create_export_jobs` script and submit them to the cluster.
# New Multiview Reconstruction pipeline
The key change in the **[Multiview Reconstruction](/plugins/multiview-reconstruction)** (MVR) pipeline is that all results are written into an XML.这给集群处理带来了新的问题,因为多个并发运行的作业需要更新同一个文件。
Stephan Preibisch 解决了这个问题,方法是允许为每个作业(通常是一个时间点)编写一个 XML 文件,然后将作业特定的 XML 合并到整个数据集的一个 XML 中。
实际上,这意味着需要执行以下步骤:
- 定义 XML 数据集 - 为整个延时拍摄创建一个 XML
- Re-save data as HDF5 - converts data into HDF5 container optimised for fast access in [BigDataViewer](/plugins/bdv)
- 按时间点注册运行 - 创建与时间点一样多的 XML
- 合并 XML - 将每个时间点的 XML 合并回单个 XML
引入了一些新参数,一些旧参数更改了名称。 Therefore, use the master file described in this chapter to process with the MVR pipeline.
## 定义 XML
First step in [**Multiview Reconstruction**](/plugins/multiview-reconstruction) is to define an XML file that describes the imaged dataset. This is very flexible and can be adapted to datasets with several angles, channels, illumination sides and timepoints. The relevant portion of the *master* file looks like this:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nv">type_of_dataset</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">Image Stacks (ImageJ Opener)</span><span class="se">\"</span><span class="s2">"</span> <span class="c"># raw fileformat</span>
<span class="nv">xml_filename</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">dataset.xml</span><span class="se">\"</span><span class="s2">"</span> <span class="c"># filename</span>
<span class="nv">multiple_timepoints</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">YES (one file per time-point)</span><span class="se">\"</span><span class="s2">"</span> <span class="c"># or NO (one time-point)</span>
<span class="nv">multiple_channels</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">NO (one channel)</span><span class="se">\"</span><span class="s2">"</span> <span class="c"># or YES (one file per channel)</span>
<span class="nv">multiple_illumination_directions</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">NO (one illumination direction)</span><span class="se">\"</span><span class="s2">"</span> <span class="c"># or YES (one file per illumination direction)</span>
<span class="nv">multiple_angles</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">YES (one file per angle)</span><span class="se">\"</span><span class="s2">"</span> <span class="c"># or NO (one angle)"</span></code></pre></figure>
。 。
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#--------------------------------------------------------------------------------</span>
<span class="c"># XML definition and manipulation</span>
<span class="c">#--------------------------------------------------------------------------------</span>
<span class="nv">jobs_xml</span><span class="o">=</span><span class="k">${</span><span class="nv">job_directory</span><span class="k">}</span><span class="s2">"/define_xml/"</span> <span class="c"># directory</span>
<span class="nv">define_xml</span><span class="o">=</span><span class="k">${</span><span class="nv">job_directory</span><span class="k">}</span><span class="s2">"define_xml/define_xml.bsh"</span> <span class="c"># script</span>
<span class="nv">merge_xml</span><span class="o">=</span><span class="k">${</span><span class="nv">job_directory</span><span class="k">}</span><span class="s2">"merge_xml.bsh"</span> <span class="c"># script</span></code></pre></figure>
and describes a multi timepoint time-lapse with single channel, one illumination direction and multiple angles. (*Note that the timepoints and angles are defined elsewhere in the general part of the master file*).
The parameters in the *master* file are sourced by a `create-dataset-jobs` bash script
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
<span class="nb">source</span> /projects/tomancak_lightsheet/Valia/Valia/new_pipeline/master
<span class="nb">mkdir</span> <span class="nt">-p</span> <span class="nv">$jobs_xml</span>
<span class="nv">job</span><span class="o">=</span><span class="s2">"</span><span class="nv">$jobs_xml</span><span class="s2">/create-dataset.job"</span>
回显<span class="nv">$工</span>作
<span class="nb">echo</span> <span class="s2">"#!/bin/bash"</span> <span class="o">></span> <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="nv">$XVFB_RUN</span><span class="s2"> -a </span><span class="nv">$Fiji</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Ddir=</span><span class="nv">$dir</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dpattern=</span><span class="nv">$channel_pattern_beads</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dtimepoint=</span><span class="nv">$timelapse_timepoint</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dangles=</span><span class="nv">$angles</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dxy_resolution=</span><span class="nv">$xy_resolution</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dz_scaling=</span><span class="nv">$z_scaling</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dimglib_container=</span><span class="nv">$imglib_container</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dtype_of_dataset=</span><span class="nv">$type_of_dataset</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dxml_filename=</span><span class="nv">$xml_filename</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dmultiple_timepoints=</span><span class="nv">$multiple_timepoints</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dmultiple_channels=</span><span class="nv">$multiple_channels</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dmultiple_illumination_directions=</span><span class="nv">$multiple_illumination_directions</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dmultiple_angles=</span><span class="nv">$multiple_angles</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-- --no-splash </span><span class="nv">$define_xml</span><span class="s2">"</span> <span class="o">>></span> <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
<span class="nb">chmod </span>a+x <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span></code></pre></figure>
which creates a `create-dataset.job` bash script that passes the parameters to Fiji by executing `define_xml.bsh` beanshell script
<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="n">导入</span> <span class="n">ij</span><span class="o">.</span><span class="na">IJ</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">ij.ImagePlus</span><span class="o">;</span>
<span class="n">导入java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">Runtime</span><span class="err">;</span>
<span class="n">导入java</span><span class="o">.</span><span class="na">io</span><span class="o">.</span><span class="na">File</span><span class="err">;</span>
<span class="n">导入</span> <span class="n">java</span><span class="o">.</span><span class="na">io</span><span class="o">.</span><span class="na">FilenameFilter</span><span class="o">;</span>
<span class="n">运行时</span> <span class="o">=</span> <span class="nc">Runtime</span><span class="o">.</span><span class="na">getRuntime</span><span class="o">();</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">runtime</span><span class="o">.</span><span class="na">availableProcessors</span><span class="o">()</span> <span class="o">+</span> <span class="s">" 可用于多线程的核心"</span><span class="o">);</span>
<span class="n">type_of_dataset</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"type_of_dataset"</span> <span class="o">);</span>
<span class="n">xml_filename</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"xml_filename"</span> <span class="o">);</span>
<span class="n">multiple_timepoints</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"multiple_timepoints"</span> <span class="o">);</span>
<span class="n">multiple_channels</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"multiple_channels"</span> <span class="o">);</span>
<span class="n">multiple_Illumination_directions</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"multiple_Illumination_directions"</span> <span class="o">);</span>
<span class="n">multiple_angles</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"multiple_angles"</span> <span class="o">);</span>
<span class="n">dir</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"dir"</span> <span class="o">);</span>
<span class="n">pattern</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"pattern"</span> <span class="o">);</span>
<span class="n">timepoint</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"timepoint"</span> <span class="o">);</span>
<span class="n">angles</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"angles"</span> <span class="o">);</span>
<span class="kt">int</span> <span class="n">xy_resolution</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"xy_resolution"</span> <span class="o">));</span>
<span class="kt">float</span> <span class="n">z_scaling</span> <span class="o">=</span> <span class="nc">Float</span><span class="o">.</span><span class="na">parseFloat</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"z_scaling"</span> <span class="o">)</span> <span class="o">);</span>
<span class="n">imglib_container</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"imglib_container"</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"数据集类型= "</span> <span class="o">+</span> <span class="n">type_of_dataset</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"xml 文件名 = "</span> <span class="o">+</span> <span class="n">xml_filename</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"multiple_timepoints="</span> <span class="o">+</span> <span class="n">multiple_timepoints</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"multiple_channels="</span> <span class="o">+</span> <span class="n">multiple_channels</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"multiple_Illumination_directions="</span> <span class="o">+</span> <span class="n">multiple_Illumination_directions</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"multiple_angles="</span> <span class="o">+</span> <span class="n">multiple_angles</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"dir="</span> <span class="o">+</span> <span class="n">dir</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"pattern_of_spim="</span> <span class="o">+</span> <span class="n">模式</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"timepoint="</span> <span class="o">+</span> <span class="n">timepoint</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">角度</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">角度</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">xy_分辨率</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">xy_分辨率</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">z_分辨率</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">z_缩放</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"imglib_container="</span> <span class="o">+</span> <span class="n">imglib_container</span> <span class="o">);</span>
<span class="no">IJ</span><span class="o">.</span><span class="na">run</span><span class="o">(</span><span class="s">"Define Multi-View Dataset"</span><span class="o">,</span>
<span class="s">"type_of_dataset=["</span> <span class="o">+</span> <span class="n">type_of_dataset</span> <span class="o">+</span> <span class="s">"] "</span> <span class="o">+</span>
<span class="s">"xml_filename=["</span> <span class="o">+</span> <span class="n">xml_filename</span> <span class="o">+</span> <span class="s">"] "</span> <span class="o">+</span>
<span class="s">"multiple_timepoints=["</span> <span class="o">+</span> <span class="n">multiple_timepoints</span> <span class="o">+</span> <span class="s">"] "</span> <span class="o">+</span>
<span class="s">"multiple_channels=["</span> <span class="o">+</span> <span class="n">multiple_channels</span> <span class="o">+</span> <span class="s">"] "</span> <span class="o">+</span>
<span class="s">"_____multiple_illumination_directions=["</span> <span class="o">+</span> <span class="n">multiple_illumination_directions</span> <span class="o">+</span> <span class="s">"] "</span> <span class="o">+</span>
<span class="s">"multiple_angles=["</span> <span class="o">+</span> <span class="n">multiple_angles</span> <span class="o">+</span> <span class="s">"] "</span> <span class="o">+</span>
<span class="s">"image_file_directory="</span> <span class="o">+</span> <span class="n">dir</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"image_file_pattern="</span> <span class="o">+</span> <span class="n">pattern</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"timepoints_="</span> <span class="o">+</span> <span class="n">timepoint</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"acquisition_angles_="</span> <span class="o">+</span> <span class="n">angles</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"calibration_type=[Same voxel-size for all views] calibration_definition=[User define voxel-size(s)]"</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"imglib2_data_container=["</span> <span class="o">+</span> <span class="n">imglib_container</span> <span class="o">+</span> <span class="s">"] "</span> <span class="o">+</span>
<span class="s">"pixel_distance_x="</span> <span class="o">+</span> <span class="n">xy_resolution</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"pixel_distance_y="</span> <span class="o">+</span> <span class="n">xy_resolution</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"pixel_distance_z="</span> <span class="o">+</span> <span class="n">z_scaling</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"pixel_unit=um"</span>
<span class="o">);</span>
<span class="cm">/* shutdown */</span>
<span class="n">运行时</span><span class="o">.</span><span class="na">退出</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span></code></pre></figure>
Since in this case it makes no sense to parallelise, it is best to launch the `create-dataset.job` in interactive mode on one of the nodes of the cluster (ideally not the headnode). On our cluster this will look like this:
[tomancak@madmax define_xml]$ ./create-dataset-jobs
/projects/tomancak_lightsheet/Valia/Valia/new_pipeline/jobs_master_beta_2.0/define_xml//create- dataset.job
[tomancak@madmax define_xml]$ bsub -q interactive -Is bash
Job <484001> is submitted to queue
End result should be a `dataset.xml` created in the directory where the raw data reside.
提示和技巧:
- 为了更改数据集的定义,请使用 GUI 和打开的宏记录器在本地定义它,并将相关宏参数复制/粘贴到主文件。
- Macro commands that consist of strings are usually surrounded by square brackets `[]`. Do NOT put the brackets into the master file, they are provided by the BeanShell script.
## Re-save as HDF5
<div class="notice notice-note" style="font-size: 2;"><div class="notice-icon"><img alt="" src="/media/icons/note.svg" width="32"></div><div class="notice-content"><p>This step is optional at this point. Re-saving to HDF5 can be done also after registration or not at all.</p>
</div>
</div>
此步骤的目的是将原始光片数据(`.czi` 或`.tif`)转换为 HDF5 容器,该容器经过优化,可通过 BigDataViewer Fiji 插件快速查看。
Relevant portion of the master file looks like this:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#-------------------------------------------------------------------------------</span>
<span class="c"># hdf5 export</span>
<span class="c">#-------------------------------------------------------------------------------</span>
<span class="nv">Fiji_export</span><span class="o">=</span><span class="s2">"/sw/people/tomancak/packages/fiji_tobi_for_testing/Fiji.app/ImageJ-linux64"</span> <span class="c"># Fiji_tobias</span>
<span class="nv">jobs_export</span><span class="o">=</span><span class="k">${</span><span class="nv">job_directory</span><span class="k">}</span><span class="s2">"/hdf5/"</span> <span class="c"># directory</span>
<span class="nv">resave_angle</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">All angles</span><span class="se">\"</span><span class="s2">"</span>
<span class="nv">resave_channel</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">所有频道</span><span class="se">\"</span><span class="s2">"</span>
<span class="nv">resave_Illumination</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">所有照明</span><span class="se">\"</span><span class="s2">"</span>
<span class="nv">resave_timepoint</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">所有时间点</span><span class="se">\"</span><span class="s2">"</span>
<span class="nv">subsampling_factors</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">{ {1,1,1}, {2,2,1}, {4,4,1}, {8,8,1} }</span><span class="se">\"</span><span class="s2">"</span>
<span class="nv">hdf5_chunk_sizes</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">{ {32,32,4}, {32,32,4}, {16,16,16}, {16,16,16} }</span><span class="se">\"</span><span class="s2">"</span>
timepoints_per_partition <span class="o">=</span>“1”
<span class="nv">setups_per_partition</span><span class="o">=</span><span class="s2">"0"</span></code></pre></figure>
As usual, we create cluster jobs per timepoint by sourcing the master file parameters with *create\_export\_jobs*
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"> <span class="c">#!/bin/bash</span>
<span class="nb">source</span> /projects/tomancak_lightsheet/Valia/Valia/new_pipeline/master
<span class="nv">job</span><span class="o">=</span><span class="s2">"</span><span class="nv">$jobs_export</span><span class="s2">/hdf5-0.job"</span>
回显<span class="nv">$工</span>作
<span class="nb">echo</span> <span class="s2">"#!/bin/bash"</span> <span class="o">></span> <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
回声“<span class="nv">$XVFB_RUN</span> <span class="nt">-a</span> <span class="nv">$Fiji_export</span> <span class="nt">-Xmx10g</span> <span class="se">\</span>
<span class="nt">-Ddir</span><span class="o">=</span><span class="nv">$dir</span> <span class="se">\</span>
<span class="nt">-Dxml_filename</span><span class="o">=</span><span class="nv">$xml_filename</span> <span class="se">\</span>
<span class="nt">-Dresave_angle</span><span class="o">=</span><span class="nv">$resave_angle</span> <span class="se">\</span>
<span class="nt">-Dresave_channel</span><span class="o">=</span><span class="nv">$resave_channel</span> <span class="se">\</span>
<span class="nt">-Dresave_illumination</span><span class="o">=</span><span class="nv">$resave_illumination</span> <span class="se">\</span>
<span class="nt">-Dresave_timepoint</span><span class="o">=</span><span class="nv">$resave_timepoint</span> <span class="se">\</span>
<span class="nt">-Dsubsampling_factors</span><span class="o">=</span><span class="nv">$subsampling_factors</span> <span class="se">\</span>
<span class="nt">-Dhdf5_chunk_sizes</span><span class="o">=</span><span class="nv">$hdf5_chunk_sizes</span> <span class="se">\</span>
<span class="nt">-Dtimepoints_per_partition</span><span class="o">=</span><span class="nv">$timepoints_per_partition</span> <span class="se">\</span>
<span class="nt">-Dsetups_per_partition</span><span class="o">=</span><span class="nv">$setups_per_partition</span> <span class="se">\</span>
<span class="nt">-Drun_only_job_number</span><span class="o">=</span>0 <span class="se">\</span>
<span class="nt">--</span> <span class="nt">--no-splash</span> <span class="nv">$export</span><span class="s2">" >> "</span><span class="nv">$job</span><span class="s2">"
chmod a+x "</span><span class="nv">$job</span><span class="s2">"
对于我在 </span><span class="nv">$timepoint</span><span class="s2">
做
job="</span><span class="nv">$jobs_export</span>/hdf5-<span class="nv">$i</span>.job<span class="s2">"
echo </span><span class="nv">$job</span><span class="s2">
echo "</span><span class="c">#!/bin/bash" > "$job"</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="nv">$XVFB_RUN</span><span class="s2"> -a </span><span class="nv">$Fiji_export</span><span class="s2"> -Xmx10g </span><span class="se">\</span><span class="s2">
-Ddir=</span><span class="nv">$dir</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dxml_filename=</span><span class="nv">$xml_filename</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dresave_angle=</span><span class="nv">$resave_angle</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dresave_channel=</span><span class="nv">$resave_channel</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dresave_illumination=</span><span class="nv">$resave_illumination</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dresave_timepoint=</span><span class="nv">$resave_timepoint</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dsubsampling_factors=</span><span class="nv">$subsampling_factors</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dhdf5_chunk_sizes=</span><span class="nv">$hdf5_chunk_sizes</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dtimepoints_per_partition=</span><span class="nv">$timepoints_per_partition</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dsetups_per_partition=</span><span class="nv">$setups_per_partition</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Drun_only_job_number=</span><span class="nv">$i</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-- --no-splash </span><span class="nv">$export</span><span class="s2">"</span> <span class="o">>></span> <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
<span class="nb">chmod </span>a+x <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
完成</code></pre></figure>
<div class="notice notice-note" style="font-size: 2;"><div class="notice-icon"><img alt="" src="/media/icons/note.svg" width="32"></div><div class="notice-content"><p>Note that we first run a job with parameter <code class="language-plaintext highlighter-rouge">run_only_job_number</code> set to <code class="language-plaintext highlighter-rouge">0</code>. This creates the master <code class="language-plaintext highlighter-rouge">dataset.h5</code> file.</p>
</div>
</div>
The rest of the `hdf5-<number>.job` bash scripts execute `export.bsh` BeanShell using Fiji
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">导入 ij.IJ<span class="p">;</span>
导入 ij.ImagePlus;
导入java.lang.Runtime;
导入java.io.File;
导入 java.io.FilenameFilter<span class="p">;</span>
<span class="nb">dir</span> <span class="o">=</span> System.getProperty<span class="o">(</span> <span class="s2">"dir"</span> <span class="o">)</span><span class="p">;</span>
xml_filename <span class="o">=</span> System.getProperty<span class="o">(</span> <span class="s2">"xml_filename"</span> <span class="o">)</span><span class="p">;</span>
resave_angle <span class="o">=</span> System.getProperty<span class="o">(</span> <span class="s2">"resave_angle"</span> <span class="o">)</span><span class="p">;</span>
resave_channel <span class="o">=</span> System.getProperty<span class="o">(</span> <span class="s2">"resave_channel"</span> <span class="o">)</span><span class="p">;</span>
resave_illumination <span class="o">=</span> System.getProperty<span class="o">(</span> <span class="s2">"resave_illumination"</span> <span class="o">)</span><span class="p">;</span>
resave_timepoint <span class="o">=</span> System.getProperty<span class="o">(</span> <span class="s2">"resave_timepoint"</span> <span class="o">)</span><span class="p">;</span>
subsampling_factors <span class="o">=</span> System.getProperty<span class="o">(</span> <span class="s2">"subsampling_factors"</span> <span class="o">)</span><span class="p">;</span>
hdf5_chunk_sizes <span class="o">=</span> System.getProperty<span class="o">(</span> <span class="s2">"hdf5_chunk_sizes"</span> <span class="o">)</span><span class="p">;</span>
timepoints_per_partition <span class="o">=</span> System.getProperty<span class="o">(</span> <span class="s2">"timepoints_per_partition"</span> <span class="o">)</span><span class="p">;</span>
setups_per_partition <span class="o">=</span> System.getProperty<span class="o">(</span> <span class="s2">"setups_per_partition"</span> <span class="o">)</span><span class="p">;</span>
run_only_job_number <span class="o">=</span> System.getProperty<span class="o">(</span> <span class="s2">"run_only_job_number"</span> <span class="o">)</span><span class="p">;</span>
System.out.println<span class="o">(</span> <span class="s2">"dir="</span> + <span class="nb">dir</span> <span class="o">)</span><span class="p">;</span>
System.out.println<span class="o">(</span> <span class="s2">"xml_filename="</span> + xml_filename<span class="o">)</span><span class="p">;</span>
System.out.println<span class="o">(</span> <span class="s2">"resave_angle="</span> + resave_angle <span class="o">)</span><span class="p">;</span>
System.out.println<span class="o">(</span> <span class="s2">"resave_channel="</span> + resave_channel <span class="o">)</span><span class="p">;</span>
System.out.println<span class="o">(</span> <span class="s2">"resave_Illumination="</span> + resave_Illumination <span class="o">)</span><span class="p">;</span>
System.out.println<span class="o">(</span> <span class="s2">"resave_timepoint="</span> + resave_timepoint<span class="o">)</span><span class="p">;</span>
System.out.println<span class="o">(</span> <span class="s2">"subsampling_factors="</span> + subsampling_factors<span class="o">)</span><span class="p">;</span>
System.out.println<span class="o">(</span> <span class="s2">"hdf5_chunk_sizes="</span> + hdf5_chunk_sizes <span class="o">)</span><span class="p">;</span>
System.out.println<span class="o">(</span> <span class="s2">"timepoints_per_partition="</span> + timepoints_per_partition <span class="o">)</span><span class="p">;</span>
System.out.println<span class="o">(</span> <span class="s2">"setups_per_partition="</span> + setups_per_partition <span class="o">)</span><span class="p">;</span>
System.out.println<span class="o">(</span> <span class="s2">"run_only_job_number="</span> + run_only_job_number <span class="o">)</span><span class="p">;</span>
//activate cluster processing
IJ.run<span class="o">(</span><span class="s2">"Toggle Cluster Processing"</span>, <span class="s2">"display_cluster"</span><span class="o">)</span><span class="p">;</span>
IJ.run<span class="o">(</span><span class="s2">"作为 HDF5"</span>,
<span class="s2">"select_xml="</span> + <span class="nb">dir</span> + xml_filename + <span class="s2">" "</span> +
<span class="s2">"resave_angle=["</span> + resave_angle + <span class="s2">"] "</span> +
<span class="s2">"resave_channel=["</span> + resave_channel + <span class="s2">"] "</span> +
<span class="s2">"resave_illumination=["</span> + resave_illumination + <span class="s2">"] "</span> +
<span class="s2">"resave_timepoint=["</span> + resave_timepoint + <span class="s2">"] "</span> +
<span class="s2">"subsampling_factors=["</span> + subsampling_factors + <span class="s2">"] "</span> +
<span class="s2">"hdf5_chunk_sizes=["</span> + hdf5_chunk_sizes + <span class="s2">"] "</span> +
<span class="s2">"split_hdf5 "</span> +
<span class="s2">"timepoints_per_partition="</span> + timepoints_per_partition + <span class="s2">" "</span> +
<span class="s2">"setups_per_partition="</span> + setups_per_partition + <span class="s2">" "</span> +
<span class="s2">"run_only_job_number="</span> + run_only_job_number + <span class="s2">" "</span> +
<span class="s2">"use_deflate_compression "</span> +
<span class="s2">"export_path="</span> + <span class="nb">dir</span> + <span class="s2">"hdf5_"</span> + xml_filename<span class="o">)</span><span class="p">;</span>
/<span class="k">*</span> shutdown <span class="k">*</span>/
System.exit<span class="o">(</span>0<span class="o">)</span><span class="p">;</span></code></pre></figure>
`hdf5-<number>.job` bash 脚本将通过以下 `submit-jobs` 脚本提交到集群
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
<span class="sb">`</span><span class="nb">ls</span> <span class="k">${</span><span class="nv">1</span><span class="k">}</span> | <span class="nb">grep</span> <span class="s2">".job$"</span><span class="sb">`</span>中的文件
做
bsub <span class="nt">-q</span> short <span class="nt">-n</span> 1 <span class="nt">-R</span> rusage[mem<span class="o">=</span>10000] <span class="nt">-R</span> span[hosts<span class="o">=</span>1] <span class="nt">-o</span> <span class="s2">"out.%J"</span> <span class="nt">-e</span> <span class="s2">"err.%J"</span> <span class="k">${</span><span class="nv">1</span><span class="k">}</span>/<span class="nv">$file</span>
完成</code></pre></figure>
并在原始数据目录中生成一系列`.h5`文件。每个文件包含一个时间点的原始数据。 At this point without any registration.
hdf5_dataset.h5 hdf5_dataset-00-00.h5 hdf5_dataset-01-00.h5 hdf5_dataset-02-00.h5 hdf5_dataset-03-00.h5 hdf5_dataset-04-00.h5 hdf5_dataset-05-00.h5 hdf5_dataset-06-00.h5 hdf5_dataset-07-00.h5 hdf5_dataset-08-00.h5 hdf5_dataset-09-00.h5
and new `hdf5_dataset.xml`.
从现在开始,数据位于 HDF5 容器中(未注册),可以在 [BigDataViewer](/plugins/bdv) 中查看。 In the next step we register the data by running the registration pipeline and updating the XML.
## 多视图注册
我们现在有 `.xml` 文件。 `dataset.xml` 在定义 xml 步骤期间创建,`hdf5_dataset.xml` 在重新保存到 HDF5 后创建。我们首先复制 `dataset.xml`
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nb">cp </span>dataset.xml 原始数据集.xml</code></pre></figure>
并将 `hdf5_dataset.xml` 复制到 `dataset.xml`
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nb">cp </span>hdf5_dataset.xml 数据集.xml</code></pre></figure>
Like this we have a back-up of the two intermediate state XMLs and a `dataset.xml` to use as input for registration.
*master* 文件中与多视图注册相关的部分如下所示:
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#-------------------------------------------------------------------------------</span>
<span class="c"># 多视图注册</span>
<span class="c">#</span>
<span class="c"># 指定检测珠子的方法:</span>
<span class="c"># Difference of mean: Comment out Difference of Gaussian in registration.bsh</span>
<span class="c"># Difference of Gaussian: Comment out Differnce of Mean in registration.bsh</span>
<span class="c">#-------------------------------------------------------------------------------</span>
<span class="nv">process_timepoint</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">Single Timepoint (Select from List)</span><span class="se">\"</span><span class="s2">"</span> <span class="c"># or</span>
<span class="nv">process_channel</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">All channels</span><span class="se">\"</span><span class="s2">"</span> <span class="c"># or</span>
<span class="nv">process_Illumination</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">所有照明</span><span class="se">\"</span><span class="s2">"</span> <span class="c"># 或</span>
<span class="nv">process_angle</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">All angles</span><span class="se">\"</span><span class="s2">"</span> <span class="c"># or</span>
<span class="nv">type_of_detection</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">Difference-of-Mean (Integral image based)</span><span class="se">\"</span><span class="s2">"</span> <span class="c"># Difference</span>
<span class="nv">radius1</span><span class="o">=</span><span class="s2">"2"</span> <span class="c"># of Mean</span>
半径2<span class="o">=</span>“3”
<span class="nv">threshold</span><span class="o">=</span><span class="s2">"0.005"</span>
<span class="c"># type_of_detection="\"高斯差分\"" # 差异</span>
<span class="c"># initial_sigma="1.8000" # of Gaussian</span>
<span class="c">#阈值_高斯=“0.0080”</span></code></pre></figure>
和
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#--------------------------------------------------------------------------------------------</span>
<span class="c"># 多视图注册</span>
<span class="c">#-------------------------------------------------------------------------------</span>
<span class="nv">jobs_registration</span><span class="o">=</span><span class="k">${</span><span class="nv">job_directory</span><span class="k">}</span><span class="s2">"/registration/"</span> <span class="c"># directory</span>
<span class="nv">registration</span><span class="o">=</span><span class="k">${</span><span class="nv">jobs_registration</span><span class="k">}</span><span class="s2">"/registration.bsh"</span> <span class="c"># script</span>
<span class="nv">channel_pattern_beads</span><span class="o">=</span><span class="k">${</span><span class="nv">pattern_switch</span><span class="k">}</span> <span class="c"># 模式</span>
<span class="nv">type_of_registration</span><span class="o">=</span><span class="s2">"Single-channel"</span> <span class="c"># registration parameters</span>
<span class="nv">label_interest_points</span><span class="o">=</span><span class="s2">"珠子"</span>
<span class="nv">subpixel_localization</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">3 维二次拟合</span><span class="se">\"</span><span class="s2">"</span>
<span class="nv">conversion_model</span><span class="o">=</span>“仿射”
<span class="nv">imglib_container</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">数组容器(图像较小~2048x2048x450 px)</span><span class="se">\"</span><span class="s2">"</span>
<span class="nv">Registration_algorithm</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">快速 3D 几何哈希(旋转不变)</span><span class="se">\"</span><span class="s2">"</span>
<span class="nv">type_of_registration</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">单独注册时间点</span><span class="se">\"</span><span class="s2">"</span>
<span class="nv">interest_points_channel_0</span><span class="o">=</span><span class="s2">"珠子"</span>
<span class="nv">fix_tiles</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">不修复瓷砖</span><span class="se">\"</span><span class="s2">"</span>
<span class="nv">map_back_tiles</span><span class="o">=</span><span class="s2">"</span><span class="se">\"</span><span class="s2">使用刚性模型映射回第一个图块</span><span class="se">\"</span><span class="s2">"</span>
<span class="nv">transformation</span><span class="o">=</span><span class="s2">"Affine"</span>
<span class="nv">model_to_regularize_with</span><span class="o">=</span>“刚性”
<span class="nv">lambda</span><span class="o">=</span><span class="s2">"0.10"</span>
<span class="nv">allowed_error_for_ransac</span><span class="o">=</span><span class="s2">"5"</span></code></pre></figure>
参数通过 `create-registration-jobs` 从 *master* 读取
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
源/projects/tomancak_lightsheet/Valia/Valia/new_pipeline/master
<span class="nb">mkdir</span> <span class="nt">-p</span> <span class="nv">$jobs_registration</span>
对于我在 <span class="nv">$timepoint</span>
做
<span class="nv">job</span><span class="o">=</span><span class="s2">"</span><span class="nv">$jobs_registration</span><span class="s2">/register-</span><span class="nv">$i</span><span class="s2">.job"</span>
<span class="nb">echo</span> <span class="nv">$job</span>
<span class="nb">echo</span> <span class="s2">"#!/bin/bash"</span> <span class="o">></span> <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="nv">$XVFB_RUN</span><span class="s2"> -a </span><span class="nv">$Fiji</span><span class="s2"> -Dxml_path=</span><span class="nv">$dir</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dxml_filename=</span><span class="nv">$xml_filename</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dprocess_timepoint=</span><span class="nv">$process_timepoint</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dprocess_illumination=</span><span class="nv">$process_illumination</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dprocess_angle=</span><span class="nv">$process_angle</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dlabel_interest_points=</span><span class="nv">$label_interest_points</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dtype_of_registration=</span><span class="nv">$type_of_registration</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dtype_of_detection=</span><span class="nv">$type_of_detection</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Ddir=</span><span class="nv">$dir</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dpattern=</span><span class="nv">$channel_pattern_beads</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dtimepoint=</span><span class="nv">$i</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dangles=</span><span class="nv">$angles</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dsubpixel_localization=</span><span class="nv">$subpixel_localization</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dxy_resolution=</span><span class="nv">$xy_resolution</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dz_scaling=</span><span class="nv">$z_scaling</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dtransformation=</span><span class="nv">$transformation</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dimglib_container=</span><span class="nv">$imglib_container</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dradius1=</span><span class="nv">$radius1</span><span class="s2"> -Dradius2=</span><span class="nv">$radius2</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dthreshold=</span><span class="nv">$threshold</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dinitial_sigma=</span><span class="nv">$initial_sigma</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dthreshold_gaussian=</span><span class="nv">$threshold_gaussian</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dregistration_algorithm=</span><span class="nv">$registration_algorithm</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dtype_of_registration=</span><span class="nv">$type_of_registration</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dinterest_points_channel_0=</span><span class="nv">$interest_points_channel_0</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dfix_tiles=</span><span class="nv">$fix_tiles</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dmap_back_tiles=</span><span class="nv">$map_back_tiles</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dmodel_to_regularize_with=</span><span class="nv">$model_to_regularize_with</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dlambda=</span><span class="nv">$lambda</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-Dallowed_error_for_ransac=</span><span class="nv">$allowed_error_for_ransac</span><span class="s2"> </span><span class="se">\</span><span class="s2">
-- --no-splash </span><span class="nv">$registration</span><span class="s2">"</span> <span class="o">>></span> <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
<span class="nb">chmod </span>a+x <span class="s2">"</span><span class="nv">$job</span><span class="s2">"</span>
完成</code></pre></figure>
它生成 `registration_<number>.job` bash 脚本,在斐济的集群上启动 `registration.bsh`
<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="n">导入</span> <span class="n">ij</span><span class="o">.</span><span class="na">IJ</span><span class="o">;</span>
<span class="n">导入</span> <span class="n">ij</span><span class="o">.</span><span class="na">ImagePlus</span><span class="err">;</span>
<span class="n">导入java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">Runtime</span><span class="err">;</span>
<span class="n">导入java</span><span class="o">.</span><span class="na">io</span><span class="o">.</span><span class="na">File</span><span class="err">;</span>
<span class="n">导入</span> <span class="n">java</span><span class="o">.</span><span class="na">io</span><span class="o">.</span><span class="na">FilenameFilter</span><span class="o">;</span>
<span class="n">运行时</span> <span class="o">=</span> <span class="nc">Runtime</span><span class="o">.</span><span class="na">getRuntime</span><span class="o">();</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">runtime</span><span class="o">.</span><span class="na">availableProcessors</span><span class="o">()</span> <span class="o">+</span> <span class="s">" 可用于多线程的核心"</span><span class="o">);</span>
<span class="c1">//select xml</span>
<span class="n">xml_path</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span><span class="err">“</span><span class="n">xml_path</span><span class="err">”</span><span class="o">);</span>
<span class="n">xml_文件名</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"xml_文件名"</span> <span class="o">);</span>
<span class="n">时间点</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"时间点"</span> <span class="o">);</span>
<span class="c1">//有关处理内容的参数</span>
<span class="n">process_timepoint</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"process_timepoint"</span> <span class="o">);</span>
<span class="c1">//process_channel = System.getProperty( "process_channel" );</span>
<span class="n">process_illumination</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"process_illumination"</span> <span class="o">);</span>
<span class="n">process_angle</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"process_angle"</span> <span class="o">);</span>
<span class="n">type_of_registration</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"type_of_registration"</span> <span class="o">);</span>
<span class="n">type_of_detection</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"type_of_detection"</span> <span class="o">);</span>
<span class="n">label_interest_points</span><span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"label_interest_points"</span> <span class="o">);</span>
<span class="n">dir</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"dir"</span> <span class="o">);</span>
<span class="n">模式</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span><span class="err">“</span><span class="n">模式</span><span class="err">”</span><span class="o">);</span>
<span class="n">角度</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"角度"</span> <span class="o">);</span>
<span class="n">bead_brightness</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"bead_brightness"</span> <span class="o">);</span>
<span class="n">subpixel_localization</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"subpixel_localization"</span> <span class="o">);</span>
<span class="kt">int</span> <span class="n">xy_resolution</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"xy_resolution"</span> <span class="o">));</span>
<span class="kt">float</span> <span class="n">z_scaling</span> <span class="o">=</span> <span class="nc">Float</span><span class="o">.</span><span class="na">parseFloat</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"z_scaling"</span> <span class="o">)</span> <span class="o">);</span>
<span class="n">transformation_model</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"transformation_model"</span> <span class="o">);</span>
<span class="n">imglib_container</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"imglib_container"</span> <span class="o">);</span>
<span class="c1">//Parameters for difference of mean !!Comment out for Difference of Gaussian!!</span>
<span class="kt">int</span> <span class="n">radius1</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"radius1"</span> <span class="o">)</span> <span class="o">);</span>
<span class="kt">int</span> <span class="n">radius2</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"radius2"</span> <span class="o">)</span> <span class="o">);</span>
<span class="kt">float</span> <span class="n">threshold</span> <span class="o">=</span> <span class="nc">Float</span><span class="o">.</span><span class="na">parseFloat</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"threshold"</span> <span class="o">)</span> <span class="o">);</span>
<span class="c1">//Parameters for difference of gaussian !!Comment out for Differnence of Mean!!</span>
<span class="c1">//float initial_sigma = Float.parseFloat( System.getProperty( "initial_sigma" ) );</span>
<span class="c1">//float threshold_gaussian = Float.parseFloat( System.getProperty( "threshold_gaussian" ) );</span>
<span class="c1">//注册参数</span>
<span class="n">registration_algorithm</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"registration_algorithm"</span> <span class="o">);</span>
<span class="n">type_of_registration</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"type_of_registration"</span> <span class="o">);</span>
<span class="n">interest_points_channel_0</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"interest_points_channel_0"</span> <span class="o">);</span>
<span class="n">fix_tiles</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"fix_tiles"</span> <span class="o">);</span>
<span class="n">map_back_tiles</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"map_back_tiles"</span> <span class="o">);</span>
<span class="n">transformation</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"transformation"</span> <span class="o">);</span>
<span class="n">model_to_regularize_with</span> <span class="o">=</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"model_to_regularize_with"</span> <span class="o">);</span>
<span class="kt">float</span> <span class="n">lambda</span> <span class="o">=</span> <span class="nc">Float</span><span class="o">.</span><span class="na">parseFloat</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"lambda"</span> <span class="o">)</span> <span class="o">);</span>
<span class="kt">int</span> <span class="n">allowed_error_for_ransac</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span> <span class="s">"allowed_error_for_ransac"</span> <span class="o">)</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">xml</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">current_xml</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"label="</span> <span class="o">+</span> <span class="n">label_interest_points</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"timepoints="</span> <span class="o">+</span> <span class="n">process_timepoint</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"illuminations="</span> <span class="o">+</span> <span class="n">process_illumination</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"angles="</span> <span class="o">+</span> <span class="n">process_angle</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"type_of_registration="</span> <span class="o">+</span> <span class="n">type_of_registration</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"type_of_detection="</span> <span class="o">+</span> <span class="n">type_of_detection</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"dir="</span> <span class="o">+</span> <span class="n">dir</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"pattern_of_spim="</span> <span class="o">+</span> <span class="n">模式</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"timepoint="</span> <span class="o">+</span> <span class="n">timepoint</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">角度</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">角度</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"bead_brightness="</span> <span class="o">+</span> <span class="n">bead_brightness</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"subpixel_localization="</span> <span class="o">+</span> <span class="n">subpixel_localization</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">xy_分辨率</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">xy_分辨率</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">z_分辨率</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">z_缩放</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"imglib_container="</span> <span class="o">+</span> <span class="n">imglib_container</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"radius1="</span> <span class="o">+</span> <span class="n">radius1</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"radius2="</span> <span class="o">+</span> <span class="n">radius2</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"threshold="</span> <span class="o">+</span> <span class="n">threshold</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="err">“</span><span class="n">initial_sigma</span><span class="o">=</span><span class="err">”</span><span class="o">+</span><span class="n">initial_sigma</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"threshold_gaussian="</span> <span class="o">+</span> <span class="n">threshold_gaussian</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"registration_algorithm="</span> <span class="o">+</span> <span class="n">registration_algorithm</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"type_of_registration="</span> <span class="o">+</span> <span class="n">type_of_registration</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"interest_points_channel_0="</span> <span class="o">+</span><span class="n">interest_points_channel_0</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"fix_tiles="</span> <span class="o">+</span> <span class="n">fix_tiles</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"map_back_tiles="</span> <span class="o">+</span> <span class="n">map_back_tiles</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"transformation="</span> <span class="o">+</span> <span class="n">transformation</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"model_to_regularize_with="</span> <span class="o">+</span> <span class="n">model_to_regularize_with</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"lambda="</span> <span class="o">+</span> <span class="n">lambda</span> <span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span> <span class="s">"allowed_error_for_ransac="</span> <span class="o">+</span> <span class="n">allowed_error_for_ransac</span> <span class="o">);</span>
<span class="c1">//activate cluster processing</span>
<span class="no">IJ</span><span class="o">.</span><span class="na">run</span><span class="o">(</span><span class="s">"Toggle Cluster Processing"</span><span class="o">,</span> <span class="s">"display_cluster"</span><span class="o">);</span>
<span class="c1">//interest point detection</span>
<span class="no">IJ</span><span class="o">.</span><span class="na">run</span><span class="o">(</span><span class="s">"检测注册兴趣点"</span><span class="o">,</span>
<span class="s">"select_xml="</span> <span class="o">+</span> <span class="n">xml_path</span> <span class="o">+</span> <span class="n">xml_filename</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"unique_id="</span> <span class="o">+</span> <span class="n">timepoint</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"process_angle=["</span> <span class="o">+</span> <span class="n">process_angle</span> <span class="o">+</span> <span class="s">"] "</span> <span class="o">+</span>
<span class="s">"process_illumination=["</span> <span class="o">+</span> <span class="n">process_illumination</span> <span class="o">+</span> <span class="s">"] "</span> <span class="o">+</span>
<span class="s">"process_timepoint=["</span> <span class="o">+</span> <span class="n">process_timepoint</span> <span class="o">+</span> <span class="s">"] "</span> <span class="o">+</span>
<span class="s">"xml_output=[Save every XML with user-provided unique id]"</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"processing_timepoint=[Timepoint "</span> <span class="o">+</span> <span class="n">timepoint</span> <span class="o">+</span> <span class="s">"] "</span> <span class="o">+</span>
<span class="s">"type_of_interest_point_detection=["</span> <span class="o">+</span> <span class="n">type_of_detection</span> <span class="o">+</span> <span class="s">"] "</span> <span class="o">+</span>
<span class="s">"label_interest_points="</span> <span class="o">+</span> <span class="n">label_interest_points</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"subpixel_localization=["</span> <span class="o">+</span> <span class="n">subpixel_localization</span> <span class="o">+</span> <span class="s">"] "</span> <span class="o">+</span>
<span class="s">"interest_point_specification_(channel_0)=[Advanced ...] "</span> <span class="o">+</span>
<span class="s">"radius_1="</span> <span class="o">+</span> <span class="n">radius1</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"radius_2="</span> <span class="o">+</span> <span class="n">radius2</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"threshold="</span> <span class="o">+</span> <span class="n">threshold</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"find_maxima"</span><span class="o">);</span>
<span class="c1">//registration based on interest point detection</span>
<span class="no">IJ</span><span class="o">.</span><span class="na">run</span><span class="o">(</span><span class="s">"根据兴趣点注册数据集"</span><span class="o">,</span>
<span class="s">"select_xml="</span> <span class="o">+</span> <span class="n">xml_path</span> <span class="o">+</span> <span class="s">"dataset.job_"</span> <span class="o">+</span> <span class="n">timepoint</span> <span class="o">+</span> <span class="s">".xml "</span> <span class="o">+</span>
<span class="s">"process_angle=["</span> <span class="o">+</span> <span class="n">process_angle</span> <span class="o">+</span> <span class="s">"] "</span> <span class="o">+</span>
<span class="s">"process_illumination=["</span> <span class="o">+</span> <span class="n">process_illumination</span> <span class="o">+</span> <span class="s">"] "</span> <span class="o">+</span>
<span class="s">"process_timepoint=["</span> <span class="o">+</span> <span class="n">process_timepoint</span> <span class="o">+</span> <span class="s">"] "</span> <span class="o">+</span>
<span class="s">"xml_output=[Do not process on cluster] "</span> <span class="o">+</span>
<span class="s">"processing_timepoint=[Timepoint "</span> <span class="o">+</span> <span class="n">timepoint</span> <span class="o">+</span> <span class="s">"] "</span> <span class="o">+</span>
<span class="s">"registration_algorithm=["</span> <span class="o">+</span> <span class="n">registration_algorithm</span> <span class="o">+</span> <span class="s">"] "</span> <span class="o">+</span>
<span class="s">"type_of_registration=["</span> <span class="o">+</span> <span class="n">type_of_registration</span> <span class="o">+</span> <span class="s">"] "</span> <span class="o">+</span>
<span class="s">"interest_points_channel_0="</span> <span class="o">+</span> <span class="n">interest_points_channel_0</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"fix_tiles=["</span> <span class="o">+</span> <span class="n">fix_tiles</span> <span class="o">+</span> <span class="s">"] "</span> <span class="o">+</span>
<span class="s">"map_back_tiles=["</span> <span class="o">+</span> <span class="n">map_back_tiles</span> <span class="o">+</span> <span class="s">"] "</span> <span class="o">+</span>
<span class="s">"transformation="</span> <span class="o">+</span> <span class="n">transformation</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"regularize_model "</span> <span class="o">+</span>
<span class="s">"model_to_regularize_with="</span> <span class="o">+</span> <span class="n">model_to_regularize_with</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"lamba="</span> <span class="o">+</span> <span class="n">lambda</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span>
<span class="s">"allowed_error_for_ransac="</span> <span class="o">+</span> <span class="n">allowed_error_for_ransac</span><span class="o">);</span>
<span class="cm">/* 关闭 */</span>
<span class="n">运行时</span><span class="o">.</span><span class="na">退出</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span></code></pre></figure>
*注意注册bash执行3个宏命令。*
- 切换集群处理 - 激活集群处理,使集群特定的注册参数可用
- 检测注册兴趣点 - 检测用于注册的珠子或样本特征
- 基于兴趣点注册数据集 - 使用检测到的兴趣点进行实际注册
`registration_<number>.job`脚本通过`submit_jobs` bash提交到集群
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
<span class="sb">`</span><span class="nb">ls</span> <span class="k">${</span><span class="nv">1</span><span class="k">}</span> | <span class="nb">grep</span> <span class="s2">".job$"</span><span class="sb">`</span>中的文件
做
bsub <span class="nt">-q</span> short <span class="nt">-n</span> 1 <span class="nt">-W</span> 00:15 <span class="nt">-R</span> rusage[mem<span class="o">=</span>50000] <span class="nt">-R</span> span[hosts<span class="o">=</span>1] <span class="nt">-o</span> <span class="s2">"out.%J"</span> <span class="nt">-e</span> <span class="s2">"err.%J"</span> <span class="k">${</span><span class="nv">1</span><span class="k">}</span>/<span class="nv">$file</span>
完成</code></pre></figure>
注册结果是原始数据目录中的 10 个 XML 文件,每个时间点一个:
dataset.job_1.xml dataset.job_10.xml dataset.job_2.xml dataset.job_3.xml dataset.job_4.xml dataset.job_5.xml dataset.job_6.xml dataset.job_7.xml dataset.job_8.xml dataset.job_9.xml
## 合并 XML
每个时间点的 XML 需要合并为单个输出 XML。这可以在集群运行的任何点完成,即并非所有 XML 都需要存在来执行合并,并且合并可以执行多次。然而,等待所有每个时间点的 XML 创建完毕是有意义的。
合并步骤在 *master*' 中有一个特定参数
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nv">merge_xml</span><span class="o">=</span><span class="k">${</span><span class="nv">job_directory</span><span class="k">}</span><span class="s2">"define_xml/merge_xml.bsh"</span> <span class="c"># 脚本</span></code></pre></figure>
`create-merge-jobs` bash script
```shell
#!/bin/bash
source /projects/tomancak_lightsheet/Valia/Valia/new_pipeline/master
job="$jobs_xml/merge.job"
echo $job
echo "#!/bin/bash" > "$job"
echo "$XVFB_RUN -a $Fiji \
-Dxml_path=$dir \
-Dxml_filename=$xml_filename \
-- --no-splash $merge_xml" >> "$job"
chmod a+x "$job"
创建 merge.job 将使用 Fiji 在集群节点上执行 merge_xml.bsh
import ij.IJ;
import ij.ImagePlus;
import java.lang.Runtime;
import java.io.File;
import java.io.FilenameFilter;
runtime = Runtime.getRuntime();
System.out.println(runtime.availableProcessors() + " cores available for multi-threading");
xml_path = System.getProperty( "xml_path" );
xml_filename = System.getProperty( "xml_filename" );
System.out.println( "directory=" + xml_path );
IJ.run("Merge Cluster Jobs",
"directory=" + xml_path + " " +
"filename_contains=job_ " +
"filename_also_contains=.xml " +
"display " +
// "delete_xml's " +
"merged_xml=registered_" + xml_filename);
/* shutdown */
runtime.exit(0);
merge.job 应在集群上以交互模式执行(参见here)。
The result of the merge is registration_dataset.xml.这是注册管道的最终产品。注册结果可以使用BigDataViewer查看
提示和技巧
- 合并后可以删除每个时间点的 XML 文件。
- 无论是否删除每个时间点文件,都可以通过重新运行 merge.job 添加新的每个时间点 XML
注册
