Commit 68896b275c7c81e4d4392d338ec67ebcaaebb09a
1 parent
fb39a2b9
In absence of IRF background template, use constant background for RING method in ctskymap
Showing
2 changed files
with
52 additions
and
23 deletions
doc/source/users/reference_manual/ctskymap.rst
| ... | ... | @@ -19,6 +19,11 @@ background subtraction method can be selected using the ``bkgsubtract`` |
| 19 | 19 | parameter. By default, no background model is subtracted (method ``NONE``). |
| 20 | 20 | If ``IRF`` is selected, the background template that are shipped with the |
| 21 | 21 | Instrument Response Functions will be used for background subtraction. |
| 22 | +If ``RING`` is selected, the background is estimated from a ring with the | |
| 23 | +inner radius specified by the ``inradius`` parameter and the other radius | |
| 24 | +specified by the ``outradius`` parameter. If a background template is available, | |
| 25 | +that template will be used for weighting the counts in the ring. Otherwise, a | |
| 26 | +constant background rate will be assumed. | |
| 22 | 27 | |
| 23 | 28 | :ref:`ctskymap` generates a FITS file comprising a sky map as primary extension. |
| 24 | 29 | If a background subtraction method was selected, the FITS file will contain | ... | ... |
src/ctskymap/ctskymap.cpp
| 1 | 1 | /*************************************************************************** |
| 2 | 2 | * ctskymap - Sky mapping tool * |
| 3 | 3 | * ----------------------------------------------------------------------- * |
| 4 | - * copyright (C) 2011-2018 by Juergen Knoedlseder * | |
| 4 | + * copyright (C) 2011-2019 by Juergen Knoedlseder * | |
| 5 | 5 | * ----------------------------------------------------------------------- * |
| 6 | 6 | * * |
| 7 | 7 | * This program is free software: you can redistribute it and/or modify * |
| ... | ... | @@ -33,8 +33,9 @@ |
| 33 | 33 | |
| 34 | 34 | /* __ Method name definitions ____________________________________________ */ |
| 35 | 35 | #define G_GET_PARAMETERS "ctskymap::get_parameter()" |
| 36 | -#define G_MAP_EVENTS "ctskymap::map_events(GCTAObservation*)" | |
| 37 | -#define G_MAP_BACKGROUND_IRF "ctskymap::map_background_irf(GCTAObservation*)" | |
| 36 | +#define G_FILL_MAPS_COUNTS "ctskymap::fill_maps_counts(GCTAObservation*)" | |
| 37 | +#define G_FILL_MAPS_ACCEPTANCE "ctskymap::fill_maps_acceptance("\ | |
| 38 | + "GCTAObservation*)" | |
| 38 | 39 | #define G_RING_BOUNDING_BOX "ctskymap::ring_bounding_box(int&, int&, int&, "\ |
| 39 | 40 | "int&, int&)" |
| 40 | 41 | #define G_RING_KERNEL "ctskymap::ring_kernel(double&, double&)" |
| ... | ... | @@ -813,7 +814,7 @@ void ctskymap::fill_maps_counts(GCTAObservation* obs) |
| 813 | 814 | // Make sure that the observation holds a CTA event list. If this |
| 814 | 815 | // is not the case then throw an exception. |
| 815 | 816 | if (events == NULL) { |
| 816 | - throw GException::no_list(G_MAP_EVENTS); | |
| 817 | + throw GException::no_list(G_FILL_MAPS_COUNTS); | |
| 817 | 818 | } |
| 818 | 819 | |
| 819 | 820 | // Setup energy range covered by data |
| ... | ... | @@ -863,14 +864,14 @@ void ctskymap::fill_maps_counts(GCTAObservation* obs) |
| 863 | 864 | } |
| 864 | 865 | |
| 865 | 866 | // Fill event in skymap |
| 866 | - #pragma omp critical(ctskymap_map_events) | |
| 867 | + #pragma omp critical(ctskymap_fill_maps_counts_1) | |
| 867 | 868 | m_counts(pixel) += 1.0; |
| 868 | 869 | num_in_map++; |
| 869 | 870 | |
| 870 | 871 | } // endfor: looped over all events |
| 871 | 872 | |
| 872 | 873 | // Log binning results |
| 873 | - #pragma omp critical(ctskymap_map_events) | |
| 874 | + #pragma omp critical(ctskymap_fill_maps_counts_2) | |
| 874 | 875 | { |
| 875 | 876 | log_header3(TERSE, get_obs_header(obs)); |
| 876 | 877 | log_value(NORMAL, "Events in list", obs->events()->size()); |
| ... | ... | @@ -898,35 +899,52 @@ void ctskymap::fill_maps_counts(GCTAObservation* obs) |
| 898 | 899 | * No response information available for observation. |
| 899 | 900 | * No background template available in instrument response function. |
| 900 | 901 | * |
| 901 | - * Computes a background acceptance sky map using the IRF template for a | |
| 902 | - * given observation and adds the estimate to the acceptance sky map. | |
| 902 | + * Computes a background acceptance sky map for a given observation and adds | |
| 903 | + * the estimate to the acceptance sky map. | |
| 904 | + * | |
| 905 | + * If the response contains a background template, that template is used to | |
| 906 | + * compute the background acceptance map. | |
| 907 | + * | |
| 908 | + * If no background template is available, the outcome depends on the | |
| 909 | + * background subtraction method. If ``IRF`` background subtraction is | |
| 910 | + * requested, an exception is thrown. For ``RING`` background subtraction, | |
| 911 | + * a constant background rate is assumed. | |
| 903 | 912 | ***************************************************************************/ |
| 904 | 913 | void ctskymap::fill_maps_acceptance(GCTAObservation* obs) |
| 905 | 914 | { |
| 915 | + // Initialise IRF background template pointer | |
| 916 | + const GCTABackground* bkg = NULL; | |
| 917 | + | |
| 906 | 918 | // Get IRF response |
| 907 | 919 | const GCTAResponseIrf* rsp = dynamic_cast<const GCTAResponseIrf*> |
| 908 | 920 | (obs->response()); |
| 909 | 921 | |
| 910 | 922 | // Throw an exception if observation has no instrument response function |
| 911 | - if (rsp == NULL) { | |
| 923 | + if ((rsp == NULL) && (m_bkgsubtract != "RING")) { | |
| 912 | 924 | std::string msg = "No response information available for "+ |
| 913 | 925 | get_obs_header(obs)+" to compute IRF background. " |
| 914 | 926 | "Please specify response information or use " |
| 915 | 927 | "another background subtraction method."; |
| 916 | - throw GException::invalid_value(G_MAP_BACKGROUND_IRF, msg); | |
| 928 | + throw GException::invalid_value(G_FILL_MAPS_ACCEPTANCE, msg); | |
| 917 | 929 | } |
| 918 | 930 | |
| 919 | - // Get IRF background template | |
| 920 | - const GCTABackground* bkg = rsp->background(); | |
| 931 | + // ... otherwise get IRF background template | |
| 932 | + else { | |
| 933 | + | |
| 934 | + // Get IRF background template | |
| 935 | + bkg = rsp->background(); | |
| 936 | + | |
| 937 | + // Throw an exception if observation has no IRF background template | |
| 938 | + if ((bkg == NULL) && (m_bkgsubtract != "RING")) { | |
| 939 | + std::string msg = "No IRF background template found in instrument " | |
| 940 | + "response function for "+ | |
| 941 | + get_obs_header(obs)+". Please specify an " | |
| 942 | + "instrument response function containing a " | |
| 943 | + "background template."; | |
| 944 | + throw GException::invalid_value(G_FILL_MAPS_ACCEPTANCE, msg); | |
| 945 | + } | |
| 921 | 946 | |
| 922 | - // Throw an exception if observation has no IRF background template | |
| 923 | - if (bkg == NULL) { | |
| 924 | - std::string msg = "No IRF background template found in instrument " | |
| 925 | - "response function for "+ | |
| 926 | - get_obs_header(obs)+". Please specify an instrument " | |
| 927 | - "response function containing a background template."; | |
| 928 | - throw GException::invalid_value(G_MAP_BACKGROUND_IRF, msg); | |
| 929 | - } | |
| 947 | + } // endelse: got IRF background template | |
| 930 | 948 | |
| 931 | 949 | // Set minimum and maximum energy as GEnergy instances |
| 932 | 950 | GEnergy emin(m_emin, "TeV"); |
| ... | ... | @@ -961,13 +979,13 @@ void ctskymap::fill_maps_acceptance(GCTAObservation* obs) |
| 961 | 979 | GCTAInstDir instdir = obs->pointing().instdir(skydir); |
| 962 | 980 | |
| 963 | 981 | // Compute background value |
| 964 | - double value = bkg->rate_ebin(instdir, emin, emax); | |
| 982 | + double value = (bkg != NULL) ? bkg->rate_ebin(instdir, emin, emax) : 1.0; | |
| 965 | 983 | |
| 966 | 984 | // Multiply background rate with livetime and solid angle |
| 967 | 985 | value *= exposure * m_solidangle[i]; |
| 968 | 986 | |
| 969 | 987 | // Add number of background events to acceptance map |
| 970 | - #pragma omp critical(ctskymap_map_acceptance) | |
| 988 | + #pragma omp critical(ctskymap_fill_maps_acceptance_1) | |
| 971 | 989 | m_acceptance(i) += value; |
| 972 | 990 | |
| 973 | 991 | // Update total number of background events |
| ... | ... | @@ -976,8 +994,14 @@ void ctskymap::fill_maps_acceptance(GCTAObservation* obs) |
| 976 | 994 | } // endfor: looped over acceptance map pixels |
| 977 | 995 | |
| 978 | 996 | // Log acceptance results |
| 979 | - #pragma omp critical(ctskymap_map_events) | |
| 997 | + #pragma omp critical(ctskymap_fill_maps_acceptance_2) | |
| 980 | 998 | { |
| 999 | + // Set message string | |
| 1000 | + std::string msg = (bkg != NULL) ? "Use IRF background template" | |
| 1001 | + : "Use constant background rate"; | |
| 1002 | + | |
| 1003 | + // Log information | |
| 1004 | + log_value(NORMAL, "Background estimate", msg); | |
| 981 | 1005 | log_value(NORMAL, "Events in background", int(total+0.5)); |
| 982 | 1006 | } |
| 983 | 1007 | ... | ... |