Automatic commit. Tue Sep 11 00:00:04 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 DoNothing(data):
32         return data
33
34 def GetDataSets(directory=".", function=DoNothing):
35         dirs = {}
36         for f in os.listdir(directory):
37                 if os.path.isdir(directory+"/"+str(f)) == True:
38                         data_set = []
39                         for datafile in os.listdir(directory+"/"+str(f)):
40                                 if datafile.split(".")[1] == "dat":
41                                         data_set.append(function(map(lambda e : [e[1], e[2]], GetData("./"+str(f)+"/"+str(datafile)))))
42
43                         avg = Average(data_set)
44                         dirs.update({f : avg})
45         return dirs
46
47
48
49 def Derivative(data, a=0, b=1):
50         result = []
51         n = 0
52         dI = 0
53         dE = 0
54         for i in range(1, len(data)-1):
55                 dE = data[i+1][a] - data[i][a]
56                 if (dE != 0):
57                         n = 0
58                         dI = 0
59                 
60                 n += 1
61                 dI += data[i+1][b] - data[i][b]                 
62                 if (dE != 0):                   
63                         result.append([data[i][a], (dI / (n * dE)) ] ) #/ data[i][2]])
64         return result
65
66 def MaxNormalise(data, u=1):
67         maxval = max(data, key = lambda e : e[u])[u]
68         
69         result = copy.deepcopy(data)
70         for d in result:
71                 d[u] = d[u] / maxval
72                 
73         return result
74         
75 def Average(data_sets, u=1): 
76         avg = odict.odict()
77         for t in data_sets:
78                 for p in t:
79                         if p[0] in avg:
80                                 avg[p[0]][0] += p[u]
81                                 avg[p[0]][1] += 1
82                         else:
83                                 avg.update({p[0] : [p[u], 1]})
84
85         for a in avg.keys():
86                 avg[a] = float(avg[a][0]) / float(avg[a][1])
87         return sorted(avg.items(), key = lambda e : e[0])
88
89 def Plot(*args):
90         gnuplot.plot(args)
91
92 def FitTCS(data):
93         pass
94
95 def FullWidthAtHalfMax(data, u=1):
96         maxval = max(data, key = lambda e : e[u])
97         peak = data.index(maxval)
98         maxval = maxval[0]
99         lhs = None
100         rhs = None
101         for i in range(1, len(data)/2):
102                 if lhs == None:
103                         if (peak-i > 0 and data[peak-i] < 0.50*maxval):
104                                 lhs = data[peak-i][u]
105                 if rhs == None:
106                         if (peak+i < len(data) and data[peak+i] < 0.50*maxval):
107                                 rhs = peak+i
108                 if lhs != None and rhs != None:
109                         break
110         if rhs == None or lhs == None:
111                 return abs(data[len(data)-1][0] - data[0][0])
112         else:
113                 return abs(rhs - lhs)
114
115 def SaveData(filename, data):
116         out = open(filename, "w", 0)
117         for a in data:
118                 out.write(str(a[0]) + "\t" + str(a[1]) + "\n")
119
120
121 def main():     
122         if (len(sys.argv) < 2):
123                 sys.stderr.write(sys.argv[0] + " - Require arguments (filename)\n")
124                 return 1
125
126         tcs = []
127         gnuplot("set style data lp")
128         gnuplot("set key outside right")
129         #gnuplot("set title \"Au on Si (50min 3.5A 3-6 e-8mbar)\"")
130         #gnuplot("set xlabel \"E (DAC Counts)\"")
131         #gnuplot("set ylabel \"S(E) (ADC/DAC Counts)\"")
132         #gnuplot("set term postscript colour")
133         #gnuplot("set output \"test.eps\"")
134         for i in range(1, len(sys.argv)):
135                 tcs.append(Derivative(map(lambda e : [e[1], e[2]], GetData(sys.argv[i]))))
136                 #tcs.append(GetTCS(GetData(sys.argv[i])))
137                 if (len(tcs[i-1]) > 0):
138                         gnuplot.replot(Gnuplot.Data(tcs[i-1], title=sys.argv[i], with_="lp"))
139
140         # Now average the data
141         
142
143         
144         avg = Average(tcs)
145         #gnuplot.replot(Gnuplot.Data(avg, title="Average", with_="l lw 2"))
146         
147         sys.stdout.write("Save averaged data as (blank for no save): ")
148         filename = sys.stdin.readline().strip(" \r\n\t")
149         if (filename != ""):
150                 SaveData(filename, avg)
151                 
152         return 0
153
154
155 if __name__ == "__main__":
156         sys.exit(main())

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