Commit 269acd3589bd249205f07219acbb130af737dd9b

Authored by Jürgen Knödlseder
1 parent d61e970c

Implement handling of instrument specific scale factors.

The read() and write() methods now handle the reading and writing of instrument specific model scale factors. The spatial() method uses the scale factors to scale the IRF accordingly, if required.
Showing 1 changed file with 18 additions and 2 deletions
src/model/GModelSky.cpp
1 /*************************************************************************** 1 /***************************************************************************
2 * GModelSky.cpp - Abstract sky model base class * 2 * GModelSky.cpp - Abstract sky model base class *
3 * ----------------------------------------------------------------------- * 3 * ----------------------------------------------------------------------- *
4 - * copyright (C) 2011-2012 by Juergen Knoedlseder * 4 + * copyright (C) 2011-2013 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 *
@@ -428,6 +428,9 @@ void GModelSky::read(const GXmlElement& xml) @@ -428,6 +428,9 @@ void GModelSky::read(const GXmlElement& xml)
428 // Set instruments 428 // Set instruments
429 instruments(xml.attribute("instrument")); 429 instruments(xml.attribute("instrument"));
430 430
  431 + // Read instrument scales
  432 + read_scales(xml);
  433 +
431 // Set observation identifiers 434 // Set observation identifiers
432 ids(xml.attribute("id")); 435 ids(xml.attribute("id"));
433 436
@@ -465,7 +468,7 @@ void GModelSky::write(GXmlElement& xml) const @@ -465,7 +468,7 @@ void GModelSky::write(GXmlElement& xml) const
465 src->attribute("name") = name(); 468 src->attribute("name") = name();
466 if (spectral() != NULL) src->append(new GXmlElement("spectrum")); 469 if (spectral() != NULL) src->append(new GXmlElement("spectrum"));
467 if (spatial() != NULL) src->append(new GXmlElement("spatialModel")); 470 if (spatial() != NULL) src->append(new GXmlElement("spatialModel"));
468 - xml.append(src); 471 + xml.append(src); // Appends pointer
469 } 472 }
470 473
471 // Set model attributes 474 // Set model attributes
@@ -488,6 +491,9 @@ void GModelSky::write(GXmlElement& xml) const @@ -488,6 +491,9 @@ void GModelSky::write(GXmlElement& xml) const
488 spatial()->write(*spat); 491 spatial()->write(*spat);
489 } 492 }
490 493
  494 + // Write instrument scales
  495 + write_scales(*src);
  496 +
491 // Return 497 // Return
492 return; 498 return;
493 } 499 }
@@ -815,6 +821,11 @@ GModelTemporal* GModelSky::xml_temporal(const GXmlElement& temporal) const @@ -815,6 +821,11 @@ GModelTemporal* GModelSky::xml_temporal(const GXmlElement& temporal) const
815 * 821 *
816 * This method computes the spatial model component for a given true photon 822 * This method computes the spatial model component for a given true photon
817 * energy and arrival time. 823 * energy and arrival time.
  824 + *
  825 + * The method takes care of any instrument dependent scale factors. These
  826 + * scale factors will be applied to the IRF so that they are correctly
  827 + * taken into account in the spectral and temporal model gradient
  828 + * computations.
818 ***************************************************************************/ 829 ***************************************************************************/
819 double GModelSky::spatial(const GEvent& event, 830 double GModelSky::spatial(const GEvent& event,
820 const GEnergy& srcEng, const GTime& srcTime, 831 const GEnergy& srcEng, const GTime& srcTime,
@@ -839,6 +850,11 @@ double GModelSky::spatial(const GEvent& event, @@ -839,6 +850,11 @@ double GModelSky::spatial(const GEvent& event,
839 // source model. 850 // source model.
840 double irf = rsp->irf(event, source, obs); 851 double irf = rsp->irf(event, source, obs);
841 852
  853 + // If required, apply instrument specific model scaling
  854 + if (!m_scales.empty()) {
  855 + irf *= scale(obs.instrument()).real_value();
  856 + }
  857 +
842 // Case A: evaluate gradients 858 // Case A: evaluate gradients
843 if (grad) { 859 if (grad) {
844 860