Source code for FEPdiaGrabber.target._FEPmatrixMethods
# -*- coding: utf-8 *-*
import numpy
from copy import deepcopy
#import bottleneck as bn
#from sys import exit
#from copy import deepcopy
#from scipy.interpolate import griddata
#own modules
#from diaGrabber import source
from diaGrabber import _utils
[docs]class FEPmatrixMethods(object):
def __init__(self):
pass
[docs] def eval2dGaussianDistribution(self, dEB_types=[], merge = None):
print "eval2dGaussianDistribution"
if self.nBasis != 2:
exit("ERROR: eval2dGaussianDistribution works only for 2d-matrixes")
min_dEB_types = [0.25,0.5,0.75]#are at least necassary to get deviation to normaldistr.
for i in min_dEB_types:
if i not in dEB_types:
dEB_types.append(i)#important to the the standard deviation
#from smalles to biggest diameter
dEB_types.sort()
dEB_types.reverse()#e.q.d_EB_75, d_EB_50, d_EB_25
dEB_types.insert(0,0.95)
if merge == None:
merge = self._merge_dim[0]
else:
if merge not in self._merge_dim:
raise KeyError("given merge is not a member of merge-dims im target")
w = merge._mergeIndex
peak = numpy.nanmax(self.mergeMatrix[w])
peak_location = list(numpy.where(self.mergeMatrix[w]==peak))
peak_location[0] = peak_location[0][0]
peak_location[1] = peak_location[1][0]
##removing all nan-values in array:
clean = self.mergeMatrix[w][~numpy.isnan(self.mergeMatrix[w]).any(1)]
##building histogramm (with 5 equal sized bins) of the distribution of the values
histo = numpy.histogram(clean,5)
##the environmental value is defines as the value of the first (lowest) bin
environment = histo[1][0]
dEB_limit = []
dEB = []
border_locations = []
deviationTh2RealList = []
for i in range(len(dEB_types)):
dEB_limit.append((peak-environment)*dEB_types[i] + environment )
dEB.append(numpy.nan)
border_locations.append([])
deviationTh2RealList.append(0)
n_circle_points = 40#has to be int(multiple of 2)
n_part_diameters = n_circle_points/2
delta_radian = 2*numpy.pi / n_circle_points
for d in range(len(dEB_limit)):
radian = 0.0
for i in range(n_circle_points):
n = 0#at peak_location
at_border = False
while not at_border:
x = peak_location[0] + int(n*numpy.cos(radian))
y = peak_location[1] + int(n*numpy.sin(radian))
try:
if not numpy.isnan(self.mergeMatrix[w][x][y]) and self.mergeMatrix[w][x][y] < dEB_limit[d]:#found border
at_border = True
#if [x,y] not in border_locations[d]:
border_locations[d].append([x,y])
except IndexError:
exit("ERROR: peak of merge %s in matrix is to close to border")
n += 1
radian += delta_radian
border_coords = deepcopy(border_locations)
distances = deepcopy(border_locations)
#reset the middle of the gaussiandistr. as the middle of the first (95%) polygon
for i in range(len(border_locations[0])):
border_coords[0][i] = [self.basisMatrix[0][border_locations[0][i][0]],
self.basisMatrix[1][border_locations[0][i][1]]]
polygon = zip(*border_coords[0])
##build mean ... doest work good
##peak_coord= [sum(polygon[0])/len(polygon[0]),sum(polygon[1])/len(polygon[1])]
##build half of max-min:
minx=min(polygon[0])
maxx=max(polygon[0])
miny=min(polygon[1])
maxy=max(polygon[1])
peak_coord= [minx+(maxx-minx)/2, miny+(maxy-miny)/2]
##calc the x-y-coord of all borders in d_EB_types
##and the distance from eBeammiddle to border
print "Gausian-Diameters are..."
for d in range(1,len(dEB_limit)):
for i in range(len(border_locations[d])):
border_coords[d][i] = [self.basisMatrix[0][border_locations[d][i][0]],
self.basisMatrix[1][border_locations[d][i][1]]]
distances[d][i] = _utils.pktAbs2(border_coords[d][i],peak_coord)
#values for dEB_types[i]
dEB[d] = sum(distances[d]) / len(distances[d])#mean
if dEB_types[d] == 0.50:
st_deviation = dEB[d]
print " for %s -> %s" %(dEB_types[d],dEB[d])
##get max/min diameter-factor and the radian(max_diameter) for each d_EB-area
minMax_dEB = []
for d in range(len(dEB_limit)-1):#for each diameter
minMax_dEB.append([None,None,None,None])#min, max, max/min, radian_of_max
for i in range(n_part_diameters):
# == radius + radius in opposite dir.
part_diameter = distances[d+1][i] + distances[d+1][i+n_part_diameters]
#print minMax_dEB, d
if part_diameter < minMax_dEB[d][0] or minMax_dEB[d][0] == None:#min
minMax_dEB[d][0] = part_diameter
if part_diameter > minMax_dEB[d][1] or minMax_dEB[d][1] == None:#max
minMax_dEB[d][1] = part_diameter
minMax_dEB[d][3] = delta_radian * i
minMax_dEB[d][2] = minMax_dEB[d][1] / minMax_dEB[d][0] #max/min
#get mean max/min-factor and mean radian_of_max
mean_maxMin_dEB = 0
mean_max_radian = 0
for d in range(len(dEB_limit)-1):#for each diameter
mean_maxMin_dEB += minMax_dEB[d][2]
mean_max_radian += minMax_dEB[d][3]
mean_maxMin_dEB /= (len(dEB_limit)-1)
mean_max_radian /= (len(dEB_limit)-1)
print "The mean factor max/min-diameter is %s" % mean_maxMin_dEB
print "The mean radian of the max diameter is %s" % mean_max_radian
#calc deviation to a normaldisribution defined as:
#normal_distribution_fn = \
corrF = 1/ (
1/(st_deviation* ((2*numpy.pi)**0.5) ) ) * numpy.e**(-0.5 *
( ( 0 / st_deviation)**2 ) ) * (peak-environment)
for d in range(1,len(dEB_limit)):
for x in distances[d]:
dEB_th = corrF * (
1/(st_deviation* ((2*numpy.pi)**0.5) ) ) * numpy.e**(-0.5 *
( ( x / st_deviation)**2 ) ) * (peak-environment)
deviationTh2RealList[d] += abs( (dEB_th - dEB_limit[d]) / dEB_th)#dEB_limit[d]/dEB_th#
deviationTh2RealList[d] /= (len(distances[d])-1) #middle fo difference between theory and reality
##middle of all deviantion-rings
relDevianceTh2Real = sum(deviationTh2RealList) / ( len(deviationTh2RealList))
print "The relative deviation/variance between theoretical an real distribution is %s" %relDevianceTh2Real
#add point middle of gaussian:
peak_coord.append("Mittelpunkt")
self.plot_overlay[w][0].append(peak_coord)
#self.plot_overlay[w][0].append("Mittelpunkt")#x-,y-list
###redundant!!!->
self.plot_overlay[w][6].append("Mittelpunkt")#x-,y-list
self.plot_overlay[w][5].append("deviation= %s" %relDevianceTh2Real)
self.plot_overlay[w][5].append("maxRad= %s" %mean_max_radian)
self.plot_overlay[w][5].append("max/min-d-factor= %s" %mean_maxMin_dEB)
self.plot_overlay[w][5].append("d_EB50= %s" %dEB[dEB_types.index(0.5)])
#add rings
for d in range(1,len(dEB_limit)):
self.plot_overlay[w][1].append(zip(*border_coords[d]))#x-,y-list
self.plot_overlay[w][1][-1].append("d_EB= %s" %(dEB_types[d]) )#names for legend
###redundant!!!->
self.plot_overlay[w][6].append("d_EB= %s" %(dEB_types[d]) )#x-,y-list
print "done"