SUBROUTINE ZPD2(DATA,MASK,FRAMES,EXPO,PTA,FRAME,EVNUM,SUM,NADDS, & EVENTS,DIODES,PRATE,DRATE,DPERE,CPERE, & FDIODE,STATUS) C C Module Number: 15.2.3 C C Module Name: ZPD2 C C Keyphrase: C ---------- C Locate particle burst events C C Description: C ------------ C This routine locates particle burst events using an array of thresholds. C The sum of the data for each data which has not been corrupted by an C event is accumulated for estimating the dark count. C C FORTRAN Name: zpd2.for C C C Keywords of Accessed Files : C -------------------------- C NONE C C Modules Called: C --------------- C SDAS: C umsput C C History: C -------- C Version Date Author Description C 1 8/30/86 D. Lindler Designed and coded C 2 Jan 88 D. Lindler New SDAS I/O and standards C 3 AUG 88 D. LINDLER ADDED FDIODE PARAMETER C------------------------------------------------------------------------ C INCLUDE FILE FOR THE IRAF77 FORTRAN INTERFACE TO THE IRAF VOS C C C FILE I/O ACCESS MODES C INTEGER RDONLY PARAMETER (RDONLY = 1) INTEGER RDWRIT PARAMETER (RDWRIT = 2) INTEGER WRONLY PARAMETER (WRONLY = 3) INTEGER APPEND PARAMETER (APPEND = 4) C C CODES FOR DATA TYPES C INTEGER TYBOOL PARAMETER (TYBOOL = 1) INTEGER TYCHAR PARAMETER (TYCHAR = 2) INTEGER TYINT PARAMETER (TYINT = 4) INTEGER TYREAL PARAMETER (TYREAL = 6) INTEGER TYDOUB PARAMETER (TYDOUB = 7) C C UMSPUT DESTINATIONS -- CB, DAO, 4-SEP-87 C INTEGER STDOUT PARAMETER (STDOUT = 1) INTEGER STDERR PARAMETER (STDERR = 2) C C UHDAS HEADER PARM TYPES -- CB, DAO, 5-SEP-87 C INTEGER GENHDR PARAMETER (GENHDR = 0) INTEGER IMSPEC PARAMETER (IMSPEC = 1) C C THIS SECTION IS FOR PARAMETERS RELEVANT TO TABLE I/O. C C THESE MAY BE SET BY UTPPTI AND/OR READ BY UTPGTI: C C LENGTH OF ROW (UNIT = SIZE OF REAL) INTEGER TBRLEN PARAMETER (TBRLEN = 1) C INCREASE ROW LENGTH INTEGER TBIRLN PARAMETER (TBIRLN = 2) C NUMBER OF ROWS TO ALLOCATE INTEGER TBALLR PARAMETER (TBALLR = 3) C INCREASE ALLOC NUM OF ROWS INTEGER TBIALR PARAMETER (TBIALR = 4) C WHICH TYPE OF TABLE? (ROW OR COLUMN) INTEGER TBWTYP PARAMETER (TBWTYP = 5) C MAXIMUM NUMBER OF USER PARAMETERS INTEGER TBMXPR PARAMETER (TBMXPR = 6) C MAXIMUM NUMBER OF COLUMNS INTEGER TBMXCL PARAMETER (TBMXCL = 7) C TYPE = ROW-ORDERED TABLE INTEGER TBTYPR PARAMETER (TBTYPR = 11) C TYPE = COLUMN-ORDERED TABLE INTEGER TBTYPC PARAMETER (TBTYPC = 12) C C THESE MAY BE READ BY UTPGTI BUT MAY NOT BE SET: C C NUMBER OF ROWS WRITTEN TO INTEGER TBNROW PARAMETER (TBNROW = 21) C C END IRAF77.INC C C INPUT PARAMETERS C REAL DATA(500) C --->DATA FROM 500 SCIENCE DIODES REAL MASK(500) C --->DATA MASK REAL EXPO(1) C --->ARRAY OF ETIMES FOR EACH FRAME REAL PTA(500) C --->ARRAY OF THRESHOLDS C C INPUT/OUTPUT PARAMETERS C INTEGER FRAMES(1) C --->FRAME NUMBER OF EVENTS INTEGER FRAME C --->FRAME COUNTER INTEGER EVNUM C --->EVENT NUMBER REAL SUM(500) C --->SUM OF COUNT RATES INTEGER NADDS(500) C --->NUMBER OF ADDS TO EACH POINT REAL EVENTS(1) C --->NUMBER OF EVENTS/FRAME REAL DIODES(1) C --->NUMBER OF PARTICLE DIODES/FRAME REAL PRATE(1) C --->PARTICLE COUNT RATE/FRAME REAL DRATE(1) C --->DARK RATE PER FRAME REAL DPERE(1) C --->DIODE PER EVENT REAL CPERE(1) C --->COUNT RATE PER EVENT INTEGER FDIODE(1) C --->FIRST DIODE OF THE EVENT C C OUTPUT PARAMETER C INTEGER STATUS C C LOCAL VARIABLES C CHARACTER*130 CONTXT,MESS INTEGER I C --->INDEX LOGICAL EFLAG C --->EVENT FLAG REAL ETIME,RATE REAL TOT C --->TOTAL DARK FOR FRAME INTEGER NTOT C --->TOTAL GOOD DIODES FOR FRAME C C C INITIALIZATION C IF(FRAME.EQ.0)THEN DO 10 I=1,500 SUM(I)=0.0 NADDS(I)=0 10 CONTINUE EVNUM=0 C --->COUNTER OF EVENTS ENDIF C FRAME=FRAME+1 EVENTS(FRAME)=0.0 PRATE(FRAME)=0.0 DIODES(FRAME)=0.0 EFLAG=.FALSE. C --->NO EVENT BEING PROCESSING ETIME=EXPO(FRAME) TOT=0.0 NTOT=0 C C LOOP ON DIODES C DO 20 I=1,500 IF(MASK(I).EQ.1)THEN C --->CHECK IF DATA IS GOOD RATE=DATA(I)/EXPO(FRAME) C --->COUNTS/SEC. IF(RATE .GT. PTA(I)) THEN C --->PARTICLE EVENT? IF(.NOT.EFLAG)THEN C --->NEW EVENT? EVNUM=EVNUM+1 IF(EVNUM.GT.10000)THEN C --->MAX. NUMBER REACHED CONTXT='MAXIMUM NUMBER OF PARTICLE EVENTS'// * ' REACHED' GO TO 999 ENDIF EFLAG=.TRUE. C --->ON PARTICLE EVENT EVENTS(FRAME)=EVENTS(FRAME)+1 C --->EVENTS PER FRAME DPERE(EVNUM)=0.0 C --->DIODES PER EVENT CPERE(EVNUM)=0.0 C --->COUNTS PER EVENT FRAMES(EVNUM)=FRAME FDIODE(EVNUM)=I+6 ENDIF C --->.NOT. EFLAG DIODES(FRAME)=DIODES(FRAME)+1 C --->PART. DIODES/FRAME PRATE(FRAME)=PRATE(FRAME)+DATA(I) C --->PART. COUNTS/FRAME CPERE(EVNUM)=CPERE(EVNUM)+DATA(I) C --->PART. COUNTS/EVENT DPERE(EVNUM)=DPERE(EVNUM)+1 C --->DIODES PER EVENT ELSE C --->NOT PARTICLE EVENT DIODE SUM(I)=SUM(I)+RATE C --->ACCUM. FOR DARK COUNT NADDS(I)=NADDS(I)+1 TOT=TOT+RATE C --->TOTAL DARK FOR FRAME NTOT=NTOT+1 EFLAG=.FALSE. C --->NO EVENT. ENDIF ENDIF 20 CONTINUE C C COMPUTE DARK RATE FOR FRAME C IF(NTOT.EQ.0)THEN WRITE(MESS,99)FRAME 99 FORMAT(' NO DARK RATE COULD BE COMPUTED FOR FRAME',I5) CALL UMSPUT(MESS,STDOUT,0,STATUS) DRATE(FRAME)=0 ELSE DRATE(FRAME)=TOT/NTOT ENDIF STATUS=0 GO TO 1000 999 CALL UMSPUT(CONTXT,STDOUT+STDERR,0,STATUS) STATUS=1 1000 RETURN END