up [pdf]
from rsf.proj import *

# Generate a reflector model

layers = (
     ((0,2),(3.5,2),(4.5,2.5),(5,2.25),
       (5.5,2),(6.5,2.5),(10,2.5)),
     ((0,2.5),(10,3.5)),
     ((0,3.2),(3.5,3.2),(5,3.7),
       (6.5,4.2),(10,4.2)),
     ((0,4.5),(10,4.5))
)

nlays = len(layers)
for i in range(nlays):
     inp = 'inp%d' % i
     Flow(inp+'.asc',None,
          '''
          echo %s in=$TARGET
          data_format=ascii_float n1=2 n2=%d
          ''' % \
          (' '.join(map(lambda x: ' '.join(map(str,x)),
                           layers[i])),len(layers[i])))

dim1 = 'o1=0 d1=0.001 n1=10001'

Flow('lay1','inp0.asc',
     'dd form=native | spline %s fp=0,0' % dim1)
Flow('lay2',None  ,
     'math %s output="2.5+x1*0.1" '      % dim1)
Flow('lay3','inp2.asc',
     'dd form=native | spline %s fp=0,0' % dim1)
Flow('lay4',None  ,'math %s output=4.5'  % dim1)

Flow('lays','lay1 lay2 lay3 lay4',
     'cat axis=2 ${SOURCES[1:4]}')

graph = '''
graph min1=2.5 max1=7.5 min2=0 max2=5
yreverse=y wantaxis=n wanttitle=n screenratio=1
'''
Plot('lays0','lays',graph + ' plotfat=10 plotcol=0')
Plot('lays1','lays',graph + ' plotfat=2 plotcol=7')
Plot('lays2','lays',graph + ' plotfat=2')

# Velocity

Flow('vofz',None,
     '''
     math output="1.5+0.36*x1"
     d2=0.01 n2=1001 d1=0.01 n1=501
     label1=Depth unit1=km
     label2=Distance unit2=km
     label=Velocity unit=km/s
     ''')
Plot('vofz',
     '''
     window min2=2.5 max2=7.5 |
     grey color=j allpos=y bias=1.5
     title=Model screenratio=1
     ''')

Result('model','vofz lays0 lays1','Overlay')

# Model data

Flow('dips','lays','deriv scale=y')
Flow('modl','lays dips',
     '''
     kirmod cmp=y dip=${SOURCES[1]} 
     nh=51  dh=0.1  h0=0
     ns=201 ds=0.05 s0=0
     freq=10 dt=0.004 nt=1501
     vel=1.5 gradz=0.36 verb=y |
     pow pow1=1 |
     put d2=0.05 
     label1=Time        unit1=s
     label2=Half-Offset unit2=km 
     label3=Midpoint    unit3=km 
     ''',split=[1,10001], reduce='add')

# Add random noise
Flow('data','modl','noise var=1e-6 seed=101013')

Result('data',
       '''
       byte |
       transp plane=23 |
       grey3 flat=n frame1=750 frame2=100 frame3=10 
       title=Data point1=0.8 point2=0.8
       ''')

# Velocity estimation
#####################
Flow('voft','vofz',
     'depth2time velocity=$SOURCE dt=0.004 nt=1501')
Flow('vrms','voft',
     '''
     add mode=p $SOURCE | causint | 
     math output="sqrt(input*0.004/(x1+0.004))" 
     ''')

# Velocity scan
Flow('vscan','data',
     'vscan v0=1.5 dv=0.02 nv=51 semblance=y',
     split=[3,201], reduce='cat')

Result('vscan',
       '''
       byte allpos=y gainpanel=all |
       transp plane=23 |
       grey3 flat=n frame1=750 frame2=100 frame3=25 
       label1=Time unit1=s color=j
       label3=Velocity unit3=km/s 
       label2=Midpoint unit2=km
       title="Velocity Scan" point1=0.8 point2=0.8
       ''')

# Velocity picking
Flow('vnmo','vscan','pick rect1=100 rect2=10')

for vel in ('vrms','vnmo'):
    Plot(vel,
     '''
     grey color=j allpos=y bias=1.5 clip=0.7
     scalebar=y barreverse=y barunit=km/s
     label2=Midpoint unit2=km label1=Time unit1=s
     title="%s Velocity" 
     ''' % vel[1:].upper())
Result('vnmo','vrms vnmo','SideBySideIso')

# Stacking
##########

Flow('nmo','data vnmo','nmo velocity=${SOURCES[1]}')
Flow('stack','nmo','stack')

# Using vrms is CHEATING
########################
Flow('nmo0','data vrms','nmo velocity=${SOURCES[1]}')
Flow('dstack','nmo0',
     '''
     window f1=250 | 
     logstretch | fft1 | 
     transp plane=13 memsize=1000 |
     finstack | 
     transp memsize=1000 |
     fft1 inv=y | logstretch inv=y | 
     pad beg1=250 | put unit1=s
     ''')

Flow('zoff','data','window n2=1')

stacks = {
    'stack': 'Stack with NMO Velocity',
    'dstack': 'DMO Stack',
    'zoff': 'Zero Offset'
    }

for stack in stacks.keys():
    Result(stack,
           '''
           window min1=1.5 max1=5 min2=1 max2=9 | 
           grey title="%s" 
           ''' % stacks[stack])

# Kirchhoff Migration
#####################

proj = Project()

prog = proj.Program('kirchhoff',['kirchhoff.c','aal.c'])
exe = str(prog[0])

# Using vrms is CHEATING
########################
Flow('tmig','dstack %s vrms' % prog[0],
     './${SOURCES[1]} vel=${SOURCES[2]} antialias=0')

Result('tmig',
       '''
       window min2=2.5 max2=7.5 |
       grey title="Time Migration"
       ''')

# Using vofz is CHEATING
########################
Flow('dmig','tmig vofz',
     'time2depth velocity=${SOURCES[1]}')

Plot('dmig',
     '''
     window max1=5 min2=2.5 max2=7.5 | 
     grey title="Time -> Depth" screenratio=1
     label2=Distance label1=Depth unit1=km
     ''')

Result('dmig','Overlay')
Result('dmig2','dmig lays2','Overlay')

End()

sfdd
sfspline
sfmath
sfcat
sfgraph
sfwindow
sfgrey
sfderiv
sfkirmod
sfpow
sfput
sfadd
sfnoise
sfbyte
sftransp
sfgrey3
sfdepth2time
sfcausint
sfvscan
sfpick
sfnmo
sfstack
sflogstretch
sffft1
sffinstack
sfpad
sftime2depth