preparing data for visualization

mensanator at aol.com mensanator at aol.com
Mon Nov 12 18:53:39 EST 2007


On Nov 12, 5:12 pm, John Machin <sjmac... at lexicon.net> wrote:
> Bryan.Fodn... at gmail.com wrote:
> > I would like to have my data in a format so that I can create a
> > contour plot.
>
> > My data is in a file with a format, where there may be multiple fields
>
> > field = 1
>
> > 1a      0
> > 2a      0
>
> The above is NOT consistent with the later listing of your data file.
>
> [big snip
>
> > 10b     0
>
> > where the value is how far from the center it will be displaced,
>
> >                     a             b                     a
> > b                      a             b
> > 10      0000000000|0000000000   0000000000|0000000000   0000000000|
>
> [big snip of seemingly irrelevant stuff]
>
>
>
>
>
> > 1        0000000000|0000000000   0000000000|0000000000   0000000000|
> > 0000000000
>
> > I could possibly have many of these that I will add together and
> > normalize to one.
>
> > Also, there are 60 a and b blocks, the middle 40 are 0.5 times the
> > width of the outer 20.
>
> > I thought about filling an array, but there is not a one to one
> > symmetry.
>
> > I cannot seem to get my head around this. Can anybody help me get
> > started?
>
> > I have tried to use a dictionary, but cannot seem to get it to work
> > the way I want.
>
> > I try this,
>
> > ---------------------------------------------------------------------------­------
>
> > f = open('TEST1.MLC')
>
> > fields = {}
>
> > for line in f:
> >    if line.split()[0] == 'Field':
>
> >        field = int(line.split()[-1])
>
> Do line.split() ONCE per line.
>
>
>
> >    elif line.split()[0] == 'Leaf':
> >        fields[field] = line.split()[-1]
> >    else:
> >        line = f.next()
>
> Don't mix
>     for line in f
> and
>     line = f.next()
> otherwise you will you will skip lines that you don't want to skip and/
> or become confused.
>
>
>
> > ---------------------------------------------------------------------------­------
>
> > and get,
>
> > ---------------------------------------------------------------------------­------
>
> > Traceback (most recent call last):
> >  File "<pyshell#1>", line 1, in <module>
> >    line.split()[0]
> > IndexError: list index out of range
>
> This indicates that you have a list for which 0 is not a valid index.
> If it had 1 or more elements, then 0 would be a valid index. I
> conclude that the list is empty. This would happen if line contained
> no characters other than whitespace.

In other words, the blank lines between the blocks of data.

>
>
>
>
>
> > Here is my data file,
>
> > ---------------------------------------------------------------------------­------
>
> > File Rev = G
> > Treatment = Dynamic Dose
> > Last Name = Fodness
> > First Name = Bryan
> > Patient ID = 0001
> > Number of Fields = 4
> > Number of Leaves = 120
> > Tolerance = 0.50
>
> > Field = 10
> > Index = 0.0000
> > Carriage Group = 1
> > Operator =
> > Collimator = 0.0
> > Leaf  1A =   0.00
> > Leaf  2A =   0.00
> [snip]
> > Leaf 20A =   0.00
> > Leaf 21A =   5.00
> > Leaf 22A =   5.00
> [snip]
> > Leaf 40A =   5.00
>
> [big snip -- your code failed no later than the 10th line in the data
> file]
> To find out what is going on, print out some variables:
>
> 8<---  fodness.py ----
> f = open('fodness.dat')
> fields = {}
> for lino, line in enumerate(f):
>     tokens = line.split()
>     print "Line %d: tokens = %r" % (lino, tokens)
>     if not tokens:
>         continue # blank/empty line
>     tok0 = tokens[0]
>     if tok0 == 'Field':
>         field = int(tokens[-1])
>     elif tok0 == 'Leaf':
>         fields[field] = tokens[-1]
>     else:
>         continue
>     print "   Fields:", fields
> 8<---
>
> Results [truncated]:
>
> C:\junk>fodness.py | more
> Line 0: tokens = []
> Line 1: tokens = ['File', 'Rev', '=', 'G']
> [snip]
> Line 8: tokens = ['Tolerance', '=', '0.50']
> Line 9: tokens = []
> Line 10: tokens = ['Field', '=', '10']
>    Fields: {}
> Line 11: tokens = ['Index', '=', '0.0000']
> Line 12: tokens = ['Carriage', 'Group', '=', '1']
> Line 13: tokens = ['Operator', '=']
> Line 14: tokens = ['Collimator', '=', '0.0']
> Line 15: tokens = ['Leaf', '1A', '=', '0.00']
>    Fields: {10: '0.00'} <<<<<<<<<<====== Don't you need a float
> instead of a string??
> Line 16: tokens = ['Leaf', '2A', '=', '0.00']
>    Fields: {10: '0.00'}
> Line 17: tokens = ['Leaf', '3A', '=', '0.00']
>    Fields: {10: '0.00'}
> Line 18: tokens = ['Leaf', '4A', '=', '0.00']
>    Fields: {10: '0.00'}
>

Yep, crahing on blank lines.

f = open(r'C:\python25\user\MLC\TEST1.MLC')
fields = {}
for line in f:
  the_line = line.split()           # split only once
  if the_line:                      # test if the_line empty
    if the_line[0] == 'Field':      # if not, start checking
      field = int(the_line[-1])
    elif the_line[0] == 'Leaf':
      fields[field] = the_line[-1]
    ## f.next() removed

> Don't you want/need to use the leaf IDs (1A, 2A, etc)?? I guess that
> you want to end up with NESTED dictonaries, like this:
> fields = {
>     10: {
>         '1A': 0.0,
>         '2A': 0.0,
>         etc,
>         },
>     8: {
>         etc,
>         },
>     etc,
>     }

The fixed code returns only one leaf, since you are
continuously overwriting it.
>>> fields
{8: '0.00', 1: '0.00', 10: '0.00', 4: '0.00'}

Note also that the values are still strings, you probably
have to fix that.

>
> HTH,
> John- Hide quoted text -
>
> - Show quoted text -- Hide quoted text -
>
> - Show quoted text -





More information about the Python-list mailing list