1from paida.paida_core.PAbsorber import *
2from paida.paida_core.IAnnotation import *
3from paida.paida_core.PExceptions import *
4
5import paida.paida_core.IBaseHistogram
6import paida.paida_core.PUtilities
7import paida.paida_core.PTypes as PAIDA_Types
8
9import math
10import types
11
12def _converterObject(data):
13	return data
14
15class ITuple(object):
16	__slots__ = ('_rowBuffer', '_rowIndex', '_rows', '_columnConverters', '_columnDefaults', '_columnNames', '_name', '_analyzedOption', '_annotation')
17
18	def __init__(self, name, title, analyzedOption, columnNames, columnDefaults, columnConverters):
19		self._annotation = IAnnotation()
20		self._annotation.addItem('Title', title, True)
21
22		self._name = name
23		self._analyzedOption = analyzedOption
24		self._columnNames = columnNames
25		self._columnDefaults = columnDefaults
26		self._columnConverters = columnConverters
27
28		self._rowBuffer = columnDefaults[:]
29		self._rows = []
30		self._rowIndex = -1
31
32	def _getOption(self):
33		return self._analyzedOption
34
35	def _setOptionString(self, optionString):
36		self._analyzedOption = paida.paida_core.PUtilities.optionAnalyzer(optionString)
37
38	def _getOptionString(self):
39		return paida.paida_core.PUtilities.optionConstructor(self._analyzedOption)
40
41	def annotation(self):
42		return self._annotation
43
44	def title(self):
45		return self.annotation().value('Title')
46
47	def setTitle(self, title):
48		self.annotation().setValue('Title', title)
49
50	def fill(self, data1, data2 = None):
51		if data2 == None:
52			for columnIndex, converter in enumerate(self._columnConverters):
53				self._rowBuffer[columnIndex] = converter(data1[columnIndex])
54		else:
55			self._rowBuffer[data1] = self._columnConverters[data1](data2)
56
57	def addRow(self):
58		self._rows.append(self._rowBuffer)
59		self._rowBuffer = self._columnDefaults[:]
60
61	def resetRow(self):
62		self._rowBuffer = self._columnDefaults[:]
63
64	def reset(self):
65		self._annotation.reset()
66		self._rowBuffer = self._columnDefaults[:]
67		self._rows = []
68		self._rowIndex = -1
69
70	def rows(self):
71		return len(self._rows)
72
73	def start(self):
74		self._rowIndex = -1
75
76	def skip(self, nRows):
77		if nRows < 0:
78			raise ValueError, 'Must be positive.'
79		elif self._rowIndex + nRows >= len(self._rows):
80			raise ValueError, 'Beyond the rows range.'
81		else:
82			return self._rowIndex + nRows
83
84	def next(self):
85		if self._rowIndex + 1 >= len(self._rows):
86			return False
87		else:
88			self._rowIndex += 1
89			return True
90
91	def setRow(self, rowIndex):
92		if rowIndex >= len(self._rows):
93			raise ValueError, 'Beyond the rows range.'
94		else:
95			self._rowIndex = rowIndex
96
97	def findColumn(self, columnName):
98		return self._columnNames.index(columnName)
99
100	def getDouble(self, columnIndex):
101		if self._rowIndex == -1:
102			return float(self._rowBuffer[columnIndex])
103		else:
104			return float(self._rows[self._rowIndex][columnIndex])
105
106	def getFloat(self, columnIndex):
107		if self._rowIndex == -1:
108			return float(self._rowBuffer[columnIndex])
109		else:
110			return float(self._rows[self._rowIndex][columnIndex])
111
112	def getInt(self, columnIndex):
113		if self._rowIndex == -1:
114			return int(self._rowBuffer[columnIndex])
115		else:
116			return int(self._rows[self._rowIndex][columnIndex])
117
118	def getShort(self, columnIndex):
119		if self._rowIndex == -1:
120			return int(self._rowBuffer[columnIndex])
121		else:
122			return int(self._rows[self._rowIndex][columnIndex])
123
124	def getLong(self, columnIndex):
125		if self._rowIndex == -1:
126			return long(self._rowBuffer[columnIndex])
127		else:
128			return long(self._rows[self._rowIndex][columnIndex])
129
130	def getChar(self, columnIndex):
131		if self._rowIndex == -1:
132			return str(self._rowBuffer[columnIndex])
133		else:
134			return str(self._rows[self._rowIndex][columnIndex])
135
136	def getByte(self, columnIndex):
137		if self._rowIndex == -1:
138			return int(self._rowBuffer[columnIndex])
139		else:
140			return int(self._rows[self._rowIndex][columnIndex])
141
142	def getBoolean(self, columnIndex):
143		if self._rowIndex == -1:
144			return bool(self._rowBuffer[columnIndex])
145		else:
146			return bool(self._rows[self._rowIndex][columnIndex])
147
148	def getString(self, columnIndex):
149		if self._rowIndex == -1:
150			return str(self._rowBuffer[columnIndex])
151		else:
152			return str(self._rows[self._rowIndex][columnIndex])
153
154	def getObject(self, columnIndex):
155		if self._rowIndex == -1:
156			return self._rowBuffer[columnIndex]
157		else:
158			return self._rows[self._rowIndex][columnIndex]
159
160	def getTuple(self, columnIndex):
161		if self._rowIndex == -1:
162			if self._rowBuffer[columnIndex] == None:
163				tupleRowsData = []
164				self._rowBuffer[columnIndex] = tupleRowsData
165			else:
166				tupleRowsData = self._rowBuffer[columnIndex]
167		else:
168			tupleRowsData = self._rows[self._rowIndex][columnIndex]
169
170		tupleColumnsData = self._columnConverters[columnIndex]
171		name = self._columnNames[columnIndex]
172		newTuple = ITuple(name, name, tupleColumnsData[0], tupleColumnsData[1], tupleColumnsData[2], tupleColumnsData[3])
173		newTuple._rows = tupleRowsData
174		return newTuple
175
176	def columns(self):
177		return len(self._columnNames)
178
179	def columnName(self, columnIndex):
180		return self._columnNames[columnIndex]
181
182	def columnNames(self):
183		return self._columnNames[:]
184
185	def columnType(self, columnIndex):
186		columnConverter = self._columnConverters[columnIndex]
187		if columnConverter == int:
188			return PAIDA_Types.Integer
189		elif columnConverter == long:
190			return PAIDA_Types.Long
191		elif columnConverter == float:
192			return PAIDA_Types.Double
193		elif columnConverter == str:
194			return PAIDA_Types.String
195		elif columnConverter == bool:
196			return PAIDA_Types.Boolean
197		elif columnConverter == _converterObject:
198			return PAIDA_Types.Object
199		else:
200			### ITuple.
201			return PAIDA_Types.ITuple
202
203	def columnTypes(self):
204		result = []
205		for columnIndex in range(self.columns()):
206			result.append(self.columnType(columnIndex))
207		return result
208
209	def columnMin(self, columnIndex):
210		result = self._rows[0][columnIndex]
211		for row in self._rows:
212			result = min(result, row[columnIndex])
213		return float(result)
214
215	def columnMax(self, columnIndex):
216		result = self._rows[0][columnIndex]
217		for row in self._rows:
218			result = max(result, row[columnIndex])
219		return float(result)
220
221	def columnMean(self, columnIndex):
222		_sum = 0.0
223		for row in self._rows:
224			_sum += float(row[columnIndex])
225		try:
226			return _sum / len(self._rows)
227		except ZeroDivisionError:
228			return 0.0
229
230	def columnRms(self, columnIndex):
231		nRows = len(self._rows)
232		_sum = 0.0
233		_square = 0.0
234		for row in self._rows:
235			data = float(row[columnIndex])
236			_sum += data
237			_square += data**2
238		try:
239			result = (_square - _sum**2 / nRows) / nRows
240			if paida.paida_core.IBaseHistogram.IBaseHistogram._meps2 < result < 0.0:
241				return 0.0
242			else:
243				return math.sqrt(result)
244		except ZeroDivisionError:
245			return 0.0
246
247	def project(self, histogram, data1 = None, data2 = None, data3 = None, data4 = None, data5 = None):
248		histogramName = histogram.__class__.__name__
249		data1Name = data1.__class__.__name__
250		data2Name = data2.__class__.__name__
251		data3Name = data3.__class__.__name__
252		data4Name = data4.__class__.__name__
253		data5Name = data5.__class__.__name__
254		histogramFill = histogram.fill
255		currentRowIndex = self._rowIndex
256
257		if histogramName in ['IHistogram1D', 'ICloud1D']:
258			if (data1Name == 'IEvaluator') and (data2Name in ['NoneType', 'org.python.core.PyNone']) and (data3Name in ['NoneType', 'org.python.core.PyNone']) and (data4Name in ['NoneType', 'org.python.core.PyNone']) and (data5Name in ['NoneType', 'org.python.core.PyNone']):
259				evaluatorX = data1
260				filterObject = None
261				weightObject = None
262			elif (data1Name == 'IEvaluator') and (data2Name == 'IFilter') and (data3Name in ['NoneType', 'org.python.core.PyNone']) and (data4Name in ['NoneType', 'org.python.core.PyNone']) and (data5Name in ['NoneType', 'org.python.core.PyNone']):
263				evaluatorX = data1
264				filterObject = data2
265				weightObject = None
266			elif (data1Name == 'IEvaluator') and (data2Name == 'IEvaluator') and (data3Name in ['NoneType', 'org.python.core.PyNone']) and (data4Name in ['NoneType', 'org.python.core.PyNone']) and (data5Name in ['NoneType', 'org.python.core.PyNone']):
267				evaluatorX = data1
268				filterObject = None
269				weightObject = data2
270			elif (data1Name == 'IEvaluator') and (data2Name == 'IFilter') and (data3Name == 'IEvaluator') and (data4Name in ['NoneType', 'org.python.core.PyNone']) and (data5Name in ['NoneType', 'org.python.core.PyNone']):
271				evaluatorX = data1
272				filterObject = data2
273				weightObject = data3
274			else:
275				raise IllegalArgumentException()
276
277			evaluatorX.initialize(self)
278			evaluatDoubleX = evaluatorX.evaluateDouble
279			self.start()
280			if (filterObject == None) and (weightObject == None):
281				while self.next():
282					histogramFill(evaluatDoubleX())
283			elif (filterObject != None) and (weightObject == None):
284				filterObject.initialize(self)
285				filterAccept = filterObject.accept
286				while self.next():
287					if filterAccept():
288						histogramFill(evaluatDoubleX())
289			elif (filterObject == None) and (weightObject != None):
290				weightObject.initialize(self)
291				weightDouble = weightObject.evaluateDouble
292				while self.next():
293					histogramFill(evaluatDoubleX(), weightDouble())
294			else:
295				filterObject.initialize(self)
296				filterAccept = filterObject.accept
297				weightObject.initialize(self)
298				weightDouble = weightObject.evaluateDouble
299				while self.next():
300					if filterAccept():
301						histogramFill(evaluatDoubleX(), weightDouble())
302
303		elif histogramName in ['IHistogram2D', 'ICloud2D', 'IProfile1D']:
304			if (data1Name == 'IEvaluator') and (data2Name == 'IEvaluator') and (data3Name in ['NoneType', 'org.python.core.PyNone']) and (data4Name in ['NoneType', 'org.python.core.PyNone']) and (data5Name in ['NoneType', 'org.python.core.PyNone']):
305				evaluatorX = data1
306				evaluatorY = data2
307				filterObject = None
308				weightObject = None
309			elif (data1Name == 'IEvaluator') and (data2Name == 'IEvaluator') and (data3Name == 'IFilter') and (data4Name in ['NoneType', 'org.python.core.PyNone']) and (data5Name in ['NoneType', 'org.python.core.PyNone']):
310				evaluatorX = data1
311				evaluatorY = data2
312				filterObject = data3
313				weightObject = None
314			elif (data1Name == 'IEvaluator') and (data2Name == 'IEvaluator') and (data3Name == 'IEvaluator') and (data4Name in ['NoneType', 'org.python.core.PyNone']) and (data5Name in ['NoneType', 'org.python.core.PyNone']):
315				evaluatorX = data1
316				evaluatorY = data2
317				filterObject = None
318				weightObject = data3
319			elif (data1Name == 'IEvaluator') and (data2Name == 'IEvaluator') and (data3Name == 'IFilter') and (data4Name == 'IEvaluator') and (data5Name in ['NoneType', 'org.python.core.PyNone']):
320				evaluatorX = data1
321				evaluatorY = data2
322				filterObject = data3
323				weightObject = data4
324			else:
325				raise IllegalArgumentException()
326
327			evaluatorX.initialize(self)
328			evaluatDoubleX = evaluatorX.evaluateDouble
329			evaluatorY.initialize(self)
330			evaluatDoubleY = evaluatorY.evaluateDouble
331			self.start()
332			if (filterObject == None) and (weightObject == None):
333				while self.next():
334					histogramFill(evaluatDoubleX(), evaluatDoubleY())
335			elif (filterObject != None) and (weightObject == None):
336				filterObject.initialize(self)
337				filterAccept = filterObject.accept
338				while self.next():
339					if filterAccept():
340						histogramFill(evaluatDoubleX(), evaluatDoubleY())
341			elif (filterObject == None) and (weightObject != None):
342				weightObject.initialize(self)
343				weightDouble = weightObject.evaluateDouble
344				while self.next():
345					histogramFill(evaluatDoubleX(), evaluatDoubleY(), weightDouble())
346			else:
347				filterObject.initialize(self)
348				filterAccept = filterObject.accept
349				weightObject.initialize(self)
350				weightDouble = weightObject.evaluateDouble
351				while self.next():
352					if filterAccept():
353						histogramFill(evaluatDoubleX(), evaluatDoubleY(), weightDouble())
354
355		elif histogramName in ['IHistogram3D', 'ICloud3D', 'IProfile2D']:
356			if (data1Name == 'IEvaluator') and (data2Name == 'IEvaluator') and (data3Name == 'IEvaluator') and (data4Name in ['NoneType', 'org.python.core.PyNone']) and (data5Name in ['NoneType', 'org.python.core.PyNone']):
357				evaluatorX = data1
358				evaluatorY = data2
359				evaluatorZ = data3
360				filterObject = None
361				weightObject = None
362			elif (data1Name == 'IEvaluator') and (data2Name == 'IEvaluator') and (data3Name == 'IEvaluator') and (data4Name == 'IFilter') and (data5Name in ['NoneType', 'org.python.core.PyNone']):
363				evaluatorX = data1
364				evaluatorY = data2
365				evaluatorZ = data3
366				filterObject = data4
367				weightObject = None
368			elif (data1Name == 'IEvaluator') and (data2Name == 'IEvaluator') and (data3Name == 'IEvaluator') and (data4Name == 'IEvaluator') and (data5Name in ['NoneType', 'org.python.core.PyNone']):
369				evaluatorX = data1
370				evaluatorY = data2
371				evaluatorZ = data3
372				filterObject = None
373				weightObject = data4
374			elif (data1Name == 'IEvaluator') and (data2Name == 'IEvaluator') and (data3Name == 'IEvaluator') and (data4Name == 'IFilter') and (data5Name == 'IEvaluator'):
375				evaluatorX = data1
376				evaluatorY = data2
377				evaluatorZ = data3
378				filterObject = data4
379				weightObject = data5
380			else:
381				raise IllegalArgumentException()
382
383			evaluatorX.initialize(self)
384			evaluatDoubleX = evaluatorX.evaluateDouble
385			evaluatorY.initialize(self)
386			evaluatDoubleY = evaluatorY.evaluateDouble
387			evaluatorZ.initialize(self)
388			evaluatDoubleZ = evaluatorZ.evaluateDouble
389			self.start()
390			if (filterObject == None) and (weightObject == None):
391				while self.next():
392					histogramFill(evaluatDoubleX(), evaluatDoubleY(), evaluatDoubleZ())
393			elif (filterObject != None) and (weightObject == None):
394				filterObject.initialize(self)
395				filterAccept = filterObject.accept
396				while self.next():
397					if filterAccept():
398						histogramFill(evaluatDoubleX(), evaluatDoubleY(), evaluatDoubleZ())
399			elif (filterObject == None) and (weightObject != None):
400				weightObject.initialize(self)
401				weightDouble = weightObject.evaluateDouble
402				while self.next():
403					histogramFill(evaluatDoubleX(), evaluatDoubleY(), evaluatDoubleZ(), weightDouble())
404			else:
405				filterObject.initialize(self)
406				filterAccept = filterObject.accept
407				weightObject.initialize(self)
408				weightDouble = weightObject.evaluateDouble
409				while self.next():
410					if filterAccept():
411						histogramFill(evaluatDoubleX(), evaluatDoubleY(), evaluatDoubleZ(), weightDouble())
412
413		else:
414			raise IllegalArgumentException()
415
416		self._rowIndex = currentRowIndex
417