最近接触到一个模拟项目,涉及到滤光片的应用。由于滤光片的有效过滤角度比较小,大角度入射的光线无法过滤。于是需要建模分析,考察达到接收器前滤光片上的光线入射角。从而在原始机械或电路板结构上微调一下滤光片或LED的角度,提高过滤效率。
结构建模已经有初始的stp文件,而且机械结构复杂,所以选择非序列模式。然而探测器面上的光线数据,不管何种探测器类型,detector viewer中始终办法查看该面上接收光线入射角度信息。研究好久终于找到了下面这篇文档:https://community.zemax.com/got-a-question-7/is-an-angle-of-incidence-report-available-in-the-ray-database-viewer-866
这篇文档中提供了一种方案,将每次ray trace结果保存后,通过ray database viewer导出zrd文件中的光线数据。并附带了一个宏文件读取ray database中原始数据,计算打到每个面上的光线入射角度(AOI)。有兴趣的小伙伴可以仔细看一下原文中的算法,同时用到的zpl文件也可以直接下载。
踏破铁鞋终于找到的现成解决方案,虽然说解决了问题的大体,但还是不够满意。我只需要统计打到探测面上的光线AOI,而该算法读取了所有光线的传输路径,计算出了每根光线经过每一个面时的角度信息(分成了无数个seg#,计算前已经将光线能量下限截至于0.001)。
将统计的ray data数量增加到1000条时,总共的数据行数已经超过了一万多行,所以得再想办法删除掉冗余的光线数据。首先的想法是:抓一个软件的同事,帮我看一眼zpl的语句,添几行筛选的定义:只读取comment为“滤波片前面”的光线segment。几个软件的同事们看下来都说语法类似python,但没空帮忙改代码。自己对编程一窍不通,短时间更改zpl语言根本不现实,于是在macro中添加筛选代码的方案只好作罢。
于是又回到了先前的问题上,如何筛选有效的光线segment。 欸?筛选,ray database viewer中不正好有一个apply filter吗?它会不会是问题最偷懒的解法呢?
不会用就查询manual,点击问号, 导到了ray database viewer的详情页,
很接近答案了,具体语句还要到filter string中查询一下。Filter string可以定义NSC中有特定属性的光线,甚至光线segment,此时答案已经很明显了,只要找到合适的filter语句就能删去大量冗余ray data,给我直接导出需要的数据。
Hn: 可筛选出打到n号面上的光线;
X_HITxxx的语句可以更细致地定义所需过滤或筛选出来的光线segment。
到这里,所需解决的问题圆满收工,概括下来就是:
1.建模后ray trace,并保存源文件;2.打开ray database viewer, 筛选最有用的ray和segment;3.打开AOI宏文件计算特定面上入射光的角度。