Jekyll2018-07-25T15:36:27+02:00https://shaharkadmiel.github.io/Geosciences and random stuff(yet another) Geosciences blogShahar Shani-Kadmiels.shanikadmiel@tudelft.nlSticky table of contents sidebar2018-05-28T00:00:00+02:002018-05-28T00:00:00+02:00https://shaharkadmiel.github.io/Sticky-TOC-Sidebar<p>It is convenient to have the table of contents (TOC) sidebar scroll down with the page. This is assuming it is not longer than the window because then parts of the sidebar may be unaccessible.</p>
<p>Turns out this is rather easily accomplished with the CSS <code class="highlighter-rouge">position: stiky;</code> attribute. I modified the <code class="highlighter-rouge">/_sass/minimal-mistakes/_sidebar.scss</code> file so that the <code class="highlighter-rouge">.sidebar__right</code> class looks like this:</p>
<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="rouge-code"><pre><span class="nc">.sidebar__right</span> <span class="p">{</span>
<span class="nl">margin-bottom</span><span class="p">:</span> <span class="m">1em</span><span class="p">;</span>
<span class="err">@include</span> <span class="err">breakpoint($large)</span> <span class="err">{</span>
<span class="nl">position</span><span class="p">:</span> <span class="n">sticky</span> <span class="cp">!important</span><span class="p">;</span> <span class="c">/* added to make toc scroll with page */</span>
<span class="nl">float</span><span class="p">:</span> <span class="nb">right</span> <span class="cp">!important</span><span class="p">;</span> <span class="c">/* added to make toc scroll with page */</span>
<span class="nl">top</span><span class="p">:</span> <span class="m">0</span><span class="p">;</span>
<span class="nl">right</span><span class="p">:</span> <span class="m">0</span><span class="p">;</span>
<span class="nl">width</span><span class="p">:</span> <span class="err">$</span><span class="n">right-sidebar-width-narrow</span><span class="p">;</span>
<span class="nl">margin-right</span><span class="p">:</span> <span class="m">-1</span> <span class="err">*</span> <span class="err">$</span><span class="n">right-sidebar-width-narrow</span><span class="p">;</span>
<span class="nl">padding-left</span><span class="p">:</span> <span class="m">1em</span><span class="p">;</span>
<span class="nl">padding-top</span><span class="p">:</span> <span class="m">1em</span> <span class="cp">!important</span><span class="p">;</span> <span class="c">/* added to make toc scroll with page */</span>
<span class="nl">z-index</span><span class="p">:</span> <span class="m">10</span><span class="p">;</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>
<p>Here are some TOC entries to generate a TOC sidebar. Scroll to see the effect.</p>
<h2 id="item-1">Item 1</h2>
<h3 id="subitem-11">Subitem 1.1</h3>
<h3 id="subitem-12">Subitem 1.2</h3>
<h2 id="item-2">Item 2</h2>
<h3 id="subitem-21">Subitem 2.1</h3>
<h3 id="subitem-22">Subitem 2.2</h3>
<h3 id="subitem-23">Subitem 2.3</h3>
<h2 id="the-end">The end</h2>Shahar Shani-Kadmiels.shanikadmiel@tudelft.nlIt is convenient to have the table of contents (TOC) sidebar scroll down with the page. This is assuming it is not longer than the window because then parts of the sidebar may be unaccessible.Randomizing header image2018-05-25T00:00:00+02:002018-05-25T00:00:00+02:00https://shaharkadmiel.github.io/Loading-random-header-image<p>Having a random header on reload is a neat feature. I managed to get it to work. <em>Try it… hit reload!</em>. I have included my initial attempt which didn’t work but parts of it made it into the <a href="#solution">solution</a>.</p>
<h2 id="the-initial-idea">The initial idea</h2>
<h3 id="loop-through-header-images-and-construct-a-list">Loop through header images and construct a list</h3>
<p>I have placed all the header images that I would like to randomize in <code class="highlighter-rouge">/assets/images/headers/</code>. So I want to loop over all <code class="highlighter-rouge">site.static_files</code> and add only the images within that specific folder to my list.</p>
<div class="language-liquid highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
</pre></td><td class="rouge-code"><pre><!-- init the list -->
<span class="p">{%</span><span class="w"> </span><span class="nt">assign</span><span class="w"> </span><span class="nv">headers</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">""</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">split</span><span class="p">:</span><span class="w"> </span><span class="s1">','</span><span class="w"> </span><span class="p">%}</span>
<!-- loop and add -->
<span class="p">{%</span><span class="w"> </span><span class="nt">for</span><span class="w"> </span>image<span class="w"> </span>in<span class="w"> </span>site.static_files<span class="w"> </span><span class="p">%}</span>
<span class="p">{%</span><span class="w"> </span><span class="kr">if</span><span class="w"> </span><span class="nv">image</span><span class="p">.</span><span class="nv">path</span><span class="w"> </span><span class="ow">contains</span><span class="w"> </span><span class="s1">'/assets/images/headers/'</span><span class="w"> </span><span class="p">%}</span>
<!-- add image -->
<span class="p">{%</span><span class="w"> </span><span class="nt">assign</span><span class="w"> </span><span class="nv">headers</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">headers</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">push</span><span class="p">:</span><span class="w"> </span>image.path<span class="w"> </span><span class="p">%}</span>
<span class="p">{%</span><span class="w"> </span><span class="kr">endif</span><span class="w"> </span><span class="p">%}</span>
<span class="p">{%</span><span class="w"> </span><span class="nt">endfor</span><span class="w"> </span><span class="p">%}</span>
</pre></td></tr></tbody></table></code></pre></div></div>
<p>We can now have a look at what is stored in the <code class="highlighter-rouge">headers</code> array with:</p>
<div class="language-liquid highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre><span class="p">{{</span><span class="w"> </span><span class="nv">headers</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">inspect</span><span class="w"> </span><span class="p">}}</span>
</pre></td></tr></tbody></table></code></pre></div></div>
<p>which outputs:</p>
<p>["/assets/images/headers/CIG_Group_Photo_2.jpg", "/assets/images/headers/c72dcb0f-8d7a-4956-b49e-5b8461c777a2.jpg", "/assets/images/headers/cig_llnl_sw4_ws.jpg", "/assets/images/headers/e0642ed4-7bb9-41e3-ae9e-52a8d75ea044.jpg", "/assets/images/headers/img_0144.jpg", "/assets/images/headers/img_0319.jpg", "/assets/images/headers/img_0376.jpg", "/assets/images/headers/img_0551.jpg", "/assets/images/headers/img_1540.jpg", "/assets/images/headers/img_1912-pano.jpg", "/assets/images/headers/img_1912.jpg", "/assets/images/headers/img_2407.jpg", "/assets/images/headers/img_2423.jpg", "/assets/images/headers/img_2426-animation.gif", "/assets/images/headers/img_2427.jpg", "/assets/images/headers/img_2428.jpg", "/assets/images/headers/img_2553.jpg", "/assets/images/headers/img_2583.jpg", "/assets/images/headers/img_3022.jpg", "/assets/images/headers/img_3139.jpg", "/assets/images/headers/img_3187.jpg", "/assets/images/headers/img_3217.jpg", "/assets/images/headers/img_3619.jpg", "/assets/images/headers/img_3672.jpg", "/assets/images/headers/img_4365.jpg", "/assets/images/headers/img_4637.jpg", "/assets/images/headers/img_4829.jpg", "/assets/images/headers/img_5227.jpg", "/assets/images/headers/img_5275.jpg", "/assets/images/headers/img_5296.jpg", "/assets/images/headers/img_5297.jpg", "/assets/images/headers/img_5306.jpg", "/assets/images/headers/img_5325.jpg", "/assets/images/headers/img_5875.jpg", "/assets/images/headers/img_5896.jpg", "/assets/images/headers/img_5903.jpg", "/assets/images/headers/img_6016.jpg", "/assets/images/headers/phd_overview.png", "/assets/images/headers/wadi_rum_pan.jpg"]</p>
<h3 id="pick-a-random-header">Pick a random header</h3>
<p>Using the <code class="highlighter-rouge">sample</code> filter we get a random item from the <code class="highlighter-rouge">headers</code> array.</p>
<div class="language-liquid highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre><span class="p">{%</span><span class="w"> </span><span class="nt">assign</span><span class="w"> </span><span class="nv">random</span><span class="err">-</span><span class="nv">header</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">headers</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">sample</span><span class="w"> </span><span class="p">%}</span>
<span class="p">{{</span><span class="w"> </span><span class="nv">random</span><span class="err">-</span><span class="nv">header</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">inspect</span><span class="w"> </span><span class="p">}}</span>
</pre></td></tr></tbody></table></code></pre></div></div>
<p>"/assets/images/headers/img_5275.jpg"</p>
<p>The problem is that because Jekyll is a static site generator, this happens when the static page is <em>built</em> and not on reload. So we need to encapsulate this in a JavaScript that is executed every time a page is <em>served</em>.</p>
<h2 id="the-solution"><a id="solution"></a>The solution</h2>
<p>I found this very helpfull <a href="https://thornelabs.net/2014/01/19/display-random-jekyll-posts-during-each-page-load-or-refresh-using-javascript.html">post</a> by <em>James W Thorne</em> that mixes Liquid code and JavaScript code. This may not be the most elegant solution but id works.</p>
<h3 id="defaulthtml-layout">default.html layout</h3>
<p>I added the following JavaScript/Liquid mix to the <code class="highlighter-rouge"><head></code> section of the <code class="highlighter-rouge">default.html</code> layout:</p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
</pre></td><td class="rouge-code"><pre><span class="c"><!-- Load jQuery --></span>
<span class="nt"><script </span><span class="na">src=</span><span class="s">"/assets/js/vendor/jquery/jquery-3.3.1.min.js"</span> <span class="na">type=</span><span class="s">"text/javascript"</span><span class="nt">></script></span>
{% if page.header.image == 'random' or page.header.overlay_image == 'random' %}
<span class="c"><!-- Make a list of header images --></span>
<span class="c"><!-- init the list --></span>
{% assign header_images = "" | split: ',' %}
<span class="c"><!-- loop and add --></span>
{% for image in site.static_files %}
{% if image.path contains '/assets/images/headers/' %}
<span class="c"><!-- add image --></span>
{% assign header_images = header_images | push: image.path %}
{% endif %}
{% endfor %}
<span class="c"><!--
Javascript and Liquid code to gather a list of all header images
in /assets/images/headers/
--></span>
<span class="nt"><script </span><span class="na">type=</span><span class="s">"text/javascript"</span><span class="nt">></span>
<span class="c1">// get images from ``header_images`` array to js var</span>
<span class="kd">var</span> <span class="nx">header_images</span> <span class="o">=</span> <span class="p">[</span>
<span class="p">{</span><span class="o">%</span> <span class="k">for</span> <span class="nx">image</span> <span class="k">in</span> <span class="nx">header_images</span> <span class="o">%</span><span class="p">}</span>
<span class="s2">"{{ site.baseurl }}{{ image }}"</span><span class="p">,</span>
<span class="p">{</span><span class="o">%</span> <span class="nx">endfor</span> <span class="o">%</span><span class="p">}</span>
<span class="p">];</span>
<span class="kd">var</span> <span class="nx">randomIndex</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">floor</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nx">random</span><span class="p">()</span> <span class="o">*</span> <span class="nx">header_images</span><span class="p">.</span><span class="nx">length</span><span class="p">);</span>
<span class="c1">// and the winning ``header_image`` is...</span>
<span class="kd">var</span> <span class="nx">header_image</span> <span class="o">=</span> <span class="nx">header_images</span><span class="p">[</span><span class="nx">randomIndex</span><span class="p">]</span>
<span class="c1">// image without overlay</span>
<span class="p">{</span><span class="o">%</span> <span class="k">if</span> <span class="nx">page</span><span class="p">.</span><span class="nx">header</span><span class="p">.</span><span class="nx">image</span> <span class="o">==</span> <span class="s1">'random'</span> <span class="o">%</span><span class="p">}</span>
<span class="nx">$</span><span class="p">(</span><span class="nb">document</span><span class="p">).</span><span class="nx">ready</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="nx">$</span><span class="p">(</span><span class="s2">".page__hero-image"</span><span class="p">).</span><span class="nx">attr</span><span class="p">(</span><span class="s1">'src'</span><span class="p">,</span> <span class="nx">header_image</span><span class="p">);</span>
<span class="p">});</span>
<span class="c1">// image with overlay</span>
<span class="p">{</span><span class="o">%</span> <span class="nx">elsif</span> <span class="nx">page</span><span class="p">.</span><span class="nx">header</span><span class="p">.</span><span class="nx">overlay_image</span> <span class="o">==</span> <span class="s1">'random'</span> <span class="o">%</span><span class="p">}</span>
<span class="c1">// make sure overlay filter is handled correctly</span>
<span class="p">{</span><span class="o">%</span> <span class="k">if</span> <span class="nx">page</span><span class="p">.</span><span class="nx">header</span><span class="p">.</span><span class="nx">overlay_filter</span> <span class="nx">contains</span> <span class="s2">"rgba"</span> <span class="o">%</span><span class="p">}</span>
<span class="p">{</span><span class="o">%</span> <span class="nx">capture</span> <span class="nx">overlay_filter</span> <span class="o">%</span><span class="p">}{{</span> <span class="nx">page</span><span class="p">.</span><span class="nx">header</span><span class="p">.</span><span class="nx">overlay_filter</span> <span class="p">}}{</span><span class="o">%</span> <span class="nx">endcapture</span> <span class="o">%</span><span class="p">}</span>
<span class="p">{</span><span class="o">%</span> <span class="nx">elsif</span> <span class="nx">page</span><span class="p">.</span><span class="nx">header</span><span class="p">.</span><span class="nx">overlay_filter</span> <span class="o">%</span><span class="p">}</span>
<span class="p">{</span><span class="o">%</span> <span class="nx">capture</span> <span class="nx">overlay_filter</span> <span class="o">%</span><span class="p">}</span><span class="nx">rgba</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">{{</span> <span class="nx">page</span><span class="p">.</span><span class="nx">header</span><span class="p">.</span><span class="nx">overlay_filter</span> <span class="p">}}){</span><span class="o">%</span> <span class="nx">endcapture</span> <span class="o">%</span><span class="p">}</span>
<span class="p">{</span><span class="o">%</span> <span class="nx">endif</span> <span class="o">%</span><span class="p">}</span>
<span class="nx">$</span><span class="p">(</span><span class="nb">document</span><span class="p">).</span><span class="nx">ready</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="nx">$</span><span class="p">(</span><span class="s2">".page__hero--overlay"</span><span class="p">).</span><span class="nx">attr</span><span class="p">(</span><span class="s1">'style'</span><span class="p">,</span>
<span class="s1">'{% if page.header.overlay_color %}
background-color: {{ page.header.overlay_color | default:
"transparent" }};
{% endif %}
background-image: {% if overlay_filter %}
linear-gradient({{ overlay_filter }}, {{ overlay_filter }}),
{% endif %}url('</span> <span class="o">+</span> <span class="nx">header_image</span> <span class="o">+</span> <span class="s1">')'</span><span class="p">);</span>
<span class="p">});</span>
<span class="p">{</span><span class="o">%</span> <span class="nx">endif</span> <span class="o">%</span><span class="p">}</span>
<span class="nt"></script></span>
{% endif %}
</pre></td></tr></tbody></table></code></pre></div></div>
<p>Line 2 loads the <a href="http://jquery.com/">jQuery</a> library that allows setting the <code class="highlighter-rouge">src</code> attribute of the <code class="highlighter-rouge">.page__hero-image</code> class in the case of <code class="highlighter-rouge">image:</code> or the <code class="highlighter-rouge">style</code> attribute of the <code class="highlighter-rouge">.page__hero--overlay</code> class in the case of <code class="highlighter-rouge">overlay_image:</code>.</p>
<p>On build, line 4 makes sure nothing happens unless randomization is needed. If not, lines 5 through 62 will completely vanish from the page source.</p>
<p>Lines 7 through 15 compile a list of images in <code class="highlighter-rouge">/assets/images/headers/</code> and assigns that list to a <code class="highlighter-rouge">header_images</code> array variable. This is outside the JavaScrip code so it is run only when the page is built, not every time it is served.</p>
<p>The contents of the square brackets between lines 23 and 27 <strong>must</strong> be one line. Similarly, Lines 50 through 57 <strong>must</strong> be one line. *Lines here are broken for readability.</p>
<h3 id="yaml-front-matter">YAML front matter</h3>
<p>Every other layout is initially dependent on the <code class="highlighter-rouge">default</code> layout so header <code class="highlighter-rouge">image</code> or <code class="highlighter-rouge">overlay_image</code> can be randomized in all layouts. Simply set <code class="highlighter-rouge">image: random</code> or <code class="highlighter-rouge">overlay_image: random</code> in the front matter and you are set.</p>
<p>Here is an example of a <a href="/_pages/random_header_image/">page with a random header image</a> (unlike this post which has a random header <code class="highlighter-rouge">overlay_image</code>). If you were wondering what the front matter for this post looks like, here it is:</p>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="rouge-code"><pre><span class="nn">---</span>
<span class="na">title</span><span class="pi">:</span> <span class="s">Randomizing header image</span>
<span class="na">header</span><span class="pi">:</span>
<span class="na">overlay_image</span><span class="pi">:</span> <span class="s">random</span>
<span class="na">overlay_filter</span><span class="pi">:</span> <span class="s">rgba(255, 255, 255, 0.3)</span>
<span class="na">caption</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Image</span><span class="nv"> </span><span class="s">subject</span><span class="nv"> </span><span class="s">to</span><span class="nv"> </span><span class="s">Copyright:</span><span class="nv"> </span><span class="s">[**©</span><span class="nv"> </span><span class="s">Shahar</span><span class="nv"> </span><span class="s">Shani-Kadmiel**](https://shaharkadmiel.github.io)"</span>
<span class="na">tags</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">Random stuff</span><span class="pi">,</span> <span class="nv">Images</span><span class="pi">,</span> <span class="nv">Jekyll</span><span class="pi">,</span> <span class="nv">Liquid</span><span class="pi">,</span> <span class="nv">JavaScript</span><span class="pi">,</span> <span class="nv">jQuery</span><span class="pi">,</span> <span class="nv">Hacking</span><span class="pi">]</span>
<span class="na">toc</span><span class="pi">:</span> <span class="no">true</span>
<span class="na">toc_label</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Contents"</span>
<span class="na">author_profile</span><span class="pi">:</span> <span class="no">true</span>
<span class="na">published</span><span class="pi">:</span> <span class="no">true</span>
<span class="nn">---</span>
</pre></td></tr></tbody></table></code></pre></div></div>Shahar Shani-Kadmiels.shanikadmiel@tudelft.nlHaving a random header on reload is a neat feature. I managed to get it to work. Try it… hit reload!. I have included my initial attempt which didn’t work but parts of it made it into the solution.Starting my postdoc at TU Delft2017-02-14T00:00:00+01:002017-02-14T00:00:00+01:00https://shaharkadmiel.github.io/Starting-my-postdoc-at-TU-Delft<p>I am starting my Postdoc Researcher position at <a href="https://www.tudelft.nl/en/ceg/about-faculty/departments/geoscience-engineering/sections/applied-geophysics-petrophysics/">Delft University of Technology</a> today. My research is within the scope of <a href="https://www.tudelft.nl/en/ceg/about-faculty/departments/geoscience-engineering/sections/applied-geophysics-petrophysics/staff/academic-staff/prof-dr-lg-laeslo-evers/">Prof. Läslo Evers’</a> VIDI grant from NWO and aims to look at seismo-acoustic coupling. We are going to use signals from ground truth events (earthquakes, explosions, volcanic eruptions, landslides, etc.) in order to investigate the seismic and infrasonic components of the wave-field generated by these sources.</p>
<p>At this point, it all sounds very crazy to me. Think about it: We are going to look at signals that have propagated through the solid earth, generated a perturbation at the ground-air interface that was significant enough to move a large volume of air, this perturbation has traveled 50 km up into the stratosphere (or even 80 plus km into the thermosphere) and returned back down to a seismo-acoustic array on the ground at a distance of many hundreds of km away from the source.</p>
<p><em>Wish me luck!</em></p>Shahar Shani-Kadmiels.shanikadmiel@tudelft.nlI am starting my Postdoc Researcher position at Delft University of Technology today. My research is within the scope of Prof. Läslo Evers’ VIDI grant from NWO and aims to look at seismo-acoustic coupling. We are going to use signals from ground truth events (earthquakes, explosions, volcanic eruptions, landslides, etc.) in order to investigate the seismic and infrasonic components of the wave-field generated by these sources.Submitted my Dissertation today!2015-11-24T00:00:00+01:002015-11-24T00:00:00+01:00https://shaharkadmiel.github.io/PhD-Dissertation-Submitted<p>Todos:</p>
<ul class="task-list">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />Ph.D. dissertation submitted</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Secure a postdoc position</li>
</ul>
<p>Yes… I finally submitted the final version of my Ph.D. dissertation today: <a href="https://www.researchgate.net/publication/299134542_Seismic-Wave_Propagation_and_Ground_Motion_Prediction_During_Strong_Earthquakes_-_The_Dead_Sea_Transform">Seismic-Wave Propagation and Ground Motion Prediction During Strong Earthquakes - The Dead Sea Transform</a></p>
<p><strong>I still need to defend and graduate but it seems like the end of an era is inevitable.</strong> I enjoyed my time as a doctoral student very much. I was very fortunate to gain some serious skills in addition to the usual scientific research skill one might expect to gain during their Ph.D. I got to build a computational high performance cluster on which I computed my earthquake ground motion simulations. I got to deploy temporary seismic arrays in order to collect data in populated sedimentary basins. Although this data was not directly used in my Ph.D., I anticipate that I will use it down the road as it is a really nice dataset of continuous recordings. I got to TA several courses in geology, geophysics, geomechanics, and more at the undergraduate level, teach a full course on the <em>Dynamical Earth</em> to first year geology students while my advisor <a href="http://in.bgu.ac.il/en/engn/struct/Pages/staff/MichaelTsesarsky.aspx">Prof. Michael Tsesarsky</a> was on sabbatical, and I was actively advising M.Sc. students in our group on a professional level. Perhaps I will have separate blog posts on those later on.</p>
<p>I have not secured a <em>real</em> postdoc position yet… This is no easy task when you come from a fairly unknown university and were raised by academic advisors who are not very well known in the field of interest. Don’t get me wrong, I think my advisors (<a href="http://in.bgu.ac.il/en/engn/struct/Pages/staff/MichaelTsesarsky.aspx">Prof. Michael Tsesarsky</a> and <a href="http://www.gsi.gov.il/eng/?CategoryID=28&ArticleID=505">Prof. Zohar Gvirtzman</a>) were absolutely fantastic, <strong>really</strong>, but neither of them comes from a seismology background. They made up for this in many other ways. I attended as many conferences and workshops as I wanted. This helped me make some connections myself. I met with a lot of good scientists and gave a ton of seminars all over. For a while had a good feeling but there were funding issues.</p>
<hr />
<p>For now, I am heading for a short, in-between, postdoc at the Geological Survey of Israel (GSI) to work on underground tunnel detection. I have confident this will be meaningful work but probably not publishable (for obvious reasons…) and that is less than ideal at this point.</p>Shahar Shani-Kadmiels.shanikadmiel@tudelft.nlI finally submitted the final version of my Ph.D. dissertation todayBread Tectonics2014-11-29T00:00:00+01:002014-11-29T00:00:00+01:00https://shaharkadmiel.github.io/Bread-Tectonics<p>I love baking. I especially love making sourdough bread. Something about the slow process of growing the yeast, knitting the dough, the fermentation process, the incredible smell that fills the house while baking, and of course the taste and crunchiness of the crust.</p>
<p>As a geoscientist, I cannot but notice the similar morphology of sourdough bread crust and Mid-Ocean Ridge morphology of the Earth’s crust:</p>
<figure class="align-center">
<img src="https://shaharkadmiel.github.io/assets/images/bread_tectonics.jpg" alt="Bread and Mid Ocean Ridge morphology" />
<figcaption>Bread (<i>left</i>) and Mid Ocean Ridge (<i>right</i>) morphology.</figcaption>
</figure>
<p>If you think about it, the dynamics are not completely different; In both cases there is pressure forming under the solidifying crust, forcing extension at the surface in order to make room for new upwelling material. In the bread’s case this material is unbaked dough and in the Earth’s crust case this is of course the molten magma of the asthenospheric mantle.</p>
<p><em>I find this cool!</em></p>Shahar Shani-Kadmiels.shanikadmiel@tudelft.nlOn the similarity between sourdough bread crust and the earth's crust.Hillshade2014-06-15T00:00:00+02:002014-06-15T00:00:00+02:00https://shaharkadmiel.github.io/Hillshade<p>Following a great <a href="http://rnovitsky.blogspot.nl/2010/04/using-hillshade-image-as-intensity.html">blog post</a> by Ran (Novitsky) Nof on an improved <a href="http://rnovitsky.blogspot.nl/2010/04/using-hillshade-image-as-intensity.html">matplotlib hillshading</a> method, I decided to implement this method as well. I do it slightly differently than Ran, mainly in the way I normalize the intensity of the illumination result.</p>
<h3 id="this-is-the-hillshading-code">This is the <em>hillshading</em> code:</h3>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="kn">from</span> <span class="nn">scipy.ndimage</span> <span class="kn">import</span> <span class="n">uniform_filter</span>
<span class="k">def</span> <span class="nf">calc_intensity</span><span class="p">(</span><span class="n">relief</span><span class="p">,</span> <span class="n">azimuth</span><span class="o">=</span><span class="mf">315.</span><span class="p">,</span> <span class="n">altitude</span><span class="o">=</span><span class="mf">45.</span><span class="p">,</span>
<span class="n">scale</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">smooth</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">normalize</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
<span class="s">"""
Calculate the illumination intensity of ``relief``.
Can be used as to create a shaded relief map and GMT style draping
of data.
It is assumed that the grid origin is at the upper-left corner.
If that is not the case, add 90 to ``azimuth``.
This function produces similar results to the
:meth:`~matplotlib.colors.LightSource.hillshade` method of
matplotlib but gives extra control in terms of how the result is
normalized.
Parameters
----------
relief : a 2d :class:`~numpy.ndarray`
Topography or other data to calculate intensity from.
azimuth : float
Direction of light source, degrees from north.
altitude : float
Height of light source, degrees above the horizon.
scale : float
Scaling value of the data.
smooth : float
Number of cells to average before intensity calculation.
normalize : bool or float
By default the intensity is clipped to the [0,1] range. If set
to ``True``, intensity is normalized to [0,1]. Otherwise, give a
float value to normalize to [0,1] and multiply by the value
before clipping to [0,1]. If ``normalize`` > 1, illumination
becomes brighter and if < 1 illumination becomes darker.
Returns
-------
intensity : :class:`~numpy.ndarray`
a 2d array with illumination in the [0,1] range.
Same size as ``relief``.
"""</span>
<span class="n">relief</span> <span class="o">=</span> <span class="n">relief</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<span class="k">if</span> <span class="n">scale</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
<span class="n">relief</span> <span class="o">=</span> <span class="n">relief</span> <span class="o">*</span> <span class="n">scale</span>
<span class="k">if</span> <span class="n">smooth</span><span class="p">:</span>
<span class="n">relief</span> <span class="o">=</span> <span class="n">uniform_filter</span><span class="p">(</span><span class="n">relief</span><span class="p">,</span> <span class="n">size</span><span class="o">=</span><span class="n">smooth</span><span class="p">)</span>
<span class="n">dzdy</span><span class="p">,</span> <span class="n">dzdx</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">gradient</span><span class="p">(</span><span class="n">relief</span><span class="p">)</span>
<span class="n">slope</span> <span class="o">=</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">pi</span> <span class="o">-</span> <span class="n">np</span><span class="o">.</span><span class="n">arctan</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">dzdx</span><span class="o">**</span><span class="mi">2</span> <span class="o">+</span> <span class="n">dzdy</span><span class="o">**</span><span class="mi">2</span><span class="p">))</span>
<span class="n">aspect</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">dzdx</span><span class="p">,</span> <span class="n">dzdy</span><span class="p">)</span>
<span class="n">altitude</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">radians</span><span class="p">(</span><span class="n">altitude</span><span class="p">)</span>
<span class="n">azimuth</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">radians</span><span class="p">((</span><span class="n">azimuth</span> <span class="o">-</span> <span class="mi">90</span><span class="p">)</span> <span class="o">%</span> <span class="mi">360</span><span class="p">)</span>
<span class="n">intensity</span> <span class="o">=</span> <span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">altitude</span><span class="p">)</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">slope</span><span class="p">)</span> <span class="o">+</span>
<span class="n">np</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">altitude</span><span class="p">)</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">slope</span><span class="p">)</span> <span class="o">*</span>
<span class="n">np</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="o">-</span><span class="n">azimuth</span> <span class="o">-</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">pi</span> <span class="o">-</span> <span class="n">aspect</span><span class="p">))</span>
<span class="k">if</span> <span class="n">normalize</span><span class="p">:</span>
<span class="n">intensity</span> <span class="o">=</span> <span class="p">(</span><span class="n">normalize</span> <span class="o">*</span>
<span class="p">(</span><span class="n">intensity</span> <span class="o">-</span> <span class="n">intensity</span><span class="o">.</span><span class="nb">min</span><span class="p">())</span> <span class="o">/</span> <span class="n">intensity</span><span class="o">.</span><span class="n">ptp</span><span class="p">())</span>
<span class="k">return</span> <span class="n">intensity</span><span class="o">.</span><span class="n">clip</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
</pre></td></tr></tbody></table></code></pre></div></div>
<h3 id="generate-some-sample-data">Generate some sample data:</h3>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
</pre></td><td class="rouge-code"><pre><span class="k">def</span> <span class="nf">sample_data</span><span class="p">(</span><span class="n">rmin</span><span class="o">=-</span><span class="mi">30</span><span class="p">,</span> <span class="n">rmax</span><span class="o">=</span><span class="mi">30</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="mi">100</span><span class="p">):</span>
<span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">meshgrid</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="n">rmin</span><span class="p">,</span> <span class="n">rmax</span><span class="p">,</span> <span class="n">n</span><span class="p">),</span>
<span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="n">rmin</span><span class="p">,</span> <span class="n">rmax</span><span class="p">,</span> <span class="n">n</span><span class="p">))</span>
<span class="n">r</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sqrt</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="n">data</span> <span class="o">=</span> <span class="mi">10</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">pi</span> <span class="o">*</span> <span class="n">r</span> <span class="o">/</span> <span class="mi">8</span><span class="p">)</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">exp</span><span class="p">(</span><span class="o">-</span><span class="n">r</span> <span class="o">/</span> <span class="mi">10</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">*</span> <span class="n">y</span>
<span class="k">return</span> <span class="n">data</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">rand</span><span class="p">(</span><span class="o">*</span><span class="n">data</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span> <span class="o">-</span> <span class="mf">0.5</span>
</pre></td></tr></tbody></table></code></pre></div></div>
<h3 id="plot-relief-and-illumination">Plot relief and illumination</h3>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="n">plt</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">sample_data</span><span class="p">()</span>
<span class="n">fig</span><span class="p">,</span> <span class="n">ax</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplots</span><span class="p">(</span><span class="n">ncols</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">8</span><span class="p">,</span><span class="mi">3</span><span class="p">))</span>
<span class="n">im</span> <span class="o">=</span> <span class="n">ax</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">imshow</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">interpolation</span><span class="o">=</span><span class="s">'bilinear'</span><span class="p">,</span> <span class="n">cmap</span><span class="o">=</span><span class="s">'Greys_r'</span><span class="p">)</span>
<span class="n">ax</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="s">'relief'</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">colorbar</span><span class="p">(</span><span class="n">im</span><span class="p">,</span> <span class="n">ax</span><span class="o">=</span><span class="n">ax</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="c"># calculate illumination intensity using default values</span>
<span class="n">illumination</span> <span class="o">=</span> <span class="n">calc_intensity</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
<span class="n">im</span> <span class="o">=</span> <span class="n">ax</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">imshow</span><span class="p">(</span><span class="n">illumination</span><span class="p">,</span>
<span class="n">interpolation</span><span class="o">=</span><span class="s">'bilinear'</span><span class="p">,</span> <span class="n">cmap</span><span class="o">=</span><span class="s">'Greys_r'</span><span class="p">,</span>
<span class="n">vmin</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">vmax</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">ax</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="s">'illumination'</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">colorbar</span><span class="p">(</span><span class="n">im</span><span class="p">,</span> <span class="n">ax</span><span class="o">=</span><span class="n">ax</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
<span class="k">for</span> <span class="n">ax_</span> <span class="ow">in</span> <span class="n">ax</span><span class="p">:</span>
<span class="n">ax_</span><span class="o">.</span><span class="n">set_xticks</span><span class="p">([])</span>
<span class="n">ax_</span><span class="o">.</span><span class="n">set_yticks</span><span class="p">([])</span>
</pre></td></tr></tbody></table></code></pre></div></div>
<p><img src="/assets/images/hillshade_images/output_7_0.png" alt="png" /></p>
<h3 id="different-scale-and-smooth-parameters">Different <code class="highlighter-rouge">scale</code> and <code class="highlighter-rouge">smooth</code> parameters</h3>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
</pre></td><td class="rouge-code"><pre><span class="kn">from</span> <span class="nn">itertools</span> <span class="kn">import</span> <span class="n">product</span>
<span class="n">scale</span> <span class="o">=</span> <span class="p">(</span><span class="mf">0.1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
<span class="n">smooth</span> <span class="o">=</span> <span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
<span class="n">fig</span><span class="p">,</span> <span class="n">ax</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplots</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">smooth</span><span class="p">),</span> <span class="nb">len</span><span class="p">(</span><span class="n">scale</span><span class="p">),</span>
<span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="n">scale</span><span class="p">),</span> <span class="mi">2</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="n">smooth</span><span class="p">)))</span>
<span class="n">fig</span><span class="o">.</span><span class="n">subplots_adjust</span><span class="p">(</span><span class="n">left</span><span class="o">=</span><span class="mf">0.1</span><span class="p">,</span> <span class="n">bottom</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">right</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">top</span><span class="o">=</span><span class="mf">0.9</span><span class="p">,</span>
<span class="n">wspace</span><span class="o">=</span><span class="mf">0.05</span><span class="p">,</span> <span class="n">hspace</span><span class="o">=</span><span class="mf">0.05</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="p">((</span><span class="n">smooth_</span><span class="p">,</span> <span class="n">scale_</span><span class="p">),</span> <span class="n">ax_</span><span class="p">)</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">product</span><span class="p">(</span><span class="n">smooth</span><span class="p">,</span> <span class="n">scale</span><span class="p">),</span>
<span class="n">ax</span><span class="o">.</span><span class="n">flat</span><span class="p">)):</span>
<span class="c"># calculate illumination intensity with scale and smooth params</span>
<span class="n">illumination</span> <span class="o">=</span> <span class="n">calc_intensity</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="n">scale_</span><span class="p">,</span> <span class="n">smooth</span><span class="o">=</span><span class="n">smooth_</span><span class="p">)</span>
<span class="n">ax_</span><span class="o">.</span><span class="n">imshow</span><span class="p">(</span><span class="n">illumination</span><span class="p">,</span>
<span class="n">interpolation</span><span class="o">=</span><span class="s">'bilinear'</span><span class="p">,</span> <span class="n">cmap</span><span class="o">=</span><span class="s">'Greys_r'</span><span class="p">,</span>
<span class="n">vmin</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">vmax</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">ax_</span><span class="o">.</span><span class="n">set_xticks</span><span class="p">([])</span>
<span class="n">ax_</span><span class="o">.</span><span class="n">set_yticks</span><span class="p">([])</span>
<span class="k">if</span> <span class="n">i</span> <span class="o"><</span> <span class="nb">len</span><span class="p">(</span><span class="n">scale</span><span class="p">):</span>
<span class="n">ax_</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="s">'scale: {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">scale_</span><span class="p">),</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">12</span><span class="p">)</span>
<span class="k">if</span> <span class="n">i</span> <span class="o">%</span> <span class="nb">len</span><span class="p">(</span><span class="n">scale</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">ax_</span><span class="o">.</span><span class="n">set_ylabel</span><span class="p">(</span><span class="s">'smooth: {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">smooth_</span><span class="p">))</span>
</pre></td></tr></tbody></table></code></pre></div></div>
<p><img src="/assets/images/hillshade_images/output_9_0.png" alt="png" /></p>
<h3 id="different-scale-and-normalization-parameters">Different <code class="highlighter-rouge">scale</code> and <code class="highlighter-rouge">normalization</code> parameters</h3>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="rouge-code"><pre><span class="n">scale</span> <span class="o">=</span> <span class="p">(</span><span class="mf">0.1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
<span class="n">normalize</span> <span class="o">=</span> <span class="p">(</span><span class="bp">False</span><span class="p">,</span> <span class="bp">True</span><span class="p">,</span> <span class="mf">0.6</span><span class="p">,</span> <span class="mf">1.5</span><span class="p">)</span>
<span class="n">fig</span><span class="p">,</span> <span class="n">ax</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplots</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">normalize</span><span class="p">),</span> <span class="nb">len</span><span class="p">(</span><span class="n">scale</span><span class="p">),</span>
<span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="n">scale</span><span class="p">),</span> <span class="mi">2</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="n">normalize</span><span class="p">)))</span>
<span class="n">fig</span><span class="o">.</span><span class="n">subplots_adjust</span><span class="p">(</span><span class="n">left</span><span class="o">=</span><span class="mf">0.1</span><span class="p">,</span> <span class="n">bottom</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">right</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">top</span><span class="o">=</span><span class="mf">0.9</span><span class="p">,</span>
<span class="n">wspace</span><span class="o">=</span><span class="mf">0.05</span><span class="p">,</span> <span class="n">hspace</span><span class="o">=</span><span class="mf">0.05</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="p">((</span><span class="n">normalize_</span><span class="p">,</span> <span class="n">scale_</span><span class="p">),</span> <span class="n">ax_</span><span class="p">)</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">product</span><span class="p">(</span><span class="n">normalize</span><span class="p">,</span> <span class="n">scale</span><span class="p">),</span>
<span class="n">ax</span><span class="o">.</span><span class="n">flat</span><span class="p">)):</span>
<span class="c"># calculate illumination intensity with scale and normalize params</span>
<span class="n">illumination</span> <span class="o">=</span> <span class="n">calc_intensity</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="n">scale_</span><span class="p">,</span> <span class="n">normalize</span><span class="o">=</span><span class="n">normalize_</span><span class="p">)</span>
<span class="n">ax_</span><span class="o">.</span><span class="n">imshow</span><span class="p">(</span><span class="n">illumination</span><span class="p">,</span>
<span class="n">interpolation</span><span class="o">=</span><span class="s">'bilinear'</span><span class="p">,</span> <span class="n">cmap</span><span class="o">=</span><span class="s">'Greys_r'</span><span class="p">,</span>
<span class="n">vmin</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">vmax</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">ax_</span><span class="o">.</span><span class="n">set_xticks</span><span class="p">([])</span>
<span class="n">ax_</span><span class="o">.</span><span class="n">set_yticks</span><span class="p">([])</span>
<span class="k">if</span> <span class="n">i</span> <span class="o"><</span> <span class="nb">len</span><span class="p">(</span><span class="n">scale</span><span class="p">):</span>
<span class="n">ax_</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="s">'scale: {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">scale_</span><span class="p">),</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">12</span><span class="p">)</span>
<span class="k">if</span> <span class="n">i</span> <span class="o">%</span> <span class="nb">len</span><span class="p">(</span><span class="n">scale</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">ax_</span><span class="o">.</span><span class="n">set_ylabel</span><span class="p">(</span><span class="s">'normalize: {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">normalize_</span><span class="p">))</span>
</pre></td></tr></tbody></table></code></pre></div></div>
<p><img src="/assets/images/hillshade_images/output_11_0.png" alt="png" /></p>Shahar Shani-Kadmiels.shanikadmiel@tudelft.nlHillshading code.