#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
методе, добавьте его как запрос на извлечение или опишите его как запрос функции для удаления (новое «поведение»).