show_sensitivity.py
3.77 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
#! /usr/bin/env python
# ==========================================================================
# This script displays a differential sensitivity plot generated by cssens.
#
# Copyright (C) 2015 Juergen Knoedlseder
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# ==========================================================================
import sys
import math
import gammalib
try:
import matplotlib.pyplot as plt
except:
sys.exit("This script needs matplotlib")
# ===================== #
# Read sensitivity data #
# ===================== #
def read_sensitivity(filename):
"""
Read sensitivity information from CSV file.
"""
# Read filename
csv = gammalib.GCsv(filename,',')
# Create dictionnary
sensitivity = {}
for column in range(csv.ncols()):
name = csv[0,column]
values = []
for row in range(csv.nrows()-1):
values.append(float(csv[row+1,column]))
sensitivity[name] = values
# Check where file contains differential or integral sensitivity
mode = "Integral"
if sensitivity.has_key("emax"):
emax_ref = -1.0
for value in sensitivity["emax"]:
if emax_ref < 0.0:
emax_ref = value
elif emax_ref != value:
mode = "Differential"
break
# Add mode
sensitivity["mode"] = mode
# Add linear energy values
if mode == "Differential":
if sensitivity.has_key("loge"):
name = 'energy'
values = []
for value in sensitivity["loge"]:
values.append(math.pow(10.0, value))
sensitivity[name] = values
else:
if sensitivity.has_key("emin"):
name = 'energy'
values = []
for value in sensitivity["emin"]:
values.append(value)
sensitivity[name] = values
# Return
return sensitivity
# ===================== #
# Show sensitivity data #
# ===================== #
def show_sensitivity(sensitivity, filename):
"""
Plot sensitivity.
"""
# Build title
title = sensitivity['mode'] + ' sensitivity ('+filename+')'
# Create figure
plt.figure()
# Set plot attributes
plt.title(title)
plt.loglog()
plt.grid()
# Show differential sensitivity
plt.plot(sensitivity['energy'], sensitivity['sensitivity'], 'ro-')
# Set labels
plt.xlabel("Energy (TeV)")
if sensitivity['mode'] == "Differential":
plt.ylabel(r"E$\times$ F(E) (erg cm$^{-2}$ s$^{-1}$)")
else:
plt.ylabel(r"E$\times$ F($>$E) (erg cm$^{-2}$ s$^{-1}$)")
# Show plot
plt.show()
# Return
return
# ======================== #
# Main routine entry point #
# ======================== #
if __name__ == '__main__':
"""
"""
# Print usage information
usage = "Usage: show_sensitivity [filename]"
if len(sys.argv) < 1:
sys.stdout.write(usage+"\n")
sys.exit()
# Extract parameters
if len(sys.argv) == 1:
filename = 'sensitivity.dat'
else:
filename = sys.argv[1]
# Read sensitivity data
sensitivity = read_sensitivity(filename)
# Show sensitivity data
show_sensitivity(sensitivity, filename)