Как мне прочитать TMatrixT с корнем в Python?

#python #uproot

#python #выкорчевать

Вопрос:

У меня есть файл * .root, который я пытаюсь прочитать в Python с помощью uproot (uproot4). Это выглядит так:

 >>> data = up.open('file.root')
>>> data.keys()
['ring_sums;1', 'tpc_multiplicity;1', 'impact_parameter;1']
>>> data['ring_sums']
<TMatrixT<double> (version 4) at 0x0205b219d748>
 

Как я могу прочитать тип TMatrixT? Использование .keys() , .values() и .items() не работает.

 >>> data['ring_sums'].values()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Model_TMatrixT_3c_double_3e__v4' object has no attribute 'values'
 

Как правильно считывать данные в неудобный массив, фрейм данных pandas или массив numpy?

Ответ №1:

TMatrixT — это класс, для которого Uproot не имеет никакого специализированного кода (пока?), Но его все равно можно прочитать, потому что его «стримеры» (инструкции по десериализации) включены в КОРНЕВОЙ файл. Поэтому он представлен в довольно общем виде.

Вы можете найти все данные-члены объекта в all_members (dict) или извлечь только один, используя member("memberName") метод. Итак, например, попробуйте

 data['ring_sums'].member("fElements")
 

потому что TMatrixT::fElements кажется актуальным. Вероятно, они будут представлены в виде бесформенного массива NumPy (или uproot.models.TArray, который является подклассом массивов NumPy). Возможно, вам потребуется придать reshape ему правильную форму, и правильная форма может быть найдена в каком-либо другом элементе (возможно, принадлежащем суперклассу).

Если вы нашли хороший способ использования TMatrixT объектов и хотели бы, чтобы он стал автоматическим, возможно, в values методе, добавьте его как запрос на извлечение или опишите его как запрос функции для удаления (новое «поведение»).