FUNCTION BEAM_CROSSING_PERIOD(DELTA_TIME, DELTA_BEAM_CROSSING) C---------------------------------------------------------------------- C- C- Purpose and Methods : To find the exact beam crossing period, given the C- number of beam crossings in an amount of time. It picks a period of C- 3.5us or 5us depending on which is closer to the observed time. It is C- possible to add other possible beam crossing periods. Once a beam C- crossing period has been established, three consecutive readings of a C- different beam crossing period is required before this function will C- reflect the change. C- C- +-----------------------------------------------------------+ C- |HARDCODED TO 3.5 MICROSECOND BEAM CROSSING RATE 29-AUG-1994| C- +-----------------------------------------------------------+ C- C- Returned value : The beam crossing period in seconds. C- Inputs : DELTA_TIME The elapsed time in quanta of 100 ns C- DELTA_BEAM_CROSSINGS C- The number of beam crossings in the elapsed C- period of time. C- Outputs : none C- Controls: none C- C- Created 10-JAN-1991 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE C- Updated 10-AUG-1994 Philippe Laurens,Freddie Landry C- DELTA_TIME changed from INT to REAL C- hardwired a period of 3.5 microseconds C- C---------------------------------------------------------------------- IMPLICIT NONE C REAL BEAM_CROSSING_PERIOD REAL DELTA_TIME INTEGER DELTA_BEAM_CROSSING C BEAM_CROSSING_PERIOD = .349314470E-5 C C Array of possible beam crossing periods. They must be in increasing C order. NUM_PERIODS must be equal to the number of entries in PERIODS C C REAL PERIODS(2) C DATA PERIODS / .349314470E-5, .523971706E-5 / C SAVE PERIODS C C INTEGER NUM_PERIODS C PARAMETER (NUM_PERIODS = 2) C INTEGER NUM_CONSECUTIVE C PARAMETER (NUM_CONSECUTIVE = 2) ! This is actually number of C ! consecutive readings - 1 C C REAL LAST_PERIODS(NUM_CONSECUTIVE) C SAVE LAST_PERIODS C REAL LAST_PERIOD C SAVE LAST_PERIOD C LOGICAL FIRST C DATA FIRST / .TRUE. / C SAVE FIRST C C REAL MEASURED_PERIOD C INTEGER COUNT C C IF ((DELTA_BEAM_CROSSING .GT. 0) .AND. C & (DELTA_TIME .GT. 0)) THEN C MEASURED_PERIOD = FLOAT(DELTA_TIME) *100E-9 / C & FLOAT(DELTA_BEAM_CROSSING) C ELSE C BEAM_CROSSING_PERIOD = 0. C GOTO 999 C ENDIF C C Find how many packets there appear to be C C C BEAM_CROSSING_PERIOD = 0. C IF (MEASURED_PERIOD .LT. PERIODS(1)) THEN C BEAM_CROSSING_PERIOD = PERIODS(1) C ELSEIF (MEASURED_PERIOD .GT. PERIODS(NUM_PERIODS)) THEN C BEAM_CROSSING_PERIOD = PERIODS(NUM_PERIODS) C ELSE C DO COUNT = 2, NUM_PERIODS C IF (MEASURED_PERIOD .LT. PERIODS(COUNT)) THEN C IF ((MEASURED_PERIOD - PERIODS(COUNT-1)) .LT. C & (PERIODS(COUNT) - MEASURED_PERIOD)) THEN C BEAM_CROSSING_PERIOD = PERIODS(COUNT-1) C ELSE C BEAM_CROSSING_PERIOD = PERIODS(COUNT) C ENDIF C ENDIF C ENDDO C ENDIF C C The first time through, make it look like this beam crossing period has been C here forever. C C IF (FIRST .EQV. .TRUE.) THEN C DO COUNT = 1, NUM_CONSECUTIVE C LAST_PERIODS(COUNT) = BEAM_CROSSING_PERIOD C END DO C LAST_PERIOD = BEAM_CROSSING_PERIOD C FIRST = .FALSE. C ELSE C C After first time, check to see if the previous two readings were the same. C C DO COUNT = 1, NUM_CONSECUTIVE C IF (LAST_PERIODS(COUNT) .NE. BEAM_CROSSING_PERIOD) GOTO 200 C END DO C LAST_PERIOD = BEAM_CROSSING_PERIOD C GOTO 999 ! If all are the same, then return C C 200 CONTINUE C DO COUNT = 2, NUM_CONSECUTIVE C LAST_PERIODS(COUNT-1) = LAST_PERIODS(COUNT) C END DO C LAST_PERIODS(NUM_CONSECUTIVE) = BEAM_CROSSING_PERIOD C BEAM_CROSSING_PERIOD = LAST_PERIOD C ENDIF C C C---------------------------------------------------------------------- 999 RETURN END C C C FUNCTION OLD_BEAM_CROSSING_PERIOD(A1, A2) C---------------------------------------------------------------------- C- C- Purpose and Methods : Fake crossing period calculation. C- C- Returned value : The beam crossing period in seconds. C- Inputs : none C- Outputs : none C- Controls: none C- C- Created 10-JAN-1991 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE C- C---------------------------------------------------------------------- IMPLICIT NONE REAL OLD_BEAM_CROSSING_PERIOD INTEGER A1, A2 C OLD_BEAM_CROSSING_PERIOD = 1 / 286275.0 C---------------------------------------------------------------------- 999 RETURN END