Sophie

Sophie

distrib > Mandriva > current > i586 > by-pkgid > ae0a4f27f26602dc31c3bf35e18b5b19 > files > 770

python-enthought-chaco-3.4.0-2mdv2010.2.i586.rpm




<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    
    <title>Creating an interactive Hyetograph with Chaco and Traits &mdash; Chaco v3.4.0 documentation</title>
    <link rel="stylesheet" href="../_static/default.css" type="text/css" />
    <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
    <script type="text/javascript">
      var DOCUMENTATION_OPTIONS = {
        URL_ROOT:    '../',
        VERSION:     '3.4.0',
        COLLAPSE_INDEX: false,
        FILE_SUFFIX: '.html',
        HAS_SOURCE:  true
      };
    </script>
    <script type="text/javascript" src="../_static/jquery.js"></script>
    <script type="text/javascript" src="../_static/underscore.js"></script>
    <script type="text/javascript" src="../_static/doctools.js"></script>
    <link rel="shortcut icon" href="../_static/et.ico"/>
    <link rel="top" title="Chaco v3.4.0 documentation" href="../index.html" />
    <link rel="up" title="Tutorials" href="tutorial.html" />
    <link rel="next" title="WX-based Tutorial" href="tutorial_wx.html" />
    <link rel="prev" title="Modeling Van der Waal’s Equation With Chaco and Traits" href="tutorial_2.html" /> 
  </head>
  <body>
    <div class="related">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="tutorial_wx.html" title="WX-based Tutorial"
             accesskey="N">next</a></li>
        <li class="right" >
          <a href="tutorial_2.html" title="Modeling Van der Waal’s Equation With Chaco and Traits"
             accesskey="P">previous</a> |</li>
        <li><a href="../index.html">Chaco v3.4.0 documentation</a> &raquo;</li>
          <li><a href="tutorial.html" accesskey="U">Tutorials</a> &raquo;</li>
  
    <li><a href="#">Creating an interactive Hyetograph with Chaco and Traits</a></li>
  

      </ul>
    </div>  

    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body">
            
  <div class="section" id="creating-an-interactive-hyetograph-with-chaco-and-traits">
<span id="tutorial-hyetograph"></span><h1>Creating an interactive Hyetograph with Chaco and Traits<a class="headerlink" href="#creating-an-interactive-hyetograph-with-chaco-and-traits" title="Permalink to this headline">¶</a></h1>
<div class="section" id="overview">
<h2>Overview<a class="headerlink" href="#overview" title="Permalink to this headline">¶</a></h2>
<p>The perfect rainstorm (not to be confused with The Perfect Storm) has
a rainfall pattern that can be mathematically modelled.  The rain
starts light, progressively gets heavier until halfway though the
storm, gets lighter again, and eventually stops.  Plots of the
rainfall intensity in relation to time are called hyetographs.</p>
<p>This tutorial builds a small application that takes a tiny database of
coefficients, and along with user selected values, displays
hyetographs.  The user provides the duration of the storm, the year of
the storm, and one of four counties in Texas.  Then using a slider
specifying the Curve Number (determined based on the permeability of
the soil) a plot shows the intensity vs. time hyetograph plots.</p>
</div>
<div class="section" id="development-setup">
<h2>Development Setup<a class="headerlink" href="#development-setup" title="Permalink to this headline">¶</a></h2>
<p>To run this demo you must have Chaco and its dependencies installed,</p>
<blockquote>
<div><ul class="simple">
<li>Traits</li>
<li>TraitsGUI</li>
<li>Enable</li>
</ul>
</div></blockquote>
</div>
<div class="section" id="why-use-traits-for-this-application">
<h2>Why use Traits for this application?<a class="headerlink" href="#why-use-traits-for-this-application" title="Permalink to this headline">¶</a></h2>
<ol class="arabic simple">
<li><strong>Event notification</strong> Every time that a trait is changed it sends
out notification to all listening functions.  This means when a
trait is changed in places such as the UI the program will then
notify other traits or functions automatically.</li>
<li><strong>Typing</strong> Within traits you are allowed to define trats as certain
types.  Say you have a trait named Name, you can then define it to
be a string.  Then when you visualize it using the UI, it will
interprit the data as a string.</li>
<li><strong>UI-Generation</strong> After setting up your traits and performing all
the calculations, the Trait&#8217;s will automatically generate a GUI
view without needing any additional programming.</li>
</ol>
</div>
<div class="section" id="importing-the-necessary-functions">
<h2>Importing the necessary functions<a class="headerlink" href="#importing-the-necessary-functions" title="Permalink to this headline">¶</a></h2>
<p>In This tutorial we will be using numpy, traits, traitsui, and chaco.
In calling your function you want to specify where the function is and
then import it.  The following code snippet imports all the names that
will be used for our application.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">enthought.traits.api</span> \
    <span class="kn">import</span> <span class="n">HasTraits</span><span class="p">,</span> <span class="n">Int</span><span class="p">,</span> <span class="n">Range</span><span class="p">,</span> <span class="n">Array</span><span class="p">,</span> <span class="n">Enum</span><span class="p">,</span> <span class="n">on_trait_change</span>
<span class="kn">from</span> <span class="nn">enthought.traits.ui.api</span> <span class="kn">import</span> <span class="n">View</span><span class="p">,</span> <span class="n">Item</span>
<span class="kn">from</span> <span class="nn">enthought.chaco.chaco_plot_editor</span> <span class="kn">import</span> <span class="n">ChacoPlotItem</span>
</pre></div>
</div>
</div>
<div class="section" id="trait-definitions">
<h2>Trait Definitions<a class="headerlink" href="#trait-definitions" title="Permalink to this headline">¶</a></h2>
<p>This application only requires one class that will contain the Traits
and mathematical calculations together.  Classes that contain Traits
must inherit from the HasTraits function.  Python&#8217;s multiple
inheritance allows for mixing HasTraits objects with other class
hierarchies if needed.</p>
<p>Within this class we define all the class variables using Traits types
which will later be used in the UI.  These traits are set to equal
their type similar to many typed languages.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">class</span> <span class="nc">Hyetograph</span><span class="p">(</span><span class="n">HasTraits</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; Creates a simple hyetograph demo. &quot;&quot;&quot;</span>
    <span class="n">timeline</span> <span class="o">=</span> <span class="n">Array</span>
    <span class="n">intensity</span> <span class="o">=</span> <span class="n">Array</span>
    <span class="n">nrcs</span> <span class="o">=</span> <span class="n">Array</span>
    <span class="n">duration</span> <span class="o">=</span> <span class="n">Int</span><span class="p">(</span><span class="mi">12</span><span class="p">,</span> <span class="n">desc</span><span class="o">=</span><span class="s">&#39;In Hours&#39;</span><span class="p">)</span>
    <span class="n">year_storm</span> <span class="o">=</span> <span class="n">Enum</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">25</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
    <span class="n">county</span> <span class="o">=</span> <span class="n">Enum</span><span class="p">(</span><span class="s">&#39;Brazos&#39;</span><span class="p">,</span> <span class="s">&#39;Dallas&#39;</span><span class="p">,</span> <span class="s">&#39;El Paso&#39;</span><span class="p">,</span> <span class="s">&#39;Harris&#39;</span><span class="p">)</span>
    <span class="n">curve_number</span> <span class="o">=</span> <span class="n">Range</span><span class="p">(</span><span class="mi">70</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
    <span class="n">plot_type</span> <span class="o">=</span> <span class="n">Enum</span><span class="p">(</span><span class="s">&#39;line&#39;</span><span class="p">,</span> <span class="s">&#39;scatter&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p>The above code snippet shows a number of Traits features,</p>
<blockquote>
<div><ol class="arabic simple">
<li>The naming convention with traits is that types are capitalized.</li>
<li>An Array is an array, an Int is an integer, an Enum is a single
value from a list of options, and a Range is a value between
two numbers.</li>
<li>All traits get a default value, such as whats done in the
Arrays, or they can be assigned an initial value as is done in
the duration trait.</li>
<li>Descriptions can be added to traits, such as is done in
duration.  This description is not visible except when viewing
the trait in a TraitsUI view, and then the description is seen
when the mouse hovers over the variable.</li>
<li>Traits are always contained within the class definition, and
each instance of the class will have a unique copy of the traits.</li>
</ol>
</div></blockquote>
<p>The Traits API Reference contains more information about the standard
Trait types; see the <tt class="xref py py-mod docutils literal"><span class="pre">trait_types</span></tt> module in the <a class="reference external" href="http://code.enthought.com/projects/files/ETS3_API/enthought.traits.trait_types.html">Traits API Reference</a>.</p>
</div>
<div class="section" id="setting-up-the-user-interface-ui">
<h2>Setting up the User Interface (UI)<a class="headerlink" href="#setting-up-the-user-interface-ui" title="Permalink to this headline">¶</a></h2>
<p>HasTraits classes will automatically generate a view that contains an
editable entry for each trait within the class.  But a user-defined
view usually looks better, so we&#8217;ll use View and Items to change the
default class view.  Changing the default UI is done by creating a
trait on the class that is of the View type.  Multiple View traits can
be defined and used, with the one named <tt class="docutils literal"><span class="pre">traits_view</span></tt> being used as
the default.</p>
<p>Continuing with our application, here is the View definition.</p>
<div class="highlight-python"><pre>class Hyetograph(HasTraits):

    &lt;... snip ...&gt;

    view1 = View(Item('plot_type'),
                 ChacoPlotItem('timeline', 'intensity',
                               type_trait='plot_type',
                               resizable=True,
                               x_label='Time (hr)',
                               y_label='Intensity (in/hr)',
                               color='blue',
                               bgcolor='white',
                               border_visible=True,
                               border_width=1,
                               padding_bg_color='lightgray'),
                 Item(name='duration'),
                 Item(name='year_storm'),
                 Item(name='county'),

                 # After infiltration using the nrcs curve number method.
                 ChacoPlotItem('timeline', 'nrcs',
                                type_trait='plot_type',
                                resizable=True,
                                x_label='Time',
                                y_label='Intensity',
                                color='blue',
                                bgcolor='white',
                                border_visible=True,
                                border_width=1,
                                padding_bg_color='lightgray'),
                Item('curve_number'),
                resizable = True,
                width=800, height=800)</pre>
</div>
<p>Views generally contain Item objects and named parameters.  Views can
also contain Groups of Items as well as many other types of layout
features not covered here.  By default, Item objects take a string of
the trait to edit.  For example, the <tt class="docutils literal"><span class="pre">Item(name='county')</span></tt> will
create a pull-down menu in the UI showing the four valid counties that
the user can select from.</p>
<p>There are three important observations to be seen in the above view
definition.  First, there are two Chaco plot items embedded in the
view.  The top plot is the intensity versus time and the bottom is
nrcs versus time.  Second, default window will be sized at 800 by 800
pixels, but the option <tt class="docutils literal"><span class="pre">resizable</span> <span class="pre">=</span> <span class="pre">True</span></tt> will allow the user to
change the size of the window.  And third, the traits are split up so
3 of them are displayed below the first plot and only 1 is displayed
below the second.  Here is a snapshot of what our application will
display.  The plots are empty because we have yet to populate the data
traits</p>
<img alt="../_images/tutorial_hyetograph_nodata.png" src="../_images/tutorial_hyetograph_nodata.png" />
</div>
<div class="section" id="performing-the-hyetograph-calculations">
<h2>Performing the Hyetograph Calculations<a class="headerlink" href="#performing-the-hyetograph-calculations" title="Permalink to this headline">¶</a></h2>
<p>The UI for the application is complete, however there is no data.
Changing the traits within the GUI by moving the sliders and typing in
numbers does nothing because they&#8217;re hooked up to nothing and there
are no listeners on the trait event notifications.  So , next we&#8217;ll
add some hyetograph calculations that modify the intensity and nrcs
Array traits.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">calculate_intensity</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; The Hyetograph calculations. &quot;&quot;&quot;</span>
    <span class="c"># Assigning A, B, and C values based on year, storm, and county</span>
    <span class="n">counties</span> <span class="o">=</span> <span class="p">{</span><span class="s">&#39;Brazos&#39;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="s">&#39;Dallas&#39;</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="s">&#39;El Paso&#39;</span><span class="p">:</span> <span class="mi">6</span><span class="p">,</span> <span class="s">&#39;Harris&#39;</span><span class="p">:</span> <span class="mi">9</span><span class="p">}</span>
    <span class="n">years</span> <span class="o">=</span> <span class="p">{</span>
        <span class="mi">2</span> <span class="p">:</span> <span class="p">[</span><span class="mi">65</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="o">.</span><span class="mi">806</span><span class="p">,</span> <span class="mi">54</span><span class="p">,</span> <span class="mf">8.3</span><span class="p">,</span> <span class="o">.</span><span class="mi">791</span><span class="p">,</span> <span class="mi">24</span><span class="p">,</span> <span class="mf">9.5</span><span class="p">,</span> <span class="o">.</span><span class="mi">797</span><span class="p">,</span> <span class="mi">68</span><span class="p">,</span> <span class="mf">7.9</span><span class="p">,</span> <span class="o">.</span><span class="mi">800</span><span class="p">],</span>
        <span class="mi">10</span><span class="p">:</span> <span class="p">[</span><span class="mi">80</span><span class="p">,</span> <span class="mf">8.5</span><span class="p">,</span> <span class="o">.</span><span class="mi">763</span><span class="p">,</span> <span class="mi">78</span><span class="p">,</span> <span class="mf">8.7</span><span class="p">,</span> <span class="o">.</span><span class="mi">777</span><span class="p">,</span> <span class="mi">42</span><span class="p">,</span> <span class="mf">12.</span><span class="p">,</span> <span class="o">.</span><span class="mi">795</span><span class="p">,</span><span class="mi">81</span><span class="p">,</span> <span class="mf">7.7</span><span class="p">,</span> <span class="o">.</span><span class="mi">753</span><span class="p">],</span>
        <span class="mi">25</span><span class="p">:</span> <span class="p">[</span><span class="mi">89</span><span class="p">,</span> <span class="mf">8.5</span><span class="p">,</span> <span class="o">.</span><span class="mi">754</span><span class="p">,</span> <span class="mi">90</span><span class="p">,</span> <span class="mf">8.7</span><span class="p">,</span> <span class="o">.</span><span class="mi">774</span><span class="p">,</span> <span class="mi">60</span><span class="p">,</span> <span class="mf">12.</span><span class="p">,</span><span class="o">.</span><span class="mi">843</span><span class="p">,</span> <span class="mi">81</span><span class="p">,</span> <span class="mf">7.7</span><span class="p">,</span> <span class="o">.</span><span class="mi">724</span><span class="p">],</span>
        <span class="mi">100</span><span class="p">:</span> <span class="p">[</span><span class="mi">96</span><span class="p">,</span> <span class="mf">8.</span><span class="p">,</span> <span class="o">.</span><span class="mi">730</span><span class="p">,</span> <span class="mi">106</span><span class="p">,</span> <span class="mf">8.3</span><span class="p">,</span> <span class="o">.</span><span class="mi">762</span><span class="p">,</span> <span class="mi">65</span><span class="p">,</span> <span class="mf">9.5</span><span class="p">,</span> <span class="o">.</span><span class="mi">825</span><span class="p">,</span> <span class="mi">91</span><span class="p">,</span> <span class="mf">7.9</span><span class="p">,</span> <span class="o">.</span><span class="mi">706</span><span class="p">]</span>
    <span class="p">}</span>
    <span class="n">year</span> <span class="o">=</span> <span class="n">years</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">year_storm</span><span class="p">]</span>
    <span class="n">value</span> <span class="o">=</span> <span class="n">counties</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">county</span><span class="p">]</span>
    <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span> <span class="o">=</span> <span class="n">year</span><span class="p">[</span><span class="n">value</span><span class="p">],</span> <span class="n">year</span><span class="p">[</span><span class="n">value</span><span class="o">+</span><span class="mi">1</span><span class="p">],</span> <span class="n">year</span><span class="p">[</span><span class="n">value</span><span class="o">+</span><span class="mi">2</span><span class="p">]</span>

    <span class="bp">self</span><span class="o">.</span><span class="n">timeline</span><span class="o">=</span><span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">duration</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
    <span class="n">intensity</span><span class="o">=</span><span class="n">a</span> <span class="o">/</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">timeline</span> <span class="o">*</span> <span class="mi">60</span> <span class="o">+</span> <span class="n">b</span><span class="p">)</span><span class="o">**</span><span class="n">c</span>
    <span class="n">cumdepth</span><span class="o">=</span><span class="n">intensity</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">timeline</span>

    <span class="n">temp</span><span class="o">=</span><span class="n">cumdepth</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
    <span class="n">result</span><span class="o">=</span><span class="p">[]</span>
    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">cumdepth</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
        <span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">i</span><span class="o">-</span><span class="n">temp</span><span class="p">)</span>
        <span class="n">temp</span><span class="o">=</span><span class="n">i</span>
    <span class="n">result</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="n">cumdepth</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>

    <span class="c"># Alternating block method implementation.</span>
    <span class="n">result</span><span class="o">.</span><span class="n">reverse</span><span class="p">()</span>
    <span class="n">switch</span> <span class="o">=</span> <span class="bp">True</span>
    <span class="n">o</span><span class="p">,</span> <span class="n">e</span> <span class="o">=</span> <span class="p">[],</span> <span class="p">[]</span>
    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">result</span><span class="p">:</span>
        <span class="k">if</span> <span class="n">switch</span><span class="p">:</span>
            <span class="n">o</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">e</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
        <span class="n">switch</span> <span class="o">=</span> <span class="ow">not</span> <span class="n">switch</span>
    <span class="n">e</span><span class="o">.</span><span class="n">reverse</span><span class="p">()</span>
    <span class="n">result</span> <span class="o">=</span> <span class="n">o</span> <span class="o">+</span> <span class="n">e</span>
    <span class="bp">self</span><span class="o">.</span><span class="n">intensity</span> <span class="o">=</span> <span class="n">result</span>


<span class="k">def</span> <span class="nf">calculate_runoff</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; NRCS method to get run-off based on permeability of ground. &quot;&quot;&quot;</span>
    <span class="n">s</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1000</span> <span class="o">/</span> <span class="bp">self</span><span class="o">.</span><span class="n">curve_number</span><span class="p">)</span> <span class="o">-</span> <span class="mi">10</span>
    <span class="n">a</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">intensity</span> <span class="o">-</span> <span class="p">(</span><span class="o">.</span><span class="mi">2</span> <span class="o">*</span> <span class="n">s</span><span class="p">)</span>
    <span class="n">vr</span> <span class="o">=</span> <span class="n">a</span><span class="o">**</span><span class="mi">2</span> <span class="o">/</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">intensity</span> <span class="o">+</span> <span class="p">(</span><span class="o">.</span><span class="mi">8</span> <span class="o">*</span> <span class="n">s</span><span class="p">))</span>
    <span class="c"># There&#39;s no such thing as negative run-off.</span>
    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">a</span><span class="p">)):</span>
        <span class="k">if</span> <span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
            <span class="n">vr</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="bp">self</span><span class="o">.</span><span class="n">nrcs</span> <span class="o">=</span> <span class="n">vr</span>
</pre></div>
</div>
<p>In the calculation functions, the traits are treated just like normal
class attributes.  Behind the scenes, Traits will automatically cast
compatible types such as ints to Floats, but will raise an exception
if the user tries to pass a string to an Dict trait.</p>
</div>
<div class="section" id="recalculating-when-event-notification-occurs">
<h2>Recalculating when event notification occurs<a class="headerlink" href="#recalculating-when-event-notification-occurs" title="Permalink to this headline">¶</a></h2>
<p>Calling the calculation functions will update the data, but nothing is
going to change in the GUI.  The next step is to link the data to the
GUI using a Traits static handler.  Static handlers are declared
either with a decorator or through a function name that follows a
specific convention.  Alternatively, a dynamic handler is set up by
calling a function at runtime, providing for on-the-fly event
processing.  Below is a function that calls the two calculation
functions.  The interesting line is the decorator,
<tt class="docutils literal"><span class="pre">&#64;on_trait_change</span></tt> that tells Traits to call the function whenever
any of the values within the list of traits change.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="nd">@on_trait_change</span><span class="p">(</span><span class="s">&#39;duration, year_storm, county, curve_number&#39;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_perform_calculations</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
    <span class="bp">self</span><span class="o">.</span><span class="n">calculate_intensity</span><span class="p">()</span>
    <span class="bp">self</span><span class="o">.</span><span class="n">calculate_runoff</span><span class="p">()</span>
</pre></div>
</div>
<dl class="docutils">
<dt>So now when the application is run, when the <tt class="docutils literal"><span class="pre">duration</span></tt> trait is</dt>
<dd>changed or any of the four listed traits change, the calculation
functions are automatically called and the data changes.  And these
traits will automatically change when the user adjusts the widgets
in the UI.  So when the user changes the <tt class="docutils literal"><span class="pre">duration</span></tt> in the UI
from 12 hours to 24 hours this will automatically effect both of
the plots since the listeners force a recalculation of both of the
functions.</dd>
</dl>
</div>
<div class="section" id="showing-the-display">
<h2>Showing the Display<a class="headerlink" href="#showing-the-display" title="Permalink to this headline">¶</a></h2>
<p>In order to start the GUI application an instance of the class must be
instantiated, and then a configure_traits() call is done.  However we
must first call the data calculation functions from within the class
to initialize the data arrays.  Here&#8217;s the last piece of the program.</p>
<div class="highlight-python"><pre>    def start(self):
        self._perform_calculations()
        self.configure_traits()


f=Hyetograph()
f.start()</pre>
</div>
<p>start() performs the calculations needed for the Arrays used to plot,
and then triggers the UI.  The application is complete, and if you now
run the program, you should get a running application that resembles
the following image,</p>
<img alt="../_images/tutorial_hyetograph_final.png" src="../_images/tutorial_hyetograph_final.png" />
<p>Congratulations!</p>
</div>
<div class="section" id="source-code">
<h2>Source Code<a class="headerlink" href="#source-code" title="Permalink to this headline">¶</a></h2>
<p>The final version of the program, <cite>hyetograph.py</cite>.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">enthought.traits.api</span> \
    <span class="kn">import</span> <span class="n">HasTraits</span><span class="p">,</span> <span class="n">Int</span><span class="p">,</span> <span class="n">Range</span><span class="p">,</span> <span class="n">Array</span><span class="p">,</span> <span class="n">Enum</span><span class="p">,</span> <span class="n">on_trait_change</span>
<span class="kn">from</span> <span class="nn">enthought.traits.ui.api</span> <span class="kn">import</span> <span class="n">View</span><span class="p">,</span> <span class="n">Item</span>
<span class="kn">from</span> <span class="nn">enthought.chaco.chaco_plot_editor</span> <span class="kn">import</span> <span class="n">ChacoPlotItem</span>


<span class="k">class</span> <span class="nc">Hyetograph</span><span class="p">(</span><span class="n">HasTraits</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; Creates a simple hyetograph demo. &quot;&quot;&quot;</span>
    <span class="n">timeline</span> <span class="o">=</span> <span class="n">Array</span>
    <span class="n">intensity</span> <span class="o">=</span> <span class="n">Array</span>
    <span class="n">nrcs</span> <span class="o">=</span> <span class="n">Array</span>
    <span class="n">duration</span> <span class="o">=</span> <span class="n">Int</span><span class="p">(</span><span class="mi">12</span><span class="p">,</span> <span class="n">desc</span><span class="o">=</span><span class="s">&#39;In Hours&#39;</span><span class="p">)</span>
    <span class="n">year_storm</span> <span class="o">=</span> <span class="n">Enum</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">25</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
    <span class="n">county</span> <span class="o">=</span> <span class="n">Enum</span><span class="p">(</span><span class="s">&#39;Brazos&#39;</span><span class="p">,</span> <span class="s">&#39;Dallas&#39;</span><span class="p">,</span> <span class="s">&#39;El Paso&#39;</span><span class="p">,</span> <span class="s">&#39;Harris&#39;</span><span class="p">)</span>
    <span class="n">curve_number</span> <span class="o">=</span> <span class="n">Range</span><span class="p">(</span><span class="mi">70</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
    <span class="n">plot_type</span> <span class="o">=</span> <span class="n">Enum</span><span class="p">(</span><span class="s">&#39;line&#39;</span><span class="p">,</span> <span class="s">&#39;scatter&#39;</span><span class="p">)</span>

    <span class="n">view1</span> <span class="o">=</span> <span class="n">View</span><span class="p">(</span><span class="n">Item</span><span class="p">(</span><span class="s">&#39;plot_type&#39;</span><span class="p">),</span>
                 <span class="n">ChacoPlotItem</span><span class="p">(</span><span class="s">&#39;timeline&#39;</span><span class="p">,</span> <span class="s">&#39;intensity&#39;</span><span class="p">,</span>
                               <span class="n">type_trait</span><span class="o">=</span><span class="s">&#39;plot_type&#39;</span><span class="p">,</span>
                               <span class="n">resizable</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
                               <span class="n">x_label</span><span class="o">=</span><span class="s">&#39;Time (hr)&#39;</span><span class="p">,</span>
                               <span class="n">y_label</span><span class="o">=</span><span class="s">&#39;Intensity (in/hr)&#39;</span><span class="p">,</span>
                               <span class="n">color</span><span class="o">=</span><span class="s">&#39;blue&#39;</span><span class="p">,</span>
                               <span class="n">bgcolor</span><span class="o">=</span><span class="s">&#39;white&#39;</span><span class="p">,</span>
                               <span class="n">border_visible</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
                               <span class="n">border_width</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
                               <span class="n">padding_bg_color</span><span class="o">=</span><span class="s">&#39;lightgray&#39;</span><span class="p">),</span>
                 <span class="n">Item</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&#39;duration&#39;</span><span class="p">),</span>
                 <span class="n">Item</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&#39;year_storm&#39;</span><span class="p">),</span>
                 <span class="n">Item</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&#39;county&#39;</span><span class="p">),</span>

                 <span class="c"># After infiltration using the nrcs curve number method.</span>
                 <span class="n">ChacoPlotItem</span><span class="p">(</span><span class="s">&#39;timeline&#39;</span><span class="p">,</span> <span class="s">&#39;nrcs&#39;</span><span class="p">,</span>
                                <span class="n">type_trait</span><span class="o">=</span><span class="s">&#39;plot_type&#39;</span><span class="p">,</span>
                                <span class="n">resizable</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
                                <span class="n">x_label</span><span class="o">=</span><span class="s">&#39;Time&#39;</span><span class="p">,</span>
                                <span class="n">y_label</span><span class="o">=</span><span class="s">&#39;Intensity&#39;</span><span class="p">,</span>
                                <span class="n">color</span><span class="o">=</span><span class="s">&#39;blue&#39;</span><span class="p">,</span>
                                <span class="n">bgcolor</span><span class="o">=</span><span class="s">&#39;white&#39;</span><span class="p">,</span>
                                <span class="n">border_visible</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
                                <span class="n">border_width</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
                                <span class="n">padding_bg_color</span><span class="o">=</span><span class="s">&#39;lightgray&#39;</span><span class="p">),</span>
                <span class="n">Item</span><span class="p">(</span><span class="s">&#39;curve_number&#39;</span><span class="p">),</span>
                <span class="n">resizable</span> <span class="o">=</span> <span class="bp">True</span><span class="p">,</span>
                <span class="n">width</span><span class="o">=</span><span class="mi">800</span><span class="p">,</span> <span class="n">height</span><span class="o">=</span><span class="mi">800</span><span class="p">)</span>


    <span class="k">def</span> <span class="nf">calculate_intensity</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; The Hyetograph calculations. &quot;&quot;&quot;</span>
        <span class="c"># Assigning A, B, and C values based on year, storm, and county</span>
        <span class="n">counties</span> <span class="o">=</span> <span class="p">{</span><span class="s">&#39;Brazos&#39;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="s">&#39;Dallas&#39;</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="s">&#39;El Paso&#39;</span><span class="p">:</span> <span class="mi">6</span><span class="p">,</span> <span class="s">&#39;Harris&#39;</span><span class="p">:</span> <span class="mi">9</span><span class="p">}</span>
        <span class="n">years</span> <span class="o">=</span> <span class="p">{</span>
            <span class="mi">2</span> <span class="p">:</span> <span class="p">[</span><span class="mi">65</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="o">.</span><span class="mi">806</span><span class="p">,</span> <span class="mi">54</span><span class="p">,</span> <span class="mf">8.3</span><span class="p">,</span> <span class="o">.</span><span class="mi">791</span><span class="p">,</span> <span class="mi">24</span><span class="p">,</span> <span class="mf">9.5</span><span class="p">,</span> <span class="o">.</span><span class="mi">797</span><span class="p">,</span> <span class="mi">68</span><span class="p">,</span> <span class="mf">7.9</span><span class="p">,</span> <span class="o">.</span><span class="mi">800</span><span class="p">],</span>
            <span class="mi">10</span><span class="p">:</span> <span class="p">[</span><span class="mi">80</span><span class="p">,</span> <span class="mf">8.5</span><span class="p">,</span> <span class="o">.</span><span class="mi">763</span><span class="p">,</span> <span class="mi">78</span><span class="p">,</span> <span class="mf">8.7</span><span class="p">,</span> <span class="o">.</span><span class="mi">777</span><span class="p">,</span> <span class="mi">42</span><span class="p">,</span> <span class="mf">12.</span><span class="p">,</span> <span class="o">.</span><span class="mi">795</span><span class="p">,</span><span class="mi">81</span><span class="p">,</span> <span class="mf">7.7</span><span class="p">,</span> <span class="o">.</span><span class="mi">753</span><span class="p">],</span>
            <span class="mi">25</span><span class="p">:</span> <span class="p">[</span><span class="mi">89</span><span class="p">,</span> <span class="mf">8.5</span><span class="p">,</span> <span class="o">.</span><span class="mi">754</span><span class="p">,</span> <span class="mi">90</span><span class="p">,</span> <span class="mf">8.7</span><span class="p">,</span> <span class="o">.</span><span class="mi">774</span><span class="p">,</span> <span class="mi">60</span><span class="p">,</span> <span class="mf">12.</span><span class="p">,</span><span class="o">.</span><span class="mi">843</span><span class="p">,</span> <span class="mi">81</span><span class="p">,</span> <span class="mf">7.7</span><span class="p">,</span> <span class="o">.</span><span class="mi">724</span><span class="p">],</span>
            <span class="mi">100</span><span class="p">:</span> <span class="p">[</span><span class="mi">96</span><span class="p">,</span> <span class="mf">8.</span><span class="p">,</span> <span class="o">.</span><span class="mi">730</span><span class="p">,</span> <span class="mi">106</span><span class="p">,</span> <span class="mf">8.3</span><span class="p">,</span> <span class="o">.</span><span class="mi">762</span><span class="p">,</span> <span class="mi">65</span><span class="p">,</span> <span class="mf">9.5</span><span class="p">,</span> <span class="o">.</span><span class="mi">825</span><span class="p">,</span> <span class="mi">91</span><span class="p">,</span> <span class="mf">7.9</span><span class="p">,</span> <span class="o">.</span><span class="mi">706</span><span class="p">]</span>
        <span class="p">}</span>
        <span class="n">year</span> <span class="o">=</span> <span class="n">years</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">year_storm</span><span class="p">]</span>
        <span class="n">value</span> <span class="o">=</span> <span class="n">counties</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">county</span><span class="p">]</span>
        <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span> <span class="o">=</span> <span class="n">year</span><span class="p">[</span><span class="n">value</span><span class="p">],</span> <span class="n">year</span><span class="p">[</span><span class="n">value</span><span class="o">+</span><span class="mi">1</span><span class="p">],</span> <span class="n">year</span><span class="p">[</span><span class="n">value</span><span class="o">+</span><span class="mi">2</span><span class="p">]</span>

        <span class="bp">self</span><span class="o">.</span><span class="n">timeline</span><span class="o">=</span><span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">duration</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
        <span class="n">intensity</span><span class="o">=</span><span class="n">a</span> <span class="o">/</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">timeline</span> <span class="o">*</span> <span class="mi">60</span> <span class="o">+</span> <span class="n">b</span><span class="p">)</span><span class="o">**</span><span class="n">c</span>
        <span class="n">cumdepth</span><span class="o">=</span><span class="n">intensity</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">timeline</span>

        <span class="n">temp</span><span class="o">=</span><span class="n">cumdepth</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
        <span class="n">result</span><span class="o">=</span><span class="p">[]</span>
        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">cumdepth</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
            <span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">i</span><span class="o">-</span><span class="n">temp</span><span class="p">)</span>
            <span class="n">temp</span><span class="o">=</span><span class="n">i</span>
        <span class="n">result</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="n">cumdepth</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>

        <span class="c"># Alternating block method implementation.</span>
        <span class="n">result</span><span class="o">.</span><span class="n">reverse</span><span class="p">()</span>
        <span class="n">switch</span> <span class="o">=</span> <span class="bp">True</span>
        <span class="n">o</span><span class="p">,</span> <span class="n">e</span> <span class="o">=</span> <span class="p">[],</span> <span class="p">[]</span>
        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">result</span><span class="p">:</span>
            <span class="k">if</span> <span class="n">switch</span><span class="p">:</span>
                <span class="n">o</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="n">e</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
            <span class="n">switch</span> <span class="o">=</span> <span class="ow">not</span> <span class="n">switch</span>
        <span class="n">e</span><span class="o">.</span><span class="n">reverse</span><span class="p">()</span>
        <span class="n">result</span> <span class="o">=</span> <span class="n">o</span> <span class="o">+</span> <span class="n">e</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">intensity</span> <span class="o">=</span> <span class="n">result</span>


    <span class="k">def</span> <span class="nf">calculate_runoff</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; NRCS method to get run-off based on permeability of ground. &quot;&quot;&quot;</span>
        <span class="n">s</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1000</span> <span class="o">/</span> <span class="bp">self</span><span class="o">.</span><span class="n">curve_number</span><span class="p">)</span> <span class="o">-</span> <span class="mi">10</span>
        <span class="n">a</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">intensity</span> <span class="o">-</span> <span class="p">(</span><span class="o">.</span><span class="mi">2</span> <span class="o">*</span> <span class="n">s</span><span class="p">)</span>
        <span class="n">vr</span> <span class="o">=</span> <span class="n">a</span><span class="o">**</span><span class="mi">2</span> <span class="o">/</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">intensity</span> <span class="o">+</span> <span class="p">(</span><span class="o">.</span><span class="mi">8</span> <span class="o">*</span> <span class="n">s</span><span class="p">))</span>
        <span class="c"># There&#39;s no such thing as negative run-off.</span>
        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">a</span><span class="p">)):</span>
            <span class="k">if</span> <span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
                <span class="n">vr</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">nrcs</span> <span class="o">=</span> <span class="n">vr</span>


    <span class="nd">@on_trait_change</span><span class="p">(</span><span class="s">&#39;duration, year_storm, county, curve_number&#39;</span><span class="p">)</span>
    <span class="k">def</span> <span class="nf">_perform_calculations</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">calculate_intensity</span><span class="p">()</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">calculate_runoff</span><span class="p">()</span>


    <span class="k">def</span> <span class="nf">start</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">_perform_calculations</span><span class="p">()</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">configure_traits</span><span class="p">()</span>


<span class="n">f</span><span class="o">=</span><span class="n">Hyetograph</span><span class="p">()</span>
<span class="n">f</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
</pre></div>
</div>
</div>
</div>


          </div>
        </div>
      </div>
      <div class="sphinxsidebar">
        <div class="sphinxsidebarwrapper">
            <p class="logo"><a href="../index.html">
              <img class="logo" src="../_static/e-logo-rev.png" alt="Logo"/>
            </a></p>
<h3>Page Contents</h3>
<ul>
<li><a class="reference internal" href="#">Creating an interactive Hyetograph with Chaco and Traits</a><ul>
<li><a class="reference internal" href="#overview">Overview</a></li>
<li><a class="reference internal" href="#development-setup">Development Setup</a></li>
<li><a class="reference internal" href="#why-use-traits-for-this-application">Why use Traits for this application?</a></li>
<li><a class="reference internal" href="#importing-the-necessary-functions">Importing the necessary functions</a></li>
<li><a class="reference internal" href="#trait-definitions">Trait Definitions</a></li>
<li><a class="reference internal" href="#setting-up-the-user-interface-ui">Setting up the User Interface (UI)</a></li>
<li><a class="reference internal" href="#performing-the-hyetograph-calculations">Performing the Hyetograph Calculations</a></li>
<li><a class="reference internal" href="#recalculating-when-event-notification-occurs">Recalculating when event notification occurs</a></li>
<li><a class="reference internal" href="#showing-the-display">Showing the Display</a></li>
<li><a class="reference internal" href="#source-code">Source Code</a></li>
</ul>
</li>
</ul>

  <h3>This Page</h3>
  <ul class="this-page-menu">
    <li><a href="../_sources/user_manual/tutorial_hyetograph.txt"
           rel="nofollow">Show Source</a></li>
  </ul>
<div id="searchbox" style="display: none">
  <h3>Quick search</h3>
    <form class="search" action="../search.html" method="get">
      <input type="text" name="q" size="18" />
      <input type="submit" value="Go" />
      <input type="hidden" name="check_keywords" value="yes" />
      <input type="hidden" name="area" value="default" />
    </form>
    <p class="searchtip" style="font-size: 90%">
    Enter search terms or a module, class or function name.
    </p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
        </div>
      </div>
      <div class="clearer"></div>
    </div>
    <div class="related">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="tutorial_wx.html" title="WX-based Tutorial"
             >next</a></li>
        <li class="right" >
          <a href="tutorial_2.html" title="Modeling Van der Waal’s Equation With Chaco and Traits"
             >previous</a> |</li>
        <li><a href="../index.html">Chaco v3.4.0 documentation</a> &raquo;</li>
          <li><a href="tutorial.html" >Tutorials</a> &raquo;</li>
  
    <li><a href="#">Creating an interactive Hyetograph with Chaco and Traits</a></li>
  

      </ul>
    </div>
    <div class="footer">
        &copy; Copyright 2008, Enthought, Inc..
      Last updated on Mar 02, 2011.
      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.0.7.
    </div>
  </body>
</html>