; Compute average values for the defocus groups
;
; PURPOSE : Compute average values for the defocus groups
;
; SOURCE:  spider/docs/techs/recon/newprogs/defavg.spi  
;
; ----------- Input files --------------

[defsort] = 'def_sort'  ; Doc file with:  micrograph,  defocus, def. group                                                                                                                       
 
; ----------- Output files --------------

[defavg]  = 'def_avg'    ; Doc file with: micrograph, defocus, def.group, def.grp.avg                                                                                                         

[order]   = 'sel_group'  ; Doc file with: def.group, avg.defocus                                                                                                                                    

; -------------------- END BATCH HEADER ----------------------------

MD                      ; Skip unnecessary output 
VB OFF
MD                      ; Skip unnecessary output 
TR OFF

DE                      ; Delete output doc file
[defavg]
DE                      ; Delete output doc file
[order]

; -------------------------------------------------
; Creates a temporary doc file,
; listing average defocus for each defocus group.

[tmp1] = 'jnktmpavg501'
DE
[tmp1]

[tmp2] = 'jnktmpavg502'
DE
[tmp2]

UD N [nummics]                 ; Get total number of micrographs
[defsort]

VM
echo ' 'Computing average defocus values from: {******[nummics]} micrographs

[sum]     = 0   ; Sum
[num]     = 0   ; No. in group
[avg-def] = 0   ; Group average
[keyout]  = 1

DO [key] = 1,[nummics]   ; Loop over number of micrographs

   ; Regs:    mic#,  defocus,  group
   UD [key], [mic], [defocus], [grp]
   [defsort]

   IF ([grp].EQ.[keyout]) THEN
      [sum] = [sum] + [defocus]
      [num] = [num] + 1
   ELSE
      [avg-def] = [sum] / [num]
      SD [keyout], [avg-def]
      [tmp1]

      [sum]    = [defocus]
      [num]    = 1
      [keyout] = [keyout] + 1
      
   ENDIF
ENDDO

; Now compute the df avg. for the last group
[avg-def] = [sum] / [num]

SD [keyout], [avg-def]
[tmp1]  

;VM
;echo ' 'Group: {****[keyout]}  Average defocus: {******[avg-def]}

UD E                     ; Finished with [defsort] use finished

SD E                     ; Finished doc file writing
[tmp1]                   ; Doc file

; -------------------------------------------------
; Now read the input doc file, and write out the same
; information, adding the averages from the temporary file.
; Then sort by micrograph number.

VM
echo ' 'Sorting groups by average defocus value

UD N  [nummics]          ; Get number of group lines
[defsort]

DO [key] = 1,[nummics]
   ; Get     mic#,   defocus,  group
   UD [key], [mic], [defocus], [grp]
   [defsort]             ; Doc file        (input)

   UD E                  ; Finished with: [defsort]

   UD [grp], [avg-def]   ; Get group average
   [tmp1]                ; Doc file       (temp. input)

   UD E                  ; Finished with: [tmp1]

   SD [key], [mic], [defocus], [grp], [avg-def]
   [tmp2]               ; Doc file       (temp. output)
ENDDO

DE                      ; Finished with this doc file
[tmp1]                  ; Doc file

DOC SORT                ; Sort by micrograph number
[tmp2]                  ; Doc file           (input)
[tmp1]                  ; Doc file           (output)
1                       ; Sort col.
Y                       ; Renumber

VM
echo ' 'Listing micrographs by defocus group

; Create column labels
SD /      micrograph  defocus    def.group   def.grp.avg
[defavg]               ; Doc file           (output)

DO [key] = 1,[nummics]
   UD [key], [mic],[defocus],[grp],[avg-def]
   [tmp1]              ; Doc file      (temp. input)

   SD [key], [mic],[defocus],[grp],[avg-def]
   [defavg]            ; Doc file      (output)
ENDDO

UD N [max-key]         ; Max key in doc file
[tmp2]                 ; Doc file      (temp input)

; Create other output doc files
SD /   DEFOCUS_GROUP   AVG.DEFOCUS
[order]                ; Doc file      (output)

[keyt]=1
UD [keyt], [mic],[defocus],[prev-grp],[avg-def]
[tmp2]                 ; Doc file      (temp input)

SD [keyt], [prev-grp],[avg-def]  
[order]                ; Doc file      (output)

[key]=2
DO [keyt] = 2,[max-key]
   UD [keyt], [mic],[defocus],[grp],[avg-def]
   [tmp2]

   IF ([grp].NE.[prev-grp]) THEN
      SD [key], [grp],[avg-def]
      [order]         ; Doc file      (output)

      ;VM
      ;echo ' 'Group: {******[grp]} Defocus:{********[avg-def]}

      [key] = [key] + 1

   ENDIF

   [prev-grp] = [grp]
ENDDO

; Delete temporary files
UD E                 ; Finished with : [tmp1]
DE
[tmp1]
UD E                 ; Finished with :[tmp2]
DE                   ; Finished with :
[tmp2]

VM
echo ' '

EN
;