Выборочный анализ большого файла данных
Задача:
-Я запустил симуляцию вибрации молекулы, делая "снимок" того, где мои атомы находятся каждые 0,1 фемтосекунды
-Теперь мне нужно пройти через вывод и взять все эти различные наборы декартовых координат (всего 50).
-Геометрия в хорошем формате, однако она имеет дополнительные материалы с одинаковым форматированием между сегментами геометрии (см. Пример).
Пример (Это один из 50 идентичных сегментов из файла, который я пытаюсь проанализировать, только 16 атомов, а не 4.)
Time in trajectory (femtosec) 3.300000D+00
Total energy (au) -2.716055737D+02
Total angular momentum (h-bar) 5.485831060D-14
Coordinates (Bohr)
I= 1 X= -1.573316541788D+00 Y= -3.143098097327D-01 Z= -9.488852008364D-01
I= 2 X= -1.549056004901D+00 Y= -3.758762443395D-01 Z= 1.621875214114D+00
I= 3 X= 7.633881398143D-01 Y= -3.853052819189D-01 Z= 3.487630749614D-01
I= 4 X= 2.390273062744D+00 Y= 1.832192143047D+00 Z= 6.235281069720D-01
Momentum (sqrt(amu)*Bohr/sec)
I= 1 X= -3.536362458214D+13 Y= 2.431139678255D+13 Z= 1.413087646815D+13
I= 2 X= -2.526353110947D+13 Y= -2.551987667221D+12 Z= 7.250485757030D+12
I= 3 X= -1.190415840625D+13 Y= -1.311816871612D+13 Z= -4.638293368564D+12
I= 4 X= 6.566472312459D+12 Y= -2.248922363477D+13 Z= -4.123675084717D+11
Я хотел бы, чтобы был какой-то способ перебрать файл и прочитать координаты, затем пропустить информацию об импульсе и убрать всю дополнительную информацию, такую как I=, X= и т. Д.
Я подумал, что было бы здорово, если бы я мог сделать это в трехмерном массиве, где мои координаты будут индексироваться с помощью: (номер итерации, номер атома и координата x y или z). Я не знаю, поможет ли Regex здесь, так как линии в импульсных секциях имеют одинаковое форматирование. Кто-нибудь из вас, замечательные люди, сможет предложить мне толчок в правильном направлении?
Буду признателен за ресурсы для ответа. У меня нет временных рамок для работы, поэтому я надеюсь кое-что узнать здесь.
1 ответ
Ты можешь использовать numpy.genfromtxt()
который принимает генератор и, следовательно, допускает некоторую настройку ввода, который вы даете. Например, здесь я заменяю D
от e
и игнорируя все строки, начинающиеся с 'M'
а также 'C'
, Кроме того, я использую только столбцы (3, 5, 7)
, которые содержат нужные данные. Наконец, массив изменяется, чтобы сохранить каждый "импульс" отделенным друг от друга и доступным через первый индекс (при условии, что они всегда будут иметь 4 строки):
gen = (r.replace('D','e') for r in open('test.txt') if not r[0] in ['C','M'])
a = np.genfromtxt(gen, skip_header=3, usecols=(3, 5, 7))
a = a.reshape(-1, 4, 3)
#[[[ -1.57331654e+00 -3.14309810e-01 -9.48885201e-01]
# [ -1.54905600e+00 -3.75876244e-01 1.62187521e+00]
# [ 7.63388140e-01 -3.85305282e-01 3.48763075e-01]
# [ 2.39027306e+00 1.83219214e+00 6.23528107e-01]]
#
# [[ -3.53636246e+13 2.43113968e+13 1.41308765e+13]
# [ -2.52635311e+13 -2.55198767e+12 7.25048576e+12]
# [ -1.19041584e+13 -1.31181687e+13 -4.63829337e+12]
# [ 6.56647231e+12 -2.24892236e+13 -4.12367508e+11]]]
В этом массиве вы получите доступ к импульсам I и (X,Y,Z), используя первый, второй и третий индексы:
a[0,1,2] #first momentum, second I and third coordinate