#
# weighting operator demo
#    
try:    from rsf.cluster import *
except: from rsf.proj    import *
import wplot
import sys
sys.path.append('../../PYUTIL')
from wghLOP import *
from DPTEST import *

# ------------------------------------------------------------
do3D = 'y'
doINV = 'n'
# ------------------------------------------------------------

par = dict(
    nx=25,  ox=0, dx=1.0,  lx='x', ux='',
    ny=11,  oy=0, dy=1.0,  ly='y', uy='',
    nz=15,  oz=0, dz=1.0,  lz='z', uz=''
    )
wplot.param(par)
par['mz']=par['nz']/2+1
par['mx']=par['nx']/2+1
par['my']=par['ny']/2+1

# ------------------------------------------------------------
# inputs
Flow('i2D',None,
    '''
    math output="1" 
    n1=%(nz)d d1=%(dz)g o1=%(oz)g 
    n2=%(nx)d d2=%(dx)g o2=%(ox)g |
    noise
    '''%par)

if(do3D=='y'):
    Flow('i3D',None,
    '''
    math output="1" 
    n1=%(nz)d d1=%(dz)g o1=%(oz)g 
    n2=%(nx)d d2=%(dx)g o2=%(ox)g 
    n3=%(ny)d d2=%(dy)g o2=%(oy)g |
    noise
    '''%par)

# ------------------------------------------------------------
# initialize operators
# ------------------------------------------------------------
Flow(  'w2d','i2D','math output="x1^2 + x2^2"')
Result('w2d',wplot.igrey2d('mean=y',par))
W2D = wghop('w2d')

if(do3D=='y'):
    Flow(  'w3d','i3D','math output="x1^2 + x2^2 + x3^2"')
    Result('w3d','byte gainpanel=a pclip=100 |' +wplot.igrey3d('mean=y',par))
    W3D = wghop('w3d')
    
# ------------------------------------------------------------
# FORWARD/ADJOINT operators
# ------------------------------------------------------------
W2D.FORW('i2D',   'i2Dfor')
W2D.ADJT('i2Dadj','i2Dfor')
Result('i2Dfor',wplot.igrey2d('',par))
Result('i2Dadj',wplot.igrey2d('',par))

if(do3D=='y'):
    W3D.FORW('i3D',   'i3Dfor')
    W3D.ADJT('i3Dadj','i3Dfor')
    Result('i3Dfor','byte gainpanel=a pclip=100 |' + wplot.igrey3d('',par))
    Result('i3Dadj','byte gainpanel=a pclip=100 |' + wplot.igrey3d('',par))

# ------------------------------------------------------------
# DOT PRODUCT TEST
# ------------------------------------------------------------
Flow('m2D','i2D','window squeeze=n') # init m
Flow('d2D','i2D','window squeeze=n') # init d
D2D = DPTEST(W2D,['m2D'],['d2D'])    # init DP test
D2D.RUN()                            #  run DP test

if(do3D=='y'):
    Flow('m3D','i3D','window squeeze=n') # init m
    Flow('d3D','i3D','window squeeze=n') # init d
    D3D = DPTEST(W3D,['m3D'],['d3D'])    # init DP test
    D3D.RUN()                            #  run DP test

End()
