# Tracer **Repository Path**: yaozhang-pku/tracer ## Basic Information - **Project Name**: Tracer - **Description**: Tracer for AET reconstruction. Visualize the model and trace the atoms. - **Primary Language**: Unknown - **License**: Artistic-2.0 - **Default Branch**: master - **Homepage**: https://gitee.com/yaozhang-pku/tracer/wikis/pages - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-03-25 - **Last Updated**: 2023-04-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 简介 --- `Tracer` 是依赖 MATLAB R2021a 的 APP designer开发,用于对 AET(Atomic Electron Tomography,原子断层扫描)结果进行展示和示踪操作的应用程序。 本手册分面向开发人员进行介绍。面向使用者的介绍请至项目[维基网页](https://gitee.com/yaozhang-pku/tracer/wikis/pages)。 当前的 `Tracer` 为开发版本。 # 应用开发 --- ## 简介 本应用使用面向对象设计模式,基于 MVC 架构搭建。因此以下以将根据 MVC 三部分进行介绍对象属性与方法以及对象职责。 `Tracer` 由 `main` 和 `settings` 两个窗口组成,`Tracer.mlapp` 充当上下文类的作用,使用 `container` 组织架构。 ## 模型 Model 存放在 `.\model\` 类文件夹中。`main` 窗口中,原子模型由 `TracerAtomModel` 类表示,体积模型由 `TracerVolumeModel` 类表示,数据模型由 `TracerDataModel` 类表示。`settings` 窗口中,模型由 `TracerSettingsModel` 类表示。 以下是简要的示意图 ```css .\model |--- TracerModel.m # 数据模型 |--- TracerAtomModel.m # 原子模型 |--- TracerVolumeModel.m # 体积模型 |--- TracerParaModel.m # 参数模型 |--- TracerSettingsModel.m # 设置模型 ``` ### 数据模型 `TracerModel`,继承自 `handle` 类,抽象类。 1. 包含公共方法 * `newObj = clone(obj)`:递归克隆,返回克隆后的对象 `newObj`。 2. 包含抽象方法 * `rot(obj)`:旋转操作。 * `slice(obj)`:切片操作。 * `exert_roi(obj)`:选择 ROI 操作。 ### 原子模型 `TracerAtomModel`,继承自 `TracerModel` 类。 1. 包含属性 * `atom_pos`:[n x 3] 矩阵,表示原子坐标(包括删除的原子)。 * `atom_type`:[n x 1] 矩阵,表示原子类型。 * `atom_state`:[n x 2] 矩阵,第一列表示原子 tracing 状态,正常 - 3,增加 - 1,未定增加 - 2;第二列表示原子删除状态,正常 - 1,删除 - 0。 2. 包含公共方法 * `rot(obj, quat, newObj)`:根据四元数 `quat` 旋转原子坐标,得到旋转后的原子坐标,并赋给新对象 `newObj`。 * `slice(obj, zmin, zmax, newObj)`:将对象 `obj` 中的原子进行切片,保留在 `zmin` 到 `zmax` 之间的原子,并赋给新对象 `newObj`。 * `exert_roi(obj, roi, newObj)`:将对象 `obj` 中的原子按照 `roi` 进行选择,并赋值给新对象 `newObj`。 * `add_atom(obj, pos, type, state)`:增加原子。 * `delete_atom(obj, ind)`:将序号为 `ind` 的原子的删除状态设置为 0。 * `recover_atom(obj, ind)`:将序号为 `ind` 的原子的删除状态设置为 1。 ### 体积模型 体积模型,继承自 `TracerModel` 类。 ## 应用逻辑 ### 输入处理 ### 模型处理 `tracer` 采用 `pipeline` 的思想进行设计,对输入经过一系列 `action` 组成的 `action list` 获得输出的模型。 ```css input --- rotate --- slice --- main output | |--- roi --- side output ``` `action list` 的变化用链表存储,并有一个指针指向当前的 `action list`,每一个 `action` 发生改变后,其后的所有 `action` 影响的对象都需要重新计算。 这些 `action` 对应的 `TracerAtomModel` 对象如下所示: ```css inpAtomModel --- rotAtomModel --- slcAtomModel | |--- roiAtomModel ``` ### 旋转逻辑 * 正常旋转:用户拖动旋转对应的 `Slider` 即可进行旋转操作,或者在 `Spinner` 中填写具体角度数据。旋转固定按 Z-Y-X 的方式进行。 * 用户输入旋转命令后,程序按如下方式进行运行 ```css 读取旋转数据 --- TracerParaModel 发生中的角度信息改变 --- 广播 'rot_ang_changed' 事件 --- app 接收事件并调用 app.rot_ang_changed_callback 函数 --- 更新所有坐标轴对象 ``` ### 添加原子逻辑 ``` user controller user | AddButtonPushed | | | --------------> | (single click) | | | -------------> | | | | ```