diff --git a/ChangeLog b/ChangeLog index d890bb1..41ad01d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,4 @@ -2014-02-17 Juergen Knoedlseder +2014-02-19 Juergen Knoedlseder * Bug fix Version 0.8.2 released ================================ @@ -12,6 +12,7 @@ Correct bug in Fermi/LAT PSF computation (#1004) Implement CTA instrument background (#1146) Add GModelSpectralSuperExpPlaw spectral model (#1147) + Added normalize attribute to GModelSpatialDiffuseMap (#1134) 2014-02-05 Juergen Knoedlseder diff --git a/NEWS b/NEWS index c0514c7..95618c1 100644 --- a/NEWS +++ b/NEWS @@ -2,7 +2,7 @@ New Features and Important Changes in GammaLib 00-08-02 Author(s) : Juergen Knoedlseder -17 February 2014 +19 February 2014 1. Introduction @@ -55,6 +55,10 @@ memory. This property is useful for Fermi/LAT analysis. Implement GModelSpectralSuperExpPlaw class to model a super exponentially cut off power law spectral functions. +Added normalize attribute to GModelSpatialDiffuseMap that allows control +over the internal normalization of the map. By default, the map is normalized, +but by specifying normalize="0" the normalization can be switched off. + 9. Numerics module ------------------ diff --git a/include/GModelSpatialDiffuseMap.hpp b/include/GModelSpatialDiffuseMap.hpp index 542c96f..b329b33 100644 --- a/include/GModelSpatialDiffuseMap.hpp +++ b/include/GModelSpatialDiffuseMap.hpp @@ -1,7 +1,7 @@ /*************************************************************************** * GModelSpatialDiffuseMap.hpp - Spatial map model class * * ----------------------------------------------------------------------- * - * copyright (C) 2012-2013 by Juergen Knoedlseder * + * copyright (C) 2012-2014 by Juergen Knoedlseder * * ----------------------------------------------------------------------- * * * * This program is free software: you can redistribute it and/or modify * @@ -51,10 +51,12 @@ public: // Constructors and destructors GModelSpatialDiffuseMap(void); explicit GModelSpatialDiffuseMap(const GXmlElement& xml); - explicit GModelSpatialDiffuseMap(const std::string& filename, - const double& value = 1.0); - explicit GModelSpatialDiffuseMap(const GSkymap& map, - const double& value = 1.0); + GModelSpatialDiffuseMap(const std::string& filename, + const double& value = 1.0, + const bool& normalize = true); + GModelSpatialDiffuseMap(const GSkymap& map, + const double& value = 1.0, + const bool& normalize = true); GModelSpatialDiffuseMap(const GModelSpatialDiffuseMap& model); virtual ~GModelSpatialDiffuseMap(void); @@ -81,6 +83,7 @@ public: void load(const std::string& filename); const GSkymap& map(void) const; void map(const GSkymap& map); + bool normalize(void) const; protected: // Protected methods @@ -90,10 +93,11 @@ protected: void prepare_map(void); // Protected members - GModelPar m_value; //!< Value - GSkymap m_map; //!< Skymap - std::string m_filename; //!< Name of skymap - std::vector m_mc_cache; //!< Monte Carlo cache + GModelPar m_value; //!< Value + GSkymap m_map; //!< Skymap + std::string m_filename; //!< Name of skymap + std::vector m_mc_cache; //!< Monte Carlo cache + bool m_normalize; //!< Normalize map (default: true) }; /***********************************************************************//** @@ -182,4 +186,18 @@ void GModelSpatialDiffuseMap::map(const GSkymap& map) return; } + +/***********************************************************************//** + * @brief Return normalization flag + * + * @return True is the map has been normalized, false otherwise. + * + * Signals whether a map has been normalized or not. + ***************************************************************************/ +inline +bool GModelSpatialDiffuseMap::normalize(void) const +{ + return (m_normalize); +} + #endif /* GMODELSPATIALDIFFUSEMAP_HPP */ diff --git a/pyext/GModelSpatialDiffuseMap.i b/pyext/GModelSpatialDiffuseMap.i index 8a3b215..edd75df 100644 --- a/pyext/GModelSpatialDiffuseMap.i +++ b/pyext/GModelSpatialDiffuseMap.i @@ -1,7 +1,7 @@ /*************************************************************************** * GModelSpatialDiffuseMap.i - Spatial map model class * * ----------------------------------------------------------------------- * - * copyright (C) 2012-2013 by Juergen Knoedlseder * + * copyright (C) 2012-2014 by Juergen Knoedlseder * * ----------------------------------------------------------------------- * * * * This program is free software: you can redistribute it and/or modify * @@ -40,10 +40,12 @@ public: // Constructors and destructors GModelSpatialDiffuseMap(void); explicit GModelSpatialDiffuseMap(const GXmlElement& xml); - explicit GModelSpatialDiffuseMap(const std::string& filename, - const double& value = 1.0); - explicit GModelSpatialDiffuseMap(const GSkymap& map, - const double& value = 1.0); + GModelSpatialDiffuseMap(const std::string& filename, + const double& value = 1.0, + const bool& normalize = true); + GModelSpatialDiffuseMap(const GSkymap& map, + const double& value = 1.0, + const bool& normalize = true); GModelSpatialDiffuseMap(const GModelSpatialDiffuseMap& model); virtual ~GModelSpatialDiffuseMap(void); @@ -66,6 +68,7 @@ public: void load(const std::string& filename); const GSkymap& map(void) const; void map(const GSkymap& map); + bool normalize(void) const; }; diff --git a/src/model/GModelSpatialDiffuseMap.cpp b/src/model/GModelSpatialDiffuseMap.cpp index 450c6fa..5de3081 100644 --- a/src/model/GModelSpatialDiffuseMap.cpp +++ b/src/model/GModelSpatialDiffuseMap.cpp @@ -1,7 +1,7 @@ /*************************************************************************** * GModelSpatialDiffuseMap.cpp - Spatial map model class * * ----------------------------------------------------------------------- * - * copyright (C) 2012-2013 by Juergen Knoedlseder * + * copyright (C) 2012-2014 by Juergen Knoedlseder * * ----------------------------------------------------------------------- * * * * This program is free software: you can redistribute it and/or modify * @@ -100,12 +100,14 @@ GModelSpatialDiffuseMap::GModelSpatialDiffuseMap(const GXmlElement& xml) : * * @param[in] filename File name. * @param[in] value Normalization factor (defaults to 1). + * @param[in] normalize Normalize map (defaults to true). * * Constructs spatial map model by loading a skymap from the file specified * by @p filename and by setting the normalization @p value. ***************************************************************************/ GModelSpatialDiffuseMap::GModelSpatialDiffuseMap(const std::string& filename, - const double& value) : + const double& value, + const bool& normalize) : GModelSpatialDiffuse() { // Initialise members @@ -114,6 +116,9 @@ GModelSpatialDiffuseMap::GModelSpatialDiffuseMap(const std::string& filename, // Set normalization parameter m_value.value(value); + // Set normalization flag + m_normalize = normalize; + // Load skymap load(filename); @@ -127,12 +132,14 @@ GModelSpatialDiffuseMap::GModelSpatialDiffuseMap(const std::string& filename, * * @param[in] map Sky map. * @param[in] value Normalization factor (defaults to 1). + * @param[in] normalize Normalize map (defaults to true). * * Constructs spatial map model by setting the sky @p map and by setting the * normalization @p value. ***************************************************************************/ GModelSpatialDiffuseMap::GModelSpatialDiffuseMap(const GSkymap& map, - const double& value) : + const double& value, + const bool& normalize) : GModelSpatialDiffuse() { // Initialise members @@ -141,6 +148,9 @@ GModelSpatialDiffuseMap::GModelSpatialDiffuseMap(const GSkymap& map, // Set normalization parameter m_value.value(value); + // Set normalization flag + m_normalize = normalize; + // Set and prepare skymap m_map = map; prepare_map(); @@ -402,6 +412,15 @@ void GModelSpatialDiffuseMap::read(const GXmlElement& xml) " \"Normalization\" parameter."); } + // Get optional normalization attribute + std::string arg = xml.attribute("normalize"); + if (arg == "" || arg == "1" || gammalib::tolower(arg) == "true") { + m_normalize = true; + } + else { + m_normalize = false; + } + // Load skymap load(xml.attribute("file")); @@ -470,6 +489,11 @@ void GModelSpatialDiffuseMap::write(GXmlElement& xml) const " \"Normalization\" parameter."); } + // Set optional normalization attribute + if (!normalize()) { + xml.attribute("normalize", "0"); + } + // Return return; } @@ -494,6 +518,13 @@ std::string GModelSpatialDiffuseMap::print(const GChatter& chatter) const // Append parameters result.append("\n"+gammalib::parformat("Sky map file")+m_filename); + result.append("\n"+gammalib::parformat("Map normalization")); + if (normalize()) { + result.append("yes"); + } + else { + result.append("no"); + } result.append("\n"+gammalib::parformat("Number of parameters")); result.append(gammalib::str(size())); for (int i = 0; i < size(); ++i) { @@ -566,6 +597,7 @@ void GModelSpatialDiffuseMap::init_members(void) m_map.clear(); m_filename.clear(); m_mc_cache.clear(); + m_normalize = true; // Return return; @@ -580,10 +612,11 @@ void GModelSpatialDiffuseMap::init_members(void) void GModelSpatialDiffuseMap::copy_members(const GModelSpatialDiffuseMap& model) { // Copy members - m_value = model.m_value; - m_map = model.m_map; - m_filename = model.m_filename; - m_mc_cache = model.m_mc_cache; + m_value = model.m_value; + m_map = model.m_map; + m_filename = model.m_filename; + m_mc_cache = model.m_mc_cache; + m_normalize = model.m_normalize; // Set parameter pointer(s) m_pars.clear(); @@ -651,12 +684,19 @@ void GModelSpatialDiffuseMap::prepare_map(void) m_mc_cache.push_back(sum); } - // Normalize skymap and pixel fluxes in the cache so that the values - // in the cache run from 0 to 1 + // Normalize fluxes in the cache so that the values in the cache + // run from 0 to 1. Optionally also normalize the sky map. if (sum > 0.0) { - for (int i = 0; i < npix; ++i) { - m_map(i) /= sum; - m_mc_cache[i] /= sum; + if (normalize()) { + for (int i = 0; i < npix; ++i) { + m_map(i) /= sum; + m_mc_cache[i] /= sum; + } + } + else { + for (int i = 0; i < npix; ++i) { + m_mc_cache[i] /= sum; + } } } diff --git a/test/test_GModel.cpp b/test/test_GModel.cpp index 5bd9d93..bfd96d4 100644 --- a/test/test_GModel.cpp +++ b/test/test_GModel.cpp @@ -739,6 +739,32 @@ void TestGModel::test_diffuse_map(void) test_try_failure(e); } + // Initialize photon direction for testing + GSkyDir dir; + GEnergy energy; + GTime time; + dir.radec_deg(201.68111, -42.68742); + GPhoton photon(dir, energy, time); + + // Test normalized map + GModelSpatialDiffuseMap map_norm(m_map_file, 3.0, true); + test_assert(map_norm.normalize(),"Model should be normalized."); + test_value(map_norm.eval(photon), 13069.603989, 1e-6, "Unexpected skymap intensity."); + GXmlElement element; + map_norm.write(element); + map_norm.read(element); + test_assert(map_norm.normalize(),"Model should be normalized."); + test_value(map_norm.eval(photon), 13069.603989, 1e-6, "Unexpected skymap intensity."); + + // Test non-normalized map + GModelSpatialDiffuseMap map_nonnorm(m_map_file, 3.0, false); + test_assert(!map_nonnorm.normalize(),"Model should not be normalized."); + test_value(map_nonnorm.eval(photon), 13069.6002755, 1e-6, "Unexpected skymap intensity."); + GXmlElement element2; + map_nonnorm.write(element2); + map_nonnorm.read(element2); + test_assert(!map_nonnorm.normalize(),"Model should not be normalized."); + // Exit test return; }