Commit 97cd3d1c4a43099898a5c6856fd043ab0d0b5339
1 parent
7f487530
Implement multiple Test sources in comlixmap
Showing
1 changed file
with
53 additions
and
36 deletions
modules/comscripts/comlixmap.py
| ... | ... | @@ -41,6 +41,7 @@ class comlixmap(ctools.cslikelihood): |
| 41 | 41 | # Initialise members |
| 42 | 42 | self._maps = [] |
| 43 | 43 | self._map_names = [] |
| 44 | + self._srcnames = [] | |
| 44 | 45 | |
| 45 | 46 | # Return |
| 46 | 47 | return |
| ... | ... | @@ -58,11 +59,12 @@ class comlixmap(ctools.cslikelihood): |
| 58 | 59 | if self.obs().models().is_empty(): |
| 59 | 60 | self.obs().models(self['inmodel'].filename()) |
| 60 | 61 | |
| 61 | - # Get source name and check if source exists in model | |
| 62 | - srcname = self['srcname'].string() | |
| 63 | - if not self.obs().models().contains(srcname): | |
| 64 | - msg = 'Source "%s" not found in models.' % srcname | |
| 65 | - raise RuntimeError(msg) | |
| 62 | + # Get test source names and check if test sources exists in model | |
| 63 | + self._srcnames = self['srcname'].string().split(';') | |
| 64 | + for srcname in self._srcnames: | |
| 65 | + if not self.obs().models().contains(srcname): | |
| 66 | + msg = 'Source "%s" not found in models.' % srcname | |
| 67 | + raise RuntimeError(msg) | |
| 66 | 68 | |
| 67 | 69 | # Query parameters |
| 68 | 70 | self['like_accuracy'].real() |
| ... | ... | @@ -160,16 +162,20 @@ class comlixmap(ctools.cslikelihood): |
| 160 | 162 | nxpix = self['nxpix'].integer() |
| 161 | 163 | nypix = self['nypix'].integer() |
| 162 | 164 | |
| 163 | - # Compute number of free model parameters, exclusing 'RA' and 'DEC' | |
| 164 | - nfree = 0 | |
| 165 | - source = self.obs().models()[self['srcname'].string()] | |
| 166 | - for par in source: | |
| 167 | - if par.name() != 'RA' and par.name() != 'DEC' and par.is_free(): | |
| 168 | - self._map_names.append(par.name()) | |
| 169 | - nfree += 1 | |
| 165 | + # Initialise number of free parameters | |
| 166 | + nfree = 0 | |
| 167 | + | |
| 168 | + # Compute number of free model parameters for all test sources, | |
| 169 | + # exclusing 'RA' and 'DEC' | |
| 170 | + for srcname in self._srcnames: | |
| 171 | + source = self.obs().models()[srcname] | |
| 172 | + for par in source: | |
| 173 | + if par.name() != 'RA' and par.name() != 'DEC' and par.is_free(): | |
| 174 | + self._map_names.append(par.name()) | |
| 175 | + nfree += 1 | |
| 170 | 176 | |
| 171 | 177 | # Initialise sky maps |
| 172 | - for i in range(nfree+1): | |
| 178 | + for i in range(nfree+len(self._srcnames)): | |
| 173 | 179 | self._maps.append(gammalib.GSkyMap(proj, coordsys, xref, yref, |
| 174 | 180 | -binsz, binsz, nxpix, nypix)) |
| 175 | 181 | |
| ... | ... | @@ -192,15 +198,18 @@ class comlixmap(ctools.cslikelihood): |
| 192 | 198 | ts : float |
| 193 | 199 | TS of test source |
| 194 | 200 | """ |
| 195 | - # Set and fix position of test source | |
| 196 | - source = self.obs().models()[self['srcname'].string()] | |
| 197 | - source['RA'].value(dir.ra_deg()) | |
| 198 | - source['DEC'].value(dir.dec_deg()) | |
| 199 | - source['RA'].fix() | |
| 200 | - source['DEC'].fix() | |
| 201 | + # Loop over test source names | |
| 202 | + for srcname in self._srcnames: | |
| 201 | 203 | |
| 202 | - # Remove response cache for test source | |
| 203 | - self.obs().remove_response_cache(self['srcname'].string()) | |
| 204 | + # Set and fix position of test source | |
| 205 | + source = self.obs().models()[srcname] | |
| 206 | + source['RA'].value(dir.ra_deg()) | |
| 207 | + source['DEC'].value(dir.dec_deg()) | |
| 208 | + source['RA'].fix() | |
| 209 | + source['DEC'].fix() | |
| 210 | + | |
| 211 | + # Remove response cache for test source | |
| 212 | + self.obs().remove_response_cache(srcname) | |
| 204 | 213 | |
| 205 | 214 | # Get parameters and initialise some variables |
| 206 | 215 | niter = self['max_iter'].integer() |
| ... | ... | @@ -240,7 +249,9 @@ class comlixmap(ctools.cslikelihood): |
| 240 | 249 | ts = self._final_model_fit() |
| 241 | 250 | |
| 242 | 251 | # Log TS |
| 243 | - self._log_value(gammalib.NORMAL, 'TS value', ts) | |
| 252 | + for i, srcname in enumerate(self._srcnames): | |
| 253 | + key = 'TS %s' % srcname | |
| 254 | + self._log_value(gammalib.NORMAL, key, ts[i]) | |
| 244 | 255 | |
| 245 | 256 | # Return TS |
| 246 | 257 | return ts |
| ... | ... | @@ -261,8 +272,10 @@ class comlixmap(ctools.cslikelihood): |
| 261 | 272 | # Run ctlike |
| 262 | 273 | like.run() |
| 263 | 274 | |
| 264 | - # Recover TS for test source | |
| 265 | - ts = like.obs().models()[self['srcname'].string()].ts() | |
| 275 | + # Recover TS for all test sources | |
| 276 | + ts = [] | |
| 277 | + for srcname in self._srcnames: | |
| 278 | + ts.append(like.obs().models()[srcname].ts()) | |
| 266 | 279 | |
| 267 | 280 | # Return TS |
| 268 | 281 | return ts |
| ... | ... | @@ -289,9 +302,9 @@ class comlixmap(ctools.cslikelihood): |
| 289 | 302 | # Log header |
| 290 | 303 | self._log_header1(gammalib.NORMAL, 'Initialise models') |
| 291 | 304 | |
| 292 | - # Make sure that tscalc flag is only set for test source | |
| 305 | + # Make sure that tscalc flag is only set for test sources | |
| 293 | 306 | for source in self.obs().models(): |
| 294 | - if source.name() == self['srcname'].string(): | |
| 307 | + if source.name() in self._srcnames: | |
| 295 | 308 | source.tscalc(True) |
| 296 | 309 | else: |
| 297 | 310 | source.tscalc(False) |
| ... | ... | @@ -332,16 +345,18 @@ class comlixmap(ctools.cslikelihood): |
| 332 | 345 | # Compute TS |
| 333 | 346 | ts = self._compute_ts(dir) |
| 334 | 347 | |
| 335 | - # Store TS value in map | |
| 336 | - self._maps[0][ipix] = ts | |
| 348 | + # Store TS values in sky map | |
| 349 | + for i, value in enumerate(ts): | |
| 350 | + self._maps[i][ipix] = value | |
| 337 | 351 | |
| 338 | - # Extract fitted model parameters | |
| 339 | - ipar = 1 | |
| 340 | - source = self.obs().models()[self['srcname'].string()] | |
| 341 | - for par in source: | |
| 342 | - if par.name() != 'RA' and par.name() != 'DEC' and par.is_free(): | |
| 343 | - self._maps[ipar][ipix] = par.value() | |
| 344 | - ipar += 1 | |
| 352 | + # Store fitted model parameters in sky maps | |
| 353 | + ipar = len(ts) | |
| 354 | + for srcname in self._srcnames: | |
| 355 | + source = self.obs().models()[srcname] | |
| 356 | + for par in source: | |
| 357 | + if par.name() != 'RA' and par.name() != 'DEC' and par.is_free(): | |
| 358 | + self._maps[ipar][ipix] = par.value() | |
| 359 | + ipar += 1 | |
| 345 | 360 | |
| 346 | 361 | # Return |
| 347 | 362 | return |
| ... | ... | @@ -376,8 +391,10 @@ class comlixmap(ctools.cslikelihood): |
| 376 | 391 | map.write(fits) |
| 377 | 392 | |
| 378 | 393 | # Set extension name for all maps |
| 394 | + for i, srcname in enumerate(self._srcnames): | |
| 395 | + fits[i].extname(srcname) | |
| 379 | 396 | for i, name in enumerate(self._map_names): |
| 380 | - fits[i+1].extname(name) | |
| 397 | + fits[i+len(self._srcnames)].extname(name) | |
| 381 | 398 | |
| 382 | 399 | # Save FITS file |
| 383 | 400 | fits.saveto(outmap, self['clobber'].boolean()) | ... | ... |