; NOTE : CHANGED 'PK 3D' to 'PK 3R' READ COMMENTS BELOW 'PK 3R' OPERATION ; : ADDED MASK TO RESTRICT THE PEAK SEARCH INSIDE THE MASK ONLY, LOOK ABOVE 'PK 3R' ; ;
; sigsloop.pam Bimal Rath : JAN 2003
; PARALLELIZED BY ArDean Leith
;
; SEARCHES FOR MOLECULAR SIGNATURE (REFERENCE VOLUME) INSIDE A LARGE VOLUME.
; BE SURE BOTH VOLUMES HAVE SAME MAGNIFICATION (1 PIXEL = "N" NANOMETER)
;
;;MD
;;VB OFF
MD
TR OFF
; get around the named variable related bug until Dean fixes it
;x72 = [Y72]
;x72
x72 ; Needed from startup line!!!!
; READ INPUT FILES AND REGISTERS
@sigs_settings[x12,x65,x66,x67,x74,x75,x76,x77,x78,x79,x83,x95,x39,x61,x64]
IF (x12 .GT. 1) THEN
MD
SET MP ; Set number of OMP processors
x12
ENDIF
; FIND NSAM, NROW AND NSLICE OF LARGE AND REFERENCE VOLUMES
FI x20,x21,x22 ; Large volume size
[LARGE_VOLUME]
12,2,1
x27 = INT(x20/2)+1 ; Center of large volume
x28 = INT(x21/2)+1
x29 = INT(x22/2)+1
FI x23,x24,x25 ; Small volume size
[PADDED_REF_VOLUME]
12,2,1
x26 = x23*x24*x25 ; Number of pixels in small volume
x33 = INT(x23/2)+1 ; Center of small volume
x34 = INT(x24/2)+1
x35 = INT(x25/2)+1
x86 = x20-x23+1 ; big-small image size
x87 = x21-x24+1
x88 = x22-x25+1
x36 = INT((x20-x23)/2)+1 ; Corner of small image inserted into center of big
x37 = INT((x21-x24)/2)+1
x38 = INT((x22-x25)/2)+1
WI ; Window
[MASK_PKR] ; Peak restricting mask
_50 ; Output volume
x86,x87,x88 ; Difference size
x33,x34,x35 ; 1/2 size of padded reference volume
x97 = 0 ; Doc. file output line number
IF (x61 .NE. 1) THEN
; NONTOMOGRAPHIC VOLUME
; MAKE AN APPROPRIATE MASK FROM THE REFERENCE VOLUME
; THRESHOLD VALUE NEEDS TO BE CHANGED FOR EACH REFERENCE VOLUME
; NOTE: DON'T REUSE _1
TH M ; Threshold to create mask
[PADDED_REF_VOLUME]
_1 ; Output mask volume
B ; Voxels below x83 set = 0
x83 ; Threshold level
ENDIF
; EULER ANGLE SEARCH IS DONE HERE
; USED IN LOOP
x56 = x65 + (x72-1)*x74
DO LB5 x71 = 1, x78
x57 = x66+(x71-1)*x75
DO LB6 x70 = 1, x77
x58 = x67+(x70-1)*x76
; DO LOOP NUMBER
x90 = (x71-1)*x77 + x70
IF (x61 .EQ. 1) THEN
; TOMO VOLUME
; ROTATE THE PADDED REFERENCE VOLUME
RT 3D
[PADDED_REF_VOLUME]
_55
x56,x57,x58
x69 = x33 - 2 ; Radius of the object minus 2 pixels
; CREATE PROJECTIONS FROM THE ROTATED PADDED REFERENCE VOLUME
PJ 3Q ; Create projection series
_55 ; Input vol
x69 ; Radius of the object
[SEL_DOC] ; EDIT desired selection file if necessary
[ANG_DOC] ; EDIT desired angles file if necessary
_56@*** ; Inline stack template
x64 ; # of images to be stored in the inline stack
x68 = 0.3 ; Frequency cut-off for Parzen Filter
x41 = 1 ; Begining of the Y-axis for reconstruction
; DO THE RECONSTRUCTION ON THE FLY OF THE OBJECT FROM THE PROJECTIONS
BP W2
_56@*** ; EDIT file prefix of aligned images if necessary
[SEL_DOC] ; EDIT desired selection file if necessary
[ANG_DOC] ; EDIT desired angles file if necessary
x69,x23 ; EDIT (image height/2 then minus 2), (desired recon. depth)
x41,x23 ; EDIT beginning and ending y-axis slices (max is image height)
x68 ; Frequency cut-off for Parzen Filter
_57 ; EDIT output filename if desired
ENDIF
IF (x39 .EQ. 1) THEN
; ASYMMETRIC MASK IS USED
IF (x61 .EQ. 1) THEN
; TOMOGRAPHIC VOLUME
FS x80,x81 ; Find max and min of pixel values
_57 ; Reconstructed refrence volume
x82 = (x81 - x80)/2
x82 = b82 + x80 ; Thershold is halfway between max and min of pixel values
; THRESHOLD THE RECONSTRUCTED VOLUME
; NOTE: DON'T REUSE _4
TH M ; Threshold to create mask
_57 ; Reconstructed refrence volume
_4 ; Thresholded rotated mask output
B ; Below = 0
x82 ; Threshold value
ELSE
; NON-TOMOGRAPHIC VOLUME
; ROTATE THE MASK
RT 3D ; Rotate mask volume
_1 ; Mask voume input
_2 ; Rotated mask output
x56,x57,x58 ; Rotation angle
; THRESHOLD THE ROTATED MASK
; NOTE: DON'T REUSE _4
TH M ; Threshold to create mask
_2 ; Rotated mask input
_4 ; Thresholded rotated mask output
B ; Below = 0
(.5) ; Threshold value
ENDIF
ELSE
; ROTATIONALLY INVARIANT MASK IS USED
IF (x90 .EQ. 1) THEN
x53 = (x23/2) - 2 ; Radius of the mask sphere
x42 = 0
; JUST DO IT ONCE. (FIRST LOOP ONLY)
MO 3
_4
x23,x24,x25
SP
N
(1.0)
x53,x42
x33,x34,x35
(0,0,0)
ENDIF
ENDIF
; IN ASYMMETRIC CASE SET X55 =1 FOR ALL LOOPS
; IN SYMMETRIC CASE SET X55 =1 ONLY FOR THE FIRST LOOP
IF (x39 .EQ. 1) THEN
x55 = 1
ELSE
x55 =0
ENDIF
IF (x90 .EQ. 1) THEN
x55 = 1
ENDIF
IF ( x55 .EQ. 1) THEN
; FIND NUMBER OF NON-ZERO PIXELS INSIDE MASK
; (SAME AS SUM OF ALL PIXELS IN MASK)
FS x11,x11,x50,x11
_4 ; Thresholded rotated mask
x50 = x50*x26
IF (x50.LE.0)THEN
VM
echo 'NO NON-ZERO PIXELS INSIDE MASK'
EN
ENDIF
x51 = 1.0 / x50 ; For speed
; CREATE A BLANK VOLUME, SAME SIZE AS LARGE VOLUME
BL ; Create blank volume
_25 ; Blank output volume
x20,x21,x22 ; Size
N ; Not average background
(0) ; Background
; INSERT ROTATED MASK INSIDE THE BLANK VOLUME
IN ; Insert
_4 ; Thresholded rotated mask
_25 ; Padded mask output volume
(1,1,1) ; Position
; FT ON PADDED MASK, NOTE: DON'T REUSE _36
FT ; Fourier transform
_25 ; Padded mask
_36 ; Fourier of padded mask
;bimal testing begin
cp
_25
_90
CP
_36
_91
;bimal testing end
; MULTIPLY FT OF LARGE VOLUME WITH COMPLEX CONJUGATE OF PADDED MASK
MU M ; Complex multiplication
[LARGE_FT] ; First input
_36 ; Fourier of padded mask
_35 ; Output
*
;bimal testing begin
cp
[LARGE_FT]
_92
CP
_35
_93
;bimal testing end
; INVERSE FT
FT ; Inverse Fourier transform
_35 ; Input
_27 ; Output
;bimal testing begin
cp
_27
_94
;bimal testing end
x52=x51*x51
; NORMALIZE
AR ; Arithmetic operation
_27 ; Input
_27 ; Output
P1*P1*x52 ; P2 = (P1 / (No. OF NON-ZERO PIXELS INSIDE MASK))**2
; MULTIPLY FT OF SQUARE OF LARGE VOLUME WITH COMPLEX CONJUGATE
; OF FT OF BLANK VOLUME
MU M ; Complex multiplication
[LARGE_SQ_FT] ; Input
_36 ; Multiplier
_35 ; Output
*
;bimal testing begin
cp
[LARGE_SQ_FT]
_95
CP
_35
_96
;bimal testing end
; DO INVERSE FT
FT ; Inverse Fourier transform
_35 ; Input
_25 ; Output
;bimal testing begin
cp
_25
_97
;bimal testing end
; NORMALIZE
AD F
_25 ; Input (From FT OF SQUARE OF LARGE VOLUME)
_27 ; Input (From FT OF LARGE VOLUME)
x51,-1.0 ; p_25 = p_25 * x51 - p_27
_25 ; Output
; GET RID OF SQRT OF -VE # AND DIVISION BY ZERO(WHILE DIVIDING THE
; CCF BY LOCAL STANDARD DEVIATION)
; IF YOU FIND CCC > 1.0 AND THE LOCATIONS OF THE MOTIF OUTSIDE THE OUTLINE OF THE SEARCHED
; LARGE VOLUME THEN LOOK AT THE FILE _25 AND YOU WILL FIND PIXEL VALUES
; QUITE SMALL ~ < 1E-10 BUT NOT EQUAL TO ZERO. IN THIS CASE, CHANGE THE MASK THRESHOLD
; IN THE FOLLOWING OPERATION FROM ZERO (0) TO SOMETHING LIKE 1E-10. THIS MAY SOLVE
; THE PROBLEM. HOWEVER, YOU MAY NEED TO CHANGE THIS PARAMETER TO FIND THE CORRECT ONE
; TO BE USED. THIS PROBLEM OF GETTING -VE VARIANCE OR GETTING INCORRECT VARIANCE WHEN
; PIXELS UNDER THE MASK HAVE SAME/VERY_CLOSE VALUES IS DUE TO THE WAY VARIANCE IS
; CALCULATED USING FOURIER TRANSFORM.
TH M
_25
_80
B
(0)
MM
_80
_25
(9E+20)
; LOCAL STANDARD DEVIATION
WU ; Square root
_25 ; Input
_25 ; Output
; NOTE: DON'T REUSE _15
WI ; Window
_25 ; Input
_15 ; Output
x86,x87,x88 ; Size of difference
(1,1,1) ; Position
ENDIF
; ROTATE THE REFERENCE , DON'T REUSE _2 ------------------ step 2
IF (x61 .NE. 1) THEN
; NON-TOMOGRAPHIC VOLUME
RT 3D ; Rotate volume
[PADDED_REF_VOLUME] ; Input
_2 ; Output
x56,x57,x58 ; Angle
ELSE
; TOMOGRAPHIC VOLUME
CP
_57
_2
ENDIF
; PREPARE THE REFERENCE VOLUME SUCH THAT THE AVERAGE INSIDE
; THE MASK = 0 AND THE STANDARD DEVIATION INSIDE THE MASK = 1
MM ; Mask multiplication
_4 ; Rotated mask input
_2 ; Masked rotated reference input/output volume
(0) ; Background for voxels < 0.5
; FIND AVERAGE of rotated, masked ref. volume
FS x11,x11,x62,x63
_2 ; Masked volume
; SUM OF ALL PIXELS IN ROTATED, masked ref. volume
x40 = x62*x26 ; Average * No. of pixels
SQ ; Square the rotated, masked volume
_2 ; Masked volume
_7 ; Squared masked volume
; FIND AVERAGE OF SQUARED ROTATED MASK
FS x11,x11,x62,x11
_7 ; Squared rotated masked volume
; SUM OF ALL PIXELS SQUARED IN ROTATED MASK.
x45 = x62*x26
; SD INSIDE MASK
x46 = SQRT( (x45 - (x40*x40*x51)) / (x50-1) )
; AVG INSIDE MASK
x47 = x40/x50
x48 = 1.0 / x46 ; For speed
; NORMALIZE
AR ; Arithmetic operation
_2 ; Masked volume
_7 ; Normalized masked file
(P1-x47) * x48
MM ; Mask multiply operation
_4 ; Mask
_7 ; Masked input/output file
(0)
; CREATE AN EMPTY VOLUME OF DIMENSION = LARGE VOLUME
; PASTE THE PREPARED REFERNCE VOLUME AT THE MIDDLE OF
; THIS EMPTY VOLUME
BL ; Create blank volume
_25 ; Large blank volume
x20,x21,x22 ; Size
N ; Not average background
(0) ; Background
IN ; Insert
_7 ; Small volume
_25 ; Into large blank volume
1,1,1 ; put small image inside big at the corner
; FIND CROSS CORRELATION FUNCTION OF THE ABOVE VOLUME WITH
; WITH THE LARGE VOLUME.
FT
_25
_60
;bimal testing begin
cp
_25
_98
CP
_60
_99
;bimal testing end
; SET F(0,0) ELEMENT = ZERO. DONE TO DO SIMILAR NORMALIZATION
; AS DONE IN REAL SPACE
RP
_60
(1,1,1)
(0)
RP
_60
(2,1,1)
(0)
FT
[LARGE_VOLUME]
_61
;bimal testing begin
cp
[LARGE_VOLUME]
_81
CP
_61
_82
;bimal testing end
; DON'T CHANGE ORDER OF INPUT IN THE FOLLOWING OPERATION
MU M
_61
_60
_62
*
;bimal testing begin
cp
_60
_83
CP
_62
_84
;bimal testing end
; DO INVERSE FT
FT
_62
_27
;bimal testing begin
cp
_27
_85
;bimal testing end
WI ; Window
_27 ; CC volume
_13 ; Output
x86,x87,x88 ; Difference size
(1,1,1) ; left corner of small volume
; DIVIDE THE CC FUNCTION WITH TOTAL NUMBER OF NON-ZERO PIXELS
; INSIDE THE MASK
AR ; Arithmetic operation
_13 ; Input
_17 ; Output
P1 * x51
; DIVIDE THE ABOVE RESULT WITH CORRESPONDING ELEMENT OF
; THE LOCAL STANDARD DEVIATION ARRAY
MU D ; Divide
_17 ; Input
_15 ; Input
_13 ; Output
*
DE ; This doc file created by each 'PK 3D'
[DOC_FILE_DEL]_{****x72}
; RESTRICT THE PEAK SEARCH INSIDE A GIVEN MASK
MM
_50
_13
(0)
; PEAK SEARCH
PK 3D ; Peak search
_13 ; Input file
+ ; Maxima
(x95,1) ; Number of peaks, origin override flag
N ; No center of gravity calc.
(1,1) ; xy co-ordinate
(1) ; z co-ordinate
(1) ; peak no. for ratio
N ; No box
[DOC_FILE_DEL]_{****x72} ; Output doc file
; WRITE EULER ANGLES, XYZ POSITIONS, & PEAK HEIGHT TO FINAL DOC FILE
DO LB10 x96 = 1,x95
UD S,x96,x11,x12,x13,x14,x16,x17,x18
[DOC_FILE_DEL]_{****x72}
; CORRECT FOR THE CENTER OF THE PEAK WITH RESPECT TO LARGE VOLUME.
; THE PEAK HEIGHT DETERMINED IN PEAK SEARCH STEP IS WITH RESPECT TO THE
; VOLUME CREATED BY SUBTRACTING THE DIMENSION OF REFERENCE VOLUME
; FROM THE LARGE VOLUME. FACTOR OF NSAM/2+1, NROW/2+1 AND NSLICE/2+1
; ARE ADDDED
x30 = x11+x33
x31 = x12+x34
x32 = x13+x35
x97 = x97 + 1
; DO NOT WRITE CROSS-CORRELATION COEFFICIENTS (CCC) IN SCIENTIFIC FORMAT. UNIX
; "SORT" COMMAND WILL HAVE TROUBLE TO SORT THE FILE.
; CCC LESS THAN 0.05 DOES NOT MEAN MUCH
IF (x18 .LT. (.05)) x18 = -99
; bimal testing begin
IF (x18 .GT. (1.0)) then
cp
_81
file_81
cp
_82
file_82
cp
_83
file_83
cp
_84
file_84
cp
_85
file_85
cp
_90
file_90
cp
_91
file_91
cp
_92
file_92
cp
_93
file_93
cp
_94
file_94
cp
_95
file_95
cp
_96
file_96
cp
_97
file_97
cp
_98
file_98
cp
_99
file_99
vm
echo "\n\n*************ERROR ***************\n\n"
endif
; bimal testing end
SD x97,x56,x57,x58,x30,x31,x32,x18
[DOC_FILE_OUT]_{****x72}
LB10
UD E
DE ; This doc file created by each 'PK 3D'
[DOC_FILE_DEL]_{****x72}
LB6
MY FL
LB5
SD E
[DOC_FILE_OUT]_{****x72}
@signal_pub(x72) ; Signal finished
EN
;