<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"Segoe UI Emoji";
        panose-1:2 11 5 2 4 2 4 2 2 3;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle19
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">Hi Markus<o:p></o:p></p>
<p class="MsoNormal">As always thank you for the prompt response <span style="font-family:"Segoe UI Emoji",sans-serif">
😊</span><o:p></o:p></p>
<p class="MsoNormal">I think maybe the fix is not a fix then as we had done this upgrade to GRASS 7.4.2 and the re-installation of the addons and testing just a few hours ago … (???)<o:p></o:p></p>
<p class="MsoNormal">I’ll include the code of the broken r.width.funct.py below just in case.<o:p></o:p></p>
<p class="MsoNormal"><span style="font-family:"Segoe UI Emoji",sans-serif">😊</span><o:p></o:p></p>
<p class="MsoNormal">Chris<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Broken r.width.funct.py:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#!/usr/bin/env python<o:p></o:p></p>
<p class="MsoNormal">################################################################################<o:p></o:p></p>
<p class="MsoNormal">#<o:p></o:p></p>
<p class="MsoNormal"># MODULE:       r.width.funct<o:p></o:p></p>
<p class="MsoNormal">#<o:p></o:p></p>
<p class="MsoNormal"># AUTHOR(S):    Massimo Di Stefano, Francesco Di Stefano, Margherita Di Leo<o:p></o:p></p>
<p class="MsoNormal">#<o:p></o:p></p>
<p class="MsoNormal"># PURPOSE:      The module produces the Width Function of a basin. The Width<o:p></o:p></p>
<p class="MsoNormal">#               Function W(x) gives the number of the cells in a basin at a<o:p></o:p></p>
<p class="MsoNormal">#               flow distance x from the outlet (distance-area function)<o:p></o:p></p>
<p class="MsoNormal">#<o:p></o:p></p>
<p class="MsoNormal"># COPYRIGHT:    (c) 2010 Massimo Di Stefano, Francesco Di Stefano, Margherita Di Leo<o:p></o:p></p>
<p class="MsoNormal">#<o:p></o:p></p>
<p class="MsoNormal">#               This program is free software under the GNU General Public<o:p></o:p></p>
<p class="MsoNormal">#               License (>=v2). Read the file COPYING that comes with GRASS<o:p></o:p></p>
<p class="MsoNormal">#               for details.<o:p></o:p></p>
<p class="MsoNormal">#<o:p></o:p></p>
<p class="MsoNormal"># REQUIRES:     Matplotlib<o:p></o:p></p>
<p class="MsoNormal">#                 http://matplotlib.sourceforge.net/<o:p></o:p></p>
<p class="MsoNormal">#<o:p></o:p></p>
<p class="MsoNormal">#<o:p></o:p></p>
<p class="MsoNormal">################################################################################<o:p></o:p></p>
<p class="MsoNormal">#%module<o:p></o:p></p>
<p class="MsoNormal">#% description: Calculates the Width Function of a watershed basin.<o:p></o:p></p>
<p class="MsoNormal">#% keyword: raster<o:p></o:p></p>
<p class="MsoNormal">#% keyword: hydrology<o:p></o:p></p>
<p class="MsoNormal">#%end<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#%option G_OPT_R_INPUT<o:p></o:p></p>
<p class="MsoNormal">#% key: map<o:p></o:p></p>
<p class="MsoNormal">#% description: Distance to outlet map (from r.stream.distance)<o:p></o:p></p>
<p class="MsoNormal">#% required: yes<o:p></o:p></p>
<p class="MsoNormal">#%end<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#%option G_OPT_F_OUTPUT<o:p></o:p></p>
<p class="MsoNormal">#% key: image<o:p></o:p></p>
<p class="MsoNormal">#% key_desc: image<o:p></o:p></p>
<p class="MsoNormal">#% description: Name for output graph file (png)<o:p></o:p></p>
<p class="MsoNormal">#% required: yes<o:p></o:p></p>
<p class="MsoNormal">#%END<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">import sys<o:p></o:p></p>
<p class="MsoNormal">import os<o:p></o:p></p>
<p class="MsoNormal">import matplotlib #required by windows<o:p></o:p></p>
<p class="MsoNormal">matplotlib.use('wx') #required by windows<o:p></o:p></p>
<p class="MsoNormal">import matplotlib.pyplot as plt<o:p></o:p></p>
<p class="MsoNormal">import grass.script as grass<o:p></o:p></p>
<p class="MsoNormal">import numpy as np<o:p></o:p></p>
<p class="MsoNormal">from operator import itemgetter<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">def main():<o:p></o:p></p>
<p class="MsoNormal">    stats = grass.read_command('r.stats', input = options['map'], sep = 'space', nv = '*', nsteps = '255', flags = 'Anc').split('\n')[:-1]<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">    # res = cellsize<o:p></o:p></p>
<p class="MsoNormal">    res = grass.region()['nsres']<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">    zn = np.zeros((len(stats),4),float)<o:p></o:p></p>
<p class="MsoNormal">    kl = np.zeros((len(stats),2),float)<o:p></o:p></p>
<p class="MsoNormal">    prc = np.zeros((9,2),float)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">    for i in range(len(stats)):<o:p></o:p></p>
<p class="MsoNormal">        if i == 0:<o:p></o:p></p>
<p class="MsoNormal">            zn[i,0],  zn[i,1] = map(float, stats[i].split(' '))<o:p></o:p></p>
<p class="MsoNormal">            zn[i,1] = zn[i,1]<o:p></o:p></p>
<p class="MsoNormal">            zn[i,2] = zn[i,1] * res<o:p></o:p></p>
<p class="MsoNormal">        if i != 0:<o:p></o:p></p>
<p class="MsoNormal">            zn[i,0],  zn[i,1] = map(float, stats[i].split(' '))<o:p></o:p></p>
<p class="MsoNormal">            zn[i,2] = zn[i,1] + zn[i-1,2]<o:p></o:p></p>
<p class="MsoNormal">            zn[i,3] = zn[i,1] * (res**2)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">    totcell = sum(zn[:,1])<o:p></o:p></p>
<p class="MsoNormal">    print "Tot. cells", totcell<o:p></o:p></p>
<p class="MsoNormal">    totarea = totcell * (res**2)<o:p></o:p></p>
<p class="MsoNormal">    print "Tot. area", totarea<o:p></o:p></p>
<p class="MsoNormal">    maxdist = max(zn[:,0])<o:p></o:p></p>
<p class="MsoNormal">    print "Max distance", maxdist<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">    for i in range(len(stats)):<o:p></o:p></p>
<p class="MsoNormal">        kl[i,0] = zn[i,0]<o:p></o:p></p>
<p class="MsoNormal">        kl[i,1] = zn[i,2] / totcell<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">    # quantiles<o:p></o:p></p>
<p class="MsoNormal">    prc[0,0] , prc[0,1] = findint(kl,0.05) , 0.05<o:p></o:p></p>
<p class="MsoNormal">    prc[1,0] , prc[1,1] = findint(kl,0.15) , 0.15<o:p></o:p></p>
<p class="MsoNormal">    prc[2,0] , prc[2,1] = findint(kl,0.3) , 0.3<o:p></o:p></p>
<p class="MsoNormal">    prc[3,0] , prc[3,1] = findint(kl,0.4) , 0.4<o:p></o:p></p>
<p class="MsoNormal">    prc[4,0] , prc[4,1] = findint(kl,0.5) , 0.5<o:p></o:p></p>
<p class="MsoNormal">    prc[5,0] , prc[5,1] = findint(kl,0.6) , 0.6<o:p></o:p></p>
<p class="MsoNormal">    prc[6,0] , prc[6,1] = findint(kl,0.7) , 0.7<o:p></o:p></p>
<p class="MsoNormal">    prc[7,0] , prc[7,1] = findint(kl,0.85) , 0.85<o:p></o:p></p>
<p class="MsoNormal">    prc[8,0] , prc[8,1] = findint(kl,0.95) , 0.95<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">    # plot<o:p></o:p></p>
<p class="MsoNormal">    plotImage(zn[:,0], zn[:,3], options['image']+'_width_function.png','-','x','W(x)','Width Function')<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">    print "==========================="<o:p></o:p></p>
<p class="MsoNormal">    print "Width Function | quantiles"<o:p></o:p></p>
<p class="MsoNormal">    print "==========================="<o:p></o:p></p>
<p class="MsoNormal">    print '%.0f' %findint(kl,0.05) , "|", 0.05<o:p></o:p></p>
<p class="MsoNormal">    print '%.0f' %findint(kl,0.15) , "|", 0.15<o:p></o:p></p>
<p class="MsoNormal">    print '%.0f' %findint(kl,0.3) , "|", 0.3<o:p></o:p></p>
<p class="MsoNormal">    print '%.0f' %findint(kl,0.4) , "|", 0.4<o:p></o:p></p>
<p class="MsoNormal">    print '%.0f' %findint(kl,0.5) , "|", 0.5<o:p></o:p></p>
<p class="MsoNormal">    print '%.0f' %findint(kl,0.6) , "|", 0.6<o:p></o:p></p>
<p class="MsoNormal">    print '%.0f' %findint(kl,0.7) , "|", 0.7<o:p></o:p></p>
<p class="MsoNormal">    print '%.0f' %findint(kl,0.85) , "|", 0.85<o:p></o:p></p>
<p class="MsoNormal">    print '%.0f' %findint(kl,0.95) , "|", 0.95<o:p></o:p></p>
<p class="MsoNormal">    print '\n'<o:p></o:p></p>
<p class="MsoNormal">    print 'Done!'<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">def plotImage(x,y,image,type,xlabel,ylabel,title):<o:p></o:p></p>
<p class="MsoNormal">    plt.plot(x, y, type)<o:p></o:p></p>
<p class="MsoNormal">    plt.ylabel(ylabel)<o:p></o:p></p>
<p class="MsoNormal">    plt.xlabel(xlabel)<o:p></o:p></p>
<p class="MsoNormal">    plt.xlim( min(x), max(x) )<o:p></o:p></p>
<p class="MsoNormal">    plt.ylim( min(y), max(y) )<o:p></o:p></p>
<p class="MsoNormal">    plt.title(title)<o:p></o:p></p>
<p class="MsoNormal">    plt.grid(True)<o:p></o:p></p>
<p class="MsoNormal">    plt.savefig(image)<o:p></o:p></p>
<p class="MsoNormal">    plt.close('all')<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">def findint(kl,f):<o:p></o:p></p>
<p class="MsoNormal">    Xf = np.abs(kl-f); <o:p></o:p></p>
<p class="MsoNormal">    Xf = np.where(Xf==Xf.min())<o:p></o:p></p>
<p class="MsoNormal">    item = itemgetter(0)(Xf)<o:p></o:p></p>
<p class="MsoNormal">    Xf = item[0]<o:p></o:p></p>
<p class="MsoNormal">    z1, z2, f1, f2 = kl[int(Xf[0])][0], kl[int(Xf[0]-1)][0], kl[int(Xf[0])][1], kl[int(Xf[0]-1)][1]<o:p></o:p></p>
<p class="MsoNormal">    z = z1 + ((z2 - z1) / (f2 - f1)) * (f - f1)<o:p></o:p></p>
<p class="MsoNormal">    return z<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">if __name__ == "__main__":<o:p></o:p></p>
<p class="MsoNormal">    options, flags = grass.parser()<o:p></o:p></p>
<p class="MsoNormal">    sys.exit(main())<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b>From:</b> Markus Neteler <neteler@osgeo.org> <br>
<b>Sent:</b> Thursday, November 1, 2018 2:02 PM<br>
<b>To:</b> Bartolomei.Chris <Bartolomei.Chris@ensco.com><br>
<b>Cc:</b> GRASS developers list <grass-dev@lists.osgeo.org>; GRASS user list <grass-user@lists.osgeo.org><br>
<b>Subject:</b> Re: latest r.width.funct.py appears to be broken<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> 
<o:p></o:p></p>
<div style="border:solid windowtext 1.0pt;padding:1.0pt 4.0pt 1.0pt 4.0pt">
<p class="MsoNormal" align="center" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-align:center">
<strong><span style="font-size:12.0pt;font-family:"Arial",sans-serif;color:red">*** WARNING ***</span></strong><br>
<span style="font-size:10.0pt;font-family:"Arial",sans-serif">EXTERNAL EMAIL -- This message originates from outside ENSCO Inc.</span><o:p></o:p></p>
</div>
<p class="MsoNormal"> <br>
 <o:p></o:p></p>
<div>
<div>
<div>
<div>
<p class="MsoNormal">On Thu, Nov 1, 2018 at 6:35 PM Bartolomei.Chris <<a href="mailto:Bartolomei.Chris@ensco.com">Bartolomei.Chris@ensco.com</a>> wrote:<o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<p class="MsoNormal">Good afternoon Markus & Co.  <span style="font-family:"Segoe UI Emoji",sans-serif">
😊</span><br>
<br>
It appears that the latest version of <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__r.width.funct.py&d=DwMFaQ&c=DsZY2bea7iNIzyp-7sZ0t0F2UfNQZUfZhEPCv_2wBI0&r=O31ltou6ygJL2Y01kQyNJJD2kiILIsbyz2V0Hn4lFUY&m=XhRpuNDp6HFiTJYSL5gD0-64qjw6Kdg34dAHLBt512o&s=VeM6lBqMFVRt3wxr_4NxdnE8FRa5n8MzEzqzjPN_3hI&e=">
r.width.funct.py</a> is not functioning properly ... We have a few Windows10 systems here running GRASS; I'm on v7.4.0 and another person has (had) 7.2.2. She was trying to run r.basin on a 30m resolution DEM and kept getting the following error:<br>
<br>
Traceback (most recent call last):<br>
  File "C:\Users\XXX\AppData\Roaming\GRASS7\addons/scripts/<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__r.width.funct.py&d=DwMFaQ&c=DsZY2bea7iNIzyp-7sZ0t0F2UfNQZUfZhEPCv_2wBI0&r=O31ltou6ygJL2Y01kQyNJJD2kiILIsbyz2V0Hn4lFUY&m=XhRpuNDp6HFiTJYSL5gD0-64qjw6Kdg34dAHLBt512o&s=VeM6lBqMFVRt3wxr_4NxdnE8FRa5n8MzEzqzjPN_3hI&e=">r.width.funct.py</a>",
 line 135, in <module><br>
    sys.exit(main())<br>
  File "C:\Users\XXX\AppData\Roaming\GRASS7\addons/scripts/<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__r.width.funct.py&d=DwMFaQ&c=DsZY2bea7iNIzyp-7sZ0t0F2UfNQZUfZhEPCv_2wBI0&r=O31ltou6ygJL2Y01kQyNJJD2kiILIsbyz2V0Hn4lFUY&m=XhRpuNDp6HFiTJYSL5gD0-64qjw6Kdg34dAHLBt512o&s=VeM6lBqMFVRt3wxr_4NxdnE8FRa5n8MzEzqzjPN_3hI&e=">r.width.funct.py</a>",
 line 84, in main<br>
    prc[0,0] , prc[0,1] = findint(kl,0.05) , 0.05<br>
  File "C:\Users\XXX\AppData\Roaming\GRASS7\addons/scripts/<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__r.width.funct.py&d=DwMFaQ&c=DsZY2bea7iNIzyp-7sZ0t0F2UfNQZUfZhEPCv_2wBI0&r=O31ltou6ygJL2Y01kQyNJJD2kiILIsbyz2V0Hn4lFUY&m=XhRpuNDp6HFiTJYSL5gD0-64qjw6Kdg34dAHLBt512o&s=VeM6lBqMFVRt3wxr_4NxdnE8FRa5n8MzEzqzjPN_3hI&e=">r.width.funct.py</a>",
 line 128, in findint<br>
    z1, z2, f1, f2 = kl[int(Xf[0])][0], kl[int(Xf[0]-1)][0], kl[int(Xf[0])][1], kl[int(Xf[0]-1)][1]<br>
IndexError: invalid index to scalar variable.<o:p></o:p></p>
</blockquote>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">This was fixed the other day by madi :)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">2018-10-23 03:26:54 -0700 (Tue, 23 Oct 2018)<br>
New Revision: 73602 <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">To get that, just reinstall the addon with g.extension.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Best<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Markus<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">PS: thanks anyway for the updated script! The author solved it in a slightly different way.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><br>
-- <br>
Markus Neteler, PhD<br>
<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__www.mundialis.de&d=DwMFaQ&c=DsZY2bea7iNIzyp-7sZ0t0F2UfNQZUfZhEPCv_2wBI0&r=O31ltou6ygJL2Y01kQyNJJD2kiILIsbyz2V0Hn4lFUY&m=XhRpuNDp6HFiTJYSL5gD0-64qjw6Kdg34dAHLBt512o&s=FvF_73Tv4UlH_EK_kL7lUtvOXXrdSar0Mky6c_7Wy2Q&e=">http://www.mundialis.de</a>
 - free data with free software<br>
<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__grass.osgeo.org&d=DwMFaQ&c=DsZY2bea7iNIzyp-7sZ0t0F2UfNQZUfZhEPCv_2wBI0&r=O31ltou6ygJL2Y01kQyNJJD2kiILIsbyz2V0Hn4lFUY&m=XhRpuNDp6HFiTJYSL5gD0-64qjw6Kdg34dAHLBt512o&s=-N2L_zQo78vOZVe5P6HJHWh57_tF0wxmstz5xHrjPik&e=">http://grass.osgeo.org</a><br>
<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__courses.neteler.org_blog&d=DwMFaQ&c=DsZY2bea7iNIzyp-7sZ0t0F2UfNQZUfZhEPCv_2wBI0&r=O31ltou6ygJL2Y01kQyNJJD2kiILIsbyz2V0Hn4lFUY&m=XhRpuNDp6HFiTJYSL5gD0-64qjw6Kdg34dAHLBt512o&s=IBoPPRP1JM5TZZ0Dx8qozMXD-0EXlx0fy45x4eVfy-o&e=">http://courses.neteler.org/blog</a><o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
</div>
</div>
</body>
</html>