Commit 7a8e2181124fce8bbd8b129db9189cb32ef324c1

Authored by Jürgen Knödlseder
1 parent 8830ee7c

Add testing of diffuse map cubes to Python unit test.

test/data/model_background_cube_const.xml 0 → 100644
  1 +<?xml version="1.0" standalone="no"?>
  2 +<source_library title="source library">
  3 + <source name="CTABackgroundModel" type="CTABackground" instrument="CTA">
  4 + <spectrum type="ConstantValue">
  5 + <parameter name="Value" scale="1.0" min="0.01" max="1000.0" value="1.0" free="1"/>
  6 + </spectrum>
  7 + <spatialModel type="MapCubeFunction" file="data/test_cube.fits">
  8 + <parameter name="Normalization" scale="1" value="1" min="0.1" max="10" free="0"/>
  9 + </spatialModel>
  10 + </source>
  11 +</source_library>
... ...
test/test_python.py
... ... @@ -30,178 +30,227 @@ import sys
30 30 # Analysis pipeline - version 1 #
31 31 # ============================= #
32 32 def pipeline_v1():
33   - """
34   - Unbinned analysis pipeline - save intermediate results.
  33 + """
  34 + Unbinned analysis pipeline - save intermediate results.
35 35  
36   - This function implements an analysis pipeline that successively calls
37   - ctobssim, ctselect and ctlike by saving the intermediate results as FITS
38   - files on disk. This replicates the way how the analysis would be done
39   - in a ftools-like approach.
40   - """
41   - # Set script parameters
42   - model_name = "data/crab.xml"
43   - events_name = "events.fits"
44   - selected_events_name = "selected_events.fits"
45   - result_name = "results.xml"
46   - caldb = "irf"
47   - irf = "cta_dummy_irf"
48   - ra = 83.63
49   - dec = 22.01
50   - rad_sim = 10.0
51   - tstart = 0.0
52   - tstop = 1800.0
53   - emin = 0.1
54   - emax = 100.0
55   - rad_select = 3.0
56   -
57   - # Initialise timing
58   - wall_seconds = 0.0
59   - cpu_seconds = 0.0
60   -
61   - # Simulate events
62   - sim = ctobssim()
63   - sim.logFileOpen()
64   - sim["infile"].filename(model_name)
65   - sim["outfile"].filename(events_name)
66   - sim["caldb"].string(caldb)
67   - sim["irf"].string(irf)
68   - sim["ra"].real(ra)
69   - sim["dec"].real(dec)
70   - sim["rad"].real(rad_sim)
71   - sim["tmin"].real(tstart)
72   - sim["tmax"].real(tstop)
73   - sim["emin"].real(emin)
74   - sim["emax"].real(emax)
75   - sim.execute()
76   - sys.stdout.write(".")
77   -
78   - # Select events
79   - select = ctselect()
80   - select.logFileOpen()
81   - select["infile"].filename(events_name)
82   - select["outfile"].filename(selected_events_name)
83   - select["ra"].real(ra)
84   - select["dec"].real(dec)
85   - select["rad"].real(rad_select)
86   - select["tmin"].real(tstart)
87   - select["tmax"].real(tstop)
88   - select["emin"].real(emin)
89   - select["emax"].real(emax)
90   - select.execute()
91   - sys.stdout.write(".")
92   -
93   - # Perform maximum likelihood fitting
94   - like = ctlike()
95   - like.logFileOpen()
96   - like["infile"].filename(selected_events_name)
97   - like["srcmdl"].filename(model_name)
98   - like["outmdl"].filename(result_name)
99   - like["caldb"].string(caldb)
100   - like["irf"].string(irf)
101   - like.execute()
102   - sys.stdout.write(".")
103   -
104   - # Return
105   - return
  36 + This function implements an analysis pipeline that successively calls
  37 + ctobssim, ctselect and ctlike by saving the intermediate results as FITS
  38 + files on disk. This replicates the way how the analysis would be done
  39 + in a ftools-like approach.
  40 + """
  41 + # Set script parameters
  42 + model_name = "data/crab.xml"
  43 + events_name = "events.fits"
  44 + selected_events_name = "selected_events.fits"
  45 + result_name = "results.xml"
  46 + caldb = "irf"
  47 + irf = "cta_dummy_irf"
  48 + ra = 83.63
  49 + dec = 22.01
  50 + rad_sim = 10.0
  51 + tstart = 0.0
  52 + tstop = 1800.0
  53 + emin = 0.1
  54 + emax = 100.0
  55 + rad_select = 3.0
  56 +
  57 + # Initialise timing
  58 + wall_seconds = 0.0
  59 + cpu_seconds = 0.0
  60 +
  61 + # Simulate events
  62 + sim = ctobssim()
  63 + sim.logFileOpen()
  64 + sim["infile"].filename(model_name)
  65 + sim["outfile"].filename(events_name)
  66 + sim["caldb"].string(caldb)
  67 + sim["irf"].string(irf)
  68 + sim["ra"].real(ra)
  69 + sim["dec"].real(dec)
  70 + sim["rad"].real(rad_sim)
  71 + sim["tmin"].real(tstart)
  72 + sim["tmax"].real(tstop)
  73 + sim["emin"].real(emin)
  74 + sim["emax"].real(emax)
  75 + sim.execute()
  76 + sys.stdout.write(".")
  77 +
  78 + # Select events
  79 + select = ctselect()
  80 + select.logFileOpen()
  81 + select["infile"].filename(events_name)
  82 + select["outfile"].filename(selected_events_name)
  83 + select["ra"].real(ra)
  84 + select["dec"].real(dec)
  85 + select["rad"].real(rad_select)
  86 + select["tmin"].real(tstart)
  87 + select["tmax"].real(tstop)
  88 + select["emin"].real(emin)
  89 + select["emax"].real(emax)
  90 + select.execute()
  91 + sys.stdout.write(".")
  92 +
  93 + # Perform maximum likelihood fitting
  94 + like = ctlike()
  95 + like.logFileOpen()
  96 + like["infile"].filename(selected_events_name)
  97 + like["srcmdl"].filename(model_name)
  98 + like["outmdl"].filename(result_name)
  99 + like["caldb"].string(caldb)
  100 + like["irf"].string(irf)
  101 + like.execute()
  102 + sys.stdout.write(".")
  103 +
  104 + # Return
  105 + return
106 106  
107 107  
108 108 # ============================= #
109 109 # Analysis pipeline - version 2 #
110 110 # ============================= #
111   -def pipeline_v2():
112   - """
113   - Unbinned analysis pipeline - keep intermediate results in memory.
  111 +def pipeline_v2(model_name="data/crab.xml", \
  112 + ra_sim=83.63, dec_sim=22.01, rad_sim=10.0, \
  113 + ra_select=83.63, dec_select=22.01, rad_select=3.0, \
  114 + tstart=0.0, tstop=1800.0, \
  115 + emin=0.1, emax=100.0, \
  116 + ref={}):
  117 + """
  118 + Unbinned analysis pipeline - keep intermediate results in memory.
114 119  
115   - This function implements an analysis pipeline that successively calls
116   - ctobssim, ctselect and ctlike without saving the intermediate results as
117   - FITS files on disk. All data is only hold in memory.
118   - """
119   - # Set script parameters
120   - model_name = "data/crab.xml"
121   - caldb = "irf"
122   - irf = "cta_dummy_irf"
123   - ra = 83.63
124   - dec = 22.01
125   - rad_sim = 10.0
126   - tstart = 0.0
127   - tstop = 1800.0
128   - emin = 0.1
129   - emax = 100.0
130   - rad_select = 3.0
131   -
132   - # Initialise timing
133   - wall_seconds = 0.0
134   - cpu_seconds = 0.0
135   -
136   - # Simulate events
137   - sim = ctobssim()
138   - sim["infile"].filename(model_name)
139   - sim["caldb"].string(caldb)
140   - sim["irf"].string(irf)
141   - sim["ra"].real(ra)
142   - sim["dec"].real(dec)
143   - sim["rad"].real(rad_sim)
144   - sim["tmin"].real(tstart)
145   - sim["tmax"].real(tstop)
146   - sim["emin"].real(emin)
147   - sim["emax"].real(emax)
148   - sim.run()
149   - sys.stdout.write(".")
150   -
151   - # Select events
152   - select = ctselect(sim.obs())
153   - select["ra"].real(ra)
154   - select["dec"].real(dec)
155   - select["rad"].real(rad_select)
156   - select["tmin"].real(tstart)
157   - select["tmax"].real(tstop)
158   - select["emin"].real(emin)
159   - select["emax"].real(emax)
160   - select.run()
161   - sys.stdout.write(".")
162   -
163   - # Perform maximum likelihood fitting
164   - like = ctlike(select.obs())
165   - like.run()
166   - sys.stdout.write(".")
167   -
168   - # Return
169   - return
  120 + This function implements an analysis pipeline that successively calls
  121 + ctobssim, ctselect and ctlike without saving the intermediate results as
  122 + FITS files on disk. All data is only hold in memory.
  123 + """
  124 + # Set script parameters
  125 + #model_name = "data/crab.xml"
  126 + caldb = "irf"
  127 + irf = "cta_dummy_irf"
  128 + #ra = 83.63
  129 + #dec = 22.01
  130 + #rad_sim = 10.0
  131 + #tstart = 0.0
  132 + #tstop = 1800.0
  133 + #emin = 0.1
  134 + #emax = 100.0
  135 + #rad_select = 3.0
  136 +
  137 + # Simulate events
  138 + sim = ctobssim()
  139 + sim["infile"].filename(model_name)
  140 + sim["caldb"].string(caldb)
  141 + sim["irf"].string(irf)
  142 + sim["ra"].real(ra_sim)
  143 + sim["dec"].real(dec_sim)
  144 + sim["rad"].real(rad_sim)
  145 + sim["tmin"].real(tstart)
  146 + sim["tmax"].real(tstop)
  147 + sim["emin"].real(emin)
  148 + sim["emax"].real(emax)
  149 + sim.run()
  150 + sys.stdout.write(".")
  151 +
  152 + # Select events
  153 + select = ctselect(sim.obs())
  154 + select["ra"].real(ra_select)
  155 + select["dec"].real(dec_select)
  156 + select["rad"].real(rad_select)
  157 + select["tmin"].real(tstart)
  158 + select["tmax"].real(tstop)
  159 + select["emin"].real(emin)
  160 + select["emax"].real(emax)
  161 + select.run()
  162 + sys.stdout.write(".")
  163 +
  164 + # Perform maximum likelihood fitting
  165 + like = ctlike(select.obs())
  166 + like.run()
  167 + sys.stdout.write(".")
  168 +
  169 + # Analyse results
  170 + errors = 0
  171 + models = like.obs().models()
  172 + #print(models)
  173 + for model in models:
  174 + for key in ref:
  175 + if key == model.name():
  176 + for par in model:
  177 + for value in ref[key]:
  178 + if value == par.name():
  179 + if abs(float(ref[key][value])-par.value()) < 0.0001:
  180 + sys.stdout.write(".")
  181 + else:
  182 + sys.stdout.write("E")
  183 + errors += 1
  184 +
  185 + # Return number of errors
  186 + return errors
170 187  
171 188  
172 189 #==========================#
173 190 # Main routine entry point #
174 191 #==========================#
175 192 if __name__ == '__main__':
176   - """
177   - Test ctools Python modules.
178   - """
179   - # Dump header
180   - sys.stdout.write("\n")
181   - sys.stdout.write("***********************************\n")
182   - sys.stdout.write("* ctools Python interface testing *\n")
183   - sys.stdout.write("***********************************\n")
184   -
185   - # Set PFILES environment variable
186   - try:
187   - os.mkdir("pfiles")
188   - except:
189   - pass
190   - os.system("cp -r ../src/*/*.par pfiles/")
191   - os.environ['PFILES'] = "pfiles"
192   -
193   - # Remove any existing result files
194   - list = [glob.glob("*.fits"), glob.glob("*.log"), glob.glob("*.xml")]
195   - for files in list:
196   - for file in files:
197   - os.remove(file)
198   -
199   - # Save intermediate results on disk
200   - sys.stdout.write("Test executable analysis: ")
201   - pipeline_v1()
202   - sys.stdout.write(" ok\n")
  193 + """
  194 + Test ctools Python modules.
  195 + """
  196 + # Dump header
  197 + print("")
  198 + print("***********************************")
  199 + print("* ctools Python interface testing *")
  200 + print("***********************************")
  201 +
  202 + # Set PFILES environment variable
  203 + try:
  204 + os.mkdir("pfiles")
  205 + except:
  206 + pass
  207 + os.system("cp -r ../src/*/*.par pfiles/")
  208 + os.environ['PFILES'] = "pfiles"
  209 +
  210 + # Remove any existing result files
  211 + list = [glob.glob("*.fits"), glob.glob("*.log"), glob.glob("*.xml")]
  212 + for files in list:
  213 + for file in files:
  214 + os.remove(file)
  215 +
  216 + # Save intermediate results on disk
  217 + sys.stdout.write("Test executable analysis: ")
  218 + pipeline_v1()
  219 + print(" ok")
  220 +
  221 + # Keep results in memory
  222 + sys.stdout.write("Test in-memory analysis: ")
  223 + err = pipeline_v2()
  224 + if err == 0:
  225 + print(" ok")
  226 + else:
  227 + print(" NOK")
  228 +
  229 + # Test diffuse map cube with constant spectrum
  230 + sys.stdout.write("Test diffuse map cube with constant analysis: ")
  231 + ref = {'CTABackgroundModel': {'Value': 1.03547}}
  232 + err = pipeline_v2(model_name="data/model_background_cube_const.xml", \
  233 + ra_sim=84.17263, dec_sim=22.01444, rad_sim=2.0, \
  234 + ra_select=83.80, dec_select=22.20, rad_select=1.0, \
  235 + tstart=0.0, tstop=1.0, \
  236 + emin=0.3, emax=8.0, \
  237 + ref=ref)
  238 + if err == 0:
  239 + print(" ok")
  240 + else:
  241 + print(" NOK")
  242 +
  243 + # Test diffuse map cube with power law spectrum
  244 + sys.stdout.write("Test diffuse map cube with power law analysis: ")
  245 + ref = {'CTABackgroundModel': {'Prefactor': 1.02396, 'Index': -0.00710087}}
  246 + err = pipeline_v2(model_name="data/model_background_cube.xml", \
  247 + ra_sim=84.17263, dec_sim=22.01444, rad_sim=2.0, \
  248 + ra_select=84.00, dec_select=22.20, rad_select=1.0, \
  249 + tstart=0.0, tstop=1.0, \
  250 + emin=0.3, emax=8.0, \
  251 + ref=ref)
  252 + if err == 0:
  253 + print(" ok")
  254 + else:
  255 + print(" NOK")
203 256  
204   - # Keep results in memory
205   - sys.stdout.write("Test in-memory analysis: ")
206   - pipeline_v2()
207   - sys.stdout.write(" ok\n")
... ...