; Normalizes stacks and creates star file
 ;
 ; PURPOSE: Converts Relion data 'star' file into set of SPIDER alignment files.
 ; SOURCE:  relion_star_to_align.spi  
 ; USAGE:   spider spi/dat @relion_star_to_align
 ;
 ; POSSIBLE COLUMNS CORRESPONDING TO STANDARD RELION STAR DATA DESCRIPTORS
 ;         _rlnImageName             #7    Image name sometimes contains 2 integer strings for image                  
 ;         _rlnOriginX               #12   X-shift
 ;         _rlnOriginY               #13   Y-shift
 ;         _rlnAngleRot              #9    Rot
 ;         _rlnAngleTilt             #10   Tilt
 ;         _rlnAnglePsi              #11   Psi
 ;         _rlnClassNumber           #14   Class #
 ;
 ; ----------------- Variables    -----------------------

 ! No need to alter these variables when using standard Relion data files
 [star_vars]     = '_rlnOriginX,_rlnOriginY,_rlnAngleRot,_rlnAngleTilt,_rlnAnglePsi,_rlnClassNumber'
 [star_img_name] = '_rlnImageName'

 [iter]          = 10                                         ; Set Relion iteration number

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

 [indir]         = '.'

 [star]          = '[indir]/classify_it{***[iter]}_data.star' ; Star iteration data file (one) 

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

 [outdir]        = 'input'

 [star_doc]      = '[outdir]/star_doc_{**[iter]}'           ; Temp doc file without alphabetical chars  (one)

 [align_doc]     = '[outdir]/ali_doc'                       ; Overall alignment file        (one)

 [align_grp_doc] = '[outdir]/ali_doc_***'                   ; Group alignment file          (one/group)

 [sel_grp]       = '[outdir]/sel_grp'                       ; Group selection file    (one)

 [sel_part]      = '[outdir]/sel_part_{**[grp]}'            ; Particle selection file (one/group)

! Unused examples for use with Relion classified data
![class]         = 4                                                       ; Image class desired    
![star]          = '[indir]/class{*[class]}_only_it{***[iter]}_input.star' ; Star class data file  (one) 
![align_doc]     = '[outdir]/ali_doc_{**[class]}'                          ; Class alignment file  (one)
![align_grp_doc] = '[outdir]/ali_doc_{**[class]}_***'                      ; Group alignment file  (one/group)

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

 MD
   VB OFF                       ; Decrease results file output

 DE                             ; Delete existing output file
    [star_doc]
 DE                             ; Delete existing output file
    [align]
 
 ; Convert Relion 'star' file into a temporary SPIDER doc file ------------------
 ;    Need to import: [n],[grp], [xsh],[ysh],[s_rot],[s_tilt],[s_psi],[class]
 ;    From: '_rlnOriginX,_rlnOriginY,_rlnAngleRot,_rlnAngleTilt,_rlnAnglePsi,_rlnClassNumber'
    
 XM S2D [nkeys)                 ; Convert star file to doc file 
    [star]                      ; Star file                     (input)
    [star_vars]                 ; Star variables wanted
    3,4,5,6,7,8                 ; SPIDER doc file registers
    [star_img_name]             ; Star file name variables wanted
    1,2                         ; Spider doc file registers from name
    [star_doc]                  ; Spider doc file              (output)

 SYS
   head [star_doc].*


 ; Initialize unused alignment file variables 
 [PSI]    = 0
 [REF]    = 0
 [DIFF]   = 0 
 [CCROT]  = 0
 [ROTT]   = 0 
 [SXT]    = 0 
 [SYT]    = 0
 [MIR-CC] = 0   

 ; Loop over all doc file lines originating from star file ------------------
 DO                                

   ; Get input line from star file
   UD NEXT [key], [n],[grp], [xsh],[ysh],[s_rot],[s_tilt],[s_psi],[class]    
     [star_doc]                 ; Spider star doc file   (input)
   IF ( [key] <= 0 ) EXIT

   ; Only want one specified class from the star file
   !IF ( [class] .NE. [class] ) CYCLE

   ; Set alignment doc file values 
   [KEY]  = [n]                 ; Will have duplicates of keys!
   [EXP]  = [n]                 ; Exp. image number
   [GRP]  = [grp]               ; Exp image group 

   [THE]  = [s_tilt]            ; Projection angle: theta
   [PHI]  = [s_rot]             ; Projection angle: phi

   [ROT]  = -[s_psi]            ; RTSQ rot with PSI = 0 & matrix inversion shifts

   ; Matrix inversion needed since: rotate then shift in SPIDER is opposite Relion's

   [SX]   = [xsh]               ;                                       
   [SY]   = [ysh]               ;                      
   [ROT]  = 0                   ; 
   [PSI]  = [s_psi]             ;                                                          

   SD [KEY],[PSI],[THE],[PHI],[REF],[EXP],[ROT],[SX],[SY],[GRP],[DIFF],[CCROT],[ROTT],[SXT],[SYT],[MIR-CC]
     [align_doc]

 ENDDO

 UD NEXT E                      ; End alignment doc file construction
   [align_doc]                  ; Doc file              (closed)


 !SYS
   !cat [align_doc].*

 ; Separate the alignment file by group into multiple doc files -------------------------------
 DOC SEP [maxgrp]
   [align_doc]                  ; Doc file                (input)
   9                            ; Register for separation = group number 
   [align_grp_doc]              ; Group align doc file template  (output)
   KEY       PSI,    THE,    PHI,   REF#,    EXP#,  CUM. ROT,   SX,    SY,    GRP,   DIFF,  CCROT,     ROT,     SX,     SY,   MIR-CC ; Doc file header'
   [sel_grp]                    ; Group selection file
                                 

 ; Renumber keys of the group alignment doc files --------------------------------------------
 DO [grp] = 1,[maxgrp]
   IQ FI [ex]
   [align_grp_doc][grp]         ; Group align doc file template  (input)

   IF ( [ex] > 0 ) THEN

     ; Consecutively renumber doc file keys & move original key to the first register --------
     DOC KEY ONE
       [align_grp_doc][grp]     ; Group align doc file         (input)
       [sel_part]               ; Particle selection doc file  (input)

     !SYS
     !  cat [sel_part].$DATEXT   
   ENDIF

 ENDDO

 EN