用bash直接提取freesufer统计数据

f78f18a5e9f19818ddc75a09be7f1d13.png

其实很多软件都可以实现,这里介绍一种用bash直接提取统计数据的方法,比asegstats2table更灵活,而且效率也有可能更高。

使用asegstats2table

可以直接用freesurfer提供的asegstats2table命令可以提取。

f2652b072ebb9bd3102c98a295c06318.png

很多软件的原理都是调用Freesurfer提供的asegstats2table函数。

某软件1

93a8323cf6876f5a05e33ca3721a8048.png

某软件2

8ce4c35617f1361500dd7a6e3e56728c.png

自己写bash提取

自己写bash可以了解和掌控提取过程,比asegstats2table更灵活,而且效率也可能更高,不需要安装Freesurfer。了解整个过程之后就可以自己写bash批量提取需要的summary stats了。

以皮层下分割的统计文件aseg.stats为例

1. 了解stat文件

皮层下分割的统计保存在aseg.stats中,这其实是一个普通的文本文件。可以从这个文件中获得诸如左海马体的体积和它的平均强度等信息。

进入stats文件夹后使用less查看该文件(按q退出)

cd $SUBJECTS_DIR/004/stats
less aseg.stats

在文本文件的头部,会有关于运行的命令、使用的版本、运行的用户和时间等信息。

4cc51c570ea91ca2646a2ef54c77cdc7.png

在这之后,有关于整个大脑的体积信息。

1655048caabfe0862e7463f53b78533e.png

(在这里看到了Euler数的影子)

往期推荐

FreeSurfer数据质量指标:欧拉数Euler Number

这个文件的下一个部分定义了表字段名和单位,可以看到表格中每个条目的

  • Segmentation Id

  • Number of Voxels

  • Volume, Structure Name

  • Intensity normMean

  • Intensity normStdDev

  • Intensity normMin

  • Intensity normMax

  • Intensity normRange

363f9ecf6e64e17e73504e367449dbfb.png

ef12ef367e1522a44d284739de4568c6.png

2. 获取一个region的数据

可以使用表中unique的信息,比如StructName,查找到该行,随后输出该行的数据到csv文件即可。

使用linux的函数grep,找到某一行数据(比如Left-Caudate)

grep Left-Caudate ./aseg.stats

就可以获取该行数据

8f2db358dec94770aa98dc4bbdb343ec.png

如果想获取volume的数据(从表头名称可知是第四列数据),使用管道命令|和awk分离出第四列数据。

grep Left-Caudate ./aseg.stats | awk '{print $4}'

ba467e704ad6e4953053789862182398.png

用printf将该值作为float输出到csv文件的单元格中,并且末尾加逗号作为分隔,如果是tsv文件就加table作为分隔。

printf "%g," `grep Left-Caudate ./aseg.stats | awk '{print $4}'` > subcorticalvol.csv

42817a9e2b752a4c2441d629a3b1bf92.png

至此,核心部分就完成了,剩下的就是将region和被试写到循环中。

3. 获取多个region的数据

原理是写一个for循环

这里用以下四个region为例:

  1. Left-Thalamus-Proper

  2. Right-Thalamus-Proper

  3. Left-Caudate

  4. Right-Caudate

首先使用echo添加表头,写入被试信息,再将提取到的数据append到csv文件中。

echo 'Subid,L-thal,R-thal,L-caud,R-caud'>subcorticalvol.csv
printf "%s,"  "sub001" >> subcorticalvol.csv
for x in Left-Thalamus-Proper Right-Thalamus-Proper Left-Caudate Right-Caudate; do
printf "%g," `grep ${x} ./aseg.stats | awk '{print $4}'` >> subcorticalvol.csv
done

c7c971559843f19202ff8fdd54289846.png

4. 获取多个被试多个region的数据

原理也是写一个for循环

echo 'Subid,L-thal,R-thal,L-caud,R-caud'>subcorticalvol.csv
for subj_id in $(ls -d */); do
printf "%s,"  "${subj_id%%//}" >> subcorticalvol.csv
for x in Left-Thalamus-Proper Right-Thalamus-Proper Left-Caudate Right-Caudate; do
printf "%g," `grep ${x} ./${subj_id}/stats/aseg.stats | awk '{print $4}'` >> subcorticalvol.csv
done
echo "">> subcorticalvol.csv
done

7d0c2c267a45736f6153c4c2c0ee8967.png


注意

  • >和>>的区别

  • 在每行完成后需要echo一个换行

  • 在输出subid的时候,如果用${subj_id}多出一个/的话, 用${subj_id%%//}可以去除subid末尾的斜杠。

  • 这里的代码用的是bash。使用 echo"$SHELL"查看当前shell的类型。

参考

https://surfer.nmr.mgh.harvard.edu/fswiki/FsTutorial/AnatomicalROI#Labelfiles

https://www.runoob.com/linux/linux-comm-awk.html

awk 👇

58537782d7b2a223d5c838140728c530.png

166eefe71818f2e185e23fb6286ad150.png

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值