<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Posts on Jeff Peterson&#39;s Blog</title>
		<link>https://jeffpeterson.xyz/posts/</link>
		<description>Recent content in Posts on Jeff Peterson&#39;s Blog</description>
		<generator>Hugo -- gohugo.io</generator>
		<language>en-us</language>
		<lastBuildDate>Sun, 14 Jun 2020 10:00:00 -0700</lastBuildDate>
		<atom:link href="https://jeffpeterson.xyz/posts/index.xml" rel="self" type="application/rss+xml" />
		
		<item>
			<title>Finding the best Gain and Offset</title>
			<link>https://jeffpeterson.xyz/posts/finding-the-best-gain-and-offset/</link>
			<pubDate>Sun, 14 Jun 2020 10:00:00 -0700</pubDate>
			
			<guid>https://jeffpeterson.xyz/posts/finding-the-best-gain-and-offset/</guid>
			<description>What gain and offset settings should I use for my CMOS astronomy camera?
It turns out that this is not a simple question to answer. There are plenty of forum posts that suggest one gain/offset or another but the methodology behind those numbers is often opaque.
In this post I&#39;ll explore the process I used to determine the &amp;ldquo;ideal&amp;rdquo; gain, exposure time, and offset settings for my situation. This process should work with common consumer CMOS cameras being used for DSO astro-photography.</description>
			<content type="html"><![CDATA[<p><em>What gain and offset settings should I use for my CMOS astronomy camera?</em></p>
<p>It turns out that this is not a simple question to answer. There are plenty of
forum posts that suggest one gain/offset or another but the methodology behind
those numbers is often opaque.</p>
<p>In this post I'll explore the process I used to determine the &ldquo;ideal&rdquo; gain,
exposure time, and offset settings for my situation. This process should work
with common consumer CMOS cameras being used for DSO astro-photography.</p>
<p>I'll use a <a href="https://astronomy-imaging-camera.com/product/asi290mm">ZWO ASI1600MM</a> as an example throughout.</p>
<h2 id="understanding-gain">Understanding Gain</h2>
<p>What is gain? In simple terms, gain determines how photon (electron) counts are
converted into ADU counts in the camera. The ADU counts will eventually become
the values for each pixel in the resulting image file.</p>
<p>ADUs have a fixed number of bits with which to represent values. The ASI1600MM
has 12 bits or <code>2^12 = 4096</code> possible values per pixel. All values are positive
numbers, e.g. <code>[0-4096)</code>, with <code>0</code> being a special value to be avoided (more on
this later).</p>
<p>Unity gain is the gain setting at which the number of electrons measured is
exactly equal to the value stored in the ADU. For the ASI1600MM, this value is
<a href="https://astronomy-imaging-camera.com/wp-content/uploads/1600-Gain-RN-DR-FW-vs-gain1.jpg">gain 139</a>.</p>
<p>Some CMOS cameras also have a special gain setting where there is a step-change
in read noise. This happens when the internal electronics switch into &ldquo;high
gain&rdquo; mode and can be seen on the <a href="http://astronomy-imaging-camera.com/wp-content/uploads/290-readnoise.jpg">manufacturer graphs</a>. For the ASI290MM,
this is gain ~70.</p>
<p>Gain offers a trade-off. It's primarily a choice between larger dynamic range
(lower gain) vs lower effective read noise (higher gain).</p>
<table>
<thead>
<tr>
<th align="center">Gain Setting</th>
<th>Dynamic Range</th>
<th>Brightness</th>
<th>Read noise</th>
<th>Quantization noise</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center"><strong>Low</strong></td>
<td>Larger</td>
<td>Lower</td>
<td>Higher</td>
<td>Yes</td>
</tr>
<tr>
<td align="center"><strong>Unity</strong></td>
<td>Medium</td>
<td>Medium</td>
<td>Medium</td>
<td>No</td>
</tr>
<tr>
<td align="center"><strong>High</strong></td>
<td>Smaller</td>
<td>Higher</td>
<td>Lower</td>
<td>No</td>
</tr>
</tbody>
</table>
<p>The formulas are:</p>
<pre><code>// The max full well capacity (FWC) for the camera.
// The value is for the ASI1600MM. Change this to match your camera.
full_well_capacity_gain0_e = 20000

// The number of bits the ADU has for each value.
// The value is for the ASI1600MM. Change this to match your camera.
adu_bits = 12

// Calculates the baseline gain e/ADU (gain 0).
// For ASI1600MM the result is 20000 / 4096 = 4.88.
gain0_e_per_adu = full_well_capacity_gain0_e / pow(2, adu_bits)

// Caculates the ADU value for a specific electron count and gain.
//
// `gain` is the camera gain setting (in 0.1db).
// `e` is the photon/electron count from sensor.
adu_value = e / gain0_e_per_adu * pow(10, gain/200)

// Calculates the e/ADU for a specific gain setting (0.1db).
gain_e_per_adu = gain0_e_per_adu / pow(10, gain/200)
</code></pre><p>These formulas are derived from the
<a href="https://en.wikipedia.org/wiki/Gain_(electronics)#Voltage_gain">Voltage Gain</a>
formula:</p>
<pre><code>// Calculates the gain setting (in 0.1 dB).
gain = 20 * log(gain0_e_per_adu / gain_e_per_adu) * 10
</code></pre><h2 id="understanding-dynamic-range">Understanding Dynamic Range</h2>
<p>Dynamic Range is a measure of the effective number of distinct values that can
be represented by the camera's sensor. It's primarily a function of gain. As
gain increases, the usable full well capacity of the sensor decreases, since the
larger counts will be clipped. This is why higher gain results in lower dynamic
range.</p>
<p>In general, broadband (LRGB) and bright targets benefit most from higher dynamic
range. Narrowband (Ha, Oiii, Sii) and dimer targets generally need less dynamic
range.</p>
<p>The formulas are:</p>
<pre><code>// Calculates the effective full well capacity (electrons) for a specific gain.
// `offset_adu` is the offset setting for the camera. 
full_well_capacity_e = gain_e_per_adu * (pow(2, adu_bits) - offset_adu)

// The dynamic range in decibels.
dynamic_range_db = 20 * log(full_well_capacity_e / read_noise_e)

// The dynamic range in F-stops / bits.
dynamic_range_stops = dynamic_range_db / 6

// The dynamic range in steps / values.
//
// `read_noise_e` is the read noise for the camera at a gain setting (electrons).
dynamic_range_steps = full_well_capacity_e / read_noise_e
</code></pre><p>Stacking also influences the dynamic range. Additional subs will improve the
dynamic range. The formula is:</p>
<pre><code>// Calculate the dynamic range in decibels after stacking/integrating
// sub-exposures.
//
// `num_subs` is the number of sub-exposures.
dynamic_range_db = (20 * log(full_well_capacity_e /
                             (read_noise_e / sqrt(num_subs))))
</code></pre><h2 id="understanding-offset">Understanding Offset</h2>
<p>Offset compensates for negative values introduced by read noise.</p>
<p>Offset is a fixed value that is added to the electron count after gain is
applied but before the value is stored in the ADU. The offset value is not
scaled up by the gain.</p>
<p>The purpose of offset is to prevent pixels from clipping to zero in dark areas
of the image (usually background). Clipping reduces the signal to noise ratio
and can reduce the accuracy of calibration frames. It can happen when read noise
and dark current introduce a negative charge that is greater than the offset.</p>
<p>Read noise is a <a href="https://en.wikipedia.org/wiki/Normal_distribution">Gaussian distribution</a> centered on zero. The reported
read noise for a given gain setting is the standard deviation (sigma or RMS) of
the distribution. Consequently, it is normal for read noise to introduce a
negative charge.</p>
<p>For example, a 1.5e read noise (sigma) means that ~50% of the time, the read
noise will be between +/- 1.5e. Given millions of pixels, it would not be
unreasonable to expect to see negative noise that is 10-20x the read
noise.</p>
<p>Offset is also a trade-off. It prevents clipping but it also reduces the usable
capacity of the camera ADU because it is a constant value added to all pixels.
This reduces the available dynamic range. As a result, care should be taken to
not use an offset value which is too large.</p>
<pre><code>// Determines the amount of dynamic range (in steps) that is lost by using
// the specified offset value.
dynamic_range_loss_steps = offset_adu * gain_e_per_adu
</code></pre><h2 id="ideal-gain">Determining the &ldquo;ideal&rdquo; Gain</h2>
<p>Lets start with the goals. We want:</p>
<ol>
<li>Enough dynamic range so we are not clipping stars too much</li>
<li>Exposure times which are long enough to swamp the read noise</li>
<li>Exposure times which are not too long
(tracking errors, satellites, airplanes, clouds, etc)</li>
</ol>
<h3 id="dynamic-range">Dynamic Range</h3>
<p>Dynamic range requirements will vary from target to target and filter to
filter. For the purpose of this analysis, let's assume that more dynamic range
is always better and not try to define a fixed min/max value.</p>
<h3 id="exposure-time">Exposure Time</h3>
<p>For my equipment and location, reasonable exposure times are between 30 seconds
and 5 minutes. Anything shorter consumes too much disk space and processing
time. Anything longer risks throwing away too many subs. We also need to expose
for long enough to swamp to read noise.</p>
<p>The <a href="https://www.amazon.com/Astrophotography-Manual-Practical-Scientific-Approach/dp/1138055360/">formulas</a> are:</p>
<pre><code>// Caculates the background value in electrons/second.
sky_flux_e_per_sec = ((background_adu - darkframe_adu) * gain_e_per_adu) /
                     exposure_time_sec

// The minimum exposure time
min_exposure_sec = 5 * pow(read_noise_e, 2) / sky_flux_e_per_sec

// The optimal exposure time
optimal_exposure_sec = pow(read_noise_e, 2) /
                       ((pow(1.05, 2) - 1) * sky_flux_e_per_sec)
</code></pre><h3 id="optimizing-gain-and-exposure-time">Optimizing Gain and Exposure time</h3>
<p>To simplify things, let's consider 4 gain settings:</p>
<ol>
<li>Gain 0</li>
<li>The gain where there is a step-change in the read noise</li>
<li>Unity Gain</li>
<li>High gain (e.g. 200 or 300)</li>
</ol>
<p>High gain levels are only needed if your mount can't support long enough
exposures (e.g. alt-az), for narrowband filters, or extremely dark
skies.</p>
<p>To decide which gain setting to use, I used the following procedure:</p>
<ol>
<li>Start with lowest reasonable gain (to maximize dynamic range)
<ol>
<li>For LRGB, gain 0 can be a good starting point</li>
<li>For narrowband filers, unity gain can be a good starting point</li>
</ol>
</li>
<li>Take a test light exposure and a corresponding dark frame</li>
<li>In the light frame, select a region of background with no stars or other objects
<ol>
<li>Record the median ADU value for this region as <code>background_adu</code></li>
<li>Record the median ADU value from the same region in the dark frame as
<code>darkframe_adu</code></li>
</ol>
</li>
<li>Calculate optimal exposure time using the formulas above
<ol>
<li>If it's less than your minimum exposure time, use your minimum exposure
time. You are done.</li>
<li>If it's between your minimum and maximum exposure time, use it. You are
done.</li>
</ol>
</li>
<li>Otherwise, repeat steps 2-4 with the next gain setting</li>
</ol>
<h2 id="determining-ideal-offset">Determining &ldquo;ideal&rdquo; Offset</h2>
<p>The &ldquo;ideal&rdquo; offset value depends on the read noise that the camera has at a
specific gain setting. The following procedure should be repeated for each gain
setting that will be used. See <a href="#ideal-gain">Ideal Gain</a> for how to determine
the &ldquo;best&rdquo; gain settings.</p>
<p>To determine the &ldquo;ideal&rdquo; offset for a specific gain:</p>
<ol>
<li>Set the gain setting to the value you want to test (e.g. unity)</li>
<li>Figure out what offset value is used by default at this gain
<ul>
<li>Let's call this the <code>test_offset_adu</code></li>
<li>If you are unsure, set offset to a specific value (e.g. 0)</li>
</ul>
</li>
<li>Take 50-100 bias frames</li>
<li>Stack the bias frames using Maximum as the algorithm
<ul>
<li>Make sure to disable weighting, normalization, and pixel rejection</li>
</ul>
</li>
<li>Use image statistics to find the maximum value in the integrated image in
ADU
<ul>
<li>Let's call this <code>max_value_adu</code></li>
</ul>
</li>
<li>Calculate the ideal offset (in electrons)
<pre><code>ideal_ofset_adu = max_value_adu - test_offset_adu + 1
</code></pre></li>
</ol>
<h2 id="example-calculations-for-zwo-asi1600mm">Example calculations for ZWO ASI1600MM</h2>
<p>For the ASI1600MM in my light polluted skies, here are the values I got following
the procedures above.</p>
<ul>
<li><strong>RGB</strong>: Gain 0, offset 10, 60s exposures</li>
<li><strong>Narrowband</strong>: Gain 200, offset 100, 300s exposures</li>
</ul>
<p>Note: I use synthetic luminance rather than a L filter (due to light pollution).</p>
<p>Gain and Exposure time:</p>
<table>
<thead>
<tr>
<th>Filter</th>
<th>Gain</th>
<th>Optimal Exposure</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td>R</td>
<td>0</td>
<td>56 sec</td>
<td>Round to 60 sec</td>
</tr>
<tr>
<td>G</td>
<td>0</td>
<td>55 sec</td>
<td>Use 60 sec for consistency</td>
</tr>
<tr>
<td>B</td>
<td>0</td>
<td>45 sec</td>
<td>Use 60 sec for consistency</td>
</tr>
<tr>
<td>Ha (5nm)</td>
<td>139</td>
<td>423 sec</td>
<td>Too long</td>
</tr>
<tr>
<td>Oiii (3nm)</td>
<td>139</td>
<td>282 sec</td>
<td></td>
</tr>
<tr>
<td>Sii (3nm)</td>
<td>139</td>
<td>845 sec</td>
<td></td>
</tr>
<tr>
<td>Ha (5nm)</td>
<td>200</td>
<td>293 sec</td>
<td>Round to 300 sec</td>
</tr>
<tr>
<td>Oiii (3nm)</td>
<td>200</td>
<td>189 sec</td>
<td>Use 300 sec for consistency</td>
</tr>
<tr>
<td>Sii (3nm)</td>
<td>200</td>
<td>734 sec</td>
<td>Use 300 sec for consistency</td>
</tr>
</tbody>
</table>
<p>Offset:</p>
<table>
<thead>
<tr>
<th>Gain</th>
<th>test_offset_adu</th>
<th>max_value_adu</th>
<th>ideal_offset_adu</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td>50</td>
<td>59</td>
<td>9</td>
<td></td>
</tr>
<tr>
<td>76</td>
<td>50</td>
<td>75</td>
<td>15</td>
<td></td>
</tr>
<tr>
<td>139</td>
<td>50</td>
<td>103</td>
<td>53</td>
<td>ZWO default: 50</td>
</tr>
<tr>
<td>200</td>
<td>50</td>
<td>151</td>
<td>101</td>
<td></td>
</tr>
</tbody>
</table>
<h2 id="example-calculations-for-zwo-asi290mm">Example calculations for ZWO ASI290MM</h2>
<p>Offset:</p>
<table>
<thead>
<tr>
<th>Gain</th>
<th>test_offset_adu</th>
<th>max_value_adu</th>
<th>ideal_offset_adu</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td>18</td>
<td>29</td>
<td>12</td>
<td>ZWO default: 10</td>
</tr>
<tr>
<td>70</td>
<td>18</td>
<td>32</td>
<td>15</td>
<td></td>
</tr>
<tr>
<td>110</td>
<td>18</td>
<td>40</td>
<td>23</td>
<td>ZWO default: 18</td>
</tr>
</tbody>
</table>
<h2 id="references">References</h2>
<ul>
<li><a href="https://youtu.be/ub1HjvlCJ5Y">Choosing the right gain for Deep Sky imaging with CMOS cameras</a></li>
<li><a href="https://www.cloudynights.com/topic/570020-gain-settings-for-asi1600mm-cool/">Gain settings for ASI1600MM-Cool</a></li>
<li><a href="https://astronomy-imaging-camera.com/wp-content/uploads/1600-Gain-RN-DR-FW-vs-gain1.jpg">ZWO graphs for ASI1600MM</a></li>
<li><a href="http://astronomy-imaging-camera.com/wp-content/uploads/290-readnoise.jpg">ZWO graphs for ASI290MM</a></li>
<li><a href="http://www.stark-labs.com/help/blog/files/GainAndOffset.php">Gain, Offset, and Bit Depth</a></li>
<li><a href="https://www.edmundoptics.com/knowledge-center/application-notes/imaging/basics-of-digital-camera-settings-for-improved-imaging-results/">Imaging Electronics 101: Basics of Digital Camera Settings for Improved Imaging Results</a></li>
<li><a href="https://www.cloudynights.com/topic/573886-sub-exposure-tables-for-asi-1600-and-maybe-qhy163/?p=7942423">sub exposure tables for ASI 1600 (and maybe QHY163?)</a></li>
<li><a href="https://www.cloudynights.com/topic/562211-dynamic-range/">Dynamic Range</a></li>
<li><a href="https://www.cloudynights.com/topic/576306-swamping-the-read-noise-question/">Swamping the read noise question</a></li>
<li><a href="https://www.atik-cameras.com/news/read-noise-ccd-cameras/">Read Noise in CCD Cameras</a></li>
<li><a href="https://en.wikipedia.org/wiki/Normal_distribution">Normal Distribution</a></li>
<li><a href="https://www.amazon.com/Astrophotography-Manual-Practical-Scientific-Approach/dp/1138055360/">The Astrophotography Manual: A Practical and Scientific Approach to Deep Sky Imaging</a></li>
</ul>
]]></content>
		</item>
		
		<item>
			<title>Organizing Astrophotography Files</title>
			<link>https://jeffpeterson.xyz/posts/organizing-files/</link>
			<pubDate>Sun, 24 May 2020 11:00:00 -0701</pubDate>
			
			<guid>https://jeffpeterson.xyz/posts/organizing-files/</guid>
			<description>Like many people, I&#39;ve been struggling with how to organize all the data I capture with my telescope. In a given session, it&#39;s not uncommon to come away with 10GB of data and hundreds of files. Proper calibration requires that the lights, darks, flats, and dark flats match perfectly. With some projects taking taking multiple sessions over multiple weeks (or longer), it&#39;s easy to lose track of which files go together.</description>
			<content type="html"><![CDATA[<p>Like many people, I've been struggling with how to organize all the data I
capture with my telescope. In a given session, it's not uncommon to come away
with 10GB of data and hundreds of files.  Proper calibration requires that the
lights, darks, flats, and dark flats match perfectly. With some projects taking
taking multiple sessions over multiple weeks (or longer), it's easy to lose track
of which files go together.</p>
<p>I want to share my system for organizing my data and why I think it is better
than some of the other approaches you might find on the internet. I will also
discuss some of the earlier approaches I took and why they didn't end up working
out well.</p>
<h2 id="directory-structure">Directory Structure</h2>
<p>Here is the directory structure that I use:</p>
<ul>
<li><code>Capture\</code>
<ul>
<li><code>{date}\</code> &mdash; session start
<ul>
<li><code>Calibration\</code>
<ul>
<li><code>Darks\</code></li>
<li><code>{filter}\</code> &mdash; flats &amp; flat darks</li>
</ul>
</li>
<li><code>{target}\</code>
<ul>
<li><code>{filer}\</code> &mdash; lights</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><code>Calibration\</code> &mdash; master darks, bias, etc</li>
<li><code>Processed\</code> &mdash; final processed images
<ul>
<li><code>{target}-{date}\</code></li>
</ul>
</li>
<li><code>Work\</code> &mdash; scratch area for processing
<ul>
<li><code>{target}\</code></li>
</ul>
</li>
</ul>
<h2 id="why-this-approach">Why this approach?</h2>
<p>I had several goals in mind when designing this approach:</p>
<ol>
<li>Make it easy to keep track of the matching calibration &amp; light frames</li>
<li>Make it easy to transfer the data from the latest session to another device</li>
<li>Make it easy to perform backups of the important files and ignore the
unimportant ones (more on this later)</li>
<li>Make it automated; it should not require any manual book keeping (spreadsheets)</li>
</ol>
<p>When thinking about how to organize the data coming off the telescope, I
realized that matching the directory structure to how I use the telescope is
really important. It makes the book keeping happen automatically when the frames
are captured.</p>
<p>Here's what my typical <strong>imaging session</strong> looks like:</p>
<ol>
<li>I set up my telescope in my backyard</li>
<li>I use it for one or more nights</li>
<li>I shoot multiple targets during those nights</li>
<li>At one or more points during the process I shoot calibration frames (flats,
darks, etc)</li>
<li>I put it away</li>
</ol>
<p>In this scheme, each imaging session is given its own directory, named by the
date on which it started. This structure ensures that I can always find the
calibration frames which match a set of light frames. I don't need to take
duplicate calibration frames per day/target or maintain a separate spreadsheet
mapping.</p>
<p>If I make changes to the telescope which don't require new calibration frames, I
just continue the current imaging session. If something happens that causes new
calibration frames to be needed, I start a new imaging session. For example,
changes to the imaging train, rotating the camera, major new dust mote, etc.</p>
<p>By separating all the original/raw frames into their own <code>Capture\</code> directory,
it is easy to ensure they are backed up. The data for a single session can also
be easily and quickly transferred from one device to another.</p>
<p>The <code>Processed\</code> directory is where I store my master files. This includes the
final images and the raw integrated masters for each filter (in case I want to
reprocess).</p>
<p>The <code>Work\</code> directory is where I store all the intermediary files generated
during processing. e.g., calibrated flats, calibrated lights, registered lights,
etc. I create one sub directory for each project I am working on. If I start
running low on disk space, I delete these directories. I do not back them up as
they can be extremely large and can always be reproduced from the originals.</p>
<h3 id="sequence-generator-pro-sgp">Sequence Generator Pro (SGP)</h3>
<p>I use Sequence Generator Pro to automate image captures. Here's how I configure
it to work with this directory structure:</p>
<ol>
<li>At the beginning of the session, set the capture directory to
<code>D:\Astro\Capture\{date}\</code></li>
<li>Set the file path pattern to <code>%tn\%fe\%dt_%tm_%ft_%fe_%ct_%el_%su_%04</code>
<ul>
<li>Example: <code>D:\Astro\Capture\2020-05-22\M 51 - Whirlpool Galaxy\Ha\2020-05-24_105724_Light_Ha_NA_300sec_gain139_offset50_0031.&lt;ext&gt;</code></li>
</ul>
</li>
</ol>
<p>If I need to start a new session for some reason, I just change the capture
directory.</p>
<p>To capture calibration frames, I create a new target in SGP and name it
<code>Calibration</code>. I then fill it with the flats, darks, etc events as needed.</p>
<h2 id="alternatives">Alternatives</h2>
<h3 id="one-capture-directory-per-day">One capture directory per day</h3>
<p>I tried using the same directory structure as above but with one key difference.
I created one sub-directory per imaging date, not per session.  In the
beginning, this was fine since I never had an imaging session which spanned more
than one night.</p>
<p>Things became difficult to manage as I started to image more. With multi-night
sessions, the calibration frames were frequently taken on different dates from
the lights. Having to constantly remember which dates match with which was too
error prone for me.</p>
<p>This is a fine place to start, just be sure to make the switch once you start
doing multi-night imaging sessions.</p>
<h3 id="organize-by-project">Organize by project</h3>
<p>I briefly tried organizing by &ldquo;project&rdquo;.</p>
<ul>
<li><code>Projects\</code>
<ul>
<li><code>{target}-{date}\</code>
<ul>
<li><code>{filter}\</code>
<ul>
<li><code>{lights}\</code></li>
<li><code>{flats}\</code></li>
<li><code>{flat_darks}\</code></li>
</ul>
</li>
<li><code>Processed\</code></li>
<li><code>Work\</code></li>
</ul>
</li>
</ul>
</li>
</ul>
<p>There were a few problems with this approach:</p>
<ol>
<li>Sharing calibration frames across multiple projects captured during the same
imaging session didn't work cleanly.
<ul>
<li>It requires duplicating the frames or manual bookkeeping, both I want to
avoid.</li>
</ul>
</li>
<li>Sometimes I had multiple imaging sessions per project. This made keeping
track of the calibration frames more difficult.</li>
<li>File transfers were slow because the capture directories became bloated
after several sessions.</li>
<li>Backups were annoying because I had to exclude each of the <code>Work\</code>
sub-directories</li>
</ol>
]]></content>
		</item>
		
	</channel>
</rss>
