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