Commit e285d731fa0bab30ce5ebc04237ff920687edb1d
1 parent
5003e285
Use obsutils module and adapt to Python 3.
Showing
1 changed file
with
35 additions
and
220 deletions
test/example_survey.py
| ... | ... | @@ -3,7 +3,7 @@ |
| 3 | 3 | # This script simulates CTA surveys. It can be considered as the master |
| 4 | 4 | # script for CTA science simulations. Please modify as needed. |
| 5 | 5 | # |
| 6 | -# Copyright (C) 2011 Jurgen Knodlseder | |
| 6 | +# Copyright (C) 2011-2012 Jurgen Knodlseder | |
| 7 | 7 | # |
| 8 | 8 | # This program is free software: you can redistribute it and/or modify |
| 9 | 9 | # it under the terms of the GNU General Public License as published by |
| ... | ... | @@ -25,6 +25,7 @@ from math import * |
| 25 | 25 | import os |
| 26 | 26 | import glob |
| 27 | 27 | import sys |
| 28 | +import obsutils | |
| 28 | 29 | |
| 29 | 30 | |
| 30 | 31 | # =========== # |
| ... | ... | @@ -47,9 +48,9 @@ def plot_counts(obs): |
| 47 | 48 | styles = ['b-', 'g-', 'y-', 'n-'] |
| 48 | 49 | |
| 49 | 50 | # Dump header |
| 50 | - print "" | |
| 51 | - print "Make plots (using matplotlib):" | |
| 52 | - print "==============================" | |
| 51 | + print("") | |
| 52 | + print("Make plots (using matplotlib):") | |
| 53 | + print("==============================") | |
| 53 | 54 | |
| 54 | 55 | # Create figure 1 |
| 55 | 56 | plt.figure(1,figsize=(12,6)) |
| ... | ... | @@ -63,7 +64,7 @@ def plot_counts(obs): |
| 63 | 64 | for run in obs: |
| 64 | 65 | |
| 65 | 66 | # Get event list |
| 66 | - list = cast_GCTAEventList(run.events()) | |
| 67 | + list = run.events() | |
| 67 | 68 | |
| 68 | 69 | # Create energy axis |
| 69 | 70 | ebounds = GEbounds() |
| ... | ... | @@ -75,9 +76,9 @@ def plot_counts(obs): |
| 75 | 76 | energy = [ebounds.elogmean(i).TeV() for i in range(ebounds.size())] |
| 76 | 77 | |
| 77 | 78 | # Create spectrum |
| 78 | - print "Extract data:" | |
| 79 | + print("Extract data:") | |
| 79 | 80 | counts = [0.0 for i in range(ebounds.size())] |
| 80 | - print list.size() | |
| 81 | + print(list.size()) | |
| 81 | 82 | for atom in list: |
| 82 | 83 | index = ebounds.index(atom.energy()) |
| 83 | 84 | counts[index] = counts[index] + 1.0 |
| ... | ... | @@ -90,10 +91,10 @@ def plot_counts(obs): |
| 90 | 91 | #plt.errorbar(energy, counts, error, fmt=None, ecolor='r') |
| 91 | 92 | |
| 92 | 93 | # Extract models |
| 93 | - print "Extract models:" | |
| 94 | + print("Extract models:") | |
| 94 | 95 | sum_model = [0.0 for i in range(ebounds.size())] |
| 95 | 96 | for k, m in enumerate(obs.models()): |
| 96 | - print "- "+m.name() | |
| 97 | + print("- "+m.name()) | |
| 97 | 98 | model = [0.0 for i in range(ebounds.size())] |
| 98 | 99 | for atom in list: |
| 99 | 100 | index = ebounds.index(atom.energy()) |
| ... | ... | @@ -120,11 +121,11 @@ def plot_counts(obs): |
| 120 | 121 | # Loop over observations |
| 121 | 122 | for run in obs: |
| 122 | 123 | |
| 123 | - # Get event cube | |
| 124 | - list = cast_GCTAEventList(run.events()) | |
| 124 | + # Get event list | |
| 125 | + list = run.events() | |
| 125 | 126 | |
| 126 | 127 | # Create offset histogram |
| 127 | - print "Extract data:" | |
| 128 | + print("Extract data:") | |
| 128 | 129 | nx = 30 |
| 129 | 130 | doffset2 = 0.01 |
| 130 | 131 | offset2 = [(i+0.5)*doffset2 for i in range(nx)] |
| ... | ... | @@ -143,10 +144,10 @@ def plot_counts(obs): |
| 143 | 144 | #plt.semilogy(offset2, counts, 'ro', label='data') |
| 144 | 145 | |
| 145 | 146 | # Extract models |
| 146 | - print "Extract models:" | |
| 147 | + print("Extract models:") | |
| 147 | 148 | sum_model = [0.0 for i in range(nx)] |
| 148 | 149 | for k, m in enumerate(obs.models()): |
| 149 | - print "- "+m.name() | |
| 150 | + print("- "+m.name()) | |
| 150 | 151 | model = [0.0 for i in range(nx)] |
| 151 | 152 | for atom in list: |
| 152 | 153 | off = atom.dir().dist_deg(crab) |
| ... | ... | @@ -170,200 +171,12 @@ def plot_counts(obs): |
| 170 | 171 | plt.show() |
| 171 | 172 | |
| 172 | 173 | except ImportError: |
| 173 | - print "Matplotlib is not (correctly) installed on your system." | |
| 174 | + print("Matplotlib is not (correctly) installed on your system.") | |
| 174 | 175 | |
| 175 | 176 | # Return |
| 176 | 177 | return |
| 177 | 178 | |
| 178 | 179 | |
| 179 | -# ===================== # | |
| 180 | -# Simulate observations # | |
| 181 | -# ===================== # | |
| 182 | -def sim_obs(obs): | |
| 183 | - """ | |
| 184 | - Simulate events for all observations in the container. | |
| 185 | - """ | |
| 186 | - # Simulate events | |
| 187 | - sim = ctobssim(obs) | |
| 188 | - sim.logFileOpen() # We need this to explicitely open the log file in Python mode | |
| 189 | - sim.run() | |
| 190 | - | |
| 191 | - # Extract copy of observations (we need a copy here as sim goes out of | |
| 192 | - # scope once we leave the function) | |
| 193 | - obs = sim.obs().copy() | |
| 194 | - | |
| 195 | - # Return observations | |
| 196 | - return obs | |
| 197 | - | |
| 198 | - | |
| 199 | -# ================ # | |
| 200 | -# Fit observations # | |
| 201 | -# ================ # | |
| 202 | -def fit_obs(obs): | |
| 203 | - """ | |
| 204 | - Perform maximum likelihood fitting of observations. | |
| 205 | - """ | |
| 206 | - # Perform maximum likelihood fitting | |
| 207 | - like = ctlike(obs) | |
| 208 | - like.logFileOpen() # We need this to explicitely open the log file in Python mode | |
| 209 | - like.run() | |
| 210 | - | |
| 211 | - # Extract copy of observations (we need a copy here as like goes out of | |
| 212 | - # scope once we leave the function) | |
| 213 | - #obs = like.obs().copy() | |
| 214 | - | |
| 215 | - #print like.opt() | |
| 216 | - | |
| 217 | - # Return observations | |
| 218 | - return like | |
| 219 | - | |
| 220 | - | |
| 221 | -# ================= # | |
| 222 | -# Create counts map # | |
| 223 | -# ================= # | |
| 224 | -def make_counts_map(obs): | |
| 225 | - """ | |
| 226 | - Make counts map by combining the events of all observations. | |
| 227 | - """ | |
| 228 | - # Allocate counts map | |
| 229 | - nxpix = 600 | |
| 230 | - nypix = 200 | |
| 231 | - cntmap = GSkymap("CAR", "GAL", 0.0, 0.0, -0.05, 0.05, nxpix, nypix, 1) | |
| 232 | - | |
| 233 | - # Fill all observations | |
| 234 | - for run in obs: | |
| 235 | - | |
| 236 | - # Loop over all events | |
| 237 | - for event in run.events(): | |
| 238 | - | |
| 239 | - # Cast to CTA event | |
| 240 | - event = cast_GCTAEventAtom(event) | |
| 241 | - | |
| 242 | - # Determine sky pixel | |
| 243 | - skydir = event.dir().skydir() | |
| 244 | - pixel = cntmap.dir2pix(skydir) | |
| 245 | - | |
| 246 | - # Set pixel | |
| 247 | - cntmap[pixel] += 1.0 | |
| 248 | - | |
| 249 | - # Save sky map | |
| 250 | - cntmap.save("survey_cntmap.fits", True) | |
| 251 | - | |
| 252 | - # Return counts map | |
| 253 | - return cntmap | |
| 254 | - | |
| 255 | - | |
| 256 | -# ================ # | |
| 257 | -# Create model map # | |
| 258 | -# ================ # | |
| 259 | -def make_model_map(obs): | |
| 260 | - """ | |
| 261 | - Make model map by combining all observations. The map will | |
| 262 | - be in units of [counts/(sr MeV s)]. | |
| 263 | - """ | |
| 264 | - # Allocate model map | |
| 265 | - nxpix = 600 | |
| 266 | - nypix = 200 | |
| 267 | - modmap = GSkymap("CAR", "GAL", 0.0, 0.0, -0.05, 0.05, nxpix, nypix, 1) | |
| 268 | - | |
| 269 | - # Set energy and time | |
| 270 | - energy = GEnergy() | |
| 271 | - time = GTime() | |
| 272 | - instdir = GCTAInstDir() | |
| 273 | - energy.TeV(0.1) | |
| 274 | - | |
| 275 | - # Loop over all map pixels | |
| 276 | - for pixel in range(modmap.npix()): | |
| 277 | - | |
| 278 | - # Get sky direction | |
| 279 | - skydir = modmap.pix2dir(pixel) | |
| 280 | - instdir.skydir(skydir) | |
| 281 | - | |
| 282 | - # Create event atom for map pixel | |
| 283 | - atom = GCTAEventAtom() | |
| 284 | - atom.dir(instdir) | |
| 285 | - atom.energy(energy) | |
| 286 | - atom.time(time) | |
| 287 | - | |
| 288 | - # Initialise model value | |
| 289 | - value = 0.0 | |
| 290 | - | |
| 291 | - # Loop over all observations | |
| 292 | - for run in obs: | |
| 293 | - value += obs.models().eval(atom, run) | |
| 294 | - | |
| 295 | - # Set map value | |
| 296 | - modmap[pixel] = value | |
| 297 | - | |
| 298 | - # Save sky map | |
| 299 | - modmap.save("survey_modmap.fits", True) | |
| 300 | - | |
| 301 | - # Return model map | |
| 302 | - return modmap | |
| 303 | - | |
| 304 | - | |
| 305 | -# ======================= # | |
| 306 | -# Set one CTA observation # | |
| 307 | -# ======================= # | |
| 308 | -def set_one_obs(pntdir, tstart=0.0, duration=1800.0, emin=0.1, emax=100.0, rad=3.0, \ | |
| 309 | - irf="kb_E_50h_v3", caldb="irf"): | |
| 310 | - """ | |
| 311 | - Parameters: | |
| 312 | - pntdir - Pointing direction | |
| 313 | - Keywords: | |
| 314 | - tstart - Start time (seconds) | |
| 315 | - duration - Duration of observation (seconds) | |
| 316 | - emin - Minimum event energy (TeV) | |
| 317 | - emax - Maximum event energy (TeV) | |
| 318 | - rad - ROI radius (deg) | |
| 319 | - irf - Instrument response function | |
| 320 | - caldb - Calibration database path | |
| 321 | - """ | |
| 322 | - # Allocate CTA observation | |
| 323 | - obs = GCTAObservation() | |
| 324 | - | |
| 325 | - # Set pointing direction | |
| 326 | - pnt = GCTAPointing() | |
| 327 | - pnt.dir(pntdir) | |
| 328 | - obs.pointing(pnt) | |
| 329 | - | |
| 330 | - # Set ROI | |
| 331 | - roi = GCTARoi() | |
| 332 | - instdir = GCTAInstDir() | |
| 333 | - instdir.skydir(pntdir) | |
| 334 | - roi.centre(instdir) | |
| 335 | - roi.radius(rad) | |
| 336 | - | |
| 337 | - # Set GTI | |
| 338 | - gti = GGti() | |
| 339 | - start = GTime() | |
| 340 | - stop = GTime() | |
| 341 | - start.met(tstart) | |
| 342 | - stop.met(tstart+duration) | |
| 343 | - gti.append(start, stop) | |
| 344 | - | |
| 345 | - # Set energy boundaries | |
| 346 | - ebounds = GEbounds() | |
| 347 | - e_min = GEnergy() | |
| 348 | - e_max = GEnergy() | |
| 349 | - e_min.TeV(emin) | |
| 350 | - e_max.TeV(emax) | |
| 351 | - ebounds.append(e_min, e_max) | |
| 352 | - | |
| 353 | - # Allocate event list | |
| 354 | - events = GCTAEventList() | |
| 355 | - events.roi(roi) | |
| 356 | - events.gti(gti) | |
| 357 | - events.ebounds(ebounds) | |
| 358 | - obs.events(events) | |
| 359 | - | |
| 360 | - # Set instrument response | |
| 361 | - obs.response(irf, caldb) | |
| 362 | - | |
| 363 | - # Return observation | |
| 364 | - return obs | |
| 365 | - | |
| 366 | - | |
| 367 | 180 | # ======================================== # |
| 368 | 181 | # Add CTA background model to observations # |
| 369 | 182 | # ======================================== # |
| ... | ... | @@ -428,7 +241,8 @@ def survey_single(): |
| 428 | 241 | # Set single pointing at galactic centre |
| 429 | 242 | pntdir = GSkyDir() |
| 430 | 243 | pntdir.lb_deg(0.0, 0.0) |
| 431 | - run = set_one_obs(pntdir) | |
| 244 | + #run = set_one_obs(pntdir) | |
| 245 | + run = obsutils.set(pntdir) | |
| 432 | 246 | obs.append(run) |
| 433 | 247 | |
| 434 | 248 | # Define single point source with Crab flux at galactic centre |
| ... | ... | @@ -468,7 +282,8 @@ def survey_gplane(lrange=10, lstep=2): |
| 468 | 282 | # Set pointing |
| 469 | 283 | pntdir = GSkyDir() |
| 470 | 284 | pntdir.lb_deg(l, 0.0) |
| 471 | - run = set_one_obs(pntdir) | |
| 285 | + #run = set_one_obs(pntdir) | |
| 286 | + run = obsutils.set(pntdir) | |
| 472 | 287 | obs.append(run) |
| 473 | 288 | |
| 474 | 289 | # Define single point source with Crab flux at galactic centre |
| ... | ... | @@ -499,7 +314,7 @@ if __name__ == '__main__': |
| 499 | 314 | need_help = False |
| 500 | 315 | |
| 501 | 316 | # Test for command line arguments |
| 502 | - print sys.argv[0] | |
| 317 | + print(sys.argv[0]) | |
| 503 | 318 | if (len(sys.argv) > 1): |
| 504 | 319 | if sys.argv[1] == "-h": |
| 505 | 320 | need_help = True |
| ... | ... | @@ -508,14 +323,14 @@ if __name__ == '__main__': |
| 508 | 323 | |
| 509 | 324 | # Print help if needed and exit |
| 510 | 325 | if need_help: |
| 511 | - print "Usage: example_survey.py [OPTIONS]" | |
| 512 | - print " -h Display this usage message" | |
| 326 | + print("Usage: example_survey.py [OPTIONS]") | |
| 327 | + print(" -h Display this usage message") | |
| 513 | 328 | sys.exit() |
| 514 | 329 | |
| 515 | 330 | # Dump header |
| 516 | - print "**********************" | |
| 517 | - print "* Simulate CTA survey *" | |
| 518 | - print "**********************" | |
| 331 | + print("***********************") | |
| 332 | + print("* Simulate CTA survey *") | |
| 333 | + print("***********************") | |
| 519 | 334 | |
| 520 | 335 | # Remove any existing result files |
| 521 | 336 | list = [glob.glob("*.fits"), glob.glob("*.log"), glob.glob("*.xml")] |
| ... | ... | @@ -524,29 +339,29 @@ if __name__ == '__main__': |
| 524 | 339 | os.remove(file) |
| 525 | 340 | |
| 526 | 341 | # Setup single observation survey |
| 527 | - obs = survey_single() | |
| 342 | + #obs = survey_single() | |
| 528 | 343 | obs = survey_gplane() |
| 529 | 344 | |
| 530 | 345 | # Add background model |
| 531 | 346 | obs = add_background_model(obs) |
| 532 | 347 | |
| 533 | 348 | # Simulate events |
| 534 | - print "Simulate events" | |
| 535 | - obs = sim_obs(obs) | |
| 349 | + print("Simulate events") | |
| 350 | + obs = obsutils.sim(obs) | |
| 536 | 351 | |
| 537 | 352 | # Make counts map |
| 538 | - print "Make counts map" | |
| 539 | - cntmap = make_counts_map(obs) | |
| 353 | + print("Make counts map") | |
| 354 | + cntmap = obsutils.cntmap(obs) | |
| 540 | 355 | |
| 541 | 356 | # Fit observations |
| 542 | - print "Fit observatins" | |
| 543 | - like = fit_obs(obs) | |
| 357 | + print("Fit observatins") | |
| 358 | + like = obsutils.fit(obs) | |
| 544 | 359 | #print like.opt() |
| 545 | 360 | #print like.obs().models() |
| 546 | 361 | |
| 547 | 362 | # Make model map |
| 548 | - print "Make model map (this step will take some time)" | |
| 549 | - modmap = make_model_map(obs) | |
| 363 | + print("Make model map (this step will take some time)") | |
| 364 | + modmap = obsutils.modmap(obs) | |
| 550 | 365 | |
| 551 | 366 | # Show fit results |
| 552 | 367 | #plot_counts(like.obs()) | ... | ... |