Commit 1545fc8b97b672456c62aa26987ae6fd415e579b

Authored by Domenico Tiziani
1 parent 60616f4d

Added scale to spatial composite model and implemented read/write methods.

include/GModelSpatialComposite.hpp
@@ -78,7 +78,8 @@ public: @@ -78,7 +78,8 @@ public:
78 // Other methods 78 // Other methods
79 int components(void) const; 79 int components(void) const;
80 void append(const GModelSpatial& component, 80 void append(const GModelSpatial& component,
81 - const std::string& name = ""); 81 + const std::string& name = "",
  82 + double scale = 1.);
82 const GModelSpatial* component(const int& index) const; 83 const GModelSpatial* component(const int& index) const;
83 const GModelSpatial* component(const std::string& name) const; 84 const GModelSpatial* component(const std::string& name) const;
84 85
@@ -90,9 +91,10 @@ protected: @@ -90,9 +91,10 @@ protected:
90 void free_members(void); 91 void free_members(void);
91 92
92 // Protected members 93 // Protected members
93 - std::string m_type; //!< Model type  
94 - std::vector<GModelSpatial*> m_components; //!< Components  
95 - std::vector<std::string> m_component_names; //!< Component names 94 + std::string m_type; //!< Model type
  95 + std::vector<GModelSpatial*> m_components; //!< Components
  96 + std::vector<std::string> m_component_names; //!< Component names
  97 + std::vector<double> m_component_scales; //!< Component scales
96 }; 98 };
97 99
98 100
src/model/GModelSpatialComposite.cpp
@@ -343,8 +343,16 @@ void GModelSpatialComposite::read(const GXmlElement&amp; xml) @@ -343,8 +343,16 @@ void GModelSpatialComposite::read(const GXmlElement&amp; xml)
343 // Get component attribute from XML file 343 // Get component attribute from XML file
344 std::string component_name = spec->attribute("component"); 344 std::string component_name = spec->attribute("component");
345 345
  346 + // Initialise scale
  347 + double scale = 1.;
  348 +
  349 + // Get scale value
  350 + if (spec-> has_attribute("scale")) {
  351 + scale = gammalib::todouble(spec->attribute("scale"));
  352 + }
  353 +
346 // Append spatial component to container 354 // Append spatial component to container
347 - append(*ptr, component_name); 355 + append(*ptr, component_name, scale);
348 356
349 } // endfor: loop over components 357 } // endfor: loop over components
350 358
@@ -424,12 +432,22 @@ void GModelSpatialComposite::write(GXmlElement&amp; xml) const @@ -424,12 +432,22 @@ void GModelSpatialComposite::write(GXmlElement&amp; xml) const
424 // If an XML element exists then use it ... 432 // If an XML element exists then use it ...
425 if (matching_model != NULL) { 433 if (matching_model != NULL) {
426 spatial->write(*matching_model); 434 spatial->write(*matching_model);
  435 +
  436 + // Write scale to XML element if needed
  437 + if (m_component_scales[i] != 1. || matching_model->has_attribute("scale")) {
  438 + matching_model->attribute("scale", gammalib::str(m_component_scales[i]));
  439 + }
427 } 440 }
428 441
429 // ... otherwise create new XML element 442 // ... otherwise create new XML element
430 else { 443 else {
431 GXmlElement element("spatialModel"); 444 GXmlElement element("spatialModel");
432 spatial->write(element); 445 spatial->write(element);
  446 +
  447 + // Write scale to XML element if needed
  448 + if (m_component_scales[i] != 1.) {
  449 + element.attribute("scale", gammalib::str(m_component_scales[i]));
  450 + }
433 xml.append(element); 451 xml.append(element);
434 } 452 }
435 453
@@ -454,7 +472,8 @@ void GModelSpatialComposite::write(GXmlElement&amp; xml) const @@ -454,7 +472,8 @@ void GModelSpatialComposite::write(GXmlElement&amp; xml) const
454 * Appends a spatial component to the composite model 472 * Appends a spatial component to the composite model
455 ***************************************************************************/ 473 ***************************************************************************/
456 void GModelSpatialComposite::append(const GModelSpatial& component, 474 void GModelSpatialComposite::append(const GModelSpatial& component,
457 - const std::string& name) 475 + const std::string& name,
  476 + double scale)
458 { 477 {
459 // Append model container 478 // Append model container
460 m_components.push_back(component.clone()); 479 m_components.push_back(component.clone());
@@ -495,6 +514,8 @@ void GModelSpatialComposite::append(const GModelSpatial&amp; component, @@ -495,6 +514,8 @@ void GModelSpatialComposite::append(const GModelSpatial&amp; component,
495 514
496 } // endfor: loop over model parameters 515 } // endfor: loop over model parameters
497 516
  517 + m_component_scales.push_back(scale);
  518 +
498 // Return 519 // Return
499 return; 520 return;
500 } 521 }
@@ -610,6 +631,7 @@ void GModelSpatialComposite::init_members(void) @@ -610,6 +631,7 @@ void GModelSpatialComposite::init_members(void)
610 // Initialise models vector 631 // Initialise models vector
611 m_components.clear(); 632 m_components.clear();
612 m_component_names.clear(); 633 m_component_names.clear();
  634 + m_component_scales.clear();
613 635
614 // Return 636 // Return
615 return; 637 return;
@@ -626,6 +648,7 @@ void GModelSpatialComposite::copy_members(const GModelSpatialComposite&amp; model) @@ -626,6 +648,7 @@ void GModelSpatialComposite::copy_members(const GModelSpatialComposite&amp; model)
626 // Copy members 648 // Copy members
627 m_type = model.m_type; 649 m_type = model.m_type;
628 m_component_names = model.m_component_names; 650 m_component_names = model.m_component_names;
  651 + m_component_scales = model.m_component_scales;
629 652
630 // Initialise components 653 // Initialise components
631 m_components.clear(); 654 m_components.clear();
test/test_GModel.cpp
@@ -1423,7 +1423,7 @@ void TestGModel::test_spatial_composite(void) @@ -1423,7 +1423,7 @@ void TestGModel::test_spatial_composite(void)
1423 1423
1424 // Test append method 1424 // Test append method
1425 model1.append(GModelSpatialPointSource(dir)); 1425 model1.append(GModelSpatialPointSource(dir));
1426 - model1.append(GModelSpatialRadialGauss(dir, 0.2)); 1426 + model1.append(GModelSpatialRadialGauss(dir, 0.2), "", 1.5);
1427 test_value(model1.components(), 2); 1427 test_value(model1.components(), 2);
1428 test_value(model1.size(), 5); 1428 test_value(model1.size(), 5);
1429 1429