home *** CD-ROM | disk | FTP | other *** search
- $DEBUG
- $LARGE
- $NOFLOATCALLS
- DIMENSION R(10,640),SCAT1(10,640),IPTS(10)
- REAL DUMX(640),DUMY(640),KEVPC
- CHARACTER*64 FNAME(10),ANSW(128)*1,CHR*1,F2CHR,ANSW1*1
- INTEGER IMAGE(4009),KEEP(4009),IFUN
- LOGICAL IEXIST
- C
- C IPTS(j) Number of points in spectrum j
- C NSPT Number of spectrums
- C FNAME(j) File name of spectrum j
- C R,SCAT1 X and Y data for each spectrum
- C DUMX,DUMY Dummy vectors used when calling
- C some of the HALO routines.
- C BASE,KEVPC Two types of data files are used: 1) file has
- C two columns of numbers representing the X and
- C Y values, and 2) file has only one column of
- C numbers representing the Y values. When file
- C type 2 is read the X values are computed assuming
- C the points are equally spaced. BASE is the X value
- C of the first point and KEVPC is the distance between
- C successive points.
- C
- C IMAGE Copy of the last graphics screen image
- C automatically saved each time.
- C KEEP Copy of a graphics screen image manually
- C saved by the user.
- C GETCHR Is a function which uses a machine language routine
- C to poll the keyboard for input. The user does not
- C need to press the RETURN key as when a READ statement
- C is used. Most important when using the graphics
- C interactively----no extraneous characters are printed
- C on the screen when getting input from the keyboard.
- C
- C LINK:
- C (.OBJ): EFFIXSP+DOSFN+DOSFUNC
- C (EFFIXSP.EXE): <RETURN>
- C (NUL.MAP): <RETURN>
- C (.LIB): A:+A:HALOF (assuming the libraries are on A:)
- C
- IFLGZ=0
- NSPT=0
- DO 10 I=1,10
- DO 5 J=1,640
- R(I,J)=0.
- SCAT1(I,J)=0.
- 5 CONTINUE
- 10 IPTS(I)=0
- C
- 9000 FORMAT(10X,'Read in a spectrum file',/,
- 1 10x,'Plot spectrums',/,
- 2 10x,'Set max/min limits',/,
- 4 10X,'Overlay Keep spectrum with another',/,
- 5 10X,'Last screen recall',/,
- 6 10X,'Write spectrum to disk',/
- 8 10x,'Efficiency correct spectrum',/
- 7 10X,'Keep last screen',/,
- 3 10x,'Quit',/,1X)
- 20 WRITE(0,9000)
- WRITE(0,'(A\)') ' COMMAND: '
- CALL GETCHR(CHR)
- ANSW(1)=CHR
- WRITE(0,*)CHR
- C
- C
- IF((ANSW(1).EQ.'R').OR.(ANSW(1).EQ.'r')) THEN
- 30 WRITE(0,'(A\)') ' ID NUMBER OF SPECTRUM TO READ '
- READ(0,*,ERR=30) ID
- WRITE(0,'(A\)') ' INPUT FILE NAME? '
- READ(0,'(A)',ERR=30) FNAME(ID)
- INQUIRE(FILE=FNAME(ID),EXIST=IEXIST)
- IF(IEXIST) THEN
- OPEN(7,FILE=FNAME(ID),STATUS='OLD')
- ELSE
- WRITE(0,*) ' FILE DOES NOT EXIST--- TRY AGAIN'
- GO TO 30
- ENDIF
- C--------------
- READ(7,*) IFLTYP
- IF(IFLTYP.EQ.1) THEN
- C--------------
- 31 WRITE(0,'(A\)')' Energy of first channel and keV/channel: '
- READ(0,*,ERR=31) BASE,KEVPC
- C
- DO 90 J=1,640
- READ(7,*,ERR=107,END=100) SCAT1(ID,J)
- R(ID,J)=BASE + (J-1)*KEVPC
- 90 CONTINUE
- ELSE
- DO 95 J=1,640
- READ(7,*,ERR=107,END=100) R(ID,J),SCAT1(ID,J)
- 95 CONTINUE
- ENDIF
- 100 CLOSE(7,STATUS='KEEP')
- J=J-1
- IF(IPTS(ID).EQ.0) NSPT=NSPT + 1
- IPTS(ID)=J
- GO TO 20
- C
- C error in reading file-- treat as if file was never opened.
- C
- 107 CLOSE(7,STATUS='KEEP')
- IF(IPTS(ID).NE.0) NSPT=NSPT-1
- IPTS(ID)=0
- GO TO 20
- CCCCCCCCCCCC
- CCCCCCCCCCC
- ELSEIF((ANSW(1).EQ.'P').OR.(ANSW(1).EQ.'p')) THEN
- 249 DO 250 I=1,10
- IF(IPTS(I).NE.0) WRITE(0,'(10X,I2,1X,A)') I,FNAME(I)
- 250 CONTINUE
- WRITE(0,'(1X,/,1X,A\)') 'Spectrum number to plot '
- READ(0,*,ERR=249) ID
- C
- C initialize graphics - 640x200 mono
- CALL INITGR(1)
- CALL SETIEE(1)
- C
- C draw X- and Y-axis
- CALL MOVABS(0,0)
- CALL LNABS(0,199)
- CALL LNABS(639,199)
- JMAX=IPTS(ID)-1
- CALL SETWOR(XMIN,RMIN,XMAX,RMAX)
- C
- C move graphics cursor to first point
- C
- CALL MOVABS(R(ID,1),SCAT1(ID,1))
- DO 255 J=1,IPTS(ID)
- DUMY(J)=SCAT1(ID,J)
- 255 DUMX(J)=R(ID,J)
- C
- C graph the points
- C
- CALL POLYLA(DUMX(2),DUMY(2),JMAX)
- CALL SETGPR(2)
- CALL WORLDO
- C
- C save a copy of the image
- C
- CALL MOVEFR(0,0,639,199,IMAGE(1))
- IDLSP=ID
- CALL GETCHR(CHR)
- CALL CLOSEG
- GO TO 20
- ELSEIF((ANSW(1).EQ.'S').OR.(ANSW(1).EQ.'s')) THEN
- C
- C set upper and lower limits on X- and Y-axis
- C
- 1949 DO 1950 I=1,10
- IF(IPTS(I).NE.0) WRITE(0,'(10X,I2,1X,A)') I,FNAME(I)
- 1950 CONTINUE
- WRITE(0,'(10X,I2,1X,A)') 11,'To manually set limits'
- WRITE(0,'(1X,/,1X,A\)') 'Spectrum number to get limits from '
- READ(0,*,ERR=1949) ID
- IF(ID.NE.11) THEN
- JMAX=IPTS(ID)
- XMAX=R(ID,1)
- XMIN=R(ID,1)
- RMAX=SCAT1(ID,1)
- RMIN=SCAT1(ID,1)
- DO 2000 I=1,JMAX
- IF(SCAT1(ID,I).GT.RMAX) RMAX=SCAT1(ID,I)
- IF(SCAT1(ID,I).LT.RMIN) RMIN=SCAT1(ID,I)
- IF(R(ID,I).GT.XMAX) XMAX=R(ID,I)
- IF(R(ID,I).LT.XMIN) XMIN=R(ID,I)
- 2000 CONTINUE
- WRITE(0,*) ' Y-AXIS LIMITS ARE NOW ',RMAX,RMIN
- WRITE(0,*) ' X-AXIS LIMITS ARE NOW', XMAX,XMIN
- ELSE
- WRITE(0,*) ' OLD Y-AXIS LIMITS ARE ',RMAX,RMIN
- WRITE(0,'(A\)') ' ENTER NEW LIMITS: '
- READ(0,*,ERR=20) RMAX,RMIN
- WRITE(0,*) ' OLD X-AXIS LIMITS ARE ',XMAX,XMIN
- WRITE(0,'(A\)') ' ENTER NEW LIMITS: '
- READ(0,*,ERR=20) XMAX,XMIN
- ENDIF
- GO TO 20
- ELSEIF((ANSW(1).EQ.'G').OR.(ANSW(1).EQ.'g')) THEN
- GO TO 20
- ELSEIF((ANSW(1).EQ.'Q').OR.(ANSW(1).EQ.'q')) THEN
- C
- C quit- stop the program
- STOP
- ELSEIF((ANSW(1).EQ.'L').OR.(ANSW(1).EQ.'l')) THEN
- C
- C re-examine last screen image
- CALL INITGR(1)
- CALL SETIEE(1)
- CALL MOVETO(0,0,IMAGE(1),1)
- C
- C display image until a key is pressed
- CALL GETCHR(CHR)
- CALL CLOSEG
- GO TO 20
- ELSEIF((ANSW(1).EQ.'E').OR.(ANSW(1).EQ.'e')) THEN
- WRITE(0,'(A\)') ' Read in new efficiency curve data (Y/N):'
- CALL GETCHR(CHR)
- WRITE(0,*) CHR
- IF((CHR.EQ.'Y').OR.(CHR.EQ.'y').OR.(IFLGZ.EQ.0)) THEN
- C>>>>>>>>>>>>VVVVVVVVVV
- WRITE(0,*) ' 2'
- WRITE(0,*) ' 1) eff = A*E + B*E + C'
- WRITE(0,*)
- WRITE(0,*) ' 2'
- WRITE(0,*) ' 2) ln(eff)= A*E + B*E + C'
- WRITE(0,*)
- WRITE(0,*) ' 3) ln(eff)= A*ln(E) + C'
- WRITE(0,*)
- 300 WRITE(0,'(A\)') ' Number of function to use: '
- READ(0,*,ERR=300) IFUN
- C
- IF(IFUN.EQ.1) THEN
- 310 WRITE(0,'(A\)') ' A,B,C '
- READ(0,*,ERR=310) AA,BB,CC
- ELSEIF(IFUN.EQ.2) THEN
- 315 WRITE(0,'(A\)') ' A,B,C '
- READ(0,*,ERR=315) AA,BB,CC
- ELSEIF(IFUN.EQ.3) THEN
- 320 WRITE(0,'(A\)') ' A,C '
- READ(0,*,ERR=320) AA,CC
- ELSE
- GO TO 300
- ENDIF
- C>>>>>>>>>>>>>^^^^^^^^^^
- 325 WRITE(0,'(A\)') ' Valid energy range: Elow, Ehigh '
- READ(0,*,ERR=325) ELOW,EHGH
- IFLGZ=1
- ENDIF
- 400 DO 450 I=1,10
- IF(IPTS(I).NE.0) WRITE(0,'(10X,I2,1X,A)') I,FNAME(I)
- 450 CONTINUE
- WRITE(0,'(1X,/,1X,A\)') 'Spectrum number to correct '
- READ(0,*,ERR=400) ID
- C
- DO 475 J=1,IPTS(ID)
- EID=R(ID,J)
- IF((EID.GE.ELOW).AND.(EID.LE.EHGH)) THEN
- C>>>>>>>>>>>VVVVVVV
- IF(IFUN.EQ.1) THEN
- SCAT1(ID,J)=SCAT1(ID,J)/((AA*R(ID,J)+BB)*R(ID,J)+CC)
- ELSEIF(IFUN.EQ.2) THEN
- SCAT1(ID,J)=SCAT1(ID,J)/EXP((AA*R(ID,J)+BB)*R(ID,J)+CC)
- ELSEIF(IFUN.EQ.3) THEN
- SCAT1(ID,J)=SCAT1(ID,J)/EXP(AA*ALOG(R(ID,J)) + CC)
- ENDIF
- C>>>>>>>>>^^^^^^^^^
- ENDIF
- 475 CONTINUE
- GO TO 20
- ELSEIF((ANSW(1).EQ.'K').OR.(ANSW(1).EQ.'k')) THEN
- C
- C saves a copy of the last screen image
- C used with overlaying two spectrums.
- CALL INITGR(1)
- CALL SETIEE(1)
- CALL MOVETO(0,0,IMAGE(1),1)
- CALL MOVEFR(0,0,639,199,KEEP(1))
- CALL CLOSEG
- GO TO 20
- ELSEIF((ANSW(1).EQ.'O').OR.(ANSW(1).EQ.'o')) THEN
- C
- C overlay one spectrum on another
- 549 DO 550 I=1,10
- IF(IPTS(I).NE.0) WRITE(0,'(10X,I2,1X,A)') I,FNAME(I)
- 550 CONTINUE
- WRITE(0,'(1X,/,1X,A\)') 'Spectrum number to plot '
- READ(0,*,ERR=549) ID
- CALL INITGR(1)
- CALL SETIEE(1)
- CALL MOVETO(0,0,KEEP(1),1)
- C
- C NOTE: the X and Y axis limits are set to those associated with
- C the last 'Set limits' command which may not be the same
- C as those used to draw the graph saved in the "KEEP" array
- C or those of the spectrum being overlayed.
- C
- CALL SETWOR(XMIN,RMIN,XMAX,RMAX)
- CALL MOVABS(R(ID,1),SCAT1(ID,1))
- JMAX=IPTS(ID)-1
- DO 555 J=1,IPTS(ID)
- DUMY(J)=SCAT1(ID,J)
- 555 DUMX(J)=R(ID,J)
- CALL POLYLA(DUMX(2),DUMY(2),JMAX)
- CALL SETGPR(2)
- CALL WORLDO
- CALL MOVEFR(0,0,639,199,IMAGE(1))
- CALL GETCHR(CHR)
- CALL CLOSEG
- GO TO 20
- ELSEIF((ANSW(1).EQ.'W').OR.(ANSW(1).EQ.'w')) THEN
- 1200 DO 1250 I=1,10
- IF(IPTS(I).NE.0) WRITE(0,'(10X,I2,1X,A)') I,FNAME(I)
- 1250 CONTINUE
- WRITE(0,'(1X,/,1X,A\)') 'Spectrum number to WRITE '
- READ(0,*,ERR=1200) ID
- C
- 1385 WRITE(0,'(A\)')' OUTPUT FILENAME: '
- READ(0,'(A)') F2CHR
- INQUIRE(FILE=F2CHR,EXIST=IEXIST)
- IF(IEXIST) THEN
- WRITE(0,'(A\)') ' File exists- overwrite it (Y/N): '
- READ(0,'(A)')ANSW1
- IF((ANSW1.EQ.'Y').OR.(ANSW1.EQ.'y')) THEN
- OPEN(4,FILE=F2CHR,STATUS='OLD')
- ELSE
- GO TO 1385
- ENDIF
- ELSE
- OPEN(4,FILE=F2CHR,STATUS='NEW')
- ENDIF
- C
- 1386 WRITE(0,'(A\)') ' 1 OR 2 COLUMN FILETYPE (1/2): '
- READ(0,*,ERR=1386) IFLTYP
- IF(IFLTYP.EQ.1) THEN
- WRITE(4,*,ERR=1435) IFLTYP
- DO 1430 J=1,IPTS(ID)
- WRITE(4,*,ERR=1435) SCAT1(ID,J)
- 1430 CONTINUE
- ELSEIF(IFLTYP.EQ.2) THEN
- WRITE(4,*,ERR=1435) IFLTYP
- DO 1433 J=1,IPTS(ID)
- WRITE(4,'(1X,F10.5,1X,F8.1)',ERR=1435) R(ID,J),SCAT1(ID,J)
- 1433 CONTINUE
- C
- ELSE
- GO TO 1386
- ENDIF
- 1435 CLOSE(4,STATUS='KEEP')
- GO TO 20
- ELSE
- CALL CLOSEG
- GO TO 20
- ENDIF
- END