#!/usr/bin/env python
import commands
import sys

   
#FORM A DICTIONARY OF COMMAND LINE ARGUMENTS (expecting a=b argument form)
def read_args(args):
  dict={}
  for arg in args:
    a=arg.split("=")
    if len(a) ==2: dict[a[0]]=a[1]
  return dict



#CLASS CONTAINING PARAMETERS
class argument:
  def __init__(self,param,descript,default):
    self.par=param
    self.des=descript
    self.val=default
  def update(self,v):
   if v!=None: self.val=v
  def print_doc(self):
    if self.val!=None:
      print "   %s=%s   %s"%(self.par,self.val,self.des)
    else:
      print "   %s=MISSING   %s"%(self.par,self.des)



#function defining arguments
def required_params():
  run_params={}
  run_params["correct"]=argument("correct","Full precision result, input",None)
  run_params["reduced"]=argument("reduced","Reduced precision result, input",None)
  run_params["quality"]=argument("quality","Quality of the result, output",None)
  run_params["nwind1"] =argument("nwind1", "Size of patch, 1st axis", 30)
  run_params["nwind2"] =argument("nwind2", "Size of patch, 2nd axis", 30)
  run_params["nwind3"] =argument("nwind3", "Size of patch, 3rd axis", 30)
  run_params["overlap_pct1"] =argument("overlap_pct1", "Overlap pct, 1st axis, 1st axis", 20)
  run_params["overlap_pct2"] =argument("overlap_pct2", "Overlap pct, 2nd axis", 20)
  run_params["overlap_pct3"] =argument("overlap_pct2", "Overlap pct, 3rd axis", 20)
  run_params["pef1"] =argument("pef1", "Filter size, 1st axis", 10)
  run_params["pef2"] =argument("pef2", "Filter size, 3rd axis", 4)
  return run_params




#Update parameter list based on data size 
def update_based_on_data(params):
  stat,out=commands.getstatusoutput("Get <%s  parform=n n1"%params["correct"].val)
  params["nout1"]=argument("n1","",out.rstrip())
  stat,out=commands.getstatusoutput("Get <%s  parform=n n2"%params["correct"].val)
  params["nout2"]=argument("n2","",out.rstrip())
  stat,out=commands.getstatusoutput("Get <%s  parform=n n3"%params["correct"].val)
  params["nout3"]=argument("n3","",out.rstrip())
  n1=int( params["nout1"].val)
  n2=int( params["nout2"].val)
  n3=int( params["nout3"].val)

  npct=(100.+int(params["overlap_pct1"].val))/100.
  n=int(n1*npct/int(params["nwind1"].val))
  params["npatch1"]=argument("npatch1","",n)

  npct=(100.+int(params["overlap_pct2"].val))/100.
  n=int(n2*npct/int(params["nwind2"].val))
  params["npatch2"]=argument("npatch2","",n)

  npct=(100.+int(params["overlap_pct3"].val))/100.
  n=int(n3*npct/int(params["nwind3"].val))
  params["npatch3"]=argument("npatch3","",n)
  return params

  

#        ./char.x < patch.vel.$*.H full=patch.full.H  >zx1.H diff=zx2.H a1=10 a2=4
#        Patch < zx1.H >$@ nout1=251 nout2=574 inv=1
#        Patch < zx2.H > diffv.$*.H nout1=251 nout2=574 inv=1;

def run_it(params):
  params=update_based_on_data(params)
  coms=[]
  coms.append("Scale <  %s >a.H nwind1=%s npatch1=%s nwind2=%s npatch2=%s"%(params["correct"].val,
    params["nwind1"].val, params["npatch1"].val,params["nwind2"].val,params["npatch2"].val))
  coms.append("Scale < %s >b.H nwind1=%s npatch1=%s nwind2=%s npatch2=%s"%(params["reduced"].val,
    params["nwind1"].val, params["npatch1"].val,params["nwind2"].val,params["npatch2"].val))
  coms.append("Patch < a.H %s >full.patch.H nwind1=%s npatch1=%s nwind2=%s npatch2=%s"%(params["correct"].val,
    params["nwind1"].val, params["npatch1"].val,params["nwind2"].val,params["npatch2"].val))
  coms.append("Patch < b.H %s >check.patch.H nwind1=%s npatch1=%s nwind2=%s npatch2=%s"%(params["reduced"].val,
    params["nwind1"].val, params["npatch1"].val,params["nwind2"].val,params["npatch2"].val))
  coms.append("./bob2/char.x  < check.patch.H full=full.patch.H > c1.H diff=c2.H a1=%s a2=%s"%(params["pef1"].val, params["pef2"].val))
  coms.append("Patch < c1.H > base.H nout1=%s inv=1 nout2=%s"%(params["nout1"].val,params["nout2"].val))
  coms.append("Patch < c2.H > diff.H nout1=%s inv=1 nout2=%s"%(params["nout1"].val,params["nout2"].val))
  coms.append("Math file1=base.H   exp='@ABS(file1)' |Smooth rect1=2 rect2=2 >a1.H")
  coms.append("Math file1=diff.H   exp='@ABS(file1)' |Smooth rect1=2 rect2=2 >a2.H")
  coms.append("Math file1=a1.H file2=a2.H exp='@ABS((file1-file2))' >%s"%params["quality"].val)
  for com in coms:
    print com
    stat,out=commands.getstatusoutput(com)
    print out
    if stat!=0: sys.exit(-1)


#Check to see if all required parameters are present set defaults
def check_args(params,args):

  good=1
  for p,struct in params.items():
    d=None
    if args.has_key(p):
      d=args[p]
    elif struct.val==None:
      good=0
    struct.update(d)
  if good==0:
     print "compare.pl\n\n"
     for a,p in params.items():
       p.print_doc()
     print "\n\nNot all parameters specificed \n";
     sys.exit(-1)
   







params=required_params()
args=read_args(sys.argv)
check_args(params,args)
run_it(params)


