SUBROUTINE ZDQUL C C Module Number: 13.7.3 C C Module Name: zdqul C C Keyphrase: C ---------- C generate HRS diode quality vector C C Description: C ------------ C Using an input diode response file and dark count rate file C A data quality vector is updated. Diodes with a response C less than DTHRESH are flagged as dead. Diodes with a dark C rate above NTHRESH are flagged as noisy. In the event that C multiple flags exist for the same diode, the largest flag C is placed into the output vector. The 12 special diodes are never C flagged by this routine. C C FORTRAN Name: zdqul.for C C C Keywords of Accessed Files : C -------------------------- C DIODEMAP input Diode response vector (512 diodes) C DARK input Dark count rate vector (500 main array diodes) C DQIN input Input quality vector to be updated C DQOUT output Output data quality vector C NTHRESH input input noisy diode threshold C NFLAG input flag for noisy diodes C DTHRESH input input dead diode threshold C DFLAG input flag for dead diodes C C Modules Called: C --------------- C CDBS: C ztplat C SDAS: C uclgs* , umsput C uimotp, uimxtp, uimctp, uimopn, uimgid, uimclo, uhdgs* uimclo C OTHERS: C C History: C -------- C Version Date Author Description C 1 9/25/86 D. Lindler Design and coding C 2 April 88 D. Lindler New sdas i/o, and now uses diode C response file instead of flat field C observations. C------------------------------------------------------------------------ C C FILE I/O ACCESS MODES C INTEGER RDONLY PARAMETER (RDONLY = 1) C C UMSPUT DESTINATIONS -- CB, DAO, 4-SEP-87 C INTEGER STDOUT PARAMETER (STDOUT = 1) INTEGER STDERR PARAMETER (STDERR = 2) C END IRAF77.INC C C ERROR PROCESSING PARAMETERS C INTEGER ISTATS(10),ISTAT C --->STATUS INDICATOR CHARACTER*132 CONTXT C --->STATUS MESSAGE C C KEYWORD VALUES C CHARACTER*64 DIODEM,DARK,DQIN,DQOUT C --->FILE NAMES DOUBLE PRECISION DTHRSH C --->THRESHOLD FOR DEAD DIODES DOUBLE PRECISION NTHRSH C --->THRESHOLD FOR NOISY DIODES DOUBLE PRECISION DFLAG,NFLAG C --->FLAG VALUES FOR DEAD AND NOSIY DIODES C C INPUT FILE I/O C INTEGER IDIN,NAXIS,DTYPE,DIMEN(8),IDOUT DOUBLE PRECISION DRESP(512),DRATE(500),DQ(512) C C OTHER LOCAL VARIABLES C INTEGER DET1,DET C --->DETECTOR NUMBERS INTEGER I,DNUM C------------------------------------------------------------------------ C C READ INPUT CL PARAMETERS C CALL UCLGST('diodemap',DIODEM,ISTATS(1)) CALL UCLGST('dark',DARK,ISTATS(2)) CALL UCLGST('dqin',DQIN,ISTATS(3)) CALL UCLGST('dqout',DQOUT,ISTATS(4)) CALL UCLGSD('nthresh',NTHRSH,ISTATS(5)) CALL UCLGSD('nflag',NFLAG,ISTATS(6)) CALL UCLGSD('dthresh',DTHRSH,ISTATS(7)) CALL UCLGSD('dflag',DFLAG,ISTATS(8)) DO 10 I=1,8 IF(ISTATS(I).NE.0)THEN CONTXT='ERROR READING CL PARAMETER VALUE' GO TO 999 ENDIF 10 CONTINUE C C read input diodemap file ---------------------------------------------------- C CALL UIMOPN(DIODEM,RDONLY,IDIN,ISTAT) IF(ISTAT.NE.0)THEN CONTXT='Error opening diodemap file '//DIODEM GO TO 999 ENDIF C C READ IMAGE INFO C CALL UIMGID(IDIN,DTYPE,NAXIS,DIMEN,ISTAT) IF(ISTAT.NE.0)THEN CONTXT='Error reading input file '//DIODEM GO TO 999 ENDIF C C CHECK FOR VALID DATA C IF((NAXIS.NE.1).OR.(DIMEN(1).NE.512))THEN CONTXT='Input diodemap must be a 512 point vector' GO TO 999 ENDIF C C READ DATA C CALL UIGL1D(IDIN,DRESP,ISTAT) IF(ISTAT.NE.0)THEN CONTXT='Error reading input diodemap file '//DIODEM GO TO 999 ENDIF C C GET DETECTOR NUMBER C CALL UHDGSI(IDIN,'detector',DET1,ISTAT) IF(ISTAT.NE.0)THEN CONTXT='Error getting detector number from '//DIODEM GO TO 999 ENDIF C C CLOSE IMAGE C CALL UIMCLO(IDIN,ISTAT) C C read input dark rate file ---------------------------------------------- C CALL UIMOPN(DARK,RDONLY,IDIN,ISTAT) IF(ISTAT.NE.0)THEN CONTXT='Error opening dark rate file '//DARK GO TO 999 ENDIF C C READ IMAGE INFO C CALL UIMGID(IDIN,DTYPE,NAXIS,DIMEN,ISTAT) IF(ISTAT.NE.0)THEN CONTXT='Error reading input dark rate file '//DARK GO TO 999 ENDIF C C CHECK FOR VALID DATA C IF((NAXIS.NE.1).OR.(DIMEN(1).NE.500))THEN CONTXT='Input dark rate must be a 500 point vector' GO TO 999 ENDIF C C READ DATA C CALL UIGL1D(IDIN,DRATE,ISTAT) IF(ISTAT.NE.0)THEN CONTXT='Error reading input dark rate file '//DARK GO TO 999 ENDIF C C GET DETECTOR NUMBER C CALL UHDGSI(IDIN,'detector',DET,ISTAT) IF(ISTAT.NE.0)THEN CONTXT='Error getting detector number from '//DARK GO TO 999 ENDIF IF(DET.NE.DET1)THEN CONTXT='Error: dark file and diodemap not same detector' GO TO 999 ENDIF C C CLOSE IMAGE C CALL UIMCLO(IDIN,ISTAT) C C read input data quality file ----------------------------------------------- C CALL UIMOPN(DQIN,RDONLY,IDIN,ISTAT) IF(ISTAT.NE.0)THEN CONTXT='Error opening data quality file '//DQIN GO TO 999 ENDIF C C READ IMAGE INFO C CALL UIMGID(IDIN,DTYPE,NAXIS,DIMEN,ISTAT) IF(ISTAT.NE.0)THEN CONTXT='Error reading input file '//DQIN GO TO 999 ENDIF C C CHECK FOR VALID DATA C IF((NAXIS.NE.1).OR.(DIMEN(1).NE.512))THEN CONTXT='Input data quality must be a 512 point vector' GO TO 999 ENDIF C C READ DATA C CALL UIGL1D(IDIN,DQ,ISTAT) IF(ISTAT.NE.0)THEN CONTXT='Error reading input data quality file '//DQIN GO TO 999 ENDIF C C GET DETECTOR NUMBER C CALL UHDGSI(IDIN,'detector',DET,ISTAT) IF(ISTAT.NE.0)THEN CONTXT='Error getting detector number from '//DQIN GO TO 999 ENDIF IF((DET.NE.0).AND.(DET1.NE.DET))THEN CONTXT='Input data quality vector is wrong detector' GO TO 999 ENDIF C C CLOSE IMAGE C CALL UIMCLO(IDIN,ISTAT) C C update data quality value for 500 main diodes ------------------------------- C DO 100 I=1,500 DNUM=I+6 C --->DIODE POSITION IN 512 POINT ARRAY C C NOISY DIODE? C IF((DRATE(I).GT.NTHRSH).AND.(DQ(DNUM).LT.NFLAG))THEN DQ(DNUM)=NFLAG WRITE(CONTXT,55)DNUM 55 FORMAT(' Diode',I4,' flagged as noisy') CALL UMSPUT(CONTXT,STDOUT,0,ISTAT) ENDIF C C DEAD DIODE C IF((DRESP(DNUM).LT.DTHRSH).AND.(DQ(DNUM).LT.DFLAG))THEN DQ(DNUM)=DFLAG WRITE(CONTXT,66)DNUM 66 FORMAT(' Diode',I4,' flagged as dead') CALL UMSPUT(CONTXT,STDOUT,0,ISTAT) ENDIF 100 CONTINUE C C write output data quality vector using input template ----------------- C CALL ZTPLAT(DQIN,DQOUT,DQ,512,IDOUT,ISTAT) IF(ISTAT.NE.0)THEN CONTXT='No output data quality file written' GO TO 999 ENDIF CALL UHDPSI(IDOUT,'DETECTOR',DET1,ISTAT) IF(ISTAT.NE.0)THEN CONTXT='Error putting detector number in output file' GO TO 999 ENDIF CALL UIMCLO(IDOUT,ISTAT) IF(ISTAT.NE.0)THEN CONTXT='Error closing output data quality file' GO TO 999 ENDIF C C DONE C GO TO 1000 999 CALL UMSPUT(CONTXT,STDOUT+STDERR,0,ISTAT) 1000 RETURN END