* DRIFT.SUB drift scan program common subroutines <950926.1758> ************************************************************************ * contains * ANTPOS return antenna angles via DIO * CALT2 calibrate volts per Kelvin with noise diode * DNORM subtract lowest value from data array * PMOD return angle in range -180 < angle < +180 * POSRA return angle in range 0 < angle < 360 * RATEL return RA of telescope from HA * ******************************** SUBROUTINE ANTPOS (HA,DEC) * * read angles, mask tach bits, convert to binary, check quadrant INTEGER ANGLES(6) CHARACTER CANGLES*12 EQUIVALENCE (ANGLES,CANGLES) * * read angles via DIO, in ASCII 10 CALL EXEC (1,11,ANGLES,6,1,3) * mask tach sign and magnitude bits ANGLES(1) = ANGLES(1) .AND. 171777B ANGLES(4) = ANGLES(4) .AND. 171777B READ (CANGLES,'(2F6.3)',ERR=10) HA, DEC * check quadrant IF (HA .GT. 180.0) HA = HA - 360.0 IF (DEC .GT. 180.0) DEC = DEC - 360.0 RETURN END ************************************************************************ SUBROUTINE CALT2 (LUDVM,NDSEL,IFREQ,NTSETTLE,TNOIS, * GASCAL,FAULT) * Noise tube calibration for volts to Kelvins conversion * Modified to take out linear slope while sampling * * Inputs: LU I/O logical unit * LUDVM lu of fluke 8840 (35 or 36) * NDSEL noise diode selection index array * IFREQ system index * NTSETTLE radiometer settling time (seconds) * TNOIS noise tube temperature array * * Outputs: GASCAL DVM units per Kelvin conversion factor * FAULT set true if 10 calibration failures occur * LOGICAL FAULT INTEGER NVALID(4), NDSEL(6) REAL*4 TNOIS(6) REAL*8 DVM(4), DVMSQD(4), ADVM(4), DMS(4), RMS(4), & RDVM, RMS_SUM, DMS_SUM, CAL_COUNT * * Set up system for gain calibration * ---------------------------------- * set medium sample rate on Fluke WRITE (LUDVM,'(A)') '*S1' RETRIES = 0 NUMBER = 100 FAULT = .FALSE. PRINT *,' system calibration : _' IF (LUDVM .EQ. 35) PRINT *,'using Radiometer output LU35' IF (LUDVM .EQ. 36) PRINT *,'using Video meter output LU36' * * Restart point after error - allow for up to 10 failures * -------------------------------------------------------- 10 RETRIES = RETRIES + 1 DMS_SUM = 0D0 RMS_SUM = 0D0 * * Sample with noise cal off (J = 1,4) or on (J = 2,3) * --------------------------------------------------- DO J = 1, 4 DVM(J) = 0D0 DVMSQD(J) = 0D0 NVALID(J) = 0 IF (J .EQ. 2) then * fire the noise cal CALL EXEC (2,113B,NDSEL(IFREQ),1,3,3) END IF IF (J .EQ. 1 .OR. J .EQ. 4) THEN * turn off the noise cal CALL EXEC (2,113B,0,1,3,3) END IF IF (J .NE. 3) THEN * let the system settle CALL EXEC (12,0,2,0,NTSETTLE) END IF * * Sample 0.1 sec filtered radiometer/video output * -------------------------------------------------- DO I = 1, NUMBER 50 READ (LUDVM,*,ERR=50,IOSTAT=IOS) RDVM * store DVM and DVM SQUARED readings NVALID(J) = NVALID(J) + 1 DVM(J) = DVM(J) + RDVM DVMSQD(J) = DVMSQD(J) + RDVM * RDVM END DO * * Sampling done: calculate average DVM reading and rms error * --------------------------------------------------------- IF (NVALID(J) .GT. 2) THEN * average DVM reading ADVM(J) = DVM(J) / NVALID(J) DMS(J) = (DVMSQD(J) - DVM(J)*DVM(J)/NVALID(J)) * / (NVALID(J) - 1.0) DMS_SUM = DMS_SUM + DMS(J) * rms error in reading RMS(J) = DSQRT(DMS(J)) RMS_SUM = RMS_SUM + RMS(J) * IF (J .EQ. 1 .OR. J .EQ. 4) then PRINT *,' Noise cal. off : _' ELSE IF (J .EQ. 2 .OR. J .EQ. 3) THEN PRINT *,' Noise cal. on : _' END IF PRINT '(F12.6,A,F12.6,A)', * ADVM(J), ' +-',RMS(J),' V' END IF END DO * * error checks * ------------ IF (RETRIES .GE. 10) THEN FAULT = .TRUE. PRINT *,'Abandoning calibration' RETURN END IF * * Check noise cal > 4 * average rms noise CAL_COUNT = ((ADVM(2) + ADVM(3)) - (ADVM(1) + ADVM(4)))/2 IF (DABS(CAL_COUNT) .LT. (RMS_SUM/2)) THEN PRINT *,'Noise cal not seen - try again' GO TO 10 END IF * * else calculate volts per Kelvin conversion factor * ------------------------------------------------- GASCAL = CAL_COUNT / TNOIS(IFREQ) * * Fractional error in GASCAL is the square root of the sums of the * squares of the fractional errors in the difference between the * two DVM averages. * DGAS = GASCAL * DSQRT ((DMS_SUM*2 / CAL_COUNT**2)) DGAS = ABS (DGAS) PRINT '(4X,A,F12.6,A,F12.6,A)', & 'calibration gives',GASCAL,' +-', DGAS,' Volts / Kelvin' RETURN END ************************************************************************ SUBROUTINE DNORM (DATA,LAST,WAVE,IFREQ) * * subtracts lowest value from whole data set * * Inputs: DATA data array * LAST last valid point in data array * WAVE wavelength array * IFREQ index for wavelength * REAL*4 DATA(*), WAVE(*) INTEGER LAST, IFREQ * DMIN = DATA(1) DMAX = DATA(1) DO I = 2,LAST DMIN = MIN (DMIN, DATA(I)) DMAX = MAX (DMAX, DATA(I)) END DO IF (WAVE(IFREQ) .EQ. 3.6 .OR. WAVE(IFREQ) .EQ. 6.2) THEN * for dual feeds OFFSET = (DMAX + DMIN) / 2 ELSE * for single feeds OFFSET = DMIN END IF C PRINT *,'DNORM offset =',OFFSET DO I = 1,LAST DATA(I) = DATA(I) - OFFSET END DO RETURN END ************************** FUNCTION PMOD(ANGLE) * * Returns a value of angle in PMOD, -180.0