Д - Научная библиотека НИЯУ МИФИ

реклама
Создание универcального пакета импорта данных в формат ROOT
Д.А. РОМАНОВ, Г.А. НИГМАТКУЛОВ
Национальный исследовательский ядерный университет «МИФИ»
СОЗДАНИЕ УНИВЕРCАЛЬНОГО ПАКЕТА ИМПОРТА ДАННЫХ В ФОРМАТ ROOT
Разработан универсальный конвертер предварительно отобранных данных в промежуточный формат разметки
(ML) для их компьютерной обработки при помощи пакета ROOT и последующего физического анализа. Для введения
новых (более «жестких») физических ограничений на данные достаточно написания и использования макросов для
программы ROOT без их нового отбора из исходных данных.
Нами разработан [1] пакет для физического анализа данных LaCor (Lambda Correlations).
Пакет предназначается для работы с данными эксперимента SELEX, проведенного на Σ-гиперонном пучке с энергией 600 ГэВ тэватрона (Лаборатория им. Ферми) для изучения свойств
очарованных барионов [2]. LaCor написан на С++ с использованием библиотек пакета ROOT и
обеспечивает гибкую организацию рабочей среды физического анализа, оптимизирован для
работы в сетях GRID и имеет модульную структуру. Это делает пакет достаточно универсальным,
чтобы использовать его не только для анализа данных эксперимента SELEX, но и в других
экспериментах. Так, на базе пакета был разработан уникальный лабораторный практикум по
адронной спектроскопии [3]. Дальнейшее развитие пакета предполагает проведение физического
анализа данных, которые изначально могут быть записаны в произвольных форматах, что требует
создания унифицированного средства для работы с разными типами данных, а также возможности
перевода информации из одного формата в некий универсальный формат, выбор которого
подробно описан ниже.
Возможность такого преобразования обусловлена схожестью принципов сохранения
данных. Информация, получаемая в различных экспериментах, проводимых в области
ускорительной физики, чаще всего хранится в виде «событий» – логически разделенных записей.
Это связано с тем, что чтение и запись данных с детекторов обычно проводится под управлением
триггера, сигнализирующего о возможности происхождения исследуемого физического события.
Совокупность всей статистики эксперимента может занимать большой объем на носителях
(десятки терабайт и более), соответственно, может требоваться длительное время для полной их
обработки. В связи с этим часто результаты обработки сохраняют в виде других (отличных от
исходных) наборов данных со своими форматами. Поэтому формат записи такого события в
предоставляемых пользователю для физического анализа наборе данных может сильно
различаться. В событии может содержаться информация о срабатывании детекторов или уже
пересчитанные данные о треках частиц, или просто набор кинематических характеристик частиц.
Существующие объемы данных экспериментов в области ускорительной физики, в итоге,
записаны в совершенно разных форматах: DST-файлах, текстовых таблицах, NTUPLE и так далее.
Поскольку речь идет о больших объемах данных, то чаще – это бинарные форматы. Логически
информация может представляться также в разном виде: с помощью объектов и графов, в виде
реляционных моделей [4] и т.д.
Сходным остается то, что события между собой не связаны (т.е. отдельно взятое событие не
заключает в себе части данных предыдущего или следующего события), так как лежащие в их
основе физические события разделены во времени. Общие переменные имеют сквозное
вхождение, то есть сохраняются для групп из многих событий, например, карта магнитного поля,
которая берется для нескольких запусков пучка ускорителя. При этом такие сквозные параметры
обычно отделены логически или физически от записей событий (т.е. лежат в других файлах или
базах данных).
В настоящее время широко распространен пакет ROOT, разработка которого берет начало с
середины 1990-х годов в CERN [5]. Пакет поддерживает собственный формат файлов (тут и
далее – .root файлы), в совокупности всех своих инструментов по работе с файлами ROOT
позволяет обрабатывать, анализировать, моделировать, визуализировать физические события и
проводить обсчет больших массивов данных (десятки гигабайт, а с расцветом компьютерной
техники и технологий – десятки и сотни терабайт данных). В современном мире пакет ROOT
получил широкое распространение как в обработке данных, полученных на ускорителях, так и
данных, получаемых в астро- и космофизических экспериментах.
Основными особенностями формата .root файлов являются:
 гибкая универсальная структура, позволяющая хранить объекты, произошедшие от
базового суперкласса (TObject). Семейство классов TTree, специально созданное для
Создание универcального пакета импорта данных в формат ROOT
работы с данными, записанными по событиям. Возможность создания директорий внутри
файла для удобства логического структурирования данных;
 оптимизация для работы с большими объемами данных. Пакет ROOT имеет такие
механизмы, как кэширование чтения, использование сжатия файлов, возможность чтения
не всего события целиком, а только необходимой части переменных и другие инструменты
для эффективной записи и чтения .root файлов;
 наличие механизма графов и отслеживания изменений версий структуры объектов
в событии. Наличие механизмов проверки и защиты от сбоев, восстановления данных.
 возможность работы с сетевыми ресурсами. Использование на вычислительных
кластерах, в сетях GRID. Параллельные вычисления (PROOF);
 легкость освоения и простота в использовании при всех вышеперечисленных
пунктах.
Актуальность использования и хранения данных в .root файлах также подстегивается тем,
что поскольку ROOT получил широкое распространение во всем мире, многие современные
эксперименты в области физики элементарных частиц используют библиотеки ROOT в качестве
ядра при построении фреймворков для он-лайн и оф-лайн обработки данных. Пакет ROOT, в свою
очередь, ориентирован на плотное использование .root файлов. Это оправдано, так как при
использовании .root файлов пользователю предоставляется множество инструментов работы с
ними. Например, при некоторой организации записи с помощью одной команды можно построить
двумерное распределение входящих в запись величин, при этом на обработку нескольких
миллионов событий могут понадобиться секунды.
В эксперименте SELEX модель данных задается в виде большого числа массивов, связанных
между собой многочисленными индексами. Мало того, различные по физической сути величины
(например, координаты рождения V0, критерий согласия χ2 для фитированных треков дочерних
частиц и проекции импульса V0) зачастую находятся в одном и том же массиве и отличаются
только индексами. Такое представление данных существенно усложняет процесс обработки, в
котором возникает необходимость объединения таких данных в единую функциональную
структуру, и приводит к возникновению трудно отслеживаемых ошибок в исходном коде в силу
отсутствия достаточно сильной типизации в исходной модели. Также процесс обработки
замедляется и сильно затрудняется, когда возникает потребность в обращении к конкретному
событию или конкретной информации об этом событии.
Ввиду вышеперечисленного возникла актуальная задача создания пакета, позволяющего
осуществлять конвертирование событий из разных форматов в формат .root.
При разработке пакета ставилось несколько целей:
 гибкость. Пакет должен позволять легко настраивать преобразование разных типов
и форматов данных;
 высокая производительность. Пакет предполагает обработку данных объемом
более 109 событий;
 модульность и расчет на повторное использование частей;
 простота. Для использования готовых библиотек, пользователь не обязательно
должен иметь глубокие познания в программировании на С++.
Также при разработке пакета учитывалась возможность его использования в сетях GRID и
на вычислительных фермах.
Структура пакета основана на модулях, рамки взаимодействия которых определяются
абстрактными интерфейсами. При этом производные классы пакета имеют неглубокую
иерархическую вложенность. Логически работу пакета можно разбить на взаимодействие трех
модулей, обеспечивающих чтение (Reader), преобразование (Mapper) и запись данных (Writer). С
точки зрения С++, такая модульная структура реализуется в виде интерфейсов: IReader, IMapper,
IWriter, которые обеспечивают абстрактный уровень чтения, конвертирования и записи данных
соответственно. Данные представлены интерфейсом IData с двумя главными классами потомками
InData – для читаемых данных и OutData – для записываемых данных. Класс OutData также
наследуется от объекта TObject, что позволяет легко записывать объекты этого класса в .root
файлы (подробнее этот механизм рассмотрен ниже).
Такая структура позволяет реализовывать несколько типичных сценариев. При
специфичном формате читаемых файлов классы Reader и Mapper оказываются связанными. При
задании логики конвертирования основная роль в процессе управления ходом программы ложится
на класс Mapper (так как именно он должен обладать информацией о том, в какой
Создание универcального пакета импорта данных в формат ROOT
последовательности и сколько байт необходимо считать и т.д.). Задание пользователем пары
классов потомков от IReader, IMapper (например, VbkSelexReader, VbkSelexMapper) определяет
логику, используемую при конвертировании.
При простой структуре входящих файлов (например, текстовые таблицы или
бинарные записи массивов) могут использоваться универсальные классы чтения событий
(TextColumnReader, BinaryFortranArrayReader), при этом класс Mapper может подгружать данные о
расположении переменных из отдельного файла, в котором указана последовательность записи
переменных, их название и структура их вывода. В этом случае пользователю нет необходимости
вообще пользоваться синтаксисом С++. Описанный функционал с использованием отдельной
карты расположения переменных планируется ввести в следующих версиях пакета и
представляется тут в качестве иллюстрации гибкости использования данной модульной
структуры.
Логическая структура работы пакета
Для записи файлов в формат .root используется класс RootFileWriter, наследуемый от IWriter
и принимающий экземпляр класса OutData с информацией о событии. Для записи файлов ROOT
использует встроенные методы, которые оказываются доступными благодаря тому, что класс
OutData является потомком TObject. Реализации этих методов автоматически генерируются с
помощью самого пакета ROOT.
Любой объект класса TFile (т.е. любой файл .root) имеет следующую структуру:
 заголовок (header). В нем содержится информация идентификатор того, что файл
является .root файлом (вне зависимости от расширения), о версии файла, свободном
пространстве и т.д.;
 jписание корневой директории. Содержит название, время и дату создания, а также
время и дату последней модификации;
 streamerInfo – содержит описание каждого класса, записанного в файл, включая
древо наследования, информацию о членах, принадлежащих этому объекту, а также их
наследовании;
 cписок ключей;
 cписок свободных участков памяти;
 окончание файла.
Объект TFile содержит список объектов TKey, которые содержат индексы, указывающие на
все объекты в файле. Класс TKey описывает заголовки (headers) объектов файла [5].
Когда мы производим запись объекта в файл, то реально мы записываем в файл не сам
объект как единое целое, а конкретные значения переменных простейших типов, из которых
состоят члены этого объекта. Под переменными простейших типов подразумеваются такие
переменные, которые не могут быть «разбиты» на переменные более простых типов. Примерами
«простейших» типов являются типы short, long, float и char [5]. Таким образом, все классы,
структуры и массивы являются составными типами данных, и при записи их на диск необходимо
проводить процедуру их сериализации на составляющие простейших типов данных. В ROOT это
реализуется с помощью так называемых Streamers – функций преобразования в поток. Streamers
проводят процедуру сериализации объекта, учитывая вложенность иерархии (записывают объект,
который наследуется от другого объекта, который, в свою очередь, наследуется от третьего
объекта и так далее), разбивая на составные части дочерний объект и затем каждый раз вызывая
Streamer конкретного родительского объекта. После сериализации на простейшие типы,
последовательность байт отправляется в буфер, но не записывается на диск, а пополняет данные,
принадлежащие конкретному объекту. Для записи объекта необходимо сначала загрузить всю
информацию («словарь») этого объекта.
Создание универcального пакета импорта данных в формат ROOT
В случае объекта TObject при вызове метода Write (т.е. TObject::Write) выполняются
следующие действия [5]:
 в текущей директории создается объект TKey;
 создается объект TBuffer, являющийся частью созданного перед этим объекта
TKey;
 начинается заполнение TBuffer, при этом вызывается метод class::Streamer;
 если необходимо, то создается второй буфер для сжатия (компрессии) данных;
 путем сканирования TFree резервируется место на диске, на этом этапе размер
буфера уже определен;
 запись буфера в файл;
 очистка части TBuffer, которая относится к данному TKey.
Другими словами, каждый раз TObject::Write вызывает метод Streamer для создания буфера.
TBuffer принадлежит классу TKey, а TKey, в свою очередь, осуществляет запись на диск.
Информация, записанная на диск, не содержит буферной части, но в ней присутствует часть
информации о ключе, принадлежащая TKey.
В результате работы создан пакет, позволяющий осуществлять конвертирование событий из
разных форматов в формат .root. В настоящий момент реализован функционал для
конвертирования файлов из форматов эксперимента SELEX, созданы классы для чтения и записи
данных из различных типовых форматов.
СПИСОК ЛИТЕРАТУРЫ
1. Булеков О.В., Поносов А.К., Романов Д.А. и др. // Письма в ЭЧАЯ. 2009. Т. 6. №1(150). С. 145.
2. Iori M., SELEX Collaboration // Nucl. Phys. Proc. Suppl. 2001. V. 93. P.109.
3. Поносов А.К., Романов Д.А. // Научная сессия МИФИ-2009. Т. 2: Ядерная физика и энергетика.
М., 2009. С. 261.
4. Реляционные
базы
данных
[Электронный
ресурс].
–
Режим
доступа:
http://en.wikipedia.org/wiki/Relational_database.
5. Официальный сайт программного пакета ROOT [Электронный ресурс]. – Режим доступа:
http://root.cern.ch.
Скачать