/*************************************************************************** * GModelExtendedSource.hpp - Extended source model class * * ----------------------------------------------------------------------- * * copyright (C) 2011-2012 by Juergen Knoedlseder * * ----------------------------------------------------------------------- * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program. If not, see . * * * ***************************************************************************/ /** * @file GModelExtendedSource.cpp * @brief Extended source model class implementation * @author Juergen Knoedlseder */ /* __ Includes ___________________________________________________________ */ #ifdef HAVE_CONFIG_H #include #endif #include "GTools.hpp" #include "GException.hpp" #include "GModelExtendedSource.hpp" #include "GModelRegistry.hpp" #include "GModelRadialRegistry.hpp" #include "GModelTemporalConst.hpp" /* __ Globals ____________________________________________________________ */ const GModelExtendedSource g_extendedsource_seed; const GModelRegistry g_extendedsource_registry(&g_extendedsource_seed); /* __ Method name definitions ____________________________________________ */ #define G_DIR "GModelExtendedSource::dir()" #define G_XML_RADIAL "GModelExtendedSource::xml_radial(GXmlElement&)" /* __ Macros _____________________________________________________________ */ /* __ Coding definitions _________________________________________________ */ /* __ Debug definitions __________________________________________________ */ /*========================================================================== = = = Constructors/destructors = = = ==========================================================================*/ /***********************************************************************//** * @brief Void constructor ***************************************************************************/ GModelExtendedSource::GModelExtendedSource(void) : GModelSky() { // Initialise members init_members(); // Return return; } /***********************************************************************//** * @brief XML constructor * * @param[in] xml XML element. ***************************************************************************/ GModelExtendedSource::GModelExtendedSource(const GXmlElement& xml) : GModelSky() { // Initialise members init_members(); // Get pointers on spectrum and spatial model GXmlElement* spec = static_cast(xml.element("spectrum", 0)); GXmlElement* rad = static_cast(xml.element("spatialModel", 0)); // Allocate constant GModelTemporalConst temporal; // Clone spatial and spectral models m_spatial = xml_radial(*rad); m_spectral = xml_spectral(*spec); m_temporal = temporal.clone(); // Set parameter pointers set_pointers(); // Return return; } /***********************************************************************//** * @brief Construct extended source model from radial and spectral components * * @param[in] radial Radial model component. * @param[in] spectral Spectral model component. ***************************************************************************/ GModelExtendedSource::GModelExtendedSource(const GModelRadial& radial, const GModelSpectral& spectral) : GModelSky() { // Initialise members init_members(); // Allocate temporal constant model GModelTemporalConst temporal; // Clone model components m_spatial = radial.clone(); m_spectral = spectral.clone(); m_temporal = temporal.clone(); // Set parameter pointers set_pointers(); // Return return; } /***********************************************************************//** * @brief Construct extended source model from radial and spectral XML * elements * * @param[in] radial Radial XML element. * @param[in] spectral Spectral XML element. ***************************************************************************/ GModelExtendedSource::GModelExtendedSource(const GXmlElement& radial, const GXmlElement& spectral) : GModelSky(radial, spectral) { // Initialise members init_members(); // Allocate constant GModelTemporalConst temporal; // Clone spatial and spectral models m_spatial = xml_radial(radial); m_spectral = xml_spectral(spectral); m_temporal = temporal.clone(); // Set parameter pointers set_pointers(); // Return return; } /***********************************************************************//** * @brief Copy constructor * * @param[in] model Extended source model. ***************************************************************************/ GModelExtendedSource::GModelExtendedSource(const GModelExtendedSource& model) : GModelSky(model) { // Initialise members init_members(); // Copy members copy_members(model); // Return return; } /***********************************************************************//** * @brief Destructor ***************************************************************************/ GModelExtendedSource::~GModelExtendedSource(void) { // Free members free_members(); // Return return; } /*========================================================================== = = = Operators = = = ==========================================================================*/ /***********************************************************************//** * @brief Assignment operator * * @param[in] model Extended source model. * @return Extended source model. ***************************************************************************/ GModelExtendedSource& GModelExtendedSource::operator=(const GModelExtendedSource& model) { // Execute only if object is not identical if (this != &model) { // Copy base class members this->GModelSky::operator=(model); // Free members free_members(); // Initialise members init_members(); // Copy members copy_members(model); } // endif: object was not identical // Return return *this; } /*========================================================================== = = = Public methods = = = ==========================================================================*/ /***********************************************************************//** * @brief Clear instance * * This method properly resets the instance to an initial state. ***************************************************************************/ void GModelExtendedSource::clear(void) { // Free class members free_members(); this->GModelSky::free_members(); this->GModel::free_members(); // Initialise members this->GModel::init_members(); this->GModelSky::init_members(); init_members(); // Return return; } /***********************************************************************//** * @brief Clone instance * * @return Pointer to deep copy of extended source model. ***************************************************************************/ GModelExtendedSource* GModelExtendedSource::clone(void) const { return new GModelExtendedSource(*this); } /***********************************************************************//** * @brief Read extended model from XML element * * @param[in] xml XML element. ***************************************************************************/ void GModelExtendedSource::read(const GXmlElement& xml) { // Clear model clear(); // Get pointers on spectrum and spatial model GXmlElement* spec = static_cast(xml.element("spectrum", 0)); GXmlElement* rad = static_cast(xml.element("spatialModel", 0)); // Allocate constant GModelTemporalConst temporal; // Clone spatial and spectral models m_spatial = xml_radial(*rad); m_spectral = xml_spectral(*spec); m_temporal = temporal.clone(); // Set model name name(xml.attribute("name")); // Set instruments instruments(xml.attribute("instrument")); // Set parameter pointers set_pointers(); // Return return; } /***********************************************************************//** * @brief Write extended model into XML element * * @param[in] xml XML element. ***************************************************************************/ void GModelExtendedSource::write(GXmlElement& xml) const { // Initialise pointer on source GXmlElement* src = NULL; // Search corresponding source int n = xml.elements("source"); for (int k = 0; k < n; ++k) { GXmlElement* element = static_cast(xml.element("source", k)); if (element->attribute("name") == name()) { src = element; break; } } // If no source with corresponding name was found then append one if (src == NULL) { src = new GXmlElement("source"); src->attribute("name") = name(); if (spectral() != NULL) src->append(new GXmlElement("spectrum")); if (spatial() != NULL) src->append(new GXmlElement("spatialModel")); xml.append(src); } // Set model attributes src->attribute("name", name()); src->attribute("type", type()); std::string instruments = this->instruments(); if (instruments.length() > 0) { src->attribute("instrument", instruments); } // Write spectral model if (spectral() != NULL) { GXmlElement* spec = static_cast(src->element("spectrum", 0)); spectral()->write(*spec); } // Write spatial model if (spatial() != NULL) { GXmlElement* rad = static_cast(src->element("spatialModel", 0)); spatial()->write(*rad); } // Return return; } /***********************************************************************//** * @brief Print model information * * @return String containing model information. ***************************************************************************/ std::string GModelExtendedSource::print(void) const { // Initialise result string std::string result; // Append header result.append("=== GModelExtendedSource ==="); // Append model result.append("\n"+print_model()); // Return result return result; } /*========================================================================== = = = Private methods = = = ==========================================================================*/ /***********************************************************************//** * @brief Initialise class members ***************************************************************************/ void GModelExtendedSource::init_members(void) { // Return return; } /***********************************************************************//** * @brief Copy class members * * @param[in] model Extended source model. ***************************************************************************/ void GModelExtendedSource::copy_members(const GModelExtendedSource& model) { // Return return; } /***********************************************************************//** * @brief Delete class members ***************************************************************************/ void GModelExtendedSource::free_members(void) { // Return return; } /***********************************************************************//** * @brief Construct radial model from XML element * * @param[in] radial XML element. * * @exception GException::model_invalid_spatial * Invalid radial model type encountered. ***************************************************************************/ GModelRadial* GModelExtendedSource::xml_radial(const GXmlElement& radial) const { // Get radial spatial model type std::string type = radial.attribute("type"); // Get radial spatial model GModelRadialRegistry registry; GModelRadial* ptr = registry.alloc(type); // If model if valid then read model from XML file if (ptr != NULL) { ptr->read(radial); } // ... otherwise throw an exception else { throw GException::model_invalid_spatial(G_XML_RADIAL, type); } // Return pointer return ptr; }