Commit ca35e8850ad18ff189a63713794aa760f3d349e4
1 parent
77884dc8
Change names of cssrcdetect robustness parameters (#2498)
Showing
7 changed files
with
55 additions
and
52 deletions
ChangeLog
| 1 | -2018-09-07 | 1 | +2018-09-10 |
| 2 | 2 | ||
| 3 | * Version 1.6.0 released | 3 | * Version 1.6.0 released |
| 4 | ======================== | 4 | ======================== |
| @@ -9,6 +9,7 @@ | @@ -9,6 +9,7 @@ | ||
| 9 | Use full RMF true energy range for On/Off analysis in csspec (#2656) | 9 | Use full RMF true energy range for On/Off analysis in csspec (#2656) |
| 10 | Defer import of ROOT module in csroot2caldb to run method (#2652) | 10 | Defer import of ROOT module in csroot2caldb to run method (#2652) |
| 11 | Transparently update parameter files (#2513) | 11 | Transparently update parameter files (#2513) |
| 12 | + Make cssrcdetect more robust (#2498) | ||
| 12 | Change formula for number of true energy bins in csphagen (#2490) | 13 | Change formula for number of true energy bins in csphagen (#2490) |
| 13 | Remove ctools::is_valid_filename() method | 14 | Remove ctools::is_valid_filename() method |
| 14 | Handle zero model for SUBDIV method in show_response.py (#2456) | 15 | Handle zero model for SUBDIV method in show_response.py (#2456) |
NEWS
| 1 | New Features and Important Changes in ctools 1.6.0 | 1 | New Features and Important Changes in ctools 1.6.0 |
| 2 | 2 | ||
| 3 | -7 September 2018 | 3 | +10 September 2018 |
| 4 | 4 | ||
| 5 | 5 | ||
| 6 | Introduction | 6 | Introduction |
| @@ -335,7 +335,12 @@ certain amount (#2233). | @@ -335,7 +335,12 @@ certain amount (#2233). | ||
| 335 | 335 | ||
| 336 | cssrcdetect - Detects sources in sky map | 336 | cssrcdetect - Detects sources in sky map |
| 337 | ---------------------------------------- | 337 | ---------------------------------------- |
| 338 | -None | 338 | +The script was made more robust by optionally convolving the input sky map |
| 339 | +with a smoothing kernel with a specified correlation radius (options are a | ||
| 340 | +"DISK" or a "GAUSSIAN" kernel, default is now "DISK"). In addition, the mean | ||
| 341 | +and standard deviation of the pixel values are now computed locally over a | ||
| 342 | +given radius, controlled through the "avgrad" parameter. This accomodates for | ||
| 343 | +counts variations in the field of view (#2498). | ||
| 339 | 344 | ||
| 340 | 345 | ||
| 341 | cstsdist - Computes Test Statistic distribution | 346 | cstsdist - Computes Test Statistic distribution |
cscripts/cssrcdetect.par
| @@ -23,16 +23,16 @@ outds9file, f, a, ds9.reg,,, "Output DS9 region file" | @@ -23,16 +23,16 @@ outds9file, f, a, ds9.reg,,, "Output DS9 region file" | ||
| 23 | # | 23 | # |
| 24 | # Script parameters | 24 | # Script parameters |
| 25 | #================== | 25 | #================== |
| 26 | -srcmodel, s, a, POINT,POINT,, "Source model type" | ||
| 27 | -bkgmodel, s, a, NONE,NONE|IRF|AEFF|CUBE,, "Background model type" | ||
| 28 | -threshold, r, a, 5.0,,, "Detection threshold (Gaussian sigma)" | ||
| 29 | -maxsrcs, i, h, 20,1,1000, "Maximum number of sources" | ||
| 30 | -exclrad, r, h, 0.2,,, "Exclusion radius (deg)" | ||
| 31 | -fit_pos, b, h, yes,,, "Fit source positions?" | ||
| 32 | -fit_shape, b, h, yes,,, "Fit source shapes?" | ||
| 33 | -momentradius, r, a, 200,,, "Radius (deg) for computing map mean and std-deviation values" | ||
| 34 | -smoothkernel, s, a, NONE,NONE|DISK|GAUSSIAN,,"Smoothing kernel to use for smoothing the input sky map" | ||
| 35 | -smoothparam, r, a, 0.05,,,"Smoothing kernel parameters (sigma for GAUS, radius for DISK)" | 26 | +srcmodel, s, a, POINT,POINT,, "Source model type" |
| 27 | +bkgmodel, s, a, NONE,NONE|IRF|AEFF|CUBE,, "Background model type" | ||
| 28 | +threshold, r, a, 5.0,,, "Detection threshold (Gaussian sigma)" | ||
| 29 | +maxsrcs, i, h, 20,1,1000, "Maximum number of sources" | ||
| 30 | +avgrad, r, h, 1.0,,, "Averaging radius (deg) for significance computation" | ||
| 31 | +corr_rad, r, a, 0.1,,, "Correlation kernel radius (deg)" | ||
| 32 | +corr_kern, s, h, DISK,NONE|DISK|GAUSSIAN,, "Correlation kernel to apply to input sky map" | ||
| 33 | +exclrad, r, h, 0.3,,, "Exclusion radius (deg)" | ||
| 34 | +fit_pos, b, h, yes,,, "Fit source positions?" | ||
| 35 | +fit_shape, b, h, yes,,, "Fit source shapes?" | ||
| 36 | 36 | ||
| 37 | # | 37 | # |
| 38 | # Standard parameters | 38 | # Standard parameters |
cscripts/cssrcdetect.py
| @@ -77,15 +77,15 @@ class cssrcdetect(ctools.cscript): | @@ -77,15 +77,15 @@ class cssrcdetect(ctools.cscript): | ||
| 77 | self['fit_shape'].boolean() | 77 | self['fit_shape'].boolean() |
| 78 | 78 | ||
| 79 | # Query the smoothing parameters | 79 | # Query the smoothing parameters |
| 80 | - self['smoothkernel'].string() | ||
| 81 | - if self['smoothkernel'].string().upper() != 'NONE': | ||
| 82 | - self['smoothparam'].real() | 80 | + self['avgrad'].real() |
| 81 | + self['corr_kern'].string() | ||
| 82 | + if self['corr_kern'].string().upper() != 'NONE': | ||
| 83 | + self['corr_rad'].real() | ||
| 83 | 84 | ||
| 84 | # Query ahead output model filename | 85 | # Query ahead output model filename |
| 85 | if self._read_ahead(): | 86 | if self._read_ahead(): |
| 86 | self['outmodel'].filename() | 87 | self['outmodel'].filename() |
| 87 | self['outds9file'].filename() | 88 | self['outds9file'].filename() |
| 88 | - self['momentradius'].real() | ||
| 89 | 89 | ||
| 90 | # Write input parameters into logger | 90 | # Write input parameters into logger |
| 91 | self._log_parameters(gammalib.TERSE) | 91 | self._log_parameters(gammalib.TERSE) |
| @@ -109,11 +109,11 @@ class cssrcdetect(ctools.cscript): | @@ -109,11 +109,11 @@ class cssrcdetect(ctools.cscript): | ||
| 109 | self._log_header3(gammalib.NORMAL, 'Iteration '+str(i+1)) | 109 | self._log_header3(gammalib.NORMAL, 'Iteration '+str(i+1)) |
| 110 | 110 | ||
| 111 | # Get map moments | 111 | # Get map moments |
| 112 | - mean, std = self._map_moments(counts, self['momentradius'].real()) | ||
| 113 | - | 112 | + mean, std = self._map_moments(counts, self['avgrad'].real()) |
| 113 | + | ||
| 114 | # Compute threshold | 114 | # Compute threshold |
| 115 | sigmap = (counts - mean)/std | 115 | sigmap = (counts - mean)/std |
| 116 | - | 116 | + |
| 117 | # Get maximum value and corresponding sky direction | 117 | # Get maximum value and corresponding sky direction |
| 118 | value, pos = self._find_maximum(sigmap) | 118 | value, pos = self._find_maximum(sigmap) |
| 119 | 119 | ||
| @@ -126,7 +126,7 @@ class cssrcdetect(ctools.cscript): | @@ -126,7 +126,7 @@ class cssrcdetect(ctools.cscript): | ||
| 126 | # Log maximum | 126 | # Log maximum |
| 127 | self._log_value(gammalib.NORMAL, 'Map maximum', str(value)) | 127 | self._log_value(gammalib.NORMAL, 'Map maximum', str(value)) |
| 128 | self._log_value(gammalib.NORMAL, name+' position', str(pos)) | 128 | self._log_value(gammalib.NORMAL, name+' position', str(pos)) |
| 129 | - | 129 | + |
| 130 | # Add model | 130 | # Add model |
| 131 | self._add_model(pos, name) | 131 | self._add_model(pos, name) |
| 132 | 132 | ||
| @@ -196,7 +196,7 @@ class cssrcdetect(ctools.cscript): | @@ -196,7 +196,7 @@ class cssrcdetect(ctools.cscript): | ||
| 196 | """ | 196 | """ |
| 197 | # Copy skymap | 197 | # Copy skymap |
| 198 | skymap_copy = skymap.copy() | 198 | skymap_copy = skymap.copy() |
| 199 | - | 199 | + |
| 200 | # Cache the cosine of the radius | 200 | # Cache the cosine of the radius |
| 201 | cos_radius = math.cos(math.radians(radius)) | 201 | cos_radius = math.cos(math.radians(radius)) |
| 202 | 202 | ||
| @@ -354,16 +354,13 @@ class cssrcdetect(ctools.cscript): | @@ -354,16 +354,13 @@ class cssrcdetect(ctools.cscript): | ||
| 354 | self._log_header3(gammalib.NORMAL, 'Smoothing Skymap') | 354 | self._log_header3(gammalib.NORMAL, 'Smoothing Skymap') |
| 355 | 355 | ||
| 356 | # Make sure the smoothing kernel is not 'NONE' | 356 | # Make sure the smoothing kernel is not 'NONE' |
| 357 | - if self['smoothkernel'].string().upper() != 'NONE': | ||
| 358 | - self._log_value(gammalib.NORMAL, 'Kernel', | ||
| 359 | - self['smoothkernel'].string()) | ||
| 360 | - self._log_value(gammalib.NORMAL, 'Parameter', | ||
| 361 | - self['smoothparam'].real()) | ||
| 362 | - skymap.smooth(self['smoothkernel'].string(), | ||
| 363 | - self['smoothparam'].real()) | 357 | + if self['corr_kern'].string().upper() != 'NONE': |
| 358 | + self._log_value(gammalib.NORMAL, 'Kernel', self['corr_kern'].string()) | ||
| 359 | + self._log_value(gammalib.NORMAL, 'Parameter', self['corr_rad'].real()) | ||
| 360 | + skymap.smooth(self['corr_kern'].string(), self['corr_rad'].real()) | ||
| 364 | else: | 361 | else: |
| 365 | self._log_string(gammalib.NORMAL, | 362 | self._log_string(gammalib.NORMAL, |
| 366 | - 'Smoothing kernel is NONE, smoothing will be ignored.') | 363 | + 'Smoothing kernel is "NONE", smoothing will be ignored.') |
| 367 | 364 | ||
| 368 | return | 365 | return |
| 369 | 366 |
doc/source/admin/release_history/1.6.rst
| @@ -43,6 +43,8 @@ Improvements | @@ -43,6 +43,8 @@ Improvements | ||
| 43 | Use full ``RMF`` true energy range for On/Off analysis in :ref:`csspec` | 43 | Use full ``RMF`` true energy range for On/Off analysis in :ref:`csspec` |
| 44 | * [`2513 <https://cta-redmine.irap.omp.eu/issues/2513>`_] - | 44 | * [`2513 <https://cta-redmine.irap.omp.eu/issues/2513>`_] - |
| 45 | Transparently update parameter files | 45 | Transparently update parameter files |
| 46 | +* [`2498 <https://cta-redmine.irap.omp.eu/issues/2498>`_] - | ||
| 47 | + Make :ref:`cssrcdetect` more robust | ||
| 46 | * [`2490 <https://cta-redmine.irap.omp.eu/issues/2490>`_] - | 48 | * [`2490 <https://cta-redmine.irap.omp.eu/issues/2490>`_] - |
| 47 | Change formula for number of true energy bins in :ref:`csphagen` | 49 | Change formula for number of true energy bins in :ref:`csphagen` |
| 48 | * [`2421 <https://cta-redmine.irap.omp.eu/issues/2421>`_] - | 50 | * [`2421 <https://cta-redmine.irap.omp.eu/issues/2421>`_] - |
doc/source/users/reference_manual/cssrcdetect.rst
| @@ -48,18 +48,19 @@ General parameters | @@ -48,18 +48,19 @@ General parameters | ||
| 48 | Detection threshold (Gaussian sigma). Only sources above this detection | 48 | Detection threshold (Gaussian sigma). Only sources above this detection |
| 49 | threshold will be added to the model definiton XML file. | 49 | threshold will be added to the model definiton XML file. |
| 50 | 50 | ||
| 51 | -``momentradius [real]`` | ||
| 52 | - Radius (deg) for computing map mean and std-deviation values. | 51 | +``(maxsrcs = 20) [integer]`` |
| 52 | + Maximum number of sources that should be detected. | ||
| 53 | 53 | ||
| 54 | -``smoothkernel <NONE|DISK|GAUSSIAN> [string]`` | ||
| 55 | - Smoothing kernel to use for smoothing the input sky map. | 54 | +``(avgrad = 1.0) [real]`` |
| 55 | + Averaging radius for significance computation (degrees). The script computes | ||
| 56 | + the mean pixel value and standard deviation value over this radius and | ||
| 57 | + uses the result to estimate the excess significance. | ||
| 56 | 58 | ||
| 57 | -``smoothparam [real]`` | ||
| 58 | - Smoothing kernel parameters (sigma for GAUS, radius for DISK, both in | ||
| 59 | - degrees). | 59 | +``corr_rad [real]`` |
| 60 | + Correlation kernel radius (degrees). | ||
| 60 | 61 | ||
| 61 | -``(maxsrcs = 20) [integer]`` | ||
| 62 | - Maximum number of sources that should be detected. | 62 | +``(corr_kern = DISK) <NONE|DISK|GAUSSIAN> [string]`` |
| 63 | + Correlation kernel to use for smoothing the input sky map. | ||
| 63 | 64 | ||
| 64 | ``(exclrad = 0.2) [real]`` | 65 | ``(exclrad = 0.2) [real]`` |
| 65 | Radius around a detected source that is excluded from further source | 66 | Radius around a detected source that is excluded from further source |
test/test_cssrcdetect.py
| @@ -33,7 +33,7 @@ class Test(test): | @@ -33,7 +33,7 @@ class Test(test): | ||
| 33 | This test class makes unit tests for the cssrcdetect script by using it | 33 | This test class makes unit tests for the cssrcdetect script by using it |
| 34 | from the command line and from Python. | 34 | from the command line and from Python. |
| 35 | """ | 35 | """ |
| 36 | - | 36 | + |
| 37 | # Constructor | 37 | # Constructor |
| 38 | def __init__(self): | 38 | def __init__(self): |
| 39 | """ | 39 | """ |
| @@ -75,9 +75,8 @@ class Test(test): | @@ -75,9 +75,8 @@ class Test(test): | ||
| 75 | cmd = cssrcdetect+' inmap="'+self._map+'"'+ \ | 75 | cmd = cssrcdetect+' inmap="'+self._map+'"'+ \ |
| 76 | ' outmodel="cssrcdetect_cmd1.xml"'+ \ | 76 | ' outmodel="cssrcdetect_cmd1.xml"'+ \ |
| 77 | ' outds9file="cssrcdetect_cmd1.reg"'+ \ | 77 | ' outds9file="cssrcdetect_cmd1.reg"'+ \ |
| 78 | - ' momentradius=200.0'+ \ | ||
| 79 | - ' smoothkernel=NONE smoothparam=0.1'+ \ | ||
| 80 | - ' srcmodel="POINT" bkgmodel="NONE" threshold=10.0'+ \ | 78 | + ' corr_rad=0.1'+ \ |
| 79 | + ' srcmodel="POINT" bkgmodel="NONE" threshold=8.0'+ \ | ||
| 81 | ' logfile="cssrcdetect_cmd1.log" chatter=1' | 80 | ' logfile="cssrcdetect_cmd1.log" chatter=1' |
| 82 | 81 | ||
| 83 | # Check if execution was successful | 82 | # Check if execution was successful |
| @@ -91,9 +90,8 @@ class Test(test): | @@ -91,9 +90,8 @@ class Test(test): | ||
| 91 | cmd = cssrcdetect+' inmap="skymap_that_does_not_exist"'+ \ | 90 | cmd = cssrcdetect+' inmap="skymap_that_does_not_exist"'+ \ |
| 92 | ' outmodel="cssrcdetect_cmd1.xml"'+ \ | 91 | ' outmodel="cssrcdetect_cmd1.xml"'+ \ |
| 93 | ' outds9file="cssrcdetect_cmd1.reg"'+ \ | 92 | ' outds9file="cssrcdetect_cmd1.reg"'+ \ |
| 94 | - ' momentradius=200.0'+ \ | ||
| 95 | - ' smoothkernel=NONE smoothparam=0.1'+ \ | ||
| 96 | - ' srcmodel="POINT" bkgmodel="NONE" threshold=10.0'+ \ | 93 | + ' corr_rad=0.1'+ \ |
| 94 | + ' srcmodel="POINT" bkgmodel="NONE" threshold=8.0'+ \ | ||
| 97 | ' logfile="cssrcdetect_cmd2.log" debug=yes chatter=2' | 95 | ' logfile="cssrcdetect_cmd2.log" debug=yes chatter=2' |
| 98 | 96 | ||
| 99 | # Check if execution failed | 97 | # Check if execution failed |
| @@ -133,12 +131,10 @@ class Test(test): | @@ -133,12 +131,10 @@ class Test(test): | ||
| 133 | srcdetect['outds9file'] = 'cssrcdetect_py1.reg' | 131 | srcdetect['outds9file'] = 'cssrcdetect_py1.reg' |
| 134 | srcdetect['srcmodel'] = 'POINT' | 132 | srcdetect['srcmodel'] = 'POINT' |
| 135 | srcdetect['bkgmodel'] = 'NONE' | 133 | srcdetect['bkgmodel'] = 'NONE' |
| 136 | - srcdetect['threshold'] = 10.0 | ||
| 137 | - srcdetect['momentradius'] = 200.0 | ||
| 138 | - srcdetect['smoothkernel'] = "NONE" | ||
| 139 | - srcdetect['smoothparam'] = 0.1 | 134 | + srcdetect['threshold'] = 8.0 |
| 135 | + srcdetect['corr_rad'] = 0.1 | ||
| 140 | srcdetect['logfile'] = 'cssrcdetect_py1.log' | 136 | srcdetect['logfile'] = 'cssrcdetect_py1.log' |
| 141 | - srcdetect['chatter'] = 2 | 137 | + srcdetect['chatter'] = 4 |
| 142 | 138 | ||
| 143 | # Run cssrcdetect script and save models | 139 | # Run cssrcdetect script and save models |
| 144 | srcdetect.logFileOpen() # Make sure we get a log file | 140 | srcdetect.logFileOpen() # Make sure we get a log file |
| @@ -153,6 +149,7 @@ class Test(test): | @@ -153,6 +149,7 @@ class Test(test): | ||
| 153 | srcdetect['outmodel'] = 'cssrcdetect_py2.xml' | 149 | srcdetect['outmodel'] = 'cssrcdetect_py2.xml' |
| 154 | srcdetect['outds9file'] = 'cssrcdetect_py2.reg' | 150 | srcdetect['outds9file'] = 'cssrcdetect_py2.reg' |
| 155 | srcdetect['bkgmodel'] = 'IRF' | 151 | srcdetect['bkgmodel'] = 'IRF' |
| 152 | + srcdetect['threshold'] = 8.0 | ||
| 156 | srcdetect['logfile'] = 'cssrcdetect_py2.log' | 153 | srcdetect['logfile'] = 'cssrcdetect_py2.log' |
| 157 | srcdetect['chatter'] = 3 | 154 | srcdetect['chatter'] = 3 |
| 158 | srcdetect.logFileOpen() # Needed to get a new log file | 155 | srcdetect.logFileOpen() # Needed to get a new log file |
| @@ -175,6 +172,6 @@ class Test(test): | @@ -175,6 +172,6 @@ class Test(test): | ||
| 175 | # Check number of models | 172 | # Check number of models |
| 176 | self.test_value(models.size(), number, 'Check for '+str(number)+ | 173 | self.test_value(models.size(), number, 'Check for '+str(number)+ |
| 177 | ' models in XML file') | 174 | ' models in XML file') |
| 178 | - | 175 | + |
| 179 | # Return | 176 | # Return |
| 180 | return | 177 | return |