Скопируйте TTree из файла в новый файл с помощью выкорчеванного файла. - PullRequest
1 голос
/ 17 апреля 2020

Я новичок до root и пытаюсь выполнить довольно простую задачу, но я не уверен, как это сделать. По сути, у меня есть файл root, который содержит группу гистограмм и одно TTree, которое состоит из 8 ветвей для примерно 4 миллионов записей.

Что мне нужно сделать, я создаю новый файл root и копирую 80% TTree из исходного файла в TTree (называемое обучением), а оставшиеся 20% - во второе TTree в тот же новый файл (называемый test).

Я пытался создать каталог в python, в который я считывал все данные из исходного файла по ветвям. Затем я использовал этот каталог для записи данных в два новых TTree.

Это своего рода работа, я получаю файл с нужной мне структурой, я не совсем удовлетворен по двум причинам:

  • Конечно, должно быть больше прямой путь? Сначала чтение данных в python, а затем запись в файл кажется чрезвычайно громоздким и занимающим много памяти.
  • Честно говоря, я не очень разбираюсь в root, но, насколько я понимаю, в моем оригинале файл, у меня есть дерево, которое содержит мои 4 миллиона событий. Каждое событие имеет значение для каждой ветви, поэтому, когда я говорю «дай мне запись 555!», Я получаю 8 значений (по 1 для каждой ветви). Если я просто копирую ветки так, как я делаю, я теряю эту структуру или индекс всех массивов в моем каталоге заменяет номер записи? Таким образом, захват значений из всех массивов @ index 555 был таким же, как и возврат записи 555 раньше?

Любая помощь будет приветствоваться. Спасибо!

1 Ответ

0 голосов
/ 17 апреля 2020

Эта задача всегда включает чтение в память и запись обратно, независимо от того, находятся ли эти массивы под контролем пользователя или скрыты.

Существует одно возможное исключение, если вы хотите прочитать TBaskets из одного файла и записать их другому, не распаковывая их - тогда они все еще находятся в памяти, но не распакованы, и это может повысить производительность. ROOT может сделать это как «быстрое копирование», но Up root не имеет эквивалента. Такая копия потребует, чтобы вы не хотели каким-либо образом изменять данные в TBaskets, в том числе нарезку на произвольных границах событий, что может быть проблемой, если TBaskets для 8 интересующих вас TBranches не совпадают на общих границах событий. (Такая функция может быть добавлена ​​к Uproot - технических ограничений нет, но эта функция полезна только в определенных случаях.)

Таким образом, процесс чтения массивов из одного файла и записи их в другой примерно так же хорошо, как и с вышеупомянутым предостережением.

Я не уверен, что вы подразумеваете под "каталогом в Python."

Чтобы ответить на ваш второй вопрос, массивы, которые считываются из TTree, выровнены в том смысле, что запись 555 одного TBranch принадлежит тому же событию, что и запись 555 другого TBranch. Это распространенный способ работы с наборами массивов в NumPy, хотя это необычный способ работы с ROOT данными; в ROOT событие - это объект, или, по крайней мере, вы не видите более одного объекта за раз.

Если у вас есть проблемы с памятью (вероятно, не с 8 TBranches × 4 миллиона событий, не зубчатые , = 244 МБ ОЗУ (с двойной точностью), то вы можете рассмотреть возможность итерации:

numtraining = int(0.8*ttree.numentries)
numtest = ttree.numentries - numtraining

for chunk in ttree.iterate("*", entrysteps="1 GB", entrystop=numtraining):
    training.extend(chunk)

for chunk in ttree.iterate("*", entrysteps="1 GB", entrystart=numtraining):
    test.extend(chunk)

Это дает вам контроль над размером выходных TBaskets, поскольку каждый TBranch получает один TBasket за вызов extend , Приведенный выше пример гарантирует, что набор TBranches, которые все должны использоваться вместе, состоит максимум из 1 ГБ.

В отличие от «быстрого копирования» (см. Выше), то, что вы делаете, это не просто копирование он также перераспределяет данные, что может повысить производительность при чтении этих выходных файлов. Как правило, более крупные фрагменты (большие TBaskets) читаются быстрее, но слишком велики и могут потребовать слишком много памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...