* Last processed by NICE on 12-Jun-2000 15:54:00 * Customized for : IEEE, LINUX, UNIX, MOTIF, F77 * * convert_lst_el.f C C SUBROUTINE CONVERT_LST_EL(LST_RECORD,LST_MAP,LST_ROW, $EL_RECORD,EL_MAP,EL_ROW,WEIGHT_MAP,WEIGHT_ROW, $XSCAN_COORD,YSCAN_COORD,NP_SUBSCAN,ISUBSCAN,IFUN) C C************************************************************** C This subroutine computes LST and EL corresponding to the (Az,EL) map C C C Input: C lst[NRECORD] C el[NRECORD] C xscan_coord[NRECORD] : x coordinates C yscan_coord[NRECORD] : y coordinates C np_subscan : number of records in subscan C func : convolving function ( ~ sin(x)/x ) C C Output: C lst_map : lst map C el_map : lst map C weight_map : sum of weight C C************************************************************** * INCLUDE 'const.inc' INCLUDE 'parameter.inc' INCLUDE 'convert.inc' * * REAL*4 LST_RECORD(1), MAGI, DIAMETER REAL*4 LST_MAP(1) REAL*4 LST_ROW(1) REAL*4 EL_RECORD(1) REAL*4 EL_MAP(1) REAL*4 EL_ROW(1) REAL*4 XSCAN_COORD(1) REAL*4 YSCAN_COORD(1) REAL*4 WEIGHT_MAP(1) REAL*4 WEIGHT_ROW(1) CC REAL*4 DATAR(1) * INTEGER IFUN INTEGER NP_SUBSCAN ! number of points in the subscan * REAL*4 FUNWIDX,TOTWIDX,FUNWIDY,TOTWIDY INTEGER IFIRST,ILAST,I,J,IFUNC,ISUBSCAN,IJ REAL*4 POSX,POSY REAL*4 X,Y,Z * *--- Raz LST_ROW,EL_ROW,XCOORD_ROW,YCOORD_ROW,WEIGHT DO I=1,NCOL LST_ROW(I) = 0 EL_ROW(I) = 0 WEIGHT_ROW(I) = 0 ENDDO C C C The unit length of the grid is XINC C Compute function window width in the new system unit : C funwid = lambda/(1.67*diam_telescope)/xinc C funwid = 1.34 if freq=230ghz, diam_telescope=30m and xinc=4arcsec C C * MAGI = 0 IF (IFUN.EQ.1) MAGI = 1.6806492007530D0 ! Parabolic IF (IFUN.EQ.2) MAGI = 1.6982249549743D0 ! Gaussian IF (IFUN.EQ.3) MAGI = 1.8363197305085D0 ! Linear IF (MAGI.EQ.0) MAGI = 1.6574002064571D0 ! No taper C DIAMETER = 30 IF (TELESCOPE(1:3).EQ.'CSO') DIAMETER = 10 IF (TELESCOPE(1:3).EQ.'HHT') DIAMETER = 10 FUNWIDX = VLIGHT/FREQUENCY /(MAGI*DIAMETER) $/(XINC*SEC_TO_RAD) IF ( FUNWIDX.LT.1.D0) FUNWIDX = 1.D0 TOTWIDX = 4.D0 * FUNWIDX ! total window width FUNWIDY = VLIGHT/FREQUENCY /(MAGI*DIAMETER) $/(YINC*SEC_TO_RAD) IF ( FUNWIDY.LT.1.D0) FUNWIDY = 1.D0 TOTWIDY = INT(0.9999*SINT/YINC) * C C Add contribution of each point of subscan to the pixels of the new grid C This contribution is multiplied by a weight depending on the distance C DO I = 1, NP_SUBSCAN CC IF (ABS(DATAR(I)-BLANKING).GT.0.5D0) THEN ! test blanking * * compute pos = coordinates of subscan point in the new grid POSX = (XSCAN_COORD(I)/10. - XMIN)/XINC + 1.D0 * IFIRST = POSX - TOTWIDX+1 ! first point of new grid to consider ILAST = POSX + TOTWIDX ! last point of new grid to consider * IF (IFIRST.LT.1) IFIRST = 1 IF (ILAST .GT.NCOL) ILAST = NCOL * DO J = IFIRST, ILAST X = FLOAT(J) - POSX ! distance between "j" and subscan poi X = ABS(X)/FUNWIDX ! convert in function unit IFUNC = INT(50. * X + 0.5) + 1 IF (IFUNC.GT.200) IFUNC = 200 Z = FUNC(IFUNC) * LST_ROW(J) = LST_ROW(J) + LST_RECORD(I)*Z EL_ROW(J) = EL_ROW(J) + EL_RECORD(I)*Z WEIGHT_ROW(J) = WEIGHT_ROW(J) + Z ! weight ENDDO ENDDO * * IF (NROW.NE.NSUBSCAN) THEN Y = (YSCAN_COORD(1)/10.-YMIN)/YINC IF ( Y-NINT(Y) .LT. 0.2) THEN ! test si yscan_coord du point proche POSY = NINT(Y) +1.0 ! d'une ligne de la carte (Az,EL) ELSE POSY = Y +1.0 ENDIF IFIRST = NINT(POSY) - TOTWIDY ILAST = NINT(POSY) + TOTWIDY IF (IFIRST.LT.1) IFIRST = 1 IF (ILAST.GT.NROW) ILAST = NROW DO I=1,NCOL IJ = I + (IFIRST-1)*NCOL * DO J = IFIRST, ILAST Y = (FLOAT(J) - POSY) / FUNWIDY Y = ABS(Y) IFUNC = INT(50.0 * Y + 0.5) + 1 IF (IFUNC.GT.200) IFUNC = 200 Z = FUNC(IFUNC) LST_MAP(IJ) = LST_MAP(IJ) + LST_ROW(I)*Z EL_MAP(IJ) = EL_MAP(IJ) + EL_ROW(I)*Z WEIGHT_MAP(IJ) = WEIGHT_MAP(IJ) + WEIGHT_ROW(I)*Z IJ = IJ + NCOL ENDDO ENDDO ELSE DO I=1,NCOL IJ = (ISUBSCAN-1)*NCOL LST_MAP(IJ+I) = LST_ROW(I) EL_MAP(IJ+I) = EL_ROW(I) WEIGHT_MAP(IJ+I) = WEIGHT_ROW(I) ENDDO ENDIF END