X射线成像
题目背景
在天文X射线观测中,X射线望远镜的观测数据由其CMOS在曝光时间内记录到的所有光子事件的多种信息组成,根据这些信息我们可以测量得到源的位置。但由于以下因素的存在,导致对X射线源的位置探测是较为困难的任务:其一是X射线本底的存在,即使没有源也会在望远镜CMOS上探测到光子事件;其二是由于光学系统的限制,来自源的光子并不会一直落在CMOS上的同一位置,而是会按照特定的概率分布在以该源为中心的一定范围内,这个概率分布被称为点扩散函数(point spread function, PSF)。X射线源探测的目的就是去除本底的干扰,并根据PSF与原始数据分布得出源的位置。
现在考虑一个简单案例,原始数据仅包含所有光子事件的位置信息,本底是在视场内均匀分布的泊松噪声,不考虑望远镜有效面积在视场不同区域的变化,我们也只对源的位置与流量感兴趣。
我们引入如下方法对源位置进行探测,该方法的核心思想是计算视场内每一个像素点上存在源与不存在源的概率之比,若结果超过阈值则认为该处存在源。具体而言,我们需要对每一个像素计算:
该公式解释如下:
\(i\): 对考察像素点周围位于PSF范围内的所有光子事件求和。
\(R\): 若此处存在源,该源的光子流量,在实际计算中通过迭代求解,
\(s\): 与PSF相关的量,具体而言是该事件相对考察像素点的位置在PSF上对应像素处的积分,注意在代码中实际使用的是像素中央点值而非积分值。
\(b\): 先验的本底光子流量,在计算代码中给出固定值。
\(t\): 曝光时间,在计算代码中给出固定值。
PSF分布:二维正态分布,长轴指向视场中央,短轴标准差随到中心距离线性增加,中央处为0.5pixel,最远处为3pixel,偏心率与到中心距离成正比,中央处为0,最远处为0.8,已给出生成不同位置的PSF的代码作为参考。
更多关于本方法的信息可见 https://doi.org/10.1093/mnras/stae1741
文件说明
mock_data.fits:fits格式文件,记录了512*512像素视场内所有光子事件的坐标。
ratio_calculate.py:主要的计算代码文件,读取原始数据进行源探测。
psf_generate.py: 生成对应位置psf的文件,用于参考,输出的psf是归一化的15*15网格,代表位于网格中央的源发出的光子到达周边不同像素的概率。
source_info.fits: 记录了模拟源的实际位置和计数率,实际运行时不需要。
score.py:用于检测结果正确性的脚本文件。
run.sh: 用来运行程序的辅助脚本。
Note
如果你修改了程序的运行方法,如不再使用python进行运行,请修改run.sh
源码下载地址:https://cloud.tsinghua.edu.cn/f/f84ce7e05caa4c12992d/
注:2025年11月7日对源码包进行更新。
运行方法
目标
视场中共有12个模拟源,目前该代码已能探测其位置及流强,要求对其运行速度以及光子流量测量的精确性做出优化。
提示
提前计算一些位置的PSF并作为近似值调用,区域分块并行处理,增加迭代次数以优化流量测量准确性。
记分方式
本题得分分为正确性分数(30%)及性能分数(70%)。
对于正确性分数,我们会运行score.py来检测结果是否正确。具体的检测方法详见score.py。
对于性能分数,我们按照如下方法进行计算:
- 计算你的运行时间相较于最快队伍的运行时间比值:\(x = \frac{\text{最快队伍的运行时间}}{\text{你的运行时间}}\),不难发现:$ 0 < x \leqslant 1$。
- 按照该公式计算你的性能得分百分比:\(70\% * (1 + \frac{1}{2}\log_{10}{x})\)。
优化报告与代码
初赛结束时,需要交一份压缩包,命名格式为队伍编号,来帮助我们判断你们这道题的优化的合法性。要求如下:
-
一份
report.pdf详细说明优化方法 -
一份最终版本的源代码
-
包含提交密码的文本文件