JUNO数据模型设计和相关软件开发 李腾 黄性涛 山东大学 2015.8 合肥 2018/12/2
目录 JUNO离线软件简介 数据模型设计 总结 基于ROOT的数据模型设计方案 智能指针SmartRef 事例导航器EvtNavigator 延时加载特性 工具软件XmlObjDesc 总结 2018/12/2
JUNO离线软件简介 JUNO离线软件由以下部分构成: 外部库软件:广泛应用于高能物理实验的工具和库 JUNO相关软件包:模拟、重建等 SNiPER:用于非对撞高能物理的新底层框架 2018/12/2
数据模型 什么是事例数据模型? 数据模型指在粒子物理实验离线数据处理过程中,事例在不同处理阶段所需处理或生 成的相关信息的组织方式 定义数据在内存/文件中存在的格式 以C++对象形式存在 Data Store 输入/输出 数据模型(Transient) 文件 GenEvent SimEvent RecEvent PhyEvent 获取/修改/存放 用户算法 Recon- struction Generator Simulation Analysis 2018/12/2
基于ROOT的数据模型设计方案 JUNO数据模型基于ROOT开发 在高能物理实验中,ROOT功能强大,应用广泛 输入/输出(ROOT I/O) 运行时类型信息(RTTI) 画图(Draw) 容器支持(ROOT Collections) …… 其它优势: 数据模型类的Streamer功能可以简化框架的输入输出服务 支持数据模型类的版本进化 内存和文件中可以用同一套数据模型,不需要转换 2018/12/2
数据模型设计方案 数据模型设计方案: 所有数据模型类间接或直接由 TObject派生 每个过程定义自己的Header和 Event类型 EvtNavigator关联各个Header 2018/12/2
Header和Event分层的设计 每个过程的数据模型由两部分组成: 将能够反映事例的关键信息(Tag)保存到 Header中 HeaderObject EventObject 分别保存事例的元信息和完整的数据. 将能够反映事例的关键信息(Tag)保存到 Header中 提升事例筛选的速度:仅将Header读入内存并判断 是否读入Event Header和Event之间的关联由智能指针 SmartRef实现 2018/12/2
智能指针SmartRef: 动机 设计SmartRef的动机: 实现数据模型对象之间的关联 希望可以实现关联对象的延时加载功能 普通的C++指针或智能指针只能实现内存中的对象关联,无法实现文件中复杂的关联: 希望可以实现关联对象的延时加载功能 实现上述Header及Event分离的设计并实现快速筛选 简化输入服务 文件 文件 Obj A Obj B Obj A Obj B 文件1 文件2 Obj A Obj B Obj C Obj C Case A: 多个对象关联一个对象 Case B: 互相/循环关联 Case C: 关联对象存入不同文件 2018/12/2
智能指针SmartRef: 设计方案 设计方案: ROOT为对象关联提供了一个解决方案TRef,但有一些缺陷和限制:延时加载速度慢、 占用空间大等 SmartRef基于ROOT中TRef的功能并重新设计 保留TRef关联对象的功能,重新设计并实现延时加载、引用计数等功能 SmartRef结构: SmartRef由TObject派生 可关联EventObject类型的对象 关键变量:fUniqueID(整型),fPID(TProcessID) 2018/12/2
智能指针SmartRef: 工作原理 SmartRef关联对象的原理: SmartRef利用全局统一标示符(Universally Unique IDentifier, UUID)实现对象在内存和文件 中的关联 在一个ROOT相关进程里,ROOT会创建TProcessID对象,其内部存有一个UUID TProcessID被创建的同时,一个全局指针数组和一个全局整形变量会被同时创建 TProcessID (UUID) ObjNum 全局指针数组 …… 2018/12/2
智能指针SmartRef: 工作原理(续) SmartRef利用全局统一标示符(Universally Unique IDentifier, UUID)实现对象在内存和文件 中的关联 当一个SmartRef和一个EventObject建立关系时,SmartRef中的fPID就会指向当前的TProcessID 同时全局整型变量会自加1,并分别赋值给SmartRef和EventObject的fUniqueID 同时一个指向这个EventObject的指针会被置入这个全局数组的相应位置 TProcessID (UUID) ObjNum ++ 全局指针数组 …… SmartRef fPID fUniqueID EventObject fUniqueID 2018/12/2
智能指针SmartRef: 工作原理(续) SmartRef和EventObject的关系就此建立 当用户通过SmartRef访问EventObject的时候,会通过SmartRef中的fPID和fUniqueID这两个量在指 针数组中找到相应的位置,并获得EventObject I/O过程: SmartRef和EventObject被写入文件时,TProcessID会同 时被存入 保存有SmartRef和EventObject的文件被打开时, TProcessID会被读入内存,并重新创建指针数组 EventObject读入内存后会被自动置入指针数组 SmartRef和EventObject的关系重新被建立 2018/12/2
基于SmartRef的应用: EvtNavigator EvtNavigator将同一事例在不同处理阶段的数据模型利用SmartRef关联起来 用户可以用路径访问EvtNavigator,并获取事例在任意处理阶段的信息 EvtNavigator将单独保存到数据文件一个TTree中,并作为数据输入输出和访问的主线 EvtNavigator Get from data store Access with data path GenHeader SimHeader CalibHeader RecHeader PhyHeader 2018/12/2
基于SmartRef的延时加载: 动机 由于JUNO高精度的要求,单个事例包含的信息可能十分庞大 一次性读入整个事例会带来较大的磁盘传输压力 延时加载指输入服务不主动输入被SmartRef关联的对象,而会延时到用户主动访 问其时才会自动加载的功能 配合数据模型Header和Event分层的设计,可令用户在不加载全部事例信息的情况下完成事例筛 选 配合事例导航器EvtNavigator的设计,在面临有相关联的多输入流的情况时,也可以极大得简化 输入服务和内存管理系统的设计难度 配合SmartRef,ROOT和输入服务实现延时加载机制 2018/12/2
输入服务概览 JUNO ROOT输入服务的简要构造: RootInputSvc:输入服务的用户接口,管理RootInputStream InputElementKeeper:负责提供延时加载机制 2018/12/2
延时加载工作原理 延时加载工作原理: SmartRef关联的对象被写入TTree时,它们的UniqueID会被同时记录到表中并被写入文件 对应的TProcessID中的UUID会被写入文件元信息 输入服务初始化时,InputElementKeeper模块会读入输入文件的元信息,并建立一个UUID与文 件的映射表 ROOT文件 InputElementKeeper Map: UUID --- 文件 TTree UniqueID 表 TTree UniqueID 表 TTree UniqueID 表 File Meta Data (UUIDs) 2018/12/2
延时加载工作原理(续) 延时加载工作原理: 用户访问SmartRef时,SmartRef首先在内存中查询,如果未找到则启动延时加载机制 SmartRef访问InputElementKeeper,根据UUID查找关联对象所在的文件 InputElementKeeper打开文件,加载Unique ID表,查询关联对象所在文件中的位置 读入关联对象,完成加载 ROOT 输入服务 访问 查询对象 对象未加载 访问输入文件 SmartRef InputElementKeeper 输入文件 加载ID表格 成功加载 2018/12/2
XmlObjDesc: 使用Xml定义数据模型 不同的数据模型类由不同的用户定义 代码的统一是比较重要的 需要大量手动的重复性工作(getter, setter) 数据模型类的实现遵循一定规则,无需用户关心和实现 我们开发了XmlObjDesc(XOD), 帮助用户使用XML定义数据模型 数据模型开发者可以只关心数据模型的内容并书写XML文件,无需关心代码实现 XOD解析XML文件,并依据我们制定的规则产生C++代码 2018/12/2
Document Type Definition XmlObjDesc: 结构 XOD由python实现,按功能可分为XML解析器和代码产生器: *.h (C++ header) generate Code Generator Template header.tpl … genClasses.py genLinkDef.py *.cc (C++ source) model genSrc.py genPackage.py …… *LinkDef.h Document Type Definition xdd.dtd, xld.dtd… Xml Parser Xml files validation parse 2018/12/2
总结 总结 简要介绍了基于ROOT的JUNO数据模型设计 详细介绍了SmartRef智能指针及其延时加载的特性 介绍了工具XmlObjDesc 2018/12/2