#!/usr/bin/env python
# coding: utf-8
# # 8 - Sísmica de reflexão: Resolução e armadilhas na interpretação
#
# Nessa prática, vamos simular diversos cenários geológicos e prever como seria uma sessão sísmica já empilhada e em tempo. Você vai poder desenhar seus modelos em um programa estilo "MS Paint", designar velocidades para cada litologia e ver o resultado esperado da sísmica para cada situação.
#
# Exemplos de modelos e a inspiração para essa aula vieram das aulas de ["Pitfalls in Seismic Interpretation"](http://pages.geo.wvu.edu/~wilson/geol554.htm) do [Prof. Thomas H. Wilson](http://pages.geo.wvu.edu/~wilson/).
#
# Recomendo também a leitura do texto [Tuning Geology](https://www.agilegeoscience.com/blog/2011/7/8/tuning-geology.html) do Matt Hall.
# ## Objetivos
#
# * Familiarizar como o processo de modelagem direta para testar hipóteses
# * Observar o efeito de anomalias estáticas e de velocidade no dado sísmico
# * Aprender sobre situações que geralmente induzem a erros na interpretação
# ## Questão para entregar
#
#
#
# Explique os detalhes aos quais devemos nos atentar quando interpretando uma sísmica em tempo.
#
#
#
# **Dicas**:
#
# * Fale sobre o efeito da resolução quando interpretamos camadas finas.
# * Como as velocidades podem afetar a forma dos horizontes?
#
#
# ### Regras para a resposta
#
# * Coloque **nome, data e o número da prática** em sua resposta.
# * A resposta pode ter no **máximo 1 página** (não uma folha).
# * **Execute o notebook** antes de responder. As simulações abaixo foram feitas para te ajudar.
# * **Pense e organize** sua resposta andtes de começar a escrever.
# ## Instruções
#
# Esse documento é um [Jupyter notebook](http://jupyter.org/), um documento interativo que mistura texto (como esse), código (como abaixo), e o resultado de executar o código (números, texto, figuras, videos, etc).
#
# O notebook te fornecerá exemplos interativos que trabalham os temas abordados no questionário. Utilize esses exemplos para responder as perguntas.
#
# As células com números ao lado, como `In [1]:`, são código [Python](http://python.org/). Algumas dessas células não produzem resultado e servem de preparação para os exemplos interativos. Outras, produzem gráficos interativos. **Você deve executar todas as células, uma de cada vez**, mesmo as que não produzem gráficos.
#
# **Para executar uma célula**, clique em cima dela e aperte `Shift + Enter`. O foco (contorno verde ou cinza em torno da célula) deverá passar para a célula abaixo. Para rodá-la, aperte `Shift + Enter` novamente e assim por diante. Você pode executar células de texto que não acontecerá nada.
# ## Setup
#
# Rode as células abaixo para carregar os módulos necessários para essa prática.
# In[ ]:
get_ipython().run_line_magic('matplotlib', 'inline')
from __future__ import division, print_function
import math
from PIL import Image
import numpy as np
import scipy.misc
import matplotlib.pyplot as plt
import ipywidgets as ipw
from fatiando.seismic import conv
from fatiando.vis.mpl import seismic_image, seismic_wiggle
# ## Resolução vertical e camadas finas
#
# Vimos em aula que a resolução vertical máxima do dado sísmico é aproximadamente $\lambda/4$ e
#
# $$\lambda = \frac{V}{f}$$
#
# Vamos explorar agora como isso afeta a nossa interpretação de uma camada fina. No exemplo abaixo, podemos variar a espessura e velocidade da camada e a frequência da onda sísmica.
# In[ ]:
def camada_fina(velocidade, espessura, frequencia):
n_samples, n_traces = [400, 100]
dt, dz = 1e-4, 1
velocity = 3000*np.ones((n_samples, n_traces))
top = 150
bottom = top + int(np.floor(espessura/dz))
velocity[top : bottom, :] = velocidade
# Gardner's relation: https://en.wikipedia.org/wiki/Gardner%27s_relation
rho = 0.31*(velocity**0.25)
vel_l = conv.depth_2_time(velocity, velocity, dt=dt, dz=dz)
rho_l = conv.depth_2_time(velocity, rho, dt=dt, dz=dz)
rc = conv.reflectivity(vel_l, rho_l)
data = conv.convolutional_model(rc, frequencia, conv.rickerwave, dt=dt)
fig, axes = plt.subplots(1, 2, figsize=(8, 5))
ax = axes[0]
ax.set_title("Modelo (em profundidade)")
tmp = ax.imshow(velocity, extent=[0, n_traces, n_samples*dz, 0],
cmap="viridis", aspect='auto', origin='upper',
vmin=1000, vmax=5000)
fig.colorbar(tmp, ax=ax, pad=0, aspect=50)
ax.set_ylabel('Profundidade (m)')
ax = axes[1]
ax.set_title("Sismograma")
seismic_image(data, dt=dt, cmap="RdBu_r", aspect='auto')
ax.set_ylabel('Tempo (s)')
ax.set_ylim(0.3, 0)
plt.tight_layout()
ipw.interactive(camada_fina,
velocidade=ipw.FloatSlider(min=2000, max=5000, step=200, value=1000),
espessura=ipw.FloatSlider(min=5, max=150, step=5, value=100),
frequencia=ipw.FloatSlider(min=10, max=60, step=5, value=30))
# ### Para pensar
#
# * O que acontece com o tempo de chegada da reflexão no topo da camada quando você diminui a espessura? Isso deveria acontecer?
# * Como a velocidade e a frequência influenciam sua capacidade de ver o topo e a base da camada separados?
# ## Cenários geológicos
#
# Agora, vamos modelar diferentes cenários geológicos utilizando um programa do tipo MS Paint.
#
# Rode as células abaixo para criar as funções que vamos precisar para nossa modelagem.
# In[ ]:
def img_template(fname, pixel_thresh=10, return_colors=False):
img = Image.open(fname)
count, colors = zip(*[[n, c] for n, c in img.getcolors() if n > pixel_thresh])
sort = np.argsort(count)
colors = np.array(colors)[sort][::-1]
data = scipy.misc.fromimage(img)
template = np.zeros(data.shape[:2], dtype=np.int)
for i, c in enumerate(colors):
template[np.all(data == c, axis=2)] = i
# For now, any pixel not of the top colors (eliminated by pixel_thresh)
# is assigned index 0. A better way would be interpolate or copy the neighbors.
if return_colors:
return template, colors
else:
return template
# In[ ]:
def painter_widget(template, vmin, vmax, step, cmap='copper_r', prop='V', plot_func=None):
colors = np.unique(template)
args = dict(min=vmin, max=vmax, step=step)
sliders = dict([['{}{}'.format(prop, i + 1), ipw.FloatSlider(**args)]
for i in range(len(colors))])
model = np.empty_like(template)
def plot_func(vp):
rho = 0.31*(vp**0.25)
dz = 2000/vp.shape[0]
dt = 1e-3
f = 15
vp_t = conv.depth_2_time(vp, vp, dt=dt, dz=dz)
rho_t = conv.depth_2_time(vp, rho, dt=dt, dz=dz)
rc = conv.reflectivity(vp_t, rho_t)
data = conv.convolutional_model(rc, f, conv.rickerwave, dt=dt)
times = np.arange(vp_t.shape[0])*dt
# Plots
fig = plt.figure(figsize=(12, 4))
ax = plt.subplot(121)
plt.imshow(vp, cmap='copper_r', extent=[0, vp.shape[1], vp.shape[0]*dz, 0],
vmin=vmin, vmax=vmax, aspect='auto')
plt.colorbar(pad=0.01, aspect=40).set_label('Velocidade (m/s)')
ax.set_title('Modelo')
ax.set_ylabel('profundidade')
ax = plt.subplot(122)
seismic_image(data, dt=dt, cmap='RdBu_r', aspect='auto')
ax.set_title(u'Sessão sísmica')
ax.set_ylabel('tempo (s)')
plt.tight_layout()
return fig
def callback(**kwargs):
for v, c in zip(kwargs, colors):
model[template == c] = kwargs[v]
plot_func(model)
return ipw.interactive(callback, **sliders)
# ### Desenhando modelos
#
# Utilize o Pinta para desenhar seus modelos:
#
# 1. Crie uma figura de **300 x 150 pixels** (clique em "New Figure").
# 2. Utilize as ferramentas de retângulo e pincel para desenhar.
# 3. Coloque **cada litologia** com uma cor diferente. Não importa qual.
# 4. Salve sua figura como **.png** na mesma pasta que está o notebook.
#
# ### Modelos
#
# Você deve criar 3 modelos:
#
# 1. Um domo de sal com as camadas sedimentares ao redor e camadas planas abaixo dele ([exemplo](../data/modelo-sal.png)).
# 2. Uma cada irregular na superfície com camadas plano-paralelas abaixo dela ([exemplo](../data/modelo-camada-intemperismo.png)).
# 3. Um carbonato (recife) inserido no meio de camadas plano-paralelas (faça o topo dele ser um pouco acima da camada na qual está inserido) ([exemplo](../data/modelo-carbonato.png)).
#
# Coloque o nome da sua figura nas células abaixo e execute as. Cada uma será uma figura interativa na qual você pode controlar as velocidades de cada camada em seu modelo.
#
# Utilize a tabela abaixo (retirada de Kearey et al, 2002) para escolher as velocidades para seu modelo.
#
#
#
# In[ ]:
template_sal = img_template('NOME-DA-SUA-FIGURA.png')
painter_widget(template_sal, 1000, 8000, 100)
# In[ ]:
template_carbonato = img_template('NOME-DA-SUA-FIGURA.png')
painter_widget(template_carbonato, 1000, 8000, 100)
# In[ ]:
template_camada_irregular = img_template('NOME-DA-SUA-FIGURA.png')
painter_widget(template_camada_irregular, 1000, 8000, 100)
# ### Para pensar
#
# * O que acontece com as camadas abaixo do sal?
# * O que acontece com os cantos das camadas que foram deformadas pelo sal?
# * O que acontece com as camadas abaixo da camada irregular?
# * Como você interpretaria o dado do carbonado se não soubesse que ali tem um carbonato?
# ## Referências
#
# Kearey, P., M. Brooks, and I. Hill (2002), An Introduction to Geophysical Exploration, 3 edition., Wiley-Blackwell, Malden, MA.
# ## License and information
#
# **Course website**: https://github.com/leouieda/geofisica2
#
# **Note**: This notebook is part of the course "Geofísica 2" of Geology program of the
# [Universidade do Estado do Rio de Janeiro](http://www.uerj.br/).
# All content can be freely used and adapted under the terms of the
# [Creative Commons Attribution 4.0 International License](http://creativecommons.org/licenses/by/4.0/).
#
# ![Creative Commons License](https://i.creativecommons.org/l/by/4.0/88x31.png)