Files
histogram/doc/html/tutorial.html
2016-05-12 09:24:31 -04:00

225 lines
18 KiB
HTML

<!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>Tutorial &mdash; histogram 1.0 documentation</title>
<link rel="stylesheet" href="_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: './',
VERSION: '1.0',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: false
};
</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>
<script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<link rel="top" title="histogram 1.0 documentation" href="index.html" />
<link rel="next" title="Notes" href="notes.html" />
<link rel="prev" title="Introduction" href="intro.html" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head>
<body role="document">
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="tutorial">
<h1>Tutorial<a class="headerlink" href="#tutorial" title="Permalink to this headline"></a></h1>
<div class="section" id="example-1-1d-histogram-in-c">
<h2>Example 1: 1d-histogram in C++<a class="headerlink" href="#example-1-1d-histogram-in-c" title="Permalink to this headline"></a></h2>
<p>How to make a 1d-histogram in C++ and to fill it:</p>
<div class="highlight-cpp"><div class="highlight"><pre><span></span><span class="cp">#include</span> <span class="cpf">&lt;boost/histogram/histogram.hpp&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&lt;boost/histogram/axis.hpp&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&lt;cmath&gt;</span><span class="cp"></span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span><span class="p">,</span> <span class="kt">char</span><span class="o">**</span><span class="p">)</span> <span class="p">{</span>
<span class="k">namespace</span> <span class="n">bh</span> <span class="o">=</span> <span class="n">boost</span><span class="o">::</span><span class="n">histogram</span><span class="p">;</span>
<span class="cm">/* Create a 1-d histogram with an axis that has 10 bins</span>
<span class="cm"> * of equal width, covering the real line in the interval</span>
<span class="cm"> * [-1.0, 2.0), label it &#39;x&#39;.</span>
<span class="cm"> * Several other binning strategies are supported, see</span>
<span class="cm"> * documentation of axis_types.</span>
<span class="cm"> */</span>
<span class="n">bh</span><span class="o">::</span><span class="n">histogram</span> <span class="n">h</span><span class="p">(</span><span class="n">bh</span><span class="o">::</span><span class="n">regular_axis</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="o">-</span><span class="mf">1.0</span><span class="p">,</span> <span class="mf">2.0</span><span class="p">,</span> <span class="s">&quot;x&quot;</span><span class="p">));</span>
<span class="cm">/* Fill histogram with a few entries. Values outside of</span>
<span class="cm"> * axis are placed in the overflow and underflow bins.</span>
<span class="cm"> * Normally you would loop over a source of values.</span>
<span class="cm"> */</span>
<span class="n">h</span><span class="p">.</span><span class="n">fill</span><span class="p">(</span><span class="o">-</span><span class="mf">1.5</span><span class="p">);</span> <span class="c1">// put in underflow bin</span>
<span class="n">h</span><span class="p">.</span><span class="n">fill</span><span class="p">(</span><span class="o">-</span><span class="mf">0.5</span><span class="p">);</span>
<span class="n">h</span><span class="p">.</span><span class="n">fill</span><span class="p">(</span><span class="mf">1.1</span><span class="p">);</span>
<span class="n">h</span><span class="p">.</span><span class="n">fill</span><span class="p">(</span><span class="o">-</span><span class="mf">1.0</span><span class="p">);</span> <span class="c1">// included, interval is semi-open</span>
<span class="n">h</span><span class="p">.</span><span class="n">fill</span><span class="p">(</span><span class="mf">0.3</span><span class="p">);</span>
<span class="n">h</span><span class="p">.</span><span class="n">fill</span><span class="p">(</span><span class="mf">1.7</span><span class="p">);</span>
<span class="n">h</span><span class="p">.</span><span class="n">fill</span><span class="p">(</span><span class="mf">2.0</span><span class="p">);</span> <span class="c1">// put in overflow bin, interval is semi-open</span>
<span class="n">h</span><span class="p">.</span><span class="n">fill</span><span class="p">(</span><span class="mf">20.0</span><span class="p">);</span> <span class="c1">// put in overflow bin</span>
<span class="cm">/* Fill histogram with a weighted count. This increases the</span>
<span class="cm"> * bin counter not by one, but by the specified weight.</span>
<span class="cm"> *</span>
<span class="cm"> * This call transparently causes histogram to change it memory</span>
<span class="cm"> * layout to store counts as doubles instead of integers. The</span>
<span class="cm"> * layout for weighted counts requires up to 16x more memory</span>
<span class="cm"> * and will cause inaccuracies of the type a + 1 == a if a is</span>
<span class="cm"> * sufficiently large.</span>
<span class="cm"> *</span>
<span class="cm"> * Use wfill(...) if you have to, else prefer fill(...).</span>
<span class="cm"> */</span>
<span class="n">h</span><span class="p">.</span><span class="n">wfill</span><span class="p">(</span><span class="mf">0.1</span><span class="p">,</span> <span class="mf">5.0</span><span class="p">);</span>
<span class="cm">/* Print a table representation of the histogram showing the bin</span>
<span class="cm"> * value and a estimate of the standard deviation. Overflow and</span>
<span class="cm"> * Underflow bins are accessed naturally as the bins -1 and 10.</span>
<span class="cm"> */</span>
<span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">h</span><span class="p">.</span><span class="n">bins</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
<span class="k">const</span> <span class="n">bh</span><span class="o">::</span><span class="n">regular_axis</span><span class="o">&amp;</span> <span class="n">a</span> <span class="o">=</span> <span class="n">h</span><span class="p">.</span><span class="n">axis</span><span class="o">&lt;</span><span class="n">bh</span><span class="o">::</span><span class="n">regular_axis</span><span class="o">&gt;</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;bin &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">i</span>
<span class="o">&lt;&lt;</span> <span class="s">&quot; x in [&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;, &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;): &quot;</span>
<span class="o">&lt;&lt;</span> <span class="n">h</span><span class="p">.</span><span class="n">value</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="s">&quot; +/- &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">sqrt</span><span class="p">(</span><span class="n">h</span><span class="p">.</span><span class="n">variance</span><span class="p">(</span><span class="n">i</span><span class="p">))</span>
<span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
<p>The program output is:</p>
<div class="highlight-none"><div class="highlight"><pre><span></span>bin -1 x in [-inf, -1): 1 +/- 1
bin 0 x in [-1, -0.7): 1 +/- 1
bin 1 x in [-0.7, -0.4): 1 +/- 1
bin 2 x in [-0.4, -0.1): 0 +/- 0
bin 3 x in [-0.1, 0.2): 5 +/- 5
bin 4 x in [0.2, 0.5): 1 +/- 1
bin 5 x in [0.5, 0.8): 0 +/- 0
bin 6 x in [0.8, 1.1): 0 +/- 0
bin 7 x in [1.1, 1.4): 1 +/- 1
bin 8 x in [1.4, 1.7): 0 +/- 0
bin 9 x in [1.7, 2): 1 +/- 1
bin 10 x in [2, inf): 2 +/- 1.41421
</pre></div>
</div>
</div>
<div class="section" id="example-2-2d-histogram-in-python">
<h2>Example 2: 2d-histogram in Python<a class="headerlink" href="#example-2-2d-histogram-in-python" title="Permalink to this headline"></a></h2>
<p>How to make a 2d-histogram in Python and to fill it using a Numpy array:</p>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">histogram</span> <span class="kn">as</span> <span class="nn">bh</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="kn">as</span> <span class="nn">np</span>
<span class="c1"># create a 2d-histogram without underflow and overflow bins</span>
<span class="c1"># for polar coordinates, using a specialized polar_axis for</span>
<span class="c1"># the binning of the angle &#39;phi&#39;</span>
<span class="n">h</span> <span class="o">=</span> <span class="n">bh</span><span class="o">.</span><span class="n">histogram</span><span class="p">(</span><span class="n">bh</span><span class="o">.</span><span class="n">regular_axis</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">,</span> <span class="mf">5.0</span><span class="p">,</span> <span class="s2">&quot;radius&quot;</span><span class="p">,</span>
<span class="n">uoflow</span><span class="o">=</span><span class="bp">False</span><span class="p">),</span>
<span class="n">bh</span><span class="o">.</span><span class="n">polar_axis</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">,</span> <span class="s2">&quot;phi&quot;</span><span class="p">))</span>
<span class="c1"># fill histogram with random values, using a two-dimensional</span>
<span class="c1"># normal distribution in cartesian coordinates as a source</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">randn</span><span class="p">(</span><span class="mi">1000</span><span class="p">)</span> <span class="c1"># generate x</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">randn</span><span class="p">(</span><span class="mi">1000</span><span class="p">)</span> <span class="c1"># generate y</span>
<span class="n">rphi</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">empty</span><span class="p">((</span><span class="mi">1000</span><span class="p">,</span> <span class="mi">2</span><span class="p">))</span>
<span class="n">rphi</span><span class="p">[:,</span> <span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">x</span> <span class="o">**</span> <span class="mi">2</span> <span class="o">+</span> <span class="n">y</span> <span class="o">**</span> <span class="mi">2</span><span class="p">)</span> <span class="o">**</span> <span class="mf">0.5</span> <span class="c1"># compute radius</span>
<span class="n">rphi</span><span class="p">[:,</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arctan2</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span> <span class="c1"># compute phi</span>
<span class="n">h</span><span class="o">.</span><span class="n">fill</span><span class="p">(</span><span class="n">rphi</span><span class="p">)</span>
<span class="c1"># access counts as a numpy array (no data is copied)</span>
<span class="n">count_matrix</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">h</span><span class="p">)</span>
<span class="k">print</span> <span class="n">count_matrix</span>
</pre></div>
</div>
<p>The program output are the counts per bin as a 2d-array:</p>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="p">[[</span><span class="mi">37</span> <span class="mi">26</span> <span class="mi">33</span> <span class="mi">37</span><span class="p">]</span>
<span class="p">[</span><span class="mi">60</span> <span class="mi">69</span> <span class="mi">76</span> <span class="mi">62</span><span class="p">]</span>
<span class="p">[</span><span class="mi">48</span> <span class="mi">80</span> <span class="mi">80</span> <span class="mi">77</span><span class="p">]</span>
<span class="p">[</span><span class="mi">38</span> <span class="mi">49</span> <span class="mi">45</span> <span class="mi">49</span><span class="p">]</span>
<span class="p">[</span><span class="mi">22</span> <span class="mi">24</span> <span class="mi">20</span> <span class="mi">23</span><span class="p">]</span>
<span class="p">[</span> <span class="mi">7</span> <span class="mi">9</span> <span class="mi">9</span> <span class="mi">8</span><span class="p">]</span>
<span class="p">[</span> <span class="mi">3</span> <span class="mi">2</span> <span class="mi">3</span> <span class="mi">3</span><span class="p">]</span>
<span class="p">[</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">]</span>
<span class="p">[</span> <span class="mi">0</span> <span class="mi">1</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">]</span>
<span class="p">[</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">]]</span>
</pre></div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="index.html">histogram</a></h1>
<p>
<iframe src="https://ghbtns.com/github-btn.html?user=HDembinski&repo=histogram&type=watch&count=true&size=large"
allowtransparency="true" frameborder="0" scrolling="0" width="200px" height="35px"></iframe>
</p>
<h3>Navigation</h3>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="motivation.html">Motivation</a></li>
<li class="toctree-l1"><a class="reference internal" href="intro.html">Introduction</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">Tutorial</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#example-1-1d-histogram-in-c">Example 1: 1d-histogram in C++</a></li>
<li class="toctree-l2"><a class="reference internal" href="#example-2-2d-histogram-in-python">Example 2: 2d-histogram in Python</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="notes.html">Notes</a></li>
<li class="toctree-l1"><a class="reference internal" href="types.html">Types</a></li>
<li class="toctree-l1"><a class="reference internal" href="rationale.html">Rationale</a></li>
<li class="toctree-l1"><a class="reference internal" href="references.html">References</a></li>
<li class="toctree-l1"><a class="reference internal" href="changelog.html">CHANGELOG</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
<li>Previous: <a href="intro.html" title="previous chapter">Introduction</a></li>
<li>Next: <a href="notes.html" title="next chapter">Notes</a></li>
</ul></li>
</ul>
</div>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2016, Hans Dembinski.
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.4.1</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.7</a>
</div>
</body>
</html>