;
; new_sigs_pub.pam NEW JAN 2003 Bimal Rath ; PARALLELIZED BY ArDean Leith ; REWRITTEN JUL 2008 ArDean Leith ; IMPROVED JAN 2011 ArDean Leith ; ; PURPOSE: Searches for molecular signature (motif) inside a large search volume. ; Works for globular and also non-globular motif volumes. Either an isotropic ; or non-isotropic mask can be used. Uses Alan Roseman's formulation ; for local cross-correlation coefficients. (Ultramicroscopy 94, 225-236, 2003) ; ; PUBSUB USAGE: Current directory needs to contain copy of: SPIDER executable e.g.: ; cp /usr8/spider/bin/spider?? spider ; ; SAMPLE USAGE : ./spider spi/dat @new_sigs_pub 0 & ; ; Be sure both volumes have same magnification (1 PIXEL = "N" NANOMETERS) ; Read input variables and file names @new_sigs_settings([n],[phi0],[the0],[psi0],[phid],[thed],[nphi],[nthe],[psin],[mskval],[peaks],[msktype]) ; Prepare directories VM ; Dir. for output files - work, local, & output mkdir -p [temp_work_dir] [output_dir] ; Find size for resizing motif volume FI H [x],[y],[z] ; Get motif vol size [MOTIF_VOL] ; Motif vol (input) NSAM,NROW,NSLICE ; Header: 12,2,1 IF ([msktype] .EQ. 1) THEN VM echo " Using rotationally varying mask: {***[x]} x {***[y]} x {***[z]}" ; Test if the threshold value is +ve. Otherwise, the padded vol with ; outside the inserted motif_vol will create a mask which will not ; represent the actual shape of motif as desired by the user. IF ([mskval] .LE. 0) THEN VM echo " HALTING. RESCALE MOTIF SO INPUT THERESHOLD ([mskval]) WILL BE +VE !!" EN ENDIF ; Find diagonal of the motif volume [diag] = INT(SQR (([x] * [x]) + ([y] * [y]) + ([z] * [z]))) [xc]=INT(([diag]-[x])/2)+1 ; X corner [yc]=INT(([diag]-[y])/2)+1 ; Y corner [zc]=INT(([diag]-[z])/2)+1 ; Z corner vm echo ' Motif pad corner:' {***[xc]},{***[yc]},{***[zc]} vm echo ' Motif padded size:' {***[diag]},{***[diag]},{***[diag]} PD ; Pad motif vol into cube for rotation [MOTIF_VOL] ; Motif (input) [CUBE_MOTIF_VOL] ; Cubic motif (output) ([diag],[diag],[diag]) ; New size N ; Not average background 0.0 ; Background ([xc],[yc],[zc]) ; Location for motif inside pad ; Threshold motif vol to make a mask. ; Threshold value needs to be set for each specific motif vol TH M ; Threshold to create mask [CUBE_MOTIF_VOL] ; Cubic motif (input) [MOTIF_MASK] ; Cubic motif mask vol (output) B ; Voxels below [mskval] set = 0 [mskval] ; Threshold level fi h [min],[max] [MOTIF_MASK] fmin,fmax vm echo ' Motif mask:',{%f9.6%[min]} .... {%f9.6%[max]} ; Create FFT of search vol, & search vol squared LO I ; Padded FFT creation S ; For FFTs of search vol [SEARCH_VOL] ; Large search vol (input) [SEARCH_VOL_FFT] ; FFT of search vol (output) [SEARCH_VOL_SQ_FFT] ; FFT of search vol sq. (output) ELSE ; Rotationally invariant mask used. Even though for asymmetric mask ; the motif vol is padded to 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 motif vol). The rotationally ; 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 necessary that the motif vol be a cube if a rotationally ; invariant mask is used. The mask created for this case will have a diameter ; equal to 4 pixels less than the side of the motif. VM echo " Using rotationally invariant mask: {***[x]} x {***[y]} x {***[z]}" IF ( [x] .NE. [y]) THEN VM echo " HALTING... INPUT MOTIF MUST BE A CUBE!" EN ELSEIF ( [x] .NE. [z]) THEN VM echo " HALTING... INPUT MOTIF MUST BE A CUBE!" EN ENDIF CP ; Motif is already a cube [MOTIF_VOL] ; Motif (input) [CUBE_MOTIF_VOL] ; Cubic motif file (output) ; Create spherical mask for motif [r] = ([x]/2) - 2 ; Radius of the mask sphere [c] = ([x]/2) + 1 ; Center MO 3 ; Make vol [MOTIF_MASK] ; Spherical mask file (output) [x],[x],[x] ; Size SP ; Sphere N ; No (1.0) ; Mask density [r],0.0 ; Outer & inner radii [c],[c],[c] ; Center (0,0,0) ; End of sphere making loop ; Create FFT of search vol, search vol squared, & motif mask LO I ; Padded FFT creation for motif location B ; FFTs of search vol & mask [SEARCH_VOL] ; Large search vol (input) [SEARCH_VOL_FFT] ; FFT of search vol (output) [SEARCH_VOL_SQ_FFT] ; FFT of search vol sq . (output) [MOTIF_MASK] ; Spherical mask file (input) [MOTIF_MASK_FFT] ; FFT of mask vol (output) ENDIF FI H [x],[y],[z] ; Get search vol size [SEARCH_VOL] ; Search vol (input) NSAM,NROW,NSLICE ; 12,2,1 VM echo " Search volume: {***[x]} x {***[y]} x {***[z]}" ; Finished preparing input files ----------------------------- VM echo " Number of phi angles (parallel jobs): {****[nphi]}" MY FL DO [num] = 1,[nphi] ; Remove output doc files DE [DOC_FILE_OUT] ; Commence Euler angle search VM publish "./spider $PRJEXT/$DATEXT @new_sigsloop {***[num]} num={***[num]}" !/usr8/spider/bin/spider_linux_mp_opt64_10u $PRJEXT/$DATEXT @new_sigsloop {***[num]} num={***[num]} ENDDO ; Wait for all jobs MY FL [phase] = 1 @wait_pub([phase],[nphi]) [SYNC_DOC_BASE] VM echo " "; echo " Finished search --- Consolidating doc files now."; echo " " ; Often doc. files are too large to use the following steps ---------- DO [num]=1,[nphi] DOC REN ; Renumber all keys (IMPORTANT) [DOC_FILE_OUT] ; Doc file (input) [DOC_FILE_OUT] ; Doc file (output) ENDDO DOC COMBINE ; Combine all doc files into one large file [DOC_FILE_OUT_T] ; Doc file stem list (input) 1-[nphi] ; Doc file numbers [PEAK_COMBINED] ; Combined list (output) DOC SORT ; Sort the combined doc file [PEAK_COMBINED] ; Unsorted list (input) [PEAK_COMBINED]_SORTED ; Sorted list (output) -7 ; Descending sort by col: 7 Y ; Compress and renumber keys VM echo " "; echo " Finished consolidating all doc files."; echo " " UD S 1,[v1],[v2],[v3],[v4],[v5],[v6],[cc] [PEAK_COMBINED]_SORTED VM echo " Top CC VALUE: {%f8.2%[cc]} "; echo " " EN ; If doc. files are too large, use the following steps ---------- ; cat output/*OUT* >! jnkbig ; sort -nr -k 9 jnkbig >! jnksort ; uniq.perl < jnksort >! jnk_sort.dat ; cat jnk_sort.dat ; spider pam/dat @circle ; spider pam/dat @number ; spider pam/dat @window 2 ;