On 05/03/2017 08:51 PM, Alan Gauld via Tutor wrote:
On 04/05/17 00:32, Stephen P. Molnar wrote:

import numpy as np

name = input("Enter Molecule ID: ")
name = str(name)

You don't need the str(), input always returns a string.

name_in =name[:]+'.lac.dat'

And you don't need the [:]. Just use

name_in = name + '.lac.dat'

print(name_in)

atm_chg = []

"""
atm_chg = open(name_in,'r')
for line in atm_chg:
      print(line, end=' ')
"""
This creates a 3 line string which is not assigned to any object.
It is not executable code and will not be executed. Maybe you
are doing it as a way of commenting out a block? If so it would be
better in a post to just delete it, it just adds confusion
otherwise. (Well, it confused me! :-)

with open(name_in) as f:
      # skip two lines
      f.readline()
      f.readline()
      for line in f.readlines():
          atm_chg.append(float( line.split()[-1] ))

p.asarray({atm_chg})

Where did p come from?
Should it be np? asarray() sounds like it might be a numpy thing.
And I'm not sure what the {atm_chg} is supposed to do - create
a single element set using your list maybe? I get an "unhashable"
error if I try it at the >>>> prompt.

When it is run I get:

IndexError: list index out of range

I'm pretty sure you get more than that, please post the full
error text, it's much harder to diagnose problems with just
the summary.

Since the only indexing you do is in this line

          atm_chg.append(float( line.split()[-1] ))

I'll assume that's where the problem lies.
Try checking if the string is not empty before using it:

      for line in f.readlines():
          if line:
             atm_chg.append(float( line.split()[-1] ))


However, the Variable Explorer shows:

I have no idea what the Variable Explorer is?
Is it part of your IDE? Or of numpy?
If the IDE which IDE are you using?

   [-0.780631, 0.114577, 0.309802, 0.357316, -0.001065]
[-0.780631, 0.114577, 0.309802, 0.357316, -0.001065]
[-0.780631, 0.114577, 0.309802, 0.357316, -0.001065]
[-0.780631, 0.114577, 0.309802, 0.357316, -0.001065]

One line of which is exactly what I want as input to the next step in
the larger calculation.

Now, my question is how do I extract just one line of this file?

Any particular line? And which file are you talking about?
The data should be in the list variable, atm_chg.
In which case the first line is therefore:  atm_chg[0]

Or you can process each line using the usual for loop:

for line in atm_chg:
     # use line here....

Thanks for your reply.

The Variable Explorer is part of the Spyder IDE.

I have edited the code:

import numpy as np


name = input("Enter Molecule ID: ")
#name = str(name)

name_in =name[:]+'.lac.dat'
print(name_in)

atm_chg = []

with open(name_in) as f:
    # skip two lines
    f.readline()
    f.readline()
    for line in f.readlines():
        atm_chg.append(float( line.split()[-1] ))


np.asarray({atm_chg})

Execution still generates the errors:

runfile('/home/comp/Apps/Python/Testing/ReadFile_2.py', wdir='/home/comp/Apps/Python/Testing')

Enter Molecule ID: A
A.lac.dat
Traceback (most recent call last):

  File "<ipython-input-1-8c665940b39f>", line 1, in <module>
runfile('/home/comp/Apps/Python/Testing/ReadFile_2.py', wdir='/home/comp/Apps/Python/Testing')

File "/home/comp/Apps/anaconda3/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py", line 866, in runfile
    execfile(filename, namespace)

File "/home/comp/Apps/anaconda3/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py", line 102, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "/home/comp/Apps/Python/Testing/ReadFile_2.py", line 27, in <module>
    atm_chg.append(float( line.split()[-1] ))

IndexError: list index out of range

from the input file:

runfile('/home/comp/Apps/Python/Testing/ReadFile_2.py', wdir='/home/comp/Apps/Python/Testing')

Enter Molecule ID: A
A.lac.dat
Traceback (most recent call last):

  File "<ipython-input-1-8c665940b39f>", line 1, in <module>
runfile('/home/comp/Apps/Python/Testing/ReadFile_2.py', wdir='/home/comp/Apps/Python/Testing')

File "/home/comp/Apps/anaconda3/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py", line 866, in runfile
    execfile(filename, namespace)

File "/home/comp/Apps/anaconda3/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py", line 102, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "/home/comp/Apps/Python/Testing/ReadFile_2.py", line 27, in <module>
    atm_chg.append(float( line.split()[-1] ))

IndexError: list index out of range

Finally, here is the code for which I need input data for the calculation of the Integrated Charge Transform:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sat Apr  8 15:17:07 2017

@author: comp

Copyright (c) 2017 Stephen P. Molnar, Ph.D.

"""

import matplotlib.pyplot as plt
import numpy as np
# you don't need pandas, np.genfromtxt() reads this type of txt files.

plt.ion() # interactive plotting, stopps plt.show() from blocking.
#import math # you won't need math if you have numpy

start=1
finish=31
points=300
s = np.linspace(start, finish, points)
np.savetxt('s',s)

name = input("Enter Molecule ID: ")
name = str(name)
print(name)
name_in = name+'.dat'
print(name)
dtype = [('NO', int), ('LB', 'S2'), ('ZA', float), ('FRAG', int),
         ('MASS', float), ('X', float), ('Y', float), ('Z', float)]

data = np.genfromtxt(name_in, dtype=dtype, skip_header=3)

N =  data.shape[0]  #number of atoms in molecule
a = np.array([data['X'], data['Y'], data['Z']])  #atomic coordinates
#dist.squareform(dist.pdist(a, "euclidean"))
anrows, ancols = np.shape(a)
a_new = a.reshape(anrows, 1, ancols)
diff = a_new - a

D = (diff ** 2).sum(2)
D = np.sqrt(D)
r = D

def eq7(a, s, Z):
    """
    Computes equation 7 in Molnar & King (2001)
    """
    N = r.shape[0]
    I = np.zeros(s.shape)
    for i in range(1, N):
        for j in range(i):
            I += Z[i] * Z[j] * np.sin(s * r[i, j])/(s * r[i, j])

    return I

I = eq7(r, s, data['ZA'])

name = 'I_z-'+str(name)

np.savetxt(name,I)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(s.T, I)
plt.title("Molecular Transform: ${}$".format(name))
fig.gca().set_xlabel("Distance (Å)")
plt.ylabel('Atomic Number Transform (I$_z$)')
plt.show()

I_sq = []
I_sq = I**2
Area = []

Area = np.trapz(I_sq,x=None,dx=0.01,axis=-1)
np.savetxt('I_sq',I_sq)
I_z = np.sqrt(Area)
print('FTz: ',I_z)


#--------------------------------------------------------------------------
# MASS Mollecular Transform  FT_m


I = eq7(r, s, data['MASS'])

name = 'I_m-'+str(name)
np.savetxt(name,I)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(s.T, I)
plt.title("Molecular Transform: ${}$".format(name))
fig.gca().set_xlabel("Distance (Å)")
plt.ylabel('MASS Transform (I$_m$)')
plt.show()

I_sq = I**2
Area = np.trapz(I_sq,x=None,dx=0.01,axis=-1)
np.savetxt('I_sq',I_sq,delimiter=' ')
I_z = np.sqrt(Area)
I_m = I_z
print('FT_m: ',I_m)

#------------------------------------------------------------------------------
#Integrated Charge Transform
print(name)
--
Stephen P. Molnar, Ph.D.                Life is a fuzzy set
www.molecular-modeling.net              Stochastic and multivariate
(614)312-7528 (c)
Skype: smolnar1
_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor

Reply via email to