geo 365n/384s seismic data processing computational ...ahay.org/rsf/book/geo384s/hw5/paper.pdfgeo...

26
GEO 365N/384S Seismic Data Processing Computational Assignment 5 Team: Longhorns ABSTRACT In this assignment, you will experiment with noise removal using different kinds of the Radon transform: 1. Linear Radon transform for groundroll attenuation in the Alaska data. 2. Parabolic Radon transform for multiple attenuation in the Viking Graben data. 3. Hyperbolic Radon transform for multiple attenuation in the Viking Graben data. Different aspects of the Radon transform are discussed in (Gardner and Lu, 1991). Different aspects of multiple attenuation are discussed in (Weglein and Dragoset, 2005). PREREQUISITES Completing the computational part of this homework assignment requires Madagascar software environment available from http://www.ahay.org/ L A T E X environment with SEGT E X available from http://www.ahay.org/wiki/SEGTeX To do the assignment on your personal computer, you need to install the required environ- ments. To setup the Madagascar environment in the JGB 3.216B computer lab, run the follow- ing commands: module load madagascar-devel source $RSFROOT/share/madagascar/etc/env.csh setenv DATAPATH $HOME/data/ setenv RSFBOOK $HOME/data/book setenv RSFFIGS $HOME/data/figs You can put these commands in your $HOME/.cshrc file to run them automatically at login time. To setup the L A T E X environment, run the following commands:

Upload: others

Post on 08-Aug-2020

11 views

Category:

Documents


0 download

TRANSCRIPT

  • GEO 365N/384S Seismic Data ProcessingComputational Assignment 5

    Team: Longhorns

    ABSTRACT

    In this assignment, you will experiment with noise removal using different kinds of theRadon transform:

    1. Linear Radon transform for groundroll attenuation in the Alaska data.

    2. Parabolic Radon transform for multiple attenuation in the Viking Graben data.

    3. Hyperbolic Radon transform for multiple attenuation in the Viking Graben data.

    Different aspects of the Radon transform are discussed in (Gardner and Lu, 1991).Different aspects of multiple attenuation are discussed in (Weglein and Dragoset, 2005).

    PREREQUISITES

    Completing the computational part of this homework assignment requires

    • Madagascar software environment available fromhttp://www.ahay.org/

    • LATEX environment with SEGTEX available fromhttp://www.ahay.org/wiki/SEGTeX

    To do the assignment on your personal computer, you need to install the required environ-ments.

    To setup the Madagascar environment in the JGB 3.216B computer lab, run the follow-ing commands:

    module load madagascar-develsource $RSFROOT/share/madagascar/etc/env.cshsetenv DATAPATH $HOME/data/setenv RSFBOOK $HOME/data/booksetenv RSFFIGS $HOME/data/figs

    You can put these commands in your $HOME/.cshrc file to run them automatically at logintime.

    To setup the LATEX environment, run the following commands:

    http://www.ahay.org/http://www.ahay.org/wiki/SEGTeX

  • 2

    cdgit clone https://github.com/SEGTeX/texmf.gittexhash

    You only need to do it once.

    The homework code is available from the class repository by running

    svn co https://github.com/GEO384S/geo384s/trunk/hw5

    You can also download it from your team’s private repository.

    GENERATING THIS DOCUMENT

    At any point of doing this computational assignment, you can regenerate this documentand display it on your screen.

    1. Change directory to hw5:

    cd hw5

    2. Run

    sftour scons lockscons read &

    As the first step, open hw5/paper.tex file in your favorite editor and edit the first lineto enter the name of your team. Then run scons read again.

    LINEAR RADON TRANSFORM (SLANT STACK)

    In the first part of the assignment, we will revisit the groundroll attenuation problem in theAlaska data and will try to solve it using the linear Radon transform (slant stack).

    1. Change directory to hw5/radon.

    2. Run

    scons -c

    to remove (clean) previously generated files.

    3. To compare the Radon method with the previously used Fourier method, we willextract one shot gather from the Alaska dataset. Figure 1a shows the extracted shotgather and the result of signal-and-noise separation using the Fourier method fromEmc-Hammer. To reproduce it on your screen, run

  • 3

    (a)

    (b)

    Figure 1: Signal and noise separation using (a) Fourier method from Assignment 2,(b) Radon method from this assignment.

    from rsf.proj import *

    # Download one shot gatherFetch('shot.HH','alaska')

    Flow('shot','shot.HH','dd form=native')Plot('shot','grey title="Selected Shot" clip=2')

    # Previous method: Fourier transform####################################

    Flow('fft','shot','fft1 | fft3')Plot('fft', ''' window max1=100 | math output="abs(input)" | real | grey allpos=y title="Fourier Transform" ''') v1=9v2=11

    # Program from Emc-Hammer

    prog = Program('filter.c') Flow('filter','fft %s' % prog[0], './${SOURCES[1]} logis=30 v1=%g v2=%g type=1' % (v1,v2))

    Result('filter', ''' window max1=100 | math output="abs(input)" | real | grey allpos=y title="Filtered" ''')

    Flow('mute','fft %s' % prog[0], ''' math output=1 | ./${SOURCES[1]} v1=%g v2=%g | real ''' % (v1,v2))

    Result('mute','window max1=100 | grey allpos=y tile="Mute"')

    Flow('signal','filter','fft3 inv=y | fft1 inv=y')Plot('signal','grey title=Signal clip=2')

    Flow('noise','shot signal','add scale=1,-1 ${SOURCES[1]}')Plot('noise','grey title=Noise clip=2')

    Result('signal','shot signal noise','SideBySideAniso')

    # New method: Radon transform#############################

    # slope samplingpmax=0.4np=401dp=2*pmax/(np-1)

    Flow('radon','shot', 'radon adj=y spk=n p0=%g dp=%g np=%d' % (-pmax,dp,np))Plot('radon', ''' grey title="Radon Transform" label2=Slope unit2=s/kft clip=0.1 ''')

    Flow('inv','radon','radon adj=n nx=96 dx=0.11 ox=-5.225')Plot('inv','grey title="Inverse Radon Transform" clip=2')

    Result('radon','shot radon inv','SideBySideAniso')

    # minimum and maximum slope for the noisep1=0.15p2=0.3

    Flow('cut','radon', ''' math output=1 | cut min2=%g max2=%g | cut max2=%g | cut min2=%g ''' % (-p1,p1,-p2,p2))Flow('radon-cut','radon cut','mul ${SOURCES[1]}')Plot('radon-cut', ''' grey title="Noise Radon Transform" label2=Slope unit2=s/kft clip=0.1 ''')

    Flow('noise2','radon-cut','radon adj=n nx=96 dx=0.11 ox=-5.225')Plot('noise2','grey title=Noise clip=2')

    Result('radon-cut','radon radon-cut noise2','SideBySideAniso')

    Flow('signal2','shot noise2','add scale=1,-1 ${SOURCES[1]}')Plot('signal2','grey title=Signal clip=2')

    Result('signal2','shot signal2 noise2','SideBySideAniso')

    End()

  • 4

    Figure 2: From left to right: input shot gather, its Radon transform, data recon-structed by the inverse transform.

    scons signal.view

    4. Figure 2 shows the input shot gather, its Radon transform (slant stack), and thegather reconstructed by the inverse transform. To make sure that the transform isinvertible, this implementation uses the Toeplitz structure of the matrix coming fromthe normal equations in least-squares inversion (Kostov, 1990).

    To reproduce the figure on your screen, run

    scons radon.view

    5. The asymptotic theory of the generalized Radon transform predicts that a seismicevent T (x) will be transformed to an event τ(p) in the transform domain. The trans-formation follows from the tangent condition T (x) = θ(x; τ, p) ,T ′(x) = ∂

    ∂xθ(x; τ, p) ,

    (1)

    where θ(x; τ, p) describes a family of stacking curves. Prove that, when the stackingcurve is a line,

    θ(x; τ, p) = τ + p x , (2)

    a hyperbolic seismic event

    T (x) =

    √t20 +

    x2

    v20(3)

    will be transformed into an ellipse.

    from rsf.proj import *

    # Download one shot gatherFetch('shot.HH','alaska')

    Flow('shot','shot.HH','dd form=native')Plot('shot','grey title="Selected Shot" clip=2')

    # Previous method: Fourier transform####################################

    Flow('fft','shot','fft1 | fft3')Plot('fft', ''' window max1=100 | math output="abs(input)" | real | grey allpos=y title="Fourier Transform" ''') v1=9v2=11

    # Program from Emc-Hammer

    prog = Program('filter.c') Flow('filter','fft %s' % prog[0], './${SOURCES[1]} logis=30 v1=%g v2=%g type=1' % (v1,v2))

    Result('filter', ''' window max1=100 | math output="abs(input)" | real | grey allpos=y title="Filtered" ''')

    Flow('mute','fft %s' % prog[0], ''' math output=1 | ./${SOURCES[1]} v1=%g v2=%g | real ''' % (v1,v2))

    Result('mute','window max1=100 | grey allpos=y tile="Mute"')

    Flow('signal','filter','fft3 inv=y | fft1 inv=y')Plot('signal','grey title=Signal clip=2')

    Flow('noise','shot signal','add scale=1,-1 ${SOURCES[1]}')Plot('noise','grey title=Noise clip=2')

    Result('signal','shot signal noise','SideBySideAniso')

    # New method: Radon transform#############################

    # slope samplingpmax=0.4np=401dp=2*pmax/(np-1)

    Flow('radon','shot', 'radon adj=y spk=n p0=%g dp=%g np=%d' % (-pmax,dp,np))Plot('radon', ''' grey title="Radon Transform" label2=Slope unit2=s/kft clip=0.1 ''')

    Flow('inv','radon','radon adj=n nx=96 dx=0.11 ox=-5.225')Plot('inv','grey title="Inverse Radon Transform" clip=2')

    Result('radon','shot radon inv','SideBySideAniso')

    # minimum and maximum slope for the noisep1=0.15p2=0.3

    Flow('cut','radon', ''' math output=1 | cut min2=%g max2=%g | cut max2=%g | cut min2=%g ''' % (-p1,p1,-p2,p2))Flow('radon-cut','radon cut','mul ${SOURCES[1]}')Plot('radon-cut', ''' grey title="Noise Radon Transform" label2=Slope unit2=s/kft clip=0.1 ''')

    Flow('noise2','radon-cut','radon adj=n nx=96 dx=0.11 ox=-5.225')Plot('noise2','grey title=Noise clip=2')

    Result('radon-cut','radon radon-cut noise2','SideBySideAniso')

    Flow('signal2','shot noise2','add scale=1,-1 ${SOURCES[1]}')Plot('signal2','grey title=Signal clip=2')

    Result('signal2','shot signal2 noise2','SideBySideAniso')

    End()

  • 5

    Answer:

    Can you spot ellipses in the Radon transform domain in Figure 2?

    Figure 3: Separating noise from signal in the Radon domain. From left to right:the Radon transform, separated noise components, noise reconstructed by the inversetransform.

    6. To isolate dipping noise events associated with the groundroll, we can carve them outfrom the Radon domain according to their slopes. The selected cut and its inverseRadon transform are shown in Figure 3. To reproduce this figure on your screen, run

    scons radon-cut.view

    7. The final result of separating the signal and noise using the Radon transform is shownin Figure 1b. You can reproduce it on your screen by running

    scons signal2.view

    or compare it with the Fourier-domain result by running

    sfpen Fig/signal.vpl Fig/signal2.vpl

    8. Name some theoretical advantages and disadvantages of using the Radon transformin comparison with the Fourier transform.

    Answer:

    from rsf.proj import *

    # Download one shot gatherFetch('shot.HH','alaska')

    Flow('shot','shot.HH','dd form=native')Plot('shot','grey title="Selected Shot" clip=2')

    # Previous method: Fourier transform####################################

    Flow('fft','shot','fft1 | fft3')Plot('fft', ''' window max1=100 | math output="abs(input)" | real | grey allpos=y title="Fourier Transform" ''') v1=9v2=11

    # Program from Emc-Hammer

    prog = Program('filter.c') Flow('filter','fft %s' % prog[0], './${SOURCES[1]} logis=30 v1=%g v2=%g type=1' % (v1,v2))

    Result('filter', ''' window max1=100 | math output="abs(input)" | real | grey allpos=y title="Filtered" ''')

    Flow('mute','fft %s' % prog[0], ''' math output=1 | ./${SOURCES[1]} v1=%g v2=%g | real ''' % (v1,v2))

    Result('mute','window max1=100 | grey allpos=y tile="Mute"')

    Flow('signal','filter','fft3 inv=y | fft1 inv=y')Plot('signal','grey title=Signal clip=2')

    Flow('noise','shot signal','add scale=1,-1 ${SOURCES[1]}')Plot('noise','grey title=Noise clip=2')

    Result('signal','shot signal noise','SideBySideAniso')

    # New method: Radon transform#############################

    # slope samplingpmax=0.4np=401dp=2*pmax/(np-1)

    Flow('radon','shot', 'radon adj=y spk=n p0=%g dp=%g np=%d' % (-pmax,dp,np))Plot('radon', ''' grey title="Radon Transform" label2=Slope unit2=s/kft clip=0.1 ''')

    Flow('inv','radon','radon adj=n nx=96 dx=0.11 ox=-5.225')Plot('inv','grey title="Inverse Radon Transform" clip=2')

    Result('radon','shot radon inv','SideBySideAniso')

    # minimum and maximum slope for the noisep1=0.15p2=0.3

    Flow('cut','radon', ''' math output=1 | cut min2=%g max2=%g | cut max2=%g | cut min2=%g ''' % (-p1,p1,-p2,p2))Flow('radon-cut','radon cut','mul ${SOURCES[1]}')Plot('radon-cut', ''' grey title="Noise Radon Transform" label2=Slope unit2=s/kft clip=0.1 ''')

    Flow('noise2','radon-cut','radon adj=n nx=96 dx=0.11 ox=-5.225')Plot('noise2','grey title=Noise clip=2')

    Result('radon-cut','radon radon-cut noise2','SideBySideAniso')

    Flow('signal2','shot noise2','add scale=1,-1 ${SOURCES[1]}')Plot('signal2','grey title=Signal clip=2')

    Result('signal2','shot signal2 noise2','SideBySideAniso')

    End()

  • 6

    9. The separation of signal and noise in Figure 1b is not optimal: there are remainingpieces of noise in the estimated signal and remaining signal in the estimated noise.Your creative task is to try improving this results by changing the parameters of theRadon transform or changing the way the noise is separated from the signal in thetransformed domain.

    radon/SConstruct

    1 from r s f . p ro j import ∗2

    3 # Download one sho t ga ther4 Fetch ( ’ shot .HH’ , ’ a l a ska ’ )5

    6 Flow ( ’ shot ’ , ’ shot .HH’ , ’ dd form=nat ive ’ )7 Plot ( ’ shot ’ , ’ grey t i t l e =”Se l e c t ed Shot” c l i p =2 ’ )8

    9 # Previous method : Fourier transform10 ####################################11

    12 Flow ( ’ f f t ’ , ’ shot ’ , ’ f f t 1 | f f t 3 ’ )13 Plot ( ’ f f t ’ ,14 ’ ’ ’15 window max1=100 | math output=”abs ( input )” | r e a l |16 grey a l l p o s=y t i t l e =”Four i e r Transform”17 ’ ’ ’ )18

    19 v1=920 v2=1121

    22 # Program from Emc−Hammer23

    24 prog = Program ( ’ f i l t e r . c ’ )25

    26 Flow ( ’ f i l t e r ’ , ’ f f t %s ’ % prog [ 0 ] ,27 ’ . / ${SOURCES[ 1 ] } l o g i s =30 v1=%g v2=%g type=1 ’ % ( v1 , v2 ) )28

    29 Result ( ’ f i l t e r ’ ,30 ’ ’ ’31 window max1=100 | math output=”abs ( input )” |32 r e a l | grey a l l p o s=y t i t l e =”F i l t e r e d ”33 ’ ’ ’ )34

    35 Flow ( ’ mute ’ , ’ f f t %s ’ % prog [ 0 ] ,36 ’ ’ ’37 math output=1 | . / ${SOURCES[ 1 ] } v1=%g v2=%g | r e a l38 ’ ’ ’ % ( v1 , v2 ) )39

    40 Result ( ’ mute ’ , ’ window max1=100 | grey a l l p o s=y t i l e =”Mute” ’ )

  • 7

    41

    42 Flow ( ’ s i g n a l ’ , ’ f i l t e r ’ , ’ f f t 3 inv=y | f f t 1 inv=y ’ )43 Plot ( ’ s i g n a l ’ , ’ grey t i t l e=S igna l c l i p =2 ’ )44

    45 Flow ( ’ no i s e ’ , ’ shot s i g n a l ’ , ’ add s c a l e =1,−1 ${SOURCES[ 1 ] } ’ )46 Plot ( ’ no i s e ’ , ’ grey t i t l e=Noise c l i p =2 ’ )47

    48 Result ( ’ s i g n a l ’ , ’ shot s i g n a l no i s e ’ , ’ SideBySideAniso ’ )49

    50 # New method : Radon transform51 #############################52

    53 # s l ope sampling54 pmax=0.455 np=40156 dp=2∗pmax/(np−1)57

    58 Flow ( ’ radon ’ , ’ shot ’ ,59 ’ radon adj=y spk=n p0=%g dp=%g np=%d ’ % (−pmax , dp , np ) )60 Plot ( ’ radon ’ ,61 ’ ’ ’62 grey t i t l e =”Radon Transform”63 l a b e l 2=Slope uni t2=s / k f t c l i p =0.164 ’ ’ ’ )65

    66 Flow ( ’ inv ’ , ’ radon ’ , ’ radon adj=n nx=96 dx=0.11 ox=−5.225 ’ )67 Plot ( ’ inv ’ , ’ grey t i t l e =”Inve r s e Radon Transform” c l i p =2 ’ )68

    69 Result ( ’ radon ’ , ’ shot radon inv ’ , ’ SideBySideAniso ’ )70

    71 # minimum and maximum s l op e f o r the no i se72 p1=0.1573 p2=0.374

    75 Flow ( ’ cut ’ , ’ radon ’ ,76 ’ ’ ’77 math output=1 |78 cut min2=%g max2=%g |79 cut max2=%g | cut min2=%g80 ’ ’ ’ % (−p1 , p1,−p2 , p2 ) )81 Flow ( ’ radon−cut ’ , ’ radon cut ’ , ’ mul ${SOURCES[ 1 ] } ’ )82 Plot ( ’ radon−cut ’ ,83 ’ ’ ’84 grey t i t l e =”Noise Radon Transform”85 l a b e l 2=Slope uni t2=s / k f t c l i p =0.186 ’ ’ ’ )87

    88 Flow ( ’ no i s e2 ’ , ’ radon−cut ’ , ’ radon adj=n nx=96 dx=0.11 ox=−5.225 ’ )

  • 8

    89 Plot ( ’ no i s e2 ’ , ’ grey t i t l e=Noise c l i p =2 ’ )90

    91 Result ( ’ radon−cut ’ , ’ radon radon−cut no i s e2 ’ , ’ SideBySideAniso ’ )92

    93 Flow ( ’ s i g n a l 2 ’ , ’ shot no i s e2 ’ , ’ add s c a l e =1,−1 ${SOURCES[ 1 ] } ’ )94 Plot ( ’ s i g n a l 2 ’ , ’ grey t i t l e=S igna l c l i p =2 ’ )95

    96 Result ( ’ s i g n a l 2 ’ , ’ shot s i g n a l 2 no i s e2 ’ , ’ SideBySideAniso ’ )97

    98 End ( )

    PARABOLIC RADON TRANSFORM

    In this part of the assignment, we will process the Viking Graben data to attenuate multiplereflections using the parabolic Radon transform.

    1. Change directory to hw5/pradon.

    2. Run

    scons -c

    to remove (clean) previously generated files.

    3. We start by picking from the previous processing steps: applying deconvolution andsurface-consistent amplitude corrections to prepare data for further processing. To gothrough these steps and to display the resultant CMP gathers, run

    scons cmps.view

    You can also improve the results using your work from Assignment 4.

    4. We will select one CMP gather to test our multiple-attenuation strategy. Figure 4shows the selected CMP gather and the result of velocity analysis by semblance scan-ning. To reproduce it on your screen, run

    scons vscan1.view

    As evident from the semblance scan, the gather is heavily contaminated by multiples,including water-layer multiples and surface-related peglegs. For further processing, wewill attempt to pick the primary velocity trend, using muting and automatic picking.

    5. Applying the normal moveout (NMO) with the picked primary trend makes primaryreflections nearly flat and multiple reflections curved (parabolic). Now the data areready for transformation by the parabolic Radon transform. The results are shown inFigure 5. To reproduce it on your screen, run

    scons parab.view

  • 9

    Figure 4: Initial velocity analysis. From left to right: selected CMP gather, gatherafter muting first arrivals, semblance scan with the picked primary velocity trend.

    Figure 5: Applying the parabolic Radon transform. From left to right: NMO using thepicked velocity trend, parabolic Radon transform, data reconstructed by the inversetransform.

    from rsf.proj import *

    # Download Viking Graben dataFetch('seismic.segy','viking')#Fetch('seismic.segy','VikingGrabbenLine12',# top='/home/p1/seismic_datasets/SeismicProcessingClass',# server='local')

    # Convert from SEGY to RSFFlow('viking tviking viking.asc viking.bin','seismic.segy', ''' segyread tfile=${TARGETS[1]} hfile=${TARGETS[2]} bfile=${TARGETS[3]} ''')

    # Far-field waveletFetch('FarField.dat','Mobil_Avo_Viking_Graben_Line_12', top='open.source.geoscience/open_data', server='http://s3.amazonaws.com')

    # Convert from ASCII to RSFFlow('wavelet','FarField.dat', ''' echo in=$SOURCE data_format=ascii_float n1=500 o1=0 d1=0.0008 label1=Time unit1=s n2=1 | dd form=native ''')

    # Subsample to data samplingFlow('wavelet4','wavelet','window j1=5 | pad n1=1500')

    prog = Program('convolve.c')convolve = str(prog[0])

    # Estimate PEF by iterative least-squares inversionFlow('filter0',None,'spike n1=100 k1=1')Flow('filter',['wavelet4',convolve,'filter0'], ''' conjgrad ./${SOURCES[1]} nf=100 data=${SOURCES[0]} niter=100 mod=${SOURCES[2]} ''')

    # Wavelet deconvolutionFlow('wdecon',['filter','wavelet4',convolve], ''' ./${SOURCES[2]} data=${SOURCES[1]} adj=n | add ${SOURCES[1]} scale=-1,1 | window n1=100 ''')

    # Process all tracesFlow('decon',['filter','viking',convolve], ''' ./${SOURCES[2]} data=${SOURCES[1]} adj=n | add ${SOURCES[1]} scale=-1,1 ''')

    # Average trace amplitudeFlow('arms','decon', 'mul $SOURCE | stack axis=1 | math output="log(input)" ')

    # shot/offset indeces: fldr and tracfFlow('index','tviking','window n1=2 f1=2 | transp')

    Flow('fldr tracf scarms','arms index', ''' sc index=${SOURCES[1]} out2=${TARGETS[1]} pred=${TARGETS[2]} niter=10 ''')

    # Apply to all traces

    Flow('ampl','scarms', ''' math output="exp(-input/2)" | spray axis=1 n=1500 d=0.004 o=0 ''')Flow('adecon','decon ampl','mul ${SOURCES[1]}')

    # Convert to CDP gathers, time-power gain Flow('cmps','adecon', ''' intbin xk=cdpt yk=cdp | window max1=4 | pow pow1=2 ''')

    Result('cmps', ''' byte gainpanel=all | transp plane=23 memsize=5000 | grey3 frame1=750 frame2=1000 frame3=20 point1=0.8 point2=0.8 title="CMP Gathers" label2="CMP Number" ''') # Extract offsetsFlow('offsets mask','tviking', ''' headermath output=offset | intbin head=$SOURCE xk=cdpt yk=cdp mask=${TARGETS[1]} | dd type=float | scale dscale=0.001 ''')

    # Extract one CMP gather########################

    Flow('mask1','mask','window n3=1 f3=1200 squeeze=n')Flow('cmp','cmps mask1', 'window n3=1 f3=1200 | headerwindow mask=${SOURCES[1]}')Plot('cmp','grey title="CMP gather" clip=8.66')

    Flow('offset','offsets mask1', ''' window n3=1 f3=1200 squeeze=n | headerwindow mask=${SOURCES[1]} ''')

    # Mute Flow('mute','cmp', ''' reverse which=2 | put label2=Offset unit2=km o2=0.287 d2=0.05 | mutter half=n v0=1.2 ''')Plot('mute','grey title="Mute first arrival" clip=8.66')

    # Velocity scan

    Flow('vscan1','mute', ''' vscan semblance=y half=n v0=1.2 nv=131 dv=0.02 ''')Plot('vscan1', 'grey color=j allpos=y title="Semblance scan" unit2=km/s')

    # Automatic pick

    Flow('vpick1','vscan1', ''' mutter inner=y x0=1.4 half=n v0=0.45 t0=0.5 | pick rect1=50 vel0=1.5 ''')Plot('vpick1', ''' graph yreverse=y transp=y plotcol=7 plotfat=7 pad=n min2=1.2 max2=3.8 wantaxis=n wanttitle=n ''')

    Plot('vscan2','vscan1 vpick1','Overlay')

    Result('vscan1','cmp mute vscan2','SideBySideAniso')

    Flow('nmo','mute vpick1','nmo half=n velocity=${SOURCES[1]}')Plot('nmo','grey title="NMO with primary velocity" ')

    # Parabolic Radon transform

    Flow('radon','nmo', 'radon adj=y spk=n parab=y p0=-0.1 dp=0.002 np=151')Plot('radon', ''' grey title="Parabolic Radon transform" label2=Curvature unit2="s/km\^2\_" ''')

    Flow('inv','radon','radon adj=n parab=y nx=60 dx=0.05 ox=0.287')Plot('inv', 'grey title="Inverse parabolic Radon transform" clip=8.66')

    Result('parab','nmo radon inv','SideBySideAniso')

    qmin=0.01 # minimum curvature for noisetmin=0.75 # minimum time for noise

    Flow('cut','radon','cut min2=%g min1=%g' % (qmin,tmin))Plot('cut', ''' grey title="Radon transform cut" label2=Curvature unit2="s/km\^2\_" ''')

    Flow('signal','cut','radon adj=n parab=y nx=60 dx=0.05 ox=0.287')Plot('signal','grey title="Radon transform signal" ')

    Result('cut','radon cut signal','SideBySideAniso')

    # Apply inverse NMO

    Flow('primary','signal vpick1', 'inmo half=n velocity=${SOURCES[1]}')Plot('primary','grey title="Demultiple" clip=8.66')

    Flow('multiples','mute primary','add scale=1,-1 ${SOURCES[1]}')Plot('multiples','grey title="Multiples" clip=8.66')

    Result('primary','mute primary multiples','SideBySideAniso')

    # Velocity scan

    Flow('pvscan1','primary', ''' vscan semblance=y half=n v0=1.2 nv=131 dv=0.02 ''')Plot('pvscan1', 'grey color=j allpos=y title="Primary semblance scan" ')

    Flow('mvscan1','multiples', ''' vscan semblance=y half=n v0=1.2 nv=131 dv=0.02 ''')Plot('mvscan1', 'grey color=j allpos=y title="Multiples semblance scan" ')

    Result('pvscan1','vscan1 pvscan1 mvscan1','SideBySideAniso')

    End()

    from rsf.proj import *

    # Download Viking Graben dataFetch('seismic.segy','viking')#Fetch('seismic.segy','VikingGrabbenLine12',# top='/home/p1/seismic_datasets/SeismicProcessingClass',# server='local')

    # Convert from SEGY to RSFFlow('viking tviking viking.asc viking.bin','seismic.segy', ''' segyread tfile=${TARGETS[1]} hfile=${TARGETS[2]} bfile=${TARGETS[3]} ''')

    # Far-field waveletFetch('FarField.dat','Mobil_Avo_Viking_Graben_Line_12', top='open.source.geoscience/open_data', server='http://s3.amazonaws.com')

    # Convert from ASCII to RSFFlow('wavelet','FarField.dat', ''' echo in=$SOURCE data_format=ascii_float n1=500 o1=0 d1=0.0008 label1=Time unit1=s n2=1 | dd form=native ''')

    # Subsample to data samplingFlow('wavelet4','wavelet','window j1=5 | pad n1=1500')

    prog = Program('convolve.c')convolve = str(prog[0])

    # Estimate PEF by iterative least-squares inversionFlow('filter0',None,'spike n1=100 k1=1')Flow('filter',['wavelet4',convolve,'filter0'], ''' conjgrad ./${SOURCES[1]} nf=100 data=${SOURCES[0]} niter=100 mod=${SOURCES[2]} ''')

    # Wavelet deconvolutionFlow('wdecon',['filter','wavelet4',convolve], ''' ./${SOURCES[2]} data=${SOURCES[1]} adj=n | add ${SOURCES[1]} scale=-1,1 | window n1=100 ''')

    # Process all tracesFlow('decon',['filter','viking',convolve], ''' ./${SOURCES[2]} data=${SOURCES[1]} adj=n | add ${SOURCES[1]} scale=-1,1 ''')

    # Average trace amplitudeFlow('arms','decon', 'mul $SOURCE | stack axis=1 | math output="log(input)" ')

    # shot/offset indeces: fldr and tracfFlow('index','tviking','window n1=2 f1=2 | transp')

    Flow('fldr tracf scarms','arms index', ''' sc index=${SOURCES[1]} out2=${TARGETS[1]} pred=${TARGETS[2]} niter=10 ''')

    # Apply to all traces

    Flow('ampl','scarms', ''' math output="exp(-input/2)" | spray axis=1 n=1500 d=0.004 o=0 ''')Flow('adecon','decon ampl','mul ${SOURCES[1]}')

    # Convert to CDP gathers, time-power gain Flow('cmps','adecon', ''' intbin xk=cdpt yk=cdp | window max1=4 | pow pow1=2 ''')

    Result('cmps', ''' byte gainpanel=all | transp plane=23 memsize=5000 | grey3 frame1=750 frame2=1000 frame3=20 point1=0.8 point2=0.8 title="CMP Gathers" label2="CMP Number" ''') # Extract offsetsFlow('offsets mask','tviking', ''' headermath output=offset | intbin head=$SOURCE xk=cdpt yk=cdp mask=${TARGETS[1]} | dd type=float | scale dscale=0.001 ''')

    # Extract one CMP gather########################

    Flow('mask1','mask','window n3=1 f3=1200 squeeze=n')Flow('cmp','cmps mask1', 'window n3=1 f3=1200 | headerwindow mask=${SOURCES[1]}')Plot('cmp','grey title="CMP gather" clip=8.66')

    Flow('offset','offsets mask1', ''' window n3=1 f3=1200 squeeze=n | headerwindow mask=${SOURCES[1]} ''')

    # Mute Flow('mute','cmp', ''' reverse which=2 | put label2=Offset unit2=km o2=0.287 d2=0.05 | mutter half=n v0=1.2 ''')Plot('mute','grey title="Mute first arrival" clip=8.66')

    # Velocity scan

    Flow('vscan1','mute', ''' vscan semblance=y half=n v0=1.2 nv=131 dv=0.02 ''')Plot('vscan1', 'grey color=j allpos=y title="Semblance scan" unit2=km/s')

    # Automatic pick

    Flow('vpick1','vscan1', ''' mutter inner=y x0=1.4 half=n v0=0.45 t0=0.5 | pick rect1=50 vel0=1.5 ''')Plot('vpick1', ''' graph yreverse=y transp=y plotcol=7 plotfat=7 pad=n min2=1.2 max2=3.8 wantaxis=n wanttitle=n ''')

    Plot('vscan2','vscan1 vpick1','Overlay')

    Result('vscan1','cmp mute vscan2','SideBySideAniso')

    Flow('nmo','mute vpick1','nmo half=n velocity=${SOURCES[1]}')Plot('nmo','grey title="NMO with primary velocity" ')

    # Parabolic Radon transform

    Flow('radon','nmo', 'radon adj=y spk=n parab=y p0=-0.1 dp=0.002 np=151')Plot('radon', ''' grey title="Parabolic Radon transform" label2=Curvature unit2="s/km\^2\_" ''')

    Flow('inv','radon','radon adj=n parab=y nx=60 dx=0.05 ox=0.287')Plot('inv', 'grey title="Inverse parabolic Radon transform" clip=8.66')

    Result('parab','nmo radon inv','SideBySideAniso')

    qmin=0.01 # minimum curvature for noisetmin=0.75 # minimum time for noise

    Flow('cut','radon','cut min2=%g min1=%g' % (qmin,tmin))Plot('cut', ''' grey title="Radon transform cut" label2=Curvature unit2="s/km\^2\_" ''')

    Flow('signal','cut','radon adj=n parab=y nx=60 dx=0.05 ox=0.287')Plot('signal','grey title="Radon transform signal" ')

    Result('cut','radon cut signal','SideBySideAniso')

    # Apply inverse NMO

    Flow('primary','signal vpick1', 'inmo half=n velocity=${SOURCES[1]}')Plot('primary','grey title="Demultiple" clip=8.66')

    Flow('multiples','mute primary','add scale=1,-1 ${SOURCES[1]}')Plot('multiples','grey title="Multiples" clip=8.66')

    Result('primary','mute primary multiples','SideBySideAniso')

    # Velocity scan

    Flow('pvscan1','primary', ''' vscan semblance=y half=n v0=1.2 nv=131 dv=0.02 ''')Plot('pvscan1', 'grey color=j allpos=y title="Primary semblance scan" ')

    Flow('mvscan1','multiples', ''' vscan semblance=y half=n v0=1.2 nv=131 dv=0.02 ''')Plot('mvscan1', 'grey color=j allpos=y title="Multiples semblance scan" ')

    Result('pvscan1','vscan1 pvscan1 mvscan1','SideBySideAniso')

    End()

  • 10

    Figure 6: Isolating signal in the parabolic Radon domain. From left to right: parabolicRadon transform, isolated nearly-flat events, signal reconstructed by the inverse trans-form.

    As with the linear Radon, the transform is implemented in the temporal Fourierdomain and makes use of the Toeplitz structure to accelerate least-squares inversion.

    6. Next, we isolate primary events by making a cut in the parabolic Radon domain toseparate events with small curvature (Figure 6). To display the result on your screen,run

    scons cut.view

    7. To go back to the CMP domain requires applying the inverse NMO. The final resultof separating primaries from multiples is shown in Figure 7a. We can verify theseparation by running the semblance scan on the separated events (Figure 7b.) Toreproduce these figures on your screen, run

    scons primary.view pvscan1.view

    8. Your task, as before, is to try improving the separation result. There are severalpossible steps to modify:

    • picking the primary trend• parameters of the parabolic Radon transform• separating primary events in the parabolic Radon domain

    9. (EXTRA CREDIT) For an extra credit, apply the procedure to all CMP gathersin the Viking Graben data and generate an improved stacked section.

    from rsf.proj import *

    # Download Viking Graben dataFetch('seismic.segy','viking')#Fetch('seismic.segy','VikingGrabbenLine12',# top='/home/p1/seismic_datasets/SeismicProcessingClass',# server='local')

    # Convert from SEGY to RSFFlow('viking tviking viking.asc viking.bin','seismic.segy', ''' segyread tfile=${TARGETS[1]} hfile=${TARGETS[2]} bfile=${TARGETS[3]} ''')

    # Far-field waveletFetch('FarField.dat','Mobil_Avo_Viking_Graben_Line_12', top='open.source.geoscience/open_data', server='http://s3.amazonaws.com')

    # Convert from ASCII to RSFFlow('wavelet','FarField.dat', ''' echo in=$SOURCE data_format=ascii_float n1=500 o1=0 d1=0.0008 label1=Time unit1=s n2=1 | dd form=native ''')

    # Subsample to data samplingFlow('wavelet4','wavelet','window j1=5 | pad n1=1500')

    prog = Program('convolve.c')convolve = str(prog[0])

    # Estimate PEF by iterative least-squares inversionFlow('filter0',None,'spike n1=100 k1=1')Flow('filter',['wavelet4',convolve,'filter0'], ''' conjgrad ./${SOURCES[1]} nf=100 data=${SOURCES[0]} niter=100 mod=${SOURCES[2]} ''')

    # Wavelet deconvolutionFlow('wdecon',['filter','wavelet4',convolve], ''' ./${SOURCES[2]} data=${SOURCES[1]} adj=n | add ${SOURCES[1]} scale=-1,1 | window n1=100 ''')

    # Process all tracesFlow('decon',['filter','viking',convolve], ''' ./${SOURCES[2]} data=${SOURCES[1]} adj=n | add ${SOURCES[1]} scale=-1,1 ''')

    # Average trace amplitudeFlow('arms','decon', 'mul $SOURCE | stack axis=1 | math output="log(input)" ')

    # shot/offset indeces: fldr and tracfFlow('index','tviking','window n1=2 f1=2 | transp')

    Flow('fldr tracf scarms','arms index', ''' sc index=${SOURCES[1]} out2=${TARGETS[1]} pred=${TARGETS[2]} niter=10 ''')

    # Apply to all traces

    Flow('ampl','scarms', ''' math output="exp(-input/2)" | spray axis=1 n=1500 d=0.004 o=0 ''')Flow('adecon','decon ampl','mul ${SOURCES[1]}')

    # Convert to CDP gathers, time-power gain Flow('cmps','adecon', ''' intbin xk=cdpt yk=cdp | window max1=4 | pow pow1=2 ''')

    Result('cmps', ''' byte gainpanel=all | transp plane=23 memsize=5000 | grey3 frame1=750 frame2=1000 frame3=20 point1=0.8 point2=0.8 title="CMP Gathers" label2="CMP Number" ''') # Extract offsetsFlow('offsets mask','tviking', ''' headermath output=offset | intbin head=$SOURCE xk=cdpt yk=cdp mask=${TARGETS[1]} | dd type=float | scale dscale=0.001 ''')

    # Extract one CMP gather########################

    Flow('mask1','mask','window n3=1 f3=1200 squeeze=n')Flow('cmp','cmps mask1', 'window n3=1 f3=1200 | headerwindow mask=${SOURCES[1]}')Plot('cmp','grey title="CMP gather" clip=8.66')

    Flow('offset','offsets mask1', ''' window n3=1 f3=1200 squeeze=n | headerwindow mask=${SOURCES[1]} ''')

    # Mute Flow('mute','cmp', ''' reverse which=2 | put label2=Offset unit2=km o2=0.287 d2=0.05 | mutter half=n v0=1.2 ''')Plot('mute','grey title="Mute first arrival" clip=8.66')

    # Velocity scan

    Flow('vscan1','mute', ''' vscan semblance=y half=n v0=1.2 nv=131 dv=0.02 ''')Plot('vscan1', 'grey color=j allpos=y title="Semblance scan" unit2=km/s')

    # Automatic pick

    Flow('vpick1','vscan1', ''' mutter inner=y x0=1.4 half=n v0=0.45 t0=0.5 | pick rect1=50 vel0=1.5 ''')Plot('vpick1', ''' graph yreverse=y transp=y plotcol=7 plotfat=7 pad=n min2=1.2 max2=3.8 wantaxis=n wanttitle=n ''')

    Plot('vscan2','vscan1 vpick1','Overlay')

    Result('vscan1','cmp mute vscan2','SideBySideAniso')

    Flow('nmo','mute vpick1','nmo half=n velocity=${SOURCES[1]}')Plot('nmo','grey title="NMO with primary velocity" ')

    # Parabolic Radon transform

    Flow('radon','nmo', 'radon adj=y spk=n parab=y p0=-0.1 dp=0.002 np=151')Plot('radon', ''' grey title="Parabolic Radon transform" label2=Curvature unit2="s/km\^2\_" ''')

    Flow('inv','radon','radon adj=n parab=y nx=60 dx=0.05 ox=0.287')Plot('inv', 'grey title="Inverse parabolic Radon transform" clip=8.66')

    Result('parab','nmo radon inv','SideBySideAniso')

    qmin=0.01 # minimum curvature for noisetmin=0.75 # minimum time for noise

    Flow('cut','radon','cut min2=%g min1=%g' % (qmin,tmin))Plot('cut', ''' grey title="Radon transform cut" label2=Curvature unit2="s/km\^2\_" ''')

    Flow('signal','cut','radon adj=n parab=y nx=60 dx=0.05 ox=0.287')Plot('signal','grey title="Radon transform signal" ')

    Result('cut','radon cut signal','SideBySideAniso')

    # Apply inverse NMO

    Flow('primary','signal vpick1', 'inmo half=n velocity=${SOURCES[1]}')Plot('primary','grey title="Demultiple" clip=8.66')

    Flow('multiples','mute primary','add scale=1,-1 ${SOURCES[1]}')Plot('multiples','grey title="Multiples" clip=8.66')

    Result('primary','mute primary multiples','SideBySideAniso')

    # Velocity scan

    Flow('pvscan1','primary', ''' vscan semblance=y half=n v0=1.2 nv=131 dv=0.02 ''')Plot('pvscan1', 'grey color=j allpos=y title="Primary semblance scan" ')

    Flow('mvscan1','multiples', ''' vscan semblance=y half=n v0=1.2 nv=131 dv=0.02 ''')Plot('mvscan1', 'grey color=j allpos=y title="Multiples semblance scan" ')

    Result('pvscan1','vscan1 pvscan1 mvscan1','SideBySideAniso')

    End()

  • 11

    (a)

    (b)

    Figure 7: Separating signal (primary reflections) and noise (multiple reflections). (a)From left to right: input CMP gather, estimated primaries, estimated multiples. (b)Velocity analysis using semblance scan. From left to right: using all data, usingestimated primaries, using estimated multiples.

    from rsf.proj import *

    # Download Viking Graben dataFetch('seismic.segy','viking')#Fetch('seismic.segy','VikingGrabbenLine12',# top='/home/p1/seismic_datasets/SeismicProcessingClass',# server='local')

    # Convert from SEGY to RSFFlow('viking tviking viking.asc viking.bin','seismic.segy', ''' segyread tfile=${TARGETS[1]} hfile=${TARGETS[2]} bfile=${TARGETS[3]} ''')

    # Far-field waveletFetch('FarField.dat','Mobil_Avo_Viking_Graben_Line_12', top='open.source.geoscience/open_data', server='http://s3.amazonaws.com')

    # Convert from ASCII to RSFFlow('wavelet','FarField.dat', ''' echo in=$SOURCE data_format=ascii_float n1=500 o1=0 d1=0.0008 label1=Time unit1=s n2=1 | dd form=native ''')

    # Subsample to data samplingFlow('wavelet4','wavelet','window j1=5 | pad n1=1500')

    prog = Program('convolve.c')convolve = str(prog[0])

    # Estimate PEF by iterative least-squares inversionFlow('filter0',None,'spike n1=100 k1=1')Flow('filter',['wavelet4',convolve,'filter0'], ''' conjgrad ./${SOURCES[1]} nf=100 data=${SOURCES[0]} niter=100 mod=${SOURCES[2]} ''')

    # Wavelet deconvolutionFlow('wdecon',['filter','wavelet4',convolve], ''' ./${SOURCES[2]} data=${SOURCES[1]} adj=n | add ${SOURCES[1]} scale=-1,1 | window n1=100 ''')

    # Process all tracesFlow('decon',['filter','viking',convolve], ''' ./${SOURCES[2]} data=${SOURCES[1]} adj=n | add ${SOURCES[1]} scale=-1,1 ''')

    # Average trace amplitudeFlow('arms','decon', 'mul $SOURCE | stack axis=1 | math output="log(input)" ')

    # shot/offset indeces: fldr and tracfFlow('index','tviking','window n1=2 f1=2 | transp')

    Flow('fldr tracf scarms','arms index', ''' sc index=${SOURCES[1]} out2=${TARGETS[1]} pred=${TARGETS[2]} niter=10 ''')

    # Apply to all traces

    Flow('ampl','scarms', ''' math output="exp(-input/2)" | spray axis=1 n=1500 d=0.004 o=0 ''')Flow('adecon','decon ampl','mul ${SOURCES[1]}')

    # Convert to CDP gathers, time-power gain Flow('cmps','adecon', ''' intbin xk=cdpt yk=cdp | window max1=4 | pow pow1=2 ''')

    Result('cmps', ''' byte gainpanel=all | transp plane=23 memsize=5000 | grey3 frame1=750 frame2=1000 frame3=20 point1=0.8 point2=0.8 title="CMP Gathers" label2="CMP Number" ''') # Extract offsetsFlow('offsets mask','tviking', ''' headermath output=offset | intbin head=$SOURCE xk=cdpt yk=cdp mask=${TARGETS[1]} | dd type=float | scale dscale=0.001 ''')

    # Extract one CMP gather########################

    Flow('mask1','mask','window n3=1 f3=1200 squeeze=n')Flow('cmp','cmps mask1', 'window n3=1 f3=1200 | headerwindow mask=${SOURCES[1]}')Plot('cmp','grey title="CMP gather" clip=8.66')

    Flow('offset','offsets mask1', ''' window n3=1 f3=1200 squeeze=n | headerwindow mask=${SOURCES[1]} ''')

    # Mute Flow('mute','cmp', ''' reverse which=2 | put label2=Offset unit2=km o2=0.287 d2=0.05 | mutter half=n v0=1.2 ''')Plot('mute','grey title="Mute first arrival" clip=8.66')

    # Velocity scan

    Flow('vscan1','mute', ''' vscan semblance=y half=n v0=1.2 nv=131 dv=0.02 ''')Plot('vscan1', 'grey color=j allpos=y title="Semblance scan" unit2=km/s')

    # Automatic pick

    Flow('vpick1','vscan1', ''' mutter inner=y x0=1.4 half=n v0=0.45 t0=0.5 | pick rect1=50 vel0=1.5 ''')Plot('vpick1', ''' graph yreverse=y transp=y plotcol=7 plotfat=7 pad=n min2=1.2 max2=3.8 wantaxis=n wanttitle=n ''')

    Plot('vscan2','vscan1 vpick1','Overlay')

    Result('vscan1','cmp mute vscan2','SideBySideAniso')

    Flow('nmo','mute vpick1','nmo half=n velocity=${SOURCES[1]}')Plot('nmo','grey title="NMO with primary velocity" ')

    # Parabolic Radon transform

    Flow('radon','nmo', 'radon adj=y spk=n parab=y p0=-0.1 dp=0.002 np=151')Plot('radon', ''' grey title="Parabolic Radon transform" label2=Curvature unit2="s/km\^2\_" ''')

    Flow('inv','radon','radon adj=n parab=y nx=60 dx=0.05 ox=0.287')Plot('inv', 'grey title="Inverse parabolic Radon transform" clip=8.66')

    Result('parab','nmo radon inv','SideBySideAniso')

    qmin=0.01 # minimum curvature for noisetmin=0.75 # minimum time for noise

    Flow('cut','radon','cut min2=%g min1=%g' % (qmin,tmin))Plot('cut', ''' grey title="Radon transform cut" label2=Curvature unit2="s/km\^2\_" ''')

    Flow('signal','cut','radon adj=n parab=y nx=60 dx=0.05 ox=0.287')Plot('signal','grey title="Radon transform signal" ')

    Result('cut','radon cut signal','SideBySideAniso')

    # Apply inverse NMO

    Flow('primary','signal vpick1', 'inmo half=n velocity=${SOURCES[1]}')Plot('primary','grey title="Demultiple" clip=8.66')

    Flow('multiples','mute primary','add scale=1,-1 ${SOURCES[1]}')Plot('multiples','grey title="Multiples" clip=8.66')

    Result('primary','mute primary multiples','SideBySideAniso')

    # Velocity scan

    Flow('pvscan1','primary', ''' vscan semblance=y half=n v0=1.2 nv=131 dv=0.02 ''')Plot('pvscan1', 'grey color=j allpos=y title="Primary semblance scan" ')

    Flow('mvscan1','multiples', ''' vscan semblance=y half=n v0=1.2 nv=131 dv=0.02 ''')Plot('mvscan1', 'grey color=j allpos=y title="Multiples semblance scan" ')

    Result('pvscan1','vscan1 pvscan1 mvscan1','SideBySideAniso')

    End()

  • 12

    pradon/SConstruct

    1 from r s f . p ro j import ∗2

    3 # Download Viking Graben data4 Fetch ( ’ s e i s m i c . segy ’ , ’ v i k ing ’ )5 #Fetch ( ’ s e i smic . segy ’ , ’ VikingGrabbenLine12 ’ ,6 # top=’/home/p1/ s e i sm i c d a t a s e t s / Se i smicProcess ingClass ’ ,7 # serve r=’ l o c a l ’ )8

    9 # Convert from SEGY to RSF10 Flow ( ’ v ik ing t v i k i n g v ik ing . asc v ik ing . bin ’ , ’ s e i s m i c . segy ’ ,11 ’ ’ ’12 segyread t f i l e=${TARGETS[ 1 ] }13 h f i l e=${TARGETS[ 2 ] } b f i l e=${TARGETS[ 3 ] }14 ’ ’ ’ )15

    16 # Far− f i e l d wave l e t17 Fetch ( ’ FarFie ld . dat ’ , ’ Mobi l Avo Viking Graben Line 12 ’ ,18 top=’ open . source . g e o s c i e n c e / open data ’ ,19 s e r v e r=’ http :// s3 . amazonaws . com ’ )20

    21 # Convert from ASCII to RSF22 Flow ( ’ wavelet ’ , ’ FarFie ld . dat ’ ,23 ’ ’ ’24 echo in=$SOURCE data format=a s c i i f l o a t n1=500 o1=0 d1=0.000825 l a b e l 1=Time unit1=s n2=1 | dd form=nat ive26 ’ ’ ’ )27

    28 # Subsample to data sampling29 Flow ( ’ wavelet4 ’ , ’ wavelet ’ , ’ window j1=5 | pad n1=1500 ’ )30

    31 prog = Program ( ’ convolve . c ’ )32 convolve = s t r ( prog [ 0 ] )33

    34 # Estimate PEF by i t e r a t i v e l e a s t−squares i n v e r s i on35 Flow ( ’ f i l t e r 0 ’ ,None , ’ sp ike n1=100 k1=1 ’ )36 Flow ( ’ f i l t e r ’ , [ ’ wavelet4 ’ , convolve , ’ f i l t e r 0 ’ ] ,37 ’ ’ ’38 conjgrad . / ${SOURCES[ 1 ] } nf=100 data=${SOURCES[ 0 ] }39 n i t e r =100 mod=${SOURCES[ 2 ] }40 ’ ’ ’ )41

    42 # Wavelet deconvo lu t i on43 Flow ( ’ wdecon ’ , [ ’ f i l t e r ’ , ’ wavelet4 ’ , convolve ] ,44 ’ ’ ’45 . / ${SOURCES[ 2 ] } data=${SOURCES[ 1 ] } adj=n |46 add ${SOURCES[ 1 ] } s c a l e =−1,1 | window n1=100

  • 13

    47 ’ ’ ’ )48

    49 # Process a l l t r a c e s50 Flow ( ’ decon ’ , [ ’ f i l t e r ’ , ’ v i k ing ’ , convolve ] ,51 ’ ’ ’52 . / ${SOURCES[ 2 ] } data=${SOURCES[ 1 ] } adj=n |53 add ${SOURCES[ 1 ] } s c a l e =−1,154 ’ ’ ’ )55

    56 # Average t race ampl i tude57 Flow ( ’ arms ’ , ’ decon ’ ,58 ’ mul $SOURCE | s tack a x i s=1 | math output=”log ( input )” ’ )59

    60 # shot / o f f s e t indeces : f l d r and t r a c f61 Flow ( ’ index ’ , ’ t v i k i n g ’ , ’ window n1=2 f1=2 | transp ’ )62

    63 Flow ( ’ f l d r t r a c f scarms ’ , ’ arms index ’ ,64 ’ ’ ’65 sc index=${SOURCES[ 1 ] } out2=${TARGETS[ 1 ] } pred=${TARGETS[ 2 ] }66 n i t e r =1067 ’ ’ ’ )68

    69 # Apply to a l l t r a c e s70

    71 Flow ( ’ ampl ’ , ’ scarms ’ ,72 ’ ’ ’73 math output=”exp(− input /2)” |74 spray a x i s=1 n=1500 d=0.004 o=075 ’ ’ ’ )76 Flow ( ’ adecon ’ , ’ decon ampl ’ , ’ mul ${SOURCES[ 1 ] } ’ )77

    78 # Convert to CDP gathers , time−power gain79 Flow ( ’ cmps ’ , ’ adecon ’ ,80 ’ ’ ’81 i n t b i n xk=cdpt yk=cdp | window max1=4 |82 pow pow1=283 ’ ’ ’ )84

    85 Result ( ’ cmps ’ ,86 ’ ’ ’87 byte ga inpane l=a l l | transp plane=23 memsize=5000 |88 grey3 frame1=750 frame2=1000 frame3=2089 point1 =0.8 point2 =0.890 t i t l e =”CMP Gathers ” l a b e l 2=”CMP Number”91 ’ ’ ’ )92

    93 # Extrac t o f f s e t s94 Flow ( ’ o f f s e t s mask ’ , ’ t v i k i n g ’ ,

  • 14

    95 ’ ’ ’96 headermath output=o f f s e t |97 i n t b i n head=$SOURCE xk=cdpt yk=cdp mask=${TARGETS[ 1 ] } |98 dd type=f l o a t |99 s c a l e d s c a l e =0.001

    100 ’ ’ ’ )101

    102 # Extrac t one CMP gather103 ########################104

    105 Flow ( ’ mask1 ’ , ’mask ’ , ’ window n3=1 f3 =1200 squeeze=n ’ )106 Flow ( ’cmp ’ , ’ cmps mask1 ’ ,107 ’ window n3=1 f3 =1200 | headerwindow mask=${SOURCES[ 1 ] } ’ )108 Plot ( ’cmp ’ , ’ grey t i t l e =”CMP gather ” c l i p =8.66 ’ )109

    110 Flow ( ’ o f f s e t ’ , ’ o f f s e t s mask1 ’ ,111 ’ ’ ’112 window n3=1 f3 =1200 squeeze=n |113 headerwindow mask=${SOURCES[ 1 ] }114 ’ ’ ’ )115

    116 # Mute117 Flow ( ’ mute ’ , ’cmp ’ ,118 ’ ’ ’119 r e v e r s e which=2 | put l a b e l 2=O f f s e t un i t2=km o2 =0.287 d2=0.05 |120 mutter h a l f=n v0=1.2121 ’ ’ ’ )122 Plot ( ’ mute ’ , ’ grey t i t l e =”Mute f i r s t a r r i v a l ” c l i p =8.66 ’ )123

    124 # Ve loc i t y scan125

    126 Flow ( ’ vscan1 ’ , ’ mute ’ ,127 ’ ’ ’128 vscan semblance=y h a l f=n v0=1.2 nv=131 dv=0.02129 ’ ’ ’ )130 Plot ( ’ vscan1 ’ ,131 ’ grey c o l o r=j a l l p o s=y t i t l e =”Semblance scan ” uni t2=km/ s ’ )132

    133 # Automatic p i c k134

    135 Flow ( ’ vpick1 ’ , ’ vscan1 ’ ,136 ’ ’ ’137 mutter inne r=y x0=1.4 h a l f=n v0=0.45 t0 =0.5 |138 pick r e c t 1 =50 ve l0 =1.5139 ’ ’ ’ )140 Plot ( ’ vpick1 ’ ,141 ’ ’ ’142 graph yr eve r s e=y transp=y p l o t c o l=7 p l o t f a t=7

  • 15

    143 pad=n min2=1.2 max2=3.8 wantaxis=n w a n t t i t l e=n144 ’ ’ ’ )145

    146 Plot ( ’ vscan2 ’ , ’ vscan1 vpick1 ’ , ’ Overlay ’ )147

    148 Result ( ’ vscan1 ’ , ’cmp mute vscan2 ’ , ’ SideBySideAniso ’ )149

    150 Flow ( ’nmo ’ , ’ mute vpick1 ’ , ’nmo h a l f=n v e l o c i t y=${SOURCES[ 1 ] } ’ )151 Plot ( ’nmo ’ , ’ grey t i t l e =”NMO with primary v e l o c i t y ” ’ )152

    153 # Parabo l i c Radon transform154

    155 Flow ( ’ radon ’ , ’nmo ’ ,156 ’ radon adj=y spk=n parab=y p0=−0.1 dp=0.002 np=151 ’ )157 Plot ( ’ radon ’ ,158 ’ ’ ’159 grey t i t l e =”Parabo l i c Radon trans form ”160 l a b e l 2=Curvature un i t2=”s /km\ˆ2\ ”161 ’ ’ ’ )162

    163 Flow ( ’ inv ’ , ’ radon ’ , ’ radon adj=n parab=y nx=60 dx=0.05 ox=0.287 ’ )164 Plot ( ’ inv ’ ,165 ’ grey t i t l e =”Inve r s e p a r a b o l i c Radon trans form ” c l i p =8.66 ’ )166

    167 Result ( ’ parab ’ , ’nmo radon inv ’ , ’ SideBySideAniso ’ )168

    169 qmin=0.01 # minimum curva ture f o r no i se170 tmin =0.75 # minimum time f o r no i se171

    172 Flow ( ’ cut ’ , ’ radon ’ , ’ cut min2=%g min1=%g ’ % ( qmin , tmin ) )173 Plot ( ’ cut ’ ,174 ’ ’ ’175 grey t i t l e =”Radon trans form cut ”176 l a b e l 2=Curvature un i t2=”s /km\ˆ2\ ”177 ’ ’ ’ )178

    179 Flow ( ’ s i g n a l ’ , ’ cut ’ , ’ radon adj=n parab=y nx=60 dx=0.05 ox=0.287 ’ )180 Plot ( ’ s i g n a l ’ , ’ grey t i t l e =”Radon trans form s i g n a l ” ’ )181

    182 Result ( ’ cut ’ , ’ radon cut s i g n a l ’ , ’ SideBySideAniso ’ )183

    184 # Apply in v e r s e NMO185

    186 Flow ( ’ primary ’ , ’ s i g n a l vpick1 ’ ,187 ’ inmo h a l f=n v e l o c i t y=${SOURCES[ 1 ] } ’ )188 Plot ( ’ primary ’ , ’ grey t i t l e =”Demult iple ” c l i p =8.66 ’ )189

    190 Flow ( ’ m u l t i p l e s ’ , ’ mute primary ’ , ’ add s c a l e =1,−1 ${SOURCES[ 1 ] } ’ )

  • 16

    191 Plot ( ’ m u l t i p l e s ’ , ’ grey t i t l e =”Mul t ip l e s ” c l i p =8.66 ’ )192

    193 Result ( ’ primary ’ , ’ mute primary m u l t i p l e s ’ , ’ SideBySideAniso ’ )194

    195 # Ve loc i t y scan196

    197 Flow ( ’ pvscan1 ’ , ’ primary ’ ,198 ’ ’ ’199 vscan semblance=y h a l f=n v0=1.2 nv=131 dv=0.02200 ’ ’ ’ )201 Plot ( ’ pvscan1 ’ ,202 ’ grey c o l o r=j a l l p o s=y t i t l e =”Primary semblance scan ” ’ )203

    204 Flow ( ’ mvscan1 ’ , ’ m u l t i p l e s ’ ,205 ’ ’ ’206 vscan semblance=y h a l f=n v0=1.2 nv=131 dv=0.02207 ’ ’ ’ )208 Plot ( ’ mvscan1 ’ ,209 ’ grey c o l o r=j a l l p o s=y t i t l e =”Mul t ip l e s semblance scan ” ’ )210

    211 Result ( ’ pvscan1 ’ , ’ vscan1 pvscan1 mvscan1 ’ , ’ SideBySideAniso ’ )212

    213 End ( )

    HYPERBOLIC RADON TRANSFORM

    The parabolic Radon transform is a powerful tool but not perfectly suitable for separatinghyperbolic events. An alternative tool is the time-domain hyperbolic Radon transform (alsoknown as the velocity stack or the velocity transform). The idea of making the hyperbolicRadon transform invertible by iterative least-squares inversion was proposed by Thorsonand Claerbout (1985).

    1. Change directory to hw5/hradon.

    2. Run

    scons -c

    to remove (clean) previously generated files.

    3.

    4. We will use the same CMP gather as in the previous part. Figure 8 shows the se-lected gather, its hyperbolic Radon transform, and data reconstructed by the adjointtransform (filtered back projection). To display it on your screen, run

    scons adj.view

  • 17

    Figure 8: Applying the hyperbolic Radon transform. From left to right: selected CMPgather, its hyperbolic Radon transform, data reconstructed by the adjoint transform(filtered back projection).

    5. Use equation (1) to find the mapping of a straight line

    T (x) = t0 +x

    v0(4)

    in the hyperbolic Radon domain defined by

    θ(x; τ, p) =√τ2 + p2 x2 . (5)

    Answer:

    6. The program for implementing the hyperbolic Radon transform is hradon.c. Thisimplementation includes the half-derivative filter but not any other corrections. Totest if the adjoint operator is implemented correctly, you can run the dot-product test

    sfdottest ./hradon.exe np=101 dp=0.01 op=0 nx=60 dx=0.05 ox=0.287 \mod=rad.rsf dat=cmp.rsf

    The output should display a pair of numbers equal to six digits of accurate. You canrun the test multiple times.

    7. The adjoint operation does not reconstruct the data exactly. To achieve a betterreconstruction, we can run iterative least-squares inversion using the method of con-jugate gradients. The result is shown in Figure 9. To display it on your screen,run

    from rsf.proj import *

    # Download one CMP gather (with mute)Fetch('cmp.HH','viking')

    Flow('cmp','cmp.HH','dd form=native')Plot('cmp','grey title="CMP Gather" clip=8.66')

    prog = Program('hradon.c')hradon = str(prog[0])

    Flow('rad',['cmp',hradon], './${SOURCES[1]} adj=y np=101 dp=0.01 op=0')Plot('rad', ''' grey title="Hyperbolic Radon Transform" label2=Slowness unit2=s/km ''')

    Flow('adj',['rad',hradon], './${SOURCES[1]} adj=n nx=60 dx=0.05 ox=0.287')Plot('adj','grey title="Adjoint Hyperbolic Radon Transform" ')

    Result('adj','cmp rad adj','SideBySideAniso')

    Flow('inv',['cmp',hradon,'rad'], ''' conjgrad ./${SOURCES[1]} mod=${SOURCES[2]} np=101 dp=0.01 op=0 nx=60 dx=0.05 ox=0.287 niter=10 ''')Plot('inv', ''' grey title="Hyperbolic Radon Transform" label2=Slowness unit2=s/km ''')

    Flow('cmp2',['inv',hradon], './${SOURCES[1]} adj=n nx=60 dx=0.05 ox=0.287')Plot('cmp2', 'grey title="Inverse Hyperbolic Radon Transform" clip=8.66')

    Result('inv','cmp inv cmp2','SideBySideAniso')

    # Velocity scan

    Flow('vscan','cmp', 'vscan semblance=y half=n v0=1.2 nv=131 dv=0.02')Plot('vscan', 'grey color=j allpos=y title="Semblance Scan" unit2=km/s')

    # Automatic pick

    Flow('vpick','vscan', ''' mutter inner=y x0=1.4 half=n v0=0.45 t0=0.5 | pick rect1=50 vel0=1.5 ''')Plot('vpick', ''' graph yreverse=y transp=y plotcol=7 plotfat=7 pad=n min2=1.2 max2=3.8 wantaxis=n wanttitle=n ''')

    Plot('vscan2','vscan vpick','Overlay')

    # NMO

    Flow('nmo','cmp vpick','nmo half=n velocity=${SOURCES[1]}')Plot('nmo','grey title="NMO with Primary Velocity" clip=9.83')

    Result('vscan','cmp vscan2 nmo','SideBySideAniso')

    Flow('nmorad0',['cmp',hradon], './${SOURCES[1]} adj=y np=161 dp=0.005 op=0')Flow('nmorad',['nmo',hradon,'nmorad0'], ''' conjgrad ./${SOURCES[1]} mod=${SOURCES[2]} np=161 dp=0.005 op=0 nx=60 dx=0.05 ox=0.287 niter=10 ''')Plot('nmorad', ''' grey title="Hyperbolic Radon Transform" label2=Slowness unit2=s/km ''')

    Flow('nmo2',['nmorad',hradon], './${SOURCES[1]} adj=n nx=60 dx=0.05 ox=0.287')Plot('nmo2', 'grey title="Inverse Hyperbolic Radon Transform" clip=9.83')

    Result('nmorad','nmo nmorad nmo2','SideBySideAniso')

    Flow('cut','nmorad','cut min2=0.2')Plot('cut', ''' grey title="Hyperbolic Radon Transform" label2=Slowness unit2=s/km ''')

    Flow('signal',['cut',hradon], './${SOURCES[1]} adj=n nx=60 dx=0.05 ox=0.287')Plot('signal', 'grey title="Inverse Hyperbolic Radon Transform" clip=9.83')

    Result('nmocut','nmo cut signal','SideBySideAniso')

    # Inverse NMO

    Flow('inmo','signal vpick', 'inmo half=n velocity=${SOURCES[1]} | mutter half=n v0=1.2')Plot('inmo','grey title=Signal clip=8.66')

    Flow('pvscan','inmo', 'vscan semblance=y half=n v0=1.2 nv=131 dv=0.02')Plot('pvscan', 'grey color=j allpos=y title="Primary Semblance Scan" ')

    Flow('mult','cmp inmo','add scale=1,-1 ${SOURCES[1]}')Plot('mult','grey title=Noise clip=8.66')

    Flow('mvscan','mult', 'vscan semblance=y half=n v0=1.2 nv=131 dv=0.02')Plot('mvscan', 'grey color=j allpos=y title="Multiples Semblance Scan" ')

    Result('inmo','cmp inmo mult','SideBySideAniso')Result('pvscan','vscan pvscan mvscan','SideBySideAniso')

    End()

  • 18

    Figure 9: Applying the hyperbolic Radon transform. From left to right: selectedCMP gather, its hyperbolic Radon transform (using iterative least-squares inversion),data reconstructed by the inverse transform.

    scons inv.view

    8. (EXTRA CREDIT) The computational cost of the method is proportional to thenumber of conjugate-gradient iterations. For an extra credit, you can improve it byusing preconditioning by diagonal weighting. Appropriate weights can be found byexperimentation or by using the asymptotic theory (Fomel, 2003).

    9. To separate primaries from multiples, we can adopt the strategy similar to the oneused with the parabolic Radon:

    (a) Pick the primary velocity trend.

    (b) Apply NMO.

    (c) Isolate nearly-flat events in the transformed domain.

    (d) Transform back.

    (e) Apply inverse NMO.

    The hyperbolic Radon transform is shown in Figure 10 and the output of the proceduredescribed above is shown in Figure 12. To reproduce them on your screen, run

    scons inmo.view pvscan.view

    10. Name some theoretical advantages and disadvantages of using the hyperbolic Radontransform in comparison with the parabolic Radon transform.

    from rsf.proj import *

    # Download one CMP gather (with mute)Fetch('cmp.HH','viking')

    Flow('cmp','cmp.HH','dd form=native')Plot('cmp','grey title="CMP Gather" clip=8.66')

    prog = Program('hradon.c')hradon = str(prog[0])

    Flow('rad',['cmp',hradon], './${SOURCES[1]} adj=y np=101 dp=0.01 op=0')Plot('rad', ''' grey title="Hyperbolic Radon Transform" label2=Slowness unit2=s/km ''')

    Flow('adj',['rad',hradon], './${SOURCES[1]} adj=n nx=60 dx=0.05 ox=0.287')Plot('adj','grey title="Adjoint Hyperbolic Radon Transform" ')

    Result('adj','cmp rad adj','SideBySideAniso')

    Flow('inv',['cmp',hradon,'rad'], ''' conjgrad ./${SOURCES[1]} mod=${SOURCES[2]} np=101 dp=0.01 op=0 nx=60 dx=0.05 ox=0.287 niter=10 ''')Plot('inv', ''' grey title="Hyperbolic Radon Transform" label2=Slowness unit2=s/km ''')

    Flow('cmp2',['inv',hradon], './${SOURCES[1]} adj=n nx=60 dx=0.05 ox=0.287')Plot('cmp2', 'grey title="Inverse Hyperbolic Radon Transform" clip=8.66')

    Result('inv','cmp inv cmp2','SideBySideAniso')

    # Velocity scan

    Flow('vscan','cmp', 'vscan semblance=y half=n v0=1.2 nv=131 dv=0.02')Plot('vscan', 'grey color=j allpos=y title="Semblance Scan" unit2=km/s')

    # Automatic pick

    Flow('vpick','vscan', ''' mutter inner=y x0=1.4 half=n v0=0.45 t0=0.5 | pick rect1=50 vel0=1.5 ''')Plot('vpick', ''' graph yreverse=y transp=y plotcol=7 plotfat=7 pad=n min2=1.2 max2=3.8 wantaxis=n wanttitle=n ''')

    Plot('vscan2','vscan vpick','Overlay')

    # NMO

    Flow('nmo','cmp vpick','nmo half=n velocity=${SOURCES[1]}')Plot('nmo','grey title="NMO with Primary Velocity" clip=9.83')

    Result('vscan','cmp vscan2 nmo','SideBySideAniso')

    Flow('nmorad0',['cmp',hradon], './${SOURCES[1]} adj=y np=161 dp=0.005 op=0')Flow('nmorad',['nmo',hradon,'nmorad0'], ''' conjgrad ./${SOURCES[1]} mod=${SOURCES[2]} np=161 dp=0.005 op=0 nx=60 dx=0.05 ox=0.287 niter=10 ''')Plot('nmorad', ''' grey title="Hyperbolic Radon Transform" label2=Slowness unit2=s/km ''')

    Flow('nmo2',['nmorad',hradon], './${SOURCES[1]} adj=n nx=60 dx=0.05 ox=0.287')Plot('nmo2', 'grey title="Inverse Hyperbolic Radon Transform" clip=9.83')

    Result('nmorad','nmo nmorad nmo2','SideBySideAniso')

    Flow('cut','nmorad','cut min2=0.2')Plot('cut', ''' grey title="Hyperbolic Radon Transform" label2=Slowness unit2=s/km ''')

    Flow('signal',['cut',hradon], './${SOURCES[1]} adj=n nx=60 dx=0.05 ox=0.287')Plot('signal', 'grey title="Inverse Hyperbolic Radon Transform" clip=9.83')

    Result('nmocut','nmo cut signal','SideBySideAniso')

    # Inverse NMO

    Flow('inmo','signal vpick', 'inmo half=n velocity=${SOURCES[1]} | mutter half=n v0=1.2')Plot('inmo','grey title=Signal clip=8.66')

    Flow('pvscan','inmo', 'vscan semblance=y half=n v0=1.2 nv=131 dv=0.02')Plot('pvscan', 'grey color=j allpos=y title="Primary Semblance Scan" ')

    Flow('mult','cmp inmo','add scale=1,-1 ${SOURCES[1]}')Plot('mult','grey title=Noise clip=8.66')

    Flow('mvscan','mult', 'vscan semblance=y half=n v0=1.2 nv=131 dv=0.02')Plot('mvscan', 'grey color=j allpos=y title="Multiples Semblance Scan" ')

    Result('inmo','cmp inmo mult','SideBySideAniso')Result('pvscan','vscan pvscan mvscan','SideBySideAniso')

    End()

  • 19

    Figure 10: Applying the hyperbolic Radon transform after NMO with the primaryvelocity trend. From left to right: selected CMP gather after NMO, hyperbolic Radontransform (using iterative least-squares inversion), data reconstructed by the inversetransform.

    Figure 11: Isolating signal in the hyperbolic Radon domain. From left to right:hyperbolic Radon transform, isolated nearly-flat events, signal reconstructed by theinverse transform.

    from rsf.proj import *

    # Download one CMP gather (with mute)Fetch('cmp.HH','viking')

    Flow('cmp','cmp.HH','dd form=native')Plot('cmp','grey title="CMP Gather" clip=8.66')

    prog = Program('hradon.c')hradon = str(prog[0])

    Flow('rad',['cmp',hradon], './${SOURCES[1]} adj=y np=101 dp=0.01 op=0')Plot('rad', ''' grey title="Hyperbolic Radon Transform" label2=Slowness unit2=s/km ''')

    Flow('adj',['rad',hradon], './${SOURCES[1]} adj=n nx=60 dx=0.05 ox=0.287')Plot('adj','grey title="Adjoint Hyperbolic Radon Transform" ')

    Result('adj','cmp rad adj','SideBySideAniso')

    Flow('inv',['cmp',hradon,'rad'], ''' conjgrad ./${SOURCES[1]} mod=${SOURCES[2]} np=101 dp=0.01 op=0 nx=60 dx=0.05 ox=0.287 niter=10 ''')Plot('inv', ''' grey title="Hyperbolic Radon Transform" label2=Slowness unit2=s/km ''')

    Flow('cmp2',['inv',hradon], './${SOURCES[1]} adj=n nx=60 dx=0.05 ox=0.287')Plot('cmp2', 'grey title="Inverse Hyperbolic Radon Transform" clip=8.66')

    Result('inv','cmp inv cmp2','SideBySideAniso')

    # Velocity scan

    Flow('vscan','cmp', 'vscan semblance=y half=n v0=1.2 nv=131 dv=0.02')Plot('vscan', 'grey color=j allpos=y title="Semblance Scan" unit2=km/s')

    # Automatic pick

    Flow('vpick','vscan', ''' mutter inner=y x0=1.4 half=n v0=0.45 t0=0.5 | pick rect1=50 vel0=1.5 ''')Plot('vpick', ''' graph yreverse=y transp=y plotcol=7 plotfat=7 pad=n min2=1.2 max2=3.8 wantaxis=n wanttitle=n ''')

    Plot('vscan2','vscan vpick','Overlay')

    # NMO

    Flow('nmo','cmp vpick','nmo half=n velocity=${SOURCES[1]}')Plot('nmo','grey title="NMO with Primary Velocity" clip=9.83')

    Result('vscan','cmp vscan2 nmo','SideBySideAniso')

    Flow('nmorad0',['cmp',hradon], './${SOURCES[1]} adj=y np=161 dp=0.005 op=0')Flow('nmorad',['nmo',hradon,'nmorad0'], ''' conjgrad ./${SOURCES[1]} mod=${SOURCES[2]} np=161 dp=0.005 op=0 nx=60 dx=0.05 ox=0.287 niter=10 ''')Plot('nmorad', ''' grey title="Hyperbolic Radon Transform" label2=Slowness unit2=s/km ''')

    Flow('nmo2',['nmorad',hradon], './${SOURCES[1]} adj=n nx=60 dx=0.05 ox=0.287')Plot('nmo2', 'grey title="Inverse Hyperbolic Radon Transform" clip=9.83')

    Result('nmorad','nmo nmorad nmo2','SideBySideAniso')

    Flow('cut','nmorad','cut min2=0.2')Plot('cut', ''' grey title="Hyperbolic Radon Transform" label2=Slowness unit2=s/km ''')

    Flow('signal',['cut',hradon], './${SOURCES[1]} adj=n nx=60 dx=0.05 ox=0.287')Plot('signal', 'grey title="Inverse Hyperbolic Radon Transform" clip=9.83')

    Result('nmocut','nmo cut signal','SideBySideAniso')

    # Inverse NMO

    Flow('inmo','signal vpick', 'inmo half=n velocity=${SOURCES[1]} | mutter half=n v0=1.2')Plot('inmo','grey title=Signal clip=8.66')

    Flow('pvscan','inmo', 'vscan semblance=y half=n v0=1.2 nv=131 dv=0.02')Plot('pvscan', 'grey color=j allpos=y title="Primary Semblance Scan" ')

    Flow('mult','cmp inmo','add scale=1,-1 ${SOURCES[1]}')Plot('mult','grey title=Noise clip=8.66')

    Flow('mvscan','mult', 'vscan semblance=y half=n v0=1.2 nv=131 dv=0.02')Plot('mvscan', 'grey color=j allpos=y title="Multiples Semblance Scan" ')

    Result('inmo','cmp inmo mult','SideBySideAniso')Result('pvscan','vscan pvscan mvscan','SideBySideAniso')

    End()

    from rsf.proj import *

    # Download one CMP gather (with mute)Fetch('cmp.HH','viking')

    Flow('cmp','cmp.HH','dd form=native')Plot('cmp','grey title="CMP Gather" clip=8.66')

    prog = Program('hradon.c')hradon = str(prog[0])

    Flow('rad',['cmp',hradon], './${SOURCES[1]} adj=y np=101 dp=0.01 op=0')Plot('rad', ''' grey title="Hyperbolic Radon Transform" label2=Slowness unit2=s/km ''')

    Flow('adj',['rad',hradon], './${SOURCES[1]} adj=n nx=60 dx=0.05 ox=0.287')Plot('adj','grey title="Adjoint Hyperbolic Radon Transform" ')

    Result('adj','cmp rad adj','SideBySideAniso')

    Flow('inv',['cmp',hradon,'rad'], ''' conjgrad ./${SOURCES[1]} mod=${SOURCES[2]} np=101 dp=0.01 op=0 nx=60 dx=0.05 ox=0.287 niter=10 ''')Plot('inv', ''' grey title="Hyperbolic Radon Transform" label2=Slowness unit2=s/km ''')

    Flow('cmp2',['inv',hradon], './${SOURCES[1]} adj=n nx=60 dx=0.05 ox=0.287')Plot('cmp2', 'grey title="Inverse Hyperbolic Radon Transform" clip=8.66')

    Result('inv','cmp inv cmp2','SideBySideAniso')

    # Velocity scan

    Flow('vscan','cmp', 'vscan semblance=y half=n v0=1.2 nv=131 dv=0.02')Plot('vscan', 'grey color=j allpos=y title="Semblance Scan" unit2=km/s')

    # Automatic pick

    Flow('vpick','vscan', ''' mutter inner=y x0=1.4 half=n v0=0.45 t0=0.5 | pick rect1=50 vel0=1.5 ''')Plot('vpick', ''' graph yreverse=y transp=y plotcol=7 plotfat=7 pad=n min2=1.2 max2=3.8 wantaxis=n wanttitle=n ''')

    Plot('vscan2','vscan vpick','Overlay')

    # NMO

    Flow('nmo','cmp vpick','nmo half=n velocity=${SOURCES[1]}')Plot('nmo','grey title="NMO with Primary Velocity" clip=9.83')

    Result('vscan','cmp vscan2 nmo','SideBySideAniso')

    Flow('nmorad0',['cmp',hradon], './${SOURCES[1]} adj=y np=161 dp=0.005 op=0')Flow('nmorad',['nmo',hradon,'nmorad0'], ''' conjgrad ./${SOURCES[1]} mod=${SOURCES[2]} np=161 dp=0.005 op=0 nx=60 dx=0.05 ox=0.287 niter=10 ''')Plot('nmorad', ''' grey title="Hyperbolic Radon Transform" label2=Slowness unit2=s/km ''')

    Flow('nmo2',['nmorad',hradon], './${SOURCES[1]} adj=n nx=60 dx=0.05 ox=0.287')Plot('nmo2', 'grey title="Inverse Hyperbolic Radon Transform" clip=9.83')

    Result('nmorad','nmo nmorad nmo2','SideBySideAniso')

    Flow('cut','nmorad','cut min2=0.2')Plot('cut', ''' grey title="Hyperbolic Radon Transform" label2=Slowness unit2=s/km ''')

    Flow('signal',['cut',hradon], './${SOURCES[1]} adj=n nx=60 dx=0.05 ox=0.287')Plot('signal', 'grey title="Inverse Hyperbolic Radon Transform" clip=9.83')

    Result('nmocut','nmo cut signal','SideBySideAniso')

    # Inverse NMO

    Flow('inmo','signal vpick', 'inmo half=n velocity=${SOURCES[1]} | mutter half=n v0=1.2')Plot('inmo','grey title=Signal clip=8.66')

    Flow('pvscan','inmo', 'vscan semblance=y half=n v0=1.2 nv=131 dv=0.02')Plot('pvscan', 'grey color=j allpos=y title="Primary Semblance Scan" ')

    Flow('mult','cmp inmo','add scale=1,-1 ${SOURCES[1]}')Plot('mult','grey title=Noise clip=8.66')

    Flow('mvscan','mult', 'vscan semblance=y half=n v0=1.2 nv=131 dv=0.02')Plot('mvscan', 'grey color=j allpos=y title="Multiples Semblance Scan" ')

    Result('inmo','cmp inmo mult','SideBySideAniso')Result('pvscan','vscan pvscan mvscan','SideBySideAniso')

    End()

  • 20

    (a)

    (b)

    Figure 12: Separating signal (primary reflections) and noise (multiple reflections).(a) From left to right: input CMP gather, estimated primaries, estimated multiples.(b) Velocity analysis using semblance scan. From left to right: using all data, usingestimated primaries, using estimated multiples.

    from rsf.proj import *

    # Download one CMP gather (with mute)Fetch('cmp.HH','viking')

    Flow('cmp','cmp.HH','dd form=native')Plot('cmp','grey title="CMP Gather" clip=8.66')

    prog = Program('hradon.c')hradon = str(prog[0])

    Flow('rad',['cmp',hradon], './${SOURCES[1]} adj=y np=101 dp=0.01 op=0')Plot('rad', ''' grey title="Hyperbolic Radon Transform" label2=Slowness unit2=s/km ''')

    Flow('adj',['rad',hradon], './${SOURCES[1]} adj=n nx=60 dx=0.05 ox=0.287')Plot('adj','grey title="Adjoint Hyperbolic Radon Transform" ')

    Result('adj','cmp rad adj','SideBySideAniso')

    Flow('inv',['cmp',hradon,'rad'], ''' conjgrad ./${SOURCES[1]} mod=${SOURCES[2]} np=101 dp=0.01 op=0 nx=60 dx=0.05 ox=0.287 niter=10 ''')Plot('inv', ''' grey title="Hyperbolic Radon Transform" label2=Slowness unit2=s/km ''')

    Flow('cmp2',['inv',hradon], './${SOURCES[1]} adj=n nx=60 dx=0.05 ox=0.287')Plot('cmp2', 'grey title="Inverse Hyperbolic Radon Transform" clip=8.66')

    Result('inv','cmp inv cmp2','SideBySideAniso')

    # Velocity scan

    Flow('vscan','cmp', 'vscan semblance=y half=n v0=1.2 nv=131 dv=0.02')Plot('vscan', 'grey color=j allpos=y title="Semblance Scan" unit2=km/s')

    # Automatic pick

    Flow('vpick','vscan', ''' mutter inner=y x0=1.4 half=n v0=0.45 t0=0.5 | pick rect1=50 vel0=1.5 ''')Plot('vpick', ''' graph yreverse=y transp=y plotcol=7 plotfat=7 pad=n min2=1.2 max2=3.8 wantaxis=n wanttitle=n ''')

    Plot('vscan2','vscan vpick','Overlay')

    # NMO

    Flow('nmo','cmp vpick','nmo half=n velocity=${SOURCES[1]}')Plot('nmo','grey title="NMO with Primary Velocity" clip=9.83')

    Result('vscan','cmp vscan2 nmo','SideBySideAniso')

    Flow('nmorad0',['cmp',hradon], './${SOURCES[1]} adj=y np=161 dp=0.005 op=0')Flow('nmorad',['nmo',hradon,'nmorad0'], ''' conjgrad ./${SOURCES[1]} mod=${SOURCES[2]} np=161 dp=0.005 op=0 nx=60 dx=0.05 ox=0.287 niter=10 ''')Plot('nmorad', ''' grey title="Hyperbolic Radon Transform" label2=Slowness unit2=s/km ''')

    Flow('nmo2',['nmorad',hradon], './${SOURCES[1]} adj=n nx=60 dx=0.05 ox=0.287')Plot('nmo2', 'grey title="Inverse Hyperbolic Radon Transform" clip=9.83')

    Result('nmorad','nmo nmorad nmo2','SideBySideAniso')

    Flow('cut','nmorad','cut min2=0.2')Plot('cut', ''' grey title="Hyperbolic Radon Transform" label2=Slowness unit2=s/km ''')

    Flow('signal',['cut',hradon], './${SOURCES[1]} adj=n nx=60 dx=0.05 ox=0.287')Plot('signal', 'grey title="Inverse Hyperbolic Radon Transform" clip=9.83')

    Result('nmocut','nmo cut signal','SideBySideAniso')

    # Inverse NMO

    Flow('inmo','signal vpick', 'inmo half=n velocity=${SOURCES[1]} | mutter half=n v0=1.2')Plot('inmo','grey title=Signal clip=8.66')

    Flow('pvscan','inmo', 'vscan semblance=y half=n v0=1.2 nv=131 dv=0.02')Plot('pvscan', 'grey color=j allpos=y title="Primary Semblance Scan" ')

    Flow('mult','cmp inmo','add scale=1,-1 ${SOURCES[1]}')Plot('mult','grey title=Noise clip=8.66')

    Flow('mvscan','mult', 'vscan semblance=y half=n v0=1.2 nv=131 dv=0.02')Plot('mvscan', 'grey color=j allpos=y title="Multiples Semblance Scan" ')

    Result('inmo','cmp inmo mult','SideBySideAniso')Result('pvscan','vscan pvscan mvscan','SideBySideAniso')

    End()

  • 21

    11. As before, your creative task is to try improving the results by changing the parametersin the current strategy or by changing the strategy.

    hradon/hradon.c

    1 /∗ Hyperbo l i c Radon transform ∗/2 #include < r s f . h>3

    4 int main ( int argc , char∗ argv [ ] )5 {6 sf map4 map ;7 int i t , nt , ix , nx , ip , np , i3 , n3 ;8 bool adj ;9 f loat t0 , dt , t , x0 , dx , x , p0 , dp , p ;

    10 f loat ∗∗cmp , ∗∗ rad , ∗ t r a c e ;11 s f f i l e in , out ;12

    13 s f i n i t ( argc , argv ) ;14 in = s f i n p u t ( ” in ” ) ;15 out = s f o u t p u t ( ” out ” ) ;16

    17 i f ( ! s f h i s t i n t ( in , ”n1” ,&nt ) ) s f e r r o r ( ”No n1=” ) ;18 i f ( ! s f h i s t f l o a t ( in , ”o1” ,& t0 ) ) s f e r r o r ( ”No o1=” ) ;19 i f ( ! s f h i s t f l o a t ( in , ”d1” ,&dt ) ) s f e r r o r ( ”No d1=” ) ;20

    21 n3 = s f l e f t s i z e ( in , 2 ) ;22

    23 i f ( ! s f g e t b o o l ( ” adj ” ,& adj ) ) adj=f a l s e ;24 /∗ ad j o i n t f l a g ∗/25

    26 i f ( adj ) {27 i f ( ! s f h i s t i n t ( in , ”n2” ,&nx ) ) s f e r r o r ( ”No n2=” ) ;28 i f ( ! s f h i s t f l o a t ( in , ”o2” ,&x0 ) ) s f e r r o r ( ”No o2=” ) ;29 i f ( ! s f h i s t f l o a t ( in , ”d2” ,&dx ) ) s f e r r o r ( ”No d2=” ) ;30

    31 i f ( ! s f g e t i n t ( ”np” ,&np ) ) s f e r r o r ( ”Need np=” ) ;32 i f ( ! s f g e t f l o a t ( ”op” ,&p0 ) ) s f e r r o r ( ”need p0=” ) ;33 i f ( ! s f g e t f l o a t ( ”dp” ,&dp ) ) s f e r r o r ( ”need dp=” ) ;34

    35 s f p u t i n t ( out , ”n2” ,np ) ;36 s f p u t f l o a t ( out , ”o2” , p0 ) ;37 s f p u t f l o a t ( out , ”d2” ,dp ) ;38 } else {39 i f ( ! s f h i s t i n t ( in , ”n2” ,&np ) ) s f e r r o r ( ”No n2=” ) ;40 i f ( ! s f h i s t f l o a t ( in , ”o2” ,&p0 ) ) s f e r r o r ( ”No o2=” ) ;41 i f ( ! s f h i s t f l o a t ( in , ”d2” ,&dp ) ) s f e r r o r ( ”No d2=” ) ;42

    43 i f ( ! s f g e t i n t ( ”nx” ,&nx ) ) s f e r r o r ( ”Need nx=” ) ;

  • 22

    44 i f ( ! s f g e t f l o a t ( ”ox” ,&x0 ) ) s f e r r o r ( ”need x0=” ) ;45 i f ( ! s f g e t f l o a t ( ”dx” ,&dx ) ) s f e r r o r ( ”need dx=” ) ;46

    47 s f p u t i n t ( out , ”n2” , nx ) ;48 s f p u t f l o a t ( out , ”o2” , x0 ) ;49 s f p u t f l o a t ( out , ”d2” , dx ) ;50 }51

    52 t r a c e = s f f l o a t a l l o c ( nt ) ;53 cmp = s f f l o a t a l l o c 2 ( nt , nx ) ;54 rad = s f f l o a t a l l o c 2 ( nt , np ) ;55

    56 /∗ i n i t i a l i z e ha l f−order d i f f e r e n t i a t i o n ∗/57 s f h a l f i n t i n i t ( true , nt , 1 . 0 f −1.0 f /nt ) ;58

    59 /∗ i n i t i a l i z e s p l i n e i n t e r p o l a t i o n ∗/60 map = s f s t r e t c h 4 i n i t ( nt , t0 , dt , nt , 0 . 0 1 ) ;61

    62 for ( i 3 =0; i 3 < n3 ; i 3++) {63 i f ( adj ) {64 for ( i x =0; ix < nx ; i x++) {65 s f f l o a t r e a d ( trace , nt , in ) ;66 s f h a l f i n t l o p ( true , f a l s e , nt , nt , cmp [ ix ] , t r a c e ) ;67 }68 } else {69 s f f l o a t r e a d ( rad [ 0 ] , nt∗np , in ) ;70 }71

    72 s f a d j n u l l ( adj , f a l s e , nt∗np , nt∗nx , rad [ 0 ] , cmp [ 0 ] ) ;73

    74 for ( ip =0; ip < np ; ip++) {75 p = p0 + ip ∗dp ;76 for ( i x =0; ix < nx ; i x++) {77 x = x0 + ix ∗dx ;78

    79 for ( i t =0; i t < nt ; i t ++) {80 t = t0 + i t ∗dt ;81 t r a c e [ i t ] = hypotf ( t , p∗x ) ;82 /∗ hypot (a , b)= s q r t ( a∗a+b∗b ) ∗/83 }84

    85 s f s t r e t c h 4 d e f i n e (map , t r a c e ) ;86

    87 i f ( adj ) {88 s f s t r e t c h 4 a p p l y a d j ( true , map , rad [ ip ] , cmp [ ix ] ) ;89 } else {90 s f s t r e t c h 4 a p p l y ( true , map , rad [ ip ] , cmp [ ix ] ) ;91 }

  • 23

    92 }93 }94

    95 i f ( adj ) {96 s f f l o a t w r i t e ( rad [ 0 ] , nt∗np , out ) ;97 } else {98 for ( i x =0; ix < nx ; i x++) {99 s f h a l f i n t l o p ( f a l s e , f a l s e , nt , nt , cmp [ ix ] , t r a c e ) ;

    100 s f f l o a t w r i t e ( t race , nt , out ) ;101 }102 }103 }104

    105 e x i t ( 0 ) ;106 }

    hradon/SConstruct

    1 from r s f . p ro j import ∗2

    3 # Download one CMP gather ( wi th mute )4 Fetch ( ’cmp .HH’ , ’ v i k ing ’ )5

    6 Flow ( ’cmp ’ , ’cmp .HH’ , ’ dd form=nat ive ’ )7 Plot ( ’cmp ’ , ’ grey t i t l e =”CMP Gather” c l i p =8.66 ’ )8

    9 prog = Program ( ’ hradon . c ’ )10 hradon = s t r ( prog [ 0 ] )11

    12 Flow ( ’ rad ’ , [ ’cmp ’ , hradon ] ,13 ’ . / ${SOURCES[ 1 ] } adj=y np=101 dp=0.01 op=0 ’ )14 Plot ( ’ rad ’ ,15 ’ ’ ’16 grey t i t l e =”Hyperbol ic Radon Transform”17 l a b e l 2=Slowness uni t2=s /km18 ’ ’ ’ )19

    20 Flow ( ’ adj ’ , [ ’ rad ’ , hradon ] ,21 ’ . / ${SOURCES[ 1 ] } adj=n nx=60 dx=0.05 ox=0.287 ’ )22 Plot ( ’ adj ’ , ’ grey t i t l e =”Adjoint Hyperbol ic Radon Transform” ’ )23

    24 Result ( ’ adj ’ , ’cmp rad adj ’ , ’ SideBySideAniso ’ )25

    26 Flow ( ’ inv ’ , [ ’cmp ’ , hradon , ’ rad ’ ] ,27 ’ ’ ’28 conjgrad . / ${SOURCES[ 1 ] } mod=${SOURCES[ 2 ] }29 np=101 dp=0.01 op=0 nx=60 dx=0.05 ox=0.287 n i t e r =1030 ’ ’ ’ )

  • 24

    31 Plot ( ’ inv ’ ,32 ’ ’ ’33 grey t i t l e =”Hyperbol ic Radon Transform”34 l a b e l 2=Slowness uni t2=s /km35 ’ ’ ’ )36

    37 Flow ( ’cmp2 ’ , [ ’ inv ’ , hradon ] ,38 ’ . / ${SOURCES[ 1 ] } adj=n nx=60 dx=0.05 ox=0.287 ’ )39 Plot ( ’ cmp2 ’ ,40 ’ grey t i t l e =”Inve r s e Hyperbol ic Radon Transform” c l i p =8.66 ’ )41

    42 Result ( ’ inv ’ , ’cmp inv cmp2 ’ , ’ SideBySideAniso ’ )43

    44 # Ve loc i t y scan45

    46 Flow ( ’ vscan ’ , ’cmp ’ ,47 ’ vscan semblance=y h a l f=n v0=1.2 nv=131 dv=0.02 ’ )48 Plot ( ’ vscan ’ ,49 ’ grey c o l o r=j a l l p o s=y t i t l e =”Semblance Scan” unit2=km/ s ’ )50

    51 # Automatic p i c k52

    53 Flow ( ’ vpick ’ , ’ vscan ’ ,54 ’ ’ ’55 mutter inne r=y x0=1.4 h a l f=n v0=0.45 t0 =0.5 |56 pick r e c t 1 =50 ve l0 =1.557 ’ ’ ’ )58 Plot ( ’ vpick ’ ,59 ’ ’ ’60 graph yr eve r s e=y transp=y p l o t c o l=7 p l o t f a t=761 pad=n min2=1.2 max2=3.8 wantaxis=n w a n t t i t l e=n62 ’ ’ ’ )63

    64 Plot ( ’ vscan2 ’ , ’ vscan vpick ’ , ’ Overlay ’ )65

    66 # NMO67

    68 Flow ( ’nmo ’ , ’cmp vpick ’ , ’nmo h a l f=n v e l o c i t y=${SOURCES[ 1 ] } ’ )69 Plot ( ’nmo ’ , ’ grey t i t l e =”NMO with Primary Ve loc i ty ” c l i p =9.83 ’ )70

    71 Result ( ’ vscan ’ , ’cmp vscan2 nmo ’ , ’ SideBySideAniso ’ )72

    73 Flow ( ’ nmorad0 ’ , [ ’cmp ’ , hradon ] ,74 ’ . / ${SOURCES[ 1 ] } adj=y np=161 dp=0.005 op=0 ’ )75 Flow ( ’ nmorad ’ , [ ’nmo ’ , hradon , ’ nmorad0 ’ ] ,76 ’ ’ ’77 conjgrad . / ${SOURCES[ 1 ] } mod=${SOURCES[ 2 ] }78 np=161 dp=0.005 op=0 nx=60 dx=0.05 ox=0.287 n i t e r =10

  • 25

    79 ’ ’ ’ )80 Plot ( ’ nmorad ’ ,81 ’ ’ ’82 grey t i t l e =”Hyperbol ic Radon Transform”83 l a b e l 2=Slowness uni t2=s /km84 ’ ’ ’ )85

    86 Flow ( ’nmo2 ’ , [ ’ nmorad ’ , hradon ] ,87 ’ . / ${SOURCES[ 1 ] } adj=n nx=60 dx=0.05 ox=0.287 ’ )88 Plot ( ’nmo2 ’ ,89 ’ grey t i t l e =”Inve r s e Hyperbol ic Radon Transform” c l i p =9.83 ’ )90

    91 Result ( ’ nmorad ’ , ’nmo nmorad nmo2 ’ , ’ SideBySideAniso ’ )92

    93 Flow ( ’ cut ’ , ’ nmorad ’ , ’ cut min2=0.2 ’ )94 Plot ( ’ cut ’ ,95 ’ ’ ’96 grey t i t l e =”Hyperbol ic Radon Transform”97 l a b e l 2=Slowness uni t2=s /km98 ’ ’ ’ )99

    100 Flow ( ’ s i g n a l ’ , [ ’ cut ’ , hradon ] ,101 ’ . / ${SOURCES[ 1 ] } adj=n nx=60 dx=0.05 ox=0.287 ’ )102 Plot ( ’ s i g n a l ’ ,103 ’ grey t i t l e =”Inve r s e Hyperbol ic Radon Transform” c l i p =9.83 ’ )104

    105 Result ( ’ nmocut ’ , ’nmo cut s i g n a l ’ , ’ SideBySideAniso ’ )106

    107 # Inver se NMO108

    109 Flow ( ’ inmo ’ , ’ s i g n a l vpick ’ ,110 ’ inmo h a l f=n v e l o c i t y=${SOURCES[ 1 ] } | mutter h a l f=n v0=1.2 ’ )111 Plot ( ’ inmo ’ , ’ grey t i t l e=S igna l c l i p =8.66 ’ )112

    113 Flow ( ’ pvscan ’ , ’ inmo ’ ,114 ’ vscan semblance=y h a l f=n v0=1.2 nv=131 dv=0.02 ’ )115 Plot ( ’ pvscan ’ ,116 ’ grey c o l o r=j a l l p o s=y t i t l e =”Primary Semblance Scan” ’ )117

    118 Flow ( ’ mult ’ , ’cmp inmo ’ , ’ add s c a l e =1,−1 ${SOURCES[ 1 ] } ’ )119 Plot ( ’ mult ’ , ’ grey t i t l e=Noise c l i p =8.66 ’ )120

    121 Flow ( ’ mvscan ’ , ’ mult ’ ,122 ’ vscan semblance=y h a l f=n v0=1.2 nv=131 dv=0.02 ’ )123 Plot ( ’ mvscan ’ ,124 ’ grey c o l o r=j a l l p o s=y t i t l e =”Mul t ip l e s Semblance Scan” ’ )125

    126 Result ( ’ inmo ’ , ’cmp inmo mult ’ , ’ SideBySideAniso ’ )

  • 26

    127 Result ( ’ pvscan ’ , ’ vscan pvscan mvscan ’ , ’ SideBySideAniso ’ )128

    129 End ( )

    YOUR OWN DATA

    Finally, add results from analyzing the dataset you selected for your course project. Youcan include results from noise attenuation, velocity analysis, or any other processing stepsthat you have taken so far.

    SAVING YOUR WORK

    It is important to save all files that you edit by hand (such as paper.tex and SConstruct)in a version-control system every time you make a revision. The completed assignment isdue in two weeks and should be submitted through your team’s private GitHub repository.

    REFERENCES

    Fomel, S., 2003, Asymptotic pseudounitary stacking operators: Geophysics, 68, 1032–1042.Gardner, G. F., and F. Lu, eds., 1991, Slant-Stack Processing: Soc. of Expl. Geophys.Kostov, C., 1990, Toeplitz structure in slant-stack inversion: 60th Ann. Internat. Mtg, Soc.

    of Expl. Geophys., 1618–1621.Thorson, J. R., and J. F. Claerbout, 1985, Velocity stack and slant stochastic inversion:

    Geophysics, 50, 2727–2741.Weglein, A. B., and W. H. Dragoset, eds., 2005, Multiple Attenuation: Soc. of Expl. Geo-

    phys.