Commit 860668891bf3e02ff0f6501fe8f5cee99ac75197
1 parent
56f461b1
Exists in
master
first commit
Showing
1 changed file
with
177 additions
and
0 deletions
Show diff stats
@@ -0,0 +1,177 @@ | @@ -0,0 +1,177 @@ | ||
1 | +FUNCTION ADD_MOD, sf, tag, nsz, unit=unit | ||
2 | +; adds a model tag to a existing SMDAT structure | ||
3 | +; SF (I): input SMDAT structure | ||
4 | +; TAG (I): tag of model to be added | ||
5 | +; NSZ (I): int array(2) of sizes [nr of data pts, nr of grain types] | ||
6 | + | ||
7 | + tag = STRLOWCASE(STRTRIM(tag,2)) | ||
8 | + if n_elements(nsz) GT 1 then begin | ||
9 | + n1 = nsz(0) & n2 = nsz(1) | ||
10 | + if n_elements(nsz) EQ 3 then n3 = nsz(2) else n3 = 0 | ||
11 | + endif else begin | ||
12 | + print,'(F) ADD_MOD: array of sizes must > 1D' | ||
13 | + endelse | ||
14 | + if TAG EQ 'emis' then begin | ||
15 | + if n_elements(unit) EQ 0 then unit='x(microns) SED(erg/s/cm2/sr)' | ||
16 | + s1 = { UNIT : unit, $ | ||
17 | + X : dblarr(n1), $ ; wave | ||
18 | + Y : dblarr(n1,n2), $ ; SED(wave, grain type) (index ntype is total) | ||
19 | + YP : dblarr(n1,n2) } ; polarized SED(wave, grain type) (index ntype is total) | ||
20 | + ENDIF else if TAG EQ 'ext' then begin | ||
21 | + if n_elements(unit) EQ 0 then unit='x(microns) sigma(cm2/H)' | ||
22 | + s1 = {UNIT : unit, $ | ||
23 | + X : dblarr(n1), $ ; wave | ||
24 | + Y : dblarr(n1,n2), $ ; sigma_ext(wave, grain type) (index ntype is total) | ||
25 | + ABS : dblarr(n1,n2), $ ; sigma_abs(wave, grain type) | ||
26 | + SCA : dblarr(n1,n2), $ ; sigma_sca(wave, grain type) | ||
27 | + ABS_P : dblarr(n1,n2), $ ; absorption sigma_pol(wave, grain type) | ||
28 | + SCA_P : dblarr(n1,n2), $ ; scattering sigma_pol(wave, grain type) | ||
29 | + ALB : dblarr(n1,n2), $ ; alb(wave, grain type) | ||
30 | + XR : 0d, $ ; ref wave | ||
31 | + YR_ABS : dblarr(n2), $ ; tau_abs/NH @ XR | ||
32 | + YR_SCA : dblarr(n2), $ ; tau_sca/NH @ XR | ||
33 | + RV : 0d } | ||
34 | +; ENDIF else if TAG EQ 'pol' then begin | ||
35 | +; if n_elements(unit) EQ 0 then unit='x(microns) SED(erg/s/cm2/sr)' | ||
36 | +; s1 = {UNIT : unit, $ | ||
37 | +; X: dblarr(n1), $ ; wave | ||
38 | +; Y: dblarr(n1,n2), $ ; polarized SED(wave, grain type) (index ntype is total) | ||
39 | +; POL: dblarr(n1,n2) } ; sigma_pol(wave, grain type) (ABS + SCAT) | ||
40 | + ENDIF else if tag EQ 'sdist' then begin | ||
41 | + if n3 EQ 0 then begin | ||
42 | + print,'(F) ADD_MOD: 3d dimension missing ' | ||
43 | + return,0 | ||
44 | + endif | ||
45 | + if n_elements(unit) EQ 0 then unit='x(cm) a^4*dn/da(cm3/H)' | ||
46 | + s1 = {UNIT : unit, $ | ||
47 | + XTOT : dblarr(n1), $ ; grain size | ||
48 | + YTOT : dblarr(n1,n2), $ ; size distribution | ||
49 | + XI : dblarr(n3,n2), $ ; grain size per type | ||
50 | + YI : dblarr(n3,n2) } ; grain size dist per type | ||
51 | + ENDIF | ||
52 | + sm = CREATE_STRUCT( CREATE_STRUCT('M_'+tag,s1), sf ) | ||
53 | + return, sm | ||
54 | +END | ||
55 | + | ||
56 | +FUNCTION STR_INST, n1, n2=n2, n3=n3 | ||
57 | +; returns structure containing flux and CC in band | ||
58 | +; N1 (I): number of data points | ||
59 | +; N2 (I): nr of grain types or different models | ||
60 | +; N3 (I): nr of points in transmission (band flux data) | ||
61 | + | ||
62 | + if n_elements(n2) EQ 0 then n2 = 1 | ||
63 | + | ||
64 | + if n_elements(n3) NE 0 then begin | ||
65 | + strct = { NAME : strarr(n1), $ | ||
66 | + X : dblarr(n1), $ | ||
67 | + YD : dblarr(n1), $ | ||
68 | + ERR : dblarr(n1), $ | ||
69 | + YM : dblarr(n1,n2), $ | ||
70 | + FLX : dblarr(n1,n2), $ | ||
71 | + CC : dblarr(n1,n2), $ | ||
72 | + RR : dblarr(n1), $ | ||
73 | + ISEL : intarr(n1)+1, $ | ||
74 | + UNIT : '', $ | ||
75 | + NPAR : 0, $ | ||
76 | + CHI2 : 0d } | ||
77 | + s1 = CREATE_STRUCT('TRANS', {X : dblarr(n1,n3), Y : dblarr(n1,n3) }) | ||
78 | + strct = CREATE_STRUCT( strct, s1 ) | ||
79 | + endif else if n_elements(BAND) EQ 0 then begin | ||
80 | + strct = { X : dblarr(n1), $ | ||
81 | + YD : dblarr(n1), $ | ||
82 | + ERR : dblarr(n1) , $ | ||
83 | + YM : dblarr(n1,n2), $ | ||
84 | + ISEL : intarr(n1)+1, $ | ||
85 | + UNIT : '', $ | ||
86 | + NPAR : 0, $ | ||
87 | + CHI2 : 0d } | ||
88 | + endif | ||
89 | + | ||
90 | + RETURN, strct | ||
91 | +END | ||
92 | + | ||
93 | +FUNCTION CHI2, y, model, npar, err=err | ||
94 | +; returns the chi-square value of fit MODEL to data Y | ||
95 | +; | ||
96 | +; NPAR (I): nr of parameters in the fit | ||
97 | +; ERR (I): error of each data point. Default is ERR=0.1*Y | ||
98 | + | ||
99 | + ny = n_elements(y) | ||
100 | + if n_elements(err) EQ 0 OR TOTAL(err) EQ 0 then begin | ||
101 | + err = 0.1*y | ||
102 | + print,'(W) CHI2: error missing, set to 10 %' | ||
103 | + endif | ||
104 | + ndof = ny - npar ; nr of degrees of freedom | ||
105 | + chi = TOTAL( ((y-model)/err)^2 ) | ||
106 | + if ndof GT 0 then chi = chi / ndof | ||
107 | + | ||
108 | + return, chi | ||
109 | +END | ||
110 | + | ||
111 | +FUNCTION FIL_CHI2, sf, ntype=ntype | ||
112 | +; fills in the Chi-square fields of an input SMDAT structure | ||
113 | +; (see format in GET_BAND_FLUX) | ||
114 | +; | ||
115 | +; SF (I): input SMDAT structure | ||
116 | +; NTYPE (I): index of SED to be used | ||
117 | + | ||
118 | + if ntype EQ 0 then begin | ||
119 | + tt = SIZE(sf.sed.y) | ||
120 | + ntype = tt(2) | ||
121 | + endif | ||
122 | + ntag = N_TAGS(sf) | ||
123 | + stag = TAG_NAMES(sf) | ||
124 | + itg = WHERE( STRPOS(stag,'I_') GE 0, ctg ) | ||
125 | + if ctg EQ 0 then begin | ||
126 | + print,'(F) FIL_CHI2: no instrument to fill in' | ||
127 | + return,0 | ||
128 | + endif | ||
129 | + yy=0d & mm=0d & ee=0d & ift=0 | ||
130 | + for k = 0, ctg-1 do begin | ||
131 | + i1 = WHERE( sf.(itg(k)).isel EQ 1 AND sf.(itg(k)).err GT 0, c1) | ||
132 | + if c1 GT 0 then begin | ||
133 | + sf.(itg(k)).chi2 = $ | ||
134 | + CHI2(sf.(itg(k)).yd(i1), sf.(itg(k)).ym(i1,ntype-1), sf.(itg(k)).npar, err=sf.(itg(k)).err(i1)) | ||
135 | + endif | ||
136 | + yy = [ yy, sf.(itg(k)).yd ] | ||
137 | + ee = [ ee, sf.(itg(k)).err] | ||
138 | + mm = [ mm, sf.(itg(k)).ym(*,ntype-1) ] | ||
139 | + ift = [ ift, sf.(itg(k)).isel ] | ||
140 | + endfor | ||
141 | + yy=yy(1:*) & ee=ee(1:*) & mm=mm(1:*) & ift=ift(1:*) | ||
142 | + it = WHERE( ift EQ 1 AND ee GT 0, ct) | ||
143 | + if ct GT 0 then sf.chi2 = CHI2( yy(it), mm(it), sf.npar, err=ee(it)) | ||
144 | + | ||
145 | + return, sf | ||
146 | +END | ||
147 | + | ||
148 | +FUNCTION ADD_INST, sf, tag, nsz, ntrans=ntrans | ||
149 | +; fills in data for existing instruments in SMDAT structure | ||
150 | +; or add a new instrument to SMDAT structure | ||
151 | +; | ||
152 | +; SF (I): SMDAT input structure | ||
153 | +; TAG (I): name of instrument to add in | ||
154 | +; NSZ (I): array(2) of sizes [nr of data pts, nr of grain types] | ||
155 | +; NTRANS (I): nr of points for transmission (bad flux data) | ||
156 | + | ||
157 | + stag = TAG_NAMES(sf) | ||
158 | + ntag = N_TAGS(sf) | ||
159 | + tag = STRUPCASE('I_'+STRTRIM(tag,2)) | ||
160 | + itg = WHERE( stag EQ tag, ctg ) | ||
161 | + if n_elements(nsz) EQ 2 then begin | ||
162 | + nx = nsz(0) & ntype = nsz(1) | ||
163 | + endif else begin | ||
164 | + print,'(F) ADD_MOD: array of sizes must be 2D' | ||
165 | + endelse | ||
166 | + if ctg EQ 0 then begin | ||
167 | + if n_elements(ntrans) EQ 0 then st = CREATE_STRUCT( tag, STR_INST(nx,n2=ntype) ) $ | ||
168 | + else st = CREATE_STRUCT( tag, STR_INST(nx,n2=ntype,n3=ntrans) ) | ||
169 | + sf = CREATE_STRUCT( sf, st ) | ||
170 | + stag = TAG_NAMES(sf) | ||
171 | + itg = WHERE( stag EQ tag ) | ||
172 | + sf.(itg).isel = intarr(nx) + 1 | ||
173 | + endif else begin | ||
174 | + print,'(F) ADD_INST: INST already exists in structure' | ||
175 | + endelse | ||
176 | + return,sf | ||
177 | +END |