Расстояние между эталонным атомом at1 и всеми другими атомами в той же траектории в файле - PullRequest
0 голосов
/ 01 марта 2019

В настоящее время мой код читает во входном файле координат TINKER для моих атомов.

Была определена функция для расчета расстояний следующим образом:

def getdist(at1,at2):
''' Calculate distance between two particles
'''
dist_at=sqrt((at2[0]-at1[0])**2+(at2[1]-at1[1])**2+(at2[2]-at1[2])**2)
return dist_at

Это передается основному сценарию, который выполняет вычисления на основе двух аргументов, передаваемых в командной строке:

def parsecmd():
description="Calculate distances, angles, torsions and quota in periodic or\
 non-periodic molecular structures.\n\
See documentation for further information."
usage="usage: %prog [options] input_file"
#updtate this when new formats are added

list_of_formats="XYZ/XMOL, TINKER XYZ/ARC"
#parse command line
parser=OP(version='%prog 1.1',description=description,usage=usage)

parser.add_option('-c','--credits',dest='credits',action='store_true',
                 default=False,help='display credits')
parser.add_option('-f','--format',dest='fformat', default="arc",
                  help='specify the format of the input structure, [default: %default]')
parser.add_option('-e','--filedata',dest='filedata',nargs=1,
                  help='specify that input file is setup file')
parser.add_option('-d','--distance',dest='distance',nargs=2,type='int',
                 help='require a distance calculation on the specified couple of atoms')
parser.add_option('-a','--angle',dest='angle',nargs=3,type='int',
                 help='require angle calculation on the specified three atoms')
parser.add_option('-i','--dih',dest='dih',nargs=4,type='int',
                 help='dihedral angle four atoms')
parser.add_option('-t','--torsion',dest='torsion',nargs=5,type='int',
                 help='require torsions calculation on the specified dihedral angle combination pair and periodicity (i.e. 360 deg)')
parser.add_option('-T','--torsion1',dest='torsion1',nargs=5,type='int',
                 help='require torsions calculation on the specified four atoms and periodicity (i.e. 360 deg)')
parser.add_option('-u','--unitcell',dest='periodicity',nargs=6,type='float',
                 help='define periodic unit cell (a,b,c in angstrom; alpha,beta,gamma in degrees)')
parser.add_option('-l','--listformats',dest='listformats',action='store_true',
                 default=False, help='list the available formats')
(options, args) = parser.parse_args(argv[1:])

    while 1:
    #get format file structure
    if lower(fformat) == "arc":
        retdata=read_arc(structfile,offset)
    elif lower(fformat) == "xyz":
        retdata=read_xyz(structfile,offset)
    else:
        pass

    if retdata=="EOF":
        break
    else:
        coordinates=retdata[0]  #always in 1st position if not EOF
        offset=retdata[1]       #always in 2nd position if not EOF
    for index,task in enumerate(tasklist):
        if task != None:
            if index == 0: #get distances
                tmplist=[]
                for element in task: #scan over the lists of distances
                    for i in range(3):
                        at1[i]=coordinates[element[0]-1][i]   #1st atom
                        at2[i]=coordinates[element[1]-1][i]   #2nd atom
                    if pbc == None:
                        dist=getdist(at1,at2)
                    else:
                        dist=getpbcdist(at1,at2,pbc)
                    tmplist.append('%12.4f' % dist)
                F_DISTS.write(join(tmplist,'')+"\n")  #write out the list of 
distances as string
def main():
'''
#===============================================================================
#                               MAIN MAIN MAIN MAIN
#===============================================================================
'''

(options,args)=parsecmd()
print('test')
infile=args[0]
outfiles=[]
#tasklist contain the list of task.the list in the 1st element is
#for the distances, that in the 2nd is for angle and in the 3rd for torsions and 4th is torsion combination
tasklist=[]

fformat=options.fformat     #get format input file

if options.periodicity:   #get periodicity
    pbc=options.periodicity
else:
    pbc=None

if options.filedata: #read data from file
    filedata=safeopen(options.filedata,'r')
    if filedata:
        (tasklist,outfiles)=read_filedata(filedata)
    else:
        print ("Cannot find "+options.filedata)
else:
    if options.distance: #distance
        junk=[]
        junk.append(list(options.distance)) #convert the tuple from the cml to a list
        tasklist.append(junk)
        tasklist.append(None) #no angle to calculate
        tasklist.append(None) #no torsion to calculate
        #create list outfiles in the form [['file'],None,None]
        outfiles.append('distcml.dat')
        outfiles.append(None)
        outfiles.append(None)

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

Что я ищу:

at1 = 26

at2 = 26,27,28,29,30,31,32,33, 34,45 (Эти значения находятся в файле с именем atom.dat, все в одном столбце, разделенном новыми строками)

Мне нужно расстояние между at1 и всеми элементами в at2.

Что я пробовал:

Я пытался открыть файл с циклом for внутри кода, чтобы at2 была каждой строкой в ​​моем файле, итерируемой, но произошла эта ошибка:

Файл«Расстояния_reference_atom_to_other_atoms.py», строка 839, в основном junk.append (list (options.distance)) # конвертировать кортеж из cml в список TypeError: объект 'int' не повторяется

Затем я попыталсяпередача аргумента через командную строку и аналогичная ошибка произошла.

Сценарий

Atoms.dat Файл координатной траектории

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