program analysis CHARACTER*40 FILEN(17) CHARACTER*300 COMMENT character chtop*8 REAL SCOPEDATA(500,8,500), XMEASURED(17), AVGDATA(500,8,17) REAL FITPARAM(6,8,17),WNDWS(2,3,17),XPOS(3) INTEGER FILENUM,NWPAWC C Paw memory stuff PARAMETER (NWPAWC=1000000) REAL HMEM COMMON/PAWC/HMEM(NWPAWC) CALL HLIMIT(NWPAWC) C Paw memory stuff ends CC Absolute centres of pads XPOS(1) = 1.595 XPOS(2) = 0. XPOS(3) = -1.595 open(36,file="coefficients.txt") open(38,file="averagedata.txt") C Copies a list of the datafiles into FILEN CALL GETDATAFILES(FILEN) CC Initializes the windows CALL WINDOWS(WNDWS) chtop="scope" CALL HROPEN(32,chtop,"plots.rzhist", "N", 1024,ierr) C Reads in the data (measured xval, waveform data) and calculates C the average waveforms for all datafiles using NO FILTER DO FILENUM=1,17 C Reads in the file and get micrometer and oscilloscope readings CALL READFILE(FILEN(FILENUM), COMMENT, SCOPEDATA, XMEASURED, + FILENUM) C Calculates scope average for a data file CALL FINDAVG(SCOPEDATA, AVGDATA, FILENUM) C Call the fitting routine to find coefficients for each run CALL FITTER(AVGDATA,FITPARAM, WNDWS, FILENUM) C Loops through ENDDO CC Creates the calibration curves for centroid and ratio methods CALL CALIBPLOT(AVGDATA, XMEASURED, XPOS,FITPARAM,WNDWS) icycle=0 call hrout(0,icycle,"N") call hrend(chtop) close(36) close(38) END CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC SUBROUTINE GETDATAFILES(FILEN) IMPLICIT NONE CHARACTER*40 FILEN(17) FILEN(1) = '../outfiles/1_11_02_edg18_19.out' FILEN(2) = '../outfiles/1_11_02_strip19_1.out' FILEN(3) = '../outfiles/1_11_02_strip19_2.out' FILEN(4) = '../outfiles/1_11_02_strip19_3.out' FILEN(5) = '../outfiles/1_11_02_strip19_4.out' FILEN(6) = '../outfiles/1_11_02_strip19_5.out' FILEN(7) = '../outfiles/1_11_02_strip19_6.out' FILEN(8) = '../outfiles/1_11_02_strip19_7.out' FILEN(9) = '../outfiles/1_11_02_cntr19.out' FILEN(10) = '../outfiles/1_11_02_strip19_8.out' FILEN(11) = '../outfiles/1_11_02_strip19_9.out' FILEN(12) = '../outfiles/1_11_02_strip19_10.out' FILEN(13) = '../outfiles/1_11_02_strip19_11.out' FILEN(14) = '../outfiles/1_11_02_strip19_12.out' FILEN(15) = '../outfiles/1_11_02_strip19_13.out' FILEN(16) = '../outfiles/1_11_02_strip19_14.out' FILEN(17) = '../outfiles/1_11_02_edg19_20.out' RETURN END CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC SUBROUTINE READFILE(FILETOREAD, COMMENT, SCOPEDATA, XMEASURED, F) IMPLICIT NONE CHARACTER*40 FILETOREAD CHARACTER*20 TEXT20 CHARACTER*300 COMMENT REAL SCOPEDATA(500,8,500), XMEASURED(17), SCDATA(500),TIME INTEGER IODATA, F, EVENT, NCHANNEL,NWORD,PAD, K, I, J IODATA = 30 open(iodata,file=FILETOREAD,form="unformatted") READ(IODATA) TEXT20 READ(TEXT20,*) NCHANNEL, NWORD, TIME READ(IODATA) COMMENT READ(COMMENT(13:19), *) XMEASURED(F) XMEASURED(F) = XMEASURED(F)-21.983 DO K=1,500 READ(IODATA) TEXT20 READ(TEXT20,90) EVENT 90 FORMAT(6X,I7) DO I=1,NCHANNEL READ(IODATA) TEXT20 READ(TEXT20, 91) PAD 91 FORMAT(4X, I7) READ(IODATA) SCDATA DO J=1,NWORD SCOPEDATA(J,I,K) = SCDATA(J) ENDDO ENDDO ENDDO CLOSE(IODATA) RETURN END CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC SUBROUTINE FINDAVG(SCOPEDATA, AVGDATA, FILENUM) IMPLICIT NONE REAL SCOPEDATA(500,8,500), AVGDATA(500,8,17),GOODCOUNT INTEGER H,I,J, FILENUM LOGICAL GOOD GOODCOUNT=0. DO H=1,8 DO J=1,500 AVGDATA(J,H,filenum) = 0 ENDDO ENDDO DO H=1,500 CALL DATAISGOOD(SCOPEDATA,FILENUM,H,GOOD) IF (GOOD) THEN DO I=1,8 DO J=1,500 AVGDATA(J,I, FILENUM) = AVGDATA(J,I, FILENUM) + + SCOPEDATA(J,I,H) ENDDO ENDDO GOODCOUNT = GOODCOUNT+1 ENDIF ENDDO DO H=1,8 DO J=1,500 AVGDATA(J,H,FILENUM) = AVGDATA(J,H,FILENUM)/GOODCOUNT ENDDO ENDDO RETURN END CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC SUBROUTINE FITTER(AVGDATA,FITPARAM, WNDWS, FILENUM) IMPLICIT NONE REAL AVGDATA(500,8,17), FITPARAM(6,8,17), MIN, TEMP REAL CHI,COEFF(6),DEV(6), EXTREMA, VAL, TEMP2, BINP,WNDWS(2,3,17) INTEGER I,IDNUM, POS,J, FILENUM,K,N CHARACTER TEXT20*20 DO I=4,6 WRITE(TEXT20,*) "RUN", FILENUM, " CHANNEL", I+14 CALL HBOOK1(FILENUM*10+I, TEXT20, INT(WNDWS(2,I-3,FILENUM) + - WNDWS(1,I-3,FILENUM)), WNDWS(1,I-3,FILENUM), + WNDWS(2,I-3,FILENUM),0.) CALL HPAK(FILENUM*10+I,AVGDATA(INT(WNDWS(1,I-3,FILENUM)) + ,I,FILENUM)) if ((FILENUM .eq. 3 .AND. I .EQ. 4) .OR. + (FILENUM .EQ. 15 .AND. I .EQ. 6)) THEN COEFF(6)=0 CALL HFITPO(FILENUM*10+I,5,COEFF, CHI, 2, DEV) ELSE CALL HFITPO(FILENUM*10+I,6,COEFF,CHI,2,DEV) ENDIF write(36,*) WNDWS(1,I-3,FILENUM),WNDWS(2,I-3,FILENUM),COEFF(6), + COEFF(5),COEFF(4),COEFF(3),COEFF(2),COEFF(1) write(38,*) (avgdata(n,i,filenum)*1000.,n=wndws(1,I-3,FILENUM), + WNDWS(2,I-3,FILENUM)) DO J=1,6 FITPARAM(J,I,FILENUM) = COEFF(J) ENDDO ENDDO RETURN END CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC SUBROUTINE LOCALMAXMIN(COEFF, EXT, LSTART, RSTART) IMPLICIT NONE REAL COEFF(6), M,L,R, LFUN, RFUN, MFUN, EXT, LSTART, RSTART L=LSTART R=RSTART DO WHILE(ABS(R-L) .GE. 0.01) M=(L+R)/2. LFUN=5*COEFF(6)*L**4+4*COEFF(5)*L**3+3*COEFF(4)*L**2 + +2*COEFF(3)*L+COEFF(2) RFUN=5*COEFF(6)*R**4+4*COEFF(5)*R**3+3*COEFF(4)*R**2 + +2*COEFF(3)*R+COEFF(2) MFUN=5*COEFF(6)*M**4+4*COEFF(5)*M**3+3*COEFF(4)*M**2 + +2*COEFF(3)*M+COEFF(2) IF(RFUN*MFUN .LE. 0) THEN L=M ELSE R=M ENDIF ENDDO EXT=COEFF(6)*M**5+COEFF(5)*M**4+COEFF(4)*M**3+COEFF(3)*M**2 + +COEFF(2)*M+COEFF(1) RETURN END CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC SUBROUTINE DBLDERIV(COEFF, EXTREMA, VAL) IMPLICIT NONE REAL COEFF(6), EXTREMA, VAL VAL = 20*COEFF(6)*EXTREMA**3+12*COEFF(5)*EXTREMA**2 + +6*COEFF(4)*EXTREMA+2*COEFF(3) RETURN END CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC SUBROUTINE CALIBPLOT(AVGDATA, XMEASURED, XPOS,FITPARAM, WNDWS) IMPLICIT NONE REAL AVGDATA(500,8,17), FITPARAM(6,8,17), WNDWS(2,3,17) REAL XMEASURED(17), AMPLITUDE(3),XPOS(3),COEFF(6) REAL XMID(17), RL,RR, XRAT(17), ERRL,ERRR INTEGER I,J,K,M OPEN(34,file="calcvsmeasure.txt") OPEN(35, FILE="amplitudes.txt") open(37, FILE="rl_rr_xmeasured.txt") WRITE(37,*) "RUN"," RL "," RR "," XPOS " DO I=1,17 DO J=4,6 DO K=1,6 COEFF(K) = FITPARAM(K,J,I) ENDDO CALL LOCALMAXMIN(COEFF, AMPLITUDE(J-3), WNDWS(1,J-3,I) + ,WNDWS(2,J-3,I)) WRITE(35,*) "EVENT:", I, " CHANNEL:", J+14, " AMPL:", + AMPLITUDE(J-3) ENDDO XMID(I)=0 DO M=1,3 XMID(I) = XMID(I) + AMPLITUDE(M)*XPOS(M) ENDDO XMID(I) = XMID(I) / (AMPLITUDE(1)+AMPLITUDE(2)+AMPLITUDE(3)) RL=AMPLITUDE(1)/AMPLITUDE(2) RR=AMPLITUDE(3)/AMPLITUDE(2) WRITE(37, *) I, RL, RR, XMEASURED(I) ERRL = (1./RL)**2*(AMPLITUDE(1)*AMPLITUDE(2)/(AMPLITUDE(1) + +AMPLITUDE(2))) ERRR = (1./RR)**2*(AMPLITUDE(3)*AMPLITUDE(2)/(AMPLITUDE(3) + +AMPLITUDE(2))) XRAT(I)=(ERRL*XPOS(1)+ERRR*XPOS(3))/(ERRL+ERRR) ENDDO WRITE(34,*) "RUN", " CENTROID", " XMICROMETER" DO I=1,17 WRITE(34,*) I, XMID(I), XMEASURED(I) ENDDO CLOSE(34) CLOSE(35) close(37) RETURN END CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC SUBROUTINE WINDOWS(WNDWS) IMPLICIT NONE REAL WNDWS(2,3,17) WNDWS(1,1,1) = 110. WNDWS(2,1,1) = 140. WNDWS(1,2,1) = 110. WNDWS(2,2,1) = 140. WNDWS(1,3,1) = 200. WNDWS(2,3,1) = 350. WNDWS(1,1,2) = 110. WNDWS(2,1,2) = 135. WNDWS(1,2,2) = 110. WNDWS(2,2,2) = 140. WNDWS(1,3,2) = 190. WNDWS(2,3,2) = 340. WNDWS(1,1,3) = 110. WNDWS(2,1,3) = 150. WNDWS(1,2,3) = 110. WNDWS(2,2,3) = 140. WNDWS(1,3,3) = 170. WNDWS(2,3,3) = 320. WNDWS(1,1,4) = 120. WNDWS(2,1,4) = 190. WNDWS(1,2,4) = 110. WNDWS(2,2,4) = 140. WNDWS(1,3,4) = 170. WNDWS(2,3,4) = 320. WNDWS(1,1,5) = 120. WNDWS(2,1,5) = 190. WNDWS(1,2,5) = 110. WNDWS(2,2,5) = 140. WNDWS(1,3,5) = 170. WNDWS(2,3,5) = 280. WNDWS(1,1,6) = 120. WNDWS(2,1,6) = 200. WNDWS(1,2,6) = 110. WNDWS(2,2,6) = 140. WNDWS(1,3,6) = 160. WNDWS(2,3,6) = 300. WNDWS(1,1,7) = 130. WNDWS(2,1,7) = 220. WNDWS(1,2,7) = 110. WNDWS(2,2,7) = 140. WNDWS(1,3,7) = 140. WNDWS(2,3,7) = 290. WNDWS(1,1,8) = 140. WNDWS(2,1,8) = 230. WNDWS(1,2,8) = 110. WNDWS(2,2,8) = 140. WNDWS(1,3,8) = 130. WNDWS(2,3,8) = 280. WNDWS(1,1,9) = 150. WNDWS(2,1,9) = 250. WNDWS(1,2,9) = 110. WNDWS(2,2,9) = 140. WNDWS(1,3,9) = 130. WNDWS(2,3,9) = 230. WNDWS(1,1,10) = 160. WNDWS(2,1,10) = 250. WNDWS(1,2,10) = 110. WNDWS(2,2,10) = 140. WNDWS(1,3,10) = 120. WNDWS(2,3,10) = 270. WNDWS(1,1,11) = 170. WNDWS(2,1,11) = 260. WNDWS(1,2,11) = 110. WNDWS(2,2,11) = 140. WNDWS(1,3,11) = 120. WNDWS(2,3,11) = 270. WNDWS(1,1,12) = 180. WNDWS(2,1,12) = 270. WNDWS(1,2,12) = 110. WNDWS(2,2,12) = 140. WNDWS(1,3,12) = 120. WNDWS(2,3,12) = 180. WNDWS(1,1,13) = 180. WNDWS(2,1,13) = 290. WNDWS(1,2,13) = 110. WNDWS(2,2,13) = 140. WNDWS(1,3,13) = 120. WNDWS(2,3,13) = 180. WNDWS(1,1,14) = 190. WNDWS(2,1,14) = 300. WNDWS(1,2,14) = 110. WNDWS(2,2,14) = 140. WNDWS(1,3,14) = 120. WNDWS(2,3,14) = 160. WNDWS(1,1,15) = 200. WNDWS(2,1,15) = 310. WNDWS(1,2,15) = 110. WNDWS(2,2,15) = 140. WNDWS(1,3,15) = 110. WNDWS(2,3,15) = 150. WNDWS(1,1,16) = 200. WNDWS(2,1,16) = 300. WNDWS(1,2,16) = 110. WNDWS(2,2,16) = 140. WNDWS(1,3,16) = 110. WNDWS(2,3,16) = 135. WNDWS(1,1,17) = 200. WNDWS(2,1,17) = 350. WNDWS(1,2,17) = 110. WNDWS(2,2,17) = 140. WNDWS(1,3,17) = 110. WNDWS(2,3,17) = 140. RETURN END CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC SUBROUTINE DATAISGOOD(SCOPEDATA,FILENUM,EVENT,GOOD) IMPLICIT NONE REAL SCOPEDATA(500,8,500),MIN,TEMP,DIFF INTEGER FILENUM,EVENT,I,POS,SCOPENUM,M,Q LOGICAL GOOD MIN = 0. GOOD=.TRUE. DO I=1,8 DO M=50,150 TEMP = SCOPEDATA(M,I,EVENT) IF (TEMP .LE. MIN) THEN MIN = TEMP POS = M SCOPENUM = I ENDIF ENDDO ENDDO IF ((MIN .LE. -0.12) .AND. (MIN .GE. -0.35)) THEN DO Q=POS,150 DIFF = (SCOPEDATA(Q,SCOPENUM,EVENT)- + SCOPEDATA(Q+1,SCOPENUM,EVENT))/MIN IF (ABS(DIFF) .GE. 0.2) THEN GOOD = .FALSE. ENDIF ENDDO ELSE GOOD = .FALSE. ENDIF RETURN END