; Compute average values for the defocus groups
;
; PURPOSE : Compute average values for the defocus groups
;
; SOURCE:  defavg.spi  
;
; ----------- Input files --------------

FR G
[defsort]def_sort       ; Doc file with defocus groupings
; /     MICROGRAPH  DEFOCUS    DEF.GROUP                                                                                                                       
 
; ----------- Output files --------------
FR G
[defavg]def_avg         ; Doc file with defocus averages
; /     MICROGRAPH  DEFOCUS    DEF.GROUP   DEF.GRP.AVG                                                                                                         

FR G
[order]order_defgrps    ; Another doc file with defocus averages
; /    DEFOCUS_GRP  AVG.DEFOCUS                                                                                                                                    

FR G
[dat_grp]dat_group      ; Another doc file with defocus averages
; /  KEY:DEFOCUS_GRP  AVG.DEFOCUS                                                                                                                                    

FR G
[dat_mic]dat_mic        ; Doc file with micrograph data
; /  KEY:MICROGRAPH   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]
DE                      ; Delete output doc file
[dat_grp]               ; 

; -------------------------------------------------
; This first part creates a temporary doc file,
; listing the average defocus for each defocus group.

FR G
[tmp1]tmpavg501
DE
[tmp1]
FR G
[tmp2]tmpavg502
DE
[tmp2]

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

;     Regs:    mic#, defocus, group                                                                                                                       
;UD [nummics], [dum],[dum1],[max-grp]
;[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)

VM
echo ' 'Creating: {*****[nummics]}   micrograph data files

; Create other output doc files
SD /   DEFOCUS_GROUP   AVG.DEFOCUS
[order]                ; Doc file      (output)
SD /   AVG.DEFOCUS
[dat_grp]              ; Doc file      (output)
SD /     DEFOCUS
[dat_mic]              ; 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)
SD [prev-grp], [avg-def]    
[dat_grp]              ; Doc file      (output)
SD [mic], [defocus]       
[dat_mic]              ; Doc file      (output)


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

   SD [mic], [defocus]
   [dat_mic]           ; Doc file     (output)

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

      SD [grp], [avg-def]
      [dat_grp]       ; 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 D
;