-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathcalmac.bas
More file actions
333 lines (257 loc) · 8.9 KB
/
calmac.bas
File metadata and controls
333 lines (257 loc) · 8.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
Attribute VB_Name = "CodeCALMAC"
' (c) Copyright 1995-2026 by John J. Donovan
Option Explicit
Dim CalMACOldSample(1 To 1) As TypeSample
Global MACMode As Integer
Sub CalMacCalculate()
' Calculate the MAC using McMaster
ierror = False
On Error GoTo CalMacCalculateError
Dim i As Integer
Dim energy As Single
Dim aphoto As Single
Dim aelastic As Single
Dim ainelastic As Single
Dim atotal As Single
' Check xray
Call CalMACCheckMAC
If ierror Then Exit Sub
' Get the MAC for this binary
energy! = CalMACOldSample(1).LineEnergy!(1) / 1000#
Call CalMACGetMAC(energy!, aphoto!, aelastic!, ainelastic!, atotal!)
If ierror Then Exit Sub
' Update the display
FormMAIN.MSFlexGrid1.row = 1
FormMAIN.MSFlexGrid1.col = 0: FormMAIN.MSFlexGrid1.Text = Format(CalMACOldSample(1).Elsyms$(1), a90)
FormMAIN.MSFlexGrid1.col = 1: FormMAIN.MSFlexGrid1.Text = Format(CalMACOldSample(1).Xrsyms$(1), a90)
FormMAIN.MSFlexGrid1.col = 2: FormMAIN.MSFlexGrid1.Text = Format$(CalMACOldSample(1).Elsyms$(2), a90)
FormMAIN.MSFlexGrid1.col = 3: FormMAIN.MSFlexGrid1.Text = Format$(Format(energy!, f84), a90)
FormMAIN.MSFlexGrid1.col = 4: FormMAIN.MSFlexGrid1.Text = Format$(Format(aphoto!, e82), a90)
FormMAIN.MSFlexGrid1.col = 5: FormMAIN.MSFlexGrid1.Text = Format$(Format(aelastic!, e82), a90)
FormMAIN.MSFlexGrid1.col = 6: FormMAIN.MSFlexGrid1.Text = Format$(Format(ainelastic!, e82), a90)
FormMAIN.MSFlexGrid1.col = 7: FormMAIN.MSFlexGrid1.Text = Format$(Format(atotal!, e82), a90)
' Write strings to Log Window
msg$ = ""
FormMAIN.MSFlexGrid1.row = 0
For i% = 0 To FormMAIN.MSFlexGrid1.cols - 1
FormMAIN.MSFlexGrid1.col = i
msg$ = msg$ & FormMAIN.MSFlexGrid1.Text
Next i%
Call IOWriteLog(msg$)
msg$ = ""
FormMAIN.MSFlexGrid1.row = 1
For i% = 0 To FormMAIN.MSFlexGrid1.cols - 1
FormMAIN.MSFlexGrid1.col = i
msg$ = msg$ & FormMAIN.MSFlexGrid1.Text
Next i%
Call IOWriteLog(msg$)
Exit Sub
' Errors
CalMacCalculateError:
MsgBox Error$, vbOKOnly + vbCritical, "CalMacCalculate"
ierror = True
Exit Sub
End Sub
Sub CalMacChange()
' Load default x-ray
ierror = False
On Error GoTo CalMacChangeError
Dim ip As Integer
Dim sym As String
sym$ = FormMAIN.ComboElement.Text
ip% = IPOS1(MAXELM%, sym$, Symlo$())
If ip% > 0 Then
If FormMAIN.ComboXRay.Text = "" Then FormMAIN.ComboXRay.Text = Deflin$(ip%)
If sym$ <> CalMACOldSample(1).Elsyms$(1) Then FormMAIN.ComboXRay.Text = Deflin$(ip%)
End If
Exit Sub
' Errors
CalMacChangeError:
MsgBox Error$, vbOKOnly + vbCritical, "CalMacChange"
ierror = True
Exit Sub
End Sub
Sub CalMacLoad()
' Load FormMAIN for CalMac
ierror = False
On Error GoTo CalMacLoadError
Dim i As Integer
' Add the list box items
FormMAIN.ComboElement.Clear
For i% = 0 To MAXELM% - 1
FormMAIN.ComboElement.AddItem Symlo$(i% + 1)
Next i%
FormMAIN.ComboElement.ListIndex = 11 ' Mg
FormMAIN.ComboXRay.Clear
For i% = 0 To MAXRAY% - 2
FormMAIN.ComboXRay.AddItem Xraylo$(i% + 1)
Next i%
FormMAIN.ComboXRay.ListIndex = 0 ' Ka
FormMAIN.ComboAbsorber.Clear
For i% = 0 To MAXELM% - 1
FormMAIN.ComboAbsorber.AddItem Symlo(i% + 1)
Next i%
FormMAIN.ComboAbsorber.ListIndex = 25 ' Fe
FormMAIN.TextKeV.Text = Str$(DefaultKiloVolts!)
' Initialize the Output Grid
FormMAIN.MSFlexGrid1.RowHeight(0) = FormMAIN.MSFlexGrid1.Height / FormMAIN.MSFlexGrid1.rows
FormMAIN.MSFlexGrid1.RowHeight(1) = FormMAIN.MSFlexGrid1.Height / FormMAIN.MSFlexGrid1.rows
FormMAIN.MSFlexGrid1.row = 0
FormMAIN.MSFlexGrid1.col = 0: FormMAIN.MSFlexGrid1.Text = Format$("Element", a90)
FormMAIN.MSFlexGrid1.col = 1: FormMAIN.MSFlexGrid1.Text = Format("X-ray", a90)
FormMAIN.MSFlexGrid1.col = 2: FormMAIN.MSFlexGrid1.Text = Format("Absorb", a90)
FormMAIN.MSFlexGrid1.col = 3: FormMAIN.MSFlexGrid1.Text = Format("Energy", a90)
FormMAIN.MSFlexGrid1.col = 4: FormMAIN.MSFlexGrid1.Text = Format("Photo", a90)
FormMAIN.MSFlexGrid1.col = 5: FormMAIN.MSFlexGrid1.Text = Format("Elastic", a90)
FormMAIN.MSFlexGrid1.col = 6: FormMAIN.MSFlexGrid1.Text = Format("Inelast", a90)
FormMAIN.MSFlexGrid1.col = 7: FormMAIN.MSFlexGrid1.Text = Format("Total", a90)
Exit Sub
' Errors
CalMacLoadError:
MsgBox Error$, vbOKOnly + vbCritical, "CalMacLoad"
ierror = True
Exit Sub
End Sub
Sub CalMacCalculateRange()
' Calculate the MAC range using McMaster
ierror = False
On Error GoTo CalMacCalculateRangeError
Dim i As Integer
Dim energy As Single
Dim aphoto As Single
Dim aelastic As Single
Dim ainelastic As Single
Dim atotal As Single
' Check xray
Call CalMACCheckMAC
If ierror Then Exit Sub
Call IOWriteLog("")
If FormMAIN.menuMethodMcMasterMACs.Checked Then
Call IOWriteLog("McMaster MAC +-100 eV Range")
ElseIf FormMAIN.menuMethodMAC30MACs.Checked Then
Call IOWriteLog("MAC30 MAC +-100 eV Range")
ElseIf FormMAIN.menuMethodJTAMACs.Checked Then
Call IOWriteLog("JTA MAC +-100 eV Range")
End If
' Calculate +- 100 eV on a side
Call IOWriteLog("")
For i% = -100 To 100
energy! = CalMACOldSample(1).LineEnergy!(1) / 1000# + i% / 1000# ' 1 eV intervals
' Get the MAC for this binary
Call CalMACGetMAC(energy!, aphoto!, aelastic!, ainelastic!, atotal!)
If ierror Then Exit Sub
' Print
msg$ = "Energy= " & MiscAutoFormat$(energy!) & " Angstrom= " & MiscAutoFormat$(ANGKEV! / energy!) & " MAC= " & MiscAutoFormat$(atotal!)
Call IOWriteLog(msg$)
Next i%
Call IOWriteLog("")
Exit Sub
' Errors
CalMacCalculateRangeError:
MsgBox Error$, vbOKOnly + vbCritical, "CalMacCalculateRange"
ierror = True
Exit Sub
End Sub
Sub CalMACGetMAC(energy As Single, aphoto As Single, aelastic As Single, ainelastic As Single, atotal As Single)
' Get the MAC from appropriate Absorb routine
ierror = False
On Error GoTo CalMacGetMACError
Dim iz As Integer
Dim ielm As Integer, iray As Integer
Static initialized1 As Integer, initialized2 As Integer
Static g(3, 95) As Single
Static o(9, 95) As Single
Static lines(1 To 12, 1 To 99) As Double
Static edges(1 To 12, 1 To 99) As Double
' Load the absorber atomic number
iz% = CalMACOldSample(1).AtomicNums%(2)
' McMaster
If MACMode% = 0 Then
Call AbsorbGetMAC(iz%, energy!, aphoto!, aelastic!, ainelastic!, atotal!)
End If
' If MAC30, load line and edge energies from LINES2.DAT
If MACMode% = 1 And Not initialized1 Then
Call AbsorbLoadLINES2DataFile(lines#(), edges#())
If ierror Then Exit Sub
initialized1 = True
End If
' If MACJTA, load line and edge energies from LINES.DAT
If MACMode% = 2 And Not initialized2 Then
Call AbsorbLoadLINESDataFile(g!(), o!())
If ierror Then Exit Sub
initialized2 = True
End If
' Load x-ray and line if not using arbitrary energy
If energy! = 0# Then
ielm% = CalMACOldSample(1).AtomicNums%(1)
iray% = CalMACOldSample(1).XrayNums%(1)
End If
' MAC30
If MACMode% = 1 Then
Call AbsorbGetMAC30(energy!, iz%, ielm%, iray%, lines#(), edges#(), atotal!)
End If
' MACJTA
If MACMode% = 2 Then
Call AbsorbGetMACJTA(energy!, iz%, ielm%, iray%, g!(), o!(), atotal!)
End If
Exit Sub
' Errors
CalMacGetMACError:
MsgBox Error$, vbOKOnly + vbCritical, "CalMacGetMAC"
ierror = True
Exit Sub
End Sub
Sub CalMACCheckMAC()
' Check the arrays
ierror = False
On Error GoTo CalMacCheckMACError
' Get the z absorber number and the energy
CalMACOldSample(1).Elsyms$(1) = FormMAIN.ComboElement.Text
CalMACOldSample(1).Xrsyms$(1) = FormMAIN.ComboXRay.Text
CalMACOldSample(1).Elsyms$(2) = FormMAIN.ComboAbsorber.Text
DefaultKiloVolts! = Val(FormMAIN.TextKeV.Text)
CalMACOldSample(1).kilovolts! = DefaultKiloVolts!
CalMACOldSample(1).takeoff! = DefaultTakeOff!
CalMACOldSample(1).KilovoltsArray!(1) = DefaultKiloVolts!
CalMACOldSample(1).TakeoffArray!(1) = DefaultTakeOff!
CalMACOldSample(1).numcat%(1) = 1
CalMACOldSample(1).numcat%(2) = 1
CalMACOldSample(1).numoxd%(1) = 0
CalMACOldSample(1).numoxd%(2) = 0
If CalMACOldSample(1).Elsyms$(1) = "" Then GoTo CalMacCheckMACNoEmitter
If CalMACOldSample(1).Xrsyms$(1) = "" Then GoTo CalMacCheckMACNoXray
If CalMACOldSample(1).Elsyms$(2) = "" Then GoTo CalMacCheckMACNoAbsorber
' Load the element arrays
CalMACOldSample(1).LastElm% = 1
CalMACOldSample(1).LastChan% = 2
' Check for valid element symbols
Call ElementCheckElement(CalMACOldSample())
If ierror Then Exit Sub
' Fill element arrays
Call ElementLoadArrays(CalMACOldSample())
If ierror Then Exit Sub
' Check for valid xray symbols
Call ElementCheckXray(Int(1), CalMACOldSample())
If ierror Then Exit Sub
Exit Sub
' Errors
CalMacCheckMACError:
MsgBox Error$, vbOKOnly + vbCritical, "CalMacCheckMAC"
ierror = True
Exit Sub
CalMacCheckMACNoEmitter:
msg$ = "No emitting element was entered"
MsgBox msg$, vbOKOnly + vbExclamation, "CalMacCheckMAC"
ierror = True
Exit Sub
CalMacCheckMACNoXray:
msg$ = "No emitting x-ray was entered"
MsgBox msg$, vbOKOnly + vbExclamation, "CalMacCheckMAC"
ierror = True
Exit Sub
CalMacCheckMACNoAbsorber:
msg$ = "No absorbing element was entered"
MsgBox msg$, vbOKOnly + vbExclamation, "CalMacCheckMAC"
ierror = True
Exit Sub
End Sub