SUBROUTINE DISPATCH_MINIMAL( UNIT_NUM, ERROR ) C---------------------------------------------------------------------- C- C- Purpose and Methods : C- DISPATCH parses the header of each section and transfers control to a C- module appropriate to that section (PARSE_SECTION). When PARSE_SECTION is C- called, the SECTION statement has been parsed including the END_OF_LINE. C- When control is returned, the END_SECTION statement is assumed to already C- have been parsed. It repeats parsing each section until the end of file C- is reached. C- C- Inputs : C- UNIT_NUM The IO unit number C- C- Outputs : C- ERROR Error status. .TRUE. on error. C- C- Controls: NONE C- C- Created 8-JUN-1990 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE C- C---------------------------------------------------------------------- IMPLICIT NONE C---------------------------------------------------------------------- C C Global Definitions C INCLUDE 'D0$LEVEL1:PARSE_TOKENS.PARAMS' INCLUDE 'D0$LEVEL1:PARSE_TOKENS.INC' INCLUDE 'D0$LEVEL1:LEVEL1_LOOKUP.PARAMS' INCLUDE 'D0$LEVEL1:LEVEL1_LOOKUP.INC' C C Argument declarations C INTEGER UNIT_NUM LOGICAL ERROR C C Local variables C INTEGER TOKEN CHARACTER*20 STRING_VALUE REAL NUMBER_VALUE INTEGER SECTION LOGICAL ERROR_HOLD C C First must initialize LINE_NUMBER C LINE_NUMBER = 0 ERROR = .FALSE. ERROR_HOLD = .FALSE. C 1000 CONTINUE C C find SECTION C CALL CHECK_NEXT_TOKEN( UNIT_NUM, C_SECTION_EOF, TOKEN, & STRING_VALUE, NUMBER_VALUE, ERROR, & CHECK_CLASS + IGNORE_EOL) C IF ( ERROR ) THEN CALL MESSAGE_OUT(MES_EXPECT_SECTION, 0, STRING_VALUE) ERROR_HOLD = .TRUE. IF (.NOT. ABORT_ON_ERROR) THEN CALL PARSE_DUMMY(UNIT_NUM) GOTO 1000 ELSE GOTO 999 ENDIF ENDIF C C below is the only exit from this routine C IF ( TOKEN .EQ. T_END_OF_FILE ) THEN IF ( VERBOSE ) WRITE ( 6, *) 'End of file recieved' GOTO 999 ENDIF C C find section name C CALL CHECK_NEXT_TOKEN( UNIT_NUM, C_SECTION, TOKEN, & STRING_VALUE, NUMBER_VALUE, ERROR, CHECK_CLASS ) IF ( ERROR ) THEN ERROR_HOLD = .TRUE. CALL MESSAGE_OUT(MES_EXPECT_SECNAME, 0, STRING_VALUE) IF (.NOT. ABORT_ON_ERROR) THEN CALL PARSE_DUMMY( UNIT_NUM ) GOTO 1000 ELSE GOTO 999 ENDIF ENDIF C IF ( VERBOSE ) THEN WRITE( 6, 300 ) LINE_NUMBER, STRING_VALUE 300 FORMAT ( ' Line ', I8, ': parsing section ' , A20 ) ENDIF C C there should be an END_OF_LINE next C SECTION = TOKEN CALL PARSE_EOL( UNIT_NUM, ERROR ) IF (ERROR) THEN IF (.NOT. ABORT_ON_ERROR) THEN GOTO 1000 ELSE GOTO 999 ENDIF ENDIF C C call appropriate routine C IF ( SECTION .EQ. T_LEVEL_0_BINS_LOW ) THEN CALL PARSE_SECTION( UNIT_NUM, I_L0L_INDEX, & L0_BIN_COVERAGE(L0_BIN_MIN,Z_LOW), ERROR ) C ELSEIF ( SECTION .EQ. T_LEVEL_0_BINS_HIGH ) THEN CALL PARSE_SECTION( UNIT_NUM, I_L0H_INDEX, & L0_BIN_COVERAGE(L0_BIN_MIN,Z_HIGH), ERROR ) C ELSEIF ( SECTION .EQ. T_LOOKUP_QUANTITIES ) THEN CALL PARSE_SECTION( UNIT_NUM, I_LUQ_INDEX, & LUQ_PAGE_INDEX(EM_ET_QUANT, PAGE_NUM_MIN), ERROR ) C ELSEIF ( SECTION .EQ. T_PAGE_VS_BIN ) THEN CALL PARSE_SECTION( UNIT_NUM, I_PVB_INDEX, & LUQ_PAGE_NUMBER(EM_ET_QUANT, L0_BIN_MIN), ERROR ) C ELSEIF ( SECTION .EQ. T_PAGE_NOMINAL_CENTER ) THEN CALL PARSE_DUMMY(UNIT_NUM) C ELSEIF ( SECTION .EQ. T_GLOBAL_ADC_SCALE ) THEN CALL PARSE_SECTION( UNIT_NUM, I_GAC_INDEX, & GLOBAL_ADC_SCALE, ERROR ) C ELSEIF ( SECTION .EQ. T_GLOBAL_ENERGY_SCALE ) THEN CALL PARSE_SECTION( UNIT_NUM, I_GEC_INDEX, & GLOBAL_ENERGY_SCALE( EM_ET_QUANT ), ERROR ) C ELSEIF ( SECTION .EQ. T_ELECT_NOISE_CUT_FACT ) THEN CALL PARSE_DUMMY(UNIT_NUM) C ELSEIF ( SECTION .EQ. T_TOWER_GEOMETRY_R ) THEN CALL PARSE_DUMMY(UNIT_NUM) C ELSEIF ( SECTION .EQ. T_TOWER_GEOMETRY_Z ) THEN CALL PARSE_DUMMY(UNIT_NUM) C ELSEIF ( SECTION .EQ. T_TOWER_GEOMETRY_PHI ) THEN CALL PARSE_DUMMY(UNIT_NUM) C ELSEIF ( SECTION .EQ. T_ANALOG_INPUT_SCALING ) THEN CALL PARSE_SECTION( UNIT_NUM, I_AIS_INDEX, & ANALOG_INPUT_SCALING( POS_ETA, ETA_MIN, PHI_MIN, EM_TOWER ), & ERROR ) C ELSEIF ( SECTION .EQ. T_INPUT_ENERGY_ERROR ) THEN CALL PARSE_SECTION( UNIT_NUM, I_IEE_INDEX, INPUT_ENERGY_ERROR( & POS_ETA, ETA_MIN, PHI_MIN, EM_TOWER), ERROR ) C ELSEIF ( SECTION .EQ. T_DOWNLOADED_BYTE ) THEN CALL PARSE_SECTION( UNIT_NUM, I_DAC_INDEX, & DAC_BYTE( POS_ETA, ETA_MIN, PHI_MIN, EM_TOWER ), ERROR ) C ELSEIF ( SECTION .EQ. T_ADC_ZERESP ) THEN CALL PARSE_SECTION( UNIT_NUM, I_AZR_INDEX, & ADC_ZERESP( POS_ETA, ETA_MIN, PHI_MIN, EM_TOWER ), ERROR ) C ELSEIF ( SECTION .EQ. T_ELECT_NOISE ) THEN CALL PARSE_SECTION( UNIT_NUM, I_ELN_INDEX, & ELEC_NOISE_SIGMA( POS_ETA, ETA_MIN, PHI_MIN, EM_TOWER ), & ERROR ) C ELSEIF ( SECTION .EQ. T_LOOKUP_ZERESP ) THEN CALL PARSE_SECTION( UNIT_NUM, I_LZR_INDEX, & LOOKUP_ZERESP( POS_ETA, ETA_MIN, PHI_MIN, EM_ET_QUANT ), & ERROR ) C ELSEIF ( SECTION .EQ. T_ENERGY_SCALE_SHIFT ) THEN CALL PARSE_SECTION( UNIT_NUM, I_ESS_INDEX, LOOKUP_ZERESP( & POS_ETA, ETA_MIN, PHI_MIN, EM_ET_QUANT), ERROR) C ELSEIF ( SECTION .EQ. T_FINAL_FITTING ) THEN CALL PARSE_DUMMY(UNIT_NUM) C ELSEIF ( SECTION .EQ. T_TRANSV_ENERGY_CUT ) THEN CALL PARSE_DUMMY(UNIT_NUM) C ELSEIF ( SECTION .EQ. T_PROM_OUTPUT_CUT ) THEN CALL PARSE_SECTION( UNIT_NUM, I_PRC_INDEX, & PROM_CUT( POS_ETA, ETA_MIN, PHI_MIN, EM_PROM, & PAGE_INDEX_MIN ), ERROR ) C ELSEIF ( SECTION .EQ. T_PROM_TRANSFER_COEFF ) THEN CALL PARSE_SECTION( UNIT_NUM, I_PTC_INDEX, & PROM_SLOPE( POS_ETA, ETA_MIN, PHI_MIN, EM_PROM, & PAGE_INDEX_MIN ), ERROR ) C ELSEIF ( SECTION .EQ. T_FIRST_LOOKUP_TYPE ) THEN CALL PARSE_SECTION( UNIT_NUM, I_FLT_INDEX, FIRST_LOOKUP_TYPE, & ERROR) C ELSEIF ( SECTION .EQ. T_SECOND_LOOKUP_TYPE ) THEN CALL PARSE_SECTION( UNIT_NUM, I_SLT_INDEX, SECOND_LOOKUP_TYPE, & ERROR ) C ELSE CALL MESSAGE_OUT(MES_PROG_DISPATCH, 0, ' ') ERROR_HOLD = .TRUE. GOTO 999 ENDIF C C repeat loop C ERROR_HOLD = ERROR_HOLD .OR. ERROR IF (ABORT_ON_ERROR .AND. (LSM_ERROR_SEVERITY .GE. ERROR_READING)) & THEN ERROR_HOLD = .TRUE. GOTO 999 ENDIF GOTO 1000 C C C 999 CONTINUE ERROR = ERROR .OR. ERROR_HOLD RETURN END