C HILUMDRIFT.FOR HILUMDRIFT.FOR C C 24 Sep 2013 ******************************************************************************** C Spread out deposited charge over 30 ns ************************************************ C In FUNCTION DI divide PROB(I) by PROB at V0/A=2200 V/mm ************************************ C C Main program to guide HILMDRFT in batch C Link this with HILMDRFT C To run this job type the following: C nohup drifter.exe > drifter.log & C To stop this process before it completes look up its pid in the top C facility, for instance, and then type C kill -9 C This version has ionization every 1 us modulated in amplitude C by a function similar to that observed in the HiLum Cerenkov data C 08 Oct 2010 C 26 Feb 2011 Modified for comparing with Leonid C 24 Sep 2013 This version has the option for ionization every rf bunch, i.e. every C 165 ns. It reads in a GADC file and uses the cherenkov pulse height to determine C the deposited charge. Some enhancements and minor corrections are included here. C C Never set VAR(1), VAR(6), IV(1), IV(3), IV(6) C Initialize VAR(2), VAR(4), VAR(7), VAR(8), VAR(9), VAR(10) but don't C change them again. C COMMON /VARIBL/VAR(15),DVR(15),IV(15),NV,IL,LN(15) C C VAR(2) IV(2) Meaning C V0 Potential across gap A C .LT.0 Reinitialize and start again C .EQ.0 No change C .GT.0 Number of Iterations (must be less than ~2E9 C VAR(3) Multiplier for DT (to speed up iterations) C IV(3) Total number of iterations (Read-only, do not set this) C VAR(4) Recombination rate C IV(4) Divide gap into NN pieces C VAR(5) Meaning C 1. Set first order conditions C 2. Read in data from file C -2. Write out data to file C IV(5) Select e- Ar+ bulk recombination rate E-field dependence C VAR(6) Instantaneous ionization (10000. is min. ionizing) C IV(6) Flag to inject instantaneous ionization C VAR(7) E0 for calculation of DI C IV(7) Flag to choose HV plateau shape C .EQ.-1 Flat above VAR(7), i.e. no dependence on HV C VAR(8) PMOB for calculation of VP C VAR(9) ESCAL to scale electron velocity to speed convergence C VAR(10) D0 ionization rate at infinite potential C IV(10) Flag for z-dependent ionization rate DI C .EQ.0 Flat ionization rate C .EQ.1 Ionization rate rises with z C .EQ.-1 Ionization rate falls with z C C Variables to initialize C VAR(2) !Set in READINPARMS VAR(3)=0.25 !Multiplier for DT C VAR(4) !Set in READINPARMS VAR(7)=0.001 !E0 for `ideal' situation C VAR(7)=84. !E0 in calculation of DI C VAR(8) !Set in READINPARMS VAR(9)=1.0 !ESCAL C VAR(10) !Set in READINPARMS VAR(11)=0.10 !ppm of O2 IV(5)=0 !Use variable bulk recombination IV(7)=7 !Best fit plateau curve C IV(9)=1 !Idealized dependence of electron velocity on E field IV(9)=2 !Realistic dependence of electron velocity on E field IV(10)=0 !Use ionization rate which changes linearly with z IV(11)=0 !Turn on/off diffusion C Other variables C CALL READINPARMS CALL SKCEREN C C 1st Cycle ******************************** IV(4)=128 !NN Divide gap into NN pieces VAR(5)=0. IV(2)=-1 !Initialize Y=FUNCT(X) C C IV(2)=10752550 !No. of iterations just after bunch C IV(2)=10753072 !No. of iterations just before bunch C IV(2)=2*10752550 !No. of iterations just after bunch C IV(2)=2*10753072 !No. of iterations just before bunch C IV(2)=20*10751995 !No. of iterations IV(2)=845121782 !No. of iterations to get to event 59 (count from 0) C IV(2)=15000000 C IV(2)=10004 Y=FUNCT(X) C VAR(5)=-2. !Write out data to file (001) Y=FUNCT(X) C STOP END SUBROUTINE REPORTI(ITER) COMMON /VARIBL/VAR(15),DVR(15),IV(15),NV,IL,LN(15) PARAMETER (N=2048) COMMON /CHARGE/NN,ND,QP(N),QB(N),QM(N),QX(N),QG(N),QQ(N) REAL*8 QP,QB,QM,QX,QG,QQ COMMON /CRNTS/JP(0:N),JB(0:N),JM(0:N),JX(0:N),JG(0:N),JQ(0:N) REAL*8 JP,JB,JM,JX,JG,JQ COMMON /FIELD/EZ(N),EDZ(0:N),DEZ(0:N),VV(N) REAL*8 EZ,EDZ,DEZ,VV COMMON /LPARS/V0,A,D0 REAL*8 V0,A,D0 COMMON /OTHPMS/EOEPS,DZ,DT,DTMDZ,DTODZ,RCOM,PROB2200 REAL*8 EOEPS,DZ,DT,DTMDZ,DTODZ,RCOM,PROB2200 REAL*8 RTIME,RFBUNCH,DRFBUNCH INTEGER*4 ICBUF,IRFBUNCH REAL*8 RCBUF REAL*8 CURZ0,CURZN,JQAVE PARAMETER (BUFSIZE=1024*1024*16) COMMON /GADC/CHV,PEDEST,CHCAL,NW16, 1 CBUF(BUFSIZE),CFLG(BUFSIZE),COVF(BUFSIZE), 2 MEVT,EVTPNT(200),EVTBEG(200),EVTEND(200), 3 MODFLG(30) REAL*8 CHV,PEDEST,CHCAL INTEGER*4 NW16 INTEGER*2 CBUF,CFLG,COVF INTEGER*4 EVTPNT,EVTBEG,EVTEND INTEGER*4 MODFLG COMMON /CCALS/PEP,RFCYCLET,CHOUT REAL*8 PEP,RFCYCLET CHARACTER*100 CHOUT COMMON /TRIGGER/ITRIG,IFTRIG LOGICAL ITRIG,IFTRIG COMMON /GADCFILE/CPATH,CFILENAME CHARACTER*37 CPATH ! For atlasxx C CHARACTER*42 CPATH ! For my laptop CHARACTER*150 CFILENAME COMMON /DATETIME/VALUES,TIMESTAMP CHARACTER*19 TIMESTAMP INTEGER*4 VALUES(8) CHARACTER*8 DATE CHARACTER*10 TIME CHARACTER*5 ZONE CHARACTER*60 FILEN CHARACTER*15 CEVT INTEGER EVTNO INTEGER IVAR2,IVAR4 LOGICAL FIRST DATA FIRST/.TRUE./ C IF(FIRST) THEN CALL DATE_AND_TIME(DATE,TIME,ZONE,VALUES) TIMESTAMP=DATE(1:4)//'-'//DATE(5:6)//'-' 1 //DATE(7:8)//'-'//TIME(1:2)//'-' 2 //TIME(3:4)//'-'//TIME(5:6) FILEN='drifter-'//TIMESTAMP//'.dat' OPEN(UNIT=2,FILE=FILEN,STATUS='REPLACE') WRITE(2,100) A,V0,DT*1.0D9,PEP,CFILENAME 100 FORMAT(' HiLum uEMEC Currents in',F6.3,' mm gap ', 1 'with V0 =',F6.0,' V, DT =',F15.10,' ns, pep =', 2 F6.3,/,' GADC file ',A80) WRITE(2,105) CHOUT 105 FORMAT(A100) IVAR2=VAR(2) IVAR4=VAR(4) WRITE(2,110) 110 FORMAT(' VAR2 VAR3 VAR4 VAR8 VAR9 VAR11 VAR12', 1 ' VAR13 IV4 IV5 IV7 IV9 IV10 IV11') WRITE(2,120) IVAR2,VAR(3),IVAR4,VAR(8),VAR(9),VAR(11), 1 VAR(12),VAR(13),IV(4),IV(5),IV(7),IV(9),IV(10),IV(11) 120 FORMAT(I7,F7.2,I7,F7.3,F7.3,F7.2,F7.2,F7.2,1X,6I5) WRITE(2,150) 150 FORMAT(8X,'ITER',10X,'TIME',12X,'CURZ0',12X,'CURZN', 1 12X,'JQAVE',3X,'RFBUNCH',5X,'CBUF') EVTNO=0 FIRST=.FALSE. ENDIF CURZ0=DEZ( 0)/DT/EOEPS+JQ( 0) CURZN=DEZ(NN)/DT/EOEPS+JQ(NN) JQAVE=0. DO I=0,NN JQAVE=JQAVE+JQ(I) ENDDO JQAVE=(JQAVE-0.5*JQ(0)-0.5*JQ(NN))*DZ/A RTIME=DBLE(ITER)*DT RFBUNCH=DBLE(ITER)*DT/RFCYCLET ! IRFBUNCH=INT(RFBUNCH)+1 DRFBUNCH=RFBUNCH-DBLE(IRFBUNCH)+1.0D0 RCBUF=0.0 IF((IRFBUNCH.LE.BUFSIZE).AND.(DRFBUNCH.GE.0.0) 1 .AND.(DRFBUNCH.LT.DT/RFCYCLET)) 2 RCBUF=DBLE(CBUF(IRFBUNCH))-PEDEST CEVT=' ' IF(IFTRIG) THEN EVTNO=EVTNO+1 WRITE(CEVT,160) EVTNO 160 FORMAT(' EvtNo:',I4) ENDIF WRITE(2,200) ITER,RTIME,CURZ0,CURZN,JQAVE,IRFBUNCH,RCBUF,CEVT 200 FORMAT(I12,F14.10,1P,3D17.9,I10,0P,F9.2,A15) C RETURN END INTEGER*2 FUNCTION RSHORT() INTEGER*2 INTW INTEGER*4 IREC DATA IREC/1/ C READ(21,REC=IREC) INTW IREC=IREC+1 RSHORT=INTW C RETURN END INTEGER*4 FUNCTION RINT() INTEGER*2 RSH(2) INTEGER*4 SINT EQUIVALENCE (SINT,RSH) INTEGER*2 RSHORT C RSH(1)=RSHORT() RSH(2)=RSHORT() RINT=SINT C RETURN END REAL*8 FUNCTION RDOUBLE() INTEGER*2 RSH(4) REAL*8 SDOUBLE EQUIVALENCE (SDOUBLE,RSH) INTEGER*2 RSHORT C RSH(1)=RSHORT() RSH(2)=RSHORT() RSH(3)=RSHORT() RSH(4)=RSHORT() RDOUBLE=SDOUBLE C RETURN END SUBROUTINE SKCEREN C Read in gated Cerenkov adc data PARAMETER (BUFSIZE=1024*1024*16) PARAMETER (NEVT=150) COMMON /GADC/CHV,PEDEST,CHCAL,NW16, 1 CBUF(BUFSIZE),CFLG(BUFSIZE),COVF(BUFSIZE), 2 MEVT,EVTPNT(200),EVTBEG(200),EVTEND(200), 3 MODFLG(30) REAL*8 CHV,PEDEST,CHCAL INTEGER*4 NW16 INTEGER*2 CBUF,CFLG,COVF INTEGER*4 EVTPNT,EVTBEG,EVTEND INTEGER*4 MODFLG COMMON /CCALS/PEP,RFCYCLET,CHOUT REAL*8 PEP,RFCYCLET CHARACTER*100 CHOUT DATA PEP/1.31/ ! Photo-electrons per proton C DATA PEP/0.73/ ! Savin's improved estimate ********** Use when ready ********** DATA RFCYCLET/165.0D-9/ COMMON /GADCFILE/CPATH,CFILENAME CHARACTER*37 CPATH ! For atlasxx C CHARACTER*42 CPATH ! For my laptop CHARACTER*150 CFILENAME INTEGER*4 TRNCNT1(30),TRNCNT2(30),TRNCNT3(30),TRNCNT4(30) REAL*8 APH1(30), APH2(30), APH3(30), APH4(30) INTEGER*4 CNT1, CNT2, CNT3, CNT4 DATA CNT1,CNT2,CNT3,CNT4/0,0,0,0/ INTEGER*4 NPED INTEGER*4 OFFSET DATA OFFSET/25/ INTEGER*2 BTYPE,BBUF INTEGER*4 BLNGT REAL*8 BDATA INTEGER*4 BIDATA INTEGER*2 RSHORT INTEGER*4 RINT INTEGER*4 HIBIN REAL*8 RDOUBLE LOGICAL FILLED,FL1,FL2,FL3 C Parameters for calculation of cherenkov calibration REAL*8 VA,VB,QA,SA,SB REAL*8 P1,P2,P3 ! Calibration for 1 phe DATA P1/9.93/,P2/0.35/,P3/-0.13/ REAL*8 R1,R2 ! Convert HV to V DATA R1/0.0178/,R2/0.9723/ REAL*8 CALIB ! GADC counts per phe at VB DATA CALIB/40.38/ REAL*8 EPP,W,VOL,CAL DATA EPP/19.302/ ! Visible energy deposit (MeV) in uEMEC LAr per proton DATA W/23.6/ ! Deposited energy (eV) in LAr per ion-electron pair DATA VOL/43200./ ! uEMEC LAr volume in mm^3 60x60x2x6 C C Read in a gated cherenkov file CPATH='/atlas04/raid04/HiLum/cherenkov/data/' ! For atlasxx C CPATH='/scratch/raid/HiLum/Mar13data0/Mar13Ceren/' ! For my laptop C CFILENAME=CPATH//'spill-2013-03-25-17-06-38.dat' ! Goes with run 1141 C CFILENAME=CPATH//'spill-2013-03-24-05-51-51.dat' ! Goes with run 1086 CFILENAME=CPATH//'spill-2013-03-24-09-47-41.dat' ! Goes with run 1092 OPEN(UNIT=21,FILE=CFILENAME,STATUS='OLD',RECL=2, 1 ACCESS='DIRECT',FORM='UNFORMATTED',ERR=200) BTYPE=RSHORT() ! Read in HV-block header BLNGT=RINT() ! Read in HV-block word count DO I=1,8 BDATA=RDOUBLE() ! Read in HV-block data IF(I.EQ.2) CHV=BDATA ENDDO BTYPE=RSHORT() ! Read in time-block header BLNGT=RINT() ! Read in time-block word count BIDATA=RINT() ! Read in time-block data word BTYPE=RSHORT() ! Read in C-block header NW16=RINT() ! Read in C-block word count PEDEST=0.0D0 NPED=0 MEVT=0 DO I=1,30 TRNCNT1(I)=0 TRNCNT2(I)=0 TRNCNT3(I)=0 TRNCNT4(I)=0 ENDDO DO I=1,NW16 BBUF=RSHORT() ! Read in C-block data CBUF(I)=IAND(BBUF,4095) IF(I.LT.1000) THEN PEDEST=PEDEST+DBLE(CBUF(I)) NPED=NPED+1 ENDIF CFLG(I)=0 IF(IAND(BBUF,4096).NE.0) CFLG(I)=1 COVF(I)=0 IF(IAND(BBUF,8192).NE.0) COVF(I)=1 IF((I.EQ.1).AND.(CFLG(I).EQ.1)) THEN MEVT=MEVT+1 EVTPNT(MEVT)=I ENDIF IF((I.GE.2).AND.(CFLG(I-1).EQ.0).AND.(CFLG(I).EQ.1)) THEN MEVT=MEVT+1 EVTPNT(MEVT)=I IF(I.GT.OFFSET) EVTPNT(MEVT)=I-OFFSET ENDIF EVTBEG(MEVT)=EVTPNT(MEVT) IF(CFLG(I).EQ.1) EVTEND(MEVT)=I ENDDO CLOSE(UNIT=21) PRINT 30, CFILENAME 30 FORMAT(A150) PRINT 40 40 FORMAT(' EVTNO EVTPNT EVTBEG EVTEND') DO I=1,MEVT PRINT 50, I-1,EVTPNT(I),EVTBEG(I),EVTEND(I) 50 FORMAT(I6,3I9) ENDDO PEDEST=PEDEST/DBLE(NPED) PRINT 100, PEDEST 100 FORMAT(' GADC pedestal = ',F8.2) C PRINT 110 110 FORMAT(7X,'I J CBUF CFLG COVF') DO I=1,NW16 J=MOD(I-1,30)+1 TRNCNT1(J)=TRNCNT1(J)+CBUF(I)-INT(PEDEST+0.5) CNT1=CNT1+1 IF((I.GE.EVTPNT(30)).AND.(I.LE.EVTPNT(80))) THEN TRNCNT2(J)=TRNCNT2(J)+CBUF(I)-INT(PEDEST+0.5) CNT2=CNT2+1 ENDIF IF((I.GE.EVTBEG(46)).AND.(I.LT.EVTBEG(46)+30)) THEN TRNCNT3(J)=TRNCNT3(J)+CBUF(I)-INT(PEDEST+0.5) CNT3=CNT3+1 ENDIF IF((I.GE.EVTBEG(47)).AND.(I.LT.EVTBEG(47)+30)) THEN TRNCNT4(J)=TRNCNT4(J)+CBUF(I)-INT(PEDEST+0.5) CNT4=CNT4+1 ENDIF C IF((I.GE.EVTBEG(1)).AND.(I.LT.EVTBEG(1)+43)) C 1 PRINT 10, I-1,J,CBUF(I),CFLG(I),COVF(I) 10 FORMAT(I8,I4,3I6) ENDDO DO I=1,30 APH1(I)=DBLE(TRNCNT1(I))/DBLE(CNT1)*30. APH2(I)=DBLE(TRNCNT2(I))/DBLE(CNT2)*30. APH3(I)=DBLE(TRNCNT3(I))/DBLE(CNT3)*30. APH4(I)=DBLE(TRNCNT4(I))/DBLE(CNT4)*30. ENDDO PRINT 15, NW16 15 FORMAT(' NW16:',I10) PRINT 20 20 FORMAT('Bin TRNCNT1 TRNCNT2 TRNCNT3 TRNCNT4 MODFLG') HIBIN=-100000 IMAX=-1 DO I=1,30 MODFLG(I)=0 IF(TRNCNT1(I).GT.HIBIN) THEN HIBIN=TRNCNT1(I) IMAX=I ENDIF ENDDO DO I=31,60 JL=MOD((I-2),30)+1 JJ=MOD((I-1),30)+1 JH=MOD(( I),30)+1 FL1=TRNCNT1(JJ).GT.HIBIN/4 FL2=TRNCNT1(JH).GT.TRNCNT1(JJ) FL3=TRNCNT1(JJ).GT.HIBIN/8 FILLED=FL1.OR.(FL2.AND.FL3) IF(FILLED) MODFLG(JJ)=2 ENDDO DO I=31,60 JL=MOD((I-2),30)+1 JJ=MOD((I-1),30)+1 JH=MOD(( I),30)+1 IF((MODFLG(JL).EQ.0).AND.(MODFLG(JJ).EQ.2).AND.(MODFLG(JH).EQ.0)) 1 MODFLG(JJ)=1 ENDDO DO I=1,30 PRINT 170, I-1, APH1(I),APH2(I),APH3(I),APH4(I),MODFLG(I) 170 FORMAT(I3,4F12.2,I4) ENDDO DO I=1,NW16 J=MOD(I-1,30)+1 IF(MODFLG(J).EQ.0) CBUF(I)=INT(PEDEST) ENDDO C Calculate cherenkov calibration CAL=EPP*1.D6/W/VOL/PEP ! e-ion pairs per mm^3 per photo-electron VA=R1+R2*CHV/1000 ! Corrected phototube potential in kV VB=2.528 ! Standard potential in kV SA=P1+P2*VA+P3*VA*VA SB=P1+P2*VB+P3*VB*VB QA=CALIB*(VA**SA)/(VB**SB) ! GADC counts per photo-electron CHCAL=CAL/QA C When available, convert photoelectrons into protons WRITE(CHOUT,180) CHV,1.0/QA/PEP,CHCAL 180 FORMAT(' CHV:',F8.2,' V',3X,'protons/ADC count:',G15.5, 1 3X,'e/mm^3/ADC count:',G15.5) RETURN 200 PRINT 210, CFILENAME 210 FORMAT(' Did not open ',A150) C RETURN END REAL*8 FUNCTION DI(ITER,I) COMMON /VARIBL/VAR(15),DVR(15),IV(15),NV,IL,LN(15) COMMON /LPARS/V0,A,D0 REAL*8 V0,A,D0 COMMON /OTHPMS/EOEPS,DZ,DT,DTMDZ,DTODZ,RCOM,PROB2200 REAL*8 EOEPS,DZ,DT,DTMDZ,DTODZ,RCOM,PROB2200 COMMON /TRIGGER/ITRIG,IFTRIG LOGICAL ITRIG,IFTRIG REAL*8 RFBUNCH,DRFBUNCH INTEGER*4 IRFBUNCH,ITBUNCH PARAMETER (BUFSIZE=1024*1024*16) COMMON /GADC/CHV,PEDEST,CHCAL,NW16, 1 CBUF(BUFSIZE),CFLG(BUFSIZE),COVF(BUFSIZE), 2 MEVT,EVTPNT(200),EVTBEG(200),EVTEND(200), 3 MODFLG(30) REAL*8 CHV,PEDEST,CHCAL INTEGER*4 NW16 INTEGER*2 CBUF,CFLG,COVF INTEGER*4 EVTPNT,EVTBEG,EVTEND INTEGER*4 MODFLG COMMON /CCALS/PEP,RFCYCLET,CHOUT REAL*8 PEP,RFCYCLET CHARACTER*100 CHOUT INTEGER IOFF ! Offset of event flag from beginning of event DATA IOFF/25/ C RFBUNCH=DBLE(ITER)*DT/RFCYCLET ! IRFBUNCH=INT(RFBUNCH)+1 DRFBUNCH=RFBUNCH-DBLE(IRFBUNCH)+1.0D0 ITBUNCH=INT(RFCYCLET*1.D9*DRFBUNCH)+1 ! Time in ns since beginning of RF cycle DI=0.0 IF((IRFBUNCH.LE.BUFSIZE).AND.(ITBUNCH.GE.1).AND.(ITBUNCH.LE.30)) 1 DI=DIRF(ITER,ITBUNCH,IRFBUNCH)*PROB(I)/PROB2200 C Trigger readout if event flag is set IRF=IRFBUNCH+IOFF IF((IRF.LE.BUFSIZE).AND.(CFLG(IRF).EQ.1)) THEN ! Flag to write events IFTRIG=.FALSE. IF(.NOT.ITRIG) IFTRIG=.TRUE. ITRIG=.TRUE. ELSE ITRIG=.FALSE. ENDIF C RETURN END REAL*8 FUNCTION DIRF(ITER,ITRF,IRF) INTEGER ITRF C Calculate ionization in uEMEC DIRF for RF bunch IRF PARAMETER (BUFSIZE=1024*1024*16) COMMON /GADC/CHV,PEDEST,CHCAL,NW16, 1 CBUF(BUFSIZE),CFLG(BUFSIZE),COVF(BUFSIZE), 2 MEVT,EVTPNT(200),EVTBEG(200),EVTEND(200), 3 MODFLG(30) REAL*8 CHV,PEDEST,CHCAL INTEGER*4 NW16 INTEGER*2 CBUF,CFLG,COVF INTEGER*4 EVTPNT,EVTBEG,EVTEND INTEGER*4 MODFLG COMMON /OTHPMS/EOEPS,DZ,DT,DTMDZ,DTODZ,RCOM,PROB2200 REAL*8 EOEPS,DZ,DT,DTMDZ,DTODZ,RCOM,PROB2200 REAL*8 WSUM C Bunch shape in time over 30 ns span REAL*8 BSH(30) DATA BSH/1.,2.,3.,4.,5.,6.,7.,8.,9.,10.,11.,12.,13.,14.,15., 1 15.,14.,13.,12.,11.,10.,9.,8.,7.,6.,5.,4.,3.,2.,1./ INTEGER ITERLAST,ITRFLAST LOGICAL FIRST,NEXT DATA FIRST/.TRUE./ DATA NEXT /.TRUE./ C IF(FIRST) THEN WSUM=0.D0 DO I=1,30 WSUM=WSUM+BSH(I) ENDDO DO I=1,30 BSH(I)=BSH(I)/WSUM ENDDO ITERLAST=0 ITRFLAST=0 FIRST=.FALSE. ENDIF IF(ITER.NE.ITERLAST) THEN NEXT=.TRUE. IF(ITRF.EQ.ITRFLAST) NEXT=.FALSE. ENDIF J=MOD((IRF-1),30)+1 DIRF=0.0D0 IF(NEXT.AND.(IRF.LE.BUFSIZE).AND.(MODFLG(J).GT.0)) THEN DIRF=(DBLE(CBUF(IRF))-PEDEST)*CHCAL*BSH(ITRF)/DT IF(DIRF.LT.0.D0) DIRF=0.D0 ! Don't inject negative ionization ENDIF ITERLAST=ITER ITRFLAST=ITRF C RETURN END REAL*8 FUNCTION CPOT(A) REAL*8 A ! Desired amplitude in ADC counts/proton C Calculate HV potential (in volts) to Cherenkov phototube C Given mean number of Gated Cherenkov ADC counts per proton C (mu*Q1) find HV potential. Use 22.7 ADC counts/proton at 2.6 kV C See Kozelov talk at HiLum Mtg of Sep 2010 C REAL*8 A0,V0 DATA A0/22.7D0/ DATA V0/2600D0/ C CPOT=V0*(A/A0)**(1.0/9.78) C RETURN END SUBROUTINE OPENGATEFILE(CPOTENTIAL,NCHER) REAL*8 CPOTENTIAL ! Gated Cherenkov phototube HV to base C Open gated cherenkov file and write header info COMMON /DATETIME/VALUES,TIMESTAMP CHARACTER*19 TIMESTAMP INTEGER*4 VALUES(8) CHARACTER*8 DATE CHARACTER*10 TIME CHARACTER*5 ZONE C Gated Cerenkov header INTEGER*2 VOLTTYPE DATA VOLTTYPE/11/ INTEGER*4 VOLTLENGTH DATA VOLTLENGTH/32/ REAL*8 VOLTDATA(8) INTEGER*2 TIMETYPE DATA TIMETYPE/12/ INTEGER*4 TIMELENGTH DATA TIMELENGTH/2/ INTEGER*4 UTSTIME INTEGER*4 YMDHMS(6) INTEGER*2 ADCBTYPE DATA ADCBTYPE/15/ INTEGER*4 NW16 CHARACTER*40 FNAME C CALL DATE_AND_TIME(DATE,TIME,ZONE,VALUES) TIMESTAMP=DATE(1:4)//'-'//DATE(5:6)//'-' 1 //DATE(7:8)//'-'//TIME(1:2)//'-' 2 //TIME(3:4)//'-'//TIME(5:6) FNAME='spsim-'//TIMESTAMP//'.asc' OPEN(UNIT=3,FILE=FNAME,STATUS='REPLACE') VOLTDATA(1)=0.0 VOLTDATA(2)=CPOTENTIAL VOLTDATA(3)=0.0 DO I=4,8 VOLTDATA(I)=DBLE(I) ENDDO WRITE(3,100) VOLTTYPE,VOLTLENGTH,(VOLTDATA(I),I=1,8) 100 format(I2,/,I2,/,7(F8.1,/),F8.1) YMDHMS(1)=VALUES(1) YMDHMS(2)=VALUES(2) YMDHMS(3)=VALUES(3) YMDHMS(4)=VALUES(5) YMDHMS(5)=VALUES(6) YMDHMS(6)=VALUES(7) UTS=1364072077 WRITE(3,120) TIMETYPE,TIMELENGTH,(YMDHMS(I),I=1,6) 120 FORMAT(I2,/,I2,/,5(I8,/),I8) NW16=NCHER WRITE(3,140) ADCBTYPE,NW16 140 FORMAT(I2,/,I12) C RETURN END SUBROUTINE GAUSS(R1,R2) IMPLICIT DOUBLE PRECISION(A-H,O-Z) DATA RM/3.0E-39/ C R=RND(1) IF(R.EQ.0.) R=RM R=SQRT(-2.*LOG(R)) THET=2.*3.14159265*RND(1) R1=R*COS(THET) R2=R*SIN(THET) C RETURN END FUNCTION RND(I) IMPLICIT DOUBLE PRECISION(A-H,O-Z) COMMON /SEED/ISEED DATA ISEED/14593/ LOGICAL FIRST DATA FIRST/.TRUE./ C IF(FIRST) THEN RND=RAND(ISEED) FIRST=.FALSE. ENDIF C RND=RAND(0) C RETURN END