subroutine dat_tasmad c --------------------- external dat_tasmad_desc external dat_tasmad_opts external dat_tasmad_read external dat_get_datanumber integer dtype/0/ call dat_init_desc(dtype, dat_tasmad_desc) call dat_init_opts(dtype, dat_tasmad_opts) call dat_init_read(dtype, dat_tasmad_read) call dat_init_high(dtype, dat_get_datanumber) end subroutine dat_tasmad_desc(text) c -------------------------------- character*(*) text ! (out) description text='TASMAD DrueChaL, TASP and ILL TAS' end subroutine dat_tasmad_opts c -------------------------- print '(x,a)' 1,'p1,p2: polarisation' 1,'x: column to be used as x-axis *' 1,'y: column to be used as y-axis (default: CNTS)' 1,'mon: column to be used as Monitor (default: M1 or TIME)' end subroutine dat_tasmad_read 1 (lun, forced, nread, putval, nmax, xx, yy, ss, ww) ! ---------------------------------------------------- implicit none integer lun ! (in) logical unit number (file will be closed if successful) integer forced ! 0: read only if type is sure; 1: forced read integer nread ! (out) >=0: = number of points read, file closed ! -1: not correct type, file rewinded ! -2: correct type, but unreadable, file rewinded external putval ! (in) subroutine to put name/value pairs. ! for numeric data: call putval('name', value) ! value must be real ! for character data: call putval('name=text', 0.0) integer nmax ! max. number of points real xx(*) ! x-values real yy(*) ! y-values real ss(*) ! sigma real ww(*) ! weights (original monitor) ! local real none integer mcol parameter (none=-8.7654e29, mcol=32) character line*160, preset*4, old*6, col2*8 real values(mcol), r, f, s, y, ymon, tm, ts, td integer r1,r2 integer i,j,l,ncol,ccol,pcol,xcol,tcol,pacol integer ip,ip1,ip2 character word*32 integer muco, mubgr real codemu real mucode(36) external dat_tasmad_val ! common real tt, tem, mon, tim, qe(4) character xaxis*8, yaxis*8, monam*8 integer mode common /dat_tasmad_com/tt, tem, mon, tim, mode, xaxis, qe xaxis=' ' preset=' ' old=' ' nread=0 read(lun,'(a)',err=100,end=100) line if (line(1:16) .eq. 'RRRRRRRRRRRRRRRR') then 1 read(lun,'(a)',err=100,end=100) line if (line(1:16) .ne. 'VVVVVVVVVVVVVVVV') goto 1 read(lun,'(a)',err=100,end=100) line elseif (line(1:7) .ne. 'INSTR: ') then if (forced .le. 0) goto 100 endif tt=none tem=none mon=none tim=none mubgr=-1 muco=0 call dat_delimiters(',', '=', '''') 12 if (line(1:6) .eq. 'INSTR:') then call dat_group(1, putval) call putval('Instrument='//line(8:19), 0.0) elseif (line(1:6) .eq. 'USER_:') then call dat_group(1, putval) call putval('User='//line(8:80), 0.0) elseif (line(1:6) .eq. 'DATE_:') then call dat_group(1, putval) call putval('Date='//line(8:80), 0.0) elseif (line(1:6) .eq. 'TITLE:') then call dat_group(1, putval) call putval('Title='//line(8:80), 0.0) elseif (line(1:6) .eq. 'STEPS:' .or. 1 line(1:6) .eq. 'POSQE:' .or. 1 line(1:6) .eq. 'VARIA:' .or. 1 line(1:6) .eq. 'ZEROS:' .or. 1 line(1:6) .eq. 'PARAM:') then call dat_group(2, putval) old=line(1:6) j=7 mode=index('SZ',line(1:1)) ! mode=0: normal, 1: steps, 2: zeros (see dat_tasmad_val) call dat_intprt(line(7:), dat_tasmad_val, putval) elseif (line(1:6) .eq. 'DATA_:') then goto 20 elseif (line(1:6) .eq. 'EXPNO:' .or. 1 line(1:6) .eq. 'LOCAL:' .or. 1 line(1:6) .eq. 'COMND:') then call dat_group(2, putval) call str_trim(line, line, l) if (l .ge. 8) call putval(line(1:5)//'='//line(8:l), 0.0) elseif (line(1:6) .eq. 'POLAN:') then call str_trim(line, line, l) if (l .lt. len(line)) l=l+1 if (muco .ge. 0) then j=1 call str_get_elem(line(7:l), j, word) if (word .ne. 'muco' .and. word .ne. '#muco') then if (word .eq. '#signal') then call dat_group(1, putval) call putval('mukind=signal',0.0) mubgr=0 goto 19 endif if (word .eq. '#background') then call dat_group(1, putval) call putval('mukind=background',0.0) mubgr=1 goto 19 endif muco=-1 goto 19 endif if (muco .eq. 0) then if (mubgr .eq. -1) then mubgr = 0 call dat_group(1, putval) call putval('mukind=single', 0.0) endif do i=1,36 mucode(i) = 0 enddo endif muco=muco+1 if (muco .gt. 36) then if (muco .eq. 37) then print *,'DAT_TASMAD: too many POLAN muco lines' endif goto 19 endif call str_get_elem(line(7:l), j, word) if (word(1:1) .eq. '-') then codemu=3.0 word=word(2:) else codemu=1.0 endif i = index('x y z ', word(1:2)) if (i .eq. 0) then print *,'DAT_TASMAD: 1st arg bad ',line(7:l) endif ! increase codemu by 0, 30 or 60 for x, y or z codemu = codemu + (i - 1) * 15 call str_get_elem(line(7:l), j, word) if (word(1:1) .eq. '-') then codemu=codemu+1 word=word(2:) endif i = index('x y z ', word(1:2)) if (i .eq. 0) then print *,'DAT_TASMAD: 2nd arg bad ',line(7:l) endif ! increase codemu by 10, 20 or 30 for x, y or z mucode(muco) = codemu + mubgr * 0.1 + (i + 1) * 5 c the coding for the x-value ip.b is: c where i is 1..9 for xx, yx, yz, zy, yy, zy, xz, yz, zz c p is 1..4 for ++, +-, -+, -- c b is 0 for signal and 1 for background endif elseif (line(1:6) .ne. 'FILE_:' .and. line(1:6) .ne. 'FORMT:' 1 .and. line(1:6).ne.' ') then ! if (line(6:6) .ne. ':') goto 100 call str_trim(line, line, l) print *,'DAT_TASMAD: superflous line: ',line(1:l) endif 19 continue read(lun,'(a)',err=99,end=99) line goto 12 20 continue call dat_group(1, putval) ymon=0 if (mon .eq. none) then if (tim .eq. none) then print *,'DAT_TASMAD: neither TI nor MN present' goto 100 endif ymon=tim preset='TIME' call putval('Preset=TIME', 0.0) else ymon=mon preset='M1' call putval('Preset=M1', 0.0) endif !----- options ------ yaxis=' ' monam=' ' call dat_start_options r1=0 call dat_int_option('p1', r1) r2=0 call dat_int_option('p2', r2) call dat_str_option('x', xaxis) call dat_str_option('y', yaxis) call dat_str_option('mon', monam) call str_upcase(xaxis, xaxis) call str_upcase(yaxis, yaxis) call str_upcase(monam, monam) !----- end options ------ if (monam .eq. ' ') then monam=preset elseif (preset .ne. monam) then ymon=0 endif 21 read(lun,'(a)',err=99,end=99) line if (line .eq. ' ') goto 21 i=1 line(len(line):len(line))=' ' ncol=0 ccol=0 pcol=0 xcol=0 tcol=0 pacol=0 col2=' ' if (yaxis .eq. ' ') yaxis='CNTS' 31 do while (line(i:i) .eq. ' ') i=i+1 if (i .gt. len(line)) goto 39 enddo l=i do while (line(i:i) .ne. ' ') i=i+1 enddo ncol=ncol+1 if (ncol .eq. 2) col2=line(l:i) if (line(l:i) .eq. yaxis) ccol=ncol if (line(l:i) .eq. monam) pcol=ncol if (line(l:i) .eq. xaxis) xcol=ncol if (line(l:i) .eq. 'TEM') tcol=ncol if (line(l:i) .eq. 'TT' .and. tcol .eq. 0) tcol=ncol if (line(l:i) .eq. 'PAL') pacol=ncol goto 31 39 if (ccol .eq. 0) then print *,'no values found for ',yaxis goto 99 endif if (pcol .eq. 0) then if (monam .eq. ' ') monam='Monitor' print *,'no values found for ',monam goto 99 endif if (xcol .eq. 0) then if (xaxis .ne. ' ') then print *,'no values found for ',xaxis,', take ',col2 endif xcol=2 xaxis=col2 endif if (pacol .ne. 0) then if (r1 .gt. 9 .or. r2 .gt. 9) then r1=0 print *,'DAT_TASMAD: illegal PAL index' elseif (r1 .le. 0) then r1=0 else line(1:3)=char(ichar('0')+r1) if (r2 .eq. r1) r2=0 if (r2 .ne. 0) then line(2:3)=','//char(ichar('0')+r2) endif call putval('Range='//line(1:3),0.0) call putval('Pal',0.1*r1+0.01*r2) endif endif call putval('XAxis='//xaxis, 0.0) call putval('YAxis=Intensity', 0.0) call dat_group(1, putval) tm=0 ts=0 l=min(mcol,max(xcol,pcol,ccol,tcol)) ip=0 ip1=0 ip2=0 40 read(lun,*,err=89,end=88) (values(j),j=1,l) if (pacol .ne. 0) then if (r1 .eq. 0) then ip=nint(values(pacol)) else ip=0 if (abs(values(pacol)-r1) .gt. 1e-3 .and. 1 abs(values(pacol)-r2) .gt. 1e-3) goto 40 ! do not read when PAL value does not match endif endif if (nread .ge. nmax) goto 29 y=values(ccol) r=values(pcol) if (ymon .eq. 0) then ymon=r if (r .eq. 0) r=1. endif if (r .le. 0.0) r=ymon f=ymon/r if (f .le. 0.0) f=1.0 if (y .gt. 0) then s=sqrt(y) ! statistical error of detector else s=1 endif nread=nread+1 if (ip .ne. 0) then ip1=ip1+1 if (ip .ne. ip1) then if (ip2 .eq. 0) then ip2=ip1-1 elseif (ip .ne. 1 .and. ip2 .ne. ip1-1) then print *,'DAT_TASMAD: PAL code not in order' ip2=1 endif ip1=1 endif endif if (muco .ne. 0 .and. xcol .eq. pacol) then xx(nread) = mucode(nint(values(pacol))) else xx(nread)=values(xcol) endif yy(nread)=y*f ss(nread)=s*f ww(nread)=r if (tcol .ne. 0) then tt=values(tcol) td=(tt-tm)/nread tm=tm+td ! mean temp. ts=ts+(tt-tm)**2+td*td*(nread-1) ! sum of (temp(i)-mean)**2 c print *,'temp',tt,tm,ts endif goto 40 88 close(lun) if (ip2 .ne. 0) then call fit_dat_table(1, ip2, (nread+ip2-1)/ip2) endif call putval('Monitor', ymon) if (tcol .ne. 0) then call putval('Temp', tm) if (nread .gt. 1) call putval('dTemp', sqrt(ts/(nread-1))) tm = tt elseif (tem .eq. none .and. tt .ne. none) then call putval('Temp', tt) endif if (muco .ne. 0) then call dat_group(3, putval) if (mubgr .eq. 1) then call putval('QH_B', qe(1)) call putval('QK_B', qe(2)) call putval('QL_B', qe(3)) call putval('EN_B', qe(4)) call putval('TEMP_B', tm) else call putval('QH_S', qe(1)) call putval('QK_S', qe(2)) call putval('QL_S', qe(3)) call putval('EN_S', qe(4)) call putval('TEMP_S', tm) endif endif return 89 print *,'DAT_TASMAD: error at point ',nread goto 40 29 print *,'DAT_TASMAD: too many points' goto 100 99 print *,'DAT_TASMAD: error during read' rewind lun nread=-2 return 100 rewind lun nread=-1 end subroutine dat_tasmad_val(str, val, putval) character*(*) str real val external putval integer i real tt, tem, mon, tim, qe(4) character xaxis*8, zstr*8 integer mode common /dat_tasmad_com/tt, tem, mon, tim, mode, xaxis, qe if (val .eq. 0) then i=index(str, '=') else i=0 endif if (i .eq. 0) then ! numeric if (mode .eq. 1) then ! steps if (val .ne. 0 .and. xaxis .eq. ' ') then ! get first step not zero xaxis=str(2:) endif elseif (mode .eq. 2) then ! zeros zstr(1:1)='Z' zstr(2:)=str call putval(zstr, val) return elseif (str .eq. 'TT') then tt=val elseif (str .eq. 'Temp') then tem=val elseif (str .eq. 'MN' .or. str .eq. 'mn') then mon=val elseif (str .eq. 'TI' .or. str .eq. 'ti') then tim=val elseif (str .eq. 'QH') then qe(1)=val elseif (str .eq. 'QK') then qe(2)=val elseif (str .eq. 'QL') then qe(3)=val elseif (str .eq. 'EN') then qe(4)=val endif endif call putval(str, val) end