blob: 8af8266bc30b6f9fe75cf761d27df33453938046 (
plain)
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
|
# Copyright (c) 2017 Weitian LI <liweitianux@live.com>
# MIT license
#
# XSPEC Tcl script to calculate the average temperature and abundance
# by ting the temperatures and abundances of all regions.
#
# NOTE:
# * Use XSPEC model `projct*wabs*apec`
# * if error < 0.01, then assume error = 0.01
# * if fabs(error) < 1e-7, then set error as `NULL' in output
# (this may be caused by frozen or tied parameters)
#
# Output:
# * tz_average.txt : average temperature and abundance (and errors)
#
# Change logs:
# 2017-02-06, Weitian LI
# * Initial version based on `xspec_tprofile.tcl`
set NAME "xspec_avg_tz.tcl"
set DATE [ exec date ]
# Flag to indicate invalid errors
set FLAG_ERR "FALSE"
# Flag to indicate too large reduced chisq
set FLAG_CHI "FALSE"
# Return TCL results for XSPEC commands.
set xs_return_result 1
# Keep going until fit converges.
query yes
# Get the value of the specified parameter
proc get_value {pn} {
set value [ lindex [ tcloutr param $pn ] 0 ]
return $value
}
# Calculate the error of the specified parameter
proc get_error {pn} {
global FLAG_ERR
global FLAG_CHI
set chisq [ tcloutr stat ]
set dof [ lindex [ tcloutr dof ] 0 ]
if {[ expr {$chisq / $dof} ] >= 1.99} {
# reduced chisq too large; use sigma instead
set err [ tcloutr sigma $pn ]
set FLAG_CHI "TRUE"
} else {
error 1.0 $pn
tclout error $pn
scan $xspec_tclout "%f %f" val_l val_u
set err [ expr {($val_u - $val_l) / 2.0} ]
}
# error treatment
if {abs($err) < 1.0e-7} {
puts "*** WARNING: invalid error value ***"
set err "NULL"
set FLAG_ERR "TRUE"
} elseif {$err < 0.01} {
set err 0.01
}
return $err
}
# Output file
set tz_fn "tz_average.txt"
if {[ file exists $tz_fn ]} {
exec mv -fv $tz_fn ${tz_fn}_bak
}
set tz_fd [ open $tz_fn w ]
# Header
puts $tz_fd "# Average temperature and abundance"
puts $tz_fd "#"
puts $tz_fd "# Generated by: ${NAME}"
puts $tz_fd "# Created: ${DATE}"
puts $tz_fd "#"
puts $tz_fd "# Item Value Error"
# Number of data group
set datasets [ tcloutr datasets ]
# Untie and thaw the temperature and abundance of the first region
untie 5 6
thaw 5 6
# Tie all other temperature and abundance to that of the first region
for {set i 2} {$i <= ${datasets}} {incr i} {
# Parameter number of temperature and abundance
set temp_pn [ expr {8 * $i - 3} ]
set abund_pn [ expr {8 * $i - 2} ]
newpar $temp_pn = 5
newpar $abund_pn = 6
}
# Fit the spectra again
fit
# Get the values and errors of average temperature and abundance
set temp_val [ get_value 5 ]
set temp_err [ get_error 5 ]
set abund_val [ get_value 6 ]
set abund_err [ get_error 6 ]
# Output the average temperature and abundance
puts "Average temperature: $temp_val, $temp_err"
puts "Average abundance: $abund_val, $abund_err"
puts $tz_fd "temp $temp_val $temp_err"
puts $tz_fd "abund $abund_val $abund_err"
close $tz_fd
# Print a WARNING if there are any errors
if {[ string equal $FLAG_ERR "TRUE" ]} {
puts "*** WARNING: there are invalid error values ***"
}
if {[ string equal $FLAG_CHI "TRUE" ]} {
puts "*** WARNING: reduced chi^2 too large to calculate errors ***"
}
|