Automatic commit. Fri Sep 7 00:00:05 WST 2012
[matches/honours.git] / research / TCS / process.py
1 #!/usr/bin/python -u
2
3 #
4 # @file process.py
5 # @purpose Process TCS data
6 #               Takes S(E) = dI/dE
7 # @author Sam Moore
8 # @date August 2012
9 #
10
11 import sys
12 import os
13 import re # Regular expressions - for removing comments
14 import odict #ordered dictionary
15 import copy
16
17 import Gnuplot, Gnuplot.funcutils
18
19 gnuplot = Gnuplot.Gnuplot()
20
21 def GetData(filename):
22         input_file = open(filename, "r")
23         data = []
24         for line in input_file:
25                 line = re.sub("#.*", "", line).strip("\r\n ")
26                 if len(line) == 0:
27                         continue
28                 data.append(map(lambda e : float(e), line.split("\t")))
29         return data
30
31 def Derivative(data, a=0, b=1):
32         result = []
33         n = 0
34         dI = 0
35         dE = 0
36         for i in range(1, len(data)-1):
37                 dE = data[i+1][a] - data[i][a]
38                 if (dE != 0):
39                         n = 0
40                         dI = 0
41                 
42                 n += 1
43                 dI += data[i+1][b] - data[i][b]                 
44                 if (dE != 0):                   
45                         result.append([data[i][a], (dI / (n * dE)) ] ) #/ data[i][2]])
46         return result
47
48 def MaxNormalise(data, u=1):
49         maxval = max(data, key = lambda e : e[u])[u]
50         
51         result = copy.deepcopy(data)
52         for d in result:
53                 d[u] = d[u] / maxval
54                 
55         return result
56         
57 def Average(data_sets, u=1): 
58         avg = odict.odict()
59         for t in data_sets:
60                 for p in t:
61                         if p[0] in avg:
62                                 avg[p[0]][0] += p[u]
63                                 avg[p[0]][1] += 1
64                         else:
65                                 avg.update({p[0] : [p[u], 1]})
66
67         for a in avg.keys():
68                 avg[a] = float(avg[a][0]) / float(avg[a][1])
69         return sorted(avg.items(), key = lambda e : e[0])
70
71 def Plot(*args):
72         gnuplot.plot(args)
73
74 def FitTCS(data):
75         pass
76
77 def FullWidthAtHalfMax(data, u=1):
78         maxval = max(data, key = lambda e : e[u])
79         peak = data.index(maxval)
80         maxval = maxval[0]
81         lhs = None
82         rhs = None
83         for i in range(1, len(data)/2):
84                 if lhs == None:
85                         if (peak-i > 0 and data[peak-i] < 0.50*maxval):
86                                 lhs = data[peak-i][u]
87                 if rhs == None:
88                         if (peak+i < len(data) and data[peak+i] < 0.50*maxval):
89                                 rhs = peak+i
90                 if lhs != None and rhs != None:
91                         break
92         if rhs == None or lhs == None:
93                 return abs(data[len(data)-1][0] - data[0][0])
94         else:
95                 return abs(rhs - lhs)
96
97 def SaveData(filename, data):
98         out = open(filename, "w", 0)
99         for a in data:
100                 out.write(str(a[0]) + "\t" + str(a[1]) + "\n")
101
102
103 def main():     
104         if (len(sys.argv) < 2):
105                 sys.stderr.write(sys.argv[0] + " - Require arguments (filename)\n")
106                 return 1
107
108         tcs = []
109         gnuplot("set style data lp")
110         gnuplot("set key outside right")
111         #gnuplot("set title \"Au on Si (50min 3.5A 3-6 e-8mbar)\"")
112         #gnuplot("set xlabel \"E (DAC Counts)\"")
113         #gnuplot("set ylabel \"S(E) (ADC/DAC Counts)\"")
114         #gnuplot("set term postscript colour")
115         #gnuplot("set output \"test.eps\"")
116         for i in range(1, len(sys.argv)):
117                 tcs.append(MaxNormalise(map(lambda e : [e[1], e[2]], GetData(sys.argv[i]))))
118                 #tcs.append(GetTCS(GetData(sys.argv[i])))
119                 if (len(tcs[i-1]) > 0):
120                         gnuplot.replot(Gnuplot.Data(tcs[i-1], title=sys.argv[i], with_="lp"))
121
122         # Now average the data
123         
124
125         
126         avg = Average(tcs)
127         gnuplot.replot(Gnuplot.Data(avg, title="Average", with_="l lw 2"))
128         
129         sys.stdout.write("Save averaged data as (blank for no save): ")
130         filename = sys.stdin.readline().strip(" \r\n\t")
131         if (filename != ""):
132                 SaveData(filename, avg)
133                 
134         return 0
135
136
137 if __name__ == "__main__":
138         sys.exit(main())

UCC git Repository :: git.ucc.asn.au