1 | C PROGRAM QUASI_LINES_2D |
---|
2 | C----------------------------------------------------------------------- |
---|
3 | C This is a 2-D version of QUASI_LINES, a 1-D Bayesian Quasi-elastic |
---|
4 | C line-fitting program. The resolution function is given on a constant |
---|
5 | C X-binning grid, and is assumed to be invariant. The background is |
---|
6 | C assumed to be linear and the spectrum a sum of Laurentzians, centered |
---|
7 | C at the "origin". The maximum number of lines allowed to be fit is 3. |
---|
8 | C The data are assumed to be of intermediate Genie binary format, such |
---|
9 | C as that output by batch-mode ICON. |
---|
10 | C----------------------------------------------------------------------- |
---|
11 | C Written by: D.S. Sivia, Rutherford Appleton Lab., Oxfordshire, England. |
---|
12 | C----------------------------------------------------------------------- |
---|
13 | C Initial release for trials by CJC, MAA, WSH. (DSS: 27-FEB-1992) |
---|
14 | C Changed file access from sequential to direct. (DSS: 5-MAR-1992) |
---|
15 | C Changed STEPSZ reduction from 0.85 to 0.6 . (DSS: 7-MAR-1992) |
---|
16 | C Can read in a detector normalisation file. (DSS: 12-MAR-1992) |
---|
17 | C Readonly for resol. file; silent-running modified. (DSS: 14-MAY-1992) |
---|
18 | C WBF array-size increased in subroutine INBUFF. (DSS: 28-MAY-1992) |
---|
19 | C Fixed bug in CLRBUF; problem for lots of detectors.(DSS: 29-MAY-1992) |
---|
20 | C Hard-wired meV as input and ueV as output. (DSS: 2-OCT-1992) |
---|
21 | C Put in STEPSZ safety-valve in case Chisq stuck! (DSS: 27-OCT-1992) |
---|
22 | C Took out small and negative number safety-valve. (DSS: 17-DEC-1992) |
---|
23 | C Fixed bug in DATIN1 (no more large error-bars!). (DSS: 27-SEP-1993) |
---|
24 | C----------------------------------------------------------------------- |
---|
25 | C Option : elastic peak , o_el=0 (no), =1 (yes) |
---|
26 | C : background , o_bgd=2 (sloping), =1 (flat), =0 (zero) |
---|
27 | C : width1 , o_w1=1 (fix), =0 (free) |
---|
28 | C----------------------------------------------------------------------- |
---|
29 | C |
---|
30 | SUBROUTINE QLwat(numb,x_in,y_in,e_in,reals,opft, |
---|
31 | 1 XD_in,XB_in,YB_in,Wy_in,We_in,dtn,xsc,sfile,rfile,l_fn, |
---|
32 | 2 nd_out,xout,yout,eout,yfit,yprob) |
---|
33 | INCLUDE 'mod_files.f90' |
---|
34 | INCLUDE 'mod_data.f90' |
---|
35 | INCLUDE 'options.f90' |
---|
36 | COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT |
---|
37 | COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT |
---|
38 | COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) |
---|
39 | COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) |
---|
40 | COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL |
---|
41 | COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) |
---|
42 | COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC |
---|
43 | COMMON /WRKCOM/ WORK(m_d2,2) |
---|
44 | COMMON /BESSJ/ AJ0,AJ1,AJ2 |
---|
45 | COMMON /ModPars/ NBIN,IMIN,IMAX,RSCL,BNORM |
---|
46 | real x_in(m_d), y_in(m_d), e_in(m_d) |
---|
47 | cf2py intent(in) :: x_in, y_in, e_in !sample data |
---|
48 | real reals(4) |
---|
49 | cf2py intent(in) :: reals !real parameters |
---|
50 | real XD_in(m_d), XB_in(m_d), YB_in(m_d) |
---|
51 | cf2py intent(in) :: XD_in, XB_in, YB_in !sample xrange, res data (blur) |
---|
52 | real Wy_in(m_sp), We_in(m_sp), dtn(m_sp), xsc(m_sp) |
---|
53 | cf2py intent(in) :: Wy_in, We_in, dtn, xsc !fixed width data & res scaling |
---|
54 | integer numb(9) |
---|
55 | cf2py intent(in) :: numb !integer parameters |
---|
56 | integer opft(4) |
---|
57 | cf2py intent(in) :: opft !options parameters |
---|
58 | integer l_fn |
---|
59 | cf2py intent(in) :: l_fn !length of filenames |
---|
60 | character*140 sfile, rfile |
---|
61 | cf2py intent(in) :: sfile, rfile !sample & res filenames |
---|
62 | integer nd_out |
---|
63 | cf2py intent(out) :: nd_out !number of output points |
---|
64 | real xout(m_d), yout(m_d), eout(m_d) |
---|
65 | cf2py intent(out) :: xout, yout, eout !data values |
---|
66 | real yfit(4*m_d) |
---|
67 | cf2py intent(out) :: yfit !fit values |
---|
68 | real yprob(4) |
---|
69 | cf2py intent(out) :: yprob !probability values |
---|
70 | integer l_title,l_user |
---|
71 | character*80 user,title |
---|
72 | real XBLR(m_d),YBLR(m_d) |
---|
73 | REAL GRAD(m_p),HESS(m_p,m_p),DPAR(m_p),COVAR(m_p,m_p) |
---|
74 | REAL SIGPAR(m_p),FITPSV(m_p),DTNORM(m_sp),XSCALE(m_sp) |
---|
75 | REAL PRBSV(4,m_sp),POUT(4,m_sp), |
---|
76 | 1 PRMSV(7,4,m_sp),SIGSV(7,4,m_sp) |
---|
77 | REAL AJ0Q(m_sp),AJ1Q(m_sp),AJ2Q(m_sp) |
---|
78 | INTEGER INDX(m_p) |
---|
79 | DATA AROT /0.98/ |
---|
80 | prog='w' |
---|
81 | CALL init_paras |
---|
82 | do n=1,m_p |
---|
83 | GRAD(n)=0.0 |
---|
84 | DPAR(n)=0.0 |
---|
85 | SIGPAR(n)=0.0 |
---|
86 | FITPSV(n)=0.0 |
---|
87 | do m=1,m_p |
---|
88 | HESS(n,m)=0.0 |
---|
89 | COVAR(n,m)=0.0 |
---|
90 | end do |
---|
91 | end do |
---|
92 | do n=1,m_sp |
---|
93 | do n1=1,4 |
---|
94 | PRBSV(n1,n)=0.0 |
---|
95 | POUT(n1,n)=0.0 |
---|
96 | do n2=1,7 |
---|
97 | PRMSV(n2,n1,n)=0.0 |
---|
98 | SIGSV(n2,n1,n)=0.0 |
---|
99 | end do |
---|
100 | end do |
---|
101 | end do |
---|
102 | c numb = [ngrp, nsp, ntc, Ndat, nbin, Imin, Imax, Nb, nrbin] |
---|
103 | NSPEC=numb(1) !no. of groups |
---|
104 | ISP=numb(2) !group number |
---|
105 | ISPEC=ISP |
---|
106 | ntc=numb(3) !no. of points |
---|
107 | NDAT=numb(4) |
---|
108 | NBIN=numb(5) |
---|
109 | IMIN=numb(6) |
---|
110 | IMAX=numb(7) |
---|
111 | NB=numb(8) |
---|
112 | nrbin=numb(9) |
---|
113 | c reals = [efix, theta[isp], rscl, bnorm] |
---|
114 | efix=reals(1) |
---|
115 | theta(ISP)=reals(2) |
---|
116 | RSCL=reals(3) |
---|
117 | BNORM=reals(4) |
---|
118 | do n=1,m_d |
---|
119 | xin(n)=x_in(n) |
---|
120 | yin(n)=y_in(n) |
---|
121 | ein(n)=e_in(n) |
---|
122 | XDAT(n)=XD_in(n) |
---|
123 | XBLR(n)=XB_in(n) |
---|
124 | YBLR(n)=YB_in(n) |
---|
125 | end do |
---|
126 | o_el=opft(1) |
---|
127 | o_bgd=opft(2) |
---|
128 | o_w1=opft(3) |
---|
129 | do n=1,m_sp |
---|
130 | DTNORM(n)=dtn(n) !DTNORM |
---|
131 | XSCALE(n)=xsc(n) !XSCALE |
---|
132 | yprob=0.0 |
---|
133 | end do |
---|
134 | lptfile='' |
---|
135 | fileout1='' |
---|
136 | l_lpt=l_fn+8 |
---|
137 | lptfile(1:l_lpt)=sfile(1:l_fn)//'_QLw.lpt' |
---|
138 | l_file=l_fn+8 |
---|
139 | fileout1(1:l_lpt)=sfile(1:l_fn)//'_QLw.ql1' |
---|
140 | l_title=9 |
---|
141 | title='<unknown>' |
---|
142 | l_user=9 |
---|
143 | user='<unknown>' |
---|
144 | if(o_w1.eq.1)then |
---|
145 | do I=1,NSPEC |
---|
146 | QW1(I)=Wy_in(I) |
---|
147 | QW1(I)=0.5*(ABS(QW1(I))+0.00001) |
---|
148 | SIGQW1(I)=We_in(I) |
---|
149 | SIGQW1(I)=0.5*(ABS(SIGQW1(I))+0.00001) |
---|
150 | end do |
---|
151 | endif |
---|
152 | if(ISP.eq.1)then !print info |
---|
153 | call open_f(53,lptfile) |
---|
154 | write(53,1107)sfile |
---|
155 | 1107 format(' Sample file : ',a140) |
---|
156 | write(53,1108)rfile |
---|
157 | 1108 format(' Resolution file : ',a140) |
---|
158 | write(53,1110)xin(imin),xin(imax) |
---|
159 | 1110 format(' Energy range: ',f8.3,' to ',f8.3,' meV') |
---|
160 | if (o_el.eq.0) write(53,1111) |
---|
161 | if (o_el.eq.1) write(53,1112) |
---|
162 | if (o_bgd.eq.2) write(53,1113) |
---|
163 | if (o_bgd.eq.1) write(53,1114) |
---|
164 | if (o_bgd.eq.0) write(53,1115) |
---|
165 | 1111 format(' Elastic option : NO peak') |
---|
166 | 1112 format(' Elastic option : WITH peak') |
---|
167 | 1113 format(' Background option : sloping') |
---|
168 | 1114 format(' Background option : flat') |
---|
169 | 1115 format(' Background option : zero') |
---|
170 | if(o_w1.eq.1)then |
---|
171 | write(53,1116) |
---|
172 | else |
---|
173 | write(53,1117) |
---|
174 | endif |
---|
175 | 1116 format(' Width option : fixed from file ') |
---|
176 | 1117 format(' Width option : free') |
---|
177 | close(unit=53) |
---|
178 | call open_f(1,fileout1) |
---|
179 | do n=1,1 |
---|
180 | write(n,1107)sfile |
---|
181 | write(n,1121)title(1:l_title) |
---|
182 | 1121 format(' Title : ',a) |
---|
183 | write(n,1122)user(1:l_user) |
---|
184 | 1122 format(' User : ',a) |
---|
185 | write(n,1123)NSPEC,NDAT,xin(imin),xin(imax) |
---|
186 | 1123 FORMAT(2X,2I10,2x,2f10.3) |
---|
187 | write(n,*)' -------------------------------------------------' |
---|
188 | write(n,1108)rfile |
---|
189 | write(n,1124)n |
---|
190 | 1124 FORMAT(i3) |
---|
191 | write(n,*)' -------------------------------------------------' |
---|
192 | close(unit=n) |
---|
193 | end do |
---|
194 | endif !end print |
---|
195 | CALL BLRINT(XBLR,YBLR,NB,1.0,.FALSE.) |
---|
196 | NDAT=ntc-1 |
---|
197 | CALL DPINIT |
---|
198 | CALL GDINIT |
---|
199 | NDAT=ntc-1 |
---|
200 | CALL DATIN(ISP,DTNORM,IDUF) |
---|
201 | if(o_w1.eq.1)then |
---|
202 | OPEN(UNIT=53,FILE=lptfile,STATUS='old',FORM='formatted', |
---|
203 | 1 access='append') |
---|
204 | write(53,1120)QW1(isp) |
---|
205 | 1120 format(' qlm> width 1 fixed at ',f10.5) |
---|
206 | close(unit=53) |
---|
207 | endif |
---|
208 | CALL BLRINT(XBLR,YBLR,NB,XSCALE(ISP),.TRUE.) |
---|
209 | CALL DPINIT |
---|
210 | CALL PRINIT(FITP,3,NFEW,1) |
---|
211 | CALL FileInit(1,ISP) |
---|
212 | CALL BESINT(AJ0Q(ISP),AJ1Q(ISP),AJ2Q(ISP),AROT*QAVRG(ISP)) |
---|
213 | AJ0=AJ0Q(ISP) |
---|
214 | AJ1=AJ1Q(ISP) |
---|
215 | AJ2=AJ2Q(ISP) |
---|
216 | CALL REFINAw(GRAD,HESS,DPAR,3+NFEW,DETLOG,INDX,COVAR) |
---|
217 | goto 2 |
---|
218 | 1 CALL SEARCHw(GRAD,HESS,DPAR,NFEW,INDX,COVAR,FITP) |
---|
219 | 2 NPARMS=4+3*NFEW |
---|
220 | CHIOLD=CCHI(FITP) |
---|
221 | CALL VCOPY(FITP,FITPSV,NPARMS) |
---|
222 | STEPSZ=0.3 |
---|
223 | IF (NFEW.GT.1) STEPSZ=STEPSZ/10.0 |
---|
224 | IAGAIN=0 |
---|
225 | CDIFMN=0.003 |
---|
226 | do I=1,200 |
---|
227 | CALL REFINEw(GRAD,HESS,NPARMS,DETLOG,INDX,COVAR,STEPSZ) |
---|
228 | CALL NEWEST(COVAR,GRAD,NPARMS,NFEW,DPAR,FITP) |
---|
229 | CNORM=CCHI(FITP) |
---|
230 | IF (CNORM.LE.CHIOLD) THEN |
---|
231 | CHIDIF=(CHIOLD-CNORM)/CNORM |
---|
232 | IF (ABS(CHIDIF).LE.CDIFMN) THEN |
---|
233 | IF (IAGAIN.EQ.0) THEN |
---|
234 | CDIFMN=0.00005 |
---|
235 | STEPSZ=0.15 |
---|
236 | IAGAIN=1 |
---|
237 | ELSE |
---|
238 | GOTO 3 |
---|
239 | ENDIF |
---|
240 | ENDIF |
---|
241 | CHIOLD=CNORM |
---|
242 | CALL VCOPY(FITP,FITPSV,NPARMS) |
---|
243 | ELSE |
---|
244 | CALL VCOPY(FITPSV,FITP,NPARMS) |
---|
245 | STEPSZ=STEPSZ*0.6 |
---|
246 | IF (STEPSZ.LT.1.0E-10) GOTO 3 |
---|
247 | ENDIF |
---|
248 | end do |
---|
249 | 3 continue |
---|
250 | CALL REFINEw(GRAD,HESS,NPARMS,DETLOG,INDX,COVAR,0.7) |
---|
251 | CALL ERRBARw(COVAR,NP,SIGPAR,COV12) |
---|
252 | CALL SEEFITw(SIGPAR,CNORM,PRMSV(1,NFEW+1,ISP),SIGSV(1,NFEW+1,ISP)) |
---|
253 | CALL OUTPRM(FITP,COVAR,NPARMS,NFEW,CNORM) |
---|
254 | CALL REFINEw(GRAD,HESS,NPARMS,DETLOG,INDX,COVAR,0.25) |
---|
255 | CALL PROBNw(CNORM,NDAT,DETLOG,NFEW,PROBLG) |
---|
256 | noff=NDAT*NFEW |
---|
257 | do n=1,NDAT |
---|
258 | yfit(noff+n)=FIT(n) |
---|
259 | end do |
---|
260 | NFEW=NFEW+1 |
---|
261 | if (o_el.eq.0) then !no elastic peak |
---|
262 | FITP(3)=0.0 |
---|
263 | FITPSV(3)=0.0 |
---|
264 | endif |
---|
265 | IF (NFEW.LE.1) GOTO 1 |
---|
266 | nd_out=NDAT |
---|
267 | do n=1,nd_out |
---|
268 | xout(n)=XDAT(n) |
---|
269 | yout(n)=DAT(n) |
---|
270 | if(SIG(n).lt.1.0e-10)then |
---|
271 | eout(n)=0.0 |
---|
272 | else |
---|
273 | eout(n)=SQRT(2.0/SIG(n)) |
---|
274 | endif |
---|
275 | end do |
---|
276 | CALL PRBOUT(PRBSV,1,ISP,POUT) |
---|
277 | do n=1,2 |
---|
278 | yprob(n)=POUT(n,isp) |
---|
279 | end do |
---|
280 | kill=0 |
---|
281 | RETURN |
---|
282 | END |
---|