; Searches for molecular signature
; sigs_pub.pam                                Bimal Rath   :  JAN 2003
;                        PARALLELIZED BY      ArDean Leith
;
; SEARCHES FOR MOLECULAR SIGNATURE (REFERENCE VOLUME) INSIDE A LARGE VOLUME. 
; WORKS FOR GLOBULAR AND ALSO NON-GLOBULAR REFERENCE VOLUMES. AN ISOTROPIC OR
; NON-ISOTROPIC MASK CAN BE USED AS A CHOICE. USED ALAN ROSEMAN'S FORMULATION 
; FOR LOCAL CROSS-CORRELATION COEFFICIENTS.(ULTRAMICROSCOPY 94, 225-236, 2003)
;
; PARALLEL USAGE:  current directory needs link to spider eg: 
;          ln -s /usr/local/spider/bin/spider_linux_mpfftw.27  spider
;
; SAMPLE PARALLEL USAGE : ./spider pam/dat @sigs_pub 0 &
;
; BE SURE BOTH VOLUMES HAVE SAME MAGNIFICATION (1 PIXEL = "N" NANOMETER) 

; READ INPUT SETTINGS
@sigs_settings[x12,x65,x66,x67,x74,x75,x76,x77,x78,x79,x83,x95,x39,x61,x64]


; PREPARE DIRECTORIES  
VM                   ; Dir. for output files - work, local, & output
mkdir -p [temp_work_dir]  [temp_local_dir]  [output_dir]

; RESIZE THE SMALL VOLUME INTO A ROTATION CUBE
FI x23,x24,x25          ; Small volume size
[SMALL_REF_VOLUME]
12,2,1

IF (X39 .EQ. 1) THEN 
   ; ASYMMETRIC MASK IS USED

   ; TEST IF THE THRESHOLD VALUE IS +VE. IT IS REQUIRED. OTHERWISE, THE PADDED 
   ; VOLUME WITH ZEROS OUTSIDE THE INSERTED SMALL_REF_VOLUME WILL CREATE 
   ; A MASK WHICH WILL NOT REPRESENT THE ACTUAL SHAPE OF THE MOTIF AS DESIRED 
   ; BY THE USER.
   IF (x83 .LE. 0) THEN
      VM
      echo "  "
      VM
      echo " ABORTING... RESCALE THE MOTIF SO THAT THE INPUT THERESHOLD (X83) WILL BE +VE !!"
      VM
      echo "  " 
      EN 
   ENDIF

   ; FIND THE DIAGONAL OF THE SMALL VOLUME
   x28 = INT(SQR ((X23 * X23) + (X24 * X24) + (X25 * X25)))


   x29=x28                 ; Y padded size
   x30=x28                 ; Z padded size

   x31=INT((x28-x23)/2)+1       ; X corner
   x32=INT((x29-x24)/2)+1       ; Y corner
   x33=INT((x30-x25)/2)+1       ; Z corner

   PD                     ; Pad small volume into cube for rotation
   [SMALL_REF_VOLUME]
   [PADDED_REF_VOLUME]
   (x28,x29,x30)          ; New size
   N                      ; Not average background
   0.0                    ; Background
   (x31,x32,x33)          ; Location for small ref volume inside pad
ELSE
   ; ROTATIONALLY INVARIANT MASK IS USED. EVEN THOUGH FOR ASYMMETRIC MASK
   ; THE REFERNCE VOLUME IS PADDED TO BE A CUBE AND THE ALGORITHM SHOULD WORK
   ; COMPUTATIONALLY, IT MAY GIVE INCORRECT RESULTS SINCE THE PADDED CUBE 
   ; IS A BIGGER CUBE (SIDE = DIAGONAL OF THE REFRENCE VOLUME). THE ROATATIONALY
   ; INVARIENT MASK'S DIAMETER IS DEPENDENT ON THE PADDED CUBE'S DIMENSION. SO, THE
   ; ACTUAL MASK WILL BE LARGER THAN THE MOTIF THAT THE USER SUPPLIES.
   ; IT IS REQUIRED THAT THE REFERENCE VOLUME BE A CUBE IF A ROTATIONALLY 
   ; INVARIANT MASK IS USED. THE MASK CREATED FOR THIS CASE WILL HAVE A DIAMETER EQUALS TO
   ; 4 PIXELS LESS THAN THE SIDE OF THE MOTIF.
   ; TEST IF THE INPUT MOTIF IS A CUBE
   IF ( X23 .EQ.  X24) THEN
      IF (X23 .EQ. X25) THEN
         cp
         [SMALL_REF_VOLUME]
         [PADDED_REF_VOLUME]
         GOTO LB8
      ENDIF
   ENDIF
   VM
   echo "  "
   VM
   echo "                            ABORTING...  INPUT MOTIF IS NOT A CUBE !!"
   VM
   echo "  " 
   EN 
   
ENDIF

LB8

; CREATE TEMP. FILES FOR SPEED-UP
SQ                    ; Square the volume
[LARGE_VOLUME]
_3

; DO FT ON SQUARE OF THE LARGE VOLUME
FT                    ; Fourier transform
_3
[LARGE_SQ_FT]
DE
_3

; DO FT ON LARGE VOLUME
FT                    ; Fourier transform
[LARGE_VOLUME]
[LARGE_FT]

; FINISHED PREPARING INPUT FILES -----------------------------  

VM
echo "Number of phi angles (parallel jobs): {****x79}"

DO LB4 x72 = 1,x79
  ; REMOVE SYNC FILES
  DE
  [DOC_FILE_OUT]_{****x72}

  ; COMMENCE EULER ANGLE SEARCH 
  VM
  publish "./spider $PRJEXT/$DATEXT @sigsloop {***x72} x72={***x72}" 
LB4 

; Wait for all jobs
x11=1
@wait_pub(x11,x79)

VM
echo "Finished search - Consolidate all doc files now."

EN
; OFTEN DOC. FILES ARE TOO LARGE TO USE THE FOLLOWING STEPS ----------

DOC COMBINE   ; Combine all the Renumbered doc files into one big file
[DOC_FILE_OUT]_****
1-x79
[PEAK_COMBINED]

DOC SORT      ; Sort the combined doc file
[PEAK_COMBINED]
[PEAK_COMBINED]_SORTED
7
Y           

EN

; If doc. files are too large, use the following steps ----------
; cat *OUT* > jnkbig  
; sort -nr -k 9 jnkbig > jnksort 
; uniq.perl < jnksort > ryr6_sort.dat
; spider pam/dat @circle
; spider pam/dat @number
; spider pam/dat @window 2
; scp volmark.dat leith@samar.wadsworth.org:/usr5/leith/sig
;
;