SUBROUTINE CHECK_ANALYSIS() C---------------------------------------------------------------------- C- C- Purpose and Methods : Perform the various checks required in analyisis C- mode on the contents of the LEVEL1_LOOKUP common block. If any of the C- checks fail, return a status of ERROR_ANALYSIS. This routine just calls C- a routine for each section to be checked. C- C- Inputs : none C- Outputs : none C- Controls: none C- C- Created 31-JUL-1990 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE C- C---------------------------------------------------------------------- IMPLICIT NONE C---------------------------------------------------------------------- C C Global declarations C INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.PARAMS' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.INC' C C C IF (ANALYSIS .NEQV. .TRUE.) GOTO 999 CALL CHECK_ANALYSIS_L0BINS() CALL CHECK_ANALYSIS_LUQ() CALL CHECK_ANALYSIS_PVB() CALL CHECK_ANALYSIS_PZN() CALL CHECK_ANALYSIS_GAC() CALL CHECK_ANALYSIS_GEC() CALL CHECK_ANALYSIS_ENC() CALL CHECK_ANALYSIS_TRN() CALL CHECK_ANALYSIS_TZN() CALL CHECK_ANALYSIS_TPN() CALL CHECK_ANALYSIS_AIS() CALL CHECK_ANALYSIS_IEE() CALL CHECK_ANALYSIS_DAC() CALL CHECK_ANALYSIS_AZR() CALL CHECK_ANALYSIS_ELN() CALL CHECK_ANALYSIS_LZR() CALL CHECK_ANALYSIS_ESS() CALL CHECK_ANALYSIS_FNF() CALL CHECK_ANALYSIS_TEC() C 999 RETURN END C C C SUBROUTINE CHECK_ANALYSIS_L0BINS() C---------------------------------------------------------------------- C- C- Purpose and Methods : Check the common block array L0_BIN_COVERAGE. Check C- that the upper boundary of each bin is equal to the lower bounary of C- the next bin. Check that the boundary coordinates are ordered from low C- to high. Check that the range of boundaries is in the range [-120.0, C- 120.0]. Check that the width of bin #0 is within [5.0, 8.0], and the C- width of each of the other bins is within 1% of the width of bin #0. C- Boundaries of bin #0 should be centered on 0.0 within 1%. C- C- Inputs : none C- Outputs : none C- Controls: none C- C- Created 31-JUL-1990 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE C- C---------------------------------------------------------------------- IMPLICIT NONE C---------------------------------------------------------------------- C C Global declarations C INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.PARAMS' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.INC' INCLUDE 'D0$PARAMS:LEVEL1_LOOKUP.PARAMS' INCLUDE 'D0$INC:LEVEL1_LOOKUP.INC' INCLUDE 'LSMP$SOURCE:LEVEL1_LOOKUP_EXPANSION.INC' INTRINSIC ABS C C local variables C CHARACTER*133 MESSAGE INTEGER BIN REAL WIDTH_BIN_0, WIDTH_BIN REAL WIDTH_LOW, WIDTH_HIGH REAL BOUNDARY C C Local parameters C REAL OVERALL_BOUNDARIES, BASE_WIDTH_LOW, BASE_WIDTH_HIGH, & WIDTH_TOLERANCE, CENTERING_TOLERANCE PARAMETER ( OVERALL_BOUNDARIES = 120.0, & BASE_WIDTH_LOW = 5.0, & BASE_WIDTH_HIGH = 8.0, & WIDTH_TOLERANCE = .01, & CENTERING_TOLERANCE = .01 ) C C Check that the boundaries match. C Check that the boundaries are ordered. C Check that all the values are in range. C BOUNDARY = L0_BIN_COVERAGE(L0_BIN_MIN, Z_LOW) DO BIN = L0_BIN_MIN, L0_BIN_MAX -1 IF (L0_BIN_COVERAGE(BIN, Z_HIGH) .NE. L0_BIN_COVERAGE(BIN+1, & Z_LOW)) THEN WRITE (MESSAGE, 100) BIN, BIN+1 100 FORMAT( ' ', & 'Error: The boundaries on the following two ', & 'Level 0 bins do not match: ', & I4, ' and', I4) CALL MESSAGE_OUT(MES_ANALYSIS_GENERAL, I_L0L_INDEX, MESSAGE) ENDIF C IF (BOUNDARY .GE. L0_BIN_COVERAGE(BIN, Z_HIGH)) THEN WRITE (MESSAGE, 110) BIN 110 FORMAT(' ', 'Error: The boundaries on the following ', & 'Level 0 bin are out of order: ', I4) CALL MESSAGE_OUT(MES_ANALYSIS_GENERAL, I_L0L_INDEX, MESSAGE) ENDIF BOUNDARY = L0_BIN_COVERAGE(BIN, Z_HIGH) C 120 FORMAT( ' Bin', I4) IF (ABS(L0_BIN_COVERAGE(BIN, Z_HIGH)) .GT. OVERALL_BOUNDARIES) & THEN WRITE(MESSAGE, 120) BIN CALL MESSAGE_OUT(MES_OUT_RANGE, I_L0H_INDEX, MESSAGE) ENDIF IF (ABS(L0_BIN_COVERAGE(BIN, Z_LOW)) .GT. OVERALL_BOUNDARIES) & THEN WRITE(MESSAGE, 120) BIN CALL MESSAGE_OUT(MES_OUT_RANGE, I_L0L_INDEX, MESSAGE) ENDIF END DO C C Check the width of each bin. C WIDTH_BIN_0 = L0_BIN_COVERAGE(0, Z_HIGH) - & L0_BIN_COVERAGE(0, Z_LOW) IF ((WIDTH_BIN_0 .GT. BASE_WIDTH_HIGH) .OR. (WIDTH_BIN_0 .LT. & BASE_WIDTH_LOW)) THEN CALL MESSAGE_OUT(MES_ANALYSIS_GENERAL, I_L0H_INDEX, & ' Error: Width of Level 0 bin #0 is out of range.') ENDIF C DO BIN = L0_BIN_MIN, L0_BIN_MAX IF ((L0_BIN_COVERAGE( BIN, Z_HIGH) - L0_BIN_COVERAGE(BIN, & Z_LOW) - WIDTH_BIN_0) .GT. WIDTH_TOLERANCE * WIDTH_BIN_0) & THEN WRITE(MESSAGE, 150) BIN 150 FORMAT(' ', 'Error: Width of Level 0 bin #', I4, & ' is out of range with respect to bin #0.') CALL MESSAGE_OUT(MES_ANALYSIS_GENERAL, I_L0H_INDEX, MESSAGE) ENDIF END DO C C Check that bin #0 is centered C BOUNDARY = L0_BIN_COVERAGE(0, Z_HIGH) + L0_BIN_COVERAGE(0, Z_LOW) IF (BOUNDARY .GT. WIDTH_BIN_0 * (1 + CENTERING_TOLERANCE)) THEN CALL MESSAGE_OUT(MES_ANALYSIS_GENERAL, I_L0H_INDEX, & 'Error: Level 0 bin #0 is not centered') ENDIF C 999 RETURN END C C C SUBROUTINE CHECK_ANALYSIS_LUQ() C---------------------------------------------------------------------- C- C- Purpose and Methods : Check the values in LUQ_PAGE_INDEX. Indices should C- all fall in the range 0 to 8. Index of 0 means it should be left C- undefined. Check that contiguous pages are assigned contiguous indices. C- Check that EM ET and HD ET each use the same range of indices, same for EM C- L2 and HD L2, PX and PY. The indices given for lookup ET and lookup L2 C- should not overlap. C- C- Inputs : none C- Outputs : none C- Controls: none C- C- Created 31-JUL-1990 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE C- C---------------------------------------------------------------------- IMPLICIT NONE C---------------------------------------------------------------------- C C Global declarations C INCLUDE 'D0$PARAMS:LEVEL1_LOOKUP.PARAMS' INCLUDE 'D0$INC:LEVEL1_LOOKUP.INC' INCLUDE 'LSMP$SOURCE:LEVEL1_LOOKUP_EXPANSION.INC' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.PARAMS' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.INC' C C Local variables C INTEGER LAST_INDEX INTEGER PAGE INTEGER PAGE2 INTEGER LUQ C CHARACTER*133 MESSAGE CHARACTER*6 ST_LUQ(EM_ET_QUANT:PY_QUANT) C ST_LUQ(EM_ET_QUANT) = 'EM ET' ST_LUQ(EM_L2_QUANT) = 'EM L2' ST_LUQ(HD_ET_QUANT) = 'HD ET' ST_LUQ(HD_L2_QUANT) = 'HD L2' ST_LUQ(PX_QUANT) = 'TOT PX' ST_LUQ(PY_QUANT) = 'TOT PY' C C Check that the indices are in the proper range C DO PAGE = PAGE_NUM_MIN, PAGE_NUM_MAX DO LUQ = EM_ET_QUANT, PY_QUANT IF ((LUQ_PAGE_INDEX(LUQ, PAGE) .GT. PAGE_INDEX_MAX) .OR. & (LUQ_PAGE_INDEX(LUQ, PAGE) .LT. 0)) THEN WRITE (MESSAGE, 100) ST_LUQ(LUQ), PAGE 100 FORMAT(' ', A, ' PAGE', I3) CALL MESSAGE_OUT(MES_OUT_RANGE, I_LUQ_INDEX, MESSAGE) ENDIF END DO END DO C C Check that contiguous pages are assigned contifuous indices. C DO LUQ = EM_ET_QUANT, PY_QUANT LAST_INDEX = 0 DO PAGE = PAGE_NUM_MIN, PAGE_NUM_MAX IF ((LAST_INDEX .NE. 0) .AND. (LUQ_PAGE_INDEX(LUQ, PAGE) & .NE. 0) .AND. (LUQ_PAGE_INDEX(LUQ,PAGE) .NE. LAST_INDEX & + 1)) THEN WRITE(MESSAGE, 110) ST_LUQ(LUQ), PAGE 110 FORMAT(' ', & 'Error: Member out of order in section LOOKUP_QUANTITIES: ', & A, ' PAGE', I3) CALL MESSAGE_OUT(MES_ANALYSIS_GENERAL, I_LUQ_INDEX, & MESSAGE) ENDIF LAST_INDEX = LUQ_PAGE_INDEX(LUQ, PAGE) END DO END DO C C Check that EM ET and HD ET use the same range of indices, same for EM C L2 and HD L2, PX and PY. C DO PAGE = PAGE_NUM_MIN, PAGE_NUM_MAX 130 FORMAT( ' ', & 'Error: The following 2 members of section ', & 'LOOKUP_QUANTITIES are not equal: ', A, ' PAGE', I3, ' and ', & A, ' PAGE ', I3) IF (LUQ_PAGE_INDEX(EM_ET_QUANT, PAGE) .NE. & LUQ_PAGE_INDEX(HD_ET_QUANT, PAGE)) THEN WRITE(MESSAGE, 130) ST_LUQ(EM_ET_QUANT), PAGE, & ST_LUQ(HD_ET_QUANT), PAGE CALL MESSAGE_OUT(MES_ANALYSIS_GENERAL, I_LUQ_INDEX, MESSAGE) ENDIF C IF (LUQ_PAGE_INDEX(EM_L2_QUANT, PAGE) .NE. & LUQ_PAGE_INDEX(HD_L2_QUANT, PAGE)) THEN WRITE(MESSAGE, 130) ST_LUQ(EM_L2_QUANT), PAGE, & ST_LUQ(HD_L2_QUANT), PAGE CALL MESSAGE_OUT(MES_ANALYSIS_GENERAL, I_LUQ_INDEX, MESSAGE) ENDIF C IF (LUQ_PAGE_INDEX(PX_QUANT, PAGE) .NE. & LUQ_PAGE_INDEX(PY_QUANT, PAGE)) THEN WRITE(MESSAGE, 130) ST_LUQ(PX_QUANT), PAGE, & ST_LUQ(PY_QUANT), PAGE CALL MESSAGE_OUT(MES_ANALYSIS_GENERAL, I_LUQ_INDEX, MESSAGE) ENDIF END DO C C Check that the indices given for lookup ET and L2 don't overlap. C 150 FORMAT(' ', & 'Error: the following members of section LOOKUP_QUANTITIES', & ' overlap: ', A, ' PAGE', I3, ' and ', A, ' PAGE', I3) DO PAGE = PAGE_NUM_MIN, PAGE_NUM_MAX DO PAGE2 = PAGE_NUM_MIN, PAGE_NUM_MAX IF (LUQ_PAGE_INDEX(EM_ET_QUANT, PAGE) .NE. 0) THEN IF (LUQ_PAGE_INDEX(EM_ET_QUANT, PAGE) .EQ. & LUQ_PAGE_INDEX(EM_L2_QUANT, PAGE2)) THEN WRITE(MESSAGE, 150) ST_LUQ(EM_ET_QUANT), PAGE, & ST_LUQ(EM_L2_QUANT), PAGE2 ENDIF ENDIF C IF (LUQ_PAGE_INDEX(HD_ET_QUANT, PAGE) .NE. 0) THEN IF (LUQ_PAGE_INDEX(HD_ET_QUANT, PAGE) .EQ. & LUQ_PAGE_INDEX(HD_L2_QUANT, PAGE2)) THEN WRITE(MESSAGE, 150) ST_LUQ(EM_ET_QUANT), PAGE, & ST_LUQ(EM_L2_QUANT), PAGE2 ENDIF ENDIF END DO END DO C C Check that deposited energy lookups only have one page assigned to C them. C IF (FIRST_LOOKUP_TYPE .EQ. DEPOSITED_ENERGY) THEN PAGE2 = 0 DO PAGE = PAGE_NUM_MIN, PAGE_NUM_MAX IF (LUQ_PAGE_INDEX(EM_ET_QUANT, PAGE) .NE. 0) THEN PAGE2 = PAGE2 + 1 ENDIF END DO IF (PAGE2 .GT. 1) THEN CALL MESSAGE_OUT(MES_ANALYSIS_GENERAL, I_LUQ_INDEX, & 'Error: Lookup #1 is DEPOSITED_ENERGY, and should have ' // & 'only 1 page assigned to it.') ENDIF ENDIF IF (SECOND_LOOKUP_TYPE .EQ. DEPOSITED_ENERGY) THEN PAGE2 = 0 DO PAGE = PAGE_NUM_MIN, PAGE_NUM_MAX IF (LUQ_PAGE_INDEX(EM_L2_QUANT, PAGE) .NE. 0) THEN PAGE2 = PAGE2 + 1 ENDIF END DO IF (PAGE2 .GT. 1) THEN CALL MESSAGE_OUT(MES_ANALYSIS_GENERAL, I_LUQ_INDEX, & 'Error: Lookup #2 is DEPOSITED_ENERGY, and should have ' // & 'only 1 page assigned to it.') ENDIF ENDIF C 999 RETURN END C C C SUBROUTINE CHECK_ANALYSIS_PVB() C---------------------------------------------------------------------- C- C- Purpose and Methods : Check the values in LUQ_PAGE_NUMBER. Check that the C- bins are contiguous within each page, assigned in increasing order, bin 0 C- is within page 0. Check that no invalid pages have been given. Check that C- each active page is assigned to a bin. C- C- Inputs : none C- Outputs : none C- Controls: none C- C- Created 31-JUL-1990 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE C- C---------------------------------------------------------------------- IMPLICIT NONE C---------------------------------------------------------------------- C C Global declarations C INCLUDE 'D0$PARAMS:LEVEL1_LOOKUP.PARAMS' INCLUDE 'D0$INC:LEVEL1_LOOKUP.INC' INCLUDE 'LSMP$SOURCE:LEVEL1_LOOKUP_EXPANSION.INC' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.PARAMS' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.INC' C C Local variables C INTEGER LUQ INTEGER BIN INTEGER PAGE INTEGER LAST_PAGE C CHARACTER*133 MESSAGE CHARACTER*6 ST_LUQ(EM_ET_QUANT:PY_QUANT) C ST_LUQ(EM_ET_QUANT) = 'EM ET' ST_LUQ(EM_L2_QUANT) = 'EM L2' ST_LUQ(HD_ET_QUANT) = 'HD ET' ST_LUQ(HD_L2_QUANT) = 'HD L2' ST_LUQ(PX_QUANT) = 'TOT PX' ST_LUQ(PY_QUANT) = 'TOT PY' C C Check that bins are contiguous within each page, and that the pages are C assigned in increasing order. C Check that bin 0 is within page 0. C C DO LUQ = EM_ET_QUANT, PY_QUANT LAST_PAGE = LUQ_PAGE_NUMBER(LUQ, L0_BIN_MIN) 100 FORMAT(' ', & 'Error: Member out of order in section PAGE_VS_BIN: ', A, & ' BIN', I4) DO BIN = L0_BIN_MIN + 1, L0_BIN_MAX IF ((LUQ_PAGE_NUMBER(LUQ, BIN) .NE. LAST_PAGE) .AND. & (LUQ_PAGE_NUMBER(LUQ, BIN) .NE. LAST_PAGE + 1)) THEN WRITE (MESSAGE, 100) ST_LUQ(LUQ), BIN CALL MESSAGE_OUT(MES_ANALYSIS_GENERAL, I_PVB_INDEX, MESSAGE) ENDIF LAST_PAGE = LUQ_PAGE_NUMBER(LUQ, BIN) END DO C 110 FORMAT(' ', & 'Error: BIN 0 not within PAGE 0 in section PAGE_VS_BIN: ', A) IF (LUQ_PAGE_NUMBER(LUQ, 0) .NE. 0) THEN WRITE(MESSAGE, 110) ST_LUQ(LUQ) CALL MESSAGE_OUT(MES_ANALYSIS_GENERAL, I_PVB_INDEX, MESSAGE) ENDIF END DO C C Check That the page given for each bin and looked up quantity maps to a C valid prom index. Checks that the page given falls in the range [-3,3]. C 120 FORMAT(' ', 'Error: Invalid page given in section PAGE_VS_BIN: ', & A, ' BIN', I4) DO BIN = L0_BIN_MIN, L0_BIN_MAX DO LUQ = EM_ET_QUANT, PY_QUANT IF ((LUQ_PAGE_NUMBER(LUQ, BIN) .LT. -3) .OR. & (LUQ_PAGE_NUMBER(LUQ, BIN) .GT. 3)) THEN WRITE(MESSAGE, 120) ST_LUQ(LUQ), BIN CALL MESSAGE_OUT(MES_ANALYSIS_GENERAL, I_PVB_INDEX, MESSAGE) ELSE IF (LUQ_PAGE_INDEX(LUQ, LUQ_PAGE_NUMBER(LUQ, BIN)) & .EQ. 0) THEN WRITE(MESSAGE, 120) ST_LUQ(LUQ), BIN CALL MESSAGE_OUT(MES_ANALYSIS_GENERAL, I_PVB_INDEX, MESSAGE) ENDIF END DO END DO C C Check that each active page has been assigned to a bin. C DO LUQ = EM_ET_QUANT, PY_QUANT DO PAGE = PAGE_NUM_MIN, PAGE_NUM_MAX IF (LUQ_PAGE_INDEX(LUQ, PAGE) .NE. 0) THEN DO BIN = L0_BIN_MIN, L0_BIN_MAX IF (PAGE .EQ. LUQ_PAGE_NUMBER(LUQ, BIN)) GOTO 2000 END DO WRITE(MESSAGE, 130) ST_LUQ(LUQ), PAGE 130 FORMAT( & ' Error: Page not specified in section PAGE_VS_BIN: ', A, & ' PAGE', I3) CALL MESSAGE_OUT(MES_ANALYSIS_GENERAL, I_PVB_INDEX, MESSAGE) 2000 CONTINUE ENDIF END DO END DO C 999 RETURN END C C C SUBROUTINE CHECK_ANALYSIS_PZN() C---------------------------------------------------------------------- C- C- Purpose and Methods : Check values in PAGE_Z_NOM. Check that the location C- given actually falls within the level 0 boundaries, and that it is within C- 10% of the center of the segment. C- C- Inputs : none C- Outputs : none C- Controls: none C- C- Created 31-JUL-1990 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE C- C---------------------------------------------------------------------- IMPLICIT NONE C---------------------------------------------------------------------- C C Global declarations C INCLUDE 'D0$PARAMS:LEVEL1_LOOKUP.PARAMS' INCLUDE 'D0$INC:LEVEL1_LOOKUP.INC' INCLUDE 'LSMP$SOURCE:LEVEL1_LOOKUP_EXPANSION.INC' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.PARAMS' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.INC' C C Local variables C INTEGER LUQ INTEGER PAGE REAL POSITION_LOW, POSITION_HIGH REAL CENTER, WIDTH INTEGER BIN INTEGER BIN_START C C Local parameters C REAL TOLERANCE PARAMETER ( TOLERANCE = .1 ) C CHARACTER*133 MESSAGE CHARACTER*6 ST_LUQ(EM_ET_QUANT:PY_QUANT) C ST_LUQ(EM_ET_QUANT) = 'EM ET' ST_LUQ(EM_L2_QUANT) = 'EM L2' ST_LUQ(HD_ET_QUANT) = 'HD ET' ST_LUQ(HD_L2_QUANT) = 'HD L2' ST_LUQ(PX_QUANT) = 'TOT PX' ST_LUQ(PY_QUANT) = 'TOT PY' C C Find the boundarys of each page, then test that the value given falls C in these boundarys. C DO LUQ = EM_ET_QUANT, PY_QUANT DO PAGE = PAGE_NUM_MIN, PAGE_NUM_MAX IF (LUQ_PAGE_INDEX(LUQ, PAGE) .NE. 0) THEN POSITION_LOW = L0_BIN_COVERAGE(L0_BIN_MIN, Z_LOW) POSITION_HIGH = L0_BIN_COVERAGE(L0_BIN_MAX, Z_HIGH) DO BIN = L0_BIN_MIN, L0_BIN_MAX IF (LUQ_PAGE_NUMBER(LUQ, BIN) .EQ. PAGE) THEN POSITION_LOW = L0_BIN_COVERAGE(BIN, Z_LOW) GOTO 2000 ENDIF END DO C 2000 CONTINUE BIN_START = BIN DO BIN = BIN_START + 1, L0_BIN_MAX IF (LUQ_PAGE_NUMBER(LUQ, BIN) .NE. PAGE) THEN POSITION_HIGH = L0_BIN_COVERAGE(BIN-1, Z_HIGH) GOTO 3000 ENDIF END DO 3000 CONTINUE C C Have found the positions of the boundaries, now do the checking C IF ((PAGE_Z_NOM(LUQ, PAGE) .LT. POSITION_LOW) .OR. & (PAGE_Z_NOM(LUQ, PAGE) .GT. POSITION_HIGH)) THEN WRITE(MESSAGE, 90) ST_LUQ(LUQ), PAGE 90 FORMAT( & ' Error: Page center does not fall within page boundaries', & ' in section PAGE_NOMINAL_CENTER: ', A, ' PAGE', I3) CALL MESSAGE_OUT(MES_ANALYSIS_GENERAL, I_PZN_INDEX, & MESSAGE) ENDIF C CENTER = (POSITION_LOW + POSITION_HIGH) / 2 WIDTH = (POSITION_HIGH - POSITION_LOW) IF (ABS(PAGE_Z_NOM(LUQ, PAGE) - CENTER) .GT. WIDTH * & TOLERANCE) THEN WRITE(MESSAGE,100) ST_LUQ(LUQ), PAGE 100 FORMAT( & ' Error: Page center not centered within tolerance ', & 'in section PAGE_NOMINAL_CENTER: ', A, ' PAGE', I3 ) ENDIF ENDIF END DO END DO C 999 RETURN END C C C SUBROUTINE CHECK_ANALYSIS_GAC() C---------------------------------------------------------------------- C- C- Purpose and Methods : Check the value of GLOBAL_ADC_SCALE. Check that it C- falls in the range (0.0, 1.0]. C- C- Inputs : none C- Outputs : none C- Controls: none C- C- Created 31-JUL-1990 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE C- C---------------------------------------------------------------------- IMPLICIT NONE C---------------------------------------------------------------------- C C Global declarations C INCLUDE 'D0$PARAMS:LEVEL1_LOOKUP.PARAMS' INCLUDE 'D0$INC:LEVEL1_LOOKUP.INC' INCLUDE 'LSMP$SOURCE:LEVEL1_LOOKUP_EXPANSION.INC' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.PARAMS' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.INC' C C Local parameters C REAL ADC_LOW REAL ADC_HIGH PARAMETER (ADC_LOW = 0.0, ADC_HIGH = 1.0) C C Check the bounds on GLOBAL_ADC_SCALE C IF ((GLOBAL_ADC_SCALE .LE. ADC_LOW) .OR. (GLOBAL_ADC_SCALE .GT. & ADC_HIGH)) THEN CALL MESSAGE_OUT(MES_OUT_RANGE, I_GAC_INDEX, ' ') ENDIF C 999 RETURN END C C C SUBROUTINE CHECK_ANALYSIS_GEC() C---------------------------------------------------------------------- C- C- Purpose and Methods : Check the values of GLOBAL_ENERGY_SCALE. Check that C- they fall in the range (0.0, 1.0]. C- C- Inputs : none C- Outputs : none C- Controls: none C- C- Created 31-JUL-1990 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE C- C---------------------------------------------------------------------- IMPLICIT NONE C---------------------------------------------------------------------- C C Global declarations C INCLUDE 'D0$PARAMS:LEVEL1_LOOKUP.PARAMS' INCLUDE 'D0$INC:LEVEL1_LOOKUP.INC' INCLUDE 'LSMP$SOURCE:LEVEL1_LOOKUP_EXPANSION.INC' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.PARAMS' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.INC' C C Local variables C INTEGER LUQ C C C Local Parameters C REAL VALUE_LOW, VALUE_HIGH PARAMETER (VALUE_LOW = 0.0, VALUE_HIGH = 1.0) C CHARACTER*133 MESSAGE CHARACTER*6 ST_LUQ(EM_ET_QUANT:TOT_L2_QUANT) C ST_LUQ(EM_ET_QUANT) = 'EM ET' ST_LUQ(EM_L2_QUANT) = 'EM L2' ST_LUQ(HD_ET_QUANT) = 'HD ET' ST_LUQ(HD_L2_QUANT) = 'HD L2' ST_LUQ(PX_QUANT) = 'TOT PX' ST_LUQ(PY_QUANT) = 'TOT PY' ST_LUQ(TOT_ET_QUANT) = 'TOT ET' ST_LUQ(TOT_L2_QUANT) = 'TOT L2' C DO LUQ = EM_ET_QUANT, TOT_L2_QUANT IF ((GLOBAL_ENERGY_SCALE(LUQ) .LE. VALUE_LOW) .OR. & (GLOBAL_ENERGY_SCALE(LUQ) .GT. VALUE_HIGH)) THEN WRITE(MESSAGE, 100) ST_LUQ(LUQ) 100 FORMAT(' ', A) CALL MESSAGE_OUT(MES_OUT_RANGE, I_GEC_INDEX, MESSAGE) ENDIF END DO C 999 RETURN END C C C SUBROUTINE CHECK_ANALYSIS_ENC() C---------------------------------------------------------------------- C- C- Purpose and Methods : Check the values in ELEC_NOISE_COEFF. Check that C- they fall in the range [0.0, 10.0) C- C- Inputs : none C- Outputs : none C- Controls: none C- C- Created 31-JUL-1990 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE C- C---------------------------------------------------------------------- IMPLICIT NONE C---------------------------------------------------------------------- C C Global declarations C INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.PARAMS' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.INC' INCLUDE 'D0$PARAMS:LEVEL1_LOOKUP.PARAMS' INCLUDE 'D0$INC:LEVEL1_LOOKUP.INC' INCLUDE 'LSMP$SOURCE:LEVEL1_LOOKUP_EXPANSION.INC' C C Local variables C INTEGER LUQ C C Local parameters C REAL VALUE_LOW, VALUE_HIGH PARAMETER (VALUE_LOW = 0.0, VALUE_HIGH = 10.0) C CHARACTER*133 MESSAGE CHARACTER*6 ST_LUQ(EM_ET_QUANT:PY_QUANT) C ST_LUQ(EM_ET_QUANT) = 'EM ET' ST_LUQ(EM_L2_QUANT) = 'EM L2' ST_LUQ(HD_ET_QUANT) = 'HD ET' ST_LUQ(HD_L2_QUANT) = 'HD L2' ST_LUQ(PX_QUANT) = 'TOT PX' ST_LUQ(PY_QUANT) = 'TOT PY' C DO LUQ = EM_ET_QUANT, PY_QUANT IF ((ELEC_NOISE_CUT_FACT(LUQ) .LT. VALUE_LOW) .OR. & (ELEC_NOISE_CUT_FACT(LUQ) .GE. VALUE_HIGH)) THEN WRITE(MESSAGE, 100) ST_LUQ(LUQ) 100 FORMAT(' ', A) CALL MESSAGE_OUT(MES_OUT_RANGE, I_ENC_INDEX, MESSAGE) ENDIF END DO C 999 RETURN END C C C SUBROUTINE CHECK_ANALYSIS_TRN() C---------------------------------------------------------------------- C- C- Purpose and Methods : Check the values of section TOWER_GEOMETRY_R. Check C- that the coordinates all fall within the range [1.0, 110.0] for EM, [1.0, C- 140.0] for HD. The values should be within 20% of each other for eta = [1, C- 5], and then decreasing for eta = [6, 24], and each EM quantity should be C- smaller than its corresponding HD quantity. C- C- Inputs : none C- Outputs : none C- Controls: none C- C- Created 31-JUL-1990 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE C- C---------------------------------------------------------------------- IMPLICIT NONE C---------------------------------------------------------------------- C C Global declarations C INCLUDE 'D0$PARAMS:LEVEL1_LOOKUP.PARAMS' INCLUDE 'D0$INC:LEVEL1_LOOKUP.INC' INCLUDE 'LSMP$SOURCE:LEVEL1_LOOKUP_EXPANSION.INC' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.PARAMS' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.INC' LOGICAL DAC_DEFINED EXTERNAL DAC_DEFINED INTRINSIC ABS C C Local variables C INTEGER SIGN_ETA, ETA, PHI, CHANNEL REAL POSITION C C Local parameters C INTEGER END_CONSTANT REAL LOWER_EM, LOWER_HD, LOWER_TOT REAL UPPER_EM, UPPER_HD, UPPER_TOT REAL TOLERANCE PARAMETER ( END_CONSTANT = 5, LOWER_EM = 1.0, UPPER_EM = 110.0, & LOWER_HD = 1.0, UPPER_HD = 140.0, LOWER_TOT = 1.0, UPPER_TOT = & 140.0, TOLERANCE = .2 ) C CHARACTER*133 MESSAGE CHARACTER*3 ST_CHANNEL(EM_TOWER:TOT_TOWER) CHARACTER*5 ST_SIGN(POS_ETA:NEG_ETA) C ST_CHANNEL(EM_TOWER) = 'EM' ST_CHANNEL(HD_TOWER) = 'HD' ST_CHANNEL(TOT_TOWER) = 'TOT' ST_SIGN(POS_ETA) = 'PLUS' ST_SIGN(NEG_ETA) = 'MINUS' C C Check that all of the values fall in the proper range C 100 FORMAT(' ', A, ' ETA', I3, ' PHI', I3, ' ', A) DO PHI = PHI_MIN, PHI_MAX DO ETA = ETA_RANGE_MIN, ETA_RANGE_MAX DO SIGN_ETA = POS_ETA, NEG_ETA IF (DAC_DEFINED(SIGN_ETA, ETA, PHI, EM_TOWER) .AND. & ((TOWER_RZ_COORD(SIGN_ETA, ETA, PHI, EM_TOWER, R_COORD) & .GT. UPPER_EM) .OR. (TOWER_RZ_COORD(SIGN_ETA, ETA, PHI, & EM_TOWER, R_COORD) .LT. LOWER_EM))) THEN WRITE(MESSAGE, 100) ST_SIGN(SIGN_ETA), ETA, PHI, & ST_CHANNEL(EM_TOWER) CALL MESSAGE_OUT(MES_OUT_RANGE, I_TRN_INDEX, MESSAGE) ENDIF C IF (DAC_DEFINED(SIGN_ETA, ETA, PHI, HD_TOWER) .AND. & ((TOWER_RZ_COORD(SIGN_ETA, ETA, PHI, HD_TOWER, R_COORD) & .GT. UPPER_HD) .OR. (TOWER_RZ_COORD(SIGN_ETA, ETA, PHI, & HD_TOWER, R_COORD) .LT. LOWER_HD))) THEN WRITE(MESSAGE, 100) ST_SIGN(SIGN_ETA), ETA, PHI, & ST_CHANNEL(HD_TOWER) CALL MESSAGE_OUT(MES_OUT_RANGE, I_TRN_INDEX, MESSAGE) ENDIF C IF (DAC_DEFINED(SIGN_ETA, ETA, PHI, HD_TOWER) .AND. & ((TOWER_RZ_COORD(SIGN_ETA, ETA, PHI, TOT_TOWER, R_COORD) & .GT. UPPER_TOT) .OR. (TOWER_RZ_COORD(SIGN_ETA, ETA, PHI, & TOT_TOWER, R_COORD) .LT. LOWER_TOT))) THEN WRITE(MESSAGE, 100) ST_SIGN(SIGN_ETA), ETA, PHI, & ST_CHANNEL(TOT_TOWER) CALL MESSAGE_OUT(MES_OUT_RANGE, I_TRN_INDEX, MESSAGE) ENDIF C END DO END DO END DO C C Check that each HD is greater than EM, and that each TOT is between HD C and EM. C 200 FORMAT(' ', A, ' ETA', I3, ' PHI', I3, ' ', A) DO PHI = PHI_MIN, PHI_MAX DO ETA = ETA_RANGE_MIN, ETA_RANGE_MAX DO SIGN_ETA = POS_ETA, NEG_ETA IF (DAC_DEFINED(SIGN_ETA, ETA, PHI, EM_TOWER) .AND. & DAC_DEFINED(SIGN_ETA, ETA, PHI, HD_TOWER)) THEN IF (TOWER_RZ_COORD(SIGN_ETA, ETA, PHI, HD_TOWER, R_COORD) & .LT. TOWER_RZ_COORD(SIGN_ETA, ETA, PHI, EM_TOWER, & R_COORD)) THEN WRITE(MESSAGE, 200) ST_SIGN(SIGN_ETA), ETA, PHI, & ST_CHANNEL(HD_TOWER) CALL MESSAGE_OUT(MES_HD_SMALL, I_TRN_INDEX, MESSAGE) ENDIF C IF ((TOWER_RZ_COORD(SIGN_ETA, ETA, PHI, TOT_TOWER, & R_COORD) .LT. TOWER_RZ_COORD(SIGN_ETA, ETA, PHI, & EM_TOWER, R_COORD)) .OR. (TOWER_RZ_COORD(SIGN_ETA, ETA, & PHI, TOT_TOWER, R_COORD) .GT. TOWER_RZ_COORD(SIGN_ETA, & ETA, PHI, HD_TOWER, R_COORD))) THEN WRITE(MESSAGE, 200) ST_SIGN(SIGN_ETA), ETA, PHI, & ST_CHANNEL(TOT_TOWER) CALL MESSAGE_OUT(MES_TOT_OUTSIDE, I_TRN_INDEX, MESSAGE) ENDIF ENDIF END DO END DO END DO C C Check that the values are constant over phi. C 250 FORMAT(' ', A, ' ETA', I3, ' PHI', I3, ' ', A) DO CHANNEL = EM_TOWER, HD_TOWER DO ETA = ETA_RANGE_MIN, ETA_RANGE_MAX DO SIGN_ETA = POS_ETA, NEG_ETA POSITION = TOWER_RZ_COORD(SIGN_ETA, ETA, 1, CHANNEL, & R_COORD) DO PHI = PHI_MIN, PHI_MAX IF (DAC_DEFINED(SIGN_ETA, ETA, PHI, CHANNEL) .EQ. .FALSE.) & GOTO 1000 IF (TOWER_RZ_COORD(SIGN_ETA, ETA, PHI, CHANNEL, R_COORD) & .NE. POSITION) THEN WRITE(MESSAGE, 250) ST_SIGN(SIGN_ETA), ETA, PHI, & ST_CHANNEL(CHANNEL) CALL MESSAGE_OUT(MES_NOT_CONSTANT_PHI, I_TRN_INDEX, & MESSAGE) ENDIF 1000 CONTINUE END DO END DO END DO END DO C C Check that values are within 20% of each other for eta = [1, 5] C 300 FORMAT(' ', A, ' ETA', I3, ' PHI', I3, ' ', A) DO CHANNEL = EM_TOWER, HD_TOWER DO PHI = PHI_MIN, PHI_MAX DO SIGN_ETA = POS_ETA, NEG_ETA POSITION = TOWER_RZ_COORD( SIGN_ETA, ETA_RANGE_MIN, PHI, & CHANNEL, R_COORD) DO ETA = 1, END_CONSTANT IF (DAC_DEFINED(SIGN_ETA, ETA, PHI, CHANNEL) .EQ. .FALSE.) & GOTO 2000 IF (ABS(TOWER_RZ_COORD(SIGN_ETA, ETA, PHI, CHANNEL, & R_COORD) - POSITION) .GT. POSITION * TOLERANCE) THEN WRITE(MESSAGE, 300) ST_SIGN(SIGN_ETA), ETA, PHI, & ST_CHANNEL(CHANNEL) CALL MESSAGE_OUT(MES_NOT_CONSTANT_ETA, I_TRN_INDEX, & MESSAGE) ENDIF 2000 CONTINUE END DO END DO END DO END DO C C Check that values are decreasing from ETA [6, 24] C 400 FORMAT(' ', A, ' ETA', I3, ' PHI', I3, ' ', A) DO CHANNEL = EM_TOWER, HD_TOWER DO PHI = PHI_MIN, PHI_MAX DO SIGN_ETA = POS_ETA, NEG_ETA DO ETA = END_CONSTANT +2, ETA_RANGE_MAX IF (DAC_DEFINED(SIGN_ETA, ETA, PHI, CHANNEL) .EQ. .FALSE.) & GOTO 3000 IF (TOWER_RZ_COORD( SIGN_ETA, ETA, PHI, CHANNEL, R_COORD) & .GE. TOWER_RZ_COORD( SIGN_ETA, ETA -1, PHI, CHANNEL, & R_COORD)) THEN WRITE(MESSAGE, 400) ST_SIGN(SIGN_ETA), ETA, PHI, & ST_CHANNEL(CHANNEL) CALL MESSAGE_OUT(MES_NOT_DECREASING, I_TRN_INDEX, & MESSAGE) ENDIF 3000 CONTINUE END DO END DO END DO END DO C 999 RETURN END C C C SUBROUTINE CHECK_ANALYSIS_TZN() C---------------------------------------------------------------------- C- C- Purpose and Methods : Check the values of section TOWER_GEOMETRY_Z. Check C- that the coordinates all fall within the range [8.0, 240.0] for EM, [9.0, C- 240.0] for HD. The values should be increasing for eta = [1, 5], and then C- within 20% of each other for eta = [6, 24], and each EM quantity should be C- smaller than its corresponding HD quantity. C- C- Inputs : none C- Outputs : none C- Controls: none C- C- Created 31-JUL-1990 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE C- C---------------------------------------------------------------------- IMPLICIT NONE C---------------------------------------------------------------------- C C Global declarations C INCLUDE 'D0$PARAMS:LEVEL1_LOOKUP.PARAMS' INCLUDE 'D0$INC:LEVEL1_LOOKUP.INC' INCLUDE 'LSMP$SOURCE:LEVEL1_LOOKUP_EXPANSION.INC' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.PARAMS' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.INC' LOGICAL DAC_DEFINED EXTERNAL DAC_DEFINED INTRINSIC ABS C C Local variables C INTEGER SIGN_ETA, ETA, PHI, CHANNEL REAL POSITION C C Local parameters C INTEGER END_CONSTANT REAL LOWER_EM, LOWER_HD, LOWER_TOT REAL UPPER_EM, UPPER_HD, UPPER_TOT REAL TOLERANCE PARAMETER ( END_CONSTANT = 5, LOWER_EM = 8.0, UPPER_EM = 240.0, & LOWER_HD = 9.0, UPPER_HD = 240.0, LOWER_TOT = 8.0, UPPER_TOT = & 240.0, TOLERANCE = .2 ) C CHARACTER*133 MESSAGE CHARACTER*3 ST_CHANNEL(EM_TOWER:TOT_TOWER) CHARACTER*5 ST_SIGN(POS_ETA:NEG_ETA) C ST_CHANNEL(EM_TOWER) = 'EM' ST_CHANNEL(HD_TOWER) = 'HD' ST_CHANNEL(TOT_TOWER) = 'TOT' ST_SIGN(POS_ETA) = 'PLUS' ST_SIGN(NEG_ETA) = 'MINUS' C C Check that all of the values fall in the proper range C 100 FORMAT(' ', A, ' ETA', I3, ' PHI', I3, ' ', A) DO PHI = PHI_MIN, PHI_MAX DO ETA = ETA_RANGE_MIN, ETA_RANGE_MAX DO SIGN_ETA = POS_ETA, NEG_ETA IF (DAC_DEFINED(SIGN_ETA, ETA, PHI, EM_TOWER) .AND. & ((TOWER_RZ_COORD(SIGN_ETA, ETA, PHI, EM_TOWER, Z_COORD) & .GT. UPPER_EM) .OR. (TOWER_RZ_COORD(SIGN_ETA, ETA, PHI, & EM_TOWER, Z_COORD) .LT. LOWER_EM))) THEN WRITE(MESSAGE, 100) ST_SIGN(SIGN_ETA), ETA, PHI, & ST_CHANNEL(EM_TOWER) CALL MESSAGE_OUT(MES_OUT_RANGE, I_TZN_INDEX, MESSAGE) ENDIF C IF (DAC_DEFINED(SIGN_ETA, ETA, PHI, HD_TOWER) .AND. & ((TOWER_RZ_COORD(SIGN_ETA, ETA, PHI, HD_TOWER, Z_COORD) & .GT. UPPER_HD) .OR. (TOWER_RZ_COORD(SIGN_ETA, ETA, PHI, & HD_TOWER, Z_COORD) .LT. LOWER_HD))) THEN WRITE(MESSAGE, 100) ST_SIGN(SIGN_ETA), ETA, PHI, & ST_CHANNEL(HD_TOWER) CALL MESSAGE_OUT(MES_OUT_RANGE, I_TZN_INDEX, MESSAGE) ENDIF C IF (DAC_DEFINED(SIGN_ETA, ETA, PHI, HD_TOWER) .AND. & ((TOWER_RZ_COORD(SIGN_ETA, ETA, PHI, TOT_TOWER, Z_COORD) & .GT. UPPER_TOT) .OR. (TOWER_RZ_COORD(SIGN_ETA, ETA, PHI, & TOT_TOWER, Z_COORD) .LT. LOWER_TOT))) THEN WRITE(MESSAGE, 100) ST_SIGN(SIGN_ETA), ETA, PHI, & ST_CHANNEL(TOT_TOWER) CALL MESSAGE_OUT(MES_OUT_RANGE, I_TZN_INDEX, MESSAGE) ENDIF C END DO END DO END DO C C Check that each HD is greater than EM, and that each TOT is between HD C and EM. C 200 FORMAT(' ', A, ' ETA', I3, ' PHI', I3, ' ', A) DO PHI = PHI_MIN, PHI_MAX DO ETA = ETA_RANGE_MIN, ETA_RANGE_MAX DO SIGN_ETA = POS_ETA, NEG_ETA IF (DAC_DEFINED(SIGN_ETA, ETA, PHI, EM_TOWER) .AND. & DAC_DEFINED(SIGN_ETA, ETA, PHI, HD_TOWER)) THEN IF (TOWER_RZ_COORD(SIGN_ETA, ETA, PHI, HD_TOWER, Z_COORD) & .LT. TOWER_RZ_COORD(SIGN_ETA, ETA, PHI, EM_TOWER, & Z_COORD)) THEN WRITE(MESSAGE, 200) ST_SIGN(SIGN_ETA), ETA, PHI, & ST_CHANNEL(HD_TOWER) CALL MESSAGE_OUT(MES_HD_SMALL, I_TZN_INDEX, MESSAGE) ENDIF C IF ((TOWER_RZ_COORD(SIGN_ETA, ETA, PHI, TOT_TOWER, & Z_COORD) .LT. TOWER_RZ_COORD(SIGN_ETA, ETA, PHI, & EM_TOWER, Z_COORD)) .OR. (TOWER_RZ_COORD(SIGN_ETA, ETA, & PHI, TOT_TOWER, Z_COORD) .GT. TOWER_RZ_COORD(SIGN_ETA, & ETA, PHI, HD_TOWER, Z_COORD))) THEN WRITE(MESSAGE, 200) ST_SIGN(SIGN_ETA), ETA, PHI, & ST_CHANNEL(TOT_TOWER) CALL MESSAGE_OUT(MES_TOT_OUTSIDE, I_TZN_INDEX, MESSAGE) ENDIF ENDIF END DO END DO END DO C C Check that the values are constant over phi. C 250 FORMAT(' ', A, ' ETA', I3, ' PHI', I3, ' ', A) DO CHANNEL = EM_TOWER, HD_TOWER DO ETA = ETA_RANGE_MIN, ETA_RANGE_MAX DO SIGN_ETA = POS_ETA, NEG_ETA POSITION = TOWER_RZ_COORD(SIGN_ETA, ETA, 1, CHANNEL, & Z_COORD) DO PHI = PHI_MIN, PHI_MAX IF (DAC_DEFINED(SIGN_ETA, ETA, PHI, CHANNEL) .EQ. .FALSE.) & GOTO 1000 IF (TOWER_RZ_COORD(SIGN_ETA, ETA, PHI, CHANNEL, Z_COORD) & .NE. POSITION) THEN WRITE(MESSAGE, 250) ST_SIGN(SIGN_ETA), ETA, PHI, & ST_CHANNEL(CHANNEL) CALL MESSAGE_OUT(MES_NOT_CONSTANT_PHI, I_TZN_INDEX, & MESSAGE) ENDIF 1000 CONTINUE END DO END DO END DO END DO C C Check that values are within 20% of each other for eta = [6, 24] C 300 FORMAT(' ', A, ' ETA', I3, ' PHI', I3, ' ', A) DO CHANNEL = EM_TOWER, HD_TOWER DO PHI = PHI_MIN, PHI_MAX DO SIGN_ETA = POS_ETA, NEG_ETA POSITION = TOWER_RZ_COORD( SIGN_ETA, END_CONSTANT+1, PHI, & CHANNEL, Z_COORD) DO ETA = END_CONSTANT + 1, ETA_RANGE_MAX IF (DAC_DEFINED(SIGN_ETA, ETA, PHI, CHANNEL) .EQ. .FALSE.) & GOTO 2000 IF (ABS(TOWER_RZ_COORD(SIGN_ETA, ETA, PHI, CHANNEL, & Z_COORD) - POSITION) .GT. POSITION * TOLERANCE) THEN WRITE(MESSAGE, 300) ST_SIGN(SIGN_ETA), ETA, PHI, & ST_CHANNEL(CHANNEL) CALL MESSAGE_OUT(MES_NOT_CONSTANT_ETA, I_TZN_INDEX, & MESSAGE) ENDIF 2000 CONTINUE END DO END DO END DO END DO C C Check that values are increasing from ETA [1, 5] C 400 FORMAT(' ', A, ' ETA', I3, ' PHI', I3, ' ', A) DO CHANNEL = EM_TOWER, HD_TOWER DO PHI = PHI_MIN, PHI_MAX DO SIGN_ETA = POS_ETA, NEG_ETA DO ETA = 2, END_CONSTANT IF (DAC_DEFINED(SIGN_ETA, ETA, PHI, CHANNEL) .EQ. .FALSE.) & GOTO 3000 IF (TOWER_RZ_COORD( SIGN_ETA, ETA, PHI, CHANNEL, Z_COORD) & .LE. TOWER_RZ_COORD( SIGN_ETA, ETA -1, PHI, CHANNEL, & Z_COORD)) THEN WRITE(MESSAGE, 400) ST_SIGN(SIGN_ETA), ETA, PHI, & ST_CHANNEL(CHANNEL) CALL MESSAGE_OUT(MES_NOT_INCREASING, I_TZN_INDEX, & MESSAGE) ENDIF 3000 CONTINUE END DO END DO END DO END DO C 999 RETURN END C C C SUBROUTINE CHECK_ANALYSIS_TPN() C---------------------------------------------------------------------- C- C- Purpose and Methods : Check the values of TOWER_GEOMETRY_PHI. Check that C- the coordinates all fall in the range [0.0, 360.0). Check that the C- coordinates are increasing with PHI, and that they are separated from each C- other by 360.0/32.0 within 5% C- C- Inputs : none C- Outputs : none C- Controls: none C- C- Created 1-AUG-1990 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE C- C---------------------------------------------------------------------- IMPLICIT NONE C---------------------------------------------------------------------- C C Global declarations C INCLUDE 'D0$PARAMS:LEVEL1_LOOKUP.PARAMS' INCLUDE 'D0$INC:LEVEL1_LOOKUP.INC' INCLUDE 'LSMP$SOURCE:LEVEL1_LOOKUP_EXPANSION.INC' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.PARAMS' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.INC' LOGICAL DAC_DEFINED EXTERNAL DAC_DEFINED INTRINSIC ABS C C Local variables C INTEGER SIGN_ETA, ETA, PHI REAL POSITION C C Local parameters C REAL VALUE_LOW, VALUE_HIGH, SEPARATION, TOLERANCE PARAMETER (VALUE_LOW = 0.0, VALUE_HIGH = 360.0, SEPARATION = & 360.0/32.0, TOLERANCE = .05 ) C CHARACTER*133 MESSAGE CHARACTER*5 ST_SIGN(POS_ETA:NEG_ETA) C ST_SIGN(POS_ETA) = 'PLUS' ST_SIGN(NEG_ETA) = 'MINUS' C C Check that the coordinates all fall in the range C 100 FORMAT ( ' ', A, ' ETA', I3, ' PHI', I3) DO PHI = PHI_MIN, PHI_MAX DO ETA = ETA_RANGE_MIN, ETA_RANGE_MAX DO SIGN_ETA = POS_ETA, NEG_ETA IF (DAC_DEFINED(SIGN_ETA, ETA, PHI, TOT_TOWER) .AND. & ((TOWER_PHI_COORD(SIGN_ETA, ETA, PHI) .LT. VALUE_LOW) .OR. & (TOWER_PHI_COORD(SIGN_ETA, ETA, PHI) .GE. VALUE_HIGH))) & THEN WRITE(MESSAGE, 100), ST_SIGN(SIGN_ETA), ETA, PHI CALL MESSAGE_OUT(MES_OUT_RANGE, I_TPN_INDEX, MESSAGE) ENDIF END DO END DO END DO C C Check that the coordinates are all increasing, and that they are C separated from each other by the correct amount C 110 FORMAT ( ' ', A, ' ETA', I3, ' PHI', I3) DO ETA = ETA_RANGE_MIN, ETA_RANGE_MAX DO SIGN_ETA = POS_ETA, NEG_ETA DO PHI = PHI_MIN + 1, PHI_MAX IF (TOWER_PHI_COORD(SIGN_ETA, ETA, PHI) .LE. & TOWER_PHI_COORD(SIGN_ETA, ETA, PHI -1)) THEN WRITE(MESSAGE, 110) ST_SIGN(SIGN_ETA), ETA, PHI CALL MESSAGE_OUT(MES_NOT_INCREASING, I_TPN_INDEX, MESSAGE) ENDIF IF (ABS(TOWER_PHI_COORD(SIGN_ETA, ETA, PHI) - & TOWER_PHI_COORD(SIGN_ETA, ETA, PHI - 1) - SEPARATION) .GT. & SEPARATION * TOLERANCE) THEN WRITE(MESSAGE, 110) ST_SIGN(SIGN_ETA), ETA, PHI CALL MESSAGE_OUT(MES_NOT_TOLERANCE, I_TPN_INDEX, MESSAGE) ENDIF END DO END DO END DO C 999 RETURN END C C C SUBROUTINE CHECK_ANALYSIS_AIS() C---------------------------------------------------------------------- C- C- Purpose and Methods : Check the values in ANALOG_INPUT_SCALING. Check that C- they fall in the range (0.0, 1.0]. C- C- Inputs : none C- Outputs : none C- Controls: none C- C- Created 31-JUL-1990 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE C- C---------------------------------------------------------------------- IMPLICIT NONE C---------------------------------------------------------------------- C C Global declarations C INCLUDE 'D0$PARAMS:LEVEL1_LOOKUP.PARAMS' INCLUDE 'D0$INC:LEVEL1_LOOKUP.INC' INCLUDE 'LSMP$SOURCE:LEVEL1_LOOKUP_EXPANSION.INC' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.PARAMS' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.INC' LOGICAL DAC_DEFINED EXTERNAL DAC_DEFINED C C Local variables C INTEGER SIGN_ETA, ETA, PHI, CHANNEL C C Local parameters C REAL VALUE_LOW, VALUE_HIGH PARAMETER (VALUE_LOW = 0.0, VALUE_HIGH = 1.0) C CHARACTER*133 MESSAGE CHARACTER*3 ST_CHANNEL(EM_TOWER:TOT_TOWER) CHARACTER*5 ST_SIGN(POS_ETA:NEG_ETA) C ST_CHANNEL(EM_TOWER) = 'EM' ST_CHANNEL(HD_TOWER) = 'HD' ST_CHANNEL(TOT_TOWER) = 'TOT' ST_SIGN(POS_ETA) = 'PLUS' ST_SIGN(NEG_ETA) = 'MINUS' C C Check the values C 100 FORMAT(' ', A, ' ETA', I3, ' PHI', I3, ' ', A) DO CHANNEL = EM_TOWER, HD_TOWER DO PHI = PHI_MIN, PHI_MAX DO ETA = ETA_RANGE_MIN, ETA_RANGE_MAX DO SIGN_ETA = POS_ETA, NEG_ETA IF ((ANALOG_INPUT_SCALING(SIGN_ETA, ETA, PHI, CHANNEL) & .LE. VALUE_LOW) .OR. (ANALOG_INPUT_SCALING(SIGN_ETA, & ETA, PHI, CHANNEL) .GT. VALUE_HIGH)) THEN WRITE(MESSAGE, 100) ST_SIGN(SIGN_ETA), ETA, PHI, & ST_CHANNEL(CHANNEL) CALL MESSAGE_OUT(MES_OUT_RANGE, I_AIS_INDEX, & MESSAGE) ENDIF END DO END DO END DO END DO C 999 RETURN END C C C SUBROUTINE CHECK_ANALYSIS_IEE() C---------------------------------------------------------------------- C- C- Purpose and Methods : Check the values in INPUT ENERGY_ERROR. Check that C- they fall in the range [0.0, 10.0]. The upper bound may be changed. C- C- Inputs : none C- Outputs : none C- Controls: none C- C- Created 31-JUL-1990 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE C- C---------------------------------------------------------------------- IMPLICIT NONE C---------------------------------------------------------------------- C C Global declarations C INCLUDE 'D0$PARAMS:LEVEL1_LOOKUP.PARAMS' INCLUDE 'D0$INC:LEVEL1_LOOKUP.INC' INCLUDE 'LSMP$SOURCE:LEVEL1_LOOKUP_EXPANSION.INC' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.PARAMS' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.INC' C C Local variables C INTEGER SIGN_ETA, ETA, PHI, CHANNEL C C Local parameters C REAL VALUE_LOW REAL VALUE_HIGH PARAMETER (VALUE_LOW = 0.0, VALUE_HIGH = 10.0) C CHARACTER*133 MESSAGE CHARACTER*3 ST_CHANNEL(EM_TOWER:TOT_TOWER) CHARACTER*5 ST_SIGN(POS_ETA:NEG_ETA) C ST_CHANNEL(EM_TOWER) = 'EM' ST_CHANNEL(HD_TOWER) = 'HD' ST_CHANNEL(TOT_TOWER) = 'TOT' ST_SIGN(POS_ETA) = 'PLUS' ST_SIGN(NEG_ETA) = 'MINUS' C C Check that the values are in range C 100 FORMAT( ' ', A, ' ETA', I3, ' PHI', I3, ' ', A) DO CHANNEL = EM_TOWER, HD_TOWER DO PHI = PHI_MIN, PHI_MAX DO ETA = ETA_RANGE_MIN, ETA_RANGE_MAX DO SIGN_ETA = POS_ETA, NEG_ETA IF ((INPUT_ENERGY_ERROR(SIGN_ETA, ETA, PHI, CHANNEL) .LT. & VALUE_LOW) .OR. (INPUT_ENERGY_ERROR(SIGN_ETA, ETA, PHI, & CHANNEL) .GT. VALUE_HIGH)) THEN WRITE(MESSAGE, 100) ST_SIGN(SIGN_ETA), ETA, PHI, & ST_CHANNEL(CHANNEL) CALL MESSAGE_OUT(MES_OUT_RANGE, I_IEE_INDEX, & MESSAGE) ENDIF END DO END DO END DO END DO C 999 RETURN END C C C SUBROUTINE CHECK_ANALYSIS_DAC() C---------------------------------------------------------------------- C- C- Purpose and Methods : Check the values in DAC_BYTE. Each value should fall C- in the range [0, 20]. It must be greater than 0 for a range contiguous and C- symmetric across zero, and zero elsewhere. C- C- Inputs : none C- Outputs : none C- Controls: none C- C- Created 1-AUG-1990 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE C- C---------------------------------------------------------------------- IMPLICIT NONE C---------------------------------------------------------------------- C C Global declarations C INCLUDE 'D0$PARAMS:LEVEL1_LOOKUP.PARAMS' INCLUDE 'D0$INC:LEVEL1_LOOKUP.INC' INCLUDE 'LSMP$SOURCE:LEVEL1_LOOKUP_EXPANSION.INC' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.PARAMS' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.INC' C C Local variables C INTEGER SIGN_ETA, ETA, PHI, CHANNEL INTEGER LEFT, RIGHT LOGICAL START_RANGE LOGICAL END_RANGE C C Local parameters C INTEGER VALUE_LOW, VALUE_HIGH PARAMETER (VALUE_LOW = 0, VALUE_HIGH = 20) C CHARACTER*133 MESSAGE CHARACTER*3 ST_CHANNEL(EM_TOWER:TOT_TOWER) CHARACTER*5 ST_SIGN(POS_ETA:NEG_ETA) C ST_CHANNEL(EM_TOWER) = 'EM' ST_CHANNEL(HD_TOWER) = 'HD' ST_CHANNEL(TOT_TOWER) = 'TOT' ST_SIGN(POS_ETA) = 'PLUS' ST_SIGN(NEG_ETA) = 'MINUS' C C Check that the values fall in a valid range C 100 FORMAT( ' ', A, ' ETA', I3, ' PHI', I3, ' ', A) DO CHANNEL = EM_TOWER, HD_TOWER DO PHI = PHI_MIN, PHI_MAX DO ETA = ETA_RANGE_MIN, ETA_RANGE_MAX DO SIGN_ETA = POS_ETA, NEG_ETA IF ((DAC_BYTE(SIGN_ETA, ETA, PHI, CHANNEL) .LT. VALUE_LOW) & .OR. (DAC_BYTE(SIGN_ETA, ETA, PHI, CHANNEL) .GT. & VALUE_HIGH)) THEN WRITE(MESSAGE, 100) ST_SIGN(SIGN_ETA), ETA, PHI, & ST_CHANNEL(CHANNEL) CALL MESSAGE_OUT(MES_OUT_RANGE, I_DAC_INDEX, MESSAGE) ENDIF END DO END DO END DO END DO C C Check that the defined values form a range contiguous and symmetric C across zero. C DO CHANNEL = EM_TOWER, HD_TOWER DO PHI = PHI_MIN, PHI_MAX C C Find the left side of the range C DO ETA = -ETA_RANGE_MAX, ETA_RANGE_MAX IF ((ETA .LT. 0) .AND. (DAC_BYTE(NEG_ETA, -ETA, PHI, & CHANNEL) .NE. 0)) THEN LEFT = ETA GOTO 1000 ELSEIF ((ETA .GT. 0) .AND. (DAC_BYTE(POS_ETA, ETA, PHI, & CHANNEL) .NE. 0)) THEN LEFT = ETA GOTO 1000 ENDIF C If ETA = 0, just repeat loop END DO C If no values found, just repeat PHI loop GOTO 4000 C C Find the right side of the range C 1000 CONTINUE DO ETA = LEFT, ETA_RANGE_MAX IF ((ETA .LT. 0) .AND. (DAC_BYTE(NEG_ETA, -ETA, PHI, & CHANNEL) .EQ. 0)) THEN RIGHT = ETA -1 GOTO 2000 ELSEIF ((ETA .GT. 0) .AND. (DAC_BYTE(POS_ETA, ETA, PHI, & CHANNEL) .EQ. 0)) THEN RIGHT = ETA -1 GOTO 2000 ENDIF C If ETA = 0, just repeat loop END DO C If no 0 found, then right side is ETA_RANGE_MAX RIGHT = ETA_RANGE_MAX GOTO 3000 C C Check that there are no more defined values of DAC_BYTE past the range C found. C 2000 CONTINUE 200 FORMAT( ' ', A, ' ETA', I3, ' PHI', I3, ' ', A) DO ETA = RIGHT+2, ETA_RANGE_MAX IF ((ETA .LT. 0) .AND. (DAC_BYTE(NEG_ETA, -ETA, PHI, & CHANNEL) .NE. 0)) THEN WRITE(MESSAGE, 200) ST_SIGN(NEG_ETA), -ETA, PHI, & ST_CHANNEL(CHANNEL) CALL MESSAGE_OUT(MES_NOT_CONTIG, I_DAC_INDEX, MESSAGE) C ELSEIF ((ETA .GT. 0) .AND. (DAC_BYTE(POS_ETA, ETA, PHI, & CHANNEL) .NE. 0)) THEN WRITE(MESSAGE, 200) ST_SIGN(POS_ETA), ETA, PHI, & ST_CHANNEL(CHANNEL) CALL MESSAGE_OUT(MES_NOT_CONTIG, I_DAC_INDEX, MESSAGE) ENDIF C If ETA = 0, just repeat loop END DO C C Check that the range is symmetric C C Print message if either side has an inappropriate sign, or one side is C not within 1 of the negative of the other side. C 3000 CONTINUE IF ( (LEFT .GT. 0) .OR. (RIGHT .LT. 0) .OR. ( (-LEFT .NE. & RIGHT) .AND. (-LEFT .NE. RIGHT + 1) .AND. (-LEFT .NE. RIGHT & - 1) ) ) THEN WRITE(MESSAGE, 300) PHI, ST_CHANNEL(CHANNEL) 300 FORMAT(' ', I3, ' ', A) CALL MESSAGE_OUT(MES_NOT_SYMMETRIC, I_DAC_INDEX, ' ') ENDIF C C Continue the PHI and CHANNEL loops 4000 CONTINUE END DO END DO C 999 RETURN END C C C SUBROUTINE CHECK_ANALYSIS_AZR() C---------------------------------------------------------------------- C- C- Purpose and Methods : Check the values in ADC_ZERESP. Check that the C- values fall in the range [0, 25] C- C- Inputs : none C- Outputs : none C- Controls: none C- C- Created 1-AUG-1990 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE C- C---------------------------------------------------------------------- IMPLICIT NONE C---------------------------------------------------------------------- C C Global declarations C INCLUDE 'D0$PARAMS:LEVEL1_LOOKUP.PARAMS' INCLUDE 'D0$INC:LEVEL1_LOOKUP.INC' INCLUDE 'LSMP$SOURCE:LEVEL1_LOOKUP_EXPANSION.INC' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.PARAMS' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.INC' C C Local variables C INTEGER SIGN_ETA, ETA, PHI, CHANNEL C C Local parameters C INTEGER VALUE_LOW, VALUE_HIGH PARAMETER (VALUE_LOW = 0, VALUE_HIGH = 25) C CHARACTER*133 MESSAGE CHARACTER*3 ST_CHANNEL(EM_TOWER:TOT_TOWER) CHARACTER*5 ST_SIGN(POS_ETA:NEG_ETA) C ST_CHANNEL(EM_TOWER) = 'EM' ST_CHANNEL(HD_TOWER) = 'HD' ST_CHANNEL(TOT_TOWER) = 'TOT' ST_SIGN(POS_ETA) = 'PLUS' ST_SIGN(NEG_ETA) = 'MINUS' C C Check that the values all fall within range C 100 FORMAT(' ', A, ' ETA', I3, ' PHI', I3, ' ', A) DO CHANNEL = EM_TOWER, HD_TOWER DO PHI = PHI_MIN, PHI_MAX DO ETA = ETA_RANGE_MIN, ETA_RANGE_MAX DO SIGN_ETA = POS_ETA, NEG_ETA IF ((ADC_ZERESP(SIGN_ETA, ETA, PHI, CHANNEL) .LT. & VALUE_LOW) .OR. (ADC_ZERESP(SIGN_ETA, ETA, PHI, CHANNEL) & .GT. VALUE_HIGH)) THEN WRITE(MESSAGE, 100) ST_SIGN(SIGN_ETA), ETA, PHI, & ST_CHANNEL(CHANNEL) CALL MESSAGE_OUT(MES_OUT_RANGE, I_AZR_INDEX, MESSAGE) ENDIF END DO END DO END DO END DO C 999 RETURN END C C C SUBROUTINE CHECK_ANALYSIS_ELN() C---------------------------------------------------------------------- C- C- Purpose and Methods : Check the values in ELEC_NOISE_SIGMA. Check that the C- values lie in the range (0.0, 2.0) C- C- Inputs : none C- Outputs : none C- Controls: none C- C- Created 1-AUG-1990 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE C- C---------------------------------------------------------------------- IMPLICIT NONE C---------------------------------------------------------------------- C C Global declarations C INCLUDE 'D0$PARAMS:LEVEL1_LOOKUP.PARAMS' INCLUDE 'D0$INC:LEVEL1_LOOKUP.INC' INCLUDE 'LSMP$SOURCE:LEVEL1_LOOKUP_EXPANSION.INC' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.PARAMS' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.INC' LOGICAL DAC_DEFINED EXTERNAL DAC_DEFINED C C Local variables C INTEGER SIGN_ETA, ETA, PHI, CHANNEL C C Local parameters C REAL VALUE_LOW, VALUE_HIGH PARAMETER (VALUE_LOW = 0.0, VALUE_HIGH = 2.0) C CHARACTER*133 MESSAGE CHARACTER*3 ST_CHANNEL(EM_TOWER:TOT_TOWER) CHARACTER*5 ST_SIGN(POS_ETA:NEG_ETA) C ST_CHANNEL(EM_TOWER) = 'EM' ST_CHANNEL(HD_TOWER) = 'HD' ST_CHANNEL(TOT_TOWER) = 'TOT' ST_SIGN(POS_ETA) = 'PLUS' ST_SIGN(NEG_ETA) = 'MINUS' C C Check that the values are in range C 100 FORMAT(' ', A, ' ETA', I3, ' PHI', I3, ' ', A) DO CHANNEL = EM_TOWER, HD_TOWER DO PHI = PHI_MIN, PHI_MAX DO ETA = ETA_RANGE_MIN, ETA_RANGE_MAX DO SIGN_ETA = POS_ETA, NEG_ETA IF (DAC_DEFINED(SIGN_ETA, ETA, PHI, CHANNEL) .AND. & ((ADC_ZERESP(SIGN_ETA, ETA, PHI, CHANNEL) .LT. & VALUE_LOW) .OR. (ADC_ZERESP(SIGN_ETA, ETA, PHI, CHANNEL) & .GT. VALUE_HIGH))) THEN WRITE(MESSAGE, 100) ST_SIGN(SIGN_ETA), ETA, PHI, & ST_CHANNEL(CHANNEL) CALL MESSAGE_OUT(MES_OUT_RANGE, I_ELN_INDEX, MESSAGE) ENDIF END DO END DO END DO END DO C 999 RETURN END C C C SUBROUTINE CHECK_ANALYSIS_LZR() C---------------------------------------------------------------------- C- C- Purpose and Methods : Check the values in PROM_ZERESP. They should be in C- the range [0, 25] If this is not 0, then the energy cut in the prom lookup C- should be 0. If this is 0, then the energy cut in the prom lookup should C- not be 0. If this is non-zero, then ADC_ZERESP must be non-zero. C- C- Inputs : none C- Outputs : none C- Controls: none C- C- Created 1-AUG-1990 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE C- C---------------------------------------------------------------------- IMPLICIT NONE C---------------------------------------------------------------------- C C Global declarations C INCLUDE 'D0$PARAMS:LEVEL1_LOOKUP.PARAMS' INCLUDE 'D0$INC:LEVEL1_LOOKUP.INC' INCLUDE 'LSMP$SOURCE:LEVEL1_LOOKUP_EXPANSION.INC' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.PARAMS' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.INC' C C Local variables C INTEGER SIGN_ETA, ETA, PHI, LUQ C C Local parameters C INTEGER VALUE_LOW, VALUE_HIGH PARAMETER (VALUE_LOW = 0, VALUE_HIGH = 25) C CHARACTER*133 MESSAGE CHARACTER*6 ST_LUQ(EM_ET_QUANT:PY_QUANT) CHARACTER*5 ST_SIGN(POS_ETA:NEG_ETA) INTEGER LUQ_TO_PROM(EM_ET_QUANT:PY_QUANT) INTEGER E_CUT C E_CUT( SIGN_ETA, ETA, PHI, LUQ ) = PROM_CUT( SIGN_ETA, ETA, PHI, & LUQ_TO_PROM(LUQ), LUQ_PAGE_INDEX(LUQ, 0) ) C ST_LUQ(EM_ET_QUANT) = 'EM ET' ST_LUQ(EM_L2_QUANT) = 'EM L2' ST_LUQ(HD_ET_QUANT) = 'HD ET' ST_LUQ(HD_L2_QUANT) = 'HD L2' ST_LUQ(PX_QUANT) = 'TOT PX' ST_LUQ(PY_QUANT) = 'TOT PY' ST_SIGN(POS_ETA) = 'PLUS' ST_SIGN(NEG_ETA) = 'MINUS' LUQ_TO_PROM(EM_ET_QUANT) = EM_PROM LUQ_TO_PROM(EM_L2_QUANT) = EM_PROM LUQ_TO_PROM(HD_ET_QUANT) = HD_PROM LUQ_TO_PROM(HD_L2_QUANT) = HD_PROM LUQ_TO_PROM(PX_QUANT) = PX_PROM LUQ_TO_PROM(PY_QUANT) = PY_PROM C C Check that the values are in range C 100 FORMAT(' ', A, ' ETA', I3, ' PHI', I3, ' ', A) DO LUQ = EM_ET_QUANT, PY_QUANT DO PHI = PHI_MIN, PHI_MAX DO ETA = ETA_RANGE_MIN, ETA_RANGE_MAX DO SIGN_ETA = POS_ETA, NEG_ETA IF ((LOOKUP_ZERESP(SIGN_ETA, ETA, PHI, LUQ) .LT. & VALUE_LOW) & .OR. (LOOKUP_ZERESP(SIGN_ETA, ETA, PHI, LUQ) .GT. & VALUE_HIGH)) THEN WRITE(MESSAGE, 100) ST_SIGN(SIGN_ETA), ETA, PHI, & ST_LUQ(LUQ) CALL MESSAGE_OUT(MES_OUT_RANGE, I_LZR_INDEX, MESSAGE) ENDIF C C If this is not 0, then TRANSV_ENERGY_CUT should be 0. If this is 0, C then TRANSV_ENERGY_CUT should not be 0. If this is non-zero, then C ADC_ZERESP must be non-zero. C IF ((LOOKUP_ZERESP(SIGN_ETA, ETA, PHI, LUQ) .NE. 0) .AND. & (E_CUT(SIGN_ETA, ETA, PHI, LUQ) .NE. 0)) THEN WRITE(MESSAGE, 100) ST_SIGN(SIGN_ETA), ETA, PHI, & ST_LUQ(LUQ) CALL MESSAGE_OUT(MES_SHOULD_ZERO, I_LZR_INDEX, MESSAGE) ENDIF C IF ((LOOKUP_ZERESP(SIGN_ETA, ETA, PHI, LUQ) .EQ. 0) .AND. & (E_CUT(SIGN_ETA, ETA, PHI, LUQ) .EQ. 0)) THEN WRITE(MESSAGE, 100) ST_SIGN(SIGN_ETA), ETA, PHI, & ST_LUQ(LUQ) CALL MESSAGE_OUT(MES_SHOULD_NOTZERO, I_LZR_INDEX, & MESSAGE) ENDIF C IF ((LOOKUP_ZERESP(SIGN_ETA, ETA, PHI, LUQ) .NE. 0) .AND. & (ADC_ZERESP(SIGN_ETA, ETA, PHI, LUQ) .EQ. 0)) THEN WRITE(MESSAGE, 100) ST_SIGN(SIGN_ETA), ETA, PHI, & ST_LUQ(LUQ) CALL MESSAGE_OUT(MES_SHOULD_ZERO_AZR, I_AZR_INDEX, & MESSAGE) ENDIF C END DO END DO END DO END DO 999 RETURN END C C C SUBROUTINE CHECK_ANALYSIS_ESS() C---------------------------------------------------------------------- C- C- Purpose and Methods : Check the values in section ENERGY_SCALE_SHIFT. C- Check that they are in the range [-4, 4]. Check that it is the same for C- first and second lookups of the same tower. C- C- Inputs : none C- Outputs : none C- Controls: none C- C- Created 1-AUG-1990 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE C- C---------------------------------------------------------------------- IMPLICIT NONE C---------------------------------------------------------------------- C C Global declarations C INCLUDE 'D0$PARAMS:LEVEL1_LOOKUP.PARAMS' INCLUDE 'D0$INC:LEVEL1_LOOKUP.INC' INCLUDE 'LSMP$SOURCE:LEVEL1_LOOKUP_EXPANSION.INC' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.PARAMS' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.INC' C C Local variables C INTEGER SIGN_ETA, ETA, LUQ C C Local parameters C INTEGER VALUE_LOW, VALUE_HIGH PARAMETER (VALUE_LOW = -4, VALUE_HIGH = 4) C CHARACTER*133 MESSAGE CHARACTER*6 ST_LUQ(EM_ET_QUANT:PY_QUANT) CHARACTER*5 ST_SIGN(POS_ETA:NEG_ETA) C ST_LUQ(EM_ET_QUANT) = 'EM ET' ST_LUQ(EM_L2_QUANT) = 'EM L2' ST_LUQ(HD_ET_QUANT) = 'HD ET' ST_LUQ(HD_L2_QUANT) = 'HD L2' ST_LUQ(PX_QUANT) = 'TOT PX' ST_LUQ(PY_QUANT) = 'TOT PY' ST_SIGN(POS_ETA) = 'PLUS' ST_SIGN(NEG_ETA) = 'MINUS' C C Check that the values are in range C Check that it is the same for first and second lookups of the same C tower. C 100 FORMAT(' ', A, ' ETA', I3, ' ', A) 110 FORMAT(A, ' ETA', I3, ' EM ET and HD ET') 120 FORMAT(A, ' ETA', I3, ' EM L2 and HD L2') DO LUQ = EM_ET_QUANT, PY_QUANT DO ETA = ETA_RANGE_MIN, ETA_RANGE_MAX DO SIGN_ETA = POS_ETA, NEG_ETA IF ((LUQ_LOCAL_RESCALING(SIGN_ETA, ETA, LUQ) .LT. VALUE_LOW) & .OR. (LUQ_LOCAL_RESCALING(SIGN_ETA, ETA, LUQ) .GT. & VALUE_HIGH)) THEN WRITE(MESSAGE, 100) ST_SIGN(SIGN_ETA), ETA, ST_LUQ(LUQ) CALL MESSAGE_OUT(MES_OUT_RANGE, I_ESS_INDEX, MESSAGE) ENDIF IF ((LUQ .EQ. EM_ET_QUANT) .AND. (LUQ_LOCAL_RESCALING( & SIGN_ETA, ETA, EM_ET_QUANT) .NE. LUQ_LOCAL_RESCALING( & SIGN_ETA, ETA, HD_ET_QUANT) ) ) THEN WRITE(MESSAGE, 110) ST_SIGN(SIGN_ETA), ETA, ST_LUQ(LUQ) CALL MESSAGE_OUT(MES_ANALYSIS_GENERAL, I_ESS_INDEX, & 'The following two members are not equal: ' // MESSAGE) ELSEIF ((LUQ .EQ. EM_L2_QUANT) .AND. (LUQ_LOCAL_RESCALING( & SIGN_ETA, ETA, EM_L2_QUANT) .NE. LUQ_LOCAL_RESCALING( & SIGN_ETA, ETA, HD_L2_QUANT) ) ) THEN WRITE(MESSAGE, 120) ST_SIGN(SIGN_ETA), ETA, ST_LUQ(LUQ) CALL MESSAGE_OUT(MES_ANALYSIS_GENERAL, I_ESS_INDEX, & 'The following two members are not equal: ' // MESSAGE) ENDIF END DO END DO END DO C 999 RETURN END C C C SUBROUTINE CHECK_ANALYSIS_FNF() C---------------------------------------------------------------------- C- C- Purpose and Methods : Check the values in FINAL_FITTING. Check that they C- are in the range [-10.0, 10.0]. C- C- Inputs : none C- Outputs : none C- Controls: none C- C- Created 1-AUG-1990 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE C- C---------------------------------------------------------------------- IMPLICIT NONE C---------------------------------------------------------------------- C C Global declarations C INCLUDE 'D0$PARAMS:LEVEL1_LOOKUP.PARAMS' INCLUDE 'D0$INC:LEVEL1_LOOKUP.INC' INCLUDE 'LSMP$SOURCE:LEVEL1_LOOKUP_EXPANSION.INC' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.PARAMS' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.INC' C C Local variables C INTEGER SIGN_ETA, ETA, PHI, LUQ, PAGE C C Local parameters C REAL VALUE_LOW, VALUE_HIGH PARAMETER ( VALUE_LOW = -10.0, VALUE_HIGH = -10.0) C CHARACTER*133 MESSAGE CHARACTER*6 ST_LUQ(EM_ET_QUANT:PY_QUANT) CHARACTER*5 ST_SIGN(POS_ETA:NEG_ETA) C ST_LUQ(EM_ET_QUANT) = 'EM ET' ST_LUQ(EM_L2_QUANT) = 'EM L2' ST_LUQ(HD_ET_QUANT) = 'HD ET' ST_LUQ(HD_L2_QUANT) = 'HD L2' ST_LUQ(PX_QUANT) = 'TOT PX' ST_LUQ(PY_QUANT) = 'TOT PY' ST_SIGN(POS_ETA) = 'PLUS' ST_SIGN(NEG_ETA) = 'MINUS' C C Check that the values are in range C 100 FORMAT( ' ', A, ' ETA', I3, ' PHI', I3, ' ', A, ' PAGE', I3) DO PAGE = PAGE_NUM_MIN, PAGE_NUM_MAX DO LUQ = EM_ET_QUANT, PY_QUANT DO PHI = PHI_MIN, PHI_MAX DO ETA = ETA_RANGE_MIN, ETA_RANGE_MAX DO SIGN_ETA = POS_ETA, NEG_ETA IF ((FINAL_FITTING(SIGN_ETA, ETA, PHI, LUQ, PAGE) .LT. & VALUE_LOW) .OR. (FINAL_FITTING(SIGN_ETA, ETA, PHI, & LUQ, PAGE) .GT. VALUE_HIGH)) THEN WRITE(MESSAGE, 100) ST_SIGN(SIGN_ETA), ETA, PHI, & ST_LUQ(LUQ), PAGE END IF END DO END DO END DO END DO END DO C 999 RETURN END C C C SUBROUTINE CHECK_ANALYSIS_TEC() C---------------------------------------------------------------------- C- C- Purpose and Methods : Check the values in TRANSV_ENERGY_CUT. They should C- fall in the range [0.0, 10.0]. C- C- Inputs : none C- Outputs : none C- Controls: none C- C- Created 1-AUG-1990 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE C- C---------------------------------------------------------------------- IMPLICIT NONE C---------------------------------------------------------------------- C C Global declartions C INCLUDE 'D0$PARAMS:LEVEL1_LOOKUP.PARAMS' INCLUDE 'D0$INC:LEVEL1_LOOKUP.INC' INCLUDE 'LSMP$SOURCE:LEVEL1_LOOKUP_EXPANSION.INC' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.PARAMS' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.INC' C C Local variables C INTEGER SIGN_ETA, ETA, LUQ C C Local parameters C REAL VALUE_LOW, VALUE_HIGH PARAMETER (VALUE_LOW = 0.0, VALUE_HIGH = 10.0) C CHARACTER*133 MESSAGE CHARACTER*6 ST_LUQ(EM_ET_QUANT:PY_QUANT) CHARACTER*5 ST_SIGN(POS_ETA:NEG_ETA) C ST_LUQ(EM_ET_QUANT) = 'EM ET' ST_LUQ(EM_L2_QUANT) = 'EM L2' ST_LUQ(HD_ET_QUANT) = 'HD ET' ST_LUQ(HD_L2_QUANT) = 'HD L2' ST_LUQ(PX_QUANT) = 'TOT PX' ST_LUQ(PY_QUANT) = 'TOT PY' ST_SIGN(POS_ETA) = 'PLUS' ST_SIGN(NEG_ETA) = 'MINUS' C C Check that the values are in range C 100 FORMAT( ' ', A, ' ETA', I3, ' ', A) DO LUQ = EM_ET_QUANT, PY_QUANT DO ETA = ETA_RANGE_MIN, ETA_RANGE_MAX DO SIGN_ETA = POS_ETA, NEG_ETA IF ((TRANSV_ENERGY_CUT(SIGN_ETA, ETA, LUQ) .LT. & VALUE_LOW) .OR. (TRANSV_ENERGY_CUT(SIGN_ETA, ETA, & LUQ) .GT. VALUE_HIGH)) THEN WRITE (MESSAGE, 100) ST_SIGN(SIGN_ETA), ETA, ST_LUQ(LUQ) CALL MESSAGE_OUT(MES_OUT_RANGE, I_TEC_INDEX, MESSAGE) ENDIF END DO END DO END DO C 999 RETURN END