File indexing completed on 2025-08-05 08:21:13
0001
0002
0003
0004
0005
0006
0007 SUBROUTINE PYOPER(ID1,OPER,ID2,ID3,F1,F2)
0008
0009
0010 IMPLICIT DOUBLE PRECISION(A-H, O-Z)
0011 IMPLICIT INTEGER(I-N)
0012
0013 COMMON/PYBINS/IHIST(4),INDX(1000),BIN(20000)
0014 SAVE /PYBINS/
0015
0016 CHARACTER OPER*(*)
0017
0018
0019 IF(ID1.LE.0.OR.ID1.GT.IHIST(1)) CALL PYERRM(28,
0020 &'(PYFACT:) not allowed histogram number')
0021 IS1=INDX(ID1)
0022 IS2=INDX(MIN(IHIST(1),MAX(1,ID2)))
0023 IS3=INDX(MIN(IHIST(1),MAX(1,ID3)))
0024 NX=NINT(BIN(IS3+1))
0025 IF(OPER.EQ.'M'.AND.ID3.EQ.0) NX=NINT(BIN(IS2+1))
0026
0027
0028 IF(OPER.EQ.'+'.OR.OPER.EQ.'-'.OR.OPER.EQ.'*'.OR.OPER.EQ.'/') THEN
0029 BIN(IS3+5)=BIN(IS1+5)+BIN(IS2+5)
0030 ELSEIF(OPER.EQ.'A'.OR.OPER.EQ.'S'.OR.OPER.EQ.'L') THEN
0031 BIN(IS3+5)=BIN(IS1+5)
0032 ENDIF
0033
0034
0035
0036 IF(OPER.EQ.'+') THEN
0037 DO 100 IX=6,8+NX
0038 BIN(IS3+IX)=F1*BIN(IS1+IX)+F2*BIN(IS2+IX)
0039 100 CONTINUE
0040 ELSEIF(OPER.EQ.'-') THEN
0041 DO 110 IX=6,8+NX
0042 BIN(IS3+IX)=F1*BIN(IS1+IX)-F2*BIN(IS2+IX)
0043 110 CONTINUE
0044 ELSEIF(OPER.EQ.'*') THEN
0045 DO 120 IX=6,8+NX
0046 BIN(IS3+IX)=F1*BIN(IS1+IX)*F2*BIN(IS2+IX)
0047 120 CONTINUE
0048 ELSEIF(OPER.EQ.'/') THEN
0049 DO 130 IX=6,8+NX
0050 FA2=F2*BIN(IS2+IX)
0051 IF(ABS(FA2).LE.1D-20) THEN
0052 BIN(IS3+IX)=0D0
0053 ELSE
0054 BIN(IS3+IX)=F1*BIN(IS1+IX)/FA2
0055 ENDIF
0056 130 CONTINUE
0057
0058
0059
0060 ELSEIF(OPER.EQ.'A') THEN
0061 DO 140 IX=6,8+NX
0062 BIN(IS3+IX)=F1*BIN(IS1+IX)+F2
0063 140 CONTINUE
0064 ELSEIF(OPER.EQ.'S') THEN
0065 DO 150 IX=6,8+NX
0066 BIN(IS3+IX)=F1*SQRT(MAX(0D0,BIN(IS1+IX)))+F2
0067 150 CONTINUE
0068 ELSEIF(OPER.EQ.'L') THEN
0069 ZMIN=1D20
0070 DO 160 IX=9,8+NX
0071 IF(BIN(IS1+IX).LT.ZMIN.AND.BIN(IS1+IX).GT.1D-20)
0072 & ZMIN=0.8D0*BIN(IS1+IX)
0073 160 CONTINUE
0074 DO 170 IX=6,8+NX
0075 BIN(IS3+IX)=F1*LOG10(MAX(ZMIN,BIN(IS1+IX)))+F2
0076 170 CONTINUE
0077
0078
0079
0080 ELSEIF(OPER.EQ.'M') THEN
0081 DO 180 IX=6,8+NX
0082 IF(ABS(BIN(IS1+IX)).LE.1D-20) THEN
0083 BIN(IS2+IX)=0D0
0084 ELSE
0085 BIN(IS2+IX)=BIN(IS2+IX)/BIN(IS1+IX)
0086 ENDIF
0087 IF(ID3.NE.0) THEN
0088 IF(ABS(BIN(IS1+IX)).LE.1D-20) THEN
0089 BIN(IS3+IX)=0D0
0090 ELSE
0091 BIN(IS3+IX)=SQRT(MAX(0D0,BIN(IS3+IX)/BIN(IS1+IX)-
0092 & BIN(IS2+IX)**2))
0093 ENDIF
0094 ENDIF
0095 BIN(IS1+IX)=F1*BIN(IS1+IX)
0096 180 CONTINUE
0097 ENDIF
0098
0099 RETURN
0100 END