; Controls serial reconstruction refinement
;
; SOURCE: spider/docs/techs/recon/newprogs/refine.pam    
;         New                              ArDean Leith Nov 2000
;         Rewritten                        ArDean Leith Mar 2004
;         [] variables                     ArDean Leith Dec 2005
;         Ampenhance                       ArDean Leith May 2006
;         More stacks                      ArDean Leith Dec 2006
;         Small angles limits              ArDean Leith Oct 2010
;         pixsiz, resol headers,r2,...     ArDean Leith Aug 2012
;         [n-big]                          ArDean Leith Apr 2015
;
; PURPOSE: Controls serial reconstruction refinement 
;
; I/O Registers and files are set in: refine settings.pam
;
; INPUT REGISTERS:
;   [pixsiz]                 Pixel size 
;   [r2]                     Radius of object
;   [alignsh]                Shift allowed is +- this value
;   [prj-radius]             Radius of object for projection
;   [iter1]                  Starting iteration
;   [iter-end]               Ending   iteration
;   [lambda]                 Lambda (A)            (Used in prepare)
;   [small-ang]              Small angle refinement flag (1 is true) 
;
; INPUT FILES:
;   [params]                ../params                             Input params file  
;   [vol_orig]              ../Reconstruction/vol01               Input volume file  
;   [sel_group_orig]        ../Reconstruction/sel_group_cclim     Group selection file
;   [sel_particles_orig]    ../Reconstruction/sel_particles_***   Particle selection files 
;   [group_align_orig]      ../Alignment/align_01_***             Alignment parameter files 
;   [unaligned_images]      ../Alignment/data***                  Original unaligned images stack
;
; PROCEDURES CALLED:
;    refine_settings          refine_settings.pam
;    prepare                  prepare.pam
;
;    grploop                  grploop.pam    OR           
;    smangloop                smangloop.pam            
;
;    mergegroups              mergegroups.pam
;    ... enhance (optional)   enhance.pam
;    endmerge                 endmerge.pam
; 
;    endrefine                endrefine.pam  
;
; ---------------------------------------------------------------------

 MD
   TR OFF                     ; Loop info turned off
 MD
   VB OFF                     ; File info turned off
 MD
   SET MP                     ; Use all available OMP processors
   0

 ; Input initial parameters & file names
 @refine_settings([pixsiz],[r2],[alignsh],[prj-radius],[iter1],[iter-end],[lambda],[small-ang],[winsize])

 ; Redefine [temp_local_dir] location to current work directory for non-PubSub run
 GLO [temp_local_dir] = '[temp_work_dir]'

 IF ([iter1] <= 1) THEN
   ; Prepare input files (only needs to be done once) 
   @prepare([pixsiz],[lambda],[iter1])

   SD /     ITERATION       GROUP        RESOLUTION 
     [iter_resol]          ; Resolution doc file               (output)
   SD /     ITERATION       GROUP        RESOLUTION 
     [grp_resol]           ; Resolution doc file               (output)
 ENDIF


 MY FL

 UD N [num-grps]            ; Get number of defocus groups
   [sel_group]              ; Group selection doc file         (input)

 DO [iter]=[iter1],[iter-end] ; Loop over all iterations ----------------------------------

   RR S [ampenhance]       ; Amplitude enhancement flag (varies with iteration)
     [amp-enhance-flags]   ; Global string variable
     [iter]

   FT                      ; Fourier on volume 
     [current_vol]         ; Volume produced by previous iter. (input)  
     [iter_vft]            ; For all groups on this iter.      (output)

   DE
     [iter_refangs]        ; Reference angles doc file         (removed)

   ; Create reference angle doc file for this iteration 

   IF ( [small-ang] == 0 ) THEN  

      ; For normal angle refinement
      RR S [ang-step]
        [ang-steps]        ; Angular step for projection angle  (varies with iteration)
        [iter]

      VO EA [num-angles]   ; Sets [num-angles] to number of reference projections
        [ang-step]         ; Theta angular step          (varies with iteration)
        0, 90              ; Theta range, 90 is for use with 'Check Mirrored Positions'
        0, 359.9           ; Phi range
        [iter_refangs]     ; Reference angles doc file       (output)

      RR S [ang-limit]     ; Restriction on angular search   (varies with iteration)
        [ang-limits]
        [iter]
   ELSE                    ; Small angle refinement

      ; For Small angle refinement
      VO EA [num-angles]   ; Sets [num-angles] to number of reference projections
        [ang-step-sm]      ; Theta angular step     
        0, [theta-range]   ; Theta range 
        0, 359.9           ; Phi range
        [iter_refangs]     ; Reference angles doc file       (output)
   ENDIF

   ; Process all defocus groups one by one
   [n-big]    = -1
   [ntot-big] = 0
   [ntot]     = 0

   DO [i]=1,[num-grps]
      UD S [i],[grp],[n-part] ; Get defocus group number from list  
        [sel_group]           ; Group selection file         (input)

      SYS
        echo -n " Processing group: {%I0%[grp]}   " ; date  '+ TIME: %x  %X'
      MY FL                ; Flush results file
 
      ; Run main refinement loop task
      IF ( [small-ang] == 0 ) THEN        ; Runs normal refinement loop
         @grploop([ang-step],[ang-limit],[r2],[alignsh],[prj-radius],[iter],[grp],[n-big],[pixsiz])
         [ntot-big] = [ntot-big] + [n-big]
         [ntot]     = [ntot] + [n-part]
      ELSE
         @smangloop([r2],[alignsh],[prj-radius],[iter],[grp],[pixsiz])
      ENDIF

      MY FL                ; Flush results file
   ENDDO
   UD E                    ; Finished with incore doc file

   IF ( [n-big] > 0 ) THEN
     [per-big] = INT([ntot-big] / [n-big])

     SYS
       echo " Iteration: {%I0%[iter]}   Images with large proj. ang. changes: {%I0%[per-big]}%"
   ELSE
     SYS
       echo " Iteration: {%I0%[iter]}"
   ENDIF

   ; Consolidate data for CTF corrections
   @mergegroups([pixsiz],[iter],[ampenhance],[r2])

   DE                       ; Delete vft file.
     [iter_vft]             ; Current iteration Fourier vol   (removed)

   MY FL                    ; Flush results file
 ENDDO

 SYS
   echo ; echo -n " Alignment halting after iteration: {%I0%[iter]}  " ; date '+ TIME: %x  %X' ; echo 

 DO [i]=1,[num-grps]     
   UD IC [i], [grp]         ; Get defocus group number from list
     [sel_group]            ; Group selection doc file         (input)

   @endmerge([prj-radius],[grp],[iter],[pixsiz],[r2])

 ENDDO

 UD ICE                     ; End doc file 'UD IC' use
  [sel_group]               ; Group selection doc file        (finished)


 ; Prepare final resolution files
 @endrefine([r2],[pixsiz],[iter])    

 SYS
   echo  ; echo -n  " FINISHED REFINEMENT    " ; date '+ TIME: %x  %X'

 EN

;