1 | #!@PYTHON@
|
---|
2 |
|
---|
3 | import sys,math
|
---|
4 |
|
---|
5 | wrerr=sys.stderr.write
|
---|
6 | wrout=sys.stdout.write
|
---|
7 |
|
---|
8 | # get arguments
|
---|
9 | if (len(sys.argv) < 3):
|
---|
10 | print "Usage: "+sys.argv[0]+" <dir> <datafile> <bin-length>"
|
---|
11 | sys.exit(1)
|
---|
12 | else:
|
---|
13 | dir=sys.argv[1]
|
---|
14 | data=sys.argv[2]
|
---|
15 | length=float(sys.argv[3])
|
---|
16 |
|
---|
17 | input=open(dir+"/"+data,"r")
|
---|
18 | abc=[]
|
---|
19 | for line in input:
|
---|
20 | if "#" in line:
|
---|
21 | continue
|
---|
22 | entries=line.split()
|
---|
23 | for n in range(3):
|
---|
24 | abc.append(abs(float(entries[n+4])))
|
---|
25 | input.close()
|
---|
26 |
|
---|
27 | # simply output all sorted pairs
|
---|
28 | wrout("Output of sorted data pairs ... ")
|
---|
29 | output = open(dir+"/"+data+".out", "w")
|
---|
30 | output.write("#Nr. absolute value\n")
|
---|
31 | abc.sort()
|
---|
32 | for i in range(len(abc)):
|
---|
33 | output.write("%d\t %lg\n" % (i, abc[i]))
|
---|
34 | output.close()
|
---|
35 | wrout("done.\n")
|
---|
36 |
|
---|
37 | # then bin and output
|
---|
38 | nr=int(((abc[-1])/length)+0.5)
|
---|
39 | bin=[] # contains list of values
|
---|
40 | print "Number of bins "+str(nr)+" with length "+str(length)+"."
|
---|
41 | # initialise bins with 0
|
---|
42 | wrout("Gathering into bins ... ")
|
---|
43 | for i in range(nr):
|
---|
44 | bin.append([0])
|
---|
45 | # go through all values and increase bin
|
---|
46 | for i in range(len(abc)):
|
---|
47 | index=int(((abc[i])/length)-0.5)
|
---|
48 | bin[index][0]+=1
|
---|
49 | bin[index].append(abc[i])
|
---|
50 | #print ("%lg goes into bin %d, containg %d." % (abc[i], index, bin[index][0]))
|
---|
51 | wrout("done.\n")
|
---|
52 |
|
---|
53 | wrout("Output of bins to file ... ")
|
---|
54 | output = open(dir+"/"+data+".bin","w")
|
---|
55 | output.write("#Bin -- length: %lg\t -- count\taverage\terror\n" % (length))
|
---|
56 | max=[0, 0, 0]
|
---|
57 | MAX=[-1,-1,-1]
|
---|
58 | for i in range(nr):
|
---|
59 | # determine greatest three bins
|
---|
60 | for n in range(3):
|
---|
61 | if (bin[i][0]>max[n]):
|
---|
62 | for m in range(n,2):
|
---|
63 | max[m+1] = max[m]
|
---|
64 | MAX[m+1] = MAX[m]
|
---|
65 | max[n] = bin[i][0]
|
---|
66 | MAX[n] = i
|
---|
67 | break
|
---|
68 | # calculate average and error per bin
|
---|
69 | average=0
|
---|
70 | error=0
|
---|
71 | if bin[i][0] != 0:
|
---|
72 | for m in range(1,bin[i][0]+1):
|
---|
73 | average+=bin[i][m]*bin[i][m]
|
---|
74 | average=math.sqrt(average/bin[i][0])
|
---|
75 | for m in range(1,bin[i][0]+1):
|
---|
76 | tmp=bin[i][m]-average
|
---|
77 | error+=tmp*tmp
|
---|
78 | error=math.sqrt(error)/bin[i][0]
|
---|
79 | #output
|
---|
80 | output.write("%d\t %lg\t%lg\t%lg\n" % (i, bin[i][0], average, error))
|
---|
81 | output.close()
|
---|
82 | wrout("done.\n")
|
---|
83 |
|
---|
84 | # output average of each of the three greatest bins
|
---|
85 | for n in range(3):
|
---|
86 | average=0
|
---|
87 | error=0
|
---|
88 | if bin[ MAX[n] ][0] != 0:
|
---|
89 | for m in range(1,bin[ MAX[n] ][0]+1):
|
---|
90 | average+=bin[ MAX[n] ][m]*bin[ MAX[n] ][m]
|
---|
91 | average=math.sqrt(average/bin[ MAX[n] ][0])
|
---|
92 | for m in range(1,bin[ MAX[n] ][0]+1):
|
---|
93 | tmp=bin[ MAX[n] ][m]-average
|
---|
94 | error+=tmp*tmp
|
---|
95 | error=math.sqrt(error)/bin[ MAX[n] ][0]
|
---|
96 | print "Bin "+str(MAX[n])+" has "+str(max[n])+" values, average is "+str(average)+" +/- "+str(error)+"."
|
---|