C++********************************************************************* C C ARITHL.F MODIFIED FOR LOGICAL OPERATIONS MAY 98 al C POLISH PARAMETERS DEC 2005 AL C I REG BUG JUL 2006 AL 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 ARITHL(LUN1,LUN2,NSAM,NROW,NSLICE) C C PURPOSE: CARRIES OUT ARITHMATIC OPERATION ON IMAGE PIXEL BY PIXEL C LOGICAL EXPRESSIONS SUPPORTED C C PARAMETERS: C LUN1 LOGICAL UNIT NUMBER OF FILE 1 C LUN2 LOGICAL UNIT NUMBER OF FILE 2 C NSAM,NROW X & Y DIMENSIONS OF FILES C NSLICE Z DIMENSION2 OF FILES C C--******************************************************************* SUBROUTINE ARITHL(LUN1,LUN2,NSAM,NROW,NSLICE) INCLUDE 'CMBLOCK.INC' PARAMETER (IVALEN = 40) PARAMETER (IRPNLEN = 80) CHARACTER *80 EXPR1,EXPR2,EXPR3 CHARACTER*1 NULL COMMON IRPNIF1(IRPNLEN),IRPNIF2(IRPNLEN),IRPNIF3(IRPNLEN), & IRPNEI1(IRPNLEN),IRPNEI2(IRPNLEN),IRPNEI3(IRPNLEN), & IRPNEL1(IRPNLEN), & VALIF1(IVALEN), VALIF2(IVALEN), VALIF3(IVALEN), & VALEI1(IVALEN), VALEI2(IVALEN), VALEI3(IVALEN), & VALEL1(IVALEN), BUF(1) COMMON /COMMUN/ ILIST(200) NULL = CHAR(0) 10 CALL RDPRMC(EXPR1,NLET1,.TRUE., & 'IF (...) THEN P2=f(P1)',NULL,IRTFLG) IF (IRTFLG .NE. 0) RETURN IF (NLET1 .LE. 0 .OR. INDEX(EXPR1,'THEN') .LE. 0) THEN CALL ERRT(101,'NO -IF THEN- CLAUSE ENTERED',NE) RETURN ENDIF C CONVERT IF-THEN EXPRESSION FORMULAS TO RPN NOTATION IF (NLET1 .GT. 0) THEN CALL IFTORPN(EXPR1,ICOMPIF, & IRPNIF1,NRPNIF1,VALIF1, & IRPNIF2,NRPNIF2,VALIF2, & IRPNIF3,NRPNIF3,VALIF3, & IRTFLG) IF (IRTFLG .NE. 0) RETURN ENDIF 20 CALL RDPRMC(EXPR2,NLET2,.TRUE., & 'ELSE IF (...) THEN P2=f(P1)',NULL,IRTFLG) IF (IRTFLG .EQ. -1) GOTO 10 IF (IRTFLG .NE. 0) RETURN IF (NLET2 .GT. 0 .AND. INDEX(EXPR1,'THEN') .LE. 0) THEN CALL ERRT(101,'ILLEGAL -ELSE IF THEN- CLAUSE ENTERED',NE) RETURN ENDIF C CONVERT ELSE-IF-THEN EXPRESSION FORMULAS TO RPN NOTATION IF (NLET2 .GT. 0) THEN CALL IFTORPN(EXPR2,ICOMPEI, & IRPNEI1,NRPNEI1,VALEI1, & IRPNEI2,NRPNEI2,VALEI2, & IRPNEI3,NRPNEI3,VALEI3, & IRTFLG) IF (IRTFLG .NE. 0) RETURN ENDIF 30 CALL RDPRMC(EXPR3,NLET3,.TRUE., 'ELSE FORMULA',NULL,IRTFLG) IF (IRTFLG .EQ. -1) GOTO 20 IF (IRTFLG .NE. 0) RETURN C CONVERT ELSE EXPRESSION FORMULA TO RPN NOTATION IGO = INDEX(EXPR3,'=') + 1 CALL POLISH(0,EXPR3(IGO:),NLET3-IGO+1,IRPNEL1,NRPNEL1,VALEL1, & NVALEL,IRTFLG) IF (IRTFLG .NE. 0) RETURN DO ISL=1,NSLICE IOFF = (ISL-1) * NROW DO I = 1,NROW IROW = IOFF + I CALL REDLIN(LUN1,BUF,NSAM,IROW) DO K = 1,NSAM CALL REG_SET_NSEL(1,3,FLOAT(K),FLOAT(I),FLOAT(ISL), & 0.0,0.0,IRTFLG) IF (NLET1 .GT. 0) THEN CALL CALC(IRPNIF1,NRPNIF1,VALIF1,BUF(K),A,IRTFLG) CALL CALC(IRPNIF2,NRPNIF2,VALIF2,BUF(K),B,IRTFLG) IF (A .LT. B) THEN IF (ICOMPIF.EQ.3 .OR. ICOMPIF.EQ.4 .OR. & ICOMPIF.EQ.6) THEN CALL CALC(IRPNIF3,NRPNIF3,VALIF3,BUF(K),C,IRTFLG) BUF(K) = C GOTO 100 ENDIF ELSEIF (A .EQ. B) THEN IF (ICOMPIF.EQ.1 .OR. ICOMPIF.EQ.2) THEN CALL CALC(IRPNIF3,NRPNIF3,VALIF3,BUF(K),C,IRTFLG) BUF(K) = C GOTO 100 ENDIF ELSE IF (ICOMPIF.EQ.5) THEN CALL CALC(IRPNIF3,NRPNIF3,VALIF3,BUF(K),C,IRTFLG) BUF(K) = C GOTO 100 ENDIF ENDIF ENDIF IF (NLET2 .GT. 0) THEN CALL CALC(IRPNEI1,NRPNEI1,VALEI1,BUF(K),A,IRTFLG) CALL CALC(IRPNEI2,NRPNEI2,VALEI2,BUF(K),B,IRTFLG) IF (A .LT. B) THEN IF (ICOMPEI.EQ.3 .OR. ICOMPEI.EQ.4 .OR. & ICOMPEI.EQ.6) THEN CALL CALC(IRPNEI3,NRPNEI3,VALEI3,BUF(K),C,IRTFLG) BUF(K) = C GOTO 100 ENDIF ELSEIF (A .EQ. B) THEN IF (ICOMPEI.EQ.1 .OR. ICOMPEI.EQ.2) THEN CALL CALC(IRPNEI3,NRPNEI3,VALEI3,BUF(K),C,IRTFLG) BUF(K) = C GOTO 100 ENDIF ELSE IF (ICOMPEI.EQ.5) THEN CALL CALC(IRPNEI3,NRPNEI3,VALEI3,BUF(K),C,IRTFLG) BUF(K) = C GOTO 100 ENDIF ENDIF ENDIF IF (NLET3 .GT. 0) THEN CALL CALC(IRPNEL1,NRPNEL1,VALEL1,BUF(K),BUF(K),IRTFLG) GOTO 100 ENDIF 100 CONTINUE ENDDO CALL WRTLIN(LUN2,BUF,NSAM,IROW) ENDDO ENDDO RETURN END