在二维图像上,把一个复杂的星系图像看成是一组以椭圆形轮廓描述的等光度线(Isophote;类比等高线)的组合,然后再通过给椭圆增加傅立叶项获得更逼真星系图像描述的方法被称作Isophotal Analysis,是把星系图像压缩成一组一维轮廓信息的非常返璞归真的算法。这个算法非常的上古,70年代就有雏形,随后随着IRAF数据分析环境下、美国空间望远镜科学中心(STScI)的科学家写的STSDAS/Ellipse工具包走入了“千家万户”。随着IRAF逐渐退出历史舞台,这个算法也被带入了Python时代,但效率和表现因为各种原因,一直反而不如上古代码。
在今天,虽然各种Fancy的二维模型拟合方法早已普及,这种“原始”工具依然大有用途:不依赖于非物理的描述星系的轮廓模型假设、不需要在建模的时候反复进行点扩散函数二维卷积让这个算法在今天HSC、Euclid、Rubin的时代依然非常适合进行星系低面亮度测光(当然还适合做很多近邻星系的形态分析:比如判断星系是否有棒结构、是否有外围的盘结构轮廓变化,等等),所以,还是值得改进的。
寒假里,在Claude和Codex两位助手的帮助下,按照自己的品味从头写了一个:在比较逼真的仿真星系图像(1000x1000以上像素、有噪声、中心有仿真PSF卷积、星系有多个几何和径向轮廓不同的成分)上,新程序实现了比现在最常用的Python算法快15-20倍以上的效率提升(图二里最上面那一条是现有Python算法的,这个星系是个比较麻烦的案例,因为新算法更聪明、收敛得快,所以获得了40倍效率提升和更好的结果)、并且获得了更稳定的数值表现、同时实现了更丰富的功能、能够提供更多的诊断信息,等等。还有更多的改进空间,但我已经基本满意了。效率上应该是已经超过了IRAF/ELLIPSE (IRAF使用SPP = Subset Preprocessor Language写的,这是一种效率和语法上都介于Fortran和C之间的上古语言),功能也丰富的多了。
给这个算法起了个名字,叫ISOphote on STERoid,ISOSTER,开源在了我们课题组的Github组织:Massive Sea Ottters (大质量海獭)上。
这个效率提升意味什么?我和我的合作未来一年之内可能需要在天文系的计算集群和美国能源部NERSC的算力上对上百万个星系的多波段图像进行分析。即便在真实的、更复杂的图像上表现会没那么理想,但10倍的效率提升带来的经费节省和科学上的实效也是肉眼可见的。
这是我认真学习Agentic Coding后按照比较“规范”的做法:有CLAUDE.md规则、有Skill支持、Spec-driven、有完整的测试(unit tests + benchmark + real galaxy demo)覆盖,做的第一个小项目,主要还是为了在实践中学习。目前的感受是,在天文图像数据处理这种偏小众的工作里,我还是很有用的 [笑cry],Claude和Codex对算法和软件开发的掌握可以当我爷爷,但是对“怎么才能再提高一点儿”和“如何定义成功”的判断上,**目前**还是不及我的。
当然,这只是一个工具开发的小项目。通过这个时间,我很确定即便只用现在已有的模型和工具,我们还可以玩得大得多。
