;===============================================================
;pattern_main_new4.pro
;Purpose: find the movement of smoke plume
;written by Jian Zeng
;2010-03-12
;===============================================================
  pro find_move,target,search,glat,glon,outidx,$
                target_xs=target_xs,target_ys=target_ys,mxcor=mxcor


    pct=0.2

    index=where(target gt 0.,nin)
    outidx=[-1,-1]
    mxcor=-999.0

    if nin gt target_xs*target_ys*pct then begin

      step=1
      nx_sub=target_xs/step+1
      ny_sub=target_ys/step+1
      r=fltarr(nx_sub,ny_sub)-999.0


      for m=0,nx_sub-1,step do begin
        for n=0,ny_sub-1,step do begin
            i1=m
            i2=m+target_xs
            j1=n
            j2=n+target_ys

            sub=search(i1:i2,j1:j2)
            lat=glat(i1:i2,j1:j2)
            lon=glon(i1:i2,j1:j2)

            index2=where(lat gt -90 and lon gt -180. and sub gt 0.$
                         and target gt 0.,nin2)
            if nin2 gt target_xs*target_ys*pct then begin
              
              target_mean=mean(target(index2))
              target_std=total((target(index2)-target_mean)^2)
              sub_mean=mean(sub(index2))
              sub_std=total((sub(index2)-sub_mean)^2)
        
              up=total((sub(index2)-sub_mean)*(target(index2)-target_mean))
              if sqrt(target_std*sub_std) gt 0. then $
                r(m,n)=up/sqrt(target_std*sub_std)

            endif
        endfor
      endfor

      mxcor=max(r,location)
      index=where(abs(mxcor-r) lt 1.e-2,cp)
      if mxcor gt 0. then begin
        outidx=array_indices(r,location)
      endif

    endif ;if nin gt target_xs*target_ys*pct
    
end
;----------------------------------------------------------------------------------------------------------
pro create_newimg,nx_g,ny_g,num,move,target_xs,target_ys,aod,newaod

 newaod=fltarr(nx_g,ny_g)-9999.0
 for inum=0,num-1 do begin
   ii0=move(inum,0)
   jj0=move(inum,1)
   if ii0 gt 0 and jj0 gt 0 then begin
     i1=(ii0-target_xs) > 0
     i2=(ii0+target_xs) < (nx_g-1)
     j1=(jj0-target_ys) > 0
     j2=(jj0+target_ys) < (ny_g-1)
     newaod(i1:i2,j1:j2)=aod(i1:i2,j1:j2)
   endif
 endfor

end
;------------------------------------------------------------------------------------
pro find_smokegrid,date_last,dir0,nx,ny,origx,origy,nx_g,ny_g,$
                                    target_xs,target_ys,temp,nsmoke,data_suffix
    
    infile_aod=file_search(dir0+'*'+date_last+data_suffix+'*',count=nfl_aod)

    maxnum=nx*ny
    temp=lonarr(maxnum,2)
    nplumes=0
    plumes=lonarr(maxnum,2)
    nsmoke=0L
    npix=target_xs*target_ys*0.1
 
    if nfl_aod eq 1 then begin
      saod=fltarr(nx_g,ny_g)
      read_binary,infile_aod,saod

      for inx=0,nx-1 do begin
      for iny=0,ny-1 do begin
        mini=origx(inx)
        minj=origy(iny)
        i1=(mini-target_xs/2) > 0
        i2=(mini+target_xs/2) < (nx_g-1)
        j1=(minj-target_ys/2) > 0
        j2=(minj+target_ys/2) < (ny_g-1)
        target=saod(i1:i2,j1:j2)
        ind=where(target gt 0.,cp)
        if cp gt npix then begin
          temp(nsmoke,0)=mini
          temp(nsmoke,1)=minj
          nsmoke=nsmoke+1
        endif
      endfor
      endfor
      print,'Smoke Grids (#, max, min) at ',date_last,' = ',$
             nsmoke,max(saod),min(saod(where(saod gt -9)))
    endif
    
end
;=====================================================================================
;main program
;=====================================================================================
pro pattern_main_new4,file,instr,dir_smoke,yr,jday,time,yr_last,month_last,nday_last,$
                 dir_last,nx_g,ny_g,newaod,glat,glon,data_suffix,target_xs=target_xs,$
                 target_ys=target_ys,screen,maxang=maxang,minang=minang
    
  if not keyword_set(target_xs) then target_xs=32
  if not keyword_set(target_ys) then target_ys=32
  nx=fix(nx_g/target_xs)-2L
  ny=fix(ny_g/target_ys)-2L


  if n_elements(file) lt 1 then begin
    print, 'Pattern_main_new4.pro: No AOD file found'
    stop
  endif else begin
  
    convert_julianday,yr,jday,mon,day
    month=string(mon,format='(i2.2)')
    nday=string(day,format='(i2.2)')
    date0=yr+month+nday+time
    print, 'starting from ',date0
    pos=strpos(file(0),'_'+instr+'_US.all.aod.gz')
    times=strmid(file,pos-13,11)
    part=where(times eq yr+jday+time,nfl)
    
    dir0=dir_smoke+yr+month+nday+'/'
    
    if nfl ne 1 then print,'Pattern_main_new4.pro: no AOD file found at '+time+'Z' $
    else if part(0) eq 0 then $
      print,'no previous AOD file can be found' $
      
    else begin
      infile=file(part)
      infile_last=file(part-1)
 
      origx=indgen(nx)*target_xs+target_xs*3/2
      origy=indgen(ny)*target_ys+target_ys*3/2
      maxnum=nx*ny
      
      move=lonarr(maxnum,2)-9999
      corr=fltarr(maxnum)-9999.0
  
      time_last=strmid(times(part-1),7,4)
      date_last=yr+month+nday+time_last
      if time_last gt time then begin  
        dir0=dir_last
        date_last=yr_last+month_last+nday_last+time_last
      endif
      
      find_smokegrid,date_last,dir0,nx,ny,origx,origy,nx_g,ny_g,$
                     target_xs,target_ys,temp,nsmoke,data_suffix

      if nsmoke eq 0L and part(0) gt 1 then begin
        
        print, 'no smoke grid found 30 minutes ago, search one hour ago...'
        
       ;added on Feb. 11,2008
        infile_last=file(part-2)
        time_last=strmid(times(part-2),7,4)
        
        if time_last gt time then begin
          dir0=dir_last
          date_last=yr_last+month_last+nday_last+time_last
        endif else date_last=yr+month+nday+time_last
        
        find_smokegrid,date_last,dir0,nx,ny,origx,origy,nx_g,ny_g,$
                       target_xs,target_ys,temp,nsmoke,data_suffix

      endif  ;if nsmoke eq 0L and part(0) ge 1 
      
      if nsmoke eq 0L then begin
        print,'no smoke grid found within past 60 minutes' 
      endif else begin
        
        print,'find pattern at -- ',date_last

        aod0=read_GASP_sca_loose(infile,nx_g=nx_g,ny_g=ny_g,bsca=sca_ang0)
        aod=read_GASP_sca_loose(infile_last,nx_g=nx_g,ny_g=ny_g,bsca=sca_ang)

        if screen eq 1 then begin
           if maxang ne '' then $
             ind=where((sca_ang0 le minang and sca_ang0 gt -998.0) or sca_ang0 ge maxang,cp) $
           else ind=where(sca_ang0 le minang and sca_ang0 gt -998.0,cp)
           if cp gt 0 then aod0(ind)=-9999.0

           if maxang ne '' then $
             ind=where((sca_ang le minang and sca_ang gt -998.0) or sca_ang ge maxang,cp) $
           else ind=where(sca_ang le minang and sca_ang gt -998.0,cp)
           if cp gt 0 then aod(ind)=-9999.0
        endif
        
        ind=where(glat gt -90. and glon gt -180.)

        for inum=0,nsmoke-1L do begin
          mini=temp(inum,0)
          minj=temp(inum,1)
          if mini ge origx(0) and minj ge origy(0) and $
             mini le origx(nx-1) and minj le origy(ny-1) then begin
            i1=(mini-target_xs/2) > 0
            i2=(mini+target_xs/2) < (nx_g-1)
            j1=(minj-target_ys/2) > 0
            j2=(minj+target_ys/2) < (ny_g-1)

            target=aod0(i1:i2,j1:j2)

            i1=(mini-target_xs) > 0
            i2=(mini+target_xs) < (nx_g-1)
            j1=(minj-target_ys) > 0
            j2=(minj+target_ys) < (ny_g-1)
            search=aod(i1:i2,j1:j2)

            find_move,target,search,glat,glon,outidx,$
                      target_xs=target_xs,target_ys=target_ys,$
                      mxcor=mxcor

            if outidx(0) ne -1 then begin
              move(inum,0)=(outidx(0)-target_xs/2+mini) $
                  > (origx(0)-target_xs/2) < (origx(nx-1)+target_xs/2)
              move(inum,1)=(outidx(1)-target_ys/2+minj)$
                  > (origy(0)-target_ys/2) < (origy(ny-1)+target_ys/2)
            endif else begin
              move(inum,0)=mini
              move(inum,1)=minj
            endelse

            corr(inum)=mxcor

          endif else begin ;if mini gt 0 and minj gt 0
            move(inum,0)=mini
            move(inum,1)=minj

          endelse
        endfor  ;for inum=0,num-1L do begin

        create_newimg,nx_g,ny_g,nsmoke,move,target_xs,target_ys,aod0,newaod

      endelse ;if nsmoke eq 0L 
      
    endelse ;if nfl ne 1 or part(0) eq 0 
    
  endelse ;if nfl0 eq 0 

end