C++********************************************************************* C C CSLICE.F FILE NAMES LENGTHENED AL C USED OPFILE NOV 00 ARDEAN LEITH C C ********************************************************************** C=* FROM: SPIDER - MODULAR IMAGE PROCESSING SYSTEM. AUTHOR: J.FRANK * C=* Copyright (C) 1985-2005 Health Research Inc. * C=* * C=* HEALTH RESEARCH INCORPORATED (HRI), * C=* ONE UNIVERSITY PLACE, RENSSELAER, NY 12144-3455. * C=* * C=* Email: spider@wadsworth.org * C=* * C=* This program is free software; you can redistribute it and/or * C=* modify it under the terms of the GNU General Public License as * C=* published by the Free Software Foundation; either version 2 of the * C=* License, or (at your option) any later version. * C=* * C=* This program is distributed in the hope that it will be useful, * C=* but WITHOUT ANY WARRANTY; without even the implied warranty of * C=* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * C=* General Public License for more details. * C=* * C=* You should have received a copy of the GNU General Public License * C=* along with this program; if not, write to the * C=* Free Software Foundation, Inc., * C=* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * C=* * C ********************************************************************** C C CSLICE: SELECT CENTRAL SLICE OF A 3-D IMAGE WITH ARBITRARY C AZIMUTH AND INCLINATION. C C--******************************************************************* SUBROUTINE CSLICE INCLUDE 'CMBLOCK.INC' INCLUDE 'CMLIMIT.INC' COMMON /IOBUF/ A0(NBUFSIZ) COMMON BUF(1) CHARACTER(LEN=MAXNAM) :: FILNAM,FILOUT COMMON /COMMUN/ FILNAM,FILOUT DATA LUNI/17/,LUNO/16/,PI/3.14159/ IERR = 0 MAXIM = 0 CALL OPFILEC(0,.TRUE.,FILNAM,LUNI,'O',IFORM,NSAM,NROW,NSLICE, & MAXIM,'INPUT',.TRUE.,IRTFLG) IF (IRTFLG .NE. 0) RETURN IF (IFORM .NE. 3) THEN CALL ERRT(2,'CSLICE',NDUM) RETURN ENDIF FMININ = FMIN NROW3 = NROW*NSLICE S3 = SQRT(3.) MAXREC = NROW*NSLICE NSAM2 = NSAM*S3+0.5 NROW2 = NROW*S3+0.5 NSAMH = NSAM2/2+1 NROWH = NROW2/2+1 MAXIM = 0 IFORM = 1 CALL OPFILEC(0,.TRUE.,FILOUT,LUNO,'U',IFORM,NSAM2,NROW2,1, & MAXIM,'OUTPUT',.TRUE.,IRTFLG) IF (IRTFLG .NE. 0) GOTO 9000 CALL RDPRM(PHI,NOT_USED,'AZIMUTH') CALL RDPRM(THETA,NOT_USED,'INCLINATION') PHI = PHI*PI/180. THETA = THETA*PI/180. C KXM = NSAM/2+1 C KYM = NROW/2+1 C KZM = NSLICE/2+1 CALL RDPRMI(KXM,KYM,NOT_USED,'ENTER X,Y POSITION') CALL RDPRMI(KZM,NDUM,NOT_USED,'ENTER Z POSITION') SPHI = SIN(PHI) CPHI = COS(PHI) STHETA = SIN(THETA) CTHETA = COS(THETA) XFACT = CTHETA*SPHI YFACT = CTHETA*CPHI C DIMENSIONS OF 2-D FILE ARE NSAM2 BY NROW2 DO IY=1,NROW2 DO 200 IX=1,NSAM2 X = KXM+((FLOAT(IX-NSAMH))*CPHI)+((FLOAT(IY-NROWH))*XFACT) Y = KYM-((FLOAT(IX-NSAMH))*SPHI)+((FLOAT(IY-NROWH))*YFACT) Z = KZM+(FLOAT(IY-NROWH))*STHETA C DETERMINE THE 8 SURROUNDING COEFFICIENTS KXBOT = X KXTOP = KXBOT+1 XDEC = X-(FLOAT(KXBOT)) XREM = 1.-XDEC KYBOT = Y KYTOP = KYBOT+1 YDEC = Y-(FLOAT(KYBOT)) YREM = 1.-YDEC KZBOT = Z KZTOP = KZBOT+1 ZDEC = Z-(FLOAT(KZBOT)) ZREM = 1.-ZDEC C CHECK IF COORDINATES ARE INSIDE THE VOLUME; C CONTINUE IF THEY ARE, OTHERWISE, SET = 0. IF (KXTOP.LE.NSAM.AND.KYTOP.LE.NROW.AND. & KZTOP.LE.NSLICE.AND. & KXBOT.GE.1.AND.KYBOT.GE.1.AND.KZBOT.GE.1)GOTO 100 BUF(IX) = FMININ GOTO 200 100 IREC1=(KZBOT-1)*NROW+KYBOT IF (IREC1.GT.MAXREC) IERR=7 IF (IERR.NE.0) GOTO 8000 CALL REDLIN(LUNI,A0,NSAM,IREC1) PT1 = A0(KXBOT) PT2 = A0(KXTOP) IREC2=(KZBOT-1)*NROW+KYTOP IF (IREC2.GT.MAXREC) IERR=7 IF (IERR.NE.0) GOTO 8000 CALL REDLIN(LUNI,A0,NSAM,IREC2) PT3 = A0(KXBOT) PT4 = A0(KXTOP) IREC3=(KZTOP-1)*NROW+KYBOT IF (IREC3.GT.MAXREC) IERR=7 IF (IERR.NE.0) GOTO 8000 CALL REDLIN(LUNI,A0,NSAM,IREC3) PT5 = A0(KXBOT) PT6 = A0(KXTOP) IREC4=(KZTOP-1)*NROW+KYTOP IF (IREC4.GT.MAXREC) IERR=7 IF (IERR.NE.0) GOTO 8000 CALL REDLIN(LUNI,A0,NSAM,IREC4) PT7 = A0(KXBOT) PT8 = A0(KXTOP) C WRITE(4,8888)PT1,PT2,PT3,PT4,PT5,PT6,PT7,PT8 C8888 FORMAT(' PTS 1-8 = ',8F7.3) C INTERPOLATE BUF(IX) = ZREM*(XDEC*(YREM*PT2+YDEC*PT4)+ & XREM*(YREM*PT1+YDEC*PT3))+ & ZDEC*(XDEC*(YREM*PT6+YDEC*PT8)+ & XREM*(YREM*PT5+YDEC*PT7)) 200 CONTINUE CALL WRTLIN(LUNO,BUF,NSAM2,IY) ENDDO GOTO 9000 8000 CALL ERRT(IERR,'CSLICE',NE) 9000 CLOSE(LUNO) CLOSE(LUNI) RETURN END