home *** CD-ROM | disk | FTP | other *** search
- $TITLE: 'PLOT AND MANIPULATE SPECTRUMS'
- $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,HALDEV
- INTEGER GMODE,GXMAX,GYMAX
- INTEGER*4 IMAGE(8000),KEEP(8000)
- LOGICAL IEXIST
- C
- C This program was written to interactively process gamma-ray
- C energy spectrums but is useful in any application where you
- C need to find the area under a peak, remove the background,
- C fix lost/erroneous data points, or want to produce graphs
- C with labels.
- C The program is written in MS-FORTRAN and uses the MULTI-HALO
- C graphics library extensively.
- 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:
- C Type 1) file has only one column of
- C numbers representing the Y values. When file
- C type 1 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 Type 2) file has two columns of numbers representing
- C the X and Y values.
- C The file type is indicated by placing an integer
- C 1 or 2 on the first line of the file.
- C
- 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 LINKing--
- C (.OBJ): PLTSPEC+EDITS+PLOT1+PLOT2+DOSFN+DOSFUNC+MANSPT+HALODVXX
- C(PLTSPEC.EXE): <RETURN>
- C (NUL.MAP): <RETURN>
- C (.LIB): A:+A:HALOF (assuming libraries are on A:)
- C
- C NOTE: Run-time disk needs the appropriate HALOxxx.DEV file.
- C
- WRITE(0,'(A\)') ' Device driver name (ex. \d:HALOxxx.DEV\) = '
- READ(0,'(A)') HALDEV
- CALL SETDEV(HALDEV)
- WRITE(0,9090)
- 9090 FORMAT(10X,'HALOIBM.DEV',/,25X,' 0: 320 x 200',/,
- 1 25X,' 1: 640 x 200',//,10X,'HALOSTB.DEV',/,
- 2 25X,' 0: 320 x 200 x 4',/,25X,' 1: 640 x 200 x 2',/,
- 3 25X,' 2: 320 x 200 x 16',/,25X,' 3: 640 x 200 x 4',/,
- 4 25X,'10: 640 x 352 x mono',/,1X)
- WRITE(0,'(A\)') ' GRAPHICS MODE NUMBER: '
- READ(0,*) GMODE
- 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,'Graphics dump to printer',/,
- 7 10X,'Keep last screen',/,
- 8 10X,'Edit spectrum',/,
- 9 10X,'Manipulate last spectrum plotted',/,
- 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
- 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(GMODE)
- CALL SETIEE(1)
- CALL INQDRA(GXMAX,GYMAX)
- C
- C draw X- and Y-axis
- CALL MOVABS(0,0)
- CALL LNABS(0,GYMAX)
- CALL LNABS(GXMAX,GYMAX)
- 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 INQDRA(GXMAX,GYMAX)
- CALL MOVEFR(0,0,GXMAX,GYMAX,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
- C
- C graphics dump to an IDS Microprism printer
- C
- WRITE(0,'(A\)') ' Half or Full height dump (H/F): '
- READ(0,'(A)',ERR=20) ANSW(2)
- WRITE(0,*) 'READY PRINTER AND PRESS RETURN'
- READ(0,*)
- CALL INITGR(GMODE)
- CALL SETIEE(1)
- CALL MOVETO(0,0,IMAGE(1),1)
- IF((ANSW(2).EQ.'H').OR.(ANSW(2).EQ.'h')) THEN
- C
- C 640x200
- CALL PLOT1
- ELSE
- C
- C 640x400 every other line is blank
- CALL PLOT2
- ENDIF
- CALL GETCHR(CHR)
- CALL CLOSEG
- 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(GMODE)
- 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
- C
- C edit ( change values of points) last spectrum plotted
- C
- WRITE(0,*)' EDITING SPECTRUM',IDLSP,' ',FNAME(IDLSP)
- CALL GETCHR(CHR)
- CALL INITGR(GMODE)
- CALL SETIEE(1)
- CALL MOVETO(0,0,IMAGE(1),1)
- CALL SETWOR(XMIN,RMIN,XMAX,RMAX)
- C
- C interactive visual editing of the data points
- C
- CALL EDITS(IDLSP,R,SCAT1,IPTS,IMAGE,GMODE)
- C
- CALL WORLDO
- CALL INQDRA(GXMAX,GYMAX)
- CALL MOVEFR(0,0,GXMAX,GYMAX,IMAGE(1))
- CALL CLOSEG
- 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(GMODE)
- CALL SETIEE(1)
- CALL MOVETO(0,0,IMAGE(1),1)
- CALL INQDRA(GXMAX,GYMAX)
- CALL MOVEFR(0,0,GXMAX,GYMAX,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(GMODE)
- 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 INQDRA(GXMAX,GYMAX)
- CALL MOVEFR(0,0,GXMAX,GYMAX,IMAGE(1))
- CALL GETCHR(CHR)
- CALL CLOSEG
- GO TO 20
- ELSEIF((ANSW(1).EQ.'M').OR.(ANSW(1).EQ.'m')) THEN
- WRITE(0,*)' MANIPULATING SPECTRUM',IDLSP,' ',FNAME(IDLSP)
- DO 600 I=1,1000
- 600 RJER=8.8*9./5.
- CALL INITGR(GMODE)
- CALL SETIEE(1)
- CALL MOVETO(0,0,IMAGE(1),1)
- C
- CALL SETWOR(XMIN,RMIN,XMAX,RMAX)
- C
- C MANSPT allows placing labels on a graph, fitting a second
- C order curve to the spectrum background, removing the
- C background, calculating the counts under a peak, saving
- C a copy of the screen image on the printer, and
- C saving the background corrected data in a file.
- C
- CALL MANSPT(IDLSP,R,SCAT1,IPTS,IMAGE,GMODE)
- C
- CALL WORLDO
- CALL INQDRA(GXMAX,GYMAX)
- CALL MOVEFR(0,0,GXMAX,GYMAX,IMAGE(1))
- CALL CLOSEG
- GO TO 20
- ELSE
- CALL CLOSEG
- GO TO 20
- ENDIF
- END