7-May-1992 23:16:37 VAX FORTRAN V5.4-79 Page 1 5-Sep-1991 13:25:21 [SOURCE]PROM_RESPONSE_BY_INDEX.FOR;1 0001 SUBROUTINE PROM_RESPONSE_BY_INDEX ( SIGN_ETA, MAGN_ETA, PHI, 0002 & INDEX, 0003 & EM_ADC_BYTE, HD_ADC_BYTE, 0004 & LUQ_BYTE ) 0005 C---------------------------------------------------------------------- 0006 C- 0007 C- Purpose and Methods : Reconstruct the set of prom responses for the 0008 C- specified set of ADC bytes, and for all the 0009 C- requested index. 0010 C- 0011 C- Inputs : 0012 C- SIGN_ETA is the sign of the eta index of the trigger 0013 C- tower for which the PROM response is reconstructed. 0014 C- Use 0 to specify a negative eta index, 1 to 0015 C- specify a positive eta index. 0016 C- It is recommended to use one of the compilation 0017 C- constants defined along with the common block. 0018 C- POS_ETA=0 or NEG_ETA=1. 0019 C- 0020 C- MAGN_ETA is the magnitutde of the eta index of the 0021 C- trigger tower for which the PROM response 0022 C- is reconstructed. 0023 C- Range : 1 to 24 0024 C- 0025 C- PHI is the phi index of the trigger tower for 0026 C- which the PROM response is reconstructed. 0027 C- Range : 1 to 32 0028 C- 0029 C- INDEX is the PROM page index for which the 0030 C- PROM response is reconstructed. 0031 C- 0032 C- EM_ADC_BYTE is the ADC output byte (simulated or from First 0033 C- Level Trigger Data Block information) of the 0034 C- ELectro-Magnetic Trigger Tower for which the 0035 C- PROM response is reconstructed. 0036 C- 0037 C- HD_ADC_BYTE is the ADC output byte (simulated or from First 0038 C- Level Trigger Data Block information) of the 0039 C- Hadronic Trigger Tower for which the 0040 C- PROM response is reconstructed. 0041 C- 0042 C- Outputs : 0043 C- LUQ_BYTE is the expected set of PROM ouptuts for all of the 0044 C- constructed quantities. 0045 C- 0046 C- Comments : 0047 C- A call to INIT_LOOKUP_ROUTINES must have been made 0048 C- before this routine can be called. 0049 C- 0050 C- The subroutine will return a zero in any value for 0051 C- which the lookup (or the tower) is not implemented. 0052 C- This simulation will take into account any scale 0053 C- shift performed by the PROM. 0054 C- This simulation will take into account any low 0055 C- energy cutoff performed by the PROM. 0056 C- This simulation will take into account any input or 0057 C- output offset handled by the PROM. 7-May-1992 23:16:37 VAX FORTRAN V5.4-79 Page 2 5-Sep-1991 13:25:21 [SOURCE]PROM_RESPONSE_BY_INDEX.FOR;1 0058 C- This simulation will take into account the fine 0059 C- tuning "Tweak" of each lookup page. 0060 C- 0061 C- Created 16-NOV-1990 MICHIGAN STATE UNIVERSTITY, TRIGGER CONTROL SOFTWARE 0062 C---------------------------------------------------------------------- 0063 IMPLICIT NONE 0064 C 0065 INCLUDE 'D0$PARAMS:LEVEL1_LOOKUP.PARAMS' 0232 INCLUDE 'D0$INC:LEVEL1_LOOKUP.INC' 0524 C 0525 INTEGER SIGN_ETA, MAGN_ETA, PHI 0526 INTEGER INDEX 0527 INTEGER MOMENTUM_INPUT 0528 INTEGER EM_ADC_BYTE, HD_ADC_BYTE 0529 INTEGER NOT_MAPPED, EM, HD, PX, PY 0530 PARAMETER (NOT_MAPPED = 0, EM = 1, HD = 2, PX = 3, PY = 4 ) 0531 INTEGER LUQ_BYTE ( EM:PY ) 0532 C 0533 INTEGER SATURATION 0534 PARAMETER (SATURATION = 255 ) 0535 C 0536 INTEGER QUANT ( EM:PY, PAGE_INDEX_MIN:PAGE_INDEX_MAX ) 0537 INTEGER LUPAGE, PAGE_INDEX 0538 INTEGER EM_ADC_ZERESP, HD_ADC_ZERESP 0539 REAL ADC_CORR(EM_TOWER:TOT_TOWER) 0540 C 0541 LOGICAL FIRST 0542 SAVE FIRST 0543 DATA FIRST /.TRUE./ 0544 C 0545 C---------------------------------------------------------------------- 0546 C 0547 C For first call, put together an array of which quantity 0548 C is associated with each page index 0549 C 0550 IF ( FIRST .EQ. .TRUE. ) THEN 0551 C 0552 DO PAGE_INDEX = PAGE_INDEX_MIN, PAGE_INDEX_MAX 0553 QUANT ( EM, PAGE_INDEX ) = NOT_MAPPED 0554 QUANT ( HD, PAGE_INDEX ) = NOT_MAPPED 0555 QUANT ( PX, PAGE_INDEX ) = NOT_MAPPED 0556 QUANT ( PY, PAGE_INDEX ) = NOT_MAPPED 0557 END DO 0558 C 0559 DO LUPAGE = PAGE_NUM_MIN , PAGE_NUM_MAX 0560 QUANT ( EM, LUQ_PAGE_INDEX(EM_ET_QUANT,LUPAGE) ) = EM_ET_QUANT 0561 QUANT ( EM, LUQ_PAGE_INDEX(EM_L2_QUANT,LUPAGE) ) = EM_L2_QUANT 0562 QUANT ( HD, LUQ_PAGE_INDEX(HD_ET_QUANT,LUPAGE) ) = HD_ET_QUANT 0563 QUANT ( HD, LUQ_PAGE_INDEX(HD_L2_QUANT,LUPAGE) ) = HD_L2_QUANT 0564 QUANT ( PX, LUQ_PAGE_INDEX(PX_QUANT, LUPAGE) ) = PX_QUANT 0565 QUANT ( PY, LUQ_PAGE_INDEX(PY_QUANT, LUPAGE) ) = PY_QUANT 0566 END DO 0567 C 0568 FIRST = .FALSE. 0569 C 0570 END IF 0571 C PROM_RESPONSE_BY_INDEX 7-May-1992 23:16:37 VAX FORTRAN V5.4-79 Page 3 5-Sep-1991 13:25:21 [SOURCE]PROM_RESPONSE_BY_INDEX.FOR;1 0572 C Remove offsets and convert to floating point 0573 C 0574 EM_ADC_ZERESP = ADC_ZERESP(SIGN_ETA,MAGN_ETA,PHI,EM_TOWER) 0575 HD_ADC_ZERESP = ADC_ZERESP(SIGN_ETA,MAGN_ETA,PHI,HD_TOWER) 0576 ADC_CORR(EM_TOWER) = FLOAT( EM_ADC_BYTE - EM_ADC_ZERESP ) 0577 ADC_CORR(HD_TOWER) = FLOAT( HD_ADC_BYTE - HD_ADC_ZERESP ) 0578 C Px and Py PROMs receive the highest 8 bits of the 9 bit (EM+HD) 0579 MOMENTUM_INPUT = (EM_ADC_BYTE + HD_ADC_BYTE) / 2 0580 ADC_CORR(TOT_TOWER) = FLOAT( MOMENTUM_INPUT ) 0581 & - FLOAT( EM_ADC_ZERESP + HD_ADC_ZERESP ) / 2.0 0582 & + 0.25 0583 C 0584 C EM lookup 0585 C 0586 IF ( QUANT ( EM, INDEX ) .EQ. NOT_MAPPED ) 0587 & THEN 0588 LUQ_BYTE ( EM ) = 0 0589 ELSE 0590 LUQ_BYTE ( EM ) = 0591 & NINT( PROM_SLOPE(SIGN_ETA,MAGN_ETA,PHI,EM_PROM,INDEX) 0592 & * ADC_CORR(EM_TOWER) ) 0593 IF ( ABS( LUQ_BYTE ( EM ) ) 0594 & .LT. PROM_CUT(SIGN_ETA,MAGN_ETA,PHI,EM_PROM,INDEX) ) 0595 & LUQ_BYTE ( EM ) = 0 0596 LUQ_BYTE ( EM ) = LUQ_BYTE ( EM ) 0597 & + LOOKUP_ZERESP(SIGN_ETA,MAGN_ETA,PHI,QUANT(EM,INDEX)) 0598 IF ( LUQ_BYTE ( EM ) .LT. 0 ) 0599 & LUQ_BYTE ( EM ) = 0 0600 IF ( LUQ_BYTE ( EM ) .GT. SATURATION ) 0601 & LUQ_BYTE ( EM ) = SATURATION 0602 END IF 0603 C 0604 C HD lookup 0605 C 0606 IF ( QUANT ( HD, INDEX ) .EQ. NOT_MAPPED ) 0607 & THEN 0608 LUQ_BYTE ( HD ) = 0 0609 ELSE 0610 LUQ_BYTE ( HD ) = 0611 & NINT( PROM_SLOPE(SIGN_ETA,MAGN_ETA,PHI,HD_PROM,INDEX) 0612 & * ADC_CORR(HD_TOWER) ) 0613 IF ( ABS( LUQ_BYTE ( HD ) ) 0614 & .LT. PROM_CUT(SIGN_ETA,MAGN_ETA,PHI,HD_PROM,INDEX) ) 0615 & LUQ_BYTE ( HD ) = 0 0616 LUQ_BYTE ( HD ) = LUQ_BYTE ( HD ) 0617 & + LOOKUP_ZERESP(SIGN_ETA,MAGN_ETA,PHI,QUANT(HD,INDEX)) 0618 IF ( LUQ_BYTE ( HD ) .LT. 0 ) 0619 & LUQ_BYTE ( HD ) = 0 0620 IF ( LUQ_BYTE ( HD ) .GT. SATURATION ) 0621 & LUQ_BYTE ( HD ) = SATURATION 0622 END IF 0623 C 0624 C Px lookup 0625 C 0626 IF ( QUANT ( PX, INDEX ) .EQ. NOT_MAPPED ) 0627 & THEN 0628 LUQ_BYTE ( PX ) = MOMENTUM_INPUT PROM_RESPONSE_BY_INDEX 7-May-1992 23:16:37 VAX FORTRAN V5.4-79 Page 4 5-Sep-1991 13:25:21 [SOURCE]PROM_RESPONSE_BY_INDEX.FOR;1 0629 ELSE 0630 LUQ_BYTE ( PX ) = 0631 & NINT( PROM_SLOPE(SIGN_ETA,MAGN_ETA,PHI,PX_PROM,INDEX) 0632 & * ADC_CORR(TOT_TOWER) ) 0633 IF ( ABS( LUQ_BYTE ( PX ) ) 0634 & .LT. PROM_CUT(SIGN_ETA,MAGN_ETA,PHI,PX_PROM,INDEX) ) 0635 & LUQ_BYTE ( PX ) = 0 0636 LUQ_BYTE ( PX ) = LUQ_BYTE ( PX ) 0637 & + LOOKUP_ZERESP(SIGN_ETA,MAGN_ETA,PHI,QUANT(PX,INDEX)) 0638 IF ( LUQ_BYTE ( PX ) .LT. 0 ) 0639 & LUQ_BYTE ( PX ) = 0 0640 IF ( LUQ_BYTE ( PX ) .GT. SATURATION ) 0641 & LUQ_BYTE ( PX ) = SATURATION 0642 END IF 0643 C 0644 C Py lookup 0645 C 0646 IF ( QUANT ( PY, INDEX ) .EQ. NOT_MAPPED ) 0647 & THEN 0648 LUQ_BYTE ( PY ) = MOMENTUM_INPUT 0649 ELSE 0650 LUQ_BYTE ( PY ) = 0651 & NINT( PROM_SLOPE(SIGN_ETA,MAGN_ETA,PHI,PY_PROM,INDEX) 0652 & * ADC_CORR(TOT_TOWER) ) 0653 IF ( ABS( LUQ_BYTE ( PY ) ) 0654 & .LT. PROM_CUT(SIGN_ETA,MAGN_ETA,PHI,PY_PROM,INDEX) ) 0655 & LUQ_BYTE ( PY ) = 0 0656 LUQ_BYTE ( PY ) = LUQ_BYTE ( PY ) 0657 & + LOOKUP_ZERESP(SIGN_ETA,MAGN_ETA,PHI,QUANT(PY,INDEX)) 0658 IF ( LUQ_BYTE ( PY ) .LT. 0 ) 0659 & LUQ_BYTE ( PY ) = 0 0660 IF ( LUQ_BYTE ( PY ) .GT. SATURATION ) 0661 & LUQ_BYTE ( PY ) = SATURATION 0662 END IF 0663 C 0664 C---------------------------------------------------------------------- 0665 999 RETURN 0666 END PROM_RESPONSE_BY_INDEX 7-May-1992 23:16:37 VAX FORTRAN V5.4-79 Page 5 01 5-Sep-1991 13:25:21 [SOURCE]PROM_RESPONSE_BY_INDEX.FOR;1 PROGRAM SECTIONS Name Bytes Attributes 0 $CODE 858 PIC CON REL LCL SHR EXE RD NOWRT LONG 2 $LOCAL 164 PIC CON REL LCL NOSHR NOEXE RD WRT LONG 3 LEVEL1_LOOKUP 512340 PIC OVR REL GBL SHR NOEXE RD WRT LONG Total Space Allocated 513362 ENTRY POINTS Address Type Name 0-00000000 PROM_RESPONSE_BY_INDEX VARIABLES Address Type Name Address Type Name AP-00000014@ I*4 EM_ADC_BYTE ** I*4 EM_ADC_ZERESP 2-0000008C L*4 FIRST 3-000000F8 I*4 FIRST_LOOKUP_TYPE 3-00000490 R*4 GLOBAL_ADC_SCALE AP-00000018@ I*4 HD_ADC_BYTE ** I*4 HD_ADC_ZERESP AP-00000010@ I*4 INDEX ** I*4 LUPAGE AP-00000008@ I*4 MAGN_ETA ** I*4 MOMENTUM_INPUT ** I*4 PAGE_INDEX AP-0000000C@ I*4 PHI 3-000000FC I*4 SECOND_LOOKUP_TYPE AP-00000004@ I*4 SIGN_ETA ARRAYS Address Type Name Bytes Dimensions 3-000064B4 R*4 ADC_CNT_VS_RAW_E 18432 (0:1, 24, 32, 3) 2-00000080 R*4 ADC_CORR 12 (3) 3-0000ACB4 I*4 ADC_ZERESP 12288 (0:1, 24, 32, 2) 3-000034B4 R*4 ANALOG_INPUT_SCALING 12288 (0:1, 24, 32, 2) 3-0000DCB4 I*4 DAC_BYTE 12288 (0:1, 24, 32, 2) 3-00010CB4 R*4 ELEC_NOISE_SIGMA 12288 (0:1, 24, 32, 2) 3-00000494 R*4 GLOBAL_ENERGY_SCALE 32 (8) 3-000004B4 R*4 INPUT_ENERGY_ERROR 12288 (0:1, 24, 32, 2) 3-00000000 R*4 L0_BIN_COVERAGE 248 (-15:15, 0:1) 3-00014134 I*4 LOOKUP_ZERESP 36864 (0:1, 24, 32, 6) AP-0000001C@ I*4 LUQ_BYTE 16 (4) 3-00013CB4 I*4 LUQ_LOCAL_RESCALING 1152 (0:1, 24, 6) 3-000003E8 I*4 LUQ_PAGE_INDEX 168 (6, -3:3) 3-00000100 I*4 LUQ_PAGE_NUMBER 744 (6, -15:15) 3-0001D134 I*4 PROM_CUT 196608 (0:1, 24, 32, 4, 8) 3-0004D134 R*4 PROM_SLOPE 196608 (0:1, 24, 32, 4, 8) 2-00000000 I*4 QUANT 128 (4, 8) 3-0007D134 I*4 TREE_OFFSET 32 (8) PROM_RESPONSE_BY_INDEX 7-May-1992 23:16:37 VAX FORTRAN V5.4-79 Page 6 01 5-Sep-1991 13:25:21 [SOURCE]PROM_RESPONSE_BY_INDEX.FOR;1 LABELS Address Label ** 999 COMMAND QUALIFIERS FORTRAN/LIST PROM_RESPONSE_BY_INDEX /CHECK=(NOBOUNDS,OVERFLOW,NOUNDERFLOW) /DEBUG=(NOSYMBOLS,TRACEBACK) /DESIGN=(NOCOMMENTS,NOPLACEHOLDERS) /SHOW=(NODICTIONARY,NOINCLUDE,MAP,NOPREPROCESSOR,SINGLE) /STANDARD=(NOSEMANTIC,NOSOURCE_FORM,NOSYNTAX) /WARNINGS=(NODECLARATIONS,GENERAL,NOULTRIX,NOVAXELN) /CONTINUATIONS=19 /NOCROSS_REFERENCE /NOD_LINES /NOEXTEND_SOURCE /F77 /NOG_FLOATING /I4 /NOMACHINE_CODE /OPTIMIZE /NOPARALLEL /NOANALYSIS_DATA /NODIAGNOSTICS /LIST=LSMP$ROOT:[SOURCE]PROM_RESPONSE_BY_INDEX.LIS;1 /OBJECT=LSMP$ROOT:[SOURCE]PROM_RESPONSE_BY_INDEX.OBJ;1 COMPILATION STATISTICS Run Time: 0.77 seconds Elapsed Time: 1.60 seconds Page Faults: 377 Dynamic Memory: 592 pages