Commit 90a3343672c3c745efa698db810ef7beda72926f

Authored by Jürgen Knödlseder
1 parent 24794521

Simplify model registry classes

Remove the m_names members from the spatial, spectral and temporal registry classes and directly use the model type to find the appropriate model. The alloc() method now throws an exception if the model is not found. The new logic helped to reduced the code in the client classes (#1824)
include/GModelSpatialRegistry.hpp
1 /*************************************************************************** 1 /***************************************************************************
2 * GModelSpatialRegistry.hpp - Spatial model registry class * 2 * GModelSpatialRegistry.hpp - Spatial model registry class *
3 * ----------------------------------------------------------------------- * 3 * ----------------------------------------------------------------------- *
4 - * copyright (C) 2011-2014 by Juergen Knoedlseder * 4 + * copyright (C) 2011-2016 by Juergen Knoedlseder *
5 * ----------------------------------------------------------------------- * 5 * ----------------------------------------------------------------------- *
6 * * 6 * *
7 * This program is free software: you can redistribute it and/or modify * 7 * This program is free software: you can redistribute it and/or modify *
@@ -30,7 +30,10 @@ @@ -30,7 +30,10 @@
30 /* __ Includes ___________________________________________________________ */ 30 /* __ Includes ___________________________________________________________ */
31 #include <string> 31 #include <string>
32 #include "GRegistry.hpp" 32 #include "GRegistry.hpp"
33 -#include "GModelSpatial.hpp" 33 +
  34 +/* __ Forward declarations _______________________________________________ */
  35 +class GXmlElement;
  36 +class GModelSpatial;
34 37
35 38
36 /***********************************************************************//** 39 /***********************************************************************//**
@@ -40,8 +43,8 @@ @@ -40,8 +43,8 @@
40 * 43 *
41 * The registry class allows the registration of spatial models that are not 44 * The registry class allows the registration of spatial models that are not
42 * necessarily compiled into the GammaLib. It uses the static members 45 * necessarily compiled into the GammaLib. It uses the static members
43 - * m_number, m_names, and m_models which are allocated globally to keep track  
44 - * of spatial models that are available throughout all linked libraries. To 46 + * m_number and m_models which are allocated globally to keep track of
  47 + * spatial models that are available throughout all linked libraries. To
45 * register a spatial model it is sufficient to add 48 * register a spatial model it is sufficient to add
46 * 49 *
47 * const GModelSpatialXXX g_spatial_XXX_seed; 50 * const GModelSpatialXXX g_spatial_XXX_seed;
@@ -65,7 +68,7 @@ public: @@ -65,7 +68,7 @@ public:
65 // Methods 68 // Methods
66 std::string classname(void) const; 69 std::string classname(void) const;
67 int size(void) const; 70 int size(void) const;
68 - GModelSpatial* alloc(const std::string& name) const; 71 + GModelSpatial* alloc(const GXmlElement& xml) const;
69 std::string name(const int& index) const; 72 std::string name(const int& index) const;
70 std::string print(const GChatter& chatter = NORMAL) const; 73 std::string print(const GChatter& chatter = NORMAL) const;
71 74
@@ -85,11 +88,6 @@ private: @@ -85,11 +88,6 @@ private:
85 static int m_number = 0; 88 static int m_number = 0;
86 return m_number; 89 return m_number;
87 }; 90 };
88 - // Model names  
89 - static GRegistryPointer<std::string>& names() {  
90 - static GRegistryPointer<std::string> m_names;  
91 - return m_names;  
92 - };  
93 // Pointer to seed models 91 // Pointer to seed models
94 static GRegistryPointer<const GModelSpatial*>& models() { 92 static GRegistryPointer<const GModelSpatial*>& models() {
95 static GRegistryPointer<const GModelSpatial*> m_models; 93 static GRegistryPointer<const GModelSpatial*> m_models;
include/GModelSpectralRegistry.hpp
1 /*************************************************************************** 1 /***************************************************************************
2 * GModelSpectralRegistry.hpp - Spectral model registry class * 2 * GModelSpectralRegistry.hpp - Spectral model registry class *
3 * ----------------------------------------------------------------------- * 3 * ----------------------------------------------------------------------- *
4 - * copyright (C) 2011-2014 by Juergen Knoedlseder * 4 + * copyright (C) 2011-2016 by Juergen Knoedlseder *
5 * ----------------------------------------------------------------------- * 5 * ----------------------------------------------------------------------- *
6 * * 6 * *
7 * This program is free software: you can redistribute it and/or modify * 7 * This program is free software: you can redistribute it and/or modify *
@@ -30,7 +30,10 @@ @@ -30,7 +30,10 @@
30 /* __ Includes ___________________________________________________________ */ 30 /* __ Includes ___________________________________________________________ */
31 #include <string> 31 #include <string>
32 #include "GRegistry.hpp" 32 #include "GRegistry.hpp"
33 -#include "GModelSpectral.hpp" 33 +
  34 +/* __ Forward declarations _______________________________________________ */
  35 +class GXmlElement;
  36 +class GModelSpectral;
34 37
35 38
36 /***********************************************************************//** 39 /***********************************************************************//**
@@ -40,8 +43,8 @@ @@ -40,8 +43,8 @@
40 * 43 *
41 * The registry class allows the registration of spectral models that are not 44 * The registry class allows the registration of spectral models that are not
42 * necessarily compiled into the GammaLib. It uses the static members 45 * necessarily compiled into the GammaLib. It uses the static members
43 - * m_number, m_names, and m_models which are allocated globally to keep track  
44 - * of spectral models that are available throughout all linked libraries. To 46 + * m_number and m_models which are allocated globally to keep track of
  47 + * spectral models that are available throughout all linked libraries. To
45 * register a spectral model it is sufficient to add 48 * register a spectral model it is sufficient to add
46 * 49 *
47 * const GModelSpectralXXX g_spectral_XXX_seed; 50 * const GModelSpectralXXX g_spectral_XXX_seed;
@@ -65,7 +68,7 @@ public: @@ -65,7 +68,7 @@ public:
65 // Methods 68 // Methods
66 std::string classname(void) const; 69 std::string classname(void) const;
67 int size(void) const; 70 int size(void) const;
68 - GModelSpectral* alloc(const std::string& name) const; 71 + GModelSpectral* alloc(const GXmlElement& xml) const;
69 std::string name(const int& index) const; 72 std::string name(const int& index) const;
70 std::string print(const GChatter& chatter = NORMAL) const; 73 std::string print(const GChatter& chatter = NORMAL) const;
71 74
@@ -85,11 +88,6 @@ private: @@ -85,11 +88,6 @@ private:
85 static int m_number = 0; 88 static int m_number = 0;
86 return m_number; 89 return m_number;
87 }; 90 };
88 - // Model names  
89 - static GRegistryPointer<std::string>& names() {  
90 - static GRegistryPointer<std::string> m_names;  
91 - return m_names;  
92 - };  
93 // Pointer to seed models 91 // Pointer to seed models
94 static GRegistryPointer<const GModelSpectral*>& models() { 92 static GRegistryPointer<const GModelSpectral*>& models() {
95 static GRegistryPointer<const GModelSpectral*> m_models; 93 static GRegistryPointer<const GModelSpectral*> m_models;
include/GModelTemporalRegistry.hpp
1 /*************************************************************************** 1 /***************************************************************************
2 * GModelTemporalRegistry.hpp - Temporal model registry class * 2 * GModelTemporalRegistry.hpp - Temporal model registry class *
3 * ----------------------------------------------------------------------- * 3 * ----------------------------------------------------------------------- *
4 - * copyright (C) 2011-2014 by Juergen Knoedlseder * 4 + * copyright (C) 2011-2016 by Juergen Knoedlseder *
5 * ----------------------------------------------------------------------- * 5 * ----------------------------------------------------------------------- *
6 * * 6 * *
7 * This program is free software: you can redistribute it and/or modify * 7 * This program is free software: you can redistribute it and/or modify *
@@ -30,7 +30,10 @@ @@ -30,7 +30,10 @@
30 /* __ Includes ___________________________________________________________ */ 30 /* __ Includes ___________________________________________________________ */
31 #include <string> 31 #include <string>
32 #include "GRegistry.hpp" 32 #include "GRegistry.hpp"
33 -#include "GModelTemporal.hpp" 33 +
  34 +/* __ Forward declarations _______________________________________________ */
  35 +class GXmlElement;
  36 +class GModelTemporal;
34 37
35 38
36 /***********************************************************************//** 39 /***********************************************************************//**
@@ -40,8 +43,8 @@ @@ -40,8 +43,8 @@
40 * 43 *
41 * The registry class allows the registration of temporal models that are not 44 * The registry class allows the registration of temporal models that are not
42 * necessarily compiled into the GammaLib. It uses the static members 45 * necessarily compiled into the GammaLib. It uses the static members
43 - * m_number, m_names, and m_models which are allocated globally to keep track  
44 - * of temporal models that are available throughout all linked libraries. To 46 + * m_number and m_models which are allocated globally to keep track of
  47 + * temporal models that are available throughout all linked libraries. To
45 * register a temporal model it is sufficient to add 48 * register a temporal model it is sufficient to add
46 * 49 *
47 * const GModelTemporalXXX g_temporal_XXX_seed; 50 * const GModelTemporalXXX g_temporal_XXX_seed;
@@ -65,7 +68,7 @@ public: @@ -65,7 +68,7 @@ public:
65 // Methods 68 // Methods
66 std::string classname(void) const; 69 std::string classname(void) const;
67 int size(void) const; 70 int size(void) const;
68 - GModelTemporal* alloc(const std::string& name) const; 71 + GModelTemporal* alloc(const GXmlElement& xml) const;
69 std::string name(const int& index) const; 72 std::string name(const int& index) const;
70 std::string print(const GChatter& chatter = NORMAL) const; 73 std::string print(const GChatter& chatter = NORMAL) const;
71 74
@@ -85,11 +88,6 @@ private: @@ -85,11 +88,6 @@ private:
85 static int m_number = 0; 88 static int m_number = 0;
86 return m_number; 89 return m_number;
87 }; 90 };
88 - // Model names  
89 - static GRegistryPointer<std::string>& names() {  
90 - static GRegistryPointer<std::string> m_names;  
91 - return m_names;  
92 - };  
93 // Pointer to seed models 91 // Pointer to seed models
94 static GRegistryPointer<const GModelTemporal*>& models() { 92 static GRegistryPointer<const GModelTemporal*>& models() {
95 static GRegistryPointer<const GModelTemporal*> m_models; 93 static GRegistryPointer<const GModelTemporal*> m_models;
inst/cta/src/GCTAModelAeffBackground.cpp
@@ -1107,33 +1107,18 @@ bool GCTAModelAeffBackground::valid_model(void) const @@ -1107,33 +1107,18 @@ bool GCTAModelAeffBackground::valid_model(void) const
1107 1107
1108 1108
1109 /***********************************************************************//** 1109 /***********************************************************************//**
1110 - * @brief Construct spectral model from XML element 1110 + * @brief Return pointer to spectral model from XML element
1111 * 1111 *
1112 - * @param[in] spectral XML element containing spectral model information. 1112 + * @param[in] spectral XML element.
  1113 + * @return Pointer to spectral model.
1113 * 1114 *
1114 - * @exception GException::model_invalid_spectral  
1115 - * Invalid spectral model type encountered.  
1116 - *  
1117 - * Returns pointer to a spectral model that is defined in an XML element. 1115 + * Returns pointer to spectral model that is defined in an XML element.
1118 ***************************************************************************/ 1116 ***************************************************************************/
1119 GModelSpectral* GCTAModelAeffBackground::xml_spectral(const GXmlElement& spectral) const 1117 GModelSpectral* GCTAModelAeffBackground::xml_spectral(const GXmlElement& spectral) const
1120 { 1118 {
1121 - // Get spectral model type  
1122 - std::string type = spectral.attribute("type");  
1123 -  
1124 // Get spectral model 1119 // Get spectral model
1125 GModelSpectralRegistry registry; 1120 GModelSpectralRegistry registry;
1126 - GModelSpectral* ptr = registry.alloc(type);  
1127 -  
1128 - // If model if valid then read model from XML file  
1129 - if (ptr != NULL) {  
1130 - ptr->read(spectral);  
1131 - }  
1132 -  
1133 - // ... otherwise throw an exception  
1134 - else {  
1135 - throw GException::model_invalid_spectral(G_XML_SPECTRAL, type);  
1136 - } 1121 + GModelSpectral* ptr = registry.alloc(spectral);
1137 1122
1138 // Return pointer 1123 // Return pointer
1139 return ptr; 1124 return ptr;
@@ -1141,33 +1126,18 @@ GModelSpectral* GCTAModelAeffBackground::xml_spectral(const GXmlElement&amp; spectra @@ -1141,33 +1126,18 @@ GModelSpectral* GCTAModelAeffBackground::xml_spectral(const GXmlElement&amp; spectra
1141 1126
1142 1127
1143 /***********************************************************************//** 1128 /***********************************************************************//**
1144 - * @brief Construct temporal model from XML element 1129 + * @brief Return pointer to temporal model from XML element
1145 * 1130 *
1146 - * @param[in] temporal XML element containing temporal model information. 1131 + * @param[in] temporal XML element.
  1132 + * @return Pointer to temporal model.
1147 * 1133 *
1148 - * @exception GException::model_invalid_temporal  
1149 - * Invalid temporal model type encountered.  
1150 - *  
1151 - * Returns pointer to a temporal model that is defined in an XML element. 1134 + * Returns pointer to temporal model that is defined in an XML element.
1152 ***************************************************************************/ 1135 ***************************************************************************/
1153 GModelTemporal* GCTAModelAeffBackground::xml_temporal(const GXmlElement& temporal) const 1136 GModelTemporal* GCTAModelAeffBackground::xml_temporal(const GXmlElement& temporal) const
1154 { 1137 {
1155 - // Get temporal model type  
1156 - std::string type = temporal.attribute("type");  
1157 -  
1158 // Get temporal model 1138 // Get temporal model
1159 GModelTemporalRegistry registry; 1139 GModelTemporalRegistry registry;
1160 - GModelTemporal* ptr = registry.alloc(type);  
1161 -  
1162 - // If model if valid then read model from XML file  
1163 - if (ptr != NULL) {  
1164 - ptr->read(temporal);  
1165 - }  
1166 -  
1167 - // ... otherwise throw an exception  
1168 - else {  
1169 - throw GException::model_invalid_temporal(G_XML_TEMPORAL, type);  
1170 - } 1140 + GModelTemporal* ptr = registry.alloc(temporal);
1171 1141
1172 // Return pointer 1142 // Return pointer
1173 return ptr; 1143 return ptr;
inst/cta/src/GCTAModelCubeBackground.cpp
@@ -841,33 +841,18 @@ bool GCTAModelCubeBackground::valid_model(void) const @@ -841,33 +841,18 @@ bool GCTAModelCubeBackground::valid_model(void) const
841 841
842 842
843 /***********************************************************************//** 843 /***********************************************************************//**
844 - * @brief Construct spectral model from XML element 844 + * @brief Return pointer to spectral model from XML element
845 * 845 *
846 - * @param[in] spectral XML element containing spectral model information. 846 + * @param[in] spectral XML element.
  847 + * @return Pointer to spectral model.
847 * 848 *
848 - * @exception GException::model_invalid_spectral  
849 - * Invalid spectral model type encountered.  
850 - *  
851 - * Returns pointer to a spectral model that is defined in an XML element. 849 + * Returns pointer to spectral model that is defined in an XML element.
852 ***************************************************************************/ 850 ***************************************************************************/
853 GModelSpectral* GCTAModelCubeBackground::xml_spectral(const GXmlElement& spectral) const 851 GModelSpectral* GCTAModelCubeBackground::xml_spectral(const GXmlElement& spectral) const
854 { 852 {
855 - // Get spectral model type  
856 - std::string type = spectral.attribute("type");  
857 -  
858 // Get spectral model 853 // Get spectral model
859 GModelSpectralRegistry registry; 854 GModelSpectralRegistry registry;
860 - GModelSpectral* ptr = registry.alloc(type);  
861 -  
862 - // If model if valid then read model from XML file  
863 - if (ptr != NULL) {  
864 - ptr->read(spectral);  
865 - }  
866 -  
867 - // ... otherwise throw an exception  
868 - else {  
869 - throw GException::model_invalid_spectral(G_XML_SPECTRAL, type);  
870 - } 855 + GModelSpectral* ptr = registry.alloc(spectral);
871 856
872 // Return pointer 857 // Return pointer
873 return ptr; 858 return ptr;
@@ -875,33 +860,18 @@ GModelSpectral* GCTAModelCubeBackground::xml_spectral(const GXmlElement&amp; spectra @@ -875,33 +860,18 @@ GModelSpectral* GCTAModelCubeBackground::xml_spectral(const GXmlElement&amp; spectra
875 860
876 861
877 /***********************************************************************//** 862 /***********************************************************************//**
878 - * @brief Construct temporal model from XML element 863 + * @brief Return pointer to temporal model from XML element
879 * 864 *
880 - * @param[in] temporal XML element containing temporal model information. 865 + * @param[in] temporal XML element.
  866 + * @return Pointer to temporal model.
881 * 867 *
882 - * @exception GException::model_invalid_temporal  
883 - * Invalid temporal model type encountered.  
884 - *  
885 - * Returns pointer to a temporal model that is defined in an XML element. 868 + * Returns pointer to temporal model that is defined in an XML element.
886 ***************************************************************************/ 869 ***************************************************************************/
887 GModelTemporal* GCTAModelCubeBackground::xml_temporal(const GXmlElement& temporal) const 870 GModelTemporal* GCTAModelCubeBackground::xml_temporal(const GXmlElement& temporal) const
888 { 871 {
889 - // Get temporal model type  
890 - std::string type = temporal.attribute("type");  
891 -  
892 // Get temporal model 872 // Get temporal model
893 GModelTemporalRegistry registry; 873 GModelTemporalRegistry registry;
894 - GModelTemporal* ptr = registry.alloc(type);  
895 -  
896 - // If model if valid then read model from XML file  
897 - if (ptr != NULL) {  
898 - ptr->read(temporal);  
899 - }  
900 -  
901 - // ... otherwise throw an exception  
902 - else {  
903 - throw GException::model_invalid_temporal(G_XML_TEMPORAL, type);  
904 - } 874 + GModelTemporal* ptr = registry.alloc(temporal);
905 875
906 // Return pointer 876 // Return pointer
907 return ptr; 877 return ptr;
inst/cta/src/GCTAModelIrfBackground.cpp
@@ -1098,33 +1098,18 @@ bool GCTAModelIrfBackground::valid_model(void) const @@ -1098,33 +1098,18 @@ bool GCTAModelIrfBackground::valid_model(void) const
1098 1098
1099 1099
1100 /***********************************************************************//** 1100 /***********************************************************************//**
1101 - * @brief Construct spectral model from XML element 1101 + * @brief Return pointer to spectral model from XML element
1102 * 1102 *
1103 - * @param[in] spectral XML element containing spectral model information. 1103 + * @param[in] spectral XML element.
  1104 + * @return Pointer to spectral model.
1104 * 1105 *
1105 - * @exception GException::model_invalid_spectral  
1106 - * Invalid spectral model type encountered.  
1107 - *  
1108 - * Returns pointer to a spectral model that is defined in an XML element. 1106 + * Returns pointer to spectral model that is defined in an XML element.
1109 ***************************************************************************/ 1107 ***************************************************************************/
1110 GModelSpectral* GCTAModelIrfBackground::xml_spectral(const GXmlElement& spectral) const 1108 GModelSpectral* GCTAModelIrfBackground::xml_spectral(const GXmlElement& spectral) const
1111 { 1109 {
1112 - // Get spectral model type  
1113 - std::string type = spectral.attribute("type");  
1114 -  
1115 // Get spectral model 1110 // Get spectral model
1116 GModelSpectralRegistry registry; 1111 GModelSpectralRegistry registry;
1117 - GModelSpectral* ptr = registry.alloc(type);  
1118 -  
1119 - // If model if valid then read model from XML file  
1120 - if (ptr != NULL) {  
1121 - ptr->read(spectral);  
1122 - }  
1123 -  
1124 - // ... otherwise throw an exception  
1125 - else {  
1126 - throw GException::model_invalid_spectral(G_XML_SPECTRAL, type);  
1127 - } 1112 + GModelSpectral* ptr = registry.alloc(spectral);
1128 1113
1129 // Return pointer 1114 // Return pointer
1130 return ptr; 1115 return ptr;
@@ -1132,33 +1117,18 @@ GModelSpectral* GCTAModelIrfBackground::xml_spectral(const GXmlElement&amp; spectral @@ -1132,33 +1117,18 @@ GModelSpectral* GCTAModelIrfBackground::xml_spectral(const GXmlElement&amp; spectral
1132 1117
1133 1118
1134 /***********************************************************************//** 1119 /***********************************************************************//**
1135 - * @brief Construct temporal model from XML element 1120 + * @brief Return pointer to temporal model from XML element
1136 * 1121 *
1137 - * @param[in] temporal XML element containing temporal model information. 1122 + * @param[in] temporal XML element.
  1123 + * @return Pointer to temporal model.
1138 * 1124 *
1139 - * @exception GException::model_invalid_temporal  
1140 - * Invalid temporal model type encountered.  
1141 - *  
1142 - * Returns pointer to a temporal model that is defined in an XML element. 1125 + * Returns pointer to temporal model that is defined in an XML element.
1143 ***************************************************************************/ 1126 ***************************************************************************/
1144 GModelTemporal* GCTAModelIrfBackground::xml_temporal(const GXmlElement& temporal) const 1127 GModelTemporal* GCTAModelIrfBackground::xml_temporal(const GXmlElement& temporal) const
1145 { 1128 {
1146 - // Get temporal model type  
1147 - std::string type = temporal.attribute("type");  
1148 -  
1149 // Get temporal model 1129 // Get temporal model
1150 GModelTemporalRegistry registry; 1130 GModelTemporalRegistry registry;
1151 - GModelTemporal* ptr = registry.alloc(type);  
1152 -  
1153 - // If model if valid then read model from XML file  
1154 - if (ptr != NULL) {  
1155 - ptr->read(temporal);  
1156 - }  
1157 -  
1158 - // ... otherwise throw an exception  
1159 - else {  
1160 - throw GException::model_invalid_temporal(G_XML_TEMPORAL, type);  
1161 - } 1131 + GModelTemporal* ptr = registry.alloc(temporal);
1162 1132
1163 // Return pointer 1133 // Return pointer
1164 return ptr; 1134 return ptr;
inst/cta/src/GCTAModelRadialAcceptance.cpp
@@ -979,33 +979,18 @@ GCTAModelRadial* GCTAModelRadialAcceptance::xml_radial(const GXmlElement&amp; radial @@ -979,33 +979,18 @@ GCTAModelRadial* GCTAModelRadialAcceptance::xml_radial(const GXmlElement&amp; radial
979 979
980 980
981 /***********************************************************************//** 981 /***********************************************************************//**
982 - * @brief Construct spectral model from XML element 982 + * @brief Return pointer to spectral model from XML element
983 * 983 *
984 - * @param[in] spectral XML element containing spectral model information. 984 + * @param[in] spectral XML element.
  985 + * @return Pointer to spectral model.
985 * 986 *
986 - * @exception GException::model_invalid_spectral  
987 - * Invalid spectral model type encountered.  
988 - *  
989 - * Returns pointer to a spectral model that is defined in an XML element. 987 + * Returns pointer to spectral model that is defined in an XML element.
990 ***************************************************************************/ 988 ***************************************************************************/
991 GModelSpectral* GCTAModelRadialAcceptance::xml_spectral(const GXmlElement& spectral) const 989 GModelSpectral* GCTAModelRadialAcceptance::xml_spectral(const GXmlElement& spectral) const
992 { 990 {
993 - // Get spectral model type  
994 - std::string type = spectral.attribute("type");  
995 -  
996 // Get spectral model 991 // Get spectral model
997 GModelSpectralRegistry registry; 992 GModelSpectralRegistry registry;
998 - GModelSpectral* ptr = registry.alloc(type);  
999 -  
1000 - // If model if valid then read model from XML file  
1001 - if (ptr != NULL) {  
1002 - ptr->read(spectral);  
1003 - }  
1004 -  
1005 - // ... otherwise throw an exception  
1006 - else {  
1007 - throw GException::model_invalid_spectral(G_XML_SPECTRAL, type);  
1008 - } 993 + GModelSpectral* ptr = registry.alloc(spectral);
1009 994
1010 // Return pointer 995 // Return pointer
1011 return ptr; 996 return ptr;
@@ -1013,33 +998,18 @@ GModelSpectral* GCTAModelRadialAcceptance::xml_spectral(const GXmlElement&amp; spect @@ -1013,33 +998,18 @@ GModelSpectral* GCTAModelRadialAcceptance::xml_spectral(const GXmlElement&amp; spect
1013 998
1014 999
1015 /***********************************************************************//** 1000 /***********************************************************************//**
1016 - * @brief Construct temporal model from XML element 1001 + * @brief Return pointer to temporal model from XML element
1017 * 1002 *
1018 - * @param[in] temporal XML element containing temporal model information. 1003 + * @param[in] temporal XML element.
  1004 + * @return Pointer to temporal model.
1019 * 1005 *
1020 - * @exception GException::model_invalid_temporal  
1021 - * Invalid temporal model type encountered.  
1022 - *  
1023 - * Returns pointer to a temporal model that is defined in an XML element. 1006 + * Returns pointer to temporal model that is defined in an XML element.
1024 ***************************************************************************/ 1007 ***************************************************************************/
1025 GModelTemporal* GCTAModelRadialAcceptance::xml_temporal(const GXmlElement& temporal) const 1008 GModelTemporal* GCTAModelRadialAcceptance::xml_temporal(const GXmlElement& temporal) const
1026 { 1009 {
1027 - // Get temporal model type  
1028 - std::string type = temporal.attribute("type");  
1029 -  
1030 // Get temporal model 1010 // Get temporal model
1031 GModelTemporalRegistry registry; 1011 GModelTemporalRegistry registry;
1032 - GModelTemporal* ptr = registry.alloc(type);  
1033 -  
1034 - // If model if valid then read model from XML file  
1035 - if (ptr != NULL) {  
1036 - ptr->read(temporal);  
1037 - }  
1038 -  
1039 - // ... otherwise throw an exception  
1040 - else {  
1041 - throw GException::model_invalid_temporal(G_XML_TEMPORAL, type);  
1042 - } 1012 + GModelTemporal* ptr = registry.alloc(temporal);
1043 1013
1044 // Return pointer 1014 // Return pointer
1045 return ptr; 1015 return ptr;
pyext/GModelSpatialRegistry.i
1 /*************************************************************************** 1 /***************************************************************************
2 * GModelSpatialRegistry.i - Spatial model registry class * 2 * GModelSpatialRegistry.i - Spatial model registry class *
3 * ----------------------------------------------------------------------- * 3 * ----------------------------------------------------------------------- *
4 - * copyright (C) 2011-2015 by Juergen Knoedlseder * 4 + * copyright (C) 2011-2016 by Juergen Knoedlseder *
5 * ----------------------------------------------------------------------- * 5 * ----------------------------------------------------------------------- *
6 * * 6 * *
7 * This program is free software: you can redistribute it and/or modify * 7 * This program is free software: you can redistribute it and/or modify *
@@ -46,7 +46,7 @@ public: @@ -46,7 +46,7 @@ public:
46 // Methods 46 // Methods
47 std::string classname(void) const; 47 std::string classname(void) const;
48 int size(void) const; 48 int size(void) const;
49 - GModelSpatial* alloc(const std::string& name) const; 49 + GModelSpatial* alloc(const GXmlElement& xml) const;
50 std::string name(const int& index) const; 50 std::string name(const int& index) const;
51 }; 51 };
52 52
pyext/GModelSpectralRegistry.i
1 /*************************************************************************** 1 /***************************************************************************
2 * GModelSpectralRegistry.i - Spectral model registry class * 2 * GModelSpectralRegistry.i - Spectral model registry class *
3 * ----------------------------------------------------------------------- * 3 * ----------------------------------------------------------------------- *
4 - * copyright (C) 2011-2015 by Juergen Knoedlseder * 4 + * copyright (C) 2011-2016 by Juergen Knoedlseder *
5 * ----------------------------------------------------------------------- * 5 * ----------------------------------------------------------------------- *
6 * * 6 * *
7 * This program is free software: you can redistribute it and/or modify * 7 * This program is free software: you can redistribute it and/or modify *
@@ -46,7 +46,7 @@ public: @@ -46,7 +46,7 @@ public:
46 // Methods 46 // Methods
47 std::string classname(void) const; 47 std::string classname(void) const;
48 int size(void) const; 48 int size(void) const;
49 - GModelSpectral* alloc(const std::string& name) const; 49 + GModelSpectral* alloc(const GXmlElement& xml) const;
50 std::string name(const int& index) const; 50 std::string name(const int& index) const;
51 }; 51 };
52 52
pyext/GModelTemporalRegistry.i
1 /*************************************************************************** 1 /***************************************************************************
2 * GModelTemporalRegistry.i - Temporal model registry class * 2 * GModelTemporalRegistry.i - Temporal model registry class *
3 * ----------------------------------------------------------------------- * 3 * ----------------------------------------------------------------------- *
4 - * copyright (C) 2011-2015 by Juergen Knoedlseder * 4 + * copyright (C) 2011-2016 by Juergen Knoedlseder *
5 * ----------------------------------------------------------------------- * 5 * ----------------------------------------------------------------------- *
6 * * 6 * *
7 * This program is free software: you can redistribute it and/or modify * 7 * This program is free software: you can redistribute it and/or modify *
@@ -46,7 +46,7 @@ public: @@ -46,7 +46,7 @@ public:
46 // Methods 46 // Methods
47 std::string classname(void) const; 47 std::string classname(void) const;
48 int size(void) const; 48 int size(void) const;
49 - GModelTemporal* alloc(const std::string& name) const; 49 + GModelTemporal* alloc(const GXmlElement& xml) const;
50 std::string name(const int& index) const; 50 std::string name(const int& index) const;
51 }; 51 };
52 52
src/model/GModelSky.cpp
@@ -1170,32 +1170,18 @@ void GModelSky::set_type(void) @@ -1170,32 +1170,18 @@ void GModelSky::set_type(void)
1170 1170
1171 1171
1172 /***********************************************************************//** 1172 /***********************************************************************//**
1173 - * @brief Construct spatial model from XML element 1173 + * @brief Return pointer to spatial model from XML element
1174 * 1174 *
1175 - * @param[in] spatial XML element containing spatial model information. 1175 + * @param[in] spatial XML element.
1176 * @return Pointer to spatial model. 1176 * @return Pointer to spatial model.
1177 * 1177 *
1178 - * @exception GException::model_invalid_spatial  
1179 - * Invalid spatial model type encountered. 1178 + * Returns pointer to spatial model that is defined in an XML element.
1180 ***************************************************************************/ 1179 ***************************************************************************/
1181 GModelSpatial* GModelSky::xml_spatial(const GXmlElement& spatial) const 1180 GModelSpatial* GModelSky::xml_spatial(const GXmlElement& spatial) const
1182 { 1181 {
1183 - // Get spatial model type  
1184 - std::string type = spatial.attribute("type");  
1185 -  
1186 // Get spatial model 1182 // Get spatial model
1187 GModelSpatialRegistry registry; 1183 GModelSpatialRegistry registry;
1188 - GModelSpatial* ptr = registry.alloc(type);  
1189 -  
1190 - // If model if valid then read model from XML file  
1191 - if (ptr != NULL) {  
1192 - ptr->read(spatial);  
1193 - }  
1194 -  
1195 - // ... otherwise throw an exception  
1196 - else {  
1197 - throw GException::model_invalid_spatial(G_XML_SPATIAL, type);  
1198 - } 1184 + GModelSpatial* ptr = registry.alloc(spatial);
1199 1185
1200 // Return pointer 1186 // Return pointer
1201 return ptr; 1187 return ptr;
@@ -1203,32 +1189,18 @@ GModelSpatial* GModelSky::xml_spatial(const GXmlElement&amp; spatial) const @@ -1203,32 +1189,18 @@ GModelSpatial* GModelSky::xml_spatial(const GXmlElement&amp; spatial) const
1203 1189
1204 1190
1205 /***********************************************************************//** 1191 /***********************************************************************//**
1206 - * @brief Construct spectral model from XML element 1192 + * @brief Return pointer to spectral model from XML element
1207 * 1193 *
1208 - * @param[in] spectral XML element containing spectral model information. 1194 + * @param[in] spectral XML element.
1209 * @return Pointer to spectral model. 1195 * @return Pointer to spectral model.
1210 * 1196 *
1211 - * @exception GException::model_invalid_spectral  
1212 - * Invalid spatial model type encountered. 1197 + * Returns pointer to spectral model that is defined in an XML element.
1213 ***************************************************************************/ 1198 ***************************************************************************/
1214 GModelSpectral* GModelSky::xml_spectral(const GXmlElement& spectral) const 1199 GModelSpectral* GModelSky::xml_spectral(const GXmlElement& spectral) const
1215 { 1200 {
1216 - // Get spectral model type  
1217 - std::string type = spectral.attribute("type");  
1218 -  
1219 // Get spectral model 1201 // Get spectral model
1220 GModelSpectralRegistry registry; 1202 GModelSpectralRegistry registry;
1221 - GModelSpectral* ptr = registry.alloc(type);  
1222 -  
1223 - // If model if valid then read model from XML file  
1224 - if (ptr != NULL) {  
1225 - ptr->read(spectral);  
1226 - }  
1227 -  
1228 - // ... otherwise throw an exception  
1229 - else {  
1230 - throw GException::model_invalid_spectral(G_XML_SPECTRAL, type);  
1231 - } 1203 + GModelSpectral* ptr = registry.alloc(spectral);
1232 1204
1233 // Return pointer 1205 // Return pointer
1234 return ptr; 1206 return ptr;
@@ -1236,32 +1208,18 @@ GModelSpectral* GModelSky::xml_spectral(const GXmlElement&amp; spectral) const @@ -1236,32 +1208,18 @@ GModelSpectral* GModelSky::xml_spectral(const GXmlElement&amp; spectral) const
1236 1208
1237 1209
1238 /***********************************************************************//** 1210 /***********************************************************************//**
1239 - * @brief Construct temporal model from XML element 1211 + * @brief Return pointer to temporal model from XML element
1240 * 1212 *
1241 - * @param[in] temporal XML element containing temporal model information. 1213 + * @param[in] temporal XML element.
1242 * @return Pointer to temporal model. 1214 * @return Pointer to temporal model.
1243 * 1215 *
1244 - * @exception GException::model_invalid_temporal  
1245 - * Invalid spatial model type encountered. 1216 + * Returns pointer to temporal model that is defined in an XML element.
1246 ***************************************************************************/ 1217 ***************************************************************************/
1247 GModelTemporal* GModelSky::xml_temporal(const GXmlElement& temporal) const 1218 GModelTemporal* GModelSky::xml_temporal(const GXmlElement& temporal) const
1248 { 1219 {
1249 - // Get temporal model type  
1250 - std::string type = temporal.attribute("type");  
1251 -  
1252 // Get temporal model 1220 // Get temporal model
1253 GModelTemporalRegistry registry; 1221 GModelTemporalRegistry registry;
1254 - GModelTemporal* ptr = registry.alloc(type);  
1255 -  
1256 - // If model if valid then read model from XML file  
1257 - if (ptr != NULL) {  
1258 - ptr->read(temporal);  
1259 - }  
1260 -  
1261 - // ... otherwise throw an exception  
1262 - else {  
1263 - throw GException::model_invalid_temporal(G_XML_TEMPORAL, type);  
1264 - } 1222 + GModelTemporal* ptr = registry.alloc(temporal);
1265 1223
1266 // Return pointer 1224 // Return pointer
1267 return ptr; 1225 return ptr;
src/model/GModelSpatialRegistry.cpp
@@ -28,11 +28,14 @@ @@ -28,11 +28,14 @@
28 #ifdef HAVE_CONFIG_H 28 #ifdef HAVE_CONFIG_H
29 #include <config.h> 29 #include <config.h>
30 #endif 30 #endif
  31 +#include "GModelPar.hpp"
  32 +#include "GModelSpatial.hpp"
31 #include "GModelSpatialRegistry.hpp" 33 #include "GModelSpatialRegistry.hpp"
32 #include "GException.hpp" 34 #include "GException.hpp"
33 #include "GTools.hpp" 35 #include "GTools.hpp"
34 36
35 /* __ Method name definitions ____________________________________________ */ 37 /* __ Method name definitions ____________________________________________ */
  38 +#define G_ALLOC "GModelSpatialRegistry::alloc(GXmlElement&)"
36 #define G_NAME "GModelSpatialRegistry::name(int&)" 39 #define G_NAME "GModelSpatialRegistry::name(int&)"
37 40
38 /* __ Macros _____________________________________________________________ */ 41 /* __ Macros _____________________________________________________________ */
@@ -61,7 +64,7 @@ GModelSpatialRegistry::GModelSpatialRegistry(void) @@ -61,7 +64,7 @@ GModelSpatialRegistry::GModelSpatialRegistry(void)
61 #if defined(G_DEBUG_REGISTRY) 64 #if defined(G_DEBUG_REGISTRY)
62 std::cout << "GModelSpatialRegistry(void): "; 65 std::cout << "GModelSpatialRegistry(void): ";
63 for (int i = 0; i < size(); ++i) { 66 for (int i = 0; i < size(); ++i) {
64 - std::cout << "\"" << names()[i] << "\" "; 67 + std::cout << "\"" << models()[i]->type() << "\" ";
65 } 68 }
66 std::cout << std::endl; 69 std::cout << std::endl;
67 #endif 70 #endif
@@ -91,21 +94,17 @@ GModelSpatialRegistry::GModelSpatialRegistry(const GModelSpatial* model) @@ -91,21 +94,17 @@ GModelSpatialRegistry::GModelSpatialRegistry(const GModelSpatial* model)
91 #endif 94 #endif
92 95
93 // Allocate new registry 96 // Allocate new registry
94 - std::string* new_names = new std::string[size()+1];  
95 const GModelSpatial** new_models = new const GModelSpatial*[size()+1]; 97 const GModelSpatial** new_models = new const GModelSpatial*[size()+1];
96 98
97 // Save old registry 99 // Save old registry
98 for (int i = 0; i < size(); ++i) { 100 for (int i = 0; i < size(); ++i) {
99 - new_names[i] = names()[i];  
100 new_models[i] = models()[i]; 101 new_models[i] = models()[i];
101 } 102 }
102 103
103 // Add new model to registry 104 // Add new model to registry
104 - new_names[size()] = model->type();  
105 new_models[size()] = model; 105 new_models[size()] = model;
106 106
107 // Set pointers on new registry 107 // Set pointers on new registry
108 - names().assign(new_names);  
109 models().assign(new_models); 108 models().assign(new_models);
110 109
111 // Increment number of models in registry 110 // Increment number of models in registry
@@ -115,7 +114,7 @@ GModelSpatialRegistry::GModelSpatialRegistry(const GModelSpatial* model) @@ -115,7 +114,7 @@ GModelSpatialRegistry::GModelSpatialRegistry(const GModelSpatial* model)
115 #if defined(G_DEBUG_REGISTRY) 114 #if defined(G_DEBUG_REGISTRY)
116 std::cout << "GModelSpatialRegistry(const GModelSpatial*): "; 115 std::cout << "GModelSpatialRegistry(const GModelSpatial*): ";
117 for (int i = 0; i < size(); ++i) { 116 for (int i = 0; i < size(); ++i) {
118 - std::cout << "\"" << names()[i] << "\" "; 117 + std::cout << "\"" << models()[i]->type() << "\" ";
119 } 118 }
120 std::cout << std::endl; 119 std::cout << std::endl;
121 #endif 120 #endif
@@ -196,29 +195,47 @@ GModelSpatialRegistry&amp; GModelSpatialRegistry::operator=(const GModelSpatialRegis @@ -196,29 +195,47 @@ GModelSpatialRegistry&amp; GModelSpatialRegistry::operator=(const GModelSpatialRegis
196 ==========================================================================*/ 195 ==========================================================================*/
197 196
198 /***********************************************************************//** 197 /***********************************************************************//**
199 - * @brief Allocate spatial model of given name 198 + * @brief Allocate spatial model that is found in XML element
200 * 199 *
201 - * @param[in] name Model name.  
202 - * @return Pointer to model (NULL if name is not registered). 200 + * @param[in] xml XML element.
  201 + * @return Pointer to spatial model.
203 * 202 *
204 - * Returns a pointer to a void spatial model instance of the specified  
205 - * name. If the name has not been found in the registry, a NULL pointer is  
206 - * returned. 203 + * @exception GException::invalid_value
  204 + * No appropriate spatial model found in XML element.
  205 + *
  206 + * Returns a pointer to a spatial model instance that corresponds to the
  207 + * type found in an XML element. If no appropriate model is found the method
  208 + * will throw an exception.
207 ***************************************************************************/ 209 ***************************************************************************/
208 -GModelSpatial* GModelSpatialRegistry::alloc(const std::string& name) const 210 +GModelSpatial* GModelSpatialRegistry::alloc(const GXmlElement& xml) const
209 { 211 {
210 // Initialise spatial model 212 // Initialise spatial model
211 GModelSpatial* model = NULL; 213 GModelSpatial* model = NULL;
212 214
213 - // Search for model in registry 215 + // Search for model type in registry
214 for (int i = 0; i < size(); ++i) { 216 for (int i = 0; i < size(); ++i) {
215 - if (names()[i] == name) { 217 + if (models()[i]->type() == xml.attribute("type")) {
216 model = models()[i]->clone(); 218 model = models()[i]->clone();
217 break; 219 break;
218 } 220 }
219 } 221 }
220 222
221 - // Return spatial model 223 + // If no model has been found then throw an exception
  224 + if (model == NULL) {
  225 + std::string msg = "Spatial model of type \""+xml.attribute("type")+
  226 + "\" not found in registry. Possible spatial model "
  227 + "types are:";
  228 + for (int i = 0; i < size(); ++i) {
  229 + msg += " \""+models()[i]->type()+"\"";
  230 + }
  231 + msg += ".";
  232 + throw GException::invalid_value(G_ALLOC, msg);
  233 + }
  234 +
  235 + // Read model from XML element
  236 + model->read(xml);
  237 +
  238 + // Return spectral model
222 return model; 239 return model;
223 } 240 }
224 241
@@ -237,12 +254,13 @@ std::string GModelSpatialRegistry::name(const int&amp; index) const @@ -237,12 +254,13 @@ std::string GModelSpatialRegistry::name(const int&amp; index) const
237 // Compile option: raise exception if index is out of range 254 // Compile option: raise exception if index is out of range
238 #if defined(G_RANGE_CHECK) 255 #if defined(G_RANGE_CHECK)
239 if (index < 0 || index >= size()) { 256 if (index < 0 || index >= size()) {
240 - throw GException::out_of_range(G_NAME, index, 0, size()-1); 257 + throw GException::out_of_range(G_NAME, "Spatial model index", index,
  258 + size());
241 } 259 }
242 #endif 260 #endif
243 261
244 // Return name 262 // Return name
245 - return (names()[index]); 263 + return (models()[index]->type());
246 } 264 }
247 265
248 266
@@ -270,8 +288,15 @@ std::string GModelSpatialRegistry::print(const GChatter&amp; chatter) const @@ -270,8 +288,15 @@ std::string GModelSpatialRegistry::print(const GChatter&amp; chatter) const
270 // NORMAL: Append models 288 // NORMAL: Append models
271 if (chatter >= NORMAL) { 289 if (chatter >= NORMAL) {
272 for (int i = 0; i < size(); ++i) { 290 for (int i = 0; i < size(); ++i) {
273 - result.append("\n"+gammalib::parformat(names()[i]));  
274 - result.append(models()[i]->type()); 291 + result.append("\n"+gammalib::parformat(models()[i]->type()));
  292 + for (int k = 0; k < models()[i]->size(); ++k) {
  293 + if (k > 0) {
  294 + result.append(", ");
  295 + }
  296 + result.append("\"");
  297 + result.append((*(models()[i]))[k].name());
  298 + result.append("\"");
  299 + }
275 } 300 }
276 } 301 }
277 302
src/model/GModelSpectralRegistry.cpp
1 /*************************************************************************** 1 /***************************************************************************
2 * GModelSpectralRegistry.cpp - Spectral model registry class * 2 * GModelSpectralRegistry.cpp - Spectral model registry class *
3 * ----------------------------------------------------------------------- * 3 * ----------------------------------------------------------------------- *
4 - * copyright (C) 2011-2013 by Juergen Knoedlseder * 4 + * copyright (C) 2011-2016 by Juergen Knoedlseder *
5 * ----------------------------------------------------------------------- * 5 * ----------------------------------------------------------------------- *
6 * * 6 * *
7 * This program is free software: you can redistribute it and/or modify * 7 * This program is free software: you can redistribute it and/or modify *
@@ -28,11 +28,14 @@ @@ -28,11 +28,14 @@
28 #ifdef HAVE_CONFIG_H 28 #ifdef HAVE_CONFIG_H
29 #include <config.h> 29 #include <config.h>
30 #endif 30 #endif
  31 +#include "GModelPar.hpp"
  32 +#include "GModelSpectral.hpp"
31 #include "GModelSpectralRegistry.hpp" 33 #include "GModelSpectralRegistry.hpp"
32 #include "GException.hpp" 34 #include "GException.hpp"
33 #include "GTools.hpp" 35 #include "GTools.hpp"
34 36
35 /* __ Method name definitions ____________________________________________ */ 37 /* __ Method name definitions ____________________________________________ */
  38 +#define G_ALLOC "GModelSpectralRegistry::alloc(GXmlElement&)"
36 #define G_NAME "GModelSpectralRegistry::name(int&)" 39 #define G_NAME "GModelSpectralRegistry::name(int&)"
37 40
38 /* __ Macros _____________________________________________________________ */ 41 /* __ Macros _____________________________________________________________ */
@@ -61,7 +64,7 @@ GModelSpectralRegistry::GModelSpectralRegistry(void) @@ -61,7 +64,7 @@ GModelSpectralRegistry::GModelSpectralRegistry(void)
61 #if G_DEBUG_REGISTRY 64 #if G_DEBUG_REGISTRY
62 std::cout << "GModelSpectralRegistry(void): "; 65 std::cout << "GModelSpectralRegistry(void): ";
63 for (int i = 0; i < size(); ++i) { 66 for (int i = 0; i < size(); ++i) {
64 - std::cout << "\"" << names()[i] << "\" "; 67 + std::cout << "\"" << models()[i]->type() << "\" ";
65 } 68 }
66 std::cout << std::endl; 69 std::cout << std::endl;
67 #endif 70 #endif
@@ -75,6 +78,9 @@ GModelSpectralRegistry::GModelSpectralRegistry(void) @@ -75,6 +78,9 @@ GModelSpectralRegistry::GModelSpectralRegistry(void)
75 * @brief Model constructor 78 * @brief Model constructor
76 * 79 *
77 * @param[in] model Model. 80 * @param[in] model Model.
  81 + *
  82 + * Construct registry by adding a model to the registry. This is the standard
  83 + * constructor that is used to register a new model to GammaLib.
78 ***************************************************************************/ 84 ***************************************************************************/
79 GModelSpectralRegistry::GModelSpectralRegistry(const GModelSpectral* model) 85 GModelSpectralRegistry::GModelSpectralRegistry(const GModelSpectral* model)
80 { 86 {
@@ -88,21 +94,17 @@ GModelSpectralRegistry::GModelSpectralRegistry(const GModelSpectral* model) @@ -88,21 +94,17 @@ GModelSpectralRegistry::GModelSpectralRegistry(const GModelSpectral* model)
88 #endif 94 #endif
89 95
90 // Allocate new registry 96 // Allocate new registry
91 - std::string* new_names = new std::string[size()+1];  
92 const GModelSpectral** new_models = new const GModelSpectral*[size()+1]; 97 const GModelSpectral** new_models = new const GModelSpectral*[size()+1];
93 98
94 // Save old registry 99 // Save old registry
95 for (int i = 0; i < size(); ++i) { 100 for (int i = 0; i < size(); ++i) {
96 - new_names[i] = names()[i];  
97 new_models[i] = models()[i]; 101 new_models[i] = models()[i];
98 } 102 }
99 103
100 // Add new model to registry 104 // Add new model to registry
101 - new_names[size()] = model->type();  
102 new_models[size()] = model; 105 new_models[size()] = model;
103 106
104 // Set pointers on new registry 107 // Set pointers on new registry
105 - names().assign(new_names);  
106 models().assign(new_models); 108 models().assign(new_models);
107 109
108 // Increment number of models in registry 110 // Increment number of models in registry
@@ -110,9 +112,9 @@ GModelSpectralRegistry::GModelSpectralRegistry(const GModelSpectral* model) @@ -110,9 +112,9 @@ GModelSpectralRegistry::GModelSpectralRegistry(const GModelSpectral* model)
110 112
111 // Debug option: Show actual registry 113 // Debug option: Show actual registry
112 #if G_DEBUG_REGISTRY 114 #if G_DEBUG_REGISTRY
113 - std::cout << "GModelSpectralRegistry(const GModelSpatial*): "; 115 + std::cout << "GModelSpectralRegistry(const GModelSpectral*): ";
114 for (int i = 0; i < size(); ++i) { 116 for (int i = 0; i < size(); ++i) {
115 - std::cout << "\"" << names()[i] << "\" "; 117 + std::cout << "\"" << models()[i]->type() << "\" ";
116 } 118 }
117 std::cout << std::endl; 119 std::cout << std::endl;
118 #endif 120 #endif
@@ -165,7 +167,7 @@ GModelSpectralRegistry::~GModelSpectralRegistry(void) @@ -165,7 +167,7 @@ GModelSpectralRegistry::~GModelSpectralRegistry(void)
165 * @param[in] registry Registry. 167 * @param[in] registry Registry.
166 * @return Reference to registry. 168 * @return Reference to registry.
167 ***************************************************************************/ 169 ***************************************************************************/
168 -GModelSpectralRegistry& GModelSpectralRegistry::operator= (const GModelSpectralRegistry& registry) 170 +GModelSpectralRegistry& GModelSpectralRegistry::operator=(const GModelSpectralRegistry& registry)
169 { 171 {
170 // Execute only if object is not identical 172 // Execute only if object is not identical
171 if (this != &registry) { 173 if (this != &registry) {
@@ -193,28 +195,46 @@ GModelSpectralRegistry&amp; GModelSpectralRegistry::operator= (const GModelSpectralR @@ -193,28 +195,46 @@ GModelSpectralRegistry&amp; GModelSpectralRegistry::operator= (const GModelSpectralR
193 ==========================================================================*/ 195 ==========================================================================*/
194 196
195 /***********************************************************************//** 197 /***********************************************************************//**
196 - * @brief Allocate spectral model of given name 198 + * @brief Allocate spectral model that is found in XML element
197 * 199 *
198 - * @param[in] name Spectral model name.  
199 - * @return Pointer to spectral model (NULL if name is not registered). 200 + * @param[in] xml XML element.
  201 + * @return Pointer to spectral model.
200 * 202 *
201 - * Returns a pointer to a spectral model instance of the specified name.  
202 - * If the name has not been found in the registry, a NULL pointer is  
203 - * returned. 203 + * @exception GException::invalid_value
  204 + * No appropriate spectral model found in XML element.
  205 + *
  206 + * Returns a pointer to a spectral model instance that corresponds to the
  207 + * type and parameters found in an XML element. If no appropriate model is
  208 + * found the method will throw an exception.
204 ***************************************************************************/ 209 ***************************************************************************/
205 -GModelSpectral* GModelSpectralRegistry::alloc(const std::string& name) const 210 +GModelSpectral* GModelSpectralRegistry::alloc(const GXmlElement& xml) const
206 { 211 {
207 // Initialise spectral model 212 // Initialise spectral model
208 GModelSpectral* model = NULL; 213 GModelSpectral* model = NULL;
209 214
210 - // Search for model in registry 215 + // Search for model type in registry
211 for (int i = 0; i < size(); ++i) { 216 for (int i = 0; i < size(); ++i) {
212 - if (names()[i] == name) { 217 + if (models()[i]->type() == xml.attribute("type")) {
213 model = models()[i]->clone(); 218 model = models()[i]->clone();
214 break; 219 break;
215 } 220 }
216 } 221 }
217 222
  223 + // If no model has been found then throw an exception
  224 + if (model == NULL) {
  225 + std::string msg = "Spectral model of type \""+xml.attribute("type")+
  226 + "\" not found in registry. Possible spectral model "
  227 + "types are:";
  228 + for (int i = 0; i < size(); ++i) {
  229 + msg += " \""+models()[i]->type()+"\"";
  230 + }
  231 + msg += ".";
  232 + throw GException::invalid_value(G_ALLOC, msg);
  233 + }
  234 +
  235 + // Read model from XML element
  236 + model->read(xml);
  237 +
218 // Return spectral model 238 // Return spectral model
219 return model; 239 return model;
220 } 240 }
@@ -234,19 +254,20 @@ std::string GModelSpectralRegistry::name(const int&amp; index) const @@ -234,19 +254,20 @@ std::string GModelSpectralRegistry::name(const int&amp; index) const
234 // Compile option: raise exception if index is out of range 254 // Compile option: raise exception if index is out of range
235 #if defined(G_RANGE_CHECK) 255 #if defined(G_RANGE_CHECK)
236 if (index < 0 || index >= size()) { 256 if (index < 0 || index >= size()) {
237 - throw GException::out_of_range(G_NAME, index, 0, size()-1); 257 + throw GException::out_of_range(G_NAME, "Spectral model index", index,
  258 + size());
238 } 259 }
239 #endif 260 #endif
240 261
241 // Return name 262 // Return name
242 - return (names()[index]); 263 + return (models()[index]->type());
243 } 264 }
244 265
245 266
246 /***********************************************************************//** 267 /***********************************************************************//**
247 * @brief Print registry information 268 * @brief Print registry information
248 * 269 *
249 - * @param[in] chatter Chattiness (defaults to NORMAL). 270 + * @param[in] chatter Chattiness.
250 * @return Registry content. 271 * @return Registry content.
251 ***************************************************************************/ 272 ***************************************************************************/
252 std::string GModelSpectralRegistry::print(const GChatter& chatter) const 273 std::string GModelSpectralRegistry::print(const GChatter& chatter) const
@@ -265,8 +286,15 @@ std::string GModelSpectralRegistry::print(const GChatter&amp; chatter) const @@ -265,8 +286,15 @@ std::string GModelSpectralRegistry::print(const GChatter&amp; chatter) const
265 // NORMAL: Append models 286 // NORMAL: Append models
266 if (chatter >= NORMAL) { 287 if (chatter >= NORMAL) {
267 for (int i = 0; i < size(); ++i) { 288 for (int i = 0; i < size(); ++i) {
268 - result.append("\n"+gammalib::parformat(names()[i]));  
269 - result.append(models()[i]->type()); 289 + result.append("\n"+gammalib::parformat(models()[i]->type()));
  290 + for (int k = 0; k < models()[i]->size(); ++k) {
  291 + if (k > 0) {
  292 + result.append(", ");
  293 + }
  294 + result.append("\"");
  295 + result.append((*(models()[i]))[k].name());
  296 + result.append("\"");
  297 + }
270 } 298 }
271 } 299 }
272 300
@@ -276,6 +304,7 @@ std::string GModelSpectralRegistry::print(const GChatter&amp; chatter) const @@ -276,6 +304,7 @@ std::string GModelSpectralRegistry::print(const GChatter&amp; chatter) const
276 return result; 304 return result;
277 } 305 }
278 306
  307 +
279 /*========================================================================== 308 /*==========================================================================
280 = = 309 = =
281 = Private methods = 310 = Private methods =
src/model/GModelTemporalRegistry.cpp
1 /*************************************************************************** 1 /***************************************************************************
2 * GModelTemporalRegistry.cpp - Temporal model registry class * 2 * GModelTemporalRegistry.cpp - Temporal model registry class *
3 * ----------------------------------------------------------------------- * 3 * ----------------------------------------------------------------------- *
4 - * copyright (C) 2011-2013 by Juergen Knoedlseder * 4 + * copyright (C) 2011-2016 by Juergen Knoedlseder *
5 * ----------------------------------------------------------------------- * 5 * ----------------------------------------------------------------------- *
6 * * 6 * *
7 * This program is free software: you can redistribute it and/or modify * 7 * This program is free software: you can redistribute it and/or modify *
@@ -28,11 +28,14 @@ @@ -28,11 +28,14 @@
28 #ifdef HAVE_CONFIG_H 28 #ifdef HAVE_CONFIG_H
29 #include <config.h> 29 #include <config.h>
30 #endif 30 #endif
  31 +#include "GModelPar.hpp"
  32 +#include "GModelTemporal.hpp"
31 #include "GModelTemporalRegistry.hpp" 33 #include "GModelTemporalRegistry.hpp"
32 #include "GException.hpp" 34 #include "GException.hpp"
33 #include "GTools.hpp" 35 #include "GTools.hpp"
34 36
35 /* __ Method name definitions ____________________________________________ */ 37 /* __ Method name definitions ____________________________________________ */
  38 +#define G_ALLOC "GModelTemporalRegistry::alloc(GXmlElement&)"
36 #define G_NAME "GModelTemporalRegistry::name(int&)" 39 #define G_NAME "GModelTemporalRegistry::name(int&)"
37 40
38 /* __ Macros _____________________________________________________________ */ 41 /* __ Macros _____________________________________________________________ */
@@ -61,7 +64,7 @@ GModelTemporalRegistry::GModelTemporalRegistry(void) @@ -61,7 +64,7 @@ GModelTemporalRegistry::GModelTemporalRegistry(void)
61 #if G_DEBUG_REGISTRY 64 #if G_DEBUG_REGISTRY
62 std::cout << "GModelTemporalRegistry(void): "; 65 std::cout << "GModelTemporalRegistry(void): ";
63 for (int i = 0; i < size(); ++i) { 66 for (int i = 0; i < size(); ++i) {
64 - std::cout << "\"" << names()[i] << "\" "; 67 + std::cout << "\"" << models()[i]->type() << "\" ";
65 } 68 }
66 std::cout << std::endl; 69 std::cout << std::endl;
67 #endif 70 #endif
@@ -75,6 +78,9 @@ GModelTemporalRegistry::GModelTemporalRegistry(void) @@ -75,6 +78,9 @@ GModelTemporalRegistry::GModelTemporalRegistry(void)
75 * @brief Model constructor 78 * @brief Model constructor
76 * 79 *
77 * @param[in] model Model. 80 * @param[in] model Model.
  81 + *
  82 + * Construct registry by adding a model to the registry. This is the standard
  83 + * constructor that is used to register a new model to GammaLib.
78 ***************************************************************************/ 84 ***************************************************************************/
79 GModelTemporalRegistry::GModelTemporalRegistry(const GModelTemporal* model) 85 GModelTemporalRegistry::GModelTemporalRegistry(const GModelTemporal* model)
80 { 86 {
@@ -88,21 +94,17 @@ GModelTemporalRegistry::GModelTemporalRegistry(const GModelTemporal* model) @@ -88,21 +94,17 @@ GModelTemporalRegistry::GModelTemporalRegistry(const GModelTemporal* model)
88 #endif 94 #endif
89 95
90 // Allocate new registry 96 // Allocate new registry
91 - std::string* new_names = new std::string[size()+1];  
92 const GModelTemporal** new_models = new const GModelTemporal*[size()+1]; 97 const GModelTemporal** new_models = new const GModelTemporal*[size()+1];
93 98
94 // Save old registry 99 // Save old registry
95 for (int i = 0; i < size(); ++i) { 100 for (int i = 0; i < size(); ++i) {
96 - new_names[i] = names()[i];  
97 new_models[i] = models()[i]; 101 new_models[i] = models()[i];
98 } 102 }
99 103
100 // Add new model to registry 104 // Add new model to registry
101 - new_names[size()] = model->type();  
102 new_models[size()] = model; 105 new_models[size()] = model;
103 106
104 // Set pointers on new registry 107 // Set pointers on new registry
105 - names().assign(new_names);  
106 models().assign(new_models); 108 models().assign(new_models);
107 109
108 // Increment number of models in registry 110 // Increment number of models in registry
@@ -112,7 +114,7 @@ GModelTemporalRegistry::GModelTemporalRegistry(const GModelTemporal* model) @@ -112,7 +114,7 @@ GModelTemporalRegistry::GModelTemporalRegistry(const GModelTemporal* model)
112 #if G_DEBUG_REGISTRY 114 #if G_DEBUG_REGISTRY
113 std::cout << "GModelTemporalRegistry(const GModelTemporal*): "; 115 std::cout << "GModelTemporalRegistry(const GModelTemporal*): ";
114 for (int i = 0; i < size(); ++i) { 116 for (int i = 0; i < size(); ++i) {
115 - std::cout << "\"" << names()[i] << "\" "; 117 + std::cout << "\"" << models()[i]->type() << "\" ";
116 } 118 }
117 std::cout << std::endl; 119 std::cout << std::endl;
118 #endif 120 #endif
@@ -193,28 +195,46 @@ GModelTemporalRegistry&amp; GModelTemporalRegistry::operator=(const GModelTemporalRe @@ -193,28 +195,46 @@ GModelTemporalRegistry&amp; GModelTemporalRegistry::operator=(const GModelTemporalRe
193 ==========================================================================*/ 195 ==========================================================================*/
194 196
195 /***********************************************************************//** 197 /***********************************************************************//**
196 - * @brief Allocate temporal model of given name 198 + * @brief Allocate temporal model that is found in XML element
  199 + *
  200 + * @param[in] xml XML element.
  201 + * @return Pointer to temporal model.
197 * 202 *
198 - * @param[in] name Temporal model name.  
199 - * @return Pointer to temporal model (NULL if name is not registered). 203 + * @exception GException::invalid_value
  204 + * No appropriate temporal model found in XML element.
200 * 205 *
201 - * Returns a pointer to a temporal model instance of the specified name.  
202 - * If the name has not been found in the registry, a NULL pointer is  
203 - * returned. 206 + * Returns a pointer to a temporal model instance that corresponds to the
  207 + * type found in an XML element. If no appropriate model is found the method
  208 + * will throw an exception.
204 ***************************************************************************/ 209 ***************************************************************************/
205 -GModelTemporal* GModelTemporalRegistry::alloc(const std::string& name) const 210 +GModelTemporal* GModelTemporalRegistry::alloc(const GXmlElement& xml) const
206 { 211 {
207 // Initialise temporal model 212 // Initialise temporal model
208 GModelTemporal* model = NULL; 213 GModelTemporal* model = NULL;
209 214
210 - // Search for model in registry 215 + // Search for model type in registry
211 for (int i = 0; i < size(); ++i) { 216 for (int i = 0; i < size(); ++i) {
212 - if (names()[i] == name) { 217 + if (models()[i]->type() == xml.attribute("type")) {
213 model = models()[i]->clone(); 218 model = models()[i]->clone();
214 break; 219 break;
215 } 220 }
216 } 221 }
217 222
  223 + // If no model has been found then throw an exception
  224 + if (model == NULL) {
  225 + std::string msg = "Temporal model of type \""+xml.attribute("type")+
  226 + "\" not found in registry. Possible temporal model "
  227 + "types are:";
  228 + for (int i = 0; i < size(); ++i) {
  229 + msg += " \""+models()[i]->type()+"\"";
  230 + }
  231 + msg += ".";
  232 + throw GException::invalid_value(G_ALLOC, msg);
  233 + }
  234 +
  235 + // Read model from XML element
  236 + model->read(xml);
  237 +
218 // Return temporal model 238 // Return temporal model
219 return model; 239 return model;
220 } 240 }
@@ -234,19 +254,20 @@ std::string GModelTemporalRegistry::name(const int&amp; index) const @@ -234,19 +254,20 @@ std::string GModelTemporalRegistry::name(const int&amp; index) const
234 // Compile option: raise exception if index is out of range 254 // Compile option: raise exception if index is out of range
235 #if defined(G_RANGE_CHECK) 255 #if defined(G_RANGE_CHECK)
236 if (index < 0 || index >= size()) { 256 if (index < 0 || index >= size()) {
237 - throw GException::out_of_range(G_NAME, index, 0, size()-1); 257 + throw GException::out_of_range(G_NAME, "Temporal model index", index,
  258 + size());
238 } 259 }
239 #endif 260 #endif
240 261
241 // Return name 262 // Return name
242 - return (names()[index]); 263 + return (models()[index]->type());
243 } 264 }
244 265
245 266
246 /***********************************************************************//** 267 /***********************************************************************//**
247 * @brief Print registry information 268 * @brief Print registry information
248 * 269 *
249 - * @param[in] chatter Chattiness (defaults to NORMAL). 270 + * @param[in] chatter Chattiness.
250 * @return Registry content. 271 * @return Registry content.
251 ***************************************************************************/ 272 ***************************************************************************/
252 std::string GModelTemporalRegistry::print(const GChatter& chatter) const 273 std::string GModelTemporalRegistry::print(const GChatter& chatter) const
@@ -267,8 +288,15 @@ std::string GModelTemporalRegistry::print(const GChatter&amp; chatter) const @@ -267,8 +288,15 @@ std::string GModelTemporalRegistry::print(const GChatter&amp; chatter) const
267 // NORMAL: Append models 288 // NORMAL: Append models
268 if (chatter >= NORMAL) { 289 if (chatter >= NORMAL) {
269 for (int i = 0; i < size(); ++i) { 290 for (int i = 0; i < size(); ++i) {
270 - result.append("\n"+gammalib::parformat(names()[i]));  
271 - result.append(models()[i]->type()); 291 + result.append("\n"+gammalib::parformat(models()[i]->type()));
  292 + for (int k = 0; k < models()[i]->size(); ++k) {
  293 + if (k > 0) {
  294 + result.append(", ");
  295 + }
  296 + result.append("\"");
  297 + result.append((*(models()[i]))[k].name());
  298 + result.append("\"");
  299 + }
272 } 300 }
273 } 301 }
274 302
test/test_GModel.cpp
@@ -2604,16 +2604,6 @@ void TestGModel::test_models(void) @@ -2604,16 +2604,6 @@ void TestGModel::test_models(void)
2604 ***************************************************************************/ 2604 ***************************************************************************/
2605 void TestGModel::test_model_registry(void) 2605 void TestGModel::test_model_registry(void)
2606 { 2606 {
2607 - // Test GModelRegistry void constructor  
2608 - test_try("Test GModelRegistry void constructor");  
2609 - try {  
2610 - GModelRegistry registry;  
2611 - test_try_success();  
2612 - }  
2613 - catch (std::exception &e) {  
2614 - test_try_failure(e);  
2615 - }  
2616 -  
2617 // Test GModelRegistry allocators 2607 // Test GModelRegistry allocators
2618 test_try("Test GModelRegistry model allocation"); 2608 test_try("Test GModelRegistry model allocation");
2619 try { 2609 try {
@@ -2641,110 +2631,45 @@ void TestGModel::test_model_registry(void) @@ -2641,110 +2631,45 @@ void TestGModel::test_model_registry(void)
2641 test_try_failure(e); 2631 test_try_failure(e);
2642 } 2632 }
2643 2633
2644 - // Test GModelSpatialRegistry void constructor  
2645 - test_try("Test GModelSpatialRegistry void constructor"); 2634 + // Test GModelSpatialRegistry allocator for invalid XML element
  2635 + test_try("Test GModelSpatialRegistry allocator for invalid XML element");
2646 try { 2636 try {
  2637 + GXmlElement xml;
2647 GModelSpatialRegistry registry; 2638 GModelSpatialRegistry registry;
2648 - test_try_success(); 2639 + GModelSpatial* ptr = registry.alloc(xml);
  2640 + test_try_failure("Invalid XML element shall throw an exception");
2649 } 2641 }
2650 - catch (std::exception &e) {  
2651 - test_try_failure(e);  
2652 - }  
2653 -  
2654 - // Test GModelSpatialRegistry allocators  
2655 - test_try("Test GModelSpatialRegistry model allocation");  
2656 - try {  
2657 - // Loop over all models in registry  
2658 - GModelSpatialRegistry registry;  
2659 - int num = registry.size();  
2660 - for (int i = 0; i < num; ++i) {  
2661 - GModelSpatial* ptr = registry.alloc(registry.name(i));  
2662 - test_assert(ptr != NULL,  
2663 - "Model pointer for \""+ registry.name(i)+"\" is NULL");  
2664 - if (ptr != NULL) {  
2665 -  
2666 - // Test model type  
2667 - test_assert(ptr->type() == registry.name(i),  
2668 - "Expected \""+registry.name(i)+"\" instead"  
2669 - " of \""+ptr->type()+"\".");  
2670 -  
2671 - // Free model  
2672 - delete ptr;  
2673 - }  
2674 - } // endfor: looped over all models 2642 + catch (GException::invalid_value &e) {
2675 test_try_success(); 2643 test_try_success();
2676 } 2644 }
2677 catch (std::exception &e) { 2645 catch (std::exception &e) {
2678 test_try_failure(e); 2646 test_try_failure(e);
2679 } 2647 }
2680 2648
2681 - // Test GModelSpectralRegistry void constructor  
2682 - test_try("Test GModelSpectralRegistry void constructor"); 2649 + // Test GModelSpectralRegistry allocator for invalid XML element
  2650 + test_try("Test GModelSpectralRegistry allocator for invalid XML element");
2683 try { 2651 try {
  2652 + GXmlElement xml;
2684 GModelSpectralRegistry registry; 2653 GModelSpectralRegistry registry;
2685 - test_try_success();  
2686 - }  
2687 - catch (std::exception &e) {  
2688 - test_try_failure(e); 2654 + GModelSpectral* ptr = registry.alloc(xml);
  2655 + test_try_failure("Invalid XML element shall throw an exception");
2689 } 2656 }
2690 -  
2691 - // Test GModelSpectralRegistry allocators  
2692 - test_try("Test GModelSpectralRegistry model allocation");  
2693 - try {  
2694 - // Loop over all models in registry  
2695 - GModelSpectralRegistry registry;  
2696 - int num = registry.size();  
2697 - for (int i = 0; i < num; ++i) {  
2698 - GModelSpectral* ptr = registry.alloc(registry.name(i));  
2699 - test_assert(ptr != NULL, "Model pointer for \""+registry.name(i)+"\" is NULL");  
2700 - if (ptr != NULL) {  
2701 -  
2702 - // Test model type  
2703 - test_assert(ptr->type() == registry.name(i),  
2704 - "Expected \""+registry.name(i)+"\" instead"  
2705 - " of \""+ptr->type()+"\".");  
2706 -  
2707 - // Free model  
2708 - delete ptr;  
2709 - }  
2710 - } // endfor: looped over all models 2657 + catch (GException::invalid_value &e) {
2711 test_try_success(); 2658 test_try_success();
2712 } 2659 }
2713 catch (std::exception &e) { 2660 catch (std::exception &e) {
2714 test_try_failure(e); 2661 test_try_failure(e);
2715 } 2662 }
2716 2663
2717 - // Test GModelTemporalRegistry void constructor  
2718 - test_try("Test GModelTemporalRegistry void constructor"); 2664 + // Test GModelTemporalRegistry allocator for invalid XML element
  2665 + test_try("Test GModelTemporalRegistry allocator for invalid XML element");
2719 try { 2666 try {
  2667 + GXmlElement xml;
2720 GModelTemporalRegistry registry; 2668 GModelTemporalRegistry registry;
2721 - test_try_success(); 2669 + GModelTemporal* ptr = registry.alloc(xml);
  2670 + test_try_failure("Invalid XML element shall throw an exception");
2722 } 2671 }
2723 - catch (std::exception &e) {  
2724 - test_try_failure(e);  
2725 - }  
2726 -  
2727 - // Test GModelTemporalRegistry allocators  
2728 - test_try("Test GModelTemporalRegistry model allocation");  
2729 - try {  
2730 - // Loop over all models in registry  
2731 - GModelTemporalRegistry registry;  
2732 - int num = registry.size();  
2733 - for (int i = 0; i < num; ++i) {  
2734 - GModelTemporal* ptr = registry.alloc(registry.name(i));  
2735 - test_assert(ptr != NULL, "Model pointer for \""+ \  
2736 - registry.name(i)+"\" is NULL");  
2737 - if (ptr != NULL) {  
2738 -  
2739 - // Test model type  
2740 - test_assert(ptr->type() == registry.name(i),  
2741 - "Expected \""+registry.name(i)+"\" instead"  
2742 - " of \""+ptr->type()+"\".");  
2743 -  
2744 - // Free model  
2745 - delete ptr;  
2746 - }  
2747 - } // endfor: looped over all models 2672 + catch (GException::invalid_value &e) {
2748 test_try_success(); 2673 test_try_success();
2749 } 2674 }
2750 catch (std::exception &e) { 2675 catch (std::exception &e) {