【问题标题】:FSL - Can I set the path within an fsf file (program setup file) to current working directory?FSL - 我可以将 fsf 文件(程序设置文件)中的路径设置为当前工作目录吗?
【发布时间】:2021-07-25 06:16:28
【问题描述】:

我正在执行 MRI 分析,并编写了一个脚本,循环遍历每个对象的所有扫描,下一步是运行一个名为 feat 的命令,可以在下面的编码块末尾看到该命令。

#! /bin/sh
path=~/rj82/james_folder/data_copy/
cd $path

# Loop through the MND and Control directories
for directory in * ; do
cd $path
cd $directory

# Loop through each subject in each directory
for subject in ??? ; do
cd $path/$directory/$subject

# Loop through each scan for each subject
for scan in MR?? ; do
cd $path/$directory/$subject/$scan

# Run feat on each scan
feat design.fsf

cd ..

done
done
done

您还将看到 feat 需要一个 design.fsf 文件,该文件设置了专长的参数。为了制作这个文件,我使用了一次 MRI 扫描作为输入数据。

下面我附上了design.fsf 代码中的区域,这些区域显示了用于创建文件的文件的路径。

# 4D AVW data or FEAT directory (1)
set feat_files(1) "/projects/rj82/james_folder/data_copy/mnd/002/MR02/fmri/fmri_data"

# Add confound EVs text file
set fmri(confoundevs) 0

# Session's alternate reference image for analysis 1
set alt_ex_func(1) "/projects/rj82/james_folder/data_copy/mnd/002/MR02/fmri_ref/fmri_ref_brain"

# B0 unwarp input image for analysis 1
set unwarp_files(1) "/projects/rj82/james_folder/data_copy/mnd/002/MR02/fmaps/fmap_rads"

# B0 unwarp mag input image for analysis 1
set unwarp_files_mag(1) "/projects/rj82/james_folder/data_copy/mnd/002/MR02/fmaps/mag_e1_brain"

# Subject's structural image for analysis 1
set highres_files(1) "/projects/rj82/james_folder/data_copy/mnd/002/MR02/t1/t1_brain"

如果我运行脚本(第一个编码块)feat 将正确运行,但是由于design.fsf 文件中的路径仅指一次扫描,它只会在这一次扫描中连续运行feat。

由于每个主题中的子目录和文件具有相同的名称,我想将路径 "/projects/rj82/james_folder/data_copy/mnd/002/MR02 替换为脚本中的当前目录(第一个编码块),同时保留结尾部分(例如 fmri/fmri_data")允许我循环遍历每个主题并运行壮举。

我尝试设置 path=pwd 并用 "$path/fmri/fmri_data" 替换上面的路径,这不起作用,以及完全删除 "/projects/rj82/james_folder/data_copy/mnd/002/MR02 部分,因为我希望它只使用当前目录,但这也没有不行。两者的错误信息相同:

/bin/mkdir: cannot create directory ‘/fmri’: Permission denied
    while executing
"fsl:exec "/bin/mkdir -p $FD" -n"
    (procedure "firstLevelMaster" line 22)
    invoked from within
"firstLevelMaster $session"
    invoked from within
"if { $done_something == 0 } {

    if { ! $fmri(inmelodic) } {
       if { $fmri(level) == 1 } {
              for { set session 1 } { $session <= $fmri(mult..."
    (file "/usr/local/fsl/6.0.4/fsl/bin/feat" line 390)

【问题讨论】:

  • 每个扫描目录下都有design.fsf的副本吗?
  • @Armali 感谢您的回复!当我问这个问题时,没有,但我现在在每个扫描目录中都放了一份 design.fsf 的副本。在需要路径的部分中,我只放置了包含文件并且在所有扫描中都相同的子目录名称。
  • 你能显示一个示例行set feat_files(1) … 现在看起来吗?
  • 所以为了让它运行,我需要类似set feat_files(1) "~/rj82/james_folder/data_copy/mnd/002/MR02/fmri/fmri_data" 我的脚本导航到每个单独的主题并扫描,所以我将设计文件更改为:set feat_files(1) "/fmri/fmri_data"

标签: bash windows-subsystem-for-linux


【解决方案1】:

我无法让我想要实现的目标发挥作用,因此我循环执行与上述相同的操作,将我的 design.fsf 文件复制到每个目录中,并使用 sed 对其进行编辑以获得正确的路径。

#! /bin/sh
path=~/rj82/james_folder/data_copy/
cd $path

# Loop through the MND and Control directories
for directory in * ; do
cd $path
cd $directory

# Loop through each subject in each directory
for subject in ??? ; do
cd $path/$directory/$subject

# Loop through each scan for each subject
for scan in MR?? ; do
cd $path/$directory/$subject/$scan

# Copy template design.fsf into each scan folder
cp $path/../design.fsf design.fsf

# Change design.fsf file and replace the directory used 
# to create the template with the current directory
current=$directory/$subject/$scan
sed -i "s|mnd/002/MR02|$current|g" design.fsf

# Run feat using custome design.fsf file
feat design.fsf

cd ..

done
done
done

【讨论】:

    【解决方案2】:

    我的脚本导航到每个单独的主题并进行扫描,因此我将设计文件更改为:set feat_files(1) "/fmri/fmri_data"

    这是个好主意,但为了创建相对路径,您还必须删除前导 /;其中还提示错误消息cannot create directory ‘/fmri’

    .fsf 文件中使用真正的相对路径,还应该可以通过调用feat /<i>path</i>/design.fsf 来使用公共design.fsf

    【讨论】:

    • 我改变了它,它克服了我遇到的最后一个错误,但现在得到了这个:child process exited abnormally while executing "fsl:exec "${FSLDIR}/bin/feat ${fsfroot}.fsf -D $FD -I $session -init" -b 10 -N feat0_init -l logs " (procedure "firstLevelMaster" line 145) invoked from within "firstLevelMaster $session" invoked from within "if { $done_something == 0 } { if { ! $fmri(inmelodic) } { if { $fmri(level) == 1 } { for { set session 1 } { $session &lt;= $fmri(mult..." (file "/usr/local/fsl/6.0.4/fsl/bin/feat" line 390)
    • 在报告日志中显示:FATAL ERROR ENCOUNTERED: COMMAND: /usr/local/fsl/6.0.4/fsl//bin/fsl_sub -T 10 -l logs -N feat0_init /usr/local/fsl/6.0.4/fsl//bin/feat /projects/rj82/james_folder/data_copy/controls/C01/MR01/fmri/fmri_data.feat/design.fsf -D /projects/rj82/james_folder/data_copy/controls/C01/MR01/fmri/fmri_data.feat -I 1 -init ERROR MESSAGE: child process exited abnormally END OF ERROR MESSAGE
    • 我想我可以尝试制作单独的设计文件并这样做,除非您有任何其他想法?
    • 错误信息有点难以阅读,我看不出具体的错误原因,但 design.fsf 路径看起来很奇怪 - 你是否更改了 feat design.fsf 命令行,如果是,如何?
    • 感谢您的帮助 Armali,我没有更改专长命令行。不知道为什么它不工作,但我设法通过循环和编辑每次扫描的 design.fsf 文件使其工作
    猜你喜欢
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    • 1970-01-01
    • 2017-11-16
    相关资源
    最近更新 更多