C####################################################################### SUBROUTINE INITIALIZE_RING_BUFFER C---------------------------------------------------------------------- C- C- Purpose and Methods : Initializes variables needed by INTEGRATE_NEW_DELTAS C- when a display is first opened from the menu. C- C- Inputs : C- Outputs : C- Controls: C- C- Created 17-AUG-1994 Philippe Laurens,Freddie Landry C- C---------------------------------------------------------------------- IMPLICIT NONE C---------------------------------------------------------------------- INCLUDE 'LV1_MPOOL.PARAMS' INCLUDE 'TRGMON_RBUF.INC' START = .TRUE. STEADY_STATE = .FALSE. OLD = 1 CURRENT = 2 999 RETURN END C####################################################################### C---------------------------------------------------------------------- SUBROUTINE INTEGRATE_NEW_DELTAS C---------------------------------------------------------------------- C- C- Purpose and Methods : Recalculates delta quantities in C- LV1_MPOOL_RAW.INC over a user defined integration C- time. First, scalers are stored in the common C- block TRGMON_RBUF.INC as arrays. Then the delta C- quantities are calculated by taking the C- difference between between the most recent C- array element and the oldest. C- C- Inputs : scaler counts from LV1_MPOOL_RAW.INC C- C- Outputs : scalers stored in TRGMON_RBUF.INC C- new values for delta quantities are written to C- LV1_MPOOL_RAW.INC C- C- Controls: none C- C- NOTE: This routine must be run after LV1_MPOOL_RAW.INC is filled C- by FILL_MONIT_POOL.FOR C- C- Created 28-JUN-1994 Philippe Laurens, Freddie Landry C---------------------------------------------------------------------- IMPLICIT NONE C---------------------------------------------------------------------- INCLUDE 'LV1_MON_SCREEN.INC' INCLUDE 'LV1_MPOOL.PARAMS' INCLUDE 'TRGMON_RBUF.INC' IF ( START .EQV. .TRUE. ) THEN CALL FILL_RING_BUFF(OLD) START = .FALSE. RETURN ENDIF CALL FILL_RING_BUFF( CURRENT ) C Now to calculate the delta quantites CALL CALC_DELTAS C Setting CURRENT and OLD for next call to this subroutine CURRENT = MOD( CURRENT, RING_SIZE ) + 1 IF ( (CURRENT .EQ. 1) .AND. (STEADY_STATE .EQV. .FALSE.) ) THEN STEADY_STATE = .TRUE. ENDIF IF ( STEADY_STATE .EQV. .TRUE. ) THEN OLD = MOD( OLD, RING_SIZE ) + 1 ENDIF RETURN END C--------------------------------------------------------------------- C####################################################################### SUBROUTINE FILL_RING_BUFF( INDEX ) C---------------------------------------------------------------------- C- C- Purpose and Methods : Takes scalers from LV1_MPOOL_RAW.INC and C- stores them in TRGMON_RBUF.INC. C- C- Inputs : INDEX specifies which element of the arrays are to be filled C- C- Outputs : C- Controls: C- C- Created 1-JUL-1994 Philippe Laurens, Freddie Landry C- C- Updated 19-OCT-1995 Philippe Laurens - MSU L1 Trigger C- add scalers for 36x36 bunch test C---------------------------------------------------------------------- IMPLICIT NONE C---------------------------------------------------------------------- INTEGER INDEX INCLUDE 'LV1_MPOOL_RAW.INC' INCLUDE 'LV1_MPOOL.PARAMS' INCLUDE 'TRGMON_RBUF.INC' INCLUDE 'LEVEL1_LOOKUP.PARAMS' INCLUDE 'LEVEL1_CAL_TRIG.PARAMS' INCLUDE 'LEVEL1_FRAMEWORK.PARAMS' INCLUDE 'LEVEL1_TRIGGER_DATA_BLOCK.INC' INTEGER SPTRG_NUM, COUNT_TYPE, BUNCH_NUM, SCALER_NUM INTEGER GEOSECT_NUM C Grabbing needed scaler counts from LV1_MPOOL_RAW.INC CALL L1_EXTRACT_5BYTE_SCALER( L1_CRATE_HEADER, BEAM_CROSS_SCALER, & RB_BEAM_CROSS_COUNT( UNITS, INDEX ), & RB_BEAM_CROSS_COUNT( GIGAS, INDEX ) ) RB_VETO_CROSS_COUNT( INDEX ) = VETO_CROSS_COUNT CALL L1_EXTRACT_5BYTE_SCALER( L1_CRATE_HEADER, DBLOCK_NUM_SCALER, & RB_GLOBAL_FIRED_COUNT( UNITS, INDEX), & RB_GLOBAL_FIRED_COUNT( GIGAS, INDEX) ) CALL L1_EXTRACT_5BYTE_SCALER( L1_CRATE_HEADER, TRG_NUM_SCALER, & RB_EVENT_TRANSFER_COUNT( UNITS, INDEX), & RB_EVENT_TRANSFER_COUNT( GIGAS, INDEX) ) CALL L1_EXTRACT_5BYTE_SCALER( L1_CRATE_HEADER, FASTZ_GOOD_SCALER, & RB_LEVEL_0_COUNT( UNITS, INDEX), & RB_LEVEL_0_COUNT( GIGAS, INDEX) ) CALL L1_EXTRACT_5BYTE_SCALER( L1_CRATE_HEADER, SCALER_DBBBUSY, & RB_DBBBUSY_COUNT( UNITS, INDEX), & RB_DBBBUSY_COUNT( GIGAS, INDEX) ) CALL L1_EXTRACT_5BYTE_SCALER( L1_CRATE_HEADER, SCALER_68KSTATE_1, & RB_68KSTATE_1_COUNT( UNITS, INDEX), & RB_68KSTATE_1_COUNT( GIGAS, INDEX) ) CALL L1_EXTRACT_5BYTE_SCALER( L1_CRATE_HEADER, SCALER_68KSTATE_2, & RB_68KSTATE_2_COUNT( UNITS, INDEX), & RB_68KSTATE_2_COUNT( GIGAS, INDEX) ) CALL L1_EXTRACT_5BYTE_SCALER( L1_CRATE_HEADER, SCALER_68KSTATE_3, & RB_68KSTATE_3_COUNT( UNITS, INDEX), & RB_68KSTATE_3_COUNT( GIGAS, INDEX) ) CALL L1_EXTRACT_5BYTE_SCALER( L1_CRATE_HEADER, SCALER_68KSTATE_4, & RB_68KSTATE_4_COUNT( UNITS, INDEX), & RB_68KSTATE_4_COUNT( GIGAS, INDEX) ) CALL L1_EXTRACT_5BYTE_SCALER( L1_CRATE_HEADER, SCALER_68KSTATE_5, & RB_68KSTATE_5_COUNT( UNITS, INDEX), & RB_68KSTATE_5_COUNT( GIGAS, INDEX) ) CALL L1_EXTRACT_5BYTE_SCALER( L1_CRATE_HEADER, & LEVEL15_POTENTIAL_SCALER, & RB_L15_POTENTIAL_COUNT( UNITS, INDEX), & RB_L15_POTENTIAL_COUNT( GIGAS, INDEX) ) CALL L1_EXTRACT_5BYTE_SCALER( L1_CRATE_HEADER, & LEVEL15_CYCLE_SCALER, & RB_L15_CYCLE_COUNT( UNITS, INDEX), & RB_L15_CYCLE_COUNT( GIGAS, INDEX) ) CALL L1_EXTRACT_5BYTE_SCALER( L1_CRATE_HEADER, & LEVEL15_PASS_SCALER, & RB_L15_ACCEPT_COUNT( UNITS, INDEX), & RB_L15_ACCEPT_COUNT( GIGAS, INDEX) ) CALL L1_EXTRACT_5BYTE_SCALER( L1_CRATE_HEADER, & LEVEL15_FAIL_SCALER, & RB_L15_REJECT_COUNT( UNITS, INDEX), & RB_L15_REJECT_COUNT( GIGAS, INDEX) ) CALL L1_EXTRACT_5BYTE_SCALER( L1_CRATE_HEADER, & LEVEL15_SKIP_SCALER, & RB_L15_SKIP_COUNT( UNITS, INDEX), & RB_L15_SKIP_COUNT( GIGAS, INDEX) ) CALL L1_EXTRACT_5BYTE_SCALER( L1_CRATE_HEADER, & LEVEL15_TIME_OUT_SCALER, & RB_L15_TIMEOUT_COUNT( UNITS, INDEX), & RB_L15_TIMEOUT_COUNT( GIGAS, INDEX) ) CALL L1_EXTRACT_5BYTE_SCALER( L1_CRATE_HEADER, & LEVEL15_DEAD_BEAMX_SCALER, & RB_L15_DEAD_XING_COUNT( UNITS, INDEX), & RB_L15_DEAD_XING_COUNT( GIGAS, INDEX) ) C SPECIFIC TRIGGER COUNTS DO SPTRG_NUM = 0,31 DO COUNT_TYPE = 1 , NUM_SPTRG_COUNTS RB_SPTRG_COUNT( COUNT_TYPE, SPTRG_NUM, INDEX) = & SPTRG_COUNT( COUNT_TYPE, SPTRG_NUM) END DO END DO C PER BUNCH SCALERS C C The live crossing per bunch scalers are part of the foreign scalers. DO BUNCH_NUM = 1,6 CALL L1_EXTRACT_5BYTE_SCALER( L1_CRATE_HEADER, & BUNCH_LEVEL1 +5*(BUNCH_NUM-1), & RB_L1_PER_BUNCH_COUNT( UNITS, BUNCH_NUM, INDEX), & RB_L1_PER_BUNCH_COUNT( GIGAS, BUNCH_NUM, INDEX) ) CALL L1_EXTRACT_5BYTE_SCALER( L1_CRATE_HEADER, & BUNCH_LEVEL0_GOOD +5*(BUNCH_NUM-1), & RB_L0_PER_BUNCH_COUNT( UNITS, BUNCH_NUM, INDEX), & RB_L0_PER_BUNCH_COUNT( GIGAS, BUNCH_NUM, INDEX) ) END DO C FOREIGN SCALERS C C **** The called routines actually grab RB_FOREIGN_SCALER_COUNT( UNITS, and C **** RB_FOREIGN_SCALER_COUNT( GIGAS, . I'm just taking advantage of the way C **** Fortran stores multi-dimensional arrays. I do the same thing in the C **** CALC_DELTAS subroutine, where its explained more fully. C DO SCALER_NUM = 1,44 CALL L1UTIL_GET_FOREIGN_SCALER( L1_CRATE_HEADER, SCALER_NUM, & RB_FOREIGN_SCALER_COUNT( UNITS, SCALER_NUM, INDEX) ) C PUTTING SCALERS INTO UNITS, GIGAS FORMAT CALL TRANSFORM_5BYTE_SCALER( & RB_FOREIGN_SCALER_COUNT( UNITS, SCALER_NUM, INDEX) ) END DO C GEOGRAPHIC SECTION COUNTS DO GEOSECT_NUM = 0 ,31 RB_GEOSECT_STDGT_COUNT( GEOSECT_NUM, INDEX ) = & GEOSECT_STDGT_COUNT( GEOSECT_NUM ) RB_GEOSECT_BUSY_COUNT( GEOSECT_NUM, INDEX ) = & GEOSECT_BUSY_COUNT( GEOSECT_NUM ) ENDDO C SCALERS FOR 36X36 BUNCH TEST DO SCALER_NUM = 1 ,64 RB_FZLUM_36X36_COUNT( SCALER_NUM, INDEX ) & = FZLUM_36X36_COUNT( SCALER_NUM ) RB_PHALO_36X36_COUNT( SCALER_NUM, INDEX ) & = PHALO_36X36_COUNT( SCALER_NUM ) RB_AHALO_36X36_COUNT( SCALER_NUM, INDEX ) & = AHALO_36X36_COUNT( SCALER_NUM ) ENDDO 999 RETURN END C####################################################################### SUBROUTINE CALC_DELTAS C---------------------------------------------------------------------- C- C- Purpose and Methods : Recalculates delta quantities in LV1_MPOOL_RAW.INC C- from scalers in the ring buffer. C- C- Inputs : CURRENT - array index of most recent ring buffer scalers C- OLD - array index of oldest ring buffer scalers C- C- TRGMON_RBUF.INC - file containing ring buffer scalers C- C- Outputs : LV1_MPOOL_RAW.INC - delta quantities C- Controls: C- C- Created 12-JUL-1994 Philippe Laurens, Freddie Landry C- C- Updated 19-OCT-1995 Philippe Laurens - MSU L1 Trigger C- add scalers for 36x36 bunch test C- C---------------------------------------------------------------------- IMPLICIT NONE C---------------------------------------------------------------------- INCLUDE 'LV1_MPOOL_RAW.INC' INCLUDE 'LV1_MPOOL.PARAMS' INCLUDE 'TRGMON_RBUF.INC' INTEGER SPTRG_NUM, COUNT_TYPE, BUNCH_NUM, SCALER_NUM INTEGER GEOSECT_NUM REAL BEAM_CROSSING_PERIOD EXTERNAL BEAM_CROSSING_PERIOD C NOTICE: C **** For the 5 byte scalers, the method that fortran uses to store multi- C **** dimensional arrays is utilized to pass two elements of an array to C **** the subtraction routine while placing only one element in the parameter C **** list. VAR( 1, CURRENT), VAR( 1, OLD) is in the parameter list to the C **** subroutine, but the subroutine grabs VAR( 1, CURRENT), VAR( 2, CURRENT), C **** VAR( 1, OLD) and VAR( 2, OLD). C **** For this trick to work, the first index of the array must be the one C **** contianing the UNITS,GIGAS subscripts. CALL SUBTRACT_5BYTE_COUNTER( RB_BEAM_CROSS_COUNT( UNITS, CURRENT), & RB_BEAM_CROSS_COUNT( UNITS, OLD), & DELTA_BEAM_CROSSING ) C C **** The following calculation for DELTA_TIME must always come after C DELTA_BEAM_CROSSING is calculated from the ring buffer. DELTA_TIME = FLOAT( DELTA_BEAM_CROSSING) * (1.E7) * & BEAM_CROSSING_PERIOD(DELTA_TIME, DELTA_BEAM_CROSSING) CALL SUBTRACT_4BYTE_COUNTER( RB_VETO_CROSS_COUNT( CURRENT), & RB_VETO_CROSS_COUNT( OLD), & DELTA_VETO_CROSSING ) CALL SUBTRACT_5BYTE_COUNTER( & RB_GLOBAL_FIRED_COUNT( UNITS, CURRENT), & RB_GLOBAL_FIRED_COUNT( UNITS, OLD), & DELTA_GLOBAL_FIRED ) CALL SUBTRACT_5BYTE_COUNTER( & RB_EVENT_TRANSFER_COUNT( UNITS, CURRENT), & RB_EVENT_TRANSFER_COUNT( UNITS, OLD), & DELTA_EVENT_TRANSFER ) CALL SUBTRACT_5BYTE_COUNTER( RB_LEVEL_0_COUNT( UNITS, CURRENT), & RB_LEVEL_0_COUNT( UNITS, OLD), & DELTA_LEVEL_0 ) CALL SUBTRACT_5BYTE_COUNTER( RB_DBBBUSY_COUNT( UNITS, CURRENT), & RB_DBBBUSY_COUNT( UNITS, OLD), & DELTA_DBBBUSY ) CALL SUBTRACT_5BYTE_COUNTER( RB_68KSTATE_1_COUNT( UNITS, CURRENT), & RB_68KSTATE_1_COUNT( UNITS, OLD), & DELTA_68KSTATE_1 ) CALL SUBTRACT_5BYTE_COUNTER( RB_68KSTATE_2_COUNT( UNITS, CURRENT), & RB_68KSTATE_2_COUNT( UNITS, OLD), & DELTA_68KSTATE_2 ) CALL SUBTRACT_5BYTE_COUNTER( RB_68KSTATE_3_COUNT( UNITS, CURRENT), & RB_68KSTATE_3_COUNT( UNITS, OLD), & DELTA_68KSTATE_3 ) CALL SUBTRACT_5BYTE_COUNTER( RB_68KSTATE_4_COUNT( UNITS, CURRENT), & RB_68KSTATE_4_COUNT( UNITS, OLD), & DELTA_68KSTATE_4 ) CALL SUBTRACT_5BYTE_COUNTER( RB_68KSTATE_5_COUNT( UNITS, CURRENT), & RB_68KSTATE_5_COUNT( UNITS, OLD), & DELTA_68KSTATE_5 ) CALL SUBTRACT_5BYTE_COUNTER( & RB_L15_POTENTIAL_COUNT( UNITS, CURRENT), & RB_L15_POTENTIAL_COUNT( UNITS, OLD), & DELTA_L15_POTENTIAL ) CALL SUBTRACT_5BYTE_COUNTER( RB_L15_CYCLE_COUNT( UNITS, CURRENT), & RB_L15_CYCLE_COUNT( UNITS, OLD), & DELTA_L15_CYCLE ) CALL SUBTRACT_5BYTE_COUNTER( RB_L15_ACCEPT_COUNT( UNITS, CURRENT), & RB_L15_ACCEPT_COUNT( UNITS, OLD), & DELTA_L15_ACCEPT ) CALL SUBTRACT_5BYTE_COUNTER( RB_L15_REJECT_COUNT( UNITS, CURRENT), & RB_L15_REJECT_COUNT( UNITS, OLD), & DELTA_L15_REJECT ) CALL SUBTRACT_5BYTE_COUNTER( RB_L15_SKIP_COUNT( UNITS, CURRENT), & RB_L15_SKIP_COUNT( UNITS, OLD), & DELTA_L15_SKIP ) CALL SUBTRACT_5BYTE_COUNTER( & RB_L15_TIMEOUT_COUNT( UNITS, CURRENT), & RB_L15_TIMEOUT_COUNT( UNITS, OLD), & DELTA_L15_TIMEOUT ) CALL SUBTRACT_5BYTE_COUNTER( & RB_L15_DEAD_XING_COUNT( UNITS, CURRENT), & RB_L15_DEAD_XING_COUNT( UNITS, OLD), & DELTA_L15_DEAD_CROSSING ) C C **** CALCULATING SPECIFIC TRIGGER DELTA QUANTITIES C DO COUNT_TYPE = 1,NUM_SPTRG_COUNTS DO SPTRG_NUM = 0,31 CALL SUBTRACT_4BYTE_COUNTER( & RB_SPTRG_COUNT( COUNT_TYPE, SPTRG_NUM, CURRENT), & RB_SPTRG_COUNT( COUNT_TYPE, SPTRG_NUM, OLD), & SPTRG_INCR( COUNT_TYPE, SPTRG_NUM) ) ENDDO ENDDO C C **** PER BUNCH INCREMENTS C DO BUNCH_NUM = 1,6 CALL SUBTRACT_5BYTE_COUNTER( & RB_L1_PER_BUNCH_COUNT( UNITS, BUNCH_NUM, CURRENT), & RB_L1_PER_BUNCH_COUNT( UNITS, BUNCH_NUM, OLD), & L1_PER_BUNCH( BUNCH_NUM) ) CALL SUBTRACT_5BYTE_COUNTER( & RB_L0_PER_BUNCH_COUNT(UNITS, BUNCH_NUM, CURRENT), & RB_L0_PER_BUNCH_COUNT(UNITS, BUNCH_NUM, OLD), & L0_PER_BUNCH( BUNCH_NUM) ) CALL SUBTRACT_5BYTE_COUNTER( & RB_FOREIGN_SCALER_COUNT( UNITS, 28-4*(BUNCH_NUM-1), CURRENT), & RB_FOREIGN_SCALER_COUNT( UNITS, 28-4*(BUNCH_NUM-1), OLD), & LIVEX_PER_BUNCH( BUNCH_NUM) ) CALL SUBTRACT_5BYTE_COUNTER( & RB_FOREIGN_SCALER_COUNT( UNITS, 26-4*(BUNCH_NUM-1), CURRENT), & RB_FOREIGN_SCALER_COUNT( UNITS, 26-4*(BUNCH_NUM-1), OLD), & LIVEX_FASTZGOOD_PER_BUNCH( BUNCH_NUM) ) CALL SUBTRACT_5BYTE_COUNTER( & RB_FOREIGN_SCALER_COUNT( UNITS, 27-4*(BUNCH_NUM-1), CURRENT), & RB_FOREIGN_SCALER_COUNT( UNITS, 27-4*(BUNCH_NUM-1), OLD), & LIVEX_L0SINGLE_PER_BUNCH( BUNCH_NUM) ) CALL SUBTRACT_5BYTE_COUNTER( & RB_FOREIGN_SCALER_COUNT( UNITS, 25-4*(BUNCH_NUM-1), CURRENT), & RB_FOREIGN_SCALER_COUNT( UNITS, 25-4*(BUNCH_NUM-1), OLD), & SLOW_L0_PER_BUNCH( BUNCH_NUM) ) ENDDO C C **** FOREIGN SCALER INCREMENTS C DO SCALER_NUM = 1 ,44 CALL SUBTRACT_5BYTE_COUNTER( & RB_FOREIGN_SCALER_COUNT( UNITS, SCALER_NUM, CURRENT), & RB_FOREIGN_SCALER_COUNT( UNITS, SCALER_NUM, OLD), & FOREIGN_SCALER( SCALER_NUM) ) ENDDO C C **** GEOGRAPHIC SECTION INCREMENTS C DO GEOSECT_NUM = 0,31 CALL SUBTRACT_4BYTE_COUNTER( & RB_GEOSECT_STDGT_COUNT( GEOSECT_NUM, CURRENT), & RB_GEOSECT_STDGT_COUNT( GEOSECT_NUM, OLD), & GEOSECT_STDGT_INCR( GEOSECT_NUM) ) CALL SUBTRACT_4BYTE_COUNTER( & RB_GEOSECT_BUSY_COUNT( GEOSECT_NUM, CURRENT), & RB_GEOSECT_BUSY_COUNT( GEOSECT_NUM, OLD), & GEOSECT_BUSY_INCR( GEOSECT_NUM) ) ENDDO C C *** SCALERS FOR 36X36 BUNCH TEST C DO SCALER_NUM = 1 ,64 CALL SUBTRACT_4BYTE_COUNTER( & RB_FZLUM_36X36_COUNT( SCALER_NUM, CURRENT), & RB_FZLUM_36X36_COUNT( SCALER_NUM, OLD), & FZLUM_36X36_INCR( SCALER_NUM) ) CALL SUBTRACT_4BYTE_COUNTER( & RB_PHALO_36X36_COUNT( SCALER_NUM, CURRENT), & RB_PHALO_36X36_COUNT( SCALER_NUM, OLD), & PHALO_36X36_INCR( SCALER_NUM) ) CALL SUBTRACT_4BYTE_COUNTER( & RB_AHALO_36X36_COUNT( SCALER_NUM, CURRENT), & RB_AHALO_36X36_COUNT( SCALER_NUM, OLD), & AHALO_36X36_INCR( SCALER_NUM) ) ENDDO 999 RETURN END