Расчет расстояния для координат, вызываемых из файла (Python2.7)

Я пытаюсь прочитать координаты из файла и найти расстояние между двумя соответствующими атомами в файле. Я хочу иметь рассчитанное расстояние в одном столбце и соответствующие имена атомов в другом.

1 Br1 0 Br x,y,z 1.195 7.005 10.004
2 Br2 0 Br x,y,z 1.432 5.040 6.816
3 Br3 0 Br x,y,z -0.407 8.433 6.863
4 Br4 0 Br x,y,z 3.344 8.375 7.107
5 Fe1 0 Fe x,y,z 1.412 7.214 7.682
6 Br5 0 Br x,y,z 2.813 12.506 12.949
7 Br6 0 Br x,y,z 4.778 14.123 10.091
8 Br7 0 Br x,y,z 6.563 12.765 13.175
9 Br8 0 Br x,y,z 4.387 15.965 13.344

Например:

Br1-Br2 1.5

Я сталкиваюсь с двумя проблемами:

1-я понятия не имею, как дать команду программе рассчитать евклидово расстояние между каждыми двумя парами атомов, я использовал split(), чтобы отделить координаты от других данных, но я все еще не знаю, как рассчитать расстояние. Я нашел некоторые Информация о той же проблеме, но ответы для меня не сработали, как для Perl.

atom_positions= open('Atoms.txt','r')
revised_atom_positions = open('Atoms_atoms.txt','w')
aline = atom_positions.readline()#for getting rid of the first line data which is general info

for aline in atom_positions:
     Values = aline.split()
     dataline = values[1]+' , '+ values[5] + ' , ' + values[6] +' , '+values[7]
     revised_atom_positions.write(dataline + '\n')


atom_positions.close()
revised_atom_positions.close()

Когда я пытаюсь преобразовать его в массив и использовать pdist, я получаю сообщение об ошибке:

TypeError: 'builtin_function_or_method' object has no attribute '__getitem__'

2- Я могу хранить свои новые данные в другом файле с новым порядком, но я не знаю, как вызвать их для расчета расстояния! были некоторые рекомендации по pdist но у меня это тоже не сработало.

Есть ли решения этой проблемы?

1 ответ

Решение

Вы можете использовать индекс:

atom_positions= open('Atoms.txt','r')
revised_atom_positions = open('Atoms_atoms.txt','w')

lines = atom_positions.readlines()

for i in range(0, len(lines)):
    line = lines[i]
    values = line.split()
    dataline = values[1]+' , '+ values[5] + ' , ' + values[6] +' , '+values[7]
    # You can access to next line with lines[i + 1]
    revised_atom_positions.write(dataline + '\n')


atom_positions.close()
revised_atom_positions.close()
Другие вопросы по тегам