Files
histogram/doc/html/boost_histogram/tutorial.html

192 lines
19 KiB
HTML

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Tutorial</title>
<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<link rel="home" href="../index.html" title="Chapter&#160;1.&#160;Boost.Histogram">
<link rel="up" href="../index.html" title="Chapter&#160;1.&#160;Boost.Histogram">
<link rel="prev" href="introduction.html" title="Introduction">
<link rel="next" href="notes.html" title="Notes">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td>
<td align="center"><a href="../../../../../index.html">Home</a></td>
<td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="introduction.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="notes.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="boost_histogram.tutorial"></a><a class="link" href="tutorial.html" title="Tutorial">Tutorial</a>
</h2></div></div></div>
<div class="toc"><dl class="toc">
<dt><span class="section"><a href="tutorial.html#boost_histogram.tutorial.example_1__1d_histogram_in_c__">Example
1: 1d-histogram in C++</a></span></dt>
<dt><span class="section"><a href="tutorial.html#boost_histogram.tutorial.example_2__2d_histogram_in_python">Example
2: 2d-histogram in Python</a></span></dt>
</dl></div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_histogram.tutorial.example_1__1d_histogram_in_c__"></a><a class="link" href="tutorial.html#boost_histogram.tutorial.example_1__1d_histogram_in_c__" title="Example 1: 1d-histogram in C++">Example
1: 1d-histogram in C++</a>
</h3></div></div></div>
<p>
How to make a 1d-histogram in C++ and to fill it:
</p>
<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">histogram</span><span class="special">/</span><span class="identifier">histogram</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">histogram</span><span class="special">/</span><span class="identifier">axis</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>
<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cmath</span><span class="special">&gt;</span>
<span class="keyword">int</span> <span class="identifier">main</span><span class="special">(</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">char</span><span class="special">**)</span> <span class="special">{</span>
<span class="keyword">namespace</span> <span class="identifier">bh</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">histogram</span><span class="special">;</span>
<span class="comment">/* Create a 1-d histogram with an axis that has 10 bins
* of equal width, covering the real line in the interval
* [-1.0, 2.0), label it 'x'.
* Several other binning strategies are supported, see
* documentation of axis_types.
*/</span>
<span class="identifier">bh</span><span class="special">::</span><span class="identifier">histogram</span> <span class="identifier">h</span><span class="special">(</span><span class="identifier">bh</span><span class="special">::</span><span class="identifier">regular_axis</span><span class="special">(</span><span class="number">10</span><span class="special">,</span> <span class="special">-</span><span class="number">1.0</span><span class="special">,</span> <span class="number">2.0</span><span class="special">,</span> <span class="string">"x"</span><span class="special">));</span>
<span class="comment">/* Fill histogram with a few entries. Values outside of
* axis are placed in the overflow and underflow bins.
* Normally you would loop over a source of values.
*/</span>
<span class="identifier">h</span><span class="special">.</span><span class="identifier">fill</span><span class="special">(-</span><span class="number">1.5</span><span class="special">);</span> <span class="comment">// put in underflow bin</span>
<span class="identifier">h</span><span class="special">.</span><span class="identifier">fill</span><span class="special">(-</span><span class="number">0.5</span><span class="special">);</span>
<span class="identifier">h</span><span class="special">.</span><span class="identifier">fill</span><span class="special">(</span><span class="number">1.1</span><span class="special">);</span>
<span class="identifier">h</span><span class="special">.</span><span class="identifier">fill</span><span class="special">(-</span><span class="number">1.0</span><span class="special">);</span> <span class="comment">// included, interval is semi-open</span>
<span class="identifier">h</span><span class="special">.</span><span class="identifier">fill</span><span class="special">(</span><span class="number">0.3</span><span class="special">);</span>
<span class="identifier">h</span><span class="special">.</span><span class="identifier">fill</span><span class="special">(</span><span class="number">1.7</span><span class="special">);</span>
<span class="identifier">h</span><span class="special">.</span><span class="identifier">fill</span><span class="special">(</span><span class="number">2.0</span><span class="special">);</span> <span class="comment">// put in overflow bin, interval is semi-open</span>
<span class="identifier">h</span><span class="special">.</span><span class="identifier">fill</span><span class="special">(</span><span class="number">20.0</span><span class="special">);</span> <span class="comment">// put in overflow bin</span>
<span class="comment">/* Fill histogram with a weighted count. This increases the
* bin counter not by one, but by the specified weight.
*
* This call transparently causes histogram to change it memory
* layout to store counts as doubles instead of integers. The
* layout for weighted counts requires up to 16x more memory
* and will cause inaccuracies of the type a + 1 == a if a is
* sufficiently large.
*
* Use wfill(...) if you have to, else prefer fill(...).
*/</span>
<span class="identifier">h</span><span class="special">.</span><span class="identifier">wfill</span><span class="special">(</span><span class="number">0.1</span><span class="special">,</span> <span class="number">5.0</span><span class="special">);</span>
<span class="comment">/* Print a table representation of the histogram showing the bin
* value and a estimate of the standard deviation. Overflow and
* Underflow bins are accessed naturally as the bins -1 and 10.
*/</span>
<span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="special">-</span><span class="number">1</span><span class="special">;</span> <span class="identifier">i</span> <span class="special">&lt;=</span> <span class="identifier">h</span><span class="special">.</span><span class="identifier">bins</span><span class="special">(</span><span class="number">0</span><span class="special">);</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span>
<span class="keyword">const</span> <span class="identifier">bh</span><span class="special">::</span><span class="identifier">regular_axis</span><span class="special">&amp;</span> <span class="identifier">a</span> <span class="special">=</span> <span class="identifier">h</span><span class="special">.</span><span class="identifier">axis</span><span class="special">&lt;</span><span class="identifier">bh</span><span class="special">::</span><span class="identifier">regular_axis</span><span class="special">&gt;(</span><span class="number">0</span><span class="special">);</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"bin "</span> <span class="special">&lt;&lt;</span> <span class="identifier">i</span>
<span class="special">&lt;&lt;</span> <span class="string">" x in ["</span> <span class="special">&lt;&lt;</span> <span class="identifier">a</span><span class="special">[</span><span class="identifier">i</span><span class="special">]</span> <span class="special">&lt;&lt;</span> <span class="string">", "</span> <span class="special">&lt;&lt;</span> <span class="identifier">a</span><span class="special">[</span><span class="identifier">i</span><span class="special">+</span><span class="number">1</span><span class="special">]</span> <span class="special">&lt;&lt;</span> <span class="string">"): "</span>
<span class="special">&lt;&lt;</span> <span class="identifier">h</span><span class="special">.</span><span class="identifier">value</span><span class="special">(</span><span class="identifier">i</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="string">" +/- "</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">sqrt</span><span class="special">(</span><span class="identifier">h</span><span class="special">.</span><span class="identifier">variance</span><span class="special">(</span><span class="identifier">i</span><span class="special">))</span>
<span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
<span class="special">}</span>
<span class="special">}</span>
</pre>
<p>
</p>
<p>
The program output is:
</p>
<p>
</p>
<pre class="programlisting">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>
<p>
</p>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_histogram.tutorial.example_2__2d_histogram_in_python"></a><a class="link" href="tutorial.html#boost_histogram.tutorial.example_2__2d_histogram_in_python" title="Example 2: 2d-histogram in Python">Example
2: 2d-histogram in Python</a>
</h3></div></div></div>
<p>
How to make a 2d-histogram in Python and to fill it using a Numpy array:
</p>
<p>
</p>
<pre class="programlisting"><span class="keyword">import</span> <span class="identifier">histogram</span> <span class="keyword">as</span> <span class="identifier">bh</span>
<span class="keyword">import</span> <span class="identifier">numpy</span> <span class="keyword">as</span> <span class="identifier">np</span>
<span class="comment"># create a 2d-histogram without underflow and overflow bins</span>
<span class="comment"># for polar coordinates, using a specialized polar_axis for</span>
<span class="comment"># the binning of the angle 'phi'</span>
<span class="comment">#</span>
<span class="comment"># radial axis with label 'radius' has 10 bins from 0.0 to 5.0</span>
<span class="comment"># polar axis with label 'phi' has 4 bins and a phase of 0.0</span>
<span class="identifier">h</span> <span class="special">=</span> <span class="identifier">bh</span><span class="special">.</span><span class="identifier">histogram</span><span class="special">(</span><span class="identifier">bh</span><span class="special">.</span><span class="identifier">regular_axis</span><span class="special">(</span><span class="number">10</span><span class="special">,</span> <span class="number">0.0</span><span class="special">,</span> <span class="number">5.0</span><span class="special">,</span> <span class="string">"radius"</span><span class="special">,</span>
<span class="identifier">uoflow</span><span class="special">=</span><span class="identifier">False</span><span class="special">),</span>
<span class="identifier">bh</span><span class="special">.</span><span class="identifier">polar_axis</span><span class="special">(</span><span class="number">4</span><span class="special">,</span> <span class="number">0.0</span><span class="special">,</span> <span class="string">"phi"</span><span class="special">))</span>
<span class="comment"># fill histogram with random values, using numpy to make </span>
<span class="comment"># a two-dimensional normal distribution in cartesian coordinates</span>
<span class="identifier">x</span> <span class="special">=</span> <span class="identifier">np</span><span class="special">.</span><span class="identifier">random</span><span class="special">.</span><span class="identifier">randn</span><span class="special">(</span><span class="number">1000</span><span class="special">)</span> <span class="comment"># generate x</span>
<span class="identifier">y</span> <span class="special">=</span> <span class="identifier">np</span><span class="special">.</span><span class="identifier">random</span><span class="special">.</span><span class="identifier">randn</span><span class="special">(</span><span class="number">1000</span><span class="special">)</span> <span class="comment"># generate y</span>
<span class="identifier">rphi</span> <span class="special">=</span> <span class="identifier">np</span><span class="special">.</span><span class="identifier">empty</span><span class="special">((</span><span class="number">1000</span><span class="special">,</span> <span class="number">2</span><span class="special">))</span>
<span class="identifier">rphi</span><span class="special">[:,</span> <span class="number">0</span><span class="special">]</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">x</span> <span class="special">**</span> <span class="number">2</span> <span class="special">+</span> <span class="identifier">y</span> <span class="special">**</span> <span class="number">2</span><span class="special">)</span> <span class="special">**</span> <span class="number">0.5</span> <span class="comment"># compute radius</span>
<span class="identifier">rphi</span><span class="special">[:,</span> <span class="number">1</span><span class="special">]</span> <span class="special">=</span> <span class="identifier">np</span><span class="special">.</span><span class="identifier">arctan2</span><span class="special">(</span><span class="identifier">y</span><span class="special">,</span> <span class="identifier">x</span><span class="special">)</span> <span class="comment"># compute phi</span>
<span class="identifier">h</span><span class="special">.</span><span class="identifier">fill</span><span class="special">(</span><span class="identifier">rphi</span><span class="special">)</span>
<span class="comment"># access counts as a numpy array (no data is copied)</span>
<span class="identifier">count_matrix</span> <span class="special">=</span> <span class="identifier">np</span><span class="special">.</span><span class="identifier">asarray</span><span class="special">(</span><span class="identifier">h</span><span class="special">)</span>
<span class="keyword">print</span> <span class="identifier">count_matrix</span>
</pre>
<p>
The program output are the counts per bin as a 2d-array:
</p>
<p>
</p>
<pre class="programlisting"><span class="special">[[</span><span class="number">37</span> <span class="number">26</span> <span class="number">33</span> <span class="number">37</span><span class="special">]</span>
<span class="special">[</span><span class="number">60</span> <span class="number">69</span> <span class="number">76</span> <span class="number">62</span><span class="special">]</span>
<span class="special">[</span><span class="number">48</span> <span class="number">80</span> <span class="number">80</span> <span class="number">77</span><span class="special">]</span>
<span class="special">[</span><span class="number">38</span> <span class="number">49</span> <span class="number">45</span> <span class="number">49</span><span class="special">]</span>
<span class="special">[</span><span class="number">22</span> <span class="number">24</span> <span class="number">20</span> <span class="number">23</span><span class="special">]</span>
<span class="special">[</span> <span class="number">7</span> <span class="number">9</span> <span class="number">9</span> <span class="number">8</span><span class="special">]</span>
<span class="special">[</span> <span class="number">3</span> <span class="number">2</span> <span class="number">3</span> <span class="number">3</span><span class="special">]</span>
<span class="special">[</span> <span class="number">0</span> <span class="number">0</span> <span class="number">0</span> <span class="number">0</span><span class="special">]</span>
<span class="special">[</span> <span class="number">0</span> <span class="number">1</span> <span class="number">0</span> <span class="number">0</span><span class="special">]</span>
<span class="special">[</span> <span class="number">0</span> <span class="number">0</span> <span class="number">0</span> <span class="number">0</span><span class="special">]]</span>
</pre>
<p>
</p>
</div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2016 Hand Dembinski<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
</p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="introduction.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="notes.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>