Commit 89cecd4a8dc4bbe61de2d555f061ade20cec803b

Authored by Jürgen Knödlseder
1 parent 145877c4

Adapt to new GCaldb interface.

A new logic has been implemented concerning the caldb parameter. If the name specified by caldb is a directory, the directory is set as the root directory of the calibration database. The file specified by irf must then be a file provided within this root directory.

If the name is not a directory it is used as the mission name that is used to build the calibration directory path. The irf is then the response name.
scripts/cspull.py
... ... @@ -2,7 +2,7 @@
2 2 # ==========================================================================
3 3 # This script generates the pull distribution for all model parameters.
4 4 #
5   -# Copyright (C) 2011-2013 Juergen Knoedlseder
  5 +# Copyright (C) 2011-2014 Juergen Knoedlseder
6 6 #
7 7 # This program is free software: you can redistribute it and/or modify
8 8 # it under the terms of the GNU General Public License as published by
... ... @@ -97,7 +97,7 @@ class cspull(GApplication):
97 97 pars.append(GApplicationPar("srcmdl","f","a","$GAMMALIB/share/models/crab.xml","","","Source model"))
98 98 pars.append(GApplicationPar("outfile","f","a","pull.dat","","","Output file name"))
99 99 pars.append(GApplicationPar("ntrials","i","a","10","","","Number of trials"))
100   - pars.append(GApplicationPar("caldb","s","a","$GAMMALIB/share/caldb/cta","","","Calibration database"))
  100 + pars.append(GApplicationPar("caldb","s","h","","","","Calibration database"))
101 101 pars.append(GApplicationPar("irf","s","a","cta_dummy_irf","","","Instrument response function"))
102 102 pars.append(GApplicationPar("ra","r","a","83.6331","0","360","RA of pointing (deg)"))
103 103 pars.append(GApplicationPar("dec","r","a","22.0145","-90","90","Dec of pointing (deg)"))
... ...
scripts/obsutils.py
... ... @@ -2,7 +2,7 @@
2 2 # This script provides a number of functions that are useful for handling
3 3 # CTA observations.
4 4 #
5   -# Copyright (C) 2011-2013 Juergen Knoedlseder
  5 +# Copyright (C) 2011-2014 Juergen Knoedlseder
6 6 #
7 7 # This program is free software: you can redistribute it and/or modify
8 8 # it under the terms of the GNU General Public License as published by
... ... @@ -18,136 +18,136 @@
18 18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 19 #
20 20 # ==========================================================================
21   -from ctools import *
22   -from gammalib import *
  21 +import ctools
  22 +import gammalib
23 23  
24 24  
25 25 # ===================== #
26 26 # Simulate observations #
27 27 # ===================== #
28 28 def sim(obs, log=False, debug=False, seed=0, nbins=0, binsz=0.05, npix=200):
29   - """
30   - Simulate events for all observations in the container.
31   -
32   - Parameters:
33   - obs - Observation container
34   - Keywords:
35   - log - Create log file(s)
36   - debug - Create screen dump
37   - seed - Seed value for simulations (default: 0)
38   - nbins - Number of energy bins (default: 0=unbinned)
39   - binsz - Pixel size for binned simulation (deg/pixel)
40   - npix - Number of pixels in X and Y for binned simulation
41   - """
42   - # Allocate ctobssim application and set parameters
43   - sim = ctobssim(obs)
44   - sim['seed'].integer(seed)
45   -
46   - # Optionally open the log file
47   - if log:
48   - sim.logFileOpen()
  29 + """
  30 + Simulate events for all observations in the container.
  31 +
  32 + Parameters:
  33 + obs - Observation container
  34 + Keywords:
  35 + log - Create log file(s)
  36 + debug - Create screen dump
  37 + seed - Seed value for simulations (default: 0)
  38 + nbins - Number of energy bins (default: 0=unbinned)
  39 + binsz - Pixel size for binned simulation (deg/pixel)
  40 + npix - Number of pixels in X and Y for binned simulation
  41 + """
  42 + # Allocate ctobssim application and set parameters
  43 + sim = ctools.ctobssim(obs)
  44 + sim['seed'].integer(seed)
  45 +
  46 + # Optionally open the log file
  47 + if log:
  48 + sim.logFileOpen()
49 49  
50   - # Optionally switch-on debugging model
51   - if debug:
52   - sim["debug"].boolean(True)
53   -
54   - # Run ctobssim application. This will loop over all observations in the
55   - # container and simulation the events for each observation. Note that
56   - # events are not added together, they still apply to each observation
57   - # separately.
58   - sim.run()
59   -
60   - # Binned option?
61   - if nbins > 0:
62   -
63   - # Determine common energy boundaries for observations
64   - emin = None
65   - emax = None
66   - for run in sim.obs():
67   - run_emin = run.events().ebounds().emin().TeV()
68   - run_emax = run.events().ebounds().emax().TeV()
69   - if emin == None:
70   - emin = run_emin
71   - elif run_emin > emin:
72   - emin = run_emin
73   - if emax == None:
74   - emax = run_emax
75   - elif run_emax > emax:
76   - emax = run_emax
77   -
78   - # Allocate ctbin application and set parameters
79   - bin = ctbin(sim.obs())
80   - bin["ebinalg"].string("LOG")
81   - bin["emin"].real(emin)
82   - bin["emax"].real(emax)
83   - bin["enumbins"].integer(nbins)
84   - bin["usepnt"].boolean(True) # Use pointing for map centre
85   - bin["nxpix"].integer(npix)
86   - bin["nypix"].integer(npix)
87   - bin["binsz"].real(binsz)
88   - bin["coordsys"].string("GAL")
89   - bin["proj"].string("TAN")
90   -
91   - # Optionally open the log file
92   - if log:
93   - bin.logFileOpen()
  50 + # Optionally switch-on debugging model
  51 + if debug:
  52 + sim["debug"].boolean(True)
  53 +
  54 + # Run ctobssim application. This will loop over all observations in the
  55 + # container and simulation the events for each observation. Note that
  56 + # events are not added together, they still apply to each observation
  57 + # separately.
  58 + sim.run()
  59 +
  60 + # Binned option?
  61 + if nbins > 0:
  62 +
  63 + # Determine common energy boundaries for observations
  64 + emin = None
  65 + emax = None
  66 + for run in sim.obs():
  67 + run_emin = run.events().ebounds().emin().TeV()
  68 + run_emax = run.events().ebounds().emax().TeV()
  69 + if emin == None:
  70 + emin = run_emin
  71 + elif run_emin > emin:
  72 + emin = run_emin
  73 + if emax == None:
  74 + emax = run_emax
  75 + elif run_emax > emax:
  76 + emax = run_emax
  77 +
  78 + # Allocate ctbin application and set parameters
  79 + bin = ctools.ctbin(sim.obs())
  80 + bin["ebinalg"].string("LOG")
  81 + bin["emin"].real(emin)
  82 + bin["emax"].real(emax)
  83 + bin["enumbins"].integer(nbins)
  84 + bin["usepnt"].boolean(True) # Use pointing for map centre
  85 + bin["nxpix"].integer(npix)
  86 + bin["nypix"].integer(npix)
  87 + bin["binsz"].real(binsz)
  88 + bin["coordsys"].string("GAL")
  89 + bin["proj"].string("TAN")
  90 +
  91 + # Optionally open the log file
  92 + if log:
  93 + bin.logFileOpen()
94 94  
95   - # Optionally switch-on debugging model
96   - if debug:
97   - bin["debug"].boolean(True)
  95 + # Optionally switch-on debugging model
  96 + if debug:
  97 + bin["debug"].boolean(True)
98 98  
99   - # Run ctbin application. This will loop over all observations in
100   - # the container and bin the events in counts maps
101   - bin.run()
102   -
103   - # Make a deep copy of the observation that will be returned
104   - # (the ctbin object will go out of scope one the function is
105   - # left)
106   - obs = bin.obs().copy()
107   -
108   - else:
109   -
110   - # Make a deep copy of the observation that will be returned
111   - # (the ctobssim object will go out of scope one the function is
112   - # left)
113   - obs = sim.obs().copy()
  99 + # Run ctbin application. This will loop over all observations in
  100 + # the container and bin the events in counts maps
  101 + bin.run()
  102 +
  103 + # Make a deep copy of the observation that will be returned
  104 + # (the ctbin object will go out of scope one the function is
  105 + # left)
  106 + obs = bin.obs().copy()
  107 +
  108 + else:
  109 +
  110 + # Make a deep copy of the observation that will be returned
  111 + # (the ctobssim object will go out of scope one the function is
  112 + # left)
  113 + obs = sim.obs().copy()
114 114  
115   - # Delete the simulation
116   - del sim
117   -
118   - # Return observation container
119   - return obs
  115 + # Delete the simulation
  116 + del sim
  117 +
  118 + # Return observation container
  119 + return obs
120 120  
121 121  
122 122 # ================ #
123 123 # Fit observations #
124 124 # ================ #
125 125 def fit(obs, log=False, debug=False):
126   - """
127   - Perform maximum likelihood fitting of observations in the container.
128   -
129   - Parameters:
130   - obs - Observation container
131   - Keywords:
132   - log - Create log file(s)
133   - debug - Create screen dump
134   - """
135   - # Allocate ctlike application
136   - like = ctlike(obs)
137   -
138   - # Optionally open the log file
139   - if log:
140   - like.logFileOpen()
141   -
142   - # Optionally switch-on debugging model
143   - if debug:
144   - like["debug"].boolean(True)
  126 + """
  127 + Perform maximum likelihood fitting of observations in the container.
  128 +
  129 + Parameters:
  130 + obs - Observation container
  131 + Keywords:
  132 + log - Create log file(s)
  133 + debug - Create screen dump
  134 + """
  135 + # Allocate ctlike application
  136 + like = ctools.ctlike(obs)
  137 +
  138 + # Optionally open the log file
  139 + if log:
  140 + like.logFileOpen()
  141 +
  142 + # Optionally switch-on debugging model
  143 + if debug:
  144 + like["debug"].boolean(True)
145 145  
146   - # Run ctlike application.
147   - like.run()
148   -
149   - # Return observations
150   - return like
  146 + # Run ctlike application.
  147 + like.run()
  148 +
  149 + # Return observations
  150 + return like
151 151  
152 152  
153 153 # ================= #
... ... @@ -155,45 +155,45 @@ def fit(obs, log=False, debug=False):
155 155 # ================= #
156 156 def cntmap(obs, proj="TAN", coord="GAL", xval=0.0, yval=0.0, \
157 157 binsz=0.05, nxpix=200, nypix=200, \
158   - outname="cntmap.fits"):
159   - """
160   - Creates a counts map by combining the events of all observations.
161   - The counts map will be a summed map over all energies.
162   -
163   - Parameters:
164   - obs - Observation container
165   - Keywords:
166   - proj - Projection type (e.g. TAN, CAR, STG, ...) (default: TAN)
167   - coord - Coordinate type (GAL, CEL) (default: GAL)
168   - xval - Reference longitude value [deg] (default: 0.0)
169   - yval - Reference latitude value [deg] (default: 0.0)
170   - binsz - Pixel size [deg/pixel] (default: 0.05)
171   - nxpix - Number of pixels in X direction (default: 200)
172   - nypix - Number of pixels in Y direction (default: 200)
173   - outname - Counts map FITS filename (default: cntmap.fits)
174   - """
175   - # Allocate counts map
176   - map = GSkymap(proj, coord, xval, yval, -binsz, binsz, nxpix, nypix, 1)
177   -
178   - # Fill all observations
179   - for run in obs:
180   -
181   - # Loop over all events
182   - for event in run.events():
183   -
184   - # Determine sky pixel
185   - skydir = GCTAInstDir(event.dir()).dir()
186   - pixel = map.dir2inx(skydir)
187   -
188   - # Set pixel
189   - map[pixel] += 1.0
190   -
191   - # Save sky map. The clobber flag is set to True, so any existing FITS
192   - # file will be overwritten.
193   - map.save(outname, True)
194   -
195   - # Return counts map
196   - return map
  158 + outname="cntmap.fits"):
  159 + """
  160 + Creates a counts map by combining the events of all observations.
  161 + The counts map will be a summed map over all energies.
  162 +
  163 + Parameters:
  164 + obs - Observation container
  165 + Keywords:
  166 + proj - Projection type (e.g. TAN, CAR, STG, ...) (default: TAN)
  167 + coord - Coordinate type (GAL, CEL) (default: GAL)
  168 + xval - Reference longitude value [deg] (default: 0.0)
  169 + yval - Reference latitude value [deg] (default: 0.0)
  170 + binsz - Pixel size [deg/pixel] (default: 0.05)
  171 + nxpix - Number of pixels in X direction (default: 200)
  172 + nypix - Number of pixels in Y direction (default: 200)
  173 + outname - Counts map FITS filename (default: cntmap.fits)
  174 + """
  175 + # Allocate counts map
  176 + map = gammalib.GSkymap(proj, coord, xval, yval, -binsz, binsz, nxpix, nypix, 1)
  177 +
  178 + # Fill all observations
  179 + for run in obs:
  180 +
  181 + # Loop over all events
  182 + for event in run.events():
  183 +
  184 + # Determine sky pixel
  185 + skydir = gammalib.GCTAInstDir(event.dir()).dir()
  186 + pixel = map.dir2inx(skydir)
  187 +
  188 + # Set pixel
  189 + map[pixel] += 1.0
  190 +
  191 + # Save sky map. The clobber flag is set to True, so any existing FITS
  192 + # file will be overwritten.
  193 + map.save(outname, True)
  194 +
  195 + # Return counts map
  196 + return map
197 197  
198 198  
199 199 # ================ #
... ... @@ -202,63 +202,63 @@ def cntmap(obs, proj=&quot;TAN&quot;, coord=&quot;GAL&quot;, xval=0.0, yval=0.0, \
202 202 def modmap(obs, eref=0.1, proj="TAN", coord="GAL", xval=0.0, yval=0.0, \
203 203 binsz=0.05, nxpix=200, nypix=200, \
204 204 outname="modmap.fits"):
205   - """
206   - Make model map for a given reference energy by combining all observations.
207   - The model map will be evaluated for a given reference energy 'eref' and will
208   - be given in units of [counts/(sr MeV s)].
209   -
210   - Parameters:
211   - obs - Observation container
212   - Keywords:
213   - eref - Reference energy for which model is created [TeV] (default: 0.1)
214   - proj - Projection type (e.g. TAN, CAR, STG, ...) (default: TAN)
215   - coord - Coordinate type (GAL, CEL) (default: GAL)
216   - xval - Reference longitude value [deg] (default: 0.0)
217   - yval - Reference latitude value [deg] (default: 0.0)
218   - binsz - Pixel size [deg/pixel] (default: 0.05)
219   - nxpix - Number of pixels in X direction (default: 200)
220   - nypix - Number of pixels in Y direction (default: 200)
221   - outname - Model map FITS filename (default: modmap.fits)
222   - """
223   - # Allocate model map
224   - map = GSkymap(proj, coord, xval, yval, -binsz, binsz, nxpix, nypix, 1)
225   -
226   - # Set reference energy, time and direction. The time is not initialised and is
227   - # in fact not used (as the IRF is assumed to be time independent for now).
228   - # The sky direction is set later using the pixel values.
229   - energy = GEnergy()
230   - time = GTime()
231   - instdir = GCTAInstDir()
232   - energy.TeV(eref)
233   -
234   - # Loop over all map pixels
235   - for pixel in range(map.npix()):
236   -
237   - # Get sky direction
238   - skydir = map.inx2dir(pixel)
239   - instdir.dir(skydir)
240   -
241   - # Create event atom for map pixel
242   - atom = GCTAEventAtom()
243   - atom.dir(instdir)
244   - atom.energy(energy)
245   - atom.time(time)
246   -
247   - # Initialise model value
248   - value = 0.0
249   -
250   - # Loop over all observations
251   - for run in obs:
252   - value += obs.models().eval(atom, run)
253   -
254   - # Set map value
255   - map[pixel] = value
256   -
257   - # Save sky map
258   - map.save(outname, True)
259   -
260   - # Return model map
261   - return map
  205 + """
  206 + Make model map for a given reference energy by combining all observations.
  207 + The model map will be evaluated for a given reference energy 'eref' and will
  208 + be given in units of [counts/(sr MeV s)].
  209 +
  210 + Parameters:
  211 + obs - Observation container
  212 + Keywords:
  213 + eref - Reference energy for which model is created [TeV] (default: 0.1)
  214 + proj - Projection type (e.g. TAN, CAR, STG, ...) (default: TAN)
  215 + coord - Coordinate type (GAL, CEL) (default: GAL)
  216 + xval - Reference longitude value [deg] (default: 0.0)
  217 + yval - Reference latitude value [deg] (default: 0.0)
  218 + binsz - Pixel size [deg/pixel] (default: 0.05)
  219 + nxpix - Number of pixels in X direction (default: 200)
  220 + nypix - Number of pixels in Y direction (default: 200)
  221 + outname - Model map FITS filename (default: modmap.fits)
  222 + """
  223 + # Allocate model map
  224 + map = gammalib.GSkymap(proj, coord, xval, yval, -binsz, binsz, nxpix, nypix, 1)
  225 +
  226 + # Set reference energy, time and direction. The time is not initialised and is
  227 + # in fact not used (as the IRF is assumed to be time independent for now).
  228 + # The sky direction is set later using the pixel values.
  229 + energy = gammalib.GEnergy()
  230 + time = gammalib.GTime()
  231 + instdir = gammalib.GCTAInstDir()
  232 + energy.TeV(eref)
  233 +
  234 + # Loop over all map pixels
  235 + for pixel in range(map.npix()):
  236 +
  237 + # Get sky direction
  238 + skydir = map.inx2dir(pixel)
  239 + instdir.dir(skydir)
  240 +
  241 + # Create event atom for map pixel
  242 + atom = gammalib.GCTAEventAtom()
  243 + atom.dir(instdir)
  244 + atom.energy(energy)
  245 + atom.time(time)
  246 +
  247 + # Initialise model value
  248 + value = 0.0
  249 +
  250 + # Loop over all observations
  251 + for run in obs:
  252 + value += obs.models().eval(atom, run)
  253 +
  254 + # Set map value
  255 + map[pixel] = value
  256 +
  257 + # Save sky map
  258 + map.save(outname, True)
  259 +
  260 + # Return model map
  261 + return map
262 262  
263 263  
264 264 # ======================= #
... ... @@ -266,66 +266,73 @@ def modmap(obs, eref=0.1, proj=&quot;TAN&quot;, coord=&quot;GAL&quot;, xval=0.0, yval=0.0, \
266 266 # ======================= #
267 267 def set(pntdir, tstart=0.0, duration=1800.0, deadc=0.95, \
268 268 emin=0.1, emax=100.0, rad=5.0, \
269   - irf="cta_dummy_irf", caldb="$GAMMALIB/share/caldb/cta"):
270   - """
271   - Returns a single CTA observation. By looping over this function we can
272   - add CTA observations to the observation container.
273   -
274   - Parameters:
275   - pntdir - Pointing direction
276   - Keywords:
277   - tstart - Start time [seconds] (default: 0.0)
278   - duration - Duration of observation [seconds] (default: 1800.0)
279   - deadc - Deadtime correction factor (default: 0.95)
280   - emin - Minimum event energy [TeV] (default: 0.1)
281   - emax - Maximum event energy [TeV] (default: 100.0)
282   - rad - ROI radius used for analysis [deg] (default: 5.0)
283   - irf - Instrument response function (default: cta_dummy_irf)
284   - caldb - Calibration database path (default: $GAMMALIB/share/caldb/cta)
285   - """
286   - # Allocate CTA observation
287   - obs = GCTAObservation()
288   -
289   - # Set pointing direction
290   - pnt = GCTAPointing()
291   - pnt.dir(pntdir)
292   - obs.pointing(pnt)
293   -
294   - # Set ROI
295   - roi = GCTARoi()
296   - instdir = GCTAInstDir()
297   - instdir.dir(pntdir)
298   - roi.centre(instdir)
299   - roi.radius(rad)
300   -
301   - # Set GTI
302   - gti = GGti()
303   - start = GTime(tstart)
304   - stop = GTime(tstart+duration)
305   - gti.append(start, stop)
306   -
307   - # Set energy boundaries
308   - ebounds = GEbounds()
309   - e_min = GEnergy()
310   - e_max = GEnergy()
311   - e_min.TeV(emin)
312   - e_max.TeV(emax)
313   - ebounds.append(e_min, e_max)
  269 + irf="cta_dummy_irf", caldb=""):
  270 + """
  271 + Returns a single CTA observation. By looping over this function we can
  272 + add CTA observations to the observation container.
  273 +
  274 + Parameters:
  275 + pntdir - Pointing direction
  276 + Keywords:
  277 + tstart - Start time [seconds] (default: 0.0)
  278 + duration - Duration of observation [seconds] (default: 1800.0)
  279 + deadc - Deadtime correction factor (default: 0.95)
  280 + emin - Minimum event energy [TeV] (default: 0.1)
  281 + emax - Maximum event energy [TeV] (default: 100.0)
  282 + rad - ROI radius used for analysis [deg] (default: 5.0)
  283 + irf - Instrument response function (default: cta_dummy_irf)
  284 + caldb - Calibration database path (default: "")
  285 + """
  286 + # Allocate CTA observation
  287 + obs = gammalib.GCTAObservation()
314 288  
315   - # Allocate event list
316   - events = GCTAEventList()
317   - events.roi(roi)
318   - events.gti(gti)
319   - events.ebounds(ebounds)
320   - obs.events(events)
321   -
322   - # Set instrument response
323   - obs.response(irf, caldb)
324   -
325   - # Set ontime, livetime, and deadtime correction factor
326   - obs.ontime(duration)
327   - obs.livetime(duration*deadc)
328   - obs.deadc(deadc)
329   -
330   - # Return observation
331   - return obs
  289 + # Set calibration database
  290 + db = gammalib.GCaldb()
  291 + if (gammalib.dir_exists(caldb)):
  292 + db.dir(caldb)
  293 + else:
  294 + db.open("cta", caldb)
  295 +
  296 + # Set pointing direction
  297 + pnt = gammalib.GCTAPointing()
  298 + pnt.dir(pntdir)
  299 + obs.pointing(pnt)
  300 +
  301 + # Set ROI
  302 + roi = gammalib.GCTARoi()
  303 + instdir = gammalib.GCTAInstDir()
  304 + instdir.dir(pntdir)
  305 + roi.centre(instdir)
  306 + roi.radius(rad)
  307 +
  308 + # Set GTI
  309 + gti = gammalib.GGti()
  310 + start = gammalib.GTime(tstart)
  311 + stop = gammalib.GTime(tstart+duration)
  312 + gti.append(start, stop)
  313 +
  314 + # Set energy boundaries
  315 + ebounds = gammalib.GEbounds()
  316 + e_min = gammalib.GEnergy()
  317 + e_max = gammalib.GEnergy()
  318 + e_min.TeV(emin)
  319 + e_max.TeV(emax)
  320 + ebounds.append(e_min, e_max)
  321 +
  322 + # Allocate event list
  323 + events = gammalib.GCTAEventList()
  324 + events.roi(roi)
  325 + events.gti(gti)
  326 + events.ebounds(ebounds)
  327 + obs.events(events)
  328 +
  329 + # Set instrument response
  330 + obs.response(irf, db)
  331 +
  332 + # Set ontime, livetime, and deadtime correction factor
  333 + obs.ontime(duration)
  334 + obs.livetime(duration*deadc)
  335 + obs.deadc(deadc)
  336 +
  337 + # Return observation
  338 + return obs
... ...
src/ctlike/ctlike.cpp
1 1 /***************************************************************************
2 2 * ctlike - CTA maximum likelihood tool *
3 3 * ----------------------------------------------------------------------- *
4   - * copyright (C) 2010-2013 by Juergen Knoedlseder *
  4 + * copyright (C) 2010-2014 by Juergen Knoedlseder *
5 5 * ----------------------------------------------------------------------- *
6 6 * *
7 7 * This program is free software: you can redistribute it and/or modify *
... ... @@ -361,8 +361,20 @@ void ctlike::get_parameters(void)
361 361 // Set statistics
362 362 obs.statistics(m_stat);
363 363  
  364 + // Set calibration database. If specified parameter is a
  365 + // directory then use this as the pathname to the calibration
  366 + // database. Otherwise interpret this as the instrument name,
  367 + // the mission being "cta"
  368 + GCaldb caldb;
  369 + if (gammalib::dir_exists(m_caldb)) {
  370 + caldb.dir(m_caldb);
  371 + }
  372 + else {
  373 + caldb.open("cta", m_caldb);
  374 + }
  375 +
364 376 // Set reponse
365   - obs.response(m_irf, m_caldb);
  377 + obs.response(m_irf, caldb);
366 378  
367 379 // Append observation to container
368 380 m_obs.append(obs);
... ...
src/ctlike/ctlike.par
... ... @@ -20,7 +20,7 @@
20 20 infile, f, a, "test/data/crab_events.fits.gz",,,"Event list, counts map or observation definition file"
21 21 stat, s, h, "POISSON",,, "Optimization statistics"
22 22 refit, b, h, no,,, "Do refitting?"
23   -caldb, s, a, "test/irf",,, "Calibration database"
  23 +caldb, s, h, "",,, "Calibration database"
24 24 irf, s, a, "cta_dummy_irf",,, "Instrument response function"
25 25 srcmdl, f, a, "test/data/crab.xml",,, "Source model"
26 26 outmdl, f, a, "crab_results.xml",,, "Source model output file"
... ...
src/ctmodel/ctmodel.cpp
... ... @@ -581,7 +581,21 @@ void ctmodel::setup_obs(void)
581 581  
582 582 // Set response if it isn't set already
583 583 if (obs->response().aeff() == NULL) {
584   - obs->response(m_irf, m_caldb);
  584 +
  585 + // Set calibration database. If specified parameter is a
  586 + // directory then use this as the pathname to the calibration
  587 + // database. Otherwise interpret this as the instrument name,
  588 + // the mission being "cta"
  589 + GCaldb caldb;
  590 + if (gammalib::dir_exists(m_caldb)) {
  591 + caldb.dir(m_caldb);
  592 + }
  593 + else {
  594 + caldb.open("cta", m_caldb);
  595 + }
  596 +
  597 + // Set reponse
  598 + obs->response(m_irf, caldb);
585 599  
586 600 } // endif: observation already has a response
587 601  
... ...
src/ctmodel/ctmodel.par
... ... @@ -20,7 +20,7 @@
20 20 infile, f, a, "NONE",,, "Input counts map or observation definition file"
21 21 outfile, f, a, "modmap.fits",,, "Output counts map or observation definition file"
22 22 prefix, s, h, "modmap_",,, "Prefix for counts maps in observation definition file"
23   -caldb, s, a, "test/irf",,, "Calibration database"
  23 +caldb, s, h, "",,, "Calibration database"
24 24 irf, s, a, "cta_dummy_irf",,, "Instrument response function"
25 25 srcmdl, f, a, "test/data/crab.xml",,, "Source model"
26 26 #
... ...
src/ctobssim/ctobssim.cpp
... ... @@ -432,9 +432,21 @@ void ctobssim::get_parameters(void)
432 432 // Allocate CTA observation
433 433 GCTAObservation obs;
434 434  
  435 + // Set calibration database. If specified parameter is a directory
  436 + // then use this as the pathname to the calibration database. Other-
  437 + // wise interpret this as the instrument name, the mission being
  438 + // "cta"
  439 + GCaldb caldb;
  440 + if (gammalib::dir_exists(m_caldb)) {
  441 + caldb.dir(m_caldb);
  442 + }
  443 + else {
  444 + caldb.open("cta", m_caldb);
  445 + }
  446 +
435 447 // Set CTA observation attributes
436 448 obs.pointing(pnt);
437   - obs.response(m_irf, m_caldb);
  449 + obs.response(m_irf, caldb);
438 450  
439 451 // Set event list (queries remaining parameters)
440 452 set_list(&obs);
... ...