; Fixes refinement if a group(s) is missing
;
; SOURCE: spider/docs/techs/recon/newprogs/pub_fixrefine.pam
;         New                                   Sep 2004  ArDean Leith 
;         [var]                                 Dec 2005  ArDean Leith
;         [pixsiz],fsc                          Aug 2012  ArDean Leith
;
; PURPOSE: Fix refinement for missing defocus groups
;
; Files are set in: refine settings refine settings.pam)
;
; INPUT REGISTERS: None
;
; '##' denotes iteration,  '##+' denotes next iteration, and '***' denotes group
; INPUT FILES:
;    input/data***@        [unaligned_images]   Unaligned stacked image file  
;    input/dala##_***@     [aligned_images]     Aligned stacked image files
;    input/align##_***     [group_align]        Original alignment parameters 
;    input/undone_select   [undone_select]      Group selection doc. file
;    input/vol##           [initial_vol]        Initial volume
;    final/vft##           [vft_for_iter]           
;    input/params          [params]             Reconstruction parameters file         
;
; OUTPUT FILES 
;    final/vol##+          [next_vol]           Final output volume for each iter.
;    final/align##+_***    [next_group_align] 
;    final/fscdoc##+_***   [next_group_fsc]     Resolution doc. file
;    jnkdoc***                                  Sync doc file from pubsub tasks
;
; PROCEDURES CALLED:
;    refine_settings          refine_settings.pam
;    publish                  publish
;    ... pub_refine_start      pub_refine_start          
;    ....... refine_settings  refine_settings.pam            
;    ....... grploop          grploop.pam            
;    ....... smangloop        smangloop.pam            
;    ....pub_refine_doc_sync  pub_refine_doc_sync.pam
;    pub_refine_wait          pub_refine_wait.pam
;    mergegroups              mergegroups.pam
;
; -------------------------------- Edit this data --------------------------

 [iter]    = 15    ; Iteration (Set this)
 [rn]      = 7498  ; random number appended to jnkdocparamout*** files
 [task]    = 0     ; Pub_starter selector flag 
 ;                 ; (0 for regular refinement, 1 for small-angle, 2 for endmerge)

 ;[winsize] = 155 ; Image size (Set this) 
 ; (PARAMS sets this?)

 FR G
   [temp_jnkdoc]jnkdocparamout{***[grp]}_{****[rn]}   ; For existing and output files
 ;FR G      ; Output selection file containing list of groups to be run in reg. 1
 ;[undone_select]undone

; ---------------------------------------------------------------------

 MD
   TR OFF   ; Loop info turned off
 MD
   VB OFF   ; File info turned off

 ; Get global parameters (x41 & x42 depend on [iter]) & set filenames
 @refine_settings([pixsiz],[r2],[alignsh],[prj-radius],[iter1],[iter-end],[lambda],[small-ang],[winsize])

 [next-iter] = [iter] + 1

 ;[undone-counter] = 0

 FT                         ; Fourier on volume 
   [current_vol]              ; Volume produced by previous iter.   
   [iter_vft]                 ; Used by all groups on this iter. in xoop - vft

 RR S [ampenhance]          ; Amplitude enhancement reg. setting (varies with iteration)
   [amp-enhance-flags]
   [iter]

 UD N [num-grps]           ; Find number of defocus groups              
   [sel_group]             ; WAS [undone_select]

 ;[task] = [small-ang]      ; Pub_starter selector flag

 ; Process all defocus groups in parallel
 DO  [grp-key] = 1,[num-grps]
   ;UD IC i,[grp]        
   ;   [undone_select]
   UD IC [grp-key],[grp]  ; Get this defocus group number
     [sel_group]
   
   DE
     [temp_jnkdoc]  ; WAS jnkdocparamout{***[grp]}_{****[rn]}

   ; Check for FSC curves
   IF([task].lt.2) then   ; For regular/small-angle refinement
      IQ FI [fsc-exists]
        [next_group_fsc]
   ELSE                   ; For endmerge
      IQ FI [fsc-exists]
        [next_group_ofsc]
   ENDIF
   
   MY FL
   
   ; If FSC curve doesn't exist, note down group# and start refinement
   IF([FSC-EXISTS] == 0) THEN
      ;[undone-counter] = [undone-counter] + 1
      ; SD [undone-counter], [grp]
      ;   [undone_select]
      
      SYS
        publish './spider pam/$DATEXT @pub_refine_start {***[grp]} task={*[task]} iter={**[iter]} grp={**[grp]} rn={****[rn]}' 
      
   ; Create a jnkdoc file
   ELSE
      ;[stop] = 0   ; dummy register
      UD -2,[percent-greater]
        [next_group_align]            ; Alignment parameter doc file     (input)
      UD E
      
      [stop] = [percent-greater]* 100
      
      ; Create a placeholder for PUB_REFINE_WAIT
      @pub_refine_doc_sync([task],[stop],[grp],[rn])
   endif
 ENDDO

 ; close docs
 UD ICE
   [sel_group]
 ;sd e
 ;[undone_select]

 ;SYS
 ;echo "Waiting for iteration: {**[iter]}"
 MY FL                    ; Flush results file

 DE                       ; Delete existing iterations Fourier vol.
   [iter_vft]                 

 ;  Wait for all subscribers to finish grploop, returns [num-big]
 [task] = 0               ; When [task]=0, pub_refine_start starts: grploop
 @pub_refine_wait([task],[num-big],[num-grps],[iter],[rn])

 ; [num-big] returns number of groups having excessive changes
 ; (this is summed in: pub_refine_wait)
 SYS
   echo " After pub_refine_wait, Excessive changes in: {***[num-big]} groups"

 SYS
   echo "Merging groups now"
 MY FL   ; flush results

 ; Consolidate data for CTF corrections
 IF([task].LT.2) THEN   ; for regular/small-angle refinement
   @mergegroups([pixsiz],[iter],[ampenhance],[r2])
 else
   @endrefine([r2],[pixsiz],[iter])    
 endif

 SYS
   echo "Alignment finished for iteration: {***[iter]}"

 EN
;