[e1a46d] | 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)+"."
|
---|