其实很多软件都可以实现,这里介绍一种用bash直接提取统计数据的方法,比asegstats2table更灵活,而且效率也有可能更高。
使用asegstats2table
可以直接用freesurfer提供的asegstats2table命令可以提取。
很多软件的原理都是调用Freesurfer提供的asegstats2table函数。
某软件1
某软件2
自己写bash提取
自己写bash可以了解和掌控提取过程,比asegstats2table更灵活,而且效率也可能更高,不需要安装Freesurfer。了解整个过程之后就可以自己写bash批量提取需要的summary stats了。
以皮层下分割的统计文件aseg.stats为例
1. 了解stat文件
皮层下分割的统计保存在aseg.stats中,这其实是一个普通的文本文件。可以从这个文件中获得诸如左海马体的体积和它的平均强度等信息。
进入stats文件夹后使用less查看该文件(按q退出)
cd $SUBJECTS_DIR/004/stats
less aseg.stats
在文本文件的头部,会有关于运行的命令、使用的版本、运行的用户和时间等信息。
在这之后,有关于整个大脑的体积信息。
(在这里看到了Euler数的影子)
往期推荐
FreeSurfer数据质量指标:欧拉数Euler Number
这个文件的下一个部分定义了表字段名和单位,可以看到表格中每个条目的
Segmentation Id
Number of Voxels
Volume, Structure Name
Intensity normMean
Intensity normStdDev
Intensity normMin
Intensity normMax
Intensity normRange
2. 获取一个region的数据
可以使用表中unique的信息,比如StructName,查找到该行,随后输出该行的数据到csv文件即可。
使用linux的函数grep,找到某一行数据(比如Left-Caudate)
grep Left-Caudate ./aseg.stats
就可以获取该行数据
如果想获取volume的数据(从表头名称可知是第四列数据),使用管道命令|和awk分离出第四列数据。
grep Left-Caudate ./aseg.stats | awk '{print $4}'
用printf将该值作为float输出到csv文件的单元格中,并且末尾加逗号作为分隔,如果是tsv文件就加table作为分隔。
printf "%g," `grep Left-Caudate ./aseg.stats | awk '{print $4}'` > subcorticalvol.csv
至此,核心部分就完成了,剩下的就是将region和被试写到循环中。
3. 获取多个region的数据
原理是写一个for循环
这里用以下四个region为例:
Left-Thalamus-Proper
Right-Thalamus-Proper
Left-Caudate
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
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
注意
>和>>的区别
在每行完成后需要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