Commit 8d250ac361c7ab3ff51c64e1cd3b601fca9bba21
1 parent
72aad6b0
Remove code duplication is cslightcrv and csphasecrv
Showing
4 changed files
with
116 additions
and
72 deletions
cscripts/cslightcrv.py
| ... | ... | @@ -22,6 +22,7 @@ import sys |
| 22 | 22 | import gammalib |
| 23 | 23 | import ctools |
| 24 | 24 | from cscripts import obsutils |
| 25 | +from cscripts import ioutils | |
| 25 | 26 | |
| 26 | 27 | |
| 27 | 28 | # ================ # |
| ... | ... | @@ -281,52 +282,24 @@ class cslightcrv(ctools.cscript): |
| 281 | 282 | table = gammalib.GFitsBinTable(nrows) |
| 282 | 283 | table.extname('LIGHTCURVE') |
| 283 | 284 | |
| 284 | - # Append time columns "MJD" and "e_MJD" | |
| 285 | - mjd = gammalib.GFitsTableDoubleCol('MJD', nrows) | |
| 286 | - e_mjd = gammalib.GFitsTableDoubleCol('e_MJD', nrows) | |
| 287 | - mjd.unit('days') | |
| 288 | - e_mjd.unit('days') | |
| 289 | - for i, result in enumerate(results): | |
| 290 | - mjd[i] = result['mjd'] | |
| 291 | - e_mjd[i] = result['e_mjd'] | |
| 292 | - table.append(mjd) | |
| 293 | - table.append(e_mjd) | |
| 294 | - | |
| 295 | - # Create parameter columns | |
| 296 | - for par in self._obs.models()[self._srcname]: | |
| 297 | - if par.is_free(): | |
| 298 | - name = par.name() | |
| 299 | - e_name = 'e_'+par.name() | |
| 300 | - col = gammalib.GFitsTableDoubleCol(name, nrows) | |
| 301 | - e_col = gammalib.GFitsTableDoubleCol(e_name, nrows) | |
| 302 | - col.unit(par.unit()) | |
| 303 | - e_col.unit(par.unit()) | |
| 304 | - for i, result in enumerate(results): | |
| 305 | - col[i] = result['values'][name] | |
| 306 | - e_col[i] = result['values'][e_name] | |
| 307 | - table.append(col) | |
| 308 | - table.append(e_col) | |
| 285 | + # Append time columns | |
| 286 | + ioutils.append_result_column(table, results, 'MJD', 'days', 'mjd') | |
| 287 | + ioutils.append_result_column(table, results, 'e_MJD', 'days', 'e_mjd') | |
| 288 | + | |
| 289 | + # Append parameter columns | |
| 290 | + ioutils.append_model_par_column(table, self._obs.models()[self._srcname], | |
| 291 | + results) | |
| 309 | 292 | |
| 310 | 293 | # Append Test Statistic column "TS" |
| 311 | - ts = gammalib.GFitsTableDoubleCol('TS', nrows) | |
| 312 | - for i, result in enumerate(results): | |
| 313 | - ts[i] = result['ts'] | |
| 314 | - table.append(ts) | |
| 315 | - | |
| 316 | - # Append upper limit column "UpperLimit" | |
| 317 | - ul_diff = gammalib.GFitsTableDoubleCol('DiffUpperLimit', nrows) | |
| 318 | - ul_flux = gammalib.GFitsTableDoubleCol('FluxUpperLimit', nrows) | |
| 319 | - ul_eflux = gammalib.GFitsTableDoubleCol('EFluxUpperLimit', nrows) | |
| 320 | - ul_diff.unit('ph/cm2/s/MeV') | |
| 321 | - ul_flux.unit('ph/cm2/s') | |
| 322 | - ul_eflux.unit('erg/cm2/s') | |
| 323 | - for i, result in enumerate(results): | |
| 324 | - ul_diff[i] = result['ul_diff'] | |
| 325 | - ul_flux[i] = result['ul_flux'] | |
| 326 | - ul_eflux[i] = result['ul_eflux'] | |
| 327 | - table.append(ul_diff) | |
| 328 | - table.append(ul_flux) | |
| 329 | - table.append(ul_eflux) | |
| 294 | + ioutils.append_result_column(table, results, 'TS', '', 'ts') | |
| 295 | + | |
| 296 | + # Append upper limit columns | |
| 297 | + ioutils.append_result_column(table, results, 'DiffUpperLimit', | |
| 298 | + 'ph/cm2/s/MeV', 'ul_diff') | |
| 299 | + ioutils.append_result_column(table, results, 'FluxUpperLimit', | |
| 300 | + 'ph/cm2/s', 'ul_flux') | |
| 301 | + ioutils.append_result_column(table, results, 'EFluxUpperLimit', | |
| 302 | + 'erg/cm2/s', 'ul_eflux') | |
| 330 | 303 | |
| 331 | 304 | # Return table |
| 332 | 305 | return table | ... | ... |
cscripts/csphasecrv.py
| ... | ... | @@ -22,6 +22,7 @@ import sys |
| 22 | 22 | import gammalib |
| 23 | 23 | import ctools |
| 24 | 24 | from cscripts import obsutils |
| 25 | +from cscripts import ioutils | |
| 25 | 26 | |
| 26 | 27 | |
| 27 | 28 | # ================ # |
| ... | ... | @@ -183,7 +184,7 @@ class csphasecrv(ctools.cscript): |
| 183 | 184 | |
| 184 | 185 | def _create_fits_table(self, results): |
| 185 | 186 | """ |
| 186 | - Creates FITS binary table containing light curve results | |
| 187 | + Creates FITS binary table containing phase curve results | |
| 187 | 188 | |
| 188 | 189 | Parameters |
| 189 | 190 | ---------- |
| ... | ... | @@ -193,7 +194,7 @@ class csphasecrv(ctools.cscript): |
| 193 | 194 | Returns |
| 194 | 195 | ------- |
| 195 | 196 | table : `~gammalib.GFitsBinTable` |
| 196 | - FITS binary table containing light curve | |
| 197 | + FITS binary table containing phase curve | |
| 197 | 198 | """ |
| 198 | 199 | # Determine number of rows in FITS table |
| 199 | 200 | nrows = len(results) |
| ... | ... | @@ -202,29 +203,13 @@ class csphasecrv(ctools.cscript): |
| 202 | 203 | table = gammalib.GFitsBinTable(nrows) |
| 203 | 204 | table.extname('PHASECURVE') |
| 204 | 205 | |
| 205 | - # Append phase columns "PHASE_MIN" and "PHASE_MAX" | |
| 206 | - phmin = gammalib.GFitsTableDoubleCol('PHASE_MIN', nrows) | |
| 207 | - phmax = gammalib.GFitsTableDoubleCol('PHASE_MAX', nrows) | |
| 208 | - for i, result in enumerate(results): | |
| 209 | - phmin[i] = result['phmin'] | |
| 210 | - phmax[i] = result['phmax'] | |
| 211 | - table.append(phmin) | |
| 212 | - table.append(phmax) | |
| 206 | + # Append phase columns | |
| 207 | + ioutils.append_result_column(table, results, 'PHASE_MIN', '', 'phmin') | |
| 208 | + ioutils.append_result_column(table, results, 'PHASE_MAX', '', 'phmax') | |
| 213 | 209 | |
| 214 | - # Create parameter columns | |
| 215 | - for par in self._obs.models()[self._srcname]: | |
| 216 | - if par.is_free(): | |
| 217 | - name = par.name() | |
| 218 | - e_name = 'e_'+par.name() | |
| 219 | - col = gammalib.GFitsTableDoubleCol(name, nrows) | |
| 220 | - e_col = gammalib.GFitsTableDoubleCol(e_name, nrows) | |
| 221 | - col.unit(par.unit()) | |
| 222 | - e_col.unit(par.unit()) | |
| 223 | - for i, result in enumerate(results): | |
| 224 | - col[i] = result['values'][name] | |
| 225 | - e_col[i] = result['values'][e_name] | |
| 226 | - table.append(col) | |
| 227 | - table.append(e_col) | |
| 210 | + # Append parameter columns | |
| 211 | + ioutils.append_model_par_column(table, self._obs.models()[self._srcname], | |
| 212 | + results) | |
| 228 | 213 | |
| 229 | 214 | # Return table |
| 230 | 215 | return table |
| ... | ... | @@ -401,7 +386,7 @@ class csphasecrv(ctools.cscript): |
| 401 | 386 | # Create FITS file |
| 402 | 387 | self._create_fits() |
| 403 | 388 | |
| 404 | - # Optionally publish light curve | |
| 389 | + # Optionally publish phase curve | |
| 405 | 390 | if self['publish'].boolean(): |
| 406 | 391 | self.publish() |
| 407 | 392 | |
| ... | ... | @@ -433,7 +418,7 @@ class csphasecrv(ctools.cscript): |
| 433 | 418 | # Write header |
| 434 | 419 | self._log_header1(gammalib.TERSE, 'Publish phase curve') |
| 435 | 420 | |
| 436 | - # Continue only if light curve is valid | |
| 421 | + # Continue only if phase curve is valid | |
| 437 | 422 | if self._fits.contains('PHASECURVE'): |
| 438 | 423 | |
| 439 | 424 | # Set default name is user name is empty | ... | ... |
cscripts/ioutils.py
| 1 | 1 | # ========================================================================== |
| 2 | 2 | # Utility functions for input and output |
| 3 | 3 | # |
| 4 | -# Copyright (C) 2016 Juergen Knoedlseder | |
| 4 | +# Copyright (C) 2016-2017 Juergen Knoedlseder | |
| 5 | 5 | # |
| 6 | 6 | # This program is free software: you can redistribute it and/or modify |
| 7 | 7 | # it under the terms of the GNU General Public License as published by |
| ... | ... | @@ -193,3 +193,89 @@ def get_args_options(options, usage): |
| 193 | 193 | |
| 194 | 194 | # Return arguments and options |
| 195 | 195 | return args, options |
| 196 | + | |
| 197 | + | |
| 198 | +# =========================================== # | |
| 199 | +# Append model parameter column to FITS table # | |
| 200 | +# =========================================== # | |
| 201 | +def append_result_column(table, results, name, unit, key): | |
| 202 | + """ | |
| 203 | + Append result column to FITS table | |
| 204 | + | |
| 205 | + Parameters | |
| 206 | + ---------- | |
| 207 | + table : `~gammalib.GFitsTable` | |
| 208 | + FITS table | |
| 209 | + results : list of dict | |
| 210 | + Parameter values | |
| 211 | + name : str | |
| 212 | + Column name | |
| 213 | + unit : str | |
| 214 | + Column unit | |
| 215 | + key : str | |
| 216 | + Result key | |
| 217 | + """ | |
| 218 | + # Determine number of rows in FITS table | |
| 219 | + nrows = len(results) | |
| 220 | + | |
| 221 | + # Allocate double precision column and set units | |
| 222 | + col = gammalib.GFitsTableDoubleCol(name, nrows) | |
| 223 | + col.unit(unit) | |
| 224 | + | |
| 225 | + # Fill results in columns | |
| 226 | + for i, result in enumerate(results): | |
| 227 | + col[i] = result[key] | |
| 228 | + | |
| 229 | + # Append column to table | |
| 230 | + table.append(col) | |
| 231 | + | |
| 232 | + # Return | |
| 233 | + return | |
| 234 | + | |
| 235 | + | |
| 236 | +# =========================================== # | |
| 237 | +# Append model parameter column to FITS table # | |
| 238 | +# =========================================== # | |
| 239 | +def append_model_par_column(table, model, results): | |
| 240 | + """ | |
| 241 | + Append model parameter column to FITS table | |
| 242 | + | |
| 243 | + Parameters | |
| 244 | + ---------- | |
| 245 | + table : `~gammalib.GFitsTable` | |
| 246 | + FITS table | |
| 247 | + model : `~gammalib.GModel` | |
| 248 | + Model | |
| 249 | + results : list of dict | |
| 250 | + Parameter values | |
| 251 | + """ | |
| 252 | + # Determine number of rows in FITS table | |
| 253 | + nrows = len(results) | |
| 254 | + | |
| 255 | + # Loop over all parameters in model | |
| 256 | + for par in model: | |
| 257 | + | |
| 258 | + # Append parameter column only if model parameter is free | |
| 259 | + if par.is_free(): | |
| 260 | + | |
| 261 | + # Set column names | |
| 262 | + name = par.name() | |
| 263 | + e_name = 'e_'+par.name() | |
| 264 | + | |
| 265 | + # Allocate double precision columns and set units | |
| 266 | + col = gammalib.GFitsTableDoubleCol(name, nrows) | |
| 267 | + e_col = gammalib.GFitsTableDoubleCol(e_name, nrows) | |
| 268 | + col.unit(par.unit()) | |
| 269 | + e_col.unit(par.unit()) | |
| 270 | + | |
| 271 | + # Fill results in columns | |
| 272 | + for i, result in enumerate(results): | |
| 273 | + col[i] = result['values'][name] | |
| 274 | + e_col[i] = result['values'][e_name] | |
| 275 | + | |
| 276 | + # Append columns to table | |
| 277 | + table.append(col) | |
| 278 | + table.append(e_col) | |
| 279 | + | |
| 280 | + # Return | |
| 281 | + return | ... | ... |
sonar-project.properties
| ... | ... | @@ -21,7 +21,7 @@ sonar.cxx.missingIncludeWarnings=False |
| 21 | 21 | |
| 22 | 22 | # Exclusions |
| 23 | 23 | sonar.exclusions=cscripts/tests/**,pyext/build/**,pyext/ctools/tools.py,pyext/ctools/*_wrap.cpp,pyext/ctools/tests/**,dev/**,doc/**,test/dev/** |
| 24 | -sonar.coverage.exclusions=test/science_verification.py,test/test_examples.py | |
| 24 | +sonar.coverage.exclusions=test/science_verification.py,test/test_examples.py,pyext/setup.py | |
| 25 | 25 | sonar.cpd.exclusions=examples/**,test/**,pyext/ctools/tools.py |
| 26 | 26 | |
| 27 | 27 | # C++ configuration | ... | ... |