Initial SVN upload
[hooke.git] / libhookecurve.py
1 #!/usr/bin/env python
2
3
4 class HookeCurve(object):
5     
6     def __init__(self,path):
7         self.path=path
8         self.curve=Driver()
9         self.notes=''
10     
11     def identify(self, drivers):
12         '''
13         identifies a curve and returns the corresponding object
14         '''
15         for driver in drivers:
16             tempcurve=driver(self.path)
17             if tempcurve.is_me():
18                 #bring on all the driver, with his load of methods etc.
19                 #so we can access the whole of it.
20                 self.curve=tempcurve
21                 del tempcurve
22                 return True
23         
24         print 'Not a recognizable curve format.'
25         return False
26         
27         
28 class Driver:
29     '''
30     Base class for file format drivers.
31     
32     To be overridden
33     '''
34     def __init__(self):
35         self.experiment=''
36     
37     def is_me(self):
38         '''
39         This method must read the file and return True if the filetype can be managed by the driver, False if not.
40         '''
41         return False
42     
43     def close_all(self):
44         '''
45         This method must close all the open files of the driver, explicitly.
46         '''
47         return None
48     
49     def default_plots(self):
50         dummy_default=PlotObject()
51         dummy_default.vectors.append([[[0]],[[0]]])
52         return [dummy_default]
53    
54
55 class PlotObject:
56     
57     def __init__(self):
58         
59         '''
60         the plot destination
61         0=top
62         1=bottom
63         '''
64         self.destination=0 
65         
66         '''
67         self.vectors is a multidimensional array:
68         self.vectors[0]=plot1
69         self.vectors[1]=plot2
70         self.vectors[2]=plot3
71         etc.
72         
73         2 curves in a x,y plot are:
74         [[[x1],[y1]],[[x2],[y2]]]
75         for example:
76             x1          y1              x2         y2
77         [[[1,2,3,4],[10,20,30,40]],[[3,6,9,12],[30,60,90,120]]]
78         x1 = self.vectors[0][0]
79         y1 = self.vectors[0][1]
80         x2 = self.vectors[1][0]
81         y2 = self.vectors[1][1]
82         '''
83         self.vectors=[]
84
85         '''
86         self.units is simpler. for each plot with N axes (x,y,z...) only N labels
87         can be made, regardless of the number of superimposed plots
88         so units for the double plot above is: [unitx, unity]
89         
90         units are strings
91         '''
92         self.units=['','']
93         
94         '''
95         xaxes and yaxes directions. 0,0 means the common +X=right, +Y=top directions
96         '''
97         self.xaxes=0
98         self.yaxes=0
99         
100         self.title='' #title 
101         
102         '''
103         styles: defines what is the style of the current plots. If undefined or None, it is line plot.
104         If an element of the list is 'scatter', the corresponding dataset
105         is drawn with scattered points and not a continuous line.
106         '''
107         self.styles=[]
108         
109     def add_set(self,x,y):
110         '''
111         Adds an x,y data set to the vectors.
112         '''
113         self.vectors.append([])
114         self.vectors[-1].append(x)
115         self.vectors[-1].append(y)
116         return
117     
118     def remove_set(self,whichset):
119         '''
120         Removes a set
121         '''
122         waste=self.vectors.pop(whichset)
123         return
124     
125     def normalize_vectors(self):
126         '''
127         Trims the vector lengths as to be equal in a plot.
128         '''
129         
130         for index in range(0,len(self.vectors)):
131             vectors_to_plot=self.vectors[index]
132             lengths=[len(vector) for vector in vectors_to_plot]
133             if min(lengths) != max(lengths):
134                 for indexplot in range(0,len(vectors_to_plot)):
135                     self.vectors[index][indexplot] = self.vectors[index][indexplot][0:min(lengths)]
136