; Computes the FSC
;
; SOURCE: deffsc.spi 
;
; PURPOSE: Divides the data set into two sets, the 
;             odd- vs even-numbered particles.
;          Computes odd and even half 3D reconstructions.
;          Computes the Fourier Shell Correlation for the overall reconstruction.
;
; I/O PARAMETERS AND FILES ARE SET HERE:
;
; --------------------- Parameters -----------------------------------

[r]      = -1        ; Radius of restored object (use -1 for 95% winsize / 2)
[lambda] = 0.2e-5    ; Lambda
[climit] = 0.0       ; Correction limit
[iters]  = 60        ; Iteration limit

; -------------------- Input files -----------------------------------

FR G
[params]../params                          ; Parameter file

FR G
[defgrps_lim]sel_group_cclim                ; Defocus groups selection file

FR G
[sel_particles]sel_particles_{***[grp]}    ; Particle selection files

FR G
[ali]../Alignment/dala01_{***[grp]}@****** ; Aligned particle images

FR G
[angles]../Alignment/align_01_{***[grp]}   ; Alignment parameter files

; -------------------------- Output files ---------------------------

FR G
[seleven]df{***[grp]}/seleven         ; Selection files for even-numbered particles (one for each defocus group)

FR G
[selodd]df{***[grp]}/selodd           ; Selection files for odd-numbered particles (one for each defocus group)

FR G
[volodd]df{***[grp]}/vol001_odd       ; Volume (one for each defocus group)

FR G
[voleven]df{***[grp]}/vol001_even     ; Volume (one for each defocus group)

FR G
[out]df{***[grp]}/doccmp001           ; Output doc file (one / defocus group)

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

MD
TR OFF                              ; Decrease results file output
MD
VB OFF                              ; Decrease results file output
MD 
SET MP 
0                                   ; 0 = use all available processors  

IF ([r] .EQ. -1) THEN
   UD 17,[winsiz]                   ; Key 17 = windowsize
   [params]
   [r] = INT( (0.95*[winsiz])/2.0 )
ENDIF

UD N,[numgrps]                      ; Find number of defocus groups
[defgrps_lim]                       ;                              (input)

; Create selection doc files for odd and even numbered particles ------
DO LB1 [numgrp]=1,[numgrps]         ; Loop over all defocus groups

   UD [numgrp], [grp],[numparts]    ; Get current group number 
   [defgrps_lim]                    ; Group selection file         (input)

   DE                               ; Delete the output file
   [seleven]
   DE                               ; Delete the output file
   [selodd]

   [oddeven] = -1
   [nodd]    = 0
   [neven]   = 0

   DO LB2 [part]=1,[numparts]       ; Loop over all particles

      UD IC,[part],[num]
      [sel_particles]               ;                    (input)

      IF ([oddeven].EQ.-1) THEN
         [neven] = [neven] + 1
         SD [neven],[num]
         [seleven]                  ;                     (output)
      ELSE
         [nodd] = [nodd] + 1
         SD [nodd],[num]
         [selodd]                   ;                    (output)
      ENDIF
      [oddeven] = -[oddeven]
   LB2

   SD E
   [seleven]                        ;                    (output)
   SD E
   [selodd]                         ;                    (output)
   UD ICE 
   [sel_particles]                  ;                    (input)
LB1

MY FL

DO LB3 [numgrp]=1,[numgrps]        ; Loop over all defocus groups

   UD [numgrp], [grp],[parts]      ; Get current group number 
   [defgrps_lim]                   ; Group selection file               (input)

   VM
   echo  ' 'Backprojecting group: {****[grp]}  Particles: {******[parts]}    

   ; Compute the odd half 3D reconstruction.
   BP RP, [niter]                 ; Gets number of iterations
   [ali]                          ; Template for input 2D image files       (input)
   [selodd]                       ; Selection doc file for input images     (input)
   [r]                            ; Radius of restored object
   [angles]                       ; Angles doc file                         (input)
   *                              ; Symmetries doc file (* = no symmetries) (input)
   [volodd]                       ; Reconstructed 3D volume                (output)
   [lambda],[climit]              ; Lambda, correction limit
   [iters],0                      ; Iteration limit, mode
   (.5,.5)                        ; Minimum, maximum
   (.5)                           ; Smoothing constant

   ; Compute the even half 3D reconstruction.
   BP RP, [niter]                 ; Gets number of iterations
   [ali]                          ; Template for input 2D image files       (input)
   [seleven]                      ; Selection doc file for input images     (input)
   [r]                            ; Radius of restored object
   [angles]                       ; Angles doc file                         (input)
   *                              ; Symmetries doc file (* = no symmetries) (input)
   [voleven]                      ; Reconstructed 3D volume                 (output)
   [lambda],[climit]              ; Lambda, correction limit
   ([iters],0)                    ; Iteration limit, mode
   (.5,.5)                        ; Minimum, maximum
   (.5)                           ; Smoothing constant
LB3

FR G
[tmp]tmpres89                     ; Temp doc file (deleted)

DO LB4 [numgrp]=1,[numgrps]       ; Loop over all defocus groups

   UD [numgrp], [grp],[parts]     ; Get current group number 
   [defgrps_lim]                  ; Group selection file               (input)

   DE
   [out]
   DE
   [tmp]

   RF 3 
   [voleven]                      ; First input volume              (input)
   [volodd]                       ; Second input volume             (input)
   (0.5)                          ; Ring width
   (0.2,2)                        ; Lower, upper scale factors
   C                              ; C = missing cone
   (90)                           ; Max. tilt angle
   (3)                            ; Factor for noise comparison
   [tmp]                          ; Doc file                        (output)

   DOC REN                        ; Renumber doc file keys
   [tmp]                          ; Doc file                        (input)
   [tmp]                          ; Doc file                        (output)

   UD N,[nkeys]                   ; Get number of keys in tmp file
   [tmp]

   ; Title for output doc file
   SD /    NORM'D FREQ    DPR        FSC        FSCCRIT     VOXELS
   [out]

   DO LB5 [key] = 1,[nkeys]
      UD [key],[v62],[v63],[v64],[v65],[v66]  
      [tmp]

      SD [key],[v62],[v63],[v64],[v65],[v66]
      [out]                        ;                      (output)
   LB5
   UD E
LB4

DE                                 ; Remove temp. file
[tmp]

VM
echo  ' '
    
EN
;