1. ############################################################################
    #
    #   Name:           free_space_loss.py
    #   Python:         3.3.2 on win32
    #   Autor:          Adrian Haas
    #   
    ############################################################################
    #Free space loss
    ############################################################################
    #
    # The script calculates a free space loss map, depending of antenna type
    # and frequency. The result could be mapped due html/javascript to
    # swisstopo/googlemaps (KLM mapping not supported anymore). The mapping is
    # disabled in this script.
    #
    ############################################################################
    
    
    import numpy as np
    import warnings
    import matplotlib.pyplot as plt
    from matplotlib import cm
    import matplotlib as mpl
    
    #from wgs84_distance import*
    #from html import*
    
    ############################################################################
    #free space loss equation d: distance in km, f: frequency in GHz
    ############################################################################
    
    fsl=lambda d,f: 92.45+20*np.log10(d)+20*np.log10(f)
    
    ############################################################################
    #antenna model
    ############################################################################
    
    
    #create gaussian antenna pattern  (fantasy model)
    pattern_deg=np.arange(-np.pi,np.pi,np.pi/160)
    func0=lambda t,mean,var: np.exp(-(t-mean)**2/2/var)
    pattern_att=40*(func0(pattern_deg,0,np.pi/2)-1)
     #-1: 0 as max.; 40 for lower the side att. a little
    
    #direction of antenna
    dir_gamma=3*np.pi/4
    pattern_att=np.roll(pattern_att, int(len(pattern_att)*dir_gamma/2/np.pi))
    
    
    ############################################################################
    #Create and calculate tables
    ############################################################################
    
    
    #creating area: distance between points=res*1km
    res=0.004
    xlen=2000
    ylen=2000
    
    #geocoding
    place=np.array([245055,679460]) #Uetliberg
    
    #place antenna
    centerx=xlen/2
    centery=ylen/2
    
    
    #distance matrix
    dp=lambda i,j:((i-centerx)**2+(j-centery)**2)**0.5*res
    
    #set frequency GHz
    f=1.8
    
    # ignore warning due log at center (idle problem)
    warnings.filterwarnings("ignore")
    
    fsl_table=np.fromfunction(lambda i,j:fsl(dp(i,j),f),(xlen,ylen),
                              dtype=int)
    
    #set center from -inf to nb. value
    fsl_table[centerx,centery]=fsl_table[centerx+1,centery+1]
    
    #calculate isotropic radiation, outputpower in dBm
    outputpower=45
    field=outputpower-fsl_table
    
    
    #degree matrix and antenna model
    degree_table=np.fromfunction(lambda i,j:
                                 np.angle((i-centerx)+1j*(j-centery))
                                 ,(xlen,ylen),dtype=int)
    
    #map antenna attenuation depending on degree
    
    matrix=degree_table.copy()
    matrix_ref=matrix.copy()
    k=0
    while k<(len(pattern_att))/2:
        mask=matrix_ref>=pattern_deg[k]
        matrix[mask]=pattern_att[k]
        k+=1
    
    while k<(len(pattern_att))-1:
        mask=matrix_ref>=pattern_deg[k]
        matrix[mask]=pattern_att[k+1]
        k+=1
    
    
    #caluclate antenna radiation; antenna gain in dBi
    antennagain=20
    field2=field+matrix
    
    x=place[0]
    y=place[1]
    pix=400
    name='out'
    map_nr=1
    xlen=res*xlen*1000
    ylen=res*ylen*1000
    
    
    ############################################################################
    #matplotlib output
    ############################################################################
    
    plt.figure("Antenna pattern")
    plt.plot(pattern_deg,pattern_att)
    plt.xlabel("rad")
    plt.ylabel("dB")
    
    plt.figure("GIS Model für Funkfeld")
    plt.subplot(221)
    plt.title("isotropischer Kugelstrahler")
    plt.imshow(field,interpolation='nearest', cmap=cm.jet,vmin=-80,
               vmax=-40,  aspect=1)
    plt.colorbar().set_label("$dBm$",rotation=0, labelpad=20)
    plt.subplot(222)
    plt.title("Richtungsmatrix")
    plt.imshow(degree_table,interpolation='nearest', cmap=cm.jet,  aspect=1)
    plt.colorbar().set_label("$rad$",rotation=0, labelpad=20)
    plt.subplot(223)
    plt.title("Patternmatrix")
    plt.imshow(matrix,interpolation='nearest', cmap=cm.jet,  aspect=1)
    plt.colorbar().set_label("$dB$",rotation=0, labelpad=20)
    plt.subplot(224)
    plt.title("Funkfeld mit Antenne")
    plt.imshow(field2,interpolation='nearest', cmap=cm.jet,vmin=-80,
               vmax=-40,  aspect=1)
    plt.colorbar().set_label("$dBm$",rotation=0, labelpad=20)
    plt.show()