preparing data for visualization

John Machin sjmachin at lexicon.net
Tue Nov 13 00:12:19 CET 2007


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.

> 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'}

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,
    }

HTH,
John




More information about the Python-list mailing list