- Fixed many things in DIFRAC subsystem:
* Recoded tcentr.f etc so that the course centering will work and will not
go into an endless loop.
* fixed boundary overwrites which occurred when yesno or alfnum where
uset to get a single character and several were given.
* Addeded documentation for DIFRAC
- Added tcl-files which support the WWW status system
408 lines
13 KiB
Fortran
408 lines
13 KiB
Fortran
C-----------------------------------------------------------------------
|
|
C Subroutine to measure a reflection by :--
|
|
C Theta/2Theta scan (ITYPE=0) or Omega scan (ITYPE=1)
|
|
C
|
|
C IROFL = 1 Count-rate Overflow; ICC = 2 indicates a Collision
|
|
C
|
|
C Modified for doing step scans at TRICS.
|
|
C IO to COUT instead LPT for SICS
|
|
C Mark Koennecke, November 1999
|
|
C-----------------------------------------------------------------------
|
|
SUBROUTINE MESINT (IROFL,ICC)
|
|
INCLUDE 'COMDIF'
|
|
INTEGER IHTAGS(4), IRUPT
|
|
REAL SPRESET
|
|
ICPSMX = 45000
|
|
IF (DFMODL .EQ. 'CAD4') ICPSMX = 25000
|
|
C-----------------------------------------------------------------------
|
|
C Reset the liquid nitrogen loading flag
|
|
C-----------------------------------------------------------------------
|
|
IFILN = 0
|
|
SPRESET = PRESET
|
|
100 STIME = PRESET
|
|
ICS = 0
|
|
IROFL = 0
|
|
NATT = 0
|
|
IWARN = 0
|
|
ISIGN = 1
|
|
IF (THETA .LT. 0.0 .OR. THETA .GT. 180.0) ISIGN = -1
|
|
C---- Modified MK: there is no alpha1 alpha2 separation with neutrons
|
|
C D12 = BS*ABS(TAN(0.5*THETA/DEG))
|
|
D12 = 0.
|
|
C---- end of modification
|
|
TTIME = 0.20*PRESET
|
|
110 CALL SHUTTR (1)
|
|
IF (NATTEN .GT. 0) THEN
|
|
CALL ANGSET (THETA,OMEGA,CHI,PHI,NATT,ICOL)
|
|
IF (ICOL .NE. 0) THEN
|
|
ICC = 2
|
|
CALL FILLN2 (IFILN,NFLG)
|
|
IF (NFLG .EQ. 1) GO TO 100
|
|
PRESET = SPRESET
|
|
RETURN
|
|
ENDIF
|
|
120 CALL CCTIME (TTIME,COUNT)
|
|
IF (COUNT/TTIME .GE. ICPSMX) THEN
|
|
NATT = NATT + 1
|
|
CALL ANGSET (THETA,OMEGA,CHI,PHI,NATT,ICOL)
|
|
IF (NATT .LT. NATTEN) GO TO 120
|
|
ENDIF
|
|
ENDIF
|
|
IF ((ITYPE+1)/2 .EQ. 4) STIME = QTIME
|
|
IF (ITYPE .GE. 4) GO TO 160
|
|
IF (ITYPE .EQ. 0 .OR. ITYPE .EQ. 1) THEN
|
|
DEL1 = AS + D12 + CS
|
|
ANG1 = THETA - ISIGN*AS
|
|
ANG2 = OMEGA
|
|
ELSE
|
|
DEL1 = AS + D12/2 + CS
|
|
ANG1 = THETA + ISIGN*D12/3
|
|
ANG2 = OMEGA - ISIGN*(AS + D12/6)
|
|
ENDIF
|
|
C-----------------------------------------------------------------------
|
|
C Offset to low angle side of reflection
|
|
C-----------------------------------------------------------------------
|
|
ICC = 0
|
|
130 CALL ANGSET (ANG1,ANG2,CHI,PHI,NATT,ICOL)
|
|
IF (ICOL .NE. 0) THEN
|
|
ICC = 2
|
|
CALL FILLN2 (IFILN,NFLG)
|
|
IF (NFLG .EQ. 1) GO TO 100
|
|
PRESET = SPRESET
|
|
RETURN
|
|
ENDIF
|
|
C-----------------------------------------------------------------------
|
|
C Measure the low angle background for BGDTIM
|
|
C-----------------------------------------------------------------------
|
|
BGDTIM = FRAC*PRESET
|
|
CALL CCTIME (BGDTIM,BGRD1)
|
|
C-----------------------------------------------------------------------
|
|
C Do the scan:
|
|
C ITYPE Type of scan 0 -- theta/2-theta b-p-b
|
|
C 1 -- theta/2-theta precision
|
|
C 2 -- omega b-p-b
|
|
C 3 -- omega precision
|
|
C DEL1 Range of the scan (2-theta for types 0 & 1)
|
|
C ACOUNT Array of profile points with sum in ACOUNT(1)
|
|
C TIME Return value of scan time in secs
|
|
C SPEED Scan speed in degs/min.
|
|
C NPPTS No of points in returned profile
|
|
C IERR Error code 0 -- OK
|
|
C 1 -- Ratemeter overflow
|
|
C 2 -- Really bad!
|
|
C-----------------------------------------------------------------------
|
|
SDEL1 = ISIGN*DEL1
|
|
CALL TSCAN (ITYPE,SDEL1,ACOUNT(1),PRESET,STEP,NPPTS,IERR)
|
|
CALL KORQ(IRUPT)
|
|
IF(IRUPT .NE. 1)THEN
|
|
WRITE(COUT,11000)
|
|
CALL GWRITE(ITP,' ')
|
|
PRESET = SPRESET
|
|
RETURN
|
|
ENDIF
|
|
MAX = 1
|
|
IEND = 10*NSIZE
|
|
DO 135 I = 2,NPPTS
|
|
IF (MAX .LT. ACOUNT(I)) MAX = ACOUNT(I)
|
|
ACOUNT(IEND - I) = ACOUNT(I)
|
|
135 CONTINUE
|
|
C-----------------------------------------------------------------------
|
|
C For the CAD-4 at -ve 2theta the profile is delivered backwards.
|
|
C-----------------------------------------------------------------------
|
|
IF (DFMODL .EQ. 'CAD4' .AND.
|
|
$ (THETA .LT. 0.0 .OR. THETA .GT. 180.0)) THEN
|
|
J = IEND - NPPTS - 2
|
|
DO 138 I = 2,NPPTS
|
|
ACOUNT(I) = ACOUNT(J + I)
|
|
138 CONTINUE
|
|
ENDIF
|
|
C WRITE (COUT,99999) MAX,NPPTS,TIME
|
|
C CALL GWRITE (ITP,' ')
|
|
C99999 FORMAT (I6,I4,F8.3)
|
|
C-----------------------------------------------------------------------
|
|
C For the CAD-4 at high 2theta and chi near 90 there can be no profile,
|
|
C because the interface detects a potential collision.
|
|
C Then TIME = 0, and the profile analysis should not be done IDEL < 10
|
|
C-----------------------------------------------------------------------
|
|
IF (DFMODL .EQ. 'CAD4') THEN
|
|
RTIME = ABS(60*DEL1/SPEED)
|
|
IF (TIME .LT. RTIME/3) THEN
|
|
WRITE (LPT,12200) IH,IK,IL
|
|
WRITE (COUT,12200) IH,IK,IL
|
|
CALL GWRITE (ITP,' ')
|
|
IDEL = 5
|
|
GO TO 150
|
|
ENDIF
|
|
ENDIF
|
|
IF (MAX*NPPTS/PRESET .GT. ICPSMX) IROFL = 1
|
|
IF (IERR .GE. 2) THEN
|
|
WRITE (LPT,16000) IH,IK,IL
|
|
WRITE (COUT,16000) IH,IK,IL
|
|
CALL GWRITE (ITP,' ')
|
|
CALL ANGSET (THETA,OMEGA,CHI,PHI,NATT,ICOL)
|
|
GO TO 110
|
|
ENDIF
|
|
C-----------------------------------------------------------------------
|
|
C Test for low angle count too high near direct beam
|
|
C-----------------------------------------------------------------------
|
|
IF (IROFL .NE. 0 .AND. PRESET .LT. 10) THEN
|
|
WRITE (COUT,12000) IH,IK,IL
|
|
CALL GWRITE(ITP,' ')
|
|
GO TO 150
|
|
ENDIF
|
|
C-----------------------------------------------------------------------
|
|
C Plot the last reflection if SR2 is ON
|
|
C For details of the profile plotting see PROFIL
|
|
C-----------------------------------------------------------------------
|
|
ISTEP = 1000.0/DEL1
|
|
IDEL = NPPTS + 1
|
|
C-----------------------------------------------------------------------
|
|
C Test for -ve 2theta scan problem with SIERAY 145D
|
|
C-----------------------------------------------------------------------
|
|
IF (IDEL .LT. 10) THEN
|
|
WRITE (COUT,12100) IH,IK,IL
|
|
CALL GWRITE (ITP,' ')
|
|
GO TO 150
|
|
ENDIF
|
|
C-----------------------------------------------------------------------
|
|
C Possibly draw the raw data profile
|
|
C-----------------------------------------------------------------------
|
|
CALL RSW (0,I)
|
|
IF (I .EQ. 1) THEN
|
|
DO 140 I = 1,4
|
|
IHTAGS(I) = 0
|
|
140 CONTINUE
|
|
IHTAGS(2) = AS*STEPDG
|
|
CALL PTPREP (NPPTS,ACOUNT(2),IHTAGS)
|
|
ENDIF
|
|
C-----------------------------------------------------------------------
|
|
C Check that the scan time is reasonably close to the calculated value
|
|
C-----------------------------------------------------------------------
|
|
COUNT = ACOUNT(1)
|
|
IF (ICOL .NE. 0) THEN
|
|
ICS = ICS + 1
|
|
IF (ICS .LT. 2) GO TO 130
|
|
ICC = 2
|
|
CALL FILLN2 (IFILN,NFLG)
|
|
IF (NFLG .EQ. 1) GO TO 100
|
|
PRESET = SPRESET
|
|
RETURN
|
|
ENDIF
|
|
C-----------------------------------------------------------------------
|
|
C Change the attenuator if necessary and try again.
|
|
C-----------------------------------------------------------------------
|
|
IF (IROFL .NE. 0) THEN
|
|
IF (NATTEN .GT. 0 .AND. NATT .LT. NATTEN) THEN
|
|
NATT = NATT + 1
|
|
GO TO 130
|
|
ENDIF
|
|
ENDIF
|
|
C-----------------------------------------------------------------------
|
|
C The scan is OK.
|
|
C Correct the low angle background to the time FRAC*TIME, measure the
|
|
C high angle background and then return.
|
|
C-----------------------------------------------------------------------
|
|
I = BGRD1*PRESET*FRAC/BGDTIM + 0.5
|
|
BGRD1 = I
|
|
BGDTIM = PRESET*FRAC
|
|
CALL CCTIME (BGDTIM,BGRD2)
|
|
IF (BGRD1 + BGRD2 .GT. 4.0*COUNT) THEN
|
|
WRITE (COUT,11000) IH,IK,IL
|
|
CALL GWRITE(ITP,' ')
|
|
ENDIF
|
|
CALL FILLN2 (IFILN,NFLG)
|
|
IF (NFLG .EQ. 1) GO TO 100
|
|
PRESET = SPRESET
|
|
RETURN
|
|
C-----------------------------------------------------------------------
|
|
C Return if there are counting problems
|
|
C-----------------------------------------------------------------------
|
|
150 COUNT = 2
|
|
SUM = 2
|
|
BGRD1 = 1
|
|
BGRD2 = 1
|
|
FRAC = 0.1
|
|
PRESET = SPRESET
|
|
NATT = 0
|
|
ICC = 0
|
|
IROFL = 0
|
|
IWARN = 1
|
|
CALL FILLN2 (IFILN,NFLG)
|
|
IF (NFLG .EQ. 1) GO TO 100
|
|
RETURN
|
|
C-----------------------------------------------------------------------
|
|
C Set up peak top counting for appropriate angles
|
|
C-----------------------------------------------------------------------
|
|
160 IF (ITYPE .EQ. 4 .OR. ITYPE .EQ. 6) THEN
|
|
ANG1 = THETA - AS
|
|
ANG2 = OMEGA
|
|
ANG3 = THETA + BS*TAN(0.5*THETA/DEG) + CS
|
|
ANG4 = OMEGA
|
|
PRESET= STIME
|
|
ELSE
|
|
ANG1 = THETA
|
|
ANG2 = OMEGA - AS
|
|
ANG3 = THETA
|
|
ANG4 = OMEGA + CS
|
|
ENDIF
|
|
170 CALL ANGSET (THETA,OMEGA,CHI,PHI,NATT,ICOL)
|
|
IF (ICOL .NE. 0) THEN
|
|
WRITE (COUT,13000) IH,IK,IL
|
|
CALL GWRITE(ITP,' ')
|
|
GO TO 150
|
|
ENDIF
|
|
C-----------------------------------------------------------------------
|
|
C Count at peak for time TIME
|
|
C-----------------------------------------------------------------------
|
|
420 CALL CCTIME (PRESET,COUNT)
|
|
C C = COUNT/PRESET
|
|
IF (C .GE. ICPSMX .AND. NATTEN .GT. 0 .AND. NATT .LT. NATTEN) THEN
|
|
NATT = NATT + 1
|
|
GO TO 170
|
|
ENDIF
|
|
C-----------------------------------------------------------------------
|
|
C Drive to high angle background position and count
|
|
C-----------------------------------------------------------------------
|
|
CALL ANGSET (ANG3,ANG4,CHI,PHI,NATT,ICOL)
|
|
IF (ICOL .NE. 0) THEN
|
|
WRITE (COUT,13000) IH,IK,IL
|
|
CALL GWRITE(ITP,' ')
|
|
GO TO 150
|
|
ENDIF
|
|
C-----------------------------------------------------------------------
|
|
C Measure the backgrounds
|
|
C-----------------------------------------------------------------------
|
|
IF (ITYPE .EQ. 5 .OR. ITYPE .EQ. 6) THEN
|
|
BGDTIM = FRAC*PRESET
|
|
CALL CCTIME (BGDTIM,BGRD2)
|
|
CALL ANGSET (ANG1,ANG2,CHI,PHI,NATT,ICOL)
|
|
CALL CCTIME (BGDTIM,BGRD1)
|
|
IF (BGRD1 + BGRD2 .GT. 4.0*COUNT) THEN
|
|
WRITE (COUT,11000) IH,IK,IL
|
|
CALL GWRITE(LPT,' ')
|
|
ENDIF
|
|
CALL FILLN2 (IFILN,NFLG)
|
|
PRESET = SPRESET
|
|
IF (NFLG .EQ. 1) GO TO 100
|
|
RETURN
|
|
ENDIF
|
|
C-----------------------------------------------------------------------
|
|
C Sample background on high side
|
|
C-----------------------------------------------------------------------
|
|
PRESET = STIME*0.5
|
|
CALL CCTIME (PRESET,BGRD2)
|
|
C-----------------------------------------------------------------------
|
|
C Evaluate rough Peak/Background ratio and Time required to
|
|
C accumulate a preset number FRAC of counts on the peak.
|
|
C-----------------------------------------------------------------------
|
|
RRAT = COUNT/(2*BGRD2 + 1.0)
|
|
IF (RRAT .LT. 1.05) RRAT = 1.05
|
|
RTIM = FRAC*STIME/(COUNT + 1.0)
|
|
C-----------------------------------------------------------------------
|
|
C Optimum time splitting and required total time
|
|
C-----------------------------------------------------------------------
|
|
OPT = (RRAT - SQRT(RRAT))/(RRAT - 1.0)
|
|
TOT = RTIM/OPT
|
|
IF (TOT .GT. TMAX) TOT = TMAX
|
|
IBCT = (TOT*(1.0 - OPT) + 1.0)/2.0
|
|
IPCT = (TOT*OPT) + 1
|
|
C-----------------------------------------------------------------------
|
|
C Finish measurement of high background
|
|
C-----------------------------------------------------------------------
|
|
BCT = (IBCT - (STIME/2.0))
|
|
IF (BCT .GT. 0.) THEN
|
|
CALL CCTIME (BCT,BKG2)
|
|
BGRD2 = BGRD2 + BKG2
|
|
BCT = IBCT
|
|
ICC = 0
|
|
ELSE
|
|
BCT = STIME/2.0
|
|
ENDIF
|
|
PCT = IPCT - STIME
|
|
IF (PCT .GT. 0.) THEN
|
|
CALL ANGSET (THETA,OMEGA,CHI,PHI,NATT,ICOL)
|
|
IF (ICOL .NE. 0) THEN
|
|
ICC = 2
|
|
CALL FILLN2 (IFILN,NFLG)
|
|
PRESET = SPRESET
|
|
IF (NFLG .EQ. 1) GO TO 100
|
|
RETURN
|
|
ENDIF
|
|
PPCT = PCT
|
|
PCT = IPCT
|
|
CALL CCTIME (PPCT,PC)
|
|
COUNT = COUNT + PC
|
|
ELSE
|
|
PCT = STIME
|
|
ENDIF
|
|
CALL ANGSET (ANG1,ANG2,CHI,PHI,NATT,ICOL)
|
|
IF (ICOL .NE. 0) THEN
|
|
ICC = 2
|
|
CALL FILLN2 (IFILN,NFLG)
|
|
PRESET = SPRESET
|
|
IF (NFLG .EQ. 1) GO TO 100
|
|
RETURN
|
|
ENDIF
|
|
PRESET = BCT
|
|
CALL CCTIME (PRESET,BGRD1)
|
|
PRESET = PCT + BCT
|
|
CALL FILLN2 (IFILN,NFLG)
|
|
IF (NFLG .EQ. 1) GO TO 100
|
|
PRESET = SPRESET
|
|
RETURN
|
|
10000 FORMAT (' Clock Problems in reflection ',3I4)
|
|
11000 FORMAT (' Trouble Warning in reflection ',3I4)
|
|
12000 FORMAT (' Low Angle Problem in ',3I4)
|
|
12100 FORMAT (' Scan problem in ',3I4)
|
|
12200 FORMAT (' Potential CAD4 scan collision in',3I4)
|
|
13000 FORMAT (' Collision in reflection ',3I4)
|
|
16000 FORMAT (' Scan error in ',3I4,' Trying again')
|
|
END
|
|
C-----------------------------------------------------------------------
|
|
C Finish the measurement, with or without low temperature.
|
|
C-----------------------------------------------------------------------
|
|
SUBROUTINE FILLN2 (IFILN,NFLG)
|
|
INCLUDE 'COMDIF'
|
|
NFLG = 0
|
|
IF (ILN .EQ. 0) THEN
|
|
CALL SHUTTR (-1)
|
|
RETURN
|
|
ENDIF
|
|
DUM1 = 1.0/16.0
|
|
DUM2 = 0.5
|
|
CALL ONEBEP (DUM1,DUM2)
|
|
IF (DUM2 .GT. 1) THEN
|
|
TMIN = 0
|
|
WRITE (COUT,10000)
|
|
CALL GWRITE (ITP,' ')
|
|
100 TIM1 = 1500
|
|
CALL CCTIME (TIM1,CONT)
|
|
DUM1 = 1.0/16.0
|
|
DUM2 = 0.5
|
|
CALL ONEBEP (DUM1,DUM2)
|
|
IF (DUM2 .GE. 1.0) THEN
|
|
TMIN = TMIN + 0.25
|
|
GO TO 100
|
|
ENDIF
|
|
WRITE (COUT,11000) IH,IK,IL,NREF,TMIN,DELAY
|
|
CALL GWRITE (ITP,' ')
|
|
TMIN = DELAY*6000
|
|
IF (TMIN .LE. 1) TMIN = 1
|
|
CALL CCTIME (TMIN,DUM2)
|
|
IFILN = 1
|
|
NFLG = 1
|
|
ENDIF
|
|
IF (IFILN .NE. 0) ICC = ICC + 4
|
|
CALL SHUTTR (-1)
|
|
RETURN
|
|
10000 FORMAT (' Liquid Nitrogen fillup. Waiting...')
|
|
11000 FORMAT (' Liquid Nitrogen Tank now full',/,
|
|
$ ' Reflection',3I3,' # ',I5,'. Filling lasted',F6.2,
|
|
$ ' minutes.',/,
|
|
$ ' Now starting a ',F5.2,' minutes delay before',
|
|
$ ' resuming data collection.')
|
|
END
|
|
|
|
|
|
|