Source code for diaGrabber.target.fineMatrix
# -*- coding: utf-8 *-*
from _matrix import matrixBase
from copy import deepcopy
[docs]class fineMatrix(matrixBase):
'''
Takes one or more source-instances as list.
Inherits all methods of :class:`diaGrabber.target._matrix.matrixBase`
This class isn't as fast as :class:`.coarseMatrix` but can assign values
in a more accurate way if the following condition is fullfilled:
.. note:: number of datapoints in matrix>> matrix-resolution
.. image:: _static/fineMatrix_1D.png
.. image:: _static/fineMatrix_2D.png
'''
def __init__(self, sourceClassList):
super(fineMatrix, self).__init__(sourceClassList)
#self._basis_dim = basis_dim
self.positionsIntensities = [[[ ],1]]
self.anzAffectedCells = 2**self.nBasis
self.affectedCellCounter = []
for i in range(1,self.nBasis+1,1):
self.affectedCellCounter.append((2**i/2) -1)
for i in range(self.nBasis):
self.positionsIntensities[0][0].append(0)
for i in range(self.anzAffectedCells-1):
#1D: 2 cells
#2D: 4 cells
#3D: 8 cells
self.positionsIntensities.append(deepcopy(self.positionsIntensities[0]))
def _getPositionsIntensities(self, sourceClass):
for i in range(self.anzAffectedCells):#reset intensities (later there is a *=)
self.positionsIntensities[i][1] = 1
for i,basis in enumerate(sourceClass._basis_dim):#range(self.nBasis):
difference_list = self.basisMatrix[i] - basis._recent_value
difference_list = abs(difference_list)
nearest_point = difference_list.argmin()
self._basis_dim[i]._recent_position = nearest_point
if nearest_point == 0:#is first point of array - neared point is seond point
sec_nearest_point = 1
elif nearest_point == difference_list.size-1:#is last point of array
sec_nearest_point = difference_list.size-2
else:##whose of the neigbours is closer
if difference_list[nearest_point-1] < difference_list[nearest_point+1]:
sec_nearest_point = nearest_point-1
else:
sec_nearest_point = nearest_point+1
#sec_nearest_point get some of the intensity of the nearest point
transfered_intensity = (difference_list[sec_nearest_point]-
difference_list[nearest_point]) / difference_list[sec_nearest_point]
n = 0
write_point = nearest_point
nearest_intensity = 1 - transfered_intensity
sec_nearest_intensity = transfered_intensity
intensity = nearest_intensity
for j in range(self.anzAffectedCells):
self.positionsIntensities[j][0][i] = write_point
self.positionsIntensities[j][1] *= intensity
if n == self.affectedCellCounter[i]:
if write_point == nearest_point:
write_point = sec_nearest_point
intensity = sec_nearest_intensity
else:
write_point = nearest_point
intensity = nearest_intensity
n = -1
n += 1